@almadar/std 16.199.0 → 16.201.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 (252) hide show
  1. package/behaviors/lolo/ui/avl/atoms/ui-behavior-view.lolo +2 -2
  2. package/behaviors/lolo/ui/avl/atoms/ui-module-card.lolo +2 -2
  3. package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +1 -1
  4. package/behaviors/lolo/ui/core/atoms/std-file-store.lolo +1 -1
  5. package/behaviors/lolo/ui/core/atoms/ui-conditional-wrapper.lolo +11 -4
  6. package/behaviors/lolo/ui/core/atoms/ui-icon.lolo +1 -1
  7. package/behaviors/lolo/ui/core/atoms/ui-input.lolo +10 -4
  8. package/behaviors/lolo/ui/core/atoms/ui-select.lolo +6 -4
  9. package/behaviors/lolo/ui/core/molecules/ui-branching-logic-builder.lolo +5 -5
  10. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +8 -1
  11. package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +1 -1
  12. package/behaviors/lolo/ui/core/molecules/ui-edge-decoration.lolo +1 -1
  13. package/behaviors/lolo/ui/core/molecules/ui-file-tree.lolo +5 -0
  14. package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +1 -1
  15. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +54 -0
  16. package/behaviors/lolo/ui/core/molecules/ui-gradient-divider.lolo +1 -1
  17. package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +8 -1
  18. package/behaviors/lolo/ui/core/molecules/ui-input-group.lolo +10 -4
  19. package/behaviors/lolo/ui/core/molecules/ui-orbital-visualization.lolo +3 -3
  20. package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +1 -1
  21. package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +3 -3
  22. package/behaviors/lolo/ui/core/molecules/ui-wizard-container.lolo +23 -16
  23. package/behaviors/lolo/ui/core/organisms/ui-dock-layout.lolo +186 -0
  24. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +2 -2
  25. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +1 -1
  26. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +2 -2
  27. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +15 -8
  28. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +15 -8
  29. package/behaviors/lolo/ui/core/organisms/ui-split-pane.lolo +37 -1
  30. package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +1 -1
  31. package/behaviors/lolo/ui/core/organisms/ui-subagent-trace-panel.lolo +3 -3
  32. package/behaviors/lolo/ui/game/atoms/std-coef-pad.lolo +5 -3
  33. package/behaviors/lolo/ui/game/atoms/std-fx-narrative.lolo +126 -0
  34. package/behaviors/lolo/ui/game/atoms/std-pickup.lolo +104 -0
  35. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +50 -21
  36. package/behaviors/lolo/ui/game/atoms/ui-control-button.lolo +3 -3
  37. package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +1 -1
  38. package/behaviors/lolo/ui/game/atoms/ui-game-hud.lolo +1 -1
  39. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +3 -3
  40. package/behaviors/lolo/ui/game/atoms/ui-stat-badge.lolo +3 -3
  41. package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +12 -0
  42. package/behaviors/registry/infra/atoms/std-approval-gate.orb +20 -10
  43. package/behaviors/registry/infra/atoms/std-cache-aside.orb +62 -31
  44. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +32 -16
  45. package/behaviors/registry/infra/atoms/std-data-erasure.orb +16 -8
  46. package/behaviors/registry/infra/atoms/std-mod-queue.orb +16 -8
  47. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +28 -14
  48. package/behaviors/registry/infra/organisms/std-status-lifecycle-control.orb +2 -1
  49. package/behaviors/registry/ml/organisms/std-escalating-decision.orb +10 -5
  50. package/behaviors/registry/ml/organisms/std-knowledge-tracing.orb +4 -2
  51. package/behaviors/registry/ui/avl/atoms/ui-behavior-view.orb +389 -3
  52. package/behaviors/registry/ui/avl/atoms/ui-module-card.orb +389 -3
  53. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +93 -2
  54. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +2 -1
  55. package/behaviors/registry/ui/core/atoms/std-browse.orb +6 -3
  56. package/behaviors/registry/ui/core/atoms/std-dashboard-grid-embedded.orb +2 -1
  57. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +4 -2
  58. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +6 -3
  59. package/behaviors/registry/ui/core/atoms/std-export.orb +4 -2
  60. package/behaviors/registry/ui/core/atoms/std-file-store.orb +101 -2
  61. package/behaviors/registry/ui/core/atoms/std-gallery.orb +18 -9
  62. package/behaviors/registry/ui/core/atoms/std-import.orb +4 -2
  63. package/behaviors/registry/ui/core/atoms/std-list.orb +6 -3
  64. package/behaviors/registry/ui/core/atoms/ui-atlas-image.orb +13 -1
  65. package/behaviors/registry/ui/core/atoms/ui-atlas-panel.orb +13 -1
  66. package/behaviors/registry/ui/core/atoms/ui-badge.orb +56 -1
  67. package/behaviors/registry/ui/core/atoms/ui-button.orb +56 -1
  68. package/behaviors/registry/ui/core/atoms/ui-conditional-wrapper.orb +277 -5
  69. package/behaviors/registry/ui/core/atoms/ui-game-icon.orb +56 -1
  70. package/behaviors/registry/ui/core/atoms/ui-icon.orb +1 -10
  71. package/behaviors/registry/ui/core/atoms/ui-input.orb +42 -7
  72. package/behaviors/registry/ui/core/atoms/ui-law-reference-tooltip.orb +27 -1
  73. package/behaviors/registry/ui/core/atoms/ui-select.orb +69 -9
  74. package/behaviors/registry/ui/core/molecules/ui-accordion.orb +30 -1
  75. package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +76 -13
  76. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +30 -1
  77. package/behaviors/registry/ui/core/molecules/ui-chart-legend.orb +15 -1
  78. package/behaviors/registry/ui/core/molecules/ui-chart.orb +133 -1
  79. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +77 -1
  80. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +22 -1
  81. package/behaviors/registry/ui/core/molecules/ui-content-renderer.orb +34 -1
  82. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +99 -1
  83. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +118 -1
  84. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +27 -1
  85. package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +15 -1
  86. package/behaviors/registry/ui/core/molecules/ui-doc-breadcrumb.orb +14 -1
  87. package/behaviors/registry/ui/core/molecules/ui-doc-pagination.orb +35 -1
  88. package/behaviors/registry/ui/core/molecules/ui-doc-toc.orb +20 -1
  89. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +65 -3
  90. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +22 -1
  91. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +60 -1
  92. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +1 -8
  93. package/behaviors/registry/ui/core/molecules/ui-edge-decoration.orb +1 -9
  94. package/behaviors/registry/ui/core/molecules/ui-feature-grid.orb +39 -1
  95. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +8 -0
  96. package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +39 -1
  97. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +29 -10
  98. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +274 -0
  99. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +85 -1
  100. package/behaviors/registry/ui/core/molecules/ui-form-layout.orb +22 -1
  101. package/behaviors/registry/ui/core/molecules/ui-fx-overlay.orb +76 -1
  102. package/behaviors/registry/ui/core/molecules/ui-gradient-divider.orb +1 -10
  103. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +421 -1
  104. package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +92 -1
  105. package/behaviors/registry/ui/core/molecules/ui-header.orb +59 -1
  106. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +125 -2
  107. package/behaviors/registry/ui/core/molecules/ui-import-progress.orb +17 -1
  108. package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +39 -1
  109. package/behaviors/registry/ui/core/molecules/ui-input-group.orb +42 -7
  110. package/behaviors/registry/ui/core/molecules/ui-jazari-state-machine.orb +22 -1
  111. package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +17 -1
  112. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +15 -1
  113. package/behaviors/registry/ui/core/molecules/ui-line-chart.orb +18 -1
  114. package/behaviors/registry/ui/core/molecules/ui-map-view.orb +109 -1
  115. package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +27 -1
  116. package/behaviors/registry/ui/core/molecules/ui-meter.orb +57 -1
  117. package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +27 -1
  118. package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +78 -4
  119. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +91 -1
  120. package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +20 -1
  121. package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +23 -1
  122. package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +18 -1
  123. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +5 -2
  124. package/behaviors/registry/ui/core/molecules/ui-section.orb +22 -1
  125. package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +22 -1
  126. package/behaviors/registry/ui/core/molecules/ui-social-proof.orb +18 -1
  127. package/behaviors/registry/ui/core/molecules/ui-split.orb +22 -1
  128. package/behaviors/registry/ui/core/molecules/ui-stat-display.orb +22 -1
  129. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +64 -4
  130. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +136 -1
  131. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +301 -1
  132. package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +25 -1
  133. package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +28 -1
  134. package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +46 -1
  135. package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +518 -102
  136. package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +19 -1
  137. package/behaviors/registry/ui/core/organisms/ui-chat-bar.orb +22 -1
  138. package/behaviors/registry/ui/core/organisms/ui-dashboard-grid.orb +40 -1
  139. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +196 -1
  140. package/behaviors/registry/ui/core/organisms/ui-dock-layout.orb +521 -0
  141. package/behaviors/registry/ui/core/organisms/ui-drawer-slot.orb +22 -1
  142. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +83 -14
  143. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +64 -8
  144. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +152 -14
  145. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +1140 -15
  146. package/behaviors/registry/ui/core/organisms/ui-form.orb +1140 -15
  147. package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +22 -1
  148. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +71 -1
  149. package/behaviors/registry/ui/core/organisms/ui-modal-slot.orb +22 -1
  150. package/behaviors/registry/ui/core/organisms/ui-segment-renderer.orb +29 -1
  151. package/behaviors/registry/ui/core/organisms/ui-split-pane.orb +109 -2
  152. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +61 -7
  153. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +22 -1
  154. package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +37 -7
  155. package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +31 -1
  156. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +73 -1
  157. package/behaviors/registry/ui/core/organisms/ui-toast-slot.orb +22 -1
  158. package/behaviors/registry/ui/game/atoms/std-coef-pad.orb +170 -4
  159. package/behaviors/registry/ui/game/atoms/std-fx-narrative.orb +695 -0
  160. package/behaviors/registry/ui/game/atoms/std-pickup.orb +835 -0
  161. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +1613 -1062
  162. package/behaviors/registry/ui/game/atoms/ui-action-palette.orb +269 -1
  163. package/behaviors/registry/ui/game/atoms/ui-action-tile.orb +288 -1
  164. package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +54 -1
  165. package/behaviors/registry/ui/game/atoms/ui-canvas.orb +311 -1
  166. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +56 -1
  167. package/behaviors/registry/ui/game/atoms/ui-control-button.orb +59 -20
  168. package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +186 -7
  169. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +56 -1
  170. package/behaviors/registry/ui/game/atoms/ui-draw-fx-layer.orb +233 -1
  171. package/behaviors/registry/ui/game/atoms/ui-draw-group.orb +137 -1
  172. package/behaviors/registry/ui/game/atoms/ui-draw-mesh.orb +219 -1
  173. package/behaviors/registry/ui/game/atoms/ui-draw-shape-layer.orb +951 -1
  174. package/behaviors/registry/ui/game/atoms/ui-draw-shape.orb +512 -1
  175. package/behaviors/registry/ui/game/atoms/ui-draw-sprite-layer.orb +270 -1
  176. package/behaviors/registry/ui/game/atoms/ui-draw-sprite.orb +106 -1
  177. package/behaviors/registry/ui/game/atoms/ui-draw-text-layer.orb +85 -1
  178. package/behaviors/registry/ui/game/atoms/ui-draw-text.orb +19 -1
  179. package/behaviors/registry/ui/game/atoms/ui-game-audio-toggle.orb +128 -1
  180. package/behaviors/registry/ui/game/atoms/ui-game-hud.orb +168 -8
  181. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +151 -13
  182. package/behaviors/registry/ui/game/atoms/ui-health-bar.orb +109 -1
  183. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +56 -1
  184. package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +523 -1
  185. package/behaviors/registry/ui/game/atoms/ui-stat-badge.orb +112 -22
  186. package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +24 -1
  187. package/behaviors/registry/ui/game/atoms/ui-state-json-view.orb +20 -1
  188. package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +849 -1
  189. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +8 -4
  190. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +6 -3
  191. package/behaviors/registry/ui/game/organisms/std-dungeon-board-2d.orb +10 -5
  192. package/behaviors/registry/ui/game/organisms/std-market-board-3d.orb +8 -4
  193. package/behaviors/registry/ui/game/organisms/std-objective-board-3d.orb +8 -4
  194. package/behaviors/registry/ui/game/organisms/std-platformer-board-2d.orb +6 -3
  195. package/behaviors/registry/ui/game/organisms/std-survival-board-3d.orb +8 -4
  196. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +12 -6
  197. package/behaviors/registry/ui/game/organisms/std-tactics-board-3d.orb +8 -4
  198. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +6 -3
  199. package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +289 -1
  200. package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +424 -1
  201. package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +925 -1
  202. package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +970 -1
  203. package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +351 -1
  204. package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +610 -1
  205. package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1049 -1
  206. package/behaviors/registry/ui/marketing/atoms/std-marketing-article.orb +2 -1
  207. package/behaviors/registry/ui/marketing/atoms/std-marketing-footer.orb +2 -1
  208. package/behaviors/registry/ui/marketing/atoms/std-marketing-split.orb +2 -1
  209. package/behaviors/registry/ui/marketing/atoms/std-marketing-stats.orb +2 -1
  210. package/behaviors/registry/ui/marketing/atoms/std-marketing-steps.orb +2 -1
  211. package/behaviors/registry/ui/marketing/atoms/std-marketing-team.orb +2 -1
  212. package/behaviors/registry/ui/marketing/atoms/ui-community-links.orb +36 -1
  213. package/behaviors/registry/ui/marketing/atoms/ui-cta-banner.orb +27 -1
  214. package/behaviors/registry/ui/marketing/atoms/ui-hero-section.orb +39 -1
  215. package/behaviors/registry/ui/marketing/atoms/ui-marketing-footer.orb +55 -1
  216. package/behaviors/registry/ui/marketing/atoms/ui-pricing-card.orb +15 -1
  217. package/behaviors/registry/ui/marketing/atoms/ui-pricing-grid.orb +65 -1
  218. package/behaviors/registry/ui/marketing/atoms/ui-service-catalog.orb +19 -1
  219. package/behaviors/registry/ui/marketing/atoms/ui-showcase-card.orb +15 -1
  220. package/behaviors/registry/ui/marketing/atoms/ui-split-section.orb +15 -1
  221. package/behaviors/registry/ui/marketing/atoms/ui-stats-grid.orb +15 -1
  222. package/behaviors/registry/ui/marketing/atoms/ui-step-flow.orb +23 -1
  223. package/behaviors/registry/ui/marketing/atoms/ui-tag-cloud.orb +18 -1
  224. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +84 -1
  225. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +22 -1
  226. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +22 -1
  227. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +52 -1
  228. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +22 -1
  229. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +32 -1
  230. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +22 -1
  231. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +22 -1
  232. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +22 -1
  233. package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +176 -1
  234. package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +147 -1
  235. package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +260 -1
  236. package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +98 -1
  237. package/dist/behaviors/exports-reader.js +3918 -2596
  238. package/dist/behaviors/functions/index.d.ts +469 -30
  239. package/dist/behaviors/functions/index.js +3906 -2597
  240. package/dist/behaviors/index.d.ts +2 -2
  241. package/dist/behaviors/index.js +3929 -2597
  242. package/dist/behaviors/query.d.ts +88 -4
  243. package/dist/behaviors/query.js +3929 -2597
  244. package/dist/behaviors-embeddings.hash.json +3 -3
  245. package/dist/behaviors-embeddings.json +19 -3
  246. package/dist/behaviors-registry.json +122305 -2637
  247. package/dist/index.d.ts +2 -2
  248. package/dist/index.js +3929 -2597
  249. package/dist/knob-embeddings.hash.json +3 -3
  250. package/dist/knob-embeddings.json +1 -1
  251. package/dist/registry/factory-signatures.json +1 -1
  252. package/package.json +3 -3
