aeon-ui-engine 1.8.0 → 1.9.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 (527) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/package.json +5 -2
  3. package/packages/core/dist/index.d.ts +116 -1
  4. package/packages/core/dist/index.js +202 -1
  5. package/packages/core/src/anatomy.ts +13 -1
  6. package/packages/core/src/index.ts +2 -0
  7. package/packages/core/src/list-window.ts +149 -0
  8. package/packages/core/src/sound.ts +154 -0
  9. package/packages/panda/package.json +6 -3
  10. package/packages/panda/panda.config.ts +12 -0
  11. package/packages/panda/src/recipes/clipboard.ts +40 -0
  12. package/packages/panda/src/recipes/composer.ts +4 -3
  13. package/packages/panda/src/recipes/index.ts +4 -0
  14. package/packages/panda/src/recipes/prose.ts +110 -0
  15. package/packages/panda/src/recipes/segment-group.ts +50 -0
  16. package/packages/panda/src/recipes/textarea.ts +60 -0
  17. package/packages/panda/styled-system/css/conditions.d.ts +7 -0
  18. package/packages/panda/styled-system/css/conditions.js +32 -0
  19. package/packages/panda/styled-system/css/css.d.ts +6 -6
  20. package/packages/panda/styled-system/css/css.js +63 -0
  21. package/packages/panda/styled-system/css/cva.d.ts +2 -3
  22. package/packages/panda/styled-system/css/cva.js +51 -0
  23. package/packages/panda/styled-system/css/cx.d.ts +5 -4
  24. package/packages/panda/styled-system/css/{cx.mjs → cx.js} +5 -4
  25. package/packages/panda/styled-system/css/first-that-works.d.ts +22 -0
  26. package/packages/panda/styled-system/css/first-that-works.js +1 -0
  27. package/packages/panda/styled-system/css/index.d.ts +6 -3
  28. package/packages/panda/styled-system/css/index.js +8 -0
  29. package/packages/panda/styled-system/css/keyframes.d.ts +5 -0
  30. package/packages/panda/styled-system/css/keyframes.js +8 -0
  31. package/packages/panda/styled-system/css/position-try.d.ts +5 -0
  32. package/packages/panda/styled-system/css/position-try.js +11 -0
  33. package/packages/panda/styled-system/css/sva.d.ts +1 -2
  34. package/packages/panda/styled-system/css/sva.js +49 -0
  35. package/packages/panda/styled-system/css/view-transition.d.ts +7 -0
  36. package/packages/panda/styled-system/css/view-transition.js +18 -0
  37. package/packages/panda/styled-system/helpers.d.ts +67 -0
  38. package/packages/panda/styled-system/helpers.js +624 -0
  39. package/packages/panda/styled-system/jsx/aspect-ratio.d.ts +3 -6
  40. package/packages/panda/styled-system/jsx/aspect-ratio.js +11 -0
  41. package/packages/panda/styled-system/jsx/bleed.d.ts +4 -7
  42. package/packages/panda/styled-system/jsx/bleed.js +11 -0
  43. package/packages/panda/styled-system/jsx/box.d.ts +4 -7
  44. package/packages/panda/styled-system/jsx/box.js +11 -0
  45. package/packages/panda/styled-system/jsx/center.d.ts +4 -7
  46. package/packages/panda/styled-system/jsx/center.js +11 -0
  47. package/packages/panda/styled-system/jsx/circle.d.ts +4 -7
  48. package/packages/panda/styled-system/jsx/circle.js +11 -0
  49. package/packages/panda/styled-system/jsx/container.d.ts +4 -7
  50. package/packages/panda/styled-system/jsx/container.js +11 -0
  51. package/packages/panda/styled-system/jsx/cq.d.ts +4 -7
  52. package/packages/panda/styled-system/jsx/cq.js +11 -0
  53. package/packages/panda/styled-system/jsx/create-recipe-context.d.ts +31 -0
  54. package/packages/panda/styled-system/jsx/create-recipe-context.js +38 -0
  55. package/packages/panda/styled-system/jsx/create-slot-recipe-context.d.ts +49 -0
  56. package/packages/panda/styled-system/jsx/create-slot-recipe-context.js +124 -0
  57. package/packages/panda/styled-system/jsx/divider.d.ts +4 -7
  58. package/packages/panda/styled-system/jsx/divider.js +11 -0
  59. package/packages/panda/styled-system/jsx/factory.d.ts +2 -2
  60. package/packages/panda/styled-system/jsx/factory.js +91 -0
  61. package/packages/panda/styled-system/jsx/flex.d.ts +4 -7
  62. package/packages/panda/styled-system/jsx/flex.js +11 -0
  63. package/packages/panda/styled-system/jsx/float.d.ts +4 -7
  64. package/packages/panda/styled-system/jsx/float.js +11 -0
  65. package/packages/panda/styled-system/jsx/grid-item.d.ts +4 -7
  66. package/packages/panda/styled-system/jsx/grid-item.js +11 -0
  67. package/packages/panda/styled-system/jsx/grid.d.ts +4 -7
  68. package/packages/panda/styled-system/jsx/grid.js +11 -0
  69. package/packages/panda/styled-system/jsx/helper.d.ts +34 -0
  70. package/packages/panda/styled-system/jsx/helper.js +92 -0
  71. package/packages/panda/styled-system/jsx/hstack.d.ts +4 -7
  72. package/packages/panda/styled-system/jsx/hstack.js +11 -0
  73. package/packages/panda/styled-system/jsx/index.d.ts +17 -17
  74. package/packages/panda/styled-system/jsx/index.js +24 -0
  75. package/packages/panda/styled-system/jsx/is-valid-prop.d.ts +5 -10
  76. package/packages/panda/styled-system/jsx/is-valid-prop.js +12 -0
  77. package/packages/panda/styled-system/jsx/link-overlay.d.ts +4 -7
  78. package/packages/panda/styled-system/jsx/link-overlay.js +11 -0
  79. package/packages/panda/styled-system/jsx/spacer.d.ts +4 -7
  80. package/packages/panda/styled-system/jsx/spacer.js +11 -0
  81. package/packages/panda/styled-system/jsx/square.d.ts +4 -7
  82. package/packages/panda/styled-system/jsx/square.js +11 -0
  83. package/packages/panda/styled-system/jsx/stack.d.ts +4 -7
  84. package/packages/panda/styled-system/jsx/stack.js +11 -0
  85. package/packages/panda/styled-system/jsx/visually-hidden.d.ts +4 -7
  86. package/packages/panda/styled-system/jsx/visually-hidden.js +11 -0
  87. package/packages/panda/styled-system/jsx/vstack.d.ts +4 -7
  88. package/packages/panda/styled-system/jsx/vstack.js +11 -0
  89. package/packages/panda/styled-system/jsx/wrap.d.ts +4 -7
  90. package/packages/panda/styled-system/jsx/wrap.js +11 -0
  91. package/packages/panda/styled-system/patterns/aspect-ratio.d.ts +8 -9
  92. package/packages/panda/styled-system/patterns/aspect-ratio.js +37 -0
  93. package/packages/panda/styled-system/patterns/bleed.d.ts +9 -10
  94. package/packages/panda/styled-system/patterns/bleed.js +30 -0
  95. package/packages/panda/styled-system/patterns/box.d.ts +8 -11
  96. package/packages/panda/styled-system/patterns/box.js +16 -0
  97. package/packages/panda/styled-system/patterns/center.d.ts +8 -9
  98. package/packages/panda/styled-system/patterns/center.js +22 -0
  99. package/packages/panda/styled-system/patterns/circle.d.ts +8 -9
  100. package/packages/panda/styled-system/patterns/circle.js +26 -0
  101. package/packages/panda/styled-system/patterns/container.d.ts +8 -11
  102. package/packages/panda/styled-system/patterns/container.js +26 -0
  103. package/packages/panda/styled-system/patterns/cq.d.ts +10 -10
  104. package/packages/panda/styled-system/patterns/cq.js +24 -0
  105. package/packages/panda/styled-system/patterns/divider.d.ts +11 -11
  106. package/packages/panda/styled-system/patterns/divider.js +31 -0
  107. package/packages/panda/styled-system/patterns/flex.d.ts +14 -15
  108. package/packages/panda/styled-system/patterns/flex.js +27 -0
  109. package/packages/panda/styled-system/patterns/float.d.ts +12 -12
  110. package/packages/panda/styled-system/patterns/float.js +84 -0
  111. package/packages/panda/styled-system/patterns/grid-item.d.ts +13 -14
  112. package/packages/panda/styled-system/patterns/grid-item.js +26 -0
  113. package/packages/panda/styled-system/patterns/grid.d.ts +13 -13
  114. package/packages/panda/styled-system/patterns/grid.js +30 -0
  115. package/packages/panda/styled-system/patterns/hstack.d.ts +9 -10
  116. package/packages/panda/styled-system/patterns/hstack.js +27 -0
  117. package/packages/panda/styled-system/patterns/index.d.ts +14 -15
  118. package/packages/panda/styled-system/patterns/index.js +20 -0
  119. package/packages/panda/styled-system/patterns/link-overlay.d.ts +8 -11
  120. package/packages/panda/styled-system/patterns/link-overlay.js +25 -0
  121. package/packages/panda/styled-system/patterns/runtime.js +25 -0
  122. package/packages/panda/styled-system/patterns/spacer.d.ts +9 -9
  123. package/packages/panda/styled-system/patterns/spacer.js +26 -0
  124. package/packages/panda/styled-system/patterns/square.d.ts +8 -9
  125. package/packages/panda/styled-system/patterns/square.js +25 -0
  126. package/packages/panda/styled-system/patterns/stack.d.ts +11 -12
  127. package/packages/panda/styled-system/patterns/stack.js +30 -0
  128. package/packages/panda/styled-system/patterns/visually-hidden.d.ts +8 -11
  129. package/packages/panda/styled-system/patterns/visually-hidden.js +19 -0
  130. package/packages/panda/styled-system/patterns/vstack.d.ts +9 -10
  131. package/packages/panda/styled-system/patterns/vstack.js +27 -0
  132. package/packages/panda/styled-system/patterns/wrap.d.ts +12 -13
  133. package/packages/panda/styled-system/patterns/wrap.js +26 -0
  134. package/packages/panda/styled-system/recipes/aeon-accordion.d.ts +9 -26
  135. package/packages/panda/styled-system/recipes/aeon-accordion.js +5 -0
  136. package/packages/panda/styled-system/recipes/aeon-app-shell.d.ts +10 -26
  137. package/packages/panda/styled-system/recipes/aeon-app-shell.js +5 -0
  138. package/packages/panda/styled-system/recipes/aeon-async.d.ts +9 -26
  139. package/packages/panda/styled-system/recipes/aeon-async.js +5 -0
  140. package/packages/panda/styled-system/recipes/aeon-avatar.d.ts +10 -28
  141. package/packages/panda/styled-system/recipes/aeon-avatar.js +5 -0
  142. package/packages/panda/styled-system/recipes/aeon-badge.d.ts +8 -26
  143. package/packages/panda/styled-system/recipes/aeon-badge.js +5 -0
  144. package/packages/panda/styled-system/recipes/aeon-bar.d.ts +13 -32
  145. package/packages/panda/styled-system/recipes/aeon-bar.js +5 -0
  146. package/packages/panda/styled-system/recipes/aeon-button-group.d.ts +10 -33
  147. package/packages/panda/styled-system/recipes/aeon-button-group.js +5 -0
  148. package/packages/panda/styled-system/recipes/aeon-button.d.ts +10 -33
  149. package/packages/panda/styled-system/recipes/aeon-button.js +5 -0
  150. package/packages/panda/styled-system/recipes/aeon-checkbox.d.ts +9 -24
  151. package/packages/panda/styled-system/recipes/aeon-checkbox.js +5 -0
  152. package/packages/panda/styled-system/recipes/aeon-clipboard.d.ts +16 -0
  153. package/packages/panda/styled-system/recipes/aeon-clipboard.js +5 -0
  154. package/packages/panda/styled-system/recipes/aeon-combobox.d.ts +9 -26
  155. package/packages/panda/styled-system/recipes/aeon-combobox.js +5 -0
  156. package/packages/panda/styled-system/recipes/aeon-composer.d.ts +9 -24
  157. package/packages/panda/styled-system/recipes/aeon-composer.js +5 -0
  158. package/packages/panda/styled-system/recipes/aeon-content.d.ts +10 -26
  159. package/packages/panda/styled-system/recipes/aeon-content.js +5 -0
  160. package/packages/panda/styled-system/recipes/aeon-conversation.d.ts +9 -24
  161. package/packages/panda/styled-system/recipes/aeon-conversation.js +5 -0
  162. package/packages/panda/styled-system/recipes/aeon-dialog.d.ts +9 -24
  163. package/packages/panda/styled-system/recipes/aeon-dialog.js +5 -0
  164. package/packages/panda/styled-system/recipes/aeon-entry.d.ts +11 -30
  165. package/packages/panda/styled-system/recipes/aeon-entry.js +5 -0
  166. package/packages/panda/styled-system/recipes/aeon-field.d.ts +9 -26
  167. package/packages/panda/styled-system/recipes/aeon-field.js +5 -0
  168. package/packages/panda/styled-system/recipes/aeon-file-upload.d.ts +9 -24
  169. package/packages/panda/styled-system/recipes/aeon-file-upload.js +5 -0
  170. package/packages/panda/styled-system/recipes/aeon-identity.d.ts +10 -28
  171. package/packages/panda/styled-system/recipes/aeon-identity.js +5 -0
  172. package/packages/panda/styled-system/recipes/aeon-list-row.d.ts +9 -26
  173. package/packages/panda/styled-system/recipes/aeon-list-row.js +5 -0
  174. package/packages/panda/styled-system/recipes/aeon-menu.d.ts +9 -24
  175. package/packages/panda/styled-system/recipes/aeon-menu.js +5 -0
  176. package/packages/panda/styled-system/recipes/aeon-metric-strip.d.ts +10 -28
  177. package/packages/panda/styled-system/recipes/aeon-metric-strip.js +5 -0
  178. package/packages/panda/styled-system/recipes/aeon-nav.d.ts +11 -30
  179. package/packages/panda/styled-system/recipes/aeon-nav.js +5 -0
  180. package/packages/panda/styled-system/recipes/aeon-panel.d.ts +10 -26
  181. package/packages/panda/styled-system/recipes/aeon-panel.js +5 -0
  182. package/packages/panda/styled-system/recipes/aeon-pin-input.d.ts +9 -24
  183. package/packages/panda/styled-system/recipes/aeon-pin-input.js +5 -0
  184. package/packages/panda/styled-system/recipes/aeon-popover.d.ts +9 -24
  185. package/packages/panda/styled-system/recipes/aeon-popover.js +5 -0
  186. package/packages/panda/styled-system/recipes/aeon-profile-header.d.ts +10 -28
  187. package/packages/panda/styled-system/recipes/aeon-profile-header.js +5 -0
  188. package/packages/panda/styled-system/recipes/aeon-progress.d.ts +9 -24
  189. package/packages/panda/styled-system/recipes/aeon-progress.js +5 -0
  190. package/packages/panda/styled-system/recipes/aeon-prose.d.ts +16 -0
  191. package/packages/panda/styled-system/recipes/aeon-prose.js +5 -0
  192. package/packages/panda/styled-system/recipes/aeon-radio-group.d.ts +9 -24
  193. package/packages/panda/styled-system/recipes/aeon-radio-group.js +5 -0
  194. package/packages/panda/styled-system/recipes/aeon-range-slider.d.ts +9 -24
  195. package/packages/panda/styled-system/recipes/aeon-range-slider.js +5 -0
  196. package/packages/panda/styled-system/recipes/aeon-scroll.d.ts +12 -36
  197. package/packages/panda/styled-system/recipes/aeon-scroll.js +5 -0
  198. package/packages/panda/styled-system/recipes/aeon-segment-group.d.ts +18 -0
  199. package/packages/panda/styled-system/recipes/aeon-segment-group.js +5 -0
  200. package/packages/panda/styled-system/recipes/aeon-select.d.ts +9 -26
  201. package/packages/panda/styled-system/recipes/aeon-select.js +5 -0
  202. package/packages/panda/styled-system/recipes/aeon-separator.d.ts +10 -26
  203. package/packages/panda/styled-system/recipes/aeon-separator.js +5 -0
  204. package/packages/panda/styled-system/recipes/aeon-slider.d.ts +9 -24
  205. package/packages/panda/styled-system/recipes/aeon-slider.js +5 -0
  206. package/packages/panda/styled-system/recipes/aeon-switch.d.ts +9 -24
  207. package/packages/panda/styled-system/recipes/aeon-switch.js +5 -0
  208. package/packages/panda/styled-system/recipes/aeon-tabs.d.ts +9 -24
  209. package/packages/panda/styled-system/recipes/aeon-tabs.js +5 -0
  210. package/packages/panda/styled-system/recipes/aeon-textarea.d.ts +18 -0
  211. package/packages/panda/styled-system/recipes/aeon-textarea.js +5 -0
  212. package/packages/panda/styled-system/recipes/aeon-theme-switcher.d.ts +10 -26
  213. package/packages/panda/styled-system/recipes/aeon-theme-switcher.js +5 -0
  214. package/packages/panda/styled-system/recipes/aeon-thread.d.ts +9 -24
  215. package/packages/panda/styled-system/recipes/aeon-thread.js +5 -0
  216. package/packages/panda/styled-system/recipes/aeon-toast.d.ts +9 -24
  217. package/packages/panda/styled-system/recipes/aeon-toast.js +5 -0
  218. package/packages/panda/styled-system/recipes/aeon-tooltip.d.ts +9 -24
  219. package/packages/panda/styled-system/recipes/aeon-tooltip.js +5 -0
  220. package/packages/panda/styled-system/recipes/index.d.ts +31 -28
  221. package/packages/panda/styled-system/recipes/index.js +43 -0
  222. package/packages/panda/styled-system/recipes/runtime.js +133 -0
  223. package/packages/panda/styled-system/styles.css +1899 -2106
  224. package/packages/panda/styled-system/tokens/index.d.ts +4 -5
  225. package/packages/panda/styled-system/tokens/index.js +18 -0
  226. package/packages/panda/styled-system/types/index.d.ts +3 -6
  227. package/packages/panda/styled-system/types/jsx.d.ts +36 -27
  228. package/packages/panda/styled-system/types/pattern.d.ts +18 -70
  229. package/packages/panda/styled-system/types/recipe.d.ts +50 -154
  230. package/packages/panda/styled-system/types/system.d.ts +1826 -0
  231. package/packages/panda/styled-system/types/tokens.d.ts +65 -0
  232. package/packages/panda/tsconfig.json +3 -1
  233. package/packages/primitives/dist/chunk-5BNAV4S2.js +258 -0
  234. package/packages/primitives/dist/chunk-HYHCIMHC.js +45 -0
  235. package/packages/primitives/dist/index.d.ts +2 -0
  236. package/packages/primitives/dist/index.js +30 -12
  237. package/packages/primitives/dist/machines/app-nav.d.ts +3 -3
  238. package/packages/primitives/dist/machines/cache.d.ts +223 -0
  239. package/packages/primitives/dist/machines/cache.js +14 -0
  240. package/packages/primitives/dist/machines/clipboard.d.ts +46 -0
  241. package/packages/primitives/dist/machines/clipboard.js +8 -0
  242. package/packages/primitives/dist/machines/tabs.d.ts +2 -2
  243. package/packages/primitives/src/index.ts +2 -0
  244. package/packages/primitives/src/machines/cache.ts +395 -0
  245. package/packages/primitives/src/machines/clipboard.ts +56 -0
  246. package/packages/react/dist/index.d.ts +106 -10
  247. package/packages/react/dist/index.js +1350 -994
  248. package/packages/react/src/clipboard/index.tsx +117 -0
  249. package/packages/react/src/composer/index.tsx +14 -5
  250. package/packages/react/src/index.ts +4 -0
  251. package/packages/react/src/prose/index.tsx +11 -0
  252. package/packages/react/src/radio-group/index.tsx +2 -1
  253. package/packages/react/src/scroll/index.tsx +1 -0
  254. package/packages/react/src/scroll/use-windowed-range.ts +118 -0
  255. package/packages/react/src/segment-group/index.tsx +171 -0
  256. package/packages/react/src/select/index.tsx +11 -2
  257. package/packages/react/src/tabs/index.tsx +19 -7
  258. package/packages/react/src/textarea/index.tsx +75 -0
  259. package/packages/react/src/utils/assign-ref.ts +7 -0
  260. package/packages/schemas/dist/index.d.ts +8 -0
  261. package/packages/schemas/dist/index.js +59 -0
  262. package/packages/schemas/json/catalog.json +493 -0
  263. package/packages/schemas/json/clipboard.json +136 -0
  264. package/packages/schemas/json/prose.json +103 -0
  265. package/packages/schemas/json/segmentGroup.json +131 -0
  266. package/packages/schemas/json/textarea.json +119 -0
  267. package/packages/schemas/registry/catalog.json +34 -0
  268. package/packages/schemas/registry/components/clipboard.json +136 -0
  269. package/packages/schemas/registry/components/prose.json +103 -0
  270. package/packages/schemas/registry/components/segmentGroup.json +131 -0
  271. package/packages/schemas/registry/components/textarea.json +119 -0
  272. package/packages/schemas/registry/machines/clipboard.json +110 -0
  273. package/packages/schemas/scripts/emit.ts +2 -0
  274. package/packages/schemas/src/components.ts +63 -0
  275. package/packages/ui/dist/index.d.ts +27 -3
  276. package/packages/ui/dist/index.js +232 -165
  277. package/packages/ui/src/clipboard.tsx +51 -0
  278. package/packages/ui/src/index.ts +4 -0
  279. package/packages/ui/src/prose.tsx +15 -0
  280. package/packages/ui/src/segment-group.tsx +28 -0
  281. package/packages/ui/src/textarea.tsx +17 -0
  282. package/scripts/vite-aliases.mjs +2 -2
  283. package/packages/cli/node_modules/.bin/esbuild +0 -21
  284. package/packages/cli/node_modules/.bin/jiti +0 -21
  285. package/packages/cli/node_modules/.bin/tsc +0 -21
  286. package/packages/cli/node_modules/.bin/tsserver +0 -21
  287. package/packages/cli/node_modules/.bin/tsup +0 -21
  288. package/packages/cli/node_modules/.bin/tsup-node +0 -21
  289. package/packages/cli/node_modules/.bin/tsx +0 -21
  290. package/packages/cli/node_modules/.bin/vite +0 -21
  291. package/packages/cli/node_modules/.bin/vitest +0 -21
  292. package/packages/core/node_modules/.bin/esbuild +0 -21
  293. package/packages/core/node_modules/.bin/jiti +0 -21
  294. package/packages/core/node_modules/.bin/tsc +0 -21
  295. package/packages/core/node_modules/.bin/tsserver +0 -21
  296. package/packages/core/node_modules/.bin/tsup +0 -21
  297. package/packages/core/node_modules/.bin/tsup-node +0 -21
  298. package/packages/core/node_modules/.bin/tsx +0 -21
  299. package/packages/core/node_modules/.bin/vite +0 -21
  300. package/packages/core/node_modules/.bin/vitest +0 -21
  301. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  302. package/packages/core/src/identicon.test.ts +0 -39
  303. package/packages/core/src/machine.test.ts +0 -79
  304. package/packages/core/src/theme.test.ts +0 -14
  305. package/packages/geometry/node_modules/.bin/esbuild +0 -21
  306. package/packages/geometry/node_modules/.bin/jiti +0 -21
  307. package/packages/geometry/node_modules/.bin/tsc +0 -21
  308. package/packages/geometry/node_modules/.bin/tsserver +0 -21
  309. package/packages/geometry/node_modules/.bin/tsup +0 -21
  310. package/packages/geometry/node_modules/.bin/tsup-node +0 -21
  311. package/packages/geometry/node_modules/.bin/tsx +0 -21
  312. package/packages/panda/styled-system/css/conditions.mjs +0 -36
  313. package/packages/panda/styled-system/css/css.mjs +0 -45
  314. package/packages/panda/styled-system/css/cva.mjs +0 -87
  315. package/packages/panda/styled-system/css/index.mjs +0 -4
  316. package/packages/panda/styled-system/css/sva.mjs +0 -46
  317. package/packages/panda/styled-system/helpers.mjs +0 -328
  318. package/packages/panda/styled-system/jsx/aspect-ratio.mjs +0 -14
  319. package/packages/panda/styled-system/jsx/bleed.mjs +0 -14
  320. package/packages/panda/styled-system/jsx/box.mjs +0 -14
  321. package/packages/panda/styled-system/jsx/center.mjs +0 -14
  322. package/packages/panda/styled-system/jsx/circle.mjs +0 -14
  323. package/packages/panda/styled-system/jsx/container.mjs +0 -14
  324. package/packages/panda/styled-system/jsx/cq.mjs +0 -14
  325. package/packages/panda/styled-system/jsx/create-style-context.d.ts +0 -54
  326. package/packages/panda/styled-system/jsx/create-style-context.mjs +0 -121
  327. package/packages/panda/styled-system/jsx/divider.mjs +0 -14
  328. package/packages/panda/styled-system/jsx/factory-helper.mjs +0 -22
  329. package/packages/panda/styled-system/jsx/factory.mjs +0 -89
  330. package/packages/panda/styled-system/jsx/flex.mjs +0 -14
  331. package/packages/panda/styled-system/jsx/float.mjs +0 -14
  332. package/packages/panda/styled-system/jsx/grid-item.mjs +0 -14
  333. package/packages/panda/styled-system/jsx/grid.mjs +0 -14
  334. package/packages/panda/styled-system/jsx/hstack.mjs +0 -14
  335. package/packages/panda/styled-system/jsx/index.mjs +0 -23
  336. package/packages/panda/styled-system/jsx/is-valid-prop.mjs +0 -17
  337. package/packages/panda/styled-system/jsx/link-overlay.mjs +0 -14
  338. package/packages/panda/styled-system/jsx/spacer.mjs +0 -14
  339. package/packages/panda/styled-system/jsx/square.mjs +0 -14
  340. package/packages/panda/styled-system/jsx/stack.mjs +0 -14
  341. package/packages/panda/styled-system/jsx/visually-hidden.mjs +0 -14
  342. package/packages/panda/styled-system/jsx/vstack.mjs +0 -14
  343. package/packages/panda/styled-system/jsx/wrap.mjs +0 -14
  344. package/packages/panda/styled-system/patterns/aspect-ratio.mjs +0 -38
  345. package/packages/panda/styled-system/patterns/bleed.mjs +0 -24
  346. package/packages/panda/styled-system/patterns/box.mjs +0 -15
  347. package/packages/panda/styled-system/patterns/center.mjs +0 -21
  348. package/packages/panda/styled-system/patterns/circle.mjs +0 -25
  349. package/packages/panda/styled-system/patterns/container.mjs +0 -21
  350. package/packages/panda/styled-system/patterns/cq.mjs +0 -21
  351. package/packages/panda/styled-system/patterns/divider.mjs +0 -25
  352. package/packages/panda/styled-system/patterns/flex.mjs +0 -26
  353. package/packages/panda/styled-system/patterns/float.mjs +0 -52
  354. package/packages/panda/styled-system/patterns/grid-item.mjs +0 -25
  355. package/packages/panda/styled-system/patterns/grid.mjs +0 -27
  356. package/packages/panda/styled-system/patterns/hstack.mjs +0 -24
  357. package/packages/panda/styled-system/patterns/index.mjs +0 -20
  358. package/packages/panda/styled-system/patterns/link-overlay.mjs +0 -24
  359. package/packages/panda/styled-system/patterns/spacer.mjs +0 -25
  360. package/packages/panda/styled-system/patterns/square.mjs +0 -24
  361. package/packages/panda/styled-system/patterns/stack.mjs +0 -24
  362. package/packages/panda/styled-system/patterns/visually-hidden.mjs +0 -18
  363. package/packages/panda/styled-system/patterns/vstack.mjs +0 -24
  364. package/packages/panda/styled-system/patterns/wrap.mjs +0 -25
  365. package/packages/panda/styled-system/recipes/aeon-accordion.mjs +0 -49
  366. package/packages/panda/styled-system/recipes/aeon-app-shell.mjs +0 -70
  367. package/packages/panda/styled-system/recipes/aeon-async.mjs +0 -57
  368. package/packages/panda/styled-system/recipes/aeon-avatar.mjs +0 -57
  369. package/packages/panda/styled-system/recipes/aeon-badge.mjs +0 -32
  370. package/packages/panda/styled-system/recipes/aeon-bar.mjs +0 -77
  371. package/packages/panda/styled-system/recipes/aeon-button-group.mjs +0 -37
  372. package/packages/panda/styled-system/recipes/aeon-button.mjs +0 -39
  373. package/packages/panda/styled-system/recipes/aeon-checkbox.mjs +0 -49
  374. package/packages/panda/styled-system/recipes/aeon-combobox.mjs +0 -53
  375. package/packages/panda/styled-system/recipes/aeon-composer.mjs +0 -57
  376. package/packages/panda/styled-system/recipes/aeon-content.mjs +0 -70
  377. package/packages/panda/styled-system/recipes/aeon-conversation.mjs +0 -61
  378. package/packages/panda/styled-system/recipes/aeon-dialog.mjs +0 -61
  379. package/packages/panda/styled-system/recipes/aeon-entry.mjs +0 -100
  380. package/packages/panda/styled-system/recipes/aeon-field.mjs +0 -53
  381. package/packages/panda/styled-system/recipes/aeon-file-upload.mjs +0 -61
  382. package/packages/panda/styled-system/recipes/aeon-identity.mjs +0 -63
  383. package/packages/panda/styled-system/recipes/aeon-list-row.mjs +0 -49
  384. package/packages/panda/styled-system/recipes/aeon-menu.mjs +0 -53
  385. package/packages/panda/styled-system/recipes/aeon-metric-strip.mjs +0 -54
  386. package/packages/panda/styled-system/recipes/aeon-nav.mjs +0 -69
  387. package/packages/panda/styled-system/recipes/aeon-panel.mjs +0 -58
  388. package/packages/panda/styled-system/recipes/aeon-pin-input.mjs +0 -37
  389. package/packages/panda/styled-system/recipes/aeon-popover.mjs +0 -53
  390. package/packages/panda/styled-system/recipes/aeon-profile-header.mjs +0 -62
  391. package/packages/panda/styled-system/recipes/aeon-progress.mjs +0 -45
  392. package/packages/panda/styled-system/recipes/aeon-radio-group.mjs +0 -49
  393. package/packages/panda/styled-system/recipes/aeon-range-slider.mjs +0 -49
  394. package/packages/panda/styled-system/recipes/aeon-scroll.mjs +0 -64
  395. package/packages/panda/styled-system/recipes/aeon-select.mjs +0 -57
  396. package/packages/panda/styled-system/recipes/aeon-separator.mjs +0 -42
  397. package/packages/panda/styled-system/recipes/aeon-slider.mjs +0 -49
  398. package/packages/panda/styled-system/recipes/aeon-switch.mjs +0 -49
  399. package/packages/panda/styled-system/recipes/aeon-tabs.mjs +0 -49
  400. package/packages/panda/styled-system/recipes/aeon-theme-switcher.mjs +0 -59
  401. package/packages/panda/styled-system/recipes/aeon-thread.mjs +0 -73
  402. package/packages/panda/styled-system/recipes/aeon-toast.mjs +0 -49
  403. package/packages/panda/styled-system/recipes/aeon-tooltip.mjs +0 -49
  404. package/packages/panda/styled-system/recipes/create-recipe.mjs +0 -82
  405. package/packages/panda/styled-system/recipes/index.mjs +0 -39
  406. package/packages/panda/styled-system/tokens/index.mjs +0 -2224
  407. package/packages/panda/styled-system/tokens/tokens.d.ts +0 -60
  408. package/packages/panda/styled-system/types/composition.d.ts +0 -227
  409. package/packages/panda/styled-system/types/conditions.d.ts +0 -346
  410. package/packages/panda/styled-system/types/csstype.d.ts +0 -22570
  411. package/packages/panda/styled-system/types/global.d.ts +0 -20
  412. package/packages/panda/styled-system/types/parts.d.ts +0 -8
  413. package/packages/panda/styled-system/types/prop-type.d.ts +0 -250
  414. package/packages/panda/styled-system/types/selectors.d.ts +0 -59
  415. package/packages/panda/styled-system/types/static-css.d.ts +0 -56
  416. package/packages/panda/styled-system/types/style-props.d.ts +0 -8089
  417. package/packages/panda/styled-system/types/system-types.d.ts +0 -151
  418. package/packages/primitives/node_modules/.bin/esbuild +0 -21
  419. package/packages/primitives/node_modules/.bin/jiti +0 -21
  420. package/packages/primitives/node_modules/.bin/tsc +0 -21
  421. package/packages/primitives/node_modules/.bin/tsserver +0 -21
  422. package/packages/primitives/node_modules/.bin/tsup +0 -21
  423. package/packages/primitives/node_modules/.bin/tsup-node +0 -21
  424. package/packages/primitives/node_modules/.bin/tsx +0 -21
  425. package/packages/primitives/node_modules/.bin/vite +0 -21
  426. package/packages/primitives/node_modules/.bin/vitest +0 -21
  427. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  428. package/packages/primitives/src/__tests__/app-nav.test.ts +0 -30
  429. package/packages/primitives/src/__tests__/file-upload.test.ts +0 -25
  430. package/packages/primitives/src/__tests__/floating-surface.test.ts +0 -29
  431. package/packages/primitives/src/__tests__/range-slider.test.ts +0 -39
  432. package/packages/react/node_modules/.bin/esbuild +0 -21
  433. package/packages/react/node_modules/.bin/jiti +0 -21
  434. package/packages/react/node_modules/.bin/tsc +0 -21
  435. package/packages/react/node_modules/.bin/tsserver +0 -21
  436. package/packages/react/node_modules/.bin/tsup +0 -21
  437. package/packages/react/node_modules/.bin/tsup-node +0 -21
  438. package/packages/react/node_modules/.bin/tsx +0 -21
  439. package/packages/react/node_modules/.bin/vite +0 -21
  440. package/packages/react/node_modules/.bin/vitest +0 -21
  441. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  442. package/packages/react/src/avatar/avatar.test.tsx +0 -27
  443. package/packages/react/src/dialog/dialog.test.tsx +0 -77
  444. package/packages/react/src/select/select.test.tsx +0 -81
  445. package/packages/react/src/toast/toast.test.tsx +0 -40
  446. package/packages/react/src/tooltip/tooltip.test.tsx +0 -122
  447. package/packages/react-scene/node_modules/.bin/jiti +0 -21
  448. package/packages/react-scene/node_modules/.bin/tsc +0 -21
  449. package/packages/react-scene/node_modules/.bin/tsserver +0 -21
  450. package/packages/react-scene/node_modules/.bin/tsup +0 -21
  451. package/packages/react-scene/node_modules/.bin/tsup-node +0 -21
  452. package/packages/react-scene/node_modules/.bin/tsx +0 -21
  453. package/packages/scene/node_modules/.bin/jiti +0 -21
  454. package/packages/scene/node_modules/.bin/tsc +0 -21
  455. package/packages/scene/node_modules/.bin/tsserver +0 -21
  456. package/packages/scene/node_modules/.bin/tsup +0 -21
  457. package/packages/scene/node_modules/.bin/tsup-node +0 -21
  458. package/packages/scene/node_modules/.bin/tsx +0 -21
  459. package/packages/schemas/node_modules/.bin/esbuild +0 -21
  460. package/packages/schemas/node_modules/.bin/jiti +0 -21
  461. package/packages/schemas/node_modules/.bin/tsc +0 -21
  462. package/packages/schemas/node_modules/.bin/tsserver +0 -21
  463. package/packages/schemas/node_modules/.bin/tsup +0 -21
  464. package/packages/schemas/node_modules/.bin/tsup-node +0 -21
  465. package/packages/schemas/node_modules/.bin/tsx +0 -21
  466. package/packages/schemas/node_modules/.bin/vite +0 -21
  467. package/packages/schemas/node_modules/.bin/vitest +0 -21
  468. package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  469. package/packages/schemas/src/aeon-to-schema.test.ts +0 -70
  470. package/packages/schemas/src/index.test.ts +0 -108
  471. package/packages/signal/node_modules/.bin/jiti +0 -21
  472. package/packages/signal/node_modules/.bin/tsc +0 -21
  473. package/packages/signal/node_modules/.bin/tsserver +0 -21
  474. package/packages/signal/node_modules/.bin/tsup +0 -21
  475. package/packages/signal/node_modules/.bin/tsup-node +0 -21
  476. package/packages/signal/node_modules/.bin/tsx +0 -21
  477. package/packages/site/node_modules/.bin/jiti +0 -21
  478. package/packages/site/node_modules/.bin/tsc +0 -21
  479. package/packages/site/node_modules/.bin/tsserver +0 -21
  480. package/packages/site/node_modules/.bin/tsup +0 -21
  481. package/packages/site/node_modules/.bin/tsup-node +0 -21
  482. package/packages/site/node_modules/.bin/tsx +0 -21
  483. package/packages/solid/node_modules/.bin/jiti +0 -21
  484. package/packages/solid/node_modules/.bin/tsc +0 -21
  485. package/packages/solid/node_modules/.bin/tsserver +0 -21
  486. package/packages/solid/node_modules/.bin/tsup +0 -21
  487. package/packages/solid/node_modules/.bin/tsup-node +0 -21
  488. package/packages/solid/node_modules/.bin/tsx +0 -21
  489. package/packages/surface/node_modules/.bin/jiti +0 -21
  490. package/packages/surface/node_modules/.bin/tsc +0 -21
  491. package/packages/surface/node_modules/.bin/tsserver +0 -21
  492. package/packages/surface/node_modules/.bin/tsup +0 -21
  493. package/packages/surface/node_modules/.bin/tsup-node +0 -21
  494. package/packages/surface/node_modules/.bin/tsx +0 -21
  495. package/packages/svelte/node_modules/.bin/acorn +0 -21
  496. package/packages/svelte/node_modules/.bin/esbuild +0 -21
  497. package/packages/svelte/node_modules/.bin/jiti +0 -21
  498. package/packages/svelte/node_modules/.bin/svelte-check +0 -21
  499. package/packages/svelte/node_modules/.bin/tsc +0 -21
  500. package/packages/svelte/node_modules/.bin/tsserver +0 -21
  501. package/packages/svelte/node_modules/.bin/tsup +0 -21
  502. package/packages/svelte/node_modules/.bin/tsup-node +0 -21
  503. package/packages/svelte/node_modules/.bin/tsx +0 -21
  504. package/packages/svelte/node_modules/.bin/vite +0 -21
  505. package/packages/tree/node_modules/.bin/esbuild +0 -21
  506. package/packages/tree/node_modules/.bin/jiti +0 -21
  507. package/packages/tree/node_modules/.bin/tsc +0 -21
  508. package/packages/tree/node_modules/.bin/tsserver +0 -21
  509. package/packages/tree/node_modules/.bin/tsup +0 -21
  510. package/packages/tree/node_modules/.bin/tsup-node +0 -21
  511. package/packages/tree/node_modules/.bin/tsx +0 -21
  512. package/packages/tree/node_modules/.bin/vite +0 -21
  513. package/packages/tree/node_modules/.bin/vitest +0 -21
  514. package/packages/tree/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  515. package/packages/tree/src/exclusive-action.test.ts +0 -54
  516. package/packages/ui/node_modules/.bin/jiti +0 -21
  517. package/packages/ui/node_modules/.bin/tsc +0 -21
  518. package/packages/ui/node_modules/.bin/tsserver +0 -21
  519. package/packages/ui/node_modules/.bin/tsup +0 -21
  520. package/packages/ui/node_modules/.bin/tsup-node +0 -21
  521. package/packages/ui/node_modules/.bin/tsx +0 -21
  522. package/packages/vue/node_modules/.bin/jiti +0 -21
  523. package/packages/vue/node_modules/.bin/tsc +0 -21
  524. package/packages/vue/node_modules/.bin/tsserver +0 -21
  525. package/packages/vue/node_modules/.bin/tsup +0 -21
  526. package/packages/vue/node_modules/.bin/tsup-node +0 -21
  527. package/packages/vue/node_modules/.bin/tsx +0 -21
