@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
@@ -0,0 +1,160 @@
1
+ // N1 Pipeline Adapter — maps PipelineState → GraphSnapshot for FlowCanvas
2
+ // READ-ONLY consumer of ~/.kos/pipeline/<run-id>/pipeline-state.json
3
+ // S-02: deterministic ordering — all collections Array/Map
4
+ // ── Token budgets (mirrors driver.rs) ────────────────────────────────────────
5
+ const STAGE_TOKEN_BUDGETS = {
6
+ intake: 10_000,
7
+ research: 40_000,
8
+ implement: 120_000,
9
+ review: 40_000,
10
+ integrate: 10_000,
11
+ };
12
+ function formatTokens(t) {
13
+ if (t >= 1_000_000)
14
+ return `${(t / 1_000_000).toFixed(1)}M`;
15
+ if (t >= 1_000)
16
+ return `${(t / 1_000).toFixed(0)}K`;
17
+ return `${t}`;
18
+ }
19
+ // ── Status color mapping ─────────────────────────────────────────────────────
20
+ const STAGE_COLORS = {
21
+ Pending: '#646b72',
22
+ Running: '#3fae9f',
23
+ Passed: '#3fae9f',
24
+ Failed: '#cf4e4e',
25
+ Skipped: '#4a4f55',
26
+ Crashed: '#cf4e4e',
27
+ };
28
+ function statusIcon(status) {
29
+ switch (status) {
30
+ case 'Pending': return '○';
31
+ case 'Running': return '●';
32
+ case 'Passed': return '✓';
33
+ case 'Failed': return '✗';
34
+ case 'Skipped': return '−';
35
+ case 'Crashed': return '💀';
36
+ }
37
+ }
38
+ // ── Adapter ──────────────────────────────────────────────────────────────────
39
+ export const PIPELINE_STAGE_NAMES = ['intake', 'research', 'implement', 'review', 'integrate'];
40
+ export function pipelineStateToSnapshot(state) {
41
+ const nodes = [];
42
+ const edges = [];
43
+ const stageOrder = PIPELINE_STAGE_NAMES;
44
+ const stageMap = new Map();
45
+ for (const s of state.stages)
46
+ stageMap.set(s.name, s);
47
+ let prevName = null;
48
+ for (const name of stageOrder) {
49
+ const stage = stageMap.get(name);
50
+ const status = stage?.status ?? 'Pending';
51
+ const color = STAGE_COLORS[status];
52
+ const icon = statusIcon(status);
53
+ // Build label with status icon, name, attempt badge, token budget
54
+ let label = `${icon} ${name}`;
55
+ if (stage && stage.attempt > 1) {
56
+ label += ` #${stage.attempt}`;
57
+ }
58
+ // Collect badge-like data into node.data for FlowCanvas rendering
59
+ const data = {
60
+ status,
61
+ color,
62
+ icon,
63
+ pipelineStatus: status,
64
+ };
65
+ if (stage) {
66
+ data.attempt = stage.attempt;
67
+ if (stage.selected_model)
68
+ data.model = stage.selected_model;
69
+ data.budget = formatTokens(STAGE_TOKEN_BUDGETS[name] ?? 0);
70
+ if (stage.error)
71
+ data.error = stage.error;
72
+ if (stage.started_at)
73
+ data.started_at = stage.started_at;
74
+ if (stage.completed_at)
75
+ data.completed_at = stage.completed_at;
76
+ if (stage.termination) {
77
+ data.termination = stage.termination.reason;
78
+ data.final_tokens = stage.termination.final_tokens;
79
+ }
80
+ }
81
+ nodes.push({ id: name, label, data });
82
+ // Sequential handoff edge: prev → current
83
+ if (prevName) {
84
+ edges.push({
85
+ id: `${prevName}->${name}`,
86
+ sourceId: prevName,
87
+ targetId: name,
88
+ label: 'handoff',
89
+ });
90
+ }
91
+ prevName = name;
92
+ }
93
+ // Back-edge for active remediation: review → implement
94
+ if (state.remediation_count > 0 && state.remediation_count < state.max_remediation) {
95
+ const reviewStage = stageMap.get('review');
96
+ if (reviewStage && reviewStage.status === 'Failed') {
97
+ edges.push({
98
+ id: 'review->implement:remediate',
99
+ sourceId: 'review',
100
+ targetId: 'implement',
101
+ label: 'remediate',
102
+ });
103
+ }
104
+ }
105
+ // Queue tail node (D14) — shows pending queue depth if available
106
+ // For now, show remediation count as queue indicator
107
+ if (state.remediation_count > 0) {
108
+ nodes.push({
109
+ id: 'remediation',
110
+ label: `↻ x${state.remediation_count}`,
111
+ data: { status: 'remediation', count: state.remediation_count },
112
+ });
113
+ edges.push({
114
+ id: 'review->remediation',
115
+ sourceId: 'review',
116
+ targetId: 'remediation',
117
+ label: 'remediate',
118
+ });
119
+ edges.push({
120
+ id: 'remediation->implement',
121
+ sourceId: 'remediation',
122
+ targetId: 'implement',
123
+ label: 're-enter',
124
+ });
125
+ }
126
+ return {
127
+ nodes,
128
+ edges,
129
+ focusNodeId: findFocusNode(stageMap),
130
+ };
131
+ }
132
+ function findFocusNode(stageMap) {
133
+ for (const name of PIPELINE_STAGE_NAMES) {
134
+ const stage = stageMap.get(name);
135
+ if (stage && stage.status === 'Running')
136
+ return name;
137
+ }
138
+ for (const name of PIPELINE_STAGE_NAMES) {
139
+ const stage = stageMap.get(name);
140
+ if (stage && stage.status === 'Pending')
141
+ return name;
142
+ }
143
+ return PIPELINE_STAGE_NAMES[0] ?? null;
144
+ }
145
+ export function createEmptyPipelineSnapshot() {
146
+ return {
147
+ nodes: PIPELINE_STAGE_NAMES.map((name, i) => ({
148
+ id: name,
149
+ label: `○ ${name}`,
150
+ data: { status: 'Pending', pipelineStatus: 'Pending' },
151
+ })),
152
+ edges: PIPELINE_STAGE_NAMES.slice(0, -1).map((name, i) => ({
153
+ id: `${name}->${PIPELINE_STAGE_NAMES[i + 1]}`,
154
+ sourceId: name,
155
+ targetId: PIPELINE_STAGE_NAMES[i + 1],
156
+ label: 'handoff',
157
+ })),
158
+ focusNodeId: PIPELINE_STAGE_NAMES[0],
159
+ };
160
+ }
@@ -14,6 +14,7 @@
14
14
  import { GraphState } from '../n1-flow-canvas/graph-state.svelte.js';
