@aigne/afs-ui 1.11.0-beta.12

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 (196) hide show
  1. package/LICENSE.md +26 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +10 -0
  4. package/dist/aup-protocol.cjs +235 -0
  5. package/dist/aup-protocol.d.cts +78 -0
  6. package/dist/aup-protocol.d.cts.map +1 -0
  7. package/dist/aup-protocol.d.mts +78 -0
  8. package/dist/aup-protocol.d.mts.map +1 -0
  9. package/dist/aup-protocol.mjs +235 -0
  10. package/dist/aup-protocol.mjs.map +1 -0
  11. package/dist/aup-registry.cjs +2489 -0
  12. package/dist/aup-registry.mjs +2487 -0
  13. package/dist/aup-registry.mjs.map +1 -0
  14. package/dist/aup-spec.cjs +1467 -0
  15. package/dist/aup-spec.mjs +1466 -0
  16. package/dist/aup-spec.mjs.map +1 -0
  17. package/dist/aup-types.cjs +165 -0
  18. package/dist/aup-types.d.cts +157 -0
  19. package/dist/aup-types.d.cts.map +1 -0
  20. package/dist/aup-types.d.mts +157 -0
  21. package/dist/aup-types.d.mts.map +1 -0
  22. package/dist/aup-types.mjs +157 -0
  23. package/dist/aup-types.mjs.map +1 -0
  24. package/dist/backend.cjs +14 -0
  25. package/dist/backend.d.cts +104 -0
  26. package/dist/backend.d.cts.map +1 -0
  27. package/dist/backend.d.mts +104 -0
  28. package/dist/backend.d.mts.map +1 -0
  29. package/dist/backend.mjs +13 -0
  30. package/dist/backend.mjs.map +1 -0
  31. package/dist/degradation.cjs +85 -0
  32. package/dist/degradation.d.cts +17 -0
  33. package/dist/degradation.d.cts.map +1 -0
  34. package/dist/degradation.d.mts +17 -0
  35. package/dist/degradation.d.mts.map +1 -0
  36. package/dist/degradation.mjs +84 -0
  37. package/dist/degradation.mjs.map +1 -0
  38. package/dist/index.cjs +36 -0
  39. package/dist/index.d.cts +12 -0
  40. package/dist/index.d.mts +12 -0
  41. package/dist/index.mjs +13 -0
  42. package/dist/runtime.cjs +117 -0
  43. package/dist/runtime.d.cts +59 -0
  44. package/dist/runtime.d.cts.map +1 -0
  45. package/dist/runtime.d.mts +59 -0
  46. package/dist/runtime.d.mts.map +1 -0
  47. package/dist/runtime.mjs +118 -0
  48. package/dist/runtime.mjs.map +1 -0
  49. package/dist/session.cjs +159 -0
  50. package/dist/session.d.cts +80 -0
  51. package/dist/session.d.cts.map +1 -0
  52. package/dist/session.d.mts +80 -0
  53. package/dist/session.d.mts.map +1 -0
  54. package/dist/session.mjs +159 -0
  55. package/dist/session.mjs.map +1 -0
  56. package/dist/snapshot.cjs +162 -0
  57. package/dist/snapshot.mjs +163 -0
  58. package/dist/snapshot.mjs.map +1 -0
  59. package/dist/term-page.cjs +264 -0
  60. package/dist/term-page.mjs +264 -0
  61. package/dist/term-page.mjs.map +1 -0
  62. package/dist/term.cjs +295 -0
  63. package/dist/term.d.cts +84 -0
  64. package/dist/term.d.cts.map +1 -0
  65. package/dist/term.d.mts +84 -0
  66. package/dist/term.d.mts.map +1 -0
  67. package/dist/term.mjs +296 -0
  68. package/dist/term.mjs.map +1 -0
  69. package/dist/tty.cjs +136 -0
  70. package/dist/tty.d.cts +53 -0
  71. package/dist/tty.d.cts.map +1 -0
  72. package/dist/tty.d.mts +53 -0
  73. package/dist/tty.d.mts.map +1 -0
  74. package/dist/tty.mjs +135 -0
  75. package/dist/tty.mjs.map +1 -0
  76. package/dist/ui-provider.cjs +4615 -0
  77. package/dist/ui-provider.d.cts +307 -0
  78. package/dist/ui-provider.d.cts.map +1 -0
  79. package/dist/ui-provider.d.mts +307 -0
  80. package/dist/ui-provider.d.mts.map +1 -0
  81. package/dist/ui-provider.mjs +4616 -0
  82. package/dist/ui-provider.mjs.map +1 -0
  83. package/dist/web-page/core.cjs +1388 -0
  84. package/dist/web-page/core.mjs +1387 -0
  85. package/dist/web-page/core.mjs.map +1 -0
  86. package/dist/web-page/css.cjs +1699 -0
  87. package/dist/web-page/css.mjs +1698 -0
  88. package/dist/web-page/css.mjs.map +1 -0
  89. package/dist/web-page/icons.cjs +248 -0
  90. package/dist/web-page/icons.mjs +248 -0
  91. package/dist/web-page/icons.mjs.map +1 -0
  92. package/dist/web-page/overlay-themes.cjs +514 -0
  93. package/dist/web-page/overlay-themes.mjs +513 -0
  94. package/dist/web-page/overlay-themes.mjs.map +1 -0
  95. package/dist/web-page/renderers/action.cjs +72 -0
  96. package/dist/web-page/renderers/action.mjs +72 -0
  97. package/dist/web-page/renderers/action.mjs.map +1 -0
  98. package/dist/web-page/renderers/broadcast.cjs +160 -0
  99. package/dist/web-page/renderers/broadcast.mjs +160 -0
  100. package/dist/web-page/renderers/broadcast.mjs.map +1 -0
  101. package/dist/web-page/renderers/calendar.cjs +137 -0
  102. package/dist/web-page/renderers/calendar.mjs +137 -0
  103. package/dist/web-page/renderers/calendar.mjs.map +1 -0
  104. package/dist/web-page/renderers/canvas.cjs +173 -0
  105. package/dist/web-page/renderers/canvas.mjs +173 -0
  106. package/dist/web-page/renderers/canvas.mjs.map +1 -0
  107. package/dist/web-page/renderers/cdn-loader.cjs +25 -0
  108. package/dist/web-page/renderers/cdn-loader.mjs +25 -0
  109. package/dist/web-page/renderers/cdn-loader.mjs.map +1 -0
  110. package/dist/web-page/renderers/chart.cjs +101 -0
  111. package/dist/web-page/renderers/chart.mjs +101 -0
  112. package/dist/web-page/renderers/chart.mjs.map +1 -0
  113. package/dist/web-page/renderers/deck.cjs +390 -0
  114. package/dist/web-page/renderers/deck.mjs +390 -0
  115. package/dist/web-page/renderers/deck.mjs.map +1 -0
  116. package/dist/web-page/renderers/device.cjs +1015 -0
  117. package/dist/web-page/renderers/device.mjs +1015 -0
  118. package/dist/web-page/renderers/device.mjs.map +1 -0
  119. package/dist/web-page/renderers/editor.cjs +127 -0
  120. package/dist/web-page/renderers/editor.mjs +127 -0
  121. package/dist/web-page/renderers/editor.mjs.map +1 -0
  122. package/dist/web-page/renderers/finance-chart.cjs +178 -0
  123. package/dist/web-page/renderers/finance-chart.mjs +178 -0
  124. package/dist/web-page/renderers/finance-chart.mjs.map +1 -0
  125. package/dist/web-page/renderers/frame.cjs +274 -0
  126. package/dist/web-page/renderers/frame.mjs +274 -0
  127. package/dist/web-page/renderers/frame.mjs.map +1 -0
  128. package/dist/web-page/renderers/globe.cjs +119 -0
  129. package/dist/web-page/renderers/globe.mjs +119 -0
  130. package/dist/web-page/renderers/globe.mjs.map +1 -0
  131. package/dist/web-page/renderers/input.cjs +137 -0
  132. package/dist/web-page/renderers/input.mjs +137 -0
  133. package/dist/web-page/renderers/input.mjs.map +1 -0
  134. package/dist/web-page/renderers/list.cjs +1243 -0
  135. package/dist/web-page/renderers/list.mjs +1243 -0
  136. package/dist/web-page/renderers/list.mjs.map +1 -0
  137. package/dist/web-page/renderers/map.cjs +126 -0
  138. package/dist/web-page/renderers/map.mjs +126 -0
  139. package/dist/web-page/renderers/map.mjs.map +1 -0
  140. package/dist/web-page/renderers/media.cjs +106 -0
  141. package/dist/web-page/renderers/media.mjs +106 -0
  142. package/dist/web-page/renderers/media.mjs.map +1 -0
  143. package/dist/web-page/renderers/moonphase.cjs +105 -0
  144. package/dist/web-page/renderers/moonphase.mjs +105 -0
  145. package/dist/web-page/renderers/moonphase.mjs.map +1 -0
  146. package/dist/web-page/renderers/natal-chart.cjs +222 -0
  147. package/dist/web-page/renderers/natal-chart.mjs +222 -0
  148. package/dist/web-page/renderers/natal-chart.mjs.map +1 -0
  149. package/dist/web-page/renderers/overlay.cjs +531 -0
  150. package/dist/web-page/renderers/overlay.mjs +531 -0
  151. package/dist/web-page/renderers/overlay.mjs.map +1 -0
  152. package/dist/web-page/renderers/table.cjs +74 -0
  153. package/dist/web-page/renderers/table.mjs +74 -0
  154. package/dist/web-page/renderers/table.mjs.map +1 -0
  155. package/dist/web-page/renderers/terminal.cjs +30 -0
  156. package/dist/web-page/renderers/terminal.mjs +30 -0
  157. package/dist/web-page/renderers/terminal.mjs.map +1 -0
  158. package/dist/web-page/renderers/text.cjs +109 -0
  159. package/dist/web-page/renderers/text.mjs +109 -0
  160. package/dist/web-page/renderers/text.mjs.map +1 -0
  161. package/dist/web-page/renderers/ticker.cjs +133 -0
  162. package/dist/web-page/renderers/ticker.mjs +133 -0
  163. package/dist/web-page/renderers/ticker.mjs.map +1 -0
  164. package/dist/web-page/renderers/time.cjs +69 -0
  165. package/dist/web-page/renderers/time.mjs +69 -0
  166. package/dist/web-page/renderers/time.mjs.map +1 -0
  167. package/dist/web-page/renderers/unknown.cjs +20 -0
  168. package/dist/web-page/renderers/unknown.mjs +20 -0
  169. package/dist/web-page/renderers/unknown.mjs.map +1 -0
  170. package/dist/web-page/renderers/view.cjs +161 -0
  171. package/dist/web-page/renderers/view.mjs +161 -0
  172. package/dist/web-page/renderers/view.mjs.map +1 -0
  173. package/dist/web-page/renderers/wm.cjs +669 -0
  174. package/dist/web-page/renderers/wm.mjs +669 -0
  175. package/dist/web-page/renderers/wm.mjs.map +1 -0
  176. package/dist/web-page/skeleton.cjs +103 -0
  177. package/dist/web-page/skeleton.mjs +103 -0
  178. package/dist/web-page/skeleton.mjs.map +1 -0
  179. package/dist/web-page.cjs +114 -0
  180. package/dist/web-page.d.cts +19 -0
  181. package/dist/web-page.d.cts.map +1 -0
  182. package/dist/web-page.d.mts +19 -0
  183. package/dist/web-page.d.mts.map +1 -0
  184. package/dist/web-page.mjs +115 -0
  185. package/dist/web-page.mjs.map +1 -0
  186. package/dist/web.cjs +827 -0
  187. package/dist/web.d.cts +144 -0
  188. package/dist/web.d.cts.map +1 -0
  189. package/dist/web.d.mts +144 -0
  190. package/dist/web.d.mts.map +1 -0
  191. package/dist/web.mjs +828 -0
  192. package/dist/web.mjs.map +1 -0
  193. package/dist/wm-state.cjs +172 -0
  194. package/dist/wm-state.mjs +171 -0
  195. package/dist/wm-state.mjs.map +1 -0
  196. package/package.json +59 -0
