@mastra/playground-ui 68.0.0-alpha.2 → 68.0.0
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/dist/{FilterBar-CQl04O6t.cjs → FilterBar-BSP2UTjc.cjs} +2 -2
- package/dist/{FilterBar-CQl04O6t.cjs.map → FilterBar-BSP2UTjc.cjs.map} +1 -1
- package/dist/{FilterBar-BgW2dqRQ.js → FilterBar-PSQ1OwqH.js} +2 -2
- package/dist/{FilterBar-BgW2dqRQ.js.map → FilterBar-PSQ1OwqH.js.map} +1 -1
- package/dist/KnowledgePageGraph.css +55 -0
- package/dist/{MarkdownRenderer-2GOXQJEv.js → MarkdownRenderer-CI30RqdB.js} +19 -6
- package/dist/MarkdownRenderer-CI30RqdB.js.map +1 -0
- package/dist/{MarkdownRenderer-CB8Z_CHc.cjs → MarkdownRenderer-y65WGBhC.cjs} +19 -6
- package/dist/MarkdownRenderer-y65WGBhC.cjs.map +1 -0
- package/dist/{MetricsCard-CEB-f2sv.cjs → MetricsCard-BEwiS7Pe.cjs} +8 -8
- package/dist/MetricsCard-BEwiS7Pe.cjs.map +1 -0
- package/dist/{MetricsCard-M8awJ2B_.js → MetricsCard-ua6C6b8a.js} +10 -10
- package/dist/MetricsCard-ua6C6b8a.js.map +1 -0
- package/dist/{MetricsLineChart-BhHoduO0.js → MetricsLineChart-4SwxBbQx.js} +14 -3
- package/dist/MetricsLineChart-4SwxBbQx.js.map +1 -0
- package/dist/{MetricsLineChart-CjBm4IXu.cjs → MetricsLineChart-tZxsauau.cjs} +13 -2
- package/dist/MetricsLineChart-tZxsauau.cjs.map +1 -0
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs → MetricsStackedBarChart-CDLE76IB.cjs} +2 -2
- package/dist/{MetricsStackedBarChart-BdMlKv6G.cjs.map → MetricsStackedBarChart-CDLE76IB.cjs.map} +1 -1
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js → MetricsStackedBarChart-D2QyS4-z.js} +2 -2
- package/dist/{MetricsStackedBarChart-BRuA6MTE.js.map → MetricsStackedBarChart-D2QyS4-z.js.map} +1 -1
- package/dist/{activity-rJ1NQl_2.js → activity-C8Ql81WM.js} +2 -2
- package/dist/{activity-rJ1NQl_2.js.map → activity-C8Ql81WM.js.map} +1 -1
- package/dist/{activity-DyB5H3gF.cjs → activity-CcQZeDYi.cjs} +2 -2
- package/dist/{activity-DyB5H3gF.cjs.map → activity-CcQZeDYi.cjs.map} +1 -1
- package/dist/components/DateTimeRangePicker.cjs.js +1 -1
- package/dist/components/DateTimeRangePicker.es.js +1 -1
- package/dist/components/FilterBar.cjs.js +2 -2
- package/dist/components/FilterBar.es.js +2 -2
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/MetricsCard.cjs.js +1 -1
- package/dist/components/MetricsCard.es.js +1 -1
- package/dist/components/MetricsLineChart.cjs.js +1 -1
- package/dist/components/MetricsLineChart.es.js +1 -1
- package/dist/components/MetricsStackedBarChart.cjs.js +1 -1
- package/dist/components/MetricsStackedBarChart.es.js +1 -1
- package/dist/components/SavedViews.cjs.js +1 -1
- package/dist/components/SavedViews.es.js +1 -1
- package/dist/components/ai/activity.cjs.js +1 -1
- package/dist/components/ai/activity.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-approval.cjs.js +1 -1
- package/dist/components/ai/tool-approval.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +2 -2
- package/dist/components/ai/tool-call.es.js +2 -2
- package/dist/{date-time-range-picker-CTt7Od0P.cjs → date-time-range-picker-CWGjoR3j.cjs} +40 -13
- package/dist/date-time-range-picker-CWGjoR3j.cjs.map +1 -0
- package/dist/{date-time-range-picker-DKh1K9Iy.js → date-time-range-picker-CdSiXwB4.js} +40 -13
- package/dist/date-time-range-picker-CdSiXwB4.js.map +1 -0
- package/dist/domains/chat/activity/activity-stretch-line.cjs.js +1 -1
- package/dist/domains/chat/activity/activity-stretch-line.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-fold.es.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.cjs.js +1 -1
- package/dist/domains/chat/activity/components/activity-timed-trigger.es.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.cjs.js +1 -1
- package/dist/domains/chat/activity/components/calls-panel.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-content.es.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.cjs.js +1 -1
- package/dist/domains/chat/activity/components/stretch-thought.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.cjs.js +1 -1
- package/dist/domains/chat/activity/model/activity-segments.es.js +1 -1
- package/dist/domains/chat/activity/model/activity-words.cjs.js +2 -2
- package/dist/domains/chat/activity/model/activity-words.es.js +2 -2
- package/dist/domains/chat/components/badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/components/badge-wrapper.es.js +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js +52 -6
- package/dist/domains/chat/knowledge/knowledge-links.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/knowledge-links.es.js +53 -9
- package/dist/domains/chat/knowledge/knowledge-links.es.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js +10 -3
- package/dist/domains/chat/knowledge/pinned-knowledge-data.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js +10 -3
- package/dist/domains/chat/knowledge/pinned-knowledge-data.es.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js +8 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.cjs.js.map +1 -1
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js +8 -3
- package/dist/domains/chat/knowledge/pinned-knowledge.es.js.map +1 -1
- package/dist/domains/chat/knowledge.cjs.js +2 -0
- package/dist/domains/chat/knowledge.es.js +2 -2
- package/dist/domains/chat/messages/message-row.cjs.js +3 -3
- package/dist/domains/chat/messages/message-row.es.js +3 -3
- package/dist/domains/chat/messages/notification-signal-notice.cjs.js +1 -1
- package/dist/domains/chat/messages/notification-signal-notice.es.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.cjs.js +1 -1
- package/dist/domains/chat/messages/reasoning-content.es.js +1 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js +35 -1
- package/dist/domains/chat/messages/renderers/message-text.cjs.js.map +1 -1
- package/dist/domains/chat/messages/renderers/message-text.es.js +36 -2
- package/dist/domains/chat/messages/renderers/message-text.es.js.map +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.cjs.js +1 -1
- package/dist/domains/chat/messages/renderers/reasoning-part-renderer.es.js +1 -1
- package/dist/domains/chat/messages/signal-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/signal-badge.es.js +1 -1
- package/dist/domains/chat/messages/skill-message.cjs.js +2 -2
- package/dist/domains/chat/messages/skill-message.es.js +2 -2
- package/dist/domains/chat/messages/system-reminder-badge.cjs.js +1 -1
- package/dist/domains/chat/messages/system-reminder-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge-wrapper.es.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/agent-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/file-tree-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/file-tree-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js +80 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.d.ts +1 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js +78 -0
- package/dist/domains/chat/tools/badges/knowledge-body-range.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js +163 -13
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js +165 -15
- package/dist/domains/chat/tools/badges/knowledge-tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js +51 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.d.ts +1 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js +49 -0
- package/dist/domains/chat/tools/badges/mcp-input-request-badge.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js +7 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js +7 -2
- package/dist/domains/chat/tools/badges/mcp-task-chip.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/observation-marker-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/observation-marker-details.es.js +2 -2
- package/dist/domains/chat/tools/badges/observation-renderer.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/observation-renderer.es.js +1 -1
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.cjs.js +2 -2
- package/dist/domains/chat/tools/badges/sandbox-execution-badge.es.js +2 -2
- package/dist/domains/chat/tools/badges/tool-approval-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/tool-approval-badge.es.js +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js +9 -4
- package/dist/domains/chat/tools/badges/tool-badge.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/tool-badge.es.js +9 -4
- package/dist/domains/chat/tools/badges/tool-badge.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js +81 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js +77 -0
- package/dist/domains/chat/tools/badges/use-deferred-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js +11 -2
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.cjs.js.map +1 -1
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js +11 -2
- package/dist/domains/chat/tools/badges/use-mcp-task-progress.es.js.map +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +1 -1
- package/dist/domains/chat/tools/badges/workflow-badge.es.js +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.cjs.js.map +1 -1
- package/dist/domains/chat/tools/connect-prompt-tool.es.js +79 -4
- package/dist/domains/chat/tools/connect-prompt-tool.es.js.map +1 -1
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js +238 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js +237 -0
- package/dist/domains/chat/tools/mcp-input-request-tool.es.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js +40 -0
- package/dist/domains/chat/tools/mcp-input-request.cjs.js.map +1 -0
- package/dist/domains/chat/tools/mcp-input-request.d.ts +1 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js +33 -0
- package/dist/domains/chat/tools/mcp-input-request.es.js.map +1 -0
- package/dist/domains/chat/tools/tool-card-kind.cjs.js +9 -4
- package/dist/domains/chat/tools/tool-card-kind.cjs.js.map +1 -1
- package/dist/domains/chat/tools/tool-card-kind.es.js +9 -5
- package/dist/domains/chat/tools/tool-card-kind.es.js.map +1 -1
- package/dist/domains/chat/tools/tool-card.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-card.es.js +1 -1
- package/dist/domains/chat/tools/tool-groups.cjs.js +1 -1
- package/dist/domains/chat/tools/tool-groups.es.js +1 -1
- package/dist/domains/chat.cjs.js +5 -3
- package/dist/domains/chat.es.js +4 -4
- package/dist/domains/connect/types.cjs.js.map +1 -1
- package/dist/domains/connect/types.es.js.map +1 -1
- package/dist/domains/connect/use-user-connect.cjs.js +19 -2
- package/dist/domains/connect/use-user-connect.cjs.js.map +1 -1
- package/dist/domains/connect/use-user-connect.es.js +19 -2
- package/dist/domains/connect/use-user-connect.es.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.cjs.js.map +1 -1
- package/dist/domains/dashboards/components/dashboard-renderer.es.js +4 -3
- package/dist/domains/dashboards/components/dashboard-renderer.es.js.map +1 -1
- package/dist/domains/dashboards/components/widget-chrome.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-chrome.es.js +1 -1
- package/dist/domains/dashboards/components/widget-error.cjs.js +1 -1
- package/dist/domains/dashboards/components/widget-error.es.js +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.cjs.js.map +1 -1
- package/dist/domains/dashboards/hooks/use-widget-views.es.js +4 -3
- package/dist/domains/dashboards/hooks/use-widget-views.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js +9 -6
- package/dist/domains/dashboards/kinds/scores/scores-widget.es.js.map +1 -1
- package/dist/domains/dashboards/kinds/table/table-tabs.cjs.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-tabs.es.js +2 -2
- package/dist/domains/dashboards/kinds/table/table-widget.cjs.js +1 -1
- package/dist/domains/dashboards/kinds/table/table-widget.es.js +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.cjs.js.map +1 -1
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js +6 -5
- package/dist/domains/dashboards/kinds/timeseries/timeseries-widget.es.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.cjs.js +9 -2
- package/dist/domains/dashboards/lib/chrome.cjs.js.map +1 -1
- package/dist/domains/dashboards/lib/chrome.es.js +9 -2
- package/dist/domains/dashboards/lib/chrome.es.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.cjs.js.map +1 -1
- package/dist/domains/dashboards/widget-kind.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js +48 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.cjs.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.d.ts +1 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js +47 -0
- package/dist/domains/knowledge/components/KnowledgePageCard.es.js.map +1 -0
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js +63 -5
- package/dist/domains/knowledge/components/KnowledgePageDetail.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js +64 -6
- package/dist/domains/knowledge/components/KnowledgePageDetail.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js +485 -47
- package/dist/domains/knowledge/components/KnowledgePageExplorer.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js +487 -50
- package/dist/domains/knowledge/components/KnowledgePageExplorer.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js +1051 -123
- package/dist/domains/knowledge/components/KnowledgePageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js +1054 -126
- package/dist/domains/knowledge/components/KnowledgePageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js +75 -3
- package/dist/domains/knowledge/components/KnowledgePageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js +76 -4
- package/dist/domains/knowledge/components/KnowledgePageTree.es.js.map +1 -1
- package/dist/domains/knowledge/lib/circleText.cjs.js +9 -0
- package/dist/domains/knowledge/lib/circleText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/circleText.d.ts +1 -0
- package/dist/domains/knowledge/lib/circleText.es.js +8 -0
- package/dist/domains/knowledge/lib/circleText.es.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js +82 -0
- package/dist/domains/knowledge/lib/fitViewport.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/fitViewport.d.ts +1 -0
- package/dist/domains/knowledge/lib/fitViewport.es.js +73 -0
- package/dist/domains/knowledge/lib/fitViewport.es.js.map +1 -0
- package/dist/domains/knowledge/lib/graphShape.cjs.js +524 -0
- package/dist/domains/knowledge/lib/graphShape.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/graphShape.d.ts +1 -0
- package/dist/domains/knowledge/lib/graphShape.es.js +499 -0
- package/dist/domains/knowledge/lib/graphShape.es.js.map +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.cjs.js +11 -0
- package/dist/domains/knowledge/lib/linkCountsText.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.d.ts +1 -0
- package/dist/domains/knowledge/lib/linkCountsText.es.js +10 -0
- package/dist/domains/knowledge/lib/linkCountsText.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js +29 -0
- package/dist/domains/knowledge/lib/pageAddress.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageAddress.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageAddress.es.js +27 -0
- package/dist/domains/knowledge/lib/pageAddress.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageGraph.cjs.js +11 -11
- package/dist/domains/knowledge/lib/pageGraph.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageGraph.es.js +11 -11
- package/dist/domains/knowledge/lib/pageGraph.es.js.map +1 -1
- package/dist/domains/knowledge/lib/pageRefs.cjs.js +69 -0
- package/dist/domains/knowledge/lib/pageRefs.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/pageRefs.d.ts +1 -0
- package/dist/domains/knowledge/lib/pageRefs.es.js +66 -0
- package/dist/domains/knowledge/lib/pageRefs.es.js.map +1 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js +5 -0
- package/dist/domains/knowledge/lib/pageTree.cjs.js.map +1 -1
- package/dist/domains/knowledge/lib/pageTree.es.js +5 -1
- package/dist/domains/knowledge/lib/pageTree.es.js.map +1 -1
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js +82 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +1 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js +78 -0
- package/dist/domains/knowledge/lib/remarkKnowledgeLinks.es.js.map +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.cjs.js +77 -0
- package/dist/domains/knowledge/lib/tooltipSide.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.d.ts +1 -0
- package/dist/domains/knowledge/lib/tooltipSide.es.js +75 -0
- package/dist/domains/knowledge/lib/tooltipSide.es.js.map +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js +65 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.d.ts +1 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.es.js +62 -0
- package/dist/domains/knowledge/lib/useLeavingNodes.es.js.map +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.cjs.js +15 -0
- package/dist/domains/knowledge/lib/useStableWhile.cjs.js.map +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.d.ts +1 -0
- package/dist/domains/knowledge/lib/useStableWhile.es.js +14 -0
- package/dist/domains/knowledge/lib/useStableWhile.es.js.map +1 -0
- package/dist/domains/metrics/components/agent-runs-card.cjs.js +3 -3
- package/dist/domains/metrics/components/agent-runs-card.es.js +3 -3
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown/breakdown-tab-body.es.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.cjs.js +1 -1
- package/dist/domains/metrics/components/breakdown-card.es.js +1 -1
- package/dist/domains/metrics/components/chart-area.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-area.es.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card-error.es.js +1 -1
- package/dist/domains/metrics/components/chart-card.cjs.js +1 -1
- package/dist/domains/metrics/components/chart-card.es.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.cjs.js +1 -1
- package/dist/domains/metrics/components/date-range-selector.es.js +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.cjs.js.map +1 -1
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js +3 -2
- package/dist/domains/metrics/components/distinct-ids/distinct-ids-chart.es.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.cjs.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/failure-rate-card.es.js +3 -2
- package/dist/domains/metrics/components/failure-rate-card.es.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.cjs.js +3 -2
- package/dist/domains/metrics/components/latency-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/latency-card.es.js +3 -2
- package/dist/domains/metrics/components/latency-card.es.js.map +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.cjs.js +1 -1
- package/dist/domains/metrics/components/metrics-time-range-chip.es.js +1 -1
- package/dist/domains/metrics/components/scores-card.cjs.js +2 -1
- package/dist/domains/metrics/components/scores-card.cjs.js.map +1 -1
- package/dist/domains/metrics/components/scores-card.es.js +2 -1
- package/dist/domains/metrics/components/scores-card.es.js.map +1 -1
- package/dist/domains/metrics/components/token-usage-card.cjs.js +3 -3
- package/dist/domains/metrics/components/token-usage-card.es.js +3 -3
- package/dist/domains/metrics/components/trace-aggregate-card.cjs.js +1 -1
- package/dist/domains/metrics/components/trace-aggregate-card.es.js +1 -1
- package/dist/domains/observability/components/observability-histogram.cjs.js +1 -1
- package/dist/domains/observability/components/observability-histogram.es.js +1 -1
- package/dist/domains/scores/components/trace-scores-list.cjs.js +2 -2
- package/dist/domains/scores/components/trace-scores-list.es.js +2 -2
- package/dist/domains/skills/skill-simple-form.cjs.js +1 -1
- package/dist/domains/skills/skill-simple-form.es.js +1 -1
- package/dist/domains/spans/components/spans-filter-bar.cjs.js +2 -2
- package/dist/domains/spans/components/spans-filter-bar.es.js +2 -2
- package/dist/domains/spans/hooks/use-spans-filter-bar.cjs.js +1 -1
- package/dist/domains/spans/hooks/use-spans-filter-bar.es.js +1 -1
- package/dist/domains/threads/components/threads-filter-bar.cjs.js +2 -2
- package/dist/domains/threads/components/threads-filter-bar.es.js +2 -2
- package/dist/domains/threads/hooks/use-threads-filter-bar.cjs.js +1 -1
- package/dist/domains/threads/hooks/use-threads-filter-bar.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-error-renderer.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-input-renderers.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-output-renderers.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-output-renderers.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.cjs.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-messages.es.js +2 -2
- package/dist/domains/traces/components/span-payload/span-payload-primitives.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-primitives.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-processor.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-payload-tool.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-processor-mutations.es.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.cjs.js +1 -1
- package/dist/domains/traces/components/span-payload/span-tools-section.es.js +1 -1
- package/dist/domains/traces/components/span-timeline-row.cjs.js +1 -1
- package/dist/domains/traces/components/span-timeline-row.es.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.cjs.js +1 -1
- package/dist/domains/traces/components/span-timing-hover-card.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +8 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +8 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/trace-error-cell.cjs.js +1 -1
- package/dist/domains/traces/components/trace-error-cell.es.js +1 -1
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.cjs.js +2 -2
- package/dist/domains/traces/components/traces-explorer/traces-explorer-filter-bar.es.js +2 -2
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.cjs.js +1 -1
- package/dist/domains/traces/components/traces-explorer/use-traces-filter-bar.es.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.cjs.js +1 -1
- package/dist/domains/workflows/runs/workflow-run-list.es.js +1 -1
- package/dist/domains/workflows/workflow/input/workflow-processor-input.cjs.js +2 -2
- package/dist/domains/workflows/workflow/input/workflow-processor-input.es.js +2 -2
- package/dist/domains/workflows/workflow/use-workflow-trigger.cjs.js +3 -3
- package/dist/domains/workflows/workflow/use-workflow-trigger.es.js +3 -3
- package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -1
- package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -1
- package/dist/domains/workflows/workflow/workflow-suspended-steps.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-suspended-steps.es.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.cjs.js +2 -2
- package/dist/domains/workflows/workflow/workflow-time-travel-form.es.js +2 -2
- package/dist/domains/workspace/components/workspace-add-skill-dialog.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-add-skill-dialog.es.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.cjs.js +1 -1
- package/dist/domains/workspace/components/workspace-markdown-preview.es.js +1 -1
- package/dist/{filter-bar-time-range-mg9JeYue.js → filter-bar-time-range-qlV8p7hp.js} +2 -2
- package/dist/{filter-bar-time-range-mg9JeYue.js.map → filter-bar-time-range-qlV8p7hp.js.map} +1 -1
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs → filter-bar-time-range-zdM024JD.cjs} +2 -2
- package/dist/{filter-bar-time-range-BA-pXMlo.cjs.map → filter-bar-time-range-zdM024JD.cjs.map} +1 -1
- package/dist/lib/form/dynamic-form.cjs.js +2 -2
- package/dist/lib/form/dynamic-form.es.js +2 -2
- package/dist/lib/form/json-draft.cjs.js +1 -1
- package/dist/lib/form/json-draft.es.js +1 -1
- package/dist/lib/form/zod-provider.cjs.js +1 -1
- package/dist/lib/form/zod-provider.es.js +1 -1
- package/dist/{span-payload-primitives-B3RdahsC.js → span-payload-primitives-CKKIAVPJ.js} +4 -4
- package/dist/{span-payload-primitives-B3RdahsC.js.map → span-payload-primitives-CKKIAVPJ.js.map} +1 -1
- package/dist/{span-payload-primitives-_2d-pAOD.cjs → span-payload-primitives-D4tHWN2W.cjs} +4 -4
- package/dist/{span-payload-primitives-_2d-pAOD.cjs.map → span-payload-primitives-D4tHWN2W.cjs.map} +1 -1
- package/dist/src/domains/chat/knowledge/knowledge-links.d.ts +32 -4
- package/dist/src/domains/chat/knowledge/pinned-knowledge-data.d.ts +2 -0
- package/dist/src/domains/chat/tools/badges/knowledge-body-range.d.ts +12 -0
- package/dist/src/domains/chat/tools/badges/knowledge-tool-badge.d.ts +5 -2
- package/dist/src/domains/chat/tools/badges/mcp-input-request-badge.d.ts +18 -0
- package/dist/src/domains/chat/tools/badges/tool-badge.d.ts +4 -1
- package/dist/src/domains/chat/tools/badges/use-deferred-input-request.d.ts +44 -0
- package/dist/src/domains/chat/tools/badges/use-mcp-task-progress.d.ts +6 -1
- package/dist/src/domains/chat/tools/connect-prompt-tool.d.ts +10 -1
- package/dist/src/domains/chat/tools/mcp-input-request-tool.d.ts +18 -0
- package/dist/src/domains/chat/tools/mcp-input-request.d.ts +40 -0
- package/dist/src/domains/chat/tools/tool-card-kind.d.ts +4 -2
- package/dist/src/domains/chat/tools/tool-card.d.ts +1 -1
- package/dist/src/domains/connect/types.d.ts +16 -0
- package/dist/src/domains/dashboards/components/dashboard-renderer.d.ts +4 -2
- package/dist/src/domains/dashboards/hooks/use-widget-views.d.ts +4 -3
- package/dist/src/domains/dashboards/index.d.ts +1 -1
- package/dist/src/domains/dashboards/kinds/scores/scores-widget.d.ts +1 -1
- package/dist/src/domains/dashboards/lib/chrome.d.ts +6 -4
- package/dist/src/domains/dashboards/widget-kind.d.ts +12 -0
- package/dist/src/domains/knowledge/components/KnowledgePageCard.d.ts +23 -0
- package/dist/src/domains/knowledge/components/KnowledgePageExplorer.d.ts +29 -0
- package/dist/src/domains/knowledge/components/KnowledgePageGraph.d.ts +27 -1
- package/dist/src/domains/knowledge/components/KnowledgePageTree.d.ts +2 -1
- package/dist/src/domains/knowledge/lib/circleText.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/fitViewport.d.ts +67 -0
- package/dist/src/domains/knowledge/lib/graphShape.d.ts +131 -0
- package/dist/src/domains/knowledge/lib/linkCountsText.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageAddress.d.ts +5 -0
- package/dist/src/domains/knowledge/lib/pageGraph.d.ts +4 -4
- package/dist/src/domains/knowledge/lib/pageRefs.d.ts +15 -0
- package/dist/src/domains/knowledge/lib/pageTree.d.ts +2 -0
- package/dist/src/domains/knowledge/lib/remarkKnowledgeLinks.d.ts +13 -0
- package/dist/src/domains/knowledge/lib/tooltipSide.d.ts +40 -0
- package/dist/src/domains/knowledge/lib/useLeavingNodes.d.ts +14 -0
- package/dist/src/domains/knowledge/lib/useStableWhile.d.ts +5 -0
- package/dist/src/domains/knowledge/pageTypes.d.ts +6 -1
- package/dist/src/ds/components/DateTimeRangePicker/date-time-range-picker.d.ts +12 -1
- package/dist/src/ds/components/MarkdownRenderer/markdown-renderer.d.ts +8 -1
- package/dist/src/ds/components/MetricsCard/metrics-card-headline.d.ts +1 -1
- package/dist/src/ds/components/MetricsLineChart/metrics-line-chart.d.ts +8 -0
- package/dist/src/ds/components/ai/tool-call/tool-phrases.d.ts +6 -0
- package/dist/style.css +73 -2
- package/dist/{tool-approval-1qiB4hhG.cjs → tool-approval-CJvPDL7D.cjs} +4 -4
- package/dist/{tool-approval-1qiB4hhG.cjs.map → tool-approval-CJvPDL7D.cjs.map} +1 -1
- package/dist/{tool-approval-B6MFcaKV.js → tool-approval-DyN11vFA.js} +4 -4
- package/dist/{tool-approval-B6MFcaKV.js.map → tool-approval-DyN11vFA.js.map} +1 -1
- package/dist/{tool-call-Bu66PkD-.cjs → tool-call-DBn14X-3.cjs} +9 -3
- package/dist/{tool-call-Bu66PkD-.cjs.map → tool-call-DBn14X-3.cjs.map} +1 -1
- package/dist/{tool-call-Ch9-jjXU.js → tool-call-Dsj43lvJ.js} +9 -3
- package/dist/{tool-call-Ch9-jjXU.js.map → tool-call-Dsj43lvJ.js.map} +1 -1
- package/dist/{tool-card-DrqPZfPQ.cjs → tool-card-BOLXeKIp.cjs} +167 -126
- package/dist/tool-card-BOLXeKIp.cjs.map +1 -0
- package/dist/{tool-card-sO6P2Qj4.js → tool-card-HZ5bm7ue.js} +168 -127
- package/dist/tool-card-HZ5bm7ue.js.map +1 -0
- package/dist/{tool-presentation-DvCsb_kz.js → tool-presentation-CvibOP1J.js} +6 -1
- package/dist/tool-presentation-CvibOP1J.js.map +1 -0
- package/dist/{tool-presentation-CQlDEwgS.cjs → tool-presentation-D6nzVruN.cjs} +6 -1
- package/dist/tool-presentation-D6nzVruN.cjs.map +1 -0
- package/package.json +11 -11
- package/dist/MarkdownRenderer-2GOXQJEv.js.map +0 -1
- package/dist/MarkdownRenderer-CB8Z_CHc.cjs.map +0 -1
- package/dist/MetricsCard-CEB-f2sv.cjs.map +0 -1
- package/dist/MetricsCard-M8awJ2B_.js.map +0 -1
- package/dist/MetricsLineChart-BhHoduO0.js.map +0 -1
- package/dist/MetricsLineChart-CjBm4IXu.cjs.map +0 -1
- package/dist/date-time-range-picker-CTt7Od0P.cjs.map +0 -1
- package/dist/date-time-range-picker-DKh1K9Iy.js.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.cjs.js +0 -49
- package/dist/domains/knowledge/lib/pageLayout.cjs.js.map +0 -1
- package/dist/domains/knowledge/lib/pageLayout.d.ts +0 -1
- package/dist/domains/knowledge/lib/pageLayout.es.js +0 -48
- package/dist/domains/knowledge/lib/pageLayout.es.js.map +0 -1
- package/dist/src/domains/knowledge/lib/pageLayout.d.ts +0 -24
- package/dist/tool-card-DrqPZfPQ.cjs.map +0 -1
- package/dist/tool-card-sO6P2Qj4.js.map +0 -1
- package/dist/tool-presentation-CQlDEwgS.cjs.map +0 -1
- package/dist/tool-presentation-DvCsb_kz.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgePageGraph.cjs.js","names":["MarkerType","Txt","Handle","Position","_Fragment","Fragment","Pin","BaseEdge","memo","ReactFlowProvider","useMemo","grantGraph","pageGraphEdges","useRef","toPageFlow","layoutPageGraph","pageNeighbourIds","useReactFlow","useCallback","getViewportForBounds","ReactFlow","Background","BackgroundVariant","Controls","ControlButton","Maximize"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageGraph.tsx"],"sourcesContent":["import type { Edge, EdgeProps, NodeProps } from '@xyflow/react';\nimport {\n Background,\n BaseEdge,\n BackgroundVariant,\n ControlButton,\n Controls,\n getViewportForBounds,\n Handle,\n MarkerType,\n Position,\n ReactFlow,\n ReactFlowProvider,\n useReactFlow,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { Maximize, Pin } from 'lucide-react';\nimport { Fragment, memo, useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport type { PageFlowEdge, PageFlowNode } from '../lib/pageGraph';\nimport { grantGraph, pageGraphEdges, pageNeighbourIds, toPageFlow } from '../lib/pageGraph';\nimport { layoutPageGraph } from '../lib/pageLayout';\nimport type { PageLayout } from '../lib/pageLayout';\nimport type { KnowledgePageEdge, KnowledgePagePayload, KnowledgeScopeGrantPayload } from '../pageTypes';\n\nimport { Txt } from '@/ds/components/Txt';\n\nimport './knowledge.css';\n\n// knowledge.css draws the border and the selection ring from this colour.\ntype CircleStyle = CSSProperties & { '--knowledge-color': string };\nconst SCOPE_STYLE: CircleStyle = {\n '--knowledge-color': 'var(--chart-blue)',\n background: 'color-mix(in oklab, var(--chart-blue) 16%, var(--card))',\n};\nconst PAGE_STYLE: CircleStyle = { '--knowledge-color': 'var(--border-strong)' };\n\nconst PARENT_EDGE_STYLE = {\n stroke: 'var(--foreground)',\n strokeOpacity: 0.45,\n strokeDasharray: '4 4',\n strokeWidth: 1.25,\n};\nconst MENTION_EDGE_COLOR = 'var(--chart-blue)';\n// An open chevron in the dashed line's muted tone, at the child end: distinct from a mention's filled blue head.\nconst PARENT_ARROW_COLOR = 'var(--muted-foreground)';\nconst PARENT_ARROW = { type: MarkerType.Arrow, color: PARENT_ARROW_COLOR, width: 12, height: 12, strokeWidth: 1.5 };\n// Grants: purple dash-dot from the principal scope to the scope it reaches, so neither colour nor pattern\n// alone tells it apart from a parent or mention line.\nconst GRANT_EDGE_COLOR = 'var(--chart-purple)';\nconst GRANT_EDGE_STYLE = { stroke: GRANT_EDGE_COLOR, strokeWidth: 1.75, strokeDasharray: '8 3 2 3' };\nconst GRANT_ARROW = { type: MarkerType.ArrowClosed, color: GRANT_EDGE_COLOR, width: 13, height: 13 };\n// A declared principal with no scope page yet: same size as a scope, dashed outline, nothing to open.\nconst PLACEHOLDER_STYLE = {\n background: 'var(--card)',\n borderColor: 'var(--chart-purple)',\n borderStyle: 'dashed',\n};\n\n/**\n * The pin badge sits on the circle's rim at its top-right (45°).\n */\nfunction pinBadgeStyle(size: number) {\n const badge = 20;\n const offset = (size / 2) * (1 - Math.SQRT1_2);\n return {\n badge,\n style: { width: badge, height: badge, top: offset, right: offset, transform: 'translate(50%, -50%)' },\n };\n}\n\ntype PageNodeData = PageFlowNode['data'] & { pinned: boolean; dimmed: boolean };\n\n/** A scope or page: its kind on top, its name below, both inside the circle. */\nfunction PageNodeComponent({ data }: NodeProps<PageFlowNode & { data: PageNodeData }>) {\n const { page, size, selected, pinned, dimmed } = data;\n const kind = page.isScope ? (page.displayLabel ?? 'Scope') : 'Page';\n const placeholder = isPlaceholder(page);\n return (\n <div\n data-testid=\"knowledge-page-node\"\n data-page-id={page.id}\n data-page-type={placeholder ? 'placeholder' : page.isScope ? 'scope' : 'page'}\n className={`relative transition-opacity ${placeholder ? 'cursor-default' : 'cursor-pointer'}`}\n style={{ width: size, height: size, opacity: dimmed ? 0.35 : 1 }}\n title={\n placeholder\n ? `${kind} · ${page.address} · nothing written to it yet`\n : page.isScope && page.address\n ? `${kind} · ${page.address}`\n : page.name\n }\n >\n <div\n className=\"knowledge-circle flex size-full flex-col items-center justify-center gap-0.5 overflow-hidden rounded-full border-2 px-3 text-center shadow-raised\"\n data-selected={selected || undefined}\n style={placeholder ? PLACEHOLDER_STYLE : page.isScope ? SCOPE_STYLE : PAGE_STYLE}\n >\n <Txt\n as=\"span\"\n variant=\"meta\"\n tone={page.isScope ? undefined : 'muted'}\n className=\"pointer-events-none line-clamp-2 max-w-full tracking-wide uppercase\"\n style={page.isScope ? { color: 'var(--chart-blue)' } : undefined}\n data-testid={page.isScope ? 'knowledge-scope-caption' : 'knowledge-page-caption'}\n >\n {kind}\n </Txt>\n <Txt as=\"span\" variant=\"label\" tone=\"ink\" className=\"pointer-events-none line-clamp-3 max-w-full break-words\">\n {page.isScope && page.address ? <BreakAtColons text={page.address} /> : page.name}\n </Txt>\n </div>\n {pinned ? <PinBadge size={size} /> : null}\n <Handle type=\"target\" position={Position.Top} className=\"!invisible\" />\n <Handle type=\"source\" position={Position.Bottom} className=\"!invisible\" />\n </div>\n );\n}\n\nfunction isPlaceholder(page: KnowledgePagePayload): boolean {\n return page.id.startsWith('unplaced:');\n}\n\n/** Lets a scope address like `role:acme:admin` wrap after a colon instead of mid-word. */\nfunction BreakAtColons({ text }: { text: string }) {\n const parts = text.split(':');\n return (\n <>\n {parts.map((part, index) => (\n <Fragment key={index}>\n {part}\n {index < parts.length - 1 ? (\n <>\n :<wbr />\n </>\n ) : null}\n </Fragment>\n ))}\n </>\n );\n}\n\nfunction PinBadge({ size }: { size: number }) {\n const { badge, style } = pinBadgeStyle(size);\n return (\n <span\n data-testid=\"knowledge-pin-badge\"\n className=\"absolute flex items-center justify-center rounded-full bg-badge-amber-strong text-badge-amber-foreground shadow-raised\"\n style={style}\n aria-label=\"Pinned\"\n >\n <Pin size={Math.round(badge * 0.6)} aria-hidden />\n </span>\n );\n}\n\ntype RimEdgeData = PageFlowEdge['data'] & { from: Circle; to: Circle; dimmed: boolean };\ninterface Circle {\n x: number;\n y: number;\n r: number;\n}\n\n/** A straight line from one circle's rim to the other's, so lines never loop or hide behind circles. */\nfunction rimToRim(from: Circle, to: Circle, gap = 3) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const length = Math.hypot(dx, dy) || 1;\n const ux = dx / length;\n const uy = dy / length;\n return {\n x1: from.x + ux * (from.r + gap),\n y1: from.y + uy * (from.r + gap),\n x2: to.x - ux * (to.r + gap),\n y2: to.y - uy * (to.r + gap),\n };\n}\n\nfunction RimEdgeComponent({ id, data, style, markerEnd }: EdgeProps<Edge<RimEdgeData>>) {\n if (!data) return null;\n const { x1, y1, x2, y2 } = rimToRim(data.from, data.to);\n const mention = data.kind === 'mention';\n const path = `M ${x1} ${y1} L ${x2} ${y2}`;\n return (\n <>\n <BaseEdge\n id={id}\n path={path}\n style={{ ...style, opacity: data.dimmed ? 0.2 : 1 }}\n markerEnd={markerEnd}\n interactionWidth={mention ? 20 : 0}\n />\n {data.kind === 'grant' && data.role ? (\n // A wide invisible path over the line, so hovering it names the access level.\n <path\n d={path}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={14}\n data-testid=\"knowledge-grant-edge\"\n data-role={data.role}\n aria-label={`Grants ${data.role}`}\n >\n <title>{`Grants ${data.role}`}</title>\n </path>\n ) : null}\n </>\n );\n}\n\nconst edgeTypes = { rim: RimEdgeComponent };\n\nconst nodeTypes = { page: memo(PageNodeComponent) };\n\n/** The box around laid-out circles, in graph coordinates; `null` when there are none. */\nfunction graphBounds(nodes: Array<{ position: { x: number; y: number }; width?: number; height?: number }>) {\n if (nodes.length === 0) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const node of nodes) {\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + (node.width ?? 0));\n maxY = Math.max(maxY, node.position.y + (node.height ?? 0));\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nconst LEGEND_SWATCH = 'knowledge-circle inline-block size-3 shrink-0 rounded-full border-2';\n\n/** What the circles, lines and badge mean. */\nfunction GraphLegend({ grants }: { grants: boolean }) {\n return (\n <ul\n aria-label=\"Legend\"\n className=\"pointer-events-none absolute top-2 left-2 z-10 flex flex-col gap-1 rounded-md border border-border bg-card/90 px-2 py-1.5 shadow-raised\"\n >\n <li className=\"flex items-center gap-2\">\n <span className={LEGEND_SWATCH} style={{ ...SCOPE_STYLE }} aria-hidden />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Scope\n </Txt>\n </li>\n <li className=\"flex items-center gap-2\">\n <span className={LEGEND_SWATCH} style={{ ...PAGE_STYLE }} aria-hidden />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Page\n </Txt>\n </li>\n <li className=\"flex items-center gap-2\">\n <svg width=\"12\" height=\"4\" aria-hidden className=\"shrink-0\">\n <line x1=\"0\" y1=\"2\" x2=\"12\" y2=\"2\" stroke={MENTION_EDGE_COLOR} strokeWidth=\"2\" />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Mentioned in notes\n </Txt>\n </li>\n <li className=\"flex items-center gap-2\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\" data-testid=\"knowledge-legend-parent-arrow\">\n <line x1=\"0\" y1=\"4\" x2=\"14\" y2=\"4\" {...PARENT_EDGE_STYLE} strokeDasharray=\"3 2\" />\n <polyline\n points=\"10,1 14,4 10,7\"\n fill=\"none\"\n stroke={PARENT_ARROW_COLOR}\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Parent → child\n </Txt>\n </li>\n {grants ? (\n <li className=\"flex items-center gap-2\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\" data-testid=\"knowledge-legend-grant\">\n <line x1=\"0\" y1=\"4\" x2=\"12\" y2=\"4\" {...GRANT_EDGE_STYLE} strokeDasharray=\"4 2 1 2\" strokeWidth=\"1.5\" />\n <polygon points=\"11,1 16,4 11,7\" fill={GRANT_EDGE_COLOR} />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Grants access (hover for role)\n </Txt>\n </li>\n ) : null}\n <li className=\"flex items-center gap-2\">\n <span\n className=\"flex size-3 shrink-0 items-center justify-center rounded-full bg-badge-amber-strong text-badge-amber-foreground\"\n aria-hidden\n >\n <Pin size={8} />\n </span>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Pinned\n </Txt>\n </li>\n </ul>\n );\n}\n\n/** How far the pointer may move between press and release and still count as a click, not a pan. */\nconst CLICK_SLOP_PX = 4;\n\nexport interface KnowledgePageGraphProps {\n pages: KnowledgePagePayload[];\n /** Mention edges between pages; parent edges are derived from `pages`. */\n edges: KnowledgePageEdge[];\n pinnedIds?: readonly string[];\n /** Access grants between scopes, drawn from each principal scope to the scope it reaches. */\n grants?: readonly KnowledgeScopeGrantPayload[];\n selectedPageId?: string | null;\n /** A page that wasn't selected was clicked, tapped, or activated with Enter or Space: select it. */\n onSelect: (page: KnowledgePagePayload) => void;\n /** The already-selected page was clicked, tapped, or activated again: open it. Without it, that only reselects. */\n onOpen?: (page: KnowledgePagePayload) => void;\n /** Empty canvas was clicked without moving the pointer (a pan doesn't count): clear the selection. */\n onClearSelection?: () => void;\n /** A mention line was clicked: notes on `source` mention `target`. `point` is where, in the graph's own box. */\n onMentionSelect?: (mention: {\n source: KnowledgePagePayload;\n target: KnowledgePagePayload;\n point: { x: number; y: number };\n /** The graph's own size, so a popup can open on whichever side of `point` has room. */\n pane: { width: number; height: number };\n }) => void;\n}\n\n/**\n * The schema-4 Knowledge page graph: scopes and pages as circles sized by how often they are mentioned,\n * parent links as faint edges and mentions as solid ones. The first layout is deterministic for the same pages; later updates start from where pages already sit.\n */\nexport function KnowledgePageGraph(props: KnowledgePageGraphProps) {\n return (\n <ReactFlowProvider>\n <KnowledgePageGraphInner {...props} />\n </ReactFlowProvider>\n );\n}\n\nfunction KnowledgePageGraphInner({\n pages,\n edges,\n pinnedIds = [],\n grants,\n selectedPageId,\n onSelect,\n onOpen,\n onClearSelection,\n onMentionSelect,\n}: KnowledgePageGraphProps) {\n // Grants add placeholder circles for declared principals with no scope page yet, and their own lines.\n const { graphPages, allEdges } = useMemo(() => {\n const granted = grantGraph(pages, grants);\n const withPlaceholders = granted.placeholders.length ? [...pages, ...granted.placeholders] : pages;\n return { graphPages: withPlaceholders, allEdges: [...pageGraphEdges(pages, edges), ...granted.edges] };\n }, [pages, edges, grants]);\n // The last layout: a refetch or live update starts from it, so placed pages stay put.\n const lastLayout = useRef<PageLayout | undefined>(undefined);\n const laidOut = useMemo(() => {\n const flow = toPageFlow(graphPages, allEdges);\n const layout = layoutPageGraph(\n lastLayout.current,\n flow.nodes.map(node => ({ id: node.id, size: node.data.size })),\n flow.edges.map(edge => ({ source: edge.source, target: edge.target })),\n );\n lastLayout.current = layout;\n return { nodes: flow.nodes, edges: flow.edges, positions: layout.positions };\n }, [graphPages, allEdges]);\n\n const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);\n // With a page selected, everything more than one line away fades so its neighbourhood reads at a glance.\n const neighbours = useMemo(\n () => (selectedPageId && laidOut.positions.has(selectedPageId) ? pageNeighbourIds(selectedPageId, allEdges) : null),\n [selectedPageId, laidOut, allEdges],\n );\n // Each circle's size is known from the layout, so hand it to React Flow as the node's fixed size. Left to\n // React Flow's own DOM measurement, a production Studio sometimes never got one and every node stayed\n // `visibility: hidden`.\n const nodes = useMemo(\n () =>\n laidOut.nodes.map(node => {\n const center = laidOut.positions.get(node.id) ?? { x: 0, y: 0 };\n return {\n ...node,\n width: node.data.size,\n height: node.data.size,\n // Declared handles (where the hidden ones sit in PageNodeComponent) let lines draw without React\n // Flow measuring the node in the DOM, for the same reason as the fixed size above.\n handles: [\n { type: 'target' as const, position: Position.Top, x: node.data.size / 2, y: 0, width: 1, height: 1 },\n {\n type: 'source' as const,\n position: Position.Bottom,\n x: node.data.size / 2,\n y: node.data.size,\n width: 1,\n height: 1,\n },\n ],\n position: { x: center.x - node.data.size / 2, y: center.y - node.data.size / 2 },\n data: {\n ...node.data,\n selected: node.id === selectedPageId,\n pinned: pinned.has(node.id),\n dimmed: !!neighbours && !neighbours.has(node.id),\n },\n };\n }),\n [laidOut, selectedPageId, pinned, neighbours],\n );\n const flowEdges = useMemo(() => {\n const sizes = new Map(laidOut.nodes.map(node => [node.id, node.data.size]));\n const circle = (id: string): Circle => {\n const center = laidOut.positions.get(id) ?? { x: 0, y: 0 };\n return { ...center, r: (sizes.get(id) ?? 0) / 2 };\n };\n return laidOut.edges.map((edge): Edge<RimEdgeData> => {\n const mention = edge.data?.kind === 'mention';\n const grant = edge.data?.kind === 'grant';\n const dimmed = !!neighbours && !(neighbours.has(edge.source) && neighbours.has(edge.target));\n return {\n ...edge,\n type: 'rim',\n data: {\n kind: edge.data?.kind ?? 'parent',\n count: edge.data?.count ?? 1,\n ...(edge.data?.role ? { role: edge.data.role } : {}),\n from: circle(edge.source),\n to: circle(edge.target),\n dimmed,\n },\n ...(mention && onMentionSelect ? { className: 'cursor-pointer' } : {}),\n style: mention\n ? { stroke: MENTION_EDGE_COLOR, strokeWidth: Math.min(1.5 + (edge.data?.count ?? 1) * 0.5, 4) }\n : grant\n ? GRANT_EDGE_STYLE\n : PARENT_EDGE_STYLE,\n markerEnd: mention\n ? { type: MarkerType.ArrowClosed, color: MENTION_EDGE_COLOR, width: 14, height: 14 }\n : grant\n ? GRANT_ARROW\n : PARENT_ARROW,\n };\n });\n }, [laidOut, onMentionSelect, neighbours]);\n const pagesById = useMemo(() => new Map(pages.map(page => [page.id, page])), [pages]);\n const reactFlow = useReactFlow();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasNodes = nodes.length > 0;\n\n // The view frames the selected page and its neighbours, or every page when nothing is selected. It is\n // computed from the layout's own positions and sizes rather than React Flow's `fitView`, which only\n // counts nodes it has measured in the DOM: in a production Studio it measured none, so the view never\n // moved. State is read through a ref so a refetch with the same selection never moves the view.\n const fitState = useRef({ nodes, allEdges, selectedPageId, reactFlow });\n fitState.current = { nodes, allEdges, selectedPageId, reactFlow };\n // Set when a fit found the pane 0×0, so the next non-zero size fits even if it matches the last one seen.\n const fitPending = useRef(false);\n const fit = useCallback((focusSelection: boolean, duration?: number) => {\n const container = containerRef.current;\n const width = container?.clientWidth ?? 0;\n const height = container?.clientHeight ?? 0;\n if (width === 0 || height === 0) {\n fitPending.current = true;\n return;\n }\n fitPending.current = false;\n const { nodes: current, allEdges: edgesNow, selectedPageId: selected, reactFlow: flow } = fitState.current;\n const focus = focusSelection && selected ? pageNeighbourIds(selected, edgesNow) : null;\n const targets = focus ? current.filter(node => focus.has(node.id)) : current;\n const bounds = graphBounds(targets);\n if (!bounds) return;\n const viewport = getViewportForBounds(bounds, width, height, 0.1, focus ? 1.5 : 2, focus ? 0.3 : 0.1);\n void flow.setViewport(viewport, duration ? { duration } : undefined);\n }, []);\n\n // A host that hides the graph behind a Tree/Graph toggle gives it zero size at first, so fit again\n // whenever the container gets a new non-zero size (shown, or the window resized), at most once a frame.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n let last = { width: container.clientWidth, height: container.clientHeight };\n let frame: number | undefined;\n const observer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n const { width, height } = entry.contentRect;\n const changed = width !== last.width || height !== last.height;\n last = { width, height };\n if ((!changed && !fitPending.current) || width === 0 || height === 0) return;\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = undefined;\n fit(true);\n });\n });\n observer.observe(container);\n return () => {\n observer.disconnect();\n if (frame !== undefined) cancelAnimationFrame(frame);\n };\n }, [hasNodes, fit]);\n\n // A selection made outside the graph (tree, search, a link) brings that page and its neighbours into\n // view. A click on the graph itself leaves the view where the user put it.\n const selectedHere = useRef<string | null>(null);\n const selectedIsLoaded = !!selectedPageId && pagesById.has(selectedPageId);\n const initialized = useRef(false);\n useEffect(() => {\n if (!initialized.current || !selectedIsLoaded || !selectedPageId) return;\n const fromGraph = selectedHere.current === selectedPageId;\n selectedHere.current = null;\n if (fromGraph) return;\n fit(true, 300);\n }, [selectedPageId, selectedIsLoaded, fit]);\n\n // First click selects; a click on the page that is already selected opens it. A double-click is the two.\n const activate = (page: KnowledgePagePayload) => {\n if (page.id === selectedPageId && onOpen) return onOpen(page);\n selectedHere.current = page.id;\n onSelect(page);\n };\n // Where the pointer went down, so a click that ends a pan isn't taken for a click on empty canvas.\n const pressedAt = useRef<{ x: number; y: number } | null>(null);\n const onPaneClick = (event: React.MouseEvent) => {\n const start = pressedAt.current;\n pressedAt.current = null;\n if (start && Math.hypot(event.clientX - start.x, event.clientY - start.y) > CLICK_SLOP_PX) return;\n onClearSelection?.();\n };\n // React Flow focuses nodes but only toggles its own selection on Enter or Space; route them like a click.\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n const id = (event.target as HTMLElement).closest<HTMLElement>('.react-flow__node')?.dataset.id;\n const page = id ? pagesById.get(id) : undefined;\n if (!page) return;\n event.preventDefault();\n activate(page);\n };\n\n if (!hasNodes) {\n return (\n <div className=\"flex h-full items-center justify-center p-6\">\n <Txt variant=\"body\" tone=\"muted\">\n No pages yet.\n </Txt>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className=\"relative size-full\"\n data-testid=\"knowledge-page-graph\"\n onKeyDown={onKeyDown}\n onPointerDownCapture={event => {\n pressedAt.current = { x: event.clientX, y: event.clientY };\n }}\n >\n <GraphLegend grants={allEdges.some(edge => edge.kind === 'grant')} />\n <ReactFlow\n nodes={nodes}\n edges={flowEdges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onInit={() => {\n initialized.current = true;\n fit(true);\n }}\n minZoom={0.1}\n proOptions={{ hideAttribution: true }}\n nodesConnectable={false}\n nodesDraggable={false}\n onPaneClick={onPaneClick}\n onNodeClick={(_: unknown, node: PageFlowNode) => {\n if (!isPlaceholder(node.data.page)) activate(node.data.page);\n }}\n onEdgeClick={(event: React.MouseEvent, edge: Edge<RimEdgeData>) => {\n if (edge.data?.kind !== 'mention' || !onMentionSelect) return;\n const source = pagesById.get(edge.source);\n const target = pagesById.get(edge.target);\n if (!source || !target) return;\n const box = containerRef.current?.getBoundingClientRect();\n onMentionSelect({\n source,\n target,\n point: { x: event.clientX - (box?.left ?? 0), y: event.clientY - (box?.top ?? 0) },\n pane: { width: box?.width ?? 0, height: box?.height ?? 0 },\n });\n }}\n >\n <Background variant={BackgroundVariant.Dots} gap={26} size={1.4} color=\"var(--border-strong)\" />\n <Controls showInteractive={false} showFitView={false}>\n <ControlButton onClick={() => fit(false, 300)} title=\"Fit view\" aria-label=\"Fit view\">\n <Maximize aria-hidden />\n </ControlButton>\n </Controls>\n </ReactFlow>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KnowledgePageGraph.cjs.js","names":["MarkerType","Layers","ArrowUpToLine","useState","useRef","useStore","isChildPlaceholder","isScopeGroup","childCountLabel","linkCountsText","chooseTooltipSide","Txt","_Fragment","KnowledgePageCard","Handle","Position","isRestCircle","fitWords","Fragment","Pin","BaseEdge","memo","useMemo","ReactFlowProvider","grantGraph","pageGraphEdges","graphShape","branchColors","toPageFlow","crowdScale","radialLayout","runLayout","pageNeighbourIds","pagePath","pageRef","useReactFlow","useLeavingNodes","prefersMotion","useCallback","fitViewport","fitAllViewport","nudgeAxis","fitDuration","ReactFlow","INITIAL_SETTLE_MS","Background","BackgroundVariant","Controls","ControlButton","Maximize"],"sources":["../../../../src/domains/knowledge/components/KnowledgePageGraph.tsx"],"sourcesContent":["import type { Edge, EdgeProps, NodeProps } from '@xyflow/react';\nimport {\n Background,\n BaseEdge,\n BackgroundVariant,\n ControlButton,\n Controls,\n getViewportForBounds,\n Handle,\n MarkerType,\n Position,\n ReactFlow,\n ReactFlowProvider,\n useReactFlow,\n useStore,\n} from '@xyflow/react';\nimport '@xyflow/react/dist/style.css';\nimport { ArrowUpToLine, Layers, Maximize, Pin } from 'lucide-react';\nimport { Fragment, memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\nimport { fitWords } from '../lib/circleText';\nimport { fitAllViewport, fitDuration, fitViewport, INITIAL_SETTLE_MS, nudgeAxis } from '../lib/fitViewport';\nimport {\n KNOWLEDGE_COUNTED_DOT_SIZE,\n KNOWLEDGE_DOT_HIT_MARGIN,\n KNOWLEDGE_DOT_SIZE,\n READABLE_MIN_ZOOM,\n branchColors,\n graphShape,\n crowdScale,\n isChildPlaceholder,\n isRestCircle,\n isScopeGroup,\n radialLayout,\n REST_BATCH,\n} from '../lib/graphShape';\nimport type { GraphLevel, GraphNodeForm } from '../lib/graphShape';\nimport { runLayout } from '../lib/layout';\nimport { linkCountsText } from '../lib/linkCountsText';\nimport { pagePath, pageRef } from '../lib/pageAddress';\nimport type { PageFlowEdge, PageFlowNode } from '../lib/pageGraph';\nimport { KNOWLEDGE_PAGE_SIZE, grantGraph, pageGraphEdges, pageNeighbourIds, toPageFlow } from '../lib/pageGraph';\nimport { childCountLabel } from '../lib/pageTree';\nimport { chooseTooltipSide } from '../lib/tooltipSide';\nimport type { Box, TooltipPlacementInput, TooltipSide } from '../lib/tooltipSide';\nimport { prefersMotion, useLeavingNodes } from '../lib/useLeavingNodes';\nimport type { KnowledgePageEdge, KnowledgePagePayload, KnowledgeScopeGrantPayload } from '../pageTypes';\nimport { KnowledgePageCard } from './KnowledgePageCard';\n\nimport { Txt } from '@/ds/components/Txt';\n\nimport './knowledge.css';\n\n// knowledge.css draws the border and the selection ring from this colour.\ntype CircleStyle = CSSProperties & { '--knowledge-color': string };\nconst SCOPE_STYLE: CircleStyle = {\n '--knowledge-color': 'var(--chart-blue)',\n background: 'color-mix(in oklab, var(--chart-blue) 16%, var(--card))',\n};\nconst PAGE_STYLE: CircleStyle = { '--knowledge-color': 'var(--border-strong)' };\n/** A farther page drawn as a named circle: the legend's \"Page in another branch\" dot grown, same solid grey fill, name in the page background colour to read on it. */\nconst FAR_FILL = 'var(--muted-foreground)';\nconst FAR_STYLE: CircleStyle = { '--knowledge-color': FAR_FILL, background: FAR_FILL };\n\nconst PARENT_EDGE_STYLE = {\n stroke: 'var(--foreground)',\n strokeOpacity: 0.45,\n strokeDasharray: '4 4',\n strokeWidth: 1.25,\n};\n// The line from the focused page's parent: solid cyan with a closed head, apart from every child's dashed grey one.\nconst UP_EDGE_COLOR = 'var(--chart-cyan)';\nconst UP_EDGE_STYLE = { stroke: UP_EDGE_COLOR, strokeWidth: 2.25 };\nconst UP_ARROW = { type: MarkerType.ArrowClosed, color: UP_EDGE_COLOR, width: 14, height: 14 };\nconst MENTION_EDGE_COLOR = 'var(--chart-blue)';\n// An open chevron in the dashed line's muted tone, at the child end: distinct from a mention's filled blue head.\nconst PARENT_ARROW_COLOR = 'var(--muted-foreground)';\nconst PARENT_ARROW = { type: MarkerType.Arrow, color: PARENT_ARROW_COLOR, width: 12, height: 12, strokeWidth: 1.5 };\n// Grants: purple dash-dot from the principal scope to the scope it reaches, so neither colour nor pattern\n// alone tells it apart from a parent or mention line.\nconst GRANT_EDGE_COLOR = 'var(--chart-purple)';\nconst GRANT_EDGE_STYLE = { stroke: GRANT_EDGE_COLOR, strokeWidth: 1.75, strokeDasharray: '8 3 2 3' };\nconst GRANT_ARROW = { type: MarkerType.ArrowClosed, color: GRANT_EDGE_COLOR, width: 13, height: 13 };\n// A declared principal with no scope page yet: same size as a scope, dashed outline, nothing to open.\n// Body links: a thin green line with a filled head, so a link written in a page reads apart from a note's\n// mention (blue, weighted by count) and from the dashed parent line.\nconst LINK_EDGE_COLOR = 'var(--chart-green)';\nconst LINK_EDGE_STYLE = { stroke: LINK_EDGE_COLOR, strokeWidth: 1.25 };\nconst LINK_ARROW = { type: MarkerType.ArrowClosed, color: LINK_EDGE_COLOR, width: 12, height: 12 };\n// Links of the selected page, by direction: green out of it, orange and dashed into it.\nconst DIRECTION_EDGE_STYLE = {\n out: { stroke: LINK_EDGE_COLOR },\n in: { stroke: 'var(--chart-orange)', strokeDasharray: '6 3' },\n} as const;\nconst DIRECTION_ARROW = {\n out: LINK_ARROW,\n in: { type: MarkerType.ArrowClosed, color: 'var(--chart-orange)', width: 12, height: 12 },\n};\n// A parent line out to a dot: thin and faint, with no head, so rings of dots don't turn into a thicket.\nconst DOT_PARENT_EDGE_STYLE = { stroke: 'var(--foreground)', strokeOpacity: 0.2, strokeWidth: 1 };\nconst PLACEHOLDER_STYLE = {\n background: 'var(--card)',\n borderColor: 'var(--chart-purple)',\n borderStyle: 'dashed',\n};\n\n/**\n * The pin badge sits on the circle's rim at its top-right (45°).\n */\nfunction pinBadgeStyle(size: number) {\n const badge = 20;\n const offset = (size / 2) * (1 - Math.SQRT1_2);\n return {\n badge,\n style: { width: badge, height: badge, top: offset, right: offset, transform: 'translate(50%, -50%)' },\n };\n}\n\ntype PageNodeData = PageFlowNode['data'] & {\n pinned: boolean;\n form: GraphNodeForm;\n /** A dot's colour: its branch around the focus. */\n color?: string;\n /** Child count on a page whose children aren't drawn yet, e.g. `281` or `1000+`. */\n badge?: string;\n /** Where the page sits, from its root scope down, for a dot's tooltip. */\n path: string;\n /** Links into and out of the page that aren't drawn. */\n hiddenLinks?: { in: number; out: number };\n /** Where a page is addressed, e.g. `org:acme#policies/refunds`, for a dot's tooltip. */\n ref?: string;\n /** All links into and out of the page, drawn or not, for a dot's tooltip. */\n links?: { in: number; out: number };\n /** Of `links`, how many go to pages the graph doesn't draw; only on the page under the pointer. */\n notShown?: number;\n /** Write the dot's links in and out inside it. */\n showCount?: boolean;\n /** A scope or an ancestor of the focus: a circle that says it sits above other pages. */\n level?: GraphLevel;\n /** The focused page's parent: its circle says so. */\n isParent?: boolean;\n /** A page the focus links to or from rather than one of its neighbours in the hierarchy: drawn faded. */\n far?: boolean;\n};\n\n/** How long a focus change loads before the graph says so. */\nconst LOADING_HINT_DELAY_MS = 150;\n/** How long it holds the old layout for pages that never arrive before drawing what it has. */\nconst LOADING_RELEASE_MS = 4000;\n\n/** Most a tooltip is enlarged to offset a zoomed-out graph. */\nconst TOOLTIP_MAX_SCALE = 3;\n\n/** Screen-space box of an element. */\nfunction boxOf(el: Element): Box {\n const { left, top, right, bottom } = el.getBoundingClientRect();\n return { left, top, right, bottom };\n}\n\n/** The highlighted lines of the graph as screen-space segments, where the browser can measure them. */\nfunction drawnLines(root: Element): TooltipPlacementInput['lines'] {\n const lines: Array<{ from: { x: number; y: number }; to: { x: number; y: number } }> = [];\n for (const path of root.querySelectorAll<SVGPathElement>('.react-flow__edge-path')) {\n if (typeof path.getTotalLength !== 'function' || typeof path.getScreenCTM !== 'function') continue;\n const matrix = path.getScreenCTM();\n if (!matrix) continue;\n const length = path.getTotalLength();\n const start = path.getPointAtLength(0);\n const end = path.getPointAtLength(length);\n lines.push({\n from: {\n x: matrix.a * start.x + matrix.c * start.y + matrix.e,\n y: matrix.b * start.x + matrix.d * start.y + matrix.f,\n },\n to: { x: matrix.a * end.x + matrix.c * end.y + matrix.e, y: matrix.b * end.x + matrix.d * end.y + matrix.f },\n });\n }\n return lines;\n}\n\n/** Where a tooltip sits against its dot, and which way it grows from it. */\nconst TOOLTIP_PLACEMENT: Record<TooltipSide, { tip: string; transform: string; origin: string; tail: string }> = {\n top: {\n tip: 'bottom-full left-1/2 mb-2',\n transform: 'translateX(-50%)',\n origin: 'bottom center',\n tail: 'top-full left-1/2 -translate-x-1/2 -translate-y-1/2 border-r border-b',\n },\n bottom: {\n tip: 'top-full left-1/2 mt-2',\n transform: 'translateX(-50%)',\n origin: 'top center',\n tail: 'bottom-full left-1/2 -translate-x-1/2 translate-y-1/2 border-l border-t',\n },\n right: {\n tip: 'left-full top-1/2 ml-2',\n transform: 'translateY(-50%)',\n origin: 'center left',\n tail: 'right-full top-1/2 translate-x-1/2 -translate-y-1/2 border-l border-b',\n },\n left: {\n tip: 'right-full top-1/2 mr-2',\n transform: 'translateY(-50%)',\n origin: 'center right',\n tail: 'left-full top-1/2 -translate-x-1/2 -translate-y-1/2 border-r border-t',\n },\n};\n\n/** The mark on a circle for a page that sits above others: layers for a scope, an up arrow for an ancestor page. */\nfunction LevelIcon({ level }: { level: GraphLevel }) {\n const Icon = level === 'scope' ? Layers : ArrowUpToLine;\n return (\n <Icon\n aria-hidden\n data-testid={`knowledge-level-icon-${level}`}\n className=\"mr-1 inline-block size-3 align-text-bottom\"\n />\n );\n}\n\n/** A page far from the focus: a small coloured dot that names itself on hover. */\nfunction DotNode({ data }: { data: PageNodeData }) {\n const { page, size, color, path, ref, links, notShown } = data;\n const [hover, setHover] = useState(false);\n const dotRef = useRef<HTMLDivElement>(null);\n const tipRef = useRef<HTMLDivElement>(null);\n const [side, setSide] = useState<TooltipSide>('top');\n // The graph is often zoomed far out; the tooltip is scaled back up so it stays as readable as the page.\n const zoom = useStore(state => state.transform[2]);\n const tipScale = Math.min(Math.max(1 / zoom, 1), TOOLTIP_MAX_SCALE);\n const standIn = isChildPlaceholder(page);\n const group = isScopeGroup(page);\n // A group's count is already in its name; what it needs to say is how to see its members.\n const hint = standIn ? 'Hover or click to load them' : group ? 'Click to show them' : null;\n const children =\n !hint && page.childCount ? `${childCountLabel(page)} ${page.childCount === 1 ? 'child' : 'children'}` : null;\n const kind = page.isScope ? (page.displayLabel ?? 'Scope') : 'Page';\n const linkText = links && (links.in > 0 || links.out > 0) ? linkCountsText(links, notShown) : null;\n const label = [page.name, hint ?? path, children, linkText].filter(Boolean).join(' · ');\n // Pick the side that covers the least: not another page or dot, not the highlighted lines, not the legend or Back.\n useLayoutEffect(() => {\n const dot = dotRef.current;\n const tip = tipRef.current;\n const graph = dot?.closest('.knowledge-graph');\n if (!hover || !dot || !tip || !graph) return;\n const dotBox = boxOf(dot);\n const tipBox = boxOf(tip);\n const scaledWidth = tip.offsetWidth * tipScale;\n const scaledHeight = tip.offsetHeight * tipScale;\n if (!scaledWidth || !scaledHeight) return;\n const obstacles = [\n ...graph.querySelectorAll('[data-testid=\"knowledge-page-node\"], [data-testid=\"knowledge-page-dot\"]'),\n ...(graph.parentElement ?? graph).querySelectorAll(\n '[aria-label=\"Legend\"], [data-testid=\"knowledge-graph-back\"], .react-flow__controls',\n ),\n ]\n .map(boxOf)\n .filter(\n box =>\n box.right > box.left &&\n !(box.left === tipBox.left && box.top === tipBox.top) &&\n !(box.left === dotBox.left && box.top === dotBox.top),\n );\n setSide(\n chooseTooltipSide({\n dot: dotBox,\n tip: { width: scaledWidth, height: scaledHeight },\n gap: 8,\n bounds: boxOf(graph),\n obstacles,\n lines: drawnLines(graph),\n }),\n );\n }, [hover, tipScale]);\n const placement = TOOLTIP_PLACEMENT[side];\n return (\n <div\n ref={dotRef}\n data-testid=\"knowledge-page-dot\"\n data-page-id={page.id}\n data-page-type={standIn ? 'stand-in' : group ? 'group' : page.isScope ? 'scope' : 'page'}\n aria-label={label}\n className=\"relative cursor-pointer transition-opacity\"\n style={{ width: size, height: size, opacity: standIn ? 0.5 : undefined }}\n onPointerEnter={() => setHover(true)}\n onPointerLeave={() => setHover(false)}\n >\n {/* A larger target than the dot itself, so a small dot is easy to hit; it is part of the dot, so hover and click land here too. */}\n <span\n aria-hidden\n data-testid=\"knowledge-dot-hit-area\"\n className=\"absolute rounded-full\"\n style={{ inset: -KNOWLEDGE_DOT_HIT_MARGIN }}\n />\n <div\n className=\"size-full rounded-full border\"\n style={{\n background: standIn ? 'transparent' : (color ?? 'var(--muted-foreground)'),\n borderColor: color ?? 'var(--muted-foreground)',\n borderStyle: standIn ? 'dashed' : 'solid',\n }}\n >\n {data.showCount && !standIn && !group && links && links.in + links.out > 0 ? (\n <Txt\n as=\"span\"\n variant=\"meta\"\n data-testid=\"knowledge-dot-count\"\n className=\"flex size-full items-center justify-center\"\n style={{ color: 'var(--background)' }}\n >\n {links.in + links.out}\n </Txt>\n ) : null}\n </div>\n {hover ? (\n <div\n role=\"tooltip\"\n ref={tipRef}\n data-side={side}\n className={`pointer-events-none absolute ${placement.tip} flex w-max max-w-72 flex-col rounded-md border border-border bg-card px-2 py-1 shadow-overlay`}\n style={{ transform: `${placement.transform} scale(${tipScale})`, transformOrigin: placement.origin }}\n >\n <span\n data-testid=\"knowledge-tooltip-tail\"\n aria-hidden\n className={`absolute size-2 rotate-45 border-border bg-card ${placement.tail}`}\n />\n {hint ? (\n <>\n <Txt as=\"span\" variant=\"label\" tone=\"ink\">\n {page.name}\n </Txt>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n {group ? `${path} · ${hint}` : hint}\n </Txt>\n </>\n ) : (\n <KnowledgePageCard\n name={page.name}\n kind={kind}\n pageRef={ref}\n path={path}\n childCount={page.childCount ? childCountLabel(page) : undefined}\n links={links}\n notShown={notShown}\n />\n )}\n </div>\n ) : null}\n <Handle type=\"target\" position={Position.Top} className=\"!invisible\" />\n <Handle type=\"source\" position={Position.Bottom} className=\"!invisible\" />\n </div>\n );\n}\n\n/** Below this a circle uses the small type and two lines of name. */\nconst COMPACT_CIRCLE_SIZE = 96;\n/** The share of a circle's width its text may use; a circle is narrower toward the top and bottom. */\nconst CIRCLE_TEXT_SHARE = 0.74;\n\n/** A scope or page: its kind on top, its name below, both inside the circle; far pages draw as dots. */\nfunction PageNodeComponent({ data }: NodeProps<PageFlowNode & { data: PageNodeData }>) {\n if (data.form === 'dot') return <DotNode data={data} />;\n const { page, size, selected, pinned, badge } = data;\n const group = isScopeGroup(page);\n const kind = page.isScope ? (page.displayLabel ?? 'Scope') : 'Page';\n const placeholder = isPlaceholder(page);\n const rest = isRestCircle(page);\n // A smaller circle gets smaller type and fewer lines, and the text keeps to the width of the circle's middle.\n const compact = size < COMPACT_CIRCLE_SIZE;\n const fit = Math.max(4, Math.floor((size * CIRCLE_TEXT_SHARE) / (compact ? 6.5 : 7.5)));\n return (\n <div\n data-testid=\"knowledge-page-node\"\n data-page-id={page.id}\n data-page-type={placeholder ? 'placeholder' : rest ? 'rest' : group ? 'group' : page.isScope ? 'scope' : 'page'}\n className={`relative transition-opacity ${placeholder ? 'cursor-default' : 'cursor-pointer'}`}\n style={{ width: size, height: size }}\n title={\n placeholder\n ? `${kind} · ${page.address} · nothing written to it yet`\n : rest\n ? `Show ${Math.min(REST_BATCH, page.childCount ?? REST_BATCH)} more of ${page.childCount ?? 'the rest'}`\n : group\n ? `${page.name}: click to show them`\n : page.isScope && page.address\n ? `${kind} · ${page.address}`\n : data.links && data.links.in + data.links.out > 0\n ? `${page.name} · ${linkCountsText(data.links, data.notShown)}`\n : page.name\n }\n >\n <div\n className={`knowledge-circle flex size-full flex-col items-center justify-center gap-0.5 overflow-hidden rounded-full border-2 text-center shadow-raised ${rest ? 'hover:border-foreground' : ''}`}\n data-selected={selected || undefined}\n data-far={data.far || undefined}\n style={{\n ...(placeholder || rest ? PLACEHOLDER_STYLE : data.far ? FAR_STYLE : page.isScope ? SCOPE_STYLE : PAGE_STYLE),\n paddingInline: size * ((1 - CIRCLE_TEXT_SHARE) / 2),\n }}\n >\n {data.far ? null : (\n <Txt\n as=\"span\"\n variant=\"meta\"\n tone={page.isScope ? undefined : 'muted'}\n className=\"pointer-events-none inline-flex max-w-full items-center justify-center gap-1 whitespace-nowrap uppercase\"\n style={page.isScope ? { color: 'var(--chart-blue)' } : undefined}\n data-testid={page.isScope ? 'knowledge-scope-caption' : 'knowledge-page-caption'}\n >\n {data.level ? <LevelIcon level={data.level} /> : null}\n <span className=\"truncate\">{rest ? 'More' : data.isParent ? 'Parent' : kind}</span>\n </Txt>\n )}\n <Txt\n as=\"span\"\n variant={compact ? 'meta' : 'label'}\n tone=\"ink\"\n className={`pointer-events-none max-w-full overflow-hidden [overflow-wrap:normal] ${compact ? 'line-clamp-2' : 'line-clamp-3'}`}\n style={data.far ? { color: 'var(--background)' } : undefined}\n data-testid=\"knowledge-circle-name\"\n >\n {page.isScope && page.address && !group ? (\n <BreakAtColons text={fitWords(page.address, fit)} />\n ) : (\n fitWords(page.name, fit)\n )}\n </Txt>\n </div>\n {pinned ? <PinBadge size={size} /> : null}\n {data.hiddenLinks && (data.hiddenLinks.in > 0 || data.hiddenLinks.out > 0) ? (\n <span\n data-testid=\"knowledge-hidden-links\"\n title={linkCountsText(data.hiddenLinks)}\n aria-label={linkCountsText(data.hiddenLinks)}\n className=\"absolute bottom-full left-1/2 -mb-1 flex -translate-x-1/2 gap-1 rounded-full border border-border bg-card px-1.5 shadow-raised\"\n >\n {data.hiddenLinks.in > 0 ? (\n <Txt as=\"span\" variant=\"meta\" style={{ color: 'var(--chart-orange)' }}>\n →{data.hiddenLinks.in}\n </Txt>\n ) : null}\n {data.hiddenLinks.out > 0 ? (\n <Txt as=\"span\" variant=\"meta\" style={{ color: LINK_EDGE_COLOR }}>\n {data.hiddenLinks.out}→\n </Txt>\n ) : null}\n </span>\n ) : null}\n {badge ? (\n <span\n data-testid=\"knowledge-child-count-badge\"\n aria-label={`${badge} children, not all drawn`}\n className=\"absolute top-full left-1/2 -mt-1 -translate-x-1/2 rounded-full border border-border bg-card px-1.5 shadow-raised\"\n >\n <Txt as=\"span\" variant=\"meta\" tone=\"ink\">\n {badge}\n </Txt>\n </span>\n ) : null}\n <Handle type=\"target\" position={Position.Top} className=\"!invisible\" />\n <Handle type=\"source\" position={Position.Bottom} className=\"!invisible\" />\n </div>\n );\n}\n\nfunction isPlaceholder(page: KnowledgePagePayload): boolean {\n return page.id.startsWith('unplaced:');\n}\n\n/** Lets a scope address like `role:acme:admin` wrap after a colon instead of mid-word. */\nfunction BreakAtColons({ text }: { text: string }) {\n const parts = text.split(':');\n return (\n <>\n {parts.map((part, index) => (\n <Fragment key={index}>\n {part}\n {index < parts.length - 1 ? (\n <>\n :<wbr />\n </>\n ) : null}\n </Fragment>\n ))}\n </>\n );\n}\n\nfunction PinBadge({ size }: { size: number }) {\n const { badge, style } = pinBadgeStyle(size);\n return (\n <span\n data-testid=\"knowledge-pin-badge\"\n className=\"absolute flex items-center justify-center rounded-full bg-badge-amber-strong text-badge-amber-foreground shadow-raised\"\n style={style}\n aria-label=\"Pinned\"\n >\n <Pin size={Math.round(badge * 0.6)} aria-hidden />\n </span>\n );\n}\n\n/** A colour the legend explains: the circle the dots of that colour hang under. */\ninterface LegendBranch {\n id: string;\n name: string;\n color: string;\n scope: boolean;\n}\n\ntype RimEdgeData = PageFlowEdge['data'] & { from: Circle; to: Circle };\ninterface Circle {\n x: number;\n y: number;\n r: number;\n}\n\n/** A straight line from one circle's rim to the other's, so lines never loop or hide behind circles. */\nfunction rimToRim(from: Circle, to: Circle, gap = 3) {\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n const length = Math.hypot(dx, dy) || 1;\n const ux = dx / length;\n const uy = dy / length;\n return {\n x1: from.x + ux * (from.r + gap),\n y1: from.y + uy * (from.r + gap),\n x2: to.x - ux * (to.r + gap),\n y2: to.y - uy * (to.r + gap),\n };\n}\n\nfunction RimEdgeComponent({ id, data, style, markerEnd }: EdgeProps<Edge<RimEdgeData>>) {\n if (!data) return null;\n const { x1, y1, x2, y2 } = rimToRim(data.from, data.to);\n const mention = data.kind === 'mention';\n const path = `M ${x1} ${y1} L ${x2} ${y2}`;\n return (\n <>\n <BaseEdge id={id} path={path} style={style} markerEnd={markerEnd} interactionWidth={mention ? 20 : 0} />\n {data.kind === 'grant' && data.role ? (\n // A wide invisible path over the line, so hovering it names the access level.\n <path\n d={path}\n fill=\"none\"\n stroke=\"transparent\"\n strokeWidth={14}\n data-testid=\"knowledge-grant-edge\"\n data-role={data.role}\n aria-label={`Grants ${data.role}`}\n >\n <title>{`Grants ${data.role}`}</title>\n </path>\n ) : null}\n </>\n );\n}\n\nconst edgeTypes = { rim: memo(RimEdgeComponent) };\n\nconst nodeTypes = { page: memo(PageNodeComponent) };\n\n/** The box around laid-out circles, in graph coordinates; `null` when there are none. */\nfunction graphBounds(nodes: Array<{ position: { x: number; y: number }; width?: number; height?: number }>) {\n if (nodes.length === 0) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const node of nodes) {\n minX = Math.min(minX, node.position.x);\n minY = Math.min(minY, node.position.y);\n maxX = Math.max(maxX, node.position.x + (node.width ?? 0));\n maxY = Math.max(maxY, node.position.y + (node.height ?? 0));\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nconst LEGEND_SWATCH = 'knowledge-circle inline-block size-3 shrink-0 rounded-full border-2';\n\n/** The line styles the graph draws, which its legend names. */\ntype EdgeStyleKey = 'out' | 'in' | 'mention' | 'link' | 'grant' | 'dot-parent' | 'parent' | 'up';\n\n/** What the circles, lines and badge mean. */\nfunction GraphLegend({\n drawn,\n counts,\n dots,\n linkEnds,\n focused,\n levels,\n branches,\n}: {\n /** The line styles on screen right now; the legend explains those and only those. */\n drawn: ReadonlySet<EdgeStyleKey>;\n /** Some circle carries an in/out link badge. */\n counts: boolean;\n dots: boolean;\n /** Link ends drawn as circles in the farther-page grey. */\n linkEnds: boolean;\n /** A page is focused, drawn larger and ringed at the centre. */\n focused: boolean;\n /** Which kinds of higher-level circle are drawn, to explain their icons. */\n levels: GraphLevel[];\n /** The branches dots are coloured by, each named for the circle it hangs under. */\n branches: LegendBranch[];\n}) {\n return (\n <ul\n aria-label=\"Legend\"\n className=\"pointer-events-none absolute top-2 left-2 z-10 flex flex-col gap-1 rounded-md border border-border bg-card/90 px-2 py-1.5 shadow-raised\"\n >\n <li className=\"flex items-center gap-2\">\n <span className={LEGEND_SWATCH} style={{ ...SCOPE_STYLE }} aria-hidden />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Scope\n </Txt>\n </li>\n {levels.includes('scope') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-level-scope\">\n <Layers aria-hidden className=\"size-3 shrink-0 text-muted-foreground\" />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Scope, above its pages\n </Txt>\n </li>\n ) : null}\n {levels.includes('ancestor') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-level-ancestor\">\n <ArrowUpToLine aria-hidden className=\"size-3 shrink-0 text-muted-foreground\" />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Page above the focus\n </Txt>\n </li>\n ) : null}\n <li className=\"flex items-center gap-2\">\n <span className={LEGEND_SWATCH} style={{ ...PAGE_STYLE }} aria-hidden />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Page\n </Txt>\n </li>\n {focused ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-focused\">\n <span\n className={LEGEND_SWATCH}\n style={{ ...PAGE_STYLE, outline: '2px solid var(--knowledge-color)', outlineOffset: 2, borderWidth: 3 }}\n aria-hidden\n />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Focused page\n </Txt>\n </li>\n ) : null}\n {dots || linkEnds ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-dot\">\n <span className=\"inline-block size-2 shrink-0 rounded-full bg-muted-foreground\" aria-hidden />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Page in another branch\n </Txt>\n </li>\n ) : null}\n {/* One parent group reads generically; several would look identical, so each row names its parent. */}\n {branches.slice(0, LEGEND_BRANCH_CAP).map(branch => (\n <li key={branch.id} className=\"flex items-center gap-2 pl-0.5\" data-testid=\"knowledge-legend-branch\">\n <span\n className=\"inline-block size-2 shrink-0 rounded-full\"\n style={{ background: branch.color }}\n aria-hidden\n />\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\" className=\"max-w-40 truncate\" title={branch.name}>\n {branches.length > 1 ? `Under ${branch.name}` : branch.scope ? 'Under parent scope' : 'Under parent page'}\n </Txt>\n </li>\n ))}\n {branches.length > LEGEND_BRANCH_CAP ? (\n <li className=\"pl-0.5\">\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n +{branches.length - LEGEND_BRANCH_CAP} more branches\n </Txt>\n </li>\n ) : null}\n {drawn.has('out') || drawn.has('in') ? (\n <>\n {drawn.has('out') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-out\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\">\n <line x1=\"0\" y1=\"4\" x2=\"12\" y2=\"4\" stroke={LINK_EDGE_COLOR} strokeWidth=\"1.5\" />\n <polygon points=\"11,1 16,4 11,7\" fill={LINK_EDGE_COLOR} />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Links out of the selected page\n </Txt>\n </li>\n ) : null}\n {drawn.has('in') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-in\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\">\n <line\n x1=\"0\"\n y1=\"4\"\n x2=\"12\"\n y2=\"4\"\n stroke=\"var(--chart-orange)\"\n strokeWidth=\"1.5\"\n strokeDasharray=\"3 2\"\n />\n <polygon points=\"11,1 16,4 11,7\" fill=\"var(--chart-orange)\" />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Links into it\n </Txt>\n </li>\n ) : null}\n </>\n ) : null}\n {drawn.has('mention') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-mention\">\n <svg width=\"12\" height=\"4\" aria-hidden className=\"shrink-0\">\n <line x1=\"0\" y1=\"2\" x2=\"12\" y2=\"2\" stroke={MENTION_EDGE_COLOR} strokeWidth=\"2\" />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Mentioned in notes\n </Txt>\n </li>\n ) : null}\n {drawn.has('link') ? (\n <li className=\"flex items-center gap-2\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\" data-testid=\"knowledge-legend-link\">\n <line x1=\"0\" y1=\"4\" x2=\"12\" y2=\"4\" {...LINK_EDGE_STYLE} />\n <polygon points=\"11,1 16,4 11,7\" fill={LINK_EDGE_COLOR} />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Linked in page body\n </Txt>\n </li>\n ) : null}\n {drawn.has('dot-parent') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-dot-parent\">\n <svg width=\"16\" height=\"4\" aria-hidden className=\"shrink-0\">\n <line x1=\"0\" y1=\"2\" x2=\"16\" y2=\"2\" {...DOT_PARENT_EDGE_STYLE} strokeOpacity={0.5} />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Child page (dot)\n </Txt>\n </li>\n ) : null}\n {drawn.has('up') ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-up\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\">\n <line x1=\"0\" y1=\"4\" x2=\"12\" y2=\"4\" {...UP_EDGE_STYLE} />\n <polygon points=\"9,1 15,4 9,7\" fill={UP_EDGE_COLOR} />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Parent of the focused page\n </Txt>\n </li>\n ) : null}\n {drawn.has('parent') ? (\n <li className=\"flex items-center gap-2\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\" data-testid=\"knowledge-legend-parent-arrow\">\n <line x1=\"0\" y1=\"4\" x2=\"14\" y2=\"4\" {...PARENT_EDGE_STYLE} strokeDasharray=\"3 2\" />\n <polyline\n points=\"10,1 14,4 10,7\"\n fill=\"none\"\n stroke={PARENT_ARROW_COLOR}\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Parent → child\n </Txt>\n </li>\n ) : null}\n {counts ? (\n <li className=\"flex items-center gap-2\" data-testid=\"knowledge-legend-link-counts\">\n <Txt as=\"span\" variant=\"meta\" style={{ color: 'var(--chart-orange)' }}>\n →4\n </Txt>\n <Txt as=\"span\" variant=\"meta\" style={{ color: LINK_EDGE_COLOR }}>\n 14→\n </Txt>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Links in, links out (not drawn)\n </Txt>\n </li>\n ) : null}\n {drawn.has('grant') ? (\n <li className=\"flex items-center gap-2\">\n <svg width=\"16\" height=\"8\" aria-hidden className=\"shrink-0\" data-testid=\"knowledge-legend-grant\">\n <line x1=\"0\" y1=\"4\" x2=\"12\" y2=\"4\" {...GRANT_EDGE_STYLE} strokeDasharray=\"4 2 1 2\" strokeWidth=\"1.5\" />\n <polygon points=\"11,1 16,4 11,7\" fill={GRANT_EDGE_COLOR} />\n </svg>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Grants access (hover for role)\n </Txt>\n </li>\n ) : null}\n <li className=\"flex items-center gap-2\">\n <span\n className=\"flex size-3 shrink-0 items-center justify-center rounded-full bg-badge-amber-strong text-badge-amber-foreground\"\n aria-hidden\n >\n <Pin size={8} />\n </span>\n <Txt as=\"span\" variant=\"meta\" tone=\"muted\">\n Pinned\n </Txt>\n </li>\n </ul>\n );\n}\n\n/** How far the pointer may move between press and release and still count as a click, not a pan. */\nconst CLICK_SLOP_PX = 4;\n/** Marks the nodes and lines that stay lit while the rest of the graph fades (see knowledge.css). */\nconst NEIGHBOUR_CLASS = 'knowledge-neighbour';\n\n/**\n * The same edge objects while their content is unchanged. Pointing at a page changes the style of the\n * few lines touching it; handing React Flow fresh objects for every line would redraw them all.\n */\nfunction useStableEdges<E extends Edge>(edges: E[]): E[] {\n const seen = useRef(new Map<string, { sig: string; edge: E }>());\n return useMemo(() => {\n const next = new Map<string, { sig: string; edge: E }>();\n const result = edges.map(edge => {\n const sig = JSON.stringify(edge);\n const before = seen.current.get(edge.id);\n const entry = before && before.sig === sig ? before : { sig, edge };\n next.set(edge.id, entry);\n return entry.edge;\n });\n seen.current = next;\n return result;\n }, [edges]);\n}\n\n/** The focused page's circle is this much larger than its neighbours'. */\nconst FOCUSED_SCALE = 1.2;\n/** Pages in other branches that the focus links to draw a little smaller than its own neighbours. */\nconst LINK_END_SCALE = 0.8;\n/** Most branch colours the legend names; the rest are counted. */\nconst LEGEND_BRANCH_CAP = 4;\n/** Most links a hovered page draws that aren't drawn already. */\nconst HOVER_LINK_CAP = 40;\n\nexport interface KnowledgePageGraphProps {\n pages: KnowledgePagePayload[];\n /** Mention and body-link edges between pages; parent edges are derived from `pages`. */\n edges: KnowledgePageEdge[];\n pinnedIds?: readonly string[];\n /** Access grants between scopes, drawn from each principal scope to the scope it reaches. */\n grants?: readonly KnowledgeScopeGrantPayload[];\n selectedPageId?: string | null;\n /** The page the layout centres on when none is selected, drawn like a focused page without the ring. */\n centerId?: string | null;\n /** Per page, links into and out of it that the graph doesn't draw; shown as `→in out→` on full circles. */\n hiddenLinks?: ReadonlyMap<string, { in: number; out: number }>;\n /** Every link between pages, drawn or not: hovering a page draws its own, and tooltips count them. */\n knownLinks?: readonly KnowledgePageEdge[];\n /** Pages the focus links to or from that the hierarchy doesn't reach: drawn close around the focus. */\n nearIds?: ReadonlySet<string>;\n /** False while the pages the selected page needs are loading: the graph keeps its last layout until they are in. */\n settled?: boolean;\n /** Exact links into and out of pages, from the store; they replace the counts taken from `knownLinks`. */\n exactLinkCounts?: ReadonlyMap<string, { in: number; out: number }>;\n /** Links fetched for the page under the pointer: drawn on hover, never counted or laid out. */\n fetchedLinks?: readonly KnowledgePageEdge[];\n /** The page under the pointer, or null: a host can fetch that page's links. */\n onHover?: (pageId: string | null) => void;\n /** Write each dot's total of links in and out inside it. */\n showCounts?: boolean;\n /** The pointer rests on a dot or stand-in: a host can load what it stands for. */\n onPreview?: (page: KnowledgePagePayload) => void;\n /** A page that wasn't selected was clicked, tapped, or activated with Enter or Space: select it. */\n onSelect: (page: KnowledgePagePayload) => void;\n /** The already-selected page was clicked, tapped, or activated again: open it. Without it, that only reselects. */\n onOpen?: (page: KnowledgePagePayload) => void;\n /** Empty canvas was clicked without moving the pointer (a pan doesn't count): clear the selection. */\n onClearSelection?: () => void;\n /** A mention line was clicked: notes on `source` mention `target`. `point` is where, in the graph's own box. */\n onMentionSelect?: (mention: {\n source: KnowledgePagePayload;\n target: KnowledgePagePayload;\n point: { x: number; y: number };\n /** The graph's own size, so a popup can open on whichever side of `point` has room. */\n pane: { width: number; height: number };\n }) => void;\n}\n\n/**\n * The schema-4 Knowledge page graph: scopes and pages as circles sized by how often they are mentioned,\n * parent links as faint edges and mentions as solid ones. The first layout is deterministic for the same pages; later updates start from where pages already sit.\n */\nexport function KnowledgePageGraph(props: KnowledgePageGraphProps) {\n const { settled = true } = props;\n // While the pages a new focus needs are still loading, the graph keeps showing what it had: laying out\n // the new focus on old data would animate to the wrong place and then jump when the data landed. The\n // views change once, from the old layout to the new, when the data is in.\n const held = useRef(props);\n // A request that never answers must not pin the graph to the old view: past a deadline it draws what it has.\n const [released, setReleased] = useState(false);\n const holding = !settled && !released;\n if (!holding) held.current = props;\n const shown = !holding\n ? props\n : {\n ...props,\n pages: held.current.pages,\n edges: held.current.edges,\n pinnedIds: held.current.pinnedIds,\n grants: held.current.grants,\n selectedPageId: held.current.selectedPageId,\n centerId: held.current.centerId,\n hiddenLinks: held.current.hiddenLinks,\n knownLinks: held.current.knownLinks,\n nearIds: held.current.nearIds,\n };\n const [slow, setSlow] = useState(false);\n useEffect(() => {\n if (settled) {\n setSlow(false);\n setReleased(false);\n return;\n }\n const hint = setTimeout(() => setSlow(true), LOADING_HINT_DELAY_MS);\n const deadline = setTimeout(() => setReleased(true), LOADING_RELEASE_MS);\n return () => {\n clearTimeout(hint);\n clearTimeout(deadline);\n };\n }, [settled, props.selectedPageId]);\n return (\n <ReactFlowProvider>\n <KnowledgePageGraphInner {...shown} />\n {slow && holding ? (\n <p\n role=\"status\"\n data-testid=\"knowledge-graph-loading\"\n className=\"text-ui-sm pointer-events-none absolute bottom-3 left-1/2 z-10 -translate-x-1/2 rounded border border-border bg-card px-3 py-1 text-muted-foreground shadow-overlay\"\n >\n Loading pages…\n </p>\n ) : null}\n </ReactFlowProvider>\n );\n}\n\nfunction KnowledgePageGraphInner({\n pages,\n edges,\n pinnedIds = [],\n grants,\n selectedPageId,\n centerId,\n hiddenLinks,\n knownLinks,\n nearIds,\n exactLinkCounts,\n fetchedLinks,\n onHover,\n showCounts,\n onPreview,\n onSelect,\n onOpen,\n onClearSelection,\n onMentionSelect,\n}: KnowledgePageGraphProps) {\n // Grants add placeholder circles for declared principals with no scope page yet, and their own lines.\n const { graphPages, allEdges } = useMemo(() => {\n const granted = grantGraph(pages, grants);\n const withPlaceholders = granted.placeholders.length ? [...pages, ...granted.placeholders] : pages;\n return { graphPages: withPlaceholders, allEdges: [...pageGraphEdges(pages, edges), ...granted.edges] };\n }, [pages, edges, grants]);\n const linkSource = knownLinks ?? edges;\n // Counts size the dots, so they feed the layout: they come from what is loaded and the store's counts,\n // never from links fetched for a hover, or every hover would lay the whole graph out again.\n const linkCounts = useMemo(() => {\n const counts = new Map<string, { in: number; out: number }>();\n const pairs = new Set<string>();\n for (const edge of linkSource) {\n if (edge.kind !== 'mention' && edge.kind !== 'link') continue;\n if (edge.source === edge.target || pairs.has(`${edge.source}\\u0000${edge.target}`)) continue;\n pairs.add(`${edge.source}\\u0000${edge.target}`);\n const out = counts.get(edge.source) ?? { in: 0, out: 0 };\n out.out++;\n counts.set(edge.source, out);\n const into = counts.get(edge.target) ?? { in: 0, out: 0 };\n into.in++;\n counts.set(edge.target, into);\n }\n // Counts from the store cover pages whose links go to pages that were never loaded.\n for (const [id, exact] of exactLinkCounts ?? []) counts.set(id, exact);\n return counts;\n }, [linkSource, exactLinkCounts]);\n // Page id -> its links, built once when links load; a hover is a lookup, not a scan of every link.\n const hoverLinks = useMemo(() => {\n const touching = new Map<string, KnowledgePageEdge[]>();\n const add = (id: string, edge: KnowledgePageEdge) => {\n const list = touching.get(id);\n if (list) list.push(edge);\n else touching.set(id, [edge]);\n };\n for (const edge of [...linkSource, ...(fetchedLinks ?? [])]) {\n if (edge.kind !== 'mention' && edge.kind !== 'link') continue;\n add(edge.source, edge);\n if (edge.target !== edge.source) add(edge.target, edge);\n }\n return touching;\n }, [linkSource, fetchedLinks]);\n // The focused page sits at the centre with its parent and children around it as full circles; pages\n // farther out are dots on outer rings, inside their branch's slice. A last overlap pass is the only force.\n const laidOut = useMemo(() => {\n const shape = graphShape(graphPages, selectedPageId ?? centerId ?? null, nearIds);\n const colors = branchColors(graphPages, shape);\n const flow = toPageFlow(graphPages, allEdges);\n for (const node of flow.nodes) {\n // With counts on, only a dot that has a count grows to fit it; the rest stay small, so linked pages stand out.\n if (shape.form.get(node.id) === 'dot') {\n const links = linkCounts.get(node.id);\n const counted = showCounts && !isChildPlaceholder(node.data.page) && !!links && links.in + links.out > 0;\n node.data.size = counted ? KNOWLEDGE_COUNTED_DOT_SIZE : KNOWLEDGE_DOT_SIZE;\n } else if (node.id === shape.center) node.data.size = Math.round(node.data.size * FOCUSED_SCALE);\n // Circles at one level share a size, scopes included, so the ring reads evenly.\n else node.data.size = Math.round(KNOWLEDGE_PAGE_SIZE * (shape.linked.has(node.id) ? LINK_END_SCALE : 1));\n }\n // A page with dozens of children draws them smaller, so the ring stays a size that can be read and fitted.\n const ring = flow.nodes.filter(node => shape.depth.get(node.id) === 1 && shape.form.get(node.id) === 'full');\n const crowd = crowdScale(ring.length);\n if (crowd < 1) for (const node of ring) node.data.size = Math.round(node.data.size * crowd);\n const sizes = new Map(flow.nodes.map(node => [node.id, node.data.size]));\n const radial = radialLayout(graphPages, shape, page => sizes.get(page.id) ?? KNOWLEDGE_DOT_SIZE, nearIds);\n const positions = runLayout(\n flow.nodes.map(node => ({\n id: node.id,\n size: node.data.size,\n padding: shape.form.get(node.id) === 'dot' ? 4 : 24,\n initial: radial.get(node.id),\n })),\n [],\n { ticks: 0 },\n );\n return { nodes: flow.nodes, edges: flow.edges, positions, shape, colors };\n }, [graphPages, allEdges, selectedPageId, centerId, linkCounts, showCounts, nearIds]);\n const pageById = useMemo(() => new Map(graphPages.map(page => [page.id, page])), [graphPages]);\n // The page above whatever the graph is centred on, if it is drawn.\n const focusParentId = useMemo(() => {\n const parentId = laidOut.shape.center ? pageById.get(laidOut.shape.center)?.parentId : undefined;\n return parentId && laidOut.positions.has(parentId) ? parentId : null;\n }, [laidOut, pageById]);\n const drawnLevels = useMemo(() => {\n const kinds = new Set<GraphLevel>();\n for (const [id, level] of laidOut.shape.level) if (laidOut.shape.form.get(id) === 'full') kinds.add(level);\n return [...kinds];\n }, [laidOut]);\n // Each dot takes its branch's colour; the legend says which circle each colour hangs under.\n const dotBranches = useMemo(() => {\n const seen = new Map<string, LegendBranch>();\n for (const node of laidOut.nodes) {\n if (laidOut.shape.form.get(node.id) !== 'dot' || isChildPlaceholder(node.data.page)) continue;\n const branch = laidOut.shape.branch.get(node.id);\n const color = branch ? laidOut.colors.get(branch) : undefined;\n const owner = branch ? pageById.get(branch) : undefined;\n if (branch && color && owner && !seen.has(branch))\n seen.set(branch, { id: branch, name: owner.displayLabel ?? owner.name, color, scope: !!owner.isScope });\n }\n return [...seen.values()];\n }, [laidOut, pageById]);\n\n const pinned = useMemo(() => new Set(pinnedIds), [pinnedIds]);\n // Pages with children none of which is drawn yet (stand-ins don't count) carry their child count.\n // A circle counts its children whenever some of them are not drawn, as the tree does, so a parent\n // with 281 pages says so even with its first few laid around it.\n const childrenUndrawn = useMemo(() => {\n const drawn = new Map<string, number>();\n for (const page of graphPages) {\n if (page.parentId && !isChildPlaceholder(page) && !isRestCircle(page))\n drawn.set(page.parentId, (drawn.get(page.parentId) ?? 0) + 1);\n }\n return new Set(\n graphPages\n .filter(\n page =>\n !isScopeGroup(page) &&\n !isRestCircle(page) &&\n (page.childCountCapped || (page.childCount ?? 0) > (drawn.get(page.id) ?? 0)),\n )\n .map(page => page.id),\n );\n }, [graphPages]);\n // The page under the pointer, if any: its own lines show and the rest of the graph fades.\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n useEffect(() => onHover?.(hoveredId), [hoveredId, onHover]);\n // A hovered page's links to pages that are drawn but whose lines aren't, up to a cap.\n const hoverExtra = useMemo(() => {\n if (!hoveredId) return [];\n const drawnIds = new Set(laidOut.nodes.map(node => node.id));\n const have = new Set(laidOut.edges.map(edge => edge.id));\n const extra: PageFlowEdge[] = [];\n for (const edge of hoverLinks.get(hoveredId) ?? []) {\n const id = `${edge.kind}:${edge.source}->${edge.target}`;\n if (have.has(id) || !drawnIds.has(edge.source) || !drawnIds.has(edge.target)) continue;\n have.add(id);\n extra.push({ id, source: edge.source, target: edge.target, data: { kind: edge.kind, count: edge.count ?? 1 } });\n if (extra.length >= HOVER_LINK_CAP) break;\n }\n return extra;\n }, [hoveredId, hoverLinks, laidOut]);\n // Of the hovered page's links, those with no line drawn: the other end is off screen, or past the cap.\n const hoveredNotShown = useMemo(() => {\n const total = hoveredId ? linkCounts.get(hoveredId) : undefined;\n if (!hoveredId || !total) return 0;\n const pairs = new Set<string>();\n for (const edge of [...laidOut.edges, ...hoverExtra]) {\n const kind = edge.data?.kind;\n if ((kind !== 'mention' && kind !== 'link') || (edge.source !== hoveredId && edge.target !== hoveredId)) continue;\n pairs.add(`${edge.source}\\u0000${edge.target}`);\n }\n return Math.max(0, total.in + total.out - pairs.size);\n }, [hoveredId, linkCounts, laidOut, hoverExtra]);\n const emphasisId = hoveredId && laidOut.positions.has(hoveredId) ? hoveredId : (selectedPageId ?? null);\n // With a page selected or hovered, everything more than one line away fades so its neighbourhood reads at a glance.\n const neighbours = useMemo(\n () =>\n emphasisId && laidOut.positions.has(emphasisId)\n ? pageNeighbourIds(emphasisId, [\n ...allEdges,\n ...hoverExtra.map(edge => ({ kind: edge.data?.kind ?? 'link', source: edge.source, target: edge.target })),\n ] as KnowledgePageEdge[])\n : null,\n [emphasisId, laidOut, allEdges, hoverExtra],\n );\n // Each circle's size is known from the layout, so hand it to React Flow as the node's fixed size. Left to\n // React Flow's own DOM measurement, a production Studio sometimes never got one and every node stayed\n // `visibility: hidden`.\n const nodes = useMemo(\n () =>\n laidOut.nodes.map(node => {\n const center = laidOut.positions.get(node.id) ?? { x: 0, y: 0 };\n return {\n ...node,\n width: node.data.size,\n height: node.data.size,\n // Declared handles (where the hidden ones sit in PageNodeComponent) let lines draw without React\n // Flow measuring the node in the DOM, for the same reason as the fixed size above.\n handles: [\n { type: 'target' as const, position: Position.Top, x: node.data.size / 2, y: 0, width: 1, height: 1 },\n {\n type: 'source' as const,\n position: Position.Bottom,\n x: node.data.size / 2,\n y: node.data.size,\n width: 1,\n height: 1,\n },\n ],\n position: { x: center.x - node.data.size / 2, y: center.y - node.data.size / 2 },\n data: {\n ...node.data,\n selected: node.id === selectedPageId,\n pinned: pinned.has(node.id),\n form: laidOut.shape.form.get(node.id) ?? 'full',\n color: laidOut.colors.get(laidOut.shape.branch.get(node.id) ?? ''),\n badge: childrenUndrawn.has(node.id) ? childCountLabel(node.data.page) : undefined,\n path: pagePath(node.data.page, pageById),\n hiddenLinks: laidOut.shape.form.get(node.id) === 'full' ? hiddenLinks?.get(node.id) : undefined,\n ref: pageRef(node.data.page, pageById),\n links: linkCounts.get(node.id),\n showCount: showCounts,\n level: laidOut.shape.form.get(node.id) === 'full' ? laidOut.shape.level.get(node.id) : undefined,\n isParent: node.id === focusParentId,\n far: laidOut.shape.linked.has(node.id) || undefined,\n },\n };\n }),\n [laidOut, selectedPageId, pinned, childrenUndrawn, pageById, hiddenLinks, linkCounts, showCounts, focusParentId],\n );\n const { flowEdges: builtEdges, drawnEdgeStyles } = useMemo(() => {\n const drawn = new Set<EdgeStyleKey>();\n const sizes = new Map(laidOut.nodes.map(node => [node.id, node.data.size]));\n const circle = (id: string): Circle => {\n const center = laidOut.positions.get(id) ?? { x: 0, y: 0 };\n return { ...center, r: (sizes.get(id) ?? 0) / 2 };\n };\n const flowEdges = [...laidOut.edges, ...hoverExtra].map((edge): Edge<RimEdgeData> => {\n const mention = edge.data?.kind === 'mention';\n const grant = edge.data?.kind === 'grant';\n const link = edge.data?.kind === 'link';\n const toDot = laidOut.shape.form.get(edge.target) === 'dot';\n // A link touching the selected page reads by direction: out of it or into it.\n const direction =\n (mention || link) && emphasisId\n ? edge.source === emphasisId\n ? 'out'\n : edge.target === emphasisId\n ? 'in'\n : undefined\n : undefined;\n const up = !mention && !grant && !link && edge.source === focusParentId && edge.target === laidOut.shape.center;\n drawn.add(\n direction ??\n (up ? 'up' : mention ? 'mention' : grant ? 'grant' : link ? 'link' : toDot ? 'dot-parent' : 'parent'),\n );\n return {\n ...edge,\n type: 'rim',\n data: {\n kind: edge.data?.kind ?? 'parent',\n count: edge.data?.count ?? 1,\n ...(edge.data?.role ? { role: edge.data.role } : {}),\n from: circle(edge.source),\n to: circle(edge.target),\n },\n // Into the focus is dashed: drawn over the solid way out, so the green shows between the dashes.\n ...(direction === 'in' ? { zIndex: 1 } : {}),\n ...(mention && onMentionSelect ? { className: 'cursor-pointer' } : {}),\n style: direction\n ? { ...DIRECTION_EDGE_STYLE[direction], strokeWidth: mention ? 2 : 1.5 }\n : mention\n ? { stroke: MENTION_EDGE_COLOR, strokeWidth: Math.min(1.5 + (edge.data?.count ?? 1) * 0.5, 4) }\n : up\n ? UP_EDGE_STYLE\n : grant\n ? GRANT_EDGE_STYLE\n : link\n ? LINK_EDGE_STYLE\n : toDot\n ? DOT_PARENT_EDGE_STYLE\n : PARENT_EDGE_STYLE,\n markerEnd: direction\n ? DIRECTION_ARROW[direction]\n : up\n ? UP_ARROW\n : mention\n ? { type: MarkerType.ArrowClosed, color: MENTION_EDGE_COLOR, width: 14, height: 14 }\n : grant\n ? GRANT_ARROW\n : link\n ? LINK_ARROW\n : toDot\n ? undefined\n : PARENT_ARROW,\n };\n });\n return { flowEdges, drawnEdgeStyles: drawn };\n }, [laidOut, hoverExtra, onMentionSelect, emphasisId, focusParentId]);\n const flowEdges = useStableEdges(builtEdges);\n // Dimming is CSS: the container says something is emphasised, and only the page's neighbourhood is\n // marked. Pointing at a page then changes a few nodes and lines, not all of them.\n const emphasisedNodes = useMemo(\n () =>\n nodes.map(node => {\n const near = neighbours?.has(node.id);\n const hovered = node.id === hoveredId && hoveredNotShown > 0;\n if (!near && !hovered) return node;\n return {\n ...node,\n ...(near ? { className: NEIGHBOUR_CLASS } : {}),\n ...(hovered ? { data: { ...node.data, notShown: hoveredNotShown } } : {}),\n };\n }),\n [nodes, neighbours, hoveredId, hoveredNotShown],\n );\n const emphasisedEdges = useMemo(\n () =>\n neighbours\n ? flowEdges.map(edge =>\n neighbours.has(edge.source) && neighbours.has(edge.target)\n ? { ...edge, className: [edge.className, NEIGHBOUR_CLASS].filter(Boolean).join(' ') }\n : edge,\n )\n : flowEdges,\n [flowEdges, neighbours],\n );\n const pagesById = useMemo(() => new Map(pages.map(page => [page.id, page])), [pages]);\n const reactFlow = useReactFlow();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasNodes = nodes.length > 0;\n\n // The view frames the selected page and its neighbours, or every page when nothing is selected. It is\n // computed from the layout's own positions and sizes rather than React Flow's `fitView`, which only\n // counts nodes it has measured in the DOM: in a production Studio it measured none, so the view never\n // moved. State is read through a ref so a refetch with the same selection never moves the view.\n // Pages that just left the view stay a moment, fading, so a refocus reads as a change and not a cut.\n const drawnNodes = useLeavingNodes(emphasisedNodes, prefersMotion());\n const linkedIds = laidOut.shape.linked;\n const fitState = useRef({ nodes, selectedPageId, centerId, reactFlow, linkedIds });\n fitState.current = { nodes, selectedPageId, centerId, reactFlow, linkedIds };\n // Set when a fit found the pane 0×0, so the next non-zero size fits even if it matches the last one seen.\n const fitPending = useRef(false);\n // The pane and what is drawn, or null while the pane has no size (the next non-zero size fits).\n const paneAndNodes = () => {\n const container = containerRef.current;\n const width = container?.clientWidth ?? 0;\n const height = container?.clientHeight ?? 0;\n if (width === 0 || height === 0) {\n fitPending.current = true;\n return null;\n }\n fitPending.current = false;\n const { nodes: current, reactFlow: flow } = fitState.current;\n const bounds = graphBounds(current);\n return bounds ? { container, width, height, current, flow, bounds } : null;\n };\n // Fit view: every drawn node; with an outer ring of linked pages, below the readable floor so it all shows.\n const fit = useCallback((duration?: number) => {\n const view = paneAndNodes();\n if (!view) return;\n const { selectedPageId: selected, centerId: centre, linkedIds: linked } = fitState.current;\n const anchor = view.current.find(node => node.id === (selected ?? centre));\n const ring = !!selected && view.current.some(node => linked.has(node.id));\n const viewport = fitViewport({ bounds: view.bounds, width: view.width, height: view.height, ring, anchor });\n void view.flow.setViewport(viewport, duration ? { duration } : undefined);\n }, []);\n // The first view, once the graph has a size: everything drawn, with a margin, clear of the legend.\n const fitInitial = useCallback(() => {\n const view = paneAndNodes();\n if (!view) return;\n const box = view.container?.getBoundingClientRect();\n const legend = view.container?.querySelector('[aria-label=\"Legend\"]')?.getBoundingClientRect();\n const viewport = fitAllViewport({\n bounds: view.bounds,\n nodes: view.current.map(node => ({\n x: node.position.x,\n y: node.position.y,\n width: node.width ?? 0,\n height: node.height ?? 0,\n })),\n width: view.width,\n height: view.height,\n legend: box && legend ? { right: legend.right - box.left + 8, bottom: legend.bottom - box.top + 8 } : undefined,\n });\n void view.flow.setViewport(viewport);\n }, []);\n\n // A refocus leaves the view exactly where the user put it, pan and zoom. Only when the newly focused page\n // would land outside the pane (or too close to its edge) does the view move, and then by just enough to\n // bring the page back in. A pane that merely changes size does the same. Fit view is the one control that\n // changes zoom.\n const nudgeToSelection = useCallback((duration?: number) => {\n const container = containerRef.current;\n const width = container?.clientWidth ?? 0;\n const height = container?.clientHeight ?? 0;\n const { nodes: current, selectedPageId: selected, centerId: centre, reactFlow: flow } = fitState.current;\n const anchor = current.find(node => node.id === (selected ?? centre));\n if (!anchor || width === 0 || height === 0) return;\n const view = flow.getViewport();\n const dx = nudgeAxis(anchor.position.x * view.zoom + view.x, (anchor.width ?? 0) * view.zoom, width);\n const dy = nudgeAxis(anchor.position.y * view.zoom + view.y, (anchor.height ?? 0) * view.zoom, height);\n if (dx === 0 && dy === 0) return;\n void flow.setViewport({ zoom: view.zoom, x: view.x + dx, y: view.y + dy }, duration ? { duration } : undefined);\n }, []);\n\n // A host that hides the graph behind a Tree/Graph toggle gives it zero size at first, so fit when the\n // container first gets a non-zero size. Once it has been laid out, a new size (the window resized, a\n // banner appeared above it) keeps the zoom and re-centres, so it never undoes the user's zoom. At most\n // once a frame.\n useEffect(() => {\n const container = containerRef.current;\n if (!container || typeof ResizeObserver === 'undefined') return;\n let last = { width: container.clientWidth, height: container.clientHeight };\n let frame: number | undefined;\n // Set while the pane has been hidden, until a fit has run. A second resize can cancel the frame that\n // would have fitted, so this has to outlive the callback.\n let needsFit = false;\n const observer = new ResizeObserver(([entry]) => {\n if (!entry) return;\n const { width, height } = entry.contentRect;\n const changed = width !== last.width || height !== last.height;\n if (last.width === 0 || last.height === 0) needsFit = true;\n last = { width, height };\n if ((!changed && !fitPending.current) || width === 0 || height === 0) return;\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = undefined;\n if (needsFit || fitPending.current) {\n needsFit = false;\n fitInitial();\n } else nudgeToSelection();\n });\n });\n observer.observe(container);\n return () => {\n observer.disconnect();\n if (frame !== undefined) cancelAnimationFrame(frame);\n };\n }, [hasNodes, fitInitial, nudgeToSelection]);\n\n // A selection made outside the graph (tree, search, a link) pans to that page at the current zoom. A\n // click on the graph itself leaves the view where the user put it.\n const selectedHere = useRef<string | null>(null);\n const selectedIsLoaded = !!selectedPageId && pagesById.has(selectedPageId);\n const initialized = useRef(false);\n // The first view is refitted while the graph is still filling in (ring pages, children, links arrive over the\n // first moments), until the user does anything or the window closes. After that the view is theirs.\n const settleUntil = useRef(0);\n const settledOn = useRef<string | null>(null);\n // What the last first-view fit was of, so a refetch that draws the same thing doesn't fit again.\n const fittedLayout = useRef('');\n const stopSettling = useCallback(() => {\n settleUntil.current = 0;\n }, []);\n useEffect(() => {\n if (!initialized.current) return;\n if ((selectedPageId ?? null) !== settledOn.current) settleUntil.current = 0;\n if (Date.now() >= settleUntil.current) return;\n const layout = nodes.map(node => `${node.id}@${node.position.x},${node.position.y}`).join('|');\n if (layout === fittedLayout.current) return;\n fittedLayout.current = layout;\n fitInitial();\n }, [nodes, selectedPageId, fitInitial]);\n useEffect(() => {\n if (!initialized.current || !selectedIsLoaded || !selectedPageId) return;\n const fromGraph = selectedHere.current === selectedPageId;\n selectedHere.current = null;\n if (fromGraph) return;\n nudgeToSelection(fitDuration(prefersMotion()));\n }, [selectedPageId, selectedIsLoaded, nudgeToSelection]);\n\n // First click selects; a click on the page that is already selected opens it. A double-click is the two.\n const activate = (page: KnowledgePagePayload) => {\n // A stand-in or a scope group isn't a page: the host loads or opens what it stands for.\n if (isChildPlaceholder(page) || isScopeGroup(page) || isRestCircle(page)) return onSelect(page);\n if (page.id === selectedPageId && onOpen) return onOpen(page);\n selectedHere.current = page.id;\n onSelect(page);\n };\n // Where the pointer went down, so a click that ends a pan isn't taken for a click on empty canvas.\n const pressedAt = useRef<{ x: number; y: number } | null>(null);\n\n // React Flow focuses nodes but only toggles its own selection on Enter or Space; route them like a click.\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n const id = (event.target as HTMLElement).closest<HTMLElement>('.react-flow__node')?.dataset.id;\n const page = id ? pagesById.get(id) : undefined;\n if (!page) return;\n event.preventDefault();\n activate(page);\n };\n // React Flow hands these to every node and line, and re-renders them all when one changes. They read the\n // latest props through a ref so their identity never changes, and pointing at a page re-renders only the\n // pages whose own props changed.\n const latest = useRef({ activate, onPreview, onMentionSelect, onClearSelection, laidOut, pagesById });\n latest.current = { activate, onPreview, onMentionSelect, onClearSelection, laidOut, pagesById };\n const onNodeMouseEnter = useCallback((_: unknown, node: PageFlowNode) => {\n setHoveredId(node.id);\n if (latest.current.laidOut.shape.form.get(node.id) === 'dot') latest.current.onPreview?.(node.data.page);\n }, []);\n const onNodeMouseLeave = useCallback(() => setHoveredId(null), []);\n const onNodeClick = useCallback((_: unknown, node: PageFlowNode) => {\n if (!isPlaceholder(node.data.page)) latest.current.activate(node.data.page);\n }, []);\n const onEdgeClick = useCallback((event: React.MouseEvent, edge: Edge<RimEdgeData>) => {\n const { onMentionSelect, pagesById } = latest.current;\n if (edge.data?.kind !== 'mention' || !onMentionSelect) return;\n const source = pagesById.get(edge.source);\n const target = pagesById.get(edge.target);\n if (!source || !target) return;\n const box = containerRef.current?.getBoundingClientRect();\n onMentionSelect({\n source,\n target,\n point: { x: event.clientX - (box?.left ?? 0), y: event.clientY - (box?.top ?? 0) },\n pane: { width: box?.width ?? 0, height: box?.height ?? 0 },\n });\n }, []);\n const onPaneClick = useCallback((event: React.MouseEvent) => {\n const start = pressedAt.current;\n pressedAt.current = null;\n if (start && Math.hypot(event.clientX - start.x, event.clientY - start.y) > CLICK_SLOP_PX) return;\n latest.current.onClearSelection?.();\n }, []);\n\n if (!hasNodes) {\n return (\n <div className=\"flex h-full items-center justify-center p-6\">\n <Txt variant=\"body\" tone=\"muted\">\n No pages yet.\n </Txt>\n </div>\n );\n }\n\n return (\n <div\n ref={containerRef}\n className=\"knowledge-graph relative size-full\"\n data-emphasis={neighbours ? 'on' : undefined}\n data-testid=\"knowledge-page-graph\"\n onKeyDown={onKeyDown}\n onWheelCapture={stopSettling}\n onPointerDownCapture={event => {\n stopSettling();\n pressedAt.current = { x: event.clientX, y: event.clientY };\n }}\n >\n <GraphLegend\n branches={dotBranches}\n levels={drawnLevels}\n focused={!!selectedPageId && laidOut.positions.has(selectedPageId)}\n dots={[...laidOut.shape.form.values()].includes('dot')}\n linkEnds={laidOut.shape.linked.size > 0}\n drawn={drawnEdgeStyles}\n counts={[...(hiddenLinks ?? [])].some(\n ([id, hidden]) => laidOut.shape.form.get(id) === 'full' && (hidden.in > 0 || hidden.out > 0),\n )}\n />\n <ReactFlow\n nodes={drawnNodes}\n edges={emphasisedEdges}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n onInit={() => {\n initialized.current = true;\n settleUntil.current = Date.now() + INITIAL_SETTLE_MS;\n settledOn.current = fitState.current.selectedPageId ?? null;\n fittedLayout.current = fitState.current.nodes\n .map(node => `${node.id}@${node.position.x},${node.position.y}`)\n .join('|');\n fitInitial();\n }}\n minZoom={0.1}\n proOptions={{ hideAttribution: true }}\n nodesConnectable={false}\n nodesDraggable={false}\n onPaneClick={onPaneClick}\n onNodeMouseEnter={onNodeMouseEnter}\n onNodeMouseLeave={onNodeMouseLeave}\n onNodeClick={onNodeClick}\n onEdgeClick={onEdgeClick}\n >\n <Background variant={BackgroundVariant.Dots} gap={26} size={1.4} color=\"var(--border-strong)\" />\n <Controls showInteractive={false} showFitView={false}>\n <ControlButton onClick={() => fit(fitDuration(prefersMotion()))} title=\"Fit view\" aria-label=\"Fit view\">\n <Maximize aria-hidden />\n </ControlButton>\n </Controls>\n </ReactFlow>\n </div>\n );\n}\n"],"mappings":"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"}
|