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,149 @@
1
+ import { contentAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { contentRegionMachine, type ContentRegionState } from '@aeon-ui/primitives'
3
+ import {
4
+ createContext,
5
+ forwardRef,
6
+ useContext,
7
+ useMemo,
8
+ type HTMLAttributes,
9
+ type ReactNode,
10
+ } from 'react'
11
+ import { useAeonMachine } from '../hooks/use-aeon-machine.js'
12
+ import { mergeProps } from '../utils/merge-props.js'
13
+
14
+ interface ContentContextValue {
15
+ state: ContentRegionState
16
+ error: string | null
17
+ send: ReturnType<typeof useAeonMachine<typeof contentRegionMachine>>[1]
18
+ }
19
+
20
+ const ContentCtx = createContext<ContentContextValue | null>(null)
21
+
22
+ export function useContentContext() {
23
+ const ctx = useContext(ContentCtx)
24
+ if (!ctx) throw new Error('Content parts must be used within Content.Root')
25
+ return ctx
26
+ }
27
+
28
+ export interface ContentRootProps extends HTMLAttributes<HTMLDivElement> {
29
+ /**
30
+ * Controlled face — projects parent/app machine onto Content slots
31
+ * (same pattern as Button `status`). When set, slot visibility uses this
32
+ * value instead of the internal contentRegionMachine leaf.
33
+ */
34
+ state?: ContentRegionState
35
+ children?: ReactNode
36
+ }
37
+
38
+ const Root = forwardRef<HTMLDivElement, ContentRootProps>(function ContentRoot(
39
+ { state: stateProp, children, ...rest },
40
+ ref,
41
+ ) {
42
+ const [snapshot, send] = useAeonMachine(contentRegionMachine)
43
+ const machineState = snapshot.value as ContentRegionState
44
+ const state = stateProp ?? machineState
45
+ const value = useMemo(
46
+ () => ({ state, error: snapshot.context.error, send }),
47
+ [state, snapshot.context.error, send],
48
+ )
49
+
50
+ return (
51
+ <ContentCtx.Provider value={value}>
52
+ <div
53
+ ref={ref}
54
+ {...mergeProps(scopeAttrs(contentAnatomy.scope, contentAnatomy.root, { state }), rest)}
55
+ >
56
+ {children}
57
+ </div>
58
+ </ContentCtx.Provider>
59
+ )
60
+ })
61
+
62
+ const Toolbar = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ContentToolbar(
63
+ props,
64
+ ref,
65
+ ) {
66
+ const { state } = useContentContext()
67
+ return (
68
+ <div
69
+ ref={ref}
70
+ {...mergeProps(partAttrs(contentAnatomy.scope, contentAnatomy.toolbar, { state }), props)}
71
+ />
72
+ )
73
+ })
74
+
75
+ /** Primary body — shown when state is ready | loadingMore | success (and optionally idle). */
76
+ const Body = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ContentBody(
77
+ { hidden, ...rest },
78
+ ref,
79
+ ) {
80
+ const { state } = useContentContext()
81
+ const show = state === 'ready' || state === 'loadingMore' || state === 'success' || state === 'idle'
82
+ if (!show) return null
83
+ return (
84
+ <div
85
+ ref={ref}
86
+ hidden={hidden}
87
+ {...mergeProps(partAttrs(contentAnatomy.scope, contentAnatomy.body, { state }), rest)}
88
+ />
89
+ )
90
+ })
91
+
92
+ function StatusSlot(
93
+ part: string,
94
+ match: ContentRegionState | ContentRegionState[],
95
+ displayName: string,
96
+ ) {
97
+ const matches = Array.isArray(match) ? match : [match]
98
+ const Comp = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ContentStatusSlot(
99
+ props,
100
+ ref,
101
+ ) {
102
+ const { state } = useContentContext()
103
+ if (!matches.includes(state)) return null
104
+ return (
105
+ <div
106
+ ref={ref}
107
+ role="status"
108
+ {...mergeProps(partAttrs(contentAnatomy.scope, part, { state }), props)}
109
+ />
110
+ )
111
+ })
112
+ Comp.displayName = displayName
113
+ return Comp
114
+ }
115
+
116
+ const Pending = StatusSlot(contentAnatomy.pending, 'pending', 'Content.Pending')
117
+ const Empty = StatusSlot(contentAnatomy.empty, 'empty', 'Content.Empty')
118
+ const ErrorSlot = StatusSlot(contentAnatomy.error, 'error', 'Content.Error')
119
+ const Success = StatusSlot(contentAnatomy.success, 'success', 'Content.Success')
120
+
121
+ const Sentinel = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(function ContentSentinel(
122
+ props,
123
+ ref,
124
+ ) {
125
+ const { state } = useContentContext()
126
+ if (state !== 'ready' && state !== 'loadingMore') return null
127
+ return (
128
+ <div
129
+ ref={ref}
130
+ {...mergeProps(partAttrs(contentAnatomy.scope, contentAnatomy.sentinel, { state }), props)}
131
+ />
132
+ )
133
+ })
134
+
135
+ /**
136
+ * Content — status-slotted region. Machine totality maps 1:1 onto parts.
137
+ * States: idle | pending | empty | error | ready | loadingMore | success
138
+ * Drive via contentRegionMachine events, or project with Root `state` prop.
139
+ */
140
+ export const Content = {
141
+ Root,
142
+ Toolbar,
143
+ Body,
144
+ Pending,
145
+ Empty,
146
+ Error: ErrorSlot,
147
+ Success,
148
+ Sentinel,
149
+ }
@@ -0,0 +1,78 @@
1
+ import { conversationAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ export type ConversationItemState = 'idle' | 'unread' | 'selected'
6
+
7
+ export interface ConversationRootProps extends HTMLAttributes<HTMLElement> {
8
+ children?: ReactNode
9
+ }
10
+
11
+ /**
12
+ * Conversation — inbox / DM list (universal messaging chrome).
13
+ * Item states: idle | unread | selected.
14
+ */
15
+ const Root = forwardRef<HTMLElement, ConversationRootProps>(function ConversationRoot(
16
+ { children, ...rest },
17
+ ref,
18
+ ) {
19
+ return (
20
+ <div
21
+ ref={ref as never}
22
+ {...mergeProps(scopeAttrs(conversationAnatomy.scope, conversationAnatomy.root), rest)}
23
+ >
24
+ {children}
25
+ </div>
26
+ )
27
+ })
28
+
29
+ export interface ConversationItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {
30
+ state?: ConversationItemState
31
+ as?: 'button' | 'div' | 'a'
32
+ }
33
+
34
+ const Item = forwardRef<HTMLElement, ConversationItemProps>(function ConversationItem(
35
+ { state = 'idle', as: Tag = 'button', type, children, ...rest },
36
+ ref,
37
+ ) {
38
+ const buttonType = Tag === 'button' ? (type ?? 'button') : undefined
39
+ return (
40
+ <Tag
41
+ ref={ref as never}
42
+ type={buttonType as never}
43
+ {...mergeProps(
44
+ partAttrs(conversationAnatomy.scope, conversationAnatomy.item, { state }),
45
+ rest,
46
+ )}
47
+ >
48
+ {children}
49
+ </Tag>
50
+ )
51
+ })
52
+
53
+ function Part(part: string, displayName: string) {
54
+ const Comp = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function ConversationPart(
55
+ props,
56
+ ref,
57
+ ) {
58
+ return (
59
+ <span
60
+ ref={ref}
61
+ {...mergeProps(partAttrs(conversationAnatomy.scope, part), props)}
62
+ />
63
+ )
64
+ })
65
+ Comp.displayName = displayName
66
+ return Comp
67
+ }
68
+
69
+ export const Conversation = {
70
+ Root,
71
+ Item,
72
+ Leading: Part(conversationAnatomy.leading, 'Conversation.Leading'),
73
+ Body: Part(conversationAnatomy.body, 'Conversation.Body'),
74
+ Title: Part(conversationAnatomy.title, 'Conversation.Title'),
75
+ Preview: Part(conversationAnatomy.preview, 'Conversation.Preview'),
76
+ Meta: Part(conversationAnatomy.meta, 'Conversation.Meta'),
77
+ Badge: Part(conversationAnatomy.badge, 'Conversation.Badge'),
78
+ }
@@ -0,0 +1,85 @@
1
+ import { entryAnatomy, 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
+ /** Card face — idle resting · selected highlight · muted de-emphasized. */
6
+ export type EntryState = 'idle' | 'selected' | 'muted'
7
+
8
+ export interface EntryListProps extends HTMLAttributes<HTMLDivElement> {
9
+ children?: ReactNode
10
+ }
11
+
12
+ /**
13
+ * Entry — compact multi-value content card.
14
+ * Compose feed posts, listings, and activity rows from the same zones.
15
+ * Machine: none (layout). Root projects idle | selected | muted.
16
+ */
17
+ const List = forwardRef<HTMLDivElement, EntryListProps>(function EntryList(
18
+ { children, ...rest },
19
+ ref,
20
+ ) {
21
+ return (
22
+ <div
23
+ ref={ref}
24
+ {...mergeProps(scopeAttrs(entryAnatomy.scope, entryAnatomy.list), rest)}
25
+ >
26
+ {children}
27
+ </div>
28
+ )
29
+ })
30
+
31
+ export interface EntryRootProps extends HTMLAttributes<HTMLElement> {
32
+ as?: 'article' | 'div' | 'li' | 'section'
33
+ state?: EntryState
34
+ children?: ReactNode
35
+ }
36
+
37
+ const Root = forwardRef<HTMLElement, EntryRootProps>(function EntryRoot(
38
+ { as: Tag = 'article', state = 'idle', children, ...rest },
39
+ ref,
40
+ ) {
41
+ return (
42
+ <Tag
43
+ ref={ref as never}
44
+ {...mergeProps(scopeAttrs(entryAnatomy.scope, entryAnatomy.root, { state }), rest)}
45
+ >
46
+ {children}
47
+ </Tag>
48
+ )
49
+ })
50
+
51
+ function Part(
52
+ part: string,
53
+ displayName: string,
54
+ defaultTag: 'div' | 'span' | 'header' | 'footer' | 'p' = 'div',
55
+ ) {
56
+ const Comp = forwardRef<HTMLElement, HTMLAttributes<HTMLElement> & { as?: typeof defaultTag }>(
57
+ function EntryPart({ as: Tag = defaultTag, ...props }, ref) {
58
+ return (
59
+ <Tag
60
+ ref={ref as never}
61
+ {...mergeProps(partAttrs(entryAnatomy.scope, part), props)}
62
+ />
63
+ )
64
+ },
65
+ )
66
+ Comp.displayName = displayName
67
+ return Comp
68
+ }
69
+
70
+ export const Entry = {
71
+ List,
72
+ Root,
73
+ Header: Part(entryAnatomy.header, 'Entry.Header', 'header'),
74
+ Leading: Part(entryAnatomy.leading, 'Entry.Leading', 'div'),
75
+ Heading: Part(entryAnatomy.heading, 'Entry.Heading', 'div'),
76
+ Title: Part(entryAnatomy.title, 'Entry.Title', 'div'),
77
+ Subtitle: Part(entryAnatomy.subtitle, 'Entry.Subtitle', 'div'),
78
+ Meta: Part(entryAnatomy.meta, 'Entry.Meta', 'span'),
79
+ Media: Part(entryAnatomy.media, 'Entry.Media', 'div'),
80
+ Body: Part(entryAnatomy.body, 'Entry.Body', 'div'),
81
+ Values: Part(entryAnatomy.values, 'Entry.Values', 'div'),
82
+ Value: Part(entryAnatomy.value, 'Entry.Value', 'span'),
83
+ Actions: Part(entryAnatomy.actions, 'Entry.Actions', 'div'),
84
+ Footer: Part(entryAnatomy.footer, 'Entry.Footer', 'footer'),
85
+ }
@@ -1,4 +1,4 @@
1
- import { fieldAnatomy, partAttrs, partOnlyAttrs, stateToAttr } from '@aeon-ui/core'
1
+ import { fieldAnatomy, fieldFace, fieldRegions, partAttrs, partOnlyAttrs } from '@aeon-ui/core'
2
2
  import { fieldMachine } from '@aeon-ui/primitives'
3
3
  import {
4
4
  createContext,
@@ -16,7 +16,13 @@ import { useAeonMachine } from '../hooks/use-aeon-machine.js'
16
16
  import { mergeProps } from '../utils/merge-props.js'
17
17
 
18
18
  interface FieldContextValue {
19
+ /** Primary visual face — idle | dirty | invalid | pending (same hierarchy as Button). */
20
+ face: ReturnType<typeof fieldFace>
21
+ /** @deprecated Use `face` — kept as an alias for older callers. */
19
22
  stateAttr: string
23
+ interaction: string
24
+ validation: string
25
+ submission: string
20
26
  send: ReturnType<typeof useAeonMachine<typeof fieldMachine>>[1]
21
27
  invalid: boolean
22
28
  pending: boolean
@@ -41,21 +47,23 @@ const Root = forwardRef<HTMLDivElement, FieldRootProps>(function FieldRoot(
41
47
  ref,
42
48
  ) {
43
49
  const [snapshot, send] = useAeonMachine(fieldMachine)
44
- const stateAttr = stateToAttr(snapshot.value)
45
- const invalid =
46
- typeof snapshot.value === 'object' &&
47
- snapshot.value !== null &&
48
- 'validation' in snapshot.value &&
49
- (snapshot.value as { validation: string }).validation === 'invalid'
50
- const pending =
51
- typeof snapshot.value === 'object' &&
52
- snapshot.value !== null &&
53
- 'submission' in snapshot.value &&
54
- (snapshot.value as { submission: string }).submission === 'pending'
50
+ const face = fieldFace(snapshot.value)
51
+ const regions = fieldRegions(snapshot.value)
52
+ const invalid = regions.validation === 'invalid'
53
+ const pending = regions.submission === 'pending'
55
54
 
56
55
  const value = useMemo(
57
- () => ({ stateAttr, send, invalid, pending }),
58
- [stateAttr, send, invalid, pending],
56
+ () => ({
57
+ face,
58
+ stateAttr: face,
59
+ interaction: regions.interaction,
60
+ validation: regions.validation,
61
+ submission: regions.submission,
62
+ send,
63
+ invalid,
64
+ pending,
65
+ }),
66
+ [face, regions.interaction, regions.validation, regions.submission, send, invalid, pending],
59
67
  )
60
68
 
61
69
  return (
@@ -64,7 +72,10 @@ const Root = forwardRef<HTMLDivElement, FieldRootProps>(function FieldRoot(
64
72
  ref={ref}
65
73
  id={id}
66
74
  className={className}
67
- {...partAttrs(fieldAnatomy.scope, fieldAnatomy.root, { state: stateAttr })}
75
+ data-aeon-interaction={regions.interaction}
76
+ data-aeon-validation={regions.validation}
77
+ data-aeon-submission={regions.submission}
78
+ {...partAttrs(fieldAnatomy.scope, fieldAnatomy.root, { state: face })}
68
79
  >
69
80
  {children}
70
81
  </div>
@@ -148,7 +159,7 @@ const Textarea = forwardRef<HTMLTextAreaElement, FieldTextareaProps>(function Fi
148
159
  })
149
160
 
150
161
  const Message = forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
151
- function FieldMessage(props, ref) {
162
+ function FieldMessage({ children, ...props }, ref) {
152
163
  const { invalid } = useFieldContext()
153
164
  if (!invalid) return null
154
165
  return (
@@ -157,7 +168,9 @@ const Message = forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagr
157
168
  role="alert"
158
169
  {...partOnlyAttrs(fieldAnatomy.message, { state: 'invalid' })}
159
170
  {...props}
160
- />
171
+ >
172
+ {children ?? 'Check this field.'}
173
+ </p>
161
174
  )
162
175
  },
163
176
  )
@@ -168,5 +181,5 @@ const Hint = forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraph
168
181
  },
169
182
  )
170
183
 
171
- export const Field = { Root, Label, Control, Textarea, Message, Hint }
184
+ export const Field = { Root, Label, Control, Input: Control, Textarea, Message, Hint }
172
185
  export { fieldMachine }
@@ -0,0 +1,110 @@
1
+ import { identityAnatomy, 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 IdentityContextValue {
6
+ size: 'sm' | 'md' | 'lg'
7
+ }
8
+
9
+ const IdentityCtx = createContext<IdentityContextValue | null>(null)
10
+
11
+ function useIdentityCtx() {
12
+ const ctx = useContext(IdentityCtx)
13
+ if (!ctx) throw new Error('Identity parts must be used within Identity.Root')
14
+ return ctx
15
+ }
16
+
17
+ export interface IdentityRootProps extends HTMLAttributes<HTMLElement> {
18
+ as?: 'div' | 'a' | 'button'
19
+ size?: 'sm' | 'md' | 'lg'
20
+ children?: ReactNode
21
+ }
22
+
23
+ /**
24
+ * Identity — avatar + title + subtitle strip.
25
+ * Presentational compound; maximize width via truncate (`min-w-0`).
26
+ */
27
+ const Root = forwardRef<HTMLElement, IdentityRootProps>(function IdentityRoot(
28
+ { as: Tag = 'div', size = 'md', children, ...rest },
29
+ ref,
30
+ ) {
31
+ return (
32
+ <IdentityCtx.Provider value={{ size }}>
33
+ <Tag
34
+ ref={ref as never}
35
+ data-aeon-size={size}
36
+ {...mergeProps(scopeAttrs(identityAnatomy.scope, identityAnatomy.root), rest)}
37
+ >
38
+ {children}
39
+ </Tag>
40
+ </IdentityCtx.Provider>
41
+ )
42
+ })
43
+
44
+ const AvatarSlot = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(
45
+ function IdentityAvatar(props, ref) {
46
+ useIdentityCtx()
47
+ return (
48
+ <span
49
+ ref={ref}
50
+ {...mergeProps(partAttrs(identityAnatomy.scope, identityAnatomy.avatar), props)}
51
+ />
52
+ )
53
+ },
54
+ )
55
+
56
+ const Title = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function IdentityTitle(
57
+ props,
58
+ ref,
59
+ ) {
60
+ useIdentityCtx()
61
+ return (
62
+ <span
63
+ ref={ref}
64
+ {...mergeProps(partAttrs(identityAnatomy.scope, identityAnatomy.title), props)}
65
+ />
66
+ )
67
+ })
68
+
69
+ const Subtitle = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(
70
+ function IdentitySubtitle(props, ref) {
71
+ useIdentityCtx()
72
+ return (
73
+ <span
74
+ ref={ref}
75
+ {...mergeProps(partAttrs(identityAnatomy.scope, identityAnatomy.subtitle), props)}
76
+ />
77
+ )
78
+ },
79
+ )
80
+
81
+ const Meta = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function IdentityMeta(
82
+ props,
83
+ ref,
84
+ ) {
85
+ useIdentityCtx()
86
+ return (
87
+ <span ref={ref} {...mergeProps(partAttrs(identityAnatomy.scope, identityAnatomy.meta), props)} />
88
+ )
89
+ })
90
+
91
+ const Trailing = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(
92
+ function IdentityTrailing(props, ref) {
93
+ useIdentityCtx()
94
+ return (
95
+ <span
96
+ ref={ref}
97
+ {...mergeProps(partAttrs(identityAnatomy.scope, identityAnatomy.trailing), props)}
98
+ />
99
+ )
100
+ },
101
+ )
102
+
103
+ export const Identity = {
104
+ Root,
105
+ Avatar: AvatarSlot,
106
+ Title,
107
+ Subtitle,
108
+ Meta,
109
+ Trailing,
110
+ }
@@ -18,6 +18,21 @@ export * from './popover/index.js'
18
18
  export * from './menu/index.js'
19
19
  export * from './tooltip/index.js'
20
20
  export * from './toast/index.js'
21
+ export * from './theme-switcher/index.js'
21
22
  export * from './avatar/index.js'
23
+ export * from './identity/index.js'
24
+ export * from './metric-strip/index.js'
25
+ export * from './list-row/index.js'
26
+ export * from './entry/index.js'
27
+ export * from './conversation/index.js'
28
+ export * from './thread/index.js'
29
+ export * from './composer/index.js'
30
+ export * from './profile-header/index.js'
31
+ export * from './bar/index.js'
32
+ export * from './panel/index.js'
33
+ export * from './app-shell/index.js'
34
+ export * from './content/index.js'
35
+ export * from './nav/index.js'
36
+ export * from './sticky-bar/index.js'
22
37
  export { useAeonMachine } from './hooks/use-aeon-machine.js'
23
38
  export { useLayoutMode } from './hooks/use-layout-mode.js'
@@ -0,0 +1,80 @@
1
+ import { listRowAnatomy, partAttrs, scopeAttrs } from '@aeon-ui/core'
2
+ import { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'
3
+ import { mergeProps } from '../utils/merge-props.js'
4
+
5
+ export interface ListRowRootProps extends ButtonHTMLAttributes<HTMLButtonElement> {
6
+ as?: 'button' | 'div' | 'a'
7
+ children?: ReactNode
8
+ }
9
+
10
+ /**
11
+ * ListRow — settings / account menu row.
12
+ * Leading icon · label · optional description · trailing control.
13
+ * Full-width hit target (~h-12).
14
+ */
15
+ const Root = forwardRef<HTMLElement, ListRowRootProps>(function ListRowRoot(
16
+ { as: Tag = 'button', type, children, ...rest },
17
+ ref,
18
+ ) {
19
+ const buttonType = Tag === 'button' ? (type ?? 'button') : undefined
20
+ return (
21
+ <Tag
22
+ ref={ref as never}
23
+ type={buttonType as never}
24
+ {...mergeProps(scopeAttrs(listRowAnatomy.scope, listRowAnatomy.root), rest)}
25
+ >
26
+ {children}
27
+ </Tag>
28
+ )
29
+ })
30
+
31
+ const Leading = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function ListRowLeading(
32
+ props,
33
+ ref,
34
+ ) {
35
+ return (
36
+ <span
37
+ ref={ref}
38
+ {...mergeProps(partAttrs(listRowAnatomy.scope, listRowAnatomy.leading), props)}
39
+ />
40
+ )
41
+ })
42
+
43
+ const Label = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(function ListRowLabel(
44
+ props,
45
+ ref,
46
+ ) {
47
+ return (
48
+ <span ref={ref} {...mergeProps(partAttrs(listRowAnatomy.scope, listRowAnatomy.label), props)} />
49
+ )
50
+ })
51
+
52
+ const Description = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(
53
+ function ListRowDescription(props, ref) {
54
+ return (
55
+ <span
56
+ ref={ref}
57
+ {...mergeProps(partAttrs(listRowAnatomy.scope, listRowAnatomy.description), props)}
58
+ />
59
+ )
60
+ },
61
+ )
62
+
63
+ const Trailing = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(
64
+ function ListRowTrailing(props, ref) {
65
+ return (
66
+ <span
67
+ ref={ref}
68
+ {...mergeProps(partAttrs(listRowAnatomy.scope, listRowAnatomy.trailing), props)}
69
+ />
70
+ )
71
+ },
72
+ )
73
+
74
+ export const ListRow = {
75
+ Root,
76
+ Leading,
77
+ Label,
78
+ Description,
79
+ Trailing,
80
+ }