aeon-ui-engine 1.0.3 → 1.2.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 (365) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CONSUMER.md +82 -40
  3. package/README.md +47 -16
  4. package/package.json +9 -2
  5. package/packages/cli/README.md +17 -0
  6. package/packages/cli/dist/bin.d.ts +1 -0
  7. package/packages/cli/dist/bin.js +35 -0
  8. package/packages/cli/dist/chunk-IW5NT2Z2.js +103 -0
  9. package/packages/cli/dist/index.d.ts +10 -0
  10. package/packages/cli/dist/index.js +6 -0
  11. package/packages/cli/node_modules/.bin/esbuild +21 -0
  12. package/packages/cli/node_modules/.bin/jiti +21 -0
  13. package/packages/cli/node_modules/.bin/tsc +21 -0
  14. package/packages/cli/node_modules/.bin/tsserver +21 -0
  15. package/packages/cli/node_modules/.bin/tsup +21 -0
  16. package/packages/cli/node_modules/.bin/tsup-node +21 -0
  17. package/packages/cli/node_modules/.bin/tsx +21 -0
  18. package/packages/cli/node_modules/.bin/vite +21 -0
  19. package/packages/cli/node_modules/.bin/vitest +21 -0
  20. package/packages/cli/package.json +50 -0
  21. package/packages/cli/src/bin.ts +34 -0
  22. package/packages/cli/src/index.ts +1 -0
  23. package/packages/cli/src/init.ts +107 -0
  24. package/packages/cli/tsconfig.json +10 -0
  25. package/packages/core/README.md +7 -1
  26. package/packages/core/dist/index.d.ts +255 -7
  27. package/packages/core/dist/index.js +372 -2
  28. package/packages/core/node_modules/.bin/esbuild +4 -4
  29. package/packages/core/node_modules/.bin/vite +4 -4
  30. package/packages/core/node_modules/.bin/vitest +2 -2
  31. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  32. package/packages/core/package.json +17 -5
  33. package/packages/core/src/anatomy.ts +234 -5
  34. package/packages/core/src/brand-theme.ts +172 -0
  35. package/packages/core/src/index.ts +1 -0
  36. package/packages/core/src/machine.test.ts +62 -1
  37. package/packages/core/src/machine.ts +93 -0
  38. package/packages/core/src/theme.ts +105 -0
  39. package/packages/panda/aeon.css +8 -0
  40. package/packages/panda/package.json +1 -1
  41. package/packages/panda/panda.config.ts +58 -1
  42. package/packages/panda/src/recipes/app-shell.ts +137 -0
  43. package/packages/panda/src/recipes/avatar.ts +131 -0
  44. package/packages/panda/src/recipes/bar.ts +206 -0
  45. package/packages/panda/src/recipes/button-group.ts +12 -4
  46. package/packages/panda/src/recipes/button.ts +1 -0
  47. package/packages/panda/src/recipes/combobox.ts +2 -1
  48. package/packages/panda/src/recipes/composer.ts +81 -0
  49. package/packages/panda/src/recipes/content.ts +104 -0
  50. package/packages/panda/src/recipes/conversation.ts +106 -0
  51. package/packages/panda/src/recipes/entry.ts +217 -0
  52. package/packages/panda/src/recipes/field.ts +12 -2
  53. package/packages/panda/src/recipes/floating.ts +26 -13
  54. package/packages/panda/src/recipes/identity.ts +73 -0
  55. package/packages/panda/src/recipes/index.ts +15 -0
  56. package/packages/panda/src/recipes/list-row.ts +109 -0
  57. package/packages/panda/src/recipes/metric-strip.ts +80 -0
  58. package/packages/panda/src/recipes/nav.ts +155 -0
  59. package/packages/panda/src/recipes/panel.ts +156 -0
  60. package/packages/panda/src/recipes/pin-input.ts +3 -2
  61. package/packages/panda/src/recipes/profile-header.ts +120 -0
  62. package/packages/panda/src/recipes/select.ts +2 -1
  63. package/packages/panda/src/recipes/slider.ts +6 -4
  64. package/packages/panda/src/recipes/theme-switcher.ts +110 -0
  65. package/packages/panda/src/recipes/thread.ts +88 -0
  66. package/packages/panda/src/theme/catalog-types.ts +2 -0
  67. package/packages/panda/src/theme/catalog.ts +23 -0
  68. package/packages/panda/src/theme/chrome.css +2 -1
  69. package/packages/panda/src/theme/consumer-shell.css +129 -0
  70. package/packages/panda/src/theme/electron.css +30 -0
  71. package/packages/panda/src/theme/global-theme-css.ts +9 -0
  72. package/packages/panda/src/theme/omarchy.themes.ts +607 -0
  73. package/packages/panda/src/theme/palette.ts +3 -0
  74. package/packages/panda/src/theme/scrollbars.css +58 -21
  75. package/packages/panda/src/theme/themes.config.ts +39 -1
  76. package/packages/panda/styled-system/css/conditions.mjs +1 -1
  77. package/packages/panda/styled-system/css/css.mjs +1 -1
  78. package/packages/panda/styled-system/css/sva.mjs +9 -4
  79. package/packages/panda/styled-system/helpers.mjs +11 -22
  80. package/packages/panda/styled-system/jsx/create-style-context.d.ts +54 -0
  81. package/packages/panda/styled-system/jsx/create-style-context.mjs +121 -0
  82. package/packages/panda/styled-system/jsx/factory.mjs +14 -5
  83. package/packages/panda/styled-system/jsx/index.d.ts +1 -0
  84. package/packages/panda/styled-system/jsx/index.mjs +1 -0
  85. package/packages/panda/styled-system/jsx/is-valid-prop.mjs +2 -2
  86. package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +0 -1
  87. package/packages/panda/styled-system/patterns/bleed.d.ts +0 -1
  88. package/packages/panda/styled-system/patterns/box.d.ts +0 -1
  89. package/packages/panda/styled-system/patterns/center.d.ts +0 -1
  90. package/packages/panda/styled-system/patterns/circle.d.ts +0 -1
  91. package/packages/panda/styled-system/patterns/container.d.ts +0 -1
  92. package/packages/panda/styled-system/patterns/cq.d.ts +0 -1
  93. package/packages/panda/styled-system/patterns/divider.d.ts +0 -1
  94. package/packages/panda/styled-system/patterns/flex.d.ts +0 -1
  95. package/packages/panda/styled-system/patterns/float.d.ts +0 -1
  96. package/packages/panda/styled-system/patterns/grid-item.d.ts +0 -1
  97. package/packages/panda/styled-system/patterns/grid.d.ts +0 -1
  98. package/packages/panda/styled-system/patterns/grid.mjs +1 -1
  99. package/packages/panda/styled-system/patterns/hstack.d.ts +0 -1
  100. package/packages/panda/styled-system/patterns/hstack.mjs +1 -1
  101. package/packages/panda/styled-system/patterns/link-overlay.d.ts +0 -1
  102. package/packages/panda/styled-system/patterns/spacer.d.ts +0 -1
  103. package/packages/panda/styled-system/patterns/spacer.mjs +6 -2
  104. package/packages/panda/styled-system/patterns/square.d.ts +0 -1
  105. package/packages/panda/styled-system/patterns/stack.d.ts +0 -1
  106. package/packages/panda/styled-system/patterns/stack.mjs +1 -1
  107. package/packages/panda/styled-system/patterns/visually-hidden.d.ts +0 -1
  108. package/packages/panda/styled-system/patterns/vstack.d.ts +0 -1
  109. package/packages/panda/styled-system/patterns/vstack.mjs +1 -1
  110. package/packages/panda/styled-system/patterns/wrap.d.ts +0 -1
  111. package/packages/panda/styled-system/patterns/wrap.mjs +1 -1
  112. package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +4 -3
  113. package/packages/panda/styled-system/recipes/aeon-accordion.mjs +1 -0
  114. package/packages/panda/styled-system/recipes/aeon-app-shell.d.ts +34 -0
  115. package/packages/panda/styled-system/recipes/aeon-app-shell.mjs +70 -0
  116. package/packages/panda/styled-system/recipes/aeon-async.d.ts +4 -3
  117. package/packages/panda/styled-system/recipes/aeon-async.mjs +1 -0
  118. package/packages/panda/styled-system/recipes/aeon-avatar.d.ts +36 -0
  119. package/packages/panda/styled-system/recipes/aeon-avatar.mjs +57 -0
  120. package/packages/panda/styled-system/recipes/aeon-badge.d.ts +3 -0
  121. package/packages/panda/styled-system/recipes/aeon-bar.d.ts +40 -0
  122. package/packages/panda/styled-system/recipes/aeon-bar.mjs +77 -0
  123. package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +3 -2
  124. package/packages/panda/styled-system/recipes/aeon-button.d.ts +3 -2
  125. package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +4 -1
  126. package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +1 -0
  127. package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +4 -3
  128. package/packages/panda/styled-system/recipes/aeon-combobox.mjs +1 -0
  129. package/packages/panda/styled-system/recipes/aeon-composer.d.ts +31 -0
  130. package/packages/panda/styled-system/recipes/aeon-composer.mjs +45 -0
  131. package/packages/panda/styled-system/recipes/aeon-content.d.ts +34 -0
  132. package/packages/panda/styled-system/recipes/aeon-content.mjs +70 -0
  133. package/packages/panda/styled-system/recipes/aeon-conversation.d.ts +31 -0
  134. package/packages/panda/styled-system/recipes/aeon-conversation.mjs +61 -0
  135. package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +4 -1
  136. package/packages/panda/styled-system/recipes/aeon-dialog.mjs +1 -0
  137. package/packages/panda/styled-system/recipes/aeon-entry.d.ts +38 -0
  138. package/packages/panda/styled-system/recipes/aeon-entry.mjs +100 -0
  139. package/packages/panda/styled-system/recipes/aeon-field.d.ts +4 -3
  140. package/packages/panda/styled-system/recipes/aeon-field.mjs +1 -0
  141. package/packages/panda/styled-system/recipes/aeon-identity.d.ts +36 -0
  142. package/packages/panda/styled-system/recipes/aeon-identity.mjs +63 -0
  143. package/packages/panda/styled-system/recipes/aeon-list-row.d.ts +33 -0
  144. package/packages/panda/styled-system/recipes/aeon-list-row.mjs +49 -0
  145. package/packages/panda/styled-system/recipes/aeon-menu.d.ts +4 -1
  146. package/packages/panda/styled-system/recipes/aeon-menu.mjs +1 -0
  147. package/packages/panda/styled-system/recipes/aeon-metric-strip.d.ts +36 -0
  148. package/packages/panda/styled-system/recipes/aeon-metric-strip.mjs +54 -0
  149. package/packages/panda/styled-system/recipes/aeon-nav.d.ts +38 -0
  150. package/packages/panda/styled-system/recipes/aeon-nav.mjs +69 -0
  151. package/packages/panda/styled-system/recipes/aeon-panel.d.ts +34 -0
  152. package/packages/panda/styled-system/recipes/aeon-panel.mjs +58 -0
  153. package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +4 -1
  154. package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +1 -0
  155. package/packages/panda/styled-system/recipes/aeon-popover.d.ts +4 -1
  156. package/packages/panda/styled-system/recipes/aeon-popover.mjs +1 -0
  157. package/packages/panda/styled-system/recipes/aeon-profile-header.d.ts +36 -0
  158. package/packages/panda/styled-system/recipes/aeon-profile-header.mjs +62 -0
  159. package/packages/panda/styled-system/recipes/aeon-progress.d.ts +4 -1
  160. package/packages/panda/styled-system/recipes/aeon-progress.mjs +1 -0
  161. package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +4 -1
  162. package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +1 -0
  163. package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +4 -3
  164. package/packages/panda/styled-system/recipes/aeon-scroll.mjs +1 -0
  165. package/packages/panda/styled-system/recipes/aeon-select.d.ts +4 -3
  166. package/packages/panda/styled-system/recipes/aeon-select.mjs +1 -0
  167. package/packages/panda/styled-system/recipes/aeon-separator.d.ts +4 -1
  168. package/packages/panda/styled-system/recipes/aeon-separator.mjs +1 -0
  169. package/packages/panda/styled-system/recipes/aeon-slider.d.ts +4 -1
  170. package/packages/panda/styled-system/recipes/aeon-slider.mjs +1 -0
  171. package/packages/panda/styled-system/recipes/aeon-switch.d.ts +4 -1
  172. package/packages/panda/styled-system/recipes/aeon-switch.mjs +1 -0
  173. package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +4 -1
  174. package/packages/panda/styled-system/recipes/aeon-tabs.mjs +1 -0
  175. package/packages/panda/styled-system/recipes/aeon-theme-switcher.d.ts +34 -0
  176. package/packages/panda/styled-system/recipes/aeon-theme-switcher.mjs +59 -0
  177. package/packages/panda/styled-system/recipes/aeon-thread.d.ts +31 -0
  178. package/packages/panda/styled-system/recipes/aeon-thread.mjs +53 -0
  179. package/packages/panda/styled-system/recipes/aeon-toast.d.ts +4 -1
  180. package/packages/panda/styled-system/recipes/aeon-toast.mjs +1 -0
  181. package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +4 -1
  182. package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +1 -0
  183. package/packages/panda/styled-system/recipes/index.d.ts +16 -1
  184. package/packages/panda/styled-system/recipes/index.mjs +16 -1
  185. package/packages/panda/styled-system/styles.css +2317 -450
  186. package/packages/panda/styled-system/tokens/index.mjs +43 -7
  187. package/packages/panda/styled-system/tokens/tokens.d.ts +5 -5
  188. package/packages/panda/styled-system/types/composition.d.ts +86 -23
  189. package/packages/panda/styled-system/types/conditions.d.ts +34 -10
  190. package/packages/panda/styled-system/types/csstype.d.ts +6405 -5133
  191. package/packages/panda/styled-system/types/jsx.d.ts +27 -10
  192. package/packages/panda/styled-system/types/pattern.d.ts +4 -4
  193. package/packages/panda/styled-system/types/prop-type.d.ts +11 -1
  194. package/packages/panda/styled-system/types/style-props.d.ts +2763 -2165
  195. package/packages/panda/styled-system/types/system-types.d.ts +38 -80
  196. package/packages/panda/theme-runtime.css +945 -0
  197. package/packages/primitives/dist/chunk-4NOKRUSG.js +81 -0
  198. package/packages/primitives/dist/chunk-R25CUHNF.js +46 -0
  199. package/packages/primitives/dist/chunk-RO2DMFN5.js +89 -0
  200. package/packages/primitives/dist/chunk-V5D7LS4J.js +61 -0
  201. package/packages/primitives/dist/chunk-YBPNI2LI.js +70 -0
  202. package/packages/primitives/dist/index.d.ts +5 -0
  203. package/packages/primitives/dist/index.js +46 -14
  204. package/packages/primitives/dist/machines/app-nav.d.ts +96 -0
  205. package/packages/primitives/dist/machines/app-nav.js +12 -0
  206. package/packages/primitives/dist/machines/app-shell.d.ts +57 -0
  207. package/packages/primitives/dist/machines/app-shell.js +8 -0
  208. package/packages/primitives/dist/machines/async.d.ts +4 -4
  209. package/packages/primitives/dist/machines/content-region.d.ts +72 -0
  210. package/packages/primitives/dist/machines/content-region.js +8 -0
  211. package/packages/primitives/dist/machines/panel.d.ts +50 -0
  212. package/packages/primitives/dist/machines/panel.js +6 -0
  213. package/packages/primitives/dist/machines/sticky-bar.d.ts +62 -0
  214. package/packages/primitives/dist/machines/sticky-bar.js +8 -0
  215. package/packages/primitives/node_modules/.bin/esbuild +21 -0
  216. package/packages/primitives/node_modules/.bin/vite +21 -0
  217. package/packages/primitives/node_modules/.bin/vitest +2 -2
  218. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  219. package/packages/primitives/package.json +15 -5
  220. package/packages/primitives/scripts/xstate-introspect.mjs +35 -0
  221. package/packages/primitives/src/__tests__/app-nav.test.ts +30 -0
  222. package/packages/primitives/src/index.ts +5 -0
  223. package/packages/primitives/src/machines/app-nav.ts +107 -0
  224. package/packages/primitives/src/machines/app-shell.ts +63 -0
  225. package/packages/primitives/src/machines/content-region.ts +107 -0
  226. package/packages/primitives/src/machines/panel.ts +71 -0
  227. package/packages/primitives/src/machines/sticky-bar.ts +89 -0
  228. package/packages/react/dist/index.d.ts +536 -17
  229. package/packages/react/dist/index.js +2163 -479
  230. package/packages/react/node_modules/.bin/esbuild +21 -0
  231. package/packages/react/node_modules/.bin/vite +21 -0
  232. package/packages/react/node_modules/.bin/vitest +2 -2
  233. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  234. package/packages/react/package.json +18 -7
  235. package/packages/react/src/app-nav/index.tsx +249 -0
  236. package/packages/react/src/app-shell/index.tsx +154 -0
  237. package/packages/react/src/async/index.tsx +6 -1
  238. package/packages/react/src/async/map-content-state.ts +18 -0
  239. package/packages/react/src/avatar/index.tsx +23 -1
  240. package/packages/react/src/bar/index.tsx +101 -0
  241. package/packages/react/src/button/index.tsx +4 -2
  242. package/packages/react/src/composer/index.tsx +75 -0
  243. package/packages/react/src/content/index.tsx +149 -0
  244. package/packages/react/src/conversation/index.tsx +78 -0
  245. package/packages/react/src/entry/index.tsx +85 -0
  246. package/packages/react/src/field/index.tsx +31 -18
  247. package/packages/react/src/hooks/use-fit-text.ts +59 -0
  248. package/packages/react/src/identity/index.tsx +110 -0
  249. package/packages/react/src/index.ts +19 -0
  250. package/packages/react/src/list-row/index.tsx +80 -0
  251. package/packages/react/src/metric-strip/index.tsx +88 -0
  252. package/packages/react/src/nav/index.tsx +155 -0
  253. package/packages/react/src/panel/index.tsx +267 -0
  254. package/packages/react/src/profile-header/index.tsx +91 -0
  255. package/packages/react/src/prompt/index.tsx +161 -0
  256. package/packages/react/src/radio-group/index.tsx +19 -7
  257. package/packages/react/src/slider/index.tsx +3 -1
  258. package/packages/react/src/status-banner/index.tsx +84 -0
  259. package/packages/react/src/sticky-bar/index.tsx +135 -0
  260. package/packages/react/src/switch/index.tsx +7 -1
  261. package/packages/react/src/theme-switcher/index.tsx +227 -0
  262. package/packages/react/src/thread/index.tsx +95 -0
  263. package/packages/react/src/toast/primitives.tsx +2 -2
  264. package/packages/react/src/tooltip/tooltip.test.tsx +9 -1
  265. package/packages/react/tsconfig.json +2 -1
  266. package/packages/schemas/README.md +52 -0
  267. package/packages/schemas/dist/index.d.ts +287 -0
  268. package/packages/schemas/dist/index.js +701 -0
  269. package/packages/schemas/json/accordion.json +132 -0
  270. package/packages/schemas/json/async.json +161 -0
  271. package/packages/schemas/json/button.json +170 -0
  272. package/packages/schemas/json/catalog.json +2299 -0
  273. package/packages/schemas/json/checkbox.json +136 -0
  274. package/packages/schemas/json/combobox.json +130 -0
  275. package/packages/schemas/json/dialog.json +154 -0
  276. package/packages/schemas/json/field.json +171 -0
  277. package/packages/schemas/json/menu.json +138 -0
  278. package/packages/schemas/json/popover.json +133 -0
  279. package/packages/schemas/json/progress.json +137 -0
  280. package/packages/schemas/json/scroll.json +129 -0
  281. package/packages/schemas/json/select.json +140 -0
  282. package/packages/schemas/json/switch.json +136 -0
  283. package/packages/schemas/json/tabs.json +135 -0
  284. package/packages/schemas/json/toast.json +141 -0
  285. package/packages/schemas/json/tooltip.json +123 -0
  286. package/packages/schemas/node_modules/.bin/esbuild +21 -0
  287. package/packages/schemas/node_modules/.bin/jiti +21 -0
  288. package/packages/schemas/node_modules/.bin/tsc +21 -0
  289. package/packages/schemas/node_modules/.bin/tsserver +21 -0
  290. package/packages/schemas/node_modules/.bin/tsup +21 -0
  291. package/packages/schemas/node_modules/.bin/tsup-node +21 -0
  292. package/packages/schemas/node_modules/.bin/tsx +21 -0
  293. package/packages/schemas/node_modules/.bin/vite +21 -0
  294. package/packages/schemas/node_modules/.bin/vitest +21 -0
  295. package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  296. package/packages/schemas/package.json +56 -0
  297. package/packages/schemas/prompts/cursorrules.md +64 -0
  298. package/packages/schemas/prompts/statecharts.md +31 -0
  299. package/packages/schemas/prompts/system.md +30 -0
  300. package/packages/schemas/registry/catalog.json +54 -0
  301. package/packages/schemas/registry/components/accordion.json +132 -0
  302. package/packages/schemas/registry/components/async.json +161 -0
  303. package/packages/schemas/registry/components/button.json +170 -0
  304. package/packages/schemas/registry/components/checkbox.json +136 -0
  305. package/packages/schemas/registry/components/combobox.json +130 -0
  306. package/packages/schemas/registry/components/dialog.json +154 -0
  307. package/packages/schemas/registry/components/field.json +171 -0
  308. package/packages/schemas/registry/components/menu.json +138 -0
  309. package/packages/schemas/registry/components/popover.json +133 -0
  310. package/packages/schemas/registry/components/progress.json +137 -0
  311. package/packages/schemas/registry/components/scroll.json +129 -0
  312. package/packages/schemas/registry/components/select.json +140 -0
  313. package/packages/schemas/registry/components/switch.json +136 -0
  314. package/packages/schemas/registry/components/tabs.json +135 -0
  315. package/packages/schemas/registry/components/toast.json +141 -0
  316. package/packages/schemas/registry/components/tooltip.json +123 -0
  317. package/packages/schemas/registry/machines/async.json +219 -0
  318. package/packages/schemas/registry/machines/buttonLifecycle.json +224 -0
  319. package/packages/schemas/registry/machines/dialog.json +143 -0
  320. package/packages/schemas/registry/machines/field.json +275 -0
  321. package/packages/schemas/scripts/emit.ts +61 -0
  322. package/packages/schemas/src/aeon-to-schema.test.ts +70 -0
  323. package/packages/schemas/src/aeon-to-schema.ts +206 -0
  324. package/packages/schemas/src/agent-bridge.ts +82 -0
  325. package/packages/schemas/src/components.ts +307 -0
  326. package/packages/schemas/src/index.test.ts +25 -0
  327. package/packages/schemas/src/index.ts +25 -0
  328. package/packages/schemas/src/prompts.ts +121 -0
  329. package/packages/schemas/src/registry.ts +73 -0
  330. package/packages/schemas/src/schema-builder.ts +87 -0
  331. package/packages/schemas/tsconfig.json +9 -0
  332. package/packages/solid/package.json +2 -2
  333. package/packages/svelte/node_modules/.bin/esbuild +21 -0
  334. package/packages/svelte/node_modules/.bin/vite +4 -4
  335. package/packages/svelte/package.json +15 -5
  336. package/packages/ui/README.md +19 -6
  337. package/packages/ui/dist/index.d.ts +254 -9
  338. package/packages/ui/dist/index.js +690 -139
  339. package/packages/ui/src/app-nav.tsx +2 -0
  340. package/packages/ui/src/app-shell.tsx +44 -0
  341. package/packages/ui/src/async.tsx +2 -1
  342. package/packages/ui/src/avatar.tsx +35 -0
  343. package/packages/ui/src/bar.tsx +34 -0
  344. package/packages/ui/src/composer.tsx +27 -0
  345. package/packages/ui/src/content.tsx +43 -0
  346. package/packages/ui/src/conversation.tsx +43 -0
  347. package/packages/ui/src/entry.tsx +76 -0
  348. package/packages/ui/src/field.tsx +5 -0
  349. package/packages/ui/src/identity.tsx +35 -0
  350. package/packages/ui/src/index.ts +20 -0
  351. package/packages/ui/src/list-row.tsx +30 -0
  352. package/packages/ui/src/metric-strip.tsx +29 -0
  353. package/packages/ui/src/nav.tsx +46 -0
  354. package/packages/ui/src/panel.tsx +39 -0
  355. package/packages/ui/src/profile-header.tsx +35 -0
  356. package/packages/ui/src/prompt.tsx +29 -0
  357. package/packages/ui/src/status-banner.tsx +1 -0
  358. package/packages/ui/src/sticky-bar.tsx +42 -0
  359. package/packages/ui/src/switch.tsx +17 -4
  360. package/packages/ui/src/theme-switcher.tsx +41 -0
  361. package/packages/ui/src/thread.tsx +35 -0
  362. package/packages/vue/package.json +3 -3
  363. package/scripts/vite-aliases.mjs +65 -3
  364. package/scripts/xstate-introspect.mjs +68 -0
  365. package/packages/react/src/async/legacy-region.tsx +0 -38
