@stephen-netu/design-system 0.1.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 +66 -0
- package/package.json +130 -0
- package/src/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte +221 -0
- package/src/b0-app-shell/clarification-overlay/index.ts +1 -0
- package/src/b0-app-shell/command-bar/CommandBar.svelte +565 -0
- package/src/b0-app-shell/index.ts +14 -0
- package/src/base.css +152 -0
- package/src/d0-data-viz/BarChart.svelte +236 -0
- package/src/d0-data-viz/CheckpointBar.svelte +574 -0
- package/src/d0-data-viz/CheckpointPill.svelte +297 -0
- package/src/d0-data-viz/MetricCard.svelte +159 -0
- package/src/d0-data-viz/SparkLine.svelte +66 -0
- package/src/d0-data-viz/StorageMap.svelte +182 -0
- package/src/d0-data-viz/Timeline.svelte +188 -0
- package/src/d0-data-viz/checkpoint-types.ts +162 -0
- package/src/d0-data-viz/d0-tokens.css +32 -0
- package/src/d0-data-viz/index.ts +58 -0
- package/src/d0-data-viz/storage-map-types.ts +142 -0
- package/src/d0-data-viz/theme-integration.ts +134 -0
- package/src/d0-data-viz/types.ts +53 -0
- package/src/demos/BspSizingInfographic.svelte +386 -0
- package/src/demos/BspZoneDemo.svelte +255 -0
- package/src/demos/ControlRoomDemo.svelte +570 -0
- package/src/demos/NodepadBlocksShowcase.svelte +189 -0
- package/src/demos/index.ts +7 -0
- package/src/editor/CodeEditor.svelte +188 -0
- package/src/editor/FindReplaceDialog.svelte +516 -0
- package/src/editor/MarkdownEditor.svelte +660 -0
- package/src/editor/index.ts +2 -0
- package/src/entity-graph-view/WorldView.svelte +171 -0
- package/src/entity-graph-view/index.ts +6 -0
- package/src/entity-graph-view/types.ts +364 -0
- package/src/epistemic/index.ts +2 -0
- package/src/epistemic/types.ts +134 -0
- package/src/epistemic/utils.ts +32 -0
- package/src/f0-forms/checkbox/Checkbox.svelte +158 -0
- package/src/f0-forms/field/FormField.svelte +91 -0
- package/src/f0-forms/index.ts +11 -0
- package/src/f0-forms/radio/RadioGroup.svelte +192 -0
- package/src/f0-forms/search/SearchBar.svelte +99 -0
- package/src/f0-forms/select/Select.svelte +198 -0
- package/src/f0-forms/textarea/TextArea.svelte +170 -0
- package/src/f0-forms/toggle/FormToggle.svelte +147 -0
- package/src/f0-forms/validation/validate.ts +47 -0
- package/src/fabric/ai/ChatPanel.svelte +648 -0
- package/src/fabric/ai/index.ts +11 -0
- package/src/fabric/data/index.ts +21 -0
- package/src/fabric/feedback/StatusBar.svelte +274 -0
- package/src/fabric/feedback/ToastContainer.svelte +122 -0
- package/src/fabric/feedback/index.ts +14 -0
- package/src/fabric/index.ts +37 -0
- package/src/fabric/input/CommandBar.svelte +79 -0
- package/src/fabric/input/KeyboardShortcuts.svelte +388 -0
- package/src/fabric/input/index.ts +12 -0
- package/src/fabric/layout/GlassBox.svelte +193 -0
- package/src/fabric/layout/KanbanBoard.svelte +158 -0
- package/src/fabric/layout/KanbanCard.svelte +226 -0
- package/src/fabric/layout/KanbanColumn.svelte +278 -0
- package/src/fabric/layout/index.ts +17 -0
- package/src/fabric/navigation/ActivityRail.svelte +271 -0
- package/src/fabric/navigation/index.ts +11 -0
- package/src/g0-geo/SovereignMap.svelte +149 -0
- package/src/g0-geo/index.ts +2 -0
- package/src/index.ts +68 -0
- package/src/l0-layout/block-writer/BlockConnectionLines.svelte +98 -0
- package/src/l0-layout/block-writer/BlockContent.svelte +213 -0
- package/src/l0-layout/block-writer/BlockHeader.svelte +230 -0
- package/src/l0-layout/block-writer/BlockItem.svelte +177 -0
- package/src/l0-layout/block-writer/BlockWriter.svelte +219 -0
- package/src/l0-layout/block-writer/block-writer-types.ts +63 -0
- package/src/l0-layout/block-writer/index.ts +24 -0
- package/src/l0-layout/block-writer/markdown.ts +110 -0
- package/src/l0-layout/chat-view/ChatViewLayout.svelte +61 -0
- package/src/l0-layout/epistemic/AllayDetailPanel.svelte +113 -0
- package/src/l0-layout/epistemic/AssayDetailPanel.svelte +164 -0
- package/src/l0-layout/epistemic/AvenueTrace.svelte +253 -0
- package/src/l0-layout/epistemic/KnowledgeDetailPanel.svelte +204 -0
- package/src/l0-layout/epistemic/ParadigmLens.svelte +170 -0
- package/src/l0-layout/epistemic/ProvenanceChain.svelte +164 -0
- package/src/l0-layout/epistemic/TrustView.svelte +195 -0
- package/src/l0-layout/epistemic/index.ts +7 -0
- package/src/l0-layout/grove/AccordCard.svelte +156 -0
- package/src/l0-layout/grove/GroveCard.svelte +197 -0
- package/src/l0-layout/grove/MemberBadge.svelte +96 -0
- package/src/l0-layout/grove/MemberList.svelte +59 -0
- package/src/l0-layout/grove/grove-types.ts +29 -0
- package/src/l0-layout/grove/index.ts +14 -0
- package/src/l0-layout/index.ts +45 -0
- package/src/l0-layout/kanban/KanbanBoard.svelte +71 -0
- package/src/l0-layout/kanban/KanbanCard.svelte +276 -0
- package/src/l0-layout/kanban/KanbanColumn.svelte +198 -0
- package/src/l0-layout/kanban/KanbanViewLayout.svelte +61 -0
- package/src/l0-layout/workspace/WorkspaceLayout.svelte +93 -0
- package/src/n0-node-graph/GraphEditor.svelte +342 -0
- package/src/n0-node-graph/GraphHistory.svelte +122 -0
- package/src/n0-node-graph/Node.svelte +269 -0
- package/src/n0-node-graph/NodeCanvas.svelte +187 -0
- package/src/n0-node-graph/NodeEdge.svelte +152 -0
- package/src/n0-node-graph/NodePalette.svelte +318 -0
- package/src/n0-node-graph/NodePort.svelte +128 -0
- package/src/n0-node-graph/index.ts +33 -0
- package/src/n0-node-graph/n0-tokens.css +29 -0
- package/src/n0-node-graph/node-port-types.ts +19 -0
- package/src/n0-node-graph/types.ts +96 -0
- package/src/n0-node-graph/validate.test.ts +722 -0
- package/src/n0-node-graph/validate.ts +371 -0
- package/src/n1-flow-canvas/FlowCanvas.svelte +202 -0
- package/src/n1-flow-canvas/graph-state.svelte.ts +95 -0
- package/src/n1-flow-canvas/index.ts +21 -0
- package/src/n1-flow-canvas/layout.ts +118 -0
- package/src/n1-flow-canvas/layout.worker.ts +128 -0
- package/src/n1-flow-canvas/types.ts +102 -0
- package/src/n1-flow-canvas/utils.ts +146 -0
- package/src/n2-manifold-disk/ManifoldDisk.svelte +314 -0
- package/src/n2-manifold-disk/index.ts +6 -0
- package/src/n2-manifold-disk/poincare.ts +184 -0
- package/src/n3-force-graph/ForceGraph.svelte +180 -0
- package/src/n3-force-graph/GraphTooltip.svelte +99 -0
- package/src/n3-force-graph/animated-edge.ts +107 -0
- package/src/n3-force-graph/health-node.ts +128 -0
- package/src/n3-force-graph/index.ts +31 -0
- package/src/n3-force-graph/types.ts +94 -0
- package/src/n4-adaptive-manifold/AdaptiveManifold.svelte +1165 -0
- package/src/n4-adaptive-manifold/DetailCard.svelte +212 -0
- package/src/n4-adaptive-manifold/SuggestionIndicator.svelte +91 -0
- package/src/n4-adaptive-manifold/classifier.ts +139 -0
- package/src/n4-adaptive-manifold/index.ts +45 -0
- package/src/n4-adaptive-manifold/n4-tokens.css +155 -0
- package/src/n4-adaptive-manifold/orchestrator.ts +301 -0
- package/src/n4-adaptive-manifold/phase-theme.ts +92 -0
- package/src/n4-adaptive-manifold/pinnacle-events.ts +135 -0
- package/src/n4-adaptive-manifold/providers/gravitational-provider.ts +191 -0
- package/src/n4-adaptive-manifold/providers/manifold-provider.ts +276 -0
- package/src/n4-adaptive-manifold/transition.ts +90 -0
- package/src/n4-adaptive-manifold/types.ts +313 -0
- package/src/p0-primitives/index.ts +6 -0
- package/src/p0-primitives/tokens/control-room.css +309 -0
- package/src/p0-primitives/tokens/index.ts +6 -0
- package/src/p0-primitives/tokens/tokens.css +140 -0
- package/src/p0-primitives/tokens/tokens.json +132 -0
- package/src/p0-primitives/types/index.ts +123 -0
- package/src/p0-primitives/types/plugin-types.ts +74 -0
- package/src/p0-primitives/utils/index.ts +39 -0
- package/src/platform/hud-protocol.ts +20 -0
- package/src/platform/index.ts +3 -0
- package/src/s0-state/create-store.ts +84 -0
- package/src/s0-state/derived.ts +41 -0
- package/src/s0-state/index.ts +6 -0
- package/src/showcase/Showcase.svelte +401 -0
- package/src/spatial/BspTilingCanvas.svelte +232 -0
- package/src/spatial/ForceCanvas.svelte +289 -0
- package/src/spatial/LodRenderer.svelte +334 -0
- package/src/spatial/SnapZoomCamera.svelte +185 -0
- package/src/spatial/ZoneTiler.svelte +311 -0
- package/src/spatial/camera-types.ts +45 -0
- package/src/spatial/content-proportional-bsp.ts +253 -0
- package/src/spatial/force-canvas-types.ts +102 -0
- package/src/spatial/index.ts +15 -0
- package/src/spatial/lod-types.ts +70 -0
- package/src/spatial/zone-tiler-types.ts +177 -0
- package/src/stores/vaultStore.svelte +14 -0
- package/src/t0-transport/connection.ts +34 -0
- package/src/t0-transport/error.ts +37 -0
- package/src/t0-transport/events.ts +50 -0
- package/src/t0-transport/index.ts +6 -0
- package/src/t0-transport/invoke.ts +30 -0
- package/src/tauri/index.ts +13 -0
- package/src/u0-primitives/allay-gauge/AllayGauge.svelte +90 -0
- package/src/u0-primitives/allay-gauge/index.ts +1 -0
- package/src/u0-primitives/animated-icon/AnimatedIcon.svelte +273 -0
- package/src/u0-primitives/animated-icon/README.md +53 -0
- package/src/u0-primitives/animated-icon/index.ts +31 -0
- package/src/u0-primitives/assay-badge/AssayBadge.svelte +121 -0
- package/src/u0-primitives/assay-badge/AssaySignalBar.svelte +83 -0
- package/src/u0-primitives/assay-badge/index.ts +2 -0
- package/src/u0-primitives/avatar/Avatar.svelte +177 -0
- package/src/u0-primitives/badge/Badge.svelte +149 -0
- package/src/u0-primitives/button/Button.svelte +304 -0
- package/src/u0-primitives/card/Card.svelte +182 -0
- package/src/u0-primitives/dropdown/Dropdown.svelte +305 -0
- package/src/u0-primitives/expert-badge/ExpertBadge.svelte +89 -0
- package/src/u0-primitives/expert-badge/index.ts +1 -0
- package/src/u0-primitives/index.ts +35 -0
- package/src/u0-primitives/input/Input.svelte +237 -0
- package/src/u0-primitives/modal/Modal.svelte +331 -0
- package/src/u0-primitives/modal/index.ts +1 -0
- package/src/u0-primitives/spinner/Spinner.svelte +129 -0
- package/src/u0-primitives/tabs/Tabs.svelte +225 -0
- package/src/u0-primitives/tabs/tabs-types.ts +11 -0
- package/src/u0-primitives/toggle/Toggle.svelte +161 -0
- package/src/u0-primitives/tooltip/Tooltip.svelte +234 -0
- package/src/v0-diagrams/DiagramPanel.svelte +68 -0
- package/src/v0-diagrams/MarkmapDiagram.svelte +56 -0
- package/src/v0-diagrams/MermaidDiagram.svelte +53 -0
- package/src/v0-diagrams/index.ts +4 -0
- package/src/v0-diagrams/types.ts +28 -0
- package/src/v0-diagrams/v0-tokens.css +6 -0
- package/src/vite-env.d.ts +7 -0
- package/src/x0-enchanted-blocks/ENCHANTED_BLOCKS_SPEC.md +457 -0
- package/src/x0-enchanted-blocks/components/EnchantedBlock.svelte +485 -0
- package/src/x0-enchanted-blocks/components/NodepadBlock.svelte +262 -0
- package/src/x0-enchanted-blocks/core/block-layout.ts +211 -0
- package/src/x0-enchanted-blocks/core/block-types.ts +227 -0
- package/src/x0-enchanted-blocks/index.ts +46 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/* @kos/design-system — canonical design tokens
|
|
2
|
+
Source of truth for all CSS custom properties.
|
|
3
|
+
All LEAP apps consume these via `import '@kos/design-system'`.
|
|
4
|
+
Palette: brass/copper dark theme. NEVER blue as primary. */
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
/* --- Backgrounds --- */
|
|
8
|
+
--color-bg-app: #141414;
|
|
9
|
+
--color-bg-canvas: #1a1a1a;
|
|
10
|
+
--color-bg-panel: #222222;
|
|
11
|
+
--color-bg-panel-elevated: #2a2a2a;
|
|
12
|
+
--color-card-bg: #252525;
|
|
13
|
+
--color-card-bg-warm: #2a2520;
|
|
14
|
+
--color-card-bg-cool: #202528;
|
|
15
|
+
|
|
16
|
+
/* --- Text --- */
|
|
17
|
+
--color-text-primary: #f2efe9;
|
|
18
|
+
--color-text-secondary: #a09880;
|
|
19
|
+
--color-text-tertiary: #706858;
|
|
20
|
+
--color-text-muted: #5a5245;
|
|
21
|
+
--color-text-inverse: #141414;
|
|
22
|
+
--color-card-text-primary: #e8e0d0;
|
|
23
|
+
--color-card-text-secondary: #a09880;
|
|
24
|
+
--color-card-text-tertiary: #706858;
|
|
25
|
+
|
|
26
|
+
/* --- Accent (brass/copper) --- */
|
|
27
|
+
--color-accent: #b87333;
|
|
28
|
+
--color-accent-hover: #d4956a;
|
|
29
|
+
--color-accent-active: #8a5626;
|
|
30
|
+
--color-accent-glow: rgba(184, 115, 51, 0.3);
|
|
31
|
+
--color-accent-muted: rgba(184, 115, 51, 0.2);
|
|
32
|
+
--color-accent-subtle: rgba(184, 115, 51, 0.15);
|
|
33
|
+
--color-accent-faint: rgba(184, 115, 51, 0.08);
|
|
34
|
+
--color-accent-amber: #d4956a;
|
|
35
|
+
--color-accent-copper: #b87333;
|
|
36
|
+
--color-accent-rust: #8a5626;
|
|
37
|
+
--color-accent-sage: #6b8a6b;
|
|
38
|
+
|
|
39
|
+
/* --- Status --- */
|
|
40
|
+
--color-success: #27ae60;
|
|
41
|
+
--color-warning: #f39c12;
|
|
42
|
+
--color-error: #c0392b;
|
|
43
|
+
--color-info: #2980b9;
|
|
44
|
+
|
|
45
|
+
/* --- Semantic (presence) --- */
|
|
46
|
+
--color-online: #4ade80;
|
|
47
|
+
--color-offline: #6b7280;
|
|
48
|
+
--color-away: #fbbf24;
|
|
49
|
+
--color-busy: #ef4444;
|
|
50
|
+
--color-typing: #fbbf24;
|
|
51
|
+
|
|
52
|
+
/* --- Epistemic (ASSAY clearance states) --- */
|
|
53
|
+
--epistemic-cleared: #27ae60; /* green — matches --color-success */
|
|
54
|
+
--epistemic-cleared-glow: rgba(39, 174, 96, 0.2);
|
|
55
|
+
--epistemic-blocked: #c0392b; /* red — matches --color-error */
|
|
56
|
+
--epistemic-blocked-glow: rgba(192, 57, 43, 0.2);
|
|
57
|
+
--epistemic-pending: #f39c12; /* amber — matches --color-warning */
|
|
58
|
+
--epistemic-pending-glow: rgba(243, 156, 18, 0.2);
|
|
59
|
+
--epistemic-degraded: #6b7280; /* grey */
|
|
60
|
+
--epistemic-degraded-glow: rgba(107, 114, 128, 0.15);
|
|
61
|
+
|
|
62
|
+
/* --- Allay stages (0=grey → 5=gold) --- */
|
|
63
|
+
--epistemic-stage-0: #4a4a4a; /* Propose — dark grey */
|
|
64
|
+
--epistemic-stage-1: #6b7280; /* Parse — muted grey */
|
|
65
|
+
--epistemic-stage-2: #d4956a; /* Authorize — amber (--color-accent-amber) */
|
|
66
|
+
--epistemic-stage-3: #b87333; /* Execute — copper (--color-accent-copper) */
|
|
67
|
+
--epistemic-stage-4: #c9973a; /* Trace — brass */
|
|
68
|
+
--epistemic-stage-5: #d4a843; /* Replicate — gold */
|
|
69
|
+
--epistemic-stage-5-glow: rgba(212, 168, 67, 0.25);
|
|
70
|
+
|
|
71
|
+
/* --- Expert identity colors --- */
|
|
72
|
+
--expert-atelier: #b87333; /* copper — knowledge surfaces */
|
|
73
|
+
--expert-agora: #6b8a6b; /* sage — communication (--color-accent-sage) */
|
|
74
|
+
--expert-ryu: #d4956a; /* amber — task execution (--color-accent-amber) */
|
|
75
|
+
--expert-sovereign: #c9973a; /* brass — kernel */
|
|
76
|
+
--expert-agent: #2980b9; /* info — agent (--color-info) */
|
|
77
|
+
|
|
78
|
+
/* --- Borders --- */
|
|
79
|
+
--border-subtle: rgba(255, 255, 255, 0.06);
|
|
80
|
+
--border-default: #333333;
|
|
81
|
+
--border-hover: #444444;
|
|
82
|
+
--border-focus: #b87333;
|
|
83
|
+
--divider-color: #2a2a2a;
|
|
84
|
+
|
|
85
|
+
/* --- Grid (canvas patterns) --- */
|
|
86
|
+
--grid-line: rgba(184, 115, 51, 0.06);
|
|
87
|
+
--grid-dot: rgba(184, 115, 51, 0.12);
|
|
88
|
+
|
|
89
|
+
/* --- Typography --- */
|
|
90
|
+
--font-sans: 'Outfit', system-ui, -apple-system, sans-serif;
|
|
91
|
+
--font-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
92
|
+
--font-serif: 'Crimson Pro', Georgia, serif;
|
|
93
|
+
|
|
94
|
+
--text-xs: 0.75rem;
|
|
95
|
+
--text-sm: 0.875rem;
|
|
96
|
+
--text-base: 1rem;
|
|
97
|
+
--text-lg: 1.125rem;
|
|
98
|
+
--text-xl: 1.25rem;
|
|
99
|
+
--text-2xl: 1.5rem;
|
|
100
|
+
--text-3xl: 1.875rem;
|
|
101
|
+
--text-4xl: 2.25rem;
|
|
102
|
+
|
|
103
|
+
/* --- Spacing --- */
|
|
104
|
+
--space-1: 0.25rem;
|
|
105
|
+
--space-2: 0.5rem;
|
|
106
|
+
--space-3: 0.75rem;
|
|
107
|
+
--space-4: 1rem;
|
|
108
|
+
--space-5: 1.25rem;
|
|
109
|
+
--space-6: 1.5rem;
|
|
110
|
+
--space-8: 2rem;
|
|
111
|
+
--space-10: 2.5rem;
|
|
112
|
+
--space-12: 3rem;
|
|
113
|
+
--space-16: 4rem;
|
|
114
|
+
|
|
115
|
+
/* --- Border radius --- */
|
|
116
|
+
--radius-xs: 0.125rem;
|
|
117
|
+
--radius-sm: 0.25rem;
|
|
118
|
+
--radius-md: 0.375rem;
|
|
119
|
+
--radius-lg: 0.5rem;
|
|
120
|
+
--radius-xl: 0.75rem;
|
|
121
|
+
--radius-full: 9999px;
|
|
122
|
+
|
|
123
|
+
/* --- Shadows --- */
|
|
124
|
+
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
|
|
125
|
+
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);
|
|
126
|
+
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5);
|
|
127
|
+
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6);
|
|
128
|
+
--shadow-glow: 0 0 15px rgba(184, 115, 51, 0.15);
|
|
129
|
+
--shadow-glow-lg: 0 0 30px rgba(184, 115, 51, 0.25);
|
|
130
|
+
--shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.3);
|
|
131
|
+
--shadow-card: 0 2px 8px rgba(0, 0, 0, 0.3);
|
|
132
|
+
--shadow-card-hover: 0 4px 16px rgba(0, 0, 0, 0.4);
|
|
133
|
+
|
|
134
|
+
/* --- Transitions --- */
|
|
135
|
+
--transition-fast: 120ms ease;
|
|
136
|
+
--transition-normal: 200ms ease;
|
|
137
|
+
--transition-slow: 350ms ease;
|
|
138
|
+
--transition-bounce: 400ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
|
139
|
+
--transition-spring: 500ms cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
140
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
{
|
|
2
|
+
"colors": {
|
|
3
|
+
"core": {
|
|
4
|
+
"bgApp": "var(--color-bg-app)",
|
|
5
|
+
"bgCanvas": "var(--color-bg-canvas)",
|
|
6
|
+
"bgPanel": "var(--color-bg-panel)",
|
|
7
|
+
"bgPanelElevated": "var(--color-bg-panel-elevated)",
|
|
8
|
+
"cardBg": "var(--color-card-bg)",
|
|
9
|
+
"cardBgWarm": "var(--color-card-bg-warm)",
|
|
10
|
+
"cardBgCool": "var(--color-card-bg-cool)"
|
|
11
|
+
},
|
|
12
|
+
"text": {
|
|
13
|
+
"primary": "var(--color-text-primary)",
|
|
14
|
+
"secondary": "var(--color-text-secondary)",
|
|
15
|
+
"tertiary": "var(--color-text-tertiary)",
|
|
16
|
+
"muted": "var(--color-text-muted)",
|
|
17
|
+
"inverse": "var(--color-text-inverse)",
|
|
18
|
+
"cardPrimary": "var(--color-card-text-primary)",
|
|
19
|
+
"cardSecondary": "var(--color-card-text-secondary)",
|
|
20
|
+
"cardTertiary": "var(--color-card-text-tertiary)"
|
|
21
|
+
},
|
|
22
|
+
"accent": {
|
|
23
|
+
"primary": "var(--color-accent)",
|
|
24
|
+
"hover": "var(--color-accent-hover)",
|
|
25
|
+
"active": "var(--color-accent-active)",
|
|
26
|
+
"glow": "var(--color-accent-glow)",
|
|
27
|
+
"subtle": "var(--color-accent-subtle)",
|
|
28
|
+
"amber": "var(--color-accent-amber)",
|
|
29
|
+
"copper": "var(--color-accent-copper)",
|
|
30
|
+
"rust": "var(--color-accent-rust)",
|
|
31
|
+
"sage": "var(--color-accent-sage)"
|
|
32
|
+
},
|
|
33
|
+
"status": {
|
|
34
|
+
"success": "var(--color-success)",
|
|
35
|
+
"warning": "var(--color-warning)",
|
|
36
|
+
"error": "var(--color-error)",
|
|
37
|
+
"info": "var(--color-info)"
|
|
38
|
+
},
|
|
39
|
+
"semantic": {
|
|
40
|
+
"online": "var(--color-online)",
|
|
41
|
+
"offline": "var(--color-offline)",
|
|
42
|
+
"away": "var(--color-away)",
|
|
43
|
+
"busy": "var(--color-busy)",
|
|
44
|
+
"typing": "var(--color-typing)"
|
|
45
|
+
},
|
|
46
|
+
"border": {
|
|
47
|
+
"subtle": "var(--border-subtle)",
|
|
48
|
+
"default": "var(--border-default)",
|
|
49
|
+
"hover": "var(--border-hover)",
|
|
50
|
+
"focus": "var(--border-focus)",
|
|
51
|
+
"divider": "var(--divider-color)"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"typography": {
|
|
55
|
+
"fonts": {
|
|
56
|
+
"sans": "var(--font-sans)",
|
|
57
|
+
"mono": "var(--font-mono)",
|
|
58
|
+
"serif": "var(--font-serif)"
|
|
59
|
+
},
|
|
60
|
+
"scale": {
|
|
61
|
+
"xs": "var(--text-xs)",
|
|
62
|
+
"sm": "var(--text-sm)",
|
|
63
|
+
"base": "var(--text-base)",
|
|
64
|
+
"lg": "var(--text-lg)",
|
|
65
|
+
"xl": "var(--text-xl)",
|
|
66
|
+
"2xl": "var(--text-2xl)",
|
|
67
|
+
"3xl": "var(--text-3xl)",
|
|
68
|
+
"4xl": "var(--text-4xl)"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"spacing": {
|
|
72
|
+
"1": "var(--space-1)",
|
|
73
|
+
"2": "var(--space-2)",
|
|
74
|
+
"3": "var(--space-3)",
|
|
75
|
+
"4": "var(--space-4)",
|
|
76
|
+
"5": "var(--space-5)",
|
|
77
|
+
"6": "var(--space-6)",
|
|
78
|
+
"8": "var(--space-8)",
|
|
79
|
+
"10": "var(--space-10)",
|
|
80
|
+
"12": "var(--space-12)",
|
|
81
|
+
"16": "var(--space-16)"
|
|
82
|
+
},
|
|
83
|
+
"radius": {
|
|
84
|
+
"sm": "var(--radius-sm)",
|
|
85
|
+
"md": "var(--radius-md)",
|
|
86
|
+
"lg": "var(--radius-lg)",
|
|
87
|
+
"xl": "var(--radius-xl)",
|
|
88
|
+
"full": "var(--radius-full)"
|
|
89
|
+
},
|
|
90
|
+
"shadows": {
|
|
91
|
+
"sm": "var(--shadow-sm)",
|
|
92
|
+
"md": "var(--shadow-md)",
|
|
93
|
+
"lg": "var(--shadow-lg)",
|
|
94
|
+
"xl": "var(--shadow-xl)",
|
|
95
|
+
"glow": "var(--shadow-glow)",
|
|
96
|
+
"glowLg": "var(--shadow-glow-lg)",
|
|
97
|
+
"inner": "var(--shadow-inner)",
|
|
98
|
+
"card": "var(--shadow-card)",
|
|
99
|
+
"cardHover": "var(--shadow-card-hover)"
|
|
100
|
+
},
|
|
101
|
+
"animations": {
|
|
102
|
+
"fast": "var(--transition-fast)",
|
|
103
|
+
"normal": "var(--transition-normal)",
|
|
104
|
+
"slow": "var(--transition-slow)",
|
|
105
|
+
"bounce": "var(--transition-bounce)",
|
|
106
|
+
"spring": "var(--transition-spring)"
|
|
107
|
+
},
|
|
108
|
+
"epistemic": {
|
|
109
|
+
"cleared": "var(--epistemic-cleared)",
|
|
110
|
+
"clearedGlow": "var(--epistemic-cleared-glow)",
|
|
111
|
+
"blocked": "var(--epistemic-blocked)",
|
|
112
|
+
"blockedGlow": "var(--epistemic-blocked-glow)",
|
|
113
|
+
"pending": "var(--epistemic-pending)",
|
|
114
|
+
"pendingGlow": "var(--epistemic-pending-glow)",
|
|
115
|
+
"degraded": "var(--epistemic-degraded)",
|
|
116
|
+
"degradedGlow": "var(--epistemic-degraded-glow)",
|
|
117
|
+
"stage0": "var(--epistemic-stage-0)",
|
|
118
|
+
"stage1": "var(--epistemic-stage-1)",
|
|
119
|
+
"stage2": "var(--epistemic-stage-2)",
|
|
120
|
+
"stage3": "var(--epistemic-stage-3)",
|
|
121
|
+
"stage4": "var(--epistemic-stage-4)",
|
|
122
|
+
"stage5": "var(--epistemic-stage-5)",
|
|
123
|
+
"stage5Glow": "var(--epistemic-stage-5-glow)"
|
|
124
|
+
},
|
|
125
|
+
"expert": {
|
|
126
|
+
"atelier": "var(--expert-atelier)",
|
|
127
|
+
"agora": "var(--expert-agora)",
|
|
128
|
+
"ryu": "var(--expert-ryu)",
|
|
129
|
+
"sovereign": "var(--expert-sovereign)",
|
|
130
|
+
"agent": "var(--expert-agent)"
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Shared type definitions for the design system
|
|
2
|
+
// These types mirror the actual Props interfaces in each component.
|
|
3
|
+
// Keep in sync with component $props() definitions.
|
|
4
|
+
|
|
5
|
+
export * from './plugin-types';
|
|
6
|
+
|
|
7
|
+
import type { Snippet } from 'svelte';
|
|
8
|
+
|
|
9
|
+
export interface ButtonProps {
|
|
10
|
+
variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
|
|
11
|
+
size?: 'sm' | 'md' | 'lg';
|
|
12
|
+
type?: 'button' | 'submit' | 'reset';
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
class?: string;
|
|
16
|
+
onclick?: (e: MouseEvent) => void;
|
|
17
|
+
children?: Snippet;
|
|
18
|
+
iconLeading?: Snippet;
|
|
19
|
+
iconTrailing?: Snippet;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface InputProps {
|
|
23
|
+
value?: string;
|
|
24
|
+
type?: 'text' | 'search' | 'password' | 'email' | 'url';
|
|
25
|
+
placeholder?: string;
|
|
26
|
+
disabled?: boolean;
|
|
27
|
+
error?: boolean;
|
|
28
|
+
class?: string;
|
|
29
|
+
id?: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
iconLeading?: Snippet;
|
|
32
|
+
iconTrailing?: Snippet;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface CardProps {
|
|
36
|
+
variant?: 'elevated' | 'flat' | 'interactive' | 'glass';
|
|
37
|
+
selected?: boolean;
|
|
38
|
+
class?: string;
|
|
39
|
+
onclick?: (e: MouseEvent) => void;
|
|
40
|
+
onkeydown?: (e: KeyboardEvent) => void;
|
|
41
|
+
children?: Snippet;
|
|
42
|
+
header?: Snippet;
|
|
43
|
+
footer?: Snippet;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface BadgeProps {
|
|
47
|
+
variant?: 'status' | 'count' | 'dot' | 'outline';
|
|
48
|
+
color?: 'accent' | 'success' | 'warning' | 'error' | 'info' | 'neutral';
|
|
49
|
+
size?: 'sm' | 'md' | 'lg';
|
|
50
|
+
class?: string;
|
|
51
|
+
children?: Snippet;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface ToggleProps {
|
|
55
|
+
checked?: boolean;
|
|
56
|
+
disabled?: boolean;
|
|
57
|
+
size?: 'sm' | 'md' | 'lg';
|
|
58
|
+
class?: string;
|
|
59
|
+
onchange?: (checked: boolean) => void;
|
|
60
|
+
label?: Snippet;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface SpinnerProps {
|
|
64
|
+
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
65
|
+
color?: 'accent' | 'muted' | 'white';
|
|
66
|
+
class?: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface TabsProps {
|
|
70
|
+
tabs: Array<{ id: string; label: string | Snippet; disabled?: boolean; icon?: Snippet }>;
|
|
71
|
+
activeId?: string;
|
|
72
|
+
class?: string;
|
|
73
|
+
fullWidth?: boolean;
|
|
74
|
+
onchange?: (id: string) => void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface ModalProps {
|
|
78
|
+
isOpen?: boolean;
|
|
79
|
+
title?: string;
|
|
80
|
+
class?: string;
|
|
81
|
+
onClose?: () => void;
|
|
82
|
+
showCloseButton?: boolean;
|
|
83
|
+
closeOnOverlayClick?: boolean;
|
|
84
|
+
closeOnEscape?: boolean;
|
|
85
|
+
zIndex?: number;
|
|
86
|
+
children?: Snippet;
|
|
87
|
+
headerActions?: Snippet;
|
|
88
|
+
footer?: Snippet;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface TooltipProps {
|
|
92
|
+
content: string | Snippet;
|
|
93
|
+
position?: 'top' | 'right' | 'bottom' | 'left';
|
|
94
|
+
delayMs?: number;
|
|
95
|
+
class?: string;
|
|
96
|
+
trigger: Snippet;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface DropdownItem {
|
|
100
|
+
id: string;
|
|
101
|
+
label: string;
|
|
102
|
+
icon?: Snippet;
|
|
103
|
+
shortcut?: string;
|
|
104
|
+
disabled?: boolean;
|
|
105
|
+
danger?: boolean;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface DropdownProps {
|
|
109
|
+
items: DropdownItem[];
|
|
110
|
+
trigger: Snippet;
|
|
111
|
+
align?: 'left' | 'right' | 'center';
|
|
112
|
+
width?: string;
|
|
113
|
+
class?: string;
|
|
114
|
+
onselect?: (item: DropdownItem) => void;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export interface AvatarProps {
|
|
118
|
+
src?: string;
|
|
119
|
+
name?: string;
|
|
120
|
+
size?: 'sm' | 'md' | 'lg' | 'xl';
|
|
121
|
+
status?: 'online' | 'offline' | 'away' | 'busy' | 'typing' | null;
|
|
122
|
+
class?: string;
|
|
123
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Plugin manifest types — capability-first app integration contract
|
|
2
|
+
// Apps declare capabilities via typed manifest; shell aggregates at build time.
|
|
3
|
+
//
|
|
4
|
+
// Synchronized with: SOVEREIGN/effectors/e0-plugin-primitives/src/lib.rs
|
|
5
|
+
// Canonical Rust types: PluginManifest, TauriSubstrateExtension, ShellExtension
|
|
6
|
+
// See ADR: .gears/_realm/adr/2026-04-18-plugin-contract-unification.md
|
|
7
|
+
|
|
8
|
+
import type { Component } from 'svelte';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Plugin capability — domain:action format.
|
|
12
|
+
* Known domains are typed; unknown capabilities fall through to string (Named escape hatch).
|
|
13
|
+
*/
|
|
14
|
+
export type KnownCapability =
|
|
15
|
+
| 'view:spatial'
|
|
16
|
+
| 'view:agora'
|
|
17
|
+
| 'view:sovereign'
|
|
18
|
+
| 'view:terminal'
|
|
19
|
+
| 'storage:read'
|
|
20
|
+
| 'storage:write'
|
|
21
|
+
| 'net:access'
|
|
22
|
+
| 'fs:access'
|
|
23
|
+
| 'agent:interact'
|
|
24
|
+
| 'p2p.connect'
|
|
25
|
+
| 'p2p.messaging'
|
|
26
|
+
| 'persistence.local'
|
|
27
|
+
| 'persistence.sovereign'
|
|
28
|
+
| 'knowledge.search'
|
|
29
|
+
| 'knowledge.ingest'
|
|
30
|
+
| 'llm.chat'
|
|
31
|
+
| 'llm.embeddings'
|
|
32
|
+
| 'identity.read'
|
|
33
|
+
| 'identity.manage';
|
|
34
|
+
|
|
35
|
+
/** Any capability string — unknown domains map to PluginCapability::Named(_) in Rust. */
|
|
36
|
+
export type PluginCapability = KnownCapability | (string & {});
|
|
37
|
+
|
|
38
|
+
/** Lazy component factory — returns a dynamic import promise */
|
|
39
|
+
export type ViewFactory = () => Promise<{ default: Component }>;
|
|
40
|
+
|
|
41
|
+
/** Plugin view declarations */
|
|
42
|
+
export interface PluginViews {
|
|
43
|
+
/** Primary app view rendered in the shell viewport */
|
|
44
|
+
main: ViewFactory;
|
|
45
|
+
/** Optional settings panel */
|
|
46
|
+
settings?: ViewFactory;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Plugin manifest — the canonical frontend contract.
|
|
51
|
+
*
|
|
52
|
+
* Build-time generated from leap-plugin.toml via generate-plugin-registry.ts.
|
|
53
|
+
* Synchronized with Rust: e0-plugin-primitives::PluginManifest
|
|
54
|
+
*/
|
|
55
|
+
export interface PluginManifest {
|
|
56
|
+
/** Unique plugin identifier (e.g., 'agora', 'atelier', 'ryu') */
|
|
57
|
+
id: string;
|
|
58
|
+
/** Human-readable display name */
|
|
59
|
+
name: string;
|
|
60
|
+
/** Short description shown in plugin store / tooltips */
|
|
61
|
+
description: string;
|
|
62
|
+
/** Icon name from the design system icon set (e.g., 'MessageCircle') */
|
|
63
|
+
icon: string;
|
|
64
|
+
/** Optional keyboard shortcut (e.g., 'Ctrl+Shift+A') */
|
|
65
|
+
shortcut?: string;
|
|
66
|
+
/** Integration tier (0=external, 1=built-in, 2=core, 3=sovereign) */
|
|
67
|
+
tier?: number;
|
|
68
|
+
/** Capabilities this plugin provides to the capability graph */
|
|
69
|
+
provides: PluginCapability[];
|
|
70
|
+
/** Capabilities this plugin requires from the shell/runtime */
|
|
71
|
+
requires: PluginCapability[];
|
|
72
|
+
/** View factories for lazy-loading components */
|
|
73
|
+
views: PluginViews;
|
|
74
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Utility functions for the design system
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Class name merger - combines class names, filtering out falsy values
|
|
5
|
+
*/
|
|
6
|
+
export function cn(...classes: (string | undefined | null | false)[]): string {
|
|
7
|
+
return classes.filter(Boolean).join(' ');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Debounce function
|
|
12
|
+
*/
|
|
13
|
+
export function debounce<T extends (...args: any[]) => any>(
|
|
14
|
+
fn: T,
|
|
15
|
+
delay: number
|
|
16
|
+
): (...args: Parameters<T>) => void {
|
|
17
|
+
let timeoutId: ReturnType<typeof setTimeout>;
|
|
18
|
+
return (...args: Parameters<T>) => {
|
|
19
|
+
clearTimeout(timeoutId);
|
|
20
|
+
timeoutId = setTimeout(() => fn(...args), delay);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Throttle function
|
|
26
|
+
*/
|
|
27
|
+
export function throttle<T extends (...args: any[]) => any>(
|
|
28
|
+
fn: T,
|
|
29
|
+
limit: number
|
|
30
|
+
): (...args: Parameters<T>) => void {
|
|
31
|
+
let inThrottle: boolean;
|
|
32
|
+
return (...args: Parameters<T>) => {
|
|
33
|
+
if (!inThrottle) {
|
|
34
|
+
fn(...args);
|
|
35
|
+
inThrottle = true;
|
|
36
|
+
setTimeout(() => (inThrottle = false), limit);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Platform HUD Protocol — cross-boundary telemetry contract
|
|
2
|
+
//
|
|
3
|
+
// Plugins (Ryu, Agora, etc.) emit hud:contribution Tauri events.
|
|
4
|
+
// LEAP's hudStore collects them; LeapHud renders them generically.
|
|
5
|
+
// See: .gears/_realm/architecture/leap-compositor-protocol-001.md
|
|
6
|
+
|
|
7
|
+
export type HudIndicator = 'nominal' | 'degraded' | 'offline';
|
|
8
|
+
|
|
9
|
+
export interface HudContribution {
|
|
10
|
+
/** Stable ID, e.g. "ryu:spark", "agora:peers" */
|
|
11
|
+
id: string;
|
|
12
|
+
/** Short display label */
|
|
13
|
+
label: string;
|
|
14
|
+
/** Rendered value — string or number */
|
|
15
|
+
value: string | number;
|
|
16
|
+
/** Visual state */
|
|
17
|
+
indicator: HudIndicator;
|
|
18
|
+
/** Lower = left-most in HUD bar */
|
|
19
|
+
priority: number;
|
|
20
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Base store factory using Svelte 5 runes
|
|
2
|
+
// This provides reactive state management without Svelte 4's writable/readable
|
|
3
|
+
|
|
4
|
+
export interface PersistenceConfig {
|
|
5
|
+
key: string;
|
|
6
|
+
storage: 'localStorage' | 'IndexedDB';
|
|
7
|
+
serialize?: (value: unknown) => string;
|
|
8
|
+
deserialize?: (value: string) => unknown;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface StoreOptions<T> {
|
|
12
|
+
initial: T;
|
|
13
|
+
persist?: PersistenceConfig;
|
|
14
|
+
debug?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface Store<T> {
|
|
18
|
+
readonly value: T;
|
|
19
|
+
set(value: T): void;
|
|
20
|
+
update(fn: (value: T) => T): void;
|
|
21
|
+
subscribe(fn: (value: T) => void): () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a reactive store using Svelte 5 runes
|
|
26
|
+
*/
|
|
27
|
+
export function createStore<T>(options: StoreOptions<T>): Store<T> {
|
|
28
|
+
let value = $state(options.initial);
|
|
29
|
+
const subscribers = new Set<(value: T) => void>();
|
|
30
|
+
|
|
31
|
+
// Handle persistence
|
|
32
|
+
if (options.persist) {
|
|
33
|
+
if (typeof window !== 'undefined' && options.persist.storage === 'localStorage') {
|
|
34
|
+
const stored = localStorage.getItem(options.persist.key);
|
|
35
|
+
if (stored) {
|
|
36
|
+
try {
|
|
37
|
+
const deserialized = options.persist.deserialize
|
|
38
|
+
? options.persist.deserialize(stored)
|
|
39
|
+
: JSON.parse(stored);
|
|
40
|
+
value = deserialized as T;
|
|
41
|
+
} catch (e) {
|
|
42
|
+
console.warn('[store] Failed to deserialize stored value for key:', options.persist.key, e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Set up effect to persist changes.
|
|
47
|
+
// $effect.root() so this works whether createStore() is called at module
|
|
48
|
+
// level (outside any component) or inside a component.
|
|
49
|
+
$effect.root(() => {
|
|
50
|
+
$effect(() => {
|
|
51
|
+
const serialized = options.persist!.serialize
|
|
52
|
+
? options.persist!.serialize(value)
|
|
53
|
+
: JSON.stringify(value);
|
|
54
|
+
localStorage.setItem(options.persist!.key, serialized);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function set(newValue: T) {
|
|
61
|
+
value = newValue;
|
|
62
|
+
if (options.debug) {
|
|
63
|
+
console.log(`[store] Set:`, value);
|
|
64
|
+
}
|
|
65
|
+
subscribers.forEach(fn => fn(value));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function update(fn: (value: T) => T) {
|
|
69
|
+
set(fn(value));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function subscribe(fn: (value: T) => void) {
|
|
73
|
+
subscribers.add(fn);
|
|
74
|
+
fn(value); // Immediate call with current value
|
|
75
|
+
return () => subscribers.delete(fn);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
get value() { return value; },
|
|
80
|
+
set,
|
|
81
|
+
update,
|
|
82
|
+
subscribe,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Derived store helpers
|
|
2
|
+
// NOTE: $derived runes only work inside Svelte component context (.svelte files).
|
|
3
|
+
// This module is meant to be used from .svelte.ts files or component <script> blocks.
|
|
4
|
+
|
|
5
|
+
export interface DerivedOptions<T> {
|
|
6
|
+
debug?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface Derived<T> {
|
|
10
|
+
readonly value: T;
|
|
11
|
+
subscribe(fn: (value: T) => void): () => void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Create a derived value from source stores.
|
|
16
|
+
* Must be called during component initialization (where $derived is valid).
|
|
17
|
+
*/
|
|
18
|
+
export function createDerived<T>(
|
|
19
|
+
fn: () => T,
|
|
20
|
+
options?: DerivedOptions<T>
|
|
21
|
+
): Derived<T> {
|
|
22
|
+
const value = $derived(fn());
|
|
23
|
+
const subscribers = new Set<(value: T) => void>();
|
|
24
|
+
|
|
25
|
+
if (options?.debug) {
|
|
26
|
+
$effect(() => {
|
|
27
|
+
console.log(`[derived] Value:`, value);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function subscribe(cb: (value: T) => void) {
|
|
32
|
+
subscribers.add(cb);
|
|
33
|
+
cb(value);
|
|
34
|
+
return () => subscribers.delete(cb);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
get value() { return value; },
|
|
39
|
+
subscribe,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// S0 State — Store primitives using Svelte 5 runes
|
|
2
|
+
|
|
3
|
+
export { createStore } from './create-store';
|
|
4
|
+
export { createDerived } from './derived';
|
|
5
|
+
export type { StoreOptions, PersistenceConfig } from './create-store';
|
|
6
|
+
export type { DerivedOptions } from './derived';
|