aeon-ui-engine 1.3.1 → 1.3.5

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 (78) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/package.json +1 -1
  3. package/packages/react/src/combobox/index.tsx +13 -8
  4. package/packages/react/src/tooltip/index.tsx +48 -22
  5. package/packages/schemas/dist/index.d.ts +69 -24
  6. package/packages/schemas/dist/index.js +447 -49
  7. package/packages/schemas/json/appNav.json +146 -0
  8. package/packages/schemas/json/appShell.json +151 -0
  9. package/packages/schemas/json/avatar.json +130 -0
  10. package/packages/schemas/json/bar.json +126 -0
  11. package/packages/schemas/json/catalog.json +3163 -15
  12. package/packages/schemas/json/combobox.json +19 -7
  13. package/packages/schemas/json/composer.json +125 -0
  14. package/packages/schemas/json/content.json +167 -0
  15. package/packages/schemas/json/conversation.json +166 -0
  16. package/packages/schemas/json/entry.json +182 -0
  17. package/packages/schemas/json/identity.json +147 -0
  18. package/packages/schemas/json/listRow.json +131 -0
  19. package/packages/schemas/json/metricStrip.json +132 -0
  20. package/packages/schemas/json/nav.json +136 -0
  21. package/packages/schemas/json/panel.json +143 -0
  22. package/packages/schemas/json/pinInput.json +112 -0
  23. package/packages/schemas/json/profileHeader.json +138 -0
  24. package/packages/schemas/json/prompt.json +155 -0
  25. package/packages/schemas/json/radioGroup.json +130 -0
  26. package/packages/schemas/json/separator.json +105 -0
  27. package/packages/schemas/json/slider.json +147 -0
  28. package/packages/schemas/json/statusBanner.json +149 -0
  29. package/packages/schemas/json/stickyBar.json +153 -0
  30. package/packages/schemas/json/thread.json +129 -0
  31. package/packages/schemas/json/tooltip.json +21 -7
  32. package/packages/schemas/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
  33. package/packages/schemas/prompts/cursorrules.md +6 -4
  34. package/packages/schemas/prompts/statecharts.md +23 -2
  35. package/packages/schemas/prompts/system.md +2 -2
  36. package/packages/schemas/registry/catalog.json +295 -4
  37. package/packages/schemas/registry/components/appNav.json +146 -0
  38. package/packages/schemas/registry/components/appShell.json +151 -0
  39. package/packages/schemas/registry/components/avatar.json +130 -0
  40. package/packages/schemas/registry/components/bar.json +126 -0
  41. package/packages/schemas/registry/components/combobox.json +19 -7
  42. package/packages/schemas/registry/components/composer.json +125 -0
  43. package/packages/schemas/registry/components/content.json +167 -0
  44. package/packages/schemas/registry/components/conversation.json +166 -0
  45. package/packages/schemas/registry/components/entry.json +182 -0
  46. package/packages/schemas/registry/components/identity.json +147 -0
  47. package/packages/schemas/registry/components/listRow.json +131 -0
  48. package/packages/schemas/registry/components/metricStrip.json +132 -0
  49. package/packages/schemas/registry/components/nav.json +136 -0
  50. package/packages/schemas/registry/components/panel.json +143 -0
  51. package/packages/schemas/registry/components/pinInput.json +112 -0
  52. package/packages/schemas/registry/components/profileHeader.json +138 -0
  53. package/packages/schemas/registry/components/prompt.json +155 -0
  54. package/packages/schemas/registry/components/radioGroup.json +130 -0
  55. package/packages/schemas/registry/components/separator.json +105 -0
  56. package/packages/schemas/registry/components/slider.json +147 -0
  57. package/packages/schemas/registry/components/statusBanner.json +149 -0
  58. package/packages/schemas/registry/components/stickyBar.json +153 -0
  59. package/packages/schemas/registry/components/thread.json +129 -0
  60. package/packages/schemas/registry/components/tooltip.json +21 -7
  61. package/packages/schemas/registry/machines/accordion.json +58 -0
  62. package/packages/schemas/registry/machines/appNav.json +108 -0
  63. package/packages/schemas/registry/machines/appShell.json +128 -0
  64. package/packages/schemas/registry/machines/contentRegion.json +314 -0
  65. package/packages/schemas/registry/machines/panel.json +131 -0
  66. package/packages/schemas/registry/machines/popover.json +143 -0
  67. package/packages/schemas/registry/machines/slider.json +151 -0
  68. package/packages/schemas/registry/machines/stickyBar.json +261 -0
  69. package/packages/schemas/registry/machines/tabs.json +58 -0
  70. package/packages/schemas/registry/machines/toast.json +89 -0
  71. package/packages/schemas/registry/machines/toggle.json +134 -0
  72. package/packages/schemas/scripts/emit.ts +23 -0
  73. package/packages/schemas/src/components.ts +429 -6
  74. package/packages/schemas/src/index.test.ts +83 -0
  75. package/packages/schemas/src/index.ts +1 -0
  76. package/packages/schemas/src/machine-id.ts +7 -0
  77. package/packages/schemas/src/prompts.ts +25 -4
  78. package/packages/schemas/src/registry.ts +28 -39
