{
const currentFocusId = focus_id;
const container = html`<div style="width: 100%; height: 700px; border: 1px solid #ccc;"></div>`;
if (!raw_graph_data || Object.keys(raw_graph_data).length === 0) {
if (currentFocusId) {
container.innerHTML = `<div style="padding: 20px; font-style: italic;">No data loaded for ${currentFocusId}. It might be fetching or an error occurred.</div>`;
} else {
container.innerHTML = `<div style="padding: 20px; font-style: italic;">Select a theorem to display its dependency graph.</div>`;
}
return container;
}
let cytoscapeElements;
try {
cytoscapeElements = processedTreeToCytoscapeElements(raw_graph_data);
if (!Array.isArray(cytoscapeElements)) throw new Error("Transformation did not produce an array.");
for (const el of cytoscapeElements) {
if (!el || !el.group || !el.data || !el.data.id) throw new Error(`Malformed element: ${JSON.stringify(el)}`);
if (el.group === 'edges' && (!el.data.source || !el.data.target)) throw new Error(`Malformed edge: ${JSON.stringify(el)}`);
}
} catch (e) {
console.error("[Render Cell] Error during data transformation or validation:", e);
container.innerHTML = `<div style="color:red; padding:20px;">Error preparing graph data: ${e.message}. Check console.</div>`;
return container;
}
if (cytoscapeElements.filter(el => el.group === 'nodes').length === 0 && Object.keys(raw_graph_data).length > 0) {
container.innerHTML = `<div style="padding: 20px; font-style: italic;">Data loaded for ${currentFocusId}, but no visualizable nodes were generated. Check transformation logic.</div>`;
return container;
}
if (cytoscapeElements.length === 0 && Object.keys(raw_graph_data).length === 0 && currentFocusId) {
}
try {
const cyInstance = cytoscape({
container: container,
elements: cytoscapeElements,
style: [
{
selector: 'node',
style: {
'background-color': (ele) => ele.data('failed') ? 'orangered' : (ele.data('type') === 'def' ? '#5bc0de' : '#62c370'),
'label': 'data(label)',
'text-valign': 'center', 'text-halign': 'center',
'font-size': '10px', 'color': 'black',
'text-wrap': 'wrap', 'text-max-width': '80px',
'width': 'label', 'height': 'label', 'padding': '8px',
'shape': (ele) => ele.data('type') === 'def' ? 'round-rectangle' : 'ellipse',
'border-width': (ele) => ele.data('id') === currentFocusId ? 2.5 : 0.8,
'border-color': (ele) => ele.data('id') === currentFocusId ? 'blue' : (ele.data('failed') ? 'darkred' : '#555'),
'opacity': (ele) => (ele.data('id') === currentFocusId || !ele.data('failed')) ? 1 : 0.7,
}
},
{
selector: 'edge',
style: {
'width': 1.2,
'line-color': '#999',
'target-arrow-color': '#999',
'target-arrow-shape': 'triangle',
'arrow-scale': 0.7,
'curve-style': 'bezier',
}
}
],
layout: {
name: 'cose',
fit: true,
padding: 30,
idealEdgeLength: 90, nodeOverlap: 15, refresh: 20, randomize: false,
componentSpacing: 80, nodeRepulsion: (node) => 300000, edgeElasticity: (edge) => 90,
},
zoom: 1, minZoom: 0.05, maxZoom: 5,
zoomingEnabled: true, userZoomingEnabled: true,
panningEnabled: true, userPanningEnabled: true,
boxSelectionEnabled: false,
});
} catch (e) {
console.error("[Render Cell] Error initializing Cytoscape instance:", e);
container.innerHTML = `<div style="color:red; padding:20px;">Cytoscape Error: ${e.message}. Check console.</div>`;
}
return container;
}