@exponential-at/ui 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +360 -2
  4. package/catalog/a11y.json +668 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +4752 -0
  8. package/catalog/core.schema.json +22667 -0
  9. package/catalog/host.json +64 -0
  10. package/catalog/layout.json +20 -0
  11. package/catalog/limits.json +9 -0
  12. package/catalog/locale.json +48 -0
  13. package/catalog/macros.json +3417 -0
  14. package/catalog/recipes.json +61 -0
  15. package/catalog/strings.json +72 -0
  16. package/catalog/style.json +128 -0
  17. package/catalog/theme.schema.json +42543 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +217 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +683 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +96 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +154 -0
  27. package/conformance/manifest.json +224 -0
  28. package/conformance/parity-compare.ts +191 -0
  29. package/conformance/parity-report.schema.json +73 -0
  30. package/conformance/parity.ts +412 -0
  31. package/conformance/pixel.ts +177 -0
  32. package/conformance/primitives-page.ts +49 -0
  33. package/conformance/report.schema.json +66 -0
  34. package/conformance/run.ts +118 -0
  35. package/dist/chunks/index-98npjvsd.js +3940 -0
  36. package/dist/chunks/index-98npjvsd.js.map +27 -0
  37. package/dist/chunks/index-gwkt14w3.js +7314 -0
  38. package/dist/chunks/index-gwkt14w3.js.map +10 -0
  39. package/dist/chunks/index-njt7yzzm.js +134 -0
  40. package/dist/chunks/index-njt7yzzm.js.map +9 -0
  41. package/dist/chunks/index-we7va6v6.js +7984 -0
  42. package/dist/chunks/index-we7va6v6.js.map +15 -0
  43. package/dist/chunks/index-xrm6f7wc.js +2563 -0
  44. package/dist/chunks/index-xrm6f7wc.js.map +10 -0
  45. package/dist/conformance.js +182749 -0
  46. package/dist/conformance.js.map +10 -0
  47. package/dist/entries/prompt.js +251 -0
  48. package/dist/entries/prompt.js.map +11 -0
  49. package/dist/entries/schema.js +1725 -0
  50. package/dist/entries/schema.js.map +11 -0
  51. package/dist/host/index.js +122 -0
  52. package/dist/host/index.js.map +9 -0
  53. package/dist/index.js +3213 -0
  54. package/dist/index.js.map +27 -0
  55. package/dist/types/src/a11y.d.ts +21 -0
  56. package/dist/types/src/animation.d.ts +76 -0
  57. package/dist/types/src/basic-map.d.ts +38 -0
  58. package/dist/types/src/builder.d.ts +50 -0
  59. package/dist/types/src/catalog.d.ts +54 -0
  60. package/dist/types/src/catalog.described.d.ts +33 -0
  61. package/dist/types/src/catalog.generated.d.ts +829 -0
  62. package/dist/types/src/chart.d.ts +46 -0
  63. package/dist/types/src/code.d.ts +44 -0
  64. package/dist/types/src/color.d.ts +20 -0
  65. package/dist/types/src/conformance.d.ts +39 -0
  66. package/dist/types/src/connector/app.d.ts +14 -0
  67. package/dist/types/src/connector/connector.d.ts +77 -0
  68. package/dist/types/src/connector/index.d.ts +4 -0
  69. package/dist/types/src/css.d.ts +29 -0
  70. package/dist/types/src/define.d.ts +66 -0
  71. package/dist/types/src/direction.d.ts +16 -0
  72. package/dist/types/src/dynamic.d.ts +159 -0
  73. package/dist/types/src/entries/prompt.d.ts +11 -0
  74. package/dist/types/src/entries/schema.d.ts +8 -0
  75. package/dist/types/src/expr.d.ts +71 -0
  76. package/dist/types/src/extension.d.ts +4 -0
  77. package/dist/types/src/format.d.ts +112 -0
  78. package/dist/types/src/geometry.d.ts +40 -0
  79. package/dist/types/src/host/contract.d.ts +188 -0
  80. package/dist/types/src/host/decoders.d.ts +61 -0
  81. package/dist/types/src/host/index.d.ts +11 -0
  82. package/dist/types/src/host/package.d.ts +58 -0
  83. package/dist/types/src/host/policy.d.ts +105 -0
  84. package/dist/types/src/host/router.d.ts +34 -0
  85. package/dist/types/src/host/runtime.d.ts +205 -0
  86. package/dist/types/src/host/sources.d.ts +15 -0
  87. package/dist/types/src/host/transports.d.ts +109 -0
  88. package/dist/types/src/index.d.ts +63 -0
  89. package/dist/types/src/layout.d.ts +20 -0
  90. package/dist/types/src/limits.d.ts +21 -0
  91. package/dist/types/src/list.d.ts +133 -0
  92. package/dist/types/src/locale.d.ts +22 -0
  93. package/dist/types/src/macros.d.ts +29 -0
  94. package/dist/types/src/overlay.d.ts +27 -0
  95. package/dist/types/src/prompt.d.ts +44 -0
  96. package/dist/types/src/recipes.d.ts +17 -0
  97. package/dist/types/src/reducer.d.ts +41 -0
  98. package/dist/types/src/resizable.d.ts +38 -0
  99. package/dist/types/src/schema.d.ts +7 -0
  100. package/dist/types/src/strings.d.ts +13 -0
  101. package/dist/types/src/style.d.ts +201 -0
  102. package/dist/types/src/test-preload.d.ts +1 -0
  103. package/dist/types/src/text-shimmer.d.ts +24 -0
  104. package/dist/types/src/theme-types.d.ts +162 -0
  105. package/dist/types/src/theme.d.ts +73 -0
  106. package/dist/types/src/themes.d.ts +22 -0
  107. package/dist/types/src/tree-guides.d.ts +17 -0
  108. package/dist/types/src/types.d.ts +314 -0
  109. package/dist/types/src/validate.d.ts +31 -0
  110. package/dist/types/src/web/base-css.d.ts +1 -0
  111. package/dist/types/src/web/box-css.d.ts +55 -0
  112. package/dist/types/src/web/coerce.d.ts +32 -0
  113. package/dist/types/src/web/data.d.ts +105 -0
  114. package/dist/types/src/web/dates.d.ts +12 -0
  115. package/dist/types/src/web/form.d.ts +44 -0
  116. package/dist/types/src/web/host-types.d.ts +119 -0
  117. package/dist/types/src/web/index.d.ts +28 -0
  118. package/dist/types/src/web/inputs.d.ts +55 -0
  119. package/dist/types/src/web/list.d.ts +13 -0
  120. package/dist/types/src/web/listbox.d.ts +14 -0
  121. package/dist/types/src/web/markdown.d.ts +96 -0
  122. package/dist/types/src/web/media.d.ts +62 -0
  123. package/dist/types/src/web/parts.d.ts +4 -0
  124. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  125. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  126. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  127. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  128. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  129. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  130. package/dist/types/src/web/primitives/button.d.ts +6 -0
  131. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  132. package/dist/types/src/web/primitives/card.d.ts +9 -0
  133. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  134. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  135. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  136. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  137. package/dist/types/src/web/primitives/command.d.ts +134 -0
  138. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  139. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  140. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  141. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  142. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  143. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  144. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  145. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  146. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  147. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  148. package/dist/types/src/web/primitives/index.d.ts +48 -0
  149. package/dist/types/src/web/primitives/input.d.ts +5 -0
  150. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  151. package/dist/types/src/web/primitives/label.d.ts +3 -0
  152. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  153. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  154. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  155. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  156. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  157. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  158. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  159. package/dist/types/src/web/primitives/select.d.ts +47 -0
  160. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  161. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  162. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  163. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  164. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  165. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  166. package/dist/types/src/web/primitives/table.d.ts +11 -0
  167. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  168. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  169. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  170. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  171. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  172. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  173. package/dist/types/src/web/share.d.ts +6 -0
  174. package/dist/types/src/web/table.d.ts +20 -0
  175. package/dist/types/src/web/theme-css.d.ts +69 -0
  176. package/dist/types/src/web/urls.d.ts +21 -0
  177. package/dist/web/index.js +2303 -0
  178. package/dist/web/index.js.map +26 -0
  179. package/dist/web/primitives/index.js +1450 -0
  180. package/dist/web/primitives/index.js.map +57 -0
  181. package/docs/components.generated.json +6238 -0
  182. package/docs/round-1-contract.md +679 -0
  183. package/docs/round-2-contract.md +476 -0
  184. package/docs/round-3-contract.md +174 -0
  185. package/docs/themes.generated.json +3503 -0
  186. package/fixtures/animations.json +2890 -0
  187. package/fixtures/bench-list.json +58 -0
  188. package/fixtures/bind-time.json +30664 -0
  189. package/fixtures/catalog-basic-map.json +1692 -0
  190. package/fixtures/catalog-components.json +9323 -0
  191. package/fixtures/catalog-extension.json +620 -0
  192. package/fixtures/catalog-macros.json +36370 -0
  193. package/fixtures/code-tokens.json +1993 -0
  194. package/fixtures/conformance-baseline.json +55544 -0
  195. package/fixtures/conformance-cases.json +49 -0
  196. package/fixtures/conformance-known.json +2123 -0
  197. package/fixtures/control-geometry.json +4200 -0
  198. package/fixtures/dashboard.data.json +74 -0
  199. package/fixtures/dashboard.json +752 -0
  200. package/fixtures/demo-surface.json +47 -0
  201. package/fixtures/format.json +870 -0
  202. package/fixtures/host-policy.json +1067 -0
  203. package/fixtures/host-router.json +1152 -0
  204. package/fixtures/host-transport.json +590 -0
  205. package/fixtures/interactions-round1.json +773 -0
  206. package/fixtures/kitchen-sink.expanded.json +10844 -0
  207. package/fixtures/kitchen-sink.json +3049 -0
  208. package/fixtures/layout-geometry-round1.json +7278 -0
  209. package/fixtures/layout-geometry.json +2072 -0
  210. package/fixtures/overlay-geometry.json +272 -0
  211. package/fixtures/primitive-specimens.json +58 -0
  212. package/fixtures/prompt-budget.json +33 -0
  213. package/fixtures/resizable.json +714 -0
  214. package/fixtures/round4-contract.json +2985 -0
  215. package/fixtures/specimens.json +9832 -0
  216. package/fixtures/style-conditions.json +336 -0
  217. package/fixtures/template-items.json +2215 -0
  218. package/fixtures/text-direction.json +309 -0
  219. package/fixtures/text-shimmer.json +96 -0
  220. package/fixtures/theme-extends.json +573 -0
  221. package/fixtures/theme-invalid.json +1296 -0
  222. package/fixtures/theme-recipes.json +58600 -0
  223. package/fixtures/theme-resolved.json +23949 -0
  224. package/fixtures/toast-stack.json +215 -0
  225. package/fixtures/tree-guides.json +224 -0
  226. package/fixtures/virtual-list.json +733 -0
  227. package/generated/ExponentialUICatalog.generated.kt +67 -0
  228. package/generated/ExponentialUICatalog.generated.swift +67 -0
  229. package/generated/ExponentialUIThemes.generated.kt +23 -0
  230. package/generated/ExponentialUIThemes.generated.swift +23 -0
  231. package/generated/catalog.descriptions.generated.rs +6 -0
  232. package/generated/catalog.generated.rs +80 -0
  233. package/generated/catalog.themes.generated.rs +34 -0
  234. package/generated/core.descriptions.json +2505 -0
  235. package/generated/core.runtime.json +3609 -0
  236. package/package.json +87 -4
  237. package/themes/exponential.recipes.json +49 -0
  238. package/themes/exponential.theme.json +755 -0
  239. package/themes/neutral.theme.json +5676 -0
  240. package/themes/orange.theme.json +43 -0
  241. package/themes/playful.theme.json +219 -0
  242. package/vendor/a2ui/LICENSE.txt +203 -0
  243. package/vendor/a2ui/README.md +27 -0
  244. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  245. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  246. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  247. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  248. package/vendor/a2ui/v0_9/common_types.json +315 -0
  249. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  250. package/vendor/json-render/LICENSE.txt +201 -0
  251. package/vendor/json-render/README.md +13 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/style.ts", "../src/color.ts", "../src/recipes.ts", "../src/theme.ts", "../src/themes.ts", "../src/host/contract.ts"],