@@ -0,0 +1,117 @@
1
+ import { clipboardAnatomy, partAttrs, partOnlyAttrs } from '@aeon-ui/core'
2
+ import { clipboardMachine, type ClipboardStatus } from '@aeon-ui/primitives'
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useContext,
7
+ useMemo,
8
+ type ButtonHTMLAttributes,
9
+ type CSSProperties,
10
+ type HTMLAttributes,
11
+ type MouseEvent,
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
+ interface ClipboardContextValue {
18
+ status: ClipboardStatus
19
+ copy: () => void
20
+ }
21
+
22
+ const ClipboardCtx = createContext<ClipboardContextValue | null>(null)
23
+
24
+ function useClipboardCtx() {
25
+ const ctx = useContext(ClipboardCtx)
26
+ if (!ctx) throw new Error('Clipboard parts must be used within Clipboard.Root')
27
+ return ctx
28
+ }
29
+
30
+ /** Read the copy status from any part inside Clipboard.Root. */
31
+ export const useClipboardStatus = () => useClipboardCtx().status
32
+
33
+ const visuallyHidden: CSSProperties = {
34
+ position: 'absolute',
35
+ width: 1,
36
+ height: 1,
37
+ margin: -1,
38
+ padding: 0,
39
+ overflow: 'hidden',
40
+ clip: 'rect(0 0 0 0)',
41
+ whiteSpace: 'nowrap',
42
+ border: 0,
43
+ }
44
+
45
+ const ANNOUNCE: Partial<Record<ClipboardStatus, string>> = { copied: 'Copied', failed: 'Copy failed' }
46
+
47
+ export interface ClipboardRootProps extends HTMLAttributes<HTMLDivElement> {
48
+ /** Text written to the clipboard; read at the moment of copying. */
49
+ value: string
50
+ /** How long copied / failed show, in ms. */
51
+ timeout?: number
52
+ }
53
+
54
+ const Root = forwardRef<HTMLDivElement, ClipboardRootProps>(function ClipboardRoot(
55
+ { value, timeout, children, ...rest },
56
+ ref,
57
+ ) {
58
+ const [snapshot, send] = useAeonMachine(clipboardMachine, { input: { timeout } })
59
+ const status = snapshot.value as ClipboardStatus
60
+ const ctx = useMemo(() => ({ status, copy: () => send({ type: 'COPY', value }) }), [status, send, value])
61
+
62
+ return (
63
+ <ClipboardCtx.Provider value={ctx}>
64
+ <div ref={ref} {...mergeProps(partAttrs(clipboardAnatomy.scope, clipboardAnatomy.root, { state: status }), rest)}>
65
+ {children}
66
+ <span role="status" style={visuallyHidden} {...partOnlyAttrs(clipboardAnatomy.status)}>
67
+ {ANNOUNCE[status] ?? ''}
68
+ </span>
69
+ </div>
70
+ </ClipboardCtx.Provider>
71
+ )
72
+ })
73
+
74
+ const Trigger = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(function ClipboardTrigger(
75
+ { onClick, ...rest },
76
+ ref,
77
+ ) {
78
+ const { status, copy } = useClipboardCtx()
79
+
80
+ return (
81
+ <button
82
+ ref={ref}
83
+ type="button"
84
+ aria-label="Copy"
85
+ {...mergeProps(
86
+ partOnlyAttrs(clipboardAnatomy.trigger, { state: status }),
87
+ {
88
+ onClick: (e: MouseEvent<HTMLButtonElement>) => {
89
+ onClick?.(e)
90
+ if (!e.defaultPrevented) copy()
91
+ },
92
+ },
93
+ rest,
94
+ )}
95
+ />
96
+ )
97
+ })
98
+
99
+ export interface ClipboardIndicatorProps extends HTMLAttributes<HTMLSpanElement> {
100
+ /** Shown while copied; `children` show otherwise. */
101
+ copied?: ReactNode
102
+ }
103
+
104
+ const Indicator = forwardRef<HTMLSpanElement, ClipboardIndicatorProps>(function ClipboardIndicator(
105
+ { copied, children, ...rest },
106
+ ref,
107
+ ) {
108
+ const { status } = useClipboardCtx()
109
+
110
+ return (
111
+ <span ref={ref} aria-hidden {...mergeProps(partOnlyAttrs(clipboardAnatomy.indicator, { state: status }), rest)}>
112
+ {status === 'copied' && copied !== undefined ? copied : children}
113
+ </span>
114
+ )
115
+ })
116
+
117
+ export const Clipboard = { Root, Trigger, Indicator }
@@ -7,6 +7,7 @@ import {
7
7
  type ReactNode,
8
8
  type TextareaHTMLAttributes,
9
9
  } from 'react'
