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
@@ -69,7 +69,7 @@ var fieldAnatomy = anatomy("field", [
69
69
  "hint"
70
70
  ]);
71
71
  var scrollAnatomy = anatomy("scroll", ["root", "viewport", "content"]);
72
- var playSurfaceAnatomy = anatomy("play", ["mat", "table", "dice", "bank"]);
72
+ var playSurfaceAnatomy = anatomy("play", ["root", "mat", "region", "entity"]);
73
73
  var selectAnatomy = anatomy("select", [
74
74
  "root",
75
75
  "trigger",
@@ -117,7 +117,76 @@ var toastAnatomy = anatomy("toast", [
117
117
  "description",
118
118
  "closeTrigger"
119
119
  ]);
120
- var avatarAnatomy = anatomy("avatar", ["root", "image", "fallback"]);
120
+ var avatarAnatomy = anatomy("avatar", ["root", "image", "fallback", "badge"]);
121
+ var identityAnatomy = anatomy("identity", [
122
+ "root",
123
+ "avatar",
124
+ "title",
125
+ "subtitle",
126
+ "meta",
127
+ "trailing"
128
+ ]);
129
+ var profileHeaderAnatomy = anatomy("profileHeader", [
130
+ "root",
131
+ "media",
132
+ "identity",
133
+ "metrics",
134
+ "actions",
135
+ "body"
136
+ ]);
137
+ var entryAnatomy = anatomy("entry", [
138
+ "list",
139
+ "root",
140
+ "header",
141
+ "leading",
142
+ "heading",
143
+ "title",
144
+ "subtitle",
145
+ "meta",
146
+ "media",
147
+ "body",
148
+ "values",
149
+ "value",
150
+ "actions",
151
+ "footer"
152
+ ]);
153
+ var metricStripAnatomy = anatomy("metricStrip", [
154
+ "root",
155
+ "chip",
156
+ "value",
157
+ "label"
158
+ ]);
159
+ var listRowAnatomy = anatomy("listRow", [
160
+ "root",
161
+ "leading",
162
+ "label",
163
+ "description",
164
+ "trailing"
165
+ ]);
166
+ var conversationAnatomy = anatomy("conversation", [
167
+ "root",
168
+ "item",
169
+ "leading",
170
+ "body",
171
+ "title",
172
+ "preview",
173
+ "meta",
174
+ "badge"
175
+ ]);
176
+ var threadAnatomy = anatomy("thread", [
177
+ "root",
178
+ "list",
179
+ "item",
180
+ "bubble",
181
+ "meta",
182
+ "day"
183
+ ]);
184
+ var composerAnatomy = anatomy("composer", [
185
+ "root",
186
+ "input",
187
+ "actions",
188
+ "send"
189
+ ]);
121
190
  var separatorAnatomy = anatomy("separator", ["root"]);
122
191
  var progressAnatomy = anatomy("progress", ["root", "track", "range", "label"]);
123
192
  var radioGroupAnatomy = anatomy("radioGroup", [
@@ -135,6 +204,55 @@ var sliderAnatomy = anatomy("slider", [
135
204
  "valueText"
136
205
  ]);
137
206
  var pinInputAnatomy = anatomy("pinInput", ["root", "input"]);
207
+ var barAnatomy = anatomy("bar", [
208
+ "root",
209
+ "leading",
210
+ "center",
211
+ "trailing",
212
+ "seam"
213
+ ]);
214
+ var panelAnatomy = anatomy("panel", [
215
+ "group",
216
+ "root",
217
+ "trigger",
218
+ "label",
219
+ "content"
220
+ ]);
221
+ var appShellAnatomy = anatomy("appShell", [
222
+ "root",
223
+ "header",
224
+ "subheader",
225
+ "content",
226
+ "aside",
227
+ "footer",
228
+ "dock",
229
+ "scrim"
230
+ ]);
231
+ var contentAnatomy = anatomy("content", [
232
+ "root",
233
+ "toolbar",
234
+ "body",
235
+ "pending",
236
+ "empty",
237
+ "error",
238
+ "success",
239
+ "sentinel"
240
+ ]);
241
+ var navAnatomy = anatomy("nav", [
242
+ "root",
243
+ "item",
244
+ "indicator",
245
+ "label",
246
+ "icon",
247
+ "badge"
248
+ ]);
249
+ var themeSwitcherAnatomy = anatomy("themeSwitcher", [
250
+ "root",
251
+ "modes",
252
+ "modeBtn",
253
+ "themeSelect",
254
+ "themeTrigger"
255
+ ]);
138
256
 
139
257
  // src/attrs.ts
140
258
  function stateFields(options) {
@@ -169,6 +287,70 @@ function stateToAttr(value) {
169
287
  if (value == null || typeof value === "string") return String(value ?? "");
170
288
  return Object.entries(value).map(([k, v]) => `${k}:${stateToAttr(v)}`).join(" ");
171
289
  }
290
+ function fieldFace(value) {
291
+ if (value == null || typeof value !== "object") return "idle";
292
+ const v = value;
293
+ if (v.submission === "pending") return "pending";
294
+ if (v.validation === "invalid") return "invalid";
295
+ if (v.interaction === "dirty") return "dirty";
296
+ return "idle";
297
+ }
298
+ function fieldRegions(value) {
299
+ if (value == null || typeof value !== "object") {
300
+ return { interaction: "pristine", validation: "valid", submission: "idle" };
301
+ }
302
+ const v = value;
303
+ return {
304
+ interaction: typeof v.interaction === "string" ? v.interaction : "pristine",
305
+ validation: typeof v.validation === "string" ? v.validation : "valid",
306
+ submission: typeof v.submission === "string" ? v.submission : "idle"
307
+ };
308
+ }
309
+ function getRegionValue(value, region) {
310
+ if (value == null) return void 0;
311
+ if (typeof value === "string") return value === region ? value : void 0;
312
+ if (typeof value === "object") {
313
+ return value[region];
314
+ }
315
+ return void 0;
316
+ }
317
+ function regionPath(value, region) {
318
+ const path = [];
319
+ let cur = getRegionValue(value, region);
320
+ while (cur != null) {
321
+ if (typeof cur === "string") {
322
+ path.push(cur);
323
+ break;
324
+ }
325
+ if (typeof cur !== "object") break;
326
+ const entries = Object.entries(cur);
327
+ if (entries.length === 0) break;
328
+ if (entries.length > 1) {
329
+ path.push(entries.map(([k]) => k).sort().join("+"));
330
+ break;
331
+ }
332
+ const [key, next] = entries[0];
333
+ path.push(key);
334
+ cur = next;
335
+ }
336
+ return path;
337
+ }
338
+ function regionLeaf(value, region) {
339
+ const path = regionPath(value, region);
340
+ return path[path.length - 1];
341
+ }
342
+ function regionMatches(value, region, match) {
343
+ const path = regionPath(value, region);
344
+ if (path.length === 0) return false;
345
+ if (typeof match === "string") {
346
+ return path.includes(match) || path[path.length - 1] === match;
347
+ }
348
+ if (match.length === 0) return false;
349
+ if (match.length <= path.length) {
350
+ return match.every((part, i) => path[i] === part);
351
+ }
352
+ return false;
353
+ }
172
354
 
173
355
  // src/scroll.ts
174
356
  var EPS = 1;
@@ -325,6 +507,56 @@ function runAeonThemeTransition(apply) {
325
507
  }
326
508
  apply();
327
509
  }
510
+ var STORAGE_THEME = "aeon-theme";
511
+ var STORAGE_MODE = "aeon-mode";
512
+ var DEFAULT_THEME_ID = "default";
513
+ var DEFAULT_MODE = "dark";
514
+ function registerAeonThemes(themes) {
515
+ const map = Object.fromEntries(themes.map((t) => [t.id, t]));
516
+ const ids = themes.map((t) => t.id);
517
+ return { themes, map, ids };
518
+ }
519
+ function isAeonThemeId(value) {
520
+ return value !== void 0;
521
+ }
522
+ function isAeonMode(value) {
523
+ return value === "light" || value === "dark";
524
+ }
525
+ function applyAeonTheme(themeId, mode, themeMap) {
526
+ const root = document.documentElement;
527
+ root.dataset.aeonTheme = themeId;
528
+ root.dataset.aeonMode = mode;
529
+ root.style.colorScheme = mode;
530
+ if (themeMap && themeMap[themeId]) {
531
+ const meta = document.querySelector('meta[name="theme-color"]');
532
+ if (meta) {
533
+ meta.setAttribute("content", themeMap[themeId][mode].bg);
534
+ }
535
+ }
536
+ try {
537
+ localStorage.setItem(STORAGE_THEME, themeId);
538
+ localStorage.setItem(STORAGE_MODE, mode);
539
+ } catch {
540
+ }
541
+ }
542
+ function initAeonTheme(themeMap) {
543
+ let themeId = DEFAULT_THEME_ID;
544
+ let mode = DEFAULT_MODE;
545
+ try {
546
+ const storedTheme = localStorage.getItem(STORAGE_THEME);
547
+ const storedMode = localStorage.getItem(STORAGE_MODE);
548
+ if (storedTheme) themeId = storedTheme;
549
+ if (storedMode && isAeonMode(storedMode)) {
550
+ mode = storedMode;
551
+ } else if (!storedMode && window.matchMedia("(prefers-color-scheme: light)").matches) {
552
+ mode = "light";
553
+ }
554
+ } catch {
555
+ if (window.matchMedia("(prefers-color-scheme: light)").matches) mode = "light";
556
+ }
557
+ applyAeonTheme(themeId, mode, themeMap);
558
+ return { themeId, mode };
559
+ }
328
560
  export {
329
561
  AEON_PRINCIPLE,
330
562
  AEON_THEME_TRANSITION_CLASS,
@@ -333,34 +565,57 @@ export {
333
565
  UI_IS_FUNCTION_OF_STATE,
334
566
  accordionAnatomy,
335
567
  anatomy,
568
+ appShellAnatomy,
569
+ applyAeonTheme,
336
570
  asyncAnatomy,
337
571
  avatarAnatomy,
572
+ barAnatomy,
338
573
  buttonAnatomy,
339
574
  checkboxAnatomy,
340
575
  clampNorm,
341
576
  clientFromNorm,
342
577
  comboboxAnatomy,
578
+ composerAnatomy,
579
+ contentAnatomy,
580
+ conversationAnatomy,
343
581
  setup as createAeonMachine,
344
582
  dialogAnatomy,
583
+ entryAnatomy,
345
584
  fieldAnatomy,
585
+ fieldFace,
586
+ fieldRegions,
346
587
  getCompactMq,
588
+ getRegionValue,
347
589
  getScrollSnapshot,
590
+ identityAnatomy,
591
+ initAeonTheme,
348
592
  insetNormCluster,
349
593
  isAeonColorMode,
594
+ isAeonMode,
595
+ isAeonThemeId,
350
596
  layoutCompositionForMode,
351
597
  layoutModeAttrs,
598
+ listRowAnatomy,
352
599
  matchLayoutMode,
353
600
  measureElement,
354
601
  menuAnatomy,
602
+ metricStripAnatomy,
603
+ navAnatomy,
355
604
  normFromClient,
605
+ panelAnatomy,
356
606
  partAttrs,
357
607
  partOnlyAttrs,
358
608
  pinInputAnatomy,
359
609
  playSurfaceAnatomy,
360
610
  popoverAnatomy,
611
+ profileHeaderAnatomy,
361
612
  progressAnatomy,
362
613
  radioGroupAnatomy,
363
614
  regionBoundsForMode,
615
+ regionLeaf,
616
+ regionMatches,
617
+ regionPath,
618
+ registerAeonThemes,
364
619
  resolveAeonColorMode,
365
620
  resolveRegionRect,
366
621
  runAeonThemeTransition,
@@ -373,6 +628,8 @@ export {
373
628
  switchAnatomy,
374
629
  syncAeonColorMode,
375
630
  tabsAnatomy,
631
+ themeSwitcherAnatomy,
632
+ threadAnatomy,
376
633
  toastAnatomy,
377
634
  tooltipAnatomy
378
635
  };
@@ -10,12 +10,12 @@ case `uname` in
10
10
  esac
11
11
 
12
12
  if [ -z "$NODE_PATH" ]; then
13
- export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.28.0/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.28.0/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.28.0/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
14
  else
15
- export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.27.7/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.28.0/node_modules/esbuild/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.28.0/node_modules/esbuild/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/esbuild@0.28.0/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
16
  fi
17
17
  if [ -x "$basedir/node" ]; then
18
- exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/esbuild" "$@"
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/esbuild@0.28.0/node_modules/esbuild/bin/esbuild" "$@"
19
19
  else
20
- exec node "$basedir/../../../../node_modules/.pnpm/esbuild@0.27.7/node_modules/esbuild/bin/esbuild" "$@"
20
+ exec node "$basedir/../../../../node_modules/.pnpm/esbuild@0.28.0/node_modules/esbuild/bin/esbuild" "$@"
21
21
  fi
@@ -10,12 +10,12 @@ case `uname` in
10
10
  esac
11
11
 
12
12
  if [ -z "$NODE_PATH" ]; then
13
- export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
14
  else
15
- export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules/vite/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
16
  fi
17
17
  if [ -x "$basedir/node" ]; then
18
- exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
18
+ exec "$basedir/node" "$basedir/../../../../node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
19
19
  else
20
- exec node "$basedir/../../../../node_modules/.pnpm/vite@6.4.2_@types+node@22.19.19_jiti@2.7.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
20
+ exec node "$basedir/../../../../node_modules/.pnpm/vite@8.0.16_@types+node@22.19.19_esbuild@0.28.0_jiti@2.7.0_tsx@4.22.3/node_modules/vite/bin/vite.js" "$@"
21
21
  fi
@@ -10,9 +10,9 @@ case `uname` in
10
10
  esac
11
11
 
12
12
  if [ -z "$NODE_PATH" ]; then
13
- export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
13
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3_/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3_/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules"
14
14
  else
15
- export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@3.2.4_@types+node@22.19.19_jiti@2.7.0_jsdom@26.1.0_lightningcss@1.32.0_tsx@4.22.3/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
15
+ export NODE_PATH="/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3_/node_modules/vitest/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/vitest@4.1.8_@types+node@22.19.19_jsdom@29.1.1_vite@8.0.16_@types+node@22.19.19_esbuild@0.27.7_jiti@2.7.0_tsx@4.22.3_/node_modules:/Users/brandoncryderman/AeonUI/node_modules/.pnpm/node_modules:$NODE_PATH"
16
16
  fi
17
17
  if [ -x "$basedir/node" ]; then
18
18
  exec "$basedir/node" "$basedir/../vitest/vitest.mjs" "$@"
@@ -1 +1 @@
1
- {"version":"3.2.4","results":[[":src/machine.test.ts",{"duration":2.2672079999999823,"failed":false}],[":src/theme.test.ts",{"duration":1.6362909999999715,"failed":false}]]}
1
+ {"version":"3.2.4","results":[[":src/machine.test.ts",{"duration":2.8135839999999916,"failed":false}],[":src/theme.test.ts",{"duration":2.691708999999989,"failed":false}],[":../../apps/demo/src/aeonSchemaCompiler.test.ts",{"duration":7.737041999999974,"failed":false}]]}
@@ -8,9 +8,21 @@
8
8
  "url": "https://github.com/GenericCPU/aeon-ui.git",
9
9
  "directory": "packages/core"
10
10
  },
11
- "publishConfig": { "access": "public" },
12
- "files": ["dist", "theme-transition.css", "README.md"],
13
- "keywords": ["aeon-ui", "statechart", "xstate", "headless", "anatomy"],
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "theme-transition.css",
17
+ "README.md"
18
+ ],
19
+ "keywords": [
20
+ "aeon-ui",
21
+ "statechart",
22
+ "xstate",
23
+ "headless",
24
+ "anatomy"
25
+ ],
14
26
  "type": "module",
15
27
  "main": "./dist/index.js",
16
28
  "types": "./dist/index.d.ts",
@@ -27,11 +39,11 @@
27
39
  "test": "vitest run"
28
40
  },
29
41
  "dependencies": {
30
- "xstate": "^5.19.2"
42
+ "xstate": "^5.32.0"
31
43
  },
32
44
  "devDependencies": {
33
45
  "tsup": "^8.4.0",
34
46
  "typescript": "^5.8.3",
35
- "vitest": "^3.2.4"
47
+ "vitest": "^4.1.8"
36
48
  }
37
49
  }
@@ -81,10 +81,10 @@ export const fieldAnatomy = anatomy('field', [
81
81
  export const scrollAnatomy = anatomy('scroll', ['root', 'viewport', 'content'] as const)
82
82
 
83
83
  /**
84
- * Play / game surface — mat shell with table, dice, and bank regions.
85
- * Use with normalized layout coords (@see docs/LAYOUT_COORDINATES.md).
84
+ * Spatial play surface — universal mat + regions + entities (not a specific game).
85
+ * App logic names regions; entity labels come from compose `items`. See LAYOUT_COORDINATES.md.
86
86
  */
87
- export const playSurfaceAnatomy = anatomy('play', ['mat', 'table', 'dice', 'bank'] as const)
87
+ export const playSurfaceAnatomy = anatomy('play', ['root', 'mat', 'region', 'entity'] as const)
88
88
 
89
89
  export const selectAnatomy = anatomy('select', [
90
90
  'root',
@@ -140,8 +140,118 @@ export const toastAnatomy = anatomy('toast', [
140
140
  'closeTrigger',
141
141
  ] as const)
142
142
 
143
- /** Profile image — loaded / loading / error on root `data-aeon-state`. */
144
- export const avatarAnatomy = anatomy('avatar', ['root', 'image', 'fallback'] as const)
143
+ /** Profile image — loaded / loading / error on root `data-aeon-state`. Badge = presence / status corner. */
144
+ export const avatarAnatomy = anatomy('avatar', ['root', 'image', 'fallback', 'badge'] as const)
145
+
146
+ /**
147
+ * Identity strip — avatar + primary/secondary text (items-market AvatarWithName).
148
+ * Presentational; compose into ProfileHeader / ListRow / AccountCluster.
149
+ */
150
+ export const identityAnatomy = anatomy('identity', [
151
+ 'root',
152
+ 'avatar',
153
+ 'title',
154
+ 'subtitle',
155
+ 'meta',
156
+ 'trailing',
157
+ ] as const)
158
+
159
+ /**
160
+ * Profile header — dense account hero (not dating). Media optional; metrics + actions zones.
161
+ * Spatial: identity leading, metrics inline, actions trailing / bottom leading pair.
162
+ */
163
+ export const profileHeaderAnatomy = anatomy('profileHeader', [
164
+ 'root',
165
+ 'media',
166
+ 'identity',
167
+ 'metrics',
168
+ 'actions',
169
+ 'body',
170
+ ] as const)
171
+
172
+ /**
173
+ * Entry — compact multi-value content card (feed post, catalog listing, activity item).
174
+ * Universal layout only — not a social/marketplace niche.
175
+ * List stacks cards; Root is one card (idle | selected | muted).
176
+ * Zones: header (leading · heading · meta) · media · body · values · actions · footer.
177
+ */
178
+ export const entryAnatomy = anatomy('entry', [
179
+ 'list',
180
+ 'root',
181
+ 'header',
182
+ 'leading',
183
+ 'heading',
184
+ 'title',
185
+ 'subtitle',
186
+ 'meta',
187
+ 'media',
188
+ 'body',
189
+ 'values',
190
+ 'value',
191
+ 'actions',
192
+ 'footer',
193
+ ] as const)
194
+
195
+ /**
196
+ * Metric strip — ultra-dense value/label chips (items-market im-stat cluster).
197
+ * Generic stats only — not wallet/currency product niches.
198
+ */
199
+ export const metricStripAnatomy = anatomy('metricStrip', [
200
+ 'root',
201
+ 'chip',
202
+ 'value',
203
+ 'label',
204
+ ] as const)
205
+
206
+ /**
207
+ * List row — settings / account menu row (h-12 hit target, leading icon, trailing control).
208
+ */
209
+ export const listRowAnatomy = anatomy('listRow', [
210
+ 'root',
211
+ 'leading',
212
+ 'label',
213
+ 'description',
214
+ 'trailing',
215
+ ] as const)
216
+
217
+ /**
218
+ * Conversation — inbox / DM list row (universal messaging chrome, not dating).
219
+ * Leading avatar · title · preview · meta (time) · badge (unread).
220
+ * Item state: idle | unread | selected.
221
+ */
222
+ export const conversationAnatomy = anatomy('conversation', [
223
+ 'root',
224
+ 'item',
225
+ 'leading',
226
+ 'body',
227
+ 'title',
228
+ 'preview',
229
+ 'meta',
230
+ 'badge',
231
+ ] as const)
232
+
233
+ /**
234
+ * Thread — message stream. Items project mine | theirs | pending | failed.
235
+ */
236
+ export const threadAnatomy = anatomy('thread', [
237
+ 'root',
238
+ 'list',
239
+ 'item',
240
+ 'bubble',
241
+ 'meta',
242
+ 'day',
243
+ ] as const)
244
+
245
+ /**
246
+ * Composer — bottom compose chrome for threads (input + send).
247
+ * Root state: idle | sending | disabled | error.
248
+ */
249
+ export const composerAnatomy = anatomy('composer', [
250
+ 'root',
251
+ 'input',
252
+ 'actions',
253
+ 'send',
254
+ ] as const)
145
255
 
146
256
  export const separatorAnatomy = anatomy('separator', ['root'] as const)
147
257
 
@@ -165,3 +275,84 @@ export const sliderAnatomy = anatomy('slider', [
165
275
  ] as const)
166
276
 
167
277
  export const pinInputAnatomy = anatomy('pinInput', ['root', 'input'] as const)
278
+
279
+ /**
280
+ * Bar — horizontal layout primitive for toolbars, headers, footers.
281
+ * Enforces safe flex behavior: no overlap, responsive collapse via overflow.
282
+ * Parts: root (flex row), leading, center, trailing, optional seam (sticky stack join).
283
+ * Drive sticky lifecycle with stickyBarMachine → data-aeon-state on root.
284
+ */
285
+ export const barAnatomy = anatomy('bar', [
286
+ 'root',
287
+ 'leading',
288
+ 'center',
289
+ 'trailing',
290
+ 'seam',
291
+ ] as const)
292
+
293
+ /**
294
+ * Panel — collapsible layout region for split views.
295
+ * Group lays out siblings; Root is expanded|collapsed; Label rails vertically when collapsed.
296
+ */
297
+ export const panelAnatomy = anatomy('panel', [
298
+ 'group',
299
+ 'root',
300
+ 'trigger',
301
+ 'label',
302
+ 'content',
303
+ ] as const)
304
+
305
+ /**
306
+ * App shell — layered application chrome (items-market MainLayout pattern).
307
+ * header / subheader / content / aside / footer / dock / scrim under root.
308
+ */
309
+ export const appShellAnatomy = anatomy('appShell', [
310
+ 'root',
311
+ 'header',
312
+ 'subheader',
313
+ 'content',
314
+ 'aside',
315
+ 'footer',
316
+ 'dock',
317
+ 'scrim',
318
+ ] as const)
319
+
320
+ /**
321
+ * Content region — status-slotted body. Every contentRegionMachine state has a part.
322
+ * Pair with Async for fetch; use slots for idle/pending/empty/error/ready/loadingMore/success.
323
+ */
324
+ export const contentAnatomy = anatomy('content', [
325
+ 'root',
326
+ 'toolbar',
327
+ 'body',
328
+ 'pending',
329
+ 'empty',
330
+ 'error',
331
+ 'success',
332
+ 'sentinel',
333
+ ] as const)
334
+
335
+ /**
336
+ * Nav — navigational collection (top links, bottom tabs, side rail).
337
+ * Selection reuses tabsMachine; items project inactive|active|disabled.
338
+ */
339
+ export const navAnatomy = anatomy('nav', [
340
+ 'root',
341
+ 'item',
342
+ 'indicator',
343
+ 'label',
344
+ 'icon',
345
+ 'badge',
346
+ ] as const)
347
+
348
+ /**
349
+ * ThemeSwitcher — mode toggle (light/dark) + theme preset selector.
350
+ * Parts: root, modes (button group), modeBtn, themeSelect, themeTrigger.
351
+ */
352
+ export const themeSwitcherAnatomy = anatomy('themeSwitcher', [
353
+ 'root',
354
+ 'modes',
355
+ 'modeBtn',
356
+ 'themeSelect',
357
+ 'themeTrigger',
358
+ ] as const)