@stephen-netu/design-system 0.2.2 → 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.
Files changed (229) hide show
  1. package/dist/d0-data-viz/BarChart.test.js +53 -0
  2. package/dist/d0-data-viz/CheckpointBar.test.js +83 -0
  3. package/dist/d0-data-viz/CheckpointPill.svelte +1 -1
  4. package/dist/d0-data-viz/CheckpointPill.test.js +78 -0
  5. package/dist/d0-data-viz/ConnectionHealth.test.js +70 -0
  6. package/dist/d0-data-viz/MetricCard.test.js +57 -0
  7. package/dist/d0-data-viz/SparkLine.test.js +47 -0
  8. package/dist/d0-data-viz/StorageMap.test.js +63 -0
  9. package/dist/d0-data-viz/Timeline.test.js +62 -0
  10. package/dist/d0-data-viz/WorldLineTimeline.test.js +99 -0
  11. package/dist/d0-data-viz/checkpoint-types.js +1 -1
  12. package/dist/d0-data-viz/storage-map-types.d.ts.map +1 -1
  13. package/dist/d0-data-viz/storage-map-types.js +6 -3
  14. package/dist/d0-data-viz/theme-integration.js +1 -1
  15. package/dist/demos/AmbientPrimitivesDemo.svelte +103 -0
  16. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts +5 -0
  17. package/dist/demos/AmbientPrimitivesDemo.svelte.d.ts.map +1 -0
  18. package/dist/demos/NodepadBlocksShowcase.svelte +2 -1
  19. package/dist/demos/NodepadBlocksShowcase.svelte.d.ts.map +1 -1
  20. package/dist/demos/index.d.ts +1 -0
  21. package/dist/demos/index.d.ts.map +1 -1
  22. package/dist/demos/index.js +1 -0
  23. package/dist/editor/CodeEditor.svelte +83 -26
  24. package/dist/editor/CodeEditor.svelte.d.ts +0 -1
  25. package/dist/editor/CodeEditor.svelte.d.ts.map +1 -1
  26. package/dist/editor/ExternalChangeDialog.svelte +117 -0
  27. package/dist/editor/ExternalChangeDialog.svelte.d.ts +13 -0
  28. package/dist/editor/ExternalChangeDialog.svelte.d.ts.map +1 -0
  29. package/dist/editor/MarkdownEditor.svelte +104 -617
  30. package/dist/editor/MarkdownEditor.svelte.d.ts +1 -1
  31. package/dist/editor/MarkdownEditor.svelte.d.ts.map +1 -1
  32. package/dist/editor/codemirror-config.d.ts +36 -0
  33. package/dist/editor/codemirror-config.d.ts.map +1 -0
  34. package/dist/editor/codemirror-config.js +87 -0
  35. package/dist/editor/components/CorrectionTooltip.svelte +180 -159
  36. package/dist/editor/components/CorrectionTooltip.svelte.d.ts +7 -23
  37. package/dist/editor/components/CorrectionTooltip.svelte.d.ts.map +1 -1
  38. package/dist/editor/extensions/autocomplete.d.ts +2 -2
  39. package/dist/editor/extensions/autocomplete.d.ts.map +1 -1
  40. package/dist/editor/extensions/autocomplete.test.js +121 -0
  41. package/dist/editor/extensions/spellcheck.d.ts +21 -3
  42. package/dist/editor/extensions/spellcheck.d.ts.map +1 -1
  43. package/dist/editor/extensions/spellcheck.js +51 -9
  44. package/dist/editor/extensions/spellcheck.test.js +168 -0
  45. package/dist/editor/extensions/types.d.ts +2 -1
  46. package/dist/editor/extensions/types.d.ts.map +1 -1
  47. package/dist/editor/index.d.ts +2 -1
  48. package/dist/editor/index.d.ts.map +1 -1
  49. package/dist/editor/index.js +1 -0
  50. package/dist/editor/markdown-preview.d.ts +9 -0
  51. package/dist/editor/markdown-preview.d.ts.map +1 -0
  52. package/dist/editor/markdown-preview.js +19 -0
  53. package/dist/editor/markdown-preview.test.js +38 -0
  54. package/dist/editor/useCodeMirror.d.ts +23 -0
  55. package/dist/editor/useCodeMirror.d.ts.map +1 -0
  56. package/dist/editor/useCodeMirror.js +40 -0
  57. package/dist/editor/useFilePersistence.d.ts +32 -0
  58. package/dist/editor/useFilePersistence.d.ts.map +1 -0
  59. package/dist/editor/useFilePersistence.js +117 -0
  60. package/dist/fabric/ai/ChatPanel.svelte +61 -62
  61. package/dist/fabric/ai/ChatPanel.svelte.d.ts.map +1 -1
  62. package/dist/fabric/ai/ResearchPanel.svelte +31 -24
  63. package/dist/fabric/data/FileTree.svelte +195 -0
  64. package/dist/fabric/data/FileTree.svelte.d.ts +19 -0
  65. package/dist/fabric/data/FileTree.svelte.d.ts.map +1 -0
  66. package/dist/fabric/data/FileTree.test.js +127 -0
  67. package/dist/fabric/data/index.d.ts +5 -9
  68. package/dist/fabric/data/index.d.ts.map +1 -1
  69. package/dist/fabric/data/index.js +4 -1
  70. package/dist/fabric/index.d.ts +1 -0
  71. package/dist/fabric/index.d.ts.map +1 -1
  72. package/dist/fabric/index.js +2 -0
  73. package/dist/fabric/input/KeyboardShortcuts.svelte +23 -21
  74. package/dist/fabric/layout/CollapsiblePanel.svelte +8 -10
  75. package/dist/fabric/navigation/ActivityRail.svelte +3 -5
  76. package/dist/fabric/navigation/ActivityRail.svelte.d.ts.map +1 -1
  77. package/dist/g0-generative/components/Text.svelte +38 -0
  78. package/dist/g0-generative/components/Text.svelte.d.ts +9 -0
  79. package/dist/g0-generative/components/Text.svelte.d.ts.map +1 -0
  80. package/dist/g0-generative/index.d.ts +1 -0
  81. package/dist/g0-generative/index.d.ts.map +1 -1
  82. package/dist/g0-generative/index.js +1 -0
  83. package/dist/g0-generative/library/ComponentLibrary.d.ts +4 -0
  84. package/dist/g0-generative/library/ComponentLibrary.d.ts.map +1 -1
  85. package/dist/g0-generative/library/ComponentLibrary.js +10 -0
  86. package/dist/g0-generative/library/ComponentLibrary.test.js +135 -0
  87. package/dist/g0-generative/renderer/OpenUIRenderer.svelte +16 -56
  88. package/dist/g0-generative/renderer/OpenUIRenderer.svelte.d.ts.map +1 -1
  89. package/dist/g0-generative/renderer/OpenUIRenderer.test.js +143 -0
  90. package/dist/g0-geo/SovereignMap.svelte +13 -13
  91. package/dist/g0-geo/SovereignMap.svelte.d.ts.map +1 -1
  92. package/dist/index.d.ts +0 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +3 -1
  95. package/dist/l0-layout/block-writer/BlockContent.svelte +23 -22
  96. package/dist/l0-layout/block-writer/BlockContent.svelte.d.ts.map +1 -1
  97. package/dist/l0-layout/block-writer/BlockContent.test.js +47 -0
  98. package/dist/l0-layout/block-writer/markdown.js +11 -11
  99. package/dist/l0-layout/block-writer/markdown.test.js +81 -0
  100. package/dist/l0-layout/card/StackedCard.svelte +87 -0
  101. package/dist/l0-layout/card/StackedCard.svelte.d.ts +9 -0
  102. package/dist/l0-layout/card/StackedCard.svelte.d.ts.map +1 -0
  103. package/dist/l0-layout/card/StackedCard.test.js +29 -0
  104. package/dist/l0-layout/index.d.ts +1 -0
  105. package/dist/l0-layout/index.d.ts.map +1 -1
  106. package/dist/l0-layout/index.js +1 -0
  107. package/dist/l0-layout/kanban/KanbanBoard.svelte +1 -1
  108. package/dist/l0-layout/kanban/KanbanColumn.svelte +1 -1
  109. package/dist/n1-flow-canvas/FlowCanvas.svelte +50 -6
  110. package/dist/n1-flow-canvas/FlowCanvas.svelte.d.ts.map +1 -1
  111. package/dist/n1-flow-canvas/index.d.ts +2 -0
  112. package/dist/n1-flow-canvas/index.d.ts.map +1 -1
  113. package/dist/n1-flow-canvas/index.js +1 -0
  114. package/dist/n1-flow-canvas/pipeline-adapter.d.ts +37 -0
  115. package/dist/n1-flow-canvas/pipeline-adapter.d.ts.map +1 -0
  116. package/dist/n1-flow-canvas/pipeline-adapter.js +160 -0
  117. package/dist/n2-manifold-disk/ManifoldDisk.svelte +62 -35
  118. package/dist/n2-manifold-disk/ManifoldDisk.svelte.d.ts.map +1 -1
  119. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte +23 -19
  120. package/dist/n4-adaptive-manifold/AdaptiveManifold.svelte.d.ts.map +1 -1
  121. package/dist/n4-adaptive-manifold/types.d.ts +3 -0
  122. package/dist/n4-adaptive-manifold/types.d.ts.map +1 -1
  123. package/dist/p0-primitives/ThemeProvider.svelte +28 -7
  124. package/dist/p0-primitives/ThemeProvider.svelte.d.ts +5 -0
  125. package/dist/p0-primitives/ThemeProvider.svelte.d.ts.map +1 -1
  126. package/dist/p0-primitives/canvas-theme.d.ts +21 -1
  127. package/dist/p0-primitives/canvas-theme.d.ts.map +1 -1
  128. package/dist/p0-primitives/canvas-theme.js +78 -23
  129. package/dist/p0-primitives/debug.d.ts +6 -0
  130. package/dist/p0-primitives/debug.d.ts.map +1 -0
  131. package/dist/p0-primitives/debug.js +21 -0
  132. package/dist/p0-primitives/theme.d.ts.map +1 -1
  133. package/dist/p0-primitives/theme.js +11 -31
  134. package/dist/p0-primitives/tokens/ambient.css +76 -0
  135. package/dist/p0-primitives/tokens/tokens.css +124 -29
  136. package/dist/p0-primitives/utils/index.d.ts +2 -0
  137. package/dist/p0-primitives/utils/index.d.ts.map +1 -1
  138. package/dist/p0-primitives/utils/index.js +1 -0
  139. package/dist/p0-primitives/utils/reveal.d.ts +15 -0
  140. package/dist/p0-primitives/utils/reveal.d.ts.map +1 -0
  141. package/dist/p0-primitives/utils/reveal.js +29 -0
  142. package/dist/p0-primitives/utils/reveal.test.js +95 -0
  143. package/dist/s0-state/SyncStatus.svelte +1 -1
  144. package/dist/s0-state/index.d.ts +2 -1
  145. package/dist/s0-state/index.d.ts.map +1 -1
  146. package/dist/s0-state/index.js +2 -0
  147. package/dist/s0-state/modal-stack-store.svelte.d.ts +3 -3
  148. package/dist/s0-state/modal-stack-store.svelte.js +2 -2
  149. package/dist/spatial/ForceSimulation.svelte.js +1 -1
  150. package/dist/spatial/ParticleAssembleMark.svelte +285 -0
  151. package/dist/spatial/ParticleAssembleMark.svelte.d.ts +24 -0
  152. package/dist/spatial/ParticleAssembleMark.svelte.d.ts.map +1 -0
  153. package/dist/spatial/ZoneTiler.test.js +90 -0
  154. package/dist/spatial/index.js +1 -0
  155. package/dist/spatial/particle-assemble-math.d.ts +22 -0
  156. package/dist/spatial/particle-assemble-math.d.ts.map +1 -0
  157. package/dist/spatial/particle-assemble-math.js +26 -0
  158. package/dist/spatial/particle-assemble-math.test.js +56 -0
  159. package/dist/t0-transport/substrate.svelte.d.ts.map +1 -1
  160. package/dist/t0-transport/substrate.svelte.js +10 -4
  161. package/dist/u0-primitives/LockIndicator.svelte +16 -14
  162. package/dist/u0-primitives/VerticalToolbar.svelte +24 -21
  163. package/dist/u0-primitives/accordion/Accordion.svelte +8 -7
  164. package/dist/u0-primitives/animated-icon/AnimatedIcon.svelte +3 -3
  165. package/dist/u0-primitives/animated-icon/AnimatedIcon.test.js +82 -0
  166. package/dist/u0-primitives/avatar/Avatar.svelte +14 -14
  167. package/dist/u0-primitives/avatar/Avatar.test.js +81 -0
  168. package/dist/u0-primitives/badge/Badge.svelte +6 -4
  169. package/dist/u0-primitives/badge/ValidityBadge.svelte +4 -27
  170. package/dist/u0-primitives/button/Button.svelte +15 -12
  171. package/dist/u0-primitives/card/Card.svelte +37 -15
  172. package/dist/u0-primitives/card/Card.test.js +86 -0
  173. package/dist/u0-primitives/command-palette/CommandPalette.svelte +48 -43
  174. package/dist/u0-primitives/command-palette/CommandPalette.test.js +202 -0
  175. package/dist/u0-primitives/dropdown/Dropdown.svelte +20 -25
  176. package/dist/u0-primitives/grant-badge/GrantStatusBadge.svelte +2 -2
  177. package/dist/u0-primitives/index.d.ts +6 -0
  178. package/dist/u0-primitives/index.d.ts.map +1 -1
  179. package/dist/u0-primitives/index.js +8 -0
  180. package/dist/u0-primitives/input/Input.svelte +77 -24
  181. package/dist/u0-primitives/input/Input.svelte.d.ts +2 -10
  182. package/dist/u0-primitives/input/Input.svelte.d.ts.map +1 -1
  183. package/dist/u0-primitives/input/Input.test.js +81 -1
  184. package/dist/u0-primitives/live-dot/LiveDot.svelte +56 -0
  185. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts +11 -0
  186. package/dist/u0-primitives/live-dot/LiveDot.svelte.d.ts.map +1 -0
  187. package/dist/u0-primitives/live-dot/LiveDot.test.js +41 -0
  188. package/dist/u0-primitives/live-dot/index.d.ts +3 -0
  189. package/dist/u0-primitives/live-dot/index.d.ts.map +1 -0
  190. package/dist/u0-primitives/live-dot/index.js +1 -0
  191. package/dist/u0-primitives/modal/Modal.svelte +22 -19
  192. package/dist/u0-primitives/modal/Modal.test.js +1 -1
  193. package/dist/u0-primitives/spinner/Spinner.svelte +11 -79
  194. package/dist/u0-primitives/spinner/Spinner.svelte.d.ts.map +1 -1
  195. package/dist/u0-primitives/steps/Steps.svelte +18 -19
  196. package/dist/u0-primitives/surface-state/SurfaceState.svelte +7 -7
  197. package/dist/u0-primitives/tabs/Tabs.svelte +13 -11
  198. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte +94 -0
  199. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts +16 -0
  200. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.svelte.d.ts.map +1 -0
  201. package/dist/u0-primitives/theme-swatch-group/ThemeSwatchGroup.test.js +48 -0
  202. package/dist/u0-primitives/theme-swatch-group/index.d.ts +3 -0
  203. package/dist/u0-primitives/theme-swatch-group/index.d.ts.map +1 -0
  204. package/dist/u0-primitives/theme-swatch-group/index.js +1 -0
  205. package/dist/u0-primitives/toggle/Toggle.svelte +10 -11
  206. package/dist/u0-primitives/tooltip/Tooltip.svelte +9 -9
  207. package/dist/u0-primitives/web-components/button-component.d.ts +5 -1
  208. package/dist/u0-primitives/web-components/button-component.d.ts.map +1 -1
  209. package/dist/u0-primitives/web-components/button-component.js +72 -33
  210. package/dist/u0-primitives/web-components/index.d.ts +3 -0
  211. package/dist/u0-primitives/web-components/index.d.ts.map +1 -0
  212. package/dist/u0-primitives/web-components/index.js +2 -0
  213. package/dist/u0-primitives/web-components/input-component.d.ts +5 -1
  214. package/dist/u0-primitives/web-components/input-component.d.ts.map +1 -1
  215. package/dist/u0-primitives/web-components/input-component.js +56 -39
  216. package/dist/u0-primitives/web-components/web-components.test.js +96 -0
  217. package/dist/u0-primitives/window-frame/WindowFrame.svelte +87 -0
  218. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts +10 -0
  219. package/dist/u0-primitives/window-frame/WindowFrame.svelte.d.ts.map +1 -0
  220. package/dist/u0-primitives/window-frame/WindowFrame.test.js +31 -0
  221. package/dist/u0-primitives/window-frame/index.d.ts +3 -0
  222. package/dist/u0-primitives/window-frame/index.d.ts.map +1 -0
  223. package/dist/u0-primitives/window-frame/index.js +1 -0
  224. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte +11 -2
  225. package/dist/x0-enchanted-blocks/components/NodepadBlock.svelte.d.ts.map +1 -1
  226. package/package.json +44 -28
  227. package/src/p0-primitives/tokens/ambient.css +76 -0
  228. package/src/p0-primitives/tokens/tokens.css +124 -29
  229. package/src/p0-primitives/tokens/tokens.json +42 -24
