symbiote-ui 0.3.0-alpha.4

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 (322) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +21 -0
  3. package/README.md +76 -0
  4. package/canvas/AutoLayout.js +731 -0
  5. package/canvas/Breadcrumb/Breadcrumb.css.js +75 -0
  6. package/canvas/Breadcrumb/Breadcrumb.js +96 -0
  7. package/canvas/Breadcrumb/Breadcrumb.tpl.js +7 -0
  8. package/canvas/CanvasConnectionRenderer.js +971 -0
  9. package/canvas/CanvasGraph/CanvasGraph.css.js +29 -0
  10. package/canvas/CanvasGraph/CanvasGraph.js +1697 -0
  11. package/canvas/CanvasGraph/CanvasGraphDrawState.js +280 -0
  12. package/canvas/CanvasGraph/CanvasGraphGeometry.js +194 -0
  13. package/canvas/CanvasViewport.js +550 -0
  14. package/canvas/ConnectionRenderer.js +1283 -0
  15. package/canvas/FlowSimulator.js +326 -0
  16. package/canvas/ForceLayout.js +226 -0
  17. package/canvas/ForceWorker.js +1303 -0
  18. package/canvas/FrameManager.js +223 -0
  19. package/canvas/GraphExplorerShell/GraphExplorerShell.css.js +136 -0
  20. package/canvas/GraphExplorerShell/GraphExplorerShell.js +129 -0
  21. package/canvas/GraphExplorerShell/GraphExplorerShell.tpl.js +12 -0
  22. package/canvas/GraphTabs/GraphTabs.css.js +101 -0
  23. package/canvas/GraphTabs/GraphTabs.js +189 -0
  24. package/canvas/GraphTabs/GraphTabs.tpl.js +12 -0
  25. package/canvas/LODManager.js +88 -0
  26. package/canvas/Minimap/Minimap.css.js +73 -0
  27. package/canvas/Minimap/Minimap.js +210 -0
  28. package/canvas/Minimap/Minimap.tpl.js +7 -0
  29. package/canvas/NodeCanvas/NodeCanvas.css.js +398 -0
  30. package/canvas/NodeCanvas/NodeCanvas.js +1499 -0
  31. package/canvas/NodeCanvas/NodeCanvas.tpl.js +22 -0
  32. package/canvas/NodeSearch/NodeSearch.css.js +97 -0
  33. package/canvas/NodeSearch/NodeSearch.js +140 -0
  34. package/canvas/NodeSearch/NodeSearch.tpl.js +25 -0
  35. package/canvas/NodeViewManager.js +748 -0
  36. package/canvas/PcbRouteDiagnostics.js +463 -0
  37. package/canvas/PcbRouter.js +1127 -0
  38. package/canvas/PinExpansion.js +134 -0
  39. package/canvas/PseudoConnection.js +84 -0
  40. package/canvas/SelectionSync.js +163 -0
  41. package/canvas/SubgraphManager.js +203 -0
  42. package/canvas/SubgraphRouter.js +452 -0
  43. package/canvas/ViewportActions.js +473 -0
  44. package/canvas/graph-explorer.js +339 -0
  45. package/canvas/graph-layout.js +148 -0
  46. package/canvas/graph-model.js +68 -0
  47. package/canvas/html-in-canvas.js +202 -0
  48. package/canvas/project-graph-builder.js +440 -0
  49. package/canvas/project-graph-model.js +183 -0
  50. package/chat/ChatComposer/ChatComposer.css.js +652 -0
  51. package/chat/ChatComposer/ChatComposer.js +304 -0
  52. package/chat/ChatList/ChatList.css.js +102 -0
  53. package/chat/ChatList/ChatList.js +99 -0
  54. package/chat/ChatList/ChatList.tpl.js +20 -0
  55. package/chat/ChatListItem/ChatListItem.css.js +117 -0
  56. package/chat/ChatListItem/ChatListItem.js +32 -0
  57. package/chat/ChatListItem/ChatListItem.tpl.js +17 -0
  58. package/chat/ChatMessageItem/ChatMessageItem.css.js +628 -0
  59. package/chat/ChatMessageItem/ChatMessageItem.js +156 -0
  60. package/chat/ChatSidebar/ChatSidebar.css.js +150 -0
  61. package/chat/ChatSidebar/ChatSidebar.js +230 -0
  62. package/chat/ChatSidebar/ChatSidebar.tpl.js +18 -0
  63. package/chat/ChatSidebar/constants.js +11 -0
  64. package/chat/ChatSidebarItem/ChatSidebarItem.css.js +445 -0
  65. package/chat/ChatSidebarItem/ChatSidebarItem.js +304 -0
  66. package/chat/ChatTranscript/ChatTranscript.css.js +90 -0
  67. package/chat/ChatTranscript/ChatTranscript.js +244 -0
  68. package/chat/chat-context.js +123 -0
  69. package/chat/message-model.js +156 -0
  70. package/cli.js +20 -0
  71. package/control/Button/Button.css.js +93 -0
  72. package/control/Button/Button.js +78 -0
  73. package/control/Button/Button.tpl.js +3 -0
  74. package/control/Field/Field.css.js +91 -0
  75. package/control/Field/Field.js +17 -0
  76. package/control/Field/Field.tpl.js +3 -0
  77. package/core/Connection.js +47 -0
  78. package/core/Editor.js +449 -0
  79. package/core/Frame.js +33 -0
  80. package/core/GraphMermaid.js +348 -0
  81. package/core/GraphText.js +228 -0
  82. package/core/Node.js +145 -0
  83. package/core/Portal.js +106 -0
  84. package/core/Socket.js +187 -0
  85. package/core/SubgraphNode.js +121 -0
  86. package/core/base-path.js +55 -0
  87. package/core/dom-utils.js +14 -0
  88. package/core/index.js +18 -0
  89. package/core/local-cache.js +26 -0
  90. package/core/state-sync.js +227 -0
  91. package/custom-elements.json +6380 -0
  92. package/discover.js +240 -0
  93. package/display/Badge/Badge.css.js +44 -0
  94. package/display/Badge/Badge.js +17 -0
  95. package/display/Badge/Badge.tpl.js +3 -0
  96. package/display/Banner/Banner.css.js +61 -0
  97. package/display/Banner/Banner.js +17 -0
  98. package/display/Banner/Banner.tpl.js +3 -0
  99. package/display/CodeBlock/CodeBlock.css.js +194 -0
  100. package/display/CodeBlock/CodeBlock.js +220 -0
  101. package/display/CodeBlock/CodeBlock.tpl.js +11 -0
  102. package/display/DataTable/DataTable.css.js +101 -0
  103. package/display/DataTable/DataTable.js +136 -0
  104. package/display/DataTable/DataTable.tpl.js +13 -0
  105. package/display/EmptyState/EmptyState.css.js +33 -0
  106. package/display/EmptyState/EmptyState.js +17 -0
  107. package/display/EmptyState/EmptyState.tpl.js +3 -0
  108. package/display/EventFeed/EventFeed.css.js +145 -0
  109. package/display/EventFeed/EventFeed.js +64 -0
  110. package/display/EventFeed/EventFeed.tpl.js +14 -0
  111. package/display/EventFeed/EventFeedItem.js +116 -0
  112. package/display/EventFeed/EventFeedItem.tpl.js +22 -0
  113. package/display/LoadingOverlay/LoadingOverlay.css.js +91 -0
  114. package/display/LoadingOverlay/LoadingOverlay.js +48 -0
  115. package/display/LoadingOverlay/LoadingOverlay.tpl.js +12 -0
  116. package/display/Metric/Metric.css.js +60 -0
  117. package/display/Metric/Metric.js +17 -0
  118. package/display/Metric/Metric.tpl.js +6 -0
  119. package/display/OutputGraphPreview/OutputGraphPreview.css.js +122 -0
  120. package/display/OutputGraphPreview/OutputGraphPreview.js +89 -0
  121. package/display/OutputGraphPreview/OutputGraphPreview.tpl.js +13 -0
  122. package/display/OutputListPreview/OutputListPreview.css.js +109 -0
  123. package/display/OutputListPreview/OutputListPreview.js +77 -0
  124. package/display/OutputListPreview/OutputListPreview.tpl.js +13 -0
  125. package/display/SourceEditor/SourceEditor.css.js +39 -0
  126. package/display/SourceEditor/SourceEditor.js +129 -0
  127. package/display/SourceEditor/SourceEditor.tpl.js +10 -0
  128. package/display/SourceViewer/SourceViewer.css.js +80 -0
  129. package/display/SourceViewer/SourceViewer.js +418 -0
  130. package/display/SourceViewer/SourceViewer.tpl.js +17 -0
  131. package/display/StatusRibbon/StatusRibbon.css.js +73 -0
  132. package/display/StatusRibbon/StatusRibbon.js +87 -0
  133. package/display/StatusRibbon/StatusRibbon.tpl.js +7 -0
  134. package/display/event-feed-adapter.js +72 -0
  135. package/display/format-utils.js +29 -0
  136. package/display/highlight.js +659 -0
  137. package/display/icons.js +37 -0
  138. package/display/markdown-formatter.js +60 -0
  139. package/display/network-approval-page.js +487 -0
  140. package/display/output-preview.js +261 -0
  141. package/effects/CellBg/CellBg.css.js +33 -0
  142. package/effects/CellBg/CellBg.js +410 -0
  143. package/effects/CellBg/CellBg.tpl.js +5 -0
  144. package/graph/canvas-adapter.js +223 -0
  145. package/graph/graph-algorithms.js +31 -0
  146. package/graph/index.js +46 -0
  147. package/graph/model.js +176 -0
  148. package/graph/project-graph-build.js +66 -0
  149. package/graph/project-graph-metadata.js +253 -0
  150. package/graph/project-package.js +128 -0
  151. package/graph/project-runtime.js +116 -0
  152. package/graph/project-transaction.js +284 -0
  153. package/graph/skeleton-utils.js +84 -0
  154. package/graph/theme-contract.js +36 -0
  155. package/graph/transaction-parser.js +56 -0
  156. package/icons/MaterialSymbols.js +69 -0
  157. package/icons/material-symbols-outlined-400.ttf +0 -0
  158. package/icons/material-symbols.css +24 -0
  159. package/index.js +95 -0
  160. package/inspector/InspectorPanel/InspectorPanel.css.js +375 -0
  161. package/inspector/InspectorPanel/InspectorPanel.js +368 -0
  162. package/inspector/InspectorPanel/InspectorPanel.tpl.js +96 -0
  163. package/inspector/TemplatePreview/TemplatePreview.css.js +104 -0
  164. package/inspector/TemplatePreview/TemplatePreview.js +145 -0
  165. package/inspector/TemplatePreview/TemplatePreview.tpl.js +33 -0
  166. package/interactions/ConnectFlow.js +304 -0
  167. package/interactions/Drag.js +104 -0
  168. package/interactions/Selector.js +133 -0
  169. package/interactions/SnapGrid.js +66 -0
  170. package/interactions/Zoom.js +139 -0
  171. package/layout/ActionZone/ActionZone.css.js +88 -0
  172. package/layout/ActionZone/ActionZone.js +261 -0
  173. package/layout/ActionZone/ActionZone.tpl.js +11 -0
  174. package/layout/CrossLayoutPortalBridge/CrossLayoutPortalBridge.js +255 -0
  175. package/layout/Layout/Layout.css.js +91 -0
  176. package/layout/Layout/Layout.js +637 -0
  177. package/layout/Layout/Layout.tpl.js +27 -0
  178. package/layout/LayoutNode/LayoutNode.css.js +302 -0
  179. package/layout/LayoutNode/LayoutNode.js +509 -0
  180. package/layout/LayoutNode/LayoutNode.tpl.js +39 -0
  181. package/layout/LayoutPreview/LayoutPreview.css.js +46 -0
  182. package/layout/LayoutPreview/LayoutPreview.js +102 -0
  183. package/layout/LayoutPreview/LayoutPreview.tpl.js +6 -0
  184. package/layout/LayoutRouter/LayoutRouter.js +274 -0
  185. package/layout/LayoutRouter/SectionRegistry.js +135 -0
  186. package/layout/LayoutRouter/routerSync.js +250 -0
  187. package/layout/LayoutSidebar/LayoutSidebar.css.js +411 -0
  188. package/layout/LayoutSidebar/LayoutSidebar.js +368 -0
  189. package/layout/LayoutSidebar/LayoutSidebar.tpl.js +26 -0
  190. package/layout/LayoutSidebar/SidebarSection.css.js +20 -0
  191. package/layout/LayoutSidebar/SidebarSection.js +184 -0
  192. package/layout/LayoutSidebar/SidebarSection.tpl.js +22 -0
  193. package/layout/LayoutTree.js +373 -0
  194. package/layout/PanelMenu/PanelMenu.css.js +43 -0
  195. package/layout/PanelMenu/PanelMenu.js +95 -0
  196. package/layout/PanelMenu/PanelMenu.tpl.js +17 -0
  197. package/layout/ProjectTabs/ProjectTabs.css.js +188 -0
  198. package/layout/ProjectTabs/ProjectTabs.js +77 -0
  199. package/layout/ProjectTabs/ProjectTabs.tpl.js +15 -0
  200. package/layout/index.js +40 -0
  201. package/list/ListDetailShell/ListDetailShell.css.js +128 -0
  202. package/list/ListDetailShell/ListDetailShell.js +72 -0
  203. package/list/ListDetailShell/ListDetailShell.tpl.js +36 -0
  204. package/list/ListItem/ListItem.css.js +111 -0
  205. package/list/ListItem/ListItem.js +66 -0
  206. package/list/ListItem/ListItem.tpl.js +18 -0
  207. package/locale/index.js +503 -0
  208. package/manifest/component-registry.js +2446 -0
  209. package/manifest/graph-schema.js +285 -0
  210. package/manifest/index.js +6 -0
  211. package/manifest/project-schema-catalog.js +246 -0
  212. package/manifest/rule-catalog.js +201 -0
  213. package/manifest/theme-catalog.js +2149 -0
  214. package/manifest/ui-schema-catalog.js +334 -0
  215. package/menu/ContextMenu/ContextMenu.css.js +61 -0
  216. package/menu/ContextMenu/ContextMenu.js +82 -0
  217. package/menu/ContextMenu/ContextMenu.tpl.js +19 -0
  218. package/navigation/QuickOpen/QuickOpen.css.js +92 -0
  219. package/navigation/QuickOpen/QuickOpen.js +185 -0
  220. package/navigation/QuickOpen/QuickOpen.tpl.js +15 -0
  221. package/navigation/quick-open-utils.js +101 -0
  222. package/node/CtrlItem/CtrlItem.css.js +41 -0
  223. package/node/CtrlItem/CtrlItem.js +24 -0
  224. package/node/CtrlItem/CtrlItem.tpl.js +17 -0
  225. package/node/GraphFrame/GraphFrame.css.js +66 -0
  226. package/node/GraphFrame/GraphFrame.js +32 -0
  227. package/node/GraphFrame/GraphFrame.tpl.js +13 -0
  228. package/node/GraphNode/GraphNode.css.js +815 -0
  229. package/node/GraphNode/GraphNode.js +173 -0
  230. package/node/GraphNode/GraphNode.tpl.js +33 -0
  231. package/node/NodeCallout/NodeCallout.css.js +91 -0
  232. package/node/NodeCallout/NodeCallout.js +281 -0
  233. package/node/NodeCallout/NodeCallout.tpl.js +8 -0
  234. package/node/NodeSocket/NodeSocket.css.js +68 -0
  235. package/node/NodeSocket/NodeSocket.js +26 -0
  236. package/node/NodeSocket/NodeSocket.tpl.js +7 -0
  237. package/node/PortItem/PortItem.css.js +93 -0
  238. package/node/PortItem/PortItem.js +87 -0
  239. package/node/PortItem/PortItem.tpl.js +10 -0
  240. package/package.json +165 -0
  241. package/palette/PaletteBrowser/PaletteBrowser.css.js +143 -0
  242. package/palette/PaletteBrowser/PaletteBrowser.js +152 -0
  243. package/palette/PaletteBrowser/PaletteBrowser.tpl.js +23 -0
  244. package/plugins/History.js +408 -0
  245. package/plugins/Readonly.js +60 -0
  246. package/rules/symbiote-3x.json +170 -0
  247. package/schemas/component-descriptor-v1.json +91 -0
  248. package/schemas/component-descriptor-v2.json +145 -0
  249. package/schemas/graph-model-v1.json +179 -0
  250. package/schemas/graph-v1.json +91 -0
  251. package/schemas/project-package-v1.json +102 -0
  252. package/schemas/project-transaction-v1.json +114 -0
  253. package/schemas/runtime-ui-v1.json +80 -0
  254. package/schemas/theme-rule-block-v1.json +73 -0
  255. package/shapes/CircleShape.js +79 -0
  256. package/shapes/CommentShape.js +35 -0
  257. package/shapes/DiamondShape.js +130 -0
  258. package/shapes/NodeShape.js +79 -0
  259. package/shapes/PillShape.js +91 -0
  260. package/shapes/RectShape.js +84 -0
  261. package/shapes/SVGShape.js +525 -0
  262. package/shapes/index.js +63 -0
  263. package/surface/Card/Card.css.js +57 -0
  264. package/surface/Card/Card.js +17 -0
  265. package/surface/Card/Card.tpl.js +3 -0
  266. package/themes/Palette.js +30 -0
  267. package/themes/Skin.js +113 -0
  268. package/themes/Theme.js +82 -0
  269. package/themes/carbon.js +135 -0
  270. package/themes/dark.js +140 -0
  271. package/themes/default-dark.js +714 -0
  272. package/themes/default-provider.css +635 -0
  273. package/themes/default-provider.js +718 -0
  274. package/themes/ebook.js +136 -0
  275. package/themes/grey.js +137 -0
  276. package/themes/light.js +139 -0
  277. package/themes/neon.js +138 -0
  278. package/themes/pcb.js +273 -0
  279. package/themes/synthwave.js +138 -0
  280. package/tokens/base.json +29 -0
  281. package/tokens/themes/carbon.json +11 -0
  282. package/tokens/themes/dark.json +12 -0
  283. package/tokens/themes/default-dark.json +1543 -0
  284. package/tokens/themes/default-provider.json +1543 -0
  285. package/tokens/themes/ebook.json +11 -0
  286. package/tokens/themes/grey.json +11 -0
  287. package/tokens/themes/light.json +12 -0
  288. package/tokens/themes/neon.json +11 -0
  289. package/tokens/themes/pcb.json +11 -0
  290. package/tokens/themes/synthwave.json +11 -0
  291. package/toolbar/QuickToolbar/QuickToolbar.css.js +152 -0
  292. package/toolbar/QuickToolbar/QuickToolbar.js +529 -0
  293. package/toolbar/QuickToolbar/QuickToolbar.tpl.js +34 -0
  294. package/tree/TreePanel/TreePanel.css.js +112 -0
  295. package/tree/TreePanel/TreePanel.js +147 -0
  296. package/tree/TreePanel/TreePanel.tpl.js +18 -0
  297. package/tree/TreeView/TreeView.css.js +122 -0
  298. package/tree/TreeView/TreeView.js +365 -0
  299. package/tree/TreeView/TreeView.tpl.js +10 -0
  300. package/ui/dialogs.js +221 -0
  301. package/ui/host-adapters.js +114 -0
  302. package/ui/index.js +660 -0
  303. package/ui/locale.js +50 -0
  304. package/ui/overlay-stack.js +89 -0
  305. package/ui/shared-styles.js +26 -0
  306. package/webmcp.js +37 -0
  307. package/xr/deep-graph.js +646 -0
  308. package/xr/emulation.js +198 -0
  309. package/xr/gesture.js +228 -0
  310. package/xr/html-canvas-renderer.js +472 -0
  311. package/xr/index.js +15 -0
  312. package/xr/layout-projection.js +1046 -0
  313. package/xr/panel-frame.js +128 -0
  314. package/xr/panel-host.js +267 -0
  315. package/xr/pointer.js +258 -0
  316. package/xr/scene-controller.js +242 -0
  317. package/xr/spatial-scene.js +212 -0
  318. package/xr/theme-bridge.js +105 -0
  319. package/xr/three-webxr-adapter.js +3439 -0
  320. package/xr/webgl-layer-renderer.js +419 -0
  321. package/xr/webxr.js +679 -0
  322. package/xr/workbench.js +516 -0
