claude-code-workflow 7.2.26 → 7.2.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ccw/specs/architecture-constraints.md +5 -0
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +140 -0
- package/.claude/skills/investigate/SKILL.md +110 -0
- package/.claude/skills/investigate/phases/01-root-cause-investigation.md +132 -0
- package/.claude/skills/investigate/phases/02-pattern-analysis.md +126 -0
- package/.claude/skills/investigate/phases/03-hypothesis-testing.md +177 -0
- package/.claude/skills/investigate/phases/04-implementation.md +139 -0
- package/.claude/skills/investigate/phases/05-verification-report.md +153 -0
- package/.claude/skills/investigate/specs/debug-report-format.md +226 -0
- package/.claude/skills/investigate/specs/iron-law.md +101 -0
- package/.claude/skills/security-audit/SKILL.md +125 -0
- package/.claude/skills/security-audit/phases/01-supply-chain-scan.md +139 -0
- package/.claude/skills/security-audit/phases/02-owasp-review.md +156 -0
- package/.claude/skills/security-audit/phases/03-threat-modeling.md +180 -0
- package/.claude/skills/security-audit/phases/04-report-tracking.md +177 -0
- package/.claude/skills/security-audit/specs/owasp-checklist.md +442 -0
- package/.claude/skills/security-audit/specs/scoring-gates.md +141 -0
- package/.claude/skills/ship/SKILL.md +105 -0
- package/.claude/skills/ship/phases/01-preflight-checks.md +121 -0
- package/.claude/skills/ship/phases/02-code-review.md +137 -0
- package/.claude/skills/ship/phases/03-version-bump.md +171 -0
- package/.claude/skills/ship/phases/04-changelog-commit.md +167 -0
- package/.claude/skills/ship/phases/05-pr-creation.md +163 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +10 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +4 -0
- package/.claude/skills/team-arch-opt/SKILL.md +1 -1
- package/.claude/skills/team-arch-opt/roles/coordinator/commands/monitor.md +3 -1
- package/.claude/skills/team-arch-opt/roles/refactorer/role.md +3 -1
- package/.claude/skills/team-arch-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-coordinate/SKILL.md +4 -3
- package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +1 -1
- package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +3 -2
- package/.claude/skills/team-coordinate/roles/coordinator/role.md +16 -15
- package/.claude/skills/team-coordinate/specs/pipelines.md +7 -4
- package/.claude/skills/team-coordinate/specs/role-spec-template.md +1 -0
- package/.claude/skills/team-interactive-craft/SKILL.md +127 -0
- package/.claude/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.claude/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +192 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +183 -0
- package/.claude/skills/team-interactive-craft/roles/coordinator/role.md +166 -0
- package/.claude/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.claude/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.claude/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.claude/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.claude/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.claude/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.claude/skills/team-lifecycle-v4/SKILL.md +1 -1
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +14 -2
- package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +24 -2
- package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +3 -1
- package/.claude/skills/team-motion-design/SKILL.md +129 -0
- package/.claude/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.claude/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/dispatch.md +203 -0
- package/.claude/skills/team-motion-design/roles/coordinator/commands/monitor.md +184 -0
- package/.claude/skills/team-motion-design/roles/coordinator/role.md +167 -0
- package/.claude/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.claude/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.claude/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.claude/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.claude/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.claude/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.claude/skills/team-motion-design/specs/team-config.json +99 -0
- package/.claude/skills/team-perf-opt/SKILL.md +1 -1
- package/.claude/skills/team-perf-opt/roles/optimizer/role.md +3 -1
- package/.claude/skills/team-perf-opt/specs/team-config.json +2 -2
- package/.claude/skills/team-quality-assurance/SKILL.md +1 -1
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-quality-assurance/roles/executor/role.md +3 -1
- package/.claude/skills/team-testing/SKILL.md +1 -1
- package/.claude/skills/team-testing/roles/coordinator/commands/dispatch.md +5 -2
- package/.claude/skills/team-testing/roles/coordinator/commands/monitor.md +4 -2
- package/.claude/skills/team-testing/roles/executor/role.md +3 -1
- package/.claude/skills/team-ui-polish/SKILL.md +127 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +194 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/commands/monitor.md +180 -0
- package/.claude/skills/team-ui-polish/roles/coordinator/role.md +170 -0
- package/.claude/skills/team-ui-polish/roles/diagnostician/role.md +160 -0
- package/.claude/skills/team-ui-polish/roles/optimizer/role.md +225 -0
- package/.claude/skills/team-ui-polish/roles/scanner/role.md +356 -0
- package/.claude/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.claude/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.claude/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.claude/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.claude/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.claude/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.claude/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.claude/skills/team-uidesign/SKILL.md +6 -1
- package/.claude/skills/team-uidesign/roles/designer/role.md +28 -4
- package/.claude/skills/team-uidesign/roles/implementer/role.md +25 -3
- package/.claude/skills/team-uidesign/roles/researcher/role.md +21 -2
- package/.claude/skills/team-uidesign/roles/reviewer/role.md +19 -17
- package/.claude/skills/team-uidesign/specs/anti-patterns.md +211 -0
- package/.claude/skills/team-uidesign/specs/design-standards.md +329 -0
- package/.claude/skills/team-uidesign/specs/scoring-guide.md +114 -0
- package/.claude/skills/team-uidesign/specs/team-config.json +1 -1
- package/.claude/skills/team-uidesign/specs/ux-writing.md +86 -0
- package/.claude/skills/team-ux-improve/SKILL.md +3 -0
- package/.claude/skills/team-ux-improve/roles/designer/role.md +30 -0
- package/.claude/skills/team-ux-improve/roles/diagnoser/role.md +16 -1
- package/.claude/skills/team-ux-improve/roles/scanner/role.md +43 -1
- package/.claude/skills/team-ux-improve/specs/anti-patterns.md +103 -0
- package/.claude/skills/team-ux-improve/specs/design-standards.md +54 -0
- package/.claude/skills/team-ux-improve/specs/heuristics.md +88 -0
- package/.claude/skills/team-ux-improve/wisdom/anti-patterns/common-ux-pitfalls.md +40 -8
- package/.claude/skills/team-ux-improve/wisdom/patterns/state-management.md +32 -12
- package/.claude/skills/team-ux-improve/wisdom/patterns/ui-feedback.md +35 -11
- package/.claude/skills/team-ux-improve/wisdom/principles/general-ux.md +36 -9
- package/.claude/skills/team-visual-a11y/SKILL.md +143 -0
- package/.claude/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +250 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +204 -0
- package/.claude/skills/team-visual-a11y/roles/coordinator/role.md +169 -0
- package/.claude/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.claude/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.claude/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.claude/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.claude/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.claude/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.claude/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.claude/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.claude/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.claude/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/.codex/skills/investigate/agents/investigator.md +392 -0
- package/.codex/skills/investigate/orchestrator.md +362 -0
- package/.codex/skills/investigate/phases/01-root-cause-investigation.md +212 -0
- package/.codex/skills/investigate/phases/02-pattern-analysis.md +181 -0
- package/.codex/skills/investigate/phases/03-hypothesis-testing.md +214 -0
- package/.codex/skills/investigate/phases/04-implementation.md +195 -0
- package/.codex/skills/investigate/phases/05-verification-report.md +240 -0
- package/.codex/skills/security-audit/agents/security-auditor.md +341 -0
- package/.codex/skills/security-audit/orchestrator.md +384 -0
- package/.codex/skills/security-audit/phases/01-supply-chain-scan.md +226 -0
- package/.codex/skills/security-audit/phases/02-owasp-review.md +232 -0
- package/.codex/skills/security-audit/phases/03-threat-modeling.md +249 -0
- package/.codex/skills/security-audit/phases/04-report-tracking.md +300 -0
- package/.codex/skills/ship/agents/ship-operator.md +318 -0
- package/.codex/skills/ship/orchestrator.md +426 -0
- package/.codex/skills/ship/phases/01-preflight-checks.md +198 -0
- package/.codex/skills/ship/phases/02-code-review.md +228 -0
- package/.codex/skills/ship/phases/03-version-bump.md +259 -0
- package/.codex/skills/ship/phases/04-changelog-commit.md +263 -0
- package/.codex/skills/ship/phases/05-pr-creation.md +280 -0
- package/.codex/skills/team-interactive-craft/SKILL.md +220 -0
- package/.codex/skills/team-interactive-craft/roles/a11y-tester/role.md +159 -0
- package/.codex/skills/team-interactive-craft/roles/builder/role.md +216 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/analyze.md +71 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/dispatch.md +162 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/commands/monitor.md +233 -0
- package/.codex/skills/team-interactive-craft/roles/coordinator/role.md +209 -0
- package/.codex/skills/team-interactive-craft/roles/interaction-designer/role.md +144 -0
- package/.codex/skills/team-interactive-craft/roles/researcher/role.md +131 -0
- package/.codex/skills/team-interactive-craft/specs/interaction-patterns.md +362 -0
- package/.codex/skills/team-interactive-craft/specs/pipelines.md +85 -0
- package/.codex/skills/team-interactive-craft/specs/team-config.json +105 -0
- package/.codex/skills/team-interactive-craft/specs/vanilla-constraints.md +83 -0
- package/.codex/skills/team-motion-design/SKILL.md +222 -0
- package/.codex/skills/team-motion-design/roles/animator/role.md +194 -0
- package/.codex/skills/team-motion-design/roles/choreographer/role.md +164 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/analyze.md +64 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/dispatch.md +168 -0
- package/.codex/skills/team-motion-design/roles/coordinator/commands/monitor.md +242 -0
- package/.codex/skills/team-motion-design/roles/coordinator/role.md +210 -0
- package/.codex/skills/team-motion-design/roles/motion-researcher/role.md +115 -0
- package/.codex/skills/team-motion-design/roles/motion-tester/role.md +175 -0
- package/.codex/skills/team-motion-design/specs/gpu-constraints.md +114 -0
- package/.codex/skills/team-motion-design/specs/motion-tokens.md +128 -0
- package/.codex/skills/team-motion-design/specs/pipelines.md +74 -0
- package/.codex/skills/team-motion-design/specs/reduced-motion.md +129 -0
- package/.codex/skills/team-motion-design/specs/team-config.json +99 -0
- package/.codex/skills/team-ui-polish/SKILL.md +218 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/analyze.md +77 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/dispatch.md +167 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/commands/monitor.md +230 -0
- package/.codex/skills/team-ui-polish/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-ui-polish/roles/diagnostician/role.md +164 -0
- package/.codex/skills/team-ui-polish/roles/optimizer/role.md +229 -0
- package/.codex/skills/team-ui-polish/roles/scanner/role.md +360 -0
- package/.codex/skills/team-ui-polish/roles/verifier/role.md +142 -0
- package/.codex/skills/team-ui-polish/specs/anti-patterns.md +141 -0
- package/.codex/skills/team-ui-polish/specs/design-standards.md +356 -0
- package/.codex/skills/team-ui-polish/specs/fix-strategies.md +235 -0
- package/.codex/skills/team-ui-polish/specs/pipelines.md +81 -0
- package/.codex/skills/team-ui-polish/specs/scoring-guide.md +162 -0
- package/.codex/skills/team-ui-polish/specs/team-config.json +73 -0
- package/.codex/skills/team-visual-a11y/SKILL.md +319 -0
- package/.codex/skills/team-visual-a11y/roles/color-auditor/role.md +178 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/analyze.md +72 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/dispatch.md +188 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/commands/monitor.md +281 -0
- package/.codex/skills/team-visual-a11y/roles/coordinator/role.md +213 -0
- package/.codex/skills/team-visual-a11y/roles/fix-implementer/role.md +246 -0
- package/.codex/skills/team-visual-a11y/roles/focus-auditor/role.md +222 -0
- package/.codex/skills/team-visual-a11y/roles/remediation-planner/role.md +206 -0
- package/.codex/skills/team-visual-a11y/roles/typo-auditor/role.md +185 -0
- package/.codex/skills/team-visual-a11y/specs/focus-patterns.md +325 -0
- package/.codex/skills/team-visual-a11y/specs/oklch-standards.md +130 -0
- package/.codex/skills/team-visual-a11y/specs/pipelines.md +98 -0
- package/.codex/skills/team-visual-a11y/specs/team-config.json +109 -0
- package/.codex/skills/team-visual-a11y/specs/typography-scale.md +165 -0
- package/.codex/skills/team-visual-a11y/specs/wcag-matrix.md +133 -0
- package/README.md +8 -0
- package/ccw/dist/core/hooks/hook-templates.d.ts.map +1 -1
- package/ccw/dist/core/hooks/hook-templates.js +114 -1
- package/ccw/dist/core/hooks/hook-templates.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +34 -0
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +2 -2
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js → AlertDialog-BjP1ydDR.js} +2 -2
- package/ccw/frontend/dist/assets/{AlertDialog-Bf1jdqax.js.map → AlertDialog-BjP1ydDR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js → AnalysisPage-CAX3xqMf.js} +2 -2
- package/ccw/frontend/dist/assets/{AnalysisPage-C8niKdp4.js.map → AnalysisPage-CAX3xqMf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js → ApiSettingsPage-CtWlmztq.js} +2 -2
- package/ccw/frontend/dist/assets/{ApiSettingsPage-BL2c3UNS.js.map → ApiSettingsPage-CtWlmztq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js → CliModeToggle-hR4a-eLX.js} +2 -2
- package/ccw/frontend/dist/assets/{CliModeToggle-BePBFynD.js.map → CliModeToggle-hR4a-eLX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js → CliSessionSharePage-DzNPkFN9.js} +2 -2
- package/ccw/frontend/dist/assets/{CliSessionSharePage-7cYtX6FT.js.map → CliSessionSharePage-DzNPkFN9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js → CliViewerPage-BPEGN4TT.js} +2 -2
- package/ccw/frontend/dist/assets/{CliViewerPage-CBwg1mPL.js.map → CliViewerPage-BPEGN4TT.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js → CodexLensPage-Cf0r2RHY.js} +2 -2
- package/ccw/frontend/dist/assets/{CodexLensPage-Bt74xORP.js.map → CodexLensPage-Cf0r2RHY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js → Collapsible-DEm1rJ4h.js} +2 -2
- package/ccw/frontend/dist/assets/{Collapsible-Wrs87QT7.js.map → Collapsible-DEm1rJ4h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js → CommandsManagerPage-BpeWw8HO.js} +2 -2
- package/ccw/frontend/dist/assets/{CommandsManagerPage-ChQjmPWZ.js.map → CommandsManagerPage-BpeWw8HO.js.map} +1 -1
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js → DeepWikiPage-BEsmh2vF.js} +2 -2
- package/ccw/frontend/dist/assets/{DeepWikiPage-dEO5wi6X.js.map → DeepWikiPage-BEsmh2vF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js → EndpointsPage-B30SFdtU.js} +2 -2
- package/ccw/frontend/dist/assets/{EndpointsPage-4zq269xY.js.map → EndpointsPage-B30SFdtU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js → ExplorerPage-BVvMpg1O.js} +2 -2
- package/ccw/frontend/dist/assets/{ExplorerPage-B0YTENhA.js.map → ExplorerPage-BVvMpg1O.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js → FixSessionPage-CL73dHbh.js} +2 -2
- package/ccw/frontend/dist/assets/{FixSessionPage-CwGs6dhz.js.map → FixSessionPage-CL73dHbh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js → FloatingFileBrowser-BL-28lMZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingFileBrowser-COZRBslc.js.map → FloatingFileBrowser-BL-28lMZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js → FloatingPanel-BzZDciHZ.js} +2 -2
- package/ccw/frontend/dist/assets/{FloatingPanel-DYvgQZRD.js.map → FloatingPanel-BzZDciHZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js → GraphExplorerPage-CDp6-d8P.js} +2 -2
- package/ccw/frontend/dist/assets/{GraphExplorerPage-ewMHQGem.js.map → GraphExplorerPage-CDp6-d8P.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js → HistoryPage-fZY_7O9n.js} +2 -2
- package/ccw/frontend/dist/assets/{HistoryPage-BMeR0PrK.js.map → HistoryPage-fZY_7O9n.js.map} +1 -1
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js → HookManagerPage-4LJeC9bq.js} +2 -2
- package/ccw/frontend/dist/assets/{HookManagerPage-DBW2LnRm.js.map → HookManagerPage-4LJeC9bq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js → InstallationsPage-Bpigrbhw.js} +2 -2
- package/ccw/frontend/dist/assets/{InstallationsPage--pMj0QEH.js.map → InstallationsPage-Bpigrbhw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js → IssueHubPage-BP0zJc1R.js} +2 -2
- package/ccw/frontend/dist/assets/{IssueHubPage-C_QMpQSR.js.map → IssueHubPage-BP0zJc1R.js.map} +1 -1
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js → LiteTasksPage-CSt2oVKQ.js} +2 -2
- package/ccw/frontend/dist/assets/{LiteTasksPage-CSWFdQ2-.js.map → LiteTasksPage-CSt2oVKQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js → McpManagerPage-B-xaMA0w.js} +2 -2
- package/ccw/frontend/dist/assets/{McpManagerPage-Dvv8NtGy.js.map → McpManagerPage-B-xaMA0w.js.map} +1 -1
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js → MemoryPage-CJqo_7DY.js} +2 -2
- package/ccw/frontend/dist/assets/{MemoryPage-YO8WZzZO.js.map → MemoryPage-CJqo_7DY.js.map} +1 -1
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js → NotFoundPage-ibZeQA-Y.js} +2 -2
- package/ccw/frontend/dist/assets/{NotFoundPage-quUJw0CD.js.map → NotFoundPage-ibZeQA-Y.js.map} +1 -1
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js → OrchestratorPage-DgJ4ctPQ.js} +2 -2
- package/ccw/frontend/dist/assets/{OrchestratorPage-tuThWPID.js.map → OrchestratorPage-DgJ4ctPQ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js → ProjectOverviewPage-Cit0Yq0D.js} +2 -2
- package/ccw/frontend/dist/assets/{ProjectOverviewPage-shTilwiT.js.map → ProjectOverviewPage-Cit0Yq0D.js.map} +1 -1
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js → PromptHistoryPage-Ce1HDIK0.js} +2 -2
- package/ccw/frontend/dist/assets/{PromptHistoryPage-6rQnsI8l.js.map → PromptHistoryPage-Ce1HDIK0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js → ReviewSessionPage-J1KikNrk.js} +2 -2
- package/ccw/frontend/dist/assets/{ReviewSessionPage-JOmzjVbT.js.map → ReviewSessionPage-J1KikNrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js → RulesManagerPage-CdBjTmth.js} +2 -2
- package/ccw/frontend/dist/assets/{RulesManagerPage-Cayfywqi.js.map → RulesManagerPage-CdBjTmth.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js → SessionDetailPage-B9ZK7LvX.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionDetailPage-iMn0k84i.js.map → SessionDetailPage-B9ZK7LvX.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js → SessionsPage-CW_nS5UR.js} +2 -2
- package/ccw/frontend/dist/assets/{SessionsPage-Ciqjy9kz.js.map → SessionsPage-CW_nS5UR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SettingsPage-BPDbXPSM.js → SettingsPage-B2PYzSoO.js} +35 -35
- package/ccw/frontend/dist/assets/SettingsPage-B2PYzSoO.js.map +1 -0
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js → SkillsManagerPage-CTnWrrwp.js} +2 -2
- package/ccw/frontend/dist/assets/{SkillsManagerPage-D3LzbpJY.js.map → SkillsManagerPage-CTnWrrwp.js.map} +1 -1
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js → SpecsSettingsPage-DJpi9XQL.js} +2 -2
- package/ccw/frontend/dist/assets/{SpecsSettingsPage-BpkJctzo.js.map → SpecsSettingsPage-DJpi9XQL.js.map} +1 -1
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js → Switch-Ac6Ov7uy.js} +2 -2
- package/ccw/frontend/dist/assets/{Switch-BpB9h__9.js.map → Switch-Ac6Ov7uy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js → TabsNavigation-DZAAspqR.js} +2 -2
- package/ccw/frontend/dist/assets/{TabsNavigation-BGsKy7DO.js.map → TabsNavigation-DZAAspqR.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js → TaskDrawer-BJkwfhIZ.js} +2 -2
- package/ccw/frontend/dist/assets/{TaskDrawer-bYIlbM0Q.js.map → TaskDrawer-BJkwfhIZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js → TeamPage-BJgjxBgb.js} +2 -2
- package/ccw/frontend/dist/assets/{TeamPage-CihtQ6LQ.js.map → TeamPage-BJgjxBgb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js → TerminalDashboardPage-D1WekoOy.js} +2 -2
- package/ccw/frontend/dist/assets/{TerminalDashboardPage-BDnNF_ud.js.map → TerminalDashboardPage-D1WekoOy.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js → archive-DxemgIhF.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-CQJ86bQp.js.map → archive-DxemgIhF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js → archive-restore-CjS83f1V.js} +2 -2
- package/ccw/frontend/dist/assets/{archive-restore-BhTfDbPU.js.map → archive-restore-CjS83f1V.js.map} +1 -1
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js → arrow-right-B5PUcn8I.js} +2 -2
- package/ccw/frontend/dist/assets/{arrow-right-eUAZnT9C.js.map → arrow-right-B5PUcn8I.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js → bookmark-plus-DCc9aPbb.js} +2 -2
- package/ccw/frontend/dist/assets/{bookmark-plus-ilF5-V-k.js.map → bookmark-plus-DCc9aPbb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js → bot-DOwFtzak.js} +2 -2
- package/ccw/frontend/dist/assets/{bot-BLkaQscs.js.map → bot-DOwFtzak.js.map} +1 -1
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js → braces-96qH3aFh.js} +2 -2
- package/ccw/frontend/dist/assets/{braces-D9HdgsO6.js.map → braces-96qH3aFh.js.map} +1 -1
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js → circle-stop-CCxSuil1.js} +2 -2
- package/ccw/frontend/dist/assets/{circle-stop-C3ZF1okQ.js.map → circle-stop-CCxSuil1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js → cpu-CZNSJFdq.js} +2 -2
- package/ccw/frontend/dist/assets/{cpu-B-QjaSjm.js.map → cpu-CZNSJFdq.js.map} +1 -1
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js → ellipsis-vertical-h8xtvw2_.js} +2 -2
- package/ccw/frontend/dist/assets/{ellipsis-vertical-CbNlw2gS.js.map → ellipsis-vertical-h8xtvw2_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js → eye-D3NY0bm6.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-yAy69Cnn.js.map → eye-D3NY0bm6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js → eye-off-Cy2vkc8p.js} +2 -2
- package/ccw/frontend/dist/assets/{eye-off-D5uzLZyP.js.map → eye-off-Cy2vkc8p.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js → file-json-Bzq3U1Mx.js} +2 -2
- package/ccw/frontend/dist/assets/{file-json-rwo1NowL.js.map → file-json-Bzq3U1Mx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js → file-text-DwuwPDPi.js} +2 -2
- package/ccw/frontend/dist/assets/{file-text-DRkrjie9.js.map → file-text-DwuwPDPi.js.map} +1 -1
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js → filter-q9g-bknU.js} +2 -2
- package/ccw/frontend/dist/assets/{filter-BOe-OTu1.js.map → filter-q9g-bknU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js → folder-CL6vb42J.js} +2 -2
- package/ccw/frontend/dist/assets/{folder-BaWZWn_r.js.map → folder-CL6vb42J.js.map} +1 -1
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js → gauge-BkrcQBly.js} +2 -2
- package/ccw/frontend/dist/assets/{gauge-kazFexTr.js.map → gauge-BkrcQBly.js.map} +1 -1
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js → globe-BQbwyNeV.js} +2 -2
- package/ccw/frontend/dist/assets/{globe-BuHeEjxd.js.map → globe-BQbwyNeV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js → grid-3x3-x5_7DrN7.js} +2 -2
- package/ccw/frontend/dist/assets/{grid-3x3-DbhuUu4V.js.map → grid-3x3-x5_7DrN7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js → hard-drive-DTyWXwzf.js} +2 -2
- package/ccw/frontend/dist/assets/{hard-drive-AoLGL0z4.js.map → hard-drive-DTyWXwzf.js.map} +1 -1
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js → hash-80O0kJO7.js} +2 -2
- package/ccw/frontend/dist/assets/{hash-Dpo1exMB.js.map → hash-80O0kJO7.js.map} +1 -1
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js → history-DDlN2Bwa.js} +2 -2
- package/ccw/frontend/dist/assets/{history-ujQnmMC9.js.map → history-DDlN2Bwa.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js → index-B9A3Hnrk.js} +2 -2
- package/ccw/frontend/dist/assets/{index-CxzXz6o1.js.map → index-B9A3Hnrk.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-B76AGix5.js → index-Bs80iCX0.js} +2 -2
- package/ccw/frontend/dist/assets/{index-B76AGix5.js.map → index-Bs80iCX0.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js → index-mbeo62f8.js} +2 -2
- package/ccw/frontend/dist/assets/{index-C_Yf5fZ4.js.map → index-mbeo62f8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js → index-rLgoBCfV.js} +3 -3
- package/ccw/frontend/dist/assets/{index-Dff4bg3u.js.map → index-rLgoBCfV.js.map} +1 -1
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js → layout-grid-C1niOWJx.js} +2 -2
- package/ccw/frontend/dist/assets/{layout-grid-CBdE4K8h.js.map → layout-grid-C1niOWJx.js.map} +1 -1
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js → lightbulb-BTmI7SUg.js} +2 -2
- package/ccw/frontend/dist/assets/{lightbulb-B9K6ZgRp.js.map → lightbulb-BTmI7SUg.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js → link-2-CB9HKeuZ.js} +2 -2
- package/ccw/frontend/dist/assets/{link-2-Oea4xHJl.js.map → link-2-CB9HKeuZ.js.map} +1 -1
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js → link-koEYiemK.js} +2 -2
- package/ccw/frontend/dist/assets/{link-5yXdZBch.js.map → link-koEYiemK.js.map} +1 -1
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js → list-v2_GaLdC.js} +2 -2
- package/ccw/frontend/dist/assets/{list-9lHhC_U_.js.map → list-v2_GaLdC.js.map} +1 -1
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js → map-pin-BQNfAqG_.js} +2 -2
- package/ccw/frontend/dist/assets/{map-pin-B6Io5kmB.js.map → map-pin-BQNfAqG_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js → messages-square-Dzq5LGg9.js} +2 -2
- package/ccw/frontend/dist/assets/{messages-square-BT000aD3.js.map → messages-square-Dzq5LGg9.js.map} +1 -1
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js → minimize-2-CtkoJXcz.js} +2 -2
- package/ccw/frontend/dist/assets/{minimize-2-DO-zbT3a.js.map → minimize-2-CtkoJXcz.js.map} +1 -1
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js → package-CH3smL37.js} +2 -2
- package/ccw/frontend/dist/assets/{package-BjOw1ldU.js.map → package-CH3smL37.js.map} +1 -1
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js → plug-CZ0aL_yF.js} +2 -2
- package/ccw/frontend/dist/assets/{plug-9dAARpE1.js.map → plug-CZ0aL_yF.js.map} +1 -1
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js → power-F2A_J4l6.js} +2 -2
- package/ccw/frontend/dist/assets/{power-K2S39x7f.js.map → power-F2A_J4l6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js → save-Byxot0YU.js} +2 -2
- package/ccw/frontend/dist/assets/{save-D9-CoT3x.js.map → save-Byxot0YU.js.map} +1 -1
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js → send-JjqhUkpw.js} +2 -2
- package/ccw/frontend/dist/assets/{send-Bunw9NtC.js.map → send-JjqhUkpw.js.map} +1 -1
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js → settings-2--SuN9rAt.js} +2 -2
- package/ccw/frontend/dist/assets/{settings-2-osl4EXFf.js.map → settings-2--SuN9rAt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js → square-check-big-BbngGB2h.js} +2 -2
- package/ccw/frontend/dist/assets/{square-check-big-Dl5gYkjR.js.map → square-check-big-BbngGB2h.js.map} +1 -1
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js → square-pen-CgrHgZSl.js} +2 -2
- package/ccw/frontend/dist/assets/{square-pen-Bue1chJR.js.map → square-pen-CgrHgZSl.js.map} +1 -1
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js → star-BU3TQr7Z.js} +2 -2
- package/ccw/frontend/dist/assets/{star-Bk7EC7FB.js.map → star-BU3TQr7Z.js.map} +1 -1
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js → style-CKs7nnn3.js} +2 -2
- package/ccw/frontend/dist/assets/{style-BbREPmRj.js.map → style-CKs7nnn3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js → target-DW5tsDW6.js} +2 -2
- package/ccw/frontend/dist/assets/{target-CElrCVhR.js.map → target-DW5tsDW6.js.map} +1 -1
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js → test-tube-BHm7w3ON.js} +2 -2
- package/ccw/frontend/dist/assets/{test-tube-wciJaoas.js.map → test-tube-BHm7w3ON.js.map} +1 -1
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js → upload-DYR7PWwt.js} +2 -2
- package/ccw/frontend/dist/assets/{upload-BD1F07wG.js.map → upload-DYR7PWwt.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js → useApiSettings-D0TVgQD_.js} +2 -2
- package/ccw/frontend/dist/assets/{useApiSettings-D23HVEt8.js.map → useApiSettings-D0TVgQD_.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js → useCli-DfY8mAP8.js} +2 -2
- package/ccw/frontend/dist/assets/{useCli-BGDd_lXD.js.map → useCli-DfY8mAP8.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js → useCommands-CGusDp0F.js} +2 -2
- package/ccw/frontend/dist/assets/{useCommands-B-m_HxPB.js.map → useCommands-CGusDp0F.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js → useDebounce-CIwh0fF1.js} +2 -2
- package/ccw/frontend/dist/assets/{useDebounce-Z18-PHZr.js.map → useDebounce-CIwh0fF1.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js → useFileExplorer-FMyFv39K.js} +2 -2
- package/ccw/frontend/dist/assets/{useFileExplorer-D4gPp-LB.js.map → useFileExplorer-FMyFv39K.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js → useLocale-B2qhsoTb.js} +2 -2
- package/ccw/frontend/dist/assets/{useLocale-DJ62jjFa.js.map → useLocale-B2qhsoTb.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js → useSkills-cxKXMBm3.js} +3 -3
- package/ccw/frontend/dist/assets/{useSkills-B8NPs9__.js.map → useSkills-cxKXMBm3.js.map} +1 -1
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js → useSystemSettings-B-xUT_z-.js} +2 -2
- package/ccw/frontend/dist/assets/{useSystemSettings-CVi7nKGJ.js.map → useSystemSettings-B-xUT_z-.js.map} +1 -1
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js → wand-sparkles-DZV_3lPr.js} +2 -2
- package/ccw/frontend/dist/assets/{wand-sparkles-CLjPiU5w.js.map → wand-sparkles-DZV_3lPr.js.map} +1 -1
- package/ccw/frontend/dist/index.html +1 -1
- package/package.json +105 -105
- package/ccw/frontend/dist/assets/SettingsPage-BPDbXPSM.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphExplorerPage-ewMHQGem.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/maximize.js","../../../../node_modules/lucide-react/dist/esm/icons/network.js","../../../../node_modules/lucide-react/dist/esm/icons/square-function.js","../../../../node_modules/lucide-react/dist/esm/icons/variable.js","../../src/components/shared/GraphToolbar.tsx","../../src/components/shared/GraphSidebar.tsx","../../src/hooks/useGraphData.ts","../../src/pages/graph-explorer/nodes/ModuleNode.tsx","../../src/pages/graph-explorer/nodes/ClassNode.tsx","../../src/pages/graph-explorer/nodes/FunctionNode.tsx","../../src/pages/graph-explorer/nodes/VariableNode.tsx","../../src/pages/graph-explorer/nodes/index.ts","../../src/pages/graph-explorer/edges/ImportsEdge.tsx","../../src/pages/graph-explorer/edges/CallsEdge.tsx","../../src/pages/graph-explorer/edges/InheritsEdge.tsx","../../src/pages/graph-explorer/edges/index.ts","../../src/pages/GraphExplorerPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Maximize = createLucideIcon(\"Maximize\", [\n [\"path\", { d: \"M8 3H5a2 2 0 0 0-2 2v3\", key: \"1dcmit\" }],\n [\"path\", { d: \"M21 8V5a2 2 0 0 0-2-2h-3\", key: \"1e4gt3\" }],\n [\"path\", { d: \"M3 16v3a2 2 0 0 0 2 2h3\", key: \"wsl5sc\" }],\n [\"path\", { d: \"M16 21h3a2 2 0 0 0 2-2v-3\", key: \"18trek\" }]\n]);\n\nexport { Maximize as default };\n//# sourceMappingURL=maximize.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Network = createLucideIcon(\"Network\", [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n]);\n\nexport { Network as default };\n//# sourceMappingURL=network.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SquareFunction = createLucideIcon(\"SquareFunction\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"path\", { d: \"M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3\", key: \"m1af9g\" }],\n [\"path\", { d: \"M9 11.2h5.7\", key: \"3zgcl2\" }]\n]);\n\nexport { SquareFunction as default };\n//# sourceMappingURL=square-function.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Variable = createLucideIcon(\"Variable\", [\n [\"path\", { d: \"M8 21s-4-3-4-9 4-9 4-9\", key: \"uto9ud\" }],\n [\"path\", { d: \"M16 3s4 3 4 9-4 9-4 9\", key: \"4w2vsq\" }],\n [\"line\", { x1: \"15\", x2: \"9\", y1: \"9\", y2: \"15\", key: \"f7djnv\" }],\n [\"line\", { x1: \"9\", x2: \"15\", y1: \"9\", y2: \"15\", key: \"1shsy8\" }]\n]);\n\nexport { Variable as default };\n//# sourceMappingURL=variable.js.map\n","// ========================================\n// Graph Toolbar Component\n// ========================================\n// Toolbar with filters and actions for Graph Explorer\n\nimport { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Filter,\n Maximize,\n RefreshCw,\n ChevronDown,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/Button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/ui/Dropdown';\nimport { Badge } from '@/components/ui/Badge';\nimport type { GraphFilters, NodeType, EdgeType } from '@/types/graph-explorer';\n\nexport interface GraphToolbarProps {\n /** Current filters */\n filters: GraphFilters;\n /** On filters change callback */\n onFiltersChange: (filters: GraphFilters) => void;\n /** On fit view callback */\n onFitView: () => void;\n /** On refresh callback */\n onRefresh: () => void;\n /** On reset filters callback */\n onResetFilters: () => void;\n /** Node type counts for badges */\n nodeTypeCounts?: Partial<Record<NodeType, number>>;\n /** Edge type counts for badges */\n edgeTypeCounts?: Partial<Record<EdgeType, number>>;\n}\n\n/**\n * Graph toolbar component\n */\nexport function GraphToolbar({\n filters,\n onFiltersChange,\n onFitView,\n onRefresh,\n onResetFilters,\n nodeTypeCounts,\n edgeTypeCounts,\n}: GraphToolbarProps) {\n const { formatMessage } = useIntl();\n const [localFilters, setLocalFilters] = useState<GraphFilters>(filters);\n\n const nodeTypeLabels: Record<NodeType, string> = {\n component: formatMessage({ id: 'graph.nodeTypes.component' }),\n module: formatMessage({ id: 'graph.nodeTypes.module' }),\n function: formatMessage({ id: 'graph.nodeTypes.function' }),\n class: formatMessage({ id: 'graph.nodeTypes.class' }),\n interface: formatMessage({ id: 'graph.nodeTypes.interface' }),\n variable: formatMessage({ id: 'graph.nodeTypes.variable' }),\n file: formatMessage({ id: 'graph.nodeTypes.file' }),\n folder: formatMessage({ id: 'graph.nodeTypes.folder' }),\n dependency: formatMessage({ id: 'graph.nodeTypes.dependency' }),\n api: formatMessage({ id: 'graph.nodeTypes.api' }),\n database: formatMessage({ id: 'graph.nodeTypes.database' }),\n service: formatMessage({ id: 'graph.nodeTypes.service' }),\n hook: formatMessage({ id: 'graph.nodeTypes.hook' }),\n utility: formatMessage({ id: 'graph.nodeTypes.utility' }),\n unknown: formatMessage({ id: 'graph.nodeTypes.unknown' }),\n };\n\n const edgeTypeLabels: Record<EdgeType, string> = {\n imports: formatMessage({ id: 'graph.edgeTypes.imports' }),\n exports: formatMessage({ id: 'graph.edgeTypes.exports' }),\n extends: formatMessage({ id: 'graph.edgeTypes.extends' }),\n implements: formatMessage({ id: 'graph.edgeTypes.implements' }),\n uses: formatMessage({ id: 'graph.edgeTypes.uses' }),\n 'depends-on': formatMessage({ id: 'graph.edgeTypes.dependsOn' }),\n calls: formatMessage({ id: 'graph.edgeTypes.calls' }),\n instantiates: formatMessage({ id: 'graph.edgeTypes.instantiates' }),\n contains: formatMessage({ id: 'graph.edgeTypes.contains' }),\n 'related-to': formatMessage({ id: 'graph.edgeTypes.relatedTo' }),\n 'data-flow': formatMessage({ id: 'graph.edgeTypes.dataFlow' }),\n event: formatMessage({ id: 'graph.edgeTypes.event' }),\n unknown: formatMessage({ id: 'graph.edgeTypes.unknown' }),\n };\n\n const handleNodeTypeToggle = (nodeType: NodeType) => {\n const current = localFilters.nodeTypes || [];\n const updated = current.includes(nodeType)\n ? current.filter(t => t !== nodeType)\n : [...current, nodeType];\n const newFilters = { ...localFilters, nodeTypes: updated };\n setLocalFilters(newFilters);\n onFiltersChange(newFilters);\n };\n\n const handleEdgeTypeToggle = (edgeType: EdgeType) => {\n const current = localFilters.edgeTypes || [];\n const updated = current.includes(edgeType)\n ? current.filter(t => t !== edgeType)\n : [...current, edgeType];\n const newFilters = { ...localFilters, edgeTypes: updated };\n setLocalFilters(newFilters);\n onFiltersChange(newFilters);\n };\n\n const hasActiveFilters =\n (localFilters.nodeTypes && localFilters.nodeTypes.length < Object.keys(nodeTypeLabels).length) ||\n (localFilters.edgeTypes && localFilters.edgeTypes.length < Object.keys(edgeTypeLabels).length) ||\n localFilters.searchQuery ||\n localFilters.showOnlyIssues;\n\n return (\n <div className=\"flex items-center gap-2 p-3 bg-card border-b border-border\">\n {/* Node types filter */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Filter className=\"w-4 h-4\" />\n {formatMessage({ id: 'graph.filters.nodeTypes' })}\n <Badge variant=\"secondary\" className=\"ml-1\">\n {localFilters.nodeTypes?.length || 0}\n </Badge>\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n <DropdownMenuLabel>{formatMessage({ id: 'graph.filters.selectNodeTypes' })}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {Object.entries(nodeTypeLabels).map(([type, label]) => {\n const count = nodeTypeCounts?.[type as NodeType] || 0;\n const isChecked = localFilters.nodeTypes?.includes(type as NodeType);\n return (\n <DropdownMenuCheckboxItem\n key={type}\n checked={isChecked}\n onCheckedChange={() => handleNodeTypeToggle(type as NodeType)}\n disabled={count === 0}\n >\n <span className=\"flex-1\">{label}</span>\n {count > 0 && (\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\n {count}\n </Badge>\n )}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Edge types filter */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Filter className=\"w-4 h-4\" />\n {formatMessage({ id: 'graph.filters.edgeTypes' })}\n <Badge variant=\"secondary\" className=\"ml-1\">\n {localFilters.edgeTypes?.length || 0}\n </Badge>\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n <DropdownMenuLabel>{formatMessage({ id: 'graph.filters.selectEdgeTypes' })}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {Object.entries(edgeTypeLabels).map(([type, label]) => {\n const count = edgeTypeCounts?.[type as EdgeType] || 0;\n const isChecked = localFilters.edgeTypes?.includes(type as EdgeType);\n return (\n <DropdownMenuCheckboxItem\n key={type}\n checked={isChecked}\n onCheckedChange={() => handleEdgeTypeToggle(type as EdgeType)}\n disabled={count === 0}\n >\n <span className=\"flex-1\">{label}</span>\n {count > 0 && (\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\n {count}\n </Badge>\n )}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Separator */}\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Zoom and view controls */}\n <Button variant=\"ghost\" size=\"sm\" onClick={onFitView} title={formatMessage({ id: 'graph.actions.fitView' })}>\n <Maximize className=\"w-4 h-4\" />\n </Button>\n\n {/* Separator */}\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Actions */}\n <Button variant=\"ghost\" size=\"sm\" onClick={onRefresh} title={formatMessage({ id: 'graph.actions.refresh' })}>\n <RefreshCw className=\"w-4 h-4\" />\n </Button>\n\n {/* Reset filters button (only show when active filters) */}\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onResetFilters}\n className=\"text-amber-600 dark:text-amber-400\"\n title={formatMessage({ id: 'graph.actions.resetFilters' })}\n >\n <Filter className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'graph.actions.reset' })}\n </Button>\n )}\n </div>\n );\n}\n","// ========================================\n// Graph Sidebar Component\n// ========================================\n// Sidebar with legend and node details for Graph Explorer\n\nimport { useIntl } from 'react-intl';\nimport { X, Info, Network, FileText, GitBranch, Zap } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Badge } from '@/components/ui/Badge';\nimport type { GraphNode, NodeType, EdgeType } from '@/types/graph-explorer';\n\nexport interface GraphSidebarProps {\n /** Selected node */\n selectedNode: GraphNode | null;\n /** Legend visibility */\n showLegend?: boolean;\n /** On close callback */\n onClose: () => void;\n}\n\n/**\n * Node type legend item\n */\ninterface LegendItem {\n type: NodeType;\n label: string;\n color: string;\n icon: React.ElementType;\n}\n\n/**\n * Graph sidebar component\n */\nexport function GraphSidebar({ selectedNode, showLegend = true, onClose }: GraphSidebarProps) {\n const { formatMessage } = useIntl();\n\n const legendItems: LegendItem[] = [\n {\n type: 'component',\n label: formatMessage({ id: 'graph.legend.component' }),\n color: 'bg-blue-500',\n icon: Network,\n },\n {\n type: 'module',\n label: formatMessage({ id: 'graph.legend.module' }),\n color: 'bg-blue-500',\n icon: FileText,\n },\n {\n type: 'class',\n label: formatMessage({ id: 'graph.legend.class' }),\n color: 'bg-green-500',\n icon: GitBranch,\n },\n {\n type: 'function',\n label: formatMessage({ id: 'graph.legend.function' }),\n color: 'bg-orange-500',\n icon: Zap,\n },\n {\n type: 'variable',\n label: formatMessage({ id: 'graph.legend.variable' }),\n color: 'bg-cyan-500',\n icon: Info,\n },\n ];\n\n const edgeLegendItems = [\n {\n type: 'imports' as EdgeType,\n label: formatMessage({ id: 'graph.legend.imports' }),\n color: 'stroke-gray-500',\n dashArray: '',\n },\n {\n type: 'calls' as EdgeType,\n label: formatMessage({ id: 'graph.legend.calls' }),\n color: 'stroke-green-500',\n dashArray: '',\n },\n {\n type: 'extends' as EdgeType,\n label: formatMessage({ id: 'graph.legend.extends' }),\n color: 'stroke-purple-500',\n dashArray: 'stroke-dasharray',\n },\n ];\n\n return (\n <div className=\"w-80 bg-card border-l border-border flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h2 className=\"font-semibold text-sm\">\n {selectedNode\n ? formatMessage({ id: 'graph.sidebar.nodeDetails' })\n : formatMessage({ id: 'graph.sidebar.title' })}\n </h2>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose}>\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {/* Node details */}\n {selectedNode ? (\n <div className=\"p-4 space-y-4\">\n {/* Node header */}\n <div>\n <div className=\"flex items-center gap-2 mb-2\">\n <Badge variant=\"outline\">{selectedNode.type}</Badge>\n {selectedNode.data.hasIssues && (\n <Badge variant=\"destructive\">\n {formatMessage({ id: 'graph.sidebar.hasIssues' })}\n </Badge>\n )}\n </div>\n <h3 className=\"text-lg font-semibold\">{selectedNode.data.label}</h3>\n </div>\n\n {/* File path */}\n {selectedNode.data.filePath && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.filePath' })}\n </label>\n <p className=\"text-sm font-mono mt-1 break-all\">{selectedNode.data.filePath}</p>\n </div>\n )}\n\n {/* Line number */}\n {selectedNode.data.lineNumber && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.lineNumber' })}\n </label>\n <p className=\"text-sm mt-1\">{selectedNode.data.lineNumber}</p>\n </div>\n )}\n\n {/* Category */}\n {selectedNode.data.category && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.category' })}\n </label>\n <p className=\"text-sm mt-1 capitalize\">{selectedNode.data.category}</p>\n </div>\n )}\n\n {/* Line count */}\n {selectedNode.data.lineCount && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.lineCount' })}\n </label>\n <p className=\"text-sm mt-1\">{selectedNode.data.lineCount} lines</p>\n </div>\n )}\n\n {/* Documentation */}\n {selectedNode.data.documentation && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.documentation' })}\n </label>\n <p className=\"text-sm mt-1 text-muted-foreground\">{selectedNode.data.documentation}</p>\n </div>\n )}\n\n {/* Tags */}\n {selectedNode.data.tags && selectedNode.data.tags.length > 0 && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.tags' })}\n </label>\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {selectedNode.data.tags.map(tag => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n {/* Issues */}\n {selectedNode.data.issues && selectedNode.data.issues.length > 0 && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.issues' })}\n </label>\n <ul className=\"mt-2 space-y-1\">\n {selectedNode.data.issues.map((issue, idx) => (\n <li key={idx} className=\"text-sm text-red-600 dark:text-red-400\">\n • {issue}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ) : (\n <div className=\"p-4 space-y-6\">\n {/* Node types legend */}\n {showLegend && (\n <div>\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase mb-3\">\n {formatMessage({ id: 'graph.legend.nodeTypes' })}\n </h3>\n <div className=\"space-y-2\">\n {legendItems.map(item => {\n const Icon = item.icon;\n return (\n <div key={item.type} className=\"flex items-center gap-2\">\n <div className={cn('w-4 h-4 rounded', item.color)} />\n <Icon className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm\">{item.label}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Edge types legend */}\n {showLegend && (\n <div>\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase mb-3\">\n {formatMessage({ id: 'graph.legend.edgeTypes' })}\n </h3>\n <div className=\"space-y-2\">\n {edgeLegendItems.map(item => (\n <div key={item.type} className=\"flex items-center gap-2\">\n <div className={cn('w-8 h-0.5', item.color, item.dashArray)} />\n <span className=\"text-sm\">{item.label}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Instructions */}\n <div className=\"p-3 bg-muted rounded-lg\">\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.instructions' })}\n </p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ========================================\n// useGraphData Hook\n// ========================================\n// TanStack Query hooks for Graph Explorer with data transformation\n\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport {\n fetchGraphDependencies,\n fetchGraphImpact,\n type GraphDependenciesRequest,\n type GraphDependenciesResponse,\n} from '../lib/api';\nimport type {\n GraphData,\n GraphFilters,\n NodeType,\n EdgeType,\n} from '../types/graph-explorer';\n\n// Query key factory\nexport const graphKeys = {\n all: ['graph'] as const,\n dependencies: () => [...graphKeys.all, 'dependencies'] as const,\n dependency: (request: GraphDependenciesRequest) => [...graphKeys.dependencies(), request] as const,\n impact: (nodeId: string) => [...graphKeys.all, 'impact', nodeId] as const,\n};\n\n// Default stale time: 5 minutes (graph data doesn't change frequently)\nconst STALE_TIME = 5 * 60 * 1000;\n\nexport interface UseGraphDataOptions {\n /** Override default stale time (ms) */\n staleTime?: number;\n /** Enable/disable the query */\n enabled?: boolean;\n /** Root path for analysis */\n rootPath?: string;\n /** Maximum depth for traversal */\n maxDepth?: number;\n /** Filter by node types */\n nodeTypes?: NodeType[];\n /** Filter by edge types */\n edgeTypes?: EdgeType[];\n}\n\nexport interface UseGraphDataReturn {\n /** Graph data with nodes and edges */\n graphData: GraphData | undefined;\n /** Loading state for initial fetch */\n isLoading: boolean;\n /** Fetching state (initial or refetch) */\n isFetching: boolean;\n /** Error object if query failed */\n error: Error | null;\n /** Manually refetch data */\n refetch: () => Promise<void>;\n /** Invalidate and refetch graph data */\n invalidate: () => Promise<void>;\n /** Apply filters to graph data */\n applyFilters: (filters: GraphFilters) => GraphData | undefined;\n}\n\n/**\n * Transform API response to GraphData format\n */\nfunction transformToGraphData(response: GraphDependenciesResponse): GraphData {\n return {\n nodes: response.nodes,\n edges: response.edges,\n metadata: response.metadata,\n };\n}\n\n/**\n * Apply filters to graph data\n */\nfunction filterGraphData(\n graphData: GraphData | undefined,\n filters: GraphFilters\n): GraphData | undefined {\n if (!graphData) return undefined;\n\n let filteredNodes = [...graphData.nodes];\n let filteredEdges = [...graphData.edges];\n\n // Filter by node types\n if (filters.nodeTypes && filters.nodeTypes.length > 0) {\n const nodeTypeSet = new Set(filters.nodeTypes);\n filteredNodes = filteredNodes.filter(node => node.type && nodeTypeSet.has(node.type));\n }\n\n // Filter by edge types\n if (filters.edgeTypes && filters.edgeTypes.length > 0) {\n const edgeTypeSet = new Set(filters.edgeTypes);\n filteredEdges = filteredEdges.filter(edge => edge.data?.edgeType && edgeTypeSet.has(edge.data.edgeType));\n }\n\n // Filter by search query\n if (filters.searchQuery) {\n const query = filters.searchQuery.toLowerCase();\n filteredNodes = filteredNodes.filter(node =>\n node.data.label.toLowerCase().includes(query) ||\n node.data.filePath?.toLowerCase().includes(query)\n );\n }\n\n // Filter by file path pattern\n if (filters.filePathPattern) {\n const pattern = new RegExp(filters.filePathPattern, 'i');\n filteredNodes = filteredNodes.filter(node =>\n node.data.filePath?.match(pattern)\n );\n }\n\n // Filter by categories\n if (filters.categories && filters.categories.length > 0) {\n const categorySet = new Set(filters.categories);\n filteredNodes = filteredNodes.filter(node =>\n node.data.category && categorySet.has(node.data.category)\n );\n }\n\n // Filter only nodes with issues\n if (filters.showOnlyIssues) {\n filteredNodes = filteredNodes.filter(node => node.data.hasIssues);\n }\n\n // Filter by minimum complexity\n if (filters.minComplexity !== undefined) {\n filteredNodes = filteredNodes.filter(_node => {\n // This would require complexity data to be available\n // For now, we'll skip this filter\n return true;\n });\n }\n\n // Filter by tags\n if (filters.tags && filters.tags.length > 0) {\n const tagSet = new Set(filters.tags);\n filteredNodes = filteredNodes.filter(node =>\n node.data.tags?.some(tag => tagSet.has(tag))\n );\n }\n\n // Exclude tags\n if (filters.excludeTags && filters.excludeTags.length > 0) {\n const excludeTagSet = new Set(filters.excludeTags);\n filteredNodes = filteredNodes.filter(node =>\n !node.data.tags?.some(tag => excludeTagSet.has(tag))\n );\n }\n\n // Show/hide isolated nodes\n if (!filters.showIsolatedNodes) {\n const connectedNodeIds = new Set<string>();\n filteredEdges.forEach(edge => {\n connectedNodeIds.add(edge.source);\n connectedNodeIds.add(edge.target);\n });\n filteredNodes = filteredNodes.filter(node => connectedNodeIds.has(node.id));\n }\n\n // Build set of visible node IDs\n const visibleNodeIds = new Set(filteredNodes.map(node => node.id));\n\n // Filter edges to only include edges between visible nodes\n filteredEdges = filteredEdges.filter(edge =>\n visibleNodeIds.has(edge.source) && visibleNodeIds.has(edge.target)\n );\n\n // Apply max depth filter (focus on specific node)\n if (filters.focusNodeId) {\n const focusNode = filteredNodes.find(n => n.id === filters.focusNodeId);\n if (focusNode) {\n // Collect nodes within max depth\n const nodesWithinDepth = new Set<string>([filters.focusNodeId]);\n const visited = new Set<string>();\n\n const traverse = (nodeId: string, depth: number) => {\n if (depth > (filters.maxDepth || 3)) return;\n if (visited.has(nodeId)) return;\n visited.add(nodeId);\n\n filteredEdges.forEach(edge => {\n if (edge.source === nodeId && !nodesWithinDepth.has(edge.target)) {\n nodesWithinDepth.add(edge.target);\n traverse(edge.target, depth + 1);\n }\n if (edge.target === nodeId && !nodesWithinDepth.has(edge.source)) {\n nodesWithinDepth.add(edge.source);\n traverse(edge.source, depth + 1);\n }\n });\n };\n\n traverse(filters.focusNodeId, 0);\n\n filteredNodes = filteredNodes.filter(node => nodesWithinDepth.has(node.id));\n const depthNodeIds = new Set(nodesWithinDepth);\n filteredEdges = filteredEdges.filter(edge =>\n depthNodeIds.has(edge.source) && depthNodeIds.has(edge.target)\n );\n }\n }\n\n return {\n nodes: filteredNodes,\n edges: filteredEdges,\n metadata: graphData.metadata,\n };\n}\n\n/**\n * Hook for fetching and filtering graph data\n *\n * @example\n * ```tsx\n * const { graphData, isLoading, applyFilters } = useGraphData({\n * rootPath: '/src',\n * maxDepth: 3\n * });\n *\n * // Apply filters\n * const filteredData = applyFilters({\n * nodeTypes: ['component', 'hook'],\n * edgeTypes: ['imports', 'uses']\n * });\n * ```\n */\nexport function useGraphData(options: UseGraphDataOptions = {}): UseGraphDataReturn {\n const {\n staleTime = STALE_TIME,\n enabled = true,\n rootPath,\n maxDepth,\n nodeTypes,\n } = options;\n\n const queryClient = useQueryClient();\n\n const request: GraphDependenciesRequest = {\n rootPath,\n maxDepth,\n includeTypes: nodeTypes,\n };\n\n const query = useQuery({\n queryKey: graphKeys.dependency(request),\n queryFn: () => fetchGraphDependencies(request),\n staleTime,\n enabled,\n retry: 2,\n select: transformToGraphData,\n });\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: graphKeys.all });\n };\n\n const applyFilters = (filters: GraphFilters) => {\n return filterGraphData(query.data, filters);\n };\n\n return {\n graphData: query.data,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error as Error | null,\n refetch,\n invalidate,\n applyFilters,\n };\n}\n\n/**\n * Hook for fetching impact analysis for a specific node\n */\nexport function useGraphImpact(\n nodeId: string | null,\n options: {\n direction?: 'upstream' | 'downstream' | 'both';\n maxDepth?: number;\n enabled?: boolean;\n } = {}\n) {\n const { direction = 'both', maxDepth = 3, enabled = true } = options;\n\n return useQuery({\n queryKey: graphKeys.impact(nodeId || ''),\n queryFn: () => {\n if (!nodeId) throw new Error('Node ID is required');\n return fetchGraphImpact({ nodeId, direction, maxDepth });\n },\n enabled: enabled && !!nodeId,\n staleTime: STALE_TIME,\n retry: 1,\n });\n}\n","// ========================================\n// Module Node Component\n// ========================================\n// Custom node for file/module visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { File, Package } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Module node component - represents files, modules, or packages\n */\nexport const ModuleNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-gray-300 dark:border-gray-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-gray-400\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className={`\n flex-shrink-0 w-8 h-8 rounded flex items-center justify-center\n ${nodeData.category === 'external' ? 'bg-purple-100 dark:bg-purple-900/30' : 'bg-blue-100 dark:bg-blue-900/30'}\n `}>\n {nodeData.category === 'external' ? (\n <Package className=\"w-4 h-4 text-purple-600 dark:text-purple-400\" />\n ) : (\n <File className=\"w-4 h-4 text-blue-600 dark:text-blue-400\" />\n )}\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineCount && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n {nodeData.lineCount} lines\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Tags */}\n {nodeData.tags && nodeData.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {nodeData.tags.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"px-1.5 py-0.5 text-xs bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 rounded\"\n >\n {tag}\n </span>\n ))}\n {nodeData.tags.length > 3 && (\n <span className=\"px-1.5 py-0.5 text-xs text-muted-foreground\">\n +{nodeData.tags.length - 3}\n </span>\n )}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-gray-400\" />\n </div>\n );\n});\n\nModuleNode.displayName = 'ModuleNode';\n","// ========================================\n// Class Node Component\n// ========================================\n// Custom node for class visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { Braces } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Class node component - represents class definitions\n */\nexport const ClassNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-green-500 dark:border-green-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-green-500\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded flex items-center justify-center bg-green-100 dark:bg-green-900/30\">\n <Braces className=\"w-4 h-4 text-green-600 dark:text-green-400\" />\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineNumber && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n Line {nodeData.lineNumber}\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Documentation/Tooltip */}\n {nodeData.documentation && (\n <div className=\"mt-2 text-xs text-muted-foreground line-clamp-2\" title={nodeData.documentation}>\n {nodeData.documentation}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-green-500\" />\n </div>\n );\n});\n\nClassNode.displayName = 'ClassNode';\n","// ========================================\n// Function Node Component\n// ========================================\n// Custom node for function/method visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { FunctionSquare } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Function node component - represents functions and methods\n */\nexport const FunctionNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-orange-500 dark:border-orange-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-orange-500\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded flex items-center justify-center bg-orange-100 dark:bg-orange-900/30\">\n <FunctionSquare className=\"w-4 h-4 text-orange-600 dark:text-orange-400\" />\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineNumber && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n Line {nodeData.lineNumber}\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Documentation/Tooltip */}\n {nodeData.documentation && (\n <div className=\"mt-2 text-xs text-muted-foreground line-clamp-2\" title={nodeData.documentation}>\n {nodeData.documentation}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-orange-500\" />\n </div>\n );\n});\n\nFunctionNode.displayName = 'FunctionNode';\n","// ========================================\n// Variable Node Component\n// ========================================\n// Custom node for variable/constant visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { Variable } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Variable node component - represents variables and constants\n */\nexport const VariableNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-cyan-500 dark:border-cyan-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-cyan-500\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded flex items-center justify-center bg-cyan-100 dark:bg-cyan-900/30\">\n <Variable className=\"w-4 h-4 text-cyan-600 dark:text-cyan-400\" />\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineNumber && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n Line {nodeData.lineNumber}\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Type annotation */}\n {nodeData.documentation && (\n <div className=\"mt-2 text-xs text-muted-foreground font-mono\" title={nodeData.documentation}>\n {nodeData.documentation}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-cyan-500\" />\n </div>\n );\n});\n\nVariableNode.displayName = 'VariableNode';\n","// ========================================\n// Node Components Barrel Export\n// ========================================\n\nexport { ModuleNode } from './ModuleNode';\nexport { ClassNode } from './ClassNode';\nexport { FunctionNode } from './FunctionNode';\nexport { VariableNode } from './VariableNode';\n\nimport { ModuleNode } from './ModuleNode';\nimport { ClassNode } from './ClassNode';\nimport { FunctionNode } from './FunctionNode';\nimport { VariableNode } from './VariableNode';\n\n// Node types map for React Flow registration\nexport const nodeTypes = {\n module: ModuleNode,\n class: ClassNode,\n function: FunctionNode,\n variable: VariableNode,\n component: ModuleNode, // Reuse ModuleNode for components\n interface: ClassNode, // Reuse ClassNode for interfaces\n file: ModuleNode, // Reuse ModuleNode for files\n folder: ModuleNode, // Reuse ModuleNode for folders\n dependency: ModuleNode, // Reuse ModuleNode for dependencies\n api: ModuleNode, // Reuse ModuleNode for APIs\n database: ModuleNode, // Reuse ModuleNode for databases\n service: ModuleNode, // Reuse ModuleNode for services\n hook: FunctionNode, // Reuse FunctionNode for hooks\n utility: FunctionNode, // Reuse FunctionNode for utilities\n unknown: ModuleNode, // Reuse ModuleNode for unknown types\n};\n","// ========================================\n// Imports Edge Component\n// ========================================\n// Custom edge for import relationship visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport {\n EdgeProps,\n getBezierPath,\n EdgeLabelRenderer,\n BaseEdge,\n} from '@xyflow/react';\nimport type { GraphEdgeData } from '@/types/graph-explorer';\n\n/**\n * Imports edge component - represents import/requires relationships\n */\nexport const ImportsEdge = memo((props: EdgeProps) => {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n style,\n markerEnd,\n } = props;\n const data = props.data as GraphEdgeData | undefined;\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const edgeStyle = {\n ...style,\n stroke: selected ? '#3b82f6' : '#64748b',\n strokeWidth: selected ? 2 : 1.5,\n strokeDasharray: data?.importType === 'dynamic' ? '5,5' : undefined,\n };\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {data?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${(sourceX + targetX) / 2}px, ${(sourceY + targetY) / 2}px)`,\n pointerEvents: 'all',\n }}\n className=\"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-gray-200 dark:border-gray-700\"\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n\nImportsEdge.displayName = 'ImportsEdge';\n","// ========================================\n// Calls Edge Component\n// ========================================\n// Custom edge for function/method call visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport {\n EdgeProps,\n getBezierPath,\n EdgeLabelRenderer,\n BaseEdge,\n} from '@xyflow/react';\nimport type { GraphEdgeData } from '@/types/graph-explorer';\n\n/**\n * Calls edge component - represents function/method call relationships\n */\nexport const CallsEdge = memo((props: EdgeProps) => {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n style,\n markerEnd,\n } = props;\n const data = props.data as GraphEdgeData | undefined;\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const edgeStyle = {\n ...style,\n stroke: selected ? '#10b981' : '#22c55e',\n strokeWidth: selected ? 2 : 1.5,\n };\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {data?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${(sourceX + targetX) / 2}px, ${(sourceY + targetY) / 2}px)`,\n pointerEvents: 'all',\n }}\n className=\"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-green-200 dark:border-green-700\"\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n\nCallsEdge.displayName = 'CallsEdge';\n","// ========================================\n// Inherits Edge Component\n// ========================================\n// Custom edge for inheritance relationship visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport {\n EdgeProps,\n getSmoothStepPath,\n EdgeLabelRenderer,\n BaseEdge,\n} from '@xyflow/react';\nimport type { GraphEdgeData } from '@/types/graph-explorer';\n\n/**\n * Inherits edge component - represents inheritance/implementation relationships\n */\nexport const InheritsEdge = memo((props: EdgeProps) => {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n style,\n markerEnd,\n } = props;\n const data = props.data as GraphEdgeData | undefined;\n const [edgePath] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n borderRadius: 20,\n });\n\n const edgeStyle = {\n ...style,\n stroke: selected ? '#f59e0b' : '#a855f7',\n strokeWidth: selected ? 2 : 2,\n strokeDasharray: '4,4',\n };\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {data?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${(sourceX + targetX) / 2}px, ${(sourceY + targetY) / 2}px)`,\n pointerEvents: 'all',\n }}\n className=\"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-purple-200 dark:border-purple-700\"\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n\nInheritsEdge.displayName = 'InheritsEdge';\n","// ========================================\n// Edge Components Barrel Export\n// ========================================\n\nexport { ImportsEdge } from './ImportsEdge';\nexport { CallsEdge } from './CallsEdge';\nexport { InheritsEdge } from './InheritsEdge';\n\nimport { ImportsEdge } from './ImportsEdge';\nimport { CallsEdge } from './CallsEdge';\nimport { InheritsEdge } from './InheritsEdge';\n\n// Edge types map for React Flow registration\nexport const edgeTypes = {\n imports: ImportsEdge,\n calls: CallsEdge,\n extends: InheritsEdge,\n implements: InheritsEdge,\n};\n","// ========================================\n// Graph Explorer Page\n// ========================================\n// Main page for code dependency graph visualization\n\nimport { useCallback, useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n Controls,\n MiniMap,\n useReactFlow,\n Panel,\n ReactFlowProvider,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { useGraphData } from '@/hooks/useGraphData';\nimport { GraphToolbar } from '@/components/shared/GraphToolbar';\nimport { GraphSidebar } from '@/components/shared/GraphSidebar';\nimport { Loader2 } from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { AlertCircle } from 'lucide-react';\nimport type { GraphNode, GraphFilters, NodeType, EdgeType } from '@/types/graph-explorer';\nimport { nodeTypes } from './graph-explorer/nodes';\nimport { edgeTypes } from './graph-explorer/edges';\n\n/**\n * Inner Graph Explorer Page Component (wrapped with ReactFlowProvider)\n */\nfunction GraphExplorerPageInner() {\n const { formatMessage } = useIntl();\n const { fitView } = useReactFlow();\n\n // State\n const [selectedNode, setSelectedNode] = useState<GraphNode | null>(null);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n const [filters, setFilters] = useState<GraphFilters>({\n nodeTypes: ['component', 'module', 'class', 'function', 'variable', 'interface', 'hook'],\n edgeTypes: ['imports', 'exports', 'extends', 'implements', 'uses', 'calls', 'depends-on'],\n showIsolatedNodes: false,\n });\n\n // Fetch graph data\n const { graphData, isLoading, isFetching, error, refetch, applyFilters } = useGraphData({\n rootPath: '/src',\n maxDepth: 3,\n enabled: true,\n });\n\n // Apply filters to graph data\n const filteredGraphData = useMemo(() => {\n return applyFilters(filters) || { nodes: [], edges: [], metadata: undefined };\n }, [graphData, filters, applyFilters]);\n\n // Calculate node/edge type counts for badges\n const nodeTypeCounts = useMemo(() => {\n const counts: Partial<Record<NodeType, number>> = {};\n graphData?.nodes.forEach(node => {\n counts[node.type as NodeType] = (counts[node.type as NodeType] || 0) + 1;\n });\n return counts;\n }, [graphData]);\n\n const edgeTypeCounts = useMemo(() => {\n const counts: Partial<Record<EdgeType, number>> = {};\n graphData?.edges.forEach(edge => {\n const type = edge.data?.edgeType as EdgeType;\n if (type) {\n counts[type] = (counts[type] || 0) + 1;\n }\n });\n return counts;\n }, [graphData]);\n\n // Event handlers\n const handleNodeClick = useCallback((_event: React.MouseEvent, node: GraphNode) => {\n setSelectedNode(node);\n setIsSidebarOpen(true);\n }, []);\n\n const handlePaneClick = useCallback(() => {\n setSelectedNode(null);\n }, []);\n\n const handleFitView = useCallback(() => {\n fitView({ padding: 0.2, duration: 300 });\n }, [fitView]);\n\n const handleRefresh = useCallback(async () => {\n await refetch();\n }, [refetch]);\n\n const handleFiltersChange = useCallback((newFilters: GraphFilters) => {\n setFilters(newFilters);\n }, []);\n\n const handleResetFilters = useCallback(() => {\n setFilters({\n nodeTypes: ['component', 'module', 'class', 'function', 'variable', 'interface', 'hook'],\n edgeTypes: ['imports', 'exports', 'extends', 'implements', 'uses', 'calls', 'depends-on'],\n showIsolatedNodes: false,\n });\n }, []);\n\n const handleSidebarClose = useCallback(() => {\n setIsSidebarOpen(false);\n setSelectedNode(null);\n }, []);\n\n // Loading state\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <Loader2 className=\"w-8 h-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full p-6\">\n <Card className=\"p-6 border-red-200 dark:border-red-800\">\n <div className=\"flex items-center gap-3\">\n <AlertCircle className=\"w-5 h-5 text-red-500\" />\n <p className=\"text-sm text-red-600 dark:text-red-400\">\n {formatMessage({ id: 'graph.error.loading' }, { message: error.message })}\n </p>\n </div>\n </Card>\n </div>\n );\n }\n\n // Empty state\n if (!graphData || graphData.nodes.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <Card className=\"p-6\">\n <div className=\"flex items-center gap-3\">\n <AlertCircle className=\"w-5 h-5 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n {formatMessage({ id: 'graph.empty' })}\n </p>\n </div>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n {/* Toolbar */}\n <GraphToolbar\n filters={filters}\n onFiltersChange={handleFiltersChange}\n onFitView={handleFitView}\n onRefresh={handleRefresh}\n onResetFilters={handleResetFilters}\n nodeTypeCounts={nodeTypeCounts}\n edgeTypeCounts={edgeTypeCounts}\n />\n\n {/* Main content area */}\n <div className=\"flex-1 flex overflow-hidden\">\n {/* Graph canvas */}\n <div className=\"flex-1 relative\">\n <ReactFlow\n nodes={filteredGraphData.nodes}\n edges={filteredGraphData.edges}\n onNodeClick={handleNodeClick}\n onPaneClick={handlePaneClick}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n fitView\n defaultViewport={{ x: 0, y: 0, zoom: 0.8 }}\n minZoom={0.1}\n maxZoom={2}\n className=\"bg-background\"\n >\n <Background variant={BackgroundVariant.Dots} gap={20} size={1} />\n <Controls />\n <MiniMap\n nodeColor={(node) => {\n switch (node.type) {\n case 'component':\n case 'module':\n return '#3b82f6';\n case 'class':\n return '#22c55e';\n case 'function':\n return '#f97316';\n case 'variable':\n return '#06b6d4';\n default:\n return '#6b7280';\n }\n }}\n maskColor=\"rgba(0, 0, 0, 0.1)\"\n />\n\n {/* Status panel */}\n <Panel position=\"top-left\" className=\"bg-card/90 backdrop-blur border border-border rounded-lg p-3 shadow-lg\">\n <div className=\"text-xs space-y-1\">\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-muted-foreground\">\n {formatMessage({ id: 'graph.status.nodes' })}\n </span>\n <span className=\"font-medium\">{filteredGraphData.nodes.length}</span>\n </div>\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-muted-foreground\">\n {formatMessage({ id: 'graph.status.edges' })}\n </span>\n <span className=\"font-medium\">{filteredGraphData.edges.length}</span>\n </div>\n {isFetching && (\n <div className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'graph.status.updating' })}\n </div>\n )}\n </div>\n </Panel>\n </ReactFlow>\n </div>\n\n {/* Sidebar */}\n {isSidebarOpen && (\n <GraphSidebar\n selectedNode={selectedNode}\n showLegend={!selectedNode}\n onClose={handleSidebarClose}\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Graph Explorer Page Component (with ReactFlowProvider wrapper)\n */\nexport function GraphExplorerPage() {\n return (\n <ReactFlowProvider>\n <GraphExplorerPageInner />\n </ReactFlowProvider>\n );\n}\n\nexport default GraphExplorerPage;\n"],"names":["Maximize","createLucideIcon","Network","SquareFunction","Variable","GraphToolbar","filters","onFiltersChange","onFitView","onRefresh","onResetFilters","nodeTypeCounts","edgeTypeCounts","formatMessage","useIntl","localFilters","setLocalFilters","useState","nodeTypeLabels","edgeTypeLabels","handleNodeTypeToggle","nodeType","current","updated","t","newFilters","handleEdgeTypeToggle","edgeType","hasActiveFilters","jsxs","DropdownMenu","jsx","DropdownMenuTrigger","Button","Filter","Badge","_a","ChevronDown","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","type","label","count","isChecked","DropdownMenuCheckboxItem","_b","RefreshCw","GraphSidebar","selectedNode","showLegend","onClose","legendItems","FileText","GitBranch","Zap","Info","edgeLegendItems","X","tag","issue","idx","item","Icon","cn","graphKeys","request","nodeId","STALE_TIME","transformToGraphData","response","filterGraphData","graphData","filteredNodes","filteredEdges","nodeTypeSet","node","edgeTypeSet","edge","query","pattern","categorySet","_node","tagSet","excludeTagSet","connectedNodeIds","visibleNodeIds","n","nodesWithinDepth","visited","traverse","depth","depthNodeIds","useGraphData","options","staleTime","enabled","rootPath","maxDepth","nodeTypes","queryClient","useQueryClient","useQuery","fetchGraphDependencies","refetch","invalidate","applyFilters","ModuleNode","memo","props","data","selected","nodeData","hasIssues","severity","getBorderColor","getBackgroundColor","Handle","Position","Package","File","ClassNode","Braces","FunctionNode","FunctionSquare","VariableNode","ImportsEdge","id","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","style","markerEnd","edgePath","getBezierPath","edgeStyle","Fragment","BaseEdge","EdgeLabelRenderer","CallsEdge","InheritsEdge","getSmoothStepPath","edgeTypes","GraphExplorerPageInner","fitView","useReactFlow","setSelectedNode","isSidebarOpen","setIsSidebarOpen","setFilters","isLoading","isFetching","error","filteredGraphData","useMemo","counts","handleNodeClick","useCallback","_event","handlePaneClick","handleFitView","handleRefresh","handleFiltersChange","handleResetFilters","handleSidebarClose","Loader2","Card","AlertCircle","ReactFlow","Background","BackgroundVariant","Controls","MiniMap","Panel","GraphExplorerPage","ReactFlowProvider"],"mappings":"2jBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMA,GAAWC,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,yBAA0B,IAAK,QAAQ,CAAE,EACvD,CAAC,OAAQ,CAAE,EAAG,2BAA4B,IAAK,QAAQ,CAAE,EACzD,CAAC,OAAQ,CAAE,EAAG,0BAA2B,IAAK,QAAQ,CAAE,EACxD,CAAC,OAAQ,CAAE,EAAG,4BAA6B,IAAK,QAAQ,CAAE,CAC5D,CAAC,ECdD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMC,GAAUD,EAAiB,UAAW,CAC1C,CAAC,OAAQ,CAAE,EAAG,KAAM,EAAG,KAAM,MAAO,IAAK,OAAQ,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC9E,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,KAAM,MAAO,IAAK,OAAQ,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC7E,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,IAAK,OAAQ,IAAK,GAAI,IAAK,IAAK,QAAQ,CAAE,EAC5E,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAQ,CAAE,EAC1E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAQ,CAAE,CAC3C,CAAC,ECfD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAME,GAAiBF,EAAiB,iBAAkB,CACxD,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,SAAU,EACvF,CAAC,OAAQ,CAAE,EAAG,6CAA8C,IAAK,QAAQ,CAAE,EAC3E,CAAC,OAAQ,CAAE,EAAG,cAAe,IAAK,QAAQ,CAAE,CAC9C,CAAC,ECbD;AAAA;AAAA;AAAA;AAAA;AAAA,GASA,MAAMG,GAAWH,EAAiB,WAAY,CAC5C,CAAC,OAAQ,CAAE,EAAG,yBAA0B,IAAK,QAAQ,CAAE,EACvD,CAAC,OAAQ,CAAE,EAAG,wBAAyB,IAAK,QAAQ,CAAE,EACtD,CAAC,OAAQ,CAAE,GAAI,KAAM,GAAI,IAAK,GAAI,IAAK,GAAI,KAAM,IAAK,QAAQ,CAAE,EAChE,CAAC,OAAQ,CAAE,GAAI,IAAK,GAAI,KAAM,GAAI,IAAK,GAAI,KAAM,IAAK,QAAQ,CAAE,CAClE,CAAC,EC+BM,SAASI,GAAa,CAC3B,QAAAC,EACA,gBAAAC,EACA,UAAAC,EACA,UAAAC,EACA,eAAAC,EACA,eAAAC,EACA,eAAAC,CACF,EAAsB,SACpB,KAAM,CAAE,cAAAC,CAAA,EAAkBC,EAAA,EACpB,CAACC,EAAcC,CAAe,EAAIC,EAAAA,SAAuBX,CAAO,EAEhEY,EAA2C,CAC/C,UAAWL,EAAc,CAAE,GAAI,4BAA6B,EAC5D,OAAQA,EAAc,CAAE,GAAI,yBAA0B,EACtD,SAAUA,EAAc,CAAE,GAAI,2BAA4B,EAC1D,MAAOA,EAAc,CAAE,GAAI,wBAAyB,EACpD,UAAWA,EAAc,CAAE,GAAI,4BAA6B,EAC5D,SAAUA,EAAc,CAAE,GAAI,2BAA4B,EAC1D,KAAMA,EAAc,CAAE,GAAI,uBAAwB,EAClD,OAAQA,EAAc,CAAE,GAAI,yBAA0B,EACtD,WAAYA,EAAc,CAAE,GAAI,6BAA8B,EAC9D,IAAKA,EAAc,CAAE,GAAI,sBAAuB,EAChD,SAAUA,EAAc,CAAE,GAAI,2BAA4B,EAC1D,QAASA,EAAc,CAAE,GAAI,0BAA2B,EACxD,KAAMA,EAAc,CAAE,GAAI,uBAAwB,EAClD,QAASA,EAAc,CAAE,GAAI,0BAA2B,EACxD,QAASA,EAAc,CAAE,GAAI,0BAA2B,CAAA,EAGpDM,EAA2C,CAC/C,QAASN,EAAc,CAAE,GAAI,0BAA2B,EACxD,QAASA,EAAc,CAAE,GAAI,0BAA2B,EACxD,QAASA,EAAc,CAAE,GAAI,0BAA2B,EACxD,WAAYA,EAAc,CAAE,GAAI,6BAA8B,EAC9D,KAAMA,EAAc,CAAE,GAAI,uBAAwB,EAClD,aAAcA,EAAc,CAAE,GAAI,4BAA6B,EAC/D,MAAOA,EAAc,CAAE,GAAI,wBAAyB,EACpD,aAAcA,EAAc,CAAE,GAAI,+BAAgC,EAClE,SAAUA,EAAc,CAAE,GAAI,2BAA4B,EAC1D,aAAcA,EAAc,CAAE,GAAI,4BAA6B,EAC/D,YAAaA,EAAc,CAAE,GAAI,2BAA4B,EAC7D,MAAOA,EAAc,CAAE,GAAI,wBAAyB,EACpD,QAASA,EAAc,CAAE,GAAI,0BAA2B,CAAA,EAGpDO,EAAwBC,GAAuB,CACnD,MAAMC,EAAUP,EAAa,WAAa,CAAA,EACpCQ,EAAUD,EAAQ,SAASD,CAAQ,EACrCC,EAAQ,OAAOE,GAAKA,IAAMH,CAAQ,EAClC,CAAC,GAAGC,EAASD,CAAQ,EACnBI,EAAa,CAAE,GAAGV,EAAc,UAAWQ,CAAA,EACjDP,EAAgBS,CAAU,EAC1BlB,EAAgBkB,CAAU,CAC5B,EAEMC,EAAwBC,GAAuB,CACnD,MAAML,EAAUP,EAAa,WAAa,CAAA,EACpCQ,EAAUD,EAAQ,SAASK,CAAQ,EACrCL,EAAQ,OAAOE,GAAKA,IAAMG,CAAQ,EAClC,CAAC,GAAGL,EAASK,CAAQ,EACnBF,EAAa,CAAE,GAAGV,EAAc,UAAWQ,CAAA,EACjDP,EAAgBS,CAAU,EAC1BlB,EAAgBkB,CAAU,CAC5B,EAEMG,EACHb,EAAa,WAAaA,EAAa,UAAU,OAAS,OAAO,KAAKG,CAAc,EAAE,QACtFH,EAAa,WAAaA,EAAa,UAAU,OAAS,OAAO,KAAKI,CAAc,EAAE,QACvFJ,EAAa,aACbA,EAAa,eAEf,OACEc,EAAAA,KAAC,MAAA,CAAI,UAAU,6DAEb,SAAA,CAAAA,OAACC,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAoB,QAAO,GAC1B,SAAAH,EAAAA,KAACI,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,UAAU,QAC5C,SAAA,CAAAF,EAAAA,IAACG,EAAA,CAAO,UAAU,SAAA,CAAU,EAC3BrB,EAAc,CAAE,GAAI,0BAA2B,EAChDkB,EAAAA,IAACI,GAAM,QAAQ,YAAY,UAAU,OAClC,WAAAC,EAAArB,EAAa,YAAb,YAAAqB,EAAwB,SAAU,CAAA,CACrC,EACAL,EAAAA,IAACM,EAAA,CAAY,UAAU,SAAA,CAAU,CAAA,CAAA,CACnC,CAAA,CACF,EACAR,EAAAA,KAACS,EAAA,CAAoB,MAAM,QAAQ,UAAU,OAC3C,SAAA,CAAAP,MAACQ,GAAmB,SAAA1B,EAAc,CAAE,GAAI,+BAAA,CAAiC,EAAE,QAC1E2B,EAAA,EAAsB,EACtB,OAAO,QAAQtB,CAAc,EAAE,IAAI,CAAC,CAACuB,EAAMC,CAAK,IAAM,OACrD,MAAMC,GAAQhC,GAAA,YAAAA,EAAiB8B,KAAqB,EAC9CG,GAAYR,EAAArB,EAAa,YAAb,YAAAqB,EAAwB,SAASK,GACnD,OACEZ,EAAAA,KAACgB,EAAA,CAEC,QAASD,EACT,gBAAiB,IAAMxB,EAAqBqB,CAAgB,EAC5D,SAAUE,IAAU,EAEpB,SAAA,CAAAZ,EAAAA,IAAC,OAAA,CAAK,UAAU,SAAU,SAAAW,EAAM,EAC/BC,EAAQ,GACPZ,MAACI,EAAA,CAAM,QAAQ,UAAU,UAAU,eAChC,SAAAQ,CAAA,CACH,CAAA,CAAA,EATGF,CAAA,CAaX,CAAC,CAAA,CAAA,CACH,CAAA,EACF,SAGCX,EAAA,CACC,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAoB,QAAO,GAC1B,SAAAH,EAAAA,KAACI,EAAA,CAAO,QAAQ,UAAU,KAAK,KAAK,UAAU,QAC5C,SAAA,CAAAF,EAAAA,IAACG,EAAA,CAAO,UAAU,SAAA,CAAU,EAC3BrB,EAAc,CAAE,GAAI,0BAA2B,EAChDkB,EAAAA,IAACI,GAAM,QAAQ,YAAY,UAAU,OAClC,WAAAW,EAAA/B,EAAa,YAAb,YAAA+B,EAAwB,SAAU,CAAA,CACrC,EACAf,EAAAA,IAACM,EAAA,CAAY,UAAU,SAAA,CAAU,CAAA,CAAA,CACnC,CAAA,CACF,EACAR,EAAAA,KAACS,EAAA,CAAoB,MAAM,QAAQ,UAAU,OAC3C,SAAA,CAAAP,MAACQ,GAAmB,SAAA1B,EAAc,CAAE,GAAI,+BAAA,CAAiC,EAAE,QAC1E2B,EAAA,EAAsB,EACtB,OAAO,QAAQrB,CAAc,EAAE,IAAI,CAAC,CAACsB,EAAMC,CAAK,IAAM,OACrD,MAAMC,GAAQ/B,GAAA,YAAAA,EAAiB6B,KAAqB,EAC9CG,GAAYR,EAAArB,EAAa,YAAb,YAAAqB,EAAwB,SAASK,GACnD,OACEZ,EAAAA,KAACgB,EAAA,CAEC,QAASD,EACT,gBAAiB,IAAMlB,EAAqBe,CAAgB,EAC5D,SAAUE,IAAU,EAEpB,SAAA,CAAAZ,EAAAA,IAAC,OAAA,CAAK,UAAU,SAAU,SAAAW,EAAM,EAC/BC,EAAQ,GACPZ,MAACI,EAAA,CAAM,QAAQ,UAAU,UAAU,eAChC,SAAAQ,CAAA,CACH,CAAA,CAAA,EATGF,CAAA,CAaX,CAAC,CAAA,CAAA,CACH,CAAA,EACF,EAGAV,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAA,CAAqB,QAGnCE,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,QAASzB,EAAW,MAAOK,EAAc,CAAE,GAAI,wBAAyB,EACxG,eAACb,GAAA,CAAS,UAAU,UAAU,EAChC,EAGA+B,EAAAA,IAAC,MAAA,CAAI,UAAU,oBAAA,CAAqB,QAGnCE,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,QAASxB,EAAW,MAAOI,EAAc,CAAE,GAAI,wBAAyB,EACxG,eAACkC,GAAA,CAAU,UAAU,UAAU,EACjC,EAGCnB,GACCC,EAAAA,KAACI,EAAA,CACC,QAAQ,QACR,KAAK,KACL,QAASvB,EACT,UAAU,qCACV,MAAOG,EAAc,CAAE,GAAI,6BAA8B,EAEzD,SAAA,CAAAkB,EAAAA,IAACG,EAAA,CAAO,UAAU,cAAA,CAAe,EAChCrB,EAAc,CAAE,GAAI,qBAAA,CAAuB,CAAA,CAAA,CAAA,CAC9C,EAEJ,CAEJ,CC9LO,SAASmC,GAAa,CAAE,aAAAC,EAAc,WAAAC,EAAa,GAAM,QAAAC,GAA8B,CAC5F,KAAM,CAAE,cAAAtC,CAAA,EAAkBC,EAAA,EAEpBsC,EAA4B,CAChC,CACE,KAAM,YACN,MAAOvC,EAAc,CAAE,GAAI,yBAA0B,EACrD,MAAO,cACP,KAAMX,EAAA,EAER,CACE,KAAM,SACN,MAAOW,EAAc,CAAE,GAAI,sBAAuB,EAClD,MAAO,cACP,KAAMwC,EAAA,EAER,CACE,KAAM,QACN,MAAOxC,EAAc,CAAE,GAAI,qBAAsB,EACjD,MAAO,eACP,KAAMyC,EAAA,EAER,CACE,KAAM,WACN,MAAOzC,EAAc,CAAE,GAAI,wBAAyB,EACpD,MAAO,gBACP,KAAM0C,EAAA,EAER,CACE,KAAM,WACN,MAAO1C,EAAc,CAAE,GAAI,wBAAyB,EACpD,MAAO,cACP,KAAM2C,EAAA,CACR,EAGIC,EAAkB,CACtB,CACE,KAAM,UACN,MAAO5C,EAAc,CAAE,GAAI,uBAAwB,EACnD,MAAO,kBACP,UAAW,EAAA,EAEb,CACE,KAAM,QACN,MAAOA,EAAc,CAAE,GAAI,qBAAsB,EACjD,MAAO,mBACP,UAAW,EAAA,EAEb,CACE,KAAM,UACN,MAAOA,EAAc,CAAE,GAAI,uBAAwB,EACnD,MAAO,oBACP,UAAW,kBAAA,CACb,EAGF,OACEgB,EAAAA,KAAC,MAAA,CAAI,UAAU,oDAEb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+DACb,SAAA,CAAAE,EAAAA,IAAC,KAAA,CAAG,UAAU,wBACX,SACGlB,EADHoC,EACiB,CAAE,GAAI,2BAAA,EACN,CAAE,GAAI,qBAAA,CAD6B,EAEvD,EACAlB,EAAAA,IAACE,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,QAASkB,EACzC,SAAApB,EAAAA,IAAC2B,GAAA,CAAE,UAAU,SAAA,CAAU,CAAA,CACzB,CAAA,EACF,EAGA3B,EAAAA,IAAC,OAAI,UAAU,yBAEZ,WACCF,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAEb,SAAA,CAAAA,OAAC,MAAA,CACC,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACb,SAAA,CAAAE,EAAAA,IAACI,EAAA,CAAM,QAAQ,UAAW,SAAAc,EAAa,KAAK,EAC3CA,EAAa,KAAK,WACjBlB,EAAAA,IAACI,EAAA,CAAM,QAAQ,cACZ,SAAAtB,EAAc,CAAE,GAAI,yBAAA,CAA2B,CAAA,CAClD,CAAA,EAEJ,QACC,KAAA,CAAG,UAAU,wBAAyB,SAAAoC,EAAa,KAAK,KAAA,CAAM,CAAA,EACjE,EAGCA,EAAa,KAAK,UACjBpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,wBAAA,CAA0B,EACjD,QACC,IAAA,CAAE,UAAU,mCAAoC,SAAAoC,EAAa,KAAK,QAAA,CAAS,CAAA,EAC9E,EAIDA,EAAa,KAAK,YACjBpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,0BAAA,CAA4B,EACnD,QACC,IAAA,CAAE,UAAU,eAAgB,SAAAoC,EAAa,KAAK,UAAA,CAAW,CAAA,EAC5D,EAIDA,EAAa,KAAK,UACjBpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,wBAAA,CAA0B,EACjD,QACC,IAAA,CAAE,UAAU,0BAA2B,SAAAoC,EAAa,KAAK,QAAA,CAAS,CAAA,EACrE,EAIDA,EAAa,KAAK,WACjBpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,yBAAA,CAA2B,EAClD,EACAgB,EAAAA,KAAC,IAAA,CAAE,UAAU,eAAgB,SAAA,CAAAoB,EAAa,KAAK,UAAU,QAAA,CAAA,CAAM,CAAA,EACjE,EAIDA,EAAa,KAAK,eACjBpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,6BAAA,CAA+B,EACtD,QACC,IAAA,CAAE,UAAU,qCAAsC,SAAAoC,EAAa,KAAK,aAAA,CAAc,CAAA,EACrF,EAIDA,EAAa,KAAK,MAAQA,EAAa,KAAK,KAAK,OAAS,GACzDpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,oBAAA,CAAsB,EAC7C,QACC,MAAA,CAAI,UAAU,4BACZ,SAAAoC,EAAa,KAAK,KAAK,IAAIU,GAC1B5B,EAAAA,IAACI,EAAA,CAAgB,QAAQ,YAAY,UAAU,UAC5C,SAAAwB,CAAA,EADSA,CAEZ,CACD,CAAA,CACH,CAAA,EACF,EAIDV,EAAa,KAAK,QAAUA,EAAa,KAAK,OAAO,OAAS,GAC7DpB,EAAAA,KAAC,MAAA,CACC,SAAA,CAAAE,EAAAA,IAAC,QAAA,CAAM,UAAU,4CACd,SAAAlB,EAAc,CAAE,GAAI,sBAAA,CAAwB,EAC/C,EACAkB,EAAAA,IAAC,KAAA,CAAG,UAAU,iBACX,WAAa,KAAK,OAAO,IAAI,CAAC6B,EAAOC,IACpChC,EAAAA,KAAC,KAAA,CAAa,UAAU,yCAAyC,SAAA,CAAA,KAC5D+B,CAAA,CAAA,EADIC,CAET,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CAEJ,EAEAhC,EAAAA,KAAC,MAAA,CAAI,UAAU,gBAEZ,SAAA,CAAAqB,UACE,MAAA,CACC,SAAA,CAAAnB,EAAAA,IAAC,KAAA,CAAG,UAAU,6DACX,SAAAlB,EAAc,CAAE,GAAI,wBAAA,CAA0B,EACjD,QACC,MAAA,CAAI,UAAU,YACZ,SAAAuC,EAAY,IAAIU,GAAQ,CACvB,MAAMC,EAAOD,EAAK,KAClB,OACEjC,EAAAA,KAAC,MAAA,CAAoB,UAAU,0BAC7B,SAAA,CAAAE,MAAC,OAAI,UAAWiC,EAAG,kBAAmBF,EAAK,KAAK,EAAG,EACnD/B,EAAAA,IAACgC,EAAA,CAAK,UAAU,+BAAA,CAAgC,EAChDhC,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,WAAK,KAAA,CAAM,CAAA,CAAA,EAH9B+B,EAAK,IAIf,CAEJ,CAAC,CAAA,CACH,CAAA,EACF,EAIDZ,UACE,MAAA,CACC,SAAA,CAAAnB,EAAAA,IAAC,KAAA,CAAG,UAAU,6DACX,SAAAlB,EAAc,CAAE,GAAI,wBAAA,CAA0B,EACjD,EACAkB,EAAAA,IAAC,MAAA,CAAI,UAAU,YACZ,SAAA0B,EAAgB,IAAIK,GACnBjC,EAAAA,KAAC,MAAA,CAAoB,UAAU,0BAC7B,SAAA,CAAAE,EAAAA,IAAC,MAAA,CAAI,UAAWiC,EAAG,YAAaF,EAAK,MAAOA,EAAK,SAAS,EAAG,EAC7D/B,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAW,WAAK,KAAA,CAAM,CAAA,GAF9B+B,EAAK,IAGf,CACD,CAAA,CACH,CAAA,EACF,EAIF/B,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACb,eAAC,IAAA,CAAE,UAAU,gCACV,SAAAlB,EAAc,CAAE,GAAI,4BAAA,CAA8B,EACrD,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,EACF,CAEJ,CC5OO,MAAMoD,EAAY,CACvB,IAAK,CAAC,OAAO,EACb,aAAc,IAAM,CAAC,GAAGA,EAAU,IAAK,cAAc,EACrD,WAAaC,GAAsC,CAAC,GAAGD,EAAU,aAAA,EAAgBC,CAAO,EACxF,OAASC,GAAmB,CAAC,GAAGF,EAAU,IAAK,SAAUE,CAAM,CACjE,EAGMC,GAAa,IAAS,IAqC5B,SAASC,GAAqBC,EAAgD,CAC5E,MAAO,CACL,MAAOA,EAAS,MAChB,MAAOA,EAAS,MAChB,SAAUA,EAAS,QAAA,CAEvB,CAKA,SAASC,GACPC,EACAlE,EACuB,CACvB,GAAI,CAACkE,EAAW,OAEhB,IAAIC,EAAgB,CAAC,GAAGD,EAAU,KAAK,EACnCE,EAAgB,CAAC,GAAGF,EAAU,KAAK,EAGvC,GAAIlE,EAAQ,WAAaA,EAAQ,UAAU,OAAS,EAAG,CACrD,MAAMqE,EAAc,IAAI,IAAIrE,EAAQ,SAAS,EAC7CmE,EAAgBA,EAAc,OAAOG,GAAQA,EAAK,MAAQD,EAAY,IAAIC,EAAK,IAAI,CAAC,CACtF,CAGA,GAAItE,EAAQ,WAAaA,EAAQ,UAAU,OAAS,EAAG,CACrD,MAAMuE,EAAc,IAAI,IAAIvE,EAAQ,SAAS,EAC7CoE,EAAgBA,EAAc,OAAOI,GAAA,OAAQ,QAAA1C,EAAA0C,EAAK,OAAL,YAAA1C,EAAW,WAAYyC,EAAY,IAAIC,EAAK,KAAK,QAAQ,EAAC,CACzG,CAGA,GAAIxE,EAAQ,YAAa,CACvB,MAAMyE,EAAQzE,EAAQ,YAAY,YAAA,EAClCmE,EAAgBA,EAAc,OAAOG,GAAA,OACnC,OAAAA,EAAK,KAAK,MAAM,cAAc,SAASG,CAAK,KAC5C3C,EAAAwC,EAAK,KAAK,WAAV,YAAAxC,EAAoB,cAAc,SAAS2C,IAAK,CAEpD,CAGA,GAAIzE,EAAQ,gBAAiB,CAC3B,MAAM0E,EAAU,IAAI,OAAO1E,EAAQ,gBAAiB,GAAG,EACvDmE,EAAgBA,EAAc,OAAOG,GAAA,OACnC,OAAAxC,EAAAwC,EAAK,KAAK,WAAV,YAAAxC,EAAoB,MAAM4C,GAAO,CAErC,CAGA,GAAI1E,EAAQ,YAAcA,EAAQ,WAAW,OAAS,EAAG,CACvD,MAAM2E,EAAc,IAAI,IAAI3E,EAAQ,UAAU,EAC9CmE,EAAgBA,EAAc,OAAOG,GACnCA,EAAK,KAAK,UAAYK,EAAY,IAAIL,EAAK,KAAK,QAAQ,CAAA,CAE5D,CAiBA,GAdItE,EAAQ,iBACVmE,EAAgBA,EAAc,OAAOG,GAAQA,EAAK,KAAK,SAAS,GAI9DtE,EAAQ,gBAAkB,SAC5BmE,EAAgBA,EAAc,OAAOS,GAG5B,EACR,GAIC5E,EAAQ,MAAQA,EAAQ,KAAK,OAAS,EAAG,CAC3C,MAAM6E,EAAS,IAAI,IAAI7E,EAAQ,IAAI,EACnCmE,EAAgBA,EAAc,OAAOG,GAAA,OACnC,OAAAxC,EAAAwC,EAAK,KAAK,OAAV,YAAAxC,EAAgB,KAAKuB,GAAOwB,EAAO,IAAIxB,CAAG,GAAC,CAE/C,CAGA,GAAIrD,EAAQ,aAAeA,EAAQ,YAAY,OAAS,EAAG,CACzD,MAAM8E,EAAgB,IAAI,IAAI9E,EAAQ,WAAW,EACjDmE,EAAgBA,EAAc,OAAOG,GAAA,OACnC,SAACxC,EAAAwC,EAAK,KAAK,OAAV,MAAAxC,EAAgB,KAAKuB,GAAOyB,EAAc,IAAIzB,CAAG,IAAC,CAEvD,CAGA,GAAI,CAACrD,EAAQ,kBAAmB,CAC9B,MAAM+E,MAAuB,IAC7BX,EAAc,QAAQI,GAAQ,CAC5BO,EAAiB,IAAIP,EAAK,MAAM,EAChCO,EAAiB,IAAIP,EAAK,MAAM,CAClC,CAAC,EACDL,EAAgBA,EAAc,OAAOG,GAAQS,EAAiB,IAAIT,EAAK,EAAE,CAAC,CAC5E,CAGA,MAAMU,EAAiB,IAAI,IAAIb,EAAc,IAAIG,GAAQA,EAAK,EAAE,CAAC,EAQjE,GALAF,EAAgBA,EAAc,OAAOI,GACnCQ,EAAe,IAAIR,EAAK,MAAM,GAAKQ,EAAe,IAAIR,EAAK,MAAM,CAAA,EAI/DxE,EAAQ,aACQmE,EAAc,QAAUc,EAAE,KAAOjF,EAAQ,WAAW,EACvD,CAEb,MAAMkF,EAAmB,IAAI,IAAY,CAAClF,EAAQ,WAAW,CAAC,EACxDmF,MAAc,IAEdC,EAAW,CAACvB,EAAgBwB,IAAkB,CAC9CA,GAASrF,EAAQ,UAAY,IAC7BmF,EAAQ,IAAItB,CAAM,IACtBsB,EAAQ,IAAItB,CAAM,EAElBO,EAAc,QAAQI,GAAQ,CACxBA,EAAK,SAAWX,GAAU,CAACqB,EAAiB,IAAIV,EAAK,MAAM,IAC7DU,EAAiB,IAAIV,EAAK,MAAM,EAChCY,EAASZ,EAAK,OAAQa,EAAQ,CAAC,GAE7Bb,EAAK,SAAWX,GAAU,CAACqB,EAAiB,IAAIV,EAAK,MAAM,IAC7DU,EAAiB,IAAIV,EAAK,MAAM,EAChCY,EAASZ,EAAK,OAAQa,EAAQ,CAAC,EAEnC,CAAC,EACH,EAEAD,EAASpF,EAAQ,YAAa,CAAC,EAE/BmE,EAAgBA,EAAc,OAAOG,GAAQY,EAAiB,IAAIZ,EAAK,EAAE,CAAC,EAC1E,MAAMgB,EAAe,IAAI,IAAIJ,CAAgB,EAC7Cd,EAAgBA,EAAc,OAAOI,GACnCc,EAAa,IAAId,EAAK,MAAM,GAAKc,EAAa,IAAId,EAAK,MAAM,CAAA,CAEjE,CAGF,MAAO,CACL,MAAOL,EACP,MAAOC,EACP,SAAUF,EAAU,QAAA,CAExB,CAmBO,SAASqB,GAAaC,EAA+B,GAAwB,CAClF,KAAM,CACJ,UAAAC,EAAY3B,GACZ,QAAA4B,EAAU,GACV,SAAAC,EACA,SAAAC,EACA,UAAAC,CAAA,EACEL,EAEEM,EAAcC,GAAA,EAEdnC,EAAoC,CACxC,SAAA+B,EACA,SAAAC,EACA,aAAcC,CAAA,EAGVpB,EAAQuB,GAAS,CACrB,SAAUrC,EAAU,WAAWC,CAAO,EACtC,QAAS,IAAMqC,GAAuBrC,CAAO,EAC7C,UAAA6B,EACA,QAAAC,EACA,MAAO,EACP,OAAQ3B,EAAA,CACT,EAEKmC,EAAU,SAAY,CAC1B,MAAMzB,EAAM,QAAA,CACd,EAEM0B,EAAa,SAAY,CAC7B,MAAML,EAAY,kBAAkB,CAAE,SAAUnC,EAAU,IAAK,CACjE,EAEMyC,EAAgBpG,GACbiE,GAAgBQ,EAAM,KAAMzE,CAAO,EAG5C,MAAO,CACL,UAAWyE,EAAM,KACjB,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,MAAOA,EAAM,MACb,QAAAyB,EACA,WAAAC,EACA,aAAAC,CAAA,CAEJ,CCvQO,MAAMC,EAAaC,EAAAA,KAAMC,GAAqB,CACnD,KAAM,CAAE,KAAAC,EAAM,SAAAC,CAAA,EAAaF,EACrBG,EAAWF,EACXG,EAAYD,EAAS,UACrBE,EAAWF,EAAS,SAGpBG,EAAiB,IACjBD,IAAa,QAAgB,iBAC7BA,IAAa,UAAkB,mBAC/BA,IAAa,OAAe,kBACzB,uCAGHE,EAAqB,IACrBF,IAAa,QAAgB,+BAC7BA,IAAa,UAAkB,mCAC/BA,IAAa,OAAe,iCACzB,4BAGT,OACErF,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPuF,EAAA,CAAoB,IAAID,EAAA,CAAgB;AAAA,UACxCJ,EAAW,oCAAsC,EAAE;AAAA;AAAA,QAKvD,SAAA,CAAAhF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,IAAK,UAAU,eAAe,EAGvEzF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBAEb,SAAA,CAAAE,MAAC,OAAI,UAAW;AAAA;AAAA,YAEZiF,EAAS,WAAa,WAAa,sCAAwC,iCAAiC;AAAA,UAE7G,SAAAA,EAAS,WAAa,WACrBjF,EAAAA,IAACwF,GAAA,CAAQ,UAAU,8CAAA,CAA+C,EAElExF,EAAAA,IAACyF,GAAA,CAAK,UAAU,0CAAA,CAA2C,EAE/D,EAGA3F,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,+CAA+C,MAAOiF,EAAS,MAC3E,WAAS,KAAA,CACZ,EACCA,EAAS,UACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,8CAA8C,MAAOiF,EAAS,SAC1E,SAAAA,EAAS,QAAA,CACZ,EAEDA,EAAS,WACRnF,OAAC,MAAA,CAAI,UAAU,qCACZ,SAAA,CAAAmF,EAAS,UAAU,QAAA,CAAA,CACtB,CAAA,EAEJ,EAGCC,GACClF,EAAAA,IAAC,MAAA,CAAI,UAAW;AAAA;AAAA,cAEZmF,IAAa,QAAU,aAAeA,IAAa,UAAY,eAAiB,aAAa;AAAA,WAAA,CAC9F,CAAA,EAEP,EAGCF,EAAS,MAAQA,EAAS,KAAK,OAAS,GACvCnF,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACZ,SAAA,CAAAmF,EAAS,KAAK,MAAM,EAAG,CAAC,EAAE,IAAKrD,GAC9B5B,EAAAA,IAAC,OAAA,CAEC,UAAU,8FAET,SAAA4B,CAAA,EAHIA,CAAA,CAKR,EACAqD,EAAS,KAAK,OAAS,GACtBnF,EAAAA,KAAC,OAAA,CAAK,UAAU,8CAA8C,SAAA,CAAA,IAC1DmF,EAAS,KAAK,OAAS,CAAA,CAAA,CAC3B,CAAA,EAEJ,EAIFjF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,OAAQ,UAAU,cAAA,CAAe,CAAA,CAAA,CAAA,CAGhF,CAAC,EAEDX,EAAW,YAAc,aClGlB,MAAMc,EAAYb,EAAAA,KAAMC,GAAqB,CAClD,KAAM,CAAE,KAAAC,EAAM,SAAAC,CAAA,EAAaF,EACrBG,EAAWF,EACXG,EAAYD,EAAS,UACrBE,EAAWF,EAAS,SAGpBG,EAAiB,IACjBD,IAAa,QAAgB,iBAC7BA,IAAa,UAAkB,mBAC/BA,IAAa,OAAe,kBACzB,yCAGHE,EAAqB,IACrBF,IAAa,QAAgB,+BAC7BA,IAAa,UAAkB,mCAC/BA,IAAa,OAAe,iCACzB,4BAGT,OACErF,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPuF,EAAA,CAAoB,IAAID,EAAA,CAAgB;AAAA,UACxCJ,EAAW,oCAAsC,EAAE;AAAA;AAAA,QAKvD,SAAA,CAAAhF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,IAAK,UAAU,gBAAgB,EAGxEzF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBAEb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,mGACb,eAAC2F,GAAA,CAAO,UAAU,6CAA6C,CAAA,CACjE,EAGA7F,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,+CAA+C,MAAOiF,EAAS,MAC3E,WAAS,KAAA,CACZ,EACCA,EAAS,UACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,8CAA8C,MAAOiF,EAAS,SAC1E,SAAAA,EAAS,QAAA,CACZ,EAEDA,EAAS,YACRnF,OAAC,MAAA,CAAI,UAAU,qCAAqC,SAAA,CAAA,QAC5CmF,EAAS,UAAA,CAAA,CACjB,CAAA,EAEJ,EAGCC,GACClF,EAAAA,IAAC,MAAA,CAAI,UAAW;AAAA;AAAA,cAEZmF,IAAa,QAAU,aAAeA,IAAa,UAAY,eAAiB,aAAa;AAAA,WAAA,CAC9F,CAAA,EAEP,EAGCF,EAAS,eACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,kDAAkD,MAAOiF,EAAS,cAC9E,SAAAA,EAAS,aAAA,CACZ,EAIFjF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,OAAQ,UAAU,eAAA,CAAgB,CAAA,CAAA,CAAA,CAGjF,CAAC,EAEDG,EAAU,YAAc,YC/EjB,MAAME,EAAef,EAAAA,KAAMC,GAAqB,CACrD,KAAM,CAAE,KAAAC,EAAM,SAAAC,CAAA,EAAaF,EACrBG,EAAWF,EACXG,EAAYD,EAAS,UACrBE,EAAWF,EAAS,SAGpBG,EAAiB,IACjBD,IAAa,QAAgB,iBAC7BA,IAAa,UAAkB,mBAC/BA,IAAa,OAAe,kBACzB,2CAGHE,EAAqB,IACrBF,IAAa,QAAgB,+BAC7BA,IAAa,UAAkB,mCAC/BA,IAAa,OAAe,iCACzB,4BAGT,OACErF,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPuF,EAAA,CAAoB,IAAID,EAAA,CAAgB;AAAA,UACxCJ,EAAW,oCAAsC,EAAE;AAAA;AAAA,QAKvD,SAAA,CAAAhF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,IAAK,UAAU,iBAAiB,EAGzEzF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBAEb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,qGACb,eAAC6F,GAAA,CAAe,UAAU,+CAA+C,CAAA,CAC3E,EAGA/F,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,+CAA+C,MAAOiF,EAAS,MAC3E,WAAS,KAAA,CACZ,EACCA,EAAS,UACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,8CAA8C,MAAOiF,EAAS,SAC1E,SAAAA,EAAS,QAAA,CACZ,EAEDA,EAAS,YACRnF,OAAC,MAAA,CAAI,UAAU,qCAAqC,SAAA,CAAA,QAC5CmF,EAAS,UAAA,CAAA,CACjB,CAAA,EAEJ,EAGCC,GACClF,EAAAA,IAAC,MAAA,CAAI,UAAW;AAAA;AAAA,cAEZmF,IAAa,QAAU,aAAeA,IAAa,UAAY,eAAiB,aAAa;AAAA,WAAA,CAC9F,CAAA,EAEP,EAGCF,EAAS,eACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,kDAAkD,MAAOiF,EAAS,cAC9E,SAAAA,EAAS,aAAA,CACZ,EAIFjF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,OAAQ,UAAU,gBAAA,CAAiB,CAAA,CAAA,CAAA,CAGlF,CAAC,EAEDK,EAAa,YAAc,eC/EpB,MAAME,EAAejB,EAAAA,KAAMC,GAAqB,CACrD,KAAM,CAAE,KAAAC,EAAM,SAAAC,CAAA,EAAaF,EACrBG,EAAWF,EACXG,EAAYD,EAAS,UACrBE,EAAWF,EAAS,SAGpBG,EAAiB,IACjBD,IAAa,QAAgB,iBAC7BA,IAAa,UAAkB,mBAC/BA,IAAa,OAAe,kBACzB,uCAGHE,EAAqB,IACrBF,IAAa,QAAgB,+BAC7BA,IAAa,UAAkB,mCAC/BA,IAAa,OAAe,iCACzB,4BAGT,OACErF,EAAAA,KAAC,MAAA,CACC,UAAW;AAAA;AAAA,UAEPuF,EAAA,CAAoB,IAAID,EAAA,CAAgB;AAAA,UACxCJ,EAAW,oCAAsC,EAAE;AAAA;AAAA,QAKvD,SAAA,CAAAhF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,IAAK,UAAU,eAAe,EAGvEzF,EAAAA,KAAC,MAAA,CAAI,UAAU,yBAEb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,iGACb,eAAC3B,GAAA,CAAS,UAAU,2CAA2C,CAAA,CACjE,EAGAyB,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAE,EAAAA,IAAC,OAAI,UAAU,+CAA+C,MAAOiF,EAAS,MAC3E,WAAS,KAAA,CACZ,EACCA,EAAS,UACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,8CAA8C,MAAOiF,EAAS,SAC1E,SAAAA,EAAS,QAAA,CACZ,EAEDA,EAAS,YACRnF,OAAC,MAAA,CAAI,UAAU,qCAAqC,SAAA,CAAA,QAC5CmF,EAAS,UAAA,CAAA,CACjB,CAAA,EAEJ,EAGCC,GACClF,EAAAA,IAAC,MAAA,CAAI,UAAW;AAAA;AAAA,cAEZmF,IAAa,QAAU,aAAeA,IAAa,UAAY,eAAiB,aAAa;AAAA,WAAA,CAC9F,CAAA,EAEP,EAGCF,EAAS,eACRjF,EAAAA,IAAC,MAAA,CAAI,UAAU,+CAA+C,MAAOiF,EAAS,cAC3E,SAAAA,EAAS,aAAA,CACZ,EAIFjF,MAACsF,GAAO,KAAK,SAAS,SAAUC,EAAS,OAAQ,UAAU,cAAA,CAAe,CAAA,CAAA,CAAA,CAGhF,CAAC,EAEDO,EAAa,YAAc,eC7EpB,MAAM1B,GAAY,CACvB,OAAQQ,EACR,MAAOc,EACP,SAAUE,EACV,SAAUE,EACV,UAAWlB,EACX,UAAWc,EACX,KAAMd,EACN,OAAQA,EACR,WAAYA,EACZ,IAAKA,EACL,SAAUA,EACV,QAASA,EACT,KAAMgB,EACN,QAASA,EACT,QAAShB,CACX,ECdamB,GAAclB,EAAAA,KAAMC,GAAqB,CACpD,KAAM,CACJ,GAAAkB,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,eAAAC,EACA,eAAAC,EACA,SAAAtB,EACA,MAAAuB,EACA,UAAAC,CAAA,EACE1B,EACEC,EAAOD,EAAM,KACb,CAAC2B,CAAQ,EAAIC,EAAc,CAC/B,QAAAT,EACA,QAAAC,EACA,eAAAG,EACA,QAAAF,EACA,QAAAC,EACA,eAAAE,CAAA,CACD,EAEKK,EAAY,CAChB,GAAGJ,EACH,OAAQvB,EAAW,UAAY,UAC/B,YAAaA,EAAW,EAAI,IAC5B,iBAAiBD,GAAA,YAAAA,EAAM,cAAe,UAAY,MAAQ,MAAA,EAG5D,OACEjF,EAAAA,KAAA8G,WAAA,CACE,SAAA,CAAA5G,EAAAA,IAAC6G,EAAA,CACC,GAAAb,EACA,KAAMS,EACN,MAAOE,EACP,UAAAH,CAAA,CAAA,GAEDzB,GAAA,YAAAA,EAAM,QACL/E,EAAAA,IAAC8G,EAAA,CACC,SAAA9G,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,UAAW,oCAAoCiG,EAAUE,GAAW,CAAC,QAAQD,EAAUE,GAAW,CAAC,MACnG,cAAe,KAAA,EAEjB,UAAU,yGAET,SAAArB,EAAK,KAAA,CAAA,CACR,CACF,CAAA,EAEJ,CAEJ,CAAC,EAEDgB,GAAY,YAAc,cCxDnB,MAAMgB,GAAYlC,EAAAA,KAAMC,GAAqB,CAClD,KAAM,CACJ,GAAAkB,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,eAAAC,EACA,eAAAC,EACA,SAAAtB,EACA,MAAAuB,EACA,UAAAC,CAAA,EACE1B,EACEC,EAAOD,EAAM,KACb,CAAC2B,CAAQ,EAAIC,EAAc,CAC/B,QAAAT,EACA,QAAAC,EACA,eAAAG,EACA,QAAAF,EACA,QAAAC,EACA,eAAAE,CAAA,CACD,EAEKK,EAAY,CAChB,GAAGJ,EACH,OAAQvB,EAAW,UAAY,UAC/B,YAAaA,EAAW,EAAI,GAAA,EAG9B,OACElF,EAAAA,KAAA8G,WAAA,CACE,SAAA,CAAA5G,EAAAA,IAAC6G,EAAA,CACC,GAAAb,EACA,KAAMS,EACN,MAAOE,EACP,UAAAH,CAAA,CAAA,GAEDzB,GAAA,YAAAA,EAAM,QACL/E,EAAAA,IAAC8G,EAAA,CACC,SAAA9G,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,UAAW,oCAAoCiG,EAAUE,GAAW,CAAC,QAAQD,EAAUE,GAAW,CAAC,MACnG,cAAe,KAAA,EAEjB,UAAU,2GAET,SAAArB,EAAK,KAAA,CAAA,CACR,CACF,CAAA,EAEJ,CAEJ,CAAC,EAEDgC,GAAU,YAAc,YCvDjB,MAAMC,EAAenC,EAAAA,KAAMC,GAAqB,CACrD,KAAM,CACJ,GAAAkB,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,QAAAC,EACA,eAAAC,EACA,eAAAC,EACA,SAAAtB,EACA,MAAAuB,EACA,UAAAC,CAAA,EACE1B,EACEC,EAAOD,EAAM,KACb,CAAC2B,CAAQ,EAAIQ,GAAkB,CACnC,QAAAhB,EACA,QAAAC,EACA,eAAAG,EACA,QAAAF,EACA,QAAAC,EACA,eAAAE,EACA,aAAc,EAAA,CACf,EAEKK,EAAY,CAChB,GAAGJ,EACH,OAAQvB,EAAW,UAAY,UAC/B,YAAwB,EACxB,gBAAiB,KAAA,EAGnB,OACElF,EAAAA,KAAA8G,WAAA,CACE,SAAA,CAAA5G,EAAAA,IAAC6G,EAAA,CACC,GAAAb,EACA,KAAMS,EACN,MAAOE,EACP,UAAAH,CAAA,CAAA,GAEDzB,GAAA,YAAAA,EAAM,QACL/E,EAAAA,IAAC8G,EAAA,CACC,SAAA9G,EAAAA,IAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,UAAW,oCAAoCiG,EAAUE,GAAW,CAAC,QAAQD,EAAUE,GAAW,CAAC,MACnG,cAAe,KAAA,EAEjB,UAAU,6GAET,SAAArB,EAAK,KAAA,CAAA,CACR,CACF,CAAA,EAEJ,CAEJ,CAAC,EAEDiC,EAAa,YAAc,eC7DpB,MAAME,GAAY,CACvB,QAASnB,GACT,MAAOgB,GACP,QAASC,EACT,WAAYA,CACd,ECaA,SAASG,IAAyB,CAChC,KAAM,CAAE,cAAArI,CAAA,EAAkBC,EAAA,EACpB,CAAE,QAAAqI,CAAA,EAAYC,GAAA,EAGd,CAACnG,EAAcoG,CAAe,EAAIpI,EAAAA,SAA2B,IAAI,EACjE,CAACqI,EAAeC,CAAgB,EAAItI,EAAAA,SAAS,EAAI,EACjD,CAACX,EAASkJ,CAAU,EAAIvI,WAAuB,CACnD,UAAW,CAAC,YAAa,SAAU,QAAS,WAAY,WAAY,YAAa,MAAM,EACvF,UAAW,CAAC,UAAW,UAAW,UAAW,aAAc,OAAQ,QAAS,YAAY,EACxF,kBAAmB,EAAA,CACpB,EAGK,CAAE,UAAAuD,EAAW,UAAAiF,EAAW,WAAAC,EAAY,MAAAC,EAAO,QAAAnD,EAAS,aAAAE,CAAA,EAAiBb,GAAa,CACtF,SAAU,OACV,SAAU,EACV,QAAS,EAAA,CACV,EAGK+D,EAAoBC,EAAAA,QAAQ,IACzBnD,EAAapG,CAAO,GAAK,CAAE,MAAO,CAAA,EAAI,MAAO,CAAA,EAAI,SAAU,MAAA,EACjE,CAACkE,EAAWlE,EAASoG,CAAY,CAAC,EAG/B/F,EAAiBkJ,EAAAA,QAAQ,IAAM,CACnC,MAAMC,EAA4C,CAAA,EAClD,OAAAtF,GAAA,MAAAA,EAAW,MAAM,QAAQI,GAAQ,CAC/BkF,EAAOlF,EAAK,IAAgB,GAAKkF,EAAOlF,EAAK,IAAgB,GAAK,GAAK,CACzE,GACOkF,CACT,EAAG,CAACtF,CAAS,CAAC,EAER5D,EAAiBiJ,EAAAA,QAAQ,IAAM,CACnC,MAAMC,EAA4C,CAAA,EAClD,OAAAtF,GAAA,MAAAA,EAAW,MAAM,QAAQM,GAAQ,OAC/B,MAAMrC,GAAOL,EAAA0C,EAAK,OAAL,YAAA1C,EAAW,SACpBK,IACFqH,EAAOrH,CAAI,GAAKqH,EAAOrH,CAAI,GAAK,GAAK,EAEzC,GACOqH,CACT,EAAG,CAACtF,CAAS,CAAC,EAGRuF,EAAkBC,EAAAA,YAAY,CAACC,EAA0BrF,IAAoB,CACjFyE,EAAgBzE,CAAI,EACpB2E,EAAiB,EAAI,CACvB,EAAG,CAAA,CAAE,EAECW,EAAkBF,EAAAA,YAAY,IAAM,CACxCX,EAAgB,IAAI,CACtB,EAAG,CAAA,CAAE,EAECc,EAAgBH,EAAAA,YAAY,IAAM,CACtCb,EAAQ,CAAE,QAAS,GAAK,SAAU,IAAK,CACzC,EAAG,CAACA,CAAO,CAAC,EAENiB,EAAgBJ,EAAAA,YAAY,SAAY,CAC5C,MAAMxD,EAAA,CACR,EAAG,CAACA,CAAO,CAAC,EAEN6D,EAAsBL,cAAavI,GAA6B,CACpE+H,EAAW/H,CAAU,CACvB,EAAG,CAAA,CAAE,EAEC6I,GAAqBN,EAAAA,YAAY,IAAM,CAC3CR,EAAW,CACT,UAAW,CAAC,YAAa,SAAU,QAAS,WAAY,WAAY,YAAa,MAAM,EACvF,UAAW,CAAC,UAAW,UAAW,UAAW,aAAc,OAAQ,QAAS,YAAY,EACxF,kBAAmB,EAAA,CACpB,CACH,EAAG,CAAA,CAAE,EAECe,GAAqBP,EAAAA,YAAY,IAAM,CAC3CT,EAAiB,EAAK,EACtBF,EAAgB,IAAI,CACtB,EAAG,CAAA,CAAE,EAGL,OAAII,EAEA1H,MAAC,OAAI,UAAU,0CACb,eAACyI,GAAA,CAAQ,UAAU,6CAA6C,CAAA,CAClE,EAKAb,EAEA5H,EAAAA,IAAC,MAAA,CAAI,UAAU,8CACb,SAAAA,EAAAA,IAAC0I,EAAA,CAAK,UAAU,yCACd,SAAA5I,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAE,EAAAA,IAAC2I,EAAA,CAAY,UAAU,sBAAA,CAAuB,EAC9C3I,EAAAA,IAAC,IAAA,CAAE,UAAU,yCACV,WAAc,CAAE,GAAI,qBAAA,EAAyB,CAAE,QAAS4H,EAAM,OAAA,CAAS,CAAA,CAC1E,CAAA,CAAA,CACF,EACF,EACF,EAKA,CAACnF,GAAaA,EAAU,MAAM,SAAW,EAEzCzC,EAAAA,IAAC,MAAA,CAAI,UAAU,0CACb,SAAAA,EAAAA,IAAC0I,EAAA,CAAK,UAAU,MACd,SAAA5I,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAE,EAAAA,IAAC2I,EAAA,CAAY,UAAU,+BAAA,CAAgC,EACvD3I,MAAC,KAAE,UAAU,gCACV,WAAc,CAAE,GAAI,aAAA,CAAe,CAAA,CACtC,CAAA,CAAA,CACF,EACF,EACF,EAKFF,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAEb,SAAA,CAAAE,EAAAA,IAAC1B,GAAA,CACC,QAAAC,EACA,gBAAiB+J,EACjB,UAAWF,EACX,UAAWC,EACX,eAAgBE,GAChB,eAAA3J,EACA,eAAAC,CAAA,CAAA,EAIFiB,EAAAA,KAAC,MAAA,CAAI,UAAU,8BAEb,SAAA,CAAAE,EAAAA,IAAC,MAAA,CAAI,UAAU,kBACb,SAAAF,EAAAA,KAAC8I,GAAA,CACC,MAAOf,EAAkB,MACzB,MAAOA,EAAkB,MACzB,YAAaG,EACb,YAAaG,EACb,UAAA/D,GACA,UAAA8C,GACA,QAAO,GACP,gBAAiB,CAAE,EAAG,EAAG,EAAG,EAAG,KAAM,EAAA,EACrC,QAAS,GACT,QAAS,EACT,UAAU,gBAEV,SAAA,CAAAlH,MAAC6I,IAAW,QAASC,GAAkB,KAAM,IAAK,GAAI,KAAM,EAAG,QAC9DC,GAAA,EAAS,EACV/I,EAAAA,IAACgJ,GAAA,CACC,UAAYnG,GAAS,CACnB,OAAQA,EAAK,KAAA,CACX,IAAK,YACL,IAAK,SACH,MAAO,UACT,IAAK,QACH,MAAO,UACT,IAAK,WACH,MAAO,UACT,IAAK,WACH,MAAO,UACT,QACE,MAAO,SAAA,CAEb,EACA,UAAU,oBAAA,CAAA,EAIZ7C,EAAAA,IAACiJ,IAAM,SAAS,WAAW,UAAU,yEACnC,SAAAnJ,EAAAA,KAAC,MAAA,CAAI,UAAU,oBACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,wBACb,SAAAlB,EAAc,CAAE,GAAI,oBAAA,CAAsB,EAC7C,QACC,OAAA,CAAK,UAAU,cAAe,SAAA+I,EAAkB,MAAM,MAAA,CAAO,CAAA,EAChE,EACA/H,EAAAA,KAAC,MAAA,CAAI,UAAU,0CACb,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,wBACb,SAAAlB,EAAc,CAAE,GAAI,oBAAA,CAAsB,EAC7C,QACC,OAAA,CAAK,UAAU,cAAe,SAAA+I,EAAkB,MAAM,MAAA,CAAO,CAAA,EAChE,EACCF,GACC3H,EAAAA,IAAC,MAAA,CAAI,UAAU,gCACZ,WAAc,CAAE,GAAI,uBAAA,CAAyB,CAAA,CAChD,CAAA,CAAA,CAEJ,CAAA,CACF,CAAA,CAAA,CAAA,EAEJ,EAGCuH,GACCvH,EAAAA,IAACiB,GAAA,CACC,aAAAC,EACA,WAAY,CAACA,EACb,QAASsH,EAAA,CAAA,CACX,CAAA,CAEJ,CAAA,EACF,CAEJ,CAKO,SAASU,IAAoB,CAClC,OACElJ,EAAAA,IAACmJ,GAAA,CACC,SAAAnJ,EAAAA,IAACmH,GAAA,CAAA,CAAuB,EAC1B,CAEJ","x_google_ignoreList":[0,1,2,3]}
|
|
1
|
+
{"version":3,"file":"GraphExplorerPage-CDp6-d8P.js","sources":["../../../../node_modules/lucide-react/dist/esm/icons/maximize.js","../../../../node_modules/lucide-react/dist/esm/icons/network.js","../../../../node_modules/lucide-react/dist/esm/icons/square-function.js","../../../../node_modules/lucide-react/dist/esm/icons/variable.js","../../src/components/shared/GraphToolbar.tsx","../../src/components/shared/GraphSidebar.tsx","../../src/hooks/useGraphData.ts","../../src/pages/graph-explorer/nodes/ModuleNode.tsx","../../src/pages/graph-explorer/nodes/ClassNode.tsx","../../src/pages/graph-explorer/nodes/FunctionNode.tsx","../../src/pages/graph-explorer/nodes/VariableNode.tsx","../../src/pages/graph-explorer/nodes/index.ts","../../src/pages/graph-explorer/edges/ImportsEdge.tsx","../../src/pages/graph-explorer/edges/CallsEdge.tsx","../../src/pages/graph-explorer/edges/InheritsEdge.tsx","../../src/pages/graph-explorer/edges/index.ts","../../src/pages/GraphExplorerPage.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Maximize = createLucideIcon(\"Maximize\", [\n [\"path\", { d: \"M8 3H5a2 2 0 0 0-2 2v3\", key: \"1dcmit\" }],\n [\"path\", { d: \"M21 8V5a2 2 0 0 0-2-2h-3\", key: \"1e4gt3\" }],\n [\"path\", { d: \"M3 16v3a2 2 0 0 0 2 2h3\", key: \"wsl5sc\" }],\n [\"path\", { d: \"M16 21h3a2 2 0 0 0 2-2v-3\", key: \"18trek\" }]\n]);\n\nexport { Maximize as default };\n//# sourceMappingURL=maximize.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Network = createLucideIcon(\"Network\", [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n]);\n\nexport { Network as default };\n//# sourceMappingURL=network.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst SquareFunction = createLucideIcon(\"SquareFunction\", [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", ry: \"2\", key: \"1m3agn\" }],\n [\"path\", { d: \"M9 17c2 0 2.8-1 2.8-2.8V10c0-2 1-3.3 3.2-3\", key: \"m1af9g\" }],\n [\"path\", { d: \"M9 11.2h5.7\", key: \"3zgcl2\" }]\n]);\n\nexport { SquareFunction as default };\n//# sourceMappingURL=square-function.js.map\n","/**\n * @license lucide-react v0.460.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Variable = createLucideIcon(\"Variable\", [\n [\"path\", { d: \"M8 21s-4-3-4-9 4-9 4-9\", key: \"uto9ud\" }],\n [\"path\", { d: \"M16 3s4 3 4 9-4 9-4 9\", key: \"4w2vsq\" }],\n [\"line\", { x1: \"15\", x2: \"9\", y1: \"9\", y2: \"15\", key: \"f7djnv\" }],\n [\"line\", { x1: \"9\", x2: \"15\", y1: \"9\", y2: \"15\", key: \"1shsy8\" }]\n]);\n\nexport { Variable as default };\n//# sourceMappingURL=variable.js.map\n","// ========================================\n// Graph Toolbar Component\n// ========================================\n// Toolbar with filters and actions for Graph Explorer\n\nimport { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n Filter,\n Maximize,\n RefreshCw,\n ChevronDown,\n} from 'lucide-react';\nimport { Button } from '@/components/ui/Button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuTrigger,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '@/components/ui/Dropdown';\nimport { Badge } from '@/components/ui/Badge';\nimport type { GraphFilters, NodeType, EdgeType } from '@/types/graph-explorer';\n\nexport interface GraphToolbarProps {\n /** Current filters */\n filters: GraphFilters;\n /** On filters change callback */\n onFiltersChange: (filters: GraphFilters) => void;\n /** On fit view callback */\n onFitView: () => void;\n /** On refresh callback */\n onRefresh: () => void;\n /** On reset filters callback */\n onResetFilters: () => void;\n /** Node type counts for badges */\n nodeTypeCounts?: Partial<Record<NodeType, number>>;\n /** Edge type counts for badges */\n edgeTypeCounts?: Partial<Record<EdgeType, number>>;\n}\n\n/**\n * Graph toolbar component\n */\nexport function GraphToolbar({\n filters,\n onFiltersChange,\n onFitView,\n onRefresh,\n onResetFilters,\n nodeTypeCounts,\n edgeTypeCounts,\n}: GraphToolbarProps) {\n const { formatMessage } = useIntl();\n const [localFilters, setLocalFilters] = useState<GraphFilters>(filters);\n\n const nodeTypeLabels: Record<NodeType, string> = {\n component: formatMessage({ id: 'graph.nodeTypes.component' }),\n module: formatMessage({ id: 'graph.nodeTypes.module' }),\n function: formatMessage({ id: 'graph.nodeTypes.function' }),\n class: formatMessage({ id: 'graph.nodeTypes.class' }),\n interface: formatMessage({ id: 'graph.nodeTypes.interface' }),\n variable: formatMessage({ id: 'graph.nodeTypes.variable' }),\n file: formatMessage({ id: 'graph.nodeTypes.file' }),\n folder: formatMessage({ id: 'graph.nodeTypes.folder' }),\n dependency: formatMessage({ id: 'graph.nodeTypes.dependency' }),\n api: formatMessage({ id: 'graph.nodeTypes.api' }),\n database: formatMessage({ id: 'graph.nodeTypes.database' }),\n service: formatMessage({ id: 'graph.nodeTypes.service' }),\n hook: formatMessage({ id: 'graph.nodeTypes.hook' }),\n utility: formatMessage({ id: 'graph.nodeTypes.utility' }),\n unknown: formatMessage({ id: 'graph.nodeTypes.unknown' }),\n };\n\n const edgeTypeLabels: Record<EdgeType, string> = {\n imports: formatMessage({ id: 'graph.edgeTypes.imports' }),\n exports: formatMessage({ id: 'graph.edgeTypes.exports' }),\n extends: formatMessage({ id: 'graph.edgeTypes.extends' }),\n implements: formatMessage({ id: 'graph.edgeTypes.implements' }),\n uses: formatMessage({ id: 'graph.edgeTypes.uses' }),\n 'depends-on': formatMessage({ id: 'graph.edgeTypes.dependsOn' }),\n calls: formatMessage({ id: 'graph.edgeTypes.calls' }),\n instantiates: formatMessage({ id: 'graph.edgeTypes.instantiates' }),\n contains: formatMessage({ id: 'graph.edgeTypes.contains' }),\n 'related-to': formatMessage({ id: 'graph.edgeTypes.relatedTo' }),\n 'data-flow': formatMessage({ id: 'graph.edgeTypes.dataFlow' }),\n event: formatMessage({ id: 'graph.edgeTypes.event' }),\n unknown: formatMessage({ id: 'graph.edgeTypes.unknown' }),\n };\n\n const handleNodeTypeToggle = (nodeType: NodeType) => {\n const current = localFilters.nodeTypes || [];\n const updated = current.includes(nodeType)\n ? current.filter(t => t !== nodeType)\n : [...current, nodeType];\n const newFilters = { ...localFilters, nodeTypes: updated };\n setLocalFilters(newFilters);\n onFiltersChange(newFilters);\n };\n\n const handleEdgeTypeToggle = (edgeType: EdgeType) => {\n const current = localFilters.edgeTypes || [];\n const updated = current.includes(edgeType)\n ? current.filter(t => t !== edgeType)\n : [...current, edgeType];\n const newFilters = { ...localFilters, edgeTypes: updated };\n setLocalFilters(newFilters);\n onFiltersChange(newFilters);\n };\n\n const hasActiveFilters =\n (localFilters.nodeTypes && localFilters.nodeTypes.length < Object.keys(nodeTypeLabels).length) ||\n (localFilters.edgeTypes && localFilters.edgeTypes.length < Object.keys(edgeTypeLabels).length) ||\n localFilters.searchQuery ||\n localFilters.showOnlyIssues;\n\n return (\n <div className=\"flex items-center gap-2 p-3 bg-card border-b border-border\">\n {/* Node types filter */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Filter className=\"w-4 h-4\" />\n {formatMessage({ id: 'graph.filters.nodeTypes' })}\n <Badge variant=\"secondary\" className=\"ml-1\">\n {localFilters.nodeTypes?.length || 0}\n </Badge>\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n <DropdownMenuLabel>{formatMessage({ id: 'graph.filters.selectNodeTypes' })}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {Object.entries(nodeTypeLabels).map(([type, label]) => {\n const count = nodeTypeCounts?.[type as NodeType] || 0;\n const isChecked = localFilters.nodeTypes?.includes(type as NodeType);\n return (\n <DropdownMenuCheckboxItem\n key={type}\n checked={isChecked}\n onCheckedChange={() => handleNodeTypeToggle(type as NodeType)}\n disabled={count === 0}\n >\n <span className=\"flex-1\">{label}</span>\n {count > 0 && (\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\n {count}\n </Badge>\n )}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Edge types filter */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-2\">\n <Filter className=\"w-4 h-4\" />\n {formatMessage({ id: 'graph.filters.edgeTypes' })}\n <Badge variant=\"secondary\" className=\"ml-1\">\n {localFilters.edgeTypes?.length || 0}\n </Badge>\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n <DropdownMenuLabel>{formatMessage({ id: 'graph.filters.selectEdgeTypes' })}</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {Object.entries(edgeTypeLabels).map(([type, label]) => {\n const count = edgeTypeCounts?.[type as EdgeType] || 0;\n const isChecked = localFilters.edgeTypes?.includes(type as EdgeType);\n return (\n <DropdownMenuCheckboxItem\n key={type}\n checked={isChecked}\n onCheckedChange={() => handleEdgeTypeToggle(type as EdgeType)}\n disabled={count === 0}\n >\n <span className=\"flex-1\">{label}</span>\n {count > 0 && (\n <Badge variant=\"outline\" className=\"ml-2 text-xs\">\n {count}\n </Badge>\n )}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Separator */}\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Zoom and view controls */}\n <Button variant=\"ghost\" size=\"sm\" onClick={onFitView} title={formatMessage({ id: 'graph.actions.fitView' })}>\n <Maximize className=\"w-4 h-4\" />\n </Button>\n\n {/* Separator */}\n <div className=\"w-px h-6 bg-border\" />\n\n {/* Actions */}\n <Button variant=\"ghost\" size=\"sm\" onClick={onRefresh} title={formatMessage({ id: 'graph.actions.refresh' })}>\n <RefreshCw className=\"w-4 h-4\" />\n </Button>\n\n {/* Reset filters button (only show when active filters) */}\n {hasActiveFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onResetFilters}\n className=\"text-amber-600 dark:text-amber-400\"\n title={formatMessage({ id: 'graph.actions.resetFilters' })}\n >\n <Filter className=\"w-4 h-4 mr-2\" />\n {formatMessage({ id: 'graph.actions.reset' })}\n </Button>\n )}\n </div>\n );\n}\n","// ========================================\n// Graph Sidebar Component\n// ========================================\n// Sidebar with legend and node details for Graph Explorer\n\nimport { useIntl } from 'react-intl';\nimport { X, Info, Network, FileText, GitBranch, Zap } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { Button } from '@/components/ui/Button';\nimport { Badge } from '@/components/ui/Badge';\nimport type { GraphNode, NodeType, EdgeType } from '@/types/graph-explorer';\n\nexport interface GraphSidebarProps {\n /** Selected node */\n selectedNode: GraphNode | null;\n /** Legend visibility */\n showLegend?: boolean;\n /** On close callback */\n onClose: () => void;\n}\n\n/**\n * Node type legend item\n */\ninterface LegendItem {\n type: NodeType;\n label: string;\n color: string;\n icon: React.ElementType;\n}\n\n/**\n * Graph sidebar component\n */\nexport function GraphSidebar({ selectedNode, showLegend = true, onClose }: GraphSidebarProps) {\n const { formatMessage } = useIntl();\n\n const legendItems: LegendItem[] = [\n {\n type: 'component',\n label: formatMessage({ id: 'graph.legend.component' }),\n color: 'bg-blue-500',\n icon: Network,\n },\n {\n type: 'module',\n label: formatMessage({ id: 'graph.legend.module' }),\n color: 'bg-blue-500',\n icon: FileText,\n },\n {\n type: 'class',\n label: formatMessage({ id: 'graph.legend.class' }),\n color: 'bg-green-500',\n icon: GitBranch,\n },\n {\n type: 'function',\n label: formatMessage({ id: 'graph.legend.function' }),\n color: 'bg-orange-500',\n icon: Zap,\n },\n {\n type: 'variable',\n label: formatMessage({ id: 'graph.legend.variable' }),\n color: 'bg-cyan-500',\n icon: Info,\n },\n ];\n\n const edgeLegendItems = [\n {\n type: 'imports' as EdgeType,\n label: formatMessage({ id: 'graph.legend.imports' }),\n color: 'stroke-gray-500',\n dashArray: '',\n },\n {\n type: 'calls' as EdgeType,\n label: formatMessage({ id: 'graph.legend.calls' }),\n color: 'stroke-green-500',\n dashArray: '',\n },\n {\n type: 'extends' as EdgeType,\n label: formatMessage({ id: 'graph.legend.extends' }),\n color: 'stroke-purple-500',\n dashArray: 'stroke-dasharray',\n },\n ];\n\n return (\n <div className=\"w-80 bg-card border-l border-border flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between p-4 border-b border-border\">\n <h2 className=\"font-semibold text-sm\">\n {selectedNode\n ? formatMessage({ id: 'graph.sidebar.nodeDetails' })\n : formatMessage({ id: 'graph.sidebar.title' })}\n </h2>\n <Button variant=\"ghost\" size=\"sm\" onClick={onClose}>\n <X className=\"w-4 h-4\" />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto\">\n {/* Node details */}\n {selectedNode ? (\n <div className=\"p-4 space-y-4\">\n {/* Node header */}\n <div>\n <div className=\"flex items-center gap-2 mb-2\">\n <Badge variant=\"outline\">{selectedNode.type}</Badge>\n {selectedNode.data.hasIssues && (\n <Badge variant=\"destructive\">\n {formatMessage({ id: 'graph.sidebar.hasIssues' })}\n </Badge>\n )}\n </div>\n <h3 className=\"text-lg font-semibold\">{selectedNode.data.label}</h3>\n </div>\n\n {/* File path */}\n {selectedNode.data.filePath && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.filePath' })}\n </label>\n <p className=\"text-sm font-mono mt-1 break-all\">{selectedNode.data.filePath}</p>\n </div>\n )}\n\n {/* Line number */}\n {selectedNode.data.lineNumber && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.lineNumber' })}\n </label>\n <p className=\"text-sm mt-1\">{selectedNode.data.lineNumber}</p>\n </div>\n )}\n\n {/* Category */}\n {selectedNode.data.category && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.category' })}\n </label>\n <p className=\"text-sm mt-1 capitalize\">{selectedNode.data.category}</p>\n </div>\n )}\n\n {/* Line count */}\n {selectedNode.data.lineCount && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.lineCount' })}\n </label>\n <p className=\"text-sm mt-1\">{selectedNode.data.lineCount} lines</p>\n </div>\n )}\n\n {/* Documentation */}\n {selectedNode.data.documentation && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.documentation' })}\n </label>\n <p className=\"text-sm mt-1 text-muted-foreground\">{selectedNode.data.documentation}</p>\n </div>\n )}\n\n {/* Tags */}\n {selectedNode.data.tags && selectedNode.data.tags.length > 0 && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.tags' })}\n </label>\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {selectedNode.data.tags.map(tag => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n {/* Issues */}\n {selectedNode.data.issues && selectedNode.data.issues.length > 0 && (\n <div>\n <label className=\"text-xs font-medium text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.issues' })}\n </label>\n <ul className=\"mt-2 space-y-1\">\n {selectedNode.data.issues.map((issue, idx) => (\n <li key={idx} className=\"text-sm text-red-600 dark:text-red-400\">\n • {issue}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n ) : (\n <div className=\"p-4 space-y-6\">\n {/* Node types legend */}\n {showLegend && (\n <div>\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase mb-3\">\n {formatMessage({ id: 'graph.legend.nodeTypes' })}\n </h3>\n <div className=\"space-y-2\">\n {legendItems.map(item => {\n const Icon = item.icon;\n return (\n <div key={item.type} className=\"flex items-center gap-2\">\n <div className={cn('w-4 h-4 rounded', item.color)} />\n <Icon className=\"w-4 h-4 text-muted-foreground\" />\n <span className=\"text-sm\">{item.label}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Edge types legend */}\n {showLegend && (\n <div>\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase mb-3\">\n {formatMessage({ id: 'graph.legend.edgeTypes' })}\n </h3>\n <div className=\"space-y-2\">\n {edgeLegendItems.map(item => (\n <div key={item.type} className=\"flex items-center gap-2\">\n <div className={cn('w-8 h-0.5', item.color, item.dashArray)} />\n <span className=\"text-sm\">{item.label}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Instructions */}\n <div className=\"p-3 bg-muted rounded-lg\">\n <p className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'graph.sidebar.instructions' })}\n </p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","// ========================================\n// useGraphData Hook\n// ========================================\n// TanStack Query hooks for Graph Explorer with data transformation\n\nimport { useQuery, useQueryClient } from '@tanstack/react-query';\nimport {\n fetchGraphDependencies,\n fetchGraphImpact,\n type GraphDependenciesRequest,\n type GraphDependenciesResponse,\n} from '../lib/api';\nimport type {\n GraphData,\n GraphFilters,\n NodeType,\n EdgeType,\n} from '../types/graph-explorer';\n\n// Query key factory\nexport const graphKeys = {\n all: ['graph'] as const,\n dependencies: () => [...graphKeys.all, 'dependencies'] as const,\n dependency: (request: GraphDependenciesRequest) => [...graphKeys.dependencies(), request] as const,\n impact: (nodeId: string) => [...graphKeys.all, 'impact', nodeId] as const,\n};\n\n// Default stale time: 5 minutes (graph data doesn't change frequently)\nconst STALE_TIME = 5 * 60 * 1000;\n\nexport interface UseGraphDataOptions {\n /** Override default stale time (ms) */\n staleTime?: number;\n /** Enable/disable the query */\n enabled?: boolean;\n /** Root path for analysis */\n rootPath?: string;\n /** Maximum depth for traversal */\n maxDepth?: number;\n /** Filter by node types */\n nodeTypes?: NodeType[];\n /** Filter by edge types */\n edgeTypes?: EdgeType[];\n}\n\nexport interface UseGraphDataReturn {\n /** Graph data with nodes and edges */\n graphData: GraphData | undefined;\n /** Loading state for initial fetch */\n isLoading: boolean;\n /** Fetching state (initial or refetch) */\n isFetching: boolean;\n /** Error object if query failed */\n error: Error | null;\n /** Manually refetch data */\n refetch: () => Promise<void>;\n /** Invalidate and refetch graph data */\n invalidate: () => Promise<void>;\n /** Apply filters to graph data */\n applyFilters: (filters: GraphFilters) => GraphData | undefined;\n}\n\n/**\n * Transform API response to GraphData format\n */\nfunction transformToGraphData(response: GraphDependenciesResponse): GraphData {\n return {\n nodes: response.nodes,\n edges: response.edges,\n metadata: response.metadata,\n };\n}\n\n/**\n * Apply filters to graph data\n */\nfunction filterGraphData(\n graphData: GraphData | undefined,\n filters: GraphFilters\n): GraphData | undefined {\n if (!graphData) return undefined;\n\n let filteredNodes = [...graphData.nodes];\n let filteredEdges = [...graphData.edges];\n\n // Filter by node types\n if (filters.nodeTypes && filters.nodeTypes.length > 0) {\n const nodeTypeSet = new Set(filters.nodeTypes);\n filteredNodes = filteredNodes.filter(node => node.type && nodeTypeSet.has(node.type));\n }\n\n // Filter by edge types\n if (filters.edgeTypes && filters.edgeTypes.length > 0) {\n const edgeTypeSet = new Set(filters.edgeTypes);\n filteredEdges = filteredEdges.filter(edge => edge.data?.edgeType && edgeTypeSet.has(edge.data.edgeType));\n }\n\n // Filter by search query\n if (filters.searchQuery) {\n const query = filters.searchQuery.toLowerCase();\n filteredNodes = filteredNodes.filter(node =>\n node.data.label.toLowerCase().includes(query) ||\n node.data.filePath?.toLowerCase().includes(query)\n );\n }\n\n // Filter by file path pattern\n if (filters.filePathPattern) {\n const pattern = new RegExp(filters.filePathPattern, 'i');\n filteredNodes = filteredNodes.filter(node =>\n node.data.filePath?.match(pattern)\n );\n }\n\n // Filter by categories\n if (filters.categories && filters.categories.length > 0) {\n const categorySet = new Set(filters.categories);\n filteredNodes = filteredNodes.filter(node =>\n node.data.category && categorySet.has(node.data.category)\n );\n }\n\n // Filter only nodes with issues\n if (filters.showOnlyIssues) {\n filteredNodes = filteredNodes.filter(node => node.data.hasIssues);\n }\n\n // Filter by minimum complexity\n if (filters.minComplexity !== undefined) {\n filteredNodes = filteredNodes.filter(_node => {\n // This would require complexity data to be available\n // For now, we'll skip this filter\n return true;\n });\n }\n\n // Filter by tags\n if (filters.tags && filters.tags.length > 0) {\n const tagSet = new Set(filters.tags);\n filteredNodes = filteredNodes.filter(node =>\n node.data.tags?.some(tag => tagSet.has(tag))\n );\n }\n\n // Exclude tags\n if (filters.excludeTags && filters.excludeTags.length > 0) {\n const excludeTagSet = new Set(filters.excludeTags);\n filteredNodes = filteredNodes.filter(node =>\n !node.data.tags?.some(tag => excludeTagSet.has(tag))\n );\n }\n\n // Show/hide isolated nodes\n if (!filters.showIsolatedNodes) {\n const connectedNodeIds = new Set<string>();\n filteredEdges.forEach(edge => {\n connectedNodeIds.add(edge.source);\n connectedNodeIds.add(edge.target);\n });\n filteredNodes = filteredNodes.filter(node => connectedNodeIds.has(node.id));\n }\n\n // Build set of visible node IDs\n const visibleNodeIds = new Set(filteredNodes.map(node => node.id));\n\n // Filter edges to only include edges between visible nodes\n filteredEdges = filteredEdges.filter(edge =>\n visibleNodeIds.has(edge.source) && visibleNodeIds.has(edge.target)\n );\n\n // Apply max depth filter (focus on specific node)\n if (filters.focusNodeId) {\n const focusNode = filteredNodes.find(n => n.id === filters.focusNodeId);\n if (focusNode) {\n // Collect nodes within max depth\n const nodesWithinDepth = new Set<string>([filters.focusNodeId]);\n const visited = new Set<string>();\n\n const traverse = (nodeId: string, depth: number) => {\n if (depth > (filters.maxDepth || 3)) return;\n if (visited.has(nodeId)) return;\n visited.add(nodeId);\n\n filteredEdges.forEach(edge => {\n if (edge.source === nodeId && !nodesWithinDepth.has(edge.target)) {\n nodesWithinDepth.add(edge.target);\n traverse(edge.target, depth + 1);\n }\n if (edge.target === nodeId && !nodesWithinDepth.has(edge.source)) {\n nodesWithinDepth.add(edge.source);\n traverse(edge.source, depth + 1);\n }\n });\n };\n\n traverse(filters.focusNodeId, 0);\n\n filteredNodes = filteredNodes.filter(node => nodesWithinDepth.has(node.id));\n const depthNodeIds = new Set(nodesWithinDepth);\n filteredEdges = filteredEdges.filter(edge =>\n depthNodeIds.has(edge.source) && depthNodeIds.has(edge.target)\n );\n }\n }\n\n return {\n nodes: filteredNodes,\n edges: filteredEdges,\n metadata: graphData.metadata,\n };\n}\n\n/**\n * Hook for fetching and filtering graph data\n *\n * @example\n * ```tsx\n * const { graphData, isLoading, applyFilters } = useGraphData({\n * rootPath: '/src',\n * maxDepth: 3\n * });\n *\n * // Apply filters\n * const filteredData = applyFilters({\n * nodeTypes: ['component', 'hook'],\n * edgeTypes: ['imports', 'uses']\n * });\n * ```\n */\nexport function useGraphData(options: UseGraphDataOptions = {}): UseGraphDataReturn {\n const {\n staleTime = STALE_TIME,\n enabled = true,\n rootPath,\n maxDepth,\n nodeTypes,\n } = options;\n\n const queryClient = useQueryClient();\n\n const request: GraphDependenciesRequest = {\n rootPath,\n maxDepth,\n includeTypes: nodeTypes,\n };\n\n const query = useQuery({\n queryKey: graphKeys.dependency(request),\n queryFn: () => fetchGraphDependencies(request),\n staleTime,\n enabled,\n retry: 2,\n select: transformToGraphData,\n });\n\n const refetch = async () => {\n await query.refetch();\n };\n\n const invalidate = async () => {\n await queryClient.invalidateQueries({ queryKey: graphKeys.all });\n };\n\n const applyFilters = (filters: GraphFilters) => {\n return filterGraphData(query.data, filters);\n };\n\n return {\n graphData: query.data,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error as Error | null,\n refetch,\n invalidate,\n applyFilters,\n };\n}\n\n/**\n * Hook for fetching impact analysis for a specific node\n */\nexport function useGraphImpact(\n nodeId: string | null,\n options: {\n direction?: 'upstream' | 'downstream' | 'both';\n maxDepth?: number;\n enabled?: boolean;\n } = {}\n) {\n const { direction = 'both', maxDepth = 3, enabled = true } = options;\n\n return useQuery({\n queryKey: graphKeys.impact(nodeId || ''),\n queryFn: () => {\n if (!nodeId) throw new Error('Node ID is required');\n return fetchGraphImpact({ nodeId, direction, maxDepth });\n },\n enabled: enabled && !!nodeId,\n staleTime: STALE_TIME,\n retry: 1,\n });\n}\n","// ========================================\n// Module Node Component\n// ========================================\n// Custom node for file/module visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { File, Package } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Module node component - represents files, modules, or packages\n */\nexport const ModuleNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-gray-300 dark:border-gray-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-gray-400\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className={`\n flex-shrink-0 w-8 h-8 rounded flex items-center justify-center\n ${nodeData.category === 'external' ? 'bg-purple-100 dark:bg-purple-900/30' : 'bg-blue-100 dark:bg-blue-900/30'}\n `}>\n {nodeData.category === 'external' ? (\n <Package className=\"w-4 h-4 text-purple-600 dark:text-purple-400\" />\n ) : (\n <File className=\"w-4 h-4 text-blue-600 dark:text-blue-400\" />\n )}\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineCount && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n {nodeData.lineCount} lines\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Tags */}\n {nodeData.tags && nodeData.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {nodeData.tags.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"px-1.5 py-0.5 text-xs bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-400 rounded\"\n >\n {tag}\n </span>\n ))}\n {nodeData.tags.length > 3 && (\n <span className=\"px-1.5 py-0.5 text-xs text-muted-foreground\">\n +{nodeData.tags.length - 3}\n </span>\n )}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-gray-400\" />\n </div>\n );\n});\n\nModuleNode.displayName = 'ModuleNode';\n","// ========================================\n// Class Node Component\n// ========================================\n// Custom node for class visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { Braces } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Class node component - represents class definitions\n */\nexport const ClassNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-green-500 dark:border-green-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-green-500\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded flex items-center justify-center bg-green-100 dark:bg-green-900/30\">\n <Braces className=\"w-4 h-4 text-green-600 dark:text-green-400\" />\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineNumber && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n Line {nodeData.lineNumber}\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Documentation/Tooltip */}\n {nodeData.documentation && (\n <div className=\"mt-2 text-xs text-muted-foreground line-clamp-2\" title={nodeData.documentation}>\n {nodeData.documentation}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-green-500\" />\n </div>\n );\n});\n\nClassNode.displayName = 'ClassNode';\n","// ========================================\n// Function Node Component\n// ========================================\n// Custom node for function/method visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { FunctionSquare } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Function node component - represents functions and methods\n */\nexport const FunctionNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-orange-500 dark:border-orange-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-orange-500\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded flex items-center justify-center bg-orange-100 dark:bg-orange-900/30\">\n <FunctionSquare className=\"w-4 h-4 text-orange-600 dark:text-orange-400\" />\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineNumber && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n Line {nodeData.lineNumber}\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Documentation/Tooltip */}\n {nodeData.documentation && (\n <div className=\"mt-2 text-xs text-muted-foreground line-clamp-2\" title={nodeData.documentation}>\n {nodeData.documentation}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-orange-500\" />\n </div>\n );\n});\n\nFunctionNode.displayName = 'FunctionNode';\n","// ========================================\n// Variable Node Component\n// ========================================\n// Custom node for variable/constant visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport { Handle, Position, NodeProps } from '@xyflow/react';\nimport { Variable } from 'lucide-react';\nimport type { GraphNodeData } from '@/types/graph-explorer';\n\n/**\n * Variable node component - represents variables and constants\n */\nexport const VariableNode = memo((props: NodeProps) => {\n const { data, selected } = props;\n const nodeData = data as GraphNodeData;\n const hasIssues = nodeData.hasIssues;\n const severity = nodeData.severity;\n\n // Color coding based on severity\n const getBorderColor = () => {\n if (severity === 'error') return 'border-red-500';\n if (severity === 'warning') return 'border-amber-500';\n if (severity === 'info') return 'border-blue-500';\n return 'border-cyan-500 dark:border-cyan-600';\n };\n\n const getBackgroundColor = () => {\n if (severity === 'error') return 'bg-red-50 dark:bg-red-900/20';\n if (severity === 'warning') return 'bg-amber-50 dark:bg-amber-900/20';\n if (severity === 'info') return 'bg-blue-50 dark:bg-blue-900/20';\n return 'bg-white dark:bg-gray-800';\n };\n\n return (\n <div\n className={`\n px-4 py-3 rounded-lg shadow-md border-2 min-w-[180px] max-w-[240px]\n ${getBackgroundColor()} ${getBorderColor()}\n ${selected ? 'ring-2 ring-primary ring-offset-2' : ''}\n transition-all duration-200\n `}\n >\n {/* Input handle */}\n <Handle type=\"target\" position={Position.Top} className=\"!bg-cyan-500\" />\n\n {/* Node content */}\n <div className=\"flex items-start gap-2\">\n {/* Icon */}\n <div className=\"flex-shrink-0 w-8 h-8 rounded flex items-center justify-center bg-cyan-100 dark:bg-cyan-900/30\">\n <Variable className=\"w-4 h-4 text-cyan-600 dark:text-cyan-400\" />\n </div>\n\n {/* Label and info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-sm text-foreground truncate\" title={nodeData.label}>\n {nodeData.label}\n </div>\n {nodeData.filePath && (\n <div className=\"text-xs text-muted-foreground truncate mt-1\" title={nodeData.filePath}>\n {nodeData.filePath}\n </div>\n )}\n {nodeData.lineNumber && (\n <div className=\"text-xs text-muted-foreground mt-1\">\n Line {nodeData.lineNumber}\n </div>\n )}\n </div>\n\n {/* Issue indicator */}\n {hasIssues && (\n <div className={`\n flex-shrink-0 w-2 h-2 rounded-full\n ${severity === 'error' ? 'bg-red-500' : severity === 'warning' ? 'bg-amber-500' : 'bg-blue-500'}\n `} />\n )}\n </div>\n\n {/* Type annotation */}\n {nodeData.documentation && (\n <div className=\"mt-2 text-xs text-muted-foreground font-mono\" title={nodeData.documentation}>\n {nodeData.documentation}\n </div>\n )}\n\n {/* Output handle */}\n <Handle type=\"source\" position={Position.Bottom} className=\"!bg-cyan-500\" />\n </div>\n );\n});\n\nVariableNode.displayName = 'VariableNode';\n","// ========================================\n// Node Components Barrel Export\n// ========================================\n\nexport { ModuleNode } from './ModuleNode';\nexport { ClassNode } from './ClassNode';\nexport { FunctionNode } from './FunctionNode';\nexport { VariableNode } from './VariableNode';\n\nimport { ModuleNode } from './ModuleNode';\nimport { ClassNode } from './ClassNode';\nimport { FunctionNode } from './FunctionNode';\nimport { VariableNode } from './VariableNode';\n\n// Node types map for React Flow registration\nexport const nodeTypes = {\n module: ModuleNode,\n class: ClassNode,\n function: FunctionNode,\n variable: VariableNode,\n component: ModuleNode, // Reuse ModuleNode for components\n interface: ClassNode, // Reuse ClassNode for interfaces\n file: ModuleNode, // Reuse ModuleNode for files\n folder: ModuleNode, // Reuse ModuleNode for folders\n dependency: ModuleNode, // Reuse ModuleNode for dependencies\n api: ModuleNode, // Reuse ModuleNode for APIs\n database: ModuleNode, // Reuse ModuleNode for databases\n service: ModuleNode, // Reuse ModuleNode for services\n hook: FunctionNode, // Reuse FunctionNode for hooks\n utility: FunctionNode, // Reuse FunctionNode for utilities\n unknown: ModuleNode, // Reuse ModuleNode for unknown types\n};\n","// ========================================\n// Imports Edge Component\n// ========================================\n// Custom edge for import relationship visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport {\n EdgeProps,\n getBezierPath,\n EdgeLabelRenderer,\n BaseEdge,\n} from '@xyflow/react';\nimport type { GraphEdgeData } from '@/types/graph-explorer';\n\n/**\n * Imports edge component - represents import/requires relationships\n */\nexport const ImportsEdge = memo((props: EdgeProps) => {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n style,\n markerEnd,\n } = props;\n const data = props.data as GraphEdgeData | undefined;\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const edgeStyle = {\n ...style,\n stroke: selected ? '#3b82f6' : '#64748b',\n strokeWidth: selected ? 2 : 1.5,\n strokeDasharray: data?.importType === 'dynamic' ? '5,5' : undefined,\n };\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {data?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${(sourceX + targetX) / 2}px, ${(sourceY + targetY) / 2}px)`,\n pointerEvents: 'all',\n }}\n className=\"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-gray-200 dark:border-gray-700\"\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n\nImportsEdge.displayName = 'ImportsEdge';\n","// ========================================\n// Calls Edge Component\n// ========================================\n// Custom edge for function/method call visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport {\n EdgeProps,\n getBezierPath,\n EdgeLabelRenderer,\n BaseEdge,\n} from '@xyflow/react';\nimport type { GraphEdgeData } from '@/types/graph-explorer';\n\n/**\n * Calls edge component - represents function/method call relationships\n */\nexport const CallsEdge = memo((props: EdgeProps) => {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n style,\n markerEnd,\n } = props;\n const data = props.data as GraphEdgeData | undefined;\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const edgeStyle = {\n ...style,\n stroke: selected ? '#10b981' : '#22c55e',\n strokeWidth: selected ? 2 : 1.5,\n };\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {data?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${(sourceX + targetX) / 2}px, ${(sourceY + targetY) / 2}px)`,\n pointerEvents: 'all',\n }}\n className=\"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-green-200 dark:border-green-700\"\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n\nCallsEdge.displayName = 'CallsEdge';\n","// ========================================\n// Inherits Edge Component\n// ========================================\n// Custom edge for inheritance relationship visualization in Graph Explorer\n\nimport { memo } from 'react';\nimport {\n EdgeProps,\n getSmoothStepPath,\n EdgeLabelRenderer,\n BaseEdge,\n} from '@xyflow/react';\nimport type { GraphEdgeData } from '@/types/graph-explorer';\n\n/**\n * Inherits edge component - represents inheritance/implementation relationships\n */\nexport const InheritsEdge = memo((props: EdgeProps) => {\n const {\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n selected,\n style,\n markerEnd,\n } = props;\n const data = props.data as GraphEdgeData | undefined;\n const [edgePath] = getSmoothStepPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n borderRadius: 20,\n });\n\n const edgeStyle = {\n ...style,\n stroke: selected ? '#f59e0b' : '#a855f7',\n strokeWidth: selected ? 2 : 2,\n strokeDasharray: '4,4',\n };\n\n return (\n <>\n <BaseEdge\n id={id}\n path={edgePath}\n style={edgeStyle}\n markerEnd={markerEnd}\n />\n {data?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: 'absolute',\n transform: `translate(-50%, -50%) translate(${(sourceX + targetX) / 2}px, ${(sourceY + targetY) / 2}px)`,\n pointerEvents: 'all',\n }}\n className=\"px-2 py-1 text-xs bg-white dark:bg-gray-800 rounded shadow border border-purple-200 dark:border-purple-700\"\n >\n {data.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n});\n\nInheritsEdge.displayName = 'InheritsEdge';\n","// ========================================\n// Edge Components Barrel Export\n// ========================================\n\nexport { ImportsEdge } from './ImportsEdge';\nexport { CallsEdge } from './CallsEdge';\nexport { InheritsEdge } from './InheritsEdge';\n\nimport { ImportsEdge } from './ImportsEdge';\nimport { CallsEdge } from './CallsEdge';\nimport { InheritsEdge } from './InheritsEdge';\n\n// Edge types map for React Flow registration\nexport const edgeTypes = {\n imports: ImportsEdge,\n calls: CallsEdge,\n extends: InheritsEdge,\n implements: InheritsEdge,\n};\n","// ========================================\n// Graph Explorer Page\n// ========================================\n// Main page for code dependency graph visualization\n\nimport { useCallback, useState, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport {\n ReactFlow,\n Background,\n BackgroundVariant,\n Controls,\n MiniMap,\n useReactFlow,\n Panel,\n ReactFlowProvider,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { useGraphData } from '@/hooks/useGraphData';\nimport { GraphToolbar } from '@/components/shared/GraphToolbar';\nimport { GraphSidebar } from '@/components/shared/GraphSidebar';\nimport { Loader2 } from 'lucide-react';\nimport { Card } from '@/components/ui/Card';\nimport { AlertCircle } from 'lucide-react';\nimport type { GraphNode, GraphFilters, NodeType, EdgeType } from '@/types/graph-explorer';\nimport { nodeTypes } from './graph-explorer/nodes';\nimport { edgeTypes } from './graph-explorer/edges';\n\n/**\n * Inner Graph Explorer Page Component (wrapped with ReactFlowProvider)\n */\nfunction GraphExplorerPageInner() {\n const { formatMessage } = useIntl();\n const { fitView } = useReactFlow();\n\n // State\n const [selectedNode, setSelectedNode] = useState<GraphNode | null>(null);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n const [filters, setFilters] = useState<GraphFilters>({\n nodeTypes: ['component', 'module', 'class', 'function', 'variable', 'interface', 'hook'],\n edgeTypes: ['imports', 'exports', 'extends', 'implements', 'uses', 'calls', 'depends-on'],\n showIsolatedNodes: false,\n });\n\n // Fetch graph data\n const { graphData, isLoading, isFetching, error, refetch, applyFilters } = useGraphData({\n rootPath: '/src',\n maxDepth: 3,\n enabled: true,\n });\n\n // Apply filters to graph data\n const filteredGraphData = useMemo(() => {\n return applyFilters(filters) || { nodes: [], edges: [], metadata: undefined };\n }, [graphData, filters, applyFilters]);\n\n // Calculate node/edge type counts for badges\n const nodeTypeCounts = useMemo(() => {\n const counts: Partial<Record<NodeType, number>> = {};\n graphData?.nodes.forEach(node => {\n counts[node.type as NodeType] = (counts[node.type as NodeType] || 0) + 1;\n });\n return counts;\n }, [graphData]);\n\n const edgeTypeCounts = useMemo(() => {\n const counts: Partial<Record<EdgeType, number>> = {};\n graphData?.edges.forEach(edge => {\n const type = edge.data?.edgeType as EdgeType;\n if (type) {\n counts[type] = (counts[type] || 0) + 1;\n }\n });\n return counts;\n }, [graphData]);\n\n // Event handlers\n const handleNodeClick = useCallback((_event: React.MouseEvent, node: GraphNode) => {\n setSelectedNode(node);\n setIsSidebarOpen(true);\n }, []);\n\n const handlePaneClick = useCallback(() => {\n setSelectedNode(null);\n }, []);\n\n const handleFitView = useCallback(() => {\n fitView({ padding: 0.2, duration: 300 });\n }, [fitView]);\n\n const handleRefresh = useCallback(async () => {\n await refetch();\n }, [refetch]);\n\n const handleFiltersChange = useCallback((newFilters: GraphFilters) => {\n setFilters(newFilters);\n }, []);\n\n const handleResetFilters = useCallback(() => {\n setFilters({\n nodeTypes: ['component', 'module', 'class', 'function', 'variable', 'interface', 'hook'],\n edgeTypes: ['imports', 'exports', 'extends', 'implements', 'uses', 'calls', 'depends-on'],\n showIsolatedNodes: false,\n });\n }, []);\n\n const handleSidebarClose = useCallback(() => {\n setIsSidebarOpen(false);\n setSelectedNode(null);\n }, []);\n\n // Loading state\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <Loader2 className=\"w-8 h-8 animate-spin text-muted-foreground\" />\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div className=\"flex items-center justify-center h-full p-6\">\n <Card className=\"p-6 border-red-200 dark:border-red-800\">\n <div className=\"flex items-center gap-3\">\n <AlertCircle className=\"w-5 h-5 text-red-500\" />\n <p className=\"text-sm text-red-600 dark:text-red-400\">\n {formatMessage({ id: 'graph.error.loading' }, { message: error.message })}\n </p>\n </div>\n </Card>\n </div>\n );\n }\n\n // Empty state\n if (!graphData || graphData.nodes.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full\">\n <Card className=\"p-6\">\n <div className=\"flex items-center gap-3\">\n <AlertCircle className=\"w-5 h-5 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n {formatMessage({ id: 'graph.empty' })}\n </p>\n </div>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n {/* Toolbar */}\n <GraphToolbar\n filters={filters}\n onFiltersChange={handleFiltersChange}\n onFitView={handleFitView}\n onRefresh={handleRefresh}\n onResetFilters={handleResetFilters}\n nodeTypeCounts={nodeTypeCounts}\n edgeTypeCounts={edgeTypeCounts}\n />\n\n {/* Main content area */}\n <div className=\"flex-1 flex overflow-hidden\">\n {/* Graph canvas */}\n <div className=\"flex-1 relative\">\n <ReactFlow\n nodes={filteredGraphData.nodes}\n edges={filteredGraphData.edges}\n onNodeClick={handleNodeClick}\n onPaneClick={handlePaneClick}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n fitView\n defaultViewport={{ x: 0, y: 0, zoom: 0.8 }}\n minZoom={0.1}\n maxZoom={2}\n className=\"bg-background\"\n >\n <Background variant={BackgroundVariant.Dots} gap={20} size={1} />\n <Controls />\n <MiniMap\n nodeColor={(node) => {\n switch (node.type) {\n case 'component':\n case 'module':\n return '#3b82f6';\n case 'class':\n return '#22c55e';\n case 'function':\n return '#f97316';\n case 'variable':\n return '#06b6d4';\n default:\n return '#6b7280';\n }\n }}\n maskColor=\"rgba(0, 0, 0, 0.1)\"\n />\n\n {/* Status panel */}\n <Panel position=\"top-left\" className=\"bg-card/90 backdrop-blur border border-border rounded-lg p-3 shadow-lg\">\n <div className=\"text-xs space-y-1\">\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-muted-foreground\">\n {formatMessage({ id: 'graph.status.nodes' })}\n </span>\n <span className=\"font-medium\">{filteredGraphData.nodes.length}</span>\n </div>\n <div className=\"flex items-center justify-between gap-4\">\n <span className=\"text-muted-foreground\">\n {formatMessage({ id: 'graph.status.edges' })}\n </span>\n <span className=\"font-medium\">{filteredGraphData.edges.length}</span>\n </div>\n {isFetching && (\n <div className=\"text-xs text-muted-foreground\">\n {formatMessage({ id: 'graph.status.updating' })}\n </div>\n )}\n </div>\n </Panel>\n </ReactFlow>\n </div>\n\n {/* Sidebar */}\n {isSidebarOpen && (\n <GraphSidebar\n selectedNode={selectedNode}\n showLegend={!selectedNode}\n onClose={handleSidebarClose}\n />\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Graph Explorer Page Component (with ReactFlowProvider wrapper)\n */\nexport function GraphExplorerPage() {\n return (\n <ReactFlowProvider>\n <GraphExplorerPageInner />\n </ReactFlowProvider>\n );\n}\n\nexport default GraphExplorerPage;\n"],"names":["Maximize","createLucideIcon","Network","SquareFunction","Variable","GraphToolbar","filters","onFiltersChange","onFitView","onRefresh","onResetFilters","nodeTypeCounts","edgeTypeCounts","formatMessage","useIntl","localFilters","setLocalFilters","useState","nodeTypeLabels","edgeTypeLabels","handleNodeTypeToggle","nodeType","current","updated","t","newFilters","handleEdgeTypeToggle","edgeType","hasActiveFilters","jsxs","DropdownMenu","jsx","DropdownMenuTrigger","Button","Filter","Badge","_a","ChevronDown","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","type","label","count","isChecked","DropdownMenuCheckboxItem","_b","RefreshCw","GraphSidebar","selectedNode","showLegend","onClose","legendItems","FileText","GitBranch","Zap","Info","edgeLegendItems","X","tag","issue","idx","item","Icon","cn","graphKeys","request","nodeId","STALE_TIME","transformToGraphData","response","filterGraphData","graphData","filteredNodes","filteredEdges","nodeTypeSet","node","edgeTypeSet","edge","query","pattern","categorySet","_node","tagSet","excludeTagSet","connectedNodeIds","visibleNodeIds","n","nodesWithinDepth","visited","traverse","depth","depthNodeIds","useGraphData","options","staleTime","enabled","rootPath","maxDepth","nodeTypes","queryClient","useQueryClient","useQuery","fetchGraphDependencies","refetch","invalidate","applyFilters","ModuleNode","memo","props","data","selected","nodeData","hasIssues","severity","getBorderColor","getBackgroundColor","Handle","Position","Package","File","ClassNode","Braces","FunctionNode","FunctionSquare","VariableNode","ImportsEdge","id","sourceX","sourceY","targetX","targetY","sourcePosition","targetPosition","style","markerEnd","edgePath","getBezierPath","edgeStyle","Fragment","BaseEdge","EdgeLabelRenderer","CallsEdge","InheritsEdge","getSmoothStepPath","edgeTypes","GraphExplorerPageInner","fitView","useReactFlow","setSelectedNode","isSidebarOpen","setIsSidebarOpen","setFilters","isLoading","isFetching","error","filteredGraphData","useMemo","counts","handleNodeClick","useCallback","_event","handlePaneClick","handleFitView","handleRefresh","handleFiltersChange","handleResetFilters","handleSidebarClose","Loader2","Card","AlertCircle","ReactFlow","Background","BackgroundVariant","Controls","MiniMap","Panel","GraphExplorerPage","ReactFlowProvider"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|