aeon-ui-engine 1.3.1 → 1.4.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 (153) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/package.json +1 -1
  3. package/packages/cli/README.md +13 -1
  4. package/packages/cli/dist/bin.js +23 -5
  5. package/packages/cli/dist/chunk-5L47SLNV.js +247 -0
  6. package/packages/cli/dist/index.d.ts +17 -1
  7. package/packages/cli/dist/index.js +5 -3
  8. package/packages/cli/src/bin.ts +21 -3
  9. package/packages/cli/src/index.ts +1 -0
  10. package/packages/cli/src/migrate.ts +170 -0
  11. package/packages/core/dist/index.d.ts +35 -7
  12. package/packages/core/dist/index.js +102 -2
  13. package/packages/core/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  14. package/packages/core/src/anatomy.ts +39 -3
  15. package/packages/core/src/identicon.test.ts +39 -0
  16. package/packages/core/src/identicon.ts +79 -0
  17. package/packages/core/src/index.ts +1 -0
  18. package/packages/panda/panda.config.ts +4 -0
  19. package/packages/panda/src/recipes/composer.ts +58 -4
  20. package/packages/panda/src/recipes/file-upload.ts +100 -0
  21. package/packages/panda/src/recipes/index.ts +2 -0
  22. package/packages/panda/src/recipes/range-slider.ts +59 -0
  23. package/packages/panda/src/recipes/thread.ts +77 -2
  24. package/packages/panda/styled-system/recipes/aeon-composer.d.ts +1 -1
  25. package/packages/panda/styled-system/recipes/aeon-composer.mjs +12 -0
  26. package/packages/panda/styled-system/recipes/aeon-file-upload.d.ts +31 -0
  27. package/packages/panda/styled-system/recipes/aeon-file-upload.mjs +61 -0
  28. package/packages/panda/styled-system/recipes/aeon-range-slider.d.ts +31 -0
  29. package/packages/panda/styled-system/recipes/aeon-range-slider.mjs +49 -0
  30. package/packages/panda/styled-system/recipes/aeon-thread.d.ts +1 -1
  31. package/packages/panda/styled-system/recipes/aeon-thread.mjs +20 -0
  32. package/packages/panda/styled-system/recipes/index.d.ts +2 -0
  33. package/packages/panda/styled-system/recipes/index.mjs +2 -0
  34. package/packages/panda/styled-system/styles.css +292 -0
  35. package/packages/primitives/dist/chunk-CV4UXXZF.js +44 -0
  36. package/packages/primitives/dist/chunk-IZKQSCYU.js +164 -0
  37. package/packages/primitives/dist/index.d.ts +2 -0
  38. package/packages/primitives/dist/index.js +22 -6
  39. package/packages/primitives/dist/machines/file-upload.d.ts +39 -0
  40. package/packages/primitives/dist/machines/file-upload.js +8 -0
  41. package/packages/primitives/dist/machines/range-slider.d.ts +129 -0
  42. package/packages/primitives/dist/machines/range-slider.js +12 -0
  43. package/packages/primitives/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  44. package/packages/primitives/src/__tests__/file-upload.test.ts +25 -0
  45. package/packages/primitives/src/__tests__/range-slider.test.ts +39 -0
  46. package/packages/primitives/src/index.ts +2 -0
  47. package/packages/primitives/src/machines/file-upload.ts +55 -0
  48. package/packages/primitives/src/machines/range-slider.ts +209 -0
  49. package/packages/react/dist/index.d.ts +117 -25
  50. package/packages/react/dist/index.js +1731 -1006
  51. package/packages/react/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  52. package/packages/react/src/button/index.tsx +50 -15
  53. package/packages/react/src/combobox/index.tsx +13 -8
  54. package/packages/react/src/composer/index.tsx +58 -3
  55. package/packages/react/src/file-upload/index.tsx +322 -0
  56. package/packages/react/src/index.ts +3 -0
  57. package/packages/react/src/prompt/index.tsx +45 -0
  58. package/packages/react/src/range-slider/index.tsx +322 -0
  59. package/packages/react/src/thread/index.tsx +74 -3
  60. package/packages/react/src/tooltip/index.tsx +48 -22
  61. package/packages/react/src/utils/slot.tsx +47 -0
  62. package/packages/schemas/dist/index.d.ts +73 -24
  63. package/packages/schemas/dist/index.js +514 -50
  64. package/packages/schemas/json/appNav.json +146 -0
  65. package/packages/schemas/json/appShell.json +151 -0
  66. package/packages/schemas/json/avatar.json +130 -0
  67. package/packages/schemas/json/bar.json +126 -0
  68. package/packages/schemas/json/button.json +6 -0
  69. package/packages/schemas/json/catalog.json +3496 -15
  70. package/packages/schemas/json/combobox.json +19 -7
  71. package/packages/schemas/json/composer.json +125 -0
  72. package/packages/schemas/json/content.json +167 -0
  73. package/packages/schemas/json/conversation.json +166 -0
  74. package/packages/schemas/json/entry.json +182 -0
  75. package/packages/schemas/json/fileUpload.json +168 -0
  76. package/packages/schemas/json/identity.json +147 -0
  77. package/packages/schemas/json/listRow.json +131 -0
  78. package/packages/schemas/json/metricStrip.json +132 -0
  79. package/packages/schemas/json/nav.json +136 -0
  80. package/packages/schemas/json/panel.json +143 -0
  81. package/packages/schemas/json/pinInput.json +112 -0
  82. package/packages/schemas/json/profileHeader.json +138 -0
  83. package/packages/schemas/json/prompt.json +155 -0
  84. package/packages/schemas/json/radioGroup.json +130 -0
  85. package/packages/schemas/json/rangeSlider.json +157 -0
  86. package/packages/schemas/json/separator.json +105 -0
  87. package/packages/schemas/json/slider.json +147 -0
  88. package/packages/schemas/json/statusBanner.json +149 -0
  89. package/packages/schemas/json/stickyBar.json +153 -0
  90. package/packages/schemas/json/thread.json +129 -0
  91. package/packages/schemas/json/tooltip.json +21 -7
  92. package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  93. package/packages/schemas/prompts/cursorrules.md +6 -4
  94. package/packages/schemas/prompts/statecharts.md +23 -2
  95. package/packages/schemas/prompts/system.md +2 -2
  96. package/packages/schemas/registry/catalog.json +313 -4
  97. package/packages/schemas/registry/components/appNav.json +146 -0
  98. package/packages/schemas/registry/components/appShell.json +151 -0
  99. package/packages/schemas/registry/components/avatar.json +130 -0
  100. package/packages/schemas/registry/components/bar.json +126 -0
  101. package/packages/schemas/registry/components/button.json +6 -0
  102. package/packages/schemas/registry/components/combobox.json +19 -7
  103. package/packages/schemas/registry/components/composer.json +125 -0
  104. package/packages/schemas/registry/components/content.json +167 -0
  105. package/packages/schemas/registry/components/conversation.json +166 -0
  106. package/packages/schemas/registry/components/entry.json +182 -0
  107. package/packages/schemas/registry/components/fileUpload.json +168 -0
  108. package/packages/schemas/registry/components/identity.json +147 -0
  109. package/packages/schemas/registry/components/listRow.json +131 -0
  110. package/packages/schemas/registry/components/metricStrip.json +132 -0
  111. package/packages/schemas/registry/components/nav.json +136 -0
  112. package/packages/schemas/registry/components/panel.json +143 -0
  113. package/packages/schemas/registry/components/pinInput.json +112 -0
  114. package/packages/schemas/registry/components/profileHeader.json +138 -0
  115. package/packages/schemas/registry/components/prompt.json +155 -0
  116. package/packages/schemas/registry/components/radioGroup.json +130 -0
  117. package/packages/schemas/registry/components/rangeSlider.json +157 -0
  118. package/packages/schemas/registry/components/separator.json +105 -0
  119. package/packages/schemas/registry/components/slider.json +147 -0
  120. package/packages/schemas/registry/components/statusBanner.json +149 -0
  121. package/packages/schemas/registry/components/stickyBar.json +153 -0
  122. package/packages/schemas/registry/components/thread.json +129 -0
  123. package/packages/schemas/registry/components/tooltip.json +21 -7
  124. package/packages/schemas/registry/machines/accordion.json +58 -0
  125. package/packages/schemas/registry/machines/appNav.json +108 -0
  126. package/packages/schemas/registry/machines/appShell.json +128 -0
  127. package/packages/schemas/registry/machines/contentRegion.json +314 -0
  128. package/packages/schemas/registry/machines/fileUpload.json +182 -0
  129. package/packages/schemas/registry/machines/panel.json +131 -0
  130. package/packages/schemas/registry/machines/popover.json +143 -0
  131. package/packages/schemas/registry/machines/rangeSlider.json +201 -0
  132. package/packages/schemas/registry/machines/slider.json +151 -0
  133. package/packages/schemas/registry/machines/stickyBar.json +261 -0
  134. package/packages/schemas/registry/machines/tabs.json +58 -0
  135. package/packages/schemas/registry/machines/toast.json +89 -0
  136. package/packages/schemas/registry/machines/toggle.json +134 -0
  137. package/packages/schemas/scripts/emit.ts +27 -0
  138. package/packages/schemas/src/components.ts +499 -6
  139. package/packages/schemas/src/index.test.ts +83 -0
  140. package/packages/schemas/src/index.ts +1 -0
  141. package/packages/schemas/src/machine-id.ts +7 -0
  142. package/packages/schemas/src/prompts.ts +25 -4
  143. package/packages/schemas/src/registry.ts +28 -39
  144. package/packages/schemas/tsconfig.json +1 -1
  145. package/packages/ui/dist/index.d.ts +100 -46
  146. package/packages/ui/dist/index.js +463 -341
  147. package/packages/ui/src/composer.tsx +37 -11
  148. package/packages/ui/src/file-upload.tsx +36 -0
  149. package/packages/ui/src/index.ts +2 -0
  150. package/packages/ui/src/prompt.tsx +3 -0
  151. package/packages/ui/src/range-slider.tsx +24 -0
  152. package/packages/ui/src/thread.tsx +40 -0
  153. package/packages/cli/dist/chunk-IW5NT2Z2.js +0 -103
