@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.
Files changed (204) hide show
  1. package/README.md +66 -0
  2. package/package.json +130 -0
  3. package/src/b0-app-shell/clarification-overlay/ClarificationOverlay.svelte +221 -0
  4. package/src/b0-app-shell/clarification-overlay/index.ts +1 -0
  5. package/src/b0-app-shell/command-bar/CommandBar.svelte +565 -0
  6. package/src/b0-app-shell/index.ts +14 -0
  7. package/src/base.css +152 -0
  8. package/src/d0-data-viz/BarChart.svelte +236 -0
  9. package/src/d0-data-viz/CheckpointBar.svelte +574 -0
  10. package/src/d0-data-viz/CheckpointPill.svelte +297 -0
  11. package/src/d0-data-viz/MetricCard.svelte +159 -0
  12. package/src/d0-data-viz/SparkLine.svelte +66 -0
  13. package/src/d0-data-viz/StorageMap.svelte +182 -0
  14. package/src/d0-data-viz/Timeline.svelte +188 -0
  15. package/src/d0-data-viz/checkpoint-types.ts +162 -0
  16. package/src/d0-data-viz/d0-tokens.css +32 -0
  17. package/src/d0-data-viz/index.ts +58 -0
  18. package/src/d0-data-viz/storage-map-types.ts +142 -0
  19. package/src/d0-data-viz/theme-integration.ts +134 -0
  20. package/src/d0-data-viz/types.ts +53 -0
  21. package/src/demos/BspSizingInfographic.svelte +386 -0
  22. package/src/demos/BspZoneDemo.svelte +255 -0
  23. package/src/demos/ControlRoomDemo.svelte +570 -0
  24. package/src/demos/NodepadBlocksShowcase.svelte +189 -0
  25. package/src/demos/index.ts +7 -0
  26. package/src/editor/CodeEditor.svelte +188 -0
  27. package/src/editor/FindReplaceDialog.svelte +516 -0
  28. package/src/editor/MarkdownEditor.svelte +660 -0
  29. package/src/editor/index.ts +2 -0
  30. package/src/entity-graph-view/WorldView.svelte +171 -0
  31. package/src/entity-graph-view/index.ts +6 -0
  32. package/src/entity-graph-view/types.ts +364 -0
  33. package/src/epistemic/index.ts +2 -0
  34. package/src/epistemic/types.ts +134 -0
  35. package/src/epistemic/utils.ts +32 -0
  36. package/src/f0-forms/checkbox/Checkbox.svelte +158 -0
  37. package/src/f0-forms/field/FormField.svelte +91 -0
  38. package/src/f0-forms/index.ts +11 -0
  39. package/src/f0-forms/radio/RadioGroup.svelte +192 -0
  40. package/src/f0-forms/search/SearchBar.svelte +99 -0
  41. package/src/f0-forms/select/Select.svelte +198 -0
  42. package/src/f0-forms/textarea/TextArea.svelte +170 -0
  43. package/src/f0-forms/toggle/FormToggle.svelte +147 -0
  44. package/src/f0-forms/validation/validate.ts +47 -0
  45. package/src/fabric/ai/ChatPanel.svelte +648 -0
  46. package/src/fabric/ai/index.ts +11 -0
  47. package/src/fabric/data/index.ts +21 -0
  48. package/src/fabric/feedback/StatusBar.svelte +274 -0
  49. package/src/fabric/feedback/ToastContainer.svelte +122 -0
  50. package/src/fabric/feedback/index.ts +14 -0
  51. package/src/fabric/index.ts +37 -0
  52. package/src/fabric/input/CommandBar.svelte +79 -0
  53. package/src/fabric/input/KeyboardShortcuts.svelte +388 -0
  54. package/src/fabric/input/index.ts +12 -0
  55. package/src/fabric/layout/GlassBox.svelte +193 -0
  56. package/src/fabric/layout/KanbanBoard.svelte +158 -0
  57. package/src/fabric/layout/KanbanCard.svelte +226 -0
  58. package/src/fabric/layout/KanbanColumn.svelte +278 -0
  59. package/src/fabric/layout/index.ts +17 -0
  60. package/src/fabric/navigation/ActivityRail.svelte +271 -0
  61. package/src/fabric/navigation/index.ts +11 -0
  62. package/src/g0-geo/SovereignMap.svelte +149 -0
  63. package/src/g0-geo/index.ts +2 -0
  64. package/src/index.ts +68 -0
  65. package/src/l0-layout/block-writer/BlockConnectionLines.svelte +98 -0
  66. package/src/l0-layout/block-writer/BlockContent.svelte +213 -0
  67. package/src/l0-layout/block-writer/BlockHeader.svelte +230 -0
  68. package/src/l0-layout/block-writer/BlockItem.svelte +177 -0
  69. package/src/l0-layout/block-writer/BlockWriter.svelte +219 -0
  70. package/src/l0-layout/block-writer/block-writer-types.ts +63 -0
  71. package/src/l0-layout/block-writer/index.ts +24 -0
  72. package/src/l0-layout/block-writer/markdown.ts +110 -0
  73. package/src/l0-layout/chat-view/ChatViewLayout.svelte +61 -0
  74. package/src/l0-layout/epistemic/AllayDetailPanel.svelte +113 -0
  75. package/src/l0-layout/epistemic/AssayDetailPanel.svelte +164 -0
  76. package/src/l0-layout/epistemic/AvenueTrace.svelte +253 -0
  77. package/src/l0-layout/epistemic/KnowledgeDetailPanel.svelte +204 -0
  78. package/src/l0-layout/epistemic/ParadigmLens.svelte +170 -0
  79. package/src/l0-layout/epistemic/ProvenanceChain.svelte +164 -0
  80. package/src/l0-layout/epistemic/TrustView.svelte +195 -0
  81. package/src/l0-layout/epistemic/index.ts +7 -0
  82. package/src/l0-layout/grove/AccordCard.svelte +156 -0
  83. package/src/l0-layout/grove/GroveCard.svelte +197 -0
  84. package/src/l0-layout/grove/MemberBadge.svelte +96 -0
  85. package/src/l0-layout/grove/MemberList.svelte +59 -0
  86. package/src/l0-layout/grove/grove-types.ts +29 -0
  87. package/src/l0-layout/grove/index.ts +14 -0
  88. package/src/l0-layout/index.ts +45 -0
  89. package/src/l0-layout/kanban/KanbanBoard.svelte +71 -0
  90. package/src/l0-layout/kanban/KanbanCard.svelte +276 -0
  91. package/src/l0-layout/kanban/KanbanColumn.svelte +198 -0
  92. package/src/l0-layout/kanban/KanbanViewLayout.svelte +61 -0
  93. package/src/l0-layout/workspace/WorkspaceLayout.svelte +93 -0
  94. package/src/n0-node-graph/GraphEditor.svelte +342 -0
  95. package/src/n0-node-graph/GraphHistory.svelte +122 -0
  96. package/src/n0-node-graph/Node.svelte +269 -0
  97. package/src/n0-node-graph/NodeCanvas.svelte +187 -0
  98. package/src/n0-node-graph/NodeEdge.svelte +152 -0
  99. package/src/n0-node-graph/NodePalette.svelte +318 -0
  100. package/src/n0-node-graph/NodePort.svelte +128 -0
  101. package/src/n0-node-graph/index.ts +33 -0
  102. package/src/n0-node-graph/n0-tokens.css +29 -0
  103. package/src/n0-node-graph/node-port-types.ts +19 -0
  104. package/src/n0-node-graph/types.ts +96 -0
  105. package/src/n0-node-graph/validate.test.ts +722 -0
  106. package/src/n0-node-graph/validate.ts +371 -0
  107. package/src/n1-flow-canvas/FlowCanvas.svelte +202 -0
  108. package/src/n1-flow-canvas/graph-state.svelte.ts +95 -0
  109. package/src/n1-flow-canvas/index.ts +21 -0
  110. package/src/n1-flow-canvas/layout.ts +118 -0
  111. package/src/n1-flow-canvas/layout.worker.ts +128 -0
  112. package/src/n1-flow-canvas/types.ts +102 -0
  113. package/src/n1-flow-canvas/utils.ts +146 -0
  114. package/src/n2-manifold-disk/ManifoldDisk.svelte +314 -0
  115. package/src/n2-manifold-disk/index.ts +6 -0
  116. package/src/n2-manifold-disk/poincare.ts +184 -0
  117. package/src/n3-force-graph/ForceGraph.svelte +180 -0
  118. package/src/n3-force-graph/GraphTooltip.svelte +99 -0
  119. package/src/n3-force-graph/animated-edge.ts +107 -0
  120. package/src/n3-force-graph/health-node.ts +128 -0
  121. package/src/n3-force-graph/index.ts +31 -0
  122. package/src/n3-force-graph/types.ts +94 -0
  123. package/src/n4-adaptive-manifold/AdaptiveManifold.svelte +1165 -0
  124. package/src/n4-adaptive-manifold/DetailCard.svelte +212 -0
  125. package/src/n4-adaptive-manifold/SuggestionIndicator.svelte +91 -0
  126. package/src/n4-adaptive-manifold/classifier.ts +139 -0
  127. package/src/n4-adaptive-manifold/index.ts +45 -0
  128. package/src/n4-adaptive-manifold/n4-tokens.css +155 -0
  129. package/src/n4-adaptive-manifold/orchestrator.ts +301 -0
  130. package/src/n4-adaptive-manifold/phase-theme.ts +92 -0
  131. package/src/n4-adaptive-manifold/pinnacle-events.ts +135 -0
  132. package/src/n4-adaptive-manifold/providers/gravitational-provider.ts +191 -0
  133. package/src/n4-adaptive-manifold/providers/manifold-provider.ts +276 -0
  134. package/src/n4-adaptive-manifold/transition.ts +90 -0
  135. package/src/n4-adaptive-manifold/types.ts +313 -0
  136. package/src/p0-primitives/index.ts +6 -0
  137. package/src/p0-primitives/tokens/control-room.css +309 -0
  138. package/src/p0-primitives/tokens/index.ts +6 -0
  139. package/src/p0-primitives/tokens/tokens.css +140 -0
  140. package/src/p0-primitives/tokens/tokens.json +132 -0
  141. package/src/p0-primitives/types/index.ts +123 -0
  142. package/src/p0-primitives/types/plugin-types.ts +74 -0
  143. package/src/p0-primitives/utils/index.ts +39 -0
  144. package/src/platform/hud-protocol.ts +20 -0
  145. package/src/platform/index.ts +3 -0
  146. package/src/s0-state/create-store.ts +84 -0
  147. package/src/s0-state/derived.ts +41 -0
  148. package/src/s0-state/index.ts +6 -0
  149. package/src/showcase/Showcase.svelte +401 -0
  150. package/src/spatial/BspTilingCanvas.svelte +232 -0
  151. package/src/spatial/ForceCanvas.svelte +289 -0
  152. package/src/spatial/LodRenderer.svelte +334 -0
  153. package/src/spatial/SnapZoomCamera.svelte +185 -0
  154. package/src/spatial/ZoneTiler.svelte +311 -0
  155. package/src/spatial/camera-types.ts +45 -0
  156. package/src/spatial/content-proportional-bsp.ts +253 -0
  157. package/src/spatial/force-canvas-types.ts +102 -0
  158. package/src/spatial/index.ts +15 -0
  159. package/src/spatial/lod-types.ts +70 -0
  160. package/src/spatial/zone-tiler-types.ts +177 -0
  161. package/src/stores/vaultStore.svelte +14 -0
  162. package/src/t0-transport/connection.ts +34 -0
  163. package/src/t0-transport/error.ts +37 -0
  164. package/src/t0-transport/events.ts +50 -0
  165. package/src/t0-transport/index.ts +6 -0
  166. package/src/t0-transport/invoke.ts +30 -0
  167. package/src/tauri/index.ts +13 -0
  168. package/src/u0-primitives/allay-gauge/AllayGauge.svelte +90 -0
  169. package/src/u0-primitives/allay-gauge/index.ts +1 -0
  170. package/src/u0-primitives/animated-icon/AnimatedIcon.svelte +273 -0
  171. package/src/u0-primitives/animated-icon/README.md +53 -0
  172. package/src/u0-primitives/animated-icon/index.ts +31 -0
  173. package/src/u0-primitives/assay-badge/AssayBadge.svelte +121 -0
  174. package/src/u0-primitives/assay-badge/AssaySignalBar.svelte +83 -0
  175. package/src/u0-primitives/assay-badge/index.ts +2 -0
  176. package/src/u0-primitives/avatar/Avatar.svelte +177 -0
  177. package/src/u0-primitives/badge/Badge.svelte +149 -0
  178. package/src/u0-primitives/button/Button.svelte +304 -0
  179. package/src/u0-primitives/card/Card.svelte +182 -0
  180. package/src/u0-primitives/dropdown/Dropdown.svelte +305 -0
  181. package/src/u0-primitives/expert-badge/ExpertBadge.svelte +89 -0
  182. package/src/u0-primitives/expert-badge/index.ts +1 -0
  183. package/src/u0-primitives/index.ts +35 -0
  184. package/src/u0-primitives/input/Input.svelte +237 -0
  185. package/src/u0-primitives/modal/Modal.svelte +331 -0
  186. package/src/u0-primitives/modal/index.ts +1 -0
  187. package/src/u0-primitives/spinner/Spinner.svelte +129 -0
  188. package/src/u0-primitives/tabs/Tabs.svelte +225 -0
  189. package/src/u0-primitives/tabs/tabs-types.ts +11 -0
  190. package/src/u0-primitives/toggle/Toggle.svelte +161 -0
  191. package/src/u0-primitives/tooltip/Tooltip.svelte +234 -0
  192. package/src/v0-diagrams/DiagramPanel.svelte +68 -0
  193. package/src/v0-diagrams/MarkmapDiagram.svelte +56 -0
  194. package/src/v0-diagrams/MermaidDiagram.svelte +53 -0
  195. package/src/v0-diagrams/index.ts +4 -0
  196. package/src/v0-diagrams/types.ts +28 -0
  197. package/src/v0-diagrams/v0-tokens.css +6 -0
  198. package/src/vite-env.d.ts +7 -0
  199. package/src/x0-enchanted-blocks/ENCHANTED_BLOCKS_SPEC.md +457 -0
  200. package/src/x0-enchanted-blocks/components/EnchantedBlock.svelte +485 -0
  201. package/src/x0-enchanted-blocks/components/NodepadBlock.svelte +262 -0
  202. package/src/x0-enchanted-blocks/core/block-layout.ts +211 -0
  203. package/src/x0-enchanted-blocks/core/block-types.ts +227 -0
  204. package/src/x0-enchanted-blocks/index.ts +46 -0