@@ -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.
@@ -16,7 +16,7 @@
16
16
  "schemaUrl": "https://aeon-ui.com/registry/components/button.json",
17
17
  "machineUrl": "https://aeon-ui.com/registry/machines/buttonLifecycle.json",
18
18
  "runtime": "status prop",
19
- "description": "Action control with idle|pending|success|failure|disabled"
19
+ "description": "Action control. status is a prop projection (not an in-tree machine). Never invent parallel useState for lifecycle."
20
20
  },
21
21
  {
22
22
  "id": "async",
@@ -25,7 +25,7 @@
25
25
  "schemaUrl": "https://aeon-ui.com/registry/components/async.json",
26
26
  "machineUrl": "https://aeon-ui.com/registry/machines/async.json",
27
27
  "runtime": "useAeonMachine",
28
- "description": "Fetch lifecycle region with full totality"
28
+ "description": "Fetch region with full lifecycle totality: idle → loading → success|empty|failure. Always render every stable state in demos."
29
29
  },
30
30
  {
31
31
  "id": "field",
@@ -34,7 +34,7 @@
34
34
  "schemaUrl": "https://aeon-ui.com/registry/components/field.json",
35
35
  "machineUrl": "https://aeon-ui.com/registry/machines/field.json",
36
36
  "runtime": "useAeonMachine",
37
- "description": "Parallel interaction × validation × submission"
37
+ "description": "Parallel regions: interaction × validation × submission. Do not collapse into a single error boolean."
38
38
  },
