@schlessera/brain-ui-react 0.35.0 → 0.37.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/README.md +82 -4
- package/dist/components/activity/activity-page.d.ts +17 -5
- package/dist/components/activity/activity-page.d.ts.map +1 -1
- package/dist/components/activity/activity-page.js +148 -50
- package/dist/components/activity/activity-page.js.map +1 -1
- package/dist/components/activity/activity-run-detail.d.ts +16 -1
- package/dist/components/activity/activity-run-detail.d.ts.map +1 -1
- package/dist/components/activity/activity-run-detail.js +47 -4
- package/dist/components/activity/activity-run-detail.js.map +1 -1
- package/dist/components/activity/activity-run-list.d.ts +7 -1
- package/dist/components/activity/activity-run-list.d.ts.map +1 -1
- package/dist/components/activity/activity-run-list.js +16 -8
- package/dist/components/activity/activity-run-list.js.map +1 -1
- package/dist/components/activity/activity-views.d.ts +63 -0
- package/dist/components/activity/activity-views.d.ts.map +1 -0
- package/dist/components/activity/activity-views.js +52 -0
- package/dist/components/activity/activity-views.js.map +1 -0
- package/dist/components/activity/approval-card.d.ts +29 -0
- package/dist/components/activity/approval-card.d.ts.map +1 -0
- package/dist/components/activity/approval-card.js +73 -0
- package/dist/components/activity/approval-card.js.map +1 -0
- package/dist/components/activity/digest-card.d.ts +3 -0
- package/dist/components/activity/digest-card.d.ts.map +1 -1
- package/dist/components/activity/digest-card.js +20 -16
- package/dist/components/activity/digest-card.js.map +1 -1
- package/dist/components/activity/digest-summary.d.ts +19 -0
- package/dist/components/activity/digest-summary.d.ts.map +1 -0
- package/dist/components/activity/digest-summary.js +20 -0
- package/dist/components/activity/digest-summary.js.map +1 -0
- package/dist/components/activity/push-switch.d.ts +25 -0
- package/dist/components/activity/push-switch.d.ts.map +1 -0
- package/dist/components/activity/push-switch.js +14 -0
- package/dist/components/activity/push-switch.js.map +1 -0
- package/dist/components/activity/push-toggle.d.ts +7 -0
- package/dist/components/activity/push-toggle.d.ts.map +1 -1
- package/dist/components/activity/push-toggle.js +72 -47
- package/dist/components/activity/push-toggle.js.map +1 -1
- package/dist/components/activity/span-bits.d.ts +11 -0
- package/dist/components/activity/span-bits.d.ts.map +1 -1
- package/dist/components/activity/span-bits.js +50 -7
- package/dist/components/activity/span-bits.js.map +1 -1
- package/dist/components/chat/ask-user-card.d.ts +76 -3
- package/dist/components/chat/ask-user-card.d.ts.map +1 -1
- package/dist/components/chat/ask-user-card.js +208 -149
- package/dist/components/chat/ask-user-card.js.map +1 -1
- package/dist/components/chat/ask-user-typed.d.ts +42 -0
- package/dist/components/chat/ask-user-typed.d.ts.map +1 -0
- package/dist/components/chat/ask-user-typed.js +60 -0
- package/dist/components/chat/ask-user-typed.js.map +1 -0
- package/dist/components/chat/brain-markdown-links.d.ts +2 -1
- package/dist/components/chat/brain-markdown-links.d.ts.map +1 -1
- package/dist/components/chat/brain-markdown-links.js +3 -4
- package/dist/components/chat/brain-markdown-links.js.map +1 -1
- package/dist/components/chat/brain-markdown.d.ts.map +1 -1
- package/dist/components/chat/brain-markdown.js +4 -2
- package/dist/components/chat/brain-markdown.js.map +1 -1
- package/dist/components/chat/chat-page.d.ts.map +1 -1
- package/dist/components/chat/chat-page.js +27 -11
- package/dist/components/chat/chat-page.js.map +1 -1
- package/dist/components/chat/composer-view.d.ts +75 -0
- package/dist/components/chat/composer-view.d.ts.map +1 -0
- package/dist/components/chat/composer-view.js +31 -0
- package/dist/components/chat/composer-view.js.map +1 -0
- package/dist/components/chat/composer.d.ts +4 -0
- package/dist/components/chat/composer.d.ts.map +1 -1
- package/dist/components/chat/composer.js +76 -59
- package/dist/components/chat/composer.js.map +1 -1
- package/dist/components/chat/markdown-content.d.ts +16 -1
- package/dist/components/chat/markdown-content.d.ts.map +1 -1
- package/dist/components/chat/markdown-content.js +47 -3
- package/dist/components/chat/markdown-content.js.map +1 -1
- package/dist/components/chat/mermaid-block.d.ts +4 -0
- package/dist/components/chat/mermaid-block.d.ts.map +1 -1
- package/dist/components/chat/mermaid-block.js +13 -5
- package/dist/components/chat/mermaid-block.js.map +1 -1
- package/dist/components/chat/mermaid-share.d.ts +2 -1
- package/dist/components/chat/mermaid-share.d.ts.map +1 -1
- package/dist/components/chat/mermaid-share.js +7 -8
- package/dist/components/chat/mermaid-share.js.map +1 -1
- package/dist/components/chat/mermaid-viewer.d.ts.map +1 -1
- package/dist/components/chat/mermaid-viewer.js +3 -1
- package/dist/components/chat/mermaid-viewer.js.map +1 -1
- package/dist/components/chat/message-bubble.d.ts +8 -1
- package/dist/components/chat/message-bubble.d.ts.map +1 -1
- package/dist/components/chat/message-bubble.js +53 -24
- package/dist/components/chat/message-bubble.js.map +1 -1
- package/dist/components/chat/message-share.d.ts +2 -1
- package/dist/components/chat/message-share.d.ts.map +1 -1
- package/dist/components/chat/message-share.js +6 -7
- package/dist/components/chat/message-share.js.map +1 -1
- package/dist/components/chat/renderers/bind.d.ts +39 -0
- package/dist/components/chat/renderers/bind.d.ts.map +1 -0
- package/dist/components/chat/renderers/bind.js +43 -0
- package/dist/components/chat/renderers/bind.js.map +1 -0
- package/dist/components/chat/renderers/brain-ui-tools.d.ts +3 -0
- package/dist/components/chat/renderers/brain-ui-tools.d.ts.map +1 -0
- package/dist/components/chat/renderers/brain-ui-tools.js +41 -0
- package/dist/components/chat/renderers/brain-ui-tools.js.map +1 -0
- package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
- package/dist/components/chat/renderers/claude-tools.js +3 -2
- package/dist/components/chat/renderers/claude-tools.js.map +1 -1
- package/dist/components/chat/renderers/index.d.ts +10 -2
- package/dist/components/chat/renderers/index.d.ts.map +1 -1
- package/dist/components/chat/renderers/index.js +15 -10
- package/dist/components/chat/renderers/index.js.map +1 -1
- package/dist/components/chat/session-drawer.d.ts +4 -0
- package/dist/components/chat/session-drawer.d.ts.map +1 -1
- package/dist/components/chat/session-drawer.js +32 -32
- package/dist/components/chat/session-drawer.js.map +1 -1
- package/dist/components/chat/session-list.d.ts +41 -0
- package/dist/components/chat/session-list.d.ts.map +1 -0
- package/dist/components/chat/session-list.js +10 -0
- package/dist/components/chat/session-list.js.map +1 -0
- package/dist/components/chat/share-block.d.ts.map +1 -1
- package/dist/components/chat/share-block.js +12 -11
- package/dist/components/chat/share-block.js.map +1 -1
- package/dist/components/chat/share-card.js +2 -2
- package/dist/components/chat/share-card.js.map +1 -1
- package/dist/components/chat/subagent-view.js +1 -1
- package/dist/components/chat/subagent-view.js.map +1 -1
- package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
- package/dist/components/chat/tool-call-timeline.js +45 -14
- package/dist/components/chat/tool-call-timeline.js.map +1 -1
- package/dist/components/chat/tool-cards/block-card.d.ts +28 -0
- package/dist/components/chat/tool-cards/block-card.d.ts.map +1 -0
- package/dist/components/chat/tool-cards/block-card.js +103 -0
- package/dist/components/chat/tool-cards/block-card.js.map +1 -0
- package/dist/components/chat/tool-cards/image-mask-card.d.ts +70 -0
- package/dist/components/chat/tool-cards/image-mask-card.d.ts.map +1 -0
- package/dist/components/chat/tool-cards/image-mask-card.js +142 -0
- package/dist/components/chat/tool-cards/image-mask-card.js.map +1 -0
- package/dist/components/chat/tool-cards/location-card.d.ts +45 -0
- package/dist/components/chat/tool-cards/location-card.d.ts.map +1 -0
- package/dist/components/chat/tool-cards/location-card.js +128 -0
- package/dist/components/chat/tool-cards/location-card.js.map +1 -0
- package/dist/components/chat/tool-views.d.ts +19 -2
- package/dist/components/chat/tool-views.d.ts.map +1 -1
- package/dist/components/chat/tool-views.js +28 -22
- package/dist/components/chat/tool-views.js.map +1 -1
- package/dist/components/chat/transcript-turn.d.ts +45 -0
- package/dist/components/chat/transcript-turn.d.ts.map +1 -0
- package/dist/components/chat/transcript-turn.js +25 -0
- package/dist/components/chat/transcript-turn.js.map +1 -0
- package/dist/components/chat/use-chat-commands.d.ts.map +1 -1
- package/dist/components/chat/use-chat-commands.js +13 -16
- package/dist/components/chat/use-chat-commands.js.map +1 -1
- package/dist/components/chat/welcome-state.d.ts +7 -0
- package/dist/components/chat/welcome-state.d.ts.map +1 -1
- package/dist/components/chat/welcome-state.js +13 -5
- package/dist/components/chat/welcome-state.js.map +1 -1
- package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
- package/dist/components/connectivity/connection-gate.js +27 -21
- package/dist/components/connectivity/connection-gate.js.map +1 -1
- package/dist/components/connectivity/login-form.d.ts +31 -0
- package/dist/components/connectivity/login-form.d.ts.map +1 -0
- package/dist/components/connectivity/login-form.js +19 -0
- package/dist/components/connectivity/login-form.js.map +1 -0
- package/dist/components/connectivity/login-screen.d.ts +5 -2
- package/dist/components/connectivity/login-screen.d.ts.map +1 -1
- package/dist/components/connectivity/login-screen.js +41 -31
- package/dist/components/connectivity/login-screen.js.map +1 -1
- package/dist/components/dev/share-harness.js +1 -1
- package/dist/components/dev/share-harness.js.map +1 -1
- package/dist/components/files/file-panel.d.ts +1 -1
- package/dist/components/files/file-panel.d.ts.map +1 -1
- package/dist/components/files/file-panel.js +74 -0
- package/dist/components/files/file-panel.js.map +1 -1
- package/dist/components/files/file-tree-view.d.ts +45 -0
- package/dist/components/files/file-tree-view.d.ts.map +1 -0
- package/dist/components/files/file-tree-view.js +51 -0
- package/dist/components/files/file-tree-view.js.map +1 -0
- package/dist/components/files/file-tree.d.ts +6 -0
- package/dist/components/files/file-tree.d.ts.map +1 -1
- package/dist/components/files/file-tree.js +39 -43
- package/dist/components/files/file-tree.js.map +1 -1
- package/dist/components/files/file-viewer-binary.d.ts.map +1 -1
- package/dist/components/files/file-viewer-binary.js +3 -2
- package/dist/components/files/file-viewer-binary.js.map +1 -1
- package/dist/components/files/file-viewer-frame.d.ts +36 -0
- package/dist/components/files/file-viewer-frame.d.ts.map +1 -0
- package/dist/components/files/file-viewer-frame.js +26 -0
- package/dist/components/files/file-viewer-frame.js.map +1 -0
- package/dist/components/files/file-viewer.d.ts +5 -0
- package/dist/components/files/file-viewer.d.ts.map +1 -1
- package/dist/components/files/file-viewer.js +26 -32
- package/dist/components/files/file-viewer.js.map +1 -1
- package/dist/components/files/frontmatter-chips.d.ts +18 -0
- package/dist/components/files/frontmatter-chips.d.ts.map +1 -0
- package/dist/components/files/frontmatter-chips.js +11 -0
- package/dist/components/files/frontmatter-chips.js.map +1 -0
- package/dist/components/files/frontmatter-panel.d.ts +5 -1
- package/dist/components/files/frontmatter-panel.d.ts.map +1 -1
- package/dist/components/files/frontmatter-panel.js +7 -6
- package/dist/components/files/frontmatter-panel.js.map +1 -1
- package/dist/components/files/staleness.d.ts +18 -0
- package/dist/components/files/staleness.d.ts.map +1 -0
- package/dist/components/files/staleness.js +27 -0
- package/dist/components/files/staleness.js.map +1 -0
- package/dist/components/graph/graph-canvas.d.ts.map +1 -1
- package/dist/components/graph/graph-canvas.js +24 -1
- package/dist/components/graph/graph-canvas.js.map +1 -1
- package/dist/components/graph/graph-controls-column.d.ts +14 -0
- package/dist/components/graph/graph-controls-column.d.ts.map +1 -0
- package/dist/components/graph/graph-controls-column.js +44 -0
- package/dist/components/graph/graph-controls-column.js.map +1 -0
- package/dist/components/graph/graph-controls.d.ts +20 -5
- package/dist/components/graph/graph-controls.d.ts.map +1 -1
- package/dist/components/graph/graph-controls.js +58 -37
- package/dist/components/graph/graph-controls.js.map +1 -1
- package/dist/components/graph/graph-form.d.ts +82 -0
- package/dist/components/graph/graph-form.d.ts.map +1 -0
- package/dist/components/graph/graph-form.js +69 -0
- package/dist/components/graph/graph-form.js.map +1 -0
- package/dist/components/graph/graph-maintenance.d.ts.map +1 -1
- package/dist/components/graph/graph-maintenance.js +6 -10
- package/dist/components/graph/graph-maintenance.js.map +1 -1
- package/dist/components/graph/graph-node-rail.d.ts +13 -0
- package/dist/components/graph/graph-node-rail.d.ts.map +1 -0
- package/dist/components/graph/graph-node-rail.js +92 -0
- package/dist/components/graph/graph-node-rail.js.map +1 -0
- package/dist/components/graph/graph-page.d.ts +7 -0
- package/dist/components/graph/graph-page.d.ts.map +1 -1
- package/dist/components/graph/graph-page.js +102 -12
- package/dist/components/graph/graph-page.js.map +1 -1
- package/dist/components/graph/graph-scene.d.ts.map +1 -1
- package/dist/components/graph/graph-scene.js +100 -24
- package/dist/components/graph/graph-scene.js.map +1 -1
- package/dist/components/graph/lib/graph-helpers.d.ts +42 -12
- package/dist/components/graph/lib/graph-helpers.d.ts.map +1 -1
- package/dist/components/graph/lib/graph-helpers.js +33 -41
- package/dist/components/graph/lib/graph-helpers.js.map +1 -1
- package/dist/components/graph/node-card.d.ts +28 -0
- package/dist/components/graph/node-card.d.ts.map +1 -0
- package/dist/components/graph/node-card.js +7 -0
- package/dist/components/graph/node-card.js.map +1 -0
- package/dist/components/graph/node-popover.d.ts +6 -2
- package/dist/components/graph/node-popover.d.ts.map +1 -1
- package/dist/components/graph/node-popover.js +13 -31
- package/dist/components/graph/node-popover.js.map +1 -1
- package/dist/components/graph/use-graph-theme.d.ts +32 -4
- package/dist/components/graph/use-graph-theme.d.ts.map +1 -1
- package/dist/components/graph/use-graph-theme.js +44 -32
- package/dist/components/graph/use-graph-theme.js.map +1 -1
- package/dist/components/graph/use-node-actions.d.ts +26 -0
- package/dist/components/graph/use-node-actions.d.ts.map +1 -0
- package/dist/components/graph/use-node-actions.js +54 -0
- package/dist/components/graph/use-node-actions.js.map +1 -0
- package/dist/components/images/image-share.d.ts +2 -1
- package/dist/components/images/image-share.d.ts.map +1 -1
- package/dist/components/images/image-share.js +3 -3
- package/dist/components/images/image-share.js.map +1 -1
- package/dist/components/images/image-viewer.d.ts.map +1 -1
- package/dist/components/images/image-viewer.js +3 -1
- package/dist/components/images/image-viewer.js.map +1 -1
- package/dist/components/images/mask-editor.d.ts.map +1 -1
- package/dist/components/images/mask-editor.js +7 -5
- package/dist/components/images/mask-editor.js.map +1 -1
- package/dist/components/layout/app-shell.d.ts.map +1 -1
- package/dist/components/layout/app-shell.js +4 -1
- package/dist/components/layout/app-shell.js.map +1 -1
- package/dist/components/layout/desktop-palette.d.ts +23 -0
- package/dist/components/layout/desktop-palette.d.ts.map +1 -0
- package/dist/components/layout/desktop-palette.js +132 -0
- package/dist/components/layout/desktop-palette.js.map +1 -0
- package/dist/components/layout/key-cap.d.ts +9 -0
- package/dist/components/layout/key-cap.d.ts.map +1 -0
- package/dist/components/layout/key-cap.js +10 -0
- package/dist/components/layout/key-cap.js.map +1 -0
- package/dist/components/layout/mobile-tab-bar.d.ts +13 -0
- package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
- package/dist/components/layout/mobile-tab-bar.js +58 -47
- package/dist/components/layout/mobile-tab-bar.js.map +1 -1
- package/dist/components/layout/shortcut-switch.d.ts +13 -0
- package/dist/components/layout/shortcut-switch.d.ts.map +1 -0
- package/dist/components/layout/shortcut-switch.js +22 -0
- package/dist/components/layout/shortcut-switch.js.map +1 -0
- package/dist/components/layout/side-rail.d.ts +28 -0
- package/dist/components/layout/side-rail.d.ts.map +1 -1
- package/dist/components/layout/side-rail.js +72 -27
- package/dist/components/layout/side-rail.js.map +1 -1
- package/dist/components/layout/slide-panel.d.ts +25 -2
- package/dist/components/layout/slide-panel.d.ts.map +1 -1
- package/dist/components/layout/slide-panel.js +13 -4
- package/dist/components/layout/slide-panel.js.map +1 -1
- package/dist/components/layout/theme.d.ts +22 -0
- package/dist/components/layout/theme.d.ts.map +1 -0
- package/dist/components/layout/theme.js +44 -0
- package/dist/components/layout/theme.js.map +1 -0
- package/dist/components/quick-actions/add-form.d.ts +44 -0
- package/dist/components/quick-actions/add-form.d.ts.map +1 -0
- package/dist/components/quick-actions/add-form.js +32 -0
- package/dist/components/quick-actions/add-form.js.map +1 -0
- package/dist/components/quick-actions/add-modal.d.ts +7 -0
- package/dist/components/quick-actions/add-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/add-modal.js +23 -20
- package/dist/components/quick-actions/add-modal.js.map +1 -1
- package/dist/components/quick-actions/search-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/search-modal.js +8 -5
- package/dist/components/quick-actions/search-modal.js.map +1 -1
- package/dist/components/quick-actions/streaming-modal.d.ts +6 -0
- package/dist/components/quick-actions/streaming-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/streaming-modal.js +53 -18
- package/dist/components/quick-actions/streaming-modal.js.map +1 -1
- package/dist/components/quick-actions/streaming-output.d.ts +38 -0
- package/dist/components/quick-actions/streaming-output.d.ts.map +1 -0
- package/dist/components/quick-actions/streaming-output.js +22 -0
- package/dist/components/quick-actions/streaming-output.js.map +1 -0
- package/dist/components/quick-actions/whatsup-modal.d.ts +5 -0
- package/dist/components/quick-actions/whatsup-modal.d.ts.map +1 -1
- package/dist/components/quick-actions/whatsup-modal.js +51 -10
- package/dist/components/quick-actions/whatsup-modal.js.map +1 -1
- package/dist/components/settings/devices-agents-tab.d.ts +6 -1
- package/dist/components/settings/devices-agents-tab.d.ts.map +1 -1
- package/dist/components/settings/devices-agents-tab.js +55 -20
- package/dist/components/settings/devices-agents-tab.js.map +1 -1
- package/dist/components/settings/models-list.d.ts +39 -0
- package/dist/components/settings/models-list.d.ts.map +1 -0
- package/dist/components/settings/models-list.js +72 -0
- package/dist/components/settings/models-list.js.map +1 -0
- package/dist/components/settings/models-tab.d.ts +4 -0
- package/dist/components/settings/models-tab.d.ts.map +1 -1
- package/dist/components/settings/models-tab.js +52 -102
- package/dist/components/settings/models-tab.js.map +1 -1
- package/dist/components/settings/one-time-agent-credential.js +1 -1
- package/dist/components/settings/one-time-agent-credential.js.map +1 -1
- package/dist/components/settings/passkey-list.d.ts +35 -0
- package/dist/components/settings/passkey-list.d.ts.map +1 -0
- package/dist/components/settings/passkey-list.js +34 -0
- package/dist/components/settings/passkey-list.js.map +1 -0
- package/dist/components/settings/passkey-tab.d.ts +3 -0
- package/dist/components/settings/passkey-tab.d.ts.map +1 -1
- package/dist/components/settings/passkey-tab.js +53 -45
- package/dist/components/settings/passkey-tab.js.map +1 -1
- package/dist/components/settings/pi-accounts-list.d.ts +27 -0
- package/dist/components/settings/pi-accounts-list.d.ts.map +1 -0
- package/dist/components/settings/pi-accounts-list.js +15 -0
- package/dist/components/settings/pi-accounts-list.js.map +1 -0
- package/dist/components/settings/pi-accounts.d.ts +3 -0
- package/dist/components/settings/pi-accounts.d.ts.map +1 -1
- package/dist/components/settings/pi-accounts.js +73 -55
- package/dist/components/settings/pi-accounts.js.map +1 -1
- package/dist/components/settings/principal-list.d.ts +37 -0
- package/dist/components/settings/principal-list.d.ts.map +1 -0
- package/dist/components/settings/principal-list.js +18 -0
- package/dist/components/settings/principal-list.js.map +1 -0
- package/dist/components/settings/settings-panel.d.ts +10 -3
- package/dist/components/settings/settings-panel.d.ts.map +1 -1
- package/dist/components/settings/settings-panel.js +71 -10
- package/dist/components/settings/settings-panel.js.map +1 -1
- package/dist/components/settings/skills-list.d.ts +53 -0
- package/dist/components/settings/skills-list.d.ts.map +1 -0
- package/dist/components/settings/skills-list.js +28 -0
- package/dist/components/settings/skills-list.js.map +1 -0
- package/dist/components/settings/skills-tab.d.ts.map +1 -1
- package/dist/components/settings/skills-tab.js +65 -38
- package/dist/components/settings/skills-tab.js.map +1 -1
- package/dist/components/settings/tool-permissions-list.d.ts +18 -0
- package/dist/components/settings/tool-permissions-list.d.ts.map +1 -0
- package/dist/components/settings/tool-permissions-list.js +6 -0
- package/dist/components/settings/tool-permissions-list.js.map +1 -0
- package/dist/components/settings/tool-permissions.d.ts +2 -1
- package/dist/components/settings/tool-permissions.d.ts.map +1 -1
- package/dist/components/settings/tool-permissions.js +33 -16
- package/dist/components/settings/tool-permissions.js.map +1 -1
- package/dist/components/settings/web-search-chain.d.ts +41 -0
- package/dist/components/settings/web-search-chain.d.ts.map +1 -0
- package/dist/components/settings/web-search-chain.js +47 -0
- package/dist/components/settings/web-search-chain.js.map +1 -0
- package/dist/components/settings/web-search-settings.d.ts +4 -7
- package/dist/components/settings/web-search-settings.d.ts.map +1 -1
- package/dist/components/settings/web-search-settings.js +54 -76
- package/dist/components/settings/web-search-settings.js.map +1 -1
- package/dist/components/share/share-menu.d.ts.map +1 -1
- package/dist/components/share/share-menu.js +24 -4
- package/dist/components/share/share-menu.js.map +1 -1
- package/dist/components/voice/dictation-sheet.js +3 -3
- package/dist/components/voice/dictation-sheet.js.map +1 -1
- package/dist/components/voice/mic-button.js +1 -1
- package/dist/components/voice/mic-button.js.map +1 -1
- package/dist/components/voice/review-card.js +1 -1
- package/dist/components/voice/review-card.js.map +1 -1
- package/dist/config.d.ts +5 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -5
- package/dist/config.js.map +1 -1
- package/dist/connection.d.ts +12 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +421 -0
- package/dist/connection.js.map +1 -0
- package/dist/default-root.d.ts +3 -0
- package/dist/default-root.d.ts.map +1 -0
- package/dist/default-root.js +16 -0
- package/dist/default-root.js.map +1 -0
- package/dist/hooks/use-color-scheme.d.ts +14 -0
- package/dist/hooks/use-color-scheme.d.ts.map +1 -0
- package/dist/hooks/use-color-scheme.js +37 -0
- package/dist/hooks/use-color-scheme.js.map +1 -0
- package/dist/hooks/use-fine-pointer.d.ts +12 -0
- package/dist/hooks/use-fine-pointer.d.ts.map +1 -0
- package/dist/hooks/use-fine-pointer.js +15 -0
- package/dist/hooks/use-fine-pointer.js.map +1 -0
- package/dist/hooks/use-hash-routes.d.ts.map +1 -1
- package/dist/hooks/use-hash-routes.js +4 -2
- package/dist/hooks/use-hash-routes.js.map +1 -1
- package/dist/hooks/use-media-query.d.ts +9 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-media-query.js +38 -0
- package/dist/hooks/use-media-query.js.map +1 -0
- package/dist/hooks/use-share-intake.d.ts.map +1 -1
- package/dist/hooks/use-share-intake.js +37 -12
- package/dist/hooks/use-share-intake.js.map +1 -1
- package/dist/hooks/use-vpn-status.d.ts.map +1 -1
- package/dist/hooks/use-vpn-status.js +17 -18
- package/dist/hooks/use-vpn-status.js.map +1 -1
- package/dist/hooks/use-websocket.d.ts +5 -24
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +11 -384
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/hooks/websocket-handlers/activity.d.ts +2 -2
- package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/activity.js +4 -5
- package/dist/hooks/websocket-handlers/activity.js.map +1 -1
- package/dist/hooks/websocket-handlers/chat.d.ts +1 -0
- package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/chat.js +28 -6
- package/dist/hooks/websocket-handlers/chat.js.map +1 -1
- package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/connection.js +4 -6
- package/dist/hooks/websocket-handlers/connection.js.map +1 -1
- package/dist/hooks/websocket-handlers/mask.d.ts +1 -1
- package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/mask.js +2 -3
- package/dist/hooks/websocket-handlers/mask.js.map +1 -1
- package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -1
- package/dist/hooks/websocket-handlers/provider.js +4 -6
- package/dist/hooks/websocket-handlers/provider.js.map +1 -1
- package/dist/hooks/websocket-handlers/types.d.ts +6 -2
- package/dist/hooks/websocket-handlers/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +289 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +243 -224
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/backend.d.ts +19 -2
- package/dist/lib/backend.d.ts.map +1 -1
- package/dist/lib/backend.js +15 -9
- package/dist/lib/backend.js.map +1 -1
- package/dist/lib/diff.d.ts +8 -10
- package/dist/lib/diff.d.ts.map +1 -1
- package/dist/lib/diff.js +26 -53
- package/dist/lib/diff.js.map +1 -1
- package/dist/lib/light-dark.d.ts +37 -0
- package/dist/lib/light-dark.d.ts.map +1 -0
- package/dist/lib/light-dark.js +83 -0
- package/dist/lib/light-dark.js.map +1 -0
- package/dist/lib/mermaid-theme.d.ts +7 -2
- package/dist/lib/mermaid-theme.d.ts.map +1 -1
- package/dist/lib/mermaid-theme.js +125 -203
- package/dist/lib/mermaid-theme.js.map +1 -1
- package/dist/lib/passkeys.d.ts +6 -3
- package/dist/lib/passkeys.d.ts.map +1 -1
- package/dist/lib/passkeys.js +10 -4
- package/dist/lib/passkeys.js.map +1 -1
- package/dist/lib/push-registration.d.ts +4 -1
- package/dist/lib/push-registration.d.ts.map +1 -1
- package/dist/lib/push-registration.js +20 -2
- package/dist/lib/push-registration.js.map +1 -1
- package/dist/lib/share-intake.d.ts +2 -1
- package/dist/lib/share-intake.d.ts.map +1 -1
- package/dist/lib/share-intake.js +3 -3
- package/dist/lib/share-intake.js.map +1 -1
- package/dist/lib/share.d.ts +4 -3
- package/dist/lib/share.d.ts.map +1 -1
- package/dist/lib/share.js +6 -7
- package/dist/lib/share.js.map +1 -1
- package/dist/lib/single-key.d.ts +30 -0
- package/dist/lib/single-key.d.ts.map +1 -0
- package/dist/lib/single-key.js +45 -0
- package/dist/lib/single-key.js.map +1 -0
- package/dist/lib/tool-names.d.ts +8 -6
- package/dist/lib/tool-names.d.ts.map +1 -1
- package/dist/lib/tool-names.js +17 -7
- package/dist/lib/tool-names.js.map +1 -1
- package/dist/root-context.d.ts +229 -0
- package/dist/root-context.d.ts.map +1 -0
- package/dist/root-context.js +33 -0
- package/dist/root-context.js.map +1 -0
- package/dist/root.d.ts +38 -0
- package/dist/root.d.ts.map +1 -0
- package/dist/root.js +47 -0
- package/dist/root.js.map +1 -0
- package/dist/stores/activity-state.d.ts +29 -0
- package/dist/stores/activity-state.d.ts.map +1 -0
- package/dist/stores/activity-state.js +282 -0
- package/dist/stores/activity-state.js.map +1 -0
- package/dist/stores/activity-store.d.ts +10 -41
- package/dist/stores/activity-store.d.ts.map +1 -1
- package/dist/stores/activity-store.js +9 -271
- package/dist/stores/activity-store.js.map +1 -1
- package/dist/stores/chat-state.d.ts +233 -0
- package/dist/stores/chat-state.d.ts.map +1 -0
- package/dist/stores/chat-state.js +477 -0
- package/dist/stores/chat-state.js.map +1 -0
- package/dist/stores/chat-store.d.ts +4 -162
- package/dist/stores/chat-store.d.ts.map +1 -1
- package/dist/stores/chat-store.js +7 -418
- package/dist/stores/chat-store.js.map +1 -1
- package/dist/stores/connection-state.d.ts +40 -0
- package/dist/stores/connection-state.d.ts.map +1 -0
- package/dist/stores/connection-state.js +30 -0
- package/dist/stores/connection-state.js.map +1 -0
- package/dist/stores/connection-store.d.ts +4 -40
- package/dist/stores/connection-store.d.ts.map +1 -1
- package/dist/stores/connection-store.js +7 -27
- package/dist/stores/connection-store.js.map +1 -1
- package/dist/stores/create-stores.d.ts +23 -0
- package/dist/stores/create-stores.d.ts.map +1 -0
- package/dist/stores/create-stores.js +28 -0
- package/dist/stores/create-stores.js.map +1 -0
- package/dist/stores/file-state.d.ts +53 -0
- package/dist/stores/file-state.d.ts.map +1 -0
- package/dist/stores/file-state.js +341 -0
- package/dist/stores/file-state.js.map +1 -0
- package/dist/stores/file-store.d.ts +4 -52
- package/dist/stores/file-store.d.ts.map +1 -1
- package/dist/stores/file-store.js +7 -336
- package/dist/stores/file-store.js.map +1 -1
- package/dist/stores/graph-state.d.ts +95 -0
- package/dist/stores/graph-state.d.ts.map +1 -0
- package/dist/stores/graph-state.js +252 -0
- package/dist/stores/graph-state.js.map +1 -0
- package/dist/stores/graph-store.d.ts +7 -83
- package/dist/stores/graph-store.d.ts.map +1 -1
- package/dist/stores/graph-store.js +8 -249
- package/dist/stores/graph-store.js.map +1 -1
- package/dist/stores/mask-state.d.ts +21 -0
- package/dist/stores/mask-state.d.ts.map +1 -0
- package/dist/stores/mask-state.js +9 -0
- package/dist/stores/mask-state.js.map +1 -0
- package/dist/stores/mask-store.d.ts +4 -21
- package/dist/stores/mask-store.d.ts.map +1 -1
- package/dist/stores/mask-store.js +7 -6
- package/dist/stores/mask-store.js.map +1 -1
- package/dist/stores/principal-state.d.ts +16 -0
- package/dist/stores/principal-state.d.ts.map +1 -0
- package/dist/stores/principal-state.js +31 -0
- package/dist/stores/principal-state.js.map +1 -0
- package/dist/stores/principal-store.d.ts +4 -15
- package/dist/stores/principal-store.d.ts.map +1 -1
- package/dist/stores/principal-store.js +7 -28
- package/dist/stores/principal-store.js.map +1 -1
- package/dist/stores/provider-state.d.ts +24 -0
- package/dist/stores/provider-state.d.ts.map +1 -0
- package/dist/stores/provider-state.js +68 -0
- package/dist/stores/provider-state.js.map +1 -0
- package/dist/stores/provider-store.d.ts +4 -23
- package/dist/stores/provider-store.d.ts.map +1 -1
- package/dist/stores/provider-store.js +7 -64
- package/dist/stores/provider-store.js.map +1 -1
- package/dist/stores/share-state.d.ts +29 -0
- package/dist/stores/share-state.d.ts.map +1 -0
- package/dist/stores/share-state.js +21 -0
- package/dist/stores/share-state.js.map +1 -0
- package/dist/stores/share-store.d.ts +4 -28
- package/dist/stores/share-store.d.ts.map +1 -1
- package/dist/stores/share-store.js +7 -18
- package/dist/stores/share-store.js.map +1 -1
- package/dist/stores/store-environment.d.ts +10 -0
- package/dist/stores/store-environment.d.ts.map +1 -0
- package/dist/stores/store-environment.js +2 -0
- package/dist/stores/store-environment.js.map +1 -0
- package/dist/stores/ui-state.d.ts +71 -0
- package/dist/stores/ui-state.d.ts.map +1 -0
- package/dist/stores/ui-state.js +58 -0
- package/dist/stores/ui-state.js.map +1 -0
- package/dist/stores/ui-store.d.ts +4 -45
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +7 -36
- package/dist/stores/ui-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme.css +150 -97
- package/dist/voice/asr-clients.d.ts +2 -1
- package/dist/voice/asr-clients.d.ts.map +1 -1
- package/dist/voice/asr-clients.js +16 -17
- package/dist/voice/asr-clients.js.map +1 -1
- package/dist/voice/use-dictation.d.ts.map +1 -1
- package/dist/voice/use-dictation.js +12 -8
- package/dist/voice/use-dictation.js.map +1 -1
- package/dist/voice/voice-state.d.ts +25 -0
- package/dist/voice/voice-state.d.ts.map +1 -0
- package/dist/voice/voice-state.js +29 -0
- package/dist/voice/voice-state.js.map +1 -0
- package/dist/voice/voice-store.d.ts +4 -25
- package/dist/voice/voice-store.d.ts.map +1 -1
- package/dist/voice/voice-store.js +7 -26
- package/dist/voice/voice-store.js.map +1 -1
- package/package.json +3 -2
- package/src/components/activity/activity-page.tsx +341 -160
- package/src/components/activity/activity-run-detail.tsx +81 -47
- package/src/components/activity/activity-run-list.tsx +27 -59
- package/src/components/activity/activity-views.tsx +155 -0
- package/src/components/activity/approval-card.tsx +117 -0
- package/src/components/activity/digest-card.tsx +25 -61
- package/src/components/activity/digest-summary.tsx +52 -0
- package/src/components/activity/push-switch.tsx +62 -0
- package/src/components/activity/push-toggle.tsx +51 -81
- package/src/components/activity/span-bits.tsx +60 -7
- package/src/components/chat/ask-user-card.tsx +292 -356
- package/src/components/chat/ask-user-typed.ts +77 -0
- package/src/components/chat/brain-markdown-links.tsx +4 -4
- package/src/components/chat/brain-markdown.tsx +4 -2
- package/src/components/chat/chat-page.tsx +41 -11
- package/src/components/chat/composer-view.tsx +194 -0
- package/src/components/chat/composer.tsx +117 -296
- package/src/components/chat/markdown-content.tsx +53 -2
- package/src/components/chat/mermaid-block.tsx +13 -5
- package/src/components/chat/mermaid-share.ts +8 -7
- package/src/components/chat/mermaid-viewer.tsx +3 -1
- package/src/components/chat/message-bubble.tsx +78 -94
- package/src/components/chat/message-share.ts +7 -7
- package/src/components/chat/renderers/bind.tsx +94 -0
- package/src/components/chat/renderers/brain-ui-tools.tsx +56 -0
- package/src/components/chat/renderers/claude-tools.tsx +3 -2
- package/src/components/chat/renderers/index.ts +15 -10
- package/src/components/chat/session-drawer.tsx +41 -138
- package/src/components/chat/session-list.tsx +113 -0
- package/src/components/chat/share-block.tsx +16 -12
- package/src/components/chat/share-card.tsx +2 -2
- package/src/components/chat/subagent-view.tsx +4 -4
- package/src/components/chat/tool-call-timeline.tsx +75 -26
- package/src/components/chat/tool-cards/block-card.tsx +145 -0
- package/src/components/chat/tool-cards/image-mask-card.tsx +214 -0
- package/src/components/chat/tool-cards/location-card.tsx +159 -0
- package/src/components/chat/tool-views.tsx +30 -60
- package/src/components/chat/transcript-turn.tsx +108 -0
- package/src/components/chat/use-chat-commands.ts +14 -16
- package/src/components/chat/welcome-state.tsx +36 -91
- package/src/components/connectivity/connection-gate.tsx +32 -24
- package/src/components/connectivity/login-form.tsx +122 -0
- package/src/components/connectivity/login-screen.tsx +45 -100
- package/src/components/dev/share-harness.tsx +2 -2
- package/src/components/files/file-panel.tsx +168 -0
- package/src/components/files/file-tree-view.tsx +127 -0
- package/src/components/files/file-tree.tsx +55 -109
- package/src/components/files/file-viewer-binary.tsx +3 -2
- package/src/components/files/file-viewer-frame.tsx +113 -0
- package/src/components/files/file-viewer.tsx +40 -95
- package/src/components/files/frontmatter-chips.tsx +42 -0
- package/src/components/files/frontmatter-panel.tsx +6 -71
- package/src/components/files/staleness.ts +29 -0
- package/src/components/graph/graph-canvas.tsx +24 -1
- package/src/components/graph/graph-controls-column.tsx +92 -0
- package/src/components/graph/graph-controls.tsx +83 -127
- package/src/components/graph/graph-form.tsx +183 -0
- package/src/components/graph/graph-maintenance.tsx +9 -14
- package/src/components/graph/graph-node-rail.tsx +147 -0
- package/src/components/graph/graph-page.tsx +189 -49
- package/src/components/graph/graph-scene.tsx +200 -30
- package/src/components/graph/lib/graph-helpers.ts +65 -43
- package/src/components/graph/node-card.tsx +64 -0
- package/src/components/graph/node-popover.tsx +28 -117
- package/src/components/graph/use-graph-theme.ts +69 -32
- package/src/components/graph/use-node-actions.ts +56 -0
- package/src/components/images/image-share.ts +4 -2
- package/src/components/images/image-viewer.tsx +3 -1
- package/src/components/images/mask-editor.tsx +7 -4
- package/src/components/layout/app-shell.tsx +5 -1
- package/src/components/layout/desktop-palette.tsx +151 -0
- package/src/components/layout/key-cap.tsx +15 -0
- package/src/components/layout/mobile-tab-bar.tsx +80 -157
- package/src/components/layout/shortcut-switch.tsx +32 -0
- package/src/components/layout/side-rail.tsx +77 -150
- package/src/components/layout/slide-panel.tsx +49 -6
- package/src/components/layout/theme.tsx +67 -0
- package/src/components/quick-actions/add-form.tsx +196 -0
- package/src/components/quick-actions/add-modal.tsx +32 -153
- package/src/components/quick-actions/search-modal.tsx +15 -5
- package/src/components/quick-actions/streaming-modal.tsx +57 -72
- package/src/components/quick-actions/streaming-output.tsx +112 -0
- package/src/components/quick-actions/whatsup-modal.tsx +53 -59
- package/src/components/settings/devices-agents-tab.tsx +60 -152
- package/src/components/settings/models-list.tsx +299 -0
- package/src/components/settings/models-tab.tsx +63 -337
- package/src/components/settings/one-time-agent-credential.tsx +1 -1
- package/src/components/settings/passkey-list.tsx +201 -0
- package/src/components/settings/passkey-tab.tsx +53 -197
- package/src/components/settings/pi-accounts-list.tsx +128 -0
- package/src/components/settings/pi-accounts.tsx +71 -170
- package/src/components/settings/principal-list.tsx +172 -0
- package/src/components/settings/settings-panel.tsx +239 -25
- package/src/components/settings/skills-list.tsx +276 -0
- package/src/components/settings/skills-tab.tsx +82 -269
- package/src/components/settings/tool-permissions-list.tsx +54 -0
- package/src/components/settings/tool-permissions.tsx +27 -46
- package/src/components/settings/web-search-chain.tsx +300 -0
- package/src/components/settings/web-search-settings.tsx +58 -328
- package/src/components/share/share-menu.tsx +19 -4
- package/src/components/voice/dictation-sheet.tsx +5 -5
- package/src/components/voice/mic-button.tsx +1 -1
- package/src/components/voice/review-card.tsx +1 -1
- package/src/config.ts +21 -7
- package/src/connection.ts +443 -0
- package/src/default-root.ts +16 -0
- package/src/hooks/use-color-scheme.ts +36 -0
- package/src/hooks/use-fine-pointer.ts +15 -0
- package/src/hooks/use-hash-routes.ts +4 -2
- package/src/hooks/use-media-query.ts +35 -0
- package/src/hooks/use-share-intake.ts +32 -12
- package/src/hooks/use-vpn-status.ts +18 -17
- package/src/hooks/use-websocket.ts +12 -428
- package/src/hooks/websocket-handlers/activity.ts +4 -5
- package/src/hooks/websocket-handlers/chat.ts +28 -6
- package/src/hooks/websocket-handlers/connection.ts +4 -6
- package/src/hooks/websocket-handlers/mask.ts +2 -3
- package/src/hooks/websocket-handlers/provider.ts +4 -6
- package/src/hooks/websocket-handlers/types.ts +6 -2
- package/src/index.ts +7 -3
- package/src/lib/api-client.ts +426 -384
- package/src/lib/backend.ts +20 -10
- package/src/lib/diff.ts +28 -62
- package/src/lib/light-dark.ts +83 -0
- package/src/lib/mermaid-theme.ts +183 -214
- package/src/lib/passkeys.ts +12 -4
- package/src/lib/push-registration.ts +19 -2
- package/src/lib/share-intake.ts +6 -3
- package/src/lib/share.ts +7 -4
- package/src/lib/single-key.ts +47 -0
- package/src/lib/tool-names.ts +31 -8
- package/src/root-context.tsx +40 -0
- package/src/root.ts +83 -0
- package/src/stores/activity-state.ts +295 -0
- package/src/stores/activity-store.ts +11 -285
- package/src/stores/chat-state.ts +822 -0
- package/src/stores/chat-store.ts +11 -705
- package/src/stores/connection-state.ts +78 -0
- package/src/stores/connection-store.ts +11 -76
- package/src/stores/create-stores.ts +31 -0
- package/src/stores/file-state.ts +399 -0
- package/src/stores/file-store.ts +9 -390
- package/src/stores/graph-state.ts +368 -0
- package/src/stores/graph-store.ts +10 -355
- package/src/stores/mask-state.ts +30 -0
- package/src/stores/mask-store.ts +10 -27
- package/src/stores/principal-state.ts +42 -0
- package/src/stores/principal-store.ts +10 -37
- package/src/stores/provider-state.ts +103 -0
- package/src/stores/provider-store.ts +10 -95
- package/src/stores/share-state.ts +56 -0
- package/src/stores/share-store.ts +11 -54
- package/src/stores/store-environment.ts +10 -0
- package/src/stores/ui-state.ts +143 -0
- package/src/stores/ui-store.ts +11 -93
- package/src/styles.css +4 -1
- package/src/theme.css +150 -97
- package/src/voice/asr-clients.ts +17 -17
- package/src/voice/use-dictation.ts +11 -8
- package/src/voice/voice-state.ts +57 -0
- package/src/voice/voice-store.ts +11 -55
|
@@ -1,42 +1,49 @@
|
|
|
1
|
+
import { useBrainUiRoot } from "../../root-context.js";
|
|
1
2
|
import { useEffect, useRef, useState } from "react";
|
|
2
3
|
import { Loader2, Search, SlidersHorizontal, X } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
+
import type { BrainSearchHit } from "../../lib/api-client.js";
|
|
5
|
+
import { useMediaQuery } from "../../hooks/use-media-query.js";
|
|
4
6
|
import {
|
|
5
7
|
useGraphStore,
|
|
6
8
|
type DiscoveryColorBy,
|
|
7
9
|
type LocalDirection,
|
|
8
10
|
type SizeBy,
|
|
9
11
|
} from "../../stores/graph-store.js";
|
|
10
|
-
import {
|
|
12
|
+
import { Field, Rows, Segmented, ToggleRow, ValueRow } from "./graph-form.js";
|
|
13
|
+
|
|
14
|
+
/** D22's ladder: the expanded rail, and D6's controls column, from 900. */
|
|
15
|
+
export const LAPTOP_QUERY = "(min-width: 900px)";
|
|
16
|
+
/** D6's four-pane rule: the right rail needs 1440. */
|
|
17
|
+
export const WIDE_QUERY = "(min-width: 1440px)";
|
|
18
|
+
|
|
19
|
+
const DEPTHS = [1, 2, 3] as const;
|
|
11
20
|
|
|
12
21
|
/**
|
|
13
|
-
* Per-mode option forms.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
22
|
+
* Per-mode option forms. Below `laptop:` they live in a slide-up sheet
|
|
23
|
+
* behind a filter button (tap targets kept at >= 44px). From `laptop:` up
|
|
24
|
+
* the D6 controls column (`GraphControlsColumn`) owns `ControlsBody` and
|
|
25
|
+
* this overlay renders nothing — one picker in the DOM, never two.
|
|
26
|
+
*
|
|
27
|
+
* This is the container (S7): every option reads and writes the graph
|
|
28
|
+
* store; the form primitives are `graph-form.tsx`, on the kit.
|
|
17
29
|
*/
|
|
18
30
|
export function GraphControls() {
|
|
19
31
|
const [mobileOpen, setMobileOpen] = useState(false);
|
|
32
|
+
const laptop = useMediaQuery(LAPTOP_QUERY);
|
|
33
|
+
if (laptop) return null;
|
|
20
34
|
|
|
21
35
|
return (
|
|
22
36
|
<>
|
|
23
|
-
{/* Mobile: floating filter button */}
|
|
24
37
|
<button
|
|
25
38
|
onClick={() => setMobileOpen(true)}
|
|
26
|
-
className="absolute right-3 top-3 z-10 flex h-11 w-11 items-center justify-center rounded-full border border-border bg-surface-overlay text-foreground shadow-lg
|
|
39
|
+
className="absolute right-3 top-3 z-10 flex h-11 w-11 items-center justify-center rounded-full border border-border bg-surface-overlay text-foreground shadow-lg"
|
|
27
40
|
title="Graph options"
|
|
28
41
|
>
|
|
29
42
|
<SlidersHorizontal className="h-4.5 w-4.5" />
|
|
30
43
|
</button>
|
|
31
44
|
|
|
32
|
-
{/* Desktop: docked card */}
|
|
33
|
-
<div className="absolute right-4 top-4 z-10 hidden w-64 rounded-xl border border-border bg-surface-overlay/95 p-4 shadow-xl backdrop-blur md:block">
|
|
34
|
-
<ControlsBody />
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
{/* Mobile: bottom sheet */}
|
|
38
45
|
{mobileOpen && (
|
|
39
|
-
<div className="fixed inset-0 z-40
|
|
46
|
+
<div className="fixed inset-0 z-40">
|
|
40
47
|
<div
|
|
41
48
|
className="absolute inset-0 bg-background/60"
|
|
42
49
|
onClick={() => setMobileOpen(false)}
|
|
@@ -60,19 +67,46 @@ export function GraphControls() {
|
|
|
60
67
|
);
|
|
61
68
|
}
|
|
62
69
|
|
|
63
|
-
|
|
70
|
+
/** The per-mode form. Shared by the phone sheet and the D6 column. */
|
|
71
|
+
export function ControlsBody() {
|
|
64
72
|
const mode = useGraphStore((s) => s.mode);
|
|
65
73
|
return (
|
|
66
74
|
<div className="flex flex-col gap-4">
|
|
67
75
|
<SceneSearch />
|
|
68
76
|
{mode === "local" && <LocalControls />}
|
|
69
77
|
{mode === "discovery" && <DiscoveryControls />}
|
|
78
|
+
{(mode === "local" || mode === "discovery") && <ColourControls />}
|
|
70
79
|
{mode === "clusters" && <ClustersControls />}
|
|
71
80
|
{mode === "maintenance" && <MaintenanceControls />}
|
|
72
81
|
</div>
|
|
73
82
|
);
|
|
74
83
|
}
|
|
75
84
|
|
|
85
|
+
/** The four colourings, in the design's order. */
|
|
86
|
+
export const COLOUR_RULES: { value: DiscoveryColorBy; label: string }[] = [
|
|
87
|
+
{ value: "topic", label: "Topic" },
|
|
88
|
+
{ value: "distance", label: "Distance" },
|
|
89
|
+
{ value: "folder", label: "Folder" },
|
|
90
|
+
{ value: "entity", label: "Entity" },
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* D6's `Label "Colour"` + `FilterRow` (topic · distance · folder · entity),
|
|
95
|
+
* for the two modes drawn around a focus node. Every rule is servable from
|
|
96
|
+
* what a node carries — `community`, `distance`, `path`, `type` — so none is
|
|
97
|
+
* disabled; a corpus with no computed topics colours everything neutral
|
|
98
|
+
* under "Topic" and the legend says so, rather than hiding the rule.
|
|
99
|
+
*/
|
|
100
|
+
function ColourControls() {
|
|
101
|
+
const colorBy = useGraphStore((s) => s.discoveryColorBy);
|
|
102
|
+
const setColorBy = useGraphStore((s) => s.setDiscoveryColorBy);
|
|
103
|
+
return (
|
|
104
|
+
<Field label="Colour">
|
|
105
|
+
<Segmented options={COLOUR_RULES} value={colorBy} onChange={(v) => setColorBy(v as DiscoveryColorBy)} />
|
|
106
|
+
</Field>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
|
|
76
110
|
/** Highlights matches in the current scene — no refetch. */
|
|
77
111
|
function SceneSearch() {
|
|
78
112
|
const sceneQuery = useGraphStore((s) => s.sceneQuery);
|
|
@@ -113,17 +147,6 @@ function LocalControls() {
|
|
|
113
147
|
onPick={(path) => setLocalParams({ center: path })}
|
|
114
148
|
/>
|
|
115
149
|
</Field>
|
|
116
|
-
<Field label="Depth">
|
|
117
|
-
<Segmented
|
|
118
|
-
options={[
|
|
119
|
-
{ value: "1", label: "1" },
|
|
120
|
-
{ value: "2", label: "2" },
|
|
121
|
-
{ value: "3", label: "3" },
|
|
122
|
-
]}
|
|
123
|
-
value={String(local.depth)}
|
|
124
|
-
onChange={(v) => setLocalParams({ depth: Number(v) as 1 | 2 | 3 })}
|
|
125
|
-
/>
|
|
126
|
-
</Field>
|
|
127
150
|
<Field label="Direction">
|
|
128
151
|
<Segmented
|
|
129
152
|
options={[
|
|
@@ -135,6 +158,16 @@ function LocalControls() {
|
|
|
135
158
|
onChange={(v) => setLocalParams({ direction: v as LocalDirection })}
|
|
136
159
|
/>
|
|
137
160
|
</Field>
|
|
161
|
+
<Rows>
|
|
162
|
+
<ValueRow
|
|
163
|
+
label="Depth"
|
|
164
|
+
options={DEPTHS}
|
|
165
|
+
value={local.depth}
|
|
166
|
+
format={(d) => `${d} hop${d === 1 ? "" : "s"}`}
|
|
167
|
+
onChange={(depth) => setLocalParams({ depth })}
|
|
168
|
+
last
|
|
169
|
+
/>
|
|
170
|
+
</Rows>
|
|
138
171
|
</>
|
|
139
172
|
);
|
|
140
173
|
}
|
|
@@ -142,8 +175,6 @@ function LocalControls() {
|
|
|
142
175
|
function DiscoveryControls() {
|
|
143
176
|
const discovery = useGraphStore((s) => s.discovery);
|
|
144
177
|
const setDiscoveryParams = useGraphStore((s) => s.setDiscoveryParams);
|
|
145
|
-
const colorBy = useGraphStore((s) => s.discoveryColorBy);
|
|
146
|
-
const setColorBy = useGraphStore((s) => s.setDiscoveryColorBy);
|
|
147
178
|
const defaultRoot = useGraphStore((s) => s.meta?.defaultRoot ?? null);
|
|
148
179
|
|
|
149
180
|
return (
|
|
@@ -173,16 +204,6 @@ function DiscoveryControls() {
|
|
|
173
204
|
className="w-full accent-(--color-primary)"
|
|
174
205
|
/>
|
|
175
206
|
</Field>
|
|
176
|
-
<Field label="Color by">
|
|
177
|
-
<Segmented
|
|
178
|
-
options={[
|
|
179
|
-
{ value: "distance", label: "Distance" },
|
|
180
|
-
{ value: "folder", label: "Folder" },
|
|
181
|
-
]}
|
|
182
|
-
value={colorBy}
|
|
183
|
-
onChange={(v) => setColorBy(v as DiscoveryColorBy)}
|
|
184
|
-
/>
|
|
185
|
-
</Field>
|
|
186
207
|
{/* Direction is only meaningful with an explicit root: the default-root
|
|
187
208
|
distances were walked once at index time. */}
|
|
188
209
|
</>
|
|
@@ -206,13 +227,15 @@ function ClustersControls() {
|
|
|
206
227
|
onChange={(v) => setSizeBy(v as SizeBy)}
|
|
207
228
|
/>
|
|
208
229
|
</Field>
|
|
209
|
-
<
|
|
210
|
-
<
|
|
230
|
+
<Rows>
|
|
231
|
+
<ToggleRow
|
|
211
232
|
checked={clusters.isolates}
|
|
212
233
|
onChange={(v) => setClustersParams({ isolates: v })}
|
|
213
|
-
label="
|
|
234
|
+
label="Isolated notes"
|
|
235
|
+
subtitle="include notes without links"
|
|
236
|
+
last
|
|
214
237
|
/>
|
|
215
|
-
</
|
|
238
|
+
</Rows>
|
|
216
239
|
</>
|
|
217
240
|
);
|
|
218
241
|
}
|
|
@@ -225,28 +248,29 @@ function MaintenanceControls() {
|
|
|
225
248
|
return (
|
|
226
249
|
<>
|
|
227
250
|
<Field label="Findings">
|
|
228
|
-
<
|
|
229
|
-
<
|
|
251
|
+
<Rows>
|
|
252
|
+
<ToggleRow
|
|
230
253
|
checked={filters.orphans}
|
|
231
254
|
onChange={(v) => setFilters({ orphans: v })}
|
|
232
255
|
label="Orphans"
|
|
233
256
|
/>
|
|
234
|
-
<
|
|
257
|
+
<ToggleRow
|
|
235
258
|
checked={filters.unreachable}
|
|
236
259
|
onChange={(v) => setFilters({ unreachable: v })}
|
|
237
260
|
label="Unreachable"
|
|
238
261
|
/>
|
|
239
|
-
<
|
|
262
|
+
<ToggleRow
|
|
240
263
|
checked={filters.broken}
|
|
241
264
|
onChange={(v) => setFilters({ broken: v })}
|
|
242
265
|
label="Broken links"
|
|
243
266
|
/>
|
|
244
|
-
<
|
|
267
|
+
<ToggleRow
|
|
245
268
|
checked={filters.stale}
|
|
246
269
|
onChange={(v) => setFilters({ stale: v })}
|
|
247
270
|
label="Stale notes"
|
|
271
|
+
last
|
|
248
272
|
/>
|
|
249
|
-
</
|
|
273
|
+
</Rows>
|
|
250
274
|
</Field>
|
|
251
275
|
<Field label={`Stale after ${maintenance.staleDays} days`}>
|
|
252
276
|
<input
|
|
@@ -263,82 +287,6 @@ function MaintenanceControls() {
|
|
|
263
287
|
);
|
|
264
288
|
}
|
|
265
289
|
|
|
266
|
-
// --- Small form primitives ---------------------------------------------------
|
|
267
|
-
|
|
268
|
-
function Field({ label, children }: { label: string; children: React.ReactNode }) {
|
|
269
|
-
return (
|
|
270
|
-
<div>
|
|
271
|
-
<div className="mb-1.5 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">
|
|
272
|
-
{label}
|
|
273
|
-
</div>
|
|
274
|
-
{children}
|
|
275
|
-
</div>
|
|
276
|
-
);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function Segmented({
|
|
280
|
-
options,
|
|
281
|
-
value,
|
|
282
|
-
onChange,
|
|
283
|
-
}: {
|
|
284
|
-
options: { value: string; label: string }[];
|
|
285
|
-
value: string;
|
|
286
|
-
onChange: (value: string) => void;
|
|
287
|
-
}) {
|
|
288
|
-
return (
|
|
289
|
-
<div className="flex rounded-lg border border-border bg-surface-raised p-0.5">
|
|
290
|
-
{options.map((opt) => (
|
|
291
|
-
<button
|
|
292
|
-
key={opt.value}
|
|
293
|
-
onClick={() => onChange(opt.value)}
|
|
294
|
-
className={cn(
|
|
295
|
-
"min-h-9 flex-1 rounded-md px-2 py-1.5 text-xs font-medium transition-colors",
|
|
296
|
-
value === opt.value
|
|
297
|
-
? "bg-surface-overlay text-foreground"
|
|
298
|
-
: "text-muted-foreground hover:text-foreground"
|
|
299
|
-
)}
|
|
300
|
-
>
|
|
301
|
-
{opt.label}
|
|
302
|
-
</button>
|
|
303
|
-
))}
|
|
304
|
-
</div>
|
|
305
|
-
);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function Toggle({
|
|
309
|
-
checked,
|
|
310
|
-
onChange,
|
|
311
|
-
label,
|
|
312
|
-
}: {
|
|
313
|
-
checked: boolean;
|
|
314
|
-
onChange: (checked: boolean) => void;
|
|
315
|
-
label: string;
|
|
316
|
-
}) {
|
|
317
|
-
return (
|
|
318
|
-
<button
|
|
319
|
-
role="switch"
|
|
320
|
-
aria-checked={checked}
|
|
321
|
-
onClick={() => onChange(!checked)}
|
|
322
|
-
className="flex min-h-9 w-full items-center justify-between gap-2 text-left text-xs text-foreground"
|
|
323
|
-
>
|
|
324
|
-
{label}
|
|
325
|
-
<span
|
|
326
|
-
className={cn(
|
|
327
|
-
"relative h-5 w-9 shrink-0 rounded-full transition-colors",
|
|
328
|
-
checked ? "bg-primary" : "bg-surface-raised border border-border"
|
|
329
|
-
)}
|
|
330
|
-
>
|
|
331
|
-
<span
|
|
332
|
-
className={cn(
|
|
333
|
-
"absolute top-0.5 h-4 w-4 rounded-full bg-foreground transition-transform",
|
|
334
|
-
checked ? "translate-x-4" : "translate-x-0.5"
|
|
335
|
-
)}
|
|
336
|
-
/>
|
|
337
|
-
</span>
|
|
338
|
-
</button>
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
290
|
/**
|
|
343
291
|
* Debounced note search backed by /api/brain/search — the graph twin of the
|
|
344
292
|
* search modal's flow, inlined so picking a center/root never leaves the view.
|
|
@@ -352,12 +300,20 @@ function NotePicker({
|
|
|
352
300
|
placeholder?: string;
|
|
353
301
|
onPick: (path: string) => void;
|
|
354
302
|
}) {
|
|
303
|
+
const root = useBrainUiRoot();
|
|
304
|
+
const api = root.api;
|
|
355
305
|
const [query, setQuery] = useState("");
|
|
356
306
|
const [editing, setEditing] = useState(false);
|
|
357
307
|
const [results, setResults] = useState<BrainSearchHit[]>([]);
|
|
358
308
|
const [loading, setLoading] = useState(false);
|
|
359
309
|
const controllerRef = useRef<AbortController | null>(null);
|
|
310
|
+
const blurTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
|
|
360
311
|
|
|
312
|
+
useEffect(() => {
|
|
313
|
+
setQuery(""); setEditing(false); setResults([]);
|
|
314
|
+
const cleanup = () => clearTimeout(blurTimer.current);
|
|
315
|
+
return cleanup;
|
|
316
|
+
}, [root]);
|
|
361
317
|
const trimmed = query.trim();
|
|
362
318
|
|
|
363
319
|
useEffect(() => {
|
|
@@ -388,7 +344,7 @@ function NotePicker({
|
|
|
388
344
|
clearTimeout(t);
|
|
389
345
|
controllerRef.current?.abort();
|
|
390
346
|
};
|
|
391
|
-
}, [editing, trimmed]);
|
|
347
|
+
}, [editing, trimmed, root, api]);
|
|
392
348
|
|
|
393
349
|
return (
|
|
394
350
|
<div className="relative">
|
|
@@ -402,7 +358,7 @@ function NotePicker({
|
|
|
402
358
|
}}
|
|
403
359
|
onBlur={() => {
|
|
404
360
|
// Delay so a click on a result lands before the list unmounts.
|
|
405
|
-
setTimeout(() => setEditing(false), 150);
|
|
361
|
+
blurTimer.current = setTimeout(() => setEditing(false), 150);
|
|
406
362
|
}}
|
|
407
363
|
onChange={(e) => setQuery(e.target.value)}
|
|
408
364
|
placeholder={placeholder}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { FilterRow, Label, ListRow, Surface, Toggle } from "@schlessera/brain-ui-kit";
|
|
2
|
+
import { useId, type ReactNode } from "react";
|
|
3
|
+
import { cn } from "../../lib/utils.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The graph options form's primitives, on the kit (S7, the `graph`
|
|
7
|
+
* directory). `GraphControls` stays the container — every option reads and
|
|
8
|
+
* writes the graph store — and composes these. The canvas itself is WebGL
|
|
9
|
+
* and has no kit counterpart; the kit's `GraphView` is a static
|
|
10
|
+
* neighbourhood drawing for a chat answer, not a scene.
|
|
11
|
+
*
|
|
12
|
+
* A segmented choice is the kit `FilterRow`: one tab stop, ←→ and Home/End
|
|
13
|
+
* inside, activation following focus — which is what a mode switch is. A
|
|
14
|
+
* switch is the kit `Toggle`, named by the visible text beside it.
|
|
15
|
+
*
|
|
16
|
+
* D6 draws the depth and the switches as a `Surface pad={0}` of group
|
|
17
|
+
* `ListRow`s (`Rows`, `ToggleRow`, `ValueRow`): the row carries the handler
|
|
18
|
+
* and its own title names it, the same shape D5's Settings groups use.
|
|
19
|
+
*/
|
|
20
|
+
export function Field({ label, children }: { label: string; children: ReactNode }) {
|
|
21
|
+
return (
|
|
22
|
+
<div>
|
|
23
|
+
<div className="mb-1.5">
|
|
24
|
+
<Label text={label} />
|
|
25
|
+
</div>
|
|
26
|
+
{children}
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function Segmented({
|
|
32
|
+
options,
|
|
33
|
+
value,
|
|
34
|
+
onChange,
|
|
35
|
+
}: {
|
|
36
|
+
options: { value: string; label: string }[];
|
|
37
|
+
value: string;
|
|
38
|
+
onChange: (value: string) => void;
|
|
39
|
+
}) {
|
|
40
|
+
const active = Math.max(0, options.findIndex((o) => o.value === value));
|
|
41
|
+
return (
|
|
42
|
+
<FilterRow
|
|
43
|
+
items={options.map((o) => ({ label: o.label, onClick: () => onChange(o.value) }))}
|
|
44
|
+
active={active}
|
|
45
|
+
mono={false}
|
|
46
|
+
/>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function SwitchRow({
|
|
51
|
+
checked,
|
|
52
|
+
onChange,
|
|
53
|
+
label,
|
|
54
|
+
}: {
|
|
55
|
+
checked: boolean;
|
|
56
|
+
onChange: (checked: boolean) => void;
|
|
57
|
+
label: string;
|
|
58
|
+
}) {
|
|
59
|
+
const id = useId();
|
|
60
|
+
return (
|
|
61
|
+
<div className="flex min-h-11 w-full items-center justify-between gap-3 text-xs text-foreground">
|
|
62
|
+
<span id={id}>{label}</span>
|
|
63
|
+
<Toggle on={checked} tone="amber" labelledBy={id} onClick={() => onChange(!checked)} />
|
|
64
|
+
</div>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** A `Surface pad={0}` of group `ListRow`s — D6's depth and switch block. */
|
|
69
|
+
export function Rows({ children }: { children: ReactNode }) {
|
|
70
|
+
return <Surface pad={0}>{children}</Surface>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A switch row inside `Rows`. The kit `ListRow`'s toggle is decorative and
|
|
75
|
+
* the row is the button, named by its title (the D5 pattern).
|
|
76
|
+
*/
|
|
77
|
+
export function ToggleRow({
|
|
78
|
+
checked,
|
|
79
|
+
onChange,
|
|
80
|
+
label,
|
|
81
|
+
subtitle,
|
|
82
|
+
tone = "amber",
|
|
83
|
+
last = false,
|
|
84
|
+
}: {
|
|
85
|
+
checked: boolean;
|
|
86
|
+
onChange: (checked: boolean) => void;
|
|
87
|
+
label: string;
|
|
88
|
+
subtitle?: string;
|
|
89
|
+
tone?: "amber" | "teal" | "purple";
|
|
90
|
+
last?: boolean;
|
|
91
|
+
}) {
|
|
92
|
+
return (
|
|
93
|
+
<ListRow
|
|
94
|
+
title={label}
|
|
95
|
+
subtitle={subtitle}
|
|
96
|
+
subMono={subtitle !== undefined}
|
|
97
|
+
toggle={checked}
|
|
98
|
+
toggleTone={tone}
|
|
99
|
+
last={last}
|
|
100
|
+
onClick={() => onChange(!checked)}
|
|
101
|
+
/>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* A switch the host cannot serve yet, drawn anyway (the sixth pass, §3b:
|
|
107
|
+
* "until that exists the control is drawn but disabled with its reason, the
|
|
108
|
+
* same rule the palette follows"). The reason prints in mono where the
|
|
109
|
+
* subtitle would go, and the switch is the kit `Toggle` in its disabled
|
|
110
|
+
* state — `aria-disabled`, out of the tab order, dimmed by the kit's own
|
|
111
|
+
* rule, never a bare opacity on the row. It keeps its role and its name,
|
|
112
|
+
* because a control the reader is told about should also be one a screen
|
|
113
|
+
* reader can find. The no-op handler is what gives it the role: the kit
|
|
114
|
+
* gates every operable trait on a handler, and "disabled" is a state of an
|
|
115
|
+
* operable switch, not the absence of one.
|
|
116
|
+
*/
|
|
117
|
+
export function DisabledToggleRow({
|
|
118
|
+
label,
|
|
119
|
+
reason,
|
|
120
|
+
tone = "amber",
|
|
121
|
+
last = false,
|
|
122
|
+
}: {
|
|
123
|
+
label: string;
|
|
124
|
+
/** Mono, printed under the title: "needs provenance". */
|
|
125
|
+
reason: string;
|
|
126
|
+
tone?: "amber" | "teal" | "purple";
|
|
127
|
+
last?: boolean;
|
|
128
|
+
}) {
|
|
129
|
+
const id = useId();
|
|
130
|
+
return (
|
|
131
|
+
<div
|
|
132
|
+
className={cn(
|
|
133
|
+
"flex min-h-14 w-full items-center justify-between gap-3 px-3.5 py-2.5",
|
|
134
|
+
!last && "border-b border-border"
|
|
135
|
+
)}
|
|
136
|
+
data-disabled-row=""
|
|
137
|
+
>
|
|
138
|
+
<div className="flex min-w-0 flex-col gap-1">
|
|
139
|
+
<span id={id} className="text-[13px] text-foreground">
|
|
140
|
+
{label}
|
|
141
|
+
</span>
|
|
142
|
+
<span className="font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground">{reason}</span>
|
|
143
|
+
</div>
|
|
144
|
+
<Toggle on={false} tone={tone} labelledBy={id} disabled onClick={noop} />
|
|
145
|
+
</div>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function noop() {}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A row whose trailing mono value is the current choice and whose click
|
|
153
|
+
* steps to the next one — D6's `Depth · 2 hops`. The subtitle spells the
|
|
154
|
+
* ring so the step is not a surprise.
|
|
155
|
+
*/
|
|
156
|
+
export function ValueRow<T extends string | number>({
|
|
157
|
+
label,
|
|
158
|
+
options,
|
|
159
|
+
value,
|
|
160
|
+
format,
|
|
161
|
+
onChange,
|
|
162
|
+
last = false,
|
|
163
|
+
}: {
|
|
164
|
+
label: string;
|
|
165
|
+
options: readonly T[];
|
|
166
|
+
value: T;
|
|
167
|
+
format: (value: T) => string;
|
|
168
|
+
onChange: (value: T) => void;
|
|
169
|
+
last?: boolean;
|
|
170
|
+
}) {
|
|
171
|
+
const index = Math.max(0, options.indexOf(value));
|
|
172
|
+
const next = options[(index + 1) % options.length]!;
|
|
173
|
+
return (
|
|
174
|
+
<ListRow
|
|
175
|
+
title={label}
|
|
176
|
+
subtitle={options.map(format).join(" · ")}
|
|
177
|
+
subMono
|
|
178
|
+
value={format(value)}
|
|
179
|
+
last={last}
|
|
180
|
+
onClick={() => onChange(next)}
|
|
181
|
+
/>
|
|
182
|
+
);
|
|
183
|
+
}
|
|
@@ -13,17 +13,9 @@ import { GraphEmptyState } from "./graph-empty-state.js";
|
|
|
13
13
|
import { GraphCanvas } from "./graph-canvas-lazy.js";
|
|
14
14
|
import { CenteredSpinner } from "./graph-spinner.js";
|
|
15
15
|
import { matchScene } from "./lib/graph-helpers.js";
|
|
16
|
+
import { useGraphTheme } from "./use-graph-theme.js";
|
|
16
17
|
import { cn } from "../../lib/utils.js";
|
|
17
18
|
|
|
18
|
-
/** Finding-type colors: dataviz status palette (warning/serious/critical) plus
|
|
19
|
-
* the light end of the distance ramp for "stale" — checked against #0c0e12. */
|
|
20
|
-
const FINDING_COLORS = {
|
|
21
|
-
orphan: "#fab219",
|
|
22
|
-
unreachable: "#ec835a",
|
|
23
|
-
broken: "#d03b3b",
|
|
24
|
-
stale: "#86b6ef",
|
|
25
|
-
} as const;
|
|
26
|
-
|
|
27
19
|
// --- Maintenance -------------------------------------------------------------
|
|
28
20
|
|
|
29
21
|
type FindingKind = "orphan" | "unreachable" | "stale";
|
|
@@ -51,6 +43,9 @@ export function MaintenanceBody() {
|
|
|
51
43
|
const openFile = useFileStore((s) => s.openFile);
|
|
52
44
|
const setFilePanelOpen = useUIStore((s) => s.setFilePanelOpen);
|
|
53
45
|
const listRef = useRef<HTMLDivElement>(null);
|
|
46
|
+
// The four lenses: the kit's `--bk-canvas-lens-*`, resolved for the scheme
|
|
47
|
+
// in force, so the list's headings and the canvas agree in both themes.
|
|
48
|
+
const lens = useGraphTheme().palette.lens;
|
|
54
49
|
|
|
55
50
|
// One node per document, first matching section wins (a stale orphan is an
|
|
56
51
|
// orphan); ring index encodes the finding kind.
|
|
@@ -122,7 +117,7 @@ export function MaintenanceBody() {
|
|
|
122
117
|
hoveredId={hoveredId}
|
|
123
118
|
matchIds={matchIds}
|
|
124
119
|
nodeColor={(node) =>
|
|
125
|
-
|
|
120
|
+
lens[(node as FindingNode).finding ?? "stale"]
|
|
126
121
|
}
|
|
127
122
|
onSelect={select}
|
|
128
123
|
onHover={hover}
|
|
@@ -143,7 +138,7 @@ export function MaintenanceBody() {
|
|
|
143
138
|
<FindingSection
|
|
144
139
|
title={`Orphans (${findings.orphans.length})`}
|
|
145
140
|
hint="No links in or out."
|
|
146
|
-
color={
|
|
141
|
+
color={lens.orphan}
|
|
147
142
|
nodes={findings.orphans}
|
|
148
143
|
selectedId={selectedId}
|
|
149
144
|
onSelect={select}
|
|
@@ -154,7 +149,7 @@ export function MaintenanceBody() {
|
|
|
154
149
|
<FindingSection
|
|
155
150
|
title={`Unreachable from root (${findings.unreachable.length})`}
|
|
156
151
|
hint="No link path from the graph root reaches these."
|
|
157
|
-
color={
|
|
152
|
+
color={lens.unreachable}
|
|
158
153
|
nodes={findings.unreachable}
|
|
159
154
|
selectedId={selectedId}
|
|
160
155
|
onSelect={select}
|
|
@@ -166,7 +161,7 @@ export function MaintenanceBody() {
|
|
|
166
161
|
<SectionHeading
|
|
167
162
|
title={`Broken links (${findings.brokenLinks.length})`}
|
|
168
163
|
hint="Wiki links whose target resolves to nothing."
|
|
169
|
-
color={
|
|
164
|
+
color={lens.broken}
|
|
170
165
|
/>
|
|
171
166
|
<FindingRows
|
|
172
167
|
empty={findings.brokenLinks.length === 0}
|
|
@@ -183,7 +178,7 @@ export function MaintenanceBody() {
|
|
|
183
178
|
<FindingSection
|
|
184
179
|
title={`Stale notes (${findings.stale.length})`}
|
|
185
180
|
hint={`Untouched for over ${findings.staleDays} days.`}
|
|
186
|
-
color={
|
|
181
|
+
color={lens.stale}
|
|
187
182
|
nodes={findings.stale}
|
|
188
183
|
subOf={(n) => `${(n as GraphNodePayload & { updated: string }).updated} · ${n.path}`}
|
|
189
184
|
selectedId={selectedId}
|