@@ -0,0 +1,267 @@
1
+ import { panelAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { panelMachine } from '@aeon-ui/primitives'
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useContext,
7
+ useEffect,
8
+ useId,
9
+ useMemo,
10
+ type ButtonHTMLAttributes,
11
+ type HTMLAttributes,
12
+ type ReactNode,
13
+ } from 'react'
14
+ import { useAeonMachine } from '../hooks/use-aeon-machine.js'
15
+ import { mergeProps } from '../utils/merge-props.js'
16
+
17
+ type PanelState = 'expanded' | 'collapsed'
18
+
19
+ interface PanelContextValue {
20
+ state: PanelState
21
+ expanded: boolean
22
+ collapsible: boolean
23
+ label: string
24
+ contentId: string
25
+ send: ReturnType<typeof useAeonMachine<typeof panelMachine>>[1]
26
+ }
27
+
28
+ const PanelCtx = createContext<PanelContextValue | null>(null)
29
+
30
+ function usePanelCtx() {
31
+ const ctx = useContext(PanelCtx)
32
+ if (!ctx) throw new Error('Panel parts must be used within Panel.Root')
33
+ return ctx
34
+ }
35
+
36
+ /* ------------------------------------------------------------------ */
37
+ /* Group — horizontal/vertical split of Panel.Root siblings */
38
+ /* ------------------------------------------------------------------ */
39
+
40
+ export interface PanelGroupProps extends HTMLAttributes<HTMLDivElement> {
41
+ orientation?: 'horizontal' | 'vertical'
42
+ children?: ReactNode
43
+ }
44
+
45
+ const Group = forwardRef<HTMLDivElement, PanelGroupProps>(function PanelGroup(
46
+ { orientation = 'horizontal', children, className, ...rest },
47
+ ref,
48
+ ) {
49
+ return (
50
+ <div
51
+ ref={ref}
52
+ className={className}
53
+ data-aeon-orientation={orientation}
54
+ {...mergeProps(partAttrs(panelAnatomy.scope, panelAnatomy.group), rest)}
55
+ >
56
+ {children}
57
+ </div>
58
+ )
59
+ })
60
+
61
+ /* ------------------------------------------------------------------ */
62
+ /* Root */
63
+ /* ------------------------------------------------------------------ */
64
+
65
+ export interface PanelRootProps extends HTMLAttributes<HTMLDivElement> {
66
+ /** Accessible name; also the collapsed vertical rail text. */
67
+ label: string
68
+ /** Start expanded (default true). */
69
+ defaultExpanded?: boolean
70
+ /** Controlled expanded state. */
71
+ expanded?: boolean
72
+ /** Whether the panel can collapse (default true). */
73
+ collapsible?: boolean
74
+ onExpandedChange?: (expanded: boolean) => void
75
+ children?: ReactNode
76
+ }
77
+
78
+ const Root = forwardRef<HTMLDivElement, PanelRootProps>(function PanelRoot(
79
+ {
80
+ label,
81
+ defaultExpanded = true,
82
+ expanded: expandedProp,
83
+ collapsible = true,
84
+ onExpandedChange,
85
+ children,
86
+ className,
87
+ ...rest
88
+ },
89
+ ref,
90
+ ) {
91
+ const contentId = useId().replace(/:/g, '')
92
+ const [snapshot, send] = useAeonMachine(panelMachine, {
93
+ input: { expanded: defaultExpanded },
94
+ })
95
+
96
+ const machineExpanded = snapshot.value === 'expanded'
97
+ const expanded = expandedProp ?? machineExpanded
98
+ const state: PanelState = expanded ? 'expanded' : 'collapsed'
99
+
100
+ useEffect(() => {
101
+ onExpandedChange?.(expanded)
102
+ }, [expanded, onExpandedChange])
103
+
104
+ useEffect(() => {
105
+ if (expandedProp === undefined) return
106
+ send({ type: 'SET_EXPANDED', expanded: expandedProp })
107
+ }, [expandedProp, send])
108
+
109
+ const ctx = useMemo(
110
+ () => ({
111
+ state,
112
+ expanded,
113
+ collapsible,
114
+ label,
115
+ contentId: `aeon-panel-${contentId}`,
116
+ send,
117
+ }),
118
+ [state, expanded, collapsible, label, contentId, send],
119
+ )
120
+
121
+ return (
122
+ <PanelCtx.Provider value={ctx}>
123
+ <div
124
+ ref={ref}
125
+ className={className}
126
+ {...mergeProps(
127
+ scopeAttrs(panelAnatomy.scope, panelAnatomy.root, { state }),
128
+ {
129
+ 'data-aeon-collapsible': collapsible ? 'true' : undefined,
130
+ },
131
+ rest,
132
+ )}
133
+ >
134
+ {children}
135
+ </div>
136
+ </PanelCtx.Provider>
137
+ )
138
+ })
139
+
140
+ /* ------------------------------------------------------------------ */
141
+ /* Trigger */
142
+ /* ------------------------------------------------------------------ */
143
+
144
+ export interface PanelTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {}
145
+
146
+ const Trigger = forwardRef<HTMLButtonElement, PanelTriggerProps>(function PanelTrigger(
147
+ { children, onClick, ...rest },
148
+ ref,
149
+ ) {
150
+ const { expanded, collapsible, contentId, send, label } = usePanelCtx()
151
+
152
+ return (
153
+ <button
154
+ ref={ref}
155
+ type="button"
156
+ aria-expanded={expanded}
157
+ aria-controls={contentId}
158
+ disabled={!collapsible}
159
+ {...mergeProps(
160
+ partAttrs(panelAnatomy.scope, panelAnatomy.trigger, {
161
+ state: expanded ? 'expanded' : 'collapsed',
162
+ }),
163
+ rest,
164
+ )}
165
+ onClick={(e) => {
166
+ onClick?.(e)
167
+ if (!e.defaultPrevented && collapsible) send({ type: 'TOGGLE' })
168
+ }}
169
+ >
170
+ {children ?? (expanded ? 'Collapse' : `Expand ${label}`)}
171
+ </button>
172
+ )
173
+ })
174
+
175
+ /* ------------------------------------------------------------------ */
176
+ /* Label — vertical upright letters when collapsed */
177
+ /* ------------------------------------------------------------------ */
178
+
179
+ export interface PanelLabelProps extends HTMLAttributes<HTMLSpanElement> {
180
+ /** Override root label text. */
181
+ children?: ReactNode
182
+ }
183
+
184
+ const Label = forwardRef<HTMLSpanElement, PanelLabelProps>(function PanelLabel(
185
+ { children, onClick, ...rest },
186
+ ref,
187
+ ) {
188
+ const { label, state, collapsible, send, expanded, contentId } = usePanelCtx()
189
+ const text = typeof children === 'string' || children == null ? String(children ?? label) : null
190
+
191
+ return (
192
+ <span
193
+ ref={ref}
194
+ role={collapsible ? 'button' : undefined}
195
+ tabIndex={collapsible ? 0 : undefined}
196
+ aria-expanded={collapsible ? expanded : undefined}
197
+ aria-controls={collapsible ? contentId : undefined}
198
+ {...mergeProps(partAttrs(panelAnatomy.scope, panelAnatomy.label, { state }), rest)}
199
+ onClick={(e) => {
200
+ onClick?.(e)
201
+ if (!e.defaultPrevented && collapsible) send({ type: 'TOGGLE' })
202
+ }}
203
+ onKeyDown={(e) => {
204
+ if (!collapsible) return
205
+ if (e.key === 'Enter' || e.key === ' ') {
206
+ e.preventDefault()
207
+ send({ type: 'TOGGLE' })
208
+ }
209
+ }}
210
+ >
211
+ {text != null ? (
212
+ state === 'collapsed' ? (
213
+ text.split('').map((ch, i) =>
214
+ ch === ' ' ? (
215
+ <span key={`sp-${i}`} data-aeon-part="label-gap" aria-hidden>
216
+ {' '}
217
+ </span>
218
+ ) : (
219
+ <span key={`${ch}-${i}`} data-aeon-part="label-char">
220
+ {ch}
221
+ </span>
222
+ ),
223
+ )
224
+ ) : (
225
+ text
226
+ )
227
+ ) : (
228
+ children
229
+ )}
230
+ </span>
231
+ )
232
+ })
233
+
234
+ /* ------------------------------------------------------------------ */
235
+ /* Content */
236
+ /* ------------------------------------------------------------------ */
237
+
238
+ export interface PanelContentProps extends HTMLAttributes<HTMLDivElement> {
239
+ /** Prefer Scroll.Root inside for overflow regions. */
240
+ children?: ReactNode
241
+ }
242
+
243
+ const Content = forwardRef<HTMLDivElement, PanelContentProps>(function PanelContent(
244
+ { children, ...rest },
245
+ ref,
246
+ ) {
247
+ const { expanded, contentId, state } = usePanelCtx()
248
+
249
+ return (
250
+ <div
251
+ ref={ref}
252
+ id={contentId}
253
+ hidden={!expanded}
254
+ {...mergeProps(partAttrs(panelAnatomy.scope, panelAnatomy.content, { state }), rest)}
255
+ >
256
+ {children}
257
+ </div>
258
+ )
259
+ })
260
+
261
+ export const Panel = {
262
+ Group,
263
+ Root,
264
+ Trigger,
265
+ Label,
266
+ Content,
267
+ }
@@ -0,0 +1,91 @@
1
+ import { profileHeaderAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ export interface ProfileHeaderRootProps extends HTMLAttributes<HTMLElement> {
6
+ children?: ReactNode
7
+ }
8
+
9
+ /**
10
+ * ProfileHeader — dense account surface (identity + metrics + actions).
11
+ * Compose Identity / MetricStrip / Bar actions — not a dating hero.
12
+ */
13
+ const Root = forwardRef<HTMLElement, ProfileHeaderRootProps>(function ProfileHeaderRoot(
14
+ { children, ...rest },
15
+ ref,
16
+ ) {
17
+ return (
18
+ <header
19
+ ref={ref as never}
20
+ {...mergeProps(scopeAttrs(profileHeaderAnatomy.scope, profileHeaderAnatomy.root), rest)}
21
+ >
22
+ {children}
23
+ </header>
24
+ )
25
+ })
26
+
27
+ const Media = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ProfileHeaderMedia(
28
+ props,
29
+ ref,
30
+ ) {
31
+ return (
32
+ <div
33
+ ref={ref}
34
+ {...mergeProps(partAttrs(profileHeaderAnatomy.scope, profileHeaderAnatomy.media), props)}
35
+ />
36
+ )
37
+ })
38
+
39
+ const IdentitySlot = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
40
+ function ProfileHeaderIdentity(props, ref) {
41
+ return (
42
+ <div
43
+ ref={ref}
44
+ {...mergeProps(partAttrs(profileHeaderAnatomy.scope, profileHeaderAnatomy.identity), props)}
45
+ />
46
+ )
47
+ },
48
+ )
49
+
50
+ const Metrics = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
51
+ function ProfileHeaderMetrics(props, ref) {
52
+ return (
53
+ <div
54
+ ref={ref}
55
+ {...mergeProps(partAttrs(profileHeaderAnatomy.scope, profileHeaderAnatomy.metrics), props)}
56
+ />
57
+ )
58
+ },
59
+ )
60
+
61
+ const Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
62
+ function ProfileHeaderActions(props, ref) {
63
+ return (
64
+ <div
65
+ ref={ref}
66
+ {...mergeProps(partAttrs(profileHeaderAnatomy.scope, profileHeaderAnatomy.actions), props)}
67
+ />
68
+ )
69
+ },
70
+ )
71
+
72
+ const Body = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ProfileHeaderBody(
73
+ props,
74
+ ref,
75
+ ) {
76
+ return (
77
+ <div
78
+ ref={ref}
79
+ {...mergeProps(partAttrs(profileHeaderAnatomy.scope, profileHeaderAnatomy.body), props)}
80
+ />
81
+ )
82
+ })
83
+
84
+ export const ProfileHeader = {
85
+ Root,
86
+ Media,
87
+ Identity: IdentitySlot,
88
+ Metrics,
89
+ Actions,
90
+ Body,
91
+ }
@@ -0,0 +1,161 @@
1
+ import { partAttrs, promptAnatomy, scopeAttrs } from '@aeon-ui/core'
2
+ import {
3
+ createContext,
4
+ forwardRef,
5
+ useContext,
6
+ useMemo,
7
+ type ButtonHTMLAttributes,
8
+ type HTMLAttributes,
9
+ type ReactNode,
10
+ } from 'react'
11
+ import { Dialog } from '../dialog/index.js'
12
+ import { mergeProps } from '../utils/merge-props.js'
13
+
14
+ export type PromptStatus = 'pending' | 'confirming' | 'dismissed' | 'confirmed'
15
+
16
+ interface PromptContextValue {
17
+ status: PromptStatus
18
+ }
19
+
20
+ const PromptCtx = createContext<PromptContextValue | null>(null)
21
+
22
+ function usePromptCtx() {
23
+ const ctx = useContext(PromptCtx)
24
+ if (!ctx) throw new Error('Prompt parts must be used within Prompt.Root')
25
+ return ctx
26
+ }
27
+
28
+ export interface PromptRootProps {
29
+ open?: boolean
30
+ defaultOpen?: boolean
31
+ onOpenChange?: (open: boolean) => void
32
+ /** Projected onto data-aeon-state (default: pending when open). */
33
+ status?: PromptStatus
34
+ children?: ReactNode
35
+ className?: string
36
+ }
37
+
38
+ /**
39
+ * Prompt — confirm / permission / “restart to update” dialog.
40
+ * Composes Dialog (portal, focus trap, escape) with product-facing parts.
41
+ */
42
+ const Root = forwardRef<HTMLDivElement, PromptRootProps>(function PromptRoot(
43
+ { status = 'pending', children, className, ...dialogProps },
44
+ ref,
45
+ ) {
46
+ const value = useMemo(() => ({ status }), [status])
47
+ return (
48
+ <PromptCtx.Provider value={value}>
49
+ <Dialog.Root {...dialogProps}>
50
+ <div
51
+ ref={ref}
52
+ className={className}
53
+ {...scopeAttrs(promptAnatomy.scope, promptAnatomy.root, { state: status })}
54
+ >
55
+ {children}
56
+ </div>
57
+ </Dialog.Root>
58
+ </PromptCtx.Provider>
59
+ )
60
+ })
61
+
62
+ const Eyebrow = forwardRef<HTMLParagraphElement, HTMLAttributes<HTMLParagraphElement>>(
63
+ function PromptEyebrow(props, ref) {
64
+ const { status } = usePromptCtx()
65
+ return (
66
+ <p
67
+ ref={ref}
68
+ {...mergeProps(partAttrs(promptAnatomy.scope, promptAnatomy.eyebrow, { state: status }), props)}
69
+ />
70
+ )
71
+ },
72
+ )
73
+
74
+ const Meta = forwardRef<HTMLDListElement, HTMLAttributes<HTMLDListElement>>(function PromptMeta(
75
+ props,
76
+ ref,
77
+ ) {
78
+ const { status } = usePromptCtx()
79
+ return (
80
+ <dl
81
+ ref={ref}
82
+ {...mergeProps(partAttrs(promptAnatomy.scope, promptAnatomy.meta, { state: status }), props)}
83
+ />
84
+ )
85
+ })
86
+
87
+ const Amount = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function PromptAmount(
88
+ props,
89
+ ref,
90
+ ) {
91
+ const { status } = usePromptCtx()
92
+ return (
93
+ <div
94
+ ref={ref}
95
+ {...mergeProps(partAttrs(promptAnatomy.scope, promptAnatomy.amount, { state: status }), props)}
96
+ />
97
+ )
98
+ })
99
+
100
+ const Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function PromptActions(
101
+ props,
102
+ ref,
103
+ ) {
104
+ const { status } = usePromptCtx()
105
+ return (
106
+ <div
107
+ ref={ref}
108
+ {...mergeProps(partAttrs(promptAnatomy.scope, promptAnatomy.actions, { state: status }), props)}
109
+ />
110
+ )
111
+ })
112
+
113
+ const Primary = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(
114
+ function PromptPrimary(props, ref) {
115
+ const { status } = usePromptCtx()
116
+ return (
117
+ <button
118
+ ref={ref}
119
+ type="button"
120
+ {...mergeProps(
121
+ partAttrs(promptAnatomy.scope, promptAnatomy.primary, { state: status }),
122
+ props,
123
+ )}
124
+ />
125
+ )
126
+ },
127
+ )
128
+
129
+ const Secondary = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(
130
+ function PromptSecondary(props, ref) {
131
+ const { status } = usePromptCtx()
132
+ return (
133
+ <button
134
+ ref={ref}
135
+ type="button"
136
+ {...mergeProps(
137
+ partAttrs(promptAnatomy.scope, promptAnatomy.secondary, { state: status }),
138
+ props,
139
+ )}
140
+ />
141
+ )
142
+ },
143
+ )
144
+
145
+ export const Prompt = {
146
+ Root,
147
+ Trigger: Dialog.Trigger,
148
+ Portal: Dialog.Portal,
149
+ Backdrop: Dialog.Backdrop,
150
+ Positioner: Dialog.Positioner,
151
+ Content: Dialog.Content,
152
+ Title: Dialog.Title,
153
+ Description: Dialog.Description,
154
+ CloseTrigger: Dialog.CloseTrigger,
155
+ Eyebrow,
156
+ Meta,
157
+ Amount,
158
+ Actions,
159
+ Primary,
160
+ Secondary,
161
+ }
@@ -3,6 +3,7 @@ import { tabsMachine } from '@aeon-ui/primitives'
3
3
  import {
4
4
  createContext,
5
5
  forwardRef,
6
+ useCallback,
6
7
  useContext,
7
8
  useEffect,
8
9
  useMemo,
@@ -18,6 +19,7 @@ import { mergeProps } from '../utils/merge-props.js'
18
19
  interface RadioGroupContextValue {
19
20
  value: string
20
21
  send: ReturnType<typeof useAeonMachine<typeof tabsMachine>>[1]
22
+ selectValue: (next: string) => void
21
23
  }
22
24
 
23
25
  const RadioGroupCtx = createContext<RadioGroupContextValue | null>(null)
@@ -58,16 +60,26 @@ const Root = forwardRef<HTMLDivElement, RadioGroupRootProps>(function RadioGroup
58
60
  })