10
+ import { rowLimits, useAutoGrow } from '../textarea/index.js'
10
11
  import { mergeProps } from '../utils/merge-props.js'
11
12
 
12
13
  /**
@@ -48,13 +49,21 @@ const Root = forwardRef<HTMLFormElement, ComposerRootProps>(function ComposerRoo
48
49
  )
49
50
  })
50
51
 
51
- const Input = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>(
52
- function ComposerInput(props, ref) {
52
+ export interface ComposerInputProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
53
+ /** Height floor in lines (default 1). */
54
+ minRows?: number
55
+ /** Height ceiling in lines before the input scrolls (default 4). */
56
+ maxRows?: number
57
+ }
58
+
59
+ const Input = forwardRef<HTMLTextAreaElement, ComposerInputProps>(
60
+ function ComposerInput({ minRows, maxRows, style, ...props }, ref) {
61
+ const grow = useAutoGrow(ref, props.value)
53
62
  return (
54
63
  <textarea
55
- ref={ref}
56
- rows={1}
57
- {...mergeProps(partAttrs(composerAnatomy.scope, composerAnatomy.input), props)}
64
+ rows={minRows ?? 1}
65
+ style={{ ...rowLimits(minRows, maxRows), ...style }}
66
+ {...mergeProps(partAttrs(composerAnatomy.scope, composerAnatomy.input), grow, props)}
58
67
  />
59
68
  )
60
69
  },
@@ -6,6 +6,10 @@ export * from './prompt/index.js'
6
6
  export * from './status-banner/index.js'
7
7
  export * from './tabs/index.js'
8
8
  export * from './separator/index.js'
9
+ export * from './prose/index.js'
10
+ export * from './textarea/index.js'
11
+ export * from './segment-group/index.js'
12
+ export * from './clipboard/index.js'
9
13
  export * from './progress/index.js'
10
14
  export * from './radio-group/index.js'
11
15
  export * from './slider/index.js'
@@ -0,0 +1,11 @@
1
+ import { partAttrs, proseAnatomy } from '@aeon-ui/core'
2
+ import { forwardRef, type HTMLAttributes } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ export type ProseRootProps = HTMLAttributes<HTMLDivElement>
6
+
7
+ const Root = forwardRef<HTMLDivElement, ProseRootProps>(function ProseRoot(props, ref) {
8
+ return <div ref={ref} {...mergeProps(partAttrs(proseAnatomy.scope, proseAnatomy.root), props)} />
9
+ })
10
+
11
+ export const Prose = { Root }
@@ -43,7 +43,8 @@ function useRadioGroupItemCtx() {
43
43
  return ctx
44
44
  }
45
45
 
46
- export interface RadioGroupRootProps {
46
+ export interface RadioGroupRootProps
47
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange' | 'children'> {
47
48
  value?: string
48
49
  defaultValue?: string
49
50
  onValueChange?: (value: string) => void
@@ -96,3 +96,4 @@ export const Scroll = {
96
96
  }
97
97
 
98
98
  export { useScrollState } from './use-scroll-state.js'
99
+ export { useWindowedRange, type UseWindowedRangeOptions } from './use-windowed-range.js'
@@ -0,0 +1,118 @@
1
+ import {
2
+ computeListWindow,
3
+ fullListWindow,
4
+ LIST_WINDOW_MIN_ITEMS,
5
+ measureListColumns,
6
+ measureListRowExtent,
7
+ resolveScrollRoot,
8
+ sameListWindow,
9
+ scrollRootExtent,
10
+ scrollRootScrolledPast,
11
+ type ListWindow,
12
+ type ListWindowAxis,
13
+ } from '@aeon-ui/core'
14
+ import { useLayoutEffect, useState, type RefObject } from 'react'
15
+
16
+ export interface UseWindowedRangeOptions {
17
+ total: number
18
+ /** Fallback row pitch, used until a row can be measured. */
19
+ itemExtent: number
20
+ /** Fallback column count for grids; the real count is read from the grid. */
21
+ columns?: number
22
+ overscan?: number
23
+ /** Restrict measuring to real rows when the list also holds other chrome. */
24
+ rowSelector?: string
25
+ minItems?: number
26
+ /** `x` windows a horizontal strip by item width; columns do not apply. */
27
+ axis?: ListWindowAxis
28
+ /** The list element itself; its scrollable ancestor drives the window. */
29
+ scrollRef: RefObject<HTMLElement | null>
30
+ }
31
+
32
+ function hintedWindow(o: UseWindowedRangeOptions): ListWindow {
33
+ return computeListWindow({
34
+ total: o.total,
35
+ rowExtent: o.itemExtent,
36
+ columns: o.axis === 'x' ? 1 : o.columns,
37
+ overscan: o.overscan,
38
+ scrolledPast: 0,
39
+ viewportHeight: typeof window === 'undefined' ? 0 : o.axis === 'x' ? window.innerWidth : window.innerHeight,
40
+ minItems: o.minItems,
41
+ })
42
+ }
43
+
44
+ /**
45
+ * Windowed slice for long lists and grids. Render `items.slice(start, end)`
46
+ * between spacers of `padStart` / `padEnd` (spread `listWindowPadAttrs`) or
47
+ * as list padding; each row keeps its own data-aeon-* projection.
48
+ *
49
+ * The first render windows from the hints, so a long list never mounts whole.
50
+ * Measuring reads layout, so it runs at most once per frame, and the window is
51
+ * published only when it moves: a scroll inside the current window renders
52
+ * nothing.
53
+ */
54
+ export function useWindowedRange(options: UseWindowedRangeOptions): ListWindow {
55
+ const {
56
+ total,
57
+ itemExtent,
58
+ columns = 1,
59
+ overscan = 8,
60
+ rowSelector,
61
+ minItems = LIST_WINDOW_MIN_ITEMS,
62
+ axis = 'y',
63
+ scrollRef,
64
+ } = options
65
+ const [range, setRange] = useState<ListWindow>(() => hintedWindow(options))
66
+
67
+ useLayoutEffect(() => {
68
+ const keep = (next: ListWindow) => setRange((current) => (sameListWindow(current, next) ? current : next))
69
+ if (total < minItems) {
70
+ keep(fullListWindow(total))
71
+ return
72
+ }
73
+ const list = scrollRef.current
74
+ if (!list) {
75
+ keep(hintedWindow({ total, itemExtent, columns, overscan, minItems, axis, scrollRef }))
76
+ return
77
+ }
78
+ const root = resolveScrollRoot(list, axis)
79
+ let frame = 0
80
+ let cancelled = false
81
+
82
+ const measureNow = () => {
83
+ const style = getComputedStyle(list)
84
+ keep(
85
+ computeListWindow({
86
+ total,
87
+ rowExtent: measureListRowExtent(list, style, itemExtent, rowSelector, axis),
88
+ columns: axis === 'x' ? 1 : measureListColumns(style, columns),
89
+ overscan,
90
+ scrolledPast: scrollRootScrolledPast(root, list, axis),
91
+ viewportHeight: scrollRootExtent(root, axis),
92
+ minItems,
93
+ }),
94
+ )
95
+ }
96
+
97
+ const measure = () => {
98
+ if (cancelled || frame) return
99
+ frame = window.requestAnimationFrame(() => {
100
+ frame = 0
101
+ if (!cancelled) measureNow()
102
+ })
103
+ }
104
+
105
+ measureNow()
106
+ const target: EventTarget = root === window ? window : root
107
+ target.addEventListener('scroll', measure, { passive: true })
108
+ window.addEventListener('resize', measure)
109
+ return () => {
110
+ cancelled = true
111
+ window.cancelAnimationFrame(frame)
112
+ target.removeEventListener('scroll', measure)
113
+ window.removeEventListener('resize', measure)
114
+ }
115
+ }, [total, itemExtent, columns, overscan, rowSelector, minItems, axis, scrollRef])
116
+
117
+ return range
118
+ }
@@ -0,0 +1,171 @@
1
+ import { partAttrs, partOnlyAttrs, segmentGroupAnatomy } from '@aeon-ui/core'
2
+ import { tabsMachine } from '@aeon-ui/primitives'
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useLayoutEffect,
10
+ useMemo,
11
+ useRef,
12
+ useState,
13
+ type ButtonHTMLAttributes,
14
+ type HTMLAttributes,
15
+ type KeyboardEvent,
16
+ type MouseEvent,
17
+ } from 'react'
18
+ import { useAeonMachine } from '../hooks/use-aeon-machine.js'
19
+ import { assignRef } from '../utils/assign-ref.js'
20
+ import { mergeProps } from '../utils/merge-props.js'
21
+
22
+ interface SegmentGroupContextValue {
23
+ value: string
24
+ disabled: boolean
25
+ /** The one item Tab lands on: the selected item, or the first enabled one when that is missing or disabled. */
26
+ tabStop: string | null
27
+ selectValue: (next: string) => void
28
+ }
29
+
30
+ const SegmentGroupCtx = createContext<SegmentGroupContextValue | null>(null)
31
+
32
+ function useSegmentGroupCtx() {
33
+ const ctx = useContext(SegmentGroupCtx)
34
+ if (!ctx) throw new Error('SegmentGroup parts must be used within SegmentGroup.Root')
35
+ return ctx
36
+ }
37
+
38
+ const ROOT = `[data-aeon-scope="${segmentGroupAnatomy.scope}"]`
39
+
40
+ /** This group's enabled items in DOM order, leaving out items of nested groups. */
41
+ function enabledItems(root: HTMLElement): HTMLButtonElement[] {
42
+ return Array.from(
43
+ root.querySelectorAll<HTMLButtonElement>(`[data-aeon-part="${segmentGroupAnatomy.item}"]:not(:disabled)`),
44
+ ).filter((item) => item.closest(ROOT) === root)
45
+ }
46
+
47
+ export interface SegmentGroupRootProps extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange'> {
48
+ value?: string
49
+ defaultValue?: string
50
+ onValueChange?: (value: string) => void
51
+ disabled?: boolean
52
+ orientation?: 'horizontal' | 'vertical'
53
+ }
54
+
55
+ const Root = forwardRef<HTMLDivElement, SegmentGroupRootProps>(function SegmentGroupRoot(
56
+ { value, defaultValue = '', onValueChange, disabled = false, orientation = 'horizontal', ...rest },
57
+ ref,
58
+ ) {
59
+ const [snapshot, send] = useAeonMachine(tabsMachine, {
60
+ input: { value: value ?? defaultValue, disabled },
61
+ })
62
+ const controlled = value !== undefined
63
+ const resolvedValue = value ?? snapshot.context.value
64
+
65
+ useEffect(() => {
66
+ if (controlled) send({ type: 'SET_VALUE', value })
67
+ }, [controlled, value, send])
68
+
69
+ const selectValue = useCallback(
70
+ (next: string) => {
71
+ if (disabled || next === resolvedValue) return
72
+ if (!controlled) send({ type: 'SELECT', value: next })
73
+ onValueChange?.(next)
74
+ },
75
+ [disabled, resolvedValue, controlled, send, onValueChange],
76
+ )
77
+
78
+ const node = useRef<HTMLDivElement | null>(null)
79
+ const setRef = useCallback(
80
+ (el: HTMLDivElement | null) => {
81
+ node.current = el
82
+ assignRef(ref, el)
83
+ },
84
+ [ref],
85
+ )
86
+
87
+ /* Items can be added, removed or disabled at any render, so the tab stop is re-read from the DOM each time. */
88
+ const [tabStop, setTabStop] = useState<string | null>(null)
89
+ useLayoutEffect(() => {
90
+ const items = node.current ? enabledItems(node.current) : []
91
+ const next = (items.find((item) => item.dataset.value === resolvedValue) ?? items[0])?.dataset.value ?? null
92
+ setTabStop((prev) => (prev === next ? prev : next))
93
+ })
94
+
95
+ const ctx = useMemo(
96
+ () => ({ value: resolvedValue, disabled, tabStop, selectValue }),
97
+ [resolvedValue, disabled, tabStop, selectValue],
98
+ )
99
+
100
+ return (
101
+ <SegmentGroupCtx.Provider value={ctx}>
102
+ <div
103
+ ref={setRef}
104
+ role="radiogroup"
105
+ aria-orientation={orientation}
106
+ aria-disabled={disabled || undefined}
107
+ data-orientation={orientation}
108
+ {...mergeProps(partAttrs(segmentGroupAnatomy.scope, segmentGroupAnatomy.root, { disabled }), rest)}
109
+ />
110
+ </SegmentGroupCtx.Provider>
111
+ )
112
+ })
113
+
114
+ const KEY_STEP: Record<string, number> = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }
115
+
116
+ export interface SegmentGroupItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {
117
+ value: string
118
+ }
119
+
120
+ const Item = forwardRef<HTMLButtonElement, SegmentGroupItemProps>(function SegmentGroupItem(
121
+ { value: itemValue, disabled: itemDisabled, onClick, onKeyDown, ...rest },
122
+ ref,
123
+ ) {
124
+ const { value, disabled: groupDisabled, tabStop, selectValue } = useSegmentGroupCtx()
125
+ const selected = value === itemValue
126
+ const disabled = groupDisabled || Boolean(itemDisabled)
127
+
128
+ return (
129
+ <button
130
+ ref={ref}
131
+ type="button"
132
+ role="radio"
133
+ aria-checked={selected}
134
+ data-value={itemValue}
135
+ disabled={disabled}
136
+ tabIndex={itemValue === tabStop ? 0 : -1}
137
+ {...mergeProps(
138
+ partOnlyAttrs(segmentGroupAnatomy.item, {
139
+ state: selected ? 'selected' : 'unselected',
140
+ disabled,
141
+ }),
142
+ {
143
+ onClick: (e: MouseEvent<HTMLButtonElement>) => {
144
+ onClick?.(e)
145
+ if (!e.defaultPrevented) selectValue(itemValue)
146
+ },
147
+ onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => {
148
+ onKeyDown?.(e)
149
+ if (e.defaultPrevented) return
150
+ const root = e.currentTarget.closest<HTMLElement>(ROOT)
151
+ const items = root ? enabledItems(root) : []
152
+ const at = items.indexOf(e.currentTarget)
153
+ const step = KEY_STEP[e.key]
154
+ const target =
155
+ e.key === 'Home' ? items[0]
156
+ : e.key === 'End' ? items[items.length - 1]
157
+ : step === undefined || at < 0 ? undefined
158
+ : items[(at + step + items.length) % items.length]
159
+ if (!target) return
160
+ e.preventDefault()
161
+ target.focus()
162
+ selectValue(target.dataset.value ?? '')
163
+ },
164
+ },
165
+ rest,
166
+ )}
167
+ />
168
+ )
169
+ })
170
+
171
+ export const SegmentGroup = { Root, Item }
@@ -14,8 +14,10 @@ import {
14
14
  type KeyboardEvent,
15
15
  type MouseEvent,
16
16
  type ReactNode,
17
+ type RefObject,
17
18
  } from 'react'
