aeon-ui-engine 1.0.3 → 1.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 (349) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/CONSUMER.md +39 -42
  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 +174 -6
  27. package/packages/core/dist/index.js +259 -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 +196 -5
  34. package/packages/core/src/machine.test.ts +62 -1
  35. package/packages/core/src/machine.ts +93 -0
  36. package/packages/core/src/theme.ts +105 -0
  37. package/packages/panda/aeon.css +7 -0
  38. package/packages/panda/package.json +1 -1
  39. package/packages/panda/panda.config.ts +58 -1
  40. package/packages/panda/src/recipes/app-shell.ts +137 -0
  41. package/packages/panda/src/recipes/avatar.ts +131 -0
  42. package/packages/panda/src/recipes/bar.ts +206 -0
  43. package/packages/panda/src/recipes/button-group.ts +12 -4
  44. package/packages/panda/src/recipes/button.ts +1 -0
  45. package/packages/panda/src/recipes/combobox.ts +2 -1
  46. package/packages/panda/src/recipes/composer.ts +81 -0
  47. package/packages/panda/src/recipes/content.ts +104 -0
  48. package/packages/panda/src/recipes/conversation.ts +106 -0
  49. package/packages/panda/src/recipes/entry.ts +217 -0
  50. package/packages/panda/src/recipes/field.ts +12 -2
  51. package/packages/panda/src/recipes/floating.ts +26 -13
  52. package/packages/panda/src/recipes/identity.ts +73 -0
  53. package/packages/panda/src/recipes/index.ts +15 -0
  54. package/packages/panda/src/recipes/list-row.ts +109 -0
  55. package/packages/panda/src/recipes/metric-strip.ts +80 -0
  56. package/packages/panda/src/recipes/nav.ts +155 -0
  57. package/packages/panda/src/recipes/panel.ts +156 -0
  58. package/packages/panda/src/recipes/pin-input.ts +3 -2
  59. package/packages/panda/src/recipes/profile-header.ts +120 -0
  60. package/packages/panda/src/recipes/select.ts +2 -1
  61. package/packages/panda/src/recipes/slider.ts +6 -4
  62. package/packages/panda/src/recipes/theme-switcher.ts +110 -0
  63. package/packages/panda/src/recipes/thread.ts +88 -0
  64. package/packages/panda/src/theme/catalog-types.ts +2 -0
  65. package/packages/panda/src/theme/catalog.ts +23 -0
  66. package/packages/panda/src/theme/chrome.css +2 -1
  67. package/packages/panda/src/theme/global-theme-css.ts +9 -0
  68. package/packages/panda/src/theme/omarchy.themes.ts +607 -0
  69. package/packages/panda/src/theme/palette.ts +3 -0
  70. package/packages/panda/src/theme/scrollbars.css +58 -21
  71. package/packages/panda/src/theme/themes.config.ts +39 -1
  72. package/packages/panda/styled-system/css/conditions.mjs +1 -1
  73. package/packages/panda/styled-system/css/css.mjs +1 -1
  74. package/packages/panda/styled-system/css/sva.mjs +9 -4
  75. package/packages/panda/styled-system/helpers.mjs +11 -22
  76. package/packages/panda/styled-system/jsx/create-style-context.d.ts +54 -0
  77. package/packages/panda/styled-system/jsx/create-style-context.mjs +121 -0
  78. package/packages/panda/styled-system/jsx/factory.mjs +14 -5
  79. package/packages/panda/styled-system/jsx/index.d.ts +1 -0
  80. package/packages/panda/styled-system/jsx/index.mjs +1 -0
  81. package/packages/panda/styled-system/jsx/is-valid-prop.mjs +2 -2
  82. package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +0 -1
  83. package/packages/panda/styled-system/patterns/bleed.d.ts +0 -1
  84. package/packages/panda/styled-system/patterns/box.d.ts +0 -1
  85. package/packages/panda/styled-system/patterns/center.d.ts +0 -1
  86. package/packages/panda/styled-system/patterns/circle.d.ts +0 -1
  87. package/packages/panda/styled-system/patterns/container.d.ts +0 -1
  88. package/packages/panda/styled-system/patterns/cq.d.ts +0 -1
  89. package/packages/panda/styled-system/patterns/divider.d.ts +0 -1
  90. package/packages/panda/styled-system/patterns/flex.d.ts +0 -1
  91. package/packages/panda/styled-system/patterns/float.d.ts +0 -1
  92. package/packages/panda/styled-system/patterns/grid-item.d.ts +0 -1
  93. package/packages/panda/styled-system/patterns/grid.d.ts +0 -1
  94. package/packages/panda/styled-system/patterns/grid.mjs +1 -1
  95. package/packages/panda/styled-system/patterns/hstack.d.ts +0 -1
  96. package/packages/panda/styled-system/patterns/hstack.mjs +1 -1
  97. package/packages/panda/styled-system/patterns/link-overlay.d.ts +0 -1
  98. package/packages/panda/styled-system/patterns/spacer.d.ts +0 -1
  99. package/packages/panda/styled-system/patterns/spacer.mjs +6 -2
  100. package/packages/panda/styled-system/patterns/square.d.ts +0 -1
  101. package/packages/panda/styled-system/patterns/stack.d.ts +0 -1
  102. package/packages/panda/styled-system/patterns/stack.mjs +1 -1
  103. package/packages/panda/styled-system/patterns/visually-hidden.d.ts +0 -1
  104. package/packages/panda/styled-system/patterns/vstack.d.ts +0 -1
  105. package/packages/panda/styled-system/patterns/vstack.mjs +1 -1
  106. package/packages/panda/styled-system/patterns/wrap.d.ts +0 -1
  107. package/packages/panda/styled-system/patterns/wrap.mjs +1 -1
  108. package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +4 -3
  109. package/packages/panda/styled-system/recipes/aeon-accordion.mjs +1 -0
  110. package/packages/panda/styled-system/recipes/aeon-app-shell.d.ts +34 -0
  111. package/packages/panda/styled-system/recipes/aeon-app-shell.mjs +70 -0
  112. package/packages/panda/styled-system/recipes/aeon-async.d.ts +4 -3
  113. package/packages/panda/styled-system/recipes/aeon-async.mjs +1 -0
  114. package/packages/panda/styled-system/recipes/aeon-avatar.d.ts +36 -0
  115. package/packages/panda/styled-system/recipes/aeon-avatar.mjs +57 -0
  116. package/packages/panda/styled-system/recipes/aeon-badge.d.ts +3 -0
  117. package/packages/panda/styled-system/recipes/aeon-bar.d.ts +40 -0
  118. package/packages/panda/styled-system/recipes/aeon-bar.mjs +77 -0
  119. package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +3 -2
  120. package/packages/panda/styled-system/recipes/aeon-button.d.ts +3 -2
  121. package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +4 -1
  122. package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +1 -0
  123. package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +4 -3
  124. package/packages/panda/styled-system/recipes/aeon-combobox.mjs +1 -0
  125. package/packages/panda/styled-system/recipes/aeon-composer.d.ts +31 -0
  126. package/packages/panda/styled-system/recipes/aeon-composer.mjs +45 -0
  127. package/packages/panda/styled-system/recipes/aeon-content.d.ts +34 -0
  128. package/packages/panda/styled-system/recipes/aeon-content.mjs +70 -0
  129. package/packages/panda/styled-system/recipes/aeon-conversation.d.ts +31 -0
  130. package/packages/panda/styled-system/recipes/aeon-conversation.mjs +61 -0
  131. package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +4 -1
  132. package/packages/panda/styled-system/recipes/aeon-dialog.mjs +1 -0
  133. package/packages/panda/styled-system/recipes/aeon-entry.d.ts +38 -0
  134. package/packages/panda/styled-system/recipes/aeon-entry.mjs +100 -0
  135. package/packages/panda/styled-system/recipes/aeon-field.d.ts +4 -3
  136. package/packages/panda/styled-system/recipes/aeon-field.mjs +1 -0
  137. package/packages/panda/styled-system/recipes/aeon-identity.d.ts +36 -0
  138. package/packages/panda/styled-system/recipes/aeon-identity.mjs +63 -0
  139. package/packages/panda/styled-system/recipes/aeon-list-row.d.ts +33 -0
  140. package/packages/panda/styled-system/recipes/aeon-list-row.mjs +49 -0
  141. package/packages/panda/styled-system/recipes/aeon-menu.d.ts +4 -1
  142. package/packages/panda/styled-system/recipes/aeon-menu.mjs +1 -0
  143. package/packages/panda/styled-system/recipes/aeon-metric-strip.d.ts +36 -0
  144. package/packages/panda/styled-system/recipes/aeon-metric-strip.mjs +54 -0
  145. package/packages/panda/styled-system/recipes/aeon-nav.d.ts +38 -0
  146. package/packages/panda/styled-system/recipes/aeon-nav.mjs +69 -0
  147. package/packages/panda/styled-system/recipes/aeon-panel.d.ts +34 -0
  148. package/packages/panda/styled-system/recipes/aeon-panel.mjs +58 -0
  149. package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +4 -1
  150. package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +1 -0
  151. package/packages/panda/styled-system/recipes/aeon-popover.d.ts +4 -1
  152. package/packages/panda/styled-system/recipes/aeon-popover.mjs +1 -0
  153. package/packages/panda/styled-system/recipes/aeon-profile-header.d.ts +36 -0
  154. package/packages/panda/styled-system/recipes/aeon-profile-header.mjs +62 -0
  155. package/packages/panda/styled-system/recipes/aeon-progress.d.ts +4 -1
  156. package/packages/panda/styled-system/recipes/aeon-progress.mjs +1 -0
  157. package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +4 -1
  158. package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +1 -0
  159. package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +4 -3
  160. package/packages/panda/styled-system/recipes/aeon-scroll.mjs +1 -0
  161. package/packages/panda/styled-system/recipes/aeon-select.d.ts +4 -3
  162. package/packages/panda/styled-system/recipes/aeon-select.mjs +1 -0
  163. package/packages/panda/styled-system/recipes/aeon-separator.d.ts +4 -1
  164. package/packages/panda/styled-system/recipes/aeon-separator.mjs +1 -0
  165. package/packages/panda/styled-system/recipes/aeon-slider.d.ts +4 -1
  166. package/packages/panda/styled-system/recipes/aeon-slider.mjs +1 -0
  167. package/packages/panda/styled-system/recipes/aeon-switch.d.ts +4 -1
  168. package/packages/panda/styled-system/recipes/aeon-switch.mjs +1 -0
  169. package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +4 -1
  170. package/packages/panda/styled-system/recipes/aeon-tabs.mjs +1 -0
  171. package/packages/panda/styled-system/recipes/aeon-theme-switcher.d.ts +34 -0
  172. package/packages/panda/styled-system/recipes/aeon-theme-switcher.mjs +59 -0
  173. package/packages/panda/styled-system/recipes/aeon-thread.d.ts +31 -0
  174. package/packages/panda/styled-system/recipes/aeon-thread.mjs +53 -0
  175. package/packages/panda/styled-system/recipes/aeon-toast.d.ts +4 -1
  176. package/packages/panda/styled-system/recipes/aeon-toast.mjs +1 -0
  177. package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +4 -1
  178. package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +1 -0
  179. package/packages/panda/styled-system/recipes/index.d.ts +16 -1
  180. package/packages/panda/styled-system/recipes/index.mjs +16 -1
  181. package/packages/panda/styled-system/styles.css +2317 -450
  182. package/packages/panda/styled-system/tokens/index.mjs +43 -7
  183. package/packages/panda/styled-system/tokens/tokens.d.ts +5 -5
  184. package/packages/panda/styled-system/types/composition.d.ts +86 -23
  185. package/packages/panda/styled-system/types/conditions.d.ts +34 -10
  186. package/packages/panda/styled-system/types/csstype.d.ts +6405 -5133
  187. package/packages/panda/styled-system/types/jsx.d.ts +27 -10
  188. package/packages/panda/styled-system/types/pattern.d.ts +4 -4
  189. package/packages/panda/styled-system/types/prop-type.d.ts +11 -1
  190. package/packages/panda/styled-system/types/style-props.d.ts +2763 -2165
  191. package/packages/panda/styled-system/types/system-types.d.ts +38 -80
  192. package/packages/panda/theme-runtime.css +945 -0
  193. package/packages/primitives/dist/chunk-R25CUHNF.js +46 -0
  194. package/packages/primitives/dist/chunk-RO2DMFN5.js +89 -0
  195. package/packages/primitives/dist/chunk-V5D7LS4J.js +61 -0
  196. package/packages/primitives/dist/chunk-YBPNI2LI.js +70 -0
  197. package/packages/primitives/dist/index.d.ts +4 -0
  198. package/packages/primitives/dist/index.js +30 -8
  199. package/packages/primitives/dist/machines/app-shell.d.ts +57 -0
  200. package/packages/primitives/dist/machines/app-shell.js +8 -0
  201. package/packages/primitives/dist/machines/async.d.ts +4 -4
  202. package/packages/primitives/dist/machines/content-region.d.ts +72 -0
  203. package/packages/primitives/dist/machines/content-region.js +8 -0
  204. package/packages/primitives/dist/machines/panel.d.ts +50 -0
  205. package/packages/primitives/dist/machines/panel.js +6 -0
  206. package/packages/primitives/dist/machines/sticky-bar.d.ts +62 -0
  207. package/packages/primitives/dist/machines/sticky-bar.js +8 -0
  208. package/packages/primitives/node_modules/.bin/esbuild +21 -0
  209. package/packages/primitives/node_modules/.bin/vite +21 -0
  210. package/packages/primitives/node_modules/.bin/vitest +2 -2
  211. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  212. package/packages/primitives/package.json +15 -5
  213. package/packages/primitives/scripts/xstate-introspect.mjs +35 -0
  214. package/packages/primitives/src/index.ts +4 -0
  215. package/packages/primitives/src/machines/app-shell.ts +63 -0
  216. package/packages/primitives/src/machines/content-region.ts +107 -0
  217. package/packages/primitives/src/machines/panel.ts +71 -0
  218. package/packages/primitives/src/machines/sticky-bar.ts +89 -0
  219. package/packages/react/dist/index.d.ts +403 -16
  220. package/packages/react/dist/index.js +1505 -227
  221. package/packages/react/node_modules/.bin/esbuild +21 -0
  222. package/packages/react/node_modules/.bin/vite +21 -0
  223. package/packages/react/node_modules/.bin/vitest +2 -2
  224. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  225. package/packages/react/package.json +18 -7
  226. package/packages/react/src/app-shell/index.tsx +154 -0
  227. package/packages/react/src/async/index.tsx +6 -1
  228. package/packages/react/src/async/map-content-state.ts +18 -0
  229. package/packages/react/src/avatar/index.tsx +19 -0
  230. package/packages/react/src/bar/index.tsx +101 -0
  231. package/packages/react/src/button/index.tsx +4 -2
  232. package/packages/react/src/composer/index.tsx +75 -0
  233. package/packages/react/src/content/index.tsx +149 -0
  234. package/packages/react/src/conversation/index.tsx +78 -0
  235. package/packages/react/src/entry/index.tsx +85 -0
  236. package/packages/react/src/field/index.tsx +31 -18
  237. package/packages/react/src/identity/index.tsx +110 -0
  238. package/packages/react/src/index.ts +15 -0
  239. package/packages/react/src/list-row/index.tsx +80 -0
  240. package/packages/react/src/metric-strip/index.tsx +88 -0
  241. package/packages/react/src/nav/index.tsx +155 -0
  242. package/packages/react/src/panel/index.tsx +267 -0
  243. package/packages/react/src/profile-header/index.tsx +91 -0
  244. package/packages/react/src/radio-group/index.tsx +19 -7
  245. package/packages/react/src/slider/index.tsx +3 -1
  246. package/packages/react/src/sticky-bar/index.tsx +135 -0
  247. package/packages/react/src/switch/index.tsx +7 -1
  248. package/packages/react/src/theme-switcher/index.tsx +227 -0
  249. package/packages/react/src/thread/index.tsx +95 -0
  250. package/packages/react/src/toast/primitives.tsx +2 -2
  251. package/packages/react/src/tooltip/tooltip.test.tsx +9 -1
  252. package/packages/react/tsconfig.json +2 -1
  253. package/packages/schemas/README.md +52 -0
  254. package/packages/schemas/dist/index.d.ts +287 -0
  255. package/packages/schemas/dist/index.js +701 -0
  256. package/packages/schemas/json/accordion.json +132 -0
  257. package/packages/schemas/json/async.json +161 -0
  258. package/packages/schemas/json/button.json +170 -0
  259. package/packages/schemas/json/catalog.json +2299 -0
  260. package/packages/schemas/json/checkbox.json +136 -0
  261. package/packages/schemas/json/combobox.json +130 -0
  262. package/packages/schemas/json/dialog.json +154 -0
  263. package/packages/schemas/json/field.json +171 -0
  264. package/packages/schemas/json/menu.json +138 -0
  265. package/packages/schemas/json/popover.json +133 -0
  266. package/packages/schemas/json/progress.json +137 -0
  267. package/packages/schemas/json/scroll.json +129 -0
  268. package/packages/schemas/json/select.json +140 -0
  269. package/packages/schemas/json/switch.json +136 -0
  270. package/packages/schemas/json/tabs.json +135 -0
  271. package/packages/schemas/json/toast.json +141 -0
  272. package/packages/schemas/json/tooltip.json +123 -0
  273. package/packages/schemas/node_modules/.bin/esbuild +21 -0
  274. package/packages/schemas/node_modules/.bin/jiti +21 -0
  275. package/packages/schemas/node_modules/.bin/tsc +21 -0
  276. package/packages/schemas/node_modules/.bin/tsserver +21 -0
  277. package/packages/schemas/node_modules/.bin/tsup +21 -0
  278. package/packages/schemas/node_modules/.bin/tsup-node +21 -0
  279. package/packages/schemas/node_modules/.bin/tsx +21 -0
  280. package/packages/schemas/node_modules/.bin/vite +21 -0
  281. package/packages/schemas/node_modules/.bin/vitest +21 -0
  282. package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  283. package/packages/schemas/package.json +56 -0
  284. package/packages/schemas/prompts/cursorrules.md +64 -0
  285. package/packages/schemas/prompts/statecharts.md +31 -0
  286. package/packages/schemas/prompts/system.md +30 -0
  287. package/packages/schemas/registry/catalog.json +54 -0
  288. package/packages/schemas/registry/components/accordion.json +132 -0
  289. package/packages/schemas/registry/components/async.json +161 -0
  290. package/packages/schemas/registry/components/button.json +170 -0
  291. package/packages/schemas/registry/components/checkbox.json +136 -0
  292. package/packages/schemas/registry/components/combobox.json +130 -0
  293. package/packages/schemas/registry/components/dialog.json +154 -0
  294. package/packages/schemas/registry/components/field.json +171 -0
  295. package/packages/schemas/registry/components/menu.json +138 -0
  296. package/packages/schemas/registry/components/popover.json +133 -0
  297. package/packages/schemas/registry/components/progress.json +137 -0
  298. package/packages/schemas/registry/components/scroll.json +129 -0
  299. package/packages/schemas/registry/components/select.json +140 -0
  300. package/packages/schemas/registry/components/switch.json +136 -0
  301. package/packages/schemas/registry/components/tabs.json +135 -0
  302. package/packages/schemas/registry/components/toast.json +141 -0
  303. package/packages/schemas/registry/components/tooltip.json +123 -0
  304. package/packages/schemas/registry/machines/async.json +219 -0
  305. package/packages/schemas/registry/machines/buttonLifecycle.json +224 -0
  306. package/packages/schemas/registry/machines/dialog.json +143 -0
  307. package/packages/schemas/registry/machines/field.json +275 -0
  308. package/packages/schemas/scripts/emit.ts +61 -0
  309. package/packages/schemas/src/aeon-to-schema.test.ts +70 -0
  310. package/packages/schemas/src/aeon-to-schema.ts +206 -0
  311. package/packages/schemas/src/agent-bridge.ts +82 -0
  312. package/packages/schemas/src/components.ts +307 -0
  313. package/packages/schemas/src/index.test.ts +25 -0
  314. package/packages/schemas/src/index.ts +25 -0
  315. package/packages/schemas/src/prompts.ts +121 -0
  316. package/packages/schemas/src/registry.ts +73 -0
  317. package/packages/schemas/src/schema-builder.ts +87 -0
  318. package/packages/schemas/tsconfig.json +9 -0
  319. package/packages/solid/package.json +2 -2
  320. package/packages/svelte/node_modules/.bin/esbuild +21 -0
  321. package/packages/svelte/node_modules/.bin/vite +4 -4
  322. package/packages/svelte/package.json +15 -5
  323. package/packages/ui/README.md +19 -6
  324. package/packages/ui/dist/index.d.ts +254 -9
  325. package/packages/ui/dist/index.js +690 -139
  326. package/packages/ui/src/app-shell.tsx +44 -0
  327. package/packages/ui/src/async.tsx +2 -1
  328. package/packages/ui/src/avatar.tsx +35 -0
  329. package/packages/ui/src/bar.tsx +34 -0
  330. package/packages/ui/src/composer.tsx +27 -0
  331. package/packages/ui/src/content.tsx +43 -0
  332. package/packages/ui/src/conversation.tsx +43 -0
  333. package/packages/ui/src/entry.tsx +76 -0
  334. package/packages/ui/src/field.tsx +5 -0
  335. package/packages/ui/src/identity.tsx +35 -0
  336. package/packages/ui/src/index.ts +16 -0
  337. package/packages/ui/src/list-row.tsx +30 -0
  338. package/packages/ui/src/metric-strip.tsx +29 -0
  339. package/packages/ui/src/nav.tsx +46 -0
  340. package/packages/ui/src/panel.tsx +39 -0
  341. package/packages/ui/src/profile-header.tsx +35 -0
  342. package/packages/ui/src/sticky-bar.tsx +42 -0
  343. package/packages/ui/src/switch.tsx +17 -4
  344. package/packages/ui/src/theme-switcher.tsx +41 -0
  345. package/packages/ui/src/thread.tsx +35 -0
  346. package/packages/vue/package.json +3 -3
  347. package/scripts/vite-aliases.mjs +57 -3
  348. package/scripts/xstate-introspect.mjs +68 -0
  349. package/packages/react/src/async/legacy-region.tsx +0 -38
