{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/docs\/code-graph-global.php",
"offset": 200,
"limit": 70
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/docs\/code-graph-global.php",
"content": " .selectAll('line')\n .data(data.links)\n .enter().append('line')\n .attr('class', 'graph-link')\n .attr('stroke', d => linkColors[d.type] || '#94a3b8')\n .attr('stroke-width', 1.5)\n .attr('stroke-opacity', 0.4)\n .attr('marker-end', d => 'url(#arrow-global-' + d.type + ')')\n .attr('x1', d => data.nodes[d.source].x)\n .attr('y1', d => data.nodes[d.source].y)\n .attr('x2', d => data.nodes[d.target].x)\n .attr('y2', d => data.nodes[d.target].y);\n\n \/\/ Draw nodes\n const node = g.append('g')\n .selectAll('g')\n .data(data.nodes)\n .enter().append('g')\n .attr('class', 'graph-node')\n .attr('data-namespace', d => d.namespace)\n .attr('transform', d => `translate(${d.x},${d.y})`)\n .attr('cursor', d => d.fileId ? 'pointer' : 'default')\n .on('click', (event, d) => {\n if (d.fileId) {\n window.location.href = '\/docs\/code\/' + d.fileId;\n }\n });\n\n node.append('circle')\n .attr('r', 8)\n .attr('fill', d => colors[d.type] || colors.class)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1.5);\n\n node.append('text')\n .text(d => d.label)\n .attr('x', 0)\n .attr('y', 20)\n .attr('text-anchor', 'middle')\n .attr('fill', 'var(--text-primary)')\n .attr('font-size', '8px');\n\n node.append('title')\n .text(d => d.id);\n\n \/\/ Namespace filter\n filter.addEventListener('change', (e) => {\n const selected = e.target.value;\n\n if (!selected) {\n \/\/ Show all\n d3.selectAll('.graph-node').style('opacity', 1);\n d3.selectAll('.graph-link').style('opacity', 0.4);\n } else {\n \/\/ Filter by namespace\n d3.selectAll('.graph-node')\n .style('opacity', d => d.namespace === selected ? 1 : 0.1);\n\n d3.selectAll('.graph-link')\n .style('opacity', d => {\n const srcNs = data.nodes[d.source].namespace;\n const tgtNs = data.nodes[d.target].namespace;\n return (srcNs === selected || tgtNs === selected) ? 0.6 : 0.05;\n });\n }\n });\n\n \/\/ Initial zoom to fit\n const bounds = g.node().getBBox();\n const dx = bounds.width;",
"numLines": 70,
"startLine": 200,
"totalLines": 288
}
}
}