@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,26 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/web/theme-css.ts", "../src/web/box-css.ts", "../src/web/data.ts", "../src/web/base-css.ts", "../src/web/urls.ts", "../src/web/host-types.ts", "../src/web/coerce.ts", "../src/web/table.ts", "../src/web/dates.ts", "../src/web/inputs.ts", "../src/web/media.ts", "../src/web/markdown.ts", "../src/web/form.ts", "../src/web/list.ts", "../src/web/listbox.ts", "../src/web/parts.ts", "../src/web/share.ts"],
4
+ "sourcesContent": [
5
+ "// VAPP-87: a RESOLVED theme → one scoped stylesheet. The theme compiles to\n// 1. a CSS-variable block on the surface root (`--xui-*` for every token,\n// per mode under `data-xui-mode`, plus the shadcn aliases `--primary`…\n// and the app's `--glass-*` set so the Tailwind-built primitives inside a\n// surface wear the same theme), and\n// 2. one class per component PART (`xui-<Component>-<part>`) whose rules\n// are the theme's recipes: a `when` on recipe props becomes a\n// `[data-r-<prop>=\"…\"]` attribute selector, a `when` on `state` the\n// pseudo-class (`:hover`, `:active`, `:focus-visible`, `:disabled`) or\n// the Radix state attribute, and in every case the forced-state marker\n// `[data-xs~=\"<state>\"]` the recipe sheet uses.\n// Token references stay `var(--xui-…)`, so a mode switch is one attribute\n// flip and never a recompile; the three cascade layers (`xui-recipe` <\n// `xui-node` < `xui-part`) ARE the painter precedence of\n// `resolveNodeStyle` (native recipe < node style < macro part recipe).\n// Everything is scoped by a class derived from the theme's content, so two\n// surfaces on one page can wear two themes and a host page's own\n// Tailwind/shadcn variables are never touched.\n\nimport { ANIMATIONS, animatesOpacity, coreCatalog, easingCss, parseTokenRef, shadowCss } from \"@exponential-at/ui\"\nimport type { Easing, FontSpec, RecipeRule, ResolvedTheme, Shadow } from \"@exponential-at/ui\"\n\nexport const LAYERS = `@layer xui-base, xui-recipe, xui-node, xui-part;`\n\n/** Keys whose numbers carry no unit. */\nconst UNITLESS = new Set([`flexGrow`, `flexShrink`, `opacity`, `fontWeight`, `aspectRatio`, `zIndex`])\n\nconst kebab = (key: string) => key.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)\n\n/** `$color.primary` → `--xui-color-primary`; `$type.lineHeight.sm` →\n * `--xui-type-lineHeight-sm` (the group path verbatim); `$type.family.sans`\n * → `--xui-font-sans`. */\nexport function tokenVarName(ref: string): string | null {\n const parsed = parseTokenRef(ref)\n if (!parsed) return null\n const { group, name } = parsed\n if (group === `type.family`) return `--xui-font-${name}`\n return `--xui-${group.replace(/\\./g, `-`)}-${name}`\n}\n\nexport function tokenVar(ref: string): string | null {\n const name = tokenVarName(ref)\n return name ? `var(${name})` : null\n}\n\n/** A CSS string literal: backslashes and quotes escaped, so a family name\n * can never end the string early (`validateTheme` refuses them too; this\n * mirrors the core's `css.ts` `cssString`). */\nfunction cssString(text: string): string {\n return `\"${text.replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`)}\"`\n}\n\nfunction fontStack(family: string, fonts: Record<string, FontSpec>): string {\n const fallback = fonts[family]?.fallback\n return fallback ? `${cssString(family)}, ${fallback}` : cssString(family)\n}\n\n/** One style value → its CSS text; `null` = nothing to emit. */\nexport function cssValue(key: string, value: unknown, fonts: Record<string, FontSpec> = {}): string | null {\n if (value === undefined || value === null || typeof value === `boolean`) return null\n // A dynamic node-style value: the variable `NodeView` sets (box-css.ts).\n if (typeof value === `string` && value.startsWith(`var(--xd-`)) return value\n if (typeof value === `string` && value.startsWith(`$`)) {\n const v = tokenVar(value)\n if (v) return v\n }\n if (key === `boxShadow`) return Array.isArray(value) ? shadowCss(value as Shadow[]) : String(value)\n if (key === `fontFamily`) return fontStack(String(value), fonts)\n if (key === `gridTemplateAreas` && Array.isArray(value)) return value.map((row) => `\"${row}\"`).join(` `)\n if (key === `backgroundGradient`) return gradientValue(value)\n if (key === `transitionEasing`) return Array.isArray(value) ? easingCss(value as Easing) : String(value)\n if (key === `transition`) return typeof value === `number` ? `${value}ms` : String(value)\n if (typeof value === `object`) return null\n if (typeof value === `number`) return UNITLESS.has(key) ? String(value) : `${value}px`\n if ((key === `overflow` || key === `overflowX` || key === `overflowY`) && value === `hidden`) return `clip`\n return String(value)\n}\n\n/** `backgroundGradient` `{angle, stops}` → `linear-gradient(…)`, token\n * colours as variables (painted over `backgroundColor`, contract §2). */\nfunction gradientValue(value: unknown): string | null {\n if (typeof value !== `object` || value === null) return null\n const g = value as { angle?: unknown; stops?: { color?: unknown; offset?: unknown }[] }\n if (!Array.isArray(g.stops) || g.stops.length < 2) return null\n const stops = g.stops.map((s) => {\n const color = typeof s.color === `string` && s.color.startsWith(`$`) ? (tokenVar(s.color) ?? s.color) : String(s.color)\n return `${color} ${Math.round(Number(s.offset ?? 0) * 10000) / 100}%`\n })\n return `linear-gradient(${Number(g.angle ?? 180)}deg, ${stops.join(`, `)})`\n}\n\n/** The logical/shorthand keys the Box whitelist has that CSS does not. */\nconst SHORTHANDS: Record<string, string[]> = {\n paddingHorizontal: [`padding-left`, `padding-right`],\n paddingVertical: [`padding-top`, `padding-bottom`],\n marginHorizontal: [`margin-left`, `margin-right`],\n marginVertical: [`margin-top`, `margin-bottom`],\n backgroundGradient: [`background-image`],\n // `transition` = the duration of an `all` transition; the easing is its\n // own longhand so a state rule may change one without the other.\n transition: [`transition-property:all`, `transition-duration`],\n transitionEasing: [`transition-timing-function`],\n}\n\nconst BORDER_WIDTHS = [`borderWidth`, `borderTopWidth`, `borderRightWidth`, `borderBottomWidth`, `borderLeftWidth`]\n\n/** Flat declarations (`prop:value` pairs) for one condition-free style. A\n * border width without a `borderStyle` is solid (contract §2). An\n * animation that moves opacity MULTIPLIES the node's own (round 2 §2): the\n * keyframes move `--xui-a-opacity` and `opacity` = own ×\n * `var(--xui-a-opacity, 1)`. `base` = the style a condition block cascades\n * over, so a block that adds only the animation (or only the opacity)\n * still multiplies the other's value. */\nexport function declarations(style: Record<string, unknown>, fonts: Record<string, FontSpec> = {}, base?: Record<string, unknown>): [string, string][] {\n const out: [string, string][] = []\n const animation = `animation` in style ? style.animation : base?.animation\n const multiply = typeof animation === `string` && animatesOpacity(animation) && (`animation` in style || `opacity` in style)\n for (const [key, value] of Object.entries(style)) {\n if (key === `native` || key.startsWith(`@`) || key.startsWith(`:`)) continue\n if (typeof value === `object` && value !== null && !Array.isArray(value) && key !== `backgroundGradient`) continue\n // Round 2 §2: `backdropBlur` ($blur token), `animation` (a keyframe set\n // of style.json, timed by the motion tokens) + `animationDuration`.\n if (key === `backdropBlur`) {\n const v = cssValue(key, value, fonts)\n if (v) out.push([`-webkit-backdrop-filter`, `blur(${v})`], [`backdrop-filter`, `blur(${v})`])\n continue\n }\n if (key === `animation`) {\n out.push(...animationDeclarations(value, style.animationDuration))\n continue\n }\n if (key === `animationDuration`) {\n // Alone (a state or media block): the duration, the set's factor kept\n // through `--xui-anim-factor`.\n const v = typeof value === `string` ? tokenVar(value) : null\n if (v && !(`animation` in style)) out.push([`animation-duration`, `calc(${v} * var(--xui-anim-factor, 1))`])\n continue\n }\n const css = cssValue(key, value, fonts)\n if (css === null) continue\n for (const target of SHORTHANDS[key] ?? [kebab(key)]) {\n const fixed = target.indexOf(`:`)\n if (fixed > 0) out.push([target.slice(0, fixed), target.slice(fixed + 1)])\n else out.push([target, css])\n }\n }\n if (multiply) {\n const at = out.findIndex(([p]) => p === `opacity`)\n const ownStyle = `opacity` in style ? style : base && `opacity` in base ? base : null\n const own = at >= 0 ? out[at]![1] : ownStyle ? cssValue(`opacity`, ownStyle.opacity, fonts) : null\n const value = own === null ? `var(--xui-a-opacity, 1)` : `calc(${own} * var(--xui-a-opacity, 1))`\n if (at >= 0) out[at] = [`opacity`, value]\n else out.push([`opacity`, value])\n }\n // Per-side widths alone keep the cascaded others (a part's UA `medium` is\n // reset in the base layer, base-css.ts).\n if (!(`borderStyle` in style) && BORDER_WIDTHS.some((k) => k in style)) out.push([`border-style`, `solid`])\n return out\n}\n\n/** `animation: <name>` as CSS longhands over `@keyframes xui-<name>`\n * (base-css.ts): duration = the motion token × the set's factor (an\n * `animationDuration` token replaces the token, the factor kept), easing\n * per segment = `animation-timing-function`, fill both. An unknown name =\n * no animation. Reduced motion zeroes the duration (base-css.ts), which\n * shows each set's rest frame. */\nexport function animationDeclarations(name: unknown, durationToken?: unknown): [string, string][] {\n const def = typeof name === `string` ? ANIMATIONS[name] : undefined\n if (!def) return [[`animation-name`, `none`]]\n const token = (typeof durationToken === `string` && parseTokenRef(durationToken)?.group === `motion` ? durationToken : def.duration) as string\n const ease = def.easing === `linear` ? `linear` : (tokenVar(def.easing) ?? `linear`)\n return [\n [`--xui-anim-factor`, String(def.factor)],\n [`animation-name`, `xui-${name as string}`],\n [`animation-duration`, `calc(${tokenVar(token) ?? `0ms`} * ${def.factor})`],\n [`animation-timing-function`, ease],\n [`animation-iteration-count`, def.iterations === `infinite` ? `infinite` : String(def.iterations)],\n [`animation-fill-mode`, `both`],\n ]\n}\n\n/** The shimmer BAND of `animation: shimmer` (style.json `animations.shimmer`\n * `band`): an `::after` over the box, a gradient of the band colour at\n * alpha 0 → .5 → 0, one box wide, at `--xui-band` box widths (the\n * keyframes move it −1 → 1), clipped to the box. Empty for anything else. */\nexport function shimmerRule(selector: string, style: Record<string, unknown>): string {\n if (style.animation !== `shimmer`) return ``\n const band = ANIMATIONS.shimmer?.band\n const color = (band && tokenVar(band.color)) ?? `var(--xui-color-background)`\n const stops = (band?.stops ?? [{ offset: 0, alpha: 0 }, { offset: 0.5, alpha: 0.5 }, { offset: 1, alpha: 0 }]).map((s) => `color-mix(in srgb, ${color} ${Math.round(s.alpha * 100)}%, transparent) calc(var(--xui-band, 1) * 100% + ${Math.round(s.offset * 100)}%)`)\n const sel = selector.split(`,`).map((x) => `${x}::after`).join(`,`)\n return `${sel}{content:\"\";position:absolute;inset:0;pointer-events:none;border-radius:inherit;background-image:linear-gradient(90deg, ${stops.join(`, `)})}`\n}\n\nexport const rule = (selector: string, decls: [string, string][]): string =>\n decls.length === 0 ? `` : `${selector}{${decls.map(([p, v]) => `${p}:${v}`).join(`;`)}}`\n\n// ---------------------------------------------------------------------------\n// Interaction states → selectors\n// ---------------------------------------------------------------------------\n\n/** Every way an element can be in a state: the pseudo-class or the attribute\n * Radix sets, plus the forced marker the recipe sheet writes. */\nexport const STATE_SELECTORS: Record<string, string[]> = {\n hover: [`:hover`, `[data-xs~=\"hover\"]`],\n pressed: [`:active`, `[data-xs~=\"pressed\"]`],\n focus: [`:focus-visible`, `[data-xs~=\"focus\"]`],\n disabled: [`:disabled`, `[data-disabled]`, `[aria-disabled=\"true\"]`, `[data-xs~=\"disabled\"]`],\n checked: [`[data-state=\"checked\"]`, `[data-xs~=\"checked\"]`],\n open: [`[data-state=\"open\"]`, `[data-xs~=\"open\"]`],\n selected: [`[data-state=\"active\"]`, `[data-state=\"on\"]`, `[data-highlighted]`, `[data-xs~=\"selected\"]`],\n // Round 1: a field whose checks failed; a drop zone a drag hovers.\n invalid: [`[aria-invalid=\"true\"]`, `[data-xs~=\"invalid\"]`],\n dragover: [`[data-dragover]`, `[data-xs~=\"dragover\"]`],\n}\n\nfunction stateSuffixes(states: string[]): string[] {\n let out = [``]\n for (const state of states) {\n const alts = STATE_SELECTORS[state] ?? [`[data-xs~=\"${state}\"]`]\n out = out.flatMap((prefix) => alts.map((alt) => prefix + alt))\n }\n return out\n}\n\n/** A native's recipe props ride as `data-r-<prop>`, a macro part's as\n * `data-m-<prop>`: a Badge's label is a Text, and both key on `variant`. */\nexport const propAttribute = (macro: boolean, prop: string): string => `data-${macro ? `m` : `r`}-${kebab(prop)}`\n\nfunction propSelector(when: Record<string, unknown> | undefined, macro: boolean): string[] {\n if (!when) return [``]\n let out = [``]\n for (const [key, want] of Object.entries(when)) {\n if (key === `state`) continue\n const values = Array.isArray(want) ? want : [want]\n out = out.flatMap((prefix) => values.map((v) => `${prefix}[${propAttribute(macro, key)}=\"${String(v)}\"]`))\n }\n return out\n}\n\n/** The selectors one recipe rule applies to, for the part's class. */\nexport function ruleSelectors(base: string, rule: RecipeRule, macro = false): string[] {\n const states = rule.when?.state === undefined ? [] : Array.isArray(rule.when.state) ? rule.when.state.map(String) : [String(rule.when.state)]\n const props = propSelector(rule.when, macro)\n const suffixes = stateSuffixes(states)\n return props.flatMap((p) => suffixes.map((s) => `${base}${p}${s}`))\n}\n\n// ---------------------------------------------------------------------------\n// The compiled theme\n// ---------------------------------------------------------------------------\n\nexport interface CompiledTheme {\n /** The class on the surface root AND on every element it paints. */\n scope: string\n /** The whole sheet: layer order, variables (both modes), recipes. */\n css: string\n theme: ResolvedTheme\n}\n\n/** FNV-1a over the resolved theme, so two different themes with one id get\n * two scopes and the same theme always gets the same one (stable DOM). */\nfunction hash(text: string): string {\n let h = 0x811c9dc5\n for (let i = 0; i < text.length; i++) {\n h ^= text.charCodeAt(i)\n h = Math.imul(h, 0x01000193)\n }\n return (h >>> 0).toString(36)\n}\n\nexport function themeScope(theme: ResolvedTheme): string {\n return `xui-t-${theme.id.replace(/[^a-z0-9-]/gi, `-`)}-${hash(JSON.stringify(theme))}`\n}\n\n/** The shadcn variable names a Tailwind-built primitive reads, mapped onto\n * the theme's colour tokens (`--primary: var(--xui-color-primary)`). */\nconst SHADCN_ALIASES: [string, string][] = [\n [`--background`, `background`],\n [`--foreground`, `foreground`],\n [`--card`, `card`],\n [`--card-foreground`, `cardForeground`],\n [`--popover`, `popover`],\n [`--popover-foreground`, `popoverForeground`],\n [`--primary`, `primary`],\n [`--primary-foreground`, `primaryForeground`],\n [`--secondary`, `secondary`],\n [`--secondary-foreground`, `secondaryForeground`],\n [`--muted`, `muted`],\n [`--muted-foreground`, `mutedForeground`],\n [`--accent`, `accent`],\n [`--accent-foreground`, `accentForeground`],\n [`--destructive`, `destructive`],\n [`--destructive-foreground`, `destructiveForeground`],\n [`--success`, `success`],\n [`--success-foreground`, `successForeground`],\n [`--warning`, `warning`],\n [`--warning-foreground`, `warningForeground`],\n [`--info`, `info`],\n [`--info-foreground`, `infoForeground`],\n [`--border`, `border`],\n [`--input`, `input`],\n [`--ring`, `ring`],\n [`--chart-1`, `chart1`],\n [`--chart-2`, `chart2`],\n [`--chart-3`, `chart3`],\n [`--chart-4`, `chart4`],\n [`--chart-5`, `chart5`],\n [`--chart-6`, `chart6`],\n [`--chart-7`, `chart7`],\n [`--chart-8`, `chart8`],\n [`--sidebar`, `background`],\n [`--sidebar-foreground`, `foreground`],\n [`--sidebar-primary`, `primary`],\n [`--sidebar-primary-foreground`, `primaryForeground`],\n [`--sidebar-accent`, `accent`],\n [`--sidebar-accent-foreground`, `accentForeground`],\n [`--sidebar-border`, `border`],\n [`--sidebar-ring`, `ring`],\n // The app's glass set (packages/ui/src/styles.css), so the moved\n // primitives keep their look from the theme's semantic colours.\n [`--glass-fill-section`, `muted`],\n [`--glass-fill-row`, `muted`],\n [`--glass-fill-card`, `card`],\n [`--glass-fill-panel`, `popover`],\n [`--glass-fill-active`, `accent`],\n [`--glass-stroke-row`, `border`],\n [`--glass-stroke-section`, `border`],\n [`--glass-stroke-card`, `border`],\n [`--glass-stroke-strong`, `input`],\n [`--glass-stroke-active`, `ring`],\n [`--glass-background-top`, `background`],\n [`--glass-background-bottom`, `background`],\n]\n\nfunction tokenBlock(theme: ResolvedTheme): string {\n const decls: [string, string][] = []\n const tokens = theme.tokens as unknown as Record<string, Record<string, number | string>>\n for (const group of [`spacing`, `radius`, `control`, `opacity`, `border`, `motion`]) {\n for (const [name, value] of Object.entries(tokens[group] ?? {})) {\n const unit = group === `opacity` ? `` : group === `motion` ? `ms` : `px`\n decls.push([`--xui-${group}-${name}`, `${value}${unit}`])\n }\n }\n for (const [name, px] of Object.entries(theme.tokens.blur ?? {})) decls.push([`--xui-blur-${name}`, `${px}px`])\n // EXP-1259: the press / popover-enter scale (unitless).\n for (const [name, value] of Object.entries(theme.tokens.scale ?? {})) decls.push([`--xui-scale-${name}`, String(value)])\n for (const [name, curve] of Object.entries(theme.tokens.ease ?? {})) decls.push([`--xui-ease-${name}`, easingCss(curve as Easing)])\n for (const [name, px] of Object.entries(theme.tokens.breakpoint ?? {})) decls.push([`--xui-breakpoint-${name}`, `${px}px`])\n for (const [name, value] of Object.entries(theme.tokens.type.size)) decls.push([`--xui-type-size-${name}`, `${value}px`])\n for (const [name, value] of Object.entries(theme.tokens.type.lineHeight)) decls.push([`--xui-type-lineHeight-${name}`, `${value}px`])\n for (const [name, value] of Object.entries(theme.tokens.type.weight)) decls.push([`--xui-type-weight-${name}`, String(value)])\n for (const [name, family] of Object.entries(theme.tokens.type.family)) decls.push([`--xui-font-${name}`, fontStack(family, theme.fonts)])\n decls.push([`--radius`, `var(--xui-radius-lg)`], [`--font-sans`, `var(--xui-font-sans)`], [`--font-mono`, `var(--xui-font-mono)`])\n decls.push([`--xui-duration-fast`, `var(--xui-motion-fast)`], [`--xui-duration-standard`, `var(--xui-motion-standard)`])\n return decls.map(([p, v]) => `${p}:${v}`).join(`;`)\n}\n\nfunction modeBlock(theme: ResolvedTheme, mode: `light` | `dark`): string {\n const decls: [string, string][] = []\n for (const [name, hex] of Object.entries(theme.modes[mode].color)) decls.push([`--xui-color-${name}`, hex])\n for (const [name, layers] of Object.entries(theme.modes[mode].shadow)) decls.push([`--xui-shadow-${name}`, shadowCss(layers)])\n for (const [alias, token] of SHADCN_ALIASES) decls.push([alias, `var(--xui-color-${token})`])\n decls.push([`color-scheme`, mode])\n return decls.map(([p, v]) => `${p}:${v}`).join(`;`)\n}\n\nconst MACROS = new Set(Object.entries(coreCatalog.components).filter(([, d]) => d.kind === `macro`).map(([n]) => n))\n\n/** Whether a component's parts go in the `xui-part` layer (macro parts win\n * over an author's style) or the `xui-recipe` layer (a native's own look\n * yields to it). Extension macros are listed by the caller. */\nexport function isMacroComponent(component: string, extensionMacros: ReadonlySet<string> = new Set()): boolean {\n return MACROS.has(component) || extensionMacros.has(component)\n}\n\nexport const partClass = (component: string, part: string): string => `xui-${component}-${part}`\n\nexport function compileTheme(theme: ResolvedTheme, options: { extensionMacros?: ReadonlySet<string> } = {}): CompiledTheme {\n const scope = themeScope(theme)\n const root = `.xui-surface.${scope}`\n const chunks: string[] = [LAYERS]\n chunks.push(`${root}{${tokenBlock(theme)}}`)\n chunks.push(`${root}[data-xui-mode=\"light\"]{${modeBlock(theme, `light`)}}`)\n chunks.push(`${root}[data-xui-mode=\"dark\"]{${modeBlock(theme, `dark`)}}`)\n const recipe: string[] = []\n const part: string[] = []\n for (const [component, parts] of Object.entries(theme.recipes)) {\n const macro = isMacroComponent(component, options.extensionMacros)\n const target = macro ? part : recipe\n for (const [partName, rules] of Object.entries(parts)) {\n const base = `.${scope}.${partClass(component, partName)}`\n for (const r of rules) {\n const decls = declarations(r.style as Record<string, unknown>, theme.fonts)\n if (decls.length === 0) continue\n const selector = ruleSelectors(base, r, macro).join(`,`)\n target.push(rule(selector, decls) + shimmerRule(selector, r.style as Record<string, unknown>))\n }\n }\n }\n chunks.push(`@layer xui-recipe{${recipe.join(``)}}`)\n chunks.push(`@layer xui-part{${part.join(``)}}`)\n return { scope, css: chunks.join(`\\n`), theme }\n}\n\nconst cache = new WeakMap<ResolvedTheme, CompiledTheme>()\n\n/** `compileTheme`, memoized per resolved theme object (the common case:\n * a built-in or a theme the host loaded once). */\nexport function compiledTheme(theme: ResolvedTheme, options?: { extensionMacros?: ReadonlySet<string> }): CompiledTheme {\n if (options?.extensionMacros && options.extensionMacros.size > 0) return compileTheme(theme, options)\n let hit = cache.get(theme)\n if (!hit) {\n hit = compileTheme(theme)\n cache.set(theme, hit)\n }\n return hit\n}\n\n/** FEED-128: the theme as an app's UNSCOPED shadcn globals: the shadcn /\n * Tailwind variable names (the same `SHADCN_ALIASES` the surface sheet\n * maps) with LITERAL values (hex colours, px radius, font stacks; never a\n * `var(--xui-*)`), light under `:root` and dark under `.dark` by default.\n * A non-Exponential-UI app (shadcn-solid, plain Tailwind) pastes it as its\n * globals.css and wears the theme. */\nexport function globalsCss(theme: ResolvedTheme, options: { light?: string; dark?: string } = {}): string {\n const block = (mode: `light` | `dark`, shared: boolean): string => {\n const color = theme.modes[mode].color as Record<string, string>\n const decls: [string, string][] = []\n for (const [alias, token] of SHADCN_ALIASES) if (color[token] !== undefined) decls.push([alias, color[token]])\n if (shared) {\n const radius = (theme.tokens.radius as Record<string, number>).lg\n if (radius !== undefined) decls.push([`--radius`, `${radius}px`])\n for (const name of [`sans`, `mono`]) {\n const family = (theme.tokens.type.family as Record<string, string>)[name]\n if (family) decls.push([`--font-${name}`, fontStack(family, theme.fonts)])\n }\n }\n return decls.map(([p, v]) => ` ${p}: ${v};`).join(`\\n`)\n }\n return `${options.light ?? `:root`} {\\n${block(`light`, true)}\\n}\\n\\n${options.dark ?? `.dark`} {\\n${block(`dark`, false)}\\n}\\n`\n}\n",
6
+ "// VAPP-87 + round 1: a surface's NODE stylesheet (layer `xui-node`). Per\n// node, in this order (contract §2, `resolveConditions` is the reference):\n// 1. its whitelisted `style` (tokens as `var(--xui-…)`);\n// 2. every `@media` block in SOURCE order (later wins): width conditions\n// as CONTAINER queries on the surface's `xui` container (`min-width` =\n// `width >= N`, `max-width` = `width < N`, `$breakpoint.*` resolved from\n// the theme), height and orientation as attribute-gated rules the\n// surface sets from its measured box (`data-xq`, a container query\n// cannot ask an inline-size container for its height), `hover` and\n// `prefers-reduced-motion` as real media queries;\n// 3. the state blocks `:hover`, `:focus-visible`, `:pressed`.\n// A style value the macro expander left DYNAMIC (a binding or a call, e.g.\n// Progress `width: percent{…}`) becomes `var(--xd-<n>)`; `NodeView` sets\n// the resolved value on the element, so the layer order (native recipe <\n// node style < macro part) still holds. Template subtrees are included\n// (their items render under the template node's own class), so a templated\n// row wears its author and macro styles (audit bug B).\n\nimport { parseMediaCondition, parseTokenRef, type FontSpec, type ResolvedTheme, type UiNode } from \"@exponential-at/ui\"\nimport { hasDynamic } from \"./data\"\nimport { declarations, rule, shimmerRule } from \"./theme-css\"\n\nexport const nodeClass = (id: string): string => `xui-n-${cssEscape(id)}`\nexport const surfaceClass = (surfaceId: string): string => `xui-s-${cssEscape(surfaceId)}`\n\n/** Ids are author strings; keep the class usable in a selector. */\nexport function cssEscape(text: string): string {\n return text.replace(/[^a-zA-Z0-9_-]/g, (c) => `_${c.charCodeAt(0).toString(16)}_`)\n}\n\nexport function* walkNodes(root: UiNode): Generator<UiNode> {\n yield root\n for (const slot of Object.values(root.slots ?? {})) yield* walkNodes(slot)\n for (const child of root.children) yield* walkNodes(child)\n}\n\n/** One dynamic style value of a node: where it sits and its variable. */\nexport interface DynamicStyleEntry {\n /** `--xd-<n>`, numbered in walk order (base keys, then each block). */\n name: string\n /** The condition key (`@media …`, `:hover`) or `` for the base style. */\n block: string\n key: string\n value: unknown\n}\n\n/** The node's dynamic style values in the order the sheet numbers them. */\nexport function dynamicStyleEntries(style: Record<string, unknown> | undefined): DynamicStyleEntry[] {\n const out: DynamicStyleEntry[] = []\n if (!style) return out\n const visit = (block: string, s: Record<string, unknown>) => {\n for (const [key, value] of Object.entries(s)) {\n if (key.startsWith(`@`) || key.startsWith(`:`)) continue\n if (hasDynamic(value)) out.push({ name: `--xd-${out.length}`, block, key, value })\n }\n }\n visit(``, style)\n for (const [key, value] of Object.entries(style)) {\n if ((key.startsWith(`@`) || key.startsWith(`:`)) && typeof value === `object` && value !== null) visit(key, value as Record<string, unknown>)\n }\n return out\n}\n\n/** A JS-evaluated condition (height / orientation): its `data-xq` token. */\nexport function queryToken(key: string): string {\n return cssEscape(key.replace(/^@media \\(|\\)$/g, ``).replace(/: /, `-`))\n}\n\nexport interface NodeSheet {\n css: string\n /** The resolved condition keys the surface must evaluate itself and list\n * in `data-xq` when they hold (height, orientation). */\n queries: string[]\n /** VAPP-152: each styled node's rules by id, in walk order (`css` is\n * their concatenation inside the `xui-node` layer). */\n chunks: ReadonlyMap<string, string>\n}\n\n/** The key a surface evaluates itself for a `@media` block (size values\n * resolved to px: `@media (min-width: 768px)`); null = never matches. */\nexport function resolvedMediaKey(key: string, theme: ResolvedTheme | undefined): string | null {\n const condition = parseMediaCondition(key)\n if (!condition) return null\n if (condition.feature === `orientation` || condition.feature === `hover` || condition.feature === `prefers-reduced-motion`) return key\n const px = breakpointPx(condition.value, theme)\n return px === null ? null : `@media (${condition.feature}: ${px}px)`\n}\n\nconst isDirection = (v: unknown): v is `ltr` | `rtl` => v === `ltr` || v === `rtl`\n\n/** A node's own `direction` (round 2 §2): its base style's, then every\n * MATCHING `@media` block's in source order (later wins), as\n * `resolveConditions` flattens it; `matches` = the surface's `data-xq`. */\nexport function styleDirection(style: Record<string, unknown> | undefined, theme: ResolvedTheme | undefined, matches: (resolvedKey: string) => boolean): `ltr` | `rtl` | undefined {\n if (!style) return undefined\n let out = isDirection(style.direction) ? style.direction : undefined\n for (const [key, value] of Object.entries(style)) {\n if (!key.startsWith(`@`) || typeof value !== `object` || value === null) continue\n const d = (value as Record<string, unknown>).direction\n if (!isDirection(d)) continue\n const resolved = resolvedMediaKey(key, theme)\n if (resolved && matches(resolved)) out = d\n }\n return out\n}\n\nfunction breakpointPx(value: string, theme: ResolvedTheme | undefined): number | null {\n const ref = parseTokenRef(value)\n if (ref) {\n if (ref.group !== `breakpoint`) return null\n const px = theme?.tokens.breakpoint?.[ref.name]\n return typeof px === `number` ? px : null\n }\n const n = parseFloat(value)\n return Number.isFinite(n) ? n : null\n}\n\ninterface NodeChunk {\n css: string\n queries: readonly string[]\n}\n\n/** VAPP-152: a node's rules, per node OBJECT (a re-reduced tree shares its\n * unchanged nodes) and the inputs they depend on. */\nconst chunkCache = new WeakMap<UiNode, { scope: string; theme: ResolvedTheme | undefined; fonts: Record<string, FontSpec>; chunk: NodeChunk }>()\n\nfunction nodeChunk(node: UiNode, style: Record<string, unknown>, scope: string, theme: ResolvedTheme | undefined, fonts: Record<string, FontSpec>): NodeChunk {\n const hit = chunkCache.get(node)\n if (hit && hit.scope === scope && hit.theme === theme && hit.fonts === fonts) return hit.chunk\n const rules: string[] = []\n const queries = new Set<string>()\n const dyn = dynamicStyleEntries(style)\n const withVars = (block: string, s: Record<string, unknown>) => {\n const mine = dyn.filter((d) => d.block === block)\n if (mine.length === 0) return s\n const copy = { ...s }\n for (const d of mine) copy[d.key] = `var(${d.name})`\n return copy\n }\n const cls = nodeClass(node.id)\n const sel = `${scope} .${cls}`\n const own = withVars(``, style)\n const base = declarations(own, fonts)\n if (base.length) rules.push(rule(sel, base) + shimmerRule(sel, style))\n for (const [key, value] of Object.entries(style)) {\n if (!key.startsWith(`@`) || typeof value !== `object` || value === null) continue\n const block = declarations(withVars(key, value as Record<string, unknown>), fonts, own)\n if (block.length === 0) continue\n const condition = parseMediaCondition(key)\n if (!condition) continue\n // A block that sets `direction` is ALSO evaluated by the surface\n // (`data-xq`): the node's direction drives `dir`, Radix and keys.\n if (isDirection((value as Record<string, unknown>).direction)) {\n const resolved = resolvedMediaKey(key, theme)\n if (resolved) queries.add(resolved)\n }\n const band = (selector: string) => shimmerRule(selector, value as Record<string, unknown>)\n switch (condition.feature) {\n case `min-width`:\n case `max-width`: {\n const px = breakpointPx(condition.value, theme)\n if (px === null) break // an unknown token never matches\n const op = condition.feature === `min-width` ? `>=` : `<`\n rules.push(`@container xui (width ${op} ${px}px){${rule(sel, block)}${band(sel)}}`)\n break\n }\n case `min-height`:\n case `max-height`: {\n const px = breakpointPx(condition.value, theme)\n if (px === null) break\n const resolved = `@media (${condition.feature}: ${px}px)`\n queries.add(resolved)\n const q = `${scope}:where([data-xq~=\"${queryToken(resolved)}\"]) .${cls}`\n rules.push(rule(q, block) + band(q))\n break\n }\n case `orientation`:\n queries.add(key)\n const q = `${scope}:where([data-xq~=\"${queryToken(key)}\"]) .${cls}`\n rules.push(rule(q, block) + band(q))\n break\n case `hover`:\n case `prefers-reduced-motion`:\n rules.push(`@media (${condition.feature}: ${condition.value}){${rule(sel, block)}${band(sel)}}`)\n break\n }\n }\n const states: [string, string][] = [\n [`:hover`, `${sel}:hover,${sel}[data-xs~=\"hover\"]`],\n [`:focus-visible`, `${sel}:focus-visible,${sel}[data-xs~=\"focus-visible\"]`],\n [`:pressed`, `${sel}:active,${sel}[data-xs~=\"pressed\"]`],\n ]\n for (const [key, selector] of states) {\n const value = style[key]\n if (typeof value !== `object` || value === null) continue\n const block = declarations(withVars(key, value as Record<string, unknown>), fonts, own)\n if (block.length) rules.push(rule(selector, block) + shimmerRule(selector, value as Record<string, unknown>))\n }\n const chunk = { css: rules.join(``), queries: [...queries] }\n chunkCache.set(node, { scope, theme, fonts, chunk })\n return chunk\n}\n\n/** The node sheet for one tree (plus the template subtrees it renders). */\nexport function compileNodeSheet(roots: readonly UiNode[], surfaceId: string, theme?: ResolvedTheme, fonts: Record<string, FontSpec> = theme?.fonts ?? {}): NodeSheet {\n const scope = `.${surfaceClass(surfaceId)}`\n const chunks = new Map<string, string>()\n const queries = new Set<string>()\n const seen = new Set<string>()\n for (const root of roots) {\n for (const node of walkNodes(root)) {\n const style = node.style\n if (!style || seen.has(node.id)) continue\n seen.add(node.id)\n const chunk = nodeChunk(node, style, scope, theme, fonts)\n if (chunk.css) chunks.set(node.id, chunk.css)\n for (const q of chunk.queries) queries.add(q)\n }\n }\n return { css: `@layer xui-node{${[...chunks.values()].join(``)}}`, queries: [...queries], chunks }\n}\n\n/** VAPP-152: one `<style>` of the node sheet: the rules of some nodes. */\nexport interface NodeSheetBatch {\n readonly chunks: ReadonlyMap<string, string>\n readonly css: string\n}\n\nconst sheetBatch = (chunks: ReadonlyMap<string, string>): NodeSheetBatch => ({ chunks, css: `@layer xui-node{${[...chunks.values()].join(``)}}` })\n\n/** VAPP-152: the node sheet as `<style>` batches, the last ones kept. A\n * rewritten stylesheet makes Chromium re-match every node its rules\n * select, so a batch whose rules are all unchanged keeps its OBJECT (the\n * renderers leave its element alone), a batch with a changed or removed\n * node is rewritten in place, and the new nodes' rules land in ONE new\n * batch at the end (a streamed card restyles only itself). A batch at\n * least as large as the one before it merges into it (a binary counter:\n * at most log2(n) batches, each node rewritten O(log n) times). Rules of\n * different nodes never select the same element, so the order of the\n * batches does not change the cascade. */\nexport function nodeSheetBatches(prev: readonly NodeSheetBatch[], chunks: ReadonlyMap<string, string>): NodeSheetBatch[] {\n const out: NodeSheetBatch[] = []\n const placed = new Set<string>()\n for (const b of prev) {\n let dirty = false\n for (const [id, css] of b.chunks) {\n placed.add(id)\n if (chunks.get(id) !== css) dirty = true\n }\n if (!dirty) {\n out.push(b)\n continue\n }\n const kept = new Map<string, string>()\n for (const id of b.chunks.keys()) {\n const css = chunks.get(id)\n if (css !== undefined) kept.set(id, css)\n }\n if (kept.size) out.push(sheetBatch(kept))\n }\n const fresh = new Map<string, string>()\n for (const [id, css] of chunks) if (!placed.has(id)) fresh.set(id, css)\n if (fresh.size) out.push(sheetBatch(fresh))\n while (out.length > 1 && out[out.length - 1].chunks.size >= out[out.length - 2].chunks.size) {\n const last = out.pop()!\n const before = out.pop()!\n out.push(sheetBatch(new Map([...before.chunks, ...last.chunks])))\n }\n return out\n}\n\n/** The node sheet's CSS for one tree (the VAPP-87 entry point). */\nexport function nodeSheet(root: UiNode, surfaceId: string, fontsOrTheme: Record<string, FontSpec> | ResolvedTheme = {}, extra: readonly UiNode[] = []): string {\n const theme = isTheme(fontsOrTheme) ? fontsOrTheme : undefined\n const fonts = theme ? theme.fonts : (fontsOrTheme as Record<string, FontSpec>)\n return compileNodeSheet([root, ...extra], surfaceId, theme, fonts).css\n}\n\nfunction isTheme(v: unknown): v is ResolvedTheme {\n return typeof v === `object` && v !== null && `tokens` in v && `modes` in v\n}\n",
7
+ "// VAPP-87: the surface DATA MODEL and A2UI's dynamic values. Props may carry\n// a `{path}` binding (a JSON Pointer into the data model, relative inside a\n// template item) or a `{call, args}` function call (the basic catalog's 14\n// client functions + round 1's 13 CORE functions the macro expander emits\n// for bound inputs); `resolveValue` turns a prop tree into literals for one\n// render, `$string.<id>` built-in copy included (round-1 contract §1, §4:\n// the React mirror of `@exponential-at/ui` `resolveDynamic`). The format\n// functions run through the SURFACE Formatter (round 2 §3: Intl in the\n// surface locale + time zone). Pure, so the host can run it too.\n\nimport { CORE_FUNCTIONS, DEFAULT_LOCALE, FORMAT_FUNCTION_NAMES, displayString, formatFunctions, hasRowSlots, intlFormatter, isDataSchema, resolveString, sharedCatalogView, truthy, writePointer } from \"@exponential-at/ui\"\nimport type { CatalogView, ExtensionDef, Formatter } from \"@exponential-at/ui\"\n\nexport type DataModel = Record<string, unknown> | unknown[]\n\nexport interface DataBinding {\n path: string\n}\nexport interface FunctionCall {\n call: string\n args?: Record<string, unknown>\n returnType?: string\n}\n\nexport function isBinding(value: unknown): value is DataBinding {\n return typeof value === `object` && value !== null && !Array.isArray(value) && typeof (value as DataBinding).path === `string` && Object.keys(value as object).length === 1\n}\nexport function isCall(value: unknown): value is FunctionCall {\n return typeof value === `object` && value !== null && !Array.isArray(value) && typeof (value as FunctionCall).call === `string`\n}\n\nconst unescape = (token: string) => token.replace(/~1/g, `/`).replace(/~0/g, `~`)\n\n/** A pointer's tokens; `` and `/` are the whole model. */\nexport function pointerTokens(pointer: string): string[] {\n if (pointer === `` || pointer === `/`) return []\n return (pointer.startsWith(`/`) ? pointer.slice(1) : pointer).split(`/`).map(unescape)\n}\n\n/** `path` made absolute against a template scope (`/items/3`). */\nexport function absolutePath(path: string, scope = ``): string {\n if (path.startsWith(`/`)) return path\n if (!scope) return `/${path}`\n return path === `` ? scope : `${scope}/${path}`\n}\n\nexport function getPointer(data: unknown, pointer: string): unknown {\n let cur: unknown = data\n for (const token of pointerTokens(pointer)) {\n if (cur === null || typeof cur !== `object`) return undefined\n // The core's readPointer: real indices and OWN keys only.\n if (Array.isArray(cur)) cur = /^[0-9]+$/.test(token) ? cur[Number(token)] : undefined\n else cur = Object.prototype.hasOwnProperty.call(cur, token) ? (cur as Record<string, unknown>)[token] : undefined\n }\n return cur\n}\n\n/** A copy of `data` with the value at `pointer` replaced (or removed when\n * `value` is undefined): the core's `writePointer` (missing containers are\n * OBJECTS, an array index up to its length, `-` appends). A refused write\n * (pointer limits, a non-index token, an index past the end) leaves the\n * data as it is. */\nexport function setPointer<T extends DataModel>(data: T, pointer: string, value: unknown): T {\n return writePointer(data, pointer, value).data as T\n}\n\n// ---------------------------------------------------------------------------\n// Client functions\n// ---------------------------------------------------------------------------\n\nexport interface ResolveContext {\n data: unknown\n /** The template item's pointer, for relative paths. */\n scope?: string\n functions?: Record<string, ClientFunction>\n /** `openUrl` and other side effects go to the host. */\n openUrl?: (url: string) => void\n /** The surface locale (BCP 47) the format functions use; default en-US. */\n locale?: string\n /** The surface's built-in string table: `$string.<id>` resolves through it. */\n strings?: Readonly<Record<string, string>>\n /** Round 2: the surface's Formatter (locale + time zone); the format\n * functions, Table cells, charts and pickers format through it. */\n formatter?: Formatter\n /** The clock `formatRelativeTime` reads without a `now` argument. */\n now?: () => number\n}\n\n/** The synthetic root a Table's LITERAL rows are mounted under in a slot\n * cell's read view: never written to the real data model (the table keeps\n * those edits), never reported to the host as a path. */\nexport const LITERAL_ROWS_ROOT = `/$xuiRows`\n\n/** A bound path the host may see (`undefined` for a synthetic one). */\nexport function hostPath(path: string | undefined): string | undefined {\n return path === undefined || path === LITERAL_ROWS_ROOT || path.startsWith(`${LITERAL_ROWS_ROOT}/`) ? undefined : path\n}\n\nexport type ClientFunction = (args: Record<string, unknown>, ctx: ResolveContext) => unknown\n\nconst num = (v: unknown) => (typeof v === `number` ? v : Number(v))\n\n/** `${/path}` and `${rel/path}` interpolations (formatString). */\nfunction interpolate(text: string, ctx: ResolveContext): string {\n return text.replace(/\\$\\{([^}]+)\\}/g, (_, expr: string) => {\n return displayString(getPointer(ctx.data, absolutePath(expr.trim(), ctx.scope)))\n })\n}\n\n/** `intlFormatter` builds a new Intl instance per call (~18 µs for a\n * currency); a windowed Table re-formats every visible cell per scroll\n * step. This wrapper memoises the RESULTS of the pure members (number,\n * currency, percent, date, plural) per formatter, bounded; relativeTime\n * (it reads a clock) passes through. */\nexport function memoFormatter(base: Formatter, max = 4096): Formatter {\n const hits = new Map<string, string>()\n const memo = (key: string, run: () => string): string => {\n const hit = hits.get(key)\n if (hit !== undefined) return hit\n const out = run()\n if (hits.size >= max) hits.clear()\n hits.set(key, out)\n return out\n }\n const valueKey = (v: unknown): string => (v instanceof Date ? `t${v.getTime()}` : typeof v === `string` ? `s${v}` : `${typeof v}${String(v)}`)\n return {\n locale: base.locale,\n number: (value, o) => memo(`n|${value}|${o?.decimals}|${o?.grouping}`, () => base.number(value, o)),\n currency: (value, currency, o) => memo(`c|${currency}|${value}|${o?.decimals}|${o?.grouping}`, () => base.currency(value, currency, o)),\n percent: (value, o) => memo(`p|${value}|${o?.decimals}`, () => base.percent(value, o)),\n date: (value, o) => memo(`d|${o?.format}|${o?.style}|${o?.time}|${valueKey(value)}`, () => base.date(value, o)),\n relativeTime: (value, now) => base.relativeTime(value, now),\n plural: (value) => memo(`l|${value}`, () => base.plural(value)) as ReturnType<Formatter[`plural`]>,\n }\n}\n\nconst formatterCache = new Map<string, Formatter>()\n\n/** The context's Formatter: the surface's (`ctx.formatter`), else an Intl\n * one in its locale and UTC (a bare `resolveValue` call in a test). */\nexport function formatterOf(ctx: ResolveContext): Formatter {\n if (ctx.formatter) return ctx.formatter\n const locale = ctx.locale ?? DEFAULT_LOCALE\n let hit = formatterCache.get(locale)\n if (!hit) formatterCache.set(locale, (hit = memoFormatter(intlFormatter(locale, `UTC`))))\n return hit\n}\n\nconst formatTables = new WeakMap<Formatter, { now: (() => number) | undefined; table: ReturnType<typeof formatFunctions> }>()\n\n/** One of the six format functions (round-2 contract §3) through the\n * context's Formatter; `now` = the surface clock `formatRelativeTime`\n * reads without a `now` argument. The table is cached per formatter and\n * clock (the clock changes once a minute). */\nfunction formatCall(name: (typeof FORMAT_FUNCTION_NAMES)[number]): ClientFunction {\n return (args, ctx) => {\n const formatter = formatterOf(ctx)\n let hit = formatTables.get(formatter)\n if (!hit || hit.now !== ctx.now) formatTables.set(formatter, (hit = { now: ctx.now, table: formatFunctions(formatter, ctx.now) }))\n return hit.table[name](args)\n }\n}\n\nconst FORMAT: Record<string, ClientFunction> = Object.fromEntries(FORMAT_FUNCTION_NAMES.map((name) => [name, formatCall(name)]))\n\n/** The core functions (percent, add, sub, eq, lt, cond, fallback, concat,\n * coalesce, text, map, len) exactly as the catalog evaluates them. `set` is\n * an ACTION (`node-view.tsx` runs it), never a value. */\nconst CORE: Record<string, ClientFunction> = Object.fromEntries(Object.entries(CORE_FUNCTIONS).map(([name, fn]) => [name, (args: Record<string, unknown>) => fn(args)]))\n\nexport const CLIENT_FUNCTIONS: Record<string, ClientFunction> = {\n // The contract's `required` (dynamic.ts LOGIC_FUNCTIONS, Rust data.rs):\n // truthy (so `false` and `\"\"` fail, 0 passes) and not an empty array.\n required: ({ value }) => truthy(value) && !(Array.isArray(value) && value.length === 0),\n regex: ({ value, pattern }) => {\n try {\n return new RegExp(String(pattern)).test(String(value ?? ``))\n } catch {\n return false\n }\n },\n length: ({ value, min, max }) => {\n const n = String(value ?? ``).length\n return (min === undefined || n >= num(min)) && (max === undefined || n <= num(max))\n },\n numeric: ({ value, min, max }) => {\n const n = num(value)\n return Number.isFinite(n) && (min === undefined || n >= num(min)) && (max === undefined || n <= num(max))\n },\n email: ({ value }) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(value ?? ``)),\n formatString: ({ value }, ctx) => interpolate(String(value ?? ``), ctx),\n openUrl: ({ url }, ctx) => {\n if (typeof url === `string`) ctx.openUrl?.(url)\n return undefined\n },\n // Truthiness = the catalog's `truthy` (0 is TRUE, \"\" is false).\n and: ({ values }) => (Array.isArray(values) ? values.every(truthy) : false),\n or: ({ values }) => (Array.isArray(values) ? values.some(truthy) : false),\n not: ({ value }) => !truthy(value),\n ...CORE,\n ...FORMAT,\n}\n\n/** A prop value with its bindings and calls resolved for one render. Plain\n * objects recurse (a check's `condition`, a menu item's label). */\nexport function resolveValue(value: unknown, ctx: ResolveContext): unknown {\n if (isBinding(value)) return getPointer(ctx.data, absolutePath(value.path, ctx.scope))\n if (isCall(value)) {\n const fn = ctx.functions?.[value.call] ?? CLIENT_FUNCTIONS[value.call]\n if (!fn) return undefined\n const args: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value.args ?? {})) args[k] = resolveValue(v, ctx)\n return fn(args, ctx)\n }\n if (typeof value === `string`) return ctx.strings && value.startsWith(`$string.`) ? resolveString(value, ctx.strings) : value\n if (Array.isArray(value)) return value.map((item) => resolveValue(item, ctx))\n if (typeof value === `object` && value !== null) {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) out[k] = resolveValue(v, ctx)\n return out\n }\n return value\n}\n\nexport function resolveProps(props: Record<string, unknown>, ctx: ResolveContext): Record<string, unknown> {\n return resolveValue(props, ctx) as Record<string, unknown>\n}\n\ntype PropSchema = NonNullable<Parameters<typeof isDataSchema>[0]>\n\n/** The catalog (core + extensions) a node's props resolve along. */\nexport function viewOf(extensions?: readonly ExtensionDef[]): CatalogView {\n return sharedCatalogView(extensions)\n}\n\nconst isPlainObject = (v: unknown): v is Record<string, unknown> => typeof v === `object` && v !== null && !Array.isArray(v)\n\n/** One prop value along its schema (the core's `resolveProp`): a binding or\n * call resolves, a DATA literal (Table `rows`) is the author's data and is\n * copied verbatim (no binding, call or `$string` inside it is read),\n * arrays and shaped objects resolve per item / property, anything else at\n * any depth. */\nfunction resolveAlong(value: unknown, schema: PropSchema | undefined, ctx: ResolveContext, defs: CatalogView[`defs`]): unknown {\n if (isBinding(value) || isCall(value)) return resolveValue(value, ctx)\n if (isDataSchema(schema)) return value\n if (schema?.type === `array` && schema.items && Array.isArray(value)) return value.map((item) => resolveAlong(item, schema.items, ctx, defs))\n const shape = schema?.type === `object` && schema.shape ? (defs as Record<string, { properties: Record<string, PropSchema> }>)[schema.shape] : undefined\n if (shape && isPlainObject(value)) {\n const out: Record<string, unknown> = {}\n // An unresolved member stays as an `undefined` KEY (JSON drops it, so\n // the bound tree serialises as the core's): a check whose `condition`\n // reads an unseeded path must still fail, as the Rust core decides off\n // the source `condition` key.\n for (const [k, v] of Object.entries(value)) out[k] = resolveAlong(v, shape.properties[k], ctx, defs)\n return out\n }\n return resolveValue(value, ctx)\n}\n\n/** A node's props resolved along its component's schema (an unknown\n * component's resolve at any depth); undefined results are dropped. */\nexport function resolveNodeProps(component: string, props: Record<string, unknown>, ctx: ResolveContext, extensions?: readonly ExtensionDef[]): Record<string, unknown> {\n const view = viewOf(extensions)\n const def = view.components[component] as { props: Record<string, PropSchema> } | undefined\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(props)) {\n const r = resolveAlong(v, def?.props[k], ctx, view.defs)\n if (r !== undefined) out[k] = r\n }\n return out\n}\n\n/** The pointer a bindable prop writes back to (two-way state), if bound. */\nexport function boundPath(props: Record<string, unknown>, name: string, scope = ``): string | undefined {\n const raw = props[name]\n return isBinding(raw) ? absolutePath(raw.path, scope) : undefined\n}\n\n/** A node's `visible`: absent = shown, else its resolved truthiness. */\nexport function resolveVisible(visible: unknown, ctx: ResolveContext): boolean {\n if (visible === undefined) return true\n return truthy(resolveValue(visible, ctx))\n}\n\n/** True when a value holds a binding or a call anywhere (a style value the\n * expander left dynamic). */\nexport function hasDynamic(value: unknown): boolean {\n if (isBinding(value) || isCall(value)) return true\n if (Array.isArray(value)) return value.some(hasDynamic)\n if (typeof value === `object` && value !== null) return Object.values(value).some(hasDynamic)\n return false\n}\n\n/** The React renderer's BIND pass as a pure function (round-1 contract §1;\n * `@exponential-at/ui` `bindTree` is the reference, fixtures/bind-time.json\n * locks both): a node whose `visible` resolves falsy is dropped with its\n * subtree, props / style values / recipe props resolve, `visible` goes,\n * actions and templates stay. `NodeView` binds node by node with the same\n * `resolveValue`; this is the whole-tree form for tests and hosts. */\n/** A node's `accessibility` resolved against the data (bindings, calls,\n * `$string`), undefined members dropped; null when nothing is left. */\nexport function resolveAccessibility(accessibility: unknown, ctx: ResolveContext): Record<string, unknown> | null {\n if (!accessibility || typeof accessibility !== `object`) return null\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(resolveValue(accessibility, ctx) as Record<string, unknown>)) if (v !== undefined) out[k] = v\n return Object.keys(out).length ? out : null\n}\n\n/** The ARIA attributes of a RESOLVED `accessibility` (contract §6): `role`\n * (`text` = none of its own, `hidden` = aria-hidden), label/description,\n * `level`, `expanded`, `current` (page|step; false = absent), `selected`,\n * `pressed`, `checked`, `valueNow/Min/Max`, `hidden`; `autoFocus` →\n * `data-xui-autofocus` (an opening dialog focuses it). */\nexport function ariaAttributes(a11y: Record<string, unknown> | null): Record<string, string> {\n const out: Record<string, string> = {}\n if (!a11y) return out\n const role = a11y.role\n if (role === `hidden`) out[`aria-hidden`] = `true`\n else if (typeof role === `string` && role !== `text` && role !== ``) out.role = role\n if (a11y.label !== undefined && a11y.label !== null && a11y.label !== ``) out[`aria-label`] = String(a11y.label)\n if (a11y.description !== undefined && a11y.description !== null && a11y.description !== ``) out[`aria-description`] = String(a11y.description)\n if (typeof a11y.level === `number` || (typeof a11y.level === `string` && a11y.level !== ``)) out[`aria-level`] = String(a11y.level)\n for (const [key, attr] of [[`expanded`, `aria-expanded`], [`selected`, `aria-selected`], [`pressed`, `aria-pressed`], [`checked`, `aria-checked`]] as const) {\n const v = a11y[key]\n if (typeof v === `boolean` || v === `mixed`) out[attr] = String(v)\n }\n if (a11y.current !== undefined && a11y.current !== null && a11y.current !== false && a11y.current !== ``) out[`aria-current`] = a11y.current === true ? `true` : String(a11y.current)\n for (const [key, attr] of [[`valueNow`, `aria-valuenow`], [`valueMin`, `aria-valuemin`], [`valueMax`, `aria-valuemax`]] as const) {\n const v = a11y[key]\n if (typeof v === `number` && Number.isFinite(v)) out[attr] = String(v)\n }\n if (a11y.hidden === true) out[`aria-hidden`] = `true`\n if (a11y.autoFocus === true) out[`data-xui-autofocus`] = ``\n return out\n}\n\nexport function bindTree<T extends { id: string; component: string; props: Record<string, unknown>; children: T[]; style?: Record<string, unknown>; visible?: unknown; slots?: Record<string, T>; recipe?: { macro: string; part: string; props: Record<string, unknown> }; on?: unknown; accessibility?: unknown; template?: unknown }>(node: T, ctx: ResolveContext, extensions?: readonly ExtensionDef[]): T | null {\n if (!resolveVisible(node.visible, ctx)) return null\n const out = { id: node.id, component: node.component, props: resolveNodeProps(node.component, node.props, ctx, extensions), children: [] as T[] } as unknown as T\n if (node.style) out.style = resolveValue(node.style, ctx) as Record<string, unknown>\n if (node.on) out.on = node.on\n if (node.accessibility) {\n // Contract §1/§6: accessibility (label, description and the macro\n // part's `$a11y` states) resolves like props; an empty result is dropped.\n const a11y = resolveAccessibility(node.accessibility, ctx)\n if (a11y) out.accessibility = a11y\n }\n for (const child of node.children) {\n const bound = bindTree(child, ctx, extensions)\n if (bound) out.children.push(bound)\n }\n if (node.slots) {\n // Row-scoped slots (Table cells) are templates the painter binds per\n // row (RowScope); they stay as they are.\n if (hasRowSlots(viewOf(extensions).components[node.component])) out.slots = node.slots\n else\n for (const [name, slot] of Object.entries(node.slots)) {\n const bound = bindTree(slot, ctx, extensions)\n if (bound) (out.slots ??= {} as Record<string, T>)[name] = bound\n }\n }\n if (node.template) out.template = node.template\n if (node.recipe) out.recipe = { ...node.recipe, props: resolveValue(node.recipe.props, ctx) as Record<string, unknown> }\n return out\n}\n",
8
+ "// VAPP-87: the structural CSS every surface carries (layer `xui-base`, the\n// lowest). It restates taffy's defaults on EVERY painted element — the three\n// \"CSS equals taffy\" rules of the VAPP-4 spike:\n// 1. `box-sizing: border-box; display: flex; flex-direction: row;\n// position: relative` on every node, `min-width` left at `auto`\n// (never `0` as a default: that broke 5/48 frames at 390);\n// 2. control chrome is paint or lives INSIDE the measured size (borders\n// start at 0 and only a recipe/style adds one, which the core also\n// counts as layout);\n// 3. `overflow: hidden` is emitted as `overflow: clip` (theme-css.ts).\n// Natives then add their own structure under `[data-xui-c=\"…\"]`; a theme\n// never needs to (recipes carry only visuals, sizes and spacing).\n\nimport { ANIMATION_NAMES, ANIMATION_PROPERTIES_CSS, RTL_MIRRORED_ICONS, SEARCH_LIST_FADE, SKELETON_OPACITY_HIGH, SKELETON_OPACITY_LOW, SKELETON_PULSE_MS, SKELETON_REDUCED_OPACITY, TEXT_SHIMMER, keyframesCss } from \"@exponential-at/ui\"\n\n/** EXP-1324: the Text `shimmer` (catalog/style.json `textShimmer`, shadcn's\n * `shimmer` utility): the glyphs clip a gradient of the text colour that\n * slides right → left; light mode fades the highlight, dark lifts it in\n * OKLCH (src/text-shimmer.ts is the same maths for the natives); rtl\n * reverses; reduce motion = plain text (REDUCED_EXTRA). */\nconst S = TEXT_SHIMMER\nconst SHIMMER_CSS = `@keyframes xui-shimmer{from{background-position:100% 0}to{background-position:0 0}}\n[data-xui-shimmer]{--_spread:${S.spreadPx}px;--_base:currentColor;--_highlight:oklch(from currentColor l c h / calc(alpha * ${S.lightAlphaFactor}));background-image:linear-gradient(calc(90deg + ${S.angleDeg}deg),var(--_base) calc(50% - var(--_spread)),color-mix(in oklab,var(--_highlight),var(--_base) 50%) calc(50% - var(--_spread) * .5),var(--_highlight) 50%,color-mix(in oklab,var(--_highlight),var(--_base) 50%) calc(50% + var(--_spread) * .5),var(--_base) calc(50% + var(--_spread)));background-repeat:no-repeat;background-size:calc(200% + var(--_spread) * 2) 100%;background-position:0 0;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;animation:xui-shimmer ${S.durationMs}ms linear infinite}\n[data-xui-mode=\"dark\"] [data-xui-shimmer]{--_highlight:oklch(from currentColor min(1, max(${S.highlightLightnessMin}, calc(l + ${S.highlightLightnessBoost}))) c h / min(1, calc(alpha + ${S.highlightAlphaBoost})))}\n[dir=\"rtl\"] [data-xui-shimmer]{animation-direction:reverse}`\n\n/** EXP-1259: under reduce motion nothing scales (a pressed button stays\n * put) and a placeholder holds still at its reduced opacity. */\nconst REDUCED_EXTRA = `.xui-surface [data-xui-shimmer]{animation:none !important;background-image:none !important;-webkit-text-fill-color:currentColor !important}.xui-surface [data-xui-c=\"Button\"].xui-el:active{scale:none !important}.xui-surface [data-xui-c=\"Skeleton\"].xui-el:not([data-rows]),.xui-surface .xui-Skeleton-dot,.xui-surface .xui-Skeleton-bar{animation:none !important;opacity:${SKELETON_REDUCED_OPACITY} !important}`\n\n/** Round 2 §2: the `animation` key's keyframe sets (style.json\n * `animations`; the individual `translate`/`rotate`/`scale` properties\n * compose outside a node's own `transform`; opacity moves `--xui-a-opacity`,\n * which the node's `opacity` multiplies), the animated custom properties\n * registered so they interpolate (`ANIMATION_PROPERTIES_CSS`: that one and\n * the shimmer band's `--xui-band`), and the glyphs that mirror\n * in an rtl node (catalog/locale.json `rtlMirroredIcons`, by the element's\n * `dir`, so a node's own direction counts). */\nconst ROUND2_CSS = `${ANIMATION_NAMES.map(keyframesCss).join(`\\n`)}\n:is(${RTL_MIRRORED_ICONS.map((n) => `svg[data-icon=\"${n}\"]`).join(`,`)}):dir(rtl){scale:-1 1}`\n\nexport const BASE_CSS = `${ANIMATION_PROPERTIES_CSS}\n@layer xui-base{\n${ROUND2_CSS}\n.xui-surface{display:block;position:relative;font-family:var(--xui-font-sans);color:var(--xui-color-foreground);font-size:var(--xui-type-size-sm);line-height:var(--xui-type-lineHeight-sm);-webkit-font-smoothing:antialiased}\n.xui-surface *{box-sizing:border-box}\n.xui-container{container-type:inline-size;container-name:xui;width:100%;position:relative}\n:where([data-xui-part]){border:0 solid transparent}\n.xui-el{box-sizing:border-box;display:flex;flex-direction:row;position:relative;margin:0;padding:0;border:0 solid transparent;min-width:auto;min-height:auto;font:inherit;color:inherit;background:transparent;text-align:start;text-decoration:none;outline:none;appearance:none;-webkit-appearance:none}\nbutton:where([data-xui-part],.xui-calendar-nav,.xui-table-sort,.xui-carousel-nav){margin:0;padding:0;border:0 solid transparent;background:transparent;color:inherit;font:inherit;appearance:none;-webkit-appearance:none}\n.xui-el:focus-visible{outline:2px solid var(--xui-color-ring);outline-offset:1px}\n.xui-leaf{flex-direction:column}\n.xui-leaf>.xui-measured{flex-shrink:0}\n[data-xui-c=\"Text\"].xui-el{display:block;white-space:pre-wrap;overflow-wrap:anywhere}\n[data-xui-c=\"Text\"][data-lines=\"1\"].xui-el{white-space:nowrap;overflow:clip;text-overflow:ellipsis;min-width:0}\n[data-xui-c=\"Text\"][data-clamp].xui-el{display:-webkit-box;-webkit-box-orient:vertical;overflow:clip}\n[data-xui-c=\"Text\"][data-xui-align=\"start\"].xui-el{text-align:start}\n[data-xui-c=\"Text\"][data-xui-align=\"center\"].xui-el{text-align:center}\n[data-xui-c=\"Text\"][data-xui-align=\"end\"].xui-el{text-align:end}\n[data-xui-c=\"Button\"].xui-el,[data-xui-c=\"Toggle\"].xui-el,[data-xui-c=\"Link\"].xui-el{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;cursor:pointer;user-select:none;flex-shrink:0;transition:background-color var(--xui-motion-fast) var(--xui-ease-standard,ease),color var(--xui-motion-fast) var(--xui-ease-standard,ease),opacity var(--xui-motion-fast) var(--xui-ease-standard,ease),border-color var(--xui-motion-fast) var(--xui-ease-standard,ease),scale var(--xui-motion-fast) var(--xui-ease-standard,ease)}\n[data-xui-c=\"Button\"].xui-el:disabled,[data-xui-c=\"Toggle\"].xui-el:disabled{cursor:default;pointer-events:none}\n[data-xui-c=\"Link\"].xui-el{text-decoration:underline;text-underline-offset:3px}\n.xui-Button-icon,.xui-Button-spinner,.xui-Toggle-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n.xui-Button-icon>svg,.xui-Toggle-icon>svg,.xui-Button-spinner>svg,.xui-icon>svg{width:100%;height:100%}\n.xui-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n[data-xui-c=\"Icon\"].xui-el{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n[data-xui-c=\"Icon\"].xui-el>svg{width:100%;height:100%}\n[data-xui-c=\"Image\"].xui-el{overflow:clip}\n[data-xui-c=\"Image\"].xui-el>img{display:block;position:absolute;inset:0;width:100%;height:100%}\n.xui-image-placeholder{display:flex;align-items:center;justify-content:center;width:100%;height:100%;min-height:24px;background:repeating-linear-gradient(45deg,color-mix(in srgb,currentColor 12%,transparent) 0 6px,color-mix(in srgb,currentColor 4%,transparent) 6px 12px);color:var(--xui-color-mutedForeground);font-size:var(--xui-type-size-xs)}\n[data-xui-c=\"Video\"].xui-el{overflow:clip}\n.xui-media-sizer{display:block;max-width:100%;height:0;flex:0 1 auto;visibility:hidden;pointer-events:none}\n[data-xui-c=\"Video\"].xui-el>video{display:block;position:absolute;inset:0;width:100%;height:100%;object-fit:contain}\n[data-xui-c=\"AudioPlayer\"].xui-el>audio{width:100%;display:block;flex-shrink:0}\n[data-xui-c=\"Avatar\"].xui-el{overflow:clip;flex-shrink:0;align-items:center;justify-content:center}\n.xui-Avatar-image{width:100%;height:100%;object-fit:cover;border-radius:inherit}\n.xui-Avatar-fallback{display:flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:inherit;text-transform:uppercase;user-select:none}\n[data-xui-c=\"List\"].xui-el{flex-direction:column;overflow:auto;min-height:0}\n[data-xui-c=\"List\"][data-r-direction=\"horizontal\"].xui-el{flex-direction:row}\n.xui-List-divider{flex-shrink:0;align-self:stretch;border-style:solid;border-width:0}\n.xui-list-window{position:relative;width:100%;flex-shrink:0}\n.xui-list-window[data-axis=\"horizontal\"]{width:auto;align-self:flex-start}\n.xui-list-item{position:absolute;left:0;right:0}\n.xui-list-window[data-axis=\"horizontal\"]>.xui-list-item{left:auto;right:auto;top:0}\n.xui-list-row{display:flex;flex-direction:column;position:relative}\n.xui-list-row[data-axis=\"horizontal\"]{flex-direction:row}\n.xui-list-gap{position:absolute;display:flex;pointer-events:none}\n.xui-list-gap[data-axis=\"vertical\"]{left:0;right:0;flex-direction:column;transform:translateY(-50%)}\n.xui-list-gap[data-axis=\"horizontal\"]{top:0;bottom:0;flex-direction:row;transform:translateX(-50%)}\n.xui-list-gap[data-axis=\"horizontal\"]:dir(rtl){transform:translateX(50%)}\n.xui-List-section{display:flex;flex-direction:row;align-items:center;flex-shrink:0}\n[data-xui-c=\"Resizable\"].xui-el{flex-direction:row;align-items:stretch;min-width:0;min-height:0}\n[data-xui-c=\"Resizable\"][data-orientation=\"vertical\"].xui-el{flex-direction:column}\n.xui-Resizable-panel{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:clip}\n.xui-Resizable-handle{position:relative;display:flex;align-items:center;justify-content:center;flex:0 0 var(--xui-control-hairline);min-width:0;min-height:0;touch-action:none;user-select:none;outline:none;z-index:1}\n[data-orientation=\"horizontal\"]>.xui-Resizable-handle{cursor:col-resize}\n[data-orientation=\"vertical\"]>.xui-Resizable-handle{cursor:row-resize}\n.xui-Resizable-handle:focus-visible{outline:2px solid var(--xui-color-ring);outline-offset:1px}\n.xui-resize-hit{position:absolute}\n[data-orientation=\"horizontal\"]>.xui-Resizable-handle>.xui-resize-hit{top:0;bottom:0;left:50%;transform:translateX(-50%)}\n[data-orientation=\"vertical\"]>.xui-Resizable-handle>.xui-resize-hit{left:0;right:0;top:50%;transform:translateY(-50%)}\n.xui-Resizable-grip{flex:none;pointer-events:none}\n[data-xui-c=\"Carousel\"].xui-el{flex-direction:column;overflow:clip}\n.xui-carousel-track{display:flex;flex-direction:row;overflow-x:auto;scroll-snap-type:x mandatory;scrollbar-width:none;gap:var(--xui-spacing-sm)}\n.xui-carousel-track::-webkit-scrollbar{display:none}\n.xui-Carousel-page{flex:0 0 100%;scroll-snap-align:start;display:flex;flex-direction:column}\n.xui-carousel-dots{display:flex;justify-content:center;gap:var(--xui-spacing-xs);padding-top:var(--xui-spacing-sm)}\n.xui-Carousel-indicator{width:6px;height:6px;border-radius:9999px;background:var(--xui-color-border);padding:0;cursor:pointer}\n.xui-Carousel-indicator[data-xs~=\"selected\"]{background:var(--xui-color-primary)}\n[data-xui-c=\"Tabs\"].xui-el{flex-direction:column}\n.xui-Tabs-list{display:flex;flex-direction:row;align-self:flex-start;flex-shrink:0}\n.xui-Tabs-list[data-fill=\"true\"]{align-self:stretch}\n.xui-Tabs-tab{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--xui-spacing-xs);cursor:pointer;white-space:nowrap;flex:0 0 auto;position:relative}\n.xui-Tabs-list[data-fill=\"true\"]>.xui-Tabs-tab{flex:1 1 0}\n.xui-Tabs-tab-body{display:inline-flex;align-items:center;gap:var(--xui-spacing-xs)}\n.xui-Tabs-close,.xui-Tabs-new{display:inline-flex;align-items:center;justify-content:center;align-self:center;flex-shrink:0;cursor:pointer;padding:0;border:0}\n.xui-Tabs-close>svg{width:12px;height:12px}\n.xui-Tabs-new>svg{width:16px;height:16px}\n.xui-Tabs-indicator{position:absolute;left:0;right:0;bottom:0}\n.xui-Tabs-content{display:flex;flex-direction:column;outline:none}\n.xui-Tabs-content[hidden]{display:none}\n[data-xui-c=\"Segmented\"].xui-el{display:inline-flex;align-items:center;align-self:flex-start;flex-wrap:nowrap}\n[data-xui-c=\"Segmented\"][data-r-fill=\"true\"].xui-el,[data-xui-c=\"Segmented\"][data-r-variant=\"bar\"].xui-el{align-self:stretch}\n.xui-Segmented-item{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;white-space:nowrap;flex:0 0 auto;min-width:0}\n[data-xui-c=\"Segmented\"][data-r-fill=\"true\"].xui-el>.xui-Segmented-item,[data-xui-c=\"Segmented\"][data-r-variant=\"bar\"].xui-el>.xui-Segmented-item{flex:1 1 0}\n[data-xui-c=\"Segmented\"][data-r-variant=\"bar\"].xui-el{align-items:stretch;height:var(--xui-control-tabBar);width:100%}\n[data-xui-c=\"Segmented\"][data-r-variant=\"bar\"].xui-el>.xui-Segmented-item{flex-direction:column;gap:var(--xui-spacing-xxs);padding:var(--xui-spacing-xs) 0}\n[data-xui-c=\"Segmented\"][data-r-variant=\"bar\"].xui-el .xui-Segmented-label{font-size:var(--xui-type-size-xs);line-height:var(--xui-type-lineHeight-xs);white-space:nowrap}\n.xui-Segmented-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n.xui-Segmented-label{min-width:0;overflow:hidden;text-overflow:ellipsis}\n[data-xui-c=\"Accordion\"].xui-el{flex-direction:column}\n.xui-Accordion-item{display:flex;flex-direction:column}\n.xui-Accordion-trigger{display:flex;align-items:center;justify-content:space-between;width:100%;cursor:pointer;text-align:start}\n.xui-Accordion-trigger>svg{transition:transform var(--xui-motion-fast) var(--xui-ease-standard,ease)}\n.xui-Accordion-trigger[data-state=\"open\"]>svg{transform:rotate(180deg)}\n.xui-Accordion-content{display:flex;flex-direction:column;overflow:clip}\n.xui-Accordion-content[hidden]{display:none}\n.xui-Dialog-overlay,.xui-Drawer-overlay{position:fixed;inset:0;z-index:50}\n.xui-Dialog-content{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:51;display:flex;flex-direction:column;width:calc(100% - 32px);max-width:480px;max-height:calc(100% - 32px);overflow:auto;outline:none}\n.xui-Drawer-content{position:fixed;z-index:51;display:flex;flex-direction:column;overflow:auto;outline:none}\n.xui-Drawer-content[data-side=\"bottom\"]{left:0;right:0;bottom:0;max-height:85%}\n.xui-Drawer-content[data-side=\"top\"]{left:0;right:0;top:0;max-height:85%}\n.xui-Drawer-content[data-side=\"left\"]{left:0;top:0;bottom:0;width:min(85%,360px)}\n.xui-Drawer-content[data-side=\"right\"]{right:0;top:0;bottom:0;width:min(85%,360px)}\n.xui-Drawer-handle{align-self:center;width:36px;height:4px;border-radius:9999px;background:var(--xui-color-border);flex-shrink:0}\n.xui-overlay-head{display:flex;flex-direction:column;gap:var(--xui-spacing-xxs)}\n.xui-overlay-body{display:flex;flex-direction:column;gap:var(--xui-spacing-md);min-height:0}\n.xui-Dialog-footer,.xui-Drawer-footer{display:flex;flex-direction:row;justify-content:flex-end;flex-wrap:wrap}\n.xui-Dialog-close{position:absolute;top:var(--xui-spacing-sm);inset-inline-end:var(--xui-spacing-sm);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0}\n.xui-Dialog-close>svg{width:16px;height:16px}\n.xui-Popover-content,.xui-Tooltip-content,.xui-Menu-content,.xui-Select-content,.xui-TimePicker-list{z-index:52;display:flex;flex-direction:column;outline:none;max-height:var(--radix-popper-available-height,320px);overflow:auto}\n.xui-Tooltip-content{max-width:280px}\n.xui-Menu-item,.xui-Select-item,.xui-TimePicker-item{display:flex;align-items:center;cursor:pointer;user-select:none;white-space:nowrap;outline:none}\n.xui-Menu-item[data-disabled],.xui-Select-item[data-disabled],.xui-Select-item[aria-disabled=\"true\"]{pointer-events:none}\n.xui-Menu-item>svg,.xui-Select-item>svg{width:16px;height:16px;flex-shrink:0}\n.xui-Menu-separator{align-self:stretch;flex-shrink:0}\n.xui-Menu-label{display:flex;align-items:center}\n.xui-Menu-trigger{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;flex-shrink:0;cursor:pointer}\n[data-xui-overlay-root].xui-el{flex-direction:row;align-self:auto;align-items:flex-start}\n[data-xui-overlay-root=\"stretch\"].xui-el{align-items:stretch}\n[data-xui-overlay-root=\"none\"].xui-el{display:contents}\n.xui-trigger{display:flex;flex-direction:row;align-items:stretch;flex:1 1 auto;min-width:0}\n.xui-Tooltip-anchor{display:flex;flex-direction:row;flex:1 1 auto;min-width:0}\n.xui-field-column{display:flex;flex-direction:column;gap:var(--xui-spacing-xs);min-width:0}\n.xui-field-row{display:flex;flex-direction:row;align-items:flex-start;gap:var(--xui-spacing-sm);min-width:0}\n.xui-field-text{display:flex;flex-direction:column;gap:var(--xui-spacing-xxs);min-width:0}\n[data-xui-c=\"Input\"].xui-el,[data-xui-c=\"Textarea\"].xui-el,[data-xui-c=\"Select\"].xui-el,[data-xui-c=\"DatePicker\"].xui-el,[data-xui-c=\"DateRangePicker\"].xui-el,[data-xui-c=\"TimePicker\"].xui-el,[data-xui-c=\"NumberField\"].xui-el,[data-xui-c=\"ChipInput\"].xui-el,[data-xui-c=\"FileUpload\"].xui-el,[data-xui-c=\"Slider\"].xui-el,[data-xui-c=\"Radio\"].xui-el,[data-xui-c=\"Composer\"].xui-el{flex-direction:column;gap:var(--xui-spacing-xs);min-width:0}\n[data-xui-c=\"Checkbox\"].xui-el{flex-direction:row;align-items:flex-start;gap:var(--xui-spacing-sm);cursor:pointer}\n[data-xui-c=\"Checkbox\"].xui-el>.xui-field-text{flex:1 1 0%}\n.xui-Checkbox-box{margin-top:max(0px,calc((var(--xui-type-lineHeight-sm) - var(--xui-control-checkbox)) / 2))}\n[data-xui-c=\"Switch\"].xui-el{flex-direction:row;align-items:center;cursor:pointer}\n.xui-Switch-body{display:flex;flex-direction:column;gap:var(--xui-spacing-xxs);flex:1 1 0%;min-width:0}\n.xui-Input-field,.xui-Textarea-field{display:block;width:100%;min-width:0;margin:0;outline:none;appearance:none;border:0 solid transparent;background:transparent;color:inherit;font:inherit}\n.xui-Input-field::placeholder,.xui-Textarea-field::placeholder,.xui-Composer-field::placeholder{color:var(--xui-color-mutedForeground)}\n.xui-Textarea-field{resize:vertical;line-height:var(--xui-type-lineHeight-sm);padding-top:var(--xui-spacing-sm);padding-bottom:var(--xui-spacing-sm)}\n.xui-Input-label,.xui-Textarea-label,.xui-Select-label,.xui-DatePicker-label,.xui-DateRangePicker-label,.xui-TimePicker-label,.xui-NumberField-label,.xui-ChipInput-label,.xui-FileUpload-label,.xui-Slider-label,.xui-Radio-label,.xui-Checkbox-label,.xui-Switch-label{display:block;cursor:inherit}\n.xui-Select-trigger,.xui-DatePicker-trigger,.xui-DateRangePicker-trigger,.xui-TimePicker-trigger{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:var(--xui-spacing-sm);width:100%;min-width:0;cursor:pointer;text-align:start;white-space:nowrap}\n.xui-Select-trigger>span,.xui-DatePicker-trigger>span,.xui-DateRangePicker-trigger>span,.xui-TimePicker-trigger>span{overflow:clip;text-overflow:ellipsis;min-width:0;flex:1 1 auto}\n.xui-Select-trigger>svg,.xui-DatePicker-trigger>svg,.xui-DateRangePicker-trigger>svg,.xui-TimePicker-trigger>svg{width:16px;height:16px;flex-shrink:0;opacity:.6}\n.xui-Select-search{display:flex;width:100%;min-width:0;margin:0 0 var(--xui-spacing-xs);padding:var(--xui-spacing-xs) var(--xui-spacing-sm);outline:none;border:0;border-bottom:1px solid var(--xui-color-border);background:transparent;color:inherit;font:inherit}\n.xui-Select-check{display:inline-flex;margin-inline-start:auto;flex-shrink:0}\n.xui-Checkbox-box{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:pointer}\n.xui-Checkbox-check{display:inline-flex;align-items:center;justify-content:center}\n.xui-Checkbox-check>svg{width:100%;height:100%}\n[data-xui-c=\"Radio\"][data-r-orientation=\"horizontal\"].xui-el>.xui-radio-items{flex-direction:row;flex-wrap:wrap}\n.xui-radio-items{display:flex;flex-direction:column;gap:inherit}\n.xui-radio-row{display:flex;align-items:center;gap:var(--xui-spacing-sm);cursor:pointer}\n.xui-Radio-item{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:pointer}\n.xui-ChoiceTiles-tile{display:flex;flex-direction:column;align-items:stretch;min-width:0;margin:0;font:inherit;color:inherit;text-align:start;appearance:none;-webkit-appearance:none;cursor:pointer;outline:none}\n.xui-ChoiceTiles-tile:focus-visible{outline:2px solid var(--xui-color-ring);outline-offset:1px}\n.xui-ChoiceTiles-tile:disabled{cursor:not-allowed}\n.xui-ChoiceTiles-picture{position:relative;display:flex;align-items:center;justify-content:center;align-self:stretch;aspect-ratio:1.6;flex-shrink:0;min-width:0;overflow:clip;color:var(--xui-color-mutedForeground)}\n.xui-ChoiceTiles-picture>img{display:block;position:absolute;inset:0;width:100%;height:100%;object-fit:cover}\n.xui-ChoiceTiles-picture>svg{width:var(--xui-control-iconMd);height:var(--xui-control-iconMd);opacity:.6}\n.xui-ChoiceTiles-label,.xui-ChoiceTiles-description{display:block;min-width:0;overflow-wrap:anywhere;white-space:pre-wrap}\n.xui-ChoiceTiles-error{grid-column:1/-1;display:flex;flex-direction:column;gap:2px}\n.xui-Switch-track{display:inline-flex;align-items:center;flex-shrink:0;padding:2px;cursor:pointer;transition:background-color var(--xui-motion-fast) var(--xui-ease-standard,ease)}\n.xui-Switch-thumb{display:block;transition:transform var(--xui-motion-fast) var(--xui-ease-standard,ease);transform:translateX(0)}\n.xui-Switch-track[data-state=\"checked\"]>.xui-Switch-thumb{transform:translateX(var(--xui-switch-travel,12px))}\n.xui-Switch-track[data-state=\"checked\"]>.xui-Switch-thumb:dir(rtl){transform:translateX(calc(-1 * var(--xui-switch-travel,12px)))}\n.xui-slider-head{display:flex;justify-content:space-between;gap:var(--xui-spacing-sm)}\n.xui-Slider-track{position:relative;display:flex;align-items:center;width:100%;flex-grow:1;overflow:visible;touch-action:none;user-select:none}\n.xui-slider-root{display:flex;align-items:center;width:100%;min-height:var(--xui-control-slider);touch-action:none;user-select:none;position:relative}\n.xui-Slider-range{position:absolute;height:100%;left:0;border-radius:inherit}\n.xui-Slider-thumb{display:block;cursor:grab;outline:none}\n.xui-DatePicker-calendar,.xui-DateRangePicker-calendar{display:flex;flex-direction:column;gap:var(--xui-spacing-sm);padding:var(--xui-spacing-sm)}\n.xui-calendar-head{display:flex;align-items:center;justify-content:space-between;gap:var(--xui-spacing-sm);font-weight:var(--xui-type-weight-medium)}\n.xui-calendar-nav{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--xui-radius-sm);cursor:pointer;padding:0}\n.xui-calendar-nav:hover{background:var(--xui-color-accent)}\n.xui-calendar-nav>svg{width:16px;height:16px}\n.xui-calendar-grid{display:grid;grid-template-columns:repeat(7,32px);gap:2px}\n.xui-calendar-weekday{display:flex;align-items:center;justify-content:center;height:24px;font-size:var(--xui-type-size-xs);color:var(--xui-color-mutedForeground)}\n.xui-DatePicker-day,.xui-DateRangePicker-day{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--xui-radius-sm);cursor:pointer;padding:0;font-size:var(--xui-type-size-sm)}\n.xui-DatePicker-day:hover,.xui-DateRangePicker-day:hover{background:var(--xui-color-accent)}\n.xui-DatePicker-day[data-xs~=\"selected\"],.xui-DateRangePicker-day[data-xs~=\"selected\"]{background:var(--xui-color-primary);color:var(--xui-color-primaryForeground)}\n.xui-DatePicker-day[data-outside],.xui-DateRangePicker-day[data-outside]{opacity:.4}\n.xui-DatePicker-day:disabled,.xui-DateRangePicker-day:disabled{opacity:.3;cursor:default;pointer-events:none}\n.xui-Composer-field{display:block;width:100%;min-width:0;margin:0;padding:0;outline:none;border:0;background:transparent;color:inherit;font:inherit;resize:none;max-height:200px}\n.xui-composer-bar{display:flex;align-items:center;justify-content:flex-end;gap:var(--xui-spacing-xs)}\n.xui-Composer-attachment{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0}\n.xui-Composer-send{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0}\n.xui-Composer-send>svg,.xui-Composer-attachment>svg{width:16px;height:16px}\n.xui-Composer-send:disabled{opacity:.5;pointer-events:none}\n[data-xui-c=\"Ring\"].xui-el,[data-xui-c=\"Spinner\"].xui-el{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n[data-xui-c=\"Ring\"].xui-el>svg,[data-xui-c=\"Spinner\"].xui-el>svg{width:100%;height:100%;display:block}\n.xui-Ring-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}\n[data-xui-c=\"Spinner\"].xui-el>svg,.xui-Button-spinner>svg{animation:xui-spin 0.8s linear infinite}\n[data-xui-c=\"Skeleton\"].xui-el:not([data-rows]),.xui-Skeleton-dot,.xui-Skeleton-bar{animation:xui-skeleton ${SKELETON_PULSE_MS}ms ease-in-out infinite;opacity:${SKELETON_OPACITY_LOW};flex-shrink:0}\n[data-xui-c=\"Skeleton\"][data-rows].xui-el{display:flex;flex-direction:column;align-self:stretch;flex-shrink:0;background:none;border-radius:0}\n.xui-Skeleton-row{display:flex;flex-direction:row;align-items:center;flex-shrink:0}\n.xui-Skeleton-row+.xui-Skeleton-row{border-top:var(--xui-border-hairline) solid var(--xui-color-border)}\n.xui-Skeleton-dot{display:block}\n.xui-Skeleton-bar{display:block}\n.xui-Skeleton-bar[data-title]{flex-shrink:1;min-width:0}\n@keyframes xui-skeleton{0%,100%{opacity:${SKELETON_OPACITY_LOW}}50%{opacity:${SKELETON_OPACITY_HIGH}}}\n[data-xui-c=\"SearchList\"].xui-el{display:flex;flex-direction:column;overflow:hidden;min-width:0}\n.xui-SearchList-head,.xui-Menu-head{display:flex;flex-direction:row;align-items:center;flex-shrink:0}\n.xui-SearchList-search,.xui-Menu-search{display:flex;align-items:center;gap:8px;flex:1 1 auto;min-width:0;align-self:stretch}\n.xui-SearchList-search>svg,.xui-Menu-search>svg{width:16px;height:16px;opacity:.6;flex-shrink:0}\n.xui-SearchList-search>input,.xui-Menu-search>input{flex:1 1 auto;min-width:0;height:100%;padding:0;border:0;outline:none;background:transparent;color:inherit;font:inherit}\n.xui-SearchList-count,.xui-Menu-count{flex-shrink:0;font-variant-numeric:tabular-nums}\n.xui-SearchList-body,.xui-Menu-body{display:flex;flex-direction:column;position:relative;flex-shrink:1;min-height:0}\n.xui-SearchList-list,.xui-Menu-list{display:flex;flex-direction:column;flex-shrink:1;min-height:0;overflow-y:auto}\n.xui-SearchList-item{display:flex;flex-direction:row;align-items:center;flex-shrink:0;cursor:pointer;user-select:none;white-space:nowrap}\n.xui-SearchList-item[aria-disabled=\"true\"]{pointer-events:none}\n.xui-SearchList-icon,.xui-SearchList-check{display:inline-flex;flex-shrink:0}\n.xui-SearchList-icon>svg,.xui-SearchList-check>svg{width:100%;height:100%}\n.xui-SearchList-identifier{flex-shrink:0}\n.xui-SearchList-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}\n.xui-SearchList-fade,.xui-Menu-fade{position:absolute;left:0;right:0;bottom:0;height:${SEARCH_LIST_FADE}px;pointer-events:none;background:linear-gradient(to bottom,transparent,var(--xui-color-popover)) !important}\n.xui-menu-search{display:flex;flex-direction:column;min-width:240px}\n.xui-menu-search .xui-Menu-item{flex-shrink:0}\n[data-xui-c=\"Markdown\"].xui-el{display:block;min-width:0;overflow-wrap:anywhere}\n[data-xui-c=\"Markdown\"][data-lines].xui-el{display:-webkit-box;-webkit-box-orient:vertical;overflow:clip}\n.xui-md>:first-child{margin-top:0}\n.xui-md>:last-child{margin-bottom:0}\n.xui-Markdown-paragraph{margin:0 0 var(--xui-spacing-sm)}\n.xui-Markdown-heading{margin:var(--xui-spacing-md) 0 var(--xui-spacing-xs);font-weight:var(--xui-type-weight-semibold);line-height:1.25}\n.xui-md ul,.xui-md ol{margin:0 0 var(--xui-spacing-sm);padding-inline-start:1.4em}\n.xui-md ul{list-style:disc}\n.xui-md ol{list-style:decimal}\n.xui-md li>ul,.xui-md li>ol{margin-bottom:0}\n.xui-Markdown-listItem{margin:0}\n.xui-Markdown-code{font-family:var(--xui-font-mono);font-size:.925em;padding:0 .3em;border-radius:4px;background:var(--xui-color-muted)}\n.xui-Markdown-codeBlock{display:block;font-family:var(--xui-font-mono);font-size:var(--xui-type-size-xs);white-space:pre;overflow:auto;padding:var(--xui-spacing-sm);margin:0 0 var(--xui-spacing-sm);border-radius:var(--xui-radius-sm);background:var(--xui-color-muted)}\n.xui-Markdown-quote{margin:0 0 var(--xui-spacing-sm);padding-inline-start:var(--xui-spacing-md);border-inline-start:2px solid var(--xui-color-border);color:var(--xui-color-mutedForeground)}\n.xui-Markdown-link{color:var(--xui-color-primary);text-decoration:underline;text-underline-offset:3px}\n.xui-Markdown-table{border-collapse:collapse;margin:0 0 var(--xui-spacing-sm);width:100%}\n.xui-Markdown-table th,.xui-Markdown-table td{border:1px solid var(--xui-color-border);padding:var(--xui-spacing-xs) var(--xui-spacing-sm);text-align:start}\n.xui-Markdown-image{height:160px;margin:0 0 var(--xui-spacing-sm);overflow:hidden}\n.xui-Markdown-image>img{display:block;width:100%;height:100%;object-fit:contain;object-position:0 0}\n.xui-Markdown-image>img:dir(rtl){object-position:100% 0}\n.xui-Markdown-imageAlt{color:var(--xui-color-mutedForeground)}\n[data-xui-c=\"Chart\"].xui-el{flex-direction:column;gap:var(--xui-spacing-xs);min-width:0}\n.xui-Chart-legend,.xui-Chart-title{flex-shrink:0}\n[data-xui-c=\"Chart\"].xui-el>svg{width:100%;display:block}\n.xui-Chart-legend{display:flex;flex-wrap:wrap;gap:var(--xui-spacing-sm);font-size:var(--xui-type-size-xs);color:var(--xui-color-mutedForeground)}\n.xui-Chart-legend>span{display:inline-flex;align-items:center;gap:var(--xui-spacing-xxs)}\n.xui-Chart-legend i{display:inline-block;width:8px;height:8px;border-radius:2px}\n.xui-Chart-title{font-weight:var(--xui-type-weight-medium)}\n[data-xui-c=\"TreeGuides\"].xui-el{flex-direction:row;align-self:stretch;flex-shrink:0}\n[data-xui-c=\"TreeGuides\"].xui-el{overflow:visible}\n.xui-tree-col{position:relative;align-self:stretch;flex-shrink:0;overflow:visible}\n.xui-tree-col>.xui-TreeGuides-line{position:absolute;background:currentColor;display:block;padding:0;margin:0;box-sizing:border-box}\n.xui-tree-col>.xui-TreeGuides-line[data-elbow]{background:none;border-style:solid;border-color:currentColor;border-top-width:0;border-right-width:0}\n[data-xui-c=\"Unknown\"].xui-el{flex-direction:column;gap:var(--xui-spacing-xxs)}\n[data-xui-c=\"Box\"][data-pressable=\"true\"].xui-el{cursor:pointer}\n.xui-layer{position:absolute;top:0;left:0;width:0;height:0;overflow:visible}\n.xui-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n\n.xui-calendar-row{display:contents}\n.xui-calendar-cell{display:flex;align-items:center;justify-content:center}\n.xui-calendar-day-label{position:relative}\n.xui-DatePicker-day[data-today]>.xui-calendar-day-label,.xui-DateRangePicker-day[data-today]>.xui-calendar-day-label{text-decoration:underline;text-underline-offset:3px}\n.xui-DateRangePicker-day{position:relative}\n.xui-DateRangePicker-range{position:absolute;inset:0;border-radius:inherit}\n.xui-DateRangePicker-day[data-range]{background:var(--xui-color-accent)}\n.xui-calendar-nav{color:inherit}\n[data-xui-c=\"Form\"].xui-el{flex-direction:column}\n.xui-form-fields{display:contents;border:0;margin:0;padding:0;min-width:0}\n.xui-Form-summary{display:flex;flex-direction:column}\n.xui-form-summary-list{margin:0;padding-inline-start:1.2em}\n.xui-Input-error,.xui-Textarea-error,.xui-NumberField-error,.xui-ChipInput-error,.xui-FileUpload-error,.xui-Select-error,.xui-Checkbox-error,.xui-Switch-error,.xui-Radio-error,.xui-DatePicker-error,.xui-DateRangePicker-error,.xui-TimePicker-error{display:flex;flex-direction:column;gap:2px}\n[data-xui-numberfield]{display:flex;flex-direction:row;align-items:center;gap:var(--xui-spacing-xxs);min-width:0}\n.xui-NumberField-input{flex:1 1 auto;min-width:0;width:100%;border:0;outline:none;background:transparent;color:inherit;font:inherit;padding:0;text-align:start;font-variant-numeric:tabular-nums}\n.xui-NumberField-decrement,.xui-NumberField-increment,.xui-ChipInput-remove,.xui-FileUpload-remove,.xui-Toast-close,.xui-CodeBlock-copy{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:pointer}\n.xui-NumberField-decrement>svg,.xui-NumberField-increment>svg,.xui-ChipInput-remove>svg,.xui-FileUpload-remove>svg,.xui-Toast-close>svg,.xui-CodeBlock-copy>svg{width:16px;height:16px}\n.xui-NumberField-decrement:disabled,.xui-NumberField-increment:disabled{opacity:.4;pointer-events:none}\n.xui-NumberField-unit{flex-shrink:0}\n[data-xui-chipfield]{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;cursor:text}\n.xui-chip-list{display:contents;list-style:none;margin:0;padding:0}\n.xui-ChipInput-chip{display:inline-flex;align-items:center;flex-shrink:0;outline:none}\n.xui-ChipInput-input{flex:1 1 80px;min-width:80px;border:0;outline:none;background:transparent;color:inherit;font:inherit;padding:0;height:var(--xui-type-lineHeight-sm)}\n.xui-ChipInput-suggestions{display:flex;flex-direction:column;border:1px solid var(--xui-color-border);border-radius:var(--xui-radius-md);background:var(--xui-color-popover);color:var(--xui-color-popoverForeground);padding:var(--xui-spacing-xs);box-shadow:var(--xui-shadow-md)}\n.xui-ChipInput-suggestion{display:flex;align-items:center;padding:var(--xui-spacing-xs) var(--xui-spacing-sm);border-radius:var(--xui-radius-sm);cursor:pointer}\n.xui-ChipInput-suggestion[data-active]{background:var(--xui-color-accent);color:var(--xui-color-accentForeground)}\n.xui-FileUpload-dropzone{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;cursor:pointer;outline:none}\n.xui-FileUpload-dropzone[aria-disabled=\"true\"]{cursor:default}\n.xui-FileUpload-icon{display:inline-flex}\n.xui-FileUpload-icon>svg{width:100%;height:100%}\n.xui-FileUpload-title{font-weight:var(--xui-type-weight-medium)}\n.xui-file-list{display:flex;flex-direction:column;gap:var(--xui-spacing-xs);list-style:none;margin:0;padding:0}\n.xui-FileUpload-file{display:flex;flex-direction:row;align-items:center}\n.xui-FileUpload-fileIcon{display:inline-flex;flex-shrink:0;opacity:.7}\n.xui-FileUpload-fileIcon>svg{width:16px;height:16px}\n.xui-FileUpload-browse{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;flex-shrink:0;height:var(--xui-control-buttonSm)}\n.xui-FileUpload-fileName{flex:1 1 auto;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap}\n[data-xui-c=\"CodeBlock\"].xui-el{flex-direction:column;min-width:0;overflow:clip}\n.xui-CodeBlock-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}\n.xui-CodeBlock-copy>svg{width:12px;height:12px}\n.xui-codeblock-scroll{overflow:auto;min-width:0;outline:none}\n.xui-codeblock-scroll[data-max-lines]{max-height:calc(var(--xui-code-lines) * 1lh)}\n.xui-codeblock-pre{margin:0;padding:0;font:inherit;white-space:pre;tab-size:2;min-width:max-content}\n.xui-codeblock-scroll[data-wrap=\"true\"]>.xui-codeblock-pre{white-space:pre-wrap;overflow-wrap:anywhere;min-width:0}\n.xui-codeblock-pre>code{font:inherit;display:block}\n.xui-CodeBlock-line{display:flex;flex-direction:row}\n.xui-codeblock-text{flex:0 1 auto;min-width:0}\n.xui-CodeBlock-gutter{display:flex;flex-direction:row;justify-content:flex-end;flex-shrink:0;user-select:none}\n.xui-CodeBlock-lineNumber{display:block}\n[data-xui-c=\"Table\"].xui-el{flex-direction:column;min-width:0;overflow:auto}\n.xui-Table-header{display:flex;flex-direction:column}\n.xui-Table-header[data-sticky=\"true\"]{position:sticky;top:0;z-index:1}\n.xui-table-row,.xui-Table-row{display:grid;align-items:stretch;min-width:0}\n.xui-table-body{display:flex;flex-direction:column;position:relative}\n.xui-table-check{display:flex;align-items:center;justify-content:center;min-width:0}\n.xui-Table-headerCell,.xui-Table-cell{display:flex;flex-direction:row;align-items:center;min-width:0;overflow:clip;text-overflow:ellipsis;white-space:nowrap;gap:var(--xui-spacing-xs)}\n.xui-Table-headerCell[data-r-align=\"end\"],.xui-Table-cell[data-r-align=\"end\"]{justify-content:flex-end;text-align:end}\n.xui-Table-headerCell[data-r-align=\"center\"],.xui-Table-cell[data-r-align=\"center\"]{justify-content:center;text-align:center}\n.xui-Table-cell[data-type=\"number\"]{font-variant-numeric:tabular-nums}\n.xui-Table-cell>svg{width:16px;height:16px}\n.xui-Table-row{outline:none}\n.xui-Table-row:focus-visible{box-shadow:inset 0 0 0 2px var(--xui-color-ring)}\n.xui-Table-row[tabindex]{cursor:pointer}\n.xui-table-sort{display:inline-flex;align-items:center;gap:var(--xui-spacing-xxs);padding:0;margin:0;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;min-width:0}\n.xui-Table-headerCell[data-r-align=\"end\"]>.xui-table-sort{flex-direction:row}\n.xui-Table-sortIcon{display:inline-flex;flex-shrink:0}\n.xui-Table-sortIcon>svg{width:100%;height:100%}\n.xui-Table-empty{display:flex;justify-content:center}\n.xui-table-badge{display:inline-flex;align-items:center;height:var(--xui-control-badge);padding:0 var(--xui-spacing-sm);border-radius:var(--xui-radius-full);background:var(--xui-color-secondary);color:var(--xui-color-secondaryForeground);font-size:var(--xui-type-size-xs)}\n.xui-chart-plot{position:relative;width:100%;min-width:0;flex:1 1 0%;min-height:0;overflow:visible}\n.xui-chart-svg{position:absolute;top:0;left:0;display:block;overflow:visible;outline:none}\n.xui-chart-svg:focus-visible{outline:2px solid var(--xui-color-ring);outline-offset:2px;border-radius:var(--xui-radius-sm)}\n.xui-Chart-grid{opacity:.7}\n.xui-Chart-tooltip{display:flex;flex-direction:column;gap:2px;z-index:2;min-width:120px;white-space:nowrap}\n.xui-chart-tip-row{display:inline-flex;align-items:center;gap:var(--xui-spacing-xxs)}\n.xui-chart-tip-row>i{display:inline-block;width:8px;height:8px;border-radius:2px}\n.xui-Chart-valueLabel{fill:currentColor}\n[data-xui-c=\"Chart\"][data-kind=\"sparkline\"].xui-el{gap:0}\n.xui-Image-fallback{display:flex;align-items:center;justify-content:center;position:absolute;inset:0}\n.xui-Image-fallback>svg{width:var(--xui-control-iconLg);height:var(--xui-control-iconLg)}\n[data-xui-c=\"Image\"][data-state=\"loading\"].xui-el{background:var(--xui-color-muted)}\n.xui-carousel-controls{display:flex;align-items:center;justify-content:center}\n.xui-carousel-controls>.xui-carousel-dots{padding-top:0}\n.xui-carousel-nav{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0;cursor:pointer}\n.xui-carousel-nav:disabled{pointer-events:none}\n.xui-carousel-nav>svg{width:var(--xui-control-iconSm);height:var(--xui-control-iconSm)}\n.xui-menu-label{flex:1 1 auto;min-width:0}\n.xui-Menu-shortcut{margin-inline-start:auto;padding-inline-start:var(--xui-spacing-lg)}\n.xui-Menu-check{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0}\n.xui-Menu-check svg,.xui-Menu-submenuIndicator>svg{width:100%;height:100%}\n.xui-Menu-submenuIndicator{display:inline-flex;margin-inline-start:auto;flex-shrink:0}\n.xui-Select-searchbox{display:flex;align-items:center;gap:var(--xui-spacing-xs);padding-inline-start:var(--xui-spacing-sm)}\n.xui-Select-searchbox>svg{width:16px;height:16px;opacity:.6;flex-shrink:0}\n.xui-Select-searchbox>.xui-Select-search{margin:0;border-bottom:0;padding-inline-start:0}\n.xui-Select-listbox,.xui-TimePicker-listbox{display:flex;flex-direction:column;outline:none;overflow:auto;max-height:280px}\n.xui-Select-empty{display:flex}\n.xui-TimePicker-list{min-width:var(--radix-popover-trigger-width)}\n[data-xui-c=\"Toast\"].xui-el{flex-direction:row;align-items:flex-start;width:min(360px,calc(100vw - 32px));pointer-events:auto}\n.xui-Toast-icon{display:inline-flex;flex-shrink:0}\n.xui-Toast-icon>svg{width:100%;height:100%}\n.xui-toast-text{display:flex;flex-direction:column;gap:2px;flex:1 1 auto;min-width:0}\n.xui-Toast-action{display:inline-flex;align-items:center;flex-shrink:0;cursor:pointer;white-space:nowrap}\n.xui-toast-layer{position:fixed;bottom:var(--xui-spacing-lg);left:50%;transform:translateX(-50%);z-index:60;display:flex;flex-direction:column;align-items:center;gap:var(--xui-spacing-sm);pointer-events:none;width:max-content;max-width:calc(100vw - 32px)}\n.xui-toast-layer>:nth-last-child(n+4){display:none}\n.xui-Popover-content[data-open-on=\"hover\"]{pointer-events:auto}\n@keyframes xui-fade-out{to{opacity:0}}\n@keyframes xui-pop-in{from{opacity:0;scale:var(--xui-scale-popoverFrom,.96)}}\n@keyframes xui-pop-out{to{opacity:0}}\n@keyframes xui-slide-bottom-in{from{translate:0 100%}}\n@keyframes xui-slide-bottom-out{to{translate:0 100%}}\n@keyframes xui-slide-top-in{from{translate:0 -100%}}\n@keyframes xui-slide-top-out{to{translate:0 -100%}}\n@keyframes xui-slide-left-in{from{translate:-100% 0}}\n@keyframes xui-slide-left-out{to{translate:-100% 0}}\n@keyframes xui-slide-right-in{from{translate:100% 0}}\n@keyframes xui-slide-right-out{to{translate:100% 0}}\n@keyframes xui-toast-in{from{opacity:0;translate:0 12px}}\n@keyframes xui-accordion-open{from{height:0}to{height:var(--radix-accordion-content-height)}}\n@keyframes xui-accordion-close{from{height:var(--radix-accordion-content-height)}to{height:0}}\n.xui-Popover-content,.xui-Tooltip-content,.xui-Menu-content,.xui-Select-content,.xui-DatePicker-calendar,.xui-DateRangePicker-calendar,.xui-TimePicker-list{transform-origin:var(--radix-popper-transform-origin)}\n.xui-Popover-content[data-state=\"open\"],.xui-Tooltip-content[data-state$=\"open\"],.xui-Menu-content[data-state=\"open\"],.xui-Select-content[data-state=\"open\"],.xui-DatePicker-calendar[data-state=\"open\"],.xui-DateRangePicker-calendar[data-state=\"open\"],.xui-TimePicker-list[data-state=\"open\"],.xui-Dialog-content[data-state=\"open\"]{animation:xui-pop-in var(--xui-motion-standard) var(--xui-ease-decelerate,ease-out)}\n[data-xui-c=\"Button\"].xui-el:active:not(:disabled){scale:var(--xui-scale-press,1)}\n.xui-Popover-content[data-state=\"closed\"],.xui-Tooltip-content[data-state=\"closed\"],.xui-Menu-content[data-state=\"closed\"],.xui-Select-content[data-state=\"closed\"],.xui-DatePicker-calendar[data-state=\"closed\"],.xui-DateRangePicker-calendar[data-state=\"closed\"],.xui-TimePicker-list[data-state=\"closed\"],.xui-Dialog-content[data-state=\"closed\"]{animation:xui-pop-out var(--xui-motion-fast) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-Dialog-overlay[data-state=\"open\"],.xui-Drawer-overlay[data-state=\"open\"]{animation:xui-fade-in var(--xui-motion-standard) var(--xui-ease-decelerate,ease-out)}\n.xui-Dialog-overlay[data-state=\"closed\"],.xui-Drawer-overlay[data-state=\"closed\"]{animation:xui-fade-out var(--xui-motion-standard) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-Drawer-content[data-side=\"bottom\"][data-state=\"open\"]{animation:xui-slide-bottom-in var(--xui-motion-slow) var(--xui-ease-decelerate,ease-out)}\n.xui-Drawer-content[data-side=\"bottom\"][data-state=\"closed\"]{animation:xui-slide-bottom-out var(--xui-motion-standard) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-Drawer-content[data-side=\"top\"][data-state=\"open\"]{animation:xui-slide-top-in var(--xui-motion-slow) var(--xui-ease-decelerate,ease-out)}\n.xui-Drawer-content[data-side=\"top\"][data-state=\"closed\"]{animation:xui-slide-top-out var(--xui-motion-standard) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-Drawer-content[data-side=\"left\"][data-state=\"open\"]{animation:xui-slide-left-in var(--xui-motion-slow) var(--xui-ease-decelerate,ease-out)}\n.xui-Drawer-content[data-side=\"left\"][data-state=\"closed\"]{animation:xui-slide-left-out var(--xui-motion-standard) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-Drawer-content[data-side=\"right\"][data-state=\"open\"]{animation:xui-slide-right-in var(--xui-motion-slow) var(--xui-ease-decelerate,ease-out)}\n.xui-Drawer-content[data-side=\"right\"][data-state=\"closed\"]{animation:xui-slide-right-out var(--xui-motion-standard) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-Accordion-content[data-state=\"open\"]{animation:xui-accordion-open var(--xui-motion-standard) var(--xui-ease-standard,ease)}\n.xui-Accordion-content[data-state=\"closed\"]{animation:xui-accordion-close var(--xui-motion-standard) var(--xui-ease-standard,ease)}\n.xui-Tabs-content[data-state=\"active\"]{animation:xui-fade-in var(--xui-motion-fast) var(--xui-ease-decelerate,ease-out)}\n[data-xui-c=\"Toast\"][data-state=\"open\"].xui-el{animation:xui-toast-in var(--xui-motion-standard) var(--xui-ease-decelerate,ease-out)}\n[data-xui-c=\"Toast\"][data-state=\"closed\"].xui-el{animation:xui-fade-out var(--xui-motion-standard) var(--xui-ease-accelerate,ease-in) forwards}\n.xui-accordion-title{display:inline-flex;align-items:baseline;gap:var(--xui-spacing-xs);min-width:0}\n.xui-Collapsible-chevron.xui-el{transition:transform var(--xui-motion-fast) var(--xui-ease-standard,ease)}\n${SHIMMER_CSS}\n}\n@media (prefers-reduced-motion: reduce){@layer xui-base{.xui-surface *,.xui-surface *::before,.xui-surface *::after{animation-duration:0ms !important;animation-iteration-count:1 !important;transition-duration:0ms !important;scroll-behavior:auto !important}${REDUCED_EXTRA}}}\n.xui-surface[data-xui-motion=\"reduce\"] *,.xui-surface[data-xui-motion=\"reduce\"] *::after{animation-duration:0ms !important;animation-iteration-count:1 !important;transition-duration:0ms !important}\n${REDUCED_EXTRA.replace(/\\.xui-surface /g, `.xui-surface[data-xui-motion=\"reduce\"] `)}`\n",
9
+ "// VAPP-103: every href and every src the renderer emits passes the host\n// contract's policy (`catalog/host.json` urls / media): Link (external or\n// not), markdown links + images, FileUpload file urls, Image / Avatar /\n// Video / Audio. A denied href paints as text; a denied src loads nothing.\n// Relative urls resolve against the host's base (on the web, the\n// document's when the host sets none). VAPP-107: a private, loopback or\n// link-local host is denied unless the host's policy opts it in\n// (`allowPrivate`); the page's OWN host is opted in when it is private (a\n// dev server on localhost keeps its same-origin images and links), the LAN\n// and every other private host stay denied. Shared by React and Solid\n// (FEED-128): one filter, both renderers.\n\nimport { DEFAULT_MEDIA_SCHEMES, decideUrl, isPrivateHost, mediaRequest, safeHref, type MediaRequest, type UrlPolicy } from \"@exponential-at/ui\"\nimport type { AnyHostPlugin as HostPlugin } from \"./host-types\"\n\nconst documentBase = (): string | undefined => (typeof document !== `undefined` && document.baseURI ? document.baseURI : undefined)\n\n/** VAPP-107: the page's OWN host when it is private (a dev server on\n * localhost): the renderer opts it in on top of the host's `allowPrivate`,\n * exactly as the Exponential app's hosts opt their own origin in. The page\n * already runs there; nothing else private is reached. */\nexport function ownPrivateHosts(): string[] {\n try {\n const base = documentBase()\n if (!base) return []\n const host = new URL(base).hostname.toLowerCase()\n return isPrivateHost(host) ? [host] : []\n } catch {\n return []\n }\n}\n\nfunction withOwnOrigin(allow: readonly string[] | undefined): readonly string[] | undefined {\n const own = ownPrivateHosts()\n if (!own.length) return allow\n return [...(allow ?? []), ...own.filter((h) => !(allow ?? []).includes(h))]\n}\n\n/** The URL policy a plugin's hrefs pass. */\nexport function urlPolicyOf(host: HostPlugin): UrlPolicy {\n const urls = host.urls ?? {}\n const withBase = urls.baseUrl ? urls : { ...urls, baseUrl: host.media?.baseUrl ?? documentBase() }\n return { ...withBase, allowPrivate: withOwnOrigin(withBase.allowPrivate) }\n}\n\n/** The href a link may navigate to, or undefined (paint it as text). */\nexport function linkHref(host: HostPlugin, href: unknown): string | undefined {\n return safeHref(urlPolicyOf(host), href)\n}\n\n/** The media request for a src (`resolveUrl` rewrites first; the host's\n * `mediaRequest` or the plugin's `media` options build it), re-checked\n * against the media schemes/hosts so a host hook cannot widen them. Null =\n * nothing loads. */\nexport function mediaRequestOf(host: HostPlugin, src: unknown): MediaRequest | null {\n if (typeof src !== `string` || !src) return null\n const rewritten = host.resolveUrl ? host.resolveUrl(src) : src\n const req = host.mediaRequest ? host.mediaRequest(rewritten) : mediaRequest(rewritten, { baseUrl: documentBase(), ...host.media, allowPrivate: withOwnOrigin(host.media?.allowPrivate) })\n if (!req) return null\n return mediaUrlAllowed(host, req.url) ? req : null\n}\n\n/** Does an absolute media url pass the media schemes, hosts and private\n * opt-ins (VAPP-107; the page's own private host counts as opted in)? */\nexport function mediaUrlAllowed(host: HostPlugin, url: string): boolean {\n return decideUrl({ schemes: host.media?.schemes ?? DEFAULT_MEDIA_SCHEMES, hosts: host.media?.hosts, allowPrivate: withOwnOrigin(host.media?.allowPrivate) }, url).allowed\n}\n\n/** The default opener: only what the policy allows, in a new tab. */\nexport function openAllowed(host: HostPlugin, url: string): void {\n const href = linkHref(host, url)\n if (!href) return\n if (host.openUrl) host.openUrl(href)\n else if (typeof window !== `undefined`) window.open(href, `_blank`, `noopener,noreferrer`)\n}\n",
10
+ "// VAPP-87: what an EMBEDDING APP provides (the host plugin) and what a web\n// renderer sends it, framework-free. The plugin knows no transport: actions\n// and input edits are plain objects the host forwards wherever it likes.\n// VAPP-91: the host API (`ExponentialHost`: transport, functions, bindings,\n// negotiation, policy) plugs in through a renderer's `hostPlugin(host)`.\n// FEED-128: generic over the renderer's component types (`Icon` = what an\n// icon registry name maps to, `Markdown` = a richer markdown renderer), so\n// React and Solid share ONE plugin shape.\n\nimport type { FunctionCallInfo, MediaOptions, MediaRequest, ThemeIssue, UiNode, UrlPolicy } from \"@exponential-at/ui\"\nimport type { ClientFunction } from \"./data\"\n\n/** A registry name → the renderer's icon component (a map or a lookup). */\nexport type IconMap<Icon = unknown> = Record<string, Icon | undefined> | ((name: string) => Icon | undefined)\n\n/** A user action: a node's `on.<event>` with an `event` action, resolved. */\nexport interface SurfaceActionEvent {\n surfaceId: string\n /** The catalog event (`press`, `change`, `select`, `submit`…). */\n event: string\n /** The action's `event.name`. */\n name: string\n componentId: string\n context: Record<string, unknown>\n /** What the component adds (a Select's `value`, a Tabs' `value`…). */\n payload?: Record<string, unknown>\n timestamp: string\n}\n\n/** A host-owned input edit. `change` fires debounced while typing with a\n * monotonically increasing `revision`; `commit` on blur / Enter. The host's\n * echo (a data model write at `path`) is applied only while no newer\n * revision is outstanding and the field is not focused. */\nexport interface SurfaceInputEvent {\n surfaceId: string\n componentId: string\n /** The input's `name` prop. */\n name: string\n /** The bound data model pointer, when `value` is a binding. */\n path?: string\n value: unknown\n revision: number\n kind: `change` | `commit`\n}\n\n/** A painter that failed: the surface, the component, why. */\nexport interface PaintError {\n surfaceId: string\n componentId: string\n message: string\n}\n\n/** One option a host source supplies (the catalog's `option` shape). */\nexport interface SourceOption {\n label: string\n value: string\n icon?: string\n disabled?: boolean\n}\n\nexport interface HostPlugin<Icon = unknown, Markdown = unknown> {\n /** The icon registry: the catalog's `Icon` names → components. */\n icons?: IconMap<Icon>\n /** Server events. Returning a promise keeps the source control in its\n * optimistic pending state until it settles. */\n onAction?: (event: SurfaceActionEvent) => void | Promise<void>\n /** Host-owned input edits. Returning a promise acknowledges the revision\n * when it settles; a sync host acknowledges at once. */\n onInput?: (event: SurfaceInputEvent) => void | Promise<void>\n /** Opens an href the URL policy allowed (`openUrl`, `Link`); default\n * `window.open(url, \"_blank\")`. */\n openUrl?: (url: string) => void\n /** The URL policy EVERY href passes (Link, markdown links, FileUpload\n * file urls, openUrl): `catalog/host.json` urls. Unset = the default\n * schemes; relative urls resolve against `baseUrl`, else `media.baseUrl`,\n * else the document's. A denied href paints as text. */\n urls?: UrlPolicy\n /** The media policy every src passes when there is no `mediaRequest`\n * (schemes, hosts, private opt-ins, base, header rules):\n * `catalog/host.json` media. */\n media?: MediaOptions\n /** Extra or overriding client functions, web renderers only (`{call,\n * args}` in a prop; an action naming one runs it). Any OTHER action\n * function name goes to onFunctionCall (the portable host functions). */\n functions?: Record<string, ClientFunction>\n /** An action `functionCall` to a name outside the built-ins (the host\n * function registry + its policy gate, `ExponentialHost.callFunction`).\n * A promise keeps the source control pending until it settles. */\n onFunctionCall?: (call: FunctionCallInfo) => unknown | Promise<unknown>\n /** The media loader's request for a source (absolute url + headers, e.g.\n * auth for /api/attachments); null = denied. A request WITH headers is\n * fetched (under the media limits) and shown as a blob url; without, its\n * url is used as is. Its url is re-checked against `media`'s schemes,\n * hosts and private opt-ins. */\n mediaRequest?: (src: string) => MediaRequest | null\n /** Video/Audio (`catalog/host.json` media: the byte limits do not apply,\n * they stream): a url the browser's player loads WITHOUT headers for a\n * request that carries some (a signed or cookie-authed url), so the\n * player streams and seeks. Its result passes the media policy again.\n * Unset = the request is fetched whole into a blob url under the media\n * byte cap and timeout for the WHOLE download (VAPP-107), so a long\n * video needs this hook. */\n mediaStreamUrl?: (request: MediaRequest) => string | Promise<string>\n /** A richer markdown renderer than the built-in one (a component taking\n * `{text, className}` in the renderer's framework). */\n Markdown?: Markdown\n /** Rewrites a media src BEFORE the media policy (signed URLs). */\n resolveUrl?: (src: string) => string\n /** `onPaintError` (`catalog/host.json` paint): a component's painter\n * failed; it paints an empty box. `hostPlugin(host)` forwards it to the\n * agent as an A2UI `RENDER_FAILED` error. */\n onPaintError?: (error: PaintError) => void\n /** Called with the node for every Unknown placeholder painted. */\n onUnknown?: (node: UiNode) => void\n /** Round 4 (VAPP-103): the `theme` prop was unusable (an unknown built-in\n * id, a theme file with issues). The surface never throws: it paints\n * with the default theme and reports why here. */\n onThemeIssues?: (issues: ThemeIssue[]) => void\n /** Round 1, FileUpload: the picked/dropped files' BYTES (the `upload`\n * event carries only `{name, size, type}`). Return a promise to keep the\n * drop zone busy until it settles. */\n onUpload?: (files: File[], target: { nodeId: string; name: string }) => void | Promise<void>\n /** Round 1, Select `source`: a host list id (`exp:statuses`) → its\n * options for a query (`\"\"` when not searchable). */\n optionSource?: (source: string, query: string) => SourceOption[] | Promise<SourceOption[]>\n}\n\n/** Any renderer's plugin (what the framework-free helpers take). */\nexport type AnyHostPlugin = HostPlugin<unknown, unknown>\n\n/** A registry lookup: the host's map (or function) first, then the\n * renderer's own fallbacks. */\nexport function lookupIcon<Icon>(icons: IconMap<Icon> | undefined, name: string, fallbacks: Readonly<Record<string, Icon>> = {}): Icon | undefined {\n if (!icons) return fallbacks[name]\n const hit = typeof icons === `function` ? icons(name) : icons[name]\n return hit ?? fallbacks[name]\n}\n",
11
+ "// VAPP-87 + round 1 (FEED-128: hoisted from the React renderer's\n// natives/shared.tsx): the prop coercions every native painter applies, the\n// built-in phrase lookup, localized file sizes, the `checks` evaluation and\n// the built-in glyph names of `core.catalog.json` `builtinIcons`. Pure:\n// every web renderer paints with the same values.\n\nimport { DEFAULT_STRINGS, coreCatalog } from \"@exponential-at/ui\"\n\nexport const str = (v: unknown, fallback = ``): string => (v === undefined || v === null ? fallback : typeof v === `object` ? JSON.stringify(v) : String(v))\nexport const num = (v: unknown, fallback = 0): number => (typeof v === `number` && Number.isFinite(v) ? v : typeof v === `string` && v.trim() !== `` && Number.isFinite(Number(v)) ? Number(v) : fallback)\nexport const bool = (v: unknown): boolean => v === true || v === `true`\nexport const arr = <T>(v: unknown): T[] => (Array.isArray(v) ? (v as T[]) : [])\n/** An array of OBJECTS (options, items, tabs, columns, rows…): entries that\n * are not objects (`options: [null]`) are skipped, never painted. */\nexport const objects = <T>(v: unknown): T[] => (Array.isArray(v) ? (v.filter((e) => e !== null && typeof e === `object` && !Array.isArray(e)) as T[]) : [])\n\n/** A built-in PHRASE with placeholders (`removeItem` = `Remove {name}`):\n * the surface's string table entry when it carries `id` (word order is the\n * translation's), else `fallback()`, the round-1 composition kept until\n * catalog/strings.json ships the id. */\nexport function phrase(ctx: { strings: Readonly<Record<string, string>>; t: (id: string, params?: Record<string, unknown>) => string }, id: string, params: Record<string, unknown>, fallback: () => string): string {\n return ctx.strings[id] !== undefined ? ctx.t(id, params) : fallback()\n}\n\nconst SIZE_UNITS = [`byte`, `kilobyte`, `megabyte`, `gigabyte`] as const\nconst sizeFormats = new Map<string, Intl.NumberFormat[]>()\n\n/** A byte count in the surface locale with a LOCALIZED unit (1024 steps,\n * `Intl.NumberFormat` `style: \"unit\"`, e.g. `1,5 kB` / `١٫٥ ك.بايت`). */\nexport function formatFileSize(bytes: number, locale: string): string {\n let fmts = sizeFormats.get(locale)\n if (!fmts) {\n fmts = SIZE_UNITS.map((unit) => {\n try {\n return new Intl.NumberFormat(locale, { style: `unit`, unit, unitDisplay: `short`, maximumFractionDigits: 1 })\n } catch {\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 1 })\n }\n })\n sizeFormats.set(locale, fmts)\n }\n let i = 0\n let n = Math.max(0, bytes)\n while (n >= 1024 && i < SIZE_UNITS.length - 1) {\n n /= 1024\n i++\n }\n return fmts[i]!.format(n)\n}\n\n/** Does a file match an `accept` list (`image/*,.pdf`)? */\nexport function acceptsFile(accept: string, file: { name: string; type: string }): boolean {\n const rules = accept\n .split(`,`)\n .map((r) => r.trim().toLowerCase())\n .filter(Boolean)\n if (rules.length === 0) return true\n const name = file.name.toLowerCase()\n const type = (file.type || ``).toLowerCase()\n return rules.some((r) => (r.startsWith(`.`) ? name.endsWith(r) : r.endsWith(`/*`) ? type.startsWith(r.slice(0, -1)) : type === r))\n}\n\n/** A control's `checks` evaluated: EVERY failing message, in order (a\n * check without one says `$string.invalidValue`: pass the surface's). */\nexport function failingChecks(checks: unknown, fallback: string = DEFAULT_STRINGS.invalidValue): string[] {\n const out: string[] = []\n for (const check of objects<{ condition?: unknown; message?: unknown }>(checks)) {\n if (check && typeof check === `object` && `condition` in check && (check.condition === false || check.condition === null || check.condition === undefined || check.condition === ``)) out.push(str(check.message, fallback))\n }\n return out\n}\n\n/** The first failing message, or null (kept for hosts that used it). */\nexport function failingCheck(checks: unknown, fallback?: string): string | null {\n return failingChecks(checks, fallback)[0] ?? null\n}\n\nconst BUILTIN_ICONS = coreCatalog.builtinIcons as Record<string, string>\n\n/** The icons.json name a renderer draws for an owned part. */\nexport function builtinIconName(slot: string): string {\n return BUILTIN_ICONS[slot] ?? `ui-icon-placeholder`\n}\n\n/** Space-joined element ids (`aria-describedby`), undefined when none. */\nexport function joinIds(...ids: (string | undefined | false)[]): string | undefined {\n const out = ids.filter(Boolean).join(` `)\n return out || undefined\n}\n",
12
+ "// Round 1 (FEED-128: hoisted from the React renderer's natives/table.tsx):\n// a Table's column shape and the renderer's LOCAL row order for an unbound\n// sort (`interactions.json` sort cases): missing values last, numbers and\n// dates by value, booleans false-first, text by a numeric, base-sensitivity\n// collator in the surface locale, ties in source order.\n\nimport { num } from \"./coerce\"\n\nexport interface TableColumn {\n key: string\n /** The header text (a slot or checkbox column may have none). */\n label?: string\n type?: `text` | `number` | `date` | `boolean` | `badge` | `slot` | `currency` | `percent` | `relativeTime`\n slot?: string\n /** ISO 4217 code of a `currency` column. */\n currency?: string\n /** Fixed fraction digits of a number / currency / percent column. */\n decimals?: number\n width?: number\n align?: `start` | `center` | `end`\n sortable?: boolean\n}\n\nexport interface TableSort {\n key: string\n direction: `asc` | `desc`\n}\n\n/** The renderer's local order of `rows` for a sort (unbound sort). */\nexport function sortRows(rows: readonly Record<string, unknown>[], sort: TableSort | null, column: TableColumn | undefined, locale: string): number[] {\n const order = rows.map((_, i) => i)\n if (!sort || !column) return order\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: `base` })\n const dir = sort.direction === `desc` ? -1 : 1\n const missing = (v: unknown) => v === undefined || v === null || v === ``\n return order.sort((a, b) => {\n const va = rows[a]?.[sort.key]\n const vb = rows[b]?.[sort.key]\n if (missing(va) && missing(vb)) return a - b\n if (missing(va)) return 1\n if (missing(vb)) return -1\n let c: number\n if (typeof va === `number` && typeof vb === `number`) c = va - vb\n else if (column.type === `number`) c = num(va) - num(vb)\n else if (column.type === `date`) c = new Date(String(va)).getTime() - new Date(String(vb)).getTime()\n else if (typeof va === `boolean` || typeof vb === `boolean`) c = Number(Boolean(va)) - Number(Boolean(vb))\n else c = collator.compare(String(va), String(vb))\n return c === 0 ? a - b : c * dir\n })\n}\n",
13
+ "// Round 1 (FEED-128: hoisted from the React renderer's natives/dates.tsx):\n// the calendar arithmetic of DatePicker / DateRangePicker: ISO day strings,\n// the 6×7 month grid and the roving tab stop of a month view.\n\nexport const isoDate = (d: Date): string => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, `0`)}-${String(d.getDate()).padStart(2, `0`)}`\nexport const parseIsoDate = (s: string): Date | null => {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(s)\n return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])) : null\n}\nexport const addDays = (d: Date, n: number): Date => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n)\n/** `n` months on, the day clamped to the target month's last. */\nexport const addMonths = (d: Date, n: number): Date => {\n const last = new Date(d.getFullYear(), d.getMonth() + n + 1, 0).getDate()\n return new Date(d.getFullYear(), d.getMonth() + n, Math.min(d.getDate(), last))\n}\nexport const sameDay = (a: Date | null, b: Date | null): boolean => Boolean(a && b && isoDate(a) === isoDate(b))\n\n/** The 6×7 days of `view`'s month, starting on `first` (0 = Sunday). */\nexport function monthGrid(view: Date, first: number): Date[] {\n const start = new Date(view.getFullYear(), view.getMonth(), 1)\n const lead = (start.getDay() - first + 7) % 7\n return Array.from({ length: 42 }, (_, i) => new Date(start.getFullYear(), start.getMonth(), 1 - lead + i))\n}\n\n/** The roving tab stop of a month view: the focused day when it is in the\n * visible month and enabled, else the enabled in-month day nearest to it,\n * else none (a disabled day never holds the stop). */\nexport function calendarStop(days: readonly Date[], view: Date, focus: Date, disabled: (d: Date) => boolean): Date | null {\n const inMonth = days.filter((d) => d.getMonth() === view.getMonth() && d.getFullYear() === view.getFullYear() && !disabled(d))\n if (inMonth.some((d) => sameDay(d, focus))) return focus\n let best: Date | null = null\n for (const d of inMonth) if (!best || Math.abs(d.getTime() - focus.getTime()) < Math.abs(best.getTime() - focus.getTime())) best = d\n return best\n}\n",
14
+ "// VAPP-87 (FEED-128: hoisted from the React renderer's inputs.ts +\n// natives/inputs.tsx): HOST-OWNED inputs, framework-free. Every edit bumps a\n// revision and, after `DEBOUNCE_MS`, sends ONE `change` with the latest\n// value; `commit` goes out at once on blur / Enter. A value pushed by the\n// host (the data model, a new `value` prop) resets the local value only when\n// the field is not focused AND no revision is outstanding (the host\n// acknowledged everything it was sent). That is the VAPP-4 typing rule: a\n// stale echo can never clobber a key in flight. A renderer wraps\n// `HostOwnedController` in its reactivity (React: `useHostOwnedValue`).\n\nexport const DEBOUNCE_MS = 150\n\nexport type HostOwnedSend<T> = (value: T, revision: number, kind: `change` | `commit`) => void | Promise<void>\n\nexport interface HostOwnedControllerOptions<T> {\n /** The value the host holds when the field mounts. */\n initial: T\n /** Sends an edit; a returned promise acknowledges the revision on settle. */\n send: HostOwnedSend<T>\n /** Optional local write-through (the bound data model path). */\n writeLocal?: (value: T) => void\n debounceMs?: number\n /** Called after every change of `value`, `pending` or `focused`. */\n onChange?: () => void\n}\n\nexport class HostOwnedController<T> {\n /** The field's value (the last edit, or the last adopted host push). */\n value: T\n /** The newest revision sent or scheduled. */\n revision = 0\n /** True while a revision the host has not acknowledged exists. */\n pending = false\n focused = false\n private acked = 0\n private timer: ReturnType<typeof setTimeout> | null = null\n private live = true\n private send: HostOwnedSend<T>\n private writeLocal?: (value: T) => void\n private debounceMs: number\n private readonly onChange?: () => void\n\n constructor(options: HostOwnedControllerOptions<T>) {\n this.value = options.initial\n this.send = options.send\n this.writeLocal = options.writeLocal\n this.debounceMs = options.debounceMs ?? DEBOUNCE_MS\n this.onChange = options.onChange\n }\n\n /** The latest callbacks (a re-render may hand new closures). */\n configure(options: Pick<HostOwnedControllerOptions<T>, `send` | `writeLocal` | `debounceMs`>): void {\n this.send = options.send\n this.writeLocal = options.writeLocal\n this.debounceMs = options.debounceMs ?? DEBOUNCE_MS\n }\n\n /** A local edit: bump the revision, write through, debounce a `change`. */\n edit(next: T): void {\n this.value = next\n this.revision += 1\n this.pending = true\n this.writeLocal?.(next)\n this.clearTimer()\n this.timer = setTimeout(() => {\n this.timer = null\n this.dispatch(`change`)\n }, this.debounceMs)\n this.notify()\n }\n\n /** Flush the debounce and send a `commit`. */\n commit(): void {\n this.clearTimer()\n this.dispatch(`commit`)\n }\n\n focus(): void {\n this.focused = true\n this.notify()\n }\n\n /** Blur commits. */\n blur(): void {\n this.focused = false\n this.notify()\n this.commit()\n }\n\n /** The host's push: adopted only when idle and fully acknowledged.\n * Returns whether it was adopted. */\n push(external: T): boolean {\n if (this.focused) return false\n if (this.revision > this.acked) return false\n if (Object.is(external, this.value)) return false\n this.value = external\n this.notify()\n return true\n }\n\n /** (Re)attach after `dispose` (a remount). */\n attach(): void {\n this.live = true\n }\n\n /** Unmount: the pending debounce is dropped, acknowledgements no longer\n * notify. */\n dispose(): void {\n this.live = false\n this.clearTimer()\n }\n\n private clearTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n }\n }\n\n private notify(): void {\n if (this.live) this.onChange?.()\n }\n\n private ack(rev: number): void {\n if (rev > this.acked) this.acked = rev\n if (this.live && this.acked >= this.revision && this.pending) {\n this.pending = false\n this.notify()\n }\n }\n\n private dispatch(kind: `change` | `commit`): void {\n const rev = this.revision\n let result: void | Promise<void>\n try {\n result = this.send(this.value, rev, kind)\n } catch {\n result = undefined\n }\n if (result && typeof (result as Promise<void>).then === `function`) {\n ;(result as Promise<void>).then(\n () => this.ack(rev),\n () => this.ack(rev)\n )\n } else this.ack(rev)\n }\n}\n\nconst localeDigits = new Map<string, Map<string, string>>()\n\n/** The locale's own digit glyphs → ASCII digits (empty for latn locales). */\nfunction digitMap(locale: string): Map<string, string> {\n let hit = localeDigits.get(locale)\n if (!hit) {\n hit = new Map()\n const fmt = new Intl.NumberFormat(locale, { useGrouping: false })\n for (let d = 0; d <= 9; d++) {\n const glyph = fmt.format(d)\n if (glyph !== String(d)) hit.set(glyph, String(d))\n }\n localeDigits.set(locale, hit)\n }\n return hit\n}\n\n/** A typed number in the surface locale (its group and decimal separators\n * AND its digits; ASCII digits are always accepted too) → the number, or\n * null. */\nexport function parseLocaleNumber(text: string, locale: string): number | null {\n const parts = new Intl.NumberFormat(locale).formatToParts(12345.6)\n const group = parts.find((p) => p.type === `group`)?.value ?? `,`\n const decimal = parts.find((p) => p.type === `decimal`)?.value ?? `.`\n const digits = digitMap(locale)\n const ascii = digits.size ? Array.from(text, (ch) => digits.get(ch) ?? ch).join(``) : text\n const clean = ascii.trim().split(group).join(``).replace(/[\\s‎‏؜]/g, ``).replace(decimal, `.`).replace(/[−–]/g, `-`)\n if (clean === `` || clean === `-`) return null\n const n = Number(clean)\n return Number.isFinite(n) ? n : null\n}\n",
15
+ "// VAPP-91: the media loader. A source resolves through the host's\n// `mediaRequest` (absolute url + headers, the policy hook that adds auth for\n// /api/attachments) after `resolveUrl`, always under the media policy\n// (VAPP-103: schemes + hosts, `urls.ts`; a denied src loads nothing); a\n// request with headers is fetched once — under `MEDIA_LIMITS` (bytes,\n// timeout) — and shown as a blob url (an <img> cannot send headers). A\n// direct <img> load is the browser's (its own decode limits).\n//\n// Video/Audio are STREAMS (`kind: \"stream\"`, catalog/host.json: the policy\n// applies, the player's byte limits do not): a request with headers goes\n// to the host's `mediaStreamUrl` (a signed / cookie-authed url the player\n// streams and seeks, re-checked against the policy) when it has one, else\n// it is fetched whole into a blob url under `MEDIA_LIMITS.maxBytes` and a\n// `MEDIA_LIMITS.timeoutMs` total timeout (VAPP-107: a whole-fetch past\n// either fails like a 404; a long video needs `mediaStreamUrl`). No pixel\n// check on a stream. A poster is an image.\n//\n// Blob urls pin their bytes until revoked, so the cache is bounded: every\n// mounted consumer holds a reference; an entry nobody holds stays cached\n// (a re-mounted row, a virtualized list scrolling back, shows it at once)\n// until more than MEDIA_CACHE_IDLE_MAX idle entries exist, when the least\n// recently released one is dropped and its url revoked. An entry in use is\n// never evicted.\n//\n// FEED-128: hoisted from the React renderer: the cache, the fetchers and\n// `openMediaSource` (one source's plan + load) are framework-free; a\n// renderer wraps them in its reactivity (React: `useMediaSource`).\n\nimport { MEDIA_LIMITS, mediaImageWithinLimits } from \"@exponential-at/ui\"\nimport type { AnyHostPlugin as HostPlugin } from \"./host-types\"\nimport { mediaRequestOf, mediaUrlAllowed } from \"./urls\"\n\n/** What a source feeds: an image (the limits hold) or a player stream. */\nexport type MediaKind = `image` | `stream`\n\n/** How many fetched media nobody shows stay cached (their blob urls live). */\nexport const MEDIA_CACHE_IDLE_MAX = 64\n\nexport interface MediaCacheEntry {\n promise: Promise<string>\n /** Set once the fetch resolved. */\n url?: string\n /** Mounted consumers. */\n refs: number\n}\n\n/** Insertion order = recency (acquire/release move an entry to the end). */\nconst blobs = new Map<string, MediaCacheEntry>()\n\nexport function mediaCacheKey(url: string, headers: Record<string, string>): string {\n return `${url}\\n${JSON.stringify(headers)}`\n}\n\nfunction touch(k: string, e: MediaCacheEntry): void {\n blobs.delete(k)\n blobs.set(k, e)\n}\n\nexport function acquireMedia(k: string, load: () => Promise<string>): MediaCacheEntry {\n let e = blobs.get(k)\n if (!e) {\n const entry: MediaCacheEntry = { refs: 0, promise: Promise.resolve(``) }\n entry.promise = load().then((url) => {\n entry.url = url\n // Evicted (or failed over) while loading: nobody can use it.\n if (blobs.get(k) !== entry) URL.revokeObjectURL(url)\n return url\n })\n entry.promise.catch(() => {\n if (blobs.get(k) === entry) blobs.delete(k)\n })\n e = entry\n }\n e.refs += 1\n touch(k, e)\n return e\n}\n\nexport function releaseMedia(k: string, e: MediaCacheEntry): void {\n e.refs -= 1\n if (e.refs > 0 || blobs.get(k) !== e) return\n touch(k, e)\n let idle = 0\n for (const v of blobs.values()) if (v.refs === 0) idle += 1\n for (const [ok, v] of blobs) {\n if (idle <= MEDIA_CACHE_IDLE_MAX) break\n if (v.refs > 0) continue\n blobs.delete(ok)\n if (v.url) URL.revokeObjectURL(v.url)\n idle -= 1\n }\n}\n\n/** The cache's size (tests). */\nexport function mediaCacheStats(): { entries: number; inUse: number } {\n let inUse = 0\n for (const v of blobs.values()) if (v.refs > 0) inUse += 1\n return { entries: blobs.size, inUse }\n}\n\n/** Drop every idle entry and revoke its url (tests, a host that logs out). */\nexport function clearMediaCache(): void {\n for (const [k, v] of blobs) {\n if (v.refs > 0) continue\n blobs.delete(k)\n if (v.url) URL.revokeObjectURL(v.url)\n }\n}\n\n/** One source, planned: `direct` = the url to use as is (no headers, or\n * undefined when the policy denies it), `denied` = the policy refused a\n * non-empty src, `key` = the cache identity of a FETCHED source ('' when\n * direct), `open()` = start (or join) its load: the url promise and the\n * release a consumer calls when it unmounts. */\nexport interface MediaSourcePlan {\n fetched: boolean\n key: string\n direct: string | undefined\n denied: boolean\n open: () => { promise: Promise<string>; release: () => void }\n}\n\nexport function openMediaSource(host: HostPlugin, src: string, kind: MediaKind = `image`): MediaSourcePlan {\n const req = mediaRequestOf(host, src)\n const headers = req?.headers ?? {}\n const fetched = req !== null && Object.keys(headers).length > 0\n const k = fetched ? `${kind}\\n${mediaCacheKey(req.url, headers)}` : ``\n return {\n fetched,\n key: k,\n direct: req ? req.url : undefined,\n denied: Boolean(src) && req === null,\n open: () => {\n if (!req || !fetched) return { promise: Promise.resolve(req ? req.url : ``), release: () => {} }\n const hosted = kind === `stream` && host.mediaStreamUrl !== undefined\n const entry = hosted ? streamEntry(host, req) : acquireMedia(k, () => (kind === `stream` ? fetchStream(req.url, headers) : fetchLimited(req.url, headers)).then((b) => URL.createObjectURL(b)))\n return { promise: entry.promise, release: hosted ? () => {} : () => releaseMedia(k, entry) }\n },\n }\n}\n\n/** A host stream url (never cached here, never revoked: the host owns\n * it), re-checked against the media policy. */\nexport function streamEntry(host: HostPlugin, req: { url: string; headers: Record<string, string> }): MediaCacheEntry {\n const promise = Promise.resolve(host.mediaStreamUrl!(req)).then((url) => {\n if (typeof url !== `string` || !mediaUrlAllowed(host, url)) throw new Error(`stream url denied by the media policy`)\n return url\n })\n return { promise, refs: 0 }\n}\n\n/** A Video/Audio fetch (no `mediaStreamUrl`): the whole body into a blob\n * under `maxBytes` (Content-Length up front, then as it streams) and\n * `timeoutMs` for the WHOLE download (VAPP-107); no pixel check. */\nexport function fetchStream(url: string, headers: Record<string, string>, limits: { maxBytes: number; timeoutMs: number } = MEDIA_LIMITS): Promise<Blob> {\n return fetchLimited(url, headers, { ...limits, maxPixels: Infinity }, false)\n}\n\n/** A fetch under `MEDIA_LIMITS`: the whole request within `timeoutMs`, the\n * body (Content-Length up front, then as it streams) within `maxBytes`, an\n * image's width × height × frames within `maxPixels` before any decode\n * (`mediaImageWithinLimits`: SVG sizes count, an unreadable raster is\n * refused; `image = false` skips that check: a stream's bytes are not\n * an image). */\nexport async function fetchLimited(url: string, headers: Record<string, string>, limits: { maxBytes: number; timeoutMs: number; maxPixels: number } = MEDIA_LIMITS, image = true): Promise<Blob> {\n const abort = new AbortController()\n const timer = setTimeout(() => abort.abort(new Error(`media timed out after ${limits.timeoutMs} ms`)), limits.timeoutMs)\n const over = () => new Error(`media is over ${limits.maxBytes} bytes`)\n try {\n const r = await fetch(url, { headers, signal: abort.signal })\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n if (Number(r.headers.get(`content-length`) ?? NaN) > limits.maxBytes) throw over()\n const chunks: Uint8Array[] = []\n let total = 0\n if (r.body) {\n const reader = r.body.getReader()\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n total += value.byteLength\n if (total > limits.maxBytes) {\n abort.abort()\n throw over()\n }\n chunks.push(value)\n }\n } else {\n const all = new Uint8Array(await r.arrayBuffer())\n if (all.byteLength > limits.maxBytes) throw over()\n chunks.push(all)\n }\n // The whole body: SVG sizes, animation frames and unreadable rasters\n // follow the core's pixel × frame rule (gpui, SwiftUI, Compose alike).\n if (image) {\n const refused = mediaImageWithinLimits(chunks.length === 1 ? chunks[0]! : concat(chunks), limits)\n if (refused) throw new Error(refused)\n }\n return new Blob(chunks as BlobPart[], { type: r.headers.get(`content-type`) ?? `` })\n } finally {\n clearTimeout(timer)\n }\n}\n\nfunction concat(chunks: readonly Uint8Array[]): Uint8Array {\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0))\n let at = 0\n for (const c of chunks) {\n out.set(c, at)\n at += c.byteLength\n }\n return out\n}\n\n",
16
+ "// VAPP-87 (FEED-128: hoisted from the React renderer's markdown.tsx): the\n// built-in markdown PARSER, framework-free: a small GFM subset (headings,\n// paragraphs, bold/italic/code/strike, links, images, nested lists, task\n// items, block quotes, fenced code, tables, rules) → a tree a renderer\n// paints through the theme's `Markdown/<part>` classes. No HTML\n// passthrough: tags are text. VAPP-103: link and image destinations parse\n// balanced parentheses (CommonMark); the tree carries RAW destinations, the\n// renderer passes every href through the URL policy (`linkHref`, denied =\n// the label as text) and every image through the media policy. A paragraph\n// that is one image is a BLOCK image; an image inside running text is its\n// alt text, as on every renderer. Every pass is linear in its input.\n\n/** Link labels nest at most this deep (×4): a link inside 32 enclosing link\n * labels is its text. */\nexport const MAX_LINK_NESTING = 32\n/** A link / image destination longer than this (UTF-16 units) is no link. */\nexport const MAX_LINK_DEST = 8192\n\nconst TITLE = /\\s+(?:\"[^\"]*\"|'[^']*')/y\n\n/** One inline run's link geometry, precomputed in ONE linear pass so every\n * `[` resolves in O(1): matching `]` / `)` (escapes honoured), the next\n * whitespace, `>`, `<`-or-newline and the running paren balance. Parsing a\n * run is linear however many unclosed `[` / `(` it holds. */\nclass LinkScanner {\n private readonly close: Int32Array\n private readonly balance: Int32Array\n private readonly nextWs: Int32Array\n private readonly nextGt: Int32Array\n private readonly nextLtNl: Int32Array\n private readonly escaped: Uint8Array\n constructor(private readonly s: string) {\n const n = s.length\n this.close = new Int32Array(n).fill(-1)\n this.balance = new Int32Array(n + 1)\n this.escaped = new Uint8Array(n)\n const brackets: number[] = []\n const parens: number[] = []\n let esc = false\n let bal = 0\n for (let i = 0; i < n; i++) {\n this.balance[i] = bal\n if (esc) {\n this.escaped[i] = 1\n esc = false\n continue\n }\n const c = s[i]\n if (c === `\\\\`) esc = true\n else if (c === `[`) brackets.push(i)\n else if (c === `]`) {\n const o = brackets.pop()\n if (o !== undefined) this.close[o] = i\n } else if (c === `(`) {\n parens.push(i)\n bal++\n } else if (c === `)`) {\n const o = parens.pop()\n if (o !== undefined) this.close[o] = i\n bal--\n }\n }\n this.balance[n] = bal\n this.nextWs = new Int32Array(n + 1)\n this.nextGt = new Int32Array(n + 1)\n this.nextLtNl = new Int32Array(n + 1)\n this.nextWs[n] = n\n this.nextGt[n] = -1\n this.nextLtNl[n] = n\n for (let i = n - 1; i >= 0; i--) {\n const c = s[i]!\n this.nextWs[i] = !this.escaped[i] && /\\s/.test(c) ? i : this.nextWs[i + 1]!\n this.nextGt[i] = c === `>` ? i : this.nextGt[i + 1]!\n this.nextLtNl[i] = c === `<` || c === `\\n` ? i : this.nextLtNl[i + 1]!\n }\n }\n\n /** `[label](dest)` / `![alt](dest)` starting at `s[at]` (the `[`): the label\n * (brackets balanced), the destination (`<…>` or balanced parentheses, no\n * whitespace) and the end index. An optional `\"title\"` is skipped. */\n at(at: number): { label: string; dest: string; end: number } | null {\n const s = this.s\n if (s[at] !== `[` || this.escaped[at]) return null\n const i = this.close[at]!\n if (i < 0 || s[i + 1] !== `(`) return null\n let j = i + 2\n let dest: string\n if (s[j] === `<`) {\n const close = this.nextGt[j]!\n if (close < 0 || this.nextLtNl[j + 1]! < close || close - j - 1 > MAX_LINK_DEST) return null\n dest = s.slice(j + 1, close)\n j = close + 1\n } else {\n // The dest ends at the `)` closing the link's `(`, or earlier at\n // whitespace with its parentheses balanced.\n const k = this.close[i + 1]!\n const w = this.nextWs[j]!\n let stop: number\n if (k >= 0 && k < w) stop = k\n else if (this.balance[w] === this.balance[j]) stop = w\n else return null\n if (stop - j > MAX_LINK_DEST) return null\n dest = s.slice(j, stop).replace(/\\\\([()])/g, `$1`)\n j = stop\n }\n TITLE.lastIndex = j\n if (TITLE.exec(s)) j = TITLE.lastIndex\n while (s[j] === ` `) j++\n if (s[j] !== `)`) return null\n return { label: s.slice(at + 1, i), dest, end: j + 1 }\n }\n}\n\n/** `[label](dest)` / `![alt](dest)` starting at `s[at]` (the `[`): the label\n * (brackets balanced), the destination (`<…>` or balanced parentheses, no\n * whitespace) and the end index. An optional `\"title\"` is skipped. */\nexport function linkAt(s: string, at: number): { label: string; dest: string; end: number } | null {\n return s[at] === `[` ? new LinkScanner(s).at(at) : null\n}\n\n/** A paragraph that is exactly one `![alt](src)` → its alt + src (a BLOCK\n * image, as every renderer paints it; an image inside running text is its\n * alt text). */\nexport function wholeImage(text: string): { alt: string; src: string } | null {\n if (text[0] !== `!`) return null\n const l = linkAt(text, 1)\n return l && l.end === text.length ? { alt: l.label, src: l.dest } : null\n}\n\n/** An inline run's tree: text, code, strong/em (nested), strike, a link\n * (raw `dest`, label nested). */\nexport type MarkdownInline =\n | string\n | { type: `code`; text: string }\n | { type: `strong`; children: MarkdownInline[] }\n | { type: `em`; children: MarkdownInline[] }\n | { type: `del`; text: string }\n | { type: `link`; dest: string; children: MarkdownInline[] }\n\nexport type MarkdownBlock =\n | { type: `paragraph`; children: MarkdownInline[] }\n /** A paragraph that is exactly one image. */\n | { type: `image`; alt: string; src: string }\n | { type: `codeBlock`; lang?: string; text: string }\n | { type: `heading`; level: number; children: MarkdownInline[] }\n | { type: `quote`; children: MarkdownBlock[] }\n | { type: `list`; list: MarkdownList }\n | { type: `table`; align: (`start` | `center` | `end` | undefined)[]; head: MarkdownInline[][]; rows: MarkdownInline[][][] }\n | { type: `rule` }\n\nconst SIMPLE = /(`[^`]+`)|(\\*\\*([^*]+)\\*\\*)|(__([^_]+)__)|(\\*([^*\\s][^*]*)\\*)|(_([^_\\s][^_]*)_)|(~~([^~]+)~~)/\n\n/** One inline run, linear in its length: the link geometry is precomputed\n * (LinkScanner), the simple spans come off one global regex that never\n * rescans, and link labels recurse at most MAX_LINK_NESTING deep. */\nexport function parseInline(text: string, depth = 0): MarkdownInline[] {\n const out: MarkdownInline[] = []\n const scan = depth < MAX_LINK_NESTING && text.includes(`[`) ? new LinkScanner(text) : null\n const simple = new RegExp(SIMPLE.source, `g`)\n let pos = 0\n let m: RegExpExecArray | null = null\n let searched = false\n while (pos < text.length) {\n // The first simple span at or after `pos` (still valid while `pos` has\n // not passed it).\n if (!searched || (m && m.index < pos)) {\n simple.lastIndex = pos\n m = simple.exec(text)\n searched = true\n }\n const limit = m ? m.index : text.length\n // The first `[` / `![` before the next simple span that opens a link.\n let link: { at: number; image: boolean; label: string; dest: string; end: number } | null = null\n if (scan) {\n for (let p = text.indexOf(`[`, pos); p >= 0 && p < limit; p = text.indexOf(`[`, p + 1)) {\n const l = scan.at(p)\n if (!l) continue\n const image = p > pos && text[p - 1] === `!`\n link = { at: image ? p - 1 : p, image, ...l }\n break\n }\n }\n if (link) {\n if (link.at > pos) out.push(text.slice(pos, link.at))\n // An image inside running text paints its alt text (×4).\n if (link.image) out.push(link.label)\n else out.push({ type: `link`, dest: link.dest, children: parseInline(link.label, depth + 1) })\n pos = link.end\n continue\n }\n if (!m) {\n out.push(text.slice(pos))\n break\n }\n if (m.index > pos) out.push(text.slice(pos, m.index))\n if (m[1]) out.push({ type: `code`, text: m[1].slice(1, -1) })\n else if (m[2]) out.push({ type: `strong`, children: parseInline(m[3]!, depth) })\n else if (m[4]) out.push({ type: `strong`, children: parseInline(m[5]!, depth) })\n else if (m[6]) out.push({ type: `em`, children: parseInline(m[7]!, depth) })\n else if (m[8]) out.push({ type: `em`, children: parseInline(m[9]!, depth) })\n else if (m[10]) out.push({ type: `del`, text: m[11]! })\n pos = m.index + m[0].length\n }\n return out\n}\n\nexport const LIST_ITEM = /^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/\n\nexport interface MarkdownListItem {\n /** The item's raw text (its inline markdown). */\n text: string\n /** `text` parsed. */\n content: MarkdownInline[]\n /** A task item: done (`[x]`) or not (`[ ]`). */\n task?: boolean\n children: MarkdownList[]\n}\nexport interface MarkdownList {\n indent: number\n ordered: boolean\n items: MarkdownListItem[]\n}\n\n/** Consecutive list item lines → a list tree: an item whose marker is\n * indented 2+ columns past its list's nests under the previous item. */\nexport function parseList(lines: readonly string[]): MarkdownList {\n const indentOf = (ws: string) => ws.replace(/\\t/g, ` `).length\n // VAPP-107 (property-tested): no lines, or a line that is no list item,\n // is an empty list / a skipped line, never a throw.\n const first = lines.length ? LIST_ITEM.exec(lines[0]!) : null\n if (!first) return { indent: 0, ordered: false, items: [] }\n const root: MarkdownList = { indent: indentOf(first[1]!), ordered: /\\d/.test(first[2]!), items: [] }\n const stack: MarkdownList[] = [root]\n for (const line of lines) {\n const m = LIST_ITEM.exec(line)\n if (!m) continue\n const indent = indentOf(m[1]!)\n while (stack.length > 1 && indent < stack[stack.length - 1]!.indent) stack.pop()\n let list = stack[stack.length - 1]!\n const parent = list.items[list.items.length - 1]\n if (parent && indent >= list.indent + 2 && stack.length < MAX_BLOCK_NESTING) {\n const child: MarkdownList = { indent, ordered: /\\d/.test(m[2]!), items: [] }\n parent.children.push(child)\n stack.push(child)\n list = child\n }\n const task = /^\\[([ xX])\\]\\s+(.*)$/.exec(m[3]!)\n list.items.push(task ? { text: task[2]!, content: parseInline(task[2]!), task: task[1] !== ` `, children: [] } : { text: m[3]!, content: parseInline(m[3]!), children: [] })\n }\n return root\n}\n\nconst isTableRow = (line: string) => /^\\s*\\|.*\\|\\s*$/.test(line)\nconst isTableRule = (line: string) => /^\\s*\\|(\\s*:?-+:?\\s*\\|)+\\s*$/.test(line)\nconst cells = (line: string) => line.trim().replace(/^\\|/, ``).replace(/\\|$/, ``).split(/(?<!\\\\)\\|/).map((c) => c.replace(/\\\\\\|/g, `|`).trim())\n\n/** Block quotes and lists nest at most this deep (deeper = text). */\nexport const MAX_BLOCK_NESTING = 32\n\n/** Markdown text → its block tree. */\nexport function parseMarkdown(text: string): MarkdownBlock[] {\n return parseBlocks(text, 0)\n}\n\nfunction parseBlocks(text: string, depth: number): MarkdownBlock[] {\n const lines = text.replace(/\\r\\n?/g, `\\n`).split(`\\n`)\n const blocks: MarkdownBlock[] = []\n let i = 0\n const para: string[] = []\n const flush = () => {\n if (para.length === 0) return\n const text = para.join(` `)\n const image = wholeImage(text)\n if (image) blocks.push({ type: `image`, alt: image.alt, src: image.src })\n else blocks.push({ type: `paragraph`, children: parseInline(text) })\n para.length = 0\n }\n while (i < lines.length) {\n const line = lines[i]!\n const fence = /^```(\\w*)\\s*$/.exec(line)\n if (fence) {\n flush()\n const body: string[] = []\n i++\n while (i < lines.length && !/^```\\s*$/.test(lines[i]!)) body.push(lines[i++]!)\n i++\n blocks.push({ type: `codeBlock`, lang: fence[1] || undefined, text: body.join(`\\n`) })\n continue\n }\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line)\n if (heading) {\n flush()\n blocks.push({ type: `heading`, level: heading[1]!.length, children: parseInline(heading[2]!) })\n i++\n continue\n }\n if (depth < MAX_BLOCK_NESTING && /^\\s*>/.test(line)) {\n flush()\n const body: string[] = []\n while (i < lines.length && /^\\s*>/.test(lines[i]!)) body.push(lines[i++]!.replace(/^\\s*>\\s?/, ``))\n blocks.push({ type: `quote`, children: parseBlocks(body.join(`\\n`), depth + 1) })\n continue\n }\n if (LIST_ITEM.test(line)) {\n flush()\n const body: string[] = []\n while (i < lines.length && LIST_ITEM.test(lines[i]!)) body.push(lines[i++]!)\n blocks.push({ type: `list`, list: parseList(body) })\n continue\n }\n if (isTableRow(line) && i + 1 < lines.length && isTableRule(lines[i + 1]!)) {\n flush()\n const head = cells(line)\n const align = cells(lines[i + 1]!).map((c) => (c.startsWith(`:`) && c.endsWith(`:`) ? (`center` as const) : c.endsWith(`:`) ? (`end` as const) : c.startsWith(`:`) ? (`start` as const) : undefined))\n i += 2\n const rows: string[][] = []\n while (i < lines.length && isTableRow(lines[i]!)) rows.push(cells(lines[i++]!))\n blocks.push({ type: `table`, align, head: head.map((h) => parseInline(h)), rows: rows.map((r) => r.map((c) => parseInline(c))) })\n continue\n }\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n flush()\n blocks.push({ type: `rule` })\n i++\n continue\n }\n if (line.trim() === ``) {\n flush()\n i++\n continue\n }\n para.push(line.trim())\n i++\n }\n flush()\n return blocks\n}\n",
17
+ "// Round 1 (contract §3 Form; FEED-128: hoisted from the React renderer's\n// form.tsx): the field REGISTRY a Form keeps and the rules around it,\n// framework-free. A Form collects every named field beneath it; submit runs\n// EVERY field's checks regardless of `validateOn` and, on any failure,\n// yields every message (document order) and the first invalid field to\n// focus; otherwise the values by name. A field shows its errors once it was\n// submitted, the Form refused a submit, or its `validateOn` moment passed.\n\nimport { coreCatalog } from \"@exponential-at/ui\"\n\n/** One registered field (a renderer's handle onto its control). */\nexport interface FormField {\n name: string\n domId: string\n value: () => unknown\n errors: () => string[]\n focus: () => void\n element: () => Element | null\n}\n\nexport interface FormError {\n name: string\n message: string\n}\n\nexport type FormCheck<F extends FormField = FormField> = { ok: false; errors: FormError[]; first: F | null } | { ok: true; values: Record<string, unknown> }\n\nconst VALIDATE_ON: Record<string, string> = Object.fromEntries(\n Object.entries(coreCatalog.components).flatMap(([name, def]) => {\n const d = (def.props as Record<string, { default?: unknown }>).validateOn?.default\n return d === undefined ? [] : [[name, String(d)]]\n })\n)\n\n/** A component's catalog default `validateOn`, or undefined. */\nexport function validateOnDefault(component: string): string | undefined {\n return VALIDATE_ON[component]\n}\n\n/** Whether a field shows its failing messages now. */\nexport function fieldErrorsVisible(state: { validateOn: string; submitted: boolean; attempts: number; dirty: boolean; touched: boolean }): boolean {\n return state.submitted || state.attempts > 0 || (state.validateOn === `change` ? state.dirty : state.validateOn === `blur` ? state.touched : false)\n}\n\n/** Fields in document order (unmounted ones keep their place). */\nexport function documentOrder<F extends FormField>(fields: Iterable<F>): F[] {\n return [...fields].sort((a, b) => {\n const ea = a.element()\n const eb = b.element()\n if (!ea || !eb) return 0\n return ea.compareDocumentPosition(eb) & 4 /* Node.DOCUMENT_POSITION_FOLLOWING */ ? -1 : 1\n })\n}\n\nexport class FormRegistry<F extends FormField = FormField> {\n readonly fields = new Set<F>()\n\n /** Adds a field; the returned function removes it. */\n register(field: F): () => void {\n this.fields.add(field)\n return () => void this.fields.delete(field)\n }\n\n /** Every field's checks: the failures (document order) and the first\n * invalid field, or the values by name. */\n check(): FormCheck<F> {\n const list = documentOrder(this.fields)\n const errors: FormError[] = []\n let first: F | null = null\n for (const f of list) {\n const errs = f.errors()\n if (errs.length && !first) first = f\n for (const message of errs) errors.push({ name: f.name, message })\n }\n if (errors.length) return { ok: false, errors, first }\n const values: Record<string, unknown> = {}\n for (const f of list) values[f.name] = f.value()\n return { ok: true, values }\n }\n\n /** The summary entries whose field still fails with that message (they\n * clear as their fields become valid). */\n stillFailing(summary: readonly FormError[]): FormError[] {\n return summary.filter((e) => [...this.fields].some((f) => f.name === e.name && f.errors().includes(e.message)))\n }\n}\n",
18
+ "// VAPP-87 + round 2 §5 (FEED-128: hoisted from the React renderer's\n// list.tsx): the DOM measurements a WINDOWED list needs, framework-free.\n// The window numbers themselves are the core's (`itemOffsets`,\n// `virtualWindow`, `scrollOffsetForIndex`, `stickyHeader`).\n\nexport type ListAxis = `vertical` | `horizontal`\n\n/** The nearest ancestor that scrolls on `axis`: overflow auto/scroll AND a\n * box shorter than its content (a content-sized `overflow: auto` box is not\n * a viewport). Null = the document scrolls (the window). */\nexport function scrollParent(el: HTMLElement | null, axis: ListAxis = `vertical`): HTMLElement | null {\n let cur = el?.parentElement ?? null\n while (cur && cur !== document.body && cur !== document.documentElement) {\n const cs = getComputedStyle(cur)\n const o = axis === `vertical` ? cs.overflowY : cs.overflowX\n const scrolls = axis === `vertical` ? cur.scrollHeight > cur.clientHeight + 1 : cur.scrollWidth > cur.clientWidth + 1\n if ((o === `auto` || o === `scroll`) && scrolls) return cur\n cur = cur.parentElement\n }\n return null\n}\n\n/** Where the list's content starts relative to the viewport's start on the\n * axis (the scroll offset in list coordinates) and the viewport length.\n * `known` = the scroller already found (null = the window). */\nexport function listViewport(el: HTMLElement, axis: ListAxis, rtl: boolean, known?: HTMLElement | null): { scroll: number; viewport: number; scroller: HTMLElement | null } {\n const scroller = known === undefined ? scrollParent(el, axis) : known\n const r = el.getBoundingClientRect()\n if (axis === `vertical`) {\n if (scroller) {\n const s = scroller.getBoundingClientRect()\n return { scroll: s.top + scroller.clientTop - r.top, viewport: scroller.clientHeight, scroller }\n }\n return { scroll: -r.top, viewport: window.innerHeight, scroller }\n }\n if (scroller) {\n const s = scroller.getBoundingClientRect()\n const scroll = rtl ? r.right - (s.right - scroller.clientLeft) : s.left + scroller.clientLeft - r.left\n return { scroll, viewport: scroller.clientWidth, scroller }\n }\n return { scroll: rtl ? r.right - window.innerWidth : -r.left, viewport: window.innerWidth, scroller }\n}\n",
19
+ "// Round 1 (a11y.json Select / TimePicker / ChipInput suggestions; FEED-128:\n// hoisted from the React renderer's natives/listbox.ts): the LISTBOX\n// keyboard model's arithmetic. ArrowUp/ArrowDown move the active option\n// (wrapping, skipping disabled), Home/End jump, printable keys type-ahead by\n// label (a 700 ms buffer; one repeated letter cycles).\n\n/** The TYPE-AHEAD buffer resets after this pause (ms). */\nexport const TYPEAHEAD_RESET_MS = 700\n\n/** The next enabled index `delta` steps from `from` (wrapping), or -1. */\nexport function nextEnabledIndex(count: number, from: number, delta: number, isDisabled: (index: number) => boolean = () => false): number {\n if (count === 0) return -1\n let i = from\n for (let n = 0; n < count; n++) {\n i = (((i + delta) % count) + count) % count\n if (!isDisabled(i)) return i\n }\n return -1\n}\n\nexport interface TypeaheadBuffer {\n text: string\n at: number\n}\n\n/** One printable key typed: the new buffer and the index it lands on (-1 =\n * no label starts with the buffer; the active option stays). */\nexport function typeaheadStep(buffer: TypeaheadBuffer, key: string, now: number, active: number, count: number, isDisabled: (index: number) => boolean, labelOf: (index: number) => string): { buffer: TypeaheadBuffer; index: number } {\n const next = { text: now - buffer.at > TYPEAHEAD_RESET_MS ? key.toLowerCase() : buffer.text + key.toLowerCase(), at: now }\n for (let n = 1; n <= count; n++) {\n const i = (Math.max(0, active) + (next.text.length > 1 ? n - 1 : n)) % count\n if (!isDisabled(i) && labelOf(i).toLowerCase().startsWith(next.text)) return { buffer: next, index: i }\n }\n return { buffer: next, index: -1 }\n}\n",
20
+ "// Round 2 §6 (catalog/recipes.json), FEED-128: hoisted from the React\n// renderer so every web renderer (React, Solid) reads ONE table. The SINGLE\n// parts a painter lays out and the conformance dump compares, by component.\n// A placed part carries `data-xui-id=\"<node id>.<part>\"`; per-item parts\n// carry `<id>.<part>.<item>` (the renderer's `part.at`). Paint-only parts\n// (thumbs, the Slider range, the check glyph, arrows, overlay content in its\n// layer) carry no id.\n\nexport const PLACED: Readonly<Record<string, readonly string[]>> = {\n Switch: [`body`, `label`, `description`, `track`],\n Input: [`label`, `field`, `description`, `error`],\n Textarea: [`label`, `field`, `description`, `error`],\n NumberField: [`label`, `field`, `decrement`, `input`, `unit`, `increment`, `description`, `error`],\n ChipInput: [`label`, `field`, `input`, `description`, `error`],\n Select: [`label`, `trigger`],\n DatePicker: [`label`, `trigger`],\n DateRangePicker: [`label`, `trigger`],\n TimePicker: [`label`, `trigger`],\n Radio: [`label`, `items`],\n ChoiceTiles: [`error`],\n Checkbox: [`box`, `label`, `description`],\n Slider: [`header`, `label`, `value`, `track`],\n Tabs: [`list`, `content`, `new`],\n // EXP-1259: the search list (a searchable submenu's parts carry `.<i>`).\n SearchList: [`head`, `search`, `count`, `body`, `list`, `empty`, `fade`],\n Menu: [`trigger`, `head`, `search`, `count`, `body`, `list`, `empty`, `fade`],\n Table: [`header`, `body`, `caption`, `empty`],\n Carousel: [`page`, `indicator`, `controls`, `previous`, `next`],\n Tooltip: [`anchor`],\n FileUpload: [`label`, `dropzone`, `icon`, `title`, `hint`, `browse`, `description`],\n CodeBlock: [`header`, `title`, `copy`, `body`],\n AudioPlayer: [`track`, `controls`],\n Video: [`controls`],\n Image: [`fallback`],\n Ring: [`label`],\n}\n\n/** The painted id of a SINGLE part (`<domId>.<part>`), or null when the\n * component does not place it. */\nexport function placedPartId(component: string, part: string, domId: string): string | null {\n return PLACED[component]?.includes(part) ? `${domId}.${part}` : null\n}\n",
21
+ "// VAPP-141 (React) + VAPP-152 (Solid, the element): structural sharing\n// between two reduced trees, so a streamed `updateComponents` reaches only\n// the nodes it changed.\n\nconst isPlainObject = (v: object): boolean => {\n const proto = Object.getPrototypeOf(v)\n return proto === Object.prototype || proto === null\n}\nconst idOf = (v: unknown): string | undefined => (typeof v === `object` && v !== null && typeof (v as { id?: unknown }).id === `string` ? (v as { id: string }).id : undefined)\n\n/** `next` with every part deep-equal to `prev`'s replaced by `prev`'s\n * object (arrays of nodes matched by `id`, other arrays by index): a\n * re-reduce (`updateComponents`) hands every unchanged node its old\n * object, so the renderers skip it. Plain JSON only; anything else is\n * taken as it is. */\nexport function share<T>(prev: unknown, next: T): T {\n if (Object.is(prev, next) || typeof prev !== `object` || typeof next !== `object` || prev === null || next === null) return next\n if (Array.isArray(next)) {\n if (!Array.isArray(prev)) return next\n const byId = prev.length > 0 && idOf(prev[0]) !== undefined ? new Map(prev.map((p) => [idOf(p), p])) : null\n let same = prev.length === next.length\n const out = next.map((v, i) => {\n const id = byId ? idOf(v) : undefined\n const s = share(id !== undefined ? byId!.get(id) : prev[i], v)\n if (s !== prev[i]) same = false\n return s\n })\n return (same ? prev : out) as T\n }\n if (Array.isArray(prev) || !isPlainObject(prev) || !isPlainObject(next)) return next\n const p = prev as Record<string, unknown>\n const keys = Object.keys(next)\n let same = keys.length === Object.keys(p).length\n const out: Record<string, unknown> = {}\n for (const k of keys) {\n const had = Object.prototype.hasOwnProperty.call(p, k)\n const s = share(had ? p[k] : undefined, (next as Record<string, unknown>)[k])\n out[k] = s\n if (!had || s !== p[k]) same = false\n }\n return (same ? prev : out) as T\n}\n"
22
+ ],
23
+ "mappings": "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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6GAwL2G,oDAAoD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAOvH,oCAAoC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uFAeS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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",
24
+ "debugId": "F23A7429A2CCC72864756E2164756E21",
25
+ "names": []
26
+ }