4
+ "sourcesContent": [
5
+ "// VAPP-85: the Box style whitelist as code — the VAPP-4 spike's `vapp-css`\n// (`create`/`props` in StyleX's shape, zero dependencies) over the key list\n// in catalog/style.json. `create` is identity + validation; `props` merges\n// in order and keeps the conditions NESTED, because the CLIENT resolves\n// `@media (…)` against its surface and the state keys against its own\n// interaction state (D7). Values may be token references (`$spacing.md`).\n//\n// Round 1 (docs/round-1-contract.md §2): `resolveConditions` is the\n// REFERENCE flattening every renderer mirrors — base, then every matching\n// `@media` block in SOURCE order, then `:hover`, `:focus-visible`,\n// `:pressed`; fixtures/style-conditions.json locks it.\n\nimport styleJson from \"../catalog/style.json\" with { type: \"json\" }\nimport { TOKEN_GROUPS, isKnownToken, parseTokenRef } from \"./catalog\"\n\ninterface KeySpec {\n type?: string\n enum?: readonly (string | number)[]\n group?: string\n rootOnly?: boolean\n layoutEffect?: boolean\n}\n\nconst LAYOUT = styleJson.layout as Record<string, KeySpec>\nconst VISUAL = styleJson.visual as Record<string, KeySpec>\nexport const STYLE_KEYS: readonly string[] = [\n ...Object.keys(LAYOUT),\n ...Object.keys(VISUAL),\n]\nexport const STYLE_LAYOUT_KEYS: readonly string[] = Object.keys(LAYOUT)\nexport const STYLE_VISUAL_KEYS: readonly string[] = Object.keys(VISUAL)\n/** The visual keys that move layout (`borderWidth` and the four sides). */\nexport const STYLE_LAYOUT_EFFECT_KEYS: readonly string[] = Object.entries(VISUAL).filter(([, s]) => s.layoutEffect).map(([k]) => k)\nconst SPEC: Record<string, KeySpec> = { ...LAYOUT, ...VISUAL }\nconst KEYS: ReadonlySet<string> = new Set(STYLE_KEYS)\nexport const STYLE_MEDIA = new RegExp(styleJson.conditions.media)\nexport const STYLE_TRANSFORM = new RegExp(styleJson.conditions.transform)\n/** The state keys in the order they apply (the last wins). */\nexport const STYLE_STATES: readonly string[] = styleJson.conditions.states\nexport const STYLE_MEDIA_PATTERN: string = styleJson.conditions.media\nexport const STYLE_TRANSFORM_PATTERN: string = styleJson.conditions.transform\n\ntype Len = number | `${number}%` | `${number}px` | `auto` | `$${string}`\ntype Color = `$color.${string}`\ntype Align =\n | `flex-start`\n | `flex-end`\n | `start`\n | `end`\n | `center`\n | `stretch`\n | `baseline`\ntype Distribute = Align | `space-between` | `space-around` | `space-evenly`\ntype Overflow = `visible` | `hidden` | `clip` | `scroll` | `auto`\n\n/** A gradient painted over `backgroundColor`: CSS angle (0 = up, 90 = right)\n * and colour stops at 0..1 offsets. */\nexport interface Gradient {\n angle: number\n stops: { color: Color; offset: number }[]\n}\n\n/** Typed keys = editor autocomplete + a compile error for anything else. */\nexport interface StyleProps {\n display?: `flex` | `grid` | `block` | `none`\n flexDirection?: `row` | `column` | `row-reverse` | `column-reverse`\n flexWrap?: `nowrap` | `wrap` | `wrap-reverse`\n justifyContent?: Distribute\n alignItems?: Align\n alignContent?: Distribute\n alignSelf?: Align\n justifySelf?: Align\n flexGrow?: number\n flexShrink?: number\n flexBasis?: Len\n gap?: Len\n rowGap?: Len\n columnGap?: Len\n direction?: `ltr` | `rtl`\n overflow?: Overflow\n overflowX?: Overflow\n overflowY?: Overflow\n width?: Len\n height?: Len\n minWidth?: Len\n minHeight?: Len\n maxWidth?: Len\n maxHeight?: Len\n aspectRatio?: number | `${number}/${number}`\n position?: `relative` | `absolute` | `sticky`\n top?: Len\n right?: Len\n bottom?: Len\n left?: Len\n inset?: Len\n insetInlineStart?: Len\n insetInlineEnd?: Len\n insetBlockStart?: Len\n insetBlockEnd?: Len\n padding?: Len\n paddingTop?: Len\n paddingRight?: Len\n paddingBottom?: Len\n paddingLeft?: Len\n paddingHorizontal?: Len\n paddingVertical?: Len\n paddingInlineStart?: Len\n paddingInlineEnd?: Len\n margin?: Len\n marginTop?: Len\n marginRight?: Len\n marginBottom?: Len\n marginLeft?: Len\n marginHorizontal?: Len\n marginVertical?: Len\n marginInlineStart?: Len\n marginInlineEnd?: Len\n /** Track list: px, %, fr, auto, min-content, max-content, minmax(a, b), repeat(n, …). */\n gridTemplateColumns?: string\n gridTemplateRows?: string\n /** One string per row (`[\"nav main\", \"nav footer\"]`). */\n gridTemplateAreas?: ReadonlyArray<string>\n gridArea?: string\n gridColumn?: string\n gridRow?: string\n backgroundColor?: Color\n backgroundGradient?: Gradient\n color?: Color\n borderWidth?: number | `$border.${string}`\n borderTopWidth?: number | `$border.${string}`\n borderRightWidth?: number | `$border.${string}`\n borderBottomWidth?: number | `$border.${string}`\n borderLeftWidth?: number | `$border.${string}`\n borderColor?: Color\n borderStyle?: `solid` | `dashed` | `dotted`\n borderRadius?: Len\n borderTopLeftRadius?: Len\n borderTopRightRadius?: Len\n borderBottomRightRadius?: Len\n borderBottomLeftRadius?: Len\n opacity?: number | `$opacity.${string}`\n boxShadow?: `$shadow.${string}`\n fontSize?: Len\n fontWeight?: 300 | 400 | 500 | 600 | 700 | 800\n lineHeight?: Len\n letterSpacing?: Len\n textAlign?: `left` | `right` | `center` | `start` | `end` | `justify`\n textDecoration?: `none` | `underline` | `line-through`\n textTransform?: `none` | `uppercase` | `lowercase` | `capitalize`\n fontStyle?: `normal` | `italic`\n fontFamily?: `$type.family.${string}`\n transition?: `$motion.${string}`\n transitionEasing?: `$ease.${string}`\n /** `translate(Xpx, Ypx) scale(N) rotate(Ndeg)`, paint-only. */\n transform?: string\n visibility?: `visible` | `hidden`\n pointerEvents?: `auto` | `none`\n userSelect?: `auto` | `none` | `text`\n cursor?: `auto` | `default` | `pointer` | `text` | `not-allowed` | `grab` | `grabbing` | `move` | `col-resize` | `row-resize`\n /** Round 2: `$blur.<name>`; blurs what is behind the box. */\n backdropBlur?: `$blur.${string}`\n /** Round 2: a keyframe set (style.json `animations`). */\n animation?: `pulse` | `spin` | `fade-in` | `slide-in-up` | `slide-in-down` | `slide-in-left` | `slide-in-right` | `shimmer`\n /** Round 2: `$motion.<name>` instead of the animation's own token. */\n animationDuration?: `$motion.${string}`\n}\n\nexport type MediaKey = `@media (${string})`\nexport type StateKey = `:hover` | `:focus-visible` | `:pressed`\n/** A style = base props + media condition blocks + state blocks, one level. */\nexport type Style = StyleProps & {\n [K in MediaKey]?: StyleProps\n} & {\n [K in StateKey]?: StyleProps\n}\n\nconst LENGTH = /^-?\\d+(\\.\\d+)?(px|%)$/\nconst RATIO = /^\\d+(\\.\\d+)?\\/\\d+(\\.\\d+)?$/\nconst NUMERIC_TOKEN_GROUPS = new Set([\n `spacing`,\n `radius`,\n `control`,\n `type.size`,\n `type.lineHeight`,\n `opacity`,\n `border`,\n])\n\nfunction tokenOk(value: unknown, groups: ReadonlySet<string>): boolean {\n const ref = parseTokenRef(value)\n return ref !== null && groups.has(ref.group) && isKnownToken(value)\n}\n\n/** Round 4 (VAPP-103): a node's colour is a `$color.*` TOKEN, never a\n * literal, so the theme's light and dark modes both apply. (A THEME's\n * recipes keep literal hex: theme.ts checks them, not this.) */\nfunction colorOk(value: unknown): boolean {\n return tokenOk(value, new Set([`color`]))\n}\n\nfunction gradientError(key: string, value: unknown): string | null {\n const bad = `${key}: expected {angle, stops: [{color, offset 0..1}, …]} with two or more stops`\n if (typeof value !== `object` || value === null || Array.isArray(value)) return bad\n const g = value as Record<string, unknown>\n if (typeof g.angle !== `number` || !Number.isFinite(g.angle)) return bad\n if (!Array.isArray(g.stops) || g.stops.length < 2) return bad\n for (const stop of g.stops) {\n if (typeof stop !== `object` || stop === null) return bad\n const s = stop as Record<string, unknown>\n if (!colorOk(s.color)) return bad\n if (typeof s.offset !== `number` || s.offset < 0 || s.offset > 1) return bad\n }\n for (const k of Object.keys(g)) if (k !== `angle` && k !== `stops`) return bad\n return null\n}\n\nfunction valueError(key: string, value: unknown): string | null {\n const spec = SPEC[key]\n if (spec.enum) {\n return spec.enum.includes(value as string | number)\n ? null\n : `${key}: expected one of ${spec.enum.join(`|`)}`\n }\n switch (spec.type) {\n case `number`:\n if (typeof value === `number` && Number.isFinite(value)) return null\n if (tokenOk(value, NUMERIC_TOKEN_GROUPS)) return null\n return `${key}: expected a number or a numeric token`\n case `length`:\n if (typeof value === `number` && Number.isFinite(value)) return null\n if (value === `auto`) return null\n if (typeof value === `string` && LENGTH.test(value)) return null\n if (tokenOk(value, NUMERIC_TOKEN_GROUPS)) return null\n return `${key}: expected px, \"N%\", \"auto\" or a numeric token`\n case `color`:\n if (colorOk(value)) return null\n return `${key}: expected $color.<name>`\n case `gradient`:\n return gradientError(key, value)\n case `token`:\n if (tokenOk(value, new Set([spec.group ?? ``]))) return null\n return `${key}: expected $${spec.group}.<name>`\n case `transform`:\n if (typeof value === `string` && STYLE_TRANSFORM.test(value)) return null\n return `${key}: expected translate(Xpx, Ypx), scale(N) and/or rotate(Ndeg)`\n case `ratio`:\n if (typeof value === `number` && value > 0) return null\n if (typeof value === `string` && RATIO.test(value)) return null\n return `${key}: expected a number or \"w/h\"`\n case `tracks`:\n case `string`:\n return typeof value === `string` ? null : `${key}: expected a string`\n case `areas`:\n return Array.isArray(value) && value.every((row) => typeof row === `string`)\n ? null\n : `${key}: expected an array of row strings`\n default:\n return `${key}: unknown spec`\n }\n}\n\nexport interface StyleIssue {\n path: string\n message: string\n}\n\n/** The enum a style key takes (`borderStyle` → solid|dashed|dotted), if any. */\nexport function styleKeyEnum(key: string): readonly (string | number)[] | undefined {\n return SPEC[key]?.enum\n}\n\n/** The value type a style key takes (`length`, `color`, `token`, …). */\nexport function styleKeyType(key: string): string | undefined {\n return SPEC[key]?.enum ? `enum` : SPEC[key]?.type\n}\n\n/** A `@media` or state condition key. */\nexport function isConditionKey(key: string): boolean {\n return STYLE_MEDIA.test(key) || STYLE_STATES.includes(key)\n}\n\n/** Every rule the client resolver relies on: whitelisted keys, well-typed\n * values, conditions one level deep (round 2: `direction` on any node). */\nexport function validateStyle(\n style: unknown,\n options: { path?: string; root?: boolean } = {}\n): StyleIssue[] {\n const issues: StyleIssue[] = []\n const path = options.path ?? `style`\n const walk = (obj: Record<string, unknown>, at: string, nested: boolean) => {\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue\n if (isConditionKey(key)) {\n const bp = /\\$breakpoint\\.([a-zA-Z0-9]+)/.exec(key)\n if (bp && !TOKEN_GROUPS.breakpoint.includes(bp[1])) issues.push({ path: `${at}.${key}`, message: `unknown breakpoint $breakpoint.${bp[1]}; known: ${TOKEN_GROUPS.breakpoint.join(`|`)}` })\n if (nested) issues.push({ path: `${at}.${key}`, message: `conditions do not nest` })\n else if (typeof value !== `object` || value === null || Array.isArray(value))\n issues.push({ path: `${at}.${key}`, message: `must be an object` })\n else walk(value as Record<string, unknown>, `${at}.${key}`, true)\n continue\n }\n if (!KEYS.has(key)) {\n issues.push({ path: `${at}.${key}`, message: key.startsWith(`@media`) || key.startsWith(`:`) ? `not a supported condition` : `not in the Box style whitelist` })\n continue\n }\n if (SPEC[key].rootOnly && options.root === false)\n issues.push({ path: `${at}.${key}`, message: `allowed on the root only` })\n const error = valueError(key, value)\n if (error) issues.push({ path: `${at}.${key}`, message: error })\n }\n }\n if (typeof style !== `object` || style === null || Array.isArray(style))\n return [{ path, message: `expected an object` }]\n walk(style as Record<string, unknown>, path, false)\n return issues\n}\n\n/** Identity + validation, frozen so a render cannot mutate a shared style.\n * `Record<K, Style>` (not a generic) keeps the excess-property check on the\n * literal, so an unknown key is a compile error too. */\nexport function create<K extends string>(\n styles: Record<K, Style>\n): Readonly<Record<K, Style>> {\n for (const [name, style] of Object.entries(styles)) {\n const issues = validateStyle(style, { path: name })\n if (issues.length > 0)\n throw new Error(issues.map((i) => `${i.path}: ${i.message}`).join(`\\n`))\n }\n return Object.freeze(styles)\n}\n\ntype Falsy = false | null | undefined | 0 | ``\n\n/** Merge in order (last wins, StyleX semantics). Condition blocks merge KEY\n * BY KEY with the same rule, and stay nested: the output is exactly what the\n * wire carries (plain JSON) and what the client resolver reads. */\nexport function props(\n ...styles: ReadonlyArray<Style | Falsy | ReadonlyArray<Style | Falsy>>\n): Style {\n const out: Record<string, unknown> = {}\n const add = (s: Style | Falsy | ReadonlyArray<Style | Falsy>) => {\n if (!s) return\n if (Array.isArray(s)) {\n ;(s as ReadonlyArray<Style | Falsy>).forEach(add)\n return\n }\n for (const [k, v] of Object.entries(s as Record<string, unknown>)) {\n if (v === undefined) continue\n if (isConditionKey(k)) {\n out[k] = { ...(out[k] as object | undefined), ...(v as object) }\n } else {\n out[k] = v\n }\n }\n }\n styles.forEach(add)\n return out as Style\n}\n\n// ---------------------------------------------------------------------------\n// Condition resolution (the reference the renderers mirror)\n// ---------------------------------------------------------------------------\n\n/** What a client knows when it flattens a style: the SURFACE box, the\n * platform's pointer and motion preference, the node's interaction states\n * and the theme's breakpoint values (px). */\nexport interface ConditionContext {\n width: number\n height?: number\n /** A hover-capable pointer (mouse, trackpad); false on touch. */\n hover?: boolean\n /** The platform asks for reduced motion. */\n reducedMotion?: boolean\n /** The node's active states, as the state keys without the colon\n * (`hover`, `focus-visible`, `pressed`). */\n states?: readonly string[]\n /** `$breakpoint.<name>` → px; a block naming an unknown token never matches. */\n breakpoints?: Record<string, number>\n}\n\nexport interface MediaCondition {\n feature: `min-width` | `max-width` | `min-height` | `max-height` | `orientation` | `hover` | `prefers-reduced-motion`\n /** The px value or the `$breakpoint.<name>` token for the size features;\n * the keyword for the others. */\n value: string\n}\n\nconst MEDIA_PARSE = /^@media \\(([a-z-]+): ([^)]+)\\)$/\n\n/** `\"@media (min-width: $breakpoint.md)\"` → `{feature, value}`; null when the\n * key is not a media condition of the grammar. */\nexport function parseMediaCondition(key: string): MediaCondition | null {\n if (!STYLE_MEDIA.test(key)) return null\n const m = MEDIA_PARSE.exec(key)\n if (!m) return null\n return { feature: m[1] as MediaCondition[`feature`], value: m[2] }\n}\n\nfunction sizeValue(value: string, ctx: ConditionContext): number | null {\n const ref = parseTokenRef(value)\n if (ref) {\n if (ref.group !== `breakpoint`) return null\n const px = ctx.breakpoints?.[ref.name]\n return typeof px === `number` ? px : null\n }\n const n = parseFloat(value)\n return Number.isFinite(n) ? n : null\n}\n\n/** Does a media condition hold for the context? `min-*` = size >= N,\n * `max-*` = size < N, orientation portrait = height >= width (landscape\n * when the height is unknown). */\nexport function mediaMatches(condition: MediaCondition, ctx: ConditionContext): boolean {\n switch (condition.feature) {\n case `min-width`:\n case `max-width`:\n case `min-height`:\n case `max-height`: {\n const n = sizeValue(condition.value, ctx)\n if (n === null) return false\n const size = condition.feature.endsWith(`width`) ? ctx.width : ctx.height\n if (size === undefined) return false\n return condition.feature.startsWith(`min`) ? size >= n : size < n\n }\n case `orientation`: {\n const portrait = ctx.height !== undefined && ctx.height >= ctx.width\n return condition.value === (portrait ? `portrait` : `landscape`)\n }\n case `hover`:\n return condition.value === (ctx.hover ? `hover` : `none`)\n case `prefers-reduced-motion`:\n return condition.value === (ctx.reducedMotion ? `reduce` : `no-preference`)\n }\n}\n\n/** Flatten a style for one pass: the base keys, then every matching `@media`\n * block in source order, then the matching state blocks in STYLE_STATES\n * order. Token values pass through untouched (the theme resolves them). */\nexport function resolveConditions(style: Record<string, unknown>, ctx: ConditionContext): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(style)) if (!isConditionKey(k) && v !== undefined) out[k] = v\n for (const [k, v] of Object.entries(style)) {\n const condition = parseMediaCondition(k)\n if (!condition || typeof v !== `object` || v === null) continue\n if (mediaMatches(condition, ctx)) Object.assign(out, v as Record<string, unknown>)\n }\n const states = ctx.states ?? []\n for (const key of STYLE_STATES) {\n const block = style[key]\n if (states.includes(key.slice(1)) && typeof block === `object` && block !== null) Object.assign(out, block as Record<string, unknown>)\n }\n return out\n}\n\n/** The breakpoint a surface of this width is in: the LAST `$breakpoint`\n * name (tokens.json order, ascending) whose px is <= width; null below the\n * first (= `base`). A native's responsive prop takes\n * `responsiveAt(value, activeBreakpoint(width, theme.tokens.breakpoint))`. */\nexport function activeBreakpoint(width: number, breakpoints: Record<string, number>): string | null {\n let out: string | null = null\n for (const name of TOKEN_GROUPS.breakpoint) {\n const px = breakpoints[name]\n if (typeof px === `number` && width >= px) out = name\n }\n return out\n}\n",
6
+ "// VAPP-92: colour parsing for the theme loader and the builder's importer.\n// A theme file carries ONLY `#rrggbb[aa]`; everything a shadcn `globals.css`\n// or a tweakcn export may contain (oklch, hsl, rgb, bare HSL triplets, hex)\n// is converted here, once, on import. Zero dependencies; OKLCH → sRGB uses\n// Björn Ottosson's matrices, the same ones packages/design-tokens uses.\n\nexport interface Rgba {\n r: number\n g: number\n b: number\n /** 0–1 */\n a: number\n}\n\nconst HEX = /^#([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/\n\nfunction clamp01(n: number): number {\n return Math.max(0, Math.min(1, n))\n}\n\nfunction srgbGamma(linear: number): number {\n const c = clamp01(linear)\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055\n}\n\nfunction oklabToRgb(L: number, a: number, b: number): [number, number, number] {\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b\n const s_ = L - 0.0894841775 * a - 1.291485548 * b\n const l = l_ * l_ * l_\n const m = m_ * m_ * m_\n const s = s_ * s_ * s_\n return [\n srgbGamma(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n srgbGamma(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n srgbGamma(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n ]\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n const k = (n: number) => (n + h / 30) % 12\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1)))\n return [f(0), f(8), f(4)]\n}\n\nfunction alphaOf(raw: string | undefined): number {\n if (raw === undefined) return 1\n const t = raw.trim()\n if (t.endsWith(`%`)) return clamp01(parseFloat(t) / 100)\n return clamp01(parseFloat(t))\n}\n\nfunction pct(raw: string): number {\n const t = raw.trim()\n return t.endsWith(`%`) ? parseFloat(t) / 100 : parseFloat(t)\n}\n\nfunction hue(raw: string): number {\n const t = raw.trim()\n if (t.endsWith(`deg`)) return parseFloat(t)\n if (t.endsWith(`turn`)) return parseFloat(t) * 360\n if (t.endsWith(`rad`)) return (parseFloat(t) * 180) / Math.PI\n return parseFloat(t)\n}\n\n/** Any CSS colour a theme import may meet → `Rgba`, or null when it is not\n * one (a `var()`, a word we do not know). */\nexport function parseColor(input: unknown): Rgba | null {\n if (typeof input !== `string`) return null\n const s = input.trim()\n const hex = HEX.exec(s)\n if (hex) {\n let h = hex[1]\n if (h.length <= 4) h = [...h].map((c) => c + c).join(``)\n const n = (i: number) => parseInt(h.slice(i, i + 2), 16)\n return { r: n(0), g: n(2), b: n(4), a: h.length === 8 ? n(6) / 255 : 1 }\n }\n const named: Record<string, string> = { white: `#ffffff`, black: `#000000`, transparent: `#00000000` }\n if (named[s.toLowerCase()]) return parseColor(named[s.toLowerCase()])\n\n const fn = /^([a-z]+)\\((.*)\\)$/i.exec(s)\n if (fn) {\n const name = fn[1].toLowerCase()\n const [body, alphaPart] = fn[2].split(`/`)\n const parts = body.trim().split(/[\\s,]+/).filter(Boolean)\n const alpha = alphaOf(alphaPart ?? (parts.length === 4 ? parts[3] : undefined))\n if (name === `oklch` && parts.length >= 3) {\n const L = pct(parts[0])\n const C = parts[1].endsWith(`%`) ? (parseFloat(parts[1]) / 100) * 0.4 : parseFloat(parts[1])\n const H = hue(parts[2])\n const [r, g, b] = oklabToRgb(L, C * Math.cos((H * Math.PI) / 180), C * Math.sin((H * Math.PI) / 180))\n return { r: to255(r), g: to255(g), b: to255(b), a: alpha }\n }\n if (name === `oklab` && parts.length >= 3) {\n const [r, g, b] = oklabToRgb(pct(parts[0]), parseFloat(parts[1]), parseFloat(parts[2]))\n return { r: to255(r), g: to255(g), b: to255(b), a: alpha }\n }\n if ((name === `hsl` || name === `hsla`) && parts.length >= 3) {\n const [r, g, b] = hslToRgb(hue(parts[0]), pct(parts[1]), pct(parts[2]))\n return { r: to255(r), g: to255(g), b: to255(b), a: alpha }\n }\n if ((name === `rgb` || name === `rgba`) && parts.length >= 3) {\n const ch = (v: string) => (v.endsWith(`%`) ? to255(parseFloat(v) / 100) : Math.round(parseFloat(v)))\n return { r: ch(parts[0]), g: ch(parts[1]), b: ch(parts[2]), a: alpha }\n }\n return null\n }\n // shadcn's pre-v4 form: a bare HSL triplet `0 0% 100%`.\n const triplet = /^(-?[\\d.]+(?:deg)?)\\s+([\\d.]+)%\\s+([\\d.]+)%$/.exec(s)\n if (triplet) {\n const [r, g, b] = hslToRgb(hue(triplet[1]), parseFloat(triplet[2]) / 100, parseFloat(triplet[3]) / 100)\n return { r: to255(r), g: to255(g), b: to255(b), a: 1 }\n }\n return null\n}\n\nfunction to255(unit: number): number {\n return Math.round(clamp01(unit) * 255)\n}\n\nfunction byte(n: number): string {\n return Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, `0`)\n}\n\n/** `#rrggbb`, or `#rrggbbaa` when the alpha is below 1. Lowercase. */\nexport function toHex(c: Rgba): `#${string}` {\n const base = `#${byte(c.r)}${byte(c.g)}${byte(c.b)}` as const\n return c.a >= 1 ? base : (`${base}${byte(c.a * 255)}` as `#${string}`)\n}\n\n/** True for the ONE form a theme file accepts: `#rrggbb` / `#rrggbbaa`. */\nexport function isThemeHex(value: unknown): value is `#${string}` {\n return typeof value === `string` && /^#([0-9a-f]{6}|[0-9a-f]{8})$/.test(value)\n}\n\n/** Any CSS colour → the theme form, or null. */\nexport function toThemeHex(input: unknown): `#${string}` | null {\n const c = parseColor(input)\n return c ? toHex(c) : null\n}\n\n/** Relative luminance (WCAG) of an opaque colour, 0–1. */\nexport function luminance(c: Rgba): number {\n const lin = (v: number) => {\n const s = v / 255\n return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4)\n }\n return 0.2126 * lin(c.r) + 0.7152 * lin(c.g) + 0.0722 * lin(c.b)\n}\n\n/** WCAG contrast ratio between two opaque colours. */\nexport function contrast(a: Rgba, b: Rgba): number {\n const la = luminance(a)\n const lb = luminance(b)\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05)\n}\n",
7
+ "// VAPP-92: the recipe CONTRACT as code — which parts each component has and\n// which props a theme's `when` may key on. Natives are listed by hand in\n// catalog/recipes.json; macro parts are derived from their templates in\n// macros.json (every `part`, the macro's `recipeProps` + each part's\n// `$recipe` keys), so the two files cannot disagree.\n\nimport recipesJson from \"../catalog/recipes.json\" with { type: \"json\" }\nimport { catalogView } from \"./catalog\"\nimport type { CatalogView } from \"./catalog\"\nimport type { ExtensionDef, MacroChild, MacroDef } from \"./types\"\n\nexport const RECIPE_STATES: readonly string[] = recipesJson.states\nexport const RECIPE_KEYS: readonly string[] = recipesJson.keys\n\nexport interface PartSpec {\n parts: string[]\n /** The prop names a `when` may use (besides `state`). */\n props: string[]\n}\n\nconst NATIVE_PARTS = recipesJson.native as Record<string, PartSpec>\n\n/** Every part of a template (children first-to-last, then the slot parts a\n * template builds, e.g. AlertDialog's footer); `$children`/`$slot:` splices\n * carry no part. */\nfunction walkTemplate(tpl: MacroChild, parts: Set<string>, props: Set<string>): void {\n if (typeof tpl === `string`) return\n parts.add(tpl.part)\n for (const key of Object.keys(tpl.$recipe ?? {})) props.add(key)\n for (const child of tpl.children ?? []) walkTemplate(child, parts, props)\n for (const slot of Object.values(tpl.slots ?? {})) if (typeof slot !== `string`) walkTemplate(slot, parts, props)\n}\n\n/** A macro's parts and recipe props, read off its template. */\nexport function macroParts(def: MacroDef): PartSpec {\n const parts = new Set<string>()\n const props = new Set<string>(def.recipeProps)\n walkTemplate(def.root, parts, props)\n return { parts: [...parts], props: [...props] }\n}\n\n/** Every component (core + the given extensions) → its parts and `when`\n * props. An extension's natives declare `recipe: {parts, props}` on their\n * component def; without it a native gets `root` and its enum/boolean props. */\nexport function recipeParts(extensions: readonly ExtensionDef[] = []): Record<string, PartSpec> {\n const view: CatalogView = catalogView(extensions)\n const out: Record<string, PartSpec> = {}\n for (const [name, def] of Object.entries(view.components)) {\n if (def.kind === `macro`) {\n const macro = view.macros[name]\n if (macro) out[name] = macroParts(macro)\n continue\n }\n const declared = (def as { recipe?: PartSpec }).recipe\n if (NATIVE_PARTS[name]) out[name] = { parts: [...NATIVE_PARTS[name].parts], props: [...NATIVE_PARTS[name].props] }\n else if (declared) out[name] = { parts: [...declared.parts], props: [...declared.props] }\n else\n out[name] = {\n parts: [`root`],\n props: Object.entries(def.props)\n .filter(([, p]) => p.type === `enum` || p.type === `boolean`)\n .map(([k]) => k),\n }\n }\n return out\n}\n\ninterface RecipeTables {\n view: CatalogView\n parts: Record<string, PartSpec>\n}\n\nlet coreTables: RecipeTables | undefined\nconst tablesByExtensions = new WeakMap<readonly ExtensionDef[], RecipeTables>()\n\n/** VAPP-147: the catalog view and the part table `nativeRecipeProps` reads,\n * built once per extension list (every painted node asks, on every\n * render: rebuilding both per call was most of a web renderer's bind). An\n * empty list is the core's. Read-only: callers get copies from\n * `recipeParts`. */\nfunction recipeTables(extensions: readonly ExtensionDef[]): RecipeTables {\n if (extensions.length === 0) return (coreTables ??= { view: catalogView(), parts: recipeParts() })\n let hit = tablesByExtensions.get(extensions)\n if (!hit) tablesByExtensions.set(extensions, (hit = { view: catalogView(extensions), parts: recipeParts(extensions) }))\n return hit\n}\n\n/** The recipe query a NATIVE node answers to: its `when` props with the\n * catalog defaults filled in (a macro part carries its own `recipe`). */\nexport function nativeRecipeProps(\n component: string,\n props: Record<string, unknown>,\n extensions: readonly ExtensionDef[] = []\n): Record<string, unknown> {\n const { view, parts } = recipeTables(extensions)\n const def = view.components[component]\n const spec = parts[component]\n const out: Record<string, unknown> = {}\n if (!def || !spec) return out\n for (const name of spec.props) {\n const value = props[name] ?? def.props[name]?.default\n if (value !== undefined) out[name] = value\n }\n return out\n}\n",
8
+ "// VAPP-92: the theme loader and resolver — the reference every renderer\n// mirrors (the Rust core for desktop/iOS/Android, the React renderer on web).\n// `validateTheme` turns a theme file into a list of readable issues (never a\n// throw), `loadTheme` flattens its `extends` chain into a `ResolvedTheme`\n// (throwing ONE `ThemeError` that lists every issue) and `resolveRecipe`\n// answers a painter's question for one mode with concrete values.\n//\n// Precedence a painter applies (`resolveNodeStyle`): the native's own\n// recipe (Text/root for its variant) < the node's style (a macro template's\n// structure plus the author's style) < the macro part's recipe (Badge/label).\n// A theme therefore restyles what a template drew, and an author's style on\n// a plain native still wins over the theme.\n//\n// Round 1: `applyDensity` / `applyContrast` derive the theme a surface runs\n// with from its settings ONCE; `resolveMode` turns `system` into a mode;\n// `resolveStyleValues` also resolves `$breakpoint.*` inside media keys.\n\nimport { TOKEN_GROUPS, parseTokenRef } from \"./catalog\"\nimport { isThemeHex } from \"./color\"\nimport { RECIPE_KEYS, RECIPE_STATES, nativeRecipeProps, recipeParts } from \"./recipes\"\nimport type { PartSpec } from \"./recipes\"\nimport { STYLE_MEDIA, STYLE_TRANSFORM, styleKeyEnum } from \"./style\"\nimport type { ExtensionDef, UiNode } from \"./types\"\nimport type {\n Density,\n Easing,\n ModeName,\n ModeSetting,\n RecipeQuery,\n RecipeRule,\n RecipeStyle,\n ResolvedStyle,\n ResolvedTheme,\n ResolvedValue,\n Shadow,\n ThemeIssue,\n ThemeMode,\n ThemeRecipes,\n ThemeSource,\n ThemeTokens,\n} from \"./theme-types\"\n\nexport const MODES: readonly ModeName[] = [`light`, `dark`]\nexport const DENSITIES: readonly Density[] = [`compact`, `default`, `comfortable`]\nexport const THEME_SCHEMA_ID = `https://ui.exponential.at/schemas/theme/v1.json`\n\nconst ID = /^[a-z][a-z0-9-]*$/\n/** Token groups whose values are per-mode (under `modes`), not under `tokens`. */\nconst MODE_GROUPS = new Set([`color`, `shadow`])\nconst STRING_GROUPS = new Set([`type.family`])\n/** Token groups whose values are cubic-bezier tuples. */\nconst TUPLE_GROUPS = new Set([`ease`])\n/** The mode-less NUMBER groups under `tokens`, in file order. */\nconst NUMBER_GROUPS = [`spacing`, `radius`, `control`, `opacity`, `border`, `motion`, `breakpoint`, `density`, `blur`, `scale`] as const\nconst TYPE_SUBGROUPS = [`size`, `lineHeight`, `weight`, `family`] as const\n/** Which token groups each recipe key accepts. */\nconst KEY_GROUPS: Record<string, readonly string[]> = {\n backgroundColor: [`color`],\n color: [`color`],\n borderColor: [`color`],\n borderWidth: [`border`, `control`],\n borderTopWidth: [`border`, `control`],\n borderRightWidth: [`border`, `control`],\n borderBottomWidth: [`border`, `control`],\n borderLeftWidth: [`border`, `control`],\n borderRadius: [`radius`, `spacing`],\n borderStyle: [],\n padding: [`spacing`],\n paddingHorizontal: [`spacing`],\n paddingVertical: [`spacing`],\n gap: [`spacing`],\n width: [`control`, `spacing`, `border`],\n height: [`control`, `spacing`, `border`],\n minWidth: [`control`, `spacing`],\n minHeight: [`control`, `spacing`],\n fontSize: [`type.size`],\n fontWeight: [`type.weight`],\n lineHeight: [`type.lineHeight`],\n fontFamily: [`type.family`],\n letterSpacing: [],\n textDecoration: [],\n textTransform: [],\n fontStyle: [],\n boxShadow: [`shadow`],\n opacity: [`opacity`],\n transition: [`motion`],\n transitionEasing: [`ease`],\n transform: [],\n backdropBlur: [`blur`],\n animation: [],\n}\nconst COLOR_KEYS = new Set([`backgroundColor`, `color`, `borderColor`])\n/** The ONLY free text a theme contributes to a stylesheet verbatim: a family\n * NAME (`tokens.type.family.*`) and a `fonts.*.fallback` list, both pasted\n * into `font-family` by the web renderers' `fontStack`. Letters, digits,\n * spaces, hyphens, commas and (balanced) quotes only, so a theme from a\n * share link can never close a declaration (`;`, `}`) or open a function\n * (`url(`). Every other string is an enum, a hex colour, a token ref or\n * the regex-gated `transform`. */\nconst FONT_TEXT = /^[A-Za-z0-9 ,'\"-]+$/\nconst FONT_TEXT_RULE = `letters, digits, spaces, hyphens, commas and balanced quotes only`\nexport function isFontText(value: unknown): value is string {\n if (typeof value !== `string` || value.length === 0 || !FONT_TEXT.test(value)) return false\n const count = (quote: string) => value.split(quote).length - 1\n return count(`\"`) % 2 === 0 && count(`'`) % 2 === 0\n}\nconst TOKEN_ONLY_KEYS = new Set([`fontFamily`, `boxShadow`, `transition`, `transitionEasing`, `backdropBlur`])\nconst ENUM_KEYS = new Set([`borderStyle`, `textDecoration`, `textTransform`, `fontStyle`, `animation`])\n\nexport class ThemeError extends Error {\n readonly issues: ThemeIssue[]\n constructor(id: string, issues: ThemeIssue[]) {\n super(`Theme \"${id}\" is invalid:\\n${issues.map((i) => ` ${i.path}: ${i.message}`).join(`\\n`)}`)\n this.name = `ThemeError`\n this.issues = issues\n }\n}\n\nexport interface ThemeOptions {\n /** Themes an `extends` may name (sources or already resolved). */\n themes?: readonly (ThemeSource | ResolvedTheme)[]\n extensions?: readonly ExtensionDef[]\n}\n\ntype Obj = Record<string, unknown>\nconst isObj = (v: unknown): v is Obj => typeof v === `object` && v !== null && !Array.isArray(v)\nconst known = (names: readonly string[]) => names.join(`|`)\n\n// ---------------------------------------------------------------------------\n// Validation (one file, no chain knowledge beyond \"does the parent exist\")\n// ---------------------------------------------------------------------------\n\nfunction checkNumberMap(value: unknown, path: string, names: readonly string[], issues: ThemeIssue[], range?: [number, number]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected an object of token values` })\n for (const [name, v] of Object.entries(value)) {\n if (!names.includes(name)) issues.push({ path: `${path}.${name}`, message: `unknown token; known: ${known(names)}` })\n else if (typeof v !== `number` || !Number.isFinite(v)) issues.push({ path: `${path}.${name}`, message: `expected a number` })\n else if (range && (v < range[0] || v > range[1])) issues.push({ path: `${path}.${name}`, message: `expected ${range[0]}–${range[1]}` })\n }\n}\n\nfunction checkEasingMap(value: unknown, path: string, names: readonly string[], issues: ThemeIssue[]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected an object of easing curves` })\n for (const [name, v] of Object.entries(value)) {\n if (!names.includes(name)) issues.push({ path: `${path}.${name}`, message: `unknown token; known: ${known(names)}` })\n else if (!Array.isArray(v) || v.length !== 4 || !v.every((n) => typeof n === `number` && Number.isFinite(n))) issues.push({ path: `${path}.${name}`, message: `expected [x1, y1, x2, y2]` })\n }\n}\n\nfunction checkShadow(value: unknown, path: string, issues: ThemeIssue[]): void {\n if (!Array.isArray(value)) return void issues.push({ path, message: `expected a list of shadow layers` })\n value.forEach((layer, i) => {\n const at = `${path}[${i}]`\n if (!isObj(layer)) return void issues.push({ path: at, message: `expected {x, y, blur, spread, color}` })\n for (const k of [`x`, `y`, `blur`, `spread`]) if (typeof layer[k] !== `number`) issues.push({ path: `${at}.${k}`, message: `expected a number` })\n if (!isThemeHex(layer.color)) issues.push({ path: `${at}.color`, message: `expected #rrggbb or #rrggbbaa` })\n })\n}\n\nfunction checkMode(value: unknown, path: string, issues: ThemeIssue[]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected {color, shadow}` })\n for (const [group, entries] of Object.entries(value)) {\n if (!MODE_GROUPS.has(group)) {\n issues.push({ path: `${path}.${group}`, message: `unknown mode group; known: color|shadow` })\n continue\n }\n if (!isObj(entries)) {\n issues.push({ path: `${path}.${group}`, message: `expected an object of token values` })\n continue\n }\n const names = TOKEN_GROUPS[group]\n for (const [name, v] of Object.entries(entries)) {\n const at = `${path}.${group}.${name}`\n if (!names.includes(name)) issues.push({ path: at, message: `unknown token; known: ${known(names)}` })\n else if (group === `color` && !isThemeHex(v)) issues.push({ path: at, message: `expected #rrggbb or #rrggbbaa (lowercase); the builder converts oklch/hsl on import` })\n else if (group === `shadow`) checkShadow(v, at, issues)\n }\n }\n}\n\nfunction checkModes(value: unknown, path: string, issues: ThemeIssue[]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected {light, dark}` })\n for (const [mode, v] of Object.entries(value)) {\n if (!MODES.includes(mode as ModeName)) issues.push({ path: `${path}.${mode}`, message: `unknown mode; known: light|dark` })\n else checkMode(v, `${path}.${mode}`, issues)\n }\n}\n\nfunction checkTokens(value: unknown, path: string, issues: ThemeIssue[]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected the token groups` })\n for (const [group, entries] of Object.entries(value)) {\n const at = `${path}.${group}`\n if (group === `type`) {\n if (!isObj(entries)) {\n issues.push({ path: at, message: `expected {size, lineHeight, weight, family}` })\n continue\n }\n for (const [sub, map] of Object.entries(entries)) {\n const g = `type.${sub}`\n if (!TOKEN_GROUPS[g]) issues.push({ path: `${at}.${sub}`, message: `unknown type group; known: size|lineHeight|weight|family` })\n else if (STRING_GROUPS.has(g)) {\n if (!isObj(map)) issues.push({ path: `${at}.${sub}`, message: `expected an object of family names` })\n else\n for (const [name, v] of Object.entries(map)) {\n if (!TOKEN_GROUPS[g].includes(name)) issues.push({ path: `${at}.${sub}.${name}`, message: `unknown token; known: ${known(TOKEN_GROUPS[g])}` })\n else if (typeof v !== `string` || v.length === 0) issues.push({ path: `${at}.${sub}.${name}`, message: `expected a font family name` })\n else if (!isFontText(v)) issues.push({ path: `${at}.${sub}.${name}`, message: `expected a font family name: ${FONT_TEXT_RULE}` })\n }\n } else checkNumberMap(map, `${at}.${sub}`, TOKEN_GROUPS[g], issues)\n }\n continue\n }\n if (MODE_GROUPS.has(group)) {\n issues.push({ path: at, message: `${group} values live under modes.light / modes.dark` })\n continue\n }\n if (!TOKEN_GROUPS[group]) {\n issues.push({ path: at, message: `unknown token group; known: ${known(Object.keys(TOKEN_GROUPS).filter((g) => !g.startsWith(`type.`) && !MODE_GROUPS.has(g)))}|type` })\n continue\n }\n if (TUPLE_GROUPS.has(group)) checkEasingMap(entries, at, TOKEN_GROUPS[group], issues)\n else checkNumberMap(entries, at, TOKEN_GROUPS[group], issues, group === `opacity` ? [0, 1] : group === `density` ? [0.5, 2] : group === `scale` ? [0.5, 1.5] : undefined)\n }\n}\n\nfunction checkFonts(value: unknown, path: string, issues: ThemeIssue[]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected an object keyed by family name` })\n for (const [family, spec] of Object.entries(value)) {\n const at = `${path}.${family}`\n if (!isObj(spec)) {\n issues.push({ path: at, message: `expected {fallback?, weights?, source?}` })\n continue\n }\n for (const key of Object.keys(spec)) if (![`fallback`, `weights`, `source`].includes(key)) issues.push({ path: `${at}.${key}`, message: `unknown font key; known: fallback|weights|source` })\n if (spec.fallback !== undefined && typeof spec.fallback !== `string`) issues.push({ path: `${at}.fallback`, message: `expected a string` })\n else if (spec.fallback !== undefined && !isFontText(spec.fallback)) issues.push({ path: `${at}.fallback`, message: `expected a font fallback list: ${FONT_TEXT_RULE}` })\n if (spec.weights !== undefined && (!Array.isArray(spec.weights) || !spec.weights.every((w) => typeof w === `number`))) issues.push({ path: `${at}.weights`, message: `expected a list of numbers` })\n if (spec.source !== undefined && spec.source !== `system` && spec.source !== `host`) issues.push({ path: `${at}.source`, message: `expected system|host` })\n }\n}\n\nfunction checkRecipeValue(key: string, value: unknown, path: string, issues: ThemeIssue[]): void {\n if (key === `native`) {\n if (typeof value !== `boolean`) issues.push({ path, message: `expected true|false` })\n return\n }\n if (ENUM_KEYS.has(key)) {\n const allowed = styleKeyEnum(key) ?? []\n if (!allowed.includes(value as string)) issues.push({ path, message: `expected ${known(allowed.map(String))}` })\n return\n }\n if (key === `transform`) {\n if (typeof value !== `string` || !STYLE_TRANSFORM.test(value)) issues.push({ path, message: `expected translate(Xpx, Ypx), scale(N) and/or rotate(Ndeg)` })\n return\n }\n const groups = KEY_GROUPS[key]\n const ref = parseTokenRef(value)\n if (ref) {\n if (!groups.includes(ref.group)) issues.push({ path, message: groups.length ? `expected a $${groups.join(`|$`)} token, got $${ref.group}` : `expected a number, not a token` })\n else if (!TOKEN_GROUPS[ref.group]?.includes(ref.name)) issues.push({ path, message: `unknown token ${value as string}; known: ${known(TOKEN_GROUPS[ref.group] ?? [])}` })\n return\n }\n if (COLOR_KEYS.has(key)) {\n if (!isThemeHex(value)) issues.push({ path, message: `expected #rrggbb, #rrggbbaa or $color.<name>` })\n return\n }\n if (TOKEN_ONLY_KEYS.has(key)) {\n issues.push({ path, message: `expected a $${groups[0]}.<name> token` })\n return\n }\n const weights = styleKeyEnum(`fontWeight`) ?? []\n if (typeof value !== `number` || !Number.isFinite(value)) issues.push({ path, message: groups.length ? `expected a number or a $${groups.join(`|$`)} token` : `expected a number` })\n else if (key === `opacity` && (value < 0 || value > 1)) issues.push({ path, message: `expected 0–1` })\n else if (key === `fontWeight` && !weights.includes(value)) issues.push({ path, message: `expected ${known(weights.map(String))} or $type.weight.<name>` })\n}\n\nfunction checkRule(rule: unknown, path: string, spec: PartSpec, issues: ThemeIssue[]): void {\n if (!isObj(rule)) return void issues.push({ path, message: `expected {when?, style}` })\n for (const key of Object.keys(rule)) if (key !== `when` && key !== `style`) issues.push({ path: `${path}.${key}`, message: `unknown rule key; known: when|style` })\n if (rule.when !== undefined) {\n if (!isObj(rule.when)) issues.push({ path: `${path}.when`, message: `expected an object of recipe props` })\n else\n for (const [k, v] of Object.entries(rule.when)) {\n const at = `${path}.when.${k}`\n if (k === `state`) {\n const states = Array.isArray(v) ? v : [v]\n for (const s of states) if (!RECIPE_STATES.includes(s as string)) issues.push({ path: at, message: `unknown state; known: ${known(RECIPE_STATES)}` })\n } else if (!spec.props.includes(k)) issues.push({ path: at, message: `not a recipe prop of this part; known: ${known([`state`, ...spec.props])}` })\n else {\n const ok = (x: unknown) => [`string`, `number`, `boolean`].includes(typeof x)\n if (!(ok(v) || (Array.isArray(v) && v.every(ok)))) issues.push({ path: at, message: `expected a value or a list of values` })\n }\n }\n }\n if (!isObj(rule.style)) return void issues.push({ path: `${path}.style`, message: `expected a style object` })\n for (const [key, value] of Object.entries(rule.style)) {\n const at = `${path}.style.${key}`\n if (!RECIPE_KEYS.includes(key)) issues.push({ path: at, message: `not a recipe key; known: ${known(RECIPE_KEYS)}` })\n else checkRecipeValue(key, value, at, issues)\n }\n}\n\nfunction checkRecipes(value: unknown, path: string, parts: Record<string, PartSpec>, issues: ThemeIssue[]): void {\n if (!isObj(value)) return void issues.push({ path, message: `expected an object keyed by component` })\n for (const [component, byPart] of Object.entries(value)) {\n const at = `${path}.${component}`\n const spec = parts[component]\n if (!spec) {\n issues.push({ path: at, message: `unknown component` })\n continue\n }\n if (!isObj(byPart)) {\n issues.push({ path: at, message: `expected an object keyed by part; known: ${known(spec.parts)}` })\n continue\n }\n for (const [part, rules] of Object.entries(byPart)) {\n const atPart = `${at}.${part}`\n if (!spec.parts.includes(part)) {\n issues.push({ path: atPart, message: `unknown part; known: ${known(spec.parts)}` })\n continue\n }\n if (!Array.isArray(rules)) {\n issues.push({ path: atPart, message: `expected a list of rules [{when?, style}]` })\n continue\n }\n rules.forEach((rule, i) => checkRule(rule, `${atPart}[${i}]`, spec, issues))\n }\n }\n}\n\nconst THEME_KEYS = [`$schema`, `$comment`, `id`, `name`, `extends`, `modes`, `contrast`, `tokens`, `fonts`, `recipes`]\n\n/** Every problem in ONE theme file, each with a path and a readable\n * message. Never throws: a non-object is one issue. */\nexport function validateTheme(source: unknown, options: ThemeOptions = {}): ThemeIssue[] {\n const issues: ThemeIssue[] = []\n if (!isObj(source)) return [{ path: `theme`, message: `expected a theme object {id, name, modes, tokens, recipes}` }]\n // Round 4 (VAPP-103): the schema id is READ, not just tolerated: a theme\n // written for another (or no) format version is refused outright.\n if (source.$schema !== THEME_SCHEMA_ID) issues.push({ path: `$schema`, message: `expected \"${THEME_SCHEMA_ID}\"` })\n if (typeof source.id !== `string` || !ID.test(source.id)) issues.push({ path: `id`, message: `expected a kebab-case id` })\n if (typeof source.name !== `string` || source.name.length === 0) issues.push({ path: `name`, message: `expected a name` })\n for (const key of Object.keys(source))\n if (!THEME_KEYS.includes(key)) issues.push({ path: key, message: `unknown theme key; known: id|name|extends|modes|contrast|tokens|fonts|recipes` })\n if (source.extends !== undefined) {\n const parents = (options.themes ?? []).map((t) => t.id)\n if (typeof source.extends !== `string`) issues.push({ path: `extends`, message: `expected a theme id` })\n else if (!parents.includes(source.extends)) issues.push({ path: `extends`, message: `unknown theme \"${source.extends}\"; known: ${known(parents)}` })\n else if (source.extends === source.id) issues.push({ path: `extends`, message: `a theme cannot extend itself` })\n }\n if (source.modes !== undefined) checkModes(source.modes, `modes`, issues)\n if (source.contrast !== undefined) checkModes(source.contrast, `contrast`, issues)\n if (source.tokens !== undefined) checkTokens(source.tokens, `tokens`, issues)\n if (source.fonts !== undefined) checkFonts(source.fonts, `fonts`, issues)\n if (source.recipes !== undefined) checkRecipes(source.recipes, `recipes`, recipeParts(options.extensions), issues)\n return issues\n}\n\n// ---------------------------------------------------------------------------\n// Resolution: flatten the chain, check completeness\n// ---------------------------------------------------------------------------\n\nconst emptyMode = (): ThemeMode => ({ color: {}, shadow: {} })\n\nfunction emptyTheme(source: ThemeSource): ResolvedTheme {\n return {\n id: source.id,\n name: source.name,\n chain: [],\n modes: { light: emptyMode(), dark: emptyMode() },\n contrast: { light: emptyMode(), dark: emptyMode() },\n tokens: { spacing: {}, radius: {}, type: { size: {}, lineHeight: {}, weight: {}, family: {} }, control: {}, opacity: {}, border: {}, motion: {}, breakpoint: {}, ease: {}, density: {}, blur: {}, scale: {} },\n fonts: {},\n recipes: {},\n }\n}\n\nfunction isResolved(t: ThemeSource | ResolvedTheme): t is ResolvedTheme {\n return Array.isArray((t as ResolvedTheme).chain)\n}\n\nfunction clone<T>(v: T): T {\n return JSON.parse(JSON.stringify(v)) as T\n}\n\nfunction overlayMode(target: ThemeMode, source: Partial<ThemeMode> | undefined): void {\n if (!source) return\n Object.assign(target.color, source.color ?? {})\n Object.assign(target.shadow, clone(source.shadow ?? {}))\n}\n\nfunction overlay(target: ResolvedTheme, source: ThemeSource): void {\n for (const mode of MODES) {\n overlayMode(target.modes[mode], source.modes?.[mode])\n overlayMode(target.contrast[mode], source.contrast?.[mode])\n }\n const t = source.tokens\n if (t) {\n for (const group of NUMBER_GROUPS) Object.assign(target.tokens[group], t[group] ?? {})\n Object.assign(target.tokens.ease, clone(t.ease ?? {}))\n for (const sub of TYPE_SUBGROUPS) Object.assign(target.tokens.type[sub], t.type?.[sub] ?? {})\n }\n Object.assign(target.fonts, clone(source.fonts ?? {}))\n for (const [component, byPart] of Object.entries(source.recipes ?? {})) {\n const parts = (target.recipes[component] ??= {})\n for (const [part, rules] of Object.entries(byPart)) (parts[part] ??= []).push(...clone(rules))\n }\n}\n\nfunction overlayResolved(target: ResolvedTheme, parent: ResolvedTheme): void {\n for (const mode of MODES) {\n overlayMode(target.modes[mode], parent.modes[mode])\n overlayMode(target.contrast[mode], parent.contrast?.[mode])\n }\n target.tokens = clone(parent.tokens)\n target.fonts = clone(parent.fonts)\n target.recipes = clone(parent.recipes)\n}\n\n/** The token names the merged theme still lacks, as issues. */\nfunction completeness(theme: ResolvedTheme): ThemeIssue[] {\n const issues: ThemeIssue[] = []\n for (const [group, names] of Object.entries(TOKEN_GROUPS)) {\n for (const name of names) {\n if (MODE_GROUPS.has(group)) {\n for (const mode of MODES) {\n const table = theme.modes[mode][group as `color` | `shadow`] as Record<string, unknown>\n if (table[name] === undefined) issues.push({ path: `modes.${mode}.${group}.${name}`, message: `missing value for $${group}.${name}` })\n }\n continue\n }\n const table = group.startsWith(`type.`)\n ? (theme.tokens.type as unknown as Record<string, Record<string, unknown>>)[group.slice(5)]\n : (theme.tokens as unknown as Record<string, Record<string, unknown>>)[group]\n if (table?.[name] === undefined) issues.push({ path: `tokens.${group}.${name}`, message: `missing value for $${group}.${name}` })\n }\n }\n for (const family of Object.values(theme.tokens.type.family)) {\n if (!theme.fonts[family]) issues.push({ path: `fonts.${family}`, message: `family named by tokens.type.family has no fonts entry` })\n }\n return issues\n}\n\n/** The source(s) a chain needs, root first; null when a link is missing. */\nfunction chainOf(source: ThemeSource, options: ThemeOptions): (ThemeSource | ResolvedTheme)[] | ThemeIssue {\n const registry = options.themes ?? []\n const chain: (ThemeSource | ResolvedTheme)[] = [source]\n const seen = new Set([source.id])\n let current: ThemeSource | ResolvedTheme = source\n while (!isResolved(current) && current.extends) {\n const parentId: string = current.extends\n const parent = registry.find((t) => t.id === parentId)\n if (!parent) return { path: `extends`, message: `unknown theme \"${parentId}\"` }\n if (seen.has(parent.id)) return { path: `extends`, message: `cycle: ${[...seen, parent.id].join(` → `)}` }\n seen.add(parent.id)\n chain.unshift(parent)\n current = parent\n }\n return chain\n}\n\n/** Validate + flatten, returning issues instead of throwing. */\nexport function tryLoadTheme(source: unknown, options: ThemeOptions = {}): { theme: ResolvedTheme | null; issues: ThemeIssue[] } {\n const issues = validateTheme(source, options)\n if (issues.length > 0) return { theme: null, issues }\n const src = source as ThemeSource\n const chain = chainOf(src, options)\n if (!Array.isArray(chain)) return { theme: null, issues: [chain] }\n const theme = emptyTheme(src)\n for (const link of chain) {\n if (isResolved(link)) {\n overlayResolved(theme, link)\n theme.chain.push(...link.chain)\n continue\n }\n if (link !== src) {\n const parentIssues = validateTheme(link, options)\n if (parentIssues.length > 0) return { theme: null, issues: parentIssues.map((i) => ({ path: `extends(${link.id}).${i.path}`, message: i.message })) }\n }\n overlay(theme, link)\n theme.chain.push(link.id)\n }\n const missing = completeness(theme)\n if (missing.length > 0) return { theme: null, issues: missing }\n return { theme, issues: [] }\n}\n\n/** A theme file → the flat theme a painter uses. Throws `ThemeError` with\n * every issue listed, never anything else. */\nexport function loadTheme(source: unknown, options: ThemeOptions = {}): ResolvedTheme {\n const { theme, issues } = tryLoadTheme(source, options)\n if (!theme) throw new ThemeError(isObj(source) && typeof source.id === `string` ? source.id : `?`, issues)\n return theme\n}\n\n// ---------------------------------------------------------------------------\n// Surface settings: mode, density, contrast\n// ---------------------------------------------------------------------------\n\n/** `system` → what the platform prefers; a mode stays itself. */\nexport function resolveMode(setting: ModeSetting, systemPrefersDark: boolean): ModeName {\n if (setting === `system`) return systemPrefersDark ? `dark` : `light`\n return setting\n}\n\nfunction scaled(table: Record<string, number>, factor: number): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [k, v] of Object.entries(table)) out[k] = Math.round(v * factor)\n return out\n}\n\n/** The theme a surface of this density runs with: `control` and `spacing`\n * scaled by the theme's `$density.<name>` multiplier and rounded to whole\n * px; `default` returns the theme itself. Done once per surface, so every\n * resolver and fixture stays density-agnostic. */\nexport function applyDensity(theme: ResolvedTheme, density: Density): ResolvedTheme {\n if (density === `default`) return theme\n const factor = theme.tokens.density[density]\n if (typeof factor !== `number`) return theme\n return { ...theme, tokens: { ...theme.tokens, control: scaled(theme.tokens.control, factor), spacing: scaled(theme.tokens.spacing, factor) } }\n}\n\n/** The theme with its high-contrast overlays merged into the modes (the\n * platform asked for more contrast). A theme without overlays is unchanged. */\nexport function applyContrast(theme: ResolvedTheme): ResolvedTheme {\n const modes = {} as Record<ModeName, ThemeMode>\n for (const mode of MODES) {\n modes[mode] = { color: { ...theme.modes[mode].color, ...theme.contrast[mode].color }, shadow: { ...theme.modes[mode].shadow, ...theme.contrast[mode].shadow } }\n }\n return { ...theme, modes }\n}\n\n// ---------------------------------------------------------------------------\n// Resolving values for one mode\n// ---------------------------------------------------------------------------\n\n/** `$color.primary` in `dark` → `#e5e5e5`; `$spacing.md` → 12; `$shadow.sm`\n * → the layers; `$type.family.sans` → `Inter`; `$ease.standard` → the four\n * control points. Undefined when not a token. */\nexport function resolveToken(theme: ResolvedTheme, ref: unknown, mode: ModeName): ResolvedValue | undefined {\n const parsed = parseTokenRef(ref)\n if (!parsed) return undefined\n const { group, name } = parsed\n if (group === `color`) return theme.modes[mode].color[name]\n if (group === `shadow`) return theme.modes[mode].shadow[name]\n if (group.startsWith(`type.`)) return (theme.tokens.type as unknown as Record<string, Record<string, ResolvedValue>>)[group.slice(5)]?.[name]\n return (theme.tokens as unknown as Record<string, Record<string, ResolvedValue>>)[group]?.[name]\n}\n\nconst BREAKPOINT_REF = /\\$breakpoint\\.([a-zA-Z0-9]+)/\n\n/** A media key with its `$breakpoint.<name>` replaced by the theme's px. */\nexport function resolveConditionKey(theme: ResolvedTheme, key: string): string {\n if (!STYLE_MEDIA.test(key)) return key\n return key.replace(BREAKPOINT_REF, (whole, name: string) => {\n const px = theme.tokens.breakpoint[name]\n return typeof px === `number` ? `${px}px` : whole\n })\n}\n\n/** Every token reference in a style object replaced by its value for the\n * mode (nested condition blocks, gradients and arrays included, and the\n * `$breakpoint` tokens inside media keys); other values pass through. */\nexport function resolveStyleValues<T extends Record<string, unknown>>(theme: ResolvedTheme, style: T, mode: ModeName): T {\n const resolve = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(resolve)\n if (isObj(value)) return resolveStyleValues(theme, value, mode)\n if (typeof value === `string` && value.startsWith(`$`)) {\n const resolved = resolveToken(theme, value, mode)\n return resolved === undefined ? value : resolved\n }\n return value\n }\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(style)) out[resolveConditionKey(theme, key)] = resolve(value)\n return out as T\n}\n\nfunction matches(rule: RecipeRule, props: Record<string, unknown>, states: readonly string[]): boolean {\n if (!rule.when) return true\n for (const [key, want] of Object.entries(rule.when)) {\n if (key === `state`) {\n const needed = Array.isArray(want) ? want : [want]\n if (!needed.every((s) => states.includes(s as string))) return false\n continue\n }\n const actual = props[key]\n if (Array.isArray(want) ? !want.includes(actual as string) : actual !== want) return false\n }\n return true\n}\n\n/** How specific a rule is: one point per `when` condition (a `state` list\n * counts each state). VAPP-90: rules merge in SPECIFICITY order, like the\n * CSS the web renderer compiles them to — a base rule (no `when`) never\n * shadows a `checked`/`focus`/`variant` rule that sits before it, which is\n * what a child theme's appended base override used to do under plain\n * source order. Ties keep source order (later wins). */\nexport function ruleSpecificity(rule: RecipeRule): number {\n if (!rule.when) return 0\n let n = 0\n for (const [key, want] of Object.entries(rule.when)) n += key === `state` && Array.isArray(want) ? want.length : 1\n return n\n}\n\n/** The matching rules' styles merged by specificity (token refs kept). */\nexport function recipeStyle(theme: ResolvedTheme, query: RecipeQuery): RecipeStyle {\n const rules = theme.recipes[query.component]?.[query.part] ?? []\n const props = query.props ?? {}\n const states = query.states ?? []\n const ordered = rules.map((rule, index) => ({ rule, index, specificity: ruleSpecificity(rule) })).sort((a, b) => a.specificity - b.specificity || a.index - b.index)\n const out: RecipeStyle = {}\n for (const { rule } of ordered) if (matches(rule, props, states)) Object.assign(out, rule.style)\n return out\n}\n\n/** A part's concrete visuals for one mode: the fixture\n * `theme-recipes.json` locks this per theme × component. */\nexport function resolveRecipe(theme: ResolvedTheme, query: RecipeQuery, mode: ModeName): ResolvedStyle {\n return resolveStyleValues(theme, recipeStyle(theme, query) as Record<string, unknown>, mode) as ResolvedStyle\n}\n\n/** The recipe query a NORMALIZED node answers to: its macro part, or the\n * native's root with its own recipe props. */\nexport function nodeRecipeQuery(node: UiNode, extensions: readonly ExtensionDef[] = []): RecipeQuery {\n if (node.recipe) return { component: node.recipe.macro, part: node.recipe.part, props: node.recipe.props }\n return { component: node.component, part: `root`, props: nativeRecipeProps(node.component, node.props, extensions) }\n}\n\n/** What a painter paints a node with: native recipe < node style < macro\n * part recipe, token references resolved, condition blocks kept nested\n * (the client resolves `@media` and the state keys itself). */\nexport function resolveNodeStyle(\n theme: ResolvedTheme,\n node: UiNode,\n mode: ModeName,\n states: readonly string[] = [],\n extensions: readonly ExtensionDef[] = []\n): ResolvedStyle {\n const own = resolveRecipe(theme, { component: node.component, part: `root`, props: nativeRecipeProps(node.component, node.props, extensions), states }, mode)\n const style = node.style ? resolveStyleValues(theme, node.style, mode) : {}\n const part = node.recipe ? resolveRecipe(theme, { ...nodeRecipeQuery(node, extensions), states }, mode) : {}\n return { ...own, ...(style as ResolvedStyle), ...part }\n}\n\n/** The shadow layers as one CSS `box-shadow` string (for web painters). */\nexport function shadowCss(layers: Shadow[]): string {\n return layers.length === 0 ? `none` : layers.map((l) => `${l.x}px ${l.y}px ${l.blur}px ${l.spread}px ${l.color}`).join(`, `)\n}\n\n/** An easing as CSS `cubic-bezier(…)`. */\nexport function easingCss(curve: Easing): string {\n return `cubic-bezier(${curve.join(`, `)})`\n}\n\n/** The parts of the theme a mode-less consumer may list (the builder). */\nexport function themeTokens(theme: ResolvedTheme): ThemeTokens {\n return theme.tokens\n}\nexport function themeMode(theme: ResolvedTheme, mode: ModeName): ThemeMode {\n return theme.modes[mode]\n}\nexport type { ThemeRecipes }\n",
9
+ "// VAPP-92: the four built-in themes, compiled in. `exponential` is GENERATED from\n// packages/design-tokens (the app's values) + the hand-authored glass\n// recipes; `neutral` is stock shadcn (light + dark) and the ROOT the others\n// extend; `playful` is the deliberately different test theme (rounded,\n// colourful, another family) the conformance suite renders on every painter;\n// `orange` (FEED-128) is the brand-coloured reference: `exponential` with an\n// orange primary, colours only.\n\nimport exponentialJson from \"../themes/exponential.theme.json\" with { type: \"json\" }\nimport neutralJson from \"../themes/neutral.theme.json\" with { type: \"json\" }\nimport orangeJson from \"../themes/orange.theme.json\" with { type: \"json\" }\nimport playfulJson from \"../themes/playful.theme.json\" with { type: \"json\" }\nimport { loadTheme, tryLoadTheme } from \"./theme\"\nimport type { ResolvedTheme, ThemeIssue, ThemeSource } from \"./theme-types\"\n\nexport const neutralTheme = neutralJson as unknown as ThemeSource\nexport const exponentialTheme = exponentialJson as unknown as ThemeSource\nexport const playfulTheme = playfulJson as unknown as ThemeSource\nexport const orangeTheme = orangeJson as unknown as ThemeSource\n\n/** Source order = resolution order: a built-in may only extend one before it. */\nexport const BUILTIN_THEMES: readonly ThemeSource[] = [neutralTheme, exponentialTheme, playfulTheme, orangeTheme]\nexport const BUILTIN_THEME_IDS: readonly string[] = BUILTIN_THEMES.map((t) => t.id)\nexport const DEFAULT_THEME_ID = `exponential`\n\nconst resolved = new Map<string, ResolvedTheme>()\n\n/** A built-in, resolved once per process. */\nexport function builtinTheme(id: string): ResolvedTheme {\n const cached = resolved.get(id)\n if (cached) return cached\n const source = BUILTIN_THEMES.find((t) => t.id === id)\n if (!source) throw new Error(`unknown built-in theme \"${id}\"; known: ${BUILTIN_THEME_IDS.join(`|`)}`)\n const theme = loadTheme(source, { themes: BUILTIN_THEMES })\n resolved.set(id, theme)\n return theme\n}\n\n/** Round 4 (VAPP-103): the theme a host paints with, NEVER a throw: a\n * built-in id or a theme file over the built-ins; anything unusable (an\n * unknown id, a bad `$schema`, an unknown token, a missing value) falls back\n * to the default theme with the issues saying why (Rust\n * `themes::theme_or_default`, Swift/Kotlin `ThemeHandle.loadOrDefault`). */\nexport function themeOrDefault(input: unknown): { theme: ResolvedTheme; issues: ThemeIssue[] } {\n if (typeof input === `string`) {\n if (BUILTIN_THEME_IDS.includes(input)) return { theme: builtinTheme(input), issues: [] }\n return { theme: builtinTheme(DEFAULT_THEME_ID), issues: [{ path: `theme`, message: `unknown built-in theme \"${input}\"; known: ${BUILTIN_THEME_IDS.join(`|`)}` }] }\n }\n const { theme, issues } = tryLoadTheme(input, { themes: BUILTIN_THEMES })\n return theme ? { theme, issues: [] } : { theme: builtinTheme(DEFAULT_THEME_ID), issues }\n}\n\n/** Every built-in resolved, in source order. */\nexport function builtinThemes(): ResolvedTheme[] {\n return BUILTIN_THEME_IDS.map(builtinTheme)\n}\n",
10
+ "// VAPP-91: the host API contract (`catalog/host.json`) as typed constants,\n// plus the message and op shapes every platform host speaks.\n\nimport hostJson from \"../../catalog/host.json\" with { type: \"json\" }\nimport type { FlatComponent } from \"../types\"\n\nexport const HOST_CONTRACT = hostJson\nexport const HOST_CONTRACT_VERSION: number = hostJson.version\nexport const A2UI_MESSAGE_KINDS: readonly string[] = hostJson.messages.a2ui\nexport const EXTENSION_MESSAGE_KINDS: readonly string[] = hostJson.messages.extensions\nexport const MESSAGE_KINDS: readonly string[] = [...hostJson.messages.a2ui, ...hostJson.messages.extensions]\nexport const HOST_ERROR_CODES: readonly string[] = hostJson.clientMessages.errorCodes\nexport const DEFAULT_URL_SCHEMES: readonly string[] = hostJson.urls.defaultSchemes\n/** The media loader's schemes when the host lists none (no `file`). */\nexport const DEFAULT_MEDIA_SCHEMES: readonly string[] = hostJson.media.defaultSchemes\n/** What every image loader enforces (`media.limits`). */\nexport const MEDIA_LIMITS: { readonly maxBytes: number; readonly timeoutMs: number; readonly maxPixels: number } = hostJson.media.limits\n/** The renderer → host hook a failed painter calls (`paint.hook`) and the\n * A2UI error code the host forwards it with (`paint.errorCode`). */\nexport const PAINT_ERROR_HOOK: string = hostJson.paint.hook\nexport const RENDER_FAILED = `RENDER_FAILED` as const\nexport const MCP_MIME_TYPES: readonly string[] = hostJson.transport.mcpMimeTypes\nexport const MCP_ACTION_TOOL: string = hostJson.transport.mcpActionTool\nexport const SSE_EVENTS: readonly string[] = hostJson.transport.sseEvents\n/** Round 2: what a host hands each surface (`surface`): the SurfaceSettings\n * keys, the Formatter's methods, the commands a live surface takes. */\nexport const SURFACE_SETTING_KEYS: readonly string[] = hostJson.surface.settings\nexport const FORMATTER_METHODS: readonly string[] = hostJson.surface.formatter\nexport const SURFACE_COMMANDS: readonly string[] = hostJson.surface.commands\n\nexport type HostErrorCode =\n | `VALIDATION_FAILED`\n | `INVALID_MESSAGE`\n | `UNSUPPORTED_CATALOG`\n | `SURFACE_NOT_FOUND`\n | `TEMPLATE_NOT_FOUND`\n | `FUNCTION_NOT_FOUND`\n | `FUNCTION_DENIED`\n | `SOURCE_DENIED`\n | `RENDER_FAILED`\n\n/** A server → client message: the four A2UI v0.9 kinds plus the two\n * Exponential UI extensions. */\nexport interface ServerMessage {\n version?: string\n createSurface?: { surfaceId: string; catalogId: string; theme?: unknown; sendDataModel?: boolean }\n updateComponents?: { surfaceId: string; components: FlatComponent[] }\n updateDataModel?: { surfaceId: string; path?: string; value?: unknown }\n deleteSurface?: { surfaceId: string }\n applyTemplate?: { surfaceId: string; templateId: string; packageId?: string; data?: unknown }\n bindDataModel?: { surfaceId: string; path: string; source: string }\n}\n\nexport interface ClientAction {\n name: string\n surfaceId: string\n sourceComponentId: string\n timestamp: string\n context: Record<string, unknown>\n payload?: Record<string, unknown>\n}\n\nexport interface ClientError {\n code: HostErrorCode | (string & {})\n surfaceId: string\n message: string\n path?: string\n}\n\n/** A client → server message (A2UI v0.9 client_to_server). */\nexport type ClientMessage = { version: string; action: ClientAction } | { version: string; error: ClientError }\n\n/** What the router turns a message into; the platform host performs the\n * ops in order (`catalog/host.json` `ops`). */\nexport type HostOp =\n | { op: `create`; surfaceId: string; catalogId: string; theme?: unknown; sendDataModel?: boolean }\n | { op: `components`; surfaceId: string; components: FlatComponent[] }\n | { op: `data`; surfaceId: string; path: string; value?: unknown }\n | { op: `bind`; surfaceId: string; path: string; source: string }\n | { op: `delete`; surfaceId: string }\n | { op: `send`; message: ClientMessage }\n\nexport function errorMessage(code: HostErrorCode, surfaceId: string, message: string, path?: string): ClientMessage {\n return { version: hostJson.a2uiVersion, error: path === undefined ? { code, surfaceId, message } : { code, surfaceId, message, path } }\n}\n\nexport function actionMessage(action: ClientAction): ClientMessage {\n const out: ClientAction = { name: action.name, surfaceId: action.surfaceId, sourceComponentId: action.sourceComponentId, timestamp: action.timestamp, context: action.context ?? {} }\n if (action.payload && Object.keys(action.payload).length) out.payload = action.payload\n return { version: hostJson.a2uiVersion, action: out }\n}\n"
11
+ ],
12
+ "mappings": "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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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",
13
+ "debugId": "C50967464EE359D064756E2164756E21",
14
+ "names": []
15
+ }