@@ -0,0 +1,88 @@
1
+ import { metricStripAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { createContext, forwardRef, useContext, type HTMLAttributes, type ReactNode } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ interface MetricStripContextValue {
6
+ density: 'cluster' | 'loose'
7
+ }
8
+
9
+ const MetricCtx = createContext<MetricStripContextValue | null>(null)
10
+
11
+ function useMetricCtx() {
12
+ const ctx = useContext(MetricCtx)
13
+ if (!ctx) throw new Error('MetricStrip parts must be used within MetricStrip.Root')
14
+ return ctx
15
+ }
16
+
17
+ export interface MetricStripRootProps extends HTMLAttributes<HTMLElement> {
18
+ /** cluster = ultra-dense chips; loose = columnar stats */
19
+ density?: 'cluster' | 'loose'
20
+ children?: ReactNode
21
+ }
22
+
23
+ /**
24
+ * MetricStrip — dense value/label chips (generic stats, not product wallets).
25
+ */
26
+ const Root = forwardRef<HTMLElement, MetricStripRootProps>(function MetricStripRoot(
27
+ { density = 'cluster', children, ...rest },
28
+ ref,
29
+ ) {
30
+ return (
31
+ <MetricCtx.Provider value={{ density }}>
32
+ <div
33
+ ref={ref as never}
34
+ data-aeon-density={density}
35
+ role="group"
36
+ {...mergeProps(scopeAttrs(metricStripAnatomy.scope, metricStripAnatomy.root), rest)}
37
+ >
38
+ {children}
39
+ </div>
40
+ </MetricCtx.Provider>
41
+ )
42
+ })
43
+
44
+ const Chip = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function MetricChip(
45
+ props,
46
+ ref,
47
+ ) {
48
+ useMetricCtx()
49
+ return (
50
+ <span
51
+ ref={ref}
52
+ {...mergeProps(partAttrs(metricStripAnatomy.scope, metricStripAnatomy.chip), props)}
53
+ />
54
+ )
55
+ })
56
+
57
+ const Value = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function MetricValue(
58
+ props,
59
+ ref,
60
+ ) {
61
+ useMetricCtx()
62
+ return (
63
+ <span
64
+ ref={ref}
65
+ {...mergeProps(partAttrs(metricStripAnatomy.scope, metricStripAnatomy.value), props)}
66
+ />
67
+ )
68
+ })
69
+
70
+ const Label = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function MetricLabel(
71
+ props,
72
+ ref,
73
+ ) {
74
+ useMetricCtx()
75
+ return (
76
+ <span
77
+ ref={ref}
78
+ {...mergeProps(partAttrs(metricStripAnatomy.scope, metricStripAnatomy.label), props)}
79
+ />
80
+ )
81
+ })
82
+
83
+ export const MetricStrip = {
84
+ Root,
85
+ Chip,
86
+ Value,
87
+ Label,
88
+ }
@@ -0,0 +1,155 @@
1
+ import { navAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { tabsMachine } from '@aeon-ui/primitives'
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useContext,
7
+ useEffect,
8
+ useMemo,
9
+ type ButtonHTMLAttributes,
10
+ type HTMLAttributes,
11
+ type ReactNode,
12
+ } from 'react'
13
+ import { useAeonMachine } from '../hooks/use-aeon-machine.js'
14
+ import { mergeProps } from '../utils/merge-props.js'
15
+
16
+ interface NavContextValue {
17
+ value: string
18
+ send: ReturnType<typeof useAeonMachine<typeof tabsMachine>>[1]
19
+ onValueChange?: (value: string) => void
20
+ }
21
+
22
+ const NavCtx = createContext<NavContextValue | null>(null)
23
+
24
+ function useNavCtx() {
25
+ const ctx = useContext(NavCtx)
26
+ if (!ctx) throw new Error('Nav parts must be used within Nav.Root')
27
+ return ctx
28
+ }
29
+
30
+ export interface NavRootProps extends HTMLAttributes<HTMLElement> {
31
+ defaultValue?: string
32
+ value?: string
33
+ onValueChange?: (value: string) => void
34
+ as?: 'nav' | 'div'
35
+ orientation?: 'horizontal' | 'vertical'
36
+ children?: ReactNode
37
+ }
38
+
39
+ const Root = forwardRef<HTMLElement, NavRootProps>(function NavRoot(
40
+ {
41
+ defaultValue = '',
42
+ value,
43
+ onValueChange,
44
+ as: Tag = 'nav',
45
+ orientation = 'horizontal',
46
+ children,
47
+ ...rest
48
+ },
49
+ ref,
50
+ ) {
51
+ const [snapshot, send] = useAeonMachine(tabsMachine, {
52
+ input: { value: defaultValue, disabled: false },
53
+ })
54
+ const resolvedValue = value ?? snapshot.context.value
55
+
56
+ useEffect(() => {
57
+ if (value !== undefined) send({ type: 'SET_VALUE', value })
58
+ }, [value, send])
59
+
60
+ const ctx = useMemo(
61
+ () => ({ value: resolvedValue, send, onValueChange }),
62
+ [resolvedValue, send, onValueChange],
63
+ )
64
+
65
+ return (
66
+ <NavCtx.Provider value={ctx}>
67
+ <Tag
68
+ ref={ref as never}
69
+ data-aeon-orientation={orientation}
70
+ {...mergeProps(scopeAttrs(navAnatomy.scope, navAnatomy.root), rest)}
71
+ >
72
+ {children}
73
+ </Tag>
74
+ </NavCtx.Provider>
75
+ )
76
+ })
77
+
78
+ export interface NavItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {
79
+ value: string
80
+ }
81
+
82
+ const Item = forwardRef<HTMLButtonElement, NavItemProps>(function NavItem(
83
+ { value, disabled, onClick, children, ...rest },
84
+ ref,
85
+ ) {
86
+ const { value: selected, send, onValueChange } = useNavCtx()
87
+ const active = selected === value
88
+ const state = disabled ? 'disabled' : active ? 'active' : 'inactive'
89
+
90
+ return (
91
+ <button
92
+ ref={ref}
93
+ type="button"
94
+ disabled={disabled}
95
+ aria-current={active ? 'page' : undefined}
96
+ data-aeon-value={value}
97
+ onClick={(e) => {
98
+ onClick?.(e)
99
+ if (disabled || e.defaultPrevented) return
100
+ send({ type: 'SELECT', value })
101
+ onValueChange?.(value)
102
+ }}
103
+ {...mergeProps(partAttrs(navAnatomy.scope, navAnatomy.item, { state, disabled }), rest)}
104
+ >
105
+ {children}
106
+ </button>
107
+ )
108
+ })
109
+
110
+ const Indicator = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function NavIndicator(
111
+ props,
112
+ ref,
113
+ ) {
114
+ return (
115
+ <span
116
+ ref={ref}
117
+ aria-hidden
118
+ {...mergeProps(partAttrs(navAnatomy.scope, navAnatomy.indicator), props)}
119
+ />
120
+ )
121
+ })
122
+
123
+ const Label = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function NavLabel(
124
+ props,
125
+ ref,
126
+ ) {
127
+ return <span ref={ref} {...mergeProps(partAttrs(navAnatomy.scope, navAnatomy.label), props)} />
128
+ })
129
+
130
+ const Icon = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function NavIcon(
131
+ props,
132
+ ref,
133
+ ) {
134
+ return <span ref={ref} {...mergeProps(partAttrs(navAnatomy.scope, navAnatomy.icon), props)} />
135
+ })
136
+
137
+ const Badge = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function NavBadge(
138
+ props,
139
+ ref,
140
+ ) {
141
+ return <span ref={ref} {...mergeProps(partAttrs(navAnatomy.scope, navAnatomy.badge), props)} />
142
+ })
143
+
144
+ /**
145
+ * Nav — navigational collection (top links, bottom tabs, side rail).
146
+ * Selection: tabsMachine. Item states: inactive | active | disabled.
147
+ */
148
+ export const Nav = {
149
+ Root,
150
+ Item,
151
+ Indicator,
152
+ Label,
153
+ Icon,
154
+ Badge,
155
+ }
@@ -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
+ }
@@ -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)