@@ -0,0 +1,1466 @@
1
+ //#region src/aup-spec.ts
2
+ /**
3
+ * AUP (Agentic UI Protocol) — Document Spec + Examples.
4
+ *
5
+ * The spec defines the wire format for AUP documents.
6
+ * Examples provide complete, working AUP documents that agents
7
+ * can pattern-match from.
8
+ */
9
+ const AUP_SPEC = {
10
+ version: "0.4",
11
+ title: "Agentic UI Protocol (AUP) — Document Specification",
12
+ description: "AUP is a semantic node graph for structured UI rendering. An agent writes an AUP document (a tree of components) to create any UI. The runtime renders the tree, handles events, and manages live data updates.",
13
+ documentFormat: {
14
+ description: "An AUP document is a JSON object written to a session tree or rendered via aup_render action.",
15
+ fields: {
16
+ id: {
17
+ type: "string",
18
+ required: true,
19
+ description: "Unique node identifier. Must be unique across the entire tree."
20
+ },
21
+ type: {
22
+ type: "string",
23
+ required: true,
24
+ description: "Primitive name from the registry. Read /primitives to see all available types."
25
+ },
26
+ props: {
27
+ type: "object",
28
+ required: false,
29
+ description: "Primitive-specific attributes. Read /primitives/:name for full props schema of each type."
30
+ },
31
+ src: {
32
+ type: "string",
33
+ required: false,
34
+ description: "AFS path for read-only data binding. The client reads this path on mount and subscribes for live updates. Supported by: chart, finance-chart, map, moonphase."
35
+ },
36
+ bind: {
37
+ type: "string",
38
+ required: false,
39
+ description: "AFS path for read-write data binding. Primarily used with input types — value changes are written back to this path."
40
+ },
41
+ state: {
42
+ type: "object",
43
+ required: false,
44
+ description: "UI-local state. Used for: overlay.open (boolean), input value (state.value), text heading level (state.level). State is maintained client-side."
45
+ },
46
+ events: {
47
+ type: "object",
48
+ required: false,
49
+ description: "Event bindings. Each key is an event name (click, change, send, sort, select, confirm, cancel, dismiss). Value is { exec: '/afs/path', args: {} }. When the event fires, the client sends an aup_event message which triggers the AFS exec call server-side."
50
+ },
51
+ children: {
52
+ type: "array",
53
+ required: false,
54
+ description: "Child component nodes. Only containable primitives accept children: view, overlay, chat, terminal, deck, ticker, frame (via iframe), unknown."
55
+ },
56
+ region: {
57
+ type: "string",
58
+ required: false,
59
+ description: "Universal prop — overlay-grid placement region. Values: top-start, top-center, top-end, mid-start, mid-center, mid-end, lower-start, lower-center, lower-end, ticker, bottom-start, bottom-center, bottom-end."
60
+ },
61
+ role: {
62
+ type: "string",
63
+ required: false,
64
+ description: "Universal prop — broadcast semantic role for overlay theme styling. The role declares WHAT the element is; the overlay theme handles HOW it looks. Roles: live-badge, clock, viewer-count, speaker-bar, hashtag, logo, data-widget, alert, featured-comment, score-bug, lower-third, ticker-item."
65
+ }
66
+ }
67
+ },
68
+ spatialIntent: {
69
+ description: "Fine-grained layout control for view containers. Pass an object as the layout prop instead of a string.",
70
+ fields: {
71
+ direction: {
72
+ type: "string",
73
+ enum: [
74
+ "row",
75
+ "column",
76
+ "grid",
77
+ "stack",
78
+ "overlay-grid"
79
+ ],
80
+ description: "row = horizontal flex, column = vertical flex (default), grid = auto-fill responsive grid, stack = all children layered on top of each other, overlay-grid = 15-region broadcast band system (TV industry standard) with pointer-events passthrough."
81
+ },
82
+ align: {
83
+ type: "string",
84
+ enum: [
85
+ "start",
86
+ "center",
87
+ "end",
88
+ "stretch"
89
+ ],
90
+ description: "Main axis alignment"
91
+ },
92
+ crossAlign: {
93
+ type: "string",
94
+ enum: [
95
+ "start",
96
+ "center",
97
+ "end",
98
+ "stretch"
99
+ ],
100
+ description: "Cross axis alignment"
101
+ },
102
+ gap: {
103
+ type: "number | string",
104
+ description: "Gap between children in px or CSS value"
105
+ },
106
+ wrap: {
107
+ type: "boolean",
108
+ description: "Allow flex wrapping"
109
+ },
110
+ overflow: {
111
+ type: "string",
112
+ enum: [
113
+ "visible",
114
+ "hidden",
115
+ "scroll",
116
+ "auto"
117
+ ]
118
+ }
119
+ },
120
+ example: { layout: {
121
+ direction: "row",
122
+ align: "center",
123
+ crossAlign: "center",
124
+ gap: 16,
125
+ wrap: true
126
+ } }
127
+ },
128
+ sizing: {
129
+ description: "Sizing constraints via the view.props.size object.",
130
+ fields: {
131
+ width: {
132
+ type: "string",
133
+ description: "CSS width (e.g. \"100%\", \"400px\")"
134
+ },
135
+ maxWidth: {
136
+ type: "string",
137
+ description: "CSS max-width (e.g. \"800px\")"
138
+ },
139
+ height: {
140
+ type: "string",
141
+ description: "CSS height"
142
+ },
143
+ flex: {
144
+ type: "string",
145
+ description: "CSS flex shorthand (e.g. \"1\", \"0 0 auto\")"
146
+ }
147
+ }
148
+ },
149
+ themeTokens: {
150
+ description: "Themes provide color tokens. Set the theme in the aup_render action (style param) or page meta. Read /themes/:name for available tokens.",
151
+ availableTokens: [
152
+ "bg",
153
+ "surface",
154
+ "border",
155
+ "text",
156
+ "accent",
157
+ "muted"
158
+ ]
159
+ },
160
+ overlayThemes: {
161
+ description: "Overlay themes are broadcast 'graphics packages' for overlay-grid layouts. Like TV graphics (CNN vs ESPN vs Apple Keynote), they control the visual identity of overlay elements. Agents declare semantic roles (WHAT), themes handle styling (HOW). Set theme prop on a view with layout: 'overlay-grid' to activate.",
162
+ presets: {
163
+ minimal: "Default — subtle glass effects, system fonts. Works with any content underneath.",
164
+ cnn: "CNN Breaking News — red-dominant, bold condensed type (Barlow Condensed), sharp corners, high-contrast badges. Loads font on demand.",
165
+ apple: "Apple Keynote — frosted glass, large radii, Inter font, premium feel, generous padding. Loads font on demand."
166
+ },
167
+ roles: [
168
+ "live-badge — LIVE indicator, recording status",
169
+ "clock — time display with tabular-nums",
170
+ "viewer-count — audience/viewer counter",
171
+ "speaker-bar — name + title card for current speaker",
172
+ "hashtag — event hashtag or topic tag",
173
+ "logo — brand logo placement",
174
+ "data-widget — live data card (stats, weather, stocks)",
175
+ "alert — breaking/urgent notification",
176
+ "featured-comment — highlighted audience comment",
177
+ "score-bug — sports score compact display",
178
+ "lower-third — TV-standard name/title bar",
179
+ "ticker-item — individual ticker content item"
180
+ ],
181
+ customTheme: "Pass an object instead of a string for custom themes: { badgeBg: \"#ff6b00\", cardRadius: \"0\", fonts: [\"CustomFont:wght@400;700\"] }. camelCase keys are mapped to --overlay-* CSS variables.",
182
+ example: {
183
+ id: "themed-overlay",
184
+ type: "view",
185
+ props: {
186
+ layout: "overlay-grid",
187
+ theme: "cnn"
188
+ },
189
+ children: [{
190
+ id: "live",
191
+ type: "text",
192
+ props: {
193
+ region: "top-start",
194
+ role: "live-badge",
195
+ content: "● LIVE"
196
+ }
197
+ }, {
198
+ id: "speaker",
199
+ type: "view",
200
+ props: {
201
+ region: "lower-start",
202
+ role: "speaker-bar",
203
+ layout: "column"
204
+ },
205
+ children: [{
206
+ id: "sp-name",
207
+ type: "text",
208
+ props: { content: "Jane Doe" }
209
+ }, {
210
+ id: "sp-title",
211
+ type: "text",
212
+ props: {
213
+ content: "CEO, Acme Corp",
214
+ scale: "xs"
215
+ }
216
+ }]
217
+ }]
218
+ }
219
+ },
220
+ eventModel: {
221
+ description: "Events flow: user interacts → client sends aup_event → server resolves node events config → calls AFS exec on the specified path. The agent can respond by sending aup_patch ops to update the UI.",
222
+ eventPayload: {
223
+ type: "aup_event",
224
+ nodeId: "string — the node that fired the event",
225
+ event: "string — event name (click, change, send, etc.)",
226
+ data: "object — optional event-specific payload"
227
+ },
228
+ supportedEvents: {
229
+ click: "Fired by action buttons",
230
+ change: "Fired by input fields; data: { value }",
231
+ send: "Fired by chat input",
232
+ sort: "Fired by table header click",
233
+ select: "Fired by table row click; overlay choice submit",
234
+ confirm: "Fired by overlay confirm button",
235
+ cancel: "Fired by overlay cancel button",
236
+ dismiss: "Fired by overlay toast dismiss",
237
+ complete: "Fired by deck when reaching the last slide without loop",
238
+ load: "Fired by frame when iframe finishes loading",
239
+ error: "Fired by frame when iframe fails to load",
240
+ message: "Fired by frame when bridge receives postMessage from iframe"
241
+ }
242
+ },
243
+ workflow: {
244
+ description: "How an agent creates and manages UI",
245
+ steps: [
246
+ "1. Read /primitives to discover available components",
247
+ "2. Read /primitives/:name for detailed props and examples",
248
+ "3. Read /themes to choose a visual theme",
249
+ "4. Read /examples for complete working documents",
250
+ "5. Build an AUP node tree (JSON) with unique IDs",
251
+ "6. Call aup_render action with { root, fullPage: true, style: 'midnight', chrome: true } — chrome shows lang/theme/mode toolbar",
252
+ "7. Handle events: when user interacts, event triggers your AFS exec path",
253
+ "8. Update UI: send aup_patch ops (create/update/remove/reorder nodes)"
254
+ ]
255
+ },
256
+ frameWorkflow: {
257
+ description: "How to use the frame primitive for full-page isolation. AUP is the OS, pages are applications running inside it. Use frame when you need a complete HTML page (complex JS, third-party libraries, Canvas/WebGL, or any content that needs its own document context). For standard UI, prefer native AUP primitives — they're faster and more integrated.",
258
+ when: [
259
+ "Page needs its own JavaScript runtime (games, visualizations, third-party widgets)",
260
+ "Content includes <script> tags or complex CSS that would conflict with the surface",
261
+ "You want crash isolation — if the page breaks, the surface survives",
262
+ "Embedding external URLs (documentation sites, dashboards, tools)"
263
+ ],
264
+ steps: [
265
+ "1. Write a complete HTML page to AFS: write('/ui/web/pages/mypage', { content: '<html>...</html>', format: 'html' })",
266
+ "2. Reference it in the AUP tree: { type: 'frame', props: { src: '/pages/mypage', bridge: true } }",
267
+ "3. The surface resolves /pages/mypage → HTTP URL /p/mypage?sid=...&st=...&bridge=1",
268
+ "4. The iframe loads the page in a sandbox with the bridge script injected"
269
+ ],
270
+ bridgeAPI: {
271
+ description: "When bridge: true, the page gets window.aup — a lightweight postMessage API for communicating with the parent surface. The bridge script is ~2KB, auto-injected.",
272
+ methods: {
273
+ "aup.toast(message, intent)": "Show a toast notification on the surface. intent: 'info' | 'success' | 'warning' | 'error'",
274
+ "aup.navigate(path)": "Navigate the iframe to another page. path: '/pages/other-page'",
275
+ "aup.fetch(path)": "Read AFS data from the surface. Returns a Promise with the result. Example: const users = await aup.fetch('/data/users')",
276
+ "aup.emit(event, data)": "Send a custom event to the surface (routed as aup_event via WebSocket)",
277
+ "aup.on(event, callback)": "Listen for messages sent from the surface to the iframe"
278
+ }
279
+ },
280
+ example: {
281
+ description: "Agent writes a chart page, then embeds it in a dashboard layout",
282
+ step1_writePage: "write('/ui/web/pages/sales-chart', { content: '<html><head>...</head><body><canvas id=\"chart\"></canvas><script>/* Chart.js code */<\/script></body></html>' })",
283
+ step2_renderTree: {
284
+ id: "app",
285
+ type: "view",
286
+ props: {
287
+ layout: {
288
+ direction: "row",
289
+ gap: 0
290
+ },
291
+ size: { height: "100vh" }
292
+ },
293
+ children: [{
294
+ id: "sidebar",
295
+ type: "view",
296
+ props: {
297
+ layout: "column",
298
+ size: { width: "240px" },
299
+ variant: "card"
300
+ },
301
+ children: [{
302
+ id: "nav",
303
+ type: "text",
304
+ props: {
305
+ content: "Navigation",
306
+ level: 3
307
+ }
308
+ }]
309
+ }, {
310
+ id: "main",
311
+ type: "frame",
312
+ props: {
313
+ src: "/pages/sales-chart",
314
+ bridge: true,
315
+ size: { height: "100%" }
316
+ }
317
+ }]
318
+ }
319
+ }
320
+ }
321
+ };
322
+ const AUP_EXAMPLES = {
323
+ "login-form": {
324
+ name: "login-form",
325
+ title: "Login Form",
326
+ description: "Simple login form with email/password inputs, validation, and submit action. Demonstrates: input types, events.click, state.value, view layout.",
327
+ concepts: [
328
+ "input",
329
+ "action",
330
+ "events",
331
+ "state",
332
+ "view layout"
333
+ ],
334
+ document: {
335
+ id: "login-root",
336
+ type: "view",
337
+ props: {
338
+ layout: {
339
+ direction: "column",
340
+ align: "center",
341
+ crossAlign: "center",
342
+ gap: 24
343
+ },
344
+ size: { maxWidth: "400px" }
345
+ },
346
+ children: [
347
+ {
348
+ id: "login-title",
349
+ type: "text",
350
+ props: {
351
+ content: "Sign In",
352
+ level: 2
353
+ }
354
+ },
355
+ {
356
+ id: "email-field",
357
+ type: "input",
358
+ props: {
359
+ type: "text",
360
+ label: "Email",
361
+ placeholder: "you@example.com"
362
+ },
363
+ state: { value: "" },
364
+ events: { change: { exec: "/auth/.actions/validate-email" } }
365
+ },
366
+ {
367
+ id: "password-field",
368
+ type: "input",
369
+ props: {
370
+ type: "password",
371
+ label: "Password",
372
+ placeholder: "Enter password"
373
+ },
374
+ state: { value: "" }
375
+ },
376
+ {
377
+ id: "remember-toggle",
378
+ type: "input",
379
+ props: {
380
+ type: "toggle",
381
+ label: "Remember me"
382
+ },
383
+ state: { value: false }
384
+ },
385
+ {
386
+ id: "submit-btn",
387
+ type: "action",
388
+ props: {
389
+ label: "Sign In",
390
+ variant: "primary",
391
+ icon: "lock"
392
+ },
393
+ events: { click: { exec: "/auth/.actions/login" } }
394
+ },
395
+ {
396
+ id: "forgot-link",
397
+ type: "action",
398
+ props: {
399
+ label: "Forgot password?",
400
+ variant: "ghost"
401
+ },
402
+ events: { click: { exec: "/auth/.actions/forgot-password" } }
403
+ }
404
+ ]
405
+ }
406
+ },
407
+ dashboard: {
408
+ name: "dashboard",
409
+ title: "Analytics Dashboard",
410
+ description: "Grid layout with stat cards, bar chart, and data table. Demonstrates: grid layout, nested views, chart with data, table with columns/rows, node.src for live data.",
411
+ concepts: [
412
+ "grid layout",
413
+ "nested views",
414
+ "chart",
415
+ "table",
416
+ "node.src"
417
+ ],
418
+ document: {
419
+ id: "dash-root",
420
+ type: "view",
421
+ props: {
422
+ layout: "column",
423
+ size: { maxWidth: "1200px" }
424
+ },
425
+ children: [
426
+ {
427
+ id: "dash-header",
428
+ type: "text",
429
+ props: {
430
+ content: "Dashboard",
431
+ level: 1
432
+ }
433
+ },
434
+ {
435
+ id: "stats-row",
436
+ type: "view",
437
+ props: { layout: "grid" },
438
+ children: [
439
+ {
440
+ id: "stat-users",
441
+ type: "view",
442
+ props: {
443
+ layout: "column",
444
+ variant: "card"
445
+ },
446
+ children: [{
447
+ id: "stat-users-label",
448
+ type: "text",
449
+ props: {
450
+ content: "Total Users",
451
+ scale: "sm",
452
+ intent: "info"
453
+ }
454
+ }, {
455
+ id: "stat-users-value",
456
+ type: "text",
457
+ props: {
458
+ content: "12,847",
459
+ level: 2
460
+ }
461
+ }]
462
+ },
463
+ {
464
+ id: "stat-revenue",
465
+ type: "view",
466
+ props: {
467
+ layout: "column",
468
+ variant: "card"
469
+ },
470
+ children: [{
471
+ id: "stat-rev-label",
472
+ type: "text",
473
+ props: {
474
+ content: "Revenue",
475
+ scale: "sm",
476
+ intent: "success"
477
+ }
478
+ }, {
479
+ id: "stat-rev-value",
480
+ type: "text",
481
+ props: {
482
+ content: "$48,291",
483
+ level: 2
484
+ }
485
+ }]
486
+ },
487
+ {
488
+ id: "stat-orders",
489
+ type: "view",
490
+ props: {
491
+ layout: "column",
492
+ variant: "card"
493
+ },
494
+ children: [{
495
+ id: "stat-ord-label",
496
+ type: "text",
497
+ props: {
498
+ content: "Orders",
499
+ scale: "sm",
500
+ intent: "warning"
501
+ }
502
+ }, {
503
+ id: "stat-ord-value",
504
+ type: "text",
505
+ props: {
506
+ content: "1,024",
507
+ level: 2
508
+ }
509
+ }]
510
+ }
511
+ ]
512
+ },
513
+ {
514
+ id: "chart-section",
515
+ type: "chart",
516
+ props: {
517
+ variant: "bar",
518
+ height: "300px",
519
+ data: {
520
+ labels: [
521
+ "Mon",
522
+ "Tue",
523
+ "Wed",
524
+ "Thu",
525
+ "Fri",
526
+ "Sat",
527
+ "Sun"
528
+ ],
529
+ datasets: [{
530
+ label: "Orders",
531
+ data: [
532
+ 65,
533
+ 59,
534
+ 80,
535
+ 81,
536
+ 56,
537
+ 55,
538
+ 72
539
+ ],
540
+ backgroundColor: "#60a5fa"
541
+ }]
542
+ }
543
+ }
544
+ },
545
+ {
546
+ id: "recent-orders",
547
+ type: "table",
548
+ props: {
549
+ columns: [
550
+ {
551
+ key: "id",
552
+ label: "Order ID"
553
+ },
554
+ {
555
+ key: "customer",
556
+ label: "Customer"
557
+ },
558
+ {
559
+ key: "amount",
560
+ label: "Amount",
561
+ align: "right"
562
+ },
563
+ {
564
+ key: "status",
565
+ label: "Status"
566
+ }
567
+ ],
568
+ rows: [
569
+ {
570
+ id: "#1001",
571
+ customer: "Alice Chen",
572
+ amount: "$299",
573
+ status: "Shipped"
574
+ },
575
+ {
576
+ id: "#1002",
577
+ customer: "Bob Smith",
578
+ amount: "$149",
579
+ status: "Processing"
580
+ },
581
+ {
582
+ id: "#1003",
583
+ customer: "Carol Wu",
584
+ amount: "$499",
585
+ status: "Delivered"
586
+ }
587
+ ]
588
+ },
589
+ events: { select: { exec: "/orders/.actions/view" } }
590
+ }
591
+ ]
592
+ }
593
+ },
594
+ "settings-page": {
595
+ name: "settings-page",
596
+ title: "Settings Page",
597
+ description: "Column layout with grouped sections, multiple input types, and a confirm overlay. Demonstrates: sections with headings, select/toggle/slider inputs, overlay confirm dialog, state.open.",
598
+ concepts: [
599
+ "sections",
600
+ "select",
601
+ "toggle",
602
+ "slider",
603
+ "overlay confirm",
604
+ "state.open"
605
+ ],
606
+ document: {
607
+ id: "settings-root",
608
+ type: "view",
609
+ props: {
610
+ layout: "column",
611
+ size: { maxWidth: "600px" }
612
+ },
613
+ children: [
614
+ {
615
+ id: "settings-title",
616
+ type: "text",
617
+ props: {
618
+ content: "Settings",
619
+ level: 1
620
+ }
621
+ },
622
+ {
623
+ id: "profile-section",
624
+ type: "view",
625
+ props: {
626
+ layout: "column",
627
+ variant: "card"
628
+ },
629
+ children: [
630
+ {
631
+ id: "profile-heading",
632
+ type: "text",
633
+ props: {
634
+ content: "Profile",
635
+ level: 3
636
+ }
637
+ },
638
+ {
639
+ id: "name-input",
640
+ type: "input",
641
+ props: {
642
+ type: "text",
643
+ label: "Display Name",
644
+ placeholder: "Your name"
645
+ },
646
+ state: { value: "Alice" }
647
+ },
648
+ {
649
+ id: "language-select",
650
+ type: "input",
651
+ props: {
652
+ type: "select",
653
+ label: "Language",
654
+ options: [
655
+ {
656
+ label: "English",
657
+ value: "en"
658
+ },
659
+ {
660
+ label: "Chinese",
661
+ value: "zh"
662
+ },
663
+ {
664
+ label: "Japanese",
665
+ value: "ja"
666
+ }
667
+ ]
668
+ },
669
+ state: { value: "en" }
670
+ }
671
+ ]
672
+ },
673
+ {
674
+ id: "prefs-section",
675
+ type: "view",
676
+ props: {
677
+ layout: "column",
678
+ variant: "card"
679
+ },
680
+ children: [
681
+ {
682
+ id: "prefs-heading",
683
+ type: "text",
684
+ props: {
685
+ content: "Preferences",
686
+ level: 3
687
+ }
688
+ },
689
+ {
690
+ id: "dark-mode",
691
+ type: "input",
692
+ props: {
693
+ type: "toggle",
694
+ label: "Dark Mode"
695
+ },
696
+ state: { value: true }
697
+ },
698
+ {
699
+ id: "notifications",
700
+ type: "input",
701
+ props: {
702
+ type: "toggle",
703
+ label: "Email Notifications"
704
+ },
705
+ state: { value: false }
706
+ },
707
+ {
708
+ id: "font-size",
709
+ type: "input",
710
+ props: {
711
+ type: "slider",
712
+ label: "Font Size",
713
+ min: 12,
714
+ max: 24,
715
+ step: 1
716
+ },
717
+ state: { value: 16 }
718
+ }
719
+ ]
720
+ },
721
+ {
722
+ id: "actions-row",
723
+ type: "view",
724
+ props: { layout: "row" },
725
+ children: [{
726
+ id: "save-btn",
727
+ type: "action",
728
+ props: {
729
+ label: "Save Changes",
730
+ variant: "primary"
731
+ },
732
+ events: { click: { exec: "/settings/.actions/save" } }
733
+ }, {
734
+ id: "delete-btn",
735
+ type: "action",
736
+ props: {
737
+ label: "Delete Account",
738
+ variant: "destructive"
739
+ },
740
+ events: { click: { exec: "/ui/.actions/show-delete-confirm" } }
741
+ }]
742
+ },
743
+ {
744
+ id: "delete-confirm",
745
+ type: "overlay",
746
+ props: {
747
+ mode: "confirm",
748
+ title: "Delete Account?",
749
+ message: "All data will be permanently deleted. This cannot be undone.",
750
+ intent: "error",
751
+ confirmLabel: "Delete Forever"
752
+ },
753
+ state: { open: false },
754
+ events: { confirm: { exec: "/account/.actions/delete" } }
755
+ }
756
+ ]
757
+ }
758
+ },
759
+ "file-manager": {
760
+ name: "file-manager",
761
+ title: "File Manager",
762
+ description: "Explorer sidebar + code editor main area. Demonstrates: row layout with fixed sidebar, editor with change event, subsystem primitives.",
763
+ concepts: [
764
+ "row layout",
765
+ "editor",
766
+ "explorer",
767
+ "subsystem primitives"
768
+ ],
769
+ document: {
770
+ id: "fm-root",
771
+ type: "view",
772
+ props: {
773
+ layout: {
774
+ direction: "row",
775
+ gap: 0
776
+ },
777
+ size: {
778
+ width: "100%",
779
+ height: "100vh"
780
+ }
781
+ },
782
+ children: [{
783
+ id: "sidebar",
784
+ type: "view",
785
+ props: {
786
+ layout: "column",
787
+ size: {
788
+ width: "280px",
789
+ height: "100%"
790
+ },
791
+ variant: "card"
792
+ },
793
+ children: [{
794
+ id: "fm-title",
795
+ type: "text",
796
+ props: {
797
+ content: "Files",
798
+ level: 3
799
+ }
800
+ }, {
801
+ id: "file-tree",
802
+ type: "frame",
803
+ props: {
804
+ url: "/files/browse",
805
+ height: "calc(100% - 60px)"
806
+ }
807
+ }]
808
+ }, {
809
+ id: "editor-area",
810
+ type: "view",
811
+ props: {
812
+ layout: "column",
813
+ size: { flex: "1" }
814
+ },
815
+ children: [{
816
+ id: "file-tabs",
817
+ type: "view",
818
+ props: { layout: "row" },
819
+ children: [{
820
+ id: "tab-main",
821
+ type: "action",
822
+ props: {
823
+ label: "main.ts",
824
+ variant: "ghost",
825
+ icon: "edit"
826
+ }
827
+ }]
828
+ }, {
829
+ id: "code-editor",
830
+ type: "editor",
831
+ props: {
832
+ language: "typescript",
833
+ content: "export function hello() {\n return \"world\";\n}",
834
+ lineNumbers: true
835
+ },
836
+ events: { change: {
837
+ exec: "/files/.actions/auto-save",
838
+ args: { path: "/src/main.ts" }
839
+ } }
840
+ }]
841
+ }]
842
+ }
843
+ },
844
+ "data-visualization": {
845
+ name: "data-visualization",
846
+ title: "Data Explorer",
847
+ description: "Filter controls + chart + table showing the same dataset. Demonstrates: row/column hybrid layout, multiple input types for filtering, chart with live data (node.src), table with sort/select events.",
848
+ concepts: [
849
+ "filter inputs",
850
+ "chart with node.src",
851
+ "table events",
852
+ "hybrid layout"
853
+ ],
854
+ document: {
855
+ id: "viz-root",
856
+ type: "view",
857
+ props: {
858
+ layout: "column",
859
+ size: { maxWidth: "1000px" }
860
+ },
861
+ children: [
862
+ {
863
+ id: "viz-header",
864
+ type: "view",
865
+ props: { layout: "row" },
866
+ children: [{
867
+ id: "viz-title",
868
+ type: "text",
869
+ props: {
870
+ content: "Sales Analytics",
871
+ level: 1
872
+ }
873
+ }, {
874
+ id: "export-btn",
875
+ type: "action",
876
+ props: {
877
+ label: "Export CSV",
878
+ variant: "secondary",
879
+ icon: "download"
880
+ },
881
+ events: { click: {
882
+ exec: "/reports/.actions/export",
883
+ args: { format: "csv" }
884
+ } }
885
+ }]
886
+ },
887
+ {
888
+ id: "filters",
889
+ type: "view",
890
+ props: { layout: {
891
+ direction: "row",
892
+ gap: 12,
893
+ wrap: true
894
+ } },
895
+ children: [
896
+ {
897
+ id: "date-from",
898
+ type: "input",
899
+ props: {
900
+ type: "date",
901
+ label: "From"
902
+ },
903
+ state: { value: "2024-01-01" },
904
+ events: { change: { exec: "/reports/.actions/filter" } }
905
+ },
906
+ {
907
+ id: "date-to",
908
+ type: "input",
909
+ props: {
910
+ type: "date",
911
+ label: "To"
912
+ },
913
+ state: { value: "2024-03-31" },
914
+ events: { change: { exec: "/reports/.actions/filter" } }
915
+ },
916
+ {
917
+ id: "region-select",
918
+ type: "input",
919
+ props: {
920
+ type: "select",
921
+ label: "Region",
922
+ options: [
923
+ "All",
924
+ "North America",
925
+ "Europe",
926
+ "Asia"
927
+ ]
928
+ },
929
+ state: { value: "All" },
930
+ events: { change: { exec: "/reports/.actions/filter" } }
931
+ }
932
+ ]
933
+ },
934
+ {
935
+ id: "sales-chart",
936
+ type: "chart",
937
+ props: {
938
+ variant: "line",
939
+ height: "300px"
940
+ },
941
+ src: "/data/sales-by-month"
942
+ },
943
+ {
944
+ id: "sales-table",
945
+ type: "table",
946
+ props: {
947
+ columns: [
948
+ {
949
+ key: "month",
950
+ label: "Month"
951
+ },
952
+ {
953
+ key: "region",
954
+ label: "Region"
955
+ },
956
+ {
957
+ key: "units",
958
+ label: "Units Sold",
959
+ align: "right"
960
+ },
961
+ {
962
+ key: "revenue",
963
+ label: "Revenue",
964
+ align: "right"
965
+ }
966
+ ],
967
+ rows: [
968
+ {
969
+ month: "Jan 2024",
970
+ region: "North America",
971
+ units: "1,240",
972
+ revenue: "$62,000"
973
+ },
974
+ {
975
+ month: "Jan 2024",
976
+ region: "Europe",
977
+ units: "890",
978
+ revenue: "$44,500"
979
+ },
980
+ {
981
+ month: "Feb 2024",
982
+ region: "North America",
983
+ units: "1,380",
984
+ revenue: "$69,000"
985
+ },
986
+ {
987
+ month: "Feb 2024",
988
+ region: "Europe",
989
+ units: "1,020",
990
+ revenue: "$51,000"
991
+ }
992
+ ]
993
+ },
994
+ events: {
995
+ sort: { exec: "/reports/.actions/sort" },
996
+ select: { exec: "/reports/.actions/drill-down" }
997
+ }
998
+ }
999
+ ]
1000
+ }
1001
+ },
1002
+ "presentation-deck": {
1003
+ name: "presentation-deck",
1004
+ title: "Presentation Deck",
1005
+ description: "Slide deck with design tokens, preset theme, entrance animations, and count-up. Demonstrates: deck with Shadow DOM isolation, designPreset, design token overrides, slide transitions, animate, count-up.",
1006
+ concepts: [
1007
+ "deck",
1008
+ "designPreset",
1009
+ "design tokens",
1010
+ "Shadow DOM",
1011
+ "animate",
1012
+ "count-up",
1013
+ "slide transitions"
1014
+ ],
1015
+ document: {
1016
+ id: "pitch-deck",
1017
+ type: "deck",
1018
+ props: {
1019
+ transition: "slide",
1020
+ designPreset: "tech-dark",
1021
+ design: {
1022
+ colors: {
1023
+ accent: "#e6b450",
1024
+ accentGlow: "rgba(230,180,80,0.4)"
1025
+ },
1026
+ effects: {
1027
+ headingStyle: "gradient-text",
1028
+ cardStyle: "glass",
1029
+ slideBackground: "grid"
1030
+ }
1031
+ }
1032
+ },
1033
+ state: { current: 0 },
1034
+ children: [{
1035
+ id: "slide-title",
1036
+ type: "view",
1037
+ props: { layout: {
1038
+ direction: "column",
1039
+ align: "center",
1040
+ crossAlign: "center",
1041
+ gap: 24
1042
+ } },
1043
+ children: [{
1044
+ id: "title-heading",
1045
+ type: "text",
1046
+ props: {
1047
+ content: "Product Launch 2026",
1048
+ level: 1,
1049
+ animate: "fade-in"
1050
+ }
1051
+ }, {
1052
+ id: "title-sub",
1053
+ type: "text",
1054
+ props: {
1055
+ content: "Building the future of agentic computing",
1056
+ scale: "lg",
1057
+ animate: "slide-up",
1058
+ animateDelay: 200
1059
+ }
1060
+ }]
1061
+ }, {
1062
+ id: "slide-metrics",
1063
+ type: "view",
1064
+ props: { layout: {
1065
+ direction: "column",
1066
+ align: "center",
1067
+ gap: 32
1068
+ } },
1069
+ children: [{
1070
+ id: "metrics-heading",
1071
+ type: "text",
1072
+ props: {
1073
+ content: "Key Metrics",
1074
+ level: 2,
1075
+ animate: "fade-in"
1076
+ }
1077
+ }, {
1078
+ id: "metrics-row",
1079
+ type: "view",
1080
+ props: { layout: "grid" },
1081
+ children: [{
1082
+ id: "metric-users",
1083
+ type: "view",
1084
+ props: {
1085
+ layout: "column",
1086
+ variant: "card"
1087
+ },
1088
+ children: [{
1089
+ id: "m-users-num",
1090
+ type: "text",
1091
+ props: {
1092
+ content: "1,234,567",
1093
+ level: 2,
1094
+ animate: "count-up"
1095
+ }
1096
+ }, {
1097
+ id: "m-users-label",
1098
+ type: "text",
1099
+ props: {
1100
+ content: "Active Users",
1101
+ scale: "sm"
1102
+ }
1103
+ }]
1104
+ }, {
1105
+ id: "metric-revenue",
1106
+ type: "view",
1107
+ props: {
1108
+ layout: "column",
1109
+ variant: "card"
1110
+ },
1111
+ children: [{
1112
+ id: "m-rev-num",
1113
+ type: "text",
1114
+ props: {
1115
+ content: "$48,291,000",
1116
+ level: 2,
1117
+ animate: "count-up"
1118
+ }
1119
+ }, {
1120
+ id: "m-rev-label",
1121
+ type: "text",
1122
+ props: {
1123
+ content: "Annual Revenue",
1124
+ scale: "sm"
1125
+ }
1126
+ }]
1127
+ }]
1128
+ }]
1129
+ }],
1130
+ events: {
1131
+ change: {
1132
+ exec: "/analytics/.actions/track",
1133
+ args: { event: "slide-change" }
1134
+ },
1135
+ complete: {
1136
+ exec: "/analytics/.actions/track",
1137
+ args: { event: "deck-complete" }
1138
+ }
1139
+ }
1140
+ }
1141
+ },
1142
+ "dashboard-with-iframe": {
1143
+ name: "dashboard-with-iframe",
1144
+ title: "Dashboard with Embedded Page",
1145
+ description: "SPA-style layout with a native AUP sidebar and a full-page iframe main content area. Demonstrates: frame primitive, bridge communication, row layout with sidebar + frame.",
1146
+ concepts: [
1147
+ "frame",
1148
+ "bridge",
1149
+ "postMessage",
1150
+ "page isolation",
1151
+ "SPA layout"
1152
+ ],
1153
+ document: {
1154
+ id: "spa-root",
1155
+ type: "view",
1156
+ props: {
1157
+ layout: {
1158
+ direction: "row",
1159
+ gap: 0
1160
+ },
1161
+ size: {
1162
+ width: "100%",
1163
+ height: "100vh"
1164
+ }
1165
+ },
1166
+ children: [{
1167
+ id: "sidebar",
1168
+ type: "view",
1169
+ props: {
1170
+ layout: "column",
1171
+ size: {
1172
+ width: "240px",
1173
+ height: "100%"
1174
+ },
1175
+ variant: "card"
1176
+ },
1177
+ children: [
1178
+ {
1179
+ id: "nav-title",
1180
+ type: "text",
1181
+ props: {
1182
+ content: "My App",
1183
+ level: 3
1184
+ }
1185
+ },
1186
+ {
1187
+ id: "nav-home",
1188
+ type: "action",
1189
+ props: {
1190
+ label: "Home",
1191
+ variant: "ghost",
1192
+ icon: "home"
1193
+ },
1194
+ events: { click: {
1195
+ exec: "/nav/.actions/goto",
1196
+ args: { page: "home" }
1197
+ } }
1198
+ },
1199
+ {
1200
+ id: "nav-dashboard",
1201
+ type: "action",
1202
+ props: {
1203
+ label: "Dashboard",
1204
+ variant: "ghost",
1205
+ icon: "chart"
1206
+ },
1207
+ events: { click: {
1208
+ exec: "/nav/.actions/goto",
1209
+ args: { page: "dashboard" }
1210
+ } }
1211
+ },
1212
+ {
1213
+ id: "nav-settings",
1214
+ type: "action",
1215
+ props: {
1216
+ label: "Settings",
1217
+ variant: "ghost",
1218
+ icon: "gear"
1219
+ },
1220
+ events: { click: {
1221
+ exec: "/nav/.actions/goto",
1222
+ args: { page: "settings" }
1223
+ } }
1224
+ }
1225
+ ]
1226
+ }, {
1227
+ id: "main-frame",
1228
+ type: "frame",
1229
+ props: {
1230
+ src: "/pages/dashboard",
1231
+ bridge: true,
1232
+ size: { height: "100%" }
1233
+ },
1234
+ events: { load: {
1235
+ exec: "/analytics/.actions/track",
1236
+ args: { event: "page-loaded" }
1237
+ } }
1238
+ }]
1239
+ }
1240
+ },
1241
+ "broadcast-news": {
1242
+ name: "broadcast-news",
1243
+ title: "Broadcast News Overlay",
1244
+ description: "CNN-style breaking news overlay using the broadcast primitive. Compared to the manual overlay-grid approach (live-overlay example), this achieves the same visual result with ~70% fewer props. Agents specify semantic roles and content; the renderer handles type mapping, region placement, and theme application.",
1245
+ concepts: [
1246
+ "broadcast",
1247
+ "roles",
1248
+ "theme",
1249
+ "ticker",
1250
+ "overlay shorthand"
1251
+ ],
1252
+ document: {
1253
+ id: "broadcast-root",
1254
+ type: "broadcast",
1255
+ props: { theme: "cnn" },
1256
+ children: [
1257
+ {
1258
+ role: "live-badge",
1259
+ text: "● LIVE"
1260
+ },
1261
+ {
1262
+ role: "clock",
1263
+ text: "2:36 PM ET"
1264
+ },
1265
+ {
1266
+ role: "alert",
1267
+ text: "BREAKING NEWS"
1268
+ },
1269
+ {
1270
+ role: "headline",
1271
+ text: "MAJOR POLICY ANNOUNCEMENT EXPECTED FROM WHITE HOUSE TODAY"
1272
+ },
1273
+ {
1274
+ role: "speaker-bar",
1275
+ lines: ["JOHN DOE", "Senior Policy Advisor"]
1276
+ },
1277
+ {
1278
+ role: "ticker",
1279
+ items: [
1280
+ "Stock markets surge as Fed signals rate pause",
1281
+ "Oil prices drop 3% on surprise inventory build",
1282
+ "European markets close mixed amid uncertainty"
1283
+ ],
1284
+ intent: "breaking"
1285
+ }
1286
+ ]
1287
+ }
1288
+ },
1289
+ "live-overlay": {
1290
+ name: "live-overlay",
1291
+ title: "Live Broadcast Overlay",
1292
+ description: "Deck presentation with stack + overlay-grid for live broadcast HUD. Stack layers the deck (layer 0) and overlay (layer 1). Overlay-grid places children in 15 broadcast regions (top-start, top-center, top-end, mid-*, lower-*, ticker, bottom-*). Deck uses isolation:isolate so its transitions don't break the overlay stacking.",
1293
+ concepts: [
1294
+ "stack layout",
1295
+ "overlay-grid",
1296
+ "region",
1297
+ "deck",
1298
+ "live broadcast",
1299
+ "isolation"
1300
+ ],
1301
+ document: {
1302
+ id: "live-root",
1303
+ type: "view",
1304
+ props: {
1305
+ layout: "stack",
1306
+ size: {
1307
+ width: "full",
1308
+ height: "100vh"
1309
+ }
1310
+ },
1311
+ children: [{
1312
+ id: "slides",
1313
+ type: "deck",
1314
+ props: {
1315
+ presentation: true,
1316
+ keyboard: true,
1317
+ transition: "fade"
1318
+ },
1319
+ children: [{
1320
+ id: "slide-1",
1321
+ type: "frame",
1322
+ props: { src: "/pages/slide-intro" }
1323
+ }, {
1324
+ id: "slide-2",
1325
+ type: "frame",
1326
+ props: { src: "/pages/slide-demo" }
1327
+ }]
1328
+ }, {
1329
+ id: "overlay-layer",
1330
+ type: "view",
1331
+ props: {
1332
+ layout: "overlay-grid",
1333
+ theme: "cnn"
1334
+ },
1335
+ children: [
1336
+ {
1337
+ id: "live-badge",
1338
+ type: "text",
1339
+ props: {
1340
+ region: "top-start",
1341
+ role: "live-badge",
1342
+ content: "● LIVE"
1343
+ }
1344
+ },
1345
+ {
1346
+ id: "viewer-count",
1347
+ type: "text",
1348
+ props: {
1349
+ region: "top-center",
1350
+ role: "viewer-count",
1351
+ content: "1,247 watching"
1352
+ }
1353
+ },
1354
+ {
1355
+ id: "timer",
1356
+ type: "text",
1357
+ props: {
1358
+ region: "top-end",
1359
+ role: "clock",
1360
+ content: "12:35"
1361
+ }
1362
+ },
1363
+ {
1364
+ id: "speaker-bar",
1365
+ type: "view",
1366
+ props: {
1367
+ region: "lower-start",
1368
+ role: "speaker-bar",
1369
+ layout: "column"
1370
+ },
1371
+ children: [{
1372
+ id: "sp-name",
1373
+ type: "text",
1374
+ props: { content: "Robert Mao" }
1375
+ }, {
1376
+ id: "sp-title",
1377
+ type: "text",
1378
+ props: {
1379
+ content: "CEO, ArcBlock",
1380
+ scale: "xs"
1381
+ }
1382
+ }]
1383
+ },
1384
+ {
1385
+ id: "news-ticker",
1386
+ type: "ticker",
1387
+ props: {
1388
+ region: "ticker",
1389
+ mode: "scroll",
1390
+ intent: "info"
1391
+ },
1392
+ children: [
1393
+ {
1394
+ id: "tk1",
1395
+ type: "text",
1396
+ props: {
1397
+ content: "AUP v0.4 released",
1398
+ scale: "sm"
1399
+ }
1400
+ },
1401
+ {
1402
+ id: "tk2",
1403
+ type: "text",
1404
+ props: {
1405
+ content: "22 primitives",
1406
+ scale: "sm"
1407
+ }
1408
+ },
1409
+ {
1410
+ id: "tk3",
1411
+ type: "text",
1412
+ props: {
1413
+ content: "Deck + Frame + Overlay + Ticker now live",
1414
+ scale: "sm"
1415
+ }
1416
+ }
1417
+ ]
1418
+ },
1419
+ {
1420
+ id: "logo",
1421
+ type: "media",
1422
+ props: {
1423
+ region: "bottom-end",
1424
+ src: "/logo.png",
1425
+ size: { width: "48px" }
1426
+ }
1427
+ }
1428
+ ]
1429
+ }]
1430
+ }
1431
+ },
1432
+ "scene-management": {
1433
+ name: "scene-management",
1434
+ title: "Stage-to-Live Scene Management",
1435
+ description: "Pre-render scenes off-screen with aup_stage, swap live with aup_take (zero DOM teardown), release with aup_release. TV-industry Preview/Program model for broadcast-style switching.",
1436
+ concepts: [
1437
+ "aup_stage pre-renders a scene off-screen in a hidden buffer",
1438
+ "aup_take swaps a staged scene to live via CSS class toggle — no DOM teardown",
1439
+ "aup_release frees a staged scene's buffer resources",
1440
+ "Transition support: 'cut' (instant) or 'dissolve' (fade)",
1441
+ "Active scene survives reconnect (replayed automatically)",
1442
+ "LRU eviction keeps memory bounded (default max 3 scenes)"
1443
+ ],
1444
+ document: {
1445
+ id: "scene-example",
1446
+ type: "view",
1447
+ props: { layout: "column" },
1448
+ children: [{
1449
+ id: "s-title",
1450
+ type: "text",
1451
+ props: {
1452
+ content: "Scene Management Demo",
1453
+ level: 1
1454
+ }
1455
+ }, {
1456
+ id: "s-info",
1457
+ type: "text",
1458
+ props: { content: "Use aup_stage to pre-render scenes, aup_take to swap live, aup_release to free." }
1459
+ }]
1460
+ }
1461
+ }
1462
+ };
1463
+
1464
+ //#endregion
1465
+ export { AUP_EXAMPLES, AUP_SPEC };
1466
+ //# sourceMappingURL=aup-spec.mjs.map