39
39
  {
40
40
  "id": "dialog",
@@ -43,7 +43,298 @@
43
43
  "schemaUrl": "https://aeon-ui.com/registry/components/dialog.json",
44
44
  "machineUrl": "https://aeon-ui.com/registry/machines/dialog.json",
45
45
  "runtime": "useAeonMachine",
46
- "description": "Modal open/closed"
46
+ "description": "Modal open/closed via dialogMachine. Dismissal is a transition, not ad hoc flags."
47
+ },
48
+ {
49
+ "id": "switch",
50
+ "title": "Switch",
51
+ "scope": "switch",
52
+ "schemaUrl": "https://aeon-ui.com/registry/components/switch.json",
53
+ "machineUrl": "https://aeon-ui.com/registry/machines/toggle.json",
54
+ "runtime": "useAeonMachine",
55
+ "description": "Binary toggle via toggleMachine."
56
+ },
57
+ {
58
+ "id": "checkbox",
59
+ "title": "Checkbox",
60
+ "scope": "checkbox",
61
+ "schemaUrl": "https://aeon-ui.com/registry/components/checkbox.json",
62
+ "machineUrl": "https://aeon-ui.com/registry/machines/toggle.json",
63
+ "runtime": "useAeonMachine",
64
+ "description": "Binary toggle via toggleMachine (same chart family as Switch)."
65
+ },
66
+ {
67
+ "id": "tabs",
68
+ "title": "Tabs",
69
+ "scope": "tabs",
70
+ "schemaUrl": "https://aeon-ui.com/registry/components/tabs.json",
71
+ "machineUrl": "https://aeon-ui.com/registry/machines/tabs.json",
72
+ "runtime": "useAeonMachine",
73
+ "description": "Selected tab value from tabsMachine."
74
+ },
75
+ {
76
+ "id": "accordion",
77
+ "title": "Accordion",
78
+ "scope": "accordion",
79
+ "schemaUrl": "https://aeon-ui.com/registry/components/accordion.json",
80
+ "machineUrl": "https://aeon-ui.com/registry/machines/accordion.json",
81
+ "runtime": "useAeonMachine",
82
+ "description": "Per-item open state via accordionMachine."
83
+ },
84
+ {
85
+ "id": "popover",
86
+ "title": "Popover",
87
+ "scope": "popover",
88
+ "schemaUrl": "https://aeon-ui.com/registry/components/popover.json",
89
+ "machineUrl": "https://aeon-ui.com/registry/machines/popover.json",
90
+ "runtime": "useAeonMachine",
91
+ "description": "Floating surface — shares popoverMachine. Do not fork a duplicate open/closed chart."
92
+ },
93
+ {
94
+ "id": "menu",
95
+ "title": "Menu",
96
+ "scope": "menu",
97
+ "schemaUrl": "https://aeon-ui.com/registry/components/menu.json",
98
+ "machineUrl": "https://aeon-ui.com/registry/machines/popover.json",
99
+ "runtime": "useAeonMachine",
100
+ "description": "Shares popoverMachine with Popover/Select open state."
101
+ },
102
+ {
103
+ "id": "select",
104
+ "title": "Select",
105
+ "scope": "select",
106
+ "schemaUrl": "https://aeon-ui.com/registry/components/select.json",
107
+ "machineUrl": "https://aeon-ui.com/registry/machines/popover.json",
108
+ "runtime": "useAeonMachine",
109
+ "description": "Open/closed via popoverMachine; highlight may be React-local. Do not invent a new open machine."
110
+ },
111
+ {
112
+ "id": "combobox",
113
+ "title": "Combobox",
114
+ "scope": "combobox",
115
+ "schemaUrl": "https://aeon-ui.com/registry/components/combobox.json",
116
+ "machineUrl": "https://aeon-ui.com/registry/machines/popover.json",
117
+ "runtime": "useAeonMachine",
118
+ "description": "Open/closed via popoverMachine (same family as Select/Menu/Popover). Query, highlight, and item registry stay React-local for typeahead."
119
+ },
120
+ {
121
+ "id": "tooltip",
122
+ "title": "Tooltip",
123
+ "scope": "tooltip",
124
+ "schemaUrl": "https://aeon-ui.com/registry/components/tooltip.json",
125
+ "machineUrl": "https://aeon-ui.com/registry/machines/popover.json",
126
+ "runtime": "useAeonMachine",
127
+ "description": "Open/closed via popoverMachine (same family as Popover/Select/Combobox). openDelay / closeDelay / touchDuration stay React-local."
128
+ },
129
+ {
130
+ "id": "toast",
131
+ "title": "Toast",
132
+ "scope": "toast",
133
+ "schemaUrl": "https://aeon-ui.com/registry/components/toast.json",
134
+ "machineUrl": "https://aeon-ui.com/registry/machines/toast.json",
135
+ "runtime": "useAeonMachine",
136
+ "description": "Per-item visibility via toastMachine."
137
+ },
138
+ {
139
+ "id": "scroll",
140
+ "title": "Scroll",
141
+ "scope": "scroll",
142
+ "schemaUrl": "https://aeon-ui.com/registry/components/scroll.json",
143
+ "runtime": "getScrollSnapshot",
144
+ "description": "Derived overflow/edge snapshot via getScrollSnapshot() — no XState machine."
145
+ },
146
+ {
147
+ "id": "progress",
148
+ "title": "Progress",
149
+ "scope": "progress",
150
+ "schemaUrl": "https://aeon-ui.com/registry/components/progress.json",
151
+ "runtime": "props",
152
+ "description": "Prop-driven progress: value + indeterminate → idle | loading | complete."
153
+ },
154
+ {
155
+ "id": "radioGroup",
156
+ "title": "RadioGroup",
157
+ "scope": "radioGroup",
158
+ "schemaUrl": "https://aeon-ui.com/registry/components/radioGroup.json",
159
+ "machineUrl": "https://aeon-ui.com/registry/machines/tabs.json",
160
+ "runtime": "useAeonMachine",
161
+ "description": "Single selection via tabsMachine (same chart family as Tabs/Nav)."
162
+ },
163
+ {
164
+ "id": "slider",
165
+ "title": "Slider",
166
+ "scope": "slider",
167
+ "schemaUrl": "https://aeon-ui.com/registry/components/slider.json",
168
+ "machineUrl": "https://aeon-ui.com/registry/machines/slider.json",
169
+ "runtime": "useAeonMachine",
170
+ "description": "Range control via sliderMachine — idle | dragging plus numeric value in context."
171
+ },
172
+ {
173
+ "id": "pinInput",
174
+ "title": "PinInput",
175
+ "scope": "pinInput",
176
+ "schemaUrl": "https://aeon-ui.com/registry/components/pinInput.json",
177
+ "runtime": "useState",
178
+ "description": "OTP / PIN cells — React state for digit buffer; projects idle | complete on root."
179
+ },
180
+ {
181
+ "id": "avatar",
182
+ "title": "Avatar",
183
+ "scope": "avatar",
184
+ "schemaUrl": "https://aeon-ui.com/registry/components/avatar.json",
185
+ "runtime": "useState",
186
+ "description": "Image load lifecycle in React; badge presence is a prop projection."
187
+ },
188
+ {
189
+ "id": "content",
190
+ "title": "Content",
191
+ "scope": "content",
192
+ "schemaUrl": "https://aeon-ui.com/registry/components/content.json",
193
+ "machineUrl": "https://aeon-ui.com/registry/machines/contentRegion.json",
194
+ "runtime": "useAeonMachine",
195
+ "description": "Status-slotted body via contentRegionMachine (or Root state prop projection). Pair with Async for fetch."
196
+ },
197
+ {
198
+ "id": "panel",
199
+ "title": "Panel",
200
+ "scope": "panel",
201
+ "schemaUrl": "https://aeon-ui.com/registry/components/panel.json",
202
+ "machineUrl": "https://aeon-ui.com/registry/machines/panel.json",
203
+ "runtime": "useAeonMachine",
204
+ "description": "Collapsible layout region via panelMachine — expanded | collapsed."
205
+ },
206
+ {
207
+ "id": "appShell",
208
+ "title": "AppShell",
209
+ "scope": "appShell",
210
+ "schemaUrl": "https://aeon-ui.com/registry/components/appShell.json",
211
+ "machineUrl": "https://aeon-ui.com/registry/machines/appShell.json",
212
+ "runtime": "useAeonMachine",
213
+ "description": "Application chrome frame via appShellMachine — idle | overlayOpen (+ dockVisible)."
214
+ },
215
+ {
216
+ "id": "stickyBar",
217
+ "title": "StickyBar",
218
+ "scope": "bar",
219
+ "schemaUrl": "https://aeon-ui.com/registry/components/stickyBar.json",
220
+ "machineUrl": "https://aeon-ui.com/registry/machines/stickyBar.json",
221
+ "runtime": "useAeonMachine",
222
+ "description": "Sticky/fixed chrome band via stickyBarMachine. DOM scope is bar (reuses bar anatomy zones)."
223
+ },
224
+ {
225
+ "id": "bar",
226
+ "title": "Bar",
227
+ "scope": "bar",
228
+ "schemaUrl": "https://aeon-ui.com/registry/components/bar.json",
229
+ "runtime": "layout",
230
+ "description": "Three-zone toolbar layout (leading / center / trailing / seam). Sticky lifecycle uses StickyBar + stickyBarMachine."
231
+ },
232
+ {
233
+ "id": "nav",
234
+ "title": "Nav",
235
+ "scope": "nav",
236
+ "schemaUrl": "https://aeon-ui.com/registry/components/nav.json",
237
+ "machineUrl": "https://aeon-ui.com/registry/machines/tabs.json",
238
+ "runtime": "useAeonMachine",
239
+ "description": "Navigational collection via tabsMachine; items project inactive | active | disabled."
240
+ },
241
+ {
242
+ "id": "appNav",
243
+ "title": "AppNav",
244
+ "scope": "appNav",
245
+ "schemaUrl": "https://aeon-ui.com/registry/components/appNav.json",
246
+ "machineUrl": "https://aeon-ui.com/registry/machines/appNav.json",
247
+ "runtime": "useAeonMachine",
248
+ "description": "Section + detail stack via appNavMachine — list→detail, settings drill-in."
249
+ },
250
+ {
251
+ "id": "prompt",
252
+ "title": "Prompt",
253
+ "scope": "prompt",
254
+ "schemaUrl": "https://aeon-ui.com/registry/components/prompt.json",
255
+ "machineUrl": "https://aeon-ui.com/registry/machines/dialog.json",
256
+ "runtime": "status prop",
257
+ "description": "Confirm / permission dialog composed on Dialog. Open/closed via dialogMachine; face via status prop."
258
+ },
259
+ {
260
+ "id": "statusBanner",
261
+ "title": "StatusBanner",
262
+ "scope": "statusBanner",
263
+ "schemaUrl": "https://aeon-ui.com/registry/components/statusBanner.json",
264
+ "runtime": "props",
265
+ "description": "Non-blocking top-of-app notice — tone + optional status props project to data-aeon-state."
266
+ },
267
+ {
268
+ "id": "separator",
269
+ "title": "Separator",
270
+ "scope": "separator",
271
+ "schemaUrl": "https://aeon-ui.com/registry/components/separator.json",
272
+ "runtime": "props",
273
+ "description": "Static divider — orientation prop only."
274
+ },
275
+ {
276
+ "id": "composer",
277
+ "title": "Composer",
278
+ "scope": "composer",
279
+ "schemaUrl": "https://aeon-ui.com/registry/components/composer.json",
280
+ "runtime": "props",
281
+ "description": "Compose chrome — root state prop idle | sending | disabled | error."
282
+ },
283
+ {
284
+ "id": "thread",
285
+ "title": "Thread",
286
+ "scope": "thread",
287
+ "schemaUrl": "https://aeon-ui.com/registry/components/thread.json",
288
+ "runtime": "props",
289
+ "description": "Message stream — item state prop mine | theirs | pending | failed."
290
+ },
291
+ {
292
+ "id": "identity",
293
+ "title": "Identity",
294
+ "scope": "identity",
295
+ "schemaUrl": "https://aeon-ui.com/registry/components/identity.json",
296
+ "runtime": "layout",
297
+ "description": "Avatar + title + subtitle strip — presentational layout, not a niche product scope."
298
+ },
299
+ {
300
+ "id": "profileHeader",
301
+ "title": "ProfileHeader",
302
+ "scope": "profileHeader",
303
+ "schemaUrl": "https://aeon-ui.com/registry/components/profileHeader.json",
304
+ "runtime": "layout",
305
+ "description": "Dense account header — identity · metrics · actions. Universal people chrome."
306
+ },
307
+ {
308
+ "id": "metricStrip",
309
+ "title": "MetricStrip",
310
+ "scope": "metricStrip",
311
+ "schemaUrl": "https://aeon-ui.com/registry/components/metricStrip.json",
312
+ "runtime": "layout",
313
+ "description": "Dense value|label chips — cluster or loose density. Generic stats only."
314
+ },
315
+ {
316
+ "id": "listRow",
317
+ "title": "ListRow",
318
+ "scope": "listRow",
319
+ "schemaUrl": "https://aeon-ui.com/registry/components/listRow.json",
320
+ "runtime": "layout",
321
+ "description": "Settings / menu row — leading · label · trailing. Layout only."
322
+ },
323
+ {
324
+ "id": "entry",
325
+ "title": "Entry",
326
+ "scope": "entry",
327
+ "schemaUrl": "https://aeon-ui.com/registry/components/entry.json",
328
+ "runtime": "props",
329
+ "description": "Universal multi-value card (feed stack or listing split). Root state idle | selected | muted — never invent niche scopes."
330
+ },
331
+ {
332
+ "id": "conversation",
333
+ "title": "Conversation",
334
+ "scope": "conversation",
335
+ "schemaUrl": "https://aeon-ui.com/registry/components/conversation.json",
336
+ "runtime": "props",
337
+ "description": "Inbox / DM list — item state prop idle | unread | selected. Universal messaging chrome."
47
338
  }