@@ -0,0 +1,153 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://aeon-ui.com/schemas/stickyBar.json",
4
+ "title": "StickyBar",
5
+ "description": "Sticky/fixed chrome band via stickyBarMachine. DOM scope is bar (reuses bar anatomy zones).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "component",
10
+ "scope"
11
+ ],
12
+ "properties": {
13
+ "component": {
14
+ "const": "StickyBar"
15
+ },
16
+ "scope": {
17
+ "const": "bar"
18
+ },
19
+ "parts": {
20
+ "type": "array",
21
+ "description": "Anatomy part keys — map to data-aeon-part",
22
+ "items": {
23
+ "type": "string",
24
+ "enum": [
25
+ "root",
26
+ "leading",
27
+ "center",
28
+ "trailing",
29
+ "seam"
30
+ ]
31
+ },
32
+ "uniqueItems": true
33
+ },
34
+ "states": {
35
+ "type": "array",
36
+ "description": "Allowed data-aeon-state values (stable states only)",
37
+ "items": {
38
+ "type": "string",
39
+ "enum": [
40
+ "floating",
41
+ "docked",
42
+ "collapsed",
43
+ "hidden"
44
+ ]
45
+ },
46
+ "uniqueItems": true
47
+ },
48
+ "props": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "properties": {}
52
+ },
53
+ "slots": {
54
+ "type": "object",
55
+ "description": "Named composition slots / compound parts",
56
+ "additionalProperties": {
57
+ "type": "string"
58
+ },
59
+ "properties": {
60
+ "Root": {
61
+ "const": "bar.root",
62
+ "description": "bar.root"
63
+ },
64
+ "Leading": {
65
+ "const": "bar.leading",
66
+ "description": "bar.leading"
67
+ },
68
+ "Center": {
69
+ "const": "bar.center",
70
+ "description": "bar.center"
71
+ },
72
+ "Trailing": {
73
+ "const": "bar.trailing",
74
+ "description": "bar.trailing"
75
+ },
76
+ "Seam": {
77
+ "const": "bar.seam",
78
+ "description": "bar.seam"
79
+ }
80
+ }
81
+ },
82
+ "machine": {
83
+ "type": [
84
+ "string",
85
+ "null"
86
+ ],
87
+ "description": "XState machine export from @aeon-ui/primitives, or null if prop/React driven",
88
+ "const": "stickyBarMachine"
89
+ },
90
+ "runtime": {
91
+ "type": "string",
92
+ "description": "How headless state is driven at runtime",
93
+ "const": "useAeonMachine"
94
+ },
95
+ "events": {
96
+ "type": "array",
97
+ "items": {
98
+ "type": "string",
99
+ "enum": [
100
+ "DOCK",
101
+ "FLOAT",
102
+ "COLLAPSE",
103
+ "EXPAND",
104
+ "HIDE",
105
+ "SHOW",
106
+ "SET_OFFSET"
107
+ ]
108
+ }
109
+ },
110
+ "examples": {
111
+ "type": "array",
112
+ "items": {
113
+ "type": "string"
114
+ },
115
+ "default": []
116
+ }
117
+ },
118
+ "x-aeon": {
119
+ "scope": "bar",
120
+ "parts": [
121
+ "root",
122
+ "leading",
123
+ "center",
124
+ "trailing",
125
+ "seam"
126
+ ],
127
+ "states": [
128
+ "floating",
129
+ "docked",
130
+ "collapsed",
131
+ "hidden"
132
+ ],
133
+ "machine": "stickyBarMachine",
134
+ "runtime": "useAeonMachine",
135
+ "events": [
136
+ "DOCK",
137
+ "FLOAT",
138
+ "COLLAPSE",
139
+ "EXPAND",
140
+ "HIDE",
141
+ "SHOW",
142
+ "SET_OFFSET"
143
+ ],
144
+ "slots": {
145
+ "Root": "bar.root",
146
+ "Leading": "bar.leading",
147
+ "Center": "bar.center",
148
+ "Trailing": "bar.trailing",
149
+ "Seam": "bar.seam"
150
+ },
151
+ "examples": []
152
+ }
153
+ }
@@ -0,0 +1,129 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://aeon-ui.com/schemas/thread.json",
4
+ "title": "Thread",
5
+ "description": "Message stream — item state prop mine | theirs | pending | failed.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "component",
10
+ "scope"
11
+ ],
12
+ "properties": {
13
+ "component": {
14
+ "const": "Thread"
15
+ },
16
+ "scope": {
17
+ "const": "thread"
18
+ },
19
+ "parts": {
20
+ "type": "array",
21
+ "description": "Anatomy part keys — map to data-aeon-part",
22
+ "items": {
23
+ "type": "string",
24
+ "enum": [
25
+ "root",
26
+ "list",
27
+ "item",
28
+ "bubble",
29
+ "meta",
30
+ "day"
31
+ ]
32
+ },
33
+ "uniqueItems": true
34
+ },
35
+ "states": {
36
+ "type": "array",
37
+ "description": "Allowed data-aeon-state values (stable states only)",
38
+ "items": {
39
+ "type": "string",
40
+ "enum": [
41
+ "mine",
42
+ "theirs",
43
+ "pending",
44
+ "failed"
45
+ ]
46
+ },
47
+ "uniqueItems": true
48
+ },
49
+ "props": {
50
+ "type": "object",
51
+ "additionalProperties": false,
52
+ "properties": {}
53
+ },
54
+ "slots": {
55
+ "type": "object",
56
+ "description": "Named composition slots / compound parts",
57
+ "additionalProperties": {
58
+ "type": "string"
59
+ },
60
+ "properties": {
61
+ "Root": {
62
+ "const": "thread.root",
63
+ "description": "thread.root"
64
+ },
65
+ "Item": {
66
+ "const": "thread.item",
67
+ "description": "thread.item"
68
+ },
69
+ "Bubble": {
70
+ "const": "thread.bubble",
71
+ "description": "thread.bubble"
72
+ }
73
+ }
74
+ },
75
+ "machine": {
76
+ "type": [
77
+ "string",
78
+ "null"
79
+ ],
80
+ "description": "XState machine export from @aeon-ui/primitives, or null if prop/React driven",
81
+ "const": null
82
+ },
83
+ "runtime": {
84
+ "type": "string",
85
+ "description": "How headless state is driven at runtime",
86
+ "const": "props"
87
+ },
88
+ "events": {
89
+ "type": "array",
90
+ "items": {
91
+ "type": "string",
92
+ "enum": []
93
+ }
94
+ },
95
+ "examples": {
96
+ "type": "array",
97
+ "items": {
98
+ "type": "string"
99
+ },
100
+ "default": []
101
+ }
102
+ },
103
+ "x-aeon": {
104
+ "scope": "thread",
105
+ "parts": [
106
+ "root",
107
+ "list",
108
+ "item",
109
+ "bubble",
110
+ "meta",
111
+ "day"
112
+ ],
113
+ "states": [
114
+ "mine",
115
+ "theirs",
116
+ "pending",
117
+ "failed"
118
+ ],
119
+ "machine": null,
120
+ "runtime": "props",
121
+ "events": [],
122
+ "slots": {
123
+ "Root": "thread.root",
124
+ "Item": "thread.item",
125
+ "Bubble": "thread.bubble"
126
+ },
127
+ "examples": []
128
+ }
129
+ }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://aeon-ui.com/schemas/tooltip.json",
4
4
  "title": "Tooltip",