@@ -1,46 +1,101 @@
1
- // Canvas Theme Helper — reads CSS custom properties at runtime for canvas rendering
1
+ // Canvas Theme Helper — reads CSS custom properties at runtime for canvas rendering.
2
2
  // Allows canvas components (FlowCanvas, ForceGraph, etc.) to respect runtime theming
3
3
  // without hardcoded hex values.
4
4
  //
5
5
  // Usage:
6
6
  // const theme = getCanvasTheme();
7
7
  // context.fillStyle = theme.node;
8
+ // context.strokeStyle = theme.accentRamp.solid; // e.g. "rgb(184 115 51)"
9
+ // context.fillStyle = theme.accentRamp.alpha(0.3); // e.g. "rgba(184,115,51,0.3)"
8
10
  //
9
- // The helper reads from the document root's computed styles, so it picks up
10
- // whatever theme the user has active (default dark, light, control-room, etc.).
11
+ // The helper reads from the document root's computed styles (or a provided element),
12
+ // so it picks up whatever theme and user accent the consumer has active.
11
13
  /**
12
- * Resolve a CSS custom property to its computed value.
13
- * Falls back to the provided default if the property is undefined.
14
+ * Resolve a CSS custom property to its computed value from a target element.
15
+ * Falls back to the provided default if the property is undefined or SSR.
14
16
  */
