@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,1450 @@
1
+ // packages/exponential-ui/src/web/primitives/button.ts
2
+ import { cva } from "class-variance-authority";
3
+ var buttonVariants = cva(`inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all duration-fast ease-standard outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`, {
4
+ variants: {
5
+ variant: {
6
+ default: `bg-primary text-primary-foreground hover:bg-primary/90`,
7
+ destructive: `bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40`,
8
+ outline: `border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50`,
9
+ glass: `border border-glass-stroke-card bg-glass-card text-foreground/70 hover:bg-glass-active hover:text-foreground`,
10
+ secondary: `bg-secondary text-secondary-foreground hover:bg-secondary/80`,
11
+ ghost: `hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 aria-pressed:bg-accent aria-pressed:text-accent-foreground dark:aria-pressed:hover:bg-accent`,
12
+ link: `text-primary underline-offset-4 hover:underline`,
13
+ text: `text-muted-foreground hover:text-foreground`
14
+ },
15
+ size: {
16
+ default: `h-9 px-4 py-2 has-[>svg]:px-3`,
17
+ xs: `h-6 gap-1 px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3`,
18
+ sm: `h-8 gap-1.5 px-3 has-[>svg]:px-2.5`,
19
+ lg: `h-10 px-6 has-[>svg]:px-4`,
20
+ icon: `size-9 rounded-full`,
21
+ "icon-sm": `size-8 rounded-full [&_svg:not([class*='size-'])]:size-4`,
22
+ "icon-xs": `size-6 rounded-full [&_svg:not([class*='size-'])]:size-3`,
23
+ inline: `h-auto gap-1 rounded-sm p-0 text-xs has-[>svg]:px-0 [&_svg:not([class*='size-'])]:size-3`
24
+ }
25
+ },
26
+ compoundVariants: [
27
+ {
28
+ variant: `ghost`,
29
+ size: [`icon`, `icon-sm`, `icon-xs`],
30
+ className: `rounded-md`
31
+ },
32
+ {
33
+ variant: [`default`, `destructive`, `outline`, `glass`, `secondary`, `ghost`],
34
+ size: [`default`, `xs`, `sm`, `lg`],
35
+ className: `motion-press`
36
+ },
37
+ {
38
+ variant: [`default`, `destructive`, `outline`, `glass`, `secondary`],
39
+ size: [`icon`, `icon-sm`, `icon-xs`],
40
+ className: `motion-press`
41
+ }
42
+ ],
43
+ defaultVariants: {
44
+ variant: `default`,
45
+ size: `default`
46
+ }
47
+ });
48
+
49
+ // packages/exponential-ui/src/web/primitives/alert-dialog.ts
50
+ var ALERT_DIALOG_CLASSES = {
51
+ overlay: `fixed inset-0 z-50 bg-black/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:duration-fast data-[state=closed]:ease-accelerate data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-standard data-[state=open]:ease-decelerate`,
52
+ content: `fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg motion-dialog sm:max-w-lg`,
53
+ header: `flex flex-col gap-2 text-center sm:text-left`,
54
+ footer: `flex flex-col-reverse gap-2 sm:flex-row sm:justify-end`,
55
+ title: `text-lg font-semibold`,
56
+ description: `text-sm text-muted-foreground`,
57
+ action: buttonVariants(),
58
+ cancel: buttonVariants({ variant: `outline` })
59
+ };
60
+ // packages/exponential-ui/src/web/primitives/alert.ts
61
+ import { cva as cva2 } from "class-variance-authority";
62
+ var alertVariants = cva2(`relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-md border px-3 py-2 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current`, {
63
+ variants: {
64
+ variant: {
65
+ default: `border-glass-stroke-card bg-glass-card text-foreground`,
66
+ destructive: `border-destructive/50 bg-destructive/10 text-destructive`
67
+ }
68
+ },
69
+ defaultVariants: {
70
+ variant: `default`
71
+ }
72
+ });
73
+ var ALERT_CLASSES = {
74
+ title: `col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight`,
75
+ description: `col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed`
76
+ };
77
+ // packages/exponential-ui/src/web/primitives/avatar-color.ts
78
+ var AVATAR_HUE_COUNT = 8;
79
+ var FNV_OFFSET_BASIS = 2166136261;
80
+ var FNV_PRIME = 16777619;
81
+ var encoder = new TextEncoder;
82
+ function avatarHueIndex(userId) {
83
+ const bytes = encoder.encode(userId ?? ``);
84
+ let hash = FNV_OFFSET_BASIS;
85
+ for (const byte of bytes) {
86
+ hash ^= byte;
87
+ hash = Math.imul(hash, FNV_PRIME) >>> 0;
88
+ }
89
+ return hash % AVATAR_HUE_COUNT;
90
+ }
91
+ // packages/exponential-ui/src/web/primitives/avatar.ts
92
+ var AVATAR_CLASSES = {
93
+ root: `relative flex size-8 shrink-0 overflow-hidden rounded-full select-none`,
94
+ image: `aspect-square size-full`,
95
+ fallback: `flex size-full items-center justify-center rounded-full text-sm`,
96
+ fallbackMuted: `bg-muted text-muted-foreground`
97
+ };
98
+ function avatarFallbackHue(userId) {
99
+ return userId === undefined || userId === null ? undefined : `var(--avatar-${avatarHueIndex(userId)})`;
100
+ }
101
+ function avatarFallbackColors(hue) {
102
+ return {
103
+ backgroundColor: `color-mix(in srgb, ${hue} 20%, transparent)`,
104
+ color: hue
105
+ };
106
+ }
107
+ // packages/exponential-ui/src/web/primitives/badge.ts
108
+ var BADGE_CLASSES = {
109
+ root: `pointer-events-none inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[10px] leading-none font-semibold tabular-nums`,
110
+ tones: {
111
+ primary: `bg-primary text-primary-foreground`,
112
+ muted: `bg-muted text-muted-foreground`
113
+ }
114
+ };
115
+ function badgeLabel(count, max = 99) {
116
+ return count > max ? `${max}+` : String(count);
117
+ }
118
+ // packages/exponential-ui/src/web/primitives/breadcrumb.ts
119
+ var BREADCRUMB_CLASSES = {
120
+ list: `flex list-none flex-wrap items-center gap-1.5 text-sm break-words text-muted-foreground sm:gap-2.5`,
121
+ item: `inline-flex items-center gap-1.5`,
122
+ link: `transition-colors hover:text-foreground`,
123
+ page: `font-normal text-foreground`,
124
+ separator: `[&>svg]:size-3.5`,
125
+ ellipsis: `flex size-9 items-center justify-center`,
126
+ ellipsisIcon: `size-4`,
127
+ srOnly: `sr-only`
128
+ };
129
+ // packages/exponential-ui/src/web/primitives/calendar.ts
130
+ var CALENDAR_CLASSES = {
131
+ root: [
132
+ `group/calendar bg-background p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent`,
133
+ String.raw`rtl:**:[.rdp-button\_next>svg]:rotate-180`,
134
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`
135
+ ].join(` `),
136
+ classNames: {
137
+ root: `w-fit`,
138
+ months: `relative flex flex-col gap-4 md:flex-row`,
139
+ month: `flex w-full flex-col gap-4`,
140
+ nav: `absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1`,
141
+ button_previous: `size-(--cell-size) p-0 select-none aria-disabled:opacity-50`,
142
+ button_next: `size-(--cell-size) p-0 select-none aria-disabled:opacity-50`,
143
+ month_caption: `flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)`,
144
+ dropdowns: `flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium`,
145
+ dropdown_root: `relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50`,
146
+ dropdown: `absolute inset-0 bg-popover opacity-0`,
147
+ caption_label: `font-medium select-none`,
148
+ table: `w-full border-collapse`,
149
+ weekdays: `flex`,
150
+ weekday: `flex-1 rounded-md text-[0.8rem] font-normal text-muted-foreground select-none`,
151
+ week: `mt-2 flex w-full`,
152
+ week_number_header: `w-(--cell-size) select-none`,
153
+ week_number: `text-[0.8rem] text-muted-foreground select-none`,
154
+ day: `group/day relative aspect-square h-full w-full p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-md`,
155
+ range_start: `rounded-l-md bg-accent`,
156
+ range_middle: `rounded-none`,
157
+ range_end: `rounded-r-md bg-accent`,
158
+ today: `rounded-md bg-accent text-accent-foreground data-[selected=true]:rounded-none`,
159
+ outside: `text-muted-foreground aria-selected:text-muted-foreground`,
160
+ disabled: `text-muted-foreground opacity-50`,
161
+ hidden: `invisible`
162
+ },
163
+ captionLabel: {
164
+ label: `text-sm`,
165
+ dropdown: `flex h-8 items-center gap-1 rounded-md pr-1 pl-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground`
166
+ },
167
+ dayFirst: {
168
+ weekNumbers: `[&:nth-child(2)[data-selected=true]_button]:rounded-l-md`,
169
+ plain: `[&:first-child[data-selected=true]_button]:rounded-l-md`
170
+ },
171
+ chevron: `size-4`,
172
+ weekNumber: `flex size-(--cell-size) items-center justify-center text-center`,
173
+ dayButton: `flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground [&>span]:text-xs [&>span]:opacity-70`
174
+ };
175
+ // packages/exponential-ui/src/web/primitives/glass-card.ts
176
+ var GLASS_CARD_CLASS = `rounded-xl border border-glass-stroke-card bg-glass-card-opaque`;
177
+ var GLASS_CARD_CLASSES = { root: GLASS_CARD_CLASS };
178
+
179
+ // packages/exponential-ui/src/web/primitives/card.ts
180
+ var CARD_CLASSES = {
181
+ root: `${GLASS_CARD_CLASS} flex flex-col gap-6 backdrop-blur-md py-6 text-card-foreground shadow-sm`,
182
+ header: `@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,
183
+ title: `leading-none font-semibold`,
184
+ description: `text-sm text-muted-foreground`,
185
+ action: `col-start-2 row-span-2 row-start-1 self-start justify-self-end`,
186
+ content: `px-6`,
187
+ footer: `flex items-center px-6 [.border-t]:pt-6`
188
+ };
189
+ // packages/exponential-ui/src/web/primitives/checkbox.ts
190
+ var CHECKBOX_CLASSES = {
191
+ root: `peer size-4 shrink-0 rounded-sm border border-glass-stroke-strong bg-glass-row shadow-none transition-shadow outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:aria-invalid:ring-destructive/40 dark:data-[state=checked]:bg-primary`,
192
+ indicator: `grid place-content-center text-current transition-none`,
193
+ icon: `size-3.5`
194
+ };
195
+ // packages/exponential-ui/src/web/primitives/choice-tiles.ts
196
+ function choiceColumns(columns) {
197
+ const n = typeof columns === `number` && Number.isFinite(columns) ? Math.round(columns) : 2;
198
+ return Math.min(4, Math.max(1, n));
199
+ }
200
+ function choiceValues(value, multiple) {
201
+ if (Array.isArray(value))
202
+ return value.map(String).filter(Boolean);
203
+ const raw = value === undefined || value === null ? `` : String(value);
204
+ if (!multiple)
205
+ return raw ? [raw] : [];
206
+ return raw.split(`,`).map((s) => s.trim()).filter(Boolean);
207
+ }
208
+ function choiceToggle(picked, value, multiple, order) {
209
+ if (!multiple)
210
+ return [value];
211
+ const next = picked.includes(value) ? picked.filter((v) => v !== value) : [...picked, value];
212
+ const rank = (v) => {
213
+ const i = order.indexOf(v);
214
+ return i < 0 ? Number.MAX_SAFE_INTEGER : i;
215
+ };
216
+ return next.slice().sort((a, b) => rank(a) - rank(b));
217
+ }
218
+ var CHOICE_TILES_CLASSES = {
219
+ root: `gap-[8px]`,
220
+ tile: `flex min-w-0 cursor-pointer flex-col gap-[4px] rounded-[10px] border-[1px] border-border bg-card p-[8px] text-start outline-none transition-colors hover:bg-secondary focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50`,
221
+ tileSelected: `border-[2px] border-primary bg-accent p-[7px] hover:bg-accent`,
222
+ tileInvalid: `border-destructive`,
223
+ picture: `relative flex aspect-[1.6] w-full shrink-0 items-center justify-center overflow-hidden rounded-[6px] bg-muted text-muted-foreground`,
224
+ image: `absolute inset-0 size-full object-cover`,
225
+ placeholder: `size-[20px] opacity-60`,
226
+ label: `min-w-0 text-sm leading-5 font-medium text-foreground`,
227
+ description: `min-w-0 text-xs leading-4 text-muted-foreground`
228
+ };
229
+ // packages/exponential-ui/src/web/primitives/cn.ts
230
+ import { clsx } from "clsx";
231
+ import { twMerge } from "tailwind-merge";
232
+ function cn(...inputs) {
233
+ return twMerge(clsx(inputs));
234
+ }
235
+ function getInitials(value) {
236
+ return value.split(` `).map((part) => part[0] ?? ``).join(``).toUpperCase().slice(0, 2);
237
+ }
238
+ // packages/exponential-ui/src/web/primitives/code-block.ts
239
+ import { cva as cva3 } from "class-variance-authority";
240
+ var codeBlockVariants = cva3(`group/code-block relative flex w-full min-w-0 flex-col overflow-hidden rounded-lg text-sm has-[>[data-slot=code-block-content]:focus-visible]:ring-3 has-[>[data-slot=code-block-content]:focus-visible]:ring-ring/50 data-[size=sm]:text-xs`, {
241
+ variants: {
242
+ variant: {
243
+ default: `border border-input text-foreground has-[>[data-slot=code-block-content]:focus-visible]:border-ring dark:bg-input/30`,
244
+ destructive: `border border-destructive/30 text-destructive dark:border-destructive/40`
245
+ }
246
+ },
247
+ defaultVariants: {
248
+ variant: `default`
249
+ }
250
+ });
251
+ var CODE_TOKEN_CLASS = {
252
+ keyword: `text-(--hljs-keyword)`,
253
+ string: `text-(--hljs-string)`,
254
+ number: `text-(--hljs-number)`,
255
+ comment: `text-muted-foreground`,
256
+ type: `text-(--hljs-title)`,
257
+ function: `text-(--hljs-title)`,
258
+ property: `text-(--hljs-variable)`,
259
+ attribute: `text-(--hljs-variable)`,
260
+ tag: `text-(--hljs-tag)`,
261
+ operator: `text-muted-foreground`,
262
+ punctuation: `text-muted-foreground`,
263
+ success: `text-(--hljs-addition)`,
264
+ warning: `text-(--hljs-number)`,
265
+ error: `text-destructive`
266
+ };
267
+ var codeBlockLineVariants = cva3(`relative -mx-3 block min-h-lh px-3 group-data-[size=sm]/code-block:-mx-2.5 group-data-[size=sm]/code-block:px-2.5 before:min-w-6 before:text-end before:text-muted-foreground after:absolute after:start-1 after:top-0 after:text-muted-foreground after:select-none in-data-numbered:col-span-2 in-data-numbered:grid in-data-numbered:grid-cols-subgrid in-data-numbered:gap-x-3 in-data-numbered:[counter-increment:line] in-data-numbered:before:content-[counter(line)] in-data-numbered:before:select-none in-data-numbered:supports-[content:counter(line)_/_'']:before:content-[counter(line)_/_'']`, {
268
+ variants: {
269
+ variant: {
270
+ default: ``,
271
+ added: `bg-muted after:content-['+']`,
272
+ removed: `bg-destructive/10 after:text-destructive after:content-['−']`,
273
+ highlighted: `bg-muted`
274
+ }
275
+ },
276
+ defaultVariants: {
277
+ variant: `default`
278
+ }
279
+ });
280
+ var CODE_BLOCK_CLASSES = {
281
+ header: `flex min-w-0 shrink-0 items-center gap-2 px-3 pt-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pt-2.5 group-data-[variant=destructive]/code-block:text-destructive *:has-[>[data-slot=code-block-title]]:min-w-0`,
282
+ title: `min-w-0 truncate font-sans text-sm font-medium text-foreground group-data-[size=sm]/code-block:text-xs group-data-[variant=destructive]/code-block:text-destructive [&_svg]:pointer-events-none [&_svg]:inline-block [&_svg]:align-middle [&_svg:not([class*='size-'])]:size-3.5 *:[svg]:me-1.5`,
283
+ actions: `-my-1 ms-auto -me-1 flex shrink-0 items-center gap-1 [[data-slot=code-block]>&]:absolute [[data-slot=code-block]>&]:end-2 [[data-slot=code-block]>&]:top-2 [[data-slot=code-block]>&]:z-10 [[data-slot=code-block]>&]:m-0 [[data-slot=code-block]>&]:opacity-0 [[data-slot=code-block]>&]:transition-opacity [[data-slot=code-block]>&]:group-focus-within/code-block:opacity-100 [[data-slot=code-block]>&]:group-hover/code-block:opacity-100 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:end-1.5 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:top-1.5 [[data-slot=code-block]>&]:pointer-coarse:opacity-100 [[data-slot=code-block]>&]:*:[button]:bg-background [[data-slot=code-block]>&]:*:[button]:ring-1 [[data-slot=code-block]>&]:*:[button]:ring-foreground/10`,
284
+ srOnly: `sr-only`,
285
+ content: `min-h-0 min-w-0 scroll-fade-x overflow-auto overscroll-contain px-3 py-3 text-start font-mono leading-relaxed outline-none [--code-block-pad:calc(var(--spacing)*6)] group-has-data-[slot=code-block-footer]/code-block:pb-2 group-has-data-[slot=code-block-header]/code-block:pt-2 group-has-data-[slot=code-block-header]/code-block:[--code-block-pad:calc(var(--spacing)*5)] group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:py-2.5 group-data-[size=sm]/code-block:[--code-block-pad:calc(var(--spacing)*5)] group-data-[size=sm]/code-block:group-has-data-[slot=code-block-header]/code-block:pt-1.5 group-data-[size=sm]/code-block:group-has-data-[slot=code-block-header]/code-block:[--code-block-pad:calc(var(--spacing)*4)] data-wrap:scroll-fade-y data-wrap:wrap-break-word data-wrap:whitespace-pre-wrap`,
286
+ code: `grid min-h-lh min-w-max content-start in-data-numbered:grid-cols-[auto_1fr] in-data-wrap:min-w-0`,
287
+ token: `group-data-[variant=destructive]/code-block:text-current`,
288
+ lineContent: `min-w-0`,
289
+ footer: `flex min-w-0 shrink-0 items-center gap-2 px-3 pb-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pb-2.5`
290
+ };
291
+ // packages/exponential-ui/src/web/primitives/command.ts
292
+ var COMMAND_CLASSES = {
293
+ root: `flex h-full w-full flex-col overflow-hidden rounded-md bg-transparent text-popover-foreground`,
294
+ inputWrapper: `flex h-9 items-center gap-2 border-b border-glass-stroke px-3`,
295
+ inputGlyph: `size-4 shrink-0 opacity-50`,
296
+ input: `flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden placeholder:text-foreground/50 disabled:cursor-not-allowed disabled:opacity-50`,
297
+ inputClear: buttonVariants({ variant: `ghost`, size: `icon-xs`, className: `shrink-0 text-muted-foreground` }),
298
+ list: `max-h-[18.75rem] scroll-py-1 overflow-x-hidden overflow-y-auto`,
299
+ empty: `py-6 text-center text-sm`,
300
+ group: `overflow-hidden p-(--menu-surface-padding) text-foreground`,
301
+ groupHeading: `px-(--menu-item-padding-x) py-1.5 text-xs font-medium text-muted-foreground`,
302
+ item: `relative flex min-h-(--menu-item-height) cursor-pointer items-center gap-(--menu-item-gap) rounded-sm px-(--menu-item-padding-x) py-1 text-sm text-foreground/90 outline-hidden select-none data-[disabled=true]:cursor-default data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-[selected=true]:bg-glass-active data-[selected=true]:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--menu-icon-size) [&_svg:not([class*='text-'])]:text-muted-foreground`,
303
+ separator: `-mx-(--menu-surface-padding) my-(--menu-surface-padding) h-px bg-glass-stroke`,
304
+ shortcut: `ml-auto text-xs tracking-widest text-muted-foreground`
305
+ };
306
+ var COMMAND_LABEL_STYLE = {
307
+ position: `absolute`,
308
+ width: `1px`,
309
+ height: `1px`,
310
+ padding: `0`,
311
+ margin: `-1px`,
312
+ overflow: `hidden`,
313
+ clip: `rect(0, 0, 0, 0)`,
314
+ whiteSpace: `nowrap`,
315
+ borderWidth: `0`
316
+ };
317
+ var SCORE_CONTINUE_MATCH = 1;
318
+ var SCORE_SPACE_WORD_JUMP = 0.9;
319
+ var SCORE_NON_SPACE_WORD_JUMP = 0.8;
320
+ var SCORE_CHARACTER_JUMP = 0.17;
321
+ var SCORE_TRANSPOSITION = 0.1;
322
+ var PENALTY_SKIPPED = 0.999;
323
+ var PENALTY_CASE_MISMATCH = 0.9999;
324
+ var PENALTY_NOT_COMPLETE = 0.99;
325
+ var IS_GAP = /[\\/_+.#"@[({&]/;
326
+ var COUNT_GAPS = /[\\/_+.#"@[({&]/g;
327
+ var IS_SPACE = /[\s-]/;
328
+ var COUNT_SPACE = /[\s-]/g;
329
+ function scoreFrom(value, query, lowerValue, lowerQuery, valueIndex, queryIndex, memo) {
330
+ if (queryIndex === query.length)
331
+ return valueIndex === value.length ? SCORE_CONTINUE_MATCH : PENALTY_NOT_COMPLETE;
332
+ const key = `${valueIndex},${queryIndex}`;
333
+ if (memo[key] !== undefined)
334
+ return memo[key];
335
+ const queryChar = lowerQuery.charAt(queryIndex);
336
+ let index = lowerValue.indexOf(queryChar, valueIndex);
337
+ let high = 0;
338
+ while (index >= 0) {
339
+ let score = scoreFrom(value, query, lowerValue, lowerQuery, index + 1, queryIndex + 1, memo);
340
+ if (score > high) {
341
+ if (index === valueIndex)
342
+ score *= SCORE_CONTINUE_MATCH;
343
+ else if (IS_GAP.test(value.charAt(index - 1))) {
344
+ score *= SCORE_NON_SPACE_WORD_JUMP;
345
+ const breaks = value.slice(valueIndex, index - 1).match(COUNT_GAPS);
346
+ if (breaks && valueIndex > 0)
347
+ score *= Math.pow(PENALTY_SKIPPED, breaks.length);
348
+ } else if (IS_SPACE.test(value.charAt(index - 1))) {
349
+ score *= SCORE_SPACE_WORD_JUMP;
350
+ const breaks = value.slice(valueIndex, index - 1).match(COUNT_SPACE);
351
+ if (breaks && valueIndex > 0)
352
+ score *= Math.pow(PENALTY_SKIPPED, breaks.length);
353
+ } else {
354
+ score *= SCORE_CHARACTER_JUMP;
355
+ if (valueIndex > 0)
356
+ score *= Math.pow(PENALTY_SKIPPED, index - valueIndex);
357
+ }
358
+ if (value.charAt(index) !== query.charAt(queryIndex))
359
+ score *= PENALTY_CASE_MISMATCH;
360
+ }
361
+ if (score < SCORE_TRANSPOSITION && lowerValue.charAt(index - 1) === lowerQuery.charAt(queryIndex + 1) || lowerQuery.charAt(queryIndex + 1) === lowerQuery.charAt(queryIndex) && lowerValue.charAt(index - 1) !== lowerQuery.charAt(queryIndex)) {
362
+ const transposed = scoreFrom(value, query, lowerValue, lowerQuery, index + 1, queryIndex + 2, memo);
363
+ if (transposed * SCORE_TRANSPOSITION > score)
364
+ score = transposed * SCORE_TRANSPOSITION;
365
+ }
366
+ if (score > high)
367
+ high = score;
368
+ index = lowerValue.indexOf(queryChar, index + 1);
369
+ }
370
+ memo[key] = high;
371
+ return high;
372
+ }
373
+ var normalize = (s) => s.toLowerCase().replace(COUNT_SPACE, ` `);
374
+ function commandScore(value, query, keywords) {
375
+ const full = keywords && keywords.length > 0 ? `${value} ${keywords.join(` `)}` : value;
376
+ return scoreFrom(full, query, normalize(full), normalize(query), 0, 0, {});
377
+ }
378
+ function filterCommandItems(items, query, filter = commandScore) {
379
+ const scores = new Map;
380
+ const order = new Map;
381
+ let count = 0;
382
+ items.forEach((item, at) => {
383
+ const score = item.forceMount ? 1 : query ? item.value ? filter(item.value, query, item.keywords) : 0 : 1;
384
+ scores.set(item.id, score);
385
+ if (!item.forceMount && score > 0)
386
+ count++;
387
+ if (score <= 0)
388
+ return;
389
+ let g = order.get(item.group);
390
+ if (!g)
391
+ order.set(item.group, g = { ids: [], best: 0, at });
392
+ g.ids.push({ id: item.id, score, at });
393
+ g.best = Math.max(g.best, score);
394
+ });
395
+ const groups = [...order.entries()].map(([group, g]) => ({ group, ...g }));
396
+ if (query) {
397
+ for (const g of groups)
398
+ g.ids.sort((a, b) => b.score - a.score || a.at - b.at);
399
+ groups.sort((a, b) => a.group === undefined ? -1 : b.group === undefined ? 1 : b.best - a.best || a.at - b.at);
400
+ } else
401
+ groups.sort((a, b) => a.group === undefined ? -1 : b.group === undefined ? 1 : a.at - b.at);
402
+ return { count, groups: groups.map((g) => ({ group: g.group, ids: g.ids.map((i) => i.id) })), scores };
403
+ }
404
+ var COMMAND_SELECT_EVENT = `command-item-select`;
405
+ var ITEM = `[data-slot="command-item"]`;
406
+ var ENABLED_ITEM = `${ITEM}:not([aria-disabled="true"])`;
407
+ var GROUP = `[data-slot="command-group"]`;
408
+ function createCommandStore(o) {
409
+ let search = ``;
410
+ let value = o.props().value?.trim() ?? ``;
411
+ let selectedId;
412
+ let seq = 0;
413
+ let version = 0;
414
+ const entries = new Map;
415
+ const byEl = new WeakMap;
416
+ const listeners = new Set;
417
+ let sizer = null;
418
+ let dirtyOrder = false;
419
+ let selectFirst = false;
420
+ let scroll = false;
421
+ let selectionChanged = false;
422
+ const filter = () => o.props().filter ?? commandScore;
423
+ const filtering = () => search !== `` && o.props().shouldFilter !== false;
424
+ const emit = () => {
425
+ version++;
426
+ listeners.forEach((l) => l());
427
+ };
428
+ const touch = () => {
429
+ o.schedule();
430
+ };
431
+ const items = () => [...entries.values()].filter((e) => e.kind === `item`).sort((a, b) => a.seq - b.seq);
432
+ const result = () => filterCommandItems(items(), filtering() ? search : ``, filter());
433
+ const setValue = (next, opts = {}) => {
434
+ const p = o.props();
435
+ if (next === (p.value !== undefined ? p.value.trim() : value))
436
+ return;
437
+ if (p.value === undefined)
438
+ value = next;
439
+ p.onValueChange?.(next);
440
+ if (!opts.pointer)
441
+ scroll = true;
442
+ selectionChanged = true;
443
+ emit();
444
+ touch();
445
+ };
446
+ const enabledItems = () => Array.from(sizer?.querySelectorAll(ENABLED_ITEM) ?? []);
447
+ const selectedEl = () => sizer?.querySelector(`${ITEM}[aria-selected="true"]`) ?? null;
448
+ const reorder = (container, scores) => {
449
+ const kids = Array.from(container.children).map((el) => byEl.get(el)).filter((e) => e !== undefined);
450
+ if (kids.length === 0)
451
+ return;
452
+ const groupScore = (g) => Math.max(0, ...items().filter((i) => i.group === g.id).map((i) => scores.get(i.id) ?? 0));
453
+ let want;
454
+ if (!filtering())
455
+ want = [...kids].sort((a, b) => a.seq - b.seq);
456
+ else {
457
+ const rank = (e) => e.kind === `item` ? 1 : e.kind === `group` ? 2 : 0;
458
+ const score = (e) => e.kind === `item` ? scores.get(e.id) ?? 0 : e.kind === `group` ? groupScore(e) : 0;
459
+ want = [...kids].sort((a, b) => rank(a) - rank(b) || score(b) - score(a) || a.seq - b.seq);
460
+ }
461
+ if (want.every((e, i) => e === kids[i]))
462
+ return;
463
+ for (const e of want)
464
+ if (e.el)
465
+ container.appendChild(e.el);
466
+ };
467
+ return {
468
+ get version() {
469
+ return version;
470
+ },
471
+ get search() {
472
+ return search;
473
+ },
474
+ get value() {
475
+ const p = o.props().value;
476
+ return p !== undefined ? p.trim() : value;
477
+ },
478
+ get selectedId() {
479
+ return selectedId;
480
+ },
481
+ subscribe(listener) {
482
+ listeners.add(listener);
483
+ return () => void listeners.delete(listener);
484
+ },
485
+ nextSeq: () => seq++,
486
+ setSearch(next, silent = false) {
487
+ if (next === search)
488
+ return;
489
+ search = next;
490
+ dirtyOrder = true;
491
+ selectFirst = true;
492
+ if (silent)
493
+ return;
494
+ emit();
495
+ touch();
496
+ },
497
+ setValue,
498
+ syncValue() {
499
+ const p = o.props().value;
500
+ if (p === undefined || p.trim() === value)
501
+ return false;
502
+ value = p.trim();
503
+ selectionChanged = true;
504
+ scroll = true;
505
+ emit();
506
+ touch();
507
+ return true;
508
+ },
509
+ setSizer(el) {
510
+ sizer = el;
511
+ },
512
+ filtering,
513
+ score(itemValue, keywords) {
514
+ if (!filtering())
515
+ return 1;
516
+ return itemValue ? filter()(itemValue, search, keywords) : 0;
517
+ },
518
+ groupVisible(groupId) {
519
+ if (!filtering())
520
+ return true;
521
+ return items().some((i) => i.group === groupId && this.score(i.value, i.keywords) > 0);
522
+ },
523
+ empty() {
524
+ return result().count === 0;
525
+ },
526
+ register(entry) {
527
+ const e = { el: null, value: ``, ...entry };
528
+ entries.set(e.id, e);
529
+ dirtyOrder = true;
530
+ if (e.kind === `item` && !this.value)
531
+ selectFirst = true;
532
+ emit();
533
+ touch();
534
+ return () => {
535
+ entries.delete(e.id);
536
+ if (e.el)
537
+ byEl.delete(e.el);
538
+ dirtyOrder = true;
539
+ if (e.kind === `item` && selectedId === e.id)
540
+ selectFirst = true;
541
+ emit();
542
+ touch();
543
+ };
544
+ },
545
+ update(id, patch) {
546
+ const e = entries.get(id);
547
+ if (!e)
548
+ return;
549
+ let changed = false;
550
+ if (`el` in patch && patch.el !== e.el) {
551
+ if (e.el)
552
+ byEl.delete(e.el);
553
+ e.el = patch.el ?? null;
554
+ if (e.el)
555
+ byEl.set(e.el, e);
556
+ dirtyOrder = true;
557
+ changed = true;
558
+ }
559
+ if (patch.value !== undefined && patch.value !== e.value) {
560
+ e.value = patch.value;
561
+ dirtyOrder = true;
562
+ if (!this.value)
563
+ selectFirst = true;
564
+ changed = true;
565
+ }
566
+ if (`keywords` in patch && (patch.keywords ?? []).join(`\x00`) !== (e.keywords ?? []).join(`\x00`)) {
567
+ e.keywords = patch.keywords;
568
+ dirtyOrder = true;
569
+ changed = true;
570
+ }
571
+ if (`disabled` in patch && patch.disabled !== e.disabled) {
572
+ e.disabled = patch.disabled;
573
+ changed = true;
574
+ }
575
+ if (!changed)
576
+ return;
577
+ emit();
578
+ touch();
579
+ },
580
+ flush() {
581
+ if (!sizer)
582
+ return;
583
+ if (dirtyOrder) {
584
+ dirtyOrder = false;
585
+ const { scores } = result();
586
+ reorder(sizer, scores);
587
+ for (const items of Array.from(sizer.querySelectorAll(`[data-slot="command-group-items"]`)))
588
+ reorder(items, scores);
589
+ }
590
+ if (selectFirst) {
591
+ selectFirst = false;
592
+ const first = enabledItems()[0];
593
+ const next = first?.getAttribute(`data-value`) ?? ``;
594
+ if (next !== this.value) {
595
+ setValue(next);
596
+ return;
597
+ }
598
+ }
599
+ const sel = selectedEl();
600
+ const id = sel?.id || undefined;
601
+ if (id !== selectedId) {
602
+ selectedId = id;
603
+ emit();
604
+ }
605
+ if (selectionChanged) {
606
+ selectionChanged = false;
607
+ if (scroll && sel) {
608
+ if (sel.parentElement?.firstElementChild === sel)
609
+ sel.closest(GROUP)?.querySelector(`[data-slot="command-group-heading"]`)?.scrollIntoView({ block: `nearest` });
610
+ sel.scrollIntoView({ block: `nearest` });
611
+ }
612
+ scroll = false;
613
+ }
614
+ },
615
+ onKeyDown(e) {
616
+ if (e.defaultPrevented || e.isComposing || e.keyCode === 229)
617
+ return;
618
+ const loop = Boolean(o.props().loop);
619
+ const pick = (el) => {
620
+ if (el)
621
+ setValue(el.getAttribute(`data-value`) ?? ``);
622
+ };
623
+ const at = (i) => pick(enabledItems()[i]);
624
+ const last = () => at(enabledItems().length - 1);
625
+ const step = (delta) => {
626
+ const list = enabledItems();
627
+ const i = list.findIndex((el) => el === selectedEl());
628
+ let next = list[i + delta];
629
+ if (loop)
630
+ next = i + delta < 0 ? list[list.length - 1] : i + delta === list.length ? list[0] : list[i + delta];
631
+ pick(next);
632
+ };
633
+ const group = (delta) => {
634
+ let g = selectedEl()?.closest(GROUP);
635
+ let found;
636
+ while (g && !found) {
637
+ g = delta > 0 ? nextMatching(g, GROUP, 1) : nextMatching(g, GROUP, -1);
638
+ found = g?.querySelector(ENABLED_ITEM);
639
+ }
640
+ if (found)
641
+ pick(found);
642
+ else
643
+ step(delta);
644
+ };
645
+ const down = () => {
646
+ e.preventDefault();
647
+ if (e.metaKey)
648
+ last();
649
+ else if (e.altKey)
650
+ group(1);
651
+ else
652
+ step(1);
653
+ };
654
+ const up = () => {
655
+ e.preventDefault();
656
+ if (e.metaKey)
657
+ at(0);
658
+ else if (e.altKey)
659
+ group(-1);
660
+ else
661
+ step(-1);
662
+ };
663
+ switch (e.key) {
664
+ case `n`:
665
+ case `j`:
666
+ if (e.ctrlKey)
667
+ down();
668
+ break;
669
+ case `ArrowDown`:
670
+ down();
671
+ break;
672
+ case `p`:
673
+ case `k`:
674
+ if (e.ctrlKey)
675
+ up();
676
+ break;
677
+ case `ArrowUp`:
678
+ up();
679
+ break;
680
+ case `Home`:
681
+ e.preventDefault();
682
+ at(0);
683
+ break;
684
+ case `End`:
685
+ e.preventDefault();
686
+ last();
687
+ break;
688
+ case `Enter`: {
689
+ e.preventDefault();
690
+ selectedEl()?.dispatchEvent(new Event(COMMAND_SELECT_EVENT));
691
+ break;
692
+ }
693
+ }
694
+ }
695
+ };
696
+ }
697
+ function nextMatching(el, selector, dir) {
698
+ let n = dir > 0 ? el.nextElementSibling : el.previousElementSibling;
699
+ while (n) {
700
+ if (n.matches(selector))
701
+ return n;
702
+ n = dir > 0 ? n.nextElementSibling : n.previousElementSibling;
703
+ }
704
+ return null;
705
+ }
706
+ function commandItemValue(value, children, el, known) {
707
+ if (value !== undefined)
708
+ return value.trim();
709
+ if (typeof children === `string`)
710
+ return children.trim();
711
+ if (el)
712
+ return (el.textContent ?? ``).trim();
713
+ return known;
714
+ }
715
+ function observeCommandListHeight(list, sizer) {
716
+ if (typeof ResizeObserver === `undefined`)
717
+ return () => {};
718
+ let raf = 0;
719
+ const ro = new ResizeObserver(() => {
720
+ raf = requestAnimationFrame(() => list.style.setProperty(`--cmdk-list-height`, `${sizer.offsetHeight.toFixed(1)}px`));
721
+ });
722
+ ro.observe(sizer);
723
+ return () => {
724
+ cancelAnimationFrame(raf);
725
+ ro.unobserve(sizer);
726
+ };
727
+ }
728
+ // packages/exponential-ui/src/web/primitives/context-ring.ts
729
+ var RING_SIZE = 16;
730
+ var RING_STROKE = 2;
731
+ var RING_RADIUS = 6;
732
+ function ringGeometry(percent) {
733
+ const circumference = 2 * Math.PI * RING_RADIUS;
734
+ const clamped = Number.isFinite(percent) ? Math.min(100, Math.max(0, percent)) : 0;
735
+ return {
736
+ circumference,
737
+ dashOffset: circumference * (1 - clamped / 100)
738
+ };
739
+ }
740
+ var RING_TONE_CLASS = {
741
+ normal: `text-muted-foreground`,
742
+ warning: `text-amber-500`,
743
+ danger: `text-destructive`
744
+ };
745
+ var CONTEXT_RING_CLASSES = {
746
+ root: `shrink-0`,
747
+ svg: `-rotate-90`
748
+ };
749
+ // packages/exponential-ui/src/web/primitives/dialog-arms.ts
750
+ var MOBILE_SHEET_BASE = `max-sm:inset-x-0 max-sm:bottom-0 max-sm:w-full max-sm:rounded-t-3xl max-sm:border-t max-sm:border-glass-stroke-card max-sm:bg-glass-bottom max-sm:px-4 max-sm:pt-0 max-sm:pb-[max(1rem,env(safe-area-inset-bottom))] max-sm:motion-sheet max-sm:data-[state=closed]:slide-out-to-bottom max-sm:data-[state=open]:slide-in-from-bottom sm:p-6`;
751
+ var MOBILE_SHEET = `${MOBILE_SHEET_BASE} max-sm:h-auto max-sm:max-h-[90dvh]`;
752
+ var MOBILE_SHEET_FULL = `${MOBILE_SHEET_BASE} max-sm:h-[94dvh]`;
753
+ var MOBILE_ALERT = `max-sm:top-1/2 max-sm:left-1/2 max-sm:w-[calc(100%-3rem)] max-sm:max-w-sm max-sm:max-h-[calc(100dvh-3rem)] max-sm:-translate-x-1/2 max-sm:-translate-y-1/2 max-sm:rounded-2xl max-sm:border max-sm:border-glass-stroke-card max-sm:bg-glass-bottom max-sm:p-5 sm:p-6`;
754
+ var MOBILE_PAGE = `max-sm:inset-0 max-sm:w-full max-sm:bg-background max-sm:p-6 sm:p-6`;
755
+ var MOBILE_ARMS = {
756
+ sheet: MOBILE_SHEET,
757
+ [`sheet-full`]: MOBILE_SHEET_FULL,
758
+ alert: MOBILE_ALERT,
759
+ page: MOBILE_PAGE
760
+ };
761
+ // packages/exponential-ui/src/web/primitives/dialog.ts
762
+ var DIALOG_PHONE_QUERY = `(max-width: 639px)`;
763
+ var DIALOG_CLASSES = {
764
+ 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-fast data-[state=closed]:ease-accelerate data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-standard data-[state=open]:ease-decelerate`,
765
+ phoneSheet: `gap-4 overflow-hidden px-4 pt-0 pb-[max(1rem,env(safe-area-inset-bottom))] outline-none`,
766
+ phoneSheetFull: `h-[94dvh] max-h-[94dvh]`,
767
+ content: `fixed z-50 flex flex-col gap-4 overflow-hidden shadow-lg outline-none motion-dialog sm:inset-auto sm:top-[50%] sm:left-[50%] sm:max-h-[calc(100dvh-2rem)] sm:w-[calc(100%-2rem)] sm:max-w-lg sm:translate-x-[-50%] sm:translate-y-[-50%] sm:rounded-2xl sm:border sm:border-glass-stroke-card sm:bg-card/85 sm:shadow-2xl sm:shadow-black/40 sm:backdrop-blur-2xl`,
768
+ grabber: `hidden max-sm:block`,
769
+ dragClose: `hidden`,
770
+ 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-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,
771
+ closePhoneHidden: `max-sm:hidden`,
772
+ srOnly: `sr-only`,
773
+ header: `flex flex-col gap-2 text-left`,
774
+ body: `min-h-0 flex-1 overflow-y-auto`,
775
+ footer: `flex flex-col-reverse gap-2 max-sm:[&>[data-slot=button]]:h-10 max-sm:[&>[data-slot=button]]:w-full max-sm:[&>[data-slot=button]]:px-6 sm:flex-row sm:justify-end`,
776
+ cancelPhoneHidden: `max-sm:hidden`,
777
+ title: `text-lg leading-none font-semibold`,
778
+ description: `text-sm text-muted-foreground`
779
+ };
780
+ // packages/exponential-ui/src/web/primitives/disclosure-header.ts
781
+ var DISCLOSURE_HEADER_CLASSES = {
782
+ root: `flex w-full min-w-0 cursor-pointer items-center gap-2 rounded-sm text-left text-muted-foreground transition-colors duration-fast outline-none hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50`,
783
+ chevron: `size-3 shrink-0`,
784
+ chevronTrailing: `ml-auto`
785
+ };
786
+ // packages/exponential-ui/src/web/primitives/toast.ts
787
+ var TOAST_CONSTANTS = {
788
+ width: 356,
789
+ gap: 14,
790
+ peek: 14,
791
+ scaleStep: 0.05,
792
+ visible: 3,
793
+ durationMs: 4000,
794
+ swipeThreshold: 45,
795
+ viewportOffset: 24,
796
+ mobileViewportOffset: 16,
797
+ placement: { pointer: `bottom-right`, touch: `top-center` },
798
+ touchMaxWidth: 600,
799
+ kinds: [`success`, `error`, `info`, `warning`]
800
+ };
801
+ var TOAST_KINDS = TOAST_CONSTANTS.kinds;
802
+ var TOAST_TOUCH_QUERY = `(max-width: ${TOAST_CONSTANTS.touchMaxWidth}px)`;
803
+ var TOAST_CLASSES = {
804
+ region: `pointer-events-none fixed z-[100] flex`,
805
+ regionPlacement: {
806
+ "bottom-right": `right-6 bottom-6`,
807
+ "top-center": `inset-x-4 top-[calc(env(safe-area-inset-top,0px)+16px)] justify-center`
808
+ },
809
+ list: `pointer-events-auto relative m-0 w-[356px] max-w-full list-none p-0 transition-[height] duration-standard ease-standard`,
810
+ listPlacement: {
811
+ "bottom-right": ``,
812
+ "top-center": `w-full`
813
+ },
814
+ 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`,
815
+ toastOrigin: {
816
+ bottom: `origin-top`,
817
+ top: `origin-bottom`
818
+ },
819
+ content: `flex min-w-0 flex-1 flex-col gap-0.5`,
820
+ title: `leading-5 font-medium text-foreground`,
821
+ description: `leading-5 text-muted-foreground`,
822
+ 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`,
823
+ 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`,
824
+ iconSlot: `flex h-5 shrink-0 items-center`,
825
+ icon: `size-4 shrink-0`,
826
+ kindIcon: {
827
+ success: `text-green-500`,
828
+ error: `text-red-500`,
829
+ info: `text-blue-500`,
830
+ warning: `text-yellow-500`
831
+ }
832
+ };
833
+ var TOAST_KIND_GLYPH = {
834
+ success: `circle-check`,
835
+ error: `circle-x`,
836
+ info: `info`,
837
+ warning: `triangle-alert`
838
+ };
839
+ function toastPlacement(isTouch) {
840
+ const placement = isTouch ? TOAST_CONSTANTS.placement.touch : TOAST_CONSTANTS.placement.pointer;
841
+ return { placement, anchoredBottom: placement.startsWith(`bottom`) };
842
+ }
843
+ function stackGeometry(heights, expanded, anchoredBottom, constants) {
844
+ const { gap, peek, scaleStep, visible } = constants;
845
+ const n = heights.length;
846
+ if (n === 0)
847
+ return { height: 0, items: [] };
848
+ const rank = (i) => n - 1 - i;
849
+ if (expanded) {
850
+ const height = heights.reduce((sum, h) => sum + h, 0) + (n - 1) * gap;
851
+ const fromEdge = new Array(n);
852
+ let at = 0;
853
+ for (let i = n - 1;i >= 0; i--) {
854
+ fromEdge[i] = at;
855
+ at += heights[i] + gap;
856
+ }
857
+ return { height, items: heights.map((h, i) => ({ offset: anchoredBottom ? height - fromEdge[i] - h : fromEdge[i], scale: 1, visible: true })) };
858
+ }
859
+ const height = Math.max(...heights.map((h, i) => rank(i) * peek + h));
860
+ const items = heights.map((h, i) => {
861
+ const r = rank(i);
862
+ const scale = Math.round((1 - Math.min(r, visible - 1) * scaleStep) * 100) / 100;
863
+ return { offset: anchoredBottom ? height - r * peek - h : r * peek, scale, visible: r < visible };
864
+ });
865
+ return { height, items };
866
+ }
867
+ function toastStackGeometry(heights, expanded, anchoredBottom) {
868
+ return stackGeometry(heights, expanded, anchoredBottom, TOAST_CONSTANTS);
869
+ }
870
+ function createToastStore() {
871
+ let list = [];
872
+ const options = new Map;
873
+ const clocks = new Map;
874
+ const listeners = new Set;
875
+ let paused = false;
876
+ let counter = 0;
877
+ const emit = () => {
878
+ for (const l of [...listeners])
879
+ l(list);
880
+ };
881
+ const stop = (id) => {
882
+ const clock = clocks.get(id);
883
+ if (!clock?.timer)
884
+ return;
885
+ clearTimeout(clock.timer);
886
+ clock.timer = undefined;
887
+ clock.remaining = Math.max(0, clock.remaining - (Date.now() - clock.startedAt));
888
+ };
889
+ const start = (id) => {
890
+ const clock = clocks.get(id);
891
+ if (!clock || clock.timer || !Number.isFinite(clock.remaining))
892
+ return;
893
+ clock.startedAt = Date.now();
894
+ clock.timer = setTimeout(() => dismiss(id), clock.remaining);
895
+ };
896
+ const dismiss = (id) => {
897
+ const gone = id === undefined ? list : list.filter((t) => t.id === id);
898
+ if (gone.length === 0)
899
+ return;
900
+ for (const t of gone) {
901
+ const clock = clocks.get(t.id);
902
+ if (clock?.timer)
903
+ clearTimeout(clock.timer);
904
+ clocks.delete(t.id);
905
+ }
906
+ list = id === undefined ? [] : list.filter((t) => t.id !== id);
907
+ emit();
908
+ for (const t of gone) {
909
+ const o = options.get(t.id);
910
+ options.delete(t.id);
911
+ o?.onDismiss?.(t);
912
+ }
913
+ };
914
+ const add = (title, o = {}) => {
915
+ const id = o.id ?? `toast-${++counter}`;
916
+ const record = { id, kind: o.kind, title, description: o.description, action: o.action, duration: o.duration ?? TOAST_CONSTANTS.durationMs, height: o.height };
917
+ const old = clocks.get(id);
918
+ if (old?.timer)
919
+ clearTimeout(old.timer);
920
+ options.set(id, o);
921
+ clocks.set(id, { remaining: record.duration, startedAt: 0 });
922
+ const at = list.findIndex((t) => t.id === id);
923
+ list = at >= 0 ? list.map((t, i) => i === at ? record : t) : [...list, record];
924
+ if (!paused)
925
+ start(id);
926
+ emit();
927
+ return id;
928
+ };
929
+ const toast = (first, o) => typeof first === `string` ? add(first, o) : add(first.title, first);
930
+ for (const kind of TOAST_KINDS)
931
+ toast[kind] = (title, o) => add(title, { ...o, kind });
932
+ return {
933
+ toast,
934
+ dismiss,
935
+ toasts: () => list,
936
+ subscribe: (listener) => {
937
+ listeners.add(listener);
938
+ return () => listeners.delete(listener);
939
+ },
940
+ pauseAll: () => {
941
+ if (paused)
942
+ return;
943
+ paused = true;
944
+ for (const id of clocks.keys())
945
+ stop(id);
946
+ },
947
+ resumeAll: () => {
948
+ if (!paused)
949
+ return;
950
+ paused = false;
951
+ for (const id of clocks.keys())
952
+ start(id);
953
+ },
954
+ get paused() {
955
+ return paused;
956
+ }
957
+ };
958
+ }
959
+
960
+ // packages/exponential-ui/src/web/primitives/dock.ts
961
+ var DOCK_PILE_CONSTANTS = { peek: 14, scaleStep: 0.05, visible: 3, gap: 6 };
962
+ var DOCK_CARD_CLASSES = {
963
+ root: `${GLASS_CARD_CLASS} block w-full p-3 text-left outline-none`,
964
+ pressable: `cursor-pointer transition-colors duration-fast hover:bg-glass-active focus-visible:ring-[3px] focus-visible:ring-ring/50`,
965
+ body: `flex items-start gap-2 data-[hidden=true]:opacity-0`,
966
+ icon: `mt-0.5 size-3.5 shrink-0`,
967
+ text: `min-w-0 flex-1`,
968
+ header: `mb-1 flex items-center gap-2`,
969
+ label: `truncate text-xs font-medium`,
970
+ caption: `min-w-0 truncate text-xs text-muted-foreground`,
971
+ meta: `ml-auto shrink-0 text-xs text-muted-foreground`,
972
+ row: `flex min-w-0 items-center gap-2`,
973
+ title: `min-w-0 flex-1 truncate text-sm text-foreground/90`,
974
+ chevron: `size-3.5 shrink-0 text-muted-foreground`,
975
+ trailing: `shrink-0`,
976
+ tint: {
977
+ plan: `text-primary`,
978
+ question: `text-yellow-400`,
979
+ muted: `text-muted-foreground`,
980
+ warning: `text-amber-400`
981
+ }
982
+ };
983
+ var DOCK_PILE_CLASSES = {
984
+ root: `relative transition-[height] duration-slow ease-standard motion-reduce:transition-none`,
985
+ item: `absolute inset-x-0 top-(--offset) origin-top scale-(--scale) transition-[top,scale,opacity] duration-slow ease-standard motion-reduce:transition-none data-[visible=false]:pointer-events-none data-[visible=false]:opacity-0`
986
+ };
987
+ function dockPileGeometry(heights, expanded) {
988
+ return stackGeometry(heights, expanded, true, DOCK_PILE_CONSTANTS);
989
+ }
990
+ // packages/exponential-ui/src/web/primitives/menu-surface.ts
991
+ var MENU_SURFACE_CLASS = `z-50 rounded-lg border border-glass-stroke-card bg-glass-card-opaque text-popover-foreground motion-popover`;
992
+ var MENU_CONTENT_CLASS = `min-w-(--menu-min-width) max-w-(--menu-max-width) p-(--menu-surface-padding)`;
993
+ var MENU_ROW_BASE = `flex min-h-(--menu-item-height) cursor-pointer items-center gap-(--menu-item-gap) rounded-sm px-(--menu-item-padding-x) py-1 text-sm text-foreground/90 outline-hidden select-none focus:bg-glass-active focus:text-foreground data-[disabled]:cursor-default data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--menu-icon-size) [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!`;
994
+ var MENU_ITEM_CLASS = `relative ${MENU_ROW_BASE} data-[disabled]:pointer-events-none data-[disabled]:opacity-50`;
995
+ var MENU_SUB_TRIGGER_CLASS = `${MENU_ROW_BASE} whitespace-nowrap data-[state=open]:bg-glass-active data-[variant=destructive]:data-[state=open]:bg-destructive/10 data-[variant=destructive]:data-[state=open]:text-destructive [&>span+svg:last-child]:ml-0`;
996
+ var MENU_CHECK_ITEM_CLASS = `relative flex min-h-(--menu-item-height) cursor-pointer items-center gap-(--menu-item-gap) rounded-sm py-1 pr-(--menu-item-padding-x) pl-8 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)`;
997
+ var MENU_LABEL_CLASS = `px-(--menu-item-padding-x) py-1.5 text-sm font-medium data-[inset]:pl-8`;
998
+ var MENU_SEPARATOR_CLASS = `-mx-(--menu-surface-padding) my-(--menu-surface-padding) h-px bg-glass-stroke`;
999
+ var MENU_SHORTCUT_CLASS = `ml-auto text-xs tracking-widest text-muted-foreground`;
1000
+ var MENU_VALUE_CLASS = `min-w-0 max-w-[7rem] shrink text-right normal-case tracking-normal truncate`;
1001
+ var MENU_CHEVRON_CLASS = `ml-auto size-(--menu-icon-size) shrink-0`;
1002
+
1003
+ // packages/exponential-ui/src/web/primitives/dropdown-menu.ts
1004
+ var DROPDOWN_MENU_CLASSES = {
1005
+ content: `${MENU_SURFACE_CLASS} ${MENU_CONTENT_CLASS} max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto`,
1006
+ item: MENU_ITEM_CLASS,
1007
+ checkItem: MENU_CHECK_ITEM_CLASS,
1008
+ itemIndicator: `pointer-events-none absolute left-2 flex size-3.5 items-center justify-center`,
1009
+ checkIcon: `size-4`,
1010
+ radioIcon: `size-2 fill-current`,
1011
+ label: MENU_LABEL_CLASS,
1012
+ separator: MENU_SEPARATOR_CLASS,
1013
+ shortcut: MENU_SHORTCUT_CLASS,
1014
+ subTrigger: MENU_SUB_TRIGGER_CLASS,
1015
+ subChevron: MENU_CHEVRON_CLASS,
1016
+ subContent: `${MENU_SURFACE_CLASS} ${MENU_CONTENT_CLASS} origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden`
1017
+ };
1018
+ // packages/exponential-ui/src/web/primitives/empty-state.ts
1019
+ var EMPTY_STATE_SIZES = [`page`, `list`];
1020
+ var EMPTY_STATE_CLASSES = {
1021
+ list: `flex w-full flex-col items-center gap-1.5 px-3 py-6 text-center text-sm text-muted-foreground`,
1022
+ listIcon: `size-5 shrink-0 text-muted-foreground/60`,
1023
+ page: `mx-auto flex max-w-md flex-col items-center gap-3 px-6 py-12 text-center`,
1024
+ pageTitle: `text-lg font-semibold`,
1025
+ pageDescription: `text-sm text-muted-foreground`,
1026
+ pageActions: `mt-2 flex flex-wrap items-center justify-center gap-2`,
1027
+ listEmpty: `px-3 py-6 text-center text-sm text-muted-foreground`,
1028
+ cta: `flex w-full cursor-pointer flex-col items-start gap-1 rounded-md border border-dashed border-glass-stroke-strong p-3 text-left text-sm text-muted-foreground transition-colors duration-fast outline-none hover:bg-glass-row hover:text-foreground focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50`,
1029
+ ctaTitle: `flex items-center gap-2`,
1030
+ ctaIcon: `size-4 shrink-0`,
1031
+ ctaDescription: `text-xs`
1032
+ };
1033
+ // packages/exponential-ui/src/web/primitives/hover-card.ts
1034
+ var HOVER_CARD_DELAYS = { openDelay: 400, closeDelay: 100 };
1035
+ var HOVER_CARD_CLASSES = {
1036
+ content: `${MENU_SURFACE_CLASS} w-80 origin-(--radix-hover-card-content-transform-origin) p-3 outline-hidden`
1037
+ };
1038
+ // packages/exponential-ui/src/web/primitives/icon-disc.ts
1039
+ var ICON_DISC_TONES = [`primary`, `success`, `danger`, `muted`];
1040
+ var ICON_DISC_CLASSES = {
1041
+ root: `flex size-12 shrink-0 items-center justify-center rounded-full`,
1042
+ tones: {
1043
+ primary: `bg-primary/10 text-primary`,
1044
+ success: `bg-emerald-500/15 text-emerald-500`,
1045
+ danger: `bg-red-500/15 text-red-500`,
1046
+ muted: `bg-muted text-muted-foreground`
1047
+ },
1048
+ icon: `size-6`
1049
+ };
1050
+ // packages/exponential-ui/src/web/primitives/input.ts
1051
+ var BARE_FIELD_CLASS = `h-auto min-w-0 flex-1 rounded-none border-0 bg-transparent p-0 text-sm shadow-none focus-visible:border-0 focus-visible:ring-0 md:text-sm`;
1052
+ var FIELD_CHROME_CLASS = `h-9 w-full min-w-0 rounded-lg border border-glass-stroke-card bg-glass-card px-3 py-1 text-base shadow-none transition-[color,border-color] duration-fast outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-foreground/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm focus-visible:border-glass-stroke-active focus-visible:ring-0`;
1053
+ var INPUT_CLASSES = {
1054
+ root: `${FIELD_CHROME_CLASS} aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40`
1055
+ };
1056
+ // packages/exponential-ui/src/web/primitives/kbd.ts
1057
+ var KBD_CLASSES = {
1058
+ root: `pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm bg-muted px-1 font-sans text-xs font-medium text-muted-foreground select-none [&_svg:not([class*='size-'])]:size-3`,
1059
+ group: `inline-flex items-center gap-1`
1060
+ };
1061
+ // packages/exponential-ui/src/web/primitives/label.ts
1062
+ var LABEL_CLASSES = {
1063
+ root: `flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`
1064
+ };
1065
+ // packages/exponential-ui/src/web/primitives/meter.ts
1066
+ var METER_CLASSES = {
1067
+ root: `h-1.5 bg-glass-stroke-strong`,
1068
+ tones: {
1069
+ normal: `[&_[data-slot=progress-indicator]]:bg-foreground/30`,
1070
+ warning: `[&_[data-slot=progress-indicator]]:bg-amber-500`,
1071
+ danger: `[&_[data-slot=progress-indicator]]:bg-destructive`
1072
+ }
1073
+ };
1074
+ // packages/exponential-ui/src/web/primitives/popover.ts
1075
+ var POPOVER_CLASSES = {
1076
+ content: `${MENU_SURFACE_CLASS} w-72 origin-(--radix-popover-content-transform-origin) p-4 outline-hidden`
1077
+ };
1078
+ // packages/exponential-ui/src/web/primitives/progress-ring.ts
1079
+ function progressRingPercent(done, total) {
1080
+ if (!Number.isFinite(done) || !Number.isFinite(total) || total <= 0)
1081
+ return 0;
1082
+ return Math.min(Math.max(done, 0), total) / total * 100;
1083
+ }
1084
+ var PROGRESS_RING_CLASSES = {
1085
+ root: `shrink-0 -rotate-90`
1086
+ };
1087
+ // packages/exponential-ui/src/web/primitives/progress.ts
1088
+ var PROGRESS_CLASSES = {
1089
+ root: `bg-primary/20 relative h-2 w-full overflow-hidden rounded-full`,
1090
+ indicator: `bg-primary h-full flex-1 transition-all`,
1091
+ indicatorIndeterminate: `w-1/3 motion-safe:animate-progress-indeterminate motion-reduce:opacity-60`,
1092
+ indicatorDeterminate: `w-full`
1093
+ };
1094
+ function progressIndicatorTransform(value) {
1095
+ return `translateX(-${100 - (value || 0)}%)`;
1096
+ }
1097
+ // packages/exponential-ui/src/web/primitives/scroll-area.ts
1098
+ var SCROLL_AREA_CLASSES = {
1099
+ root: `relative`,
1100
+ viewport: `size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1`,
1101
+ scrollbar: `flex touch-none p-px transition-colors select-none`,
1102
+ orientations: {
1103
+ vertical: `h-full w-2.5 border-l border-l-transparent`,
1104
+ horizontal: `h-2.5 flex-col border-t border-t-transparent`
1105
+ },
1106
+ thumb: `relative flex-1 rounded-full bg-border`
1107
+ };
1108
+ var 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}`;
1109
+ function scrollAreaRootStyle(cornerWidth, cornerHeight) {
1110
+ return { position: `relative`, "--radix-scroll-area-corner-width": `${cornerWidth}px`, "--radix-scroll-area-corner-height": `${cornerHeight}px` };
1111
+ }
1112
+ function scrollAreaViewportStyle(xEnabled, yEnabled) {
1113
+ return { "overflow-x": xEnabled ? `scroll` : `hidden`, "overflow-y": yEnabled ? `scroll` : `hidden` };
1114
+ }
1115
+ var SCROLL_AREA_CONTENT_STYLE = { "min-width": `100%`, display: `table` };
1116
+ function scrollAreaScrollbarStyle(orientation, dir, thumbSize) {
1117
+ if (orientation === `horizontal`) {
1118
+ return { position: `absolute`, bottom: `0`, left: dir === `rtl` ? `var(--radix-scroll-area-corner-width)` : `0`, right: dir === `ltr` ? `var(--radix-scroll-area-corner-width)` : `0`, "--radix-scroll-area-thumb-width": `${thumbSize}px` };
1119
+ }
1120
+ const s = { position: `absolute`, top: `0` };
1121
+ if (dir === `ltr`)
1122
+ s.right = `0`;
1123
+ if (dir === `rtl`)
1124
+ s.left = `0`;
1125
+ s.bottom = `var(--radix-scroll-area-corner-height)`;
1126
+ s[`--radix-scroll-area-thumb-height`] = `${thumbSize}px`;
1127
+ return s;
1128
+ }
1129
+ var SCROLL_AREA_THUMB_STYLE = { width: `var(--radix-scroll-area-thumb-width)`, height: `var(--radix-scroll-area-thumb-height)` };
1130
+ function scrollAreaCornerStyle(width, height, dir) {
1131
+ const s = { width: `${width}px`, height: `${height}px`, position: `absolute` };
1132
+ if (dir === `ltr`)
1133
+ s.right = `0`;
1134
+ if (dir === `rtl`)
1135
+ s.left = `0`;
1136
+ s.bottom = `0`;
1137
+ return s;
1138
+ }
1139
+ var scrollAreaVisibility = (visible) => visible ? `visible` : `hidden`;
1140
+ var SCROLL_AREA_SCROLL_MACHINE = {
1141
+ hidden: { SCROLL: `scrolling` },
1142
+ scrolling: { SCROLL_END: `idle`, POINTER_ENTER: `interacting` },
1143
+ interacting: { SCROLL: `interacting`, POINTER_LEAVE: `idle` },
1144
+ idle: { HIDE: `hidden`, SCROLL: `scrolling`, POINTER_ENTER: `interacting` }
1145
+ };
1146
+ var SCROLL_AREA_SCROLL_INITIAL = `hidden`;
1147
+ var scrollAreaThumbRatio = (viewport, content) => {
1148
+ const ratio = viewport / content;
1149
+ return isNaN(ratio) ? 0 : ratio;
1150
+ };
1151
+ function scrollAreaThumbSize(sizes) {
1152
+ const padding = sizes.scrollbar.paddingStart + sizes.scrollbar.paddingEnd;
1153
+ return Math.max((sizes.scrollbar.size - padding) * scrollAreaThumbRatio(sizes.viewport, sizes.content), 18);
1154
+ }
1155
+ var linearScale = (input, output) => (value) => {
1156
+ if (input[0] === input[1] || output[0] === output[1])
1157
+ return output[0];
1158
+ return output[0] + (output[1] - output[0]) / (input[1] - input[0]) * (value - input[0]);
1159
+ };
1160
+ function scrollAreaScrollFromPointer(pointer, pointerOffset, sizes, dir = `ltr`) {
1161
+ const size = scrollAreaThumbSize(sizes);
1162
+ const offset = pointerOffset || size / 2;
1163
+ const min = sizes.scrollbar.paddingStart + offset;
1164
+ const max = sizes.scrollbar.size - sizes.scrollbar.paddingEnd - (size - offset);
1165
+ const maxScroll = sizes.content - sizes.viewport;
1166
+ return linearScale([min, max], dir === `ltr` ? [0, maxScroll] : [maxScroll * -1, 0])(pointer);
1167
+ }
1168
+ function scrollAreaThumbOffset(scroll, sizes, dir = `ltr`) {
1169
+ const size = scrollAreaThumbSize(sizes);
1170
+ const bar = sizes.scrollbar.size - sizes.scrollbar.paddingStart - sizes.scrollbar.paddingEnd;
1171
+ const maxScroll = sizes.content - sizes.viewport;
1172
+ const [lo, hi] = dir === `ltr` ? [0, maxScroll] : [maxScroll * -1, 0];
1173
+ const clamped = Math.min(hi, Math.max(lo, scroll));
1174
+ return linearScale([0, maxScroll], [0, bar - size])(clamped);
1175
+ }
1176
+ // packages/exponential-ui/src/web/primitives/tabs.ts
1177
+ var 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`;
1178
+ var SEGMENTED_ROW = `flex shrink-0 items-center justify-between gap-2 px-4 pt-3 pb-2 md:px-6`;
1179
+ var SEGMENTED_ROW_COMPACT = `flex shrink-0 items-center justify-between gap-2 px-2 pt-2 pb-2`;
1180
+ var SEGMENTED_TAB = `px-3`;
1181
+ var 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`;
1182
+ var TABS_CLASSES = {
1183
+ root: `flex flex-col gap-2`,
1184
+ list: SEGMENTED_LIST,
1185
+ trigger: `${SEGMENTED_ITEM} 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`,
1186
+ content: `flex-1 outline-none`
1187
+ };
1188
+
1189
+ // packages/exponential-ui/src/web/primitives/segmented-control.ts
1190
+ var SEGMENTED_CONTROL_CLASSES = {
1191
+ trigger: SEGMENTED_TAB,
1192
+ fill: `w-full`
1193
+ };
1194
+ // packages/exponential-ui/src/web/primitives/select.ts
1195
+ var SELECT_CLASSES = {
1196
+ 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`,
1197
+ triggerIcon: `size-4 opacity-50`,
1198
+ content: `${MENU_SURFACE_CLASS} 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`,
1199
+ 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`,
1200
+ viewport: `p-(--menu-surface-padding)`,
1201
+ viewportPopper: `h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1`,
1202
+ label: `px-(--menu-item-padding-x) py-1.5 text-xs text-muted-foreground`,
1203
+ 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`,
1204
+ itemIndicator: `absolute right-2 flex size-3.5 items-center justify-center`,
1205
+ itemCheck: `size-4`,
1206
+ separator: `pointer-events-none -mx-1 my-1 h-px bg-glass-stroke`,
1207
+ scrollButton: `flex cursor-default items-center justify-center py-1`,
1208
+ scrollIcon: `size-4`
1209
+ };
1210
+ var SELECT_INLINE = {
1211
+ value: { "pointer-events": `none` },
1212
+ wrapper: { display: `flex`, "flex-direction": `column`, position: `fixed` },
1213
+ viewport: { position: `relative`, flex: `1`, overflow: `hidden auto` },
1214
+ scrollButton: { "flex-shrink": `0` },
1215
+ expandEnd: `flex-end`
1216
+ };
1217
+ var SELECT_VIEWPORT_ATTR = `data-radix-select-viewport`;
1218
+ var SELECT_VIEWPORT_CSS = `[${SELECT_VIEWPORT_ATTR}]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[${SELECT_VIEWPORT_ATTR}]::-webkit-scrollbar{display:none}`;
1219
+ function selectItemAlignedContentStyle(pointerEvents) {
1220
+ return { "box-sizing": `border-box`, "max-height": `100%`, "pointer-events": pointerEvents, display: `flex`, "flex-direction": `column`, outline: `none` };
1221
+ }
1222
+ function selectPopperContentStyle(pointerEvents, positioned) {
1223
+ return {
1224
+ "box-sizing": `border-box`,
1225
+ "pointer-events": pointerEvents,
1226
+ display: `flex`,
1227
+ "flex-direction": `column`,
1228
+ outline: `none`,
1229
+ "--radix-select-content-transform-origin": `var(--radix-popper-transform-origin)`,
1230
+ "--radix-select-content-available-width": `var(--radix-popper-available-width)`,
1231
+ "--radix-select-content-available-height": `var(--radix-popper-available-height)`,
1232
+ "--radix-select-trigger-width": `var(--radix-popper-anchor-width)`,
1233
+ "--radix-select-trigger-height": `var(--radix-popper-anchor-height)`,
1234
+ animation: positioned ? undefined : `none`
1235
+ };
1236
+ }
1237
+ // packages/exponential-ui/src/web/primitives/separator.ts
1238
+ var SEPARATOR_CLASSES = {
1239
+ 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`
1240
+ };
1241
+ // packages/exponential-ui/src/web/primitives/sheet-chrome.ts
1242
+ var SHEET_CHROME_CLASSES = {
1243
+ grabber: `mx-auto mt-2 -mb-1 h-1 w-9 shrink-0 rounded-full bg-foreground/30`
1244
+ };
1245
+ // packages/exponential-ui/src/web/primitives/sheet.ts
1246
+ var SHEET_CLASSES = {
1247
+ 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`,
1248
+ content: `group/sheet fixed z-50 flex flex-col gap-4 border-glass-stroke-card shadow-lg motion-sheet`,
1249
+ sides: {
1250
+ right: `inset-y-0 right-0 h-full w-3/4 rounded-l-3xl border-l bg-card/85 backdrop-blur-2xl data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm`,
1251
+ left: `inset-y-0 left-0 h-full w-3/4 rounded-r-3xl border-r bg-card/85 backdrop-blur-2xl data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm`,
1252
+ top: `inset-x-0 top-0 h-auto rounded-b-3xl border-b bg-card/85 backdrop-blur-2xl data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top`,
1253
+ bottom: `inset-x-0 bottom-0 h-auto max-h-[90dvh] rounded-t-3xl border-t bg-glass-bottom data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom`
1254
+ },
1255
+ dragClose: `hidden`,
1256
+ 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`,
1257
+ closeIcon: `size-4`,
1258
+ srOnly: `sr-only`,
1259
+ header: `flex flex-col gap-1.5 p-4 text-left`,
1260
+ footer: `mt-auto flex flex-col gap-2 p-4`,
1261
+ title: `font-semibold text-foreground max-sm:group-data-[side=bottom]/sheet:text-lg max-sm:group-data-[side=bottom]/sheet:leading-none`,
1262
+ description: `text-sm text-muted-foreground`
1263
+ };
1264
+ // packages/exponential-ui/src/web/primitives/skeleton.ts
1265
+ var SKELETON_CLASSES = {
1266
+ root: `animate-pulse rounded-md bg-accent`
1267
+ };
1268
+ // packages/exponential-ui/src/web/primitives/spinner.ts
1269
+ var SPINNER_CLASSES = {
1270
+ root: `shrink-0 animate-spin text-muted-foreground`
1271
+ };
1272
+ // packages/exponential-ui/src/web/primitives/switch.ts
1273
+ var SWITCH_CLASSES = {
1274
+ 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`,
1275
+ 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`
1276
+ };
1277
+ // packages/exponential-ui/src/web/primitives/table.ts
1278
+ var TABLE_CLASSES = {
1279
+ container: `relative w-full overflow-x-auto`,
1280
+ root: `w-full caption-bottom border-collapse text-sm`,
1281
+ header: `[&_tr]:hover:bg-transparent`,
1282
+ body: `[&_tr:last-child]:border-0`,
1283
+ footer: `border-t border-border font-medium [&>tr]:last:border-b-0`,
1284
+ row: `border-b border-border transition-colors duration-fast hover:bg-glass-row data-[state=selected]:bg-glass-active`,
1285
+ head: `px-3 py-2 text-left align-middle text-xs font-medium whitespace-nowrap text-muted-foreground [&:has([role=checkbox])]:pr-0`,
1286
+ cell: `px-3 py-2 align-middle text-sm whitespace-nowrap [&:has([role=checkbox])]:pr-0`,
1287
+ caption: `mt-4 text-sm text-muted-foreground`
1288
+ };
1289
+ // packages/exponential-ui/src/web/primitives/textarea.ts
1290
+ var TEXTAREA_CLASSES = {
1291
+ 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`
1292
+ };
1293
+ // packages/exponential-ui/src/web/primitives/tooltip.ts
1294
+ var TOOLTIP_CLASSES = {
1295
+ 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`
1296
+ };
1297
+ // packages/exponential-ui/src/web/primitives/truncate.ts
1298
+ function middleTruncate(value, max) {
1299
+ if (max <= 0)
1300
+ return value;
1301
+ const chars = [...value];
1302
+ if (chars.length <= max)
1303
+ return value;
1304
+ if (max < 3)
1305
+ return value;
1306
+ const keep = max - 1;
1307
+ const head = Math.floor(keep / 2);
1308
+ const tail = keep - head;
1309
+ return `${chars.slice(0, head).join(``)}…${chars.slice(chars.length - tail).join(``)}`;
1310
+ }
1311
+ // packages/exponential-ui/src/web/primitives/typeahead-portal.ts
1312
+ var TYPEAHEAD_PORTAL_SELECTOR = `[data-editor-autocomplete]`;
1313
+ function isTypeaheadPortalInteraction(event) {
1314
+ return event.target instanceof Element && event.target.closest(TYPEAHEAD_PORTAL_SELECTOR) !== null;
1315
+ }
1316
+ export {
1317
+ ALERT_CLASSES,
1318
+ ALERT_DIALOG_CLASSES,
1319
+ AVATAR_CLASSES,
1320
+ AVATAR_HUE_COUNT,
1321
+ BADGE_CLASSES,
1322
+ BARE_FIELD_CLASS,
1323
+ BREADCRUMB_CLASSES,
1324
+ CALENDAR_CLASSES,
1325
+ CARD_CLASSES,
1326
+ CHECKBOX_CLASSES,
1327
+ CHOICE_TILES_CLASSES,
1328
+ CODE_BLOCK_CLASSES,
1329
+ CODE_TOKEN_CLASS,
1330
+ COMMAND_CLASSES,
1331
+ COMMAND_LABEL_STYLE,
1332
+ COMMAND_SELECT_EVENT,
1333
+ CONTEXT_RING_CLASSES,
1334
+ DIALOG_CLASSES,
1335
+ DIALOG_PHONE_QUERY,
1336
+ DISCLOSURE_HEADER_CLASSES,
1337
+ DOCK_CARD_CLASSES,
1338
+ DOCK_PILE_CLASSES,
1339
+ DOCK_PILE_CONSTANTS,
1340
+ DROPDOWN_MENU_CLASSES,
1341
+ EMPTY_STATE_CLASSES,
1342
+ EMPTY_STATE_SIZES,
1343
+ FIELD_CHROME_CLASS,
1344
+ GLASS_CARD_CLASS,
1345
+ GLASS_CARD_CLASSES,
1346
+ HOVER_CARD_CLASSES,
1347
+ HOVER_CARD_DELAYS,
1348
+ ICON_DISC_CLASSES,
1349
+ ICON_DISC_TONES,
1350
+ INPUT_CLASSES,
1351
+ KBD_CLASSES,
1352
+ LABEL_CLASSES,
1353
+ MENU_CHECK_ITEM_CLASS,
1354
+ MENU_CHEVRON_CLASS,
1355
+ MENU_CONTENT_CLASS,
1356
+ MENU_ITEM_CLASS,
1357
+ MENU_LABEL_CLASS,
1358
+ MENU_SEPARATOR_CLASS,
1359
+ MENU_SHORTCUT_CLASS,
1360
+ MENU_SUB_TRIGGER_CLASS,
1361
+ MENU_SURFACE_CLASS,
1362
+ MENU_VALUE_CLASS,
1363
+ METER_CLASSES,
1364
+ MOBILE_ALERT,
1365
+ MOBILE_ARMS,
1366
+ MOBILE_PAGE,
1367
+ MOBILE_SHEET,
1368
+ MOBILE_SHEET_FULL,
1369
+ POPOVER_CLASSES,
1370
+ PROGRESS_CLASSES,
1371
+ PROGRESS_RING_CLASSES,
1372
+ RING_RADIUS,
1373
+ RING_SIZE,
1374
+ RING_STROKE,
1375
+ RING_TONE_CLASS,
1376
+ SCROLL_AREA_CLASSES,
1377
+ SCROLL_AREA_CONTENT_STYLE,
1378
+ SCROLL_AREA_SCROLL_INITIAL,
1379
+ SCROLL_AREA_SCROLL_MACHINE,
1380
+ SCROLL_AREA_THUMB_STYLE,
1381
+ SCROLL_AREA_VIEWPORT_CSS,
1382
+ SEGMENTED_CONTROL_CLASSES,
1383
+ SEGMENTED_ITEM,
1384
+ SEGMENTED_LIST,
1385
+ SEGMENTED_ROW,
1386
+ SEGMENTED_ROW_COMPACT,
1387
+ SEGMENTED_TAB,
1388
+ SELECT_CLASSES,
1389
+ SELECT_INLINE,
1390
+ SELECT_VIEWPORT_ATTR,
1391
+ SELECT_VIEWPORT_CSS,
1392
+ SEPARATOR_CLASSES,
1393
+ SHEET_CHROME_CLASSES,
1394
+ SHEET_CLASSES,
1395
+ SKELETON_CLASSES,
1396
+ SPINNER_CLASSES,
1397
+ SWITCH_CLASSES,
1398
+ TABLE_CLASSES,
1399
+ TABS_CLASSES,
1400
+ TEXTAREA_CLASSES,
1401
+ TOAST_CLASSES,
1402
+ TOAST_CONSTANTS,
1403
+ TOAST_KINDS,
1404
+ TOAST_KIND_GLYPH,
1405
+ TOAST_TOUCH_QUERY,
1406
+ TOOLTIP_CLASSES,
1407
+ TYPEAHEAD_PORTAL_SELECTOR,
1408
+ alertVariants,
1409
+ avatarFallbackColors,
1410
+ avatarFallbackHue,
1411
+ avatarHueIndex,
1412
+ badgeLabel,
1413
+ buttonVariants,
1414
+ choiceColumns,
1415
+ choiceToggle,
1416
+ choiceValues,
1417
+ cn,
1418
+ codeBlockLineVariants,
1419
+ codeBlockVariants,
1420
+ commandItemValue,
1421
+ commandScore,
1422
+ createCommandStore,
1423
+ createToastStore,
1424
+ dockPileGeometry,
1425
+ filterCommandItems,
1426
+ getInitials,
1427
+ isTypeaheadPortalInteraction,
1428
+ middleTruncate,
1429
+ observeCommandListHeight,
1430
+ progressIndicatorTransform,
1431
+ progressRingPercent,
1432
+ ringGeometry,
1433
+ scrollAreaCornerStyle,
1434
+ scrollAreaRootStyle,
1435
+ scrollAreaScrollFromPointer,
1436
+ scrollAreaScrollbarStyle,
1437
+ scrollAreaThumbOffset,
1438
+ scrollAreaThumbRatio,
1439
+ scrollAreaThumbSize,
1440
+ scrollAreaViewportStyle,
1441
+ scrollAreaVisibility,
1442
+ selectItemAlignedContentStyle,
1443
+ selectPopperContentStyle,
1444
+ stackGeometry,
1445
+ toastPlacement,
1446
+ toastStackGeometry
1447
+ };
1448
+
1449
+ //# debugId=CD543CBDC0BE10E764756E2164756E21
1450
+ //# sourceMappingURL=index.js.map