@@ -0,0 +1,186 @@
1
+ app ui-dock-layout "1.0.0"
2
+ "DockLayout — UI factory (1:1 with the @almadar/ui dock-layout pattern)."
3
+ orbital DockLayoutOrbital {
4
+ entity DockLayoutItem [runtime] {
5
+ id : string!
6
+ }
7
+
8
+ trait DockLayoutRender -> @rebindable DockLayoutItem [interaction, instance] {
9
+ initial: idle
10
+
11
+ state idle {
12
+ INIT -> idle
13
+ (render-ui main {
14
+ rail: @config.rail
15
+ sidebar: @config.sidebar
16
+ main: @config.main
17
+ bottomPanel: @config.bottomPanel
18
+ statusBar: @config.statusBar
19
+ secondarySidebar: @config.secondarySidebar
20
+ railWidth: @config.railWidth
21
+ secondarySidebarWidth: @config.secondarySidebarWidth
22
+ sidebarCollapsed: @config.sidebarCollapsed
23
+ onSidebarCollapsedChange: @config.onSidebarCollapsedChange
24
+ sidebarWidth: @config.sidebarWidth
25
+ onSidebarWidthChange: @config.onSidebarWidthChange
26
+ sidebarMinSize: @config.sidebarMinSize
27
+ bottomPanelCollapsed: @config.bottomPanelCollapsed
28
+ onBottomPanelCollapsedChange: @config.onBottomPanelCollapsedChange
29
+ bottomPanelHeight: @config.bottomPanelHeight
30
+ onBottomPanelHeightChange: @config.onBottomPanelHeightChange
31
+ bottomPanelMinSize: @config.bottomPanelMinSize
32
+ secondarySidebarCollapsed: @config.secondarySidebarCollapsed
33
+ onSecondarySidebarCollapsedChange: @config.onSecondarySidebarCollapsedChange
34
+ className: @config.className
35
+ railClassName: @config.railClassName
36
+ sidebarClassName: @config.sidebarClassName
37
+ mainClassName: @config.mainClassName
38
+ bottomPanelClassName: @config.bottomPanelClassName
39
+ statusBarClassName: @config.statusBarClassName
40
+ secondarySidebarClassName: @config.secondarySidebarClassName
41
+ type: dock-layout
42
+ })
43
+ }
44
+
45
+ emits {
46
+ @config.onSidebarCollapsedChange -> external {
47
+ collapsed : boolean
48
+ }
49
+ @description "onSidebarCollapsedChange prop"
50
+ @tier "essential"
51
+ @config.onSidebarWidthChange -> external {
52
+ width : number
53
+ }
54
+ @description "onSidebarWidthChange prop"
55
+ @tier "essential"
56
+ @config.onBottomPanelCollapsedChange -> external {
57
+ collapsed : boolean
58
+ }
59
+ @description "onBottomPanelCollapsedChange prop"
60
+ @tier "essential"
61
+ @config.onBottomPanelHeightChange -> external {
62
+ height : number
63
+ }
64
+ @description "onBottomPanelHeightChange prop"
65
+ @tier "essential"
66
+ @config.onSecondarySidebarCollapsedChange -> external {
67
+ collapsed : boolean
68
+ }
69
+ @description "onSecondarySidebarCollapsedChange prop"
70
+ @tier "essential"
71
+ }
72
+
73
+ config {
74
+ rail : node
75
+ @label "Rail"
76
+ @description "Fixed-width far-left vertical strip (e.g. an icon nav rail)."
77
+ @tier "presentation"
78
+ sidebar : node
79
+ @label "Sidebar"
80
+ @description "Collapsible, resizable left sidebar."
81
+ @tier "presentation"
82
+ main : node = []
83
+ @label "Main"
84
+ @description "Required center region."
85
+ @tier "presentation"
86
+ bottomPanel : node
87
+ @label "Bottom Panel"
88
+ @description "Collapsible, resizable-height bottom panel."
89
+ @tier "presentation"
90
+ statusBar : node
91
+ @label "Status Bar"
92
+ @description "Slim strip pinned to the bottom of the frame, below the bottom panel."
93
+ @tier "presentation"
94
+ secondarySidebar : node
95
+ @label "Secondary Sidebar"
96
+ @description "Collapsible right sidebar."
97
+ @tier "presentation"
98
+ railWidth : number = 56
99
+ @label "Rail Width"
100
+ @description "Width of `rail` in pixels. @default 56"
101
+ @tier "presentation"
102
+ secondarySidebarWidth : number = 280
103
+ @label "Secondary Sidebar Width"
104
+ @description "Width of `secondarySidebar` in pixels (fixed — not resizable). @default 280"
105
+ @tier "presentation"
106
+ sidebarCollapsed : boolean = false
107
+ @label "Sidebar Collapsed"
108
+ @description "Whether `sidebar` is collapsed. @default false"
109
+ @tier "presentation"
110
+ onSidebarCollapsedChange : event = "SIDEBAR_COLLAPSED_CHANGE"
111
+ @label "On Sidebar Collapsed Change"
112
+ @description "onSidebarCollapsedChange prop"
113
+ @tier "presentation"
114
+ sidebarWidth : number = 20
115
+ @label "Sidebar Width"
116
+ @description "Sidebar size as a SplitPane ratio (0-100, percentage of the sidebar/main split). @default 20"
117
+ @tier "presentation"
118
+ onSidebarWidthChange : event = "SIDEBAR_WIDTH_CHANGE"
119
+ @label "On Sidebar Width Change"
120
+ @description "onSidebarWidthChange prop"
121
+ @tier "presentation"
122
+ sidebarMinSize : number = 160
123
+ @label "Sidebar Min Size"
124
+ @description "Minimum sidebar size in pixels, forwarded to SplitPane's `minSize`. @default 160"
125
+ @tier "presentation"
126
+ bottomPanelCollapsed : boolean = false
127
+ @label "Bottom Panel Collapsed"
128
+ @description "Whether `bottomPanel` is collapsed. @default false"
129
+ @tier "presentation"
130
+ onBottomPanelCollapsedChange : event = "BOTTOM_PANEL_COLLAPSED_CHANGE"
131
+ @label "On Bottom Panel Collapsed Change"
132
+ @description "onBottomPanelCollapsedChange prop"
133
+ @tier "presentation"
134
+ bottomPanelHeight : number = 30
135
+ @label "Bottom Panel Height"
136
+ @description "Bottom panel size as a SplitPane ratio (0-100, percentage given to the panel). @default 30"
137
+ @tier "presentation"
138
+ onBottomPanelHeightChange : event = "BOTTOM_PANEL_HEIGHT_CHANGE"
139
+ @label "On Bottom Panel Height Change"
140
+ @description "onBottomPanelHeightChange prop"
141
+ @tier "presentation"
142
+ bottomPanelMinSize : number = 120
143
+ @label "Bottom Panel Min Size"
144
+ @description "Minimum bottom panel size in pixels, forwarded to SplitPane's `minSize`. @default 120"
145
+ @tier "presentation"
146
+ secondarySidebarCollapsed : boolean = false
147
+ @label "Secondary Sidebar Collapsed"
148
+ @description "Whether `secondarySidebar` is collapsed. @default false"
149
+ @tier "presentation"
150
+ onSecondarySidebarCollapsedChange : event = "SECONDARY_SIDEBAR_COLLAPSED_CHANGE"
151
+ @label "On Secondary Sidebar Collapsed Change"
152
+ @description "onSecondarySidebarCollapsedChange prop"
153
+ @tier "presentation"
154
+ className : string
155
+ @label "Class Name"
156
+ @description "Additional CSS classes on the root frame."
157
+ @tier "presentation"
158
+ railClassName : string
159
+ @label "Rail Class Name"
160
+ @description "railClassName prop"
161
+ @tier "presentation"
162
+ sidebarClassName : string
163
+ @label "Sidebar Class Name"
164
+ @description "sidebarClassName prop"
165
+ @tier "presentation"
166
+ mainClassName : string
167
+ @label "Main Class Name"
168
+ @description "mainClassName prop"
169
+ @tier "presentation"
170
+ bottomPanelClassName : string
171
+ @label "Bottom Panel Class Name"
172
+ @description "bottomPanelClassName prop"
173
+ @tier "presentation"
174
+ statusBarClassName : string
175
+ @label "Status Bar Class Name"
176
+ @description "statusBarClassName prop"
177
+ @tier "presentation"
178
+ secondarySidebarClassName : string
179
+ @label "Secondary Sidebar Class Name"
180
+ @description "secondarySidebarClassName prop"
181
+ @tier "presentation"
182
+ }
183
+ }
184
+
185
+ page "/dock-layout" as DockLayoutPage -> DockLayoutRender
186
+ }
@@ -24,8 +24,8 @@ orbital EntityCardsOrbital {
24
24
  label : string!
25
25
  event : event
26
26
  navigatesTo : string
27
- placement : "card" | "footer" | "row"
28
- variant : "primary" | "secondary" | "ghost" | "danger"
27
+ placement : string
28
+ variant : string
29
29
  }