15
- function resolveCssVar(name, fallback) {
17
+ function resolveCssVar(name, fallback, el = document.documentElement) {
16
18
  if (typeof document === 'undefined')
17
19
  return fallback;
18
- const computed = getComputedStyle(document.documentElement).getPropertyValue(name);
19
- return computed.trim() || fallback;
20
+ return getComputedStyle(el).getPropertyValue(name).trim() || fallback;
21
+ }
22
+ // --- Accent ramp derivation -------------------------------------------------
23
+ // Canvas 2D cannot use CSS color-mix(). We derive the ramp in JS by parsing
24
+ // the accent seed and adjusting lightness. This mirrors what tokens.css does
25
+ // via color-mix, keeping canvas rendering in sync with CSS theming.
26
+ /** Parse a hex color string to [r, g, b] (0–255). Falls back to brass. */
27
+ function hexToRgb(hex) {
28
+ const h = hex.trim().replace('#', '');
29
+ if (h.length === 3) {
30
+ return [
31
+ parseInt(h[0] + h[0], 16),
32
+ parseInt(h[1] + h[1], 16),
33
+ parseInt(h[2] + h[2], 16),
34
+ ];
35
+ }
36
+ if (h.length === 6) {
37
+ return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)];
38
+ }
39
+ return [184, 115, 51]; // brass fallback
40
+ }
41
+ /** Linear-interpolate a channel toward white (positive t) or black (negative t). */
42
+ function tint(c, t) {
43
+ return Math.round(t > 0 ? c + (255 - c) * t : c + c * t);
44
+ }
45
+ /**
46
+ * Build an AccentRamp from an RGB triplet.
47
+ * hi ≈ color-mix(in oklab, seed, #fff 16%)
48
+ * lo ≈ color-mix(in oklab, seed, #000 22%)
49
+ */
50
+ function buildRamp(r, g, b) {
51
+ const hiR = tint(r, 0.16), hiG = tint(g, 0.16), hiB = tint(b, 0.16);
52
+ const loR = tint(r, -0.22), loG = tint(g, -0.22), loB = tint(b, -0.22);
53
+ return {
54
+ solid: `rgb(${r} ${g} ${b})`,
55
+ hi: `rgb(${hiR} ${hiG} ${hiB})`,
56
+ lo: `rgb(${loR} ${loG} ${loB})`,
57
+ alpha: (a) => `rgba(${r},${g},${b},${a})`,
58
+ };
59
+ }
60
+ /**
61
+ * Resolve the accent seed and return a canvas-ready AccentRamp.
62
+ * Reads --accent-primary from the target element's computed styles.
63
+ * Call once per frame (or on theme change) and cache the result.
64
+ */
65
+ export function resolveAccentRamp(el = document.documentElement) {
66
+ if (typeof document === 'undefined')
67
+ return buildRamp(184, 115, 51);
68
+ const seed = getComputedStyle(el).getPropertyValue('--accent-primary').trim() || '#b87333';
69
+ const [r, g, b] = hexToRgb(seed);
70
+ return buildRamp(r, g, b);
20
71
  }