59
61
 
60
62
  const resolvedValue = value ?? snapshot.context.value
63
+ const controlled = value !== undefined
64
+
65
+ const selectValue = useCallback(
66
+ (next: string) => {
67
+ if (controlled) onValueChange?.(next)
68
+ else send({ type: 'SELECT', value: next })
69
+ },
70
+ [controlled, onValueChange, send],
71
+ )
61
72
 
62
73
  useEffect(() => {
63
- onValueChange?.(resolvedValue)
64
- }, [resolvedValue, onValueChange])
74
+ if (controlled) return
75
+ onValueChange?.(snapshot.context.value)
76
+ }, [snapshot.context.value, controlled, onValueChange])
65
77
 
66
78
  useEffect(() => {
67
79
  if (value !== undefined) send({ type: 'SET_VALUE', value })
68
80
  }, [value, send])
69
81
 
70
- const ctx = useMemo(() => ({ value: resolvedValue, send }), [resolvedValue, send])
82
+ const ctx = useMemo(() => ({ value: resolvedValue, send, selectValue }), [resolvedValue, send, selectValue])
71
83
 
72
84
  return (
73
85
  <RadioGroupCtx.Provider value={ctx}>
@@ -119,10 +131,10 @@ const ItemControl = forwardRef<HTMLSpanElement, ButtonHTMLAttributes<HTMLSpanEle
119
131
  { onClick, onKeyDown, ...rest },
120
132
  ref,
121
133
  ) {
122
- const { send } = useRadioGroupCtx()
134
+ const { selectValue } = useRadioGroupCtx()
123
135
  const { value: itemValue, selected } = useRadioGroupItemCtx()
124
136
 
125
- const select = () => send({ type: 'SELECT', value: itemValue })
137
+ const select = () => selectValue(itemValue)
126
138
 
127
139
  return (
128
140
  <span
@@ -176,7 +188,7 @@ const ItemLabel = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(f
176
188
  { onClick, ...rest },
177
189
  ref,
178
190
  ) {
179
- const { send } = useRadioGroupCtx()
191
+ const { selectValue } = useRadioGroupCtx()
180
192
  const { value: itemValue } = useRadioGroupItemCtx()
181
193
 
182
194
  return (
@@ -187,7 +199,7 @@ const ItemLabel = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(f
187
199
  {
188
200
  onClick: (e: MouseEvent<HTMLSpanElement>) => {
189
201
  onClick?.(e)
190
- send({ type: 'SELECT', value: itemValue })
202
+ selectValue(itemValue)
191
203
  },
192
204
  },
193
205
  rest,
@@ -201,7 +201,7 @@ const Thumb = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(funct
201
201
  { onKeyDown, onPointerDown, style, ...rest },
202
202
  ref,
203
203
  ) {
204
- const { value, min, max, step, disabled, dragging, send } = useSliderCtx()
204
+ const { value, min, max, step, disabled, dragging, send, setValueFromClientX } = useSliderCtx()
205
205
 
206
206
  return (
207
207
  <span
@@ -220,7 +220,9 @@ const Thumb = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(funct
220
220
  onPointerDown?.(e)
221
221
  if (disabled || e.button !== 0) return
222
222
  e.stopPropagation()
223
+ e.currentTarget.setPointerCapture(e.pointerId)
223
224
  send({ type: 'POINTER_DOWN' })
225
+ setValueFromClientX(e.clientX)
224
226
  },
225
227
  onKeyDown: (e: KeyboardEvent<HTMLSpanElement>) => {
226
228
  onKeyDown?.(e)
@@ -0,0 +1,84 @@
1
+ import { partAttrs, scopeAttrs, statusBannerAnatomy } from '@aeon-ui/core'
2
+ import { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ export type StatusBannerTone = 'info' | 'success' | 'warning' | 'danger'
6
+
7
+ export interface StatusBannerRootProps extends HTMLAttributes<HTMLDivElement> {
8
+ tone?: StatusBannerTone
9
+ /** Machine-ish status string projected to data-aeon-state (e.g. ready, downloading). */
10
+ status?: string
11
+ children?: ReactNode
12
+ }
13
+
14
+ const Root = forwardRef<HTMLDivElement, StatusBannerRootProps>(function StatusBannerRoot(
15
+ { tone = 'info', status, children, ...rest },
16
+ ref,
17
+ ) {
18
+ const state = [tone, status].filter(Boolean).join(' ')
19
+ return (
20
+ <div
21
+ ref={ref}
22
+ role="status"
23
+ {...mergeProps(scopeAttrs(statusBannerAnatomy.scope, statusBannerAnatomy.root, { state }), rest)}
24
+ >
25
+ {children}
26
+ </div>
27
+ )
28
+ })
29
+
30
+ const Copy = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function StatusBannerCopy(
31
+ props,
32
+ ref,
33
+ ) {
34
+ return <div ref={ref} {...mergeProps(partAttrs(statusBannerAnatomy.scope, statusBannerAnatomy.copy), props)} />
35
+ })
36
+
37
+ const Title = forwardRef<HTMLElement, HTMLAttributes<HTMLElement>>(function StatusBannerTitle(
38
+ props,
39
+ ref,
40
+ ) {
41
+ return (
42
+ <strong
43
+ ref={ref as never}
44
+ {...mergeProps(partAttrs(statusBannerAnatomy.scope, statusBannerAnatomy.title), props)}
45
+ />
46
+ )
47
+ })
48
+
49
+ const Body = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function StatusBannerBody(
50
+ props,
51
+ ref,
52
+ ) {
53
+ return (
54
+ <span ref={ref} {...mergeProps(partAttrs(statusBannerAnatomy.scope, statusBannerAnatomy.body), props)} />
55
+ )
56
+ })
57
+
58
+ const Actions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function StatusBannerActions(
59
+ props,
60
+ ref,
61
+ ) {
62
+ return (
63
+ <div
64
+ ref={ref}
65
+ {...mergeProps(partAttrs(statusBannerAnatomy.scope, statusBannerAnatomy.actions), props)}
66
+ />
67
+ )
68
+ })
69
+
70
+ const Action = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(
71
+ function StatusBannerAction(props, ref) {
72
+ return <button ref={ref} type="button" {...props} />
73
+ },
74
+ )
75
+
76
+ /** Non-blocking top-of-app notice (updates, sync, offline). */
77
+ export const StatusBanner = {
78
+ Root,
79
+ Copy,
80
+ Title,
81
+ Body,
82
+ Actions,
83
+ Action,
84
+ }