@stephen-netu/design-system 0.2.1 → 0.5.1
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/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte +10 -2
- package/dist/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte.d.ts.map +1 -1
- package/dist/b0-app-shell/{command-bar/CommandBar.svelte → global-command-bar/GlobalCommandBar.svelte} +75 -75
- package/dist/b0-app-shell/{command-bar/CommandBar.svelte.d.ts → global-command-bar/GlobalCommandBar.svelte.d.ts} +6 -6
- package/dist/b0-app-shell/global-command-bar/GlobalCommandBar.svelte.d.ts.map +1 -0
- package/dist/b0-app-shell/index.d.ts +1 -1
- package/dist/b0-app-shell/index.d.ts.map +1 -1
- package/dist/b0-app-shell/index.js +1 -1
- package/dist/d0-data-viz/BarChart.test.js +53 -0
- package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
- package/dist/d0-data-viz/CheckpointPill.svelte +8 -3
- package/dist/d0-data-viz/CheckpointPill.svelte.d.ts.map +1 -1
- package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
- package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
- package/dist/d0-data-viz/MetricCard.test.js +57 -0
- package/dist/d0-data-viz/SparkLine.test.js +47 -0
- package/dist/d0-data-viz/StorageMap.test.js +63 -0
- package/dist/d0-data-viz/Timeline.test.js +62 -0
- package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
- package/dist/d0-data-viz/checkpoint-types.js +1 -1
- package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
- package/dist/d0-data-viz/storage-map-types.js +6 -3
- package/dist/d0-data-viz/theme-integration.d.ts +3 -3
- package/dist/d0-data-viz/theme-integration.js +4 -4
- package/dist/d0-data-viz/theme-integration.test.js +41 -0
- package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
- package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
- package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
- package/dist/demos/BspSizingInfographic.svelte +3 -32
- package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
- package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
- package/dist/demos/index.d.ts +1 -0
- package/dist/demos/index.d.ts.map +1 -1
- package/dist/demos/index.js +1 -0
- package/dist/editor/CodeEditor.svelte +83 -26
- package/dist/editor/CodeEditor.svelte.d.ts +0 -1
- package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
- package/dist/editor/CodeEditor.test.js +38 -0
- package/dist/editor/ExternalChangeDialog.svelte +117 -0
- package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
- package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
- package/dist/editor/FindReplaceDialog.svelte +32 -32
- package/dist/editor/MarkdownEditor.svelte +105 -605
- package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
- package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
- package/dist/editor/MarkdownEditor.test.js +38 -0
- package/dist/editor/codemirror-config.d.ts +36 -0
- package/dist/editor/codemirror-config.d.ts.map +1 -0
- package/dist/editor/codemirror-config.js +87 -0
- package/dist/editor/components/CorrectionTooltip.svelte +180 -160
- package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
- package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
- package/dist/editor/extensions/autocomplete.d.ts +2 -2
- package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
- package/dist/editor/extensions/autocomplete.test.js +121 -0
- package/dist/editor/extensions/spellcheck.d.ts +21 -3
- package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
- package/dist/editor/extensions/spellcheck.js +51 -9
- package/dist/editor/extensions/spellcheck.test.js +168 -0
- package/dist/editor/extensions/types.d.ts +2 -1
- package/dist/editor/extensions/types.d.ts.map +1 -1
- package/dist/editor/index.d.ts +2 -1
- package/dist/editor/index.d.ts.map +1 -1
- package/dist/editor/index.js +1 -0
- package/dist/editor/markdown-preview.d.ts +9 -0
- package/dist/editor/markdown-preview.d.ts.map +1 -0
- package/dist/editor/markdown-preview.js +19 -0
- package/dist/editor/markdown-preview.test.js +38 -0
- package/dist/editor/useCodeMirror.d.ts +23 -0
- package/dist/editor/useCodeMirror.d.ts.map +1 -0
- package/dist/editor/useCodeMirror.js +40 -0
- package/dist/editor/useFilePersistence.d.ts +32 -0
- package/dist/editor/useFilePersistence.d.ts.map +1 -0
- package/dist/editor/useFilePersistence.js +117 -0
- package/dist/entity-graph-view/WorldView.svelte +1 -1
- package/dist/fabric/ai/ChatPanel.svelte +84 -85
- package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
- package/dist/fabric/ai/ResearchPanel.svelte +35 -25
- package/dist/fabric/ai/ResearchPanel.svelte.d.ts.map +1 -1
- package/dist/fabric/data/FileTree.svelte +195 -0
- package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
- package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
- package/dist/fabric/data/FileTree.test.js +127 -0
- package/dist/fabric/data/index.d.ts +5 -9
- package/dist/fabric/data/index.d.ts.map +1 -1
- package/dist/fabric/data/index.js +4 -1
- package/dist/fabric/index.d.ts +5 -5
- package/dist/fabric/index.d.ts.map +1 -1
- package/dist/fabric/index.js +5 -3
- package/dist/fabric/input/{CommandBar.svelte → AppHeaderBar.svelte} +13 -13
- package/dist/fabric/input/{CommandBar.svelte.d.ts → AppHeaderBar.svelte.d.ts} +5 -5
- package/dist/fabric/input/AppHeaderBar.svelte.d.ts.map +1 -0
- package/dist/fabric/input/{CommandBar.test.js → AppHeaderBar.test.js} +9 -9
- package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
- package/dist/fabric/input/index.d.ts +2 -2
- package/dist/fabric/input/index.d.ts.map +1 -1
- package/dist/fabric/input/index.js +1 -1
- package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
- package/dist/fabric/layout/KanbanBoard.svelte +25 -155
- package/dist/fabric/layout/KanbanBoard.svelte.d.ts +2 -26
- package/dist/fabric/layout/KanbanBoard.svelte.d.ts.map +1 -1
- package/dist/fabric/layout/KanbanBoard.test.js +125 -10
- package/dist/fabric/layout/KanbanCard.svelte +27 -223
- package/dist/fabric/layout/KanbanCard.svelte.d.ts +2 -19
- package/dist/fabric/layout/KanbanCard.svelte.d.ts.map +1 -1
- package/dist/fabric/layout/KanbanColumn.svelte +41 -275
- package/dist/fabric/layout/KanbanColumn.svelte.d.ts +2 -22
- package/dist/fabric/layout/KanbanColumn.svelte.d.ts.map +1 -1
- package/dist/fabric/layout/index.d.ts +2 -5
- package/dist/fabric/layout/index.d.ts.map +1 -1
- package/dist/fabric/layout/index.js +1 -1
- package/dist/fabric/navigation/ActivityRail.svelte +3 -5
- package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
- package/dist/g0-generative/components/Text.svelte +38 -0
- package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
- package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
- package/dist/g0-generative/index.d.ts +1 -0
- package/dist/g0-generative/index.d.ts.map +1 -1
- package/dist/g0-generative/index.js +1 -0
- package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
- package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
- package/dist/g0-generative/library/ComponentLibrary.js +10 -0
- package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
- package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
- package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
- package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
- package/dist/g0-geo/SovereignMap.svelte +13 -13
- package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/l0-layout/SectionSplitter.svelte +5 -5
- package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
- package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
- package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
- package/dist/l0-layout/block-writer/BlockItem.svelte +6 -4
- package/dist/l0-layout/block-writer/markdown.js +11 -11
- package/dist/l0-layout/block-writer/markdown.test.js +81 -0
- package/dist/l0-layout/card/CompactCard.svelte +4 -3
- package/dist/l0-layout/card/StackedCard.svelte +87 -0
- package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
- package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
- package/dist/l0-layout/card/StackedCard.test.js +29 -0
- package/dist/l0-layout/grant/GrantCard.svelte +15 -5
- package/dist/l0-layout/grant/GrantCard.svelte.d.ts.map +1 -1
- package/dist/l0-layout/index.d.ts +3 -0
- package/dist/l0-layout/index.d.ts.map +1 -1
- package/dist/l0-layout/index.js +2 -0
- package/dist/l0-layout/kanban/KanbanBoard.svelte +246 -29
- package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts +28 -2
- package/dist/l0-layout/kanban/KanbanBoard.svelte.d.ts.map +1 -1
- package/dist/l0-layout/kanban/KanbanCard.svelte +175 -150
- package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts +16 -18
- package/dist/l0-layout/kanban/KanbanCard.svelte.d.ts.map +1 -1
- package/dist/l0-layout/kanban/KanbanColumn.svelte +152 -78
- package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts +28 -7
- package/dist/l0-layout/kanban/KanbanColumn.svelte.d.ts.map +1 -1
- package/dist/l0-layout/kanban/index.d.ts +6 -0
- package/dist/l0-layout/kanban/index.d.ts.map +1 -0
- package/dist/l0-layout/kanban/index.js +3 -0
- package/dist/n0-node-graph/Node.svelte +2 -2
- package/dist/n0-node-graph/NodePalette.svelte +2 -2
- package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
- package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
- package/dist/n1-flow-canvas/graph-state.test.js +69 -0
- package/dist/n1-flow-canvas/index.d.ts +2 -0
- package/dist/n1-flow-canvas/index.d.ts.map +1 -1
- package/dist/n1-flow-canvas/index.js +1 -0
- package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
- package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
- package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
- package/dist/n1-flow-canvas/utils.test.js +116 -0
- package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
- package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
- package/dist/n3-force-graph/GraphTooltip.svelte +2 -2
- package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +34 -29
- package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
- package/dist/n4-adaptive-manifold/classifier.test.js +104 -0
- package/dist/n4-adaptive-manifold/n4-tokens.css +2 -2
- package/dist/n4-adaptive-manifold/types.d.ts +3 -0
- package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
- package/dist/p0-primitives/ThemeProvider.svelte +38 -18
- package/dist/p0-primitives/ThemeProvider.svelte.d.ts +6 -1
- package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
- package/dist/p0-primitives/canvas-theme.d.ts +33 -1
- package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
- package/dist/p0-primitives/canvas-theme.js +82 -17
- package/dist/p0-primitives/debug.d.ts +6 -0
- package/dist/p0-primitives/debug.d.ts.map +1 -0
- package/dist/p0-primitives/debug.js +21 -0
- package/dist/p0-primitives/index.d.ts +2 -1
- package/dist/p0-primitives/index.d.ts.map +1 -1
- package/dist/p0-primitives/index.js +1 -0
- package/dist/p0-primitives/theme-context.d.ts +9 -0
- package/dist/p0-primitives/theme-context.d.ts.map +1 -0
- package/dist/p0-primitives/theme-context.js +8 -0
- package/dist/p0-primitives/theme.d.ts.map +1 -1
- package/dist/p0-primitives/theme.js +11 -31
- package/dist/p0-primitives/tokens/ambient.css +76 -0
- package/dist/p0-primitives/tokens/tokens.css +140 -34
- package/dist/p0-primitives/utils/index.d.ts +4 -2
- package/dist/p0-primitives/utils/index.d.ts.map +1 -1
- package/dist/p0-primitives/utils/index.js +1 -0
- package/dist/p0-primitives/utils/reveal.d.ts +15 -0
- package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
- package/dist/p0-primitives/utils/reveal.js +29 -0
- package/dist/p0-primitives/utils/reveal.test.js +95 -0
- package/dist/s0-state/SyncStatus.svelte +2 -2
- package/dist/s0-state/ThemeStore.svelte.d.ts +3 -2
- package/dist/s0-state/ThemeStore.svelte.d.ts.map +1 -1
- package/dist/s0-state/ThemeStore.svelte.js +20 -1
- package/dist/s0-state/index.d.ts +2 -2
- package/dist/s0-state/index.d.ts.map +1 -1
- package/dist/s0-state/index.js +3 -0
- package/dist/s0-state/modal-stack-store.svelte.d.ts +27 -2
- package/dist/s0-state/modal-stack-store.svelte.d.ts.map +1 -1
- package/dist/s0-state/modal-stack-store.svelte.js +21 -2
- package/dist/showcase/Showcase.svelte +43 -34
- package/dist/showcase/Showcase.svelte.d.ts.map +1 -1
- package/dist/spatial/BspTilingCanvas.svelte +5 -5
- package/dist/spatial/BspTilingSimulation.test.js +88 -0
- package/dist/spatial/CameraController.test.js +120 -0
- package/dist/spatial/ForceCanvas.svelte +18 -13
- package/dist/spatial/ForceCanvas.svelte.d.ts.map +1 -1
- package/dist/spatial/ForceSimulation.svelte.d.ts.map +1 -1
- package/dist/spatial/ForceSimulation.svelte.js +33 -22
- package/dist/spatial/LodRenderer.svelte +14 -1
- package/dist/spatial/LodRenderer.svelte.d.ts.map +1 -1
- package/dist/spatial/ParticleAssembleMark.svelte +285 -0
- package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
- package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
- package/dist/spatial/SnapZoomCamera.svelte +23 -13
- package/dist/spatial/SnapZoomCamera.svelte.d.ts.map +1 -1
- package/dist/spatial/ZoneTiler.svelte +3 -2
- package/dist/spatial/ZoneTiler.test.js +90 -0
- package/dist/spatial/d3-types.d.ts +31 -0
- package/dist/spatial/d3-types.d.ts.map +1 -0
- package/dist/spatial/d3-types.js +19 -0
- package/dist/spatial/index.js +1 -0
- package/dist/spatial/particle-assemble-math.d.ts +22 -0
- package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
- package/dist/spatial/particle-assemble-math.js +26 -0
- package/dist/spatial/particle-assemble-math.test.js +56 -0
- package/dist/ssr-import-clean.test.js +37 -0
- package/dist/t0-transport/fs.d.ts +12 -0
- package/dist/t0-transport/fs.d.ts.map +1 -0
- package/dist/t0-transport/fs.js +55 -0
- package/dist/t0-transport/index.d.ts +1 -0
- package/dist/t0-transport/index.d.ts.map +1 -1
- package/dist/t0-transport/index.js +1 -0
- package/dist/t0-transport/invoke.d.ts.map +1 -1
- package/dist/t0-transport/invoke.js +5 -2
- package/dist/t0-transport/quality.d.ts +12 -3
- package/dist/t0-transport/quality.d.ts.map +1 -1
- package/dist/t0-transport/quality.js +17 -4
- package/dist/t0-transport/substrate.svelte.d.ts +27 -0
- package/dist/t0-transport/substrate.svelte.d.ts.map +1 -0
- package/dist/t0-transport/substrate.svelte.js +55 -0
- package/dist/u0-primitives/LockIndicator.svelte +17 -15
- package/dist/u0-primitives/VerticalToolbar.svelte +25 -22
- package/dist/u0-primitives/accordion/Accordion.svelte +14 -12
- package/dist/u0-primitives/accordion/Accordion.svelte.d.ts +0 -7
- package/dist/u0-primitives/accordion/Accordion.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/accordion/Accordion.test.js +5 -5
- package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
- package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
- package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
- package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
- package/dist/u0-primitives/badge/Badge.svelte +6 -4
- package/dist/u0-primitives/badge/Badge.test.js +10 -10
- package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
- package/dist/u0-primitives/badge/ValidityBadge.test.js +9 -9
- package/dist/u0-primitives/button/Button.svelte +18 -13
- package/dist/u0-primitives/button/Button.svelte.d.ts +1 -0
- package/dist/u0-primitives/button/Button.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/button/Button.test.js +11 -11
- package/dist/u0-primitives/card/Card.svelte +60 -32
- package/dist/u0-primitives/card/Card.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/card/Card.test.js +86 -0
- package/dist/u0-primitives/command-palette/CommandPalette.svelte +75 -43
- package/dist/u0-primitives/command-palette/CommandPalette.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
- package/dist/u0-primitives/command-palette/commandStore.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/command-palette/commandStore.svelte.js +2 -1
- package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
- package/dist/u0-primitives/dropdown/Dropdown.test.js +1 -1
- package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
- package/dist/u0-primitives/index.d.ts +8 -0
- package/dist/u0-primitives/index.d.ts.map +1 -1
- package/dist/u0-primitives/index.js +9 -0
- package/dist/u0-primitives/input/Input.svelte +85 -23
- package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
- package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/input/Input.test.js +82 -2
- package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
- package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
- package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
- package/dist/u0-primitives/live-dot/index.d.ts +3 -0
- package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
- package/dist/u0-primitives/live-dot/index.js +1 -0
- package/dist/u0-primitives/modal/Modal.svelte +64 -38
- package/dist/u0-primitives/modal/Modal.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/modal/Modal.test.js +63 -15
- package/dist/u0-primitives/rsvp/RsvpReader.svelte +8 -8
- package/dist/u0-primitives/rsvp/RsvpReader.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
- package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
- package/dist/u0-primitives/steps/Steps.svelte +20 -21
- package/dist/u0-primitives/surface-state/SurfaceState.svelte +190 -0
- package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts +15 -0
- package/dist/u0-primitives/surface-state/SurfaceState.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
- package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
- package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
- package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
- package/dist/u0-primitives/toggle/Toggle.svelte +22 -13
- package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
- package/dist/u0-primitives/tooltip/Tooltip.test.js +12 -12
- package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
- package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
- package/dist/u0-primitives/web-components/button-component.js +72 -33
- package/dist/u0-primitives/web-components/index.d.ts +3 -0
- package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
- package/dist/u0-primitives/web-components/index.js +2 -0
- package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
- package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
- package/dist/u0-primitives/web-components/input-component.js +56 -39
- package/dist/u0-primitives/web-components/web-components.test.js +96 -0
- package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
- package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
- package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
- package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
- package/dist/u0-primitives/window-frame/index.d.ts +3 -0
- package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
- package/dist/u0-primitives/window-frame/index.js +1 -0
- package/dist/v0-diagrams/MarkmapDiagram.test.js +49 -0
- package/dist/v0-diagrams/MermaidDiagram.svelte +21 -9
- package/dist/v0-diagrams/MermaidDiagram.svelte.d.ts.map +1 -1
- package/dist/v0-diagrams/MermaidDiagram.test.js +40 -0
- package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
- package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
- package/package.json +57 -15
- package/src/n4-adaptive-manifold/n4-tokens.css +2 -2
- package/src/p0-primitives/tokens/ambient.css +76 -0
- package/src/p0-primitives/tokens/tokens.css +140 -34
- package/src/p0-primitives/tokens/tokens.json +55 -26
- package/dist/b0-app-shell/command-bar/CommandBar.svelte.d.ts.map +0 -1
- package/dist/fabric/input/CommandBar.svelte.d.ts.map +0 -1
- package/dist/stores/vaultStore.svelte +0 -14
- package/dist/stores/vaultStore.svelte.d.ts +0 -24
- package/dist/stores/vaultStore.svelte.d.ts.map +0 -1
- package/dist/tauri/index.d.ts +0 -3
- package/dist/tauri/index.d.ts.map +0 -1
- package/dist/tauri/index.js +0 -11
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ForceCell, ForceLink } from './force-canvas-types';
|
|
2
|
+
export interface D3SimulationNode {
|
|
3
|
+
id: string;
|
|
4
|
+
index?: number;
|
|
5
|
+
x?: number;
|
|
6
|
+
y?: number;
|
|
7
|
+
vx?: number;
|
|
8
|
+
vy?: number;
|
|
9
|
+
fx?: number | null;
|
|
10
|
+
fy?: number | null;
|
|
11
|
+
}
|
|
12
|
+
export interface D3ForceLink<T extends D3SimulationNode = D3SimulationNode> {
|
|
13
|
+
source: T | string;
|
|
14
|
+
target: T | string;
|
|
15
|
+
distance?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface D3Simulation<T extends D3SimulationNode = D3SimulationNode> {
|
|
18
|
+
force(name: string): unknown;
|
|
19
|
+
force(name: string, force: unknown): this;
|
|
20
|
+
nodes(): T[];
|
|
21
|
+
nodes(nodes: T[]): this;
|
|
22
|
+
alphaDecay(): number;
|
|
23
|
+
alphaDecay(decay: number): this;
|
|
24
|
+
velocityDecay(): number;
|
|
25
|
+
velocityDecay(decay: number): this;
|
|
26
|
+
on(event: string, listener: (() => void) | null): this;
|
|
27
|
+
stop(): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function toD3Node(cell: ForceCell): D3SimulationNode;
|
|
30
|
+
export declare function toD3Link(link: ForceLink): D3ForceLink;
|
|
31
|
+
//# sourceMappingURL=d3-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d3-types.d.ts","sourceRoot":"","sources":["../../src/spatial/d3-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IACxE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IACzE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1C,KAAK,IAAI,CAAC,EAAE,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACxB,UAAU,IAAI,MAAM,CAAC;IACrB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,IAAI,MAAM,CAAC;IACxB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACvD,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAW1D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAMrD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function toD3Node(cell) {
|
|
2
|
+
return {
|
|
3
|
+
id: cell.id,
|
|
4
|
+
index: cell.index,
|
|
5
|
+
x: cell.x,
|
|
6
|
+
y: cell.y,
|
|
7
|
+
vx: cell.vx,
|
|
8
|
+
vy: cell.vy,
|
|
9
|
+
fx: cell.fx,
|
|
10
|
+
fy: cell.fy,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function toD3Link(link) {
|
|
14
|
+
return {
|
|
15
|
+
source: link.source,
|
|
16
|
+
target: link.target,
|
|
17
|
+
distance: link.distance,
|
|
18
|
+
};
|
|
19
|
+
}
|
package/dist/spatial/index.js
CHANGED
|
@@ -15,3 +15,4 @@ export { CameraController } from './CameraController.svelte.js';
|
|
|
15
15
|
// import LodRenderer from '@kos/design-system/spatial/LodRenderer.svelte';
|
|
16
16
|
// import SnapZoomCamera from '@kos/design-system/spatial/SnapZoomCamera.svelte';
|
|
17
17
|
// import BspTilingCanvas from '@kos/design-system/spatial/BspTilingCanvas.svelte';
|
|
18
|
+
// import ParticleAssembleMark from '@kos/design-system/spatial/ParticleAssembleMark.svelte';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface Fit {
|
|
2
|
+
scale: number;
|
|
3
|
+
dx: number;
|
|
4
|
+
dy: number;
|
|
5
|
+
}
|
|
6
|
+
/** Fit a viewBoxWidth x viewBoxHeight shape, centered, into canvasWidth x canvasHeight. */
|
|
7
|
+
export declare function fitScale(viewBoxWidth: number, viewBoxHeight: number, canvasWidth: number, canvasHeight: number, padRatio?: number): Fit;
|
|
8
|
+
export declare function easeOutCubic(progress: number): number;
|
|
9
|
+
export declare function lerp(a: number, b: number, t: number): number;
|
|
10
|
+
export interface ParticleFrame {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
alpha: number;
|
|
14
|
+
}
|
|
15
|
+
/** Position + alpha for a particle at a given eased progress (0..1). */
|
|
16
|
+
export declare function particleFrame(particle: {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
tx: number;
|
|
20
|
+
ty: number;
|
|
21
|
+
}, eased: number): ParticleFrame;
|
|
22
|
+
//# sourceMappingURL=particle-assemble-math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"particle-assemble-math.d.ts","sourceRoot":"","sources":["../../src/spatial/particle-assemble-math.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,2FAA2F;AAC3F,wBAAgB,QAAQ,CACtB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,QAAQ,SAAO,GACd,GAAG,CAKL;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAC1D,KAAK,EAAE,MAAM,GACZ,aAAa,CAMf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Pure math for ParticleAssembleMark — kept separate from the .svelte
|
|
2
|
+
// RAF/canvas runner so it's unit-testable without a real canvas 2D context
|
|
3
|
+
// (mirrors this dir's split between *-types.ts/simulation logic and the
|
|
4
|
+
// thin canvas-runner .svelte components, e.g. ForceSimulation vs ForceCanvas).
|
|
5
|
+
/** Fit a viewBoxWidth x viewBoxHeight shape, centered, into canvasWidth x canvasHeight. */
|
|
6
|
+
export function fitScale(viewBoxWidth, viewBoxHeight, canvasWidth, canvasHeight, padRatio = 0.92) {
|
|
7
|
+
const scale = Math.min(canvasWidth / viewBoxWidth, canvasHeight / viewBoxHeight) * padRatio;
|
|
8
|
+
const dx = (canvasWidth - viewBoxWidth * scale) / 2;
|
|
9
|
+
const dy = (canvasHeight - viewBoxHeight * scale) / 2;
|
|
10
|
+
return { scale, dx, dy };
|
|
11
|
+
}
|
|
12
|
+
export function easeOutCubic(progress) {
|
|
13
|
+
const clamped = Math.min(1, Math.max(0, progress));
|
|
14
|
+
return 1 - Math.pow(1 - clamped, 3);
|
|
15
|
+
}
|
|
16
|
+
export function lerp(a, b, t) {
|
|
17
|
+
return a + (b - a) * t;
|
|
18
|
+
}
|
|
19
|
+
/** Position + alpha for a particle at a given eased progress (0..1). */
|
|
20
|
+
export function particleFrame(particle, eased) {
|
|
21
|
+
return {
|
|
22
|
+
x: lerp(particle.x, particle.tx, eased),
|
|
23
|
+
y: lerp(particle.y, particle.ty, eased),
|
|
24
|
+
alpha: 0.3 + eased * 0.7
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { fitScale, easeOutCubic, lerp, particleFrame } from './particle-assemble-math';
|
|
3
|
+
describe('fitScale', () => {
|
|
4
|
+
it('centers a shape narrower than the canvas', () => {
|
|
5
|
+
const { scale, dx, dy } = fitScale(100, 100, 200, 200, 1);
|
|
6
|
+
expect(scale).toBe(2);
|
|
7
|
+
expect(dx).toBe(0);
|
|
8
|
+
expect(dy).toBe(0);
|
|
9
|
+
});
|
|
10
|
+
it('applies padRatio to shrink the fitted shape', () => {
|
|
11
|
+
const { scale, dx } = fitScale(100, 100, 200, 200, 0.5);
|
|
12
|
+
expect(scale).toBe(1);
|
|
13
|
+
expect(dx).toBe(50);
|
|
14
|
+
});
|
|
15
|
+
it('fits by the constraining dimension for non-square aspect ratios', () => {
|
|
16
|
+
const { scale, dx, dy } = fitScale(270, 305, 1000, 1000, 1);
|
|
17
|
+
// height is the tighter constraint (305 > 270), so scale is bound by height
|
|
18
|
+
expect(scale).toBeCloseTo(1000 / 305, 5);
|
|
19
|
+
expect(dx).toBeGreaterThan(0);
|
|
20
|
+
expect(dy).toBe(0);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('easeOutCubic', () => {
|
|
24
|
+
it('maps 0 to 0 and 1 to 1', () => {
|
|
25
|
+
expect(easeOutCubic(0)).toBe(0);
|
|
26
|
+
expect(easeOutCubic(1)).toBe(1);
|
|
27
|
+
});
|
|
28
|
+
it('clamps progress outside [0, 1]', () => {
|
|
29
|
+
expect(easeOutCubic(-0.5)).toBe(0);
|
|
30
|
+
expect(easeOutCubic(1.5)).toBe(1);
|
|
31
|
+
});
|
|
32
|
+
it('decelerates — front-loads more progress than a linear ramp', () => {
|
|
33
|
+
expect(easeOutCubic(0.5)).toBeGreaterThan(0.5);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('lerp', () => {
|
|
37
|
+
it('interpolates linearly', () => {
|
|
38
|
+
expect(lerp(0, 10, 0)).toBe(0);
|
|
39
|
+
expect(lerp(0, 10, 1)).toBe(10);
|
|
40
|
+
expect(lerp(0, 10, 0.5)).toBe(5);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('particleFrame', () => {
|
|
44
|
+
it('starts at the origin position with alpha 0.3 when eased is 0', () => {
|
|
45
|
+
const frame = particleFrame({ x: 10, y: 20, tx: 100, ty: 200 }, 0);
|
|
46
|
+
expect(frame.x).toBe(10);
|
|
47
|
+
expect(frame.y).toBe(20);
|
|
48
|
+
expect(frame.alpha).toBeCloseTo(0.3);
|
|
49
|
+
});
|
|
50
|
+
it('ends at the target position with alpha 1 when eased is 1', () => {
|
|
51
|
+
const frame = particleFrame({ x: 10, y: 20, tx: 100, ty: 200 }, 1);
|
|
52
|
+
expect(frame.x).toBe(100);
|
|
53
|
+
expect(frame.y).toBe(200);
|
|
54
|
+
expect(frame.alpha).toBeCloseTo(1);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* F-30a: Verify that key modules import cleanly without browser-API violations.
|
|
3
|
+
*
|
|
4
|
+
* vitest-setup.ts injects a localStorage mock and jsdom provides window/document,
|
|
5
|
+
* which can mask SSR violations. This test verifies that pure logic modules
|
|
6
|
+
* (no DOM, no browser-only APIs) import and execute without errors.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect } from 'vitest';
|
|
9
|
+
describe('F-30a import-clean (pure modules)', () => {
|
|
10
|
+
it('quality module imports cleanly (module-scope singletons)', async () => {
|
|
11
|
+
const mod = await import('./t0-transport/quality');
|
|
12
|
+
expect(mod.startQualityMonitoring).toBeDefined();
|
|
13
|
+
expect(mod.subscribeQuality).toBeDefined();
|
|
14
|
+
expect(mod.getCurrentMetrics).toBeDefined();
|
|
15
|
+
});
|
|
16
|
+
it('n1-flow-canvas utils are pure and import cleanly', async () => {
|
|
17
|
+
const mod = await import('./n1-flow-canvas/utils');
|
|
18
|
+
expect(mod.nodeHitTest).toBeDefined();
|
|
19
|
+
expect(mod.domEventToCanvasCoords).toBeDefined();
|
|
20
|
+
expect(mod.parseMentionEdges).toBeDefined();
|
|
21
|
+
expect(mod.parseGroupedSequenceEdges).toBeDefined();
|
|
22
|
+
});
|
|
23
|
+
it('n4 classifier is pure and import cleanly', async () => {
|
|
24
|
+
const mod = await import('./n4-adaptive-manifold/classifier');
|
|
25
|
+
expect(mod.classifyTopology).toBeDefined();
|
|
26
|
+
expect(mod.computeMetrics).toBeDefined();
|
|
27
|
+
});
|
|
28
|
+
it('n4 transition is pure and import cleanly', async () => {
|
|
29
|
+
const mod = await import('./n4-adaptive-manifold/transition');
|
|
30
|
+
expect(mod.EASING_FUNCTIONS).toBeDefined();
|
|
31
|
+
expect(mod.TransitionAnimator).toBeDefined();
|
|
32
|
+
});
|
|
33
|
+
it('n4 graph-state is pure and import cleanly', async () => {
|
|
34
|
+
const mod = await import('./n1-flow-canvas/graph-state.svelte');
|
|
35
|
+
expect(mod.GraphState).toBeDefined();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { isTauri } from './invoke';
|
|
2
|
+
/** Thrown when no Tauri runtime (or no fs plugin) is available. */
|
|
3
|
+
export declare class FsUnavailableError extends Error {
|
|
4
|
+
constructor(operation: string, cause?: unknown);
|
|
5
|
+
}
|
|
6
|
+
/** Read a text file. Rejects with FsUnavailableError outside a Tauri host. */
|
|
7
|
+
export declare function readTextFile(path: string): Promise<string>;
|
|
8
|
+
/** Write a text file. Rejects with FsUnavailableError outside a Tauri host — never a silent no-op. */
|
|
9
|
+
export declare function writeTextFile(path: string, contents: string): Promise<void>;
|
|
10
|
+
/** Last-modified time in epoch ms, or null when the backend can't provide one. */
|
|
11
|
+
export declare function getMtimeMs(path: string): Promise<number | null>;
|
|
12
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/t0-transport/fs.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,mEAAmE;AACnE,qBAAa,kBAAmB,SAAQ,KAAK;gBAChC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAQ9C;AAsBD,8EAA8E;AAC9E,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGhE;AAED,sGAAsG;AACtG,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjF;AAED,kFAAkF;AAClF,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAIrE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// T0 Transport — file persistence over the optional Tauri FS plugin.
|
|
2
|
+
//
|
|
3
|
+
// Follows the same optional-peer pattern as invoke.ts: a literal dynamic
|
|
4
|
+
// import of the Tauri module, guarded at runtime by isTauri(). In a non-Tauri
|
|
5
|
+
// environment every operation rejects with FsUnavailableError — callers must
|
|
6
|
+
// surface that state instead of pretending the operation succeeded.
|
|
7
|
+
//
|
|
8
|
+
// NOTE: deliberately NOT re-exported from the t0-transport barrel. The barrel
|
|
9
|
+
// is reachable from the root package export; keeping fs.ts subpath-only means
|
|
10
|
+
// consumers who never import the editor never make their bundler resolve
|
|
11
|
+
// '@tauri-apps/plugin-fs' (an optional peer). Import it directly:
|
|
12
|
+
// import { readTextFile, writeTextFile } from '<pkg>/t0-transport/fs' (internal: '../t0-transport/fs')
|
|
13
|
+
import { isTauri } from './invoke';
|
|
14
|
+
export { isTauri } from './invoke';
|
|
15
|
+
/** Thrown when no Tauri runtime (or no fs plugin) is available. */
|
|
16
|
+
export class FsUnavailableError extends Error {
|
|
17
|
+
constructor(operation, cause) {
|
|
18
|
+
super(`File ${operation} unavailable: no Tauri runtime detected. ` +
|
|
19
|
+
'Persistence requires a Tauri host with @tauri-apps/plugin-fs installed.');
|
|
20
|
+
this.name = 'FsUnavailableError';
|
|
21
|
+
if (cause !== undefined)
|
|
22
|
+
this.cause = cause;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function loadFs(operation) {
|
|
26
|
+
if (!isTauri())
|
|
27
|
+
throw new FsUnavailableError(operation);
|
|
28
|
+
try {
|
|
29
|
+
// @tauri-apps/plugin-fs is an optional peer. Using an indirect specifier
|
|
30
|
+
// so TypeScript and bundlers treat this as a fully dynamic import — no
|
|
31
|
+
// static module resolution, no build-time error on missing package.
|
|
32
|
+
const spec = '@tauri-apps/plugin-fs';
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
return await import(/* @vite-ignore */ spec);
|
|
35
|
+
}
|
|
36
|
+
catch (cause) {
|
|
37
|
+
throw new FsUnavailableError(operation, cause);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Read a text file. Rejects with FsUnavailableError outside a Tauri host. */
|
|
41
|
+
export async function readTextFile(path) {
|
|
42
|
+
const fs = await loadFs('read');
|
|
43
|
+
return fs.readTextFile(path);
|
|
44
|
+
}
|
|
45
|
+
/** Write a text file. Rejects with FsUnavailableError outside a Tauri host — never a silent no-op. */
|
|
46
|
+
export async function writeTextFile(path, contents) {
|
|
47
|
+
const fs = await loadFs('write');
|
|
48
|
+
await fs.writeTextFile(path, contents);
|
|
49
|
+
}
|
|
50
|
+
/** Last-modified time in epoch ms, or null when the backend can't provide one. */
|
|
51
|
+
export async function getMtimeMs(path) {
|
|
52
|
+
const fs = await loadFs('stat');
|
|
53
|
+
const info = await fs.stat(path);
|
|
54
|
+
return info?.mtime ? new Date(info.mtime).getTime() : null;
|
|
55
|
+
}
|
|
@@ -2,5 +2,6 @@ export { invoke, isTauri, isTauriReady, awaitTauriReady } from './invoke';
|
|
|
2
2
|
export { createEventBus, type EventBus } from './events';
|
|
3
3
|
export { TransportError, TransportErrorCode } from './error';
|
|
4
4
|
export { createConnectionTracker, type ConnectionState } from './connection';
|
|
5
|
+
export { createSubstrateConnection, type CreateSubstrateConnectionOptions, type SubstrateConnection, type SubstrateState, } from './substrate.svelte';
|
|
5
6
|
export { startQualityMonitoring, stopQualityMonitoring, recordPingStart, recordPingEnd, subscribeQuality, getCurrentMetrics, createQualityMonitor, getQualityColor, getQualityLabel, type QualityMetrics, type QualitySample, type QualityLevel, type QualityMonitor, } from './quality';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/t0-transport/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/t0-transport/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,yBAAyB,EACzB,KAAK,gCAAgC,EACrC,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC"}
|
|
@@ -3,5 +3,6 @@ export { invoke, isTauri, isTauriReady, awaitTauriReady } from './invoke';
|
|
|
3
3
|
export { createEventBus } from './events';
|
|
4
4
|
export { TransportError, TransportErrorCode } from './error';
|
|
5
5
|
export { createConnectionTracker } from './connection';
|
|
6
|
+
export { createSubstrateConnection, } from './substrate.svelte';
|
|
6
7
|
// New from NNJAS port - Connection quality monitoring
|
|
7
8
|
export { startQualityMonitoring, stopQualityMonitoring, recordPingStart, recordPingEnd, subscribeQuality, getCurrentMetrics, createQualityMonitor, getQualityColor, getQualityLabel, } from './quality';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/t0-transport/invoke.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,QAAQ,CAAC,EAAE,CAAC,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/t0-transport/invoke.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,QAAQ,CAAC,EAAE,CAAC,CAAC;CACd;AAYD;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzF,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,CAAC,GACV,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAGtC;AAED;;;;GAIG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAUxD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Type-safe invoke wrapper for Tauri commands
|
|
2
2
|
async function getTauriInvoke() {
|
|
3
|
-
const
|
|
3
|
+
const spec = '@tauri-apps/api/core';
|
|
4
|
+
const mod = await import(/* @vite-ignore */ spec);
|
|
4
5
|
return mod.invoke;
|
|
5
6
|
}
|
|
6
7
|
/**
|
|
@@ -26,7 +27,9 @@ export function isTauri() {
|
|
|
26
27
|
* Use for conditional rendering. Use awaitTauriReady() for init paths.
|
|
27
28
|
*/
|
|
28
29
|
export function isTauriReady() {
|
|
29
|
-
|
|
30
|
+
if (typeof window === 'undefined')
|
|
31
|
+
return false;
|
|
32
|
+
return window.__TAURI_INTERNALS__ != null;
|
|
30
33
|
}
|
|
31
34
|
/**
|
|
32
35
|
* Polls until window.__TAURI_INTERNALS__ is available (up to 5 seconds).
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Connection Quality Monitoring
|
|
2
|
+
* Connection Quality Monitoring (F-29 — module-scope singleton).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Holds module-scope mutable state (metrics, pingId, interval, subscribers).
|
|
5
|
+
* startQualityMonitoring() uses setInterval; consume via subscribeQuality()
|
|
6
|
+
* for reactive updates in components.
|
|
7
|
+
*
|
|
8
|
+
* @module t0-transport/quality
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { startQualityMonitoring, subscribeQuality } from '@kos/design-system/t0-transport';
|
|
12
|
+
* startQualityMonitoring();
|
|
13
|
+
* const unsub = subscribeQuality(m => console.log(m.quality));
|
|
14
|
+
* ```
|
|
6
15
|
*/
|
|
7
16
|
export type QualityLevel = 'excellent' | 'good' | 'fair' | 'poor' | 'disconnected';
|
|
8
17
|
export interface QualitySample {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/t0-transport/quality.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../../src/t0-transport/quality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,cAAc,CAAC;AAEnF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,UAAU,IAAI,cAAc,CAAC;IAC7B,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACpE;AA2DD,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAQ7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAQ7D;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAsB7C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAGtC;AAEH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAmBlE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI,CASxF;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAoHrD"}
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Connection Quality Monitoring
|
|
2
|
+
* Connection Quality Monitoring (F-29 — module-scope singleton).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Holds module-scope mutable state (metrics, pingId, interval, subscribers).
|
|
5
|
+
* startQualityMonitoring() uses setInterval; consume via subscribeQuality()
|
|
6
|
+
* for reactive updates in components.
|
|
7
|
+
*
|
|
8
|
+
* @module t0-transport/quality
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { startQualityMonitoring, subscribeQuality } from '@kos/design-system/t0-transport';
|
|
12
|
+
* startQualityMonitoring();
|
|
13
|
+
* const unsub = subscribeQuality(m => console.log(m.quality));
|
|
14
|
+
* ```
|
|
6
15
|
*/
|
|
7
16
|
const SAMPLE_WINDOW = 60; // 60 seconds of history
|
|
8
17
|
const PING_INTERVAL = 5000; // Ping every 5 seconds
|
|
9
|
-
const MAX_HISTORY = 12; //
|
|
18
|
+
const MAX_HISTORY = Math.max(12, Math.ceil(SAMPLE_WINDOW * 1000 / PING_INTERVAL)); // 60s window → 12 samples at 5s interval
|
|
10
19
|
let metrics = {
|
|
11
20
|
latency: null,
|
|
12
21
|
jitter: null,
|
|
@@ -88,6 +97,10 @@ export function startQualityMonitoring() {
|
|
|
88
97
|
lost: true
|
|
89
98
|
});
|
|
90
99
|
pingStartTime = null;
|
|
100
|
+
// Trim to bounded size — interval runs every 1s so history can grow fast
|
|
101
|
+
if (metrics.history.length > MAX_HISTORY) {
|
|
102
|
+
metrics.history = metrics.history.slice(-MAX_HISTORY);
|
|
103
|
+
}
|
|
91
104
|
updateMetrics();
|
|
92
105
|
}
|
|
93
106
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type SubstrateState = {
|
|
2
|
+
status: 'starting';
|
|
3
|
+
} | {
|
|
4
|
+
status: 'connected';
|
|
5
|
+
seqno: number;
|
|
6
|
+
} | {
|
|
7
|
+
status: 'reconnecting';
|
|
8
|
+
attempt: number;
|
|
9
|
+
} | {
|
|
10
|
+
status: 'failed';
|
|
11
|
+
reason: string;
|
|
12
|
+
};
|
|
13
|
+
export interface SubstrateConnection {
|
|
14
|
+
state: SubstrateState;
|
|
15
|
+
init(): Promise<void>;
|
|
16
|
+
retry(): Promise<void>;
|
|
17
|
+
destroy(): void;
|
|
18
|
+
isDegraded: boolean;
|
|
19
|
+
retryLabel: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateSubstrateConnectionOptions {
|
|
22
|
+
getStateCommand?: string;
|
|
23
|
+
stateEvent?: string;
|
|
24
|
+
retryCommand?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function createSubstrateConnection(options?: CreateSubstrateConnectionOptions): SubstrateConnection;
|
|
27
|
+
//# sourceMappingURL=substrate.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"substrate.svelte.d.ts","sourceRoot":"","sources":["../../src/t0-transport/substrate.svelte.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GACtB;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACtB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gCAAgC;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwDD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gCAAqC,GAC7C,mBAAmB,CAErB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { listen } from '@tauri-apps/api/event';
|
|
2
|
+
import { awaitTauriReady, invoke } from './invoke';
|
|
3
|
+
class SubstrateConnectionImpl {
|
|
4
|
+
options;
|
|
5
|
+
state = $state({ status: 'starting' });
|
|
6
|
+
unlisten = null;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
get isDegraded() {
|
|
11
|
+
return this.state.status === 'reconnecting' || this.state.status === 'failed';
|
|
12
|
+
}
|
|
13
|
+
get retryLabel() {
|
|
14
|
+
return this.state.status === 'failed' ? 'Retry' : 'Reconnecting';
|
|
15
|
+
}
|
|
16
|
+
async init() {
|
|
17
|
+
this.destroy();
|
|
18
|
+
const ready = await awaitTauriReady();
|
|
19
|
+
if (!ready) {
|
|
20
|
+
console.warn('[SubstrateConnection] Tauri bridge not available — skipping listeners');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Register listener FIRST: prevents missing a Connected transition that fires
|
|
24
|
+
// while invoke() is in-flight (the race that caused the persistent OFFLINE overlay).
|
|
25
|
+
this.unlisten = await listen(this.options.stateEvent ?? 'substrate:state', (event) => {
|
|
26
|
+
this.state = event.payload;
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
this.state = await invoke(this.options.getStateCommand ?? 'substrate_get_state');
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// A failed *read* of supervisor state is not a connection failure — don't
|
|
33
|
+
// paint the degraded overlay on it. Stay non-degraded (`starting`) and let
|
|
34
|
+
// the `substrate:state` listener deliver the real state.
|
|
35
|
+
console.warn('[SubstrateConnection] substrate_get_state read failed; awaiting events', error);
|
|
36
|
+
this.state = { status: 'starting' };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async retry() {
|
|
40
|
+
this.state = { status: 'reconnecting', attempt: 0 };
|
|
41
|
+
try {
|
|
42
|
+
await invoke(this.options.retryCommand ?? 'substrate_retry');
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
this.state = { status: 'failed', reason: error instanceof Error ? error.message : 'Unable to retry substrate connection' };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
destroy() {
|
|
49
|
+
this.unlisten?.();
|
|
50
|
+
this.unlisten = null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function createSubstrateConnection(options = {}) {
|
|
54
|
+
return new SubstrateConnectionImpl(options);
|
|
55
|
+
}
|
|
@@ -121,8 +121,7 @@
|
|
|
121
121
|
<style>
|
|
122
122
|
.lock-indicator {
|
|
123
123
|
position: relative;
|
|
124
|
-
background: var(--color-bg-panel,
|
|
125
|
-
border-radius: var(--radius-md, 4px);
|
|
124
|
+
background: var(--color-bg-panel, #181c20);
|
|
126
125
|
overflow: hidden;
|
|
127
126
|
}
|
|
128
127
|
|
|
@@ -151,7 +150,7 @@
|
|
|
151
150
|
.lock-avatar {
|
|
152
151
|
width: 28px;
|
|
153
152
|
height: 28px;
|
|
154
|
-
border-radius: var(--radius-full
|
|
153
|
+
border-radius: var(--radius-full); /* avatar — intentionally round */
|
|
155
154
|
flex-shrink: 0;
|
|
156
155
|
}
|
|
157
156
|
|
|
@@ -186,20 +185,23 @@
|
|
|
186
185
|
}
|
|
187
186
|
|
|
188
187
|
.lock-request-btn {
|
|
189
|
-
padding:
|
|
190
|
-
background: var(--color-accent-subtle
|
|
191
|
-
color: var(--color-accent
|
|
192
|
-
border: 1px solid var(--color-accent
|
|
193
|
-
|
|
194
|
-
font-size: var(--
|
|
188
|
+
padding: 3px 8px;
|
|
189
|
+
background: var(--color-accent-subtle);
|
|
190
|
+
color: var(--color-accent);
|
|
191
|
+
border: 1px solid var(--color-accent);
|
|
192
|
+
font-family: var(--font-mono);
|
|
193
|
+
font-size: var(--ui-label, 10px);
|
|
194
|
+
letter-spacing: 0.06em;
|
|
195
|
+
text-transform: uppercase;
|
|
195
196
|
cursor: pointer;
|
|
196
|
-
transition:
|
|
197
|
+
transition: background var(--transition-fast) linear, color var(--transition-fast) linear;
|
|
197
198
|
flex-shrink: 0;
|
|
198
199
|
}
|
|
199
200
|
|
|
201
|
+
/* Hover fill justified: confirms destructive intent (same logic as toggle thumb) */
|
|
200
202
|
.lock-request-btn:hover {
|
|
201
203
|
background: var(--color-accent);
|
|
202
|
-
color: var(--color-
|
|
204
|
+
color: var(--color-bg-app);
|
|
203
205
|
}
|
|
204
206
|
|
|
205
207
|
.lock-bar {
|
|
@@ -214,10 +216,10 @@
|
|
|
214
216
|
.lock-spinner {
|
|
215
217
|
width: 16px;
|
|
216
218
|
height: 16px;
|
|
217
|
-
border:
|
|
218
|
-
border-top-color:
|
|
219
|
-
border-
|
|
220
|
-
animation: spin
|
|
219
|
+
border: 1.5px solid var(--border-default);
|
|
220
|
+
border-top-color: var(--color-accent);
|
|
221
|
+
border-right-color: var(--color-accent);
|
|
222
|
+
animation: spin 0.7s linear infinite;
|
|
221
223
|
}
|
|
222
224
|
|
|
223
225
|
@keyframes spin {
|
|
@@ -112,14 +112,14 @@
|
|
|
112
112
|
align-items: center;
|
|
113
113
|
justify-content: center;
|
|
114
114
|
width: 36px;
|
|
115
|
-
height: 36px;
|
|
115
|
+
height: var(--ui-control-h, 36px);
|
|
116
116
|
padding: 0;
|
|
117
117
|
background: transparent;
|
|
118
118
|
border: 1px solid transparent;
|
|
119
|
-
border-radius:
|
|
120
|
-
color: var(--color-text-muted,
|
|
119
|
+
border-radius: 0;
|
|
120
|
+
color: var(--color-text-muted, #6b6558);
|
|
121
121
|
cursor: pointer;
|
|
122
|
-
transition:
|
|
122
|
+
transition: color var(--transition-fast) linear, background var(--transition-fast) linear;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
.toolbar-item:hover:not(:disabled) {
|
|
@@ -138,16 +138,15 @@
|
|
|
138
138
|
border-color: var(--color-accent-muted, var(--color-accent-muted));
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
/* Active live-edge on the left — accent as functional state indicator */
|
|
141
142
|
.toolbar-item.active::before {
|
|
142
143
|
content: '';
|
|
143
144
|
position: absolute;
|
|
144
145
|
left: 0;
|
|
145
|
-
top:
|
|
146
|
-
|
|
147
|
-
width:
|
|
148
|
-
|
|
149
|
-
background: var(--color-accent, var(--color-accent));
|
|
150
|
-
border-radius: 0 2px 2px 0;
|
|
146
|
+
top: 0;
|
|
147
|
+
bottom: 0;
|
|
148
|
+
width: 2px;
|
|
149
|
+
background: var(--color-accent);
|
|
151
150
|
}
|
|
152
151
|
|
|
153
152
|
.toolbar-item:disabled {
|
|
@@ -168,34 +167,38 @@
|
|
|
168
167
|
height: 100%;
|
|
169
168
|
}
|
|
170
169
|
|
|
170
|
+
/* Badge fill justified: count is a functional readout (unread count), not decoration */
|
|
171
171
|
.toolbar-badge {
|
|
172
172
|
position: absolute;
|
|
173
173
|
top: 2px;
|
|
174
174
|
right: 2px;
|
|
175
175
|
min-width: 14px;
|
|
176
176
|
height: 14px;
|
|
177
|
-
padding: 0
|
|
178
|
-
background: var(--color-accent
|
|
179
|
-
color: var(--color-bg-app, #
|
|
180
|
-
font-
|
|
181
|
-
font-
|
|
182
|
-
|
|
177
|
+
padding: 0 3px;
|
|
178
|
+
background: var(--color-accent);
|
|
179
|
+
color: var(--color-bg-app, #0a0b0c);
|
|
180
|
+
font-family: var(--font-mono);
|
|
181
|
+
font-size: 9px;
|
|
182
|
+
font-weight: 700;
|
|
183
|
+
border-radius: 0;
|
|
183
184
|
display: flex;
|
|
184
185
|
align-items: center;
|
|
185
186
|
justify-content: center;
|
|
187
|
+
font-variant-numeric: tabular-nums;
|
|
186
188
|
}
|
|
187
189
|
|
|
188
190
|
.toolbar-tooltip {
|
|
189
191
|
position: absolute;
|
|
190
|
-
padding:
|
|
191
|
-
background: var(--color-bg-panel-elevated
|
|
192
|
-
color: var(--color-text-primary
|
|
193
|
-
font-
|
|
192
|
+
padding: 3px 7px;
|
|
193
|
+
background: var(--color-bg-panel-elevated);
|
|
194
|
+
color: var(--color-text-primary);
|
|
195
|
+
font-family: var(--font-mono);
|
|
196
|
+
font-size: var(--ui-label, 10px);
|
|
197
|
+
letter-spacing: 0.05em;
|
|
194
198
|
white-space: nowrap;
|
|
195
|
-
border
|
|
199
|
+
border: 1px solid var(--border-default);
|
|
196
200
|
pointer-events: none;
|
|
197
201
|
z-index: 1000;
|
|
198
|
-
box-shadow: var(--shadow-md, 0 4px 6px rgba(0,0,0,0.3));
|
|
199
202
|
}
|
|
200
203
|
|
|
201
204
|
.toolbar-tooltip.tooltip-right {
|