@exponential_app/eui 0.0.0-stage → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +54 -0
  3. package/README.md +377 -2
  4. package/catalog/a11y.json +705 -0
  5. package/catalog/basic-map.json +104 -0
  6. package/catalog/code.json +58 -0
  7. package/catalog/core.catalog.json +5190 -0
  8. package/catalog/core.schema.json +24542 -0
  9. package/catalog/host.json +95 -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 +4152 -0
  14. package/catalog/recipes.json +64 -0
  15. package/catalog/strings.json +84 -0
  16. package/catalog/style.json +180 -0
  17. package/catalog/theme.schema.json +47754 -0
  18. package/catalog/tokens.json +47 -0
  19. package/conformance/README.md +218 -0
  20. package/conformance/baseline.ts +101 -0
  21. package/conformance/browser-page.ts +146 -0
  22. package/conformance/browser-suites.ts +699 -0
  23. package/conformance/compare.ts +201 -0
  24. package/conformance/dom.ts +97 -0
  25. package/conformance/dump.ts +163 -0
  26. package/conformance/fonts.json +157 -0
  27. package/conformance/manifest.json +233 -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/conformance/voice-wave-child.ts +102 -0
  36. package/dist/chunks/index-5fmaa0xq.js +8384 -0
  37. package/dist/chunks/index-5fmaa0xq.js.map +10 -0
  38. package/dist/chunks/index-62yzr94z.js +2784 -0
  39. package/dist/chunks/index-62yzr94z.js.map +10 -0
  40. package/dist/chunks/index-bg2jsgjq.js +8541 -0
  41. package/dist/chunks/index-bg2jsgjq.js.map +15 -0
  42. package/dist/chunks/index-fy7y2nz8.js +186 -0
  43. package/dist/chunks/index-fy7y2nz8.js.map +9 -0
  44. package/dist/chunks/index-gtk2gwsb.js +4555 -0
  45. package/dist/chunks/index-gtk2gwsb.js.map +31 -0
  46. package/dist/chunks/index-t6qz1770.js +95 -0
  47. package/dist/chunks/index-t6qz1770.js.map +11 -0
  48. package/dist/conformance.js +230462 -0
  49. package/dist/conformance.js.map +10 -0
  50. package/dist/entries/prompt.js +251 -0
  51. package/dist/entries/prompt.js.map +11 -0
  52. package/dist/entries/schema.js +1725 -0
  53. package/dist/entries/schema.js.map +11 -0
  54. package/dist/host/index.js +194 -0
  55. package/dist/host/index.js.map +9 -0
  56. package/dist/index.js +3851 -0
  57. package/dist/index.js.map +30 -0
  58. package/dist/types/src/a11y.d.ts +21 -0
  59. package/dist/types/src/animation.d.ts +76 -0
  60. package/dist/types/src/basic-map.d.ts +38 -0
  61. package/dist/types/src/builder.d.ts +50 -0
  62. package/dist/types/src/catalog.d.ts +54 -0
  63. package/dist/types/src/catalog.described.d.ts +33 -0
  64. package/dist/types/src/catalog.generated.d.ts +904 -0
  65. package/dist/types/src/chart.d.ts +46 -0
  66. package/dist/types/src/code.d.ts +44 -0
  67. package/dist/types/src/color.d.ts +20 -0
  68. package/dist/types/src/conformance.d.ts +39 -0
  69. package/dist/types/src/connector/app.d.ts +14 -0
  70. package/dist/types/src/connector/connector.d.ts +77 -0
  71. package/dist/types/src/connector/index.d.ts +4 -0
  72. package/dist/types/src/css.d.ts +27 -0
  73. package/dist/types/src/define.d.ts +66 -0
  74. package/dist/types/src/direction.d.ts +16 -0
  75. package/dist/types/src/dynamic.d.ts +161 -0
  76. package/dist/types/src/entries/prompt.d.ts +11 -0
  77. package/dist/types/src/entries/schema.d.ts +8 -0
  78. package/dist/types/src/expr.d.ts +71 -0
  79. package/dist/types/src/extension.d.ts +4 -0
  80. package/dist/types/src/format.d.ts +112 -0
  81. package/dist/types/src/geometry.d.ts +40 -0
  82. package/dist/types/src/host/contract.d.ts +225 -0
  83. package/dist/types/src/host/decoders.d.ts +61 -0
  84. package/dist/types/src/host/index.d.ts +15 -0
  85. package/dist/types/src/host/package.d.ts +102 -0
  86. package/dist/types/src/host/policy.d.ts +107 -0
  87. package/dist/types/src/host/record-store.d.ts +103 -0
  88. package/dist/types/src/host/records.d.ts +45 -0
  89. package/dist/types/src/host/router.d.ts +38 -0
  90. package/dist/types/src/host/runtime.d.ts +213 -0
  91. package/dist/types/src/host/signature.d.ts +52 -0
  92. package/dist/types/src/host/sources.d.ts +22 -0
  93. package/dist/types/src/host/tools.d.ts +42 -0
  94. package/dist/types/src/host/transports.d.ts +109 -0
  95. package/dist/types/src/index.d.ts +70 -0
  96. package/dist/types/src/layout.d.ts +20 -0
  97. package/dist/types/src/limits.d.ts +21 -0
  98. package/dist/types/src/list.d.ts +133 -0
  99. package/dist/types/src/locale.d.ts +22 -0
  100. package/dist/types/src/macros.d.ts +29 -0
  101. package/dist/types/src/overlay.d.ts +27 -0
  102. package/dist/types/src/prompt.d.ts +44 -0
  103. package/dist/types/src/qr-code.d.ts +30 -0
  104. package/dist/types/src/recipes.d.ts +17 -0
  105. package/dist/types/src/reducer.d.ts +41 -0
  106. package/dist/types/src/resizable.d.ts +38 -0
  107. package/dist/types/src/schema.d.ts +7 -0
  108. package/dist/types/src/strings.d.ts +13 -0
  109. package/dist/types/src/style.d.ts +201 -0
  110. package/dist/types/src/test-preload.d.ts +1 -0
  111. package/dist/types/src/text-clusters.d.ts +11 -0
  112. package/dist/types/src/text-shimmer.d.ts +24 -0
  113. package/dist/types/src/theme-types.d.ts +162 -0
  114. package/dist/types/src/theme.d.ts +75 -0
  115. package/dist/types/src/themes.d.ts +22 -0
  116. package/dist/types/src/tree-guides.d.ts +17 -0
  117. package/dist/types/src/types.d.ts +320 -0
  118. package/dist/types/src/validate.d.ts +31 -0
  119. package/dist/types/src/voice-wave.d.ts +181 -0
  120. package/dist/types/src/web/base-css.d.ts +1 -0
  121. package/dist/types/src/web/box-css.d.ts +63 -0
  122. package/dist/types/src/web/coerce.d.ts +32 -0
  123. package/dist/types/src/web/custom-icons.generated.d.ts +4 -0
  124. package/dist/types/src/web/data.d.ts +107 -0
  125. package/dist/types/src/web/dates.d.ts +12 -0
  126. package/dist/types/src/web/form.d.ts +44 -0
  127. package/dist/types/src/web/host-types.d.ts +126 -0
  128. package/dist/types/src/web/index.d.ts +35 -0
  129. package/dist/types/src/web/inputs.d.ts +55 -0
  130. package/dist/types/src/web/list.d.ts +16 -0
  131. package/dist/types/src/web/listbox.d.ts +14 -0
  132. package/dist/types/src/web/markdown.d.ts +96 -0
  133. package/dist/types/src/web/media.d.ts +63 -0
  134. package/dist/types/src/web/parts.d.ts +4 -0
  135. package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
  136. package/dist/types/src/web/primitives/alert.d.ts +9 -0
  137. package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
  138. package/dist/types/src/web/primitives/avatar.d.ts +13 -0
  139. package/dist/types/src/web/primitives/badge.d.ts +10 -0
  140. package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
  141. package/dist/types/src/web/primitives/button.d.ts +6 -0
  142. package/dist/types/src/web/primitives/calendar.d.ts +43 -0
  143. package/dist/types/src/web/primitives/card.d.ts +9 -0
  144. package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
  145. package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
  146. package/dist/types/src/web/primitives/cn.d.ts +3 -0
  147. package/dist/types/src/web/primitives/code-block.d.ts +24 -0
  148. package/dist/types/src/web/primitives/command.d.ts +134 -0
  149. package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
  150. package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
  151. package/dist/types/src/web/primitives/dialog.d.ts +24 -0
  152. package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
  153. package/dist/types/src/web/primitives/dock.d.ts +42 -0
  154. package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
  155. package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
  156. package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
  157. package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
  158. package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
  159. package/dist/types/src/web/primitives/index.d.ts +50 -0
  160. package/dist/types/src/web/primitives/input.d.ts +5 -0
  161. package/dist/types/src/web/primitives/kbd.d.ts +4 -0
  162. package/dist/types/src/web/primitives/label.d.ts +3 -0
  163. package/dist/types/src/web/primitives/measure.d.ts +16 -0
  164. package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
  165. package/dist/types/src/web/primitives/meter.d.ts +21 -0
  166. package/dist/types/src/web/primitives/popover.d.ts +3 -0
  167. package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
  168. package/dist/types/src/web/primitives/progress.d.ts +8 -0
  169. package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
  170. package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
  171. package/dist/types/src/web/primitives/select.d.ts +47 -0
  172. package/dist/types/src/web/primitives/separator.d.ts +3 -0
  173. package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
  174. package/dist/types/src/web/primitives/sheet.d.ts +20 -0
  175. package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
  176. package/dist/types/src/web/primitives/spinner.d.ts +3 -0
  177. package/dist/types/src/web/primitives/switch.d.ts +4 -0
  178. package/dist/types/src/web/primitives/table.d.ts +11 -0
  179. package/dist/types/src/web/primitives/tabs.d.ts +13 -0
  180. package/dist/types/src/web/primitives/textarea.d.ts +3 -0
  181. package/dist/types/src/web/primitives/toast.d.ts +163 -0
  182. package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
  183. package/dist/types/src/web/primitives/truncate.d.ts +7 -0
  184. package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
  185. package/dist/types/src/web/primitives/voice-wave.d.ts +50 -0
  186. package/dist/types/src/web/round5.d.ts +107 -0
  187. package/dist/types/src/web/share.d.ts +6 -0
  188. package/dist/types/src/web/table.d.ts +20 -0
  189. package/dist/types/src/web/theme-css.d.ts +69 -0
  190. package/dist/types/src/web/urls.d.ts +21 -0
  191. package/dist/web/index.js +2565 -0
  192. package/dist/web/index.js.map +28 -0
  193. package/dist/web/primitives/index.js +1476 -0
  194. package/dist/web/primitives/index.js.map +57 -0
  195. package/docs/components.generated.json +6783 -0
  196. package/docs/package-format.md +182 -0
  197. package/docs/round-1-contract.md +679 -0
  198. package/docs/round-2-contract.md +476 -0
  199. package/docs/round-3-contract.md +174 -0
  200. package/docs/round-5-contract.md +268 -0
  201. package/docs/themes.generated.json +3647 -0
  202. package/fixtures/animations.json +2890 -0
  203. package/fixtures/bench-list.json +58 -0
  204. package/fixtures/bind-time.json +54734 -0
  205. package/fixtures/catalog-basic-map.json +1692 -0
  206. package/fixtures/catalog-components.json +10293 -0
  207. package/fixtures/catalog-extension.json +620 -0
  208. package/fixtures/catalog-macros.json +51805 -0
  209. package/fixtures/code-tokens.json +1993 -0
  210. package/fixtures/conformance-baseline.json +59016 -0
  211. package/fixtures/conformance-cases.json +49 -0
  212. package/fixtures/conformance-known.json +2111 -0
  213. package/fixtures/control-geometry.json +5129 -0
  214. package/fixtures/dashboard.data.json +74 -0
  215. package/fixtures/dashboard.json +781 -0
  216. package/fixtures/demo-surface.json +47 -0
  217. package/fixtures/format.json +870 -0
  218. package/fixtures/host-package.json +1262 -0
  219. package/fixtures/host-policy.json +1209 -0
  220. package/fixtures/host-router.json +2034 -0
  221. package/fixtures/host-transport.json +590 -0
  222. package/fixtures/interactions-round1.json +1058 -0
  223. package/fixtures/kitchen-sink.expanded.json +11972 -0
  224. package/fixtures/kitchen-sink.json +3140 -0
  225. package/fixtures/layout-geometry-round1.json +7278 -0
  226. package/fixtures/layout-geometry.json +2072 -0
  227. package/fixtures/overlay-geometry.json +272 -0
  228. package/fixtures/pointer.json +89 -0
  229. package/fixtures/primitive-specimens.json +59 -0
  230. package/fixtures/prompt-budget.json +33 -0
  231. package/fixtures/qr-code.json +480 -0
  232. package/fixtures/resizable.json +714 -0
  233. package/fixtures/round4-contract.json +2985 -0
  234. package/fixtures/specimens.json +11168 -0
  235. package/fixtures/style-conditions.json +336 -0
  236. package/fixtures/template-items.json +2215 -0
  237. package/fixtures/text-clusters.json +65 -0
  238. package/fixtures/text-direction.json +309 -0
  239. package/fixtures/text-shimmer.json +96 -0
  240. package/fixtures/theme-extends.json +573 -0
  241. package/fixtures/theme-invalid.json +1300 -0
  242. package/fixtures/theme-recipes.json +61762 -0
  243. package/fixtures/theme-resolved.json +25969 -0
  244. package/fixtures/toast-stack.json +215 -0
  245. package/fixtures/tree-guides.json +224 -0
  246. package/fixtures/virtual-list.json +733 -0
  247. package/fixtures/voice-wave.json +19236 -0
  248. package/generated/ExponentialUICatalog.generated.kt +67 -0
  249. package/generated/ExponentialUICatalog.generated.swift +67 -0
  250. package/generated/ExponentialUIThemes.generated.kt +23 -0
  251. package/generated/ExponentialUIThemes.generated.swift +23 -0
  252. package/generated/catalog.descriptions.generated.rs +6 -0
  253. package/generated/catalog.generated.rs +80 -0
  254. package/generated/catalog.themes.generated.rs +34 -0
  255. package/generated/core.descriptions.json +2726 -0
  256. package/generated/core.runtime.json +3944 -0
  257. package/package.json +87 -4
  258. package/themes/exponential.recipes.json +49 -0
  259. package/themes/exponential.theme.json +768 -0
  260. package/themes/neutral.theme.json +6178 -0
  261. package/themes/orange.theme.json +43 -0
  262. package/themes/playful.theme.json +219 -0
  263. package/vendor/a2ui/LICENSE.txt +203 -0
  264. package/vendor/a2ui/README.md +27 -0
  265. package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
  266. package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
  267. package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
  268. package/vendor/a2ui/v0_9/client_to_server.json +104 -0
  269. package/vendor/a2ui/v0_9/common_types.json +315 -0
  270. package/vendor/a2ui/v0_9/server_to_client.json +132 -0
  271. package/vendor/json-render/LICENSE.txt +201 -0
  272. package/vendor/json-render/README.md +13 -0
  273. package/vendor/nayuki-qr/LICENSE.txt +20 -0
  274. package/vendor/nayuki-qr/README.md +10 -0