18
19
  import { FloatingPositioner } from '../floating/FloatingPositioner.js'
20
+ import type { AnchorPlacement } from '../hooks/use-anchor-position.js'
19
21
  import { useAeonMachine } from '../hooks/use-aeon-machine.js'
20
22
  import { useOutsideClick } from '../hooks/use-outside-click.js'
21
23
  import { mergeProps } from '../utils/merge-props.js'
@@ -257,11 +259,16 @@ const Trigger = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonEle
257
259
  export interface SelectPositionerProps extends HTMLAttributes<HTMLDivElement> {
258
260
  /** Mount listbox in document.body (default true). */
259
261
  portalled?: boolean
262
+ placement?: AnchorPlacement
263
+ /** Align to this region rather than the trigger. See `FloatingPositioner`. */
264
+ anchorRef?: RefObject<HTMLElement | null>
265
+ /** Size the listbox to the anchor (default true). */
266
+ matchAnchorWidth?: boolean
260
267
  children?: ReactNode
261
268
  }
262
269
 
263
270
  const Positioner = forwardRef<HTMLDivElement, SelectPositionerProps>(function SelectPositioner(
264
- { portalled = true, children, className, ...rest },
271
+ { portalled = true, placement, anchorRef, matchAnchorWidth = true, children, className, ...rest },
265
272
  ref,
266
273
  ) {
267
274
  const { open, triggerRef, positionerRef } = useSelectCtx()
@@ -275,8 +282,10 @@ const Positioner = forwardRef<HTMLDivElement, SelectPositionerProps>(function Se
275
282
  part={selectAnatomy.positioner}
276
283
  triggerRef={triggerRef}
277
284
  positionerRef={positionerRef}
285
+ anchorRef={anchorRef}
278
286
  portalled={portalled}
279
- matchAnchorWidth
287
+ placement={placement}
288
+ matchAnchorWidth={matchAnchorWidth}
280
289
  className={className}
281
290
  {...rest}
282
291
  >
@@ -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,
@@ -16,7 +17,7 @@ import { mergeProps } from '../utils/merge-props.js'
16
17
 
17
18
  interface TabsContextValue {
18
19
  value: string
19
- send: ReturnType<typeof useAeonMachine<typeof tabsMachine>>[1]
20
+ selectValue: (value: string) => void
20
21
  }
21
22
 
22
23
  const TabsCtx = createContext<TabsContextValue | null>(null)
@@ -27,7 +28,8 @@ function useTabsCtx() {
27
28
  return ctx
28
29
  }
29
30
 
30
- export interface TabsRootProps {
31
+ export interface TabsRootProps
32
+ extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue' | 'onChange' | 'children'> {
31
33
  value?: string
32
34
  defaultValue?: string
33
35
  onValueChange?: (value: string) => void
@@ -43,17 +45,27 @@ const Root = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(
43
45
  input: { value: defaultValue, disabled: false },
44
46
  })
45
47
 
48
+ const controlled = value !== undefined
46
49
  const resolvedValue = value ?? snapshot.context.value
47
50
 
51
+ const selectValue = useCallback(
52
+ (next: string) => {
53
+ if (controlled) onValueChange?.(next)
54
+ else send({ type: 'SELECT', value: next })
55
+ },
56
+ [controlled, onValueChange, send],
57
+ )
58
+
48
59
  useEffect(() => {
49
- onValueChange?.(resolvedValue)
50
- }, [resolvedValue, onValueChange])
60
+ if (controlled) return
61
+ onValueChange?.(snapshot.context.value)
62
+ }, [snapshot.context.value, controlled, onValueChange])
51
63
 
52
64
  useEffect(() => {
53
65
  if (value !== undefined) send({ type: 'SET_VALUE', value })
54
66
  }, [value, send])
55
67
 
56
- const ctx = useMemo(() => ({ value: resolvedValue, send }), [resolvedValue, send])
68
+ const ctx = useMemo(() => ({ value: resolvedValue, selectValue }), [resolvedValue, selectValue])
57
69
 
58
70
  return (
59
71
  <TabsCtx.Provider value={ctx}>
@@ -80,7 +92,7 @@ const Trigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(function TabsTri
80
92
  { value: triggerValue, onClick, ...rest },
81
93
  ref,
82
94
  ) {
83
- const { value, send } = useTabsCtx()
95
+ const { value, selectValue } = useTabsCtx()
84
96
  const selected = value === triggerValue
85
97
 
86
98
  return (
@@ -98,7 +110,7 @@ const Trigger = forwardRef<HTMLButtonElement, TabsTriggerProps>(function TabsTri
98
110
  {
99
111
  onClick: (e: MouseEvent<HTMLButtonElement>) => {
100
112
  onClick?.(e)
101
- send({ type: 'SELECT', value: triggerValue })
113
+ if (!e.defaultPrevented && value !== triggerValue) selectValue(triggerValue)
102
114
  },
103
115
  },
104
116
  rest,
@@ -0,0 +1,75 @@
1
+ import { partAttrs, textareaAnatomy } from '@aeon-ui/core'
2
+ import {
3
+ forwardRef,
4
+ useCallback,
5
+ useLayoutEffect,
6
+ useRef,
7
+ type CSSProperties,
8
+ type ForwardedRef,
9
+ type TextareaHTMLAttributes,
10
+ } from 'react'
11
+ import { assignRef } from '../utils/assign-ref.js'
12
+ import { mergeProps } from '../utils/merge-props.js'
13
+
14
+ /** Row limits as the CSS variables Aeon's auto-growing textareas read (Textarea, Composer.Input). */
15
+ export function rowLimits(minRows?: number, maxRows?: number): CSSProperties {
16
+ return {
17
+ ...(minRows === undefined ? {} : { '--aeon-textarea-min-rows': minRows }),
18
+ ...(maxRows === undefined ? {} : { '--aeon-textarea-max-rows': maxRows }),
19
+ } as CSSProperties
20
+ }
21
+
22
+ const growsByItself =
23
+ typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('field-sizing', 'content')
24
+
25
+ /**
26
+ * Grows a textarea to its content where CSS `field-sizing` is missing (Firefox); the recipe's
27
+ * min / max height still clamp it. Spread the result onto the textarea.
28
+ */
29
+ export function useAutoGrow(forwarded: ForwardedRef<HTMLTextAreaElement>, value: unknown) {
30
+ const node = useRef<HTMLTextAreaElement | null>(null)
31
+
32
+ const fit = useCallback(() => {
33
+ const el = node.current
34
+ if (growsByItself || !el) return
35
+ el.style.height = 'auto'
36
+ el.style.height = `${el.scrollHeight + el.offsetHeight - el.clientHeight}px`
37
+ }, [])
38
+
39
+ useLayoutEffect(fit, [fit, value])
40
+
41
+ const ref = useCallback(
42
+ (el: HTMLTextAreaElement | null) => {
43
+ node.current = el
44
+ assignRef(forwarded, el)
45
+ },
46
+ [forwarded],
47
+ )
48
+
49
+ return { ref, onInput: fit }
50
+ }
51
+
52
+ export interface TextareaRootProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
53
+ /** Height floor in lines. */
54
+ minRows?: number
55
+ /** Height ceiling in lines; past it the textarea scrolls. Omit to grow without limit. */
56
+ maxRows?: number
57
+ }
58
+
59
+ const Root = forwardRef<HTMLTextAreaElement, TextareaRootProps>(function TextareaRoot(
60
+ { minRows = 2, maxRows, style, disabled, ...rest },
61
+ ref,
62
+ ) {
63
+ const grow = useAutoGrow(ref, rest.value)
64
+
65
+ return (
66
+ <textarea
67
+ rows={minRows}
68
+ disabled={disabled}
69
+ style={{ ...rowLimits(minRows, maxRows), ...style }}
70
+ {...mergeProps(partAttrs(textareaAnatomy.scope, textareaAnatomy.root, { disabled }), grow, rest)}
71
+ />
72
+ )
73
+ })
74
+
75
+ export const Textarea = { Root }
@@ -0,0 +1,7 @@
1
+ import type { ForwardedRef } from 'react'
2
+
3
+ /** Hands a node to a forwarded ref of either shape. */
4
+ export function assignRef<T>(ref: ForwardedRef<T> | undefined, node: T | null) {
5
+ if (typeof ref === 'function') ref(node)
6
+ else if (ref) ref.current = node
7
+ }