5
- "description": "Open via React useState. Touch tap toggles.",
5
+ "description": "Open/closed via popoverMachine (same family as Popover/Select/Combobox). openDelay / closeDelay / touchDuration stay React-local.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -75,18 +75,25 @@
75
75
  "null"
76
76
  ],
77
77
  "description": "XState machine export from @aeon-ui/primitives, or null if prop/React driven",
78
- "const": null
78
+ "const": "popoverMachine"
79
79
  },
80
80
  "runtime": {
81
81
  "type": "string",
82
82
  "description": "How headless state is driven at runtime",
83
- "const": "useState"
83
+ "const": "useAeonMachine"
84
84
  },
85
85
  "events": {
86
86
  "type": "array",
87
87
  "items": {
88
88
  "type": "string",
89
- "enum": []
89
+ "enum": [
90
+ "OPEN",
91
+ "CLOSE",
92
+ "TOGGLE",
93
+ "SET_OPEN",
94
+ "ESCAPE",
95
+ "POINTER_DOWN_OUTSIDE"
96
+ ]
90
97
  }
91
98
  },
92
99
  "examples": {
@@ -110,9 +117,16 @@
110
117
  "open",
111
118
  "closed"
112
119
  ],
113
- "machine": null,
114
- "runtime": "useState",
115
- "events": [],
120
+ "machine": "popoverMachine",
121
+ "runtime": "useAeonMachine",
122
+ "events": [
123
+ "OPEN",
124
+ "CLOSE",
125
+ "TOGGLE",
126
+ "SET_OPEN",
127
+ "ESCAPE",
128
+ "POINTER_DOWN_OUTSIDE"
129
+ ],
116
130
  "slots": {
117
131
  "Root": "tooltip.root",
118
132
  "Trigger": "tooltip.trigger",
@@ -1 +1 @@
1
- {"version":"4.1.8","results":[[":src/index.test.ts",{"duration":13.422166999999945,"failed":false}],[":src/aeon-to-schema.test.ts",{"duration":26.108833999999888,"failed":false}]]}
1
+ {"version":"4.1.8","results":[[":src/index.test.ts",{"duration":5.161209000000014,"failed":false}],[":src/aeon-to-schema.test.ts",{"duration":5.569166999999993,"failed":false}]]}
@@ -10,8 +10,8 @@ You are building UI with **Aeon UI**, a React component library powered by finit
10
10
  ## Non-negotiable rules
11
11
  1. Do not duplicate open/checked/lifecycle in `useState` when a machine exists in `@aeon-ui/primitives`.
12
12
  2. **Button `status` is a prop** (`idle|pending|success|failure|disabled`). Optional: drive it from `buttonLifecycleMachine` via `useAeonMachine` in app code.
13
- 3. **Select / Menu / Popover** share `popoverMachine` — never fork another open/closed chart.
14
- 4. **Combobox** and **Tooltip** use React state today — do not add floating machines without the component checklist.
13
+ 3. **Select / Menu / Popover / Combobox / Tooltip** share `popoverMachine` for open/closed — never fork another open/closed chart. Combobox keeps query/highlight in React; Tooltip keeps openDelay/closeDelay/touchDuration in React.
14
+ 4. **PinInput** digit buffer is React-local today — do not invent a pin machine without the component checklist.
15
15
  5. **Scroll** uses `getScrollSnapshot()` — no XState machine.
16
16
  6. If a machine lists N stable states, the UI must represent all N (totality).
17
17
  7. Prefer `@aeon-ui/react` (headless) or `@aeon-ui/ui` (styled). Relative TS imports use `.js` extensions inside the Aeon monorepo only.
@@ -59,6 +59,8 @@ Rule: Pending must set aria-busy. Do not use disabled alone to mean "saving".
59
59
  States: open | closed. Events: OPEN, CLOSE, TOGGLE.
60
60
  Rule: Backdrop click and Escape are CLOSE transitions. Title/Description are required for a11y when open.
61
61
 
62
- ## Popover family (Popover, Menu, Select open state)
62
+ ## Popover family (Popover, Menu, Select, Combobox, Tooltip open state)
63
63
  Machine: popoverMachine — states open | closed.
64
- Rule: Reuse this chart. Never create selectOpenMachine / menuOpenMachine forks.
64
+ Rule: Reuse this chart. Never create selectOpenMachine / menuOpenMachine / comboboxOpenMachine / tooltipOpenMachine forks.
65
+ Combobox: query + highlight stay React-local; open/closed must still be popoverMachine.
66
+ Tooltip: openDelay / closeDelay / touchDuration stay React-local; open/closed must still be popoverMachine.
@@ -22,10 +22,31 @@ Rule: Pending must set aria-busy. Do not use disabled alone to mean "saving".
22
22
  States: open | closed. Events: OPEN, CLOSE, TOGGLE.
23
23
  Rule: Backdrop click and Escape are CLOSE transitions. Title/Description are required for a11y when open.
24
24
 
25
- ## Popover family (Popover, Menu, Select open state)
25
+ ## Popover family (Popover, Menu, Select, Combobox, Tooltip open state)
26
26
  Machine: popoverMachine — states open | closed.
27
- Rule: Reuse this chart. Never create selectOpenMachine / menuOpenMachine forks.
27
+ Rule: Reuse this chart. Never create selectOpenMachine / menuOpenMachine / comboboxOpenMachine / tooltipOpenMachine forks.
28
+ Combobox: query + highlight stay React-local; open/closed must still be popoverMachine.
29
+ Tooltip: openDelay / closeDelay / touchDuration stay React-local; open/closed must still be popoverMachine.
28
30
 
29
31
  ## Switch / Checkbox
30
32
  Machine: toggleMachine — checked | unchecked. Events: TOGGLE, CHECK, UNCHECK.
31
33
  Rule: Hidden input stays in sync with snapshot for forms.
34
+
35
+ ## Slider statechart
36
+ Machine: sliderMachine — idle | dragging; value/min/max/step in context.
37
+ Events: SET_VALUE, STEP, POINTER_DOWN, POINTER_UP, HOME, END.
38
+ Rule: Disabled blocks SET_VALUE / drag; project idle vs dragging on data-aeon-state.
39
+
40
+ ## Content region statechart
41
+ Machine: contentRegionMachine — idle → pending → (empty | error | ready) → loadingMore | success.
42
+ Events: LOAD, RESOLVE, REJECT, RETRY, LOAD_MORE, MORE_DONE, SUCCEED, RESET.
43
+ Rule: Every stable state has a slot. Pair with Async for fetch; do not hide empty/error behind a spinner.
44
+
45
+ ## Toast item statechart
46
+ Machine: toastMachine — hidden | visible. Events: SHOW, HIDE, DISMISS.
47
+ Rule: Provider list orchestration may use React; each toast item uses the machine.
48
+
49
+ ## StickyBar statechart
50
+ Machine: stickyBarMachine — floating | docked | collapsed | hidden.
51
+ Events: DOCK, FLOAT, COLLAPSE, EXPAND, HIDE, SHOW, SET_OFFSET.
52
+ Rule: DOM scope is bar (bar anatomy zones). Do not invent a parallel sticky useState.
@@ -10,8 +10,8 @@ You are building UI with **Aeon UI**, a React component library powered by finit
10
10
  ## Non-negotiable rules
11
11
  1. Do not duplicate open/checked/lifecycle in `useState` when a machine exists in `@aeon-ui/primitives`.
12
12
  2. **Button `status` is a prop** (`idle|pending|success|failure|disabled`). Optional: drive it from `buttonLifecycleMachine` via `useAeonMachine` in app code.
13
- 3. **Select / Menu / Popover** share `popoverMachine` — never fork another open/closed chart.
14
- 4. **Combobox** and **Tooltip** use React state today — do not add floating machines without the component checklist.
13
+ 3. **Select / Menu / Popover / Combobox / Tooltip** share `popoverMachine` for open/closed — never fork another open/closed chart. Combobox keeps query/highlight in React; Tooltip keeps openDelay/closeDelay/touchDuration in React.
14
+ 4. **PinInput** digit buffer is React-local today — do not invent a pin machine without the component checklist.
15
15
  5. **Scroll** uses `getScrollSnapshot()` — no XState machine.
16
16
  6. If a machine lists N stable states, the UI must represent all N (totality).
17
17
  7. Prefer `@aeon-ui/react` (headless) or `@aeon-ui/ui` (styled). Relative TS imports use `.js` extensions inside the Aeon monorepo only.