@@ -0,0 +1,2149 @@
1
+ import { DEFAULT_PROVIDER_THEME } from '../themes/default-provider.js';
2
+
3
+ export let THEME_NAMES = [
4
+ 'default-provider',
5
+ ];
6
+
7
+ export let THEME_METADATA = {
8
+ 'default-provider': {
9
+ role: 'neutral-default',
10
+ aliases: ['symbiote-default', 'default-provider', 'DEFAULT_PROVIDER_THEME'],
11
+ defaultExport: 'DEFAULT_PROVIDER_THEME',
12
+ description: 'Cascadeable neutral provider default aligned with the current Agent Portal shell values.',
13
+ origin: 'Agent Portal shell values generalized into provider-neutral Symbiote Node tokens.',
14
+ cascade: 'Apply once at :root, an app shell, or a subtree boundary; components inherit --sn-* tokens through the CSS cascade.',
15
+ colorModel: ['native-css-hsl', 'alpha-hsl', 'color-mix'],
16
+ controlTokens: [
17
+ '--sn-theme-hue',
18
+ '--sn-theme-chroma',
19
+ '--sn-theme-bg-lightness',
20
+ '--sn-theme-surface-lightness',
21
+ '--sn-theme-text-lightness',
22
+ '--sn-theme-density',
23
+ '--sn-theme-radius-scale',
24
+ '--sn-theme-motion-scale',
25
+ '--sn-theme-elevation-scale',
26
+ ],
27
+ tokenFamilies: ['source-control', 'source-accent', 'color-cascade', 'geometry-cascade', 'semantic-alias', 'component-alias', 'motion-effects'],
28
+ },
29
+ };
30
+
31
+ export let TOKEN_FILES = [
32
+ { name: 'base', path: 'tokens/base.json', kind: 'base' },
33
+ ...THEME_NAMES.map((name) => ({
34
+ name,
35
+ ...(THEME_METADATA[name] || {}),
36
+ path: `tokens/themes/${name}.json`,
37
+ kind: 'theme',
38
+ extends: 'tokens/base.json',
39
+ })),
40
+ ];
41
+
42
+ const RUNTIME_THEMES = {
43
+ 'default-provider': DEFAULT_PROVIDER_THEME,
44
+ };
45
+
46
+ const CSS_TOKEN_CLASSIFIERS = [
47
+ { kind: 'source-control', group: 'control', pattern: /^--sn-theme-/ },
48
+ { kind: 'source-accent', group: 'color', pattern: /^--sn-hue-/ },
49
+ { kind: 'color-cascade', group: 'color', pattern: /^--sn-(sat($|-)|lit-|alpha-)/ },
50
+ { kind: 'color-cascade', group: 'accent', pattern: /^--sn-accent-/ },
51
+ { kind: 'semantic-alias', group: 'surface', pattern: /^--sn-(bg|panel-bg|surface|border|node-bg|node-border|node-selected|node-accent|node-hover|node-header-bg|node-radius|node-shadow|node-min-width|node-max-width|node-border-width|node-font-size|node-items-|node-callout-|node-active-border|node-error-frame-|text|text-dim|bg-overlay|overlay-z-base|shadow-color)/ },
52
+ { kind: 'semantic-alias', group: 'status', pattern: /^--sn-(success|warning|danger|status|cat|type|subgraph|accent-warn|message-event)-/ },
53
+ { kind: 'semantic-alias', group: 'provider-accent', pattern: /^--sn-provider-/ },
54
+ { kind: 'component-alias', group: 'layout', pattern: /^--sn-(layout|portal-bridge|panel-menu)-/ },
55
+ { kind: 'component-alias', group: 'xr', pattern: /^--sn-xr-/ },
56
+ { kind: 'component-alias', group: 'surface', pattern: /^--sn-(card|dialog|output-preview)-/ },
57
+ { kind: 'component-alias', group: 'data-table', pattern: /^--sn-data-table-/ },
58
+ { kind: 'component-alias', group: 'control', pattern: /^--sn-(button|field)-/ },
59
+ { kind: 'component-alias', group: 'status', pattern: /^--sn-(badge|banner|empty-state)-/ },
60
+ { kind: 'component-alias', group: 'metric', pattern: /^--sn-metric-/ },
61
+ { kind: 'component-alias', group: 'navigation-row', pattern: /^--sn-(tree|list-item|list-detail)-/ },
62
+ { kind: 'component-alias', group: 'navigation-shell', pattern: /^--sn-sidebar-/ },
63
+ { kind: 'component-alias', group: 'chat', pattern: /^--sn-(composer|chat)-/ },
64
+ { kind: 'component-alias', group: 'tabs', pattern: /^--sn-tabs-/ },
65
+ { kind: 'component-alias', group: 'source', pattern: /^--sn-(source|editor)-/ },
66
+ { kind: 'component-alias', group: 'syntax', pattern: /^--sn-syntax-/ },
67
+ { kind: 'component-alias', group: 'diagnostic', pattern: /^--sn-diagnostic-/ },
68
+ { kind: 'component-alias', group: 'loading', pattern: /^--sn-loading-/ },
69
+ { kind: 'component-alias', group: 'graph', pattern: /^--sn-(socket|conn|grid|shape|dot|graph-explorer|graph-type|graph-cluster|minimap)-/ },
70
+ { kind: 'component-alias', group: 'context-menu', pattern: /^--sn-ctx-/ },
71
+ { kind: 'component-alias', group: 'toolbar', pattern: /^--sn-toolbar-/ },
72
+ { kind: 'component-alias', group: 'comment', pattern: /^--sn-comment-/ },
73
+ { kind: 'component-alias', group: 'frame', pattern: /^--sn-frame-/ },
74
+ { kind: 'typography-cascade', group: 'typography', pattern: /^--sn-(font|icon-font)/ },
75
+ { kind: 'motion-effects', group: 'effect', pattern: /^--sn-(effect|shadow|cell)-/ },
76
+ { kind: 'motion-effects', group: 'scrollbar', pattern: /^--sn-scrollbar-/ },
77
+ { kind: 'host-bridge-alias', group: 'host-bridge', pattern: /^--(bg-level-2|border-color|text-color|text-color-muted)$/ },
78
+ ];
79
+
80
+ function copyData(value) {
81
+ return JSON.parse(JSON.stringify(value));
82
+ }
83
+
84
+ function classifyCssToken(cssVar) {
85
+ let classifier = CSS_TOKEN_CLASSIFIERS.find((item) => item.pattern.test(cssVar));
86
+ if (!classifier) {
87
+ return { kind: 'unclassified', group: 'unknown' };
88
+ }
89
+ return { kind: classifier.kind, group: classifier.group };
90
+ }
91
+
92
+ export let THEME_CONTROLS = {
93
+ 'default-provider': [
94
+ { name: 'hue', type: 'number', default: '218', cssVar: '--sn-theme-hue', description: 'Primary accent hue in native CSS HSL space.' },
95
+ { name: 'chroma', type: 'percentage', default: '89%', cssVar: '--sn-theme-chroma', description: 'Primary accent saturation/chroma used by selected, focus, and loading states.' },
96
+ { name: 'backgroundLightness', type: 'percentage', default: '10%', cssVar: '--sn-theme-bg-lightness', description: 'Root surface lightness; can move the preset between darker and lighter modes.' },
97
+ { name: 'surfaceLightness', type: 'percentage', default: '13%', cssVar: '--sn-theme-surface-lightness', description: 'Panel and control surface lightness derived near the background.' },
98
+ { name: 'textLightness', type: 'percentage', default: '94%', cssVar: '--sn-theme-text-lightness', description: 'Foreground text lightness inherited by text aliases.' },
99
+ { name: 'density', type: 'number', default: '1', cssVar: '--sn-theme-density', description: 'Density multiplier for repeated navigation row height.' },
100
+ { name: 'radius', type: 'number', default: '1', cssVar: '--sn-theme-radius-scale', description: 'Radius multiplier for node, row, list, composer, and source action corners.' },
101
+ { name: 'motion', type: 'number', default: '1', cssVar: '--sn-theme-motion-scale', description: 'Global motion multiplier for transitions and feedback effects.' },
102
+ { name: 'elevation', type: 'number', default: '1', cssVar: '--sn-theme-elevation-scale', description: 'Global shadow and overlay intensity multiplier.' },
103
+ ],
104
+ };
105
+
106
+ export let THEME_ELEMENT_GROUPS = [
107
+ {
108
+ name: 'panel',
109
+ description: 'Framed layout surfaces such as sidebars, graph panels, source panes, and dialogs.',
110
+ tokens: ['--sn-panel-bg', '--sn-surface', '--sn-border', '--sn-card-bg', '--sn-card-border', '--sn-card-radius', '--sn-card-padding', '--sn-dialog-bg', '--sn-dialog-border', '--sn-dialog-radius', '--sn-dialog-shadow', '--sn-dialog-backdrop', '--sn-node-border', '--sn-node-shadow', '--sn-node-radius', '--sn-overlay-z-base'],
111
+ usedBy: ['panel-layout', 'sn-card', 'source-viewer', 'source-editor', 'chat-transcript', 'sn-loading-overlay'],
112
+ },
113
+ {
114
+ name: 'control',
115
+ description: 'Interactive controls including buttons, icon buttons, toolbar actions, labels, inputs, selects, and textareas.',
116
+ tokens: ['--sn-button-bg', '--sn-button-border', '--sn-button-color', '--sn-button-hover-border', '--sn-button-primary-bg', '--sn-button-danger-color', '--sn-field-control-bg', '--sn-field-control-border', '--sn-field-control-subtle-border', '--sn-field-label-color', '--sn-field-control-focus-border', '--sn-field-select-indicator', '--sn-field-toggle-bg', '--sn-field-toggle-thumb-bg', '--sn-field-toggle-thumb-active-bg', '--sn-toolbar-bg', '--sn-toolbar-border', '--sn-toolbar-color', '--sn-toolbar-hover', '--sn-toolbar-occlusion-bg', '--sn-toolbar-z', '--sn-toolbar-title-color', '--sn-toolbar-title-min-width', '--sn-toolbar-title-max-width', '--sn-toolbar-title-lines', '--sn-effect-hover-transition', '--sn-effect-focus-ring'],
117
+ usedBy: ['sn-button', 'sn-field', 'project-tabs', 'source-viewer', 'chat-composer'],
118
+ },
119
+ {
120
+ name: 'row',
121
+ description: 'Reusable list/tree/navigation rows with hover, active, selected, and focus states.',
122
+ tokens: ['--sn-tree-row-height', '--sn-tree-panel-row-min-height', '--sn-tree-row-hover-bg', '--sn-tree-row-selected-bg', '--sn-list-item-hover-bg', '--sn-list-item-active-bg', '--sn-list-detail-bg', '--sn-list-detail-border'],
123
+ usedBy: ['sn-tree-view', 'sn-tree-panel', 'sn-list-item', 'sn-list-detail-shell', 'chat-list-item', 'chat-sidebar-item'],
124
+ },
125
+ {
126
+ name: 'input',
127
+ description: 'Text entry, code entry, composer, and textarea surfaces.',
128
+ tokens: ['--sn-composer-bg', '--sn-source-editor-bg', '--sn-editor-border', '--sn-editor-font', '--sn-effect-focus-ring'],
129
+ usedBy: ['chat-composer', 'source-editor'],
130
+ },
131
+ {
132
+ name: 'code-surface',
133
+ description: 'Read-only and editable source/code surfaces.',
134
+ tokens: ['--sn-source-bg', '--sn-source-header-bg', '--sn-source-border', '--sn-source-editor-bg', '--sn-source-editor-color', '--sn-syntax-keyword', '--sn-syntax-string', '--sn-syntax-comment', '--sn-diagnostic-error-bg', '--sn-diagnostic-warning-bg'],
135
+ usedBy: ['source-viewer', 'source-editor'],
136
+ },
137
+ {
138
+ name: 'status',
139
+ description: 'Badges, loading, success, warning, danger, and transient status feedback.',
140
+ tokens: ['--sn-success-color', '--sn-success-bg', '--sn-success-border', '--sn-success-bg-hover', '--sn-success-border-hover', '--sn-warning-color', '--sn-danger-color', '--sn-danger-bg', '--sn-danger-border', '--sn-subgraph-bg', '--sn-subgraph-bg-hover', '--sn-subgraph-border', '--sn-subgraph-border-hover', '--sn-badge-bg', '--sn-badge-border', '--sn-badge-color', '--sn-banner-bg', '--sn-banner-border', '--sn-banner-color', '--sn-empty-state-color', '--sn-loading-bar-bg', '--sn-effect-loading-pulse'],
141
+ usedBy: ['sn-loading-overlay', 'chat-transcript', 'chat-composer', 'inspector-panel'],
142
+ },
143
+ {
144
+ name: 'metric',
145
+ description: 'Reusable label/value summaries for stats, settings metadata, and health cards.',
146
+ tokens: ['--sn-metric-gap', '--sn-metric-padding', '--sn-metric-border', '--sn-metric-color', '--sn-metric-label-color', '--sn-metric-label-size', '--sn-metric-value-color', '--sn-metric-value-size', '--sn-metric-value-weight', '--sn-metric-value-font', '--sn-metric-success-color', '--sn-metric-warning-color', '--sn-metric-error-color'],
147
+ usedBy: ['sn-metric'],
148
+ },
149
+ {
150
+ name: 'data-table',
151
+ description: 'Reusable tabular data surfaces with headers, row dividers, empty states, and inline markers.',
152
+ tokens: ['--sn-data-table-bg', '--sn-data-table-border', '--sn-data-table-radius', '--sn-data-table-color', '--sn-data-table-header-bg', '--sn-data-table-header-color', '--sn-data-table-header-border', '--sn-data-table-row-border', '--sn-data-table-cell-padding', '--sn-data-table-cell-size', '--sn-data-table-empty-color'],
153
+ usedBy: ['sn-data-table'],
154
+ },
155
+ {
156
+ name: 'graph',
157
+ description: 'Graph nodes, edges, clusters, pins, sockets, and graph canvas feedback.',
158
+ tokens: ['--sn-node-bg', '--sn-node-border', '--sn-node-selected', '--sn-conn-color', '--sn-graph-type-data', '--sn-graph-type-action', '--sn-graph-cluster-0', '--sn-graph-cluster-1', '--sn-minimap-bg', '--sn-minimap-node', '--sn-minimap-viewport', '--sn-cat-server', '--sn-cat-control', '--sn-cat-data', '--sn-subgraph-accent'],
159
+ usedBy: ['node-canvas', 'canvas-graph', 'graph-explorer-shell', 'node-minimap'],
160
+ },
161
+ {
162
+ name: 'layout-preview',
163
+ description: 'Drag preview overlays and split indicators used by reusable layout composition.',
164
+ tokens: ['--sn-layout-preview-join-bg', '--sn-layout-preview-join-border', '--sn-layout-preview-line', '--sn-layout-preview-line-shadow'],
165
+ usedBy: ['panel-layout'],
166
+ },
167
+ {
168
+ name: 'xr',
169
+ description: 'Spatial panel material aliases derived from the default provider theme.',
170
+ tokens: ['--sn-xr-panel-bg', '--sn-xr-panel-border', '--sn-xr-panel-radius', '--sn-xr-panel-shadow', '--sn-xr-pointer-color'],
171
+ usedBy: ['panel-layout'],
172
+ },
173
+ {
174
+ name: 'tab',
175
+ description: 'Project and document tabs with active, hover, divider, and close affordances.',
176
+ tokens: ['--sn-tabs-bg', '--sn-tabs-border', '--sn-tabs-active-bg', '--sn-tabs-hover-bg', '--sn-tabs-accent', '--sn-tabs-radius'],
177
+ usedBy: ['project-tabs'],
178
+ },
179
+ ];
180
+
181
+ export let THEME_RULE_BLOCKS = [
182
+ {
183
+ name: 'default-provider-source-accents',
184
+ theme: 'default-provider',
185
+ kind: 'source-accent',
186
+ description: 'Minimal human or agent-selected inputs for the default provider theme.',
187
+ parameters: [
188
+ { name: 'hue', type: 'number', default: '218', description: 'Native CSS HSL hue for primary accent and derived state colors.' },
189
+ { name: 'chroma', type: 'percentage', default: '89%', description: 'Native CSS HSL saturation/chroma for accent-derived colors.' },
190
+ { name: 'backgroundLightness', type: 'percentage', default: '10%', description: 'Root surface lightness, adjustable from darker to lighter modes.' },
191
+ { name: 'surfaceLightness', type: 'percentage', default: '13%', description: 'Panel and control surface lightness near the root background.' },
192
+ { name: 'textLightness', type: 'percentage', default: '94%', description: 'Primary foreground lightness for contrast tuning.' },
193
+ { name: 'density', type: 'number', default: '1', description: 'User density modifier for repeated operational surfaces.' },
194
+ ],
195
+ inputs: ['hue', 'chroma', 'backgroundLightness', 'surfaceLightness', 'textLightness', 'density'],
196
+ outputs: ['color.accent', 'color.success', 'color.warning', 'color.danger', 'color.background'],
197
+ formula: 'Source accents define the stable roots used by color, semantic, and component aliases.',
198
+ derivations: [
199
+ { output: 'color.background', inputs: ['backgroundLightness'], expression: 'hsl(0 0% backgroundLightness)', description: 'The page and root app background derive from the neutral lightness control.' },
200
+ { output: 'color.surface', inputs: ['surfaceLightness'], expression: 'hsl(0 0% surfaceLightness)', description: 'Panel surfaces derive from the surface lightness control.' },
201
+ { output: 'color.accent', inputs: ['hue', 'chroma'], expression: 'hsl(hue chroma 63%)', description: 'The primary accent is native CSS HSL so agents can shift hue and chroma at runtime.' },
202
+ ],
203
+ },
204
+ {
205
+ name: 'default-provider-color-cascade',
206
+ theme: 'default-provider',
207
+ kind: 'color-cascade',
208
+ description: 'Derives surfaces, text, borders, overlays, hover, and selected states from source accents.',
209
+ parameters: [
210
+ { name: 'surface.step', type: 'color-mix', default: '+8% luminance over background', description: 'Panel surface offset from the root background.' },
211
+ { name: 'border.alpha', type: 'alpha', default: '0.1', description: 'Subtle divider contrast for dense dark UI.' },
212
+ { name: 'accent.alpha', type: 'alpha', default: '0.06|0.12|0.2', description: 'Subtle, normal, and border accent opacities.' },
213
+ ],
214
+ inputs: ['color.background', 'color.surface', 'color.accent'],
215
+ outputs: [
216
+ 'color.text',
217
+ 'color.textDim',
218
+ 'color.border',
219
+ 'color.overlay',
220
+ 'syntax.keyword',
221
+ 'syntax.string',
222
+ 'syntax.comment',
223
+ 'diagnostic.errorBackground',
224
+ 'diagnostic.warningBackground',
225
+ 'provider.rndPro.color',
226
+ 'provider.official.color',
227
+ 'provider.google.color',
228
+ 'provider.community.color',
229
+ 'component.accentBackground',
230
+ 'component.accentBackgroundSubtle',
231
+ 'component.accentBorder',
232
+ 'component.successBackground',
233
+ 'component.successBorder',
234
+ 'component.successBackgroundHover',
235
+ 'component.successBorderHover',
236
+ 'component.dangerBackground',
237
+ 'component.dangerBorder',
238
+ 'component.subgraphBackground',
239
+ 'component.subgraphBackgroundHover',
240
+ 'component.subgraphBorder',
241
+ 'component.subgraphBorderHover',
242
+ 'component.layoutPreviewJoinBackground',
243
+ 'component.layoutPreviewJoinBorder',
244
+ ],
245
+ formula: 'Surface and state colors are derived as transparent mixes over the background and accent roots.',
246
+ derivations: [
247
+ { output: 'color.text', inputs: ['color.background'], expression: 'contrastText(color.background, 0.92)', description: 'Primary text keeps high contrast over the root background.' },
248
+ { output: 'color.border', inputs: ['color.text'], expression: 'hsl(text.h text.s text.l / 0.1)', description: 'Borders are text-tinted dividers, not independent colors.' },
249
+ { output: 'component.accentBackgroundSubtle', inputs: ['color.accent'], expression: 'hsl(accent.h accent.s accent.l / 0.06)', description: 'Selected rows and active list items reuse the same subtle accent wash.' },
250
+ { output: 'component.accentBackground', inputs: ['color.accent'], expression: 'hsl(accent.h accent.s accent.l / 0.12)', description: 'Stronger accent surfaces use the same accent at doubled opacity.' },
251
+ { output: 'component.accentBorder', inputs: ['color.accent'], expression: 'hsl(accent.h accent.s accent.l / 0.2)', description: 'Accent borders are a higher-opacity form of the primary accent.' },
252
+ { output: 'component.successBackground', inputs: ['color.success'], expression: 'color-mix(success, 18%, transparent)', description: 'Positive status chips derive their surface from the success branch.' },
253
+ { output: 'component.successBorder', inputs: ['color.success'], expression: 'color-mix(success, 32%, transparent)', description: 'Positive status chip borders use the same success branch at stronger opacity.' },
254
+ { output: 'component.successBackgroundHover', inputs: ['color.success'], expression: 'color-mix(success, 28%, transparent)', description: 'Positive action hover surfaces derive from the same success branch.' },
255
+ { output: 'component.successBorderHover', inputs: ['color.success'], expression: 'color-mix(success, 52%, transparent)', description: 'Positive action hover borders use the success branch at stronger opacity.' },
256
+ { output: 'component.dangerBackground', inputs: ['color.danger'], expression: 'color-mix(danger, 18%, transparent)', description: 'Negative status chips derive their surface from the danger branch.' },
257
+ { output: 'component.dangerBorder', inputs: ['color.danger'], expression: 'color-mix(danger, 32%, transparent)', description: 'Negative status chip borders use the same danger branch at stronger opacity.' },
258
+ { output: 'component.layoutPreviewJoinBackground', inputs: ['color.danger'], expression: 'color-mix(danger, 30%, transparent)', description: 'Join previews use the danger branch to indicate a destructive layout merge target.' },
259
+ { output: 'component.layoutPreviewJoinBorder', inputs: ['color.danger'], expression: 'color-mix(danger, 60%, transparent)', description: 'Join preview outlines use the danger branch at stronger opacity.' },
260
+ { output: 'component.subgraphBackground', inputs: ['color.data'], expression: 'linear-gradient(data accent at 12% and 8%)', description: 'Subgraph entry actions use a data-accent gradient exposed as a reusable token.' },
261
+ { output: 'component.subgraphBackgroundHover', inputs: ['color.data'], expression: 'linear-gradient(data accent at 22% and 15%)', description: 'Subgraph entry hover surfaces strengthen the same data-accent gradient.' },
262
+ { output: 'component.subgraphBorder', inputs: ['color.data'], expression: 'color-mix(data, 30%, transparent)', description: 'Subgraph action borders follow the data accent branch.' },
263
+ { output: 'component.subgraphBorderHover', inputs: ['color.data'], expression: 'color-mix(data, 50%, transparent)', description: 'Subgraph action hover borders follow the data accent branch at stronger opacity.' },
264
+ { output: 'syntax.keyword', inputs: ['color.danger'], expression: 'hsl(danger.hue vivid 82%)', description: 'Syntax keywords use the danger hue branch at readable high lightness.' },
265
+ { output: 'syntax.string', inputs: ['color.warning'], expression: 'hsl(warning.hue vivid 65%)', description: 'String and numeric syntax tokens use the warning branch.' },
266
+ { output: 'syntax.comment', inputs: ['color.textDim'], expression: 'color.textDim', description: 'Comments inherit muted text so they follow contrast controls.' },
267
+ { output: 'diagnostic.errorBackground', inputs: ['color.danger'], expression: 'color-mix(danger, 7%, transparent)', description: 'Diagnostic error rows reuse the danger branch.' },
268
+ { output: 'diagnostic.warningBackground', inputs: ['color.warning'], expression: 'color-mix(warning, 5%, transparent)', description: 'Diagnostic warning rows reuse the warning branch.' },
269
+ { output: 'provider.rndPro.color', inputs: ['color.data'], expression: 'var(--sn-cat-data)', description: 'RND-PRO provider badges use the data accent branch instead of fixed purple values.' },
270
+ { output: 'provider.official.color', inputs: ['color.accent'], expression: 'var(--sn-node-selected)', description: 'Official provider badges follow the primary accent.' },
271
+ { output: 'provider.google.color', inputs: ['color.success'], expression: 'var(--sn-success-color)', description: 'Google provider badges follow the success branch.' },
272
+ { output: 'provider.community.color', inputs: ['color.warning'], expression: 'var(--sn-warning-color)', description: 'Community provider badges follow the warning branch.' },
273
+ ],
274
+ },
275
+ {
276
+ name: 'default-provider-geometry-cascade',
277
+ theme: 'default-provider',
278
+ kind: 'geometry-cascade',
279
+ description: 'Derives density, panel gaps, row heights, radii, and control sizes from one spacing scale.',
280
+ parameters: [
281
+ { name: 'size.unit', type: 'dimension', default: '4px', unit: 'px', description: 'Smallest visual spacing unit.' },
282
+ { name: 'density.compactRow', type: 'dimension', default: '22px', unit: 'px', description: 'Default tree row height for dense project navigation.' },
283
+ { name: 'radius.unit', type: 'dimension', default: '4px', unit: 'px', description: 'Base radius used by rows, source actions, and list items.' },
284
+ ],
285
+ inputs: ['size.grid', 'density.scale'],
286
+ outputs: [
287
+ 'component.layoutGapBackground',
288
+ 'geometry.treeRowHeight',
289
+ 'geometry.composerInputMinHeight',
290
+ 'radius.node',
291
+ 'radius.control',
292
+ ],
293
+ formula: 'Spacing values are multiples of the base grid; radii and control sizes follow density scale.',
294
+ derivations: [
295
+ { output: 'geometry.treeGap', inputs: ['size.unit'], expression: 'size.unit', description: 'Tree vertical rhythm starts at the base spacing unit.' },
296
+ { output: 'geometry.treeIndent', inputs: ['size.unit'], expression: 'size.unit * 4', description: 'Nested tree levels indent by four spacing units.' },
297
+ { output: 'geometry.treeRowHeight', inputs: ['size.unit', 'density.scale'], expression: 'size.unit * 5.5 when density.scale = compact', description: 'Compact navigation rows stay scan-friendly without wasting vertical space.' },
298
+ { output: 'geometry.tabsHeight', inputs: ['size.unit'], expression: 'size.unit * 9.5', description: 'Project tabs keep enough height for icon, label, and close affordance.' },
299
+ { output: 'geometry.composerRadius', inputs: ['radius.unit'], expression: 'radius.unit * 5', description: 'The main chat input uses a pill radius derived from the same radius unit.' },
300
+ ],
301
+ },
302
+ {
303
+ name: 'default-provider-typography-cascade',
304
+ theme: 'default-provider',
305
+ kind: 'typography-cascade',
306
+ description: 'Defines compact application typography for panels, lists, chat, and code surfaces.',
307
+ parameters: [
308
+ { name: 'font.family', type: 'fontFamily', default: 'Inter, system-ui', description: 'Primary application UI font stack.' },
309
+ { name: 'font.mono', type: 'fontFamily', default: 'JetBrains Mono, Fira Code, monospace', description: 'Code and source display font stack.' },
310
+ { name: 'font.bodySize', type: 'dimension', default: '12px', unit: 'px', description: 'Dense body text size for operational panels.' },
311
+ ],
312
+ inputs: ['font.family', 'font.scale'],
313
+ outputs: ['typography.treeLabelSize', 'typography.listItemDescriptionSize', 'typography.listItemMetaSize', 'typography.iconFont'],
314
+ formula: 'Typography sizes use a compact fixed scale suitable for repeated operational UI work.',
315
+ derivations: [
316
+ { output: 'typography.treeLabelSize', inputs: ['font.bodySize'], expression: 'font.bodySize', description: 'Tree labels inherit the dense body size.' },
317
+ { output: 'typography.listItemDescriptionSize', inputs: ['font.bodySize'], expression: 'font.bodySize - 1px', description: 'Secondary descriptions step down one pixel from body text.' },
318
+ { output: 'typography.listItemMetaSize', inputs: ['font.bodySize'], expression: 'font.bodySize - 2px', description: 'Metadata text is two pixels below body text.' },
319
+ { output: 'typography.iconFont', inputs: ['font.icon'], expression: 'Material Symbols Outlined', description: 'Icon buttons use the shared Material Symbols font family.' },
320
+ ],
321
+ },
322
+ {
323
+ name: 'default-provider-motion-effects',
324
+ theme: 'default-provider',
325
+ kind: 'motion-effects',
326
+ description: 'Defines transition and shadow aliases for hover, active, focus, drag, and loading states.',
327
+ parameters: [
328
+ { name: 'motion.duration.fast', type: 'time', default: '120ms', description: 'Fast hover/focus response duration.' },
329
+ { name: 'motion.easing.standard', type: 'easing', default: 'ease', description: 'Default easing for small UI state changes.' },
330
+ { name: 'focus.alpha', type: 'alpha', default: '0.35', description: 'Focus ring strength derived from the primary accent.' },
331
+ ],
332
+ inputs: ['motion.duration.fast', 'motion.easing.standard', 'shadow.node'],
333
+ outputs: ['effect.hoverTransition', 'effect.focusRing', 'effect.dragShadow', 'effect.loadingPulse'],
334
+ formula: 'Interactive effects reuse fast duration and a single focus/accent ring family.',
335
+ derivations: [
336
+ { output: 'effect.hoverTransition', inputs: ['motion.duration.fast', 'motion.easing.standard'], expression: 'background-color duration.fast easing.standard, border-color duration.fast easing.standard', description: 'Hover transitions affect only inexpensive paint properties.' },
337
+ { output: 'effect.focusRing', inputs: ['color.accent', 'focus.alpha'], expression: '0 0 0 2px hsl(accent.h accent.s accent.l / focus.alpha)', description: 'Focus rings derive from the same primary accent as selected states.' },
338
+ { output: 'effect.loadingPulse', inputs: ['color.accent'], expression: 'linear-gradient(90deg, transparent, hsl(accent.h accent.s accent.l / 0.6), transparent)', description: 'Loading effects reuse accent color without new component-specific colors.' },
339
+ ],
340
+ },
341
+ {
342
+ name: 'default-provider-semantic-aliases',
343
+ theme: 'default-provider',
344
+ kind: 'semantic-alias',
345
+ description: 'Maps cascade outputs to semantic application aliases without component ownership.',
346
+ parameters: [
347
+ { name: 'semantic.scope', type: 'string', default: '--sn-*', description: 'Public CSS custom property namespace exposed by symbiote-node.' },
348
+ ],
349
+ inputs: ['color.*', 'size.*', 'radius.*', 'shadow.*', 'font.*'],
350
+ outputs: ['--sn-bg', '--sn-panel-bg', '--sn-node-bg', '--sn-node-border', '--sn-text', '--sn-text-dim', '--sn-success-bg', '--sn-success-border', '--sn-danger-bg', '--sn-danger-border'],
351
+ formula: 'Semantic aliases are CSS custom properties consumed through normal cascade inheritance.',
352
+ derivations: [
353
+ { output: '--sn-bg', inputs: ['color.background'], expression: 'color.background', description: 'Root background token.' },
354
+ { output: '--sn-panel-bg', inputs: ['color.surface'], expression: 'color.surface', description: 'Panel background token.' },
355
+ { output: '--sn-node-border', inputs: ['color.border'], expression: 'color.border', description: 'Default node and source border token.' },
356
+ { output: '--sn-node-selected', inputs: ['color.accent'], expression: 'color.accent', description: 'Selected and focus accent token.' },
357
+ { output: '--sn-text-dim', inputs: ['color.textDim'], expression: 'color.textDim', description: 'Muted readable text token.' },
358
+ { output: '--sn-success-bg', inputs: ['component.successBackground'], expression: 'color-mix(in srgb, var(--sn-success-color) 18%, transparent)', description: 'Positive status surfaces follow the success branch.' },
359
+ { output: '--sn-success-border', inputs: ['component.successBorder'], expression: 'color-mix(in srgb, var(--sn-success-color) 32%, transparent)', description: 'Positive status borders follow the success branch.' },
360
+ { output: '--sn-danger-bg', inputs: ['component.dangerBackground'], expression: 'color-mix(in srgb, var(--sn-danger-color) 18%, transparent)', description: 'Negative status surfaces follow the danger branch.' },
361
+ { output: '--sn-danger-border', inputs: ['component.dangerBorder'], expression: 'color-mix(in srgb, var(--sn-danger-color) 32%, transparent)', description: 'Negative status borders follow the danger branch.' },
362
+ ],
363
+ },
364
+ {
365
+ name: 'default-provider-component-aliases',
366
+ theme: 'default-provider',
367
+ kind: 'component-alias',
368
+ description: 'Maps semantic theme aliases to reusable Symbiote Node component surfaces.',
369
+ parameters: [
370
+ { name: 'component.scope', type: 'string', default: 'layout|surface|control|status|metric|tree|chat|tabs|source|list|loading', description: 'Component token domains served by the default provider theme.' },
371
+ ],
372
+ inputs: ['--sn-*'],
373
+ outputs: [
374
+ '--sn-layout-gap-bg',
375
+ '--sn-layout-border',
376
+ '--sn-card-bg',
377
+ '--sn-card-border',
378
+ '--sn-button-bg',
379
+ '--sn-button-border',
380
+ '--sn-button-primary-bg',
381
+ '--sn-field-control-bg',
382
+ '--sn-field-control-border',
383
+ '--sn-field-control-focus-border',
384
+ '--sn-field-control-subtle-border',
385
+ '--sn-field-select-indicator',
386
+ '--sn-field-toggle-bg',
387
+ '--sn-field-toggle-thumb-bg',
388
+ '--sn-field-toggle-thumb-active-bg',
389
+ '--sn-badge-bg',
390
+ '--sn-badge-border',
391
+ '--sn-badge-info-color',
392
+ '--sn-metric-border',
393
+ '--sn-metric-label-color',
394
+ '--sn-metric-value-color',
395
+ '--sn-metric-success-color',
396
+ '--sn-metric-warning-color',
397
+ '--sn-metric-error-color',
398
+ '--sn-data-table-bg',
399
+ '--sn-data-table-border',
400
+ '--sn-data-table-radius',
401
+ '--sn-data-table-color',
402
+ '--sn-data-table-header-bg',
403
+ '--sn-data-table-header-color',
404
+ '--sn-data-table-header-border',
405
+ '--sn-data-table-row-border',
406
+ '--sn-data-table-cell-padding',
407
+ '--sn-data-table-cell-size',
408
+ '--sn-data-table-empty-color',
409
+ '--sn-banner-bg',
410
+ '--sn-banner-border',
411
+ '--sn-banner-info-color',
412
+ '--sn-empty-state-color',
413
+ '--sn-empty-state-padding',
414
+ '--sn-tree-row-height',
415
+ '--sn-tree-panel-row-min-height',
416
+ '--sn-tree-row-selected-bg',
417
+ '--sn-composer-bg',
418
+ '--sn-chat-message-bg',
419
+ '--sn-chat-user-message-bg',
420
+ '--sn-chat-agent-message-bg',
421
+ '--sn-tabs-active-bg',
422
+ '--sn-source-header-bg',
423
+ '--sn-source-editor-bg',
424
+ '--sn-syntax-keyword',
425
+ '--sn-syntax-string',
426
+ '--sn-syntax-comment',
427
+ '--sn-syntax-function',
428
+ '--sn-syntax-property',
429
+ '--sn-diagnostic-error-bg',
430
+ '--sn-diagnostic-warning-bg',
431
+ '--sn-list-item-active-bg',
432
+ '--sn-list-detail-bg',
433
+ '--sn-list-detail-border',
434
+ '--sn-list-detail-radius',
435
+ '--sn-list-detail-sidebar-width',
436
+ '--sn-list-detail-sidebar-bg',
437
+ '--sn-list-detail-main-bg',
438
+ '--sn-list-detail-header-bg',
439
+ '--sn-list-detail-header-padding',
440
+ '--sn-list-detail-main-padding',
441
+ '--sn-list-detail-title-size',
442
+ '--sn-list-detail-title-color',
443
+ '--sn-success-bg-hover',
444
+ '--sn-success-border-hover',
445
+ '--sn-subgraph-bg',
446
+ '--sn-subgraph-bg-hover',
447
+ '--sn-subgraph-border',
448
+ '--sn-subgraph-border-hover',
449
+ '--sn-layout-preview-join-bg',
450
+ '--sn-layout-preview-join-border',
451
+ '--sn-layout-preview-line',
452
+ '--sn-layout-preview-line-shadow',
453
+ '--sn-xr-panel-bg',
454
+ '--sn-xr-panel-border',
455
+ '--sn-xr-panel-radius',
456
+ '--sn-xr-panel-shadow',
457
+ '--sn-xr-pointer-color',
458
+ ],
459
+ appliesTo: ['panel-layout', 'sn-card', 'sn-button', 'sn-field', 'sn-badge', 'sn-metric', 'sn-data-table', 'sn-banner', 'sn-empty-state', 'sn-tree-view', 'sn-tree-panel', 'chat-composer', 'chat-transcript', 'project-tabs', 'source-viewer', 'source-editor', 'sn-list-item', 'sn-list-detail-shell', 'sn-loading-overlay'],
460
+ formula: 'Component aliases bridge design tokens to component CSS without product-level style patches.',
461
+ derivations: [
462
+ { output: '--sn-layout-border', inputs: ['component.layoutBorder'], expression: 'transparent', description: 'Layout split gaps stay transparent without mutating the generic node border.' },
463
+ { output: '--sn-card-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Cards inherit the reusable node surface by default.' },
464
+ { output: '--sn-card-border', inputs: ['--sn-node-border'], expression: 'var(--sn-node-border)', description: 'Cards share the provider border color.' },
465
+ { output: '--sn-button-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Default action controls inherit the normal node surface.' },
466
+ { output: '--sn-button-primary-bg', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'Primary actions use the shared selected/accent color.' },
467
+ { output: '--sn-field-control-bg', inputs: ['--sn-bg'], expression: 'var(--sn-bg)', description: 'Form controls inherit the app background inside reusable fields.' },
468
+ { output: '--sn-field-control-focus-border', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'Field focus uses the shared selected/accent color.' },
469
+ { output: '--sn-field-control-subtle-border', inputs: ['color.text'], expression: 'hsl(text / faint alpha)', description: 'Inspector-local control borders use a provider-owned faint text divider.' },
470
+ { output: '--sn-field-toggle-bg', inputs: ['color.text'], expression: 'hsl(text / 0.1)', description: 'Toggle tracks derive from the faint text branch.' },
471
+ { output: '--sn-badge-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Badges inherit compact reusable node surfaces.' },
472
+ { output: '--sn-badge-info-color', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'Informational badges use the shared selected/accent color.' },
473
+ { output: '--sn-metric-border', inputs: ['--sn-node-hover'], expression: 'var(--sn-node-hover)', description: 'Metric dividers inherit the reusable low-contrast divider branch.' },
474
+ { output: '--sn-metric-label-color', inputs: ['--sn-text-dim'], expression: 'var(--sn-text-dim)', description: 'Metric labels inherit muted readable text.' },
475
+ { output: '--sn-metric-value-color', inputs: ['--sn-text'], expression: 'var(--sn-text)', description: 'Metric values inherit primary readable text.' },
476
+ { output: '--sn-metric-success-color', inputs: ['--sn-success-color'], expression: 'var(--sn-success-color)', description: 'Positive metric values follow the success branch.' },
477
+ { output: '--sn-metric-warning-color', inputs: ['--sn-warning-color'], expression: 'var(--sn-warning-color)', description: 'Warning metric values follow the warning branch.' },
478
+ { output: '--sn-metric-error-color', inputs: ['--sn-danger-color'], expression: 'var(--sn-danger-color)', description: 'Error metric values follow the danger branch.' },
479
+ { output: '--sn-data-table-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Data tables inherit the reusable node surface.' },
480
+ { output: '--sn-data-table-border', inputs: ['--sn-node-border'], expression: 'var(--sn-node-border)', description: 'Data table frames use the provider border.' },
481
+ { output: '--sn-data-table-header-bg', inputs: ['--sn-panel-bg'], expression: 'var(--sn-panel-bg)', description: 'Data table headers inherit panel surfaces.' },
482
+ { output: '--sn-data-table-row-border', inputs: ['--sn-node-hover'], expression: 'var(--sn-node-hover)', description: 'Data table row dividers use the low-contrast row branch.' },
483
+ { output: '--sn-data-table-empty-color', inputs: ['--sn-text-dim'], expression: 'var(--sn-text-dim)', description: 'Data table empty states inherit muted readable text.' },
484
+ { output: '--sn-banner-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Banners inherit the normal node surface for inline status feedback.' },
485
+ { output: '--sn-banner-info-color', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'Informational and running banners use the shared selected/accent color.' },
486
+ { output: '--sn-empty-state-color', inputs: ['--sn-text-dim'], expression: 'var(--sn-text-dim)', description: 'Empty states inherit muted readable text.' },
487
+ { output: '--sn-empty-state-padding', inputs: ['geometry.spacing'], expression: '20px', description: 'Empty states use the provider spacing scale for placeholder breathing room.' },
488
+ { output: '--sn-tree-row-selected-bg', inputs: ['--sn-accent-bg-subtle'], expression: 'var(--sn-accent-bg-subtle)', description: 'Tree selection uses the shared subtle accent surface.' },
489
+ { output: '--sn-tree-panel-row-min-height', inputs: ['--sn-tree-row-min-height'], expression: 'var(--sn-tree-row-min-height)', description: 'Tree panels inherit the tree row geometry unless a host specializes the panel.' },
490
+ { output: '--sn-list-detail-bg', inputs: ['--sn-panel-bg'], expression: 'var(--sn-panel-bg)', description: 'List/detail shells inherit the shared panel surface.' },
491
+ { output: '--sn-list-detail-border', inputs: ['--sn-node-border'], expression: 'var(--sn-node-border)', description: 'List/detail shell dividers follow the provider border.' },
492
+ { output: '--sn-success-bg-hover', inputs: ['component.successBackgroundHover'], expression: 'color-mix(in srgb, var(--sn-success-color) 28%, transparent)', description: 'Positive action hover backgrounds follow the success branch.' },
493
+ { output: '--sn-success-border-hover', inputs: ['component.successBorderHover'], expression: 'color-mix(in srgb, var(--sn-success-color) 52%, transparent)', description: 'Positive action hover borders follow the success branch.' },
494
+ { output: '--sn-subgraph-bg', inputs: ['component.subgraphBackground'], expression: 'var(--sn-subgraph-accent) gradient token', description: 'Subgraph action backgrounds are provider-owned gradient tokens.' },
495
+ { output: '--sn-subgraph-bg-hover', inputs: ['component.subgraphBackgroundHover'], expression: 'var(--sn-subgraph-accent) hover gradient token', description: 'Subgraph action hover backgrounds are provider-owned gradient tokens.' },
496
+ { output: '--sn-subgraph-border', inputs: ['component.subgraphBorder'], expression: 'color-mix(in srgb, var(--sn-subgraph-accent) 30%, transparent)', description: 'Subgraph action borders follow the data accent branch.' },
497
+ { output: '--sn-subgraph-border-hover', inputs: ['component.subgraphBorderHover'], expression: 'color-mix(in srgb, var(--sn-subgraph-accent) 50%, transparent)', description: 'Subgraph action hover borders follow the data accent branch.' },
498
+ { output: '--sn-layout-preview-join-bg', inputs: ['component.layoutPreviewJoinBackground'], expression: 'color-mix(in srgb, var(--sn-danger-color) 30%, transparent)', description: 'Layout join previews use a provider-owned danger overlay token.' },
499
+ { output: '--sn-layout-preview-line', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'Layout split preview lines follow the shared selected/accent color.' },
500
+ { output: '--sn-xr-panel-bg', inputs: ['--sn-panel-bg'], expression: 'var(--sn-panel-bg)', description: 'XR panel materials inherit provider panel surfaces.' },
501
+ { output: '--sn-xr-panel-border', inputs: ['--sn-node-border'], expression: 'var(--sn-node-border)', description: 'XR panel edges follow the shared provider border.' },
502
+ { output: '--sn-xr-panel-radius', inputs: ['--sn-node-radius'], expression: 'var(--sn-node-radius)', description: 'XR panel geometry follows the provider radius cascade.' },
503
+ { output: '--sn-xr-panel-shadow', inputs: ['--sn-node-shadow'], expression: 'var(--sn-node-shadow)', description: 'XR panel elevation follows the provider shadow cascade.' },
504
+ { output: '--sn-xr-pointer-color', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'XR pointer feedback follows the shared selected/accent color.' },
505
+ { output: '--sn-composer-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Chat composer inherits the normal node surface.' },
506
+ { output: '--sn-tabs-active-bg', inputs: ['--sn-node-bg'], expression: 'var(--sn-node-bg)', description: 'Active project tabs align with node surfaces.' },
507
+ { output: '--sn-tabs-accent', inputs: ['--sn-node-selected'], expression: 'var(--sn-node-selected)', description: 'Project tab icons inherit the shared selected/accent color unless the host supplies a semantic tab accent.' },
508
+ { output: '--sn-source-editor-bg', inputs: ['--sn-bg'], expression: 'var(--sn-bg)', description: 'Source editing uses the root background for code contrast.' },
509
+ { output: '--sn-syntax-keyword', inputs: ['syntax.keyword'], expression: 'hsl(var(--sn-hue-danger) var(--sn-sat-vivid) 82%)', description: 'Code keywords derive from the status hue cascade.' },
510
+ { output: '--sn-syntax-string', inputs: ['syntax.string'], expression: 'hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 65%)', description: 'Code strings derive from the warning hue cascade.' },
511
+ { output: '--sn-syntax-comment', inputs: ['--sn-text-dim'], expression: 'var(--sn-text-dim)', description: 'Code comments inherit muted text.' },
512
+ { output: '--sn-diagnostic-error-bg', inputs: ['--sn-danger-color'], expression: 'color-mix(in srgb, var(--sn-danger-color) 7%, transparent)', description: 'Diagnostic error backgrounds derive from danger color.' },
513
+ { output: '--sn-diagnostic-warning-bg', inputs: ['--sn-warning-color'], expression: 'color-mix(in srgb, var(--sn-warning-color) 5%, transparent)', description: 'Diagnostic warning backgrounds derive from warning color.' },
514
+ ],
515
+ },
516
+ ];
517
+
518
+ export let THEME_TOKENS = {
519
+ "default-provider": {
520
+ "name": "default-provider",
521
+ "extends": "../base.json",
522
+ "$description": "Cascadeable neutral provider default aligned with the current Agent Portal shell values. Runtime CSS variables derive neutral surfaces, accents, controls, geometry, motion, and elevation from native HSL controls and color-mix aliases.",
523
+ "$extensions": {
524
+ "symbioteNode": {
525
+ "role": "neutral-default",
526
+ "origin": "Agent Portal shell values generalized into provider-neutral Symbiote Node tokens.",
527
+ "cascade": "Apply once at :root, an app shell, or a subtree boundary; components inherit --sn-* tokens through the CSS cascade.",
528
+ "colorModel": [
529
+ "native-css-hsl",
530
+ "alpha-hsl",
531
+ "color-mix"
532
+ ],
533
+ "controlTokens": [
534
+ "--sn-theme-hue",
535
+ "--sn-theme-chroma",
536
+ "--sn-theme-bg-lightness",
537
+ "--sn-theme-surface-lightness",
538
+ "--sn-theme-text-lightness",
539
+ "--sn-theme-density",
540
+ "--sn-theme-radius-scale",
541
+ "--sn-theme-motion-scale",
542
+ "--sn-theme-elevation-scale"
543
+ ],
544
+ "geometryFamilies": [
545
+ "density",
546
+ "radius",
547
+ "layout",
548
+ "row",
549
+ "control",
550
+ "graph",
551
+ "chat",
552
+ "source",
553
+ "loading"
554
+ ]
555
+ }
556
+ },
557
+ "control": {
558
+ "hue": {
559
+ "$type": "number",
560
+ "$value": "218"
561
+ },
562
+ "chroma": {
563
+ "$type": "percentage",
564
+ "$value": "89%"
565
+ },
566
+ "backgroundLightness": {
567
+ "$type": "percentage",
568
+ "$value": "10%"
569
+ },
570
+ "surfaceLightness": {
571
+ "$type": "percentage",
572
+ "$value": "13%"
573
+ },
574
+ "textLightness": {
575
+ "$type": "percentage",
576
+ "$value": "94%"
577
+ },
578
+ "density": {
579
+ "$type": "number",
580
+ "$value": "1"
581
+ },
582
+ "radius": {
583
+ "$type": "number",
584
+ "$value": "1"
585
+ },
586
+ "motion": {
587
+ "$type": "number",
588
+ "$value": "1"
589
+ },
590
+ "elevation": {
591
+ "$type": "number",
592
+ "$value": "1"
593
+ }
594
+ },
595
+ "color": {
596
+ "background": {
597
+ "$type": "color",
598
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-bg))"
599
+ },
600
+ "surface": {
601
+ "$type": "color",
602
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-surface))"
603
+ },
604
+ "border": {
605
+ "$type": "color",
606
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.1)"
607
+ },
608
+ "text": {
609
+ "$type": "color",
610
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text))"
611
+ },
612
+ "textDim": {
613
+ "$type": "color",
614
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text-dim))"
615
+ },
616
+ "accent": {
617
+ "$type": "color",
618
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent))"
619
+ },
620
+ "success": {
621
+ "$type": "color",
622
+ "$value": "hsl(var(--sn-hue-success) var(--sn-sat-vivid) 57%)"
623
+ },
624
+ "warning": {
625
+ "$type": "color",
626
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 58%)"
627
+ },
628
+ "danger": {
629
+ "$type": "color",
630
+ "$value": "hsl(var(--sn-hue-danger) var(--sn-sat-vivid) 58%)"
631
+ },
632
+ "overlay": {
633
+ "$type": "color",
634
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) 0% / 0.45)"
635
+ },
636
+ "statusOkBg": {
637
+ "$type": "color",
638
+ "$value": "color-mix(in srgb, var(--sn-success-color) 12%, transparent)"
639
+ },
640
+ "statusErrorBg": {
641
+ "$type": "color",
642
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 12%, transparent)"
643
+ },
644
+ "messageEventBg": {
645
+ "$type": "color",
646
+ "$value": "color-mix(in srgb, var(--sn-cat-server) 10%, transparent)"
647
+ }
648
+ },
649
+ "component": {
650
+ "panelBackground": {
651
+ "$type": "color",
652
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-surface))"
653
+ },
654
+ "layoutGapBackground": {
655
+ "$type": "color",
656
+ "$value": "transparent"
657
+ },
658
+ "layoutBorder": {
659
+ "$type": "color",
660
+ "$value": "transparent"
661
+ },
662
+ "layoutResizerBackground": {
663
+ "$type": "color",
664
+ "$value": "transparent"
665
+ },
666
+ "layoutResizerHoverBackground": {
667
+ "$type": "color",
668
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.08)"
669
+ },
670
+ "layoutPreviewJoinBackground": {
671
+ "$type": "color",
672
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 30%, transparent)"
673
+ },
674
+ "layoutPreviewJoinBorder": {
675
+ "$type": "color",
676
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 60%, transparent)"
677
+ },
678
+ "layoutPreviewLine": {
679
+ "$type": "color",
680
+ "$value": "var(--sn-node-selected)"
681
+ },
682
+ "layoutPreviewLineShadow": {
683
+ "$type": "shadow",
684
+ "$value": "0 0 8px var(--sn-layout-preview-line)"
685
+ },
686
+ "xrPanelBackground": {
687
+ "$type": "color",
688
+ "$value": "var(--sn-panel-bg)"
689
+ },
690
+ "xrPanelBorder": {
691
+ "$type": "color",
692
+ "$value": "var(--sn-node-border)"
693
+ },
694
+ "xrPanelRadius": {
695
+ "$type": "dimension",
696
+ "$value": "var(--sn-node-radius)"
697
+ },
698
+ "xrPanelShadow": {
699
+ "$type": "shadow",
700
+ "$value": "var(--sn-node-shadow)"
701
+ },
702
+ "xrPointerColor": {
703
+ "$type": "color",
704
+ "$value": "var(--sn-node-selected)"
705
+ },
706
+ "nodeHover": {
707
+ "$type": "color",
708
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-hover))"
709
+ },
710
+ "accentBackground": {
711
+ "$type": "color",
712
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.12)"
713
+ },
714
+ "accentBackgroundSubtle": {
715
+ "$type": "color",
716
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.06)"
717
+ },
718
+ "accentBorder": {
719
+ "$type": "color",
720
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.2)"
721
+ },
722
+ "successBackground": {
723
+ "$type": "color",
724
+ "$value": "color-mix(in srgb, var(--sn-success-color) 18%, transparent)"
725
+ },
726
+ "successBorder": {
727
+ "$type": "color",
728
+ "$value": "color-mix(in srgb, var(--sn-success-color) 32%, transparent)"
729
+ },
730
+ "successBackgroundHover": {
731
+ "$type": "color",
732
+ "$value": "color-mix(in srgb, var(--sn-success-color) 28%, transparent)"
733
+ },
734
+ "successBorderHover": {
735
+ "$type": "color",
736
+ "$value": "color-mix(in srgb, var(--sn-success-color) 52%, transparent)"
737
+ },
738
+ "dangerBackground": {
739
+ "$type": "color",
740
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 18%, transparent)"
741
+ },
742
+ "dangerBorder": {
743
+ "$type": "color",
744
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 32%, transparent)"
745
+ },
746
+ "subgraphBackground": {
747
+ "$type": "gradient",
748
+ "$value": "linear-gradient(135deg, color-mix(in srgb, var(--sn-subgraph-accent) 12%, transparent) 0%, color-mix(in srgb, var(--sn-subgraph-accent) 8%, transparent) 100%)"
749
+ },
750
+ "subgraphBackgroundHover": {
751
+ "$type": "gradient",
752
+ "$value": "linear-gradient(135deg, color-mix(in srgb, var(--sn-subgraph-accent) 22%, transparent) 0%, color-mix(in srgb, var(--sn-subgraph-accent) 15%, transparent) 100%)"
753
+ },
754
+ "subgraphBorder": {
755
+ "$type": "color",
756
+ "$value": "color-mix(in srgb, var(--sn-subgraph-accent) 30%, transparent)"
757
+ },
758
+ "subgraphBorderHover": {
759
+ "$type": "color",
760
+ "$value": "color-mix(in srgb, var(--sn-subgraph-accent) 50%, transparent)"
761
+ },
762
+ "subgraphPreviewConnection": {
763
+ "$type": "color",
764
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.12)"
765
+ },
766
+ "subgraphPreviewCompletedConnection": {
767
+ "$type": "color",
768
+ "$value": "hsl(var(--sn-hue-success) var(--sn-sat-vivid) 57% / 0.5)"
769
+ },
770
+ "subgraphPreviewProcessingFill": {
771
+ "$type": "color",
772
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.25)"
773
+ },
774
+ "subgraphPreviewProcessingStroke": {
775
+ "$type": "color",
776
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.8)"
777
+ },
778
+ "subgraphPreviewProcessingGlow": {
779
+ "$type": "color",
780
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.6)"
781
+ },
782
+ "subgraphPreviewCompletedFill": {
783
+ "$type": "color",
784
+ "$value": "hsl(var(--sn-hue-success) var(--sn-sat-vivid) 57% / 0.2)"
785
+ },
786
+ "subgraphPreviewCompletedStroke": {
787
+ "$type": "color",
788
+ "$value": "hsl(var(--sn-hue-success) var(--sn-sat-vivid) 57% / 0.7)"
789
+ },
790
+ "subgraphPreviewIdleFill": {
791
+ "$type": "color",
792
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.08)"
793
+ },
794
+ "subgraphPreviewIdleStroke": {
795
+ "$type": "color",
796
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.2)"
797
+ },
798
+ "dialogBackground": {
799
+ "$type": "color",
800
+ "$value": "var(--sn-panel-bg)"
801
+ },
802
+ "dialogColor": {
803
+ "$type": "color",
804
+ "$value": "var(--sn-text)"
805
+ },
806
+ "dialogBorder": {
807
+ "$type": "color",
808
+ "$value": "var(--sn-node-border)"
809
+ },
810
+ "dialogBorderWidth": {
811
+ "$type": "dimension",
812
+ "$value": "1px"
813
+ },
814
+ "dialogRadius": {
815
+ "$type": "dimension",
816
+ "$value": "calc(8px * var(--sn-theme-radius-scale))"
817
+ },
818
+ "dialogShadow": {
819
+ "$type": "shadow",
820
+ "$value": "var(--sn-shadow-lg)"
821
+ },
822
+ "dialogBackdrop": {
823
+ "$type": "color",
824
+ "$value": "var(--sn-bg-overlay)"
825
+ },
826
+ "dialogBodyPadding": {
827
+ "$type": "dimension",
828
+ "$value": "calc(20px * var(--sn-theme-density))"
829
+ },
830
+ "dialogFontSize": {
831
+ "$type": "dimension",
832
+ "$value": "14px"
833
+ },
834
+ "dialogMinWidth": {
835
+ "$type": "dimension",
836
+ "$value": "250px"
837
+ },
838
+ "dialogMessageGap": {
839
+ "$type": "dimension",
840
+ "$value": "calc(20px * var(--sn-theme-density))"
841
+ },
842
+ "dialogPromptMessageGap": {
843
+ "$type": "dimension",
844
+ "$value": "calc(10px * var(--sn-theme-density))"
845
+ },
846
+ "dialogActionsGap": {
847
+ "$type": "dimension",
848
+ "$value": "calc(10px * var(--sn-theme-density))"
849
+ },
850
+ "dialogActionsMarginBlockStart": {
851
+ "$type": "dimension",
852
+ "$value": "calc(20px * var(--sn-theme-density))"
853
+ },
854
+ "fieldControlSubtleBorder": {
855
+ "$type": "color",
856
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / var(--sn-alpha-faint))"
857
+ },
858
+ "fieldSelectIndicator": {
859
+ "$type": "gradient",
860
+ "$value": "linear-gradient(45deg, transparent 50%, var(--sn-text-dim) 50%), linear-gradient(135deg, var(--sn-text-dim) 50%, transparent 50%)"
861
+ },
862
+ "fieldToggleBackground": {
863
+ "$type": "color",
864
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.1)"
865
+ },
866
+ "fieldToggleThumbBackground": {
867
+ "$type": "color",
868
+ "$value": "var(--sn-text-dim)"
869
+ },
870
+ "fieldToggleThumbActiveBackground": {
871
+ "$type": "color",
872
+ "$value": "var(--sn-text)"
873
+ },
874
+ "scrollbarThumb": {
875
+ "$type": "color",
876
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.08)"
877
+ },
878
+ "scrollbarThumbHover": {
879
+ "$type": "color",
880
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.25)"
881
+ },
882
+ "nodeActiveBorder": {
883
+ "$type": "color",
884
+ "$value": "color-mix(in srgb, var(--sn-node-selected) 50%, transparent)"
885
+ },
886
+ "connectionLinecap": {
887
+ "$type": "string",
888
+ "$value": "round"
889
+ },
890
+ "connectionLinejoin": {
891
+ "$type": "string",
892
+ "$value": "round"
893
+ },
894
+ "connectionDotFill": {
895
+ "$type": "color",
896
+ "$value": "var(--sn-conn-color)"
897
+ },
898
+ "connectionDotStroke": {
899
+ "$type": "color",
900
+ "$value": "var(--sn-node-bg)"
901
+ },
902
+ "dotOutput": {
903
+ "$type": "color",
904
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 63%)"
905
+ },
906
+ "dotInput": {
907
+ "$type": "color",
908
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) 63%)"
909
+ },
910
+ "dotExec": {
911
+ "$type": "color",
912
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 64%)"
913
+ },
914
+ "dotCtrl": {
915
+ "$type": "color",
916
+ "$value": "var(--sn-success-color)"
917
+ },
918
+ "outputPreviewBorder": {
919
+ "$type": "color",
920
+ "$value": "var(--sn-border)"
921
+ },
922
+ "outputPreviewBackground": {
923
+ "$type": "color",
924
+ "$value": "var(--sn-surface)"
925
+ },
926
+ "outputPreviewMuted": {
927
+ "$type": "color",
928
+ "$value": "var(--sn-text-dim)"
929
+ },
930
+ "outputPreviewTitle": {
931
+ "$type": "color",
932
+ "$value": "var(--sn-text)"
933
+ },
934
+ "outputPreviewLabel": {
935
+ "$type": "color",
936
+ "$value": "var(--sn-text)"
937
+ },
938
+ "outputPreviewGrid": {
939
+ "$type": "color",
940
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.04)"
941
+ },
942
+ "outputPreviewItemBorder": {
943
+ "$type": "color",
944
+ "$value": "var(--sn-border)"
945
+ },
946
+ "outputPreviewItemBackground": {
947
+ "$type": "color",
948
+ "$value": "var(--sn-node-bg)"
949
+ },
950
+ "outputPreviewEdgeBackground": {
951
+ "$type": "color",
952
+ "$value": "var(--sn-node-hover)"
953
+ },
954
+ "chatItemIconColor": {
955
+ "$type": "color",
956
+ "$value": "currentColor"
957
+ },
958
+ "chatItemChildShadow": {
959
+ "$type": "shadow",
960
+ "$value": "2px 0 4px color-mix(in srgb, var(--sn-bg) 70%, transparent)"
961
+ },
962
+ "listItemDisabledColor": {
963
+ "$type": "color",
964
+ "$value": "var(--sn-text-dim)"
965
+ },
966
+ "listItemIconColor": {
967
+ "$type": "color",
968
+ "$value": "var(--sn-text-dim)"
969
+ },
970
+ "listItemLabelColor": {
971
+ "$type": "color",
972
+ "$value": "var(--sn-text)"
973
+ },
974
+ "listItemDescriptionColor": {
975
+ "$type": "color",
976
+ "$value": "var(--sn-text-dim)"
977
+ },
978
+ "listItemMetaColor": {
979
+ "$type": "color",
980
+ "$value": "var(--sn-text-dim)"
981
+ },
982
+ "listDetailColor": {
983
+ "$type": "color",
984
+ "$value": "var(--sn-text)"
985
+ },
986
+ "listDetailIconColor": {
987
+ "$type": "color",
988
+ "$value": "var(--sn-text-dim)"
989
+ },
990
+ "listDetailTitleColor": {
991
+ "$type": "color",
992
+ "$value": "var(--sn-text)"
993
+ },
994
+ "listDetailDescriptionColor": {
995
+ "$type": "color",
996
+ "$value": "var(--sn-text-dim)"
997
+ },
998
+ "sourceEditorPlaceholderColor": {
999
+ "$type": "color",
1000
+ "$value": "var(--sn-text-dim)"
1001
+ },
1002
+ "metricGap": {
1003
+ "$type": "dimension",
1004
+ "$value": "12px"
1005
+ },
1006
+ "metricPadding": {
1007
+ "$type": "dimension",
1008
+ "$value": "5px 0"
1009
+ },
1010
+ "metricBorder": {
1011
+ "$type": "color",
1012
+ "$value": "var(--sn-node-hover)"
1013
+ },
1014
+ "metricColor": {
1015
+ "$type": "color",
1016
+ "$value": "var(--sn-text)"
1017
+ },
1018
+ "metricLabelColor": {
1019
+ "$type": "color",
1020
+ "$value": "var(--sn-text-dim)"
1021
+ },
1022
+ "metricLabelSize": {
1023
+ "$type": "dimension",
1024
+ "$value": "12px"
1025
+ },
1026
+ "metricValueColor": {
1027
+ "$type": "color",
1028
+ "$value": "var(--sn-text)"
1029
+ },
1030
+ "metricValueSize": {
1031
+ "$type": "dimension",
1032
+ "$value": "12px"
1033
+ },
1034
+ "metricValueWeight": {
1035
+ "$type": "number",
1036
+ "$value": "600"
1037
+ },
1038
+ "metricValueFont": {
1039
+ "$type": "fontFamily",
1040
+ "$value": "var(--sn-font-mono)"
1041
+ },
1042
+ "metricSuccessColor": {
1043
+ "$type": "color",
1044
+ "$value": "var(--sn-success-color)"
1045
+ },
1046
+ "metricWarningColor": {
1047
+ "$type": "color",
1048
+ "$value": "var(--sn-warning-color)"
1049
+ },
1050
+ "metricErrorColor": {
1051
+ "$type": "color",
1052
+ "$value": "var(--sn-danger-color)"
1053
+ },
1054
+ "dataTableBackground": {
1055
+ "$type": "color",
1056
+ "$value": "var(--sn-node-bg)"
1057
+ },
1058
+ "dataTableBorder": {
1059
+ "$type": "color",
1060
+ "$value": "var(--sn-node-border)"
1061
+ },
1062
+ "dataTableRadius": {
1063
+ "$type": "dimension",
1064
+ "$value": "calc(8px * var(--sn-theme-radius-scale))"
1065
+ },
1066
+ "dataTableColor": {
1067
+ "$type": "color",
1068
+ "$value": "var(--sn-text)"
1069
+ },
1070
+ "dataTableHeaderBackground": {
1071
+ "$type": "color",
1072
+ "$value": "var(--sn-panel-bg)"
1073
+ },
1074
+ "dataTableHeaderColor": {
1075
+ "$type": "color",
1076
+ "$value": "var(--sn-text-dim)"
1077
+ },
1078
+ "dataTableHeaderBorder": {
1079
+ "$type": "color",
1080
+ "$value": "var(--sn-node-border)"
1081
+ },
1082
+ "dataTableHeaderSize": {
1083
+ "$type": "dimension",
1084
+ "$value": "11px"
1085
+ },
1086
+ "dataTableHeaderWeight": {
1087
+ "$type": "number",
1088
+ "$value": "500"
1089
+ },
1090
+ "dataTableHeaderTransform": {
1091
+ "$type": "string",
1092
+ "$value": "uppercase"
1093
+ },
1094
+ "dataTableRowBorder": {
1095
+ "$type": "color",
1096
+ "$value": "var(--sn-node-hover)"
1097
+ },
1098
+ "dataTableCellPadding": {
1099
+ "$type": "dimension",
1100
+ "$value": "12px 15px"
1101
+ },
1102
+ "dataTableCellSize": {
1103
+ "$type": "dimension",
1104
+ "$value": "13px"
1105
+ },
1106
+ "dataTableCellGap": {
1107
+ "$type": "dimension",
1108
+ "$value": "10px"
1109
+ },
1110
+ "dataTableLineHeight": {
1111
+ "$type": "number",
1112
+ "$value": "1.4"
1113
+ },
1114
+ "dataTableMinWidth": {
1115
+ "$type": "dimension",
1116
+ "$value": "0"
1117
+ },
1118
+ "dataTableMarkerSize": {
1119
+ "$type": "dimension",
1120
+ "$value": "12px"
1121
+ },
1122
+ "dataTableMarkerRadius": {
1123
+ "$type": "dimension",
1124
+ "$value": "50%"
1125
+ },
1126
+ "dataTableEmptyPadding": {
1127
+ "$type": "dimension",
1128
+ "$value": "12px 15px"
1129
+ },
1130
+ "dataTableEmptyColor": {
1131
+ "$type": "color",
1132
+ "$value": "var(--sn-text-dim)"
1133
+ }
1134
+ },
1135
+ "geometry": {
1136
+ "layoutResizerSize": {
1137
+ "$type": "dimension",
1138
+ "$value": "6px"
1139
+ },
1140
+ "treeGap": {
1141
+ "$type": "dimension",
1142
+ "$value": "4px"
1143
+ },
1144
+ "treeIndent": {
1145
+ "$type": "dimension",
1146
+ "$value": "16px"
1147
+ },
1148
+ "treeRowHeight": {
1149
+ "$type": "dimension",
1150
+ "$value": "22px"
1151
+ },
1152
+ "treeRowPaddingBlock": {
1153
+ "$type": "dimension",
1154
+ "$value": "2px"
1155
+ },
1156
+ "treeRowRadius": {
1157
+ "$type": "dimension",
1158
+ "$value": "4px"
1159
+ },
1160
+ "treeIconSize": {
1161
+ "$type": "dimension",
1162
+ "$value": "15px"
1163
+ },
1164
+ "treeBadgeRadius": {
1165
+ "$type": "dimension",
1166
+ "$value": "8px"
1167
+ },
1168
+ "listItemRadius": {
1169
+ "$type": "dimension",
1170
+ "$value": "4px"
1171
+ },
1172
+ "listItemGap": {
1173
+ "$type": "dimension",
1174
+ "$value": "10px"
1175
+ },
1176
+ "listItemMinHeight": {
1177
+ "$type": "dimension",
1178
+ "$value": "34px"
1179
+ },
1180
+ "tabsHeight": {
1181
+ "$type": "dimension",
1182
+ "$value": "38px"
1183
+ },
1184
+ "tabsItemHeight": {
1185
+ "$type": "dimension",
1186
+ "$value": "32px"
1187
+ },
1188
+ "composerRadius": {
1189
+ "$type": "dimension",
1190
+ "$value": "20px"
1191
+ },
1192
+ "composerControlGap": {
1193
+ "$type": "dimension",
1194
+ "$value": "8px"
1195
+ },
1196
+ "composerInputMinHeight": {
1197
+ "$type": "dimension",
1198
+ "$value": "20px"
1199
+ },
1200
+ "chatGap": {
1201
+ "$type": "dimension",
1202
+ "$value": "8px"
1203
+ },
1204
+ "chatMetaIconSize": {
1205
+ "$type": "dimension",
1206
+ "$value": "12px"
1207
+ },
1208
+ "chatStatusIconSize": {
1209
+ "$type": "dimension",
1210
+ "$value": "12px"
1211
+ },
1212
+ "chatToolIconSize": {
1213
+ "$type": "dimension",
1214
+ "$value": "14px"
1215
+ },
1216
+ "chatSummaryIconSize": {
1217
+ "$type": "dimension",
1218
+ "$value": "16px"
1219
+ },
1220
+ "sourceActionRadius": {
1221
+ "$type": "dimension",
1222
+ "$value": "4px"
1223
+ },
1224
+ "sourceEditorFontSize": {
1225
+ "$type": "dimension",
1226
+ "$value": "12px"
1227
+ },
1228
+ "loadingOverlayGap": {
1229
+ "$type": "dimension",
1230
+ "$value": "16px"
1231
+ },
1232
+ "loadingOverlayZ": {
1233
+ "$type": "number",
1234
+ "$value": "500"
1235
+ },
1236
+ "overlayZBase": {
1237
+ "$type": "number",
1238
+ "$value": "20000"
1239
+ },
1240
+ "toolbarOcclusionBackground": {
1241
+ "$type": "color",
1242
+ "$value": "var(--sn-panel-bg)"
1243
+ },
1244
+ "loadingLabelSize": {
1245
+ "$type": "dimension",
1246
+ "$value": "11px"
1247
+ },
1248
+ "loadingPhaseSize": {
1249
+ "$type": "dimension",
1250
+ "$value": "10px"
1251
+ },
1252
+ "loadingTrackWidth": {
1253
+ "$type": "dimension",
1254
+ "$value": "200px"
1255
+ },
1256
+ "loadingTrackHeight": {
1257
+ "$type": "dimension",
1258
+ "$value": "2px"
1259
+ },
1260
+ "loadingTrackRadius": {
1261
+ "$type": "dimension",
1262
+ "$value": "2px"
1263
+ },
1264
+ "loadingSubSize": {
1265
+ "$type": "dimension",
1266
+ "$value": "9px"
1267
+ },
1268
+ "nodeMinWidth": {
1269
+ "$type": "dimension",
1270
+ "$value": "180px"
1271
+ },
1272
+ "nodeMaxWidth": {
1273
+ "$type": "dimension",
1274
+ "$value": "280px"
1275
+ },
1276
+ "nodeBorderWidth": {
1277
+ "$type": "dimension",
1278
+ "$value": "2px"
1279
+ },
1280
+ "nodeFontSize": {
1281
+ "$type": "dimension",
1282
+ "$value": "13px"
1283
+ },
1284
+ "connectionDotStrokeWidth": {
1285
+ "$type": "dimension",
1286
+ "$value": "var(--sn-socket-border-width)"
1287
+ },
1288
+ "connectionDotRadius": {
1289
+ "$type": "dimension",
1290
+ "$value": "calc((var(--sn-socket-size) + var(--sn-conn-dot-stroke-width)) / 2)"
1291
+ },
1292
+ "graphExplorerOverlayZ": {
1293
+ "$type": "number",
1294
+ "$value": "100"
1295
+ },
1296
+ "graphExplorerToolbarTop": {
1297
+ "$type": "dimension",
1298
+ "$value": "8px"
1299
+ },
1300
+ "graphExplorerToolbarRight": {
1301
+ "$type": "dimension",
1302
+ "$value": "8px"
1303
+ },
1304
+ "graphExplorerToolbarGap": {
1305
+ "$type": "dimension",
1306
+ "$value": "6px"
1307
+ },
1308
+ "graphExplorerToolbarZ": {
1309
+ "$type": "number",
1310
+ "$value": "200"
1311
+ },
1312
+ "graphExplorerStatsBottom": {
1313
+ "$type": "dimension",
1314
+ "$value": "8px"
1315
+ },
1316
+ "graphExplorerStatsLeft": {
1317
+ "$type": "dimension",
1318
+ "$value": "8px"
1319
+ },
1320
+ "graphExplorerStatsZ": {
1321
+ "$type": "number",
1322
+ "$value": "10"
1323
+ },
1324
+ "graphTypeAction": {
1325
+ "$type": "color",
1326
+ "$value": "hsl(var(--sn-hue-danger) var(--sn-sat-vivid) 78%)"
1327
+ },
1328
+ "graphTypeOutput": {
1329
+ "$type": "color",
1330
+ "$value": "hsl(var(--sn-hue-success) var(--sn-sat-vivid) 65%)"
1331
+ },
1332
+ "graphTypeData": {
1333
+ "$type": "color",
1334
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) 74%)"
1335
+ },
1336
+ "graphTypeConfig": {
1337
+ "$type": "color",
1338
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 68%)"
1339
+ },
1340
+ "graphTypeExternal": {
1341
+ "$type": "color",
1342
+ "$value": "hsl(var(--sn-hue-data) var(--sn-sat-vivid) 76%)"
1343
+ },
1344
+ "graphTypeStyle": {
1345
+ "$type": "color",
1346
+ "$value": "hsl(calc(var(--sn-hue-danger) + 315) var(--sn-sat-vivid) 78%)"
1347
+ },
1348
+ "graphTypeDocs": {
1349
+ "$type": "color",
1350
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) 81%)"
1351
+ },
1352
+ "graphTypeAsset": {
1353
+ "$type": "color",
1354
+ "$value": "hsl(calc(var(--sn-hue-accent) - 40) var(--sn-sat-vivid) 74%)"
1355
+ },
1356
+ "graphTypeGroup": {
1357
+ "$type": "color",
1358
+ "$value": "hsl(calc(var(--sn-hue-warning) + 8) var(--sn-sat-vivid) 67%)"
1359
+ },
1360
+ "graphCluster0": {
1361
+ "$type": "color",
1362
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) 74%)"
1363
+ },
1364
+ "graphCluster1": {
1365
+ "$type": "color",
1366
+ "$value": "hsl(var(--sn-hue-success) var(--sn-sat-vivid) 66%)"
1367
+ },
1368
+ "graphCluster2": {
1369
+ "$type": "color",
1370
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 68%)"
1371
+ },
1372
+ "graphCluster3": {
1373
+ "$type": "color",
1374
+ "$value": "hsl(var(--sn-hue-danger) var(--sn-sat-vivid) 74%)"
1375
+ },
1376
+ "graphCluster4": {
1377
+ "$type": "color",
1378
+ "$value": "hsl(var(--sn-hue-data) var(--sn-sat-vivid) 76%)"
1379
+ },
1380
+ "graphCluster5": {
1381
+ "$type": "color",
1382
+ "$value": "hsl(calc(var(--sn-hue-accent) - 40) var(--sn-sat-vivid) 72%)"
1383
+ },
1384
+ "graphCluster6": {
1385
+ "$type": "color",
1386
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) 82%)"
1387
+ },
1388
+ "minimapBg": {
1389
+ "$type": "color",
1390
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-bg) / 0.85)"
1391
+ },
1392
+ "minimapNode": {
1393
+ "$type": "color",
1394
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.6)"
1395
+ },
1396
+ "minimapNodeStroke": {
1397
+ "$type": "color",
1398
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.3)"
1399
+ },
1400
+ "minimapBypassedNode": {
1401
+ "$type": "color",
1402
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text-dim) / 0.5)"
1403
+ },
1404
+ "minimapViewport": {
1405
+ "$type": "color",
1406
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.6)"
1407
+ },
1408
+ "minimapViewportFill": {
1409
+ "$type": "color",
1410
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.04)"
1411
+ },
1412
+ "treeBadgeMaxWidth": {
1413
+ "$type": "dimension",
1414
+ "$value": "88px"
1415
+ },
1416
+ "treeKindMaxWidth": {
1417
+ "$type": "dimension",
1418
+ "$value": "120px"
1419
+ },
1420
+ "treeKindSize": {
1421
+ "$type": "dimension",
1422
+ "$value": "10px"
1423
+ },
1424
+ "nodeErrorFrameOffset": {
1425
+ "$type": "dimension",
1426
+ "$value": "10px"
1427
+ },
1428
+ "nodeErrorFrameMinWidth": {
1429
+ "$type": "dimension",
1430
+ "$value": "140px"
1431
+ },
1432
+ "nodeErrorFrameMaxWidth": {
1433
+ "$type": "dimension",
1434
+ "$value": "320px"
1435
+ },
1436
+ "nodeErrorFrameBorderWidth": {
1437
+ "$type": "dimension",
1438
+ "$value": "2px"
1439
+ },
1440
+ "nodeErrorFrameRadius": {
1441
+ "$type": "dimension",
1442
+ "$value": "calc(12px * var(--sn-theme-radius-scale))"
1443
+ },
1444
+ "tabsCornerSize": {
1445
+ "$type": "dimension",
1446
+ "$value": "12px"
1447
+ },
1448
+ "tabsCornerCut": {
1449
+ "$type": "dimension",
1450
+ "$value": "11.5px"
1451
+ },
1452
+ "treeToggleWidth": {
1453
+ "$type": "dimension",
1454
+ "$value": "18px"
1455
+ },
1456
+ "treeIconWidth": {
1457
+ "$type": "dimension",
1458
+ "$value": "18px"
1459
+ },
1460
+ "composerSendSize": {
1461
+ "$type": "dimension",
1462
+ "$value": "32px"
1463
+ },
1464
+ "composerSendIconSize": {
1465
+ "$type": "dimension",
1466
+ "$value": "18px"
1467
+ },
1468
+ "composerCollapsedControlWidth": {
1469
+ "$type": "dimension",
1470
+ "$value": "10px"
1471
+ },
1472
+ "composerCollapsedControlPadding": {
1473
+ "$type": "dimension",
1474
+ "$value": "10px"
1475
+ },
1476
+ "sidebarWidth": {
1477
+ "$type": "dimension",
1478
+ "$value": "220px"
1479
+ },
1480
+ "sidebarCollapsedWidth": {
1481
+ "$type": "dimension",
1482
+ "$value": "48px"
1483
+ },
1484
+ "sidebarResizeWidth": {
1485
+ "$type": "dimension",
1486
+ "$value": "5px"
1487
+ },
1488
+ "sidebarResizeOffset": {
1489
+ "$type": "dimension",
1490
+ "$value": "2px"
1491
+ },
1492
+ "outputPreviewGap": {
1493
+ "$type": "dimension",
1494
+ "$value": "8px"
1495
+ },
1496
+ "outputPreviewPadding": {
1497
+ "$type": "dimension",
1498
+ "$value": "10px"
1499
+ },
1500
+ "outputPreviewRadius": {
1501
+ "$type": "dimension",
1502
+ "$value": "calc(6px * var(--sn-theme-radius-scale))"
1503
+ },
1504
+ "outputPreviewCanvasRadius": {
1505
+ "$type": "dimension",
1506
+ "$value": "calc(5px * var(--sn-theme-radius-scale))"
1507
+ },
1508
+ "outputPreviewItemRadius": {
1509
+ "$type": "dimension",
1510
+ "$value": "calc(5px * var(--sn-theme-radius-scale))"
1511
+ },
1512
+ "chatLiveIconSize": {
1513
+ "$type": "dimension",
1514
+ "$value": "14px"
1515
+ },
1516
+ "treePanelTitleGap": {
1517
+ "$type": "dimension",
1518
+ "$value": "5px"
1519
+ },
1520
+ "treePanelTitlePadding": {
1521
+ "$type": "dimension",
1522
+ "$value": "6px 8px"
1523
+ },
1524
+ "treePanelTitleSize": {
1525
+ "$type": "dimension",
1526
+ "$value": "11px"
1527
+ },
1528
+ "treePanelIconSize": {
1529
+ "$type": "dimension",
1530
+ "$value": "14px"
1531
+ },
1532
+ "treePanelInputPadding": {
1533
+ "$type": "dimension",
1534
+ "$value": "4px 8px"
1535
+ },
1536
+ "treePanelInputRadius": {
1537
+ "$type": "dimension",
1538
+ "$value": "calc(4px * var(--sn-theme-radius-scale))"
1539
+ },
1540
+ "treePanelInputSize": {
1541
+ "$type": "dimension",
1542
+ "$value": "11px"
1543
+ },
1544
+ "treePanelCollapsePadding": {
1545
+ "$type": "dimension",
1546
+ "$value": "0 6px"
1547
+ },
1548
+ "treePanelContentPadding": {
1549
+ "$type": "dimension",
1550
+ "$value": "4px"
1551
+ },
1552
+ "treePanelPlaceholderPadding": {
1553
+ "$type": "dimension",
1554
+ "$value": "8px"
1555
+ },
1556
+ "treePanelPlaceholderSize": {
1557
+ "$type": "dimension",
1558
+ "$value": "12px"
1559
+ },
1560
+ "listItemIconSize": {
1561
+ "$type": "dimension",
1562
+ "$value": "18px"
1563
+ },
1564
+ "listItemIconFontSize": {
1565
+ "$type": "dimension",
1566
+ "$value": "16px"
1567
+ },
1568
+ "listItemLabelWeight": {
1569
+ "$type": "number",
1570
+ "$value": "500"
1571
+ },
1572
+ "listItemMetaMaxWidth": {
1573
+ "$type": "dimension",
1574
+ "$value": "38%"
1575
+ },
1576
+ "listDetailMinHeight": {
1577
+ "$type": "dimension",
1578
+ "$value": "0"
1579
+ },
1580
+ "listDetailHeight": {
1581
+ "$type": "dimension",
1582
+ "$value": "100%"
1583
+ },
1584
+ "listDetailHeaderGap": {
1585
+ "$type": "dimension",
1586
+ "$value": "8px"
1587
+ },
1588
+ "listDetailHeaderMinHeight": {
1589
+ "$type": "dimension",
1590
+ "$value": "42px"
1591
+ },
1592
+ "listDetailIconSize": {
1593
+ "$type": "dimension",
1594
+ "$value": "18px"
1595
+ },
1596
+ "listDetailListPadding": {
1597
+ "$type": "dimension",
1598
+ "$value": "8px"
1599
+ },
1600
+ "listDetailEmptyPadding": {
1601
+ "$type": "dimension",
1602
+ "$value": "12px"
1603
+ },
1604
+ "listDetailTitleWeight": {
1605
+ "$type": "number",
1606
+ "$value": "600"
1607
+ },
1608
+ "listDetailTitleTransform": {
1609
+ "$type": "string",
1610
+ "$value": "uppercase"
1611
+ },
1612
+ "listDetailDescriptionSize": {
1613
+ "$type": "dimension",
1614
+ "$value": "11px"
1615
+ },
1616
+ "sourceEditorTabSize": {
1617
+ "$type": "number",
1618
+ "$value": "2"
1619
+ }
1620
+ },
1621
+ "typography": {
1622
+ "fontUi": {
1623
+ "$type": "fontFamily",
1624
+ "$value": "var(--sn-font)"
1625
+ },
1626
+ "fontMono": {
1627
+ "$type": "fontFamily",
1628
+ "$value": "'JetBrains Mono', 'Fira Code', monospace"
1629
+ },
1630
+ "iconFont": {
1631
+ "$type": "fontFamily",
1632
+ "$value": "'Material Symbols Outlined'"
1633
+ },
1634
+ "treeLabelSize": {
1635
+ "$type": "dimension",
1636
+ "$value": "12px"
1637
+ },
1638
+ "treeBadgeSize": {
1639
+ "$type": "dimension",
1640
+ "$value": "10px"
1641
+ },
1642
+ "listItemLabelSize": {
1643
+ "$type": "dimension",
1644
+ "$value": "12px"
1645
+ },
1646
+ "listItemDescriptionSize": {
1647
+ "$type": "dimension",
1648
+ "$value": "11px"
1649
+ },
1650
+ "listItemMetaSize": {
1651
+ "$type": "dimension",
1652
+ "$value": "10px"
1653
+ }
1654
+ },
1655
+ "alias": {
1656
+ "layoutGapBackground": {
1657
+ "$type": "color",
1658
+ "$value": "var(--sn-layout-gap-bg)"
1659
+ },
1660
+ "layoutBorder": {
1661
+ "$type": "color",
1662
+ "$value": "var(--sn-layout-border)"
1663
+ },
1664
+ "treeRowSelectedBackground": {
1665
+ "$type": "color",
1666
+ "$value": "var(--sn-accent-bg-subtle)"
1667
+ },
1668
+ "treeRowSelectedBorder": {
1669
+ "$type": "color",
1670
+ "$value": "transparent"
1671
+ },
1672
+ "listItemActiveBackground": {
1673
+ "$type": "color",
1674
+ "$value": "var(--sn-accent-bg-subtle)"
1675
+ },
1676
+ "listDetailBackground": {
1677
+ "$type": "color",
1678
+ "$value": "var(--sn-panel-bg)"
1679
+ },
1680
+ "listDetailBorder": {
1681
+ "$type": "color",
1682
+ "$value": "var(--sn-node-border)"
1683
+ },
1684
+ "listDetailRadius": {
1685
+ "$type": "dimension",
1686
+ "$value": "var(--sn-card-radius)"
1687
+ },
1688
+ "listDetailSidebarWidth": {
1689
+ "$type": "dimension",
1690
+ "$value": "minmax(220px, 30%)"
1691
+ },
1692
+ "listDetailSidebarBackground": {
1693
+ "$type": "color",
1694
+ "$value": "var(--sn-node-bg)"
1695
+ },
1696
+ "listDetailMainBackground": {
1697
+ "$type": "color",
1698
+ "$value": "transparent"
1699
+ },
1700
+ "listDetailHeaderBackground": {
1701
+ "$type": "color",
1702
+ "$value": "transparent"
1703
+ },
1704
+ "listDetailHeaderPadding": {
1705
+ "$type": "dimension",
1706
+ "$value": "10px 12px"
1707
+ },
1708
+ "listDetailMainPadding": {
1709
+ "$type": "dimension",
1710
+ "$value": "12px"
1711
+ },
1712
+ "listDetailTitleSize": {
1713
+ "$type": "dimension",
1714
+ "$value": "12px"
1715
+ },
1716
+ "listDetailTitleColor": {
1717
+ "$type": "color",
1718
+ "$value": "var(--sn-text)"
1719
+ },
1720
+ "composerBackground": {
1721
+ "$type": "color",
1722
+ "$value": "var(--sn-node-bg)"
1723
+ },
1724
+ "composerActionBackground": {
1725
+ "$type": "color",
1726
+ "$value": "var(--sn-node-hover)"
1727
+ },
1728
+ "tabsBackground": {
1729
+ "$type": "color",
1730
+ "$value": "transparent"
1731
+ },
1732
+ "tabsActiveBackground": {
1733
+ "$type": "color",
1734
+ "$value": "var(--sn-node-bg)"
1735
+ },
1736
+ "tabsAccent": {
1737
+ "$type": "color",
1738
+ "$value": "var(--sn-node-selected)"
1739
+ },
1740
+ "sourceBackground": {
1741
+ "$type": "color",
1742
+ "$value": "var(--sn-bg)"
1743
+ },
1744
+ "sourceHeaderBackground": {
1745
+ "$type": "color",
1746
+ "$value": "var(--sn-node-header-bg)"
1747
+ },
1748
+ "sourceEditorBackground": {
1749
+ "$type": "color",
1750
+ "$value": "var(--sn-bg)"
1751
+ },
1752
+ "loadingBackground": {
1753
+ "$type": "color",
1754
+ "$value": "var(--sn-bg)"
1755
+ },
1756
+ "loadingLabelColor": {
1757
+ "$type": "color",
1758
+ "$value": "var(--sn-text-dim)"
1759
+ },
1760
+ "loadingPhaseColor": {
1761
+ "$type": "color",
1762
+ "$value": "var(--sn-node-selected)"
1763
+ },
1764
+ "loadingTrackBg": {
1765
+ "$type": "color",
1766
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.08)"
1767
+ },
1768
+ "loadingBarBg": {
1769
+ "$type": "color",
1770
+ "$value": "var(--sn-node-selected)"
1771
+ },
1772
+ "loadingBarShadow": {
1773
+ "$type": "shadow",
1774
+ "$value": "0 0 8px color-mix(in srgb, var(--sn-node-selected) 45%, transparent)"
1775
+ },
1776
+ "loadingSubColor": {
1777
+ "$type": "color",
1778
+ "$value": "var(--sn-text-dim)"
1779
+ },
1780
+ "categoryDirectory": {
1781
+ "$type": "color",
1782
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 60%)"
1783
+ },
1784
+ "categoryFile": {
1785
+ "$type": "color",
1786
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) 66%)"
1787
+ },
1788
+ "categoryFunction": {
1789
+ "$type": "color",
1790
+ "$value": "var(--sn-success-color)"
1791
+ },
1792
+ "categoryClass": {
1793
+ "$type": "color",
1794
+ "$value": "hsl(var(--sn-hue-data) var(--sn-sat-vivid) 72%)"
1795
+ },
1796
+ "categoryModule": {
1797
+ "$type": "color",
1798
+ "$value": "hsl(var(--sn-hue-danger) var(--sn-sat-vivid) 70%)"
1799
+ },
1800
+ "typeDefault": {
1801
+ "$type": "color",
1802
+ "$value": "var(--sn-node-category-accent)"
1803
+ },
1804
+ "typeProfile": {
1805
+ "$type": "color",
1806
+ "$value": "hsl(var(--sn-hue-data) var(--sn-sat-vivid) 58%)"
1807
+ },
1808
+ "typeProfileInfo": {
1809
+ "$type": "color",
1810
+ "$value": "var(--sn-success-color)"
1811
+ },
1812
+ "typePortal": {
1813
+ "$type": "color",
1814
+ "$value": "var(--sn-cat-control)"
1815
+ },
1816
+ "typeProject": {
1817
+ "$type": "color",
1818
+ "$value": "hsl(24 var(--sn-sat-vivid) 62%)"
1819
+ },
1820
+ "accentWarning": {
1821
+ "$type": "color",
1822
+ "$value": "var(--sn-warning-color)"
1823
+ },
1824
+ "statusOkBg": {
1825
+ "$type": "color",
1826
+ "$value": "{color.statusOkBg}"
1827
+ },
1828
+ "statusErrorBg": {
1829
+ "$type": "color",
1830
+ "$value": "{color.statusErrorBg}"
1831
+ },
1832
+ "messageEventBg": {
1833
+ "$type": "color",
1834
+ "$value": "{color.messageEventBg}"
1835
+ }
1836
+ },
1837
+ "provider": {
1838
+ "rndPro": {
1839
+ "color": {
1840
+ "$type": "color",
1841
+ "$value": "var(--sn-cat-data)"
1842
+ },
1843
+ "background": {
1844
+ "$type": "color",
1845
+ "$value": "color-mix(in srgb, var(--sn-provider-rnd-pro-color) 20%, transparent)"
1846
+ }
1847
+ },
1848
+ "official": {
1849
+ "color": {
1850
+ "$type": "color",
1851
+ "$value": "var(--sn-node-selected)"
1852
+ },
1853
+ "background": {
1854
+ "$type": "color",
1855
+ "$value": "color-mix(in srgb, var(--sn-provider-official-color) 20%, transparent)"
1856
+ }
1857
+ },
1858
+ "google": {
1859
+ "color": {
1860
+ "$type": "color",
1861
+ "$value": "var(--sn-success-color)"
1862
+ },
1863
+ "background": {
1864
+ "$type": "color",
1865
+ "$value": "color-mix(in srgb, var(--sn-provider-google-color) 20%, transparent)"
1866
+ }
1867
+ },
1868
+ "community": {
1869
+ "color": {
1870
+ "$type": "color",
1871
+ "$value": "var(--sn-warning-color)"
1872
+ },
1873
+ "background": {
1874
+ "$type": "color",
1875
+ "$value": "color-mix(in srgb, var(--sn-provider-community-color) 20%, transparent)"
1876
+ }
1877
+ },
1878
+ "default": {
1879
+ "color": {
1880
+ "$type": "color",
1881
+ "$value": "var(--sn-text-dim)"
1882
+ },
1883
+ "background": {
1884
+ "$type": "color",
1885
+ "$value": "var(--sn-node-hover)"
1886
+ }
1887
+ }
1888
+ },
1889
+ "syntax": {
1890
+ "keyword": {
1891
+ "$type": "color",
1892
+ "$value": "hsl(var(--sn-hue-danger) var(--sn-sat-vivid) 82%)"
1893
+ },
1894
+ "string": {
1895
+ "$type": "color",
1896
+ "$value": "hsl(var(--sn-hue-warning) var(--sn-sat-vivid) 65%)"
1897
+ },
1898
+ "comment": {
1899
+ "$type": "color",
1900
+ "$value": "var(--sn-text-dim)"
1901
+ },
1902
+ "function": {
1903
+ "$type": "color",
1904
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) 84%)"
1905
+ },
1906
+ "number": {
1907
+ "$type": "color",
1908
+ "$value": "var(--sn-syntax-string)"
1909
+ },
1910
+ "builtin": {
1911
+ "$type": "color",
1912
+ "$value": "var(--sn-syntax-function)"
1913
+ },
1914
+ "property": {
1915
+ "$type": "color",
1916
+ "$value": "hsl(var(--sn-hue-data) var(--sn-sat-vivid) 78%)"
1917
+ },
1918
+ "literal": {
1919
+ "$type": "color",
1920
+ "$value": "var(--sn-syntax-keyword)"
1921
+ },
1922
+ "doc": {
1923
+ "$type": "color",
1924
+ "$value": "hsl(var(--sn-hue-success) 22% 56%)"
1925
+ },
1926
+ "docTag": {
1927
+ "$type": "color",
1928
+ "$value": "hsl(var(--sn-hue-success) 50% 70%)"
1929
+ },
1930
+ "docType": {
1931
+ "$type": "color",
1932
+ "$value": "hsl(var(--sn-hue-accent) 72% 72%)"
1933
+ },
1934
+ "template": {
1935
+ "$type": "color",
1936
+ "$value": "hsl(var(--sn-hue-warning) 44% 64%)"
1937
+ },
1938
+ "templateTag": {
1939
+ "$type": "color",
1940
+ "$value": "hsl(var(--sn-hue-accent) 48% 58%)"
1941
+ },
1942
+ "templateAttr": {
1943
+ "$type": "color",
1944
+ "$value": "hsl(var(--sn-hue-accent) var(--sn-sat-vivid) 80%)"
1945
+ },
1946
+ "templateBracket": {
1947
+ "$type": "color",
1948
+ "$value": "var(--sn-text-dim)"
1949
+ },
1950
+ "templateInterpolation": {
1951
+ "$type": "color",
1952
+ "$value": "hsl(var(--sn-hue-warning) 50% 76%)"
1953
+ },
1954
+ "templateSelector": {
1955
+ "$type": "color",
1956
+ "$value": "hsl(var(--sn-hue-warning) 56% 68%)"
1957
+ },
1958
+ "templateProperty": {
1959
+ "$type": "color",
1960
+ "$value": "var(--sn-syntax-template-attr)"
1961
+ },
1962
+ "templateValue": {
1963
+ "$type": "color",
1964
+ "$value": "var(--sn-syntax-template)"
1965
+ }
1966
+ },
1967
+ "diagnostic": {
1968
+ "errorBackground": {
1969
+ "$type": "color",
1970
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 7%, transparent)"
1971
+ },
1972
+ "errorBorder": {
1973
+ "$type": "color",
1974
+ "$value": "color-mix(in srgb, var(--sn-danger-color) 55%, transparent)"
1975
+ },
1976
+ "warningBackground": {
1977
+ "$type": "color",
1978
+ "$value": "color-mix(in srgb, var(--sn-warning-color) 5%, transparent)"
1979
+ },
1980
+ "warningBorder": {
1981
+ "$type": "color",
1982
+ "$value": "color-mix(in srgb, var(--sn-warning-color) 45%, transparent)"
1983
+ }
1984
+ },
1985
+ "radius": {
1986
+ "node": {
1987
+ "$type": "dimension",
1988
+ "$value": "8px"
1989
+ },
1990
+ "control": {
1991
+ "$type": "dimension",
1992
+ "$value": "4px"
1993
+ }
1994
+ },
1995
+ "effect": {
1996
+ "hoverTransition": {
1997
+ "$type": "transition",
1998
+ "$value": "background-color calc(120ms * var(--sn-theme-motion-scale)) ease, border-color calc(120ms * var(--sn-theme-motion-scale)) ease"
1999
+ },
2000
+ "focusRing": {
2001
+ "$type": "shadow",
2002
+ "$value": "0 0 0 2px hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.35)"
2003
+ },
2004
+ "dragShadow": {
2005
+ "$type": "shadow",
2006
+ "$value": "0 14px calc(32px * var(--sn-theme-elevation-scale)) hsl(var(--sn-hue-base) var(--sn-sat-muted) 0% / 0.35)"
2007
+ },
2008
+ "loadingPulse": {
2009
+ "$type": "gradient",
2010
+ "$value": "linear-gradient(90deg, transparent, hsl(var(--sn-hue-accent) var(--sn-sat-vivid) var(--sn-lit-accent) / 0.6), transparent)"
2011
+ },
2012
+ "cellBackground": {
2013
+ "$type": "color",
2014
+ "$value": "var(--sn-bg)"
2015
+ },
2016
+ "cellDot": {
2017
+ "$type": "color",
2018
+ "$value": "color-mix(in srgb, var(--sn-text-dim) 55%, var(--sn-bg))"
2019
+ },
2020
+ "cellBaseAlpha": {
2021
+ "$type": "number",
2022
+ "$value": "0.06"
2023
+ },
2024
+ "cellAlphaSpan": {
2025
+ "$type": "number",
2026
+ "$value": "0.18"
2027
+ },
2028
+ "cellGlare": {
2029
+ "$type": "color",
2030
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-text) / 0.02)"
2031
+ },
2032
+ "cellVignetteMid": {
2033
+ "$type": "color",
2034
+ "$value": "hsl(var(--sn-hue-base) var(--sn-sat-muted) var(--sn-lit-bg) / 0.7)"
2035
+ },
2036
+ "cellVignetteEdge": {
2037
+ "$type": "color",
2038
+ "$value": "var(--sn-bg)"
2039
+ },
2040
+ "cellNoise": {
2041
+ "$type": "asset",
2042
+ "$value": "url(\"data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.5' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E\")"
2043
+ },
2044
+ "shadowSmall": {
2045
+ "$type": "shadow",
2046
+ "$value": "0 1px calc(4px * var(--sn-theme-elevation-scale)) hsl(var(--sn-hue-base) var(--sn-sat-muted) 0% / 0.22)"
2047
+ },
2048
+ "shadowMedium": {
2049
+ "$type": "shadow",
2050
+ "$value": "0 2px calc(8px * var(--sn-theme-elevation-scale)) hsl(var(--sn-hue-base) var(--sn-sat-muted) 0% / 0.28)"
2051
+ },
2052
+ "shadowLarge": {
2053
+ "$type": "shadow",
2054
+ "$value": "0 6px calc(18px * var(--sn-theme-elevation-scale)) hsl(var(--sn-hue-base) var(--sn-sat-muted) 0% / 0.28)"
2055
+ },
2056
+ "shadowExtraLarge": {
2057
+ "$type": "shadow",
2058
+ "$value": "0 -8px calc(28px * var(--sn-theme-elevation-scale)) hsl(var(--sn-hue-base) var(--sn-sat-muted) 0% / 0.32)"
2059
+ }
2060
+ }
2061
+ }
2062
+ };
2063
+ export function listThemes() {
2064
+ return THEME_NAMES.map((name) => getTheme(name));
2065
+ }
2066
+
2067
+ export function getTheme(name) {
2068
+ if (!THEME_NAMES.includes(name)) return undefined;
2069
+ return TOKEN_FILES.find((file) => file.name === name);
2070
+ }
2071
+
2072
+ export function getThemeTokens(name) {
2073
+ if (!THEME_NAMES.includes(name)) return undefined;
2074
+ return THEME_TOKENS[name];
2075
+ }
2076
+
2077
+ export function listTokenFiles() {
2078
+ return [...TOKEN_FILES];
2079
+ }
2080
+
2081
+ export function listThemeRuleBlocks(filter = {}) {
2082
+ return THEME_RULE_BLOCKS.filter((block) => {
2083
+ for (let [key, value] of Object.entries(filter)) {
2084
+ if (block[key] !== value) return false;
2085
+ }
2086
+ return true;
2087
+ });
2088
+ }
2089
+
2090
+ export function getThemeRuleBlocks(themeName) {
2091
+ return listThemeRuleBlocks({ theme: themeName });
2092
+ }
2093
+
2094
+ export function getThemeControls(themeName) {
2095
+ return copyData(THEME_CONTROLS[themeName] || []);
2096
+ }
2097
+
2098
+ export function listThemeElementGroups() {
2099
+ return copyData(THEME_ELEMENT_GROUPS);
2100
+ }
2101
+
2102
+ export function getThemeCssTokens(themeName) {
2103
+ return { ...(RUNTIME_THEMES[themeName]?.tokens || {}) };
2104
+ }
2105
+
2106
+ export function listThemeCssTokenClassifications(themeName) {
2107
+ return Object.entries(getThemeCssTokens(themeName)).map(([cssVar, value]) => {
2108
+ let classification = classifyCssToken(cssVar);
2109
+ return {
2110
+ cssVar,
2111
+ value,
2112
+ ...classification,
2113
+ };
2114
+ });
2115
+ }
2116
+
2117
+ export function getThemeRecipe(themeName) {
2118
+ let theme = getTheme(themeName);
2119
+ let tokens = getThemeTokens(themeName);
2120
+ if (!theme || !tokens) return undefined;
2121
+ let cssTokens = getThemeCssTokens(themeName);
2122
+ return {
2123
+ name: themeName,
2124
+ theme: { ...theme },
2125
+ metadata: copyData(THEME_METADATA[themeName] || {}),
2126
+ tokenFile: theme.path,
2127
+ tokens: copyData(tokens),
2128
+ flatTokens: copyData(flattenTokens(tokens)),
2129
+ cssTokens,
2130
+ cssTokenClassifications: listThemeCssTokenClassifications(themeName),
2131
+ cssTokenSource: RUNTIME_THEMES[themeName] ? 'runtime-theme' : 'not-runtime-complete',
2132
+ controls: getThemeControls(themeName),
2133
+ elementGroups: listThemeElementGroups(),
2134
+ ruleBlocks: copyData(getThemeRuleBlocks(themeName)),
2135
+ };
2136
+ }
2137
+
2138
+ export function flattenTokens(tokenTree, prefix = '', out = {}) {
2139
+ for (let [key, value] of Object.entries(tokenTree || {})) {
2140
+ if (key.startsWith('$') || key === 'name' || key === 'extends') continue;
2141
+ let nextKey = prefix ? `${prefix}.${key}` : key;
2142
+ if (value && typeof value === 'object' && '$value' in value) {
2143
+ out[nextKey] = value;
2144
+ } else if (value && typeof value === 'object') {
2145
+ flattenTokens(value, nextKey, out);
2146
+ }
2147
+ }
2148
+ return out;
2149
+ }