21
72
  /**
22
73
  * Get the current canvas theme by reading CSS custom properties.
23
74
  * This enables runtime theming for all canvas-based components.
75
+ * Pass a container element to resolve tokens scoped to a ThemeProvider.
24
76
  */
25
- export function getCanvasTheme() {
77
+ export function getCanvasTheme(el = document.documentElement) {
78
+ const ramp = resolveAccentRamp(el);
79
+ const rv = (name, fb) => resolveCssVar(name, fb, el);
26
80
  return {
27
- bg: resolveCssVar('--color-bg-canvas', '#1a1a1a'),
28
- node: resolveCssVar('--color-bg-panel', '#2a2a2a'),
29
- nodeBorder: resolveCssVar('--color-accent', '#b87333'),
30
- nodeHover: resolveCssVar('--color-bg-panel-elevated', '#3a3a3a'),
31
- nodeText: resolveCssVar('--color-text-primary', '#e8e0d0'),
32
- edgeLine: resolveCssVar('--color-accent', '#b87333'),
33
- edgeFade: resolveCssVar('--color-accent-muted', '#5a4a30'),
34
- focus: resolveCssVar('--color-warning', '#d4943a'),
81
+ bg: rv('--color-bg-canvas', '#121518'),
82
+ node: rv('--color-bg-panel', '#181c20'),
83
+ nodeBorder: ramp.solid,
84
+ nodeHover: rv('--color-bg-panel-elevated', '#20252a'),
85
+ nodeText: rv('--color-text-primary', '#e7e9eb'),
86
+ edgeLine: ramp.solid,
87
+ edgeFade: ramp.alpha(0.3),
88
+ focus: rv('--color-warning', '#d8a23c'),
35
89
  severity: {
36
- critical: resolveCssVar('--color-status-error', '#c14a4a'),
37
- major: resolveCssVar('--color-warning', '#d4a04c'),
38
- minor: resolveCssVar('--color-text-tertiary', '#6b6558'),
90
+ critical: rv('--color-error', '#cf4e4e'),
91
+ major: rv('--color-warning', '#d8a23c'),
92
+ minor: rv('--color-text-tertiary', '#646b72'),
39
93
  },
40
94
  quaternion: {
41
- i: resolveCssVar('--accent-hover', '#d4892f'),
42
- j: resolveCssVar('--color-success', '#4fa8a2'),
43
- k: resolveCssVar('--color-warning', '#d4a04c'),
95
+ i: ramp.hi,
96
+ j: rv('--color-success', '#3fae9f'),
97
+ k: rv('--color-warning', '#d8a23c'),
44
98
  },
99
+ accentRamp: ramp,
45
100
  };
46
101
  }
@@ -0,0 +1,6 @@
1
+ export declare const debug: {
2
+ log: (...args: unknown[]) => void;
3
+ warn: (...args: unknown[]) => void;
4
+ error: (...args: unknown[]) => void;
5
+ };
6
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/debug.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,KAAK;mBACD,OAAO,EAAE;oBACR,OAAO,EAAE;qBACR,OAAO,EAAE;CAC3B,CAAC"}
@@ -0,0 +1,21 @@
1
+ const DEBUG = (() => {
2
+ try {
3
+ if (typeof localStorage !== 'undefined' && localStorage.getItem('ds-debug') === 'true')
4
+ return true;
5
+ const g = globalThis;
6
+ if (typeof g.process === 'object' && g.process?.env?.DS_DEBUG === 'true')
7
+ return true;
8
+ return false;
9
+ }
10
+ catch {
11
+ return false;
12
+ }
13
+ })();
14
+ export const debug = {
15
+ log: (...args) => { if (DEBUG)
16
+ console.log('[ds]', ...args); },
17
+ warn: (...args) => { if (DEBUG)
18
+ console.warn('[ds]', ...args); },
19
+ error: (...args) => { if (DEBUG)
20
+ console.error('[ds]', ...args); },
21
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,GAC9B,WAAW,CAKb;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAqC9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAqC/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WA+B9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAK7B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAS9B,CAAC"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/theme.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,GAC9B,WAAW,CAKb;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAiC9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WA+B/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WA0B9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAE7B,CAAC;AAEH;;GAEG;AAIH,eAAO,MAAM,iBAAiB,EAAE,WAE9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAO9B,CAAC"}
@@ -30,14 +30,10 @@ export const defaultDarkTheme = {
30
30
  colorFgSecondary: '#a8a08c',
31
31
  colorFgTertiary: '#6b6558',
32
32
  colorFgMuted: '#3a3630',
33
- // Accent (brass energized signal, use sparingly)
33
+ // Accent — SEED ONLY. tokens.css derives hover/active/subtle/glow/muted/faint
34
+ // from --accent-primary via color-mix; emitting derived values here would
35
+ // override and de-sync the single-seed engine (re-introducing the brass leak).
34
36
  colorAccent: '#b87333',
35
- colorAccentHover: '#d4892f',
36
- colorAccentActive: '#8a5526',
37
- colorAccentSubtle: 'rgba(184, 115, 51, 0.08)',
38
- colorAccentGlow: 'rgba(184, 115, 51, 0.28)',
39
- colorAccentMuted: 'rgba(184, 115, 51, 0.16)',
40
- colorAccentFaint: 'rgba(184, 115, 51, 0.04)',
41
37
  // Telemetry
42
38
  colorSuccess: '#4fa8a2',
43
39
  colorWarning: '#d4a04c',
@@ -66,14 +62,8 @@ export const defaultLightTheme = {
66
62
  colorFgSecondary: '#5a5a5a',
67
63
  colorFgTertiary: '#8a8a8a',
68
64
  colorFgMuted: '#a0a0a0',
69
- // Accent (brass same in both modes)
65
+ // Accent — SEED ONLY (CSS engine derives the ramp).
70
66
  colorAccent: '#b87333',
71
- colorAccentHover: '#c9894f',
72
- colorAccentActive: '#9a5f2a',
73
- colorAccentSubtle: 'rgba(184, 115, 51, 0.12)',
74
- colorAccentGlow: 'rgba(184, 115, 51, 0.2)',
75
- colorAccentMuted: 'rgba(184, 115, 51, 0.15)',
76
- colorAccentFaint: 'rgba(184, 115, 51, 0.06)',
77
67
  // Feedback
78
68
  colorSuccess: '#5a8a6e',
79
69
  colorWarning: '#b8956b',
@@ -100,13 +90,8 @@ export const controlRoomTheme = {
100
90
  colorFgSecondary: '#888888',
101
91
  colorFgTertiary: '#555555',
102
92
  colorFgMuted: '#333333',
93
+ // Accent — SEED ONLY (CSS engine derives the ramp).
103
94
  colorAccent: '#00ff41',
104
- colorAccentHover: '#33ff66',
105
- colorAccentActive: '#00cc33',
106
- colorAccentSubtle: 'rgba(0, 255, 65, 0.1)',
107
- colorAccentGlow: 'rgba(0, 255, 65, 0.3)',
108
- colorAccentMuted: 'rgba(0, 255, 65, 0.2)',
109
- colorAccentFaint: 'rgba(0, 255, 65, 0.05)',
110
95
  colorSuccess: '#00ff41',
111
96
  colorWarning: '#ff8c00',
112
97
  colorError: '#ff3131',
@@ -121,19 +106,16 @@ export const controlRoomTheme = {
121
106
  * Brass accent theme variant — warm metallic (preserved for compatibility)
122
107
  */
123
108
  export const brassAccentTheme = createTheme(defaultDarkTheme, {
124
- colorAccent: '#b87333',
125
- colorAccentHover: '#d4892f',
126
- colorAccentActive: '#8a5526',
127
- colorAccentSubtle: 'rgba(184, 115, 51, 0.08)',
109
+ colorAccent: '#b87333', // seed only — ramp derived by the CSS engine
128
110
  });
129
111
  /**
130
112
  * Copper accent theme variant — reddish metallic (preserved for compatibility)
131
113
  */
114
+ // Copper = reddish metallic, distinct from brass (#b87333 is yellow-gold).
115
+ // The CSS engine derives the ramp from this seed, so hover/active/glow
116
+ // all shift toward the red-copper character automatically.
132
117
  export const copperAccentTheme = createTheme(defaultDarkTheme, {
133
- colorAccent: '#b87333',
134
- colorAccentHover: '#c98444',
135
- colorAccentActive: '#a05f2a',
136
- colorAccentSubtle: 'rgba(184, 115, 51, 0.08)',
118
+ colorAccent: '#b85533', // seed only — reddish copper
137
119
  });
138
120
  /**
139
121
  * High contrast accessibility theme
@@ -144,7 +126,5 @@ export const highContrastTheme = createTheme(defaultDarkTheme, {
144
126
  colorFgPrimary: '#ffffff',
145
127
  colorFgSecondary: '#eeeeee',
146
128
  colorFgMuted: '#aaaaaa',
147
- colorAccent: '#ffcc00',
148
- colorAccentHover: '#ffdd33',
149
- colorAccentActive: '#e6b800',
129
+ colorAccent: '#ffcc00', // seed only — ramp derived by the CSS engine
150
130
  });
@@ -0,0 +1,76 @@
1
+ /* @kos/design-system — Ambient Layer
2
+ Opt-in decorative tokens for marketing/docs/onboarding surfaces —
3
+ NOT auto-imported (see src/index.ts). Import explicitly:
4
+ import '@stephen-netu/design-system/tokens/ambient.css';
5
+
6
+ Everything here derives from the existing single-seed accent engine
7
+ (--accent-primary → color-mix()) already defined in tokens.css. No
8
+ hardcoded hues are introduced — swapping --accent-primary re-themes
9
+ every gradient/glow defined here for free. Do not add hardcoded
10
+ parallel palettes; that reintroduces the "brass leak" anti-pattern
11
+ tokens.css's own comments warn against. */
12
+
13
+ :root {
14
+ /* --- Gradient --- */
15
+ --gradient-accent: linear-gradient(135deg, var(--accent-primary) 0%, var(--color-accent-secondary) 100%);
16
+
17
+ /* --- Ambient glow layers — low-opacity radial fields for hero/empty-state backgrounds --- */
18
+ --glow-ambient-1: color-mix(in srgb, var(--accent-primary) 7%, transparent);
19
+ --glow-ambient-2: color-mix(in srgb, var(--color-accent-secondary) 5%, transparent);
20
+ --glow-ambient-3: color-mix(in srgb, var(--accent-primary) 3%, transparent);
21
+ }
22
+
23
+ /* --- Gradient text --- */
24
+ .text-gradient-accent {
25
+ background: var(--gradient-accent);
26
+ -webkit-background-clip: text;
27
+ background-clip: text;
28
+ color: transparent;
29
+ }
30
+
31
+ /* --- Ambient background glow ---
32
+ Apply to a positioned container; renders a fixed-feel radial glow trio
33
+ behind its content. Marketing/docs surfaces only — do not use on
34
+ console/product chrome. */
35
+ .bg-ambient-glow {
36
+ position: relative;
37
+ }
38
+ .bg-ambient-glow::before {
39
+ content: '';
40
+ position: absolute;
41
+ inset: 0;
42
+ z-index: 0;
43
+ pointer-events: none;
44
+ background:
45
+ radial-gradient(900px 600px at 10% -10%, var(--glow-ambient-1), transparent 65%),
46
+ radial-gradient(700px 500px at 92% 8%, var(--glow-ambient-2), transparent 60%),
47
+ radial-gradient(1000px 800px at 50% 140%, var(--glow-ambient-3), transparent 70%);
48
+ }
49
+ .bg-ambient-glow > * {
50
+ position: relative;
51
+ z-index: 1;
52
+ }
53
+
54
+ /* --- Scroll reveal (see p0-primitives/utils/reveal.ts) ---
55
+ Marketing/docs surfaces only — never wire into console/product chrome. */
56
+ @keyframes ds-reveal-fade-up {
57
+ from { opacity: 0; transform: translateY(20px); }
58
+ to { opacity: 1; transform: translateY(0); }
59
+ }
60
+
61
+ .ds-reveal {
62
+ opacity: 0;
63
+ }
64
+
65
+ .ds-reveal.ds-reveal-in {
66
+ animation: ds-reveal-fade-up 0.7s cubic-bezier(0.16, 0.8, 0.3, 1) both;
67
+ animation-delay: var(--ds-reveal-delay, 0ms);
68
+ }
69
+
70
+ @media (prefers-reduced-motion: reduce) {
71
+ .ds-reveal,
72
+ .ds-reveal.ds-reveal-in {
73
+ opacity: 1;
74
+ animation: none;
75
+ }
76
+ }
@@ -28,14 +28,25 @@
28
28
  --color-card-text-secondary: #a8a08c;
29
29
  --color-card-text-tertiary: #6b6558;
30
30
 
31
- /* --- Accent (default: brass, user-controllable via --accent-*) --- */
31
+ /* --- Accent SINGLE-SEED ENGINE ----------------------------------------
32
+ A consumer sets ONE value, --accent-primary (the in-app accent dropdown),
33
+ and the whole accent system recomputes via color-mix. No value below is
34
+ pinned to a hue, so any user color stays coherent across light/dark.
35
+ (Was: 7 hand-picked brass values + brass rgba ramps that ignored the
36
+ user's choice — the "brass leak".) --accent-* remain consumer override
37
+ hooks (token-audit ACCENT_HOOKS); components consume --color-accent* only.
38
+
39
+ Browser support: color-mix() requires Chrome 111+, Safari 16.2+, Firefox
40
+ 113+. Fallbacks below use var(--accent-primary) directly (no hue shift),
41
+ which is acceptable on legacy browsers — the seed itself is still
42
+ controllable. */
32
43
  --accent-primary: #b87333;
33
- --accent-hover: #d4892f;
34
- --accent-active: #8a5526;
35
- --accent-glow: rgba(184, 115, 51, 0.28);
36
- --accent-muted: rgba(184, 115, 51, 0.16);
37
- --accent-subtle: rgba(184, 115, 51, 0.08);
38
- --accent-faint: rgba(184, 115, 51, 0.04);
44
+ --accent-hover: var(--accent-primary);
45
+ --accent-active: var(--accent-primary);
46
+ --accent-glow: var(--accent-primary);
47
+ --accent-muted: var(--accent-primary);
48
+ --accent-subtle: var(--accent-primary);
49
+ --accent-faint: var(--accent-primary);
39
50
  --color-accent: var(--accent-primary);
40
51
  --color-accent-hover: var(--accent-hover);
41
52
  --color-accent-active: var(--accent-active);
@@ -43,9 +54,43 @@
43
54
  --color-accent-muted: var(--accent-muted);
44
55
  --color-accent-subtle: var(--accent-subtle);
45
56
  --color-accent-faint: var(--accent-faint);
46
- --color-accent-secondary: #d4a574; /* Companion warm tone (n4 kind colors) */
57
+ --color-accent-secondary: var(--accent-primary);
58
+ }
59
+
60
+ @supports (color-mix(in srgb, red, transparent)) {
61
+ :root {
62
+ --accent-hover: color-mix(in oklab, var(--accent-primary), #fff 16%);
63
+ --accent-active: color-mix(in oklab, var(--accent-primary), #000 22%);
64
+ --accent-glow: color-mix(in srgb, var(--accent-primary) 28%, transparent);
65
+ --accent-muted: color-mix(in srgb, var(--accent-primary) 16%, transparent);
66
+ --accent-subtle: color-mix(in srgb, var(--accent-primary) 8%, transparent);
67
+ --accent-faint: color-mix(in srgb, var(--accent-primary) 4%, transparent);
68
+ --color-accent-hover: var(--accent-hover);
69
+ --color-accent-active: var(--accent-active);
70
+ --color-accent-glow: var(--accent-glow);
71
+ --color-accent-muted: var(--accent-muted);
72
+ --color-accent-subtle: var(--accent-subtle);
73
+ --color-accent-faint: var(--accent-faint);
74
+ --color-accent-secondary: color-mix(in oklab, var(--accent-primary), #fff 26%);
75
+ --overlay-accent-06: color-mix(in srgb, var(--accent-primary) 6%, transparent);
76
+ --overlay-accent-08: color-mix(in srgb, var(--accent-primary) 8%, transparent);
77
+ --overlay-accent-12: color-mix(in srgb, var(--accent-primary) 12%, transparent);
78
+ --overlay-accent-18: color-mix(in srgb, var(--accent-primary) 18%, transparent);
79
+ --overlay-accent-30: color-mix(in srgb, var(--accent-primary) 30%, transparent);
80
+ --overlay-accent-45: color-mix(in srgb, var(--accent-primary) 45%, transparent);
81
+ --overlay-accent-50: color-mix(in srgb, var(--accent-primary) 50%, transparent);
82
+ --overlay-accent-55: color-mix(in srgb, var(--accent-primary) 55%, transparent);
83
+ --grid-line: color-mix(in srgb, var(--accent-primary) 3%, transparent);
84
+ --grid-dot: color-mix(in srgb, var(--accent-primary) 6%, transparent);
85
+ --grid-major: color-mix(in srgb, var(--accent-primary) 10%, transparent);
86
+ --shadow-glow: 0 0 12px color-mix(in srgb, var(--accent-primary) 15%, transparent);
87
+ --shadow-glow-lg: 0 0 24px color-mix(in srgb, var(--accent-primary) 25%, transparent);
88
+ --shadow-accent-glow: 0 0 16px color-mix(in srgb, var(--accent-primary) 15%, transparent), 0 0 32px color-mix(in srgb, var(--accent-primary) 5%, transparent);
89
+ }
90
+ }
47
91
 
48
- /* Overlay levels — white opacity ramps for borders, backgrounds, hover states */
92
+ :root {
93
+ /* --- Overlay levels — white opacity ramps for borders, backgrounds, hover states */
49
94
  --overlay-white-02: rgba(255, 255, 255, 0.02);
50
95
  --overlay-white-03: rgba(255, 255, 255, 0.03);
51
96
  --overlay-white-04: rgba(255, 255, 255, 0.04);
@@ -57,15 +102,16 @@
57
102
  --overlay-white-22: rgba(255, 255, 255, 0.22);
58
103
  --overlay-white-25: rgba(255, 255, 255, 0.25);
59
104
 
60
- /* Overlay levels — accent color opacity ramps */
61
- --overlay-accent-06: rgba(184, 115, 51, 0.06);
62
- --overlay-accent-08: rgba(184, 115, 51, 0.08);
63
- --overlay-accent-12: rgba(184, 115, 51, 0.12);
64
- --overlay-accent-18: rgba(184, 115, 51, 0.18);
65
- --overlay-accent-30: rgba(184, 115, 51, 0.30);
66
- --overlay-accent-45: rgba(184, 115, 51, 0.45);
67
- --overlay-accent-50: rgba(184, 115, 51, 0.50);
68
- --overlay-accent-55: rgba(184, 115, 51, 0.55);
105
+ /* Overlay levels — accent color opacity ramps
106
+ (fallback: transparent for browsers without color-mix) */
107
+ --overlay-accent-06: transparent;
108
+ --overlay-accent-08: transparent;
109
+ --overlay-accent-12: transparent;
110
+ --overlay-accent-18: transparent;
111
+ --overlay-accent-30: transparent;
112
+ --overlay-accent-45: transparent;
113
+ --overlay-accent-50: transparent;
114
+ --overlay-accent-55: transparent;
69
115
 
70
116
  /* Overlay levels — status color opacity ramps */
71
117
  --overlay-success-06: rgba(79, 168, 162, 0.06);
@@ -128,7 +174,7 @@
128
174
  --border-subtle: rgba(255, 255, 255, 0.06);
129
175
  --border-default: #3a3630;
130
176
  --border-hover: #6b6558;
131
- --border-focus: #b87333;
177
+ --border-focus: var(--accent-primary);
132
178
  --border-alert: #c14a4a;
133
179
  --border-warning: #d4a04c;
134
180
  --divider-color: #181c20;
@@ -138,10 +184,10 @@
138
184
  --color-border-subtle: var(--border-subtle);
139
185
  --color-border-default: var(--border-default);
140
186
 
141
- /* --- Grid (canvas patterns) --- */
142
- --grid-line: rgba(184, 115, 51, 0.03);
143
- --grid-dot: rgba(184, 115, 51, 0.06);
144
- --grid-major: rgba(184, 115, 51, 0.1);
187
+ /* --- Grid (canvas patterns) --- */
188
+ --grid-line: transparent;
189
+ --grid-dot: transparent;
190
+ --grid-major: transparent;
145
191
 
146
192
  /* --- Typography --- */
147
193
  --font-sans: 'Outfit', system-ui, -apple-system, sans-serif;
@@ -158,6 +204,17 @@
158
204
  --text-3xl: 1.875rem;
159
205
  --text-4xl: 2.25rem;
160
206
 
207
+ /* --- Font weight (fixes phantom --font-weight-* referenced by g0 Text.svelte) --- */
208
+ --font-weight-normal: 400;
209
+ --font-weight-medium: 500;
210
+ --font-weight-semibold: 600;
211
+ --font-weight-bold: 700;
212
+
213
+ /* --- Line height (fixes phantom --line-height-* referenced by g0 Text.svelte) --- */
214
+ --line-height-tight: 1.2;
215
+ --line-height-normal: 1.5;
216
+ --line-height-relaxed: 1.7;
217
+
161
218
  /* --- Spacing --- */
162
219
  --space-05: 0.125rem;
163
220
  --space-1: 0.25rem;
@@ -194,12 +251,12 @@
194
251
  --shadow-md: none;
195
252
  --shadow-lg: none;
196
253
  --shadow-xl: none;
197
- --shadow-glow: 0 0 12px rgba(184, 115, 51, 0.15);
198
- --shadow-glow-lg: 0 0 24px rgba(184, 115, 51, 0.25);
199
- --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.4);
200
- --shadow-card: none;
201
- --shadow-card-hover: none;
202
- --shadow-accent-glow: 0 0 16px rgba(184, 115, 51, 0.15), 0 0 32px rgba(184, 115, 51, 0.05);
254
+ --shadow-glow: 0 0 12px rgba(0, 0, 0, 0.4);
255
+ --shadow-glow-lg: 0 0 24px rgba(0, 0, 0, 0.4);
256
+ --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.4);
257
+ --shadow-card: none;
258
+ --shadow-card-hover: none;
259
+ --shadow-accent-glow: 0 0 16px rgba(0, 0, 0, 0.4), 0 0 32px rgba(0, 0, 0, 0.4);
203
260
 
204
261
  /* --- Transitions --- */
205
262
  --transition-fast: 120ms ease;
@@ -255,4 +312,42 @@
255
312
  --z-tooltip: 1070;
256
313
  --z-toast: 1080;
257
314
  --z-glass-box: 9000;
315
+
316
+ /* --- Density (system default = COMPACT) ----------------------------------
317
+ A first-class density tier. Surfaces opt into a calibration with
318
+ [data-density]: comfortable (reading/writing — editor, prose, forms),
319
+ compact (default, general UI), cockpit (monitoring/data-dense — dashboards,
320
+ logs, registries, manifold panels). Same components, three calibrations.
321
+ Components consume these --ui-* tokens for sizing/type instead of raw px.
322
+ Cockpit sits at the legibility floors: data 10px, label 9px, row/target
323
+ 20px, pad 3px, leading 1.22 (note: 20px trips WCAG 2.5.8's 24px pref, so
324
+ cockpit is opt-in, never the global default). */
325
+ --ui-control-h: 24px; /* button / input / select height */
326
+ --ui-row-h: 24px; /* table / list row height (pointer target) */
327
+ --ui-pad-x: 8px;
328
+ --ui-pad-y: 5px;
329
+ --ui-gap: 1px; /* hairline grid gap — the ruled spine */
330
+ --ui-font: 13px; /* body / control text */
331
+ --ui-font-sm: 12px;
332
+ --ui-data: 11px; /* monospace data / table cells */
333
+ --ui-label: 10px; /* uppercase micro-labels */
334
+ --ui-leading: 1.35;
335
+ --ui-icon: 14px;
336
+ }
337
+
338
+ /* Density calibrations — set [data-density] on any container or surface. */
339
+ [data-density="comfortable"] {
340
+ --ui-control-h: 30px; --ui-row-h: 30px; --ui-pad-x: 12px; --ui-pad-y: 8px;
341
+ --ui-gap: 1px; --ui-font: 14px; --ui-font-sm: 13px; --ui-data: 13px;
342
+ --ui-label: 11px; --ui-leading: 1.45; --ui-icon: 16px;
343
+ }
344
+ [data-density="compact"] {
345
+ --ui-control-h: 24px; --ui-row-h: 24px; --ui-pad-x: 8px; --ui-pad-y: 5px;
346
+ --ui-gap: 1px; --ui-font: 13px; --ui-font-sm: 12px; --ui-data: 11px;
347
+ --ui-label: 10px; --ui-leading: 1.35; --ui-icon: 14px;
348
+ }
349
+ [data-density="cockpit"] {
350
+ --ui-control-h: 20px; --ui-row-h: 20px; --ui-pad-x: 6px; --ui-pad-y: 3px;
351
+ --ui-gap: 1px; --ui-font: 12px; --ui-font-sm: 11px; --ui-data: 10px;
352
+ --ui-label: 9px; --ui-leading: 1.22; --ui-icon: 13px;
258
353
  }
@@ -1,3 +1,5 @@
1
+ export { reveal } from './reveal';
2
+ export type { RevealOptions } from './reveal';
1
3
  /**
2
4
  * Class name merger - combines class names, filtering out falsy values
3
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/p0-primitives/utils/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAMlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CASlC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/p0-primitives/utils/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C;;GAEG;AACH,wBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAMlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAChE,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CASlC"}
@@ -1,4 +1,5 @@
1
1
  // Utility functions for the design system
2
+ export { reveal } from './reveal';
2
3
  /**
3
4
  * Class name merger - combines class names, filtering out falsy values
4
5
  */
@@ -0,0 +1,15 @@
1
+ import type { Action } from 'svelte/action';
2
+ /**
3
+ * Scroll-reveal action for marketing/docs surfaces — never wire into
4
+ * console/product chrome (see ambient.css usage note). Adds `ds-reveal`
5
+ * on mount and `ds-reveal-in` once the node crosses `threshold`; pass
6
+ * `delayMs` to stagger a group of siblings. Respects
7
+ * prefers-reduced-motion by revealing immediately with no observer.
8
+ */
9
+ export interface RevealOptions {
10
+ delayMs?: number;
11
+ threshold?: number;
12
+ once?: boolean;
13
+ }
14
+ export declare const reveal: Action<HTMLElement, RevealOptions | undefined>;
15
+ //# sourceMappingURL=reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reveal.d.ts","sourceRoot":"","sources":["../../../src/p0-primitives/utils/reveal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAmCjE,CAAC"}
@@ -0,0 +1,29 @@
1
+ export const reveal = (node, options = {}) => {
2
+ const { delayMs = 0, threshold = 0.12, once = true } = options;
3
+ if (delayMs) {
4
+ node.style.setProperty('--ds-reveal-delay', `${delayMs}ms`);
5
+ }
6
+ if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
7
+ node.classList.add('ds-reveal-in');
8
+ return {};
9
+ }
10
+ node.classList.add('ds-reveal');
11
+ const observer = new IntersectionObserver((entries) => {
12
+ for (const entry of entries) {
13
+ if (entry.isIntersecting) {
14
+ node.classList.add('ds-reveal-in');
15
+ if (once)
16
+ observer.unobserve(entry.target);
17
+ }
18
+ else if (!once) {
19
+ node.classList.remove('ds-reveal-in');
20
+ }
21
+ }
22
+ }, { threshold });
23
+ observer.observe(node);
24
+ return {
25
+ destroy() {
26
+ observer.disconnect();
27
+ }
28
+ };
29
+ };