@@ -0,0 +1,49 @@
1
+ export declare const SCROLL_AREA_CLASSES: {
2
+ readonly root: "relative";
3
+ readonly viewport: "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1";
4
+ readonly scrollbar: "flex touch-none p-px transition-colors select-none";
5
+ readonly orientations: {
6
+ readonly vertical: "h-full w-2.5 border-l border-l-transparent";
7
+ readonly horizontal: "h-2.5 flex-col border-t border-t-transparent";
8
+ };
9
+ readonly thumb: "relative flex-1 rounded-full bg-border";
10
+ };
11
+ export type ScrollAreaDir = `ltr` | `rtl`;
12
+ export type ScrollAreaOrientation = `vertical` | `horizontal`;
13
+ /** Radix's viewport <style>: the native scrollbar hidden. */
14
+ export declare const SCROLL_AREA_VIEWPORT_CSS = "[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}";
15
+ export declare function scrollAreaRootStyle(cornerWidth: number, cornerHeight: number): Record<string, string>;
16
+ export declare function scrollAreaViewportStyle(xEnabled: boolean, yEnabled: boolean): Record<string, string>;
17
+ /** The viewport's `display: table` sizer. */
18
+ export declare const SCROLL_AREA_CONTENT_STYLE: {
19
+ readonly "min-width": "100%";
20
+ readonly display: "table";
21
+ };
22
+ export declare function scrollAreaScrollbarStyle(orientation: ScrollAreaOrientation, dir: ScrollAreaDir, thumbSize: number): Record<string, string>;
23
+ export declare const SCROLL_AREA_THUMB_STYLE: {
24
+ readonly width: "var(--radix-scroll-area-thumb-width)";
25
+ readonly height: "var(--radix-scroll-area-thumb-height)";
26
+ };
27
+ export declare function scrollAreaCornerStyle(width: number, height: number, dir: ScrollAreaDir): Record<string, string>;
28
+ /** A scrollbar's / thumb's `data-state`. */
29
+ export declare const scrollAreaVisibility: (visible: boolean) => `visible` | `hidden`;
30
+ export type ScrollAreaScrollState = `hidden` | `scrolling` | `interacting` | `idle`;
31
+ /** Radix's `type="scroll"` machine. */
32
+ export declare const SCROLL_AREA_SCROLL_MACHINE: Record<ScrollAreaScrollState, Partial<Record<string, ScrollAreaScrollState>>>;
33
+ export declare const SCROLL_AREA_SCROLL_INITIAL: ScrollAreaScrollState;
34
+ export interface ScrollAreaSizes {
35
+ content: number;
36
+ viewport: number;
37
+ scrollbar: {
38
+ size: number;
39
+ paddingStart: number;
40
+ paddingEnd: number;
41
+ };
42
+ }
43
+ export declare const scrollAreaThumbRatio: (viewport: number, content: number) => number;
44
+ /** Radix's `getThumbSize`: the ratio of the track, at least 18px. */
45
+ export declare function scrollAreaThumbSize(sizes: ScrollAreaSizes): number;
46
+ /** Radix's `getScrollPositionFromPointer`. */
47
+ export declare function scrollAreaScrollFromPointer(pointer: number, pointerOffset: number, sizes: ScrollAreaSizes, dir?: ScrollAreaDir): number;
48
+ /** Radix's `getThumbOffsetFromScroll`. */
49
+ export declare function scrollAreaThumbOffset(scroll: number, sizes: ScrollAreaSizes, dir?: ScrollAreaDir): number;
@@ -0,0 +1,5 @@
1
+ export declare const SEGMENTED_CONTROL_CLASSES: {
2
+ readonly trigger: "px-3";
3
+ /** `fill`: span the container instead of the capsule's natural `w-fit`. */
4
+ readonly fill: "w-full";
5
+ };
@@ -0,0 +1,47 @@
1
+ export declare const SELECT_CLASSES: {
2
+ readonly trigger: "flex w-fit items-center justify-between gap-2 rounded-lg border border-glass-stroke-card bg-glass-card px-3 py-2 text-sm whitespace-nowrap shadow-none transition-[color,border-color] duration-fast outline-none hover:bg-glass-active/50 focus-visible:border-glass-stroke-active focus-visible:ring-0 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-foreground/50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--menu-icon-size) [&_svg:not([class*='text-'])]:text-muted-foreground";
3
+ readonly triggerIcon: "size-4 opacity-50";
4
+ readonly content: "z-50 rounded-lg border border-glass-stroke-card bg-glass-card-opaque text-popover-foreground motion-popover relative max-h-(--radix-select-content-available-height) min-w-(--menu-min-width) max-w-(--menu-max-width) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto";
5
+ /** `position="popper"` only. */
6
+ readonly contentPopper: "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1";
7
+ readonly viewport: "p-(--menu-surface-padding)";
8
+ /** `position="popper"` only. */
9
+ readonly viewportPopper: "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1";
10
+ readonly label: "px-(--menu-item-padding-x) py-1.5 text-xs text-muted-foreground";
11
+ readonly item: "relative flex min-h-(--menu-item-height) w-full cursor-pointer items-center gap-(--menu-item-gap) rounded-sm py-1 pr-8 pl-(--menu-item-padding-x) text-sm text-foreground/90 outline-hidden select-none focus:bg-glass-active focus:text-foreground data-[disabled]:cursor-default data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--menu-icon-size) [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2";
12
+ readonly itemIndicator: "absolute right-2 flex size-3.5 items-center justify-center";
13
+ readonly itemCheck: "size-4";
14
+ readonly separator: "pointer-events-none -mx-1 my-1 h-px bg-glass-stroke";
15
+ readonly scrollButton: "flex cursor-default items-center justify-center py-1";
16
+ readonly scrollIcon: "size-4";
17
+ };
18
+ export declare const SELECT_INLINE: {
19
+ readonly value: {
20
+ readonly "pointer-events": "none";
21
+ };
22
+ /** The item-aligned position's fixed wrapper (before `position()` runs). */
23
+ readonly wrapper: {
24
+ readonly display: "flex";
25
+ readonly "flex-direction": "column";
26
+ readonly position: "fixed";
27
+ };
28
+ readonly viewport: {
29
+ readonly position: "relative";
30
+ readonly flex: "1";
31
+ readonly overflow: "hidden auto";
32
+ };
33
+ readonly scrollButton: {
34
+ readonly "flex-shrink": "0";
35
+ };
36
+ /** The wrapper's `justify-content` once an expand-on-scroll pinned it to the bottom. */
37
+ readonly expandEnd: "flex-end";
38
+ };
39
+ export declare const SELECT_VIEWPORT_ATTR = "data-radix-select-viewport";
40
+ /** Radix Select's viewport sheet (the native scrollbar hidden). */
41
+ export declare const SELECT_VIEWPORT_CSS = "[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}";
42
+ /** The content's style, `item-aligned`: box sizing + max height, the
43
+ * dismissable layer's pointer events, the flex column, no outline. */
44
+ export declare function selectItemAlignedContentStyle(pointerEvents: string | undefined): Record<string, string | undefined>;
45
+ /** The content's style, `popper`: Radix's PopperContent order (its
46
+ * `--radix-select-*` aliases, `animation: none` until placed). */
47
+ export declare function selectPopperContentStyle(pointerEvents: string | undefined, positioned: boolean): Record<string, string | undefined>;
@@ -0,0 +1,3 @@
1
+ export declare const SEPARATOR_CLASSES: {
2
+ readonly root: "shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px";
3
+ };
@@ -0,0 +1,4 @@
1
+ export declare const SHEET_CHROME_CLASSES: {
2
+ /** The pill at the top edge of a sheet. Purely decorative, but it drags. */
3
+ readonly grabber: "mx-auto mt-2 -mb-1 h-1 w-9 shrink-0 rounded-full bg-foreground/30";
4
+ };
@@ -0,0 +1,20 @@
1
+ export type SheetSide = `top` | `right` | `bottom` | `left`;
2
+ export declare const SHEET_CLASSES: {
3
+ readonly overlay: "fixed inset-0 z-50 bg-black/60 backdrop-blur-sm data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:duration-standard data-[state=closed]:ease-accelerate data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-slow data-[state=open]:ease-decelerate";
4
+ readonly content: "group/sheet fixed z-50 flex flex-col gap-4 border-glass-stroke-card shadow-lg motion-sheet";
5
+ readonly sides: {
6
+ right: string;
7
+ left: string;
8
+ top: string;
9
+ bottom: string;
10
+ };
11
+ /** The hidden Close a drag-to-dismiss clicks. */
12
+ readonly dragClose: "hidden";
13
+ readonly close: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary";
14
+ readonly closeIcon: "size-4";
15
+ readonly srOnly: "sr-only";
16
+ readonly header: "flex flex-col gap-1.5 p-4 text-left";
17
+ readonly footer: "mt-auto flex flex-col gap-2 p-4";
18
+ readonly title: "font-semibold text-foreground max-sm:group-data-[side=bottom]/sheet:text-lg max-sm:group-data-[side=bottom]/sheet:leading-none";
19
+ readonly description: "text-sm text-muted-foreground";
20
+ };
@@ -0,0 +1,3 @@
1
+ export declare const SKELETON_CLASSES: {
2
+ readonly root: "animate-pulse rounded-md bg-accent";
3
+ };
@@ -0,0 +1,3 @@
1
+ export declare const SPINNER_CLASSES: {
2
+ readonly root: "shrink-0 animate-spin text-muted-foreground";
3
+ };
@@ -0,0 +1,4 @@
1
+ export declare const SWITCH_CLASSES: {
2
+ readonly root: "peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-none transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-5 data-[size=default]:w-9 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-glass-active";
3
+ readonly thumb: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 group-data-[size=default]/switch:data-[state=checked]:translate-x-[calc(100%+2px)] dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground";
4
+ };
@@ -0,0 +1,11 @@
1
+ export declare const TABLE_CLASSES: {
2
+ readonly container: "relative w-full overflow-x-auto";
3
+ readonly root: "w-full caption-bottom border-collapse text-sm";
4
+ readonly header: "[&_tr]:hover:bg-transparent";
5
+ readonly body: "[&_tr:last-child]:border-0";
6
+ readonly footer: "border-t border-border font-medium [&>tr]:last:border-b-0";
7
+ readonly row: "border-b border-border transition-colors duration-fast hover:bg-glass-row data-[state=selected]:bg-glass-active";
8
+ readonly head: "px-3 py-2 text-left align-middle text-xs font-medium whitespace-nowrap text-muted-foreground [&:has([role=checkbox])]:pr-0";
9
+ readonly cell: "px-3 py-2 align-middle text-sm whitespace-nowrap [&:has([role=checkbox])]:pr-0";
10
+ readonly caption: "mt-4 text-sm text-muted-foreground";
11
+ };
@@ -0,0 +1,13 @@
1
+ export declare const SEGMENTED_LIST = "inline-flex h-9 w-fit items-center justify-center rounded-full border border-glass-stroke-section bg-glass-section p-[3px] text-muted-foreground";
2
+ export declare const SEGMENTED_ROW = "flex shrink-0 items-center justify-between gap-2 px-4 pt-3 pb-2 md:px-6";
3
+ export declare const SEGMENTED_ROW_COMPACT = "flex shrink-0 items-center justify-between gap-2 px-2 pt-2 pb-2";
4
+ /** The ONE trigger sizing both strips use — no per-surface `h-8`/`text-xs`
5
+ * overrides, or the two drift by a pixel again. */
6
+ export declare const SEGMENTED_TAB = "px-3";
7
+ export declare const SEGMENTED_ITEM = "inline-flex shrink-0 items-center justify-center gap-1.5 rounded-full border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4";
8
+ export declare const TABS_CLASSES: {
9
+ readonly root: "flex flex-col gap-2";
10
+ readonly list: "inline-flex h-9 w-fit items-center justify-center rounded-full border border-glass-stroke-section bg-glass-section p-[3px] text-muted-foreground";
11
+ readonly trigger: "inline-flex shrink-0 items-center justify-center gap-1.5 rounded-full border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 h-[calc(100%-1px)] flex-1 text-foreground dark:text-muted-foreground dark:data-[state=active]:border-glass-stroke-active dark:data-[state=active]:bg-glass-active dark:data-[state=active]:text-foreground disabled:pointer-events-none disabled:opacity-50";
12
+ readonly content: "flex-1 outline-none";
13
+ };
@@ -0,0 +1,3 @@
1
+ export declare const TEXTAREA_CLASSES: {
2
+ readonly root: "flex field-sizing-content min-h-16 w-full resize-y [@supports(field-sizing:content)]:resize-none rounded-lg border border-glass-stroke-card bg-glass-card px-3 py-2 text-base shadow-none transition-[color,border-color] duration-fast outline-none placeholder:text-foreground/50 focus-visible:border-glass-stroke-active focus-visible:ring-0 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:ring-destructive/40";
3
+ };
@@ -0,0 +1,163 @@
1
+ export declare const TOAST_CONSTANTS: {
2
+ width: number;
3
+ gap: number;
4
+ peek: number;
5
+ scaleStep: number;
6
+ visible: number;
7
+ durationMs: number;
8
+ swipeThreshold: number;
9
+ viewportOffset: number;
10
+ mobileViewportOffset: number;
11
+ placement: {
12
+ pointer: string;
13
+ touch: string;
14
+ };
15
+ touchMaxWidth: number;
16
+ kinds: string[];
17
+ };
18
+ export type ToastKind = `success` | `error` | `info` | `warning`;
19
+ export type ToastPlacement = `bottom-right` | `top-center`;
20
+ export declare const TOAST_KINDS: readonly ToastKind[];
21
+ /** Touch = up to and including `touchMaxWidth` (the fixture's phone breakpoint). */
22
+ export declare const TOAST_TOUCH_QUERY: string;
23
+ export declare const TOAST_CLASSES: {
24
+ /** The fixed region (`<section>`), per placement: `viewportOffset` from
25
+ * the corner on a pointer, `mobileViewportOffset` below the status bar
26
+ * on touch. */
27
+ readonly region: "pointer-events-none fixed z-[100] flex";
28
+ readonly regionPlacement: {
29
+ "bottom-right": string;
30
+ "top-center": string;
31
+ };
32
+ /** The stack box (`<ol>`): `width` wide, its height = the geometry's. */
33
+ readonly list: "pointer-events-auto relative m-0 w-[356px] max-w-full list-none p-0 transition-[height] duration-standard ease-standard";
34
+ readonly listPlacement: {
35
+ "bottom-right": string;
36
+ "top-center": string;
37
+ };
38
+ /** The card: the opaque glass card at radius lg, no shadow; placed by its
39
+ * `--offset`/`--scale`. A collapsed back toast hides its contents behind
40
+ * the front one; a toast past `visible` draws nothing. */
41
+ readonly toast: "absolute inset-x-0 top-(--offset) flex items-start gap-3 rounded-lg border border-glass-stroke-card bg-glass-card-opaque p-4 font-sans text-sm text-foreground scale-(--scale) transition-[top,scale,opacity] duration-standard ease-standard data-[expanded=false]:data-[front=false]:*:opacity-0 data-[visible=false]:pointer-events-none data-[visible=false]:opacity-0";
42
+ /** A back card shrinks about the edge that PEEKS OUT: the top on a bottom
43
+ * stack, the bottom on a top stack. */
44
+ readonly toastOrigin: {
45
+ readonly bottom: "origin-top";
46
+ readonly top: "origin-bottom";
47
+ };
48
+ readonly content: "flex min-w-0 flex-1 flex-col gap-0.5";
49
+ readonly title: "leading-5 font-medium text-foreground";
50
+ readonly description: "leading-5 text-muted-foreground";
51
+ readonly action: "inline-flex h-6 shrink-0 cursor-pointer items-center rounded-md border-0 bg-primary px-2 text-xs font-medium text-primary-foreground transition-colors hover:bg-primary/90";
52
+ /** The close glyph: last in the row. */
53
+ readonly close: "order-last inline-flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 bg-transparent p-0 text-muted-foreground transition-colors hover:text-foreground [&_svg]:size-3.5";
54
+ readonly iconSlot: "flex h-5 shrink-0 items-center";
55
+ readonly icon: "size-4 shrink-0";
56
+ /** The ONLY place a toast wears its kind. */
57
+ readonly kindIcon: {
58
+ success: string;
59
+ error: string;
60
+ info: string;
61
+ warning: string;
62
+ };
63
+ };
64
+ /** The Lucide glyph each kind paints (the app's concept icons
65
+ * `ui-success`/`ui-error`/`ui-info`/`ui-warning`, packages/icons/icons.json). */
66
+ export declare const TOAST_KIND_GLYPH: {
67
+ readonly success: "circle-check";
68
+ readonly error: "circle-x";
69
+ readonly info: "info";
70
+ readonly warning: "triangle-alert";
71
+ };
72
+ /** The fixture's `placement`: bottom-right on a pointer, top-centre on touch;
73
+ * a bottom stack measures its peek above the front toast. */
74
+ export declare function toastPlacement(isTouch: boolean): {
75
+ placement: ToastPlacement;
76
+ anchoredBottom: boolean;
77
+ };
78
+ export interface ToastStackItem {
79
+ /** The item's top inside the stack box. */
80
+ offset: number;
81
+ /** Its width factor. */
82
+ scale: number;
83
+ /** Whether it draws at all. */
84
+ visible: boolean;
85
+ }
86
+ /** The numbers a stack is drawn from (the toast's, the Dock pile's). */
87
+ export interface StackConstants {
88
+ /** How far an older item peeks out behind the one in front of it. */
89
+ peek: number;
90
+ /** How much smaller each rank behind the front draws. */
91
+ scaleStep: number;
92
+ /** How many items draw at all while collapsed. */
93
+ visible: number;
94
+ /** The space between items while expanded. */
95
+ gap: number;
96
+ }
97
+ /** THE stack geometry ×4 (fixtures/toast-stack.json `geometry`; N-12: the
98
+ * Dock pile draws it too): `heights` oldest first (the newest is in front).
99
+ * Collapsed, the item of rank r (0 = front) sits r × `peek` from the
100
+ * anchoring edge, shrunk by `scaleStep` per rank (clamped at the last
101
+ * visible rank), `visible` of them drawn; expanded, every item at full
102
+ * size, `gap` apart. */
103
+ export declare function stackGeometry(heights: readonly number[], expanded: boolean, anchoredBottom: boolean, constants: StackConstants): {
104
+ height: number;
105
+ items: ToastStackItem[];
106
+ };
107
+ /** The toast's stack (`stackGeometry` with the toast's numbers). */
108
+ export declare function toastStackGeometry(heights: readonly number[], expanded: boolean, anchoredBottom: boolean): {
109
+ height: number;
110
+ items: ToastStackItem[];
111
+ };
112
+ export interface ToastAction {
113
+ label: string;
114
+ onClick?: (event: Event) => void;
115
+ }
116
+ export interface ToastOptions {
117
+ /** A fixed id (else the store generates `toast-<n>`); re-using a live id
118
+ * replaces that toast. */
119
+ id?: string;
120
+ kind?: ToastKind;
121
+ description?: string;
122
+ action?: ToastAction;
123
+ /** The auto-dismiss clock in ms (default `durationMs`); `Infinity` = sticky. */
124
+ duration?: number;
125
+ /** A fixed height for the stack geometry (else the renderer measures). */
126
+ height?: number;
127
+ onDismiss?: (toast: ToastRecord) => void;
128
+ }
129
+ export interface ToastRecord {
130
+ id: string;
131
+ kind?: ToastKind;
132
+ title: string;
133
+ description?: string;
134
+ action?: ToastAction;
135
+ duration: number;
136
+ height?: number;
137
+ }
138
+ export interface ToastFn {
139
+ (title: string, options?: ToastOptions): string;
140
+ (options: ToastOptions & {
141
+ title: string;
142
+ }): string;
143
+ success: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
144
+ error: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
145
+ info: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
146
+ warning: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
147
+ }
148
+ export interface ToastStore {
149
+ toast: ToastFn;
150
+ /** Removes one toast, or every toast without an id. */
151
+ dismiss: (id?: string) => void;
152
+ /** The live toasts, oldest first. */
153
+ toasts: () => readonly ToastRecord[];
154
+ /** Called with the toasts on every change; returns the unsubscribe. */
155
+ subscribe: (listener: (toasts: readonly ToastRecord[]) => void) => () => void;
156
+ /** Stops every clock (the stack expanded), keeping what is left of each. */
157
+ pauseAll: () => void;
158
+ /** Restarts every clock with its remaining time. */
159
+ resumeAll: () => void;
160
+ readonly paused: boolean;
161
+ }
162
+ /** A toast store: the queue, the per-toast clocks and their pause. */
163
+ export declare function createToastStore(): ToastStore;
@@ -0,0 +1,3 @@
1
+ export declare const TOOLTIP_CLASSES: {
2
+ readonly content: "glass-panel z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-lg px-3 py-1.5 text-xs text-balance text-popover-foreground motion-popover";
3
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shorten `value` to at most `max` characters by replacing its middle with an
3
+ * ellipsis, keeping both ends visible (the tail slightly longer, since that is
4
+ * where the filename lives). Shorter values, and any `max` too small to hold a
5
+ * character on each side of the ellipsis, are returned unchanged.
6
+ */
7
+ export declare function middleTruncate(value: string, max: number): string;
@@ -0,0 +1,12 @@
1
+ /** The attribute the anchored arm stamps on its portal. It lives outside the
2
+ * host's subtree, so a Radix modal would take a click on it as an OUTSIDE
3
+ * interaction and close: dialog hosts whitelist this selector in their
4
+ * `onInteractOutside`, and treat a mounted one as "a menu is open" when
5
+ * routing Escape. */
6
+ export declare const TYPEAHEAD_PORTAL_SELECTOR = "[data-editor-autocomplete]";
7
+ /** Whether a Radix outside-interaction (its `target` is the pointed-at
8
+ * node) landed inside the anchored arm's portal. `DialogContent` and
9
+ * `SheetContent` ignore that one by default. */
10
+ export declare function isTypeaheadPortalInteraction(event: {
11
+ target: EventTarget | null;
12
+ }): boolean;
@@ -0,0 +1,50 @@
1
+ import type { VoiceWaveActivity } from "../../voice-wave.js";
2
+ export type { VoiceWaveActivity, VoiceWaveRingName } from "../../voice-wave.js";
3
+ export declare const VOICE_WAVE_SIZES: readonly ["sm", "md", "lg", "xl"];
4
+ export type VoiceWaveSize = (typeof VOICE_WAVE_SIZES)[number];
5
+ /** The box edge per size (px): the `VoiceWave/root` recipe's width. */
6
+ export declare const VOICE_WAVE_SIZE_PX: Readonly<Record<VoiceWaveSize, number>>;
7
+ /** Whether `activity` moves the waves (listening, thinking, speaking). */
8
+ export declare function voiceWaveAnimates(activity: VoiceWaveActivity): boolean;
9
+ /** Idle and muted paint quiet: muted colours, the wave at .35 opacity (an
10
+ * unknown activity is idle, as in the core). */
11
+ export declare function voiceWaveQuiet(activity: VoiceWaveActivity): boolean;
12
+ /** The accessible name (a11y.json `VoiceWave`): the label with the activity
13
+ * appended (`Voice, listening`); none without a label (decorative). */
14
+ export declare function voiceWaveName(label: string | undefined, activity: VoiceWaveActivity): string | undefined;
15
+ /** Calls `onFrame(elapsed seconds)` on every animation frame after the
16
+ * first (the first frame is the clock's zero, already painted); returns
17
+ * the stop. Without `requestAnimationFrame` (SSR) it never ticks. */
18
+ export declare function voiceWaveClock(onFrame: (elapsed: number) => void): () => void;
19
+ /** THE CHILD RULE's painter half (catalog/style.json `voiceWave`): the child
20
+ * is laid out centred at its own size; this measures its own (untransformed)
21
+ * border box and draws it scaled about its centre (= the box centre) by
22
+ * `scaleOf(its size)` (the core's `voiceWaveChildBox(size, child).scale`:
23
+ * min(1, childSize / its longer edge), 0 at `sm`). Re-measures on every
24
+ * resize (ResizeObserver: before the first paint); without one (SSR,
25
+ * jsdom) it measures once. Returns the stop. */
26
+ export declare function voiceWaveFitChild(el: HTMLElement, scaleOf: (child: {
27
+ width: number;
28
+ height: number;
29
+ }) => number): () => void;
30
+ export declare const VOICE_WAVE_CLASSES: {
31
+ readonly root: "relative inline-flex shrink-0 items-center justify-center";
32
+ readonly quiet: "opacity-35";
33
+ readonly size: {
34
+ sm: string;
35
+ md: string;
36
+ lg: string;
37
+ xl: string;
38
+ };
39
+ readonly svg: "pointer-events-none absolute inset-0 size-full overflow-visible";
40
+ readonly ring: {
41
+ outer: string;
42
+ mid: string;
43
+ inner: string;
44
+ };
45
+ readonly ringQuiet: "text-muted-foreground";
46
+ readonly child: "relative flex shrink-0 items-center justify-center text-foreground";
47
+ /** At `sm` (childSize 0): kept, painted nothing, no hit target. */
48
+ readonly childHidden: "invisible pointer-events-none";
49
+ readonly childMuted: "text-muted-foreground";
50
+ };
@@ -0,0 +1,107 @@
1
+ import { type QrMatrix } from "@exponential_app/eui";
2
+ /** style.json `qrScanner` (the viewfinder geometry). */
3
+ export declare const QR_SCANNER: {
4
+ $comment: string;
5
+ maxWidth: number;
6
+ aspectRatio: number;
7
+ cornerLength: number;
8
+ cornerStroke: number;
9
+ feedAlpha: number;
10
+ scanLineHeight: number;
11
+ scanLineInset: number;
12
+ sweepMs: number;
13
+ hintGap: number;
14
+ placeholderIcon: string;
15
+ placeholderIconSize: number;
16
+ };
17
+ export interface QrPaint {
18
+ /** The core's matrix (null = the empty plate). */
19
+ matrix: QrMatrix | null;
20
+ /** The SVG viewBox edge in MODULES (n + 2 × quietZone); 0 without a matrix. */
21
+ modules: number;
22
+ /** One path of every dark module run in module units (quiet zone
23
+ * included), so `shape-rendering: crispEdges` snaps the edges to device
24
+ * pixels while the outer size stays the exact `size`. */
25
+ path: string;
26
+ /** The resolved colours after THE SWAP: the lighter fills the plate. */
27
+ plate: string;
28
+ module: string;
29
+ }
30
+ /** The QrCode paint of `value` at `level` (style.json `qrCode`): the core's
31
+ * `qrMatrix`, never a platform QR library; of the two recipe colours the
32
+ * lighter (relative luminance) is the plate, the darker the modules, so a
33
+ * dark theme still scans. A colour the parser cannot read keeps its role. */
34
+ export declare function qrPaint(value: string, level: unknown, plateColour: string, moduleColour: string): QrPaint;
35
+ /** THE web renderers' camera hook (the `qrScanner` host option; never
36
+ * catalog/host.json): the host renders its live feed into `feed` (an empty
37
+ * element filling the viewfinder; append a `<video>`), decodes codes of
38
+ * `formats` (default `["qr"]`) and calls `onValue` with every decoded
39
+ * string; the renderer dispatches `scanned {value}` once per distinct
40
+ * value. `start` returns the stop (called on unmount, on `disabled` and
41
+ * when the formats change); returning `false` (or throwing) = no camera
42
+ * (the placeholder shows). */
43
+ export interface QrScannerHost {
44
+ start(feed: HTMLElement, formats: readonly string[], onValue: (value: string) => void): (() => void) | false | void;
45
+ }
46
+ /** One reporter per mounted scanner: forwards a decoded value only when it
47
+ * differs from the last one reported (a code held in view reports once). */
48
+ export declare function qrScanReporter(report: (value: string) => void): (value: string) => void;
49
+ export declare const QR_CORNERS: readonly ["tl", "tr", "bl", "br"];
50
+ export type QrCorner = (typeof QR_CORNERS)[number];
51
+ /** One corner bracket as an SVG path in its own cornerLength-px square
52
+ * (placed flush in that corner of the viewfinder): two strokes of
53
+ * cornerStroke px whose outer edge follows the viewfinder radius `radius`
54
+ * (the stroke's centre line runs half a stroke inside). Draw it with
55
+ * round caps and `overflow: visible`. */
56
+ export declare function qrCornerPath(corner: QrCorner, radius: number): string;
57
+ /** The empty viewfinder's fill: the `feed` recipe colour at feedAlpha. */
58
+ export declare function qrFeedColour(colour: string): string;
59
+ /** The formats a scanner asks the host for (style: the catalog default). */
60
+ export declare function qrScanFormats(raw: unknown): string[];
61
+ /** A `bar` item's badge text: the number, `99+` above 99; null (no badge)
62
+ * at 0, unset or not a number. */
63
+ export declare function segmentedBadge(raw: unknown): string | null;
64
+ /** THE slop: how far (px) a held pointer may wander outside the box. */
65
+ export declare const HOLD_SLOP = 24;
66
+ export type HoldEvent = `holdStart` | `holdEnd` | `holdCancel`;
67
+ export interface HoldRect {
68
+ left: number;
69
+ top: number;
70
+ right: number;
71
+ bottom: number;
72
+ }
73
+ /** Whether (x, y) lies within the box grown by the slop on every side. */
74
+ export declare function withinSlop(rect: HoldRect, x: number, y: number, slop?: number): boolean;
75
+ /** THE hold machine of a `hold: true` Button, framework-free. The painter
76
+ * forwards its DOM events; `fire` gets the catalog event, `pressed` the
77
+ * painted state. A press never fires `press` here (the painter skips its
78
+ * click while `hold`). */
79
+ export declare class ButtonHold {
80
+ private readonly fire;
81
+ private readonly pressed;
82
+ private readonly disabled;
83
+ /** `pointer`, the key that started the hold, or null when idle. */
84
+ private by;
85
+ private pointerId;
86
+ constructor(fire: (event: HoldEvent) => void, pressed: (pressed: boolean) => void, disabled: () => boolean);
87
+ get active(): boolean;
88
+ private start;
89
+ private finish;
90
+ /** Pointer down (primary button): starts the hold; true = claim the
91
+ * pointer (capture it, prevent the long-press / scroll defaults). */
92
+ pointerDown(pointerId?: number | null): boolean;
93
+ /** A move of the holding pointer: past the slop = the slide away. */
94
+ pointerMove(rect: HoldRect, x: number, y: number, pointerId?: number | null): void;
95
+ /** The holding pointer released: within the slop ends, past it cancels. */
96
+ pointerUp(rect: HoldRect, x: number, y: number, pointerId?: number | null): void;
97
+ pointerCancel(pointerId?: number | null): void;
98
+ /** Key down: Space/Enter start (repeat ignored), Escape cancels. True =
99
+ * the key was handled (prevent its default: no click, no scroll). */
100
+ keyDown(key: string, repeat?: boolean): boolean;
101
+ /** Key up of the key that started the hold ends it. */
102
+ keyUp(key: string): boolean;
103
+ blur(): void;
104
+ /** Unmount or `disabled` mid-hold: drop it silently. */
105
+ reset(): void;
106
+ private samePointer;
107
+ }
@@ -0,0 +1,6 @@
1
+ /** `next` with every part deep-equal to `prev`'s replaced by `prev`'s
2
+ * object (arrays of nodes matched by `id`, other arrays by index): a
3
+ * re-reduce (`updateComponents`) hands every unchanged node its old
4
+ * object, so the renderers skip it. Plain JSON only; anything else is
5
+ * taken as it is. */
6
+ export declare function share<T>(prev: unknown, next: T): T;
@@ -0,0 +1,20 @@
1
+ export interface TableColumn {
2
+ key: string;
3
+ /** The header text (a slot or checkbox column may have none). */
4
+ label?: string;
5
+ type?: `text` | `number` | `date` | `boolean` | `badge` | `slot` | `currency` | `percent` | `relativeTime`;
6
+ slot?: string;
7
+ /** ISO 4217 code of a `currency` column. */
8
+ currency?: string;
9
+ /** Fixed fraction digits of a number / currency / percent column. */
10
+ decimals?: number;
11
+ width?: number;
12
+ align?: `start` | `center` | `end`;
13
+ sortable?: boolean;
14
+ }
15
+ export interface TableSort {
16
+ key: string;
17
+ direction: `asc` | `desc`;
18
+ }
19
+ /** The renderer's local order of `rows` for a sort (unbound sort). */
20
+ export declare function sortRows(rows: readonly Record<string, unknown>[], sort: TableSort | null, column: TableColumn | undefined, locale: string): number[];
@@ -0,0 +1,69 @@
1
+ import type { FontSpec, RecipeRule, ResolvedTheme } from "@exponential_app/eui";
2
+ export declare const LAYERS = "@layer xui-base, xui-recipe, xui-node, xui-part, xui-author;";
3
+ /** `$color.primary` → `--xui-color-primary`; `$type.lineHeight.sm` →
4
+ * `--xui-type-lineHeight-sm` (the group path verbatim); `$type.family.sans`
5
+ * → `--xui-font-sans`. */
6
+ export declare function tokenVarName(ref: string): string | null;
7
+ export declare function tokenVar(ref: string): string | null;
8
+ /** One style value → its CSS text; `null` = nothing to emit. */
9
+ export declare function cssValue(key: string, value: unknown, fonts?: Record<string, FontSpec>): string | null;
10
+ /** Flat declarations (`prop:value` pairs) for one condition-free style. A
11
+ * border width without a `borderStyle` is solid (contract §2). An
12
+ * animation that moves opacity MULTIPLIES the node's own (round 2 §2): the
13
+ * keyframes move `--xui-a-opacity` and `opacity` = own ×
14
+ * `var(--xui-a-opacity, 1)`. `base` = the style a condition block cascades
15
+ * over, so a block that adds only the animation (or only the opacity)
16
+ * still multiplies the other's value. */
17
+ export declare function declarations(style: Record<string, unknown>, fonts?: Record<string, FontSpec>, base?: Record<string, unknown>): [string, string][];
18
+ /** `animation: <name>` as CSS longhands over `@keyframes xui-<name>`
19
+ * (base-css.ts): duration = the motion token × the set's factor (an
20
+ * `animationDuration` token replaces the token, the factor kept), easing
21
+ * per segment = `animation-timing-function`, fill both. An unknown name =
22
+ * no animation. Reduced motion zeroes the duration (base-css.ts), which
23
+ * shows each set's rest frame. */
24
+ export declare function animationDeclarations(name: unknown, durationToken?: unknown): [string, string][];
25
+ /** The shimmer BAND of `animation: shimmer` (style.json `animations.shimmer`
26
+ * `band`): an `::after` over the box, a gradient of the band colour at
27
+ * alpha 0 → .5 → 0, one box wide, at `--xui-band` box widths (the
28
+ * keyframes move it −1 → 1), clipped to the box. Empty for anything else. */
29
+ export declare function shimmerRule(selector: string, style: Record<string, unknown>): string;
30
+ export declare const rule: (selector: string, decls: [string, string][]) => string;
31
+ /** Every way an element can be in a state: the pseudo-class or the attribute
32
+ * Radix sets, plus the forced marker the recipe sheet writes. */
33
+ export declare const STATE_SELECTORS: Record<string, string[]>;
34
+ /** A native's recipe props ride as `data-r-<prop>`, a macro part's as
35
+ * `data-m-<prop>`: a Badge's label is a Text, and both key on `variant`. */
36
+ export declare const propAttribute: (macro: boolean, prop: string) => string;
37
+ /** The selectors one recipe rule applies to, for the part's class. */
38
+ export declare function ruleSelectors(base: string, rule: RecipeRule, macro?: boolean): string[];
39
+ export interface CompiledTheme {
40
+ /** The class on the surface root AND on every element it paints. */
41
+ scope: string;
42
+ /** The whole sheet: layer order, variables (both modes), recipes. */
43
+ css: string;
44
+ theme: ResolvedTheme;
45
+ }
46
+ export declare function themeScope(theme: ResolvedTheme): string;
47
+ /** Whether a component's parts go in the `xui-part` layer (macro parts win
48
+ * over an author's style) or the `xui-recipe` layer (a native's own look
49
+ * yields to it). Extension macros are listed by the caller. */
50
+ export declare function isMacroComponent(component: string, extensionMacros?: ReadonlySet<string>): boolean;
51
+ export declare const partClass: (component: string, part: string) => string;
52
+ export declare function compileTheme(theme: ResolvedTheme, options?: {
53
+ extensionMacros?: ReadonlySet<string>;
54
+ }): CompiledTheme;
55
+ /** `compileTheme`, memoized per resolved theme object (the common case:
56
+ * a built-in or a theme the host loaded once). */
57
+ export declare function compiledTheme(theme: ResolvedTheme, options?: {
58
+ extensionMacros?: ReadonlySet<string>;
59
+ }): CompiledTheme;
60
+ /** FEED-128: the theme as an app's UNSCOPED shadcn globals: the shadcn /
61
+ * Tailwind variable names (the same `SHADCN_ALIASES` the surface sheet
62
+ * maps) with LITERAL values (hex colours, px radius, font stacks; never a
63
+ * `var(--xui-*)`), light under `:root` and dark under `.dark` by default.
64
+ * A non-Exponential-UI app (shadcn-solid, plain Tailwind) pastes it as its
65
+ * globals.css and wears the theme. */
66
+ export declare function globalsCss(theme: ResolvedTheme, options?: {
67
+ light?: string;
68
+ dark?: string;
69
+ }): string;