15
15
  import { EDGE_REVEAL_STAGGER_MS } from '../n1-flow-canvas/types.js';
16
16
  import { projectToDisk, quaternionToDisk } from './poincare.js';
17
+ import { resolveAccentRamp } from '../p0-primitives/canvas-theme.js';
17
18
 
18
19
  // ── Props ────────────────────────────────────────────────────────────────────
19
20
 
@@ -98,48 +99,74 @@
98
99
  }
99
100
  });
100
101
 
101
- // ── Design tokens ──────────────────────────────────────────────────────────
102
-
103
- const COLORS = {
104
- bg: '#1a1a1a',
105
- diskBg: '#111111',
106
- diskBorder: '#3a3020',
107
- node: '#2a2a2a',
108
- nodeBorder: '#b87333',
109
- nodeText: '#e8e0d0',
110
- edgeLine: '#b87333',
111
- edgeFade: '#5a4a30',
112
- focus: '#d4943a',
113
- grid: '#1e1e1e',
114
- selected: '#d4943a',
115
- };
116
-
117
- // Column-based node fill colors — matches KOS brass/copper theme.
118
- // Semi-transparent fills let the dark disk background show through.
119
- const COLUMN_FILL: Record<string, string> = {
120
- GO: 'rgba(184, 115, 51, 0.35)', // brass — active
121
- CONSULT: 'rgba(184, 115, 51, 0.18)', // brass outline advisory
122
- WEED: 'rgba(200, 160, 50, 0.22)', // warning amber
123
- SPROUT: 'rgba(70, 130, 200, 0.20)', // info blue — growing
124
- FREEZE: 'rgba(80, 110, 180, 0.16)', // cool blue — frozen
125
- SEED: 'rgba(42, 42, 42, 0.60)', // muted — backlog
126
- };
127
-
128
- const COLUMN_BORDER: Record<string, string> = {
129
- GO: '#b87333',
130
- CONSULT: 'rgba(184, 115, 51, 0.6)',
131
- WEED: '#c8a032',
132
- SPROUT: '#4682c8',
133
- FREEZE: '#506eb4',
134
- SEED: '#3a3a3a',
135
- };
102
+ // ── Design tokens — resolved at runtime from CSS custom properties ─────────
103
+ // resolveAccentRamp() reads --accent-primary so any user accent propagates
104
+ // into canvas paint calls without hardcoding a hue.
105
+
106
+ function resolveColors(el: Element) {
107
+ const cs = getComputedStyle(el);
108
+ const rv = (p: string, fb: string) => cs.getPropertyValue(p).trim() || fb;
109
+ const acc = resolveAccentRamp(el);
110
+ return {
111
+ bg: rv('--color-bg-canvas', '#121518'),
112
+ diskBg: rv('--color-bg-app', '#0a0b0c'),
113
+ diskBorder: rv('--border-default', '#262b30'),
114
+ node: rv('--color-bg-panel', '#181c20'),
115
+ nodeBorder: acc.solid,
116
+ nodeText: rv('--color-text-primary', '#e7e9eb'),
117
+ edgeLine: acc.solid,
118
+ edgeFade: acc.alpha(0.3),
119
+ focus: rv('--color-warning', '#d8a23c'),
120
+ grid: rv('--color-bg-panel', '#181c20'),
121
+ selected: acc.hi,
122
+ // column fills accent for active states, fixed semantic for others
123
+ colFill: {
124
+ GO: acc.alpha(0.35),
125
+ CONSULT: acc.alpha(0.18),
126
+ WEED: 'rgba(200, 160, 50, 0.22)',
127
+ SPROUT: 'rgba(70, 130, 200, 0.20)',
128
+ FREEZE: 'rgba(80, 110, 180, 0.16)',
129
+ SEED: 'rgba(42, 42, 42, 0.60)',
130
+ } as Record<string, string>,
131
+ colBorder: {
132
+ GO: acc.solid,
133
+ CONSULT: acc.alpha(0.6),
134
+ WEED: '#c8a032',
135
+ SPROUT: '#4682c8',
136
+ FREEZE: '#506eb4',
137
+ SEED: '#3a3a3a',
138
+ } as Record<string, string>,
139
+ };
140
+ }
141
+
142
+ // Resolved lazily in onMount / on theme change.
143
+ let COLORS = $state<ReturnType<typeof resolveColors> | null>(null);
144
+ // Shims so existing draw code using COLUMN_FILL/COLUMN_BORDER still compiles.
145
+ let COLUMN_FILL: Record<string, string> = {};
146
+ let COLUMN_BORDER: Record<string, string> = {};
136
147
 