48
339
  ],
49
340
  "client": {
@@ -0,0 +1,146 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://aeon-ui.com/schemas/appNav.json",
4
+ "title": "AppNav",
5
+ "description": "Section + detail stack via appNavMachine — list→detail, settings drill-in.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "component",
10
+ "scope"
11
+ ],
12
+ "properties": {
13
+ "component": {
14
+ "const": "AppNav"
15
+ },
16
+ "scope": {
17
+ "const": "appNav"
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
+ "rail",
27
+ "section",
28
+ "stage",
29
+ "breadcrumb",
30
+ "crumb",
31
+ "back"
32
+ ]
33
+ },
34
+ "uniqueItems": true
35
+ },
36
+ "states": {
37
+ "type": "array",
38
+ "description": "Allowed data-aeon-state values (stable states only)",
39
+ "items": {
40
+ "type": "string",
41
+ "enum": [
42
+ "section"
43
+ ]
44
+ },
45
+ "uniqueItems": true
46
+ },
47
+ "props": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "properties": {}
51
+ },
52
+ "slots": {
53
+ "type": "object",
54
+ "description": "Named composition slots / compound parts",
55
+ "additionalProperties": {
56
+ "type": "string"
57
+ },
58
+ "properties": {
59
+ "Root": {
60
+ "const": "appNav.root",
61
+ "description": "appNav.root"
62
+ },
63
+ "Rail": {
64
+ "const": "appNav.rail",
65
+ "description": "appNav.rail"
66
+ },
67
+ "Stage": {
68
+ "const": "appNav.stage",
69
+ "description": "appNav.stage"
70
+ },
71
+ "Back": {
72
+ "const": "appNav.back",
73
+ "description": "appNav.back"
74
+ }
75
+ }
76
+ },
77
+ "machine": {
78
+ "type": [
79
+ "string",
80
+ "null"
81
+ ],
82
+ "description": "XState machine export from @aeon-ui/primitives, or null if prop/React driven",
83
+ "const": "appNavMachine"
84
+ },
85
+ "runtime": {
86
+ "type": "string",
87
+ "description": "How headless state is driven at runtime",
88
+ "const": "useAeonMachine"
89
+ },
90
+ "events": {
91
+ "type": "array",
92
+ "items": {
93
+ "type": "string",
94
+ "enum": [
95
+ "SET_SECTION",
96
+ "PUSH",
97
+ "REPLACE",
98
+ "POP",
99
+ "POP_TO",
100
+ "CLEAR",
101
+ "RESET"
102
+ ]
103
+ }
104
+ },
105
+ "examples": {
106
+ "type": "array",
107
+ "items": {
108
+ "type": "string"
109
+ },
110
+ "default": []
111
+ }
112
+ },
113
+ "x-aeon": {
114
+ "scope": "appNav",
115
+ "parts": [
116
+ "root",
117
+ "rail",
118
+ "section",
119
+ "stage",
120
+ "breadcrumb",
121
+ "crumb",
122
+ "back"
123
+ ],
124
+ "states": [
125
+ "section"
126
+ ],
127
+ "machine": "appNavMachine",
128
+ "runtime": "useAeonMachine",
129
+ "events": [
130
+ "SET_SECTION",
131
+ "PUSH",
132
+ "REPLACE",
133
+ "POP",
134
+ "POP_TO",
135
+ "CLEAR",
136
+ "RESET"
137
+ ],
138
+ "slots": {
139
+ "Root": "appNav.root",
140
+ "Rail": "appNav.rail",
141
+ "Stage": "appNav.stage",
142
+ "Back": "appNav.back"
143
+ },
144
+ "examples": []
145
+ }
146
+ }
@@ -0,0 +1,151 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://aeon-ui.com/schemas/appShell.json",
4
+ "title": "AppShell",
5
+ "description": "Application chrome frame via appShellMachine — idle | overlayOpen (+ dockVisible).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "component",
10
+ "scope"
11
+ ],
12
+ "properties": {
13
+ "component": {
14
+ "const": "AppShell"
15
+ },
16
+ "scope": {
17
+ "const": "appShell"
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
+ "header",
27
+ "subheader",
28
+ "content",
29
+ "aside",
30
+ "footer",
31
+ "dock",
32
+ "scrim"
33
+ ]
34
+ },
35
+ "uniqueItems": true
36
+ },
37
+ "states": {
38
+ "type": "array",
39
+ "description": "Allowed data-aeon-state values (stable states only)",
40
+ "items": {
41
+ "type": "string",
42
+ "enum": [
43
+ "idle",
44
+ "overlayOpen"
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": "appShell.root",
63
+ "description": "appShell.root"
64
+ },
65
+ "Header": {
66
+ "const": "appShell.header",
67
+ "description": "appShell.header"
68
+ },
69
+ "Content": {
70
+ "const": "appShell.content",
71
+ "description": "appShell.content"
72
+ },
73
+ "Dock": {
74
+ "const": "appShell.dock",
75
+ "description": "appShell.dock"
76
+ },
77
+ "Scrim": {
78
+ "const": "appShell.scrim",
79
+ "description": "appShell.scrim"
80
+ }
81
+ }
82
+ },
83
+ "machine": {
84
+ "type": [
85
+ "string",
86
+ "null"
87
+ ],
88
+ "description": "XState machine export from @aeon-ui/primitives, or null if prop/React driven",
89
+ "const": "appShellMachine"
90
+ },
91
+ "runtime": {
92
+ "type": "string",
93
+ "description": "How headless state is driven at runtime",
94
+ "const": "useAeonMachine"
95
+ },
96
+ "events": {
97
+ "type": "array",
98
+ "items": {
99
+ "type": "string",
100
+ "enum": [
101
+ "OPEN_OVERLAY",
102
+ "CLOSE_OVERLAY",
103
+ "SHOW_DOCK",
104
+ "HIDE_DOCK",
105
+ "SET_DOCK"
106
+ ]
107
+ }
108
+ },
109
+ "examples": {
110
+ "type": "array",
111
+ "items": {
112
+ "type": "string"
113
+ },
114
+ "default": []
115
+ }
116
+ },
117
+ "x-aeon": {
118
+ "scope": "appShell",
119
+ "parts": [
120
+ "root",
121
+ "header",
122
+ "subheader",
123
+ "content",
124
+ "aside",
125
+ "footer",
126
+ "dock",
127
+ "scrim"
128
+ ],
129
+ "states": [
130
+ "idle",
131
+ "overlayOpen"
132
+ ],
133
+ "machine": "appShellMachine",
134
+ "runtime": "useAeonMachine",
135
+ "events": [
136
+ "OPEN_OVERLAY",
137
+ "CLOSE_OVERLAY",
138
+ "SHOW_DOCK",
139
+ "HIDE_DOCK",
140
+ "SET_DOCK"
141
+ ],
142
+ "slots": {
143
+ "Root": "appShell.root",
144
+ "Header": "appShell.header",
145
+ "Content": "appShell.content",
146
+ "Dock": "appShell.dock",
147
+ "Scrim": "appShell.scrim"
148
+ },
149
+ "examples": []
150
+ }
151
+ }