30
30
 
31
31
  entity EntityCardsItem [runtime] {
@@ -18,7 +18,7 @@ orbital EntityListOrbital {
18
18
  label : string!
19
19
  event : event
20
20
  navigatesTo : string
21
- placement : "row" | "bulk" | "card" | "footer"
21
+ placement : string
22
22
  variant : "primary" | "secondary" | "ghost" | "danger" | "default"
23
23
  }
24
24
 
@@ -28,9 +28,9 @@ orbital EntityTableOrbital {
28
28
  label : string!
29
29
  event : event
30
30
  navigatesTo : string
31
- placement : "row" | "bulk"
31
+ placement : string
32
32
  icon : icon
33
- variant : "default" | "primary" | "secondary" | "ghost" | "danger"
33
+ variant : string
34
34
  }
35
35
  type EntityTableEmptyAction = {
36
36
  label : string!
@@ -10,7 +10,7 @@ orbital FormSectionOrbital {
10
10
  inputType : string
11
11
  placeholder : string
12
12
  required : boolean
13
- defaultValue : opaque
13
+ defaultValue : ControlValue
14
14
  options : [FormSectionFieldsItemOptionsItem]
15
15
  values : [string]
16
16
  relation : FormSectionFieldsItemRelation
@@ -22,6 +22,13 @@ orbital FormSectionOrbital {
22
22
  disabled : boolean
23
23
  hint : string
24
24
  }
25
+ type ControlValue = string | number | boolean | [string] | FileValue
26
+ type FileValue = {
27
+ name : string!
28
+ url : string!
29
+ mimeType : string!
30
+ sizeBytes : number!
31
+ }
25
32
  type FormSectionFieldsItemOptionsItem = {
26
33
  value : string!
27
34
  label : string!
@@ -69,10 +76,10 @@ orbital FormSectionOrbital {
69
76
  message : string!
70
77
  }
71
78
  type FormSectionEvaluationContext = {
72
- formValues : Map string opaque!
73
- globalVariables : Map string opaque!
74
- localVariables : Map string opaque
75
- entity : Map string opaque
79
+ formValues : Map string ControlValue!
80
+ globalVariables : Map string ControlValue!
81
+ localVariables : Map string ControlValue
82
+ entity : Map string ControlValue
76
83
  }
77
84
  type FormSectionSectionsItem = {
78
85
  id : string!
@@ -89,7 +96,7 @@ orbital FormSectionOrbital {
89
96
  inputType : string
90
97
  placeholder : string
91
98
  required : boolean
92
- defaultValue : opaque
99
+ defaultValue : ControlValue
93
100
  options : [FormSectionSectionsItemFieldsItemOptionsItem]
94
101
  values : [string]
95
102
  relation : FormSectionSectionsItemFieldsItemRelation
@@ -116,7 +123,7 @@ orbital FormSectionOrbital {
116
123
  type FormSectionFIELDCHANGEChange = {
117
124
  fieldId : string!
118
125
  value : string | number | boolean | [string] | FormSectionFIELDCHANGEChangeValue!
119
- formValues : Map string opaque!
126
+ formValues : Map string ControlValue!
120
127
  }
121
128
  type FormSectionFIELDCHANGEChangeValue = {
122
129
  name : string!
@@ -283,7 +290,7 @@ orbital FormSectionOrbital {
283
290
  @label "Class Name"
284
291
  @description "Additional CSS classes"
285
292
  @tier "presentation"
286
- mode : "create" | "edit" = create
293
+ mode : string
287
294
  @label "Mode"
288
295
  @description "Form mode — 'create' for new records, 'edit' for updating existing. Accepts `string` so schema-driven callers (whose `config.mode` is typed as `string` per the trait's declared config block) compile cleanly. The runtime treats anything other than 'edit' as 'create'."
289
296
  @tier "presentation"
@@ -10,7 +10,7 @@ orbital FormOrbital {
10
10
  inputType : string
11
11
  placeholder : string
12
12
  required : boolean
13
- defaultValue : opaque
13
+ defaultValue : ControlValue
14
14
  options : [FormFieldsItemOptionsItem]
15
15
  values : [string]
16
16
  relation : FormFieldsItemRelation
@@ -22,6 +22,13 @@ orbital FormOrbital {
22
22
  disabled : boolean
23
23
  hint : string
24
24
  }
25
+ type ControlValue = string | number | boolean | [string] | FileValue
26
+ type FileValue = {
27
+ name : string!
28
+ url : string!
29
+ mimeType : string!
30
+ sizeBytes : number!
31
+ }
25
32
  type FormFieldsItemOptionsItem = {
26
33
  value : string!
27
34
  label : string!
@@ -69,10 +76,10 @@ orbital FormOrbital {
69
76
  message : string!
70
77
  }
71
78
  type FormEvaluationContext = {
72
- formValues : Map string opaque!
73
- globalVariables : Map string opaque!
74
- localVariables : Map string opaque
75
- entity : Map string opaque
79
+ formValues : Map string ControlValue!
80
+ globalVariables : Map string ControlValue!
81
+ localVariables : Map string ControlValue
82
+ entity : Map string ControlValue
76
83
  }
77
84
  type FormSectionsItem = {
78
85
  id : string!
@@ -89,7 +96,7 @@ orbital FormOrbital {
89
96
  inputType : string
90
97
  placeholder : string
91
98
  required : boolean
92
- defaultValue : opaque
99
+ defaultValue : ControlValue
93
100
  options : [FormSectionsItemFieldsItemOptionsItem]
94
101
  values : [string]
95
102
  relation : FormSectionsItemFieldsItemRelation
@@ -116,7 +123,7 @@ orbital FormOrbital {
116
123
  type FormFIELDCHANGEChange = {
117
124
  fieldId : string!
118
125
  value : string | number | boolean | [string] | FormFIELDCHANGEChangeValue!
119
- formValues : Map string opaque!
126
+ formValues : Map string ControlValue!
120
127
  }
121
128
  type FormFIELDCHANGEChangeValue = {
122
129
  name : string!
@@ -283,7 +290,7 @@ orbital FormOrbital {
283
290
  @label "Class Name"
284
291
  @description "Additional CSS classes"
285
292
  @tier "presentation"
286
- mode : "create" | "edit" = create
293
+ mode : string
287
294
  @label "Mode"
288
295
  @description "Form mode — 'create' for new records, 'edit' for updating existing. Accepts `string` so schema-driven callers (whose `config.mode` is typed as `string` per the trait's declared config block) compile cleanly. The runtime treats anything other than 'edit' as 'create'."
289
296
  @tier "presentation"
@@ -3,6 +3,7 @@ app ui-split-pane "1.0.0"
3
3
  orbital SplitPaneOrbital {
4
4
  entity SplitPaneItem [runtime] {
5
5
  id : string!
6
+ ratio : number
6
7
  }
7
8
 
8
9
  trait SplitPaneRender -> @rebindable SplitPaneItem [interaction, instance] {
@@ -10,9 +11,10 @@ orbital SplitPaneOrbital {
10
11
 
11
12
  state idle {
12
13
  INIT -> idle
14
+ (set @entity.ratio @config.ratio)
13
15
  (render-ui main {
14
16
  direction: @config.direction
15
- ratio: @config.ratio
17
+ ratio: @entity.ratio
16
18
  minSize: @config.minSize
17
19
  resizable: @config.resizable
18
20
  left: @config.left
@@ -20,8 +22,38 @@ orbital SplitPaneOrbital {
20
22
  className: @config.className
21
23
  leftClassName: @config.leftClassName
22
24
  rightClassName: @config.rightClassName
25
+ onRatioChange: @config.onRatioChange
23
26
  type: split-pane
24
27
  })
28
+ RATIO_CHANGE -> idle
29
+ (set @entity.ratio ?ratio)
30
+ (render-ui main {
31
+ direction: @config.direction
32
+ ratio: @entity.ratio
33
+ minSize: @config.minSize
34
+ resizable: @config.resizable
35
+ left: @config.left
36
+ right: @config.right
37
+ className: @config.className
38
+ leftClassName: @config.leftClassName
39
+ rightClassName: @config.rightClassName
40
+ onRatioChange: @config.onRatioChange
41
+ type: split-pane
42
+ })
43
+ }
44
+
45
+ emits {
46
+ @config.onRatioChange -> external {
47
+ ratio : number
48
+ }
49
+ @description "Called with the new ratio while dragging. Providing this makes `ratio` controlled — the rendered split always tracks the prop instead of internal state, mirroring a controlled input. Omit for uncontrolled (self-tracked) behavior."
50
+ @tier "essential"
51
+ }
52
+
53
+ listens {
54
+ RATIO_CHANGE {
55
+ ratio : number
56
+ }
25
57
  }
26
58
 
27
59
  config {
@@ -61,6 +93,10 @@ orbital SplitPaneOrbital {
61
93
  @label "Right Class Name"
62
94
  @description "Class for right/bottom pane"
63
95
  @tier "presentation"
96
+ onRatioChange : event = "RATIO_CHANGE"
97
+ @label "On Ratio Change"
98
+ @description "Called with the new ratio while dragging. Providing this makes `ratio` controlled — the rendered split always tracks the prop instead of internal state, mirroring a controlled input. Omit for uncontrolled (self-tracked) behavior."
99
+ @tier "presentation"
64
100
  }
65
101
  }
66
102
 
@@ -18,7 +18,7 @@ orbital StatCardOrbital {
18
18
  label : string!
19
19
  value : string
20
20
  icon : icon
21
- format : "currency" | "percent" | "number"
21
+ format : string
22
22
  }
23
23
 
24
24
  entity StatCardItem [runtime] {
@@ -114,7 +114,7 @@ orbital SubagentTracePanelOrbital {
114
114
  @label "Selected Ids"
115
115
  @description "Currently selected item IDs"
116
116
  @tier "presentation"
117
- subagents : [opaque] = []
117
+ subagents : [Map string scalar] = []
118
118
  @label "Subagents"
119
119
  @description "All known subagents from the runner."
120
120
  @tier "presentation"
@@ -134,11 +134,11 @@ orbital SubagentTracePanelOrbital {
134
134
  @label "On Close"
135
135
  @description "Optional dismiss handler."
136
136
  @tier "presentation"
137
- coordinatorActivities : [opaque] = []
137
+ coordinatorActivities : [Map string scalar] = []
138
138
  @label "Coordinator Activities"
139
139
  @description "Full coordinator activities (tool calls, results, messages, errors)."
140
140
  @tier "presentation"
141
- coordinatorMessages : [opaque] = []
141
+ coordinatorMessages : [Map string scalar] = []
142
142
  @label "Coordinator Messages"
143
143
  @description "Canonical Coordinator conversation — same shape live and on reload. When present, takes precedence over `coordinatorActivities` for the Coordinator section."
144
144
  @tier "presentation"
@@ -5,6 +5,7 @@ orbital CoefPadOrbital {
5
5
  x0 : number!
6
6
  x1 : number!
7
7
  a : number!
8
+ b : number
8
9
  h : number!
9
10
  k : number!
10
11
  }
@@ -50,7 +51,7 @@ orbital CoefPadOrbital {
50
51
  (let ((remaining (array/len (array/filter @entity.coefPads (fn c (and (== (object/get @c applied) false) (!= (object/get @c id) (object/get @p id))))))))
51
52
  (do
52
53
  (set @entity.coefPads (array/map @entity.coefPads (fn c (if (== (object/get @c id) (object/get @p id)) (object/merge @c { applied: true }) @c))))
53
- (emit COEF_PAD_APPLIED { id: (object/get @p id), x: (object/get @p x), y: (object/get @p y), x0: (object/get @m x0), x1: (object/get @m x1), a: (object/get @m a), h: (object/get @m h), k: (object/get @m k), hint: (object/get @p hint), hop: (object/get @p hop), samples: (object/get @p samples) })
54
+ (emit COEF_PAD_APPLIED { id: (object/get @p id), x: (object/get @p x), y: (object/get @p y), x0: (object/get @m x0), x1: (object/get @m x1), a: (object/get @m a), b: (if (== (object/get @m b) null) 1 (object/get @m b)), h: (object/get @m h), k: (object/get @m k), hint: (object/get @p hint), hop: (object/get @p hop), samples: (object/get @p samples) })
54
55
  (if (and (== @entity.coefCompleted false) (== @remaining 0))
55
56
  (do
56
57
  (set @entity.coefCompleted true)
@@ -71,13 +72,14 @@ orbital CoefPadOrbital {
71
72
  x0 : number!
72
73
  x1 : number!
73
74
  a : number!
75
+ b : number
74
76
  h : number!
75
77
  k : number!
76
78
  hint : string
77
79
  hop : boolean
78
80
  samples : [CoefModSample]
79
81
  }
80
- @description "The player stood on an unapplied coefficient pad; carries the pad position and the full mod (x0, x1, a, h, k) so the board appends it to the body authority's curveMods and hops the player onto the reshaped road. Fires once per pad per run."
82
+ @description "The player stood on an unapplied coefficient pad; carries the pad position and the full mod (x0, x1, a, b, h, k) so the board appends it to the body authority's curveMods and hops the player onto the reshaped road. Fires once per pad per run."
81
83
  @tier "domain"
82
84
  COEF_PAD_SET_COMPLETED -> external {
83
85
  }
@@ -97,7 +99,7 @@ orbital CoefPadOrbital {
97
99
  @tier "domain"
98
100
  coefPads : [CoefPad] = []
99
101
  @label "Coefficient Pads"
100
- @description "One row per pad: id, center (x, y in world units), the mod applied to the road while inside x0..x1 (a scales slope+height, h shifts horizontally, k lifts), and the hint floated on apply, and hop (true = the board teleports the player onto the reshaped surface — use when the mod steps the road far from the pad; false = the skate snap carries the player, preserving speed). applied is stamped at runtime."
102
+ @description "One row per pad: id, center (x, y in world units), the mod applied to the road while inside x0..x1 (a scales slope+height, b compresses/stretch period, h shifts horizontally, k lifts), and the hint floated on apply, and hop (true = the board teleports the player onto the reshaped surface — use when the mod steps the road far from the pad; false = the skate snap carries the player, preserving speed). applied is stamped at runtime."
101
103
  @tier "domain"
102
104
  reachX : number = 0.7
103
105
  @label "Reach X"
@@ -0,0 +1,126 @@
1
+ app std-fx-narrative "1.0.0"
2
+ "Headless pedagogy→fx translator for game boards and learning shells: turns high-level narrative events into big transient screen-space or world-space text effects consumed by std-fx-particles / fx-overlay. Levels emit NARRATE { text, style } and get a correctly styled, centered (or positioned) floating text burst without hand-rolling particle structs. Tutorials emit TUTORIAL_SHOW and the atom forwards SHOW to a composed std-tutorial-overlay trait. Renders nothing; centralizes the FX vocabulary so every level's teaching text looks and behaves the same."
3
+
4
+ orbital FxNarrativeOrbital {
5
+ type NarrativeCue = {
6
+ text : string!
7
+ style : "hint" | "fact" | "warn" | "celebrate"
8
+ x : number
9
+ y : number
10
+ ttl : number
11
+ space : "screen" | "world"
12
+ }
13
+
14
+ type FxParticle = {
15
+ id : string!
16
+ type : string!
17
+ x : number!
18
+ z : number
19
+ y : number
20
+ message : string
21
+ ttl : number!
22
+ maxTtl : number
23
+ bornAt : number
24
+ space : string
25
+ effect : string
26
+ color : string
27
+ size : number
28
+ vx : number
29
+ vy : number
30
+ vz : number
31
+ particleCount : number
32
+ }
33
+
34
+ type StyleDef = {
35
+ color : string!
36
+ size : number!
37
+ ttl : number!
38
+ effect : string!
39
+ }
40
+
41
+ entity FxNarrativeData [runtime, shared] {
42
+ id : string!
43
+ seq : number = 0
44
+ lastText : string = ""
45
+ }
46
+
47
+ trait FxNarrative -> @rebindable FxNarrativeData [lifecycle] {
48
+ initial: active
49
+
50
+ state active {
51
+ INIT -> active
52
+ (set @entity.seq 0)
53
+ (set @entity.lastText "")
54
+
55
+ NARRATE -> active when @config.running
56
+ (let ((styleKey (if (== (object/get @payload style) null) "fact" (object/get @payload style)))
57
+ (styleDef (object/get @config.styles @styleKey))
58
+ (ttl (if (== (object/get @payload ttl) null) (object/get @styleDef ttl) (object/get @payload ttl)))
59
+ (x (if (== (object/get @payload x) null) 0.5 (object/get @payload x)))
60
+ (y (if (== (object/get @payload y) null) 0.25 (object/get @payload y)))
61
+ (space (if (== (object/get @payload space) null) "world" (object/get @payload space)))
62
+ (text (object/get @payload text)))
63
+ (do
64
+ (set @entity.seq (+ @entity.seq 1))
65
+ (set @entity.lastText @text)
66
+ (emit BURST { particles: [ {
67
+ id: (str/concat "narrative-" @entity.seq),
68
+ type: "narrative",
69
+ x: @x,
70
+ z: @y,
71
+ y: 0,
72
+ message: @text,
73
+ ttl: @ttl,
74
+ maxTtl: @ttl,
75
+ bornAt: (time/now),
76
+ space: @space,
77
+ effect: (object/get @styleDef effect),
78
+ color: (object/get @styleDef color),
79
+ size: (object/get @styleDef size),
80
+ vx: 0,
81
+ vy: 0,
82
+ vz: 0,
83
+ particleCount: 1
84
+ } ] })))
85
+
86
+ TUTORIAL_SHOW -> active when @config.running
87
+ (emit SHOW { id: "tutorial" })
88
+ }
89
+
90
+ emits {
91
+ BURST -> external {
92
+ particles : [FxParticle]
93
+ }
94
+ @description "Styled floating-text particle batch for std-fx-particles / fx-overlay."
95
+ @tier "domain"
96
+ SHOW -> external {
97
+ id : string
98
+ }
99
+ @description "Forwarded to a composed std-tutorial-overlay to open the tutorial modal."
100
+ @tier "domain"
101
+ }
102
+
103
+ listens {
104
+ NARRATE { text : string!, style : "hint" | "fact" | "warn" | "celebrate", x : number, y : number, ttl : number, space : "screen" | "world" }
105
+ TUTORIAL_SHOW { text : string, title : string }
106
+ }
107
+
108
+ config {
109
+ running : boolean = true
110
+ @label "Running"
111
+ @description "When false all narrative events are ignored."
112
+ @tier "domain"
113
+ styles : Map string StyleDef = {
114
+ "fact": { color: "#38bdf8", size: 0.7, ttl: 3, effect: "float-text" },
115
+ "hint": { color: "#a78bfa", size: 0.6, ttl: 2, effect: "float-text" },
116
+ "warn": { color: "#f87171", size: 0.6, ttl: 1.5, effect: "shake" },
117
+ "celebrate": { color: "#facc15", size: 0.9, ttl: 3, effect: "sparkle" }
118
+ }
119
+ @label "Styles"
120
+ @description "Map of narrative style to color, size, ttl, and effect. Override per game theme."
121
+ @tier "presentation"
122
+ }
123
+ }
124
+
125
+ page "/fx-narrative" as FxNarrativePage -> FxNarrative
126
+ }