137
148
  const NODE_RADIUS = 4;
138
149
  const FONT = '11px var(--font-mono, monospace)';
139
150
 
151
+ // Resolve colors on mount and whenever --accent-primary might change.
152
+ // Using document.documentElement so the accent reflects the ThemeProvider seed.
153
+ $effect(() => {
154
+ function resolve() {
155
+ const c = resolveColors(document.documentElement);
156
+ COLORS = c;
157
+ COLUMN_FILL = c.colFill;
158
+ COLUMN_BORDER = c.colBorder;
159
+ }
160
+ resolve();
161
+ // Re-resolve if ThemeProvider emits a CSS variable change event (optional).
162
+ document.documentElement.addEventListener('kos-theme-change', resolve);
163
+ return () => document.documentElement.removeEventListener('kos-theme-change', resolve);
164
+ });
165
+
140
166
  // ── Render ──────────────────────────────────────────────────────────────────
141
167
 
142
168
  function render({ context }: { context: CanvasRenderingContext2D }) {
169
+ if (!COLORS) return; // not yet resolved after mount
143
170
  const r = diskRadius;
144
171
  const cx = diskCx, cy = diskCy;
145
172
 
@@ -1 +1 @@
1
- {"version":3,"file":"ManifoldDisk.svelte.d.ts","sourceRoot":"","sources":["../../src/n2-manifold-disk/ManifoldDisk.svelte.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAOnE,2FAA2F;AAC3F,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC;AA6SH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ManifoldDisk.svelte.d.ts","sourceRoot":"","sources":["../../src/n2-manifold-disk/ManifoldDisk.svelte.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAQnE,2FAA2F;AAC3F,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,KAAK;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;CAChC;AAwUH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -22,7 +22,7 @@
22
22
  } from './types.js';
23
23
  import { DEFAULT_LAYOUT_PREFERENCES } from './types.js';
24
24
  import { resolvePhaseTheme, DEFAULT_PHASE_THEME } from './phase-theme.js';
25
- import { getCanvasTheme } from '../p0-primitives/canvas-theme';
25
+ import { getCanvasTheme, resolveAccentRamp } from '../p0-primitives/canvas-theme';
26
26
  import { LayoutOrchestrator } from './orchestrator.js';
27
27
  import { ManifoldProvider } from './providers/manifold-provider.js';
28
28
  import { GravitationalProvider } from './providers/gravitational-provider.js';
@@ -104,6 +104,7 @@
104
104
  edgeActive: getCanvasTheme().nodeBorder,
105
105
  pulseColor: getCanvasTheme().nodeBorder,
106
106
  pulseCritical: '#c0392b',
107
+ accentRamp: resolveAccentRamp(),
107
108
  });
108
109
 
109
110
  function resolveTokens(): void {
@@ -113,18 +114,21 @@
113
114
  const get = (prop: string, fallback: string) => cs.getPropertyValue(prop).trim() || fallback;
114
115
  colors = {
115
116
  canvasBg: get('--n4-canvas-bg', '#1a1a1a'),
116
- nodeActive: get('--n4-node-border-selected', '#b87333'),
117
+ nodeActive: get('--n4-node-border-selected', '#888'),
117
118
  nodeIdle: get('--n4-node-text-muted', '#a09880'),
118
119
  nodeBlocked: get('--color-status-warning', '#f39c12'),
119
120
  nodeCompleted: get('--n4-node-text-muted', '#a09880'),
120
121
  nodeCritical: get('--color-status-error', '#c0392b'),
121
122
  nodeBg: get('--n4-node-bg', '#222'),
122
- nodeBorder: get('--n4-node-border', 'rgba(184, 115, 51, 0.15)'),
123
- nodeText: get('--n4-node-text', '#e8e0d0'),
124
- edgeColor: get('--n4-edge-color', 'rgba(184, 115, 51, 0.25)'),
125
- edgeActive: get('--n4-edge-color-active', '#b87333'),
126
- pulseColor: get('--color-accent', '#b87333'),
123
+ nodeBorder: get('--n4-node-border', 'rgba(128,128,128,0.15)'),
124
+ nodeText: get('--n4-node-text', '#e7e9eb'),
125
+ edgeColor: get('--n4-edge-color', 'rgba(128,128,128,0.25)'),
126
+ edgeActive: get('--n4-edge-color-active', '#888'),
127
+ pulseColor: get('--color-accent', '#888'),
127
128
  pulseCritical: get('--color-status-error', '#c0392b'),
129
+ // accentRamp: resolve --accent-primary directly so inline canvas paint
130
+ // calls respond to the user's chosen accent without reading n4-token CSS.
131
+ accentRamp: resolveAccentRamp(containerEl),
128
132
  };
129
133
  phaseTheme = resolvePhaseTheme(containerEl);
130
134
  }
@@ -618,7 +622,7 @@
618
622
  const GRID = 22;
619
623
  const gridStartX = Math.floor(worldLeft / GRID) * GRID;
620
624
  const gridStartY = Math.floor(worldTop / GRID) * GRID;
621
- context.fillStyle = 'rgba(184, 115, 51, 0.055)';
625
+ context.fillStyle = colors.accentRamp.alpha(0.055);
622
626
  for (let gx = gridStartX; gx < worldRight; gx += GRID) {
623
627
  for (let gy = gridStartY; gy < worldBottom; gy += GRID) {
624
628
  context.beginPath();
@@ -682,8 +686,8 @@
682
686
  const edgeStrength = (edge.metadata as Record<string, unknown>)?.strength as number | undefined ?? 0.5;
683
687
  context.save();
684
688
  context.strokeStyle = progress >= 1.0
685
- ? `rgba(184, 115, 51, ${0.45 + edgeStrength * 0.35})`
686
- : 'rgba(184, 115, 51, 0.30)';
689
+ ? colors.accentRamp.alpha(0.45 + edgeStrength * 0.35)
690
+ : colors.accentRamp.alpha(0.30);
687
691
  context.lineWidth = 1.5;
688
692
  // Permanently dashed when fully revealed — individual lines are traceable in dense graphs.
689
693
  // During reveal animation keep a solid growing stroke, then settle to dashes.
@@ -705,7 +709,7 @@
705
709
  const FLAG_R = 3;
706
710
 
707
711
  const PRIORITY_COLORS: Record<string, string> = {
708
- p0: '#c0392b', p1: '#b87333', p2: '#c8a84b', p3: '#4a4438',
712
+ p0: '#c0392b', p1: colors.accentRamp.solid, p2: '#c8a84b', p3: '#4a4438',
709
713
  };
710
714
 
711
715
  // ── Node rendering: LOD-aware ─────────────────────────────────────────────
@@ -728,7 +732,7 @@
728
732
  // ── Signals: always a small dot ─────────────────────────────────────
729
733
  if (node.kind === 'signal') {
730
734
  const sr = lodTier === 'overview' ? 3 : 5;
731
- context.shadowColor = 'rgba(184, 115, 51, 0.4)';
735
+ context.shadowColor = colors.accentRamp.alpha(0.4);
732
736
  context.shadowBlur = isSelected ? 10 : 4;
733
737
  context.beginPath();
734
738
  context.arc(ncx, ncy, sr, 0, Math.PI * 2);
@@ -761,14 +765,14 @@
761
765
  context.beginPath();
762
766
  context.moveTo(ncx, ncy);
763
767
  context.lineTo(ncx - Math.cos(angle) * tailLen, ncy - Math.sin(angle) * tailLen);
764
- context.strokeStyle = `rgba(184, 115, 51, 0.5)`;
768
+ context.strokeStyle = colors.accentRamp.alpha(0.5);
765
769
  context.lineWidth = 2;
766
770
  context.stroke();
767
771
  }
768
772
 
769
773
  context.beginPath();
770
774
  context.arc(ncx, ncy, r, 0, Math.PI * 2);
771
- context.fillStyle = isActiveLoop ? 'rgba(184, 115, 51, 0.9)' : 'rgba(184, 115, 51, 0.4)';
775
+ context.fillStyle = isActiveLoop ? colors.accentRamp.alpha(0.9) : colors.accentRamp.alpha(0.4);
772
776
  context.fill();
773
777
  if (isSelected) {
774
778
  context.strokeStyle = colors.nodeActive;
@@ -993,7 +997,7 @@
993
997
  beginShape(context, 'hexagon',
994
998
  ncx - HEX_IND_W / 2 - P, ncy - HEX_IND_H / 2 - P,
995
999
  HEX_IND_W + 2 * P, HEX_IND_H + 2 * P);
996
- context.strokeStyle = `rgba(184, 115, 51, ${alpha})`;
1000
+ context.strokeStyle = colors.accentRamp.alpha(alpha);
997
1001
  context.lineWidth = 2;
998
1002
  context.stroke();
999
1003
  break;
@@ -1007,7 +1011,7 @@
1007
1011
  context.beginPath();
1008
1012
  context.moveTo(ncx, ncy);
1009
1013
  context.lineTo(tx, ty);
1010
- context.strokeStyle = `rgba(184, 115, 51, ${0.6 * phaseIntensity})`;
1014
+ context.strokeStyle = colors.accentRamp.alpha(0.6 * phaseIntensity);
1011
1015
  context.lineWidth = 1;
1012
1016
  context.setLineDash([4, 4]);
1013
1017
  context.stroke();
@@ -1044,7 +1048,7 @@
1044
1048
  }
1045
1049
  context.beginPath();
1046
1050
  context.arc(px, py, particleR, 0, Math.PI * 2);
1047
- context.fillStyle = `rgba(184, 115, 51, ${alpha})`;
1051
+ context.fillStyle = colors.accentRamp.alpha(alpha);
1048
1052
  context.fill();
1049
1053
  }
1050
1054
  break;
@@ -1071,7 +1075,7 @@
1071
1075
  // Claimed: solid brass outline
1072
1076
  context.beginPath();
1073
1077
  context.roundRect(px - 3, py - 3, TASK_W + 6, TASK_H + 6, 6);
1074
- context.strokeStyle = `rgba(184, 115, 51, ${0.6 * phaseIntensity})`;
1078
+ context.strokeStyle = colors.accentRamp.alpha(0.6 * phaseIntensity);
1075
1079
  context.lineWidth = 2;
1076
1080
  context.stroke();
1077
1081
  } else if (node.status === 'idle') {
@@ -1080,7 +1084,7 @@
1080
1084
  const alpha = phaseIntensity * (0.1 + 0.2 * Math.sin(pulsePhase * Math.PI * 2));
1081
1085
  context.beginPath();
1082
1086
  context.roundRect(px - 2, py - 2, TASK_W + 4, TASK_H + 4, 5);
1083
- context.strokeStyle = `rgba(184, 115, 51, ${alpha})`;
1087
+ context.strokeStyle = colors.accentRamp.alpha(alpha);
1084
1088
  context.lineWidth = 1.5;
1085
1089
  context.stroke();
1086
1090
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AdaptiveManifold.svelte.d.ts","sourceRoot":"","sources":["../../src/n4-adaptive-manifold/AdaptiveManifold.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACR,gBAAgB,EAEhB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAGjB,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAapB,UAAU,KAAK;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmkCH,QAAA,MAAM,gBAAgB;;;;;MAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"AdaptiveManifold.svelte.d.ts","sourceRoot":"","sources":["../../src/n4-adaptive-manifold/AdaptiveManifold.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACR,gBAAgB,EAEhB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EAGjB,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAapB,UAAU,KAAK;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC1D,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC/C,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAukCH,QAAA,MAAM,gBAAgB;;;;;MAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { NodeLayout, LayoutResult } from '../n1-flow-canvas/types.js';
2
+ import type { AccentRamp } from '../p0-primitives/canvas-theme.js';
2
3
  /** The active layout algorithm. Gravitational is the only registered provider. */
3
4
  export type LayoutAlgorithm = 'gravitational' | 'manifold';
4
5
  /** Visual treatment for nodes — maps to --n4-node-* design tokens. */
@@ -161,6 +162,8 @@ export interface ResolvedThemeColors {
161
162
  edgeActive: string;
162
163
  pulseColor: string;
163
164
  pulseCritical: string;
165
+ /** Runtime-derived accent ramp for inline canvas 2D paint calls. */
166
+ accentRamp: AccentRamp;
164
167
  }
165
168
  /** Inferred phase in the perceive-think-act-sync loop */
166
169
  export type LoopPhase = 'perceive' | 'think' | 'act' | 'sync' | 'idle';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/n4-adaptive-manifold/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/n4-adaptive-manifold/types.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,11 @@
33
33
  colorFgTertiary?: string;
34
34
 
35
35
  colorAccent?: string;
36
+ /** @deprecated Accent ramp fields ignored by ThemeProvider — the ramp is
37
+ * derived from `colorAccent` via tokens.css color-mix. Palette fields
38
+ * (Amber, Copper, Rust, Sage, Gold) below are still emitted directly as
39
+ * --color-accent-* custom properties for source compatibility. Set only
40
+ * `colorAccent` for the primary accent. */
36
41
  colorAccentHover?: string;
37
42
  colorAccentActive?: string;
38
43
  colorAccentSubtle?: string;
@@ -121,13 +126,29 @@
121
126
  if (t.colorFgInverse) vars.push(`--color-fg-inverse: ${t.colorFgInverse};`);
122
127
  if (t.colorFgTertiary) vars.push(`--color-fg-tertiary: ${t.colorFgTertiary};`);
123
128
 
124
- if (t.colorAccent) vars.push(`--color-accent: ${t.colorAccent};`);
125
- if (t.colorAccentHover) vars.push(`--color-accent-hover: ${t.colorAccentHover};`);
126
- if (t.colorAccentActive) vars.push(`--color-accent-active: ${t.colorAccentActive};`);
127
- if (t.colorAccentSubtle) vars.push(`--color-accent-subtle: ${t.colorAccentSubtle};`);
128
- if (t.colorAccentGlow) vars.push(`--color-accent-glow: ${t.colorAccentGlow};`);
129
- if (t.colorAccentMuted) vars.push(`--color-accent-muted: ${t.colorAccentMuted};`);
130
- if (t.colorAccentFaint) vars.push(`--color-accent-faint: ${t.colorAccentFaint};`);
129
+ // Accent: emit the seed AND redeclare the full alias/ramp chain on this
130
+ // wrapper. CSS resolves var() in unregistered custom properties at computed-
131
+ // value time on the declaring element (:root). Without redeclaring the
132
+ // derived variables here, --color-accent etc. stay baked to the root seed
133
+ // even when --accent-primary is overridden on this wrapper.
134
+ if (t.colorAccent) {
135
+ vars.push(`--accent-primary: ${t.colorAccent};`);
136
+ vars.push(`--accent-hover: color-mix(in oklab, var(--accent-primary), #fff 16%);`);
137
+ vars.push(`--accent-active: color-mix(in oklab, var(--accent-primary), #000 22%);`);
138
+ vars.push(`--accent-glow: color-mix(in srgb, var(--accent-primary) 28%, transparent);`);
139
+ vars.push(`--accent-muted: color-mix(in srgb, var(--accent-primary) 16%, transparent);`);
140
+ vars.push(`--accent-subtle: color-mix(in srgb, var(--accent-primary) 8%, transparent);`);
141
+ vars.push(`--accent-faint: color-mix(in srgb, var(--accent-primary) 4%, transparent);`);
142
+ vars.push(`--color-accent: var(--accent-primary);`);
143
+ vars.push(`--color-accent-hover: var(--accent-hover);`);
144
+ vars.push(`--color-accent-active: var(--accent-active);`);
145
+ vars.push(`--color-accent-glow: var(--accent-glow);`);
146
+ vars.push(`--color-accent-muted: var(--accent-muted);`);
147
+ vars.push(`--color-accent-subtle: var(--accent-subtle);`);
148
+ vars.push(`--color-accent-faint: var(--accent-faint);`);
149
+ vars.push(`--color-accent-secondary: color-mix(in oklab, var(--accent-primary), #fff 26%);`);
150
+ vars.push(`--border-focus: var(--accent-primary);`);
151
+ }
131
152
  if (t.colorAccentAmber) vars.push(`--color-accent-amber: ${t.colorAccentAmber};`);
132
153
  if (t.colorAccentCopper) vars.push(`--color-accent-copper: ${t.colorAccentCopper};`);
133
154
  if (t.colorAccentRust) vars.push(`--color-accent-rust: ${t.colorAccentRust};`);
@@ -26,6 +26,11 @@ export interface ThemeConfig {
26
26
  colorFgInverse?: string;
27
27
  colorFgTertiary?: string;
28
28
  colorAccent?: string;
29
+ /** @deprecated Accent ramp fields ignored by ThemeProvider — the ramp is
30
+ * derived from `colorAccent` via tokens.css color-mix. Palette fields
31
+ * (Amber, Copper, Rust, Sage, Gold) below are still emitted directly as
32
+ * --color-accent-* custom properties for source compatibility. Set only
33
+ * `colorAccent` for the primary accent. */
29
34
  colorAccentHover?: string;
30
35
  colorAccentActive?: string;
31
36
  colorAccentSubtle?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeProvider.svelte.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/ThemeProvider.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;KAQK;AACL,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAqGH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"ThemeProvider.svelte.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/ThemeProvider.svelte.ts"],"names":[],"mappings":"AAGA;;;;;;;;KAQK;AACL,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;gDAI4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,KAAK;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAqHH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -8,6 +8,17 @@ interface QuaternionPalette {
8
8
  j: string;
9
9
  k: string;
10
10
  }
11
+ /** Runtime-derived accent ramp. Values are pre-parsed for Canvas 2D use. */
12
+ export interface AccentRamp {
13
+ /** Solid accent — e.g. "rgb(184 115 51)" — use for borders, active edges, cursors. */
14
+ solid: string;
15
+ /** Lighter variant (+16% toward white in OKLab approximation). */
16
+ hi: string;
17
+ /** Darker variant (-22% toward black). */
18
+ lo: string;
19
+ /** Return an rgba string at the given alpha (0–1). */
20
+ alpha: (a: number) => string;
21
+ }
11
22
  interface CanvasTheme {
12
23
  bg: string;
13
24
  node: string;
@@ -19,11 +30,20 @@ interface CanvasTheme {
19
30
  focus: string;
20
31
  severity: SeverityPalette;
21
32
  quaternion: QuaternionPalette;
33
+ /** Accent ramp derived from the single seed (--accent-primary). */
34
+ accentRamp: AccentRamp;
22
35
  }
36
+ /**
37
+ * Resolve the accent seed and return a canvas-ready AccentRamp.
38
+ * Reads --accent-primary from the target element's computed styles.
39
+ * Call once per frame (or on theme change) and cache the result.
40
+ */
41
+ export declare function resolveAccentRamp(el?: Element): AccentRamp;
23
42
  /**
24
43
  * Get the current canvas theme by reading CSS custom properties.
25
44
  * This enables runtime theming for all canvas-based components.
45
+ * Pass a container element to resolve tokens scoped to a ThemeProvider.
26
46
  */
27
- export declare function getCanvasTheme(): CanvasTheme;
47
+ export declare function getCanvasTheme(el?: Element): CanvasTheme;
28
48
  export type { CanvasTheme };
29
49
  //# sourceMappingURL=canvas-theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"canvas-theme.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/canvas-theme.ts"],"names":[],"mappings":"AAWA,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,iBAAiB,CAAC;CAC/B;AAYD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAqB5C;AAED,YAAY,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"canvas-theme.d.ts","sourceRoot":"","sources":["../../src/p0-primitives/canvas-theme.ts"],"names":[],"mappings":"AAaA,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,sDAAsD;IACtD,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9B;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,mEAAmE;IACnE,UAAU,EAAE,UAAU,CAAC;CACxB;AAqDD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,GAAE,OAAkC,GAAG,UAAU,CAKpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,GAAE,OAAkC,GAAG,WAAW,CAwBlF;AAED,YAAY,EAAE,WAAW,EAAE,CAAC"}