@@ -0,0 +1,565 @@
1
+ <script lang="ts">
2
+ /**
3
+ * CommandBar — The LEAP global command strip.
4
+ *
5
+ * Three zones, always in the same positions across every LEAP app:
6
+ * LEFT · FLOW PHASE — the system's current operational state
7
+ * CENTER · INTENT — the user's voice to the agent network
8
+ * RIGHT · SPARK — available compute fuel
9
+ *
10
+ * Prop-driven: no store imports. Each app wires it to its own stores.
11
+ *
12
+ * Placement: top of every LEAP app shell, above app-specific navigation.
13
+ * Height: 52px fixed.
14
+ */
15
+
16
+ interface Props {
17
+ /** Whether the daemon socket is connected. */
18
+ connected?: boolean;
19
+ /** Current FLOW phase string (e.g. "GO", "SPROUT", "FREEZE"). */
20
+ flowPhase?: string | null;
21
+ /** Remaining spark fuel units. Null when daemon is offline. */
22
+ sparkRemaining?: number | null;
23
+ /** Total spark fuel capacity. Null when daemon is offline. */
24
+ sparkTotal?: number | null;
25
+ /** Latest daemon sequence number — shown as secondary info in phase section. */
26
+ daemonSequence?: number | null;
27
+ /** REFLEX tick rate in ms — shown as secondary info. */
28
+ tickRateMs?: number | null;
29
+ /** True while an intent is being submitted. */
30
+ submitting?: boolean;
31
+ /** Called when the user submits an intent. */
32
+ onintent?: (text: string) => void;
33
+ }
34
+
35
+ let {
36
+ connected = false,
37
+ flowPhase = null,
38
+ sparkRemaining = null,
39
+ sparkTotal = null,
40
+ daemonSequence = null,
41
+ tickRateMs = null,
42
+ submitting = false,
43
+ onintent,
44
+ }: Props = $props();
45
+
46
+ // ── FLOW PHASE ──────────────────────────────────────────────────────────────
47
+
48
+ const phaseLabel = $derived(flowPhase?.toUpperCase() ?? '—');
49
+
50
+ const phaseGlow = $derived.by((): string => {
51
+ switch (flowPhase?.toLowerCase()) {
52
+ case 'go':
53
+ case 'running':
54
+ case 'executing': return '#27ae60';
55
+ case 'sprout':
56
+ case 'in_progress':
57
+ case 'active': return '#4682c8';
58
+ case 'weed':
59
+ case 'weeding': return '#e67e22';
60
+ case 'consult':
61
+ case 'consulting': return '#b87333';
62
+ case 'freeze':
63
+ case 'frozen':
64
+ case 'blocked': return '#506eb4';
65
+ case 'seed': return '#b87333';
66
+ case 'compost':
67
+ case 'prune': return '#3d3d3d';
68
+ default: return '#5a5245';
69
+ }
70
+ });
71
+
72
+ const isActivePhase = $derived(
73
+ flowPhase?.toLowerCase() === 'go' || flowPhase?.toLowerCase() === 'running'
74
+ );
75
+
76
+ // ── SPARK ────────────────────────────────────────────────────────────────────
77
+
78
+ const SEGMENT_COUNT = 28;
79
+
80
+ const sparkFraction = $derived(
81
+ sparkTotal != null && sparkTotal > 0 && sparkRemaining != null
82
+ ? Math.max(0, Math.min(1, sparkRemaining / sparkTotal))
83
+ : 0
84
+ );
85
+
86
+ const filledSegments = $derived(Math.round(sparkFraction * SEGMENT_COUNT));
87
+
88
+ const sparkCritical = $derived(sparkFraction < 0.1);
89
+ const sparkWarning = $derived(sparkFraction < 0.25 && !sparkCritical);
90
+
91
+ function fmt(n: number | null | undefined): string {
92
+ if (n == null) return '—';
93
+ if (n >= 1_000_000) return (n / 1_000_000).toFixed(n % 1_000_000 === 0 ? 0 : 1) + 'M';
94
+ if (n >= 1_000) return (n / 1_000).toFixed(0) + 'K';
95
+ return n.toLocaleString();
96
+ }
97
+
98
+ // ── INTENT ───────────────────────────────────────────────────────────────────
99
+
100
+ let intentText: string = $state('');
101
+ let focused: boolean = $state(false);
102
+
103
+ function handleSubmit() {
104
+ const text = intentText.trim();
105
+ if (!text || submitting || !connected) return;
106
+ intentText = '';
107
+ onintent?.(text);
108
+ }
109
+
110
+ function handleKeydown(e: KeyboardEvent) {
111
+ if (e.key === 'Enter' && !e.shiftKey) {
112
+ e.preventDefault();
113
+ handleSubmit();
114
+ }
115
+ }
116
+ </script>
117
+
118
+ <div class="cb" class:cb--disconnected={!connected} class:cb--submitting={submitting}>
119
+ <!--
120
+ Subtle horizontal scanline texture — gives the strip a slight analog instrument
121
+ quality without being distracting. Rendered as a CSS pseudo-element in ::before.
122
+ -->
123
+
124
+ <!-- ── LEFT: FLOW PHASE ─────────────────────────────────────────────────── -->
125
+ <div class="cb-phase" style="--glow: {phaseGlow}">
126
+ <div class="cb-phase__dot" class:cb-phase__dot--pulse={isActivePhase && connected}></div>
127
+ <div class="cb-phase__text">
128
+ <span class="cb-phase__name">{connected ? phaseLabel : 'OFFLINE'}</span>
129
+ <span class="cb-phase__sub">
130
+ {#if connected && tickRateMs != null}
131
+ {tickRateMs}ms
132
+ {:else if !connected}
133
+ waiting for daemon
134
+ {:else}
135
+ flow phase
136
+ {/if}
137
+ </span>
138
+ </div>
139
+ </div>
140
+
141
+ <!-- ── DIVIDER ───────────────────────────────────────────────────────────── -->
142
+ <div class="cb-rule" aria-hidden="true"></div>
143
+
144
+ <!-- ── CENTER: INTENT ───────────────────────────────────────────────────── -->
145
+ <div class="cb-intent" class:cb-intent--focused={focused} class:cb-intent--active={intentText.length > 0}>
146
+ <span class="cb-intent__cursor" aria-hidden="true">⟩</span>
147
+ <input
148
+ class="cb-intent__input"
149
+ type="text"
150
+ bind:value={intentText}
151
+ onfocus={() => focused = true}
152
+ onblur={() => focused = false}
153
+ onkeydown={handleKeydown}
154
+ placeholder={connected ? 'Express intent for your machine...' : 'Waiting for daemon...'}
155
+ disabled={!connected || submitting}
156
+ autocomplete="off"
157
+ spellcheck="false"
158
+ aria-label="Intent dispatch — press Enter to send"
159
+ />
160
+ <button
161
+ class="cb-intent__send"
162
+ class:cb-intent__send--ready={intentText.trim().length > 0 && connected}
163
+ onclick={handleSubmit}
164
+ disabled={!intentText.trim() || !connected || submitting}
165
+ title="Dispatch intent (Enter)"
166
+ aria-label="Dispatch intent"
167
+ >
168
+ {#if submitting}
169
+ <span class="cb-intent__spinner" aria-hidden="true"></span>
170
+ {:else}
171
+ <svg width="11" height="11" viewBox="0 0 11 11" fill="none" aria-hidden="true">
172
+ <path d="M5.5 9.5V1.5M1.5 5.5l4-4 4 4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
173
+ </svg>
174
+ {/if}
175
+ </button>
176
+ </div>
177
+
178
+ <!-- ── DIVIDER ───────────────────────────────────────────────────────────── -->
179
+ <div class="cb-rule" aria-hidden="true"></div>
180
+
181
+ <!-- ── RIGHT: SPARK ─────────────────────────────────────────────────────── -->
182
+ <div
183
+ class="cb-spark"
184
+ class:cb-spark--warning={sparkWarning}
185
+ class:cb-spark--critical={sparkCritical}
186
+ >
187
+ <!-- Segmented fuel bar -->
188
+ <div class="cb-spark__bar" aria-hidden="true" title={connected ? `Spark: ${fmt(sparkRemaining)} / ${fmt(sparkTotal)}` : 'Spark: offline'}>
189
+ {#each { length: SEGMENT_COUNT } as _, i}
190
+ <div class="cb-spark__seg" class:cb-spark__seg--on={i < filledSegments}></div>
191
+ {/each}
192
+ </div>
193
+
194
+ <!-- Readout -->
195
+ <div class="cb-spark__readout">
196
+ <span class="cb-spark__val">{connected ? fmt(sparkRemaining) : '—'}</span>
197
+ <span class="cb-spark__div">/</span>
198
+ <span class="cb-spark__cap">{connected ? fmt(sparkTotal) : '—'}</span>
199
+ <span class="cb-spark__lbl">SPARK</span>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <style>
205
+ /* ── Shell ─────────────────────────────────────────────────────────────── */
206
+
207
+ .cb {
208
+ display: grid;
209
+ grid-template-columns: 148px 1px 1fr 1px 196px;
210
+ align-items: stretch;
211
+ height: 52px;
212
+ width: 100%;
213
+ background: #0a0a0a;
214
+ border-bottom: 1px solid rgba(184, 115, 51, 0.14);
215
+ position: relative;
216
+ overflow: visible;
217
+ flex-shrink: 0;
218
+ }
219
+
220
+ /* Scanline texture — very faint, adds analog depth */
221
+ .cb::before {
222
+ content: '';
223
+ position: absolute;
224
+ inset: 0;
225
+ background: repeating-linear-gradient(
226
+ 180deg,
227
+ transparent 0px,
228
+ transparent 2px,
229
+ rgba(255, 255, 255, 0.012) 2px,
230
+ rgba(255, 255, 255, 0.012) 3px
231
+ );
232
+ pointer-events: none;
233
+ z-index: 0;
234
+ }
235
+
236
+ /* Corner accent marks — mechanical gauge aesthetic */
237
+ .cb::after {
238
+ content: '';
239
+ position: absolute;
240
+ top: 0;
241
+ left: 0;
242
+ right: 0;
243
+ height: 1px;
244
+ background: linear-gradient(
245
+ 90deg,
246
+ rgba(184, 115, 51, 0.5) 0%,
247
+ rgba(184, 115, 51, 0.0) 20%,
248
+ transparent 50%,
249
+ rgba(184, 115, 51, 0.0) 80%,
250
+ rgba(184, 115, 51, 0.5) 100%
251
+ );
252
+ pointer-events: none;
253
+ z-index: 0;
254
+ }
255
+
256
+ .cb--disconnected {
257
+ opacity: 0.55;
258
+ }
259
+
260
+ /* ── Divider ───────────────────────────────────────────────────────────── */
261
+
262
+ .cb-rule {
263
+ width: 1px;
264
+ background: rgba(184, 115, 51, 0.12);
265
+ margin: 12px 0;
266
+ z-index: 1;
267
+ }
268
+
269
+ /* ── FLOW PHASE section ────────────────────────────────────────────────── */
270
+
271
+ .cb-phase {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 10px;
275
+ padding: 0 18px;
276
+ position: relative;
277
+ z-index: 1;
278
+ }
279
+
280
+ /* Radial color wash behind the phase — bleeds from left edge */
281
+ .cb-phase::after {
282
+ content: '';
283
+ position: absolute;
284
+ inset: 0;
285
+ background: radial-gradient(
286
+ ellipse 160% 120% at -10% 50%,
287
+ color-mix(in srgb, var(--glow, #5a5245) 12%, transparent),
288
+ transparent 65%
289
+ );
290
+ pointer-events: none;
291
+ }
292
+
293
+ .cb-phase__dot {
294
+ width: 8px;
295
+ height: 8px;
296
+ border-radius: 50%;
297
+ background: var(--glow, #5a5245);
298
+ box-shadow:
299
+ 0 0 0 2px color-mix(in srgb, var(--glow, #5a5245) 20%, transparent),
300
+ 0 0 8px color-mix(in srgb, var(--glow, #5a5245) 50%, transparent);
301
+ flex-shrink: 0;
302
+ transition: background 0.4s, box-shadow 0.4s;
303
+ }
304
+
305
+ .cb-phase__dot--pulse {
306
+ animation: phase-pulse 2.4s ease-in-out infinite;
307
+ }
308
+
309
+ @keyframes phase-pulse {
310
+ 0%, 100% {
311
+ opacity: 1;
312
+ box-shadow:
313
+ 0 0 0 2px color-mix(in srgb, var(--glow) 20%, transparent),
314
+ 0 0 10px color-mix(in srgb, var(--glow) 60%, transparent);
315
+ }
316
+ 50% {
317
+ opacity: 0.65;
318
+ box-shadow:
319
+ 0 0 0 2px color-mix(in srgb, var(--glow) 10%, transparent),
320
+ 0 0 4px color-mix(in srgb, var(--glow) 30%, transparent);
321
+ }
322
+ }
323
+
324
+ .cb-phase__text {
325
+ display: flex;
326
+ flex-direction: column;
327
+ gap: 2px;
328
+ }
329
+
330
+ .cb-phase__name {
331
+ font-family: var(--font-sans);
332
+ font-size: 14px;
333
+ font-weight: 700;
334
+ color: var(--glow, #5a5245);
335
+ letter-spacing: 0.1em;
336
+ line-height: 1;
337
+ transition: color 0.4s;
338
+ }
339
+
340
+ .cb-phase__sub {
341
+ font-family: var(--font-mono);
342
+ font-size: 9px;
343
+ color: rgba(160, 152, 128, 0.65);
344
+ letter-spacing: 0.06em;
345
+ line-height: 1;
346
+ }
347
+
348
+ /* ── INTENT section ────────────────────────────────────────────────────── */
349
+
350
+ .cb-intent {
351
+ display: flex;
352
+ align-items: center;
353
+ gap: 8px;
354
+ padding: 0 16px;
355
+ position: relative;
356
+ z-index: 1;
357
+ transition: background 0.2s;
358
+ }
359
+
360
+ /* Bottom underline — slides in on focus */
361
+ .cb-intent::after {
362
+ content: '';
363
+ position: absolute;
364
+ bottom: 0;
365
+ left: 20px;
366
+ right: 20px;
367
+ height: 1px;
368
+ background: rgba(184, 115, 51, 0.45);
369
+ transform: scaleX(0);
370
+ transform-origin: center;
371
+ transition: transform 0.22s cubic-bezier(0.4, 0, 0.2, 1);
372
+ }
373
+
374
+ .cb-intent--focused::after {
375
+ transform: scaleX(1);
376
+ }
377
+
378
+ .cb-intent--focused {
379
+ background: rgba(184, 115, 51, 0.03);
380
+ }
381
+
382
+ .cb-intent__cursor {
383
+ font-family: var(--font-mono);
384
+ font-size: 13px;
385
+ color: rgba(184, 115, 51, 0.45);
386
+ flex-shrink: 0;
387
+ user-select: none;
388
+ transition: color 0.15s, opacity 0.15s;
389
+ line-height: 1;
390
+ }
391
+
392
+ .cb-intent--focused .cb-intent__cursor,
393
+ .cb-intent--active .cb-intent__cursor {
394
+ color: #b87333;
395
+ }
396
+
397
+ .cb-intent__input {
398
+ flex: 1;
399
+ min-width: 0;
400
+ background: transparent;
401
+ border: none;
402
+ outline: none;
403
+ font-family: var(--font-mono);
404
+ font-size: 12px;
405
+ color: var(--color-text-primary);
406
+ padding: 0;
407
+ caret-color: #b87333;
408
+ }
409
+
410
+ .cb-intent__input::placeholder {
411
+ color: rgba(160, 152, 128, 0.25);
412
+ font-style: italic;
413
+ }
414
+
415
+ .cb-intent__input:disabled {
416
+ cursor: not-allowed;
417
+ color: rgba(160, 152, 128, 0.3);
418
+ }
419
+
420
+ .cb-intent__send {
421
+ flex-shrink: 0;
422
+ display: flex;
423
+ align-items: center;
424
+ justify-content: center;
425
+ width: 24px;
426
+ height: 24px;
427
+ background: rgba(255, 255, 255, 0.04);
428
+ border: 1px solid rgba(184, 115, 51, 0.28);
429
+ border-radius: var(--radius-sm, 3px);
430
+ color: rgba(184, 115, 51, 0.5);
431
+ cursor: pointer;
432
+ transition: all 0.12s;
433
+ }
434
+
435
+ .cb-intent__send--ready {
436
+ border-color: rgba(184, 115, 51, 0.45);
437
+ color: #b87333;
438
+ background: rgba(184, 115, 51, 0.08);
439
+ }
440
+
441
+ .cb-intent__send--ready:hover {
442
+ background: rgba(184, 115, 51, 0.16);
443
+ border-color: rgba(184, 115, 51, 0.65);
444
+ box-shadow: 0 0 8px rgba(184, 115, 51, 0.2);
445
+ }
446
+
447
+ .cb-intent__send:disabled {
448
+ opacity: 0.35;
449
+ cursor: default;
450
+ }
451
+
452
+ .cb-intent__spinner {
453
+ display: inline-block;
454
+ width: 10px;
455
+ height: 10px;
456
+ border: 1.5px solid rgba(184, 115, 51, 0.2);
457
+ border-top-color: #b87333;
458
+ border-radius: 50%;
459
+ animation: cb-spin 0.65s linear infinite;
460
+ }
461
+
462
+ @keyframes cb-spin {
463
+ to { transform: rotate(360deg); }
464
+ }
465
+
466
+ /* ── SPARK section ─────────────────────────────────────────────────────── */
467
+
468
+ .cb-spark {
469
+ display: flex;
470
+ flex-direction: column;
471
+ justify-content: center;
472
+ gap: 5px;
473
+ padding: 0 18px;
474
+ position: relative;
475
+ z-index: 1;
476
+ }
477
+
478
+ /* Radial color wash — bleeds from right edge */
479
+ .cb-spark::before {
480
+ content: '';
481
+ position: absolute;
482
+ inset: 0;
483
+ background: radial-gradient(
484
+ ellipse 160% 120% at 110% 50%,
485
+ rgba(184, 115, 51, 0.07),
486
+ transparent 65%
487
+ );
488
+ pointer-events: none;
489
+ }
490
+
491
+ .cb-spark__bar {
492
+ display: flex;
493
+ align-items: center;
494
+ gap: 2px;
495
+ }
496
+
497
+ .cb-spark__seg {
498
+ width: 4px;
499
+ height: 11px;
500
+ border-radius: var(--radius-xs, 1px);
501
+ background: rgba(184, 115, 51, 0.09);
502
+ transition: background 0.3s, box-shadow 0.3s;
503
+ flex-shrink: 0;
504
+ }
505
+
506
+ .cb-spark__seg--on {
507
+ background: #b87333;
508
+ box-shadow: 0 0 3px rgba(184, 115, 51, 0.4);
509
+ }
510
+
511
+ /* Warning — amber shift */
512
+ .cb-spark--warning .cb-spark__seg--on {
513
+ background: #e67e22;
514
+ box-shadow: 0 0 3px rgba(230, 126, 34, 0.5);
515
+ }
516
+
517
+ /* Critical — red + pulse */
518
+ .cb-spark--critical .cb-spark__seg--on {
519
+ background: #c0392b;
520
+ box-shadow: 0 0 4px rgba(192, 57, 43, 0.6);
521
+ animation: spark-critical 1.2s ease-in-out infinite;
522
+ }
523
+
524
+ @keyframes spark-critical {
525
+ 0%, 100% { opacity: 1; }
526
+ 50% { opacity: 0.5; }
527
+ }
528
+
529
+ .cb-spark__readout {
530
+ display: flex;
531
+ align-items: baseline;
532
+ gap: 3px;
533
+ font-family: var(--font-mono);
534
+ }
535
+
536
+ .cb-spark__val {
537
+ font-size: 11px;
538
+ font-weight: 600;
539
+ color: #b87333;
540
+ letter-spacing: 0.02em;
541
+ }
542
+
543
+ .cb-spark--warning .cb-spark__val { color: #e67e22; }
544
+ .cb-spark--critical .cb-spark__val { color: #c0392b; }
545
+
546
+ .cb-spark__div {
547
+ font-size: 10px;
548
+ color: rgba(160, 152, 128, 0.3);
549
+ }
550
+
551
+ .cb-spark__cap {
552
+ font-size: 10px;
553
+ color: rgba(160, 152, 128, 0.45);
554
+ letter-spacing: 0.02em;
555
+ }
556
+
557
+ .cb-spark__lbl {
558
+ font-size: 9px;
559
+ font-weight: 600;
560
+ color: rgba(160, 152, 128, 0.35);
561
+ text-transform: uppercase;
562
+ letter-spacing: 0.12em;
563
+ margin-left: 5px;
564
+ }
565
+ </style>
@@ -0,0 +1,14 @@
1
+ /**
2
+ * H0 App Shell — Global LEAP chrome components.
3
+ *
4
+ * H = Host/HUD. Free letter in both SOVEREIGN HDA domain assignments and
5
+ * existing DS prefixes (p/u/l/s/t/f/d/n). Replaces the prior a0- prefix
6
+ * which collided conceptually with SOVEREIGN's A=Axioms HDA domain.
7
+ *
8
+ * These components appear at the top of every LEAP app (Ryu, Atelier, Agora)
9
+ * and provide the shared control surface for system state, intent dispatch,
10
+ * and resource visibility. They are prop-driven (no store imports).
11
+ */
12
+
13
+ export { default as CommandBar } from './command-bar/CommandBar.svelte';
14
+ export { ClarificationOverlay } from './clarification-overlay/index';