@almadar/std 16.234.0 → 16.236.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 (245) hide show
  1. package/behaviors/behaviors-registry.json +4402 -1898
  2. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +25 -41
  3. package/behaviors/lolo/infra/atoms/std-audit-capture.lolo +0 -5
  4. package/behaviors/lolo/infra/atoms/std-cache-aside.lolo +0 -24
  5. package/behaviors/lolo/infra/atoms/std-circuit-breaker.lolo +1 -17
  6. package/behaviors/lolo/infra/atoms/std-data-erasure.lolo +17 -24
  7. package/behaviors/lolo/infra/atoms/std-data-import.lolo +8 -11
  8. package/behaviors/lolo/infra/atoms/std-game-clock.lolo +2 -0
  9. package/behaviors/lolo/infra/atoms/std-knowledge-loop.lolo +0 -5
  10. package/behaviors/lolo/infra/atoms/std-lifecycle.lolo +3 -1
  11. package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +40 -18
  12. package/behaviors/lolo/infra/atoms/std-notification-preferences.lolo +20 -11
  13. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +0 -5
  14. package/behaviors/lolo/infra/atoms/std-permission-matrix.lolo +23 -11
  15. package/behaviors/lolo/infra/atoms/std-rate-limiter.lolo +84 -22
  16. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +1 -6
  17. package/behaviors/lolo/ml/atoms/std-graph-builder.lolo +3 -1
  18. package/behaviors/lolo/ml/atoms/std-ml-classify.lolo +0 -4
  19. package/behaviors/lolo/ml/atoms/std-ml-similarity.lolo +0 -4
  20. package/behaviors/lolo/ui/avl/atoms/ui-avl-state-machine.lolo +12 -0
  21. package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +55 -9
  22. package/behaviors/lolo/ui/core/atoms/std-app-search.lolo +6 -2
  23. package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +19 -14
  24. package/behaviors/lolo/ui/core/atoms/std-board.lolo +77 -27
  25. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +44 -28
  26. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +7 -3
  27. package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +25 -13
  28. package/behaviors/lolo/ui/core/atoms/std-esign-request.lolo +5 -0
  29. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +0 -5
  30. package/behaviors/lolo/ui/core/atoms/std-export.lolo +0 -10
  31. package/behaviors/lolo/ui/core/atoms/std-file-store.lolo +7 -3
  32. package/behaviors/lolo/ui/core/atoms/std-form-advanced.lolo +1 -6
  33. package/behaviors/lolo/ui/core/atoms/std-geosearch.lolo +1 -0
  34. package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +20 -4
  35. package/behaviors/lolo/ui/core/atoms/std-import.lolo +0 -5
  36. package/behaviors/lolo/ui/core/atoms/std-list.lolo +46 -32
  37. package/behaviors/lolo/ui/core/atoms/std-modal-editor.lolo +2 -2
  38. package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +12 -13
  39. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +16 -12
  40. package/behaviors/lolo/ui/core/atoms/std-recurrence.lolo +10 -1
  41. package/behaviors/lolo/ui/core/atoms/std-role-gate.lolo +39 -0
  42. package/behaviors/lolo/ui/core/atoms/std-saved-search.lolo +78 -16
  43. package/behaviors/lolo/ui/core/atoms/std-selection.lolo +15 -10
  44. package/behaviors/lolo/ui/core/atoms/std-stats.lolo +5 -5
  45. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +3 -0
  46. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +41 -73
  47. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +20 -11
  48. package/behaviors/lolo/ui/core/atoms/std-vote.lolo +0 -4
  49. package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +3 -3
  50. package/behaviors/lolo/ui/core/atoms/ui-presence.lolo +21 -0
  51. package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +6 -1
  52. package/behaviors/lolo/ui/core/molecules/ui-chart.lolo +11 -1
  53. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +13 -8
  54. package/behaviors/lolo/ui/core/molecules/ui-command-palette.lolo +7 -2
  55. package/behaviors/lolo/ui/core/molecules/ui-commit-row.lolo +2 -2
  56. package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +8 -0
  57. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +41 -3
  58. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +41 -3
  59. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +30 -9
  60. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +8 -3
  61. package/behaviors/lolo/ui/core/molecules/ui-document-viewer.lolo +6 -1
  62. package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +13 -0
  63. package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +6 -1
  64. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +6 -1
  65. package/behaviors/lolo/ui/core/molecules/ui-form-actions.lolo +6 -1
  66. package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +6 -1
  67. package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +6 -1
  68. package/behaviors/lolo/ui/core/molecules/ui-meter.lolo +6 -1
  69. package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +5 -0
  70. package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +11 -1
  71. package/behaviors/lolo/ui/core/molecules/ui-page-transition.lolo +1 -1
  72. package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +44 -15
  73. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +41 -3
  74. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +8 -2
  75. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +66 -12
  76. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +9 -3
  77. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +9 -3
  78. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +18 -9
  79. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +55 -10
  80. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +55 -10
  81. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +8 -3
  82. package/behaviors/lolo/ui/core/organisms/ui-state-machine-view.lolo +12 -0
  83. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +8 -3
  84. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +2 -44
  85. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +6 -1
  86. package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +2 -37
  87. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +8 -2
  88. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +2 -2
  89. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +0 -4
  90. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +2 -66
  91. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +0 -4
  92. package/behaviors/lolo/ui/game/organisms/std-worldmap-board-2d.lolo +0 -4
  93. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +6 -6
  94. package/behaviors/lolo-behavior-contracts.json +1 -1
  95. package/behaviors/registry/factory-signatures.json +1 -1
  96. package/behaviors/registry/infra/atoms/std-approval-gate.orb +124 -67
  97. package/behaviors/registry/infra/atoms/std-audit-capture.orb +0 -8
  98. package/behaviors/registry/infra/atoms/std-cache-aside.orb +0 -84
  99. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -44
  100. package/behaviors/registry/infra/atoms/std-data-erasure.orb +124 -55
  101. package/behaviors/registry/infra/atoms/std-data-import.orb +12 -11
  102. package/behaviors/registry/infra/atoms/std-game-clock.orb +31 -0
  103. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +0 -57
  104. package/behaviors/registry/infra/atoms/std-lifecycle.orb +43 -0
  105. package/behaviors/registry/infra/atoms/std-mod-queue.orb +379 -103
  106. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +126 -12
  107. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +0 -11
  108. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +128 -12
  109. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +287 -72
  110. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +5 -8
  111. package/behaviors/registry/ml/atoms/std-graph-builder.orb +11 -0
  112. package/behaviors/registry/ml/atoms/std-ml-classify.orb +0 -7
  113. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +0 -7
  114. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +82 -0
  115. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +417 -9
  116. package/behaviors/registry/ui/core/atoms/std-app-search.orb +53 -1
  117. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +209 -19
  118. package/behaviors/registry/ui/core/atoms/std-board.orb +242 -61
  119. package/behaviors/registry/ui/core/atoms/std-browse.orb +295 -41
  120. package/behaviors/registry/ui/core/atoms/std-calendar.orb +96 -2
  121. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +122 -15
  122. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +11 -0
  123. package/behaviors/registry/ui/core/atoms/std-event-log.orb +0 -8
  124. package/behaviors/registry/ui/core/atoms/std-export.orb +0 -16
  125. package/behaviors/registry/ui/core/atoms/std-file-store.orb +109 -2
  126. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -43
  127. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +5 -0
  128. package/behaviors/registry/ui/core/atoms/std-graphs.orb +173 -66
  129. package/behaviors/registry/ui/core/atoms/std-import.orb +0 -8
  130. package/behaviors/registry/ui/core/atoms/std-list.orb +226 -34
  131. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +10 -1
  132. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +37 -19
  133. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +204 -11
  134. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +89 -4
  135. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +217 -0
  136. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +419 -19
  137. package/behaviors/registry/ui/core/atoms/std-selection.orb +140 -10
  138. package/behaviors/registry/ui/core/atoms/std-stats.orb +73 -1
  139. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +3 -0
  140. package/behaviors/registry/ui/core/atoms/std-thread.orb +190 -115
  141. package/behaviors/registry/ui/core/atoms/std-version-history.orb +127 -13
  142. package/behaviors/registry/ui/core/atoms/std-vote.orb +0 -9
  143. package/behaviors/registry/ui/core/atoms/std-wizard.orb +33 -3
  144. package/behaviors/registry/ui/core/atoms/ui-presence.orb +59 -0
  145. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +53 -1
  146. package/behaviors/registry/ui/core/molecules/ui-chart.orb +68 -1
  147. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +291 -8
  148. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +87 -2
  149. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +3 -2
  150. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +32 -0
  151. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +189 -3
  152. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +189 -3
  153. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +81 -24
  154. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +121 -3
  155. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +53 -1
  156. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +40 -0
  157. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +53 -1
  158. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +53 -1
  159. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +53 -1
  160. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +53 -1
  161. package/behaviors/registry/ui/core/molecules/ui-menu.orb +57 -1
  162. package/behaviors/registry/ui/core/molecules/ui-meter.orb +53 -1
  163. package/behaviors/registry/ui/core/molecules/ui-modal.orb +8 -0
  164. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +60 -1
  165. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  166. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +393 -23
  167. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +189 -3
  168. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +99 -2
  169. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +282 -20
  170. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +130 -3
  171. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +130 -3
  172. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +367 -9
  173. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +104 -13
  174. package/behaviors/registry/ui/core/organisms/ui-form.orb +104 -13
  175. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +121 -3
  176. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +82 -0
  177. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +121 -3
  178. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -172
  179. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +53 -1
  180. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -116
  181. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +99 -2
  182. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +10 -0
  183. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +0 -7
  184. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -807
  185. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +0 -7
  186. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +0 -7
  187. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +6 -0
  188. package/canonical-operators.json +18 -1
  189. package/dist/behaviors/exports-reader.js +7662 -3762
  190. package/dist/behaviors/functions/index.d.ts +309 -104
  191. package/dist/behaviors/functions/index.js +7651 -3762
  192. package/dist/behaviors/index.d.ts +1 -1
  193. package/dist/behaviors/index.js +7663 -3763
  194. package/dist/behaviors/query.js +7662 -3762
  195. package/dist/behaviors-embeddings.hash.json +3 -3
  196. package/dist/behaviors-embeddings.json +35 -27
  197. package/dist/behaviors-registry.json +4402 -1898
  198. package/dist/index.d.ts +3 -3
  199. package/dist/index.js +7697 -3763
  200. package/dist/knob-embeddings.hash.json +3 -3
  201. package/dist/knob-embeddings.json +612 -352
  202. package/dist/modules/anim.d.ts +1 -1
  203. package/dist/modules/array.d.ts +1 -1
  204. package/dist/modules/array.js +15 -0
  205. package/dist/modules/async.d.ts +1 -1
  206. package/dist/modules/async.js +9 -0
  207. package/dist/modules/behavior.d.ts +1 -1
  208. package/dist/modules/browser.d.ts +1 -1
  209. package/dist/modules/composition.d.ts +1 -1
  210. package/dist/modules/contract.d.ts +1 -1
  211. package/dist/modules/core.d.ts +1 -1
  212. package/dist/modules/core.js +10 -0
  213. package/dist/modules/data.d.ts +1 -1
  214. package/dist/modules/ease.d.ts +1 -1
  215. package/dist/modules/format.d.ts +1 -1
  216. package/dist/modules/geo.d.ts +1 -1
  217. package/dist/modules/graph.d.ts +1 -1
  218. package/dist/modules/grid.d.ts +1 -1
  219. package/dist/modules/index.d.ts +1 -1
  220. package/dist/modules/index.js +34 -0
  221. package/dist/modules/integration.d.ts +1 -1
  222. package/dist/modules/json.d.ts +1 -1
  223. package/dist/modules/llm.d.ts +1 -1
  224. package/dist/modules/math.d.ts +1 -1
  225. package/dist/modules/memory.d.ts +1 -1
  226. package/dist/modules/nn.d.ts +1 -1
  227. package/dist/modules/noise.d.ts +1 -1
  228. package/dist/modules/object.d.ts +1 -1
  229. package/dist/modules/os.d.ts +1 -1
  230. package/dist/modules/path.d.ts +1 -1
  231. package/dist/modules/prob.d.ts +1 -1
  232. package/dist/modules/session.d.ts +1 -1
  233. package/dist/modules/str.d.ts +1 -1
  234. package/dist/modules/tensor.d.ts +1 -1
  235. package/dist/modules/time.d.ts +1 -1
  236. package/dist/modules/trace.d.ts +1 -1
  237. package/dist/modules/train.d.ts +1 -1
  238. package/dist/modules/validate.d.ts +1 -1
  239. package/dist/modules/vector.d.ts +1 -1
  240. package/dist/modules/workspace.d.ts +1 -1
  241. package/dist/registry/factory-signatures.json +1 -1
  242. package/dist/registry.d.ts +5 -2
  243. package/dist/registry.js +55 -1
  244. package/dist/{types-DwAW4Nni.d.ts → types-DLx38UFZ.d.ts} +31 -4
  245. package/package.json +2 -2
@@ -2,7 +2,7 @@ app ui-form-section "1.0.0"
2
2
  "FormSection — UI factory (1:1 with the @almadar/ui form-section pattern)."
3
3
  ;; @pattern "form-section"
4
4
  orbital FormSectionOrbital {
5
- type FormSectionLoaded = Event { data : [FormSectionItem] } "FormSection rows finished loading; payload.data holds the collection"
5
+ type FormSectionLoaded = Event { data : FormSectionItem } "FormSection row finished loading; payload.data holds the single row"
6
6
  type FormSectionFieldsItem = {
7
7
  name : string
8
8
  field : string
@@ -138,11 +138,45 @@ orbital FormSectionOrbital {
138
138
  }
139
139
 
140
140
  trait FormSectionRender -> @rebindable FormSectionItem [interaction, instance] {
141
- initial: idle
141
+ initial: resolving
142
142
 
143
- state idle {
144
- INIT -> idle when @config.selfFetch
145
- (fetch FormSectionItem { emit: { success: FormSectionLoaded } })
143
+ state resolving {
144
+ INIT -> idle when (and @config.selfFetch (!= (str/default ?id "") "") (!= @config.mode "create"))
145
+ (fetch FormSectionItem { id: ?id, emit: { success: FormSectionLoaded } })
146
+ (render-ui main {
147
+ children: @config.children
148
+ onSubmit: @config.onSubmit
149
+ onCancel: @config.onCancel
150
+ layout: @config.layout
151
+ gap: @config.gap
152
+ className: @config.className
153
+ entity: @entity
154
+ mode: @config.mode
155
+ fields: @config.fields
156
+ initialData: @entity
157
+ isLoading: @config.isLoading
158
+ error: @config.error
159
+ submitLabel: @config.submitLabel
160
+ cancelLabel: @config.cancelLabel
161
+ showCancel: @config.showCancel
162
+ showSubmit: @config.showSubmit
163
+ title: @config.title
164
+ submitEvent: @config.submitEvent
165
+ cancelEvent: @config.cancelEvent
166
+ relationsData: @config.relationsData
167
+ relationsLoading: @config.relationsLoading
168
+ fieldOverrides: @config.fieldOverrides
169
+ conditionalFields: @config.conditionalFields
170
+ hiddenCalculations: @config.hiddenCalculations
171
+ violationTriggers: @config.violationTriggers
172
+ evaluationContext: @config.evaluationContext
173
+ sections: @config.sections
174
+ onFieldChange: @config.onFieldChange
175
+ configPath: @config.configPath
176
+ repeatable: @config.repeatable
177
+ type: form-section
178
+ })
179
+ INIT -> idle when (not (and @config.selfFetch (!= (str/default ?id "") "") (!= @config.mode "create")))
146
180
  (render-ui main {
147
181
  children: @config.children
148
182
  onSubmit: @config.onSubmit
@@ -176,7 +210,10 @@ orbital FormSectionOrbital {
176
210
  repeatable: @config.repeatable
177
211
  type: form-section
178
212
  })
179
- INIT -> idle when (not @config.selfFetch)
213
+ }
214
+
215
+ state idle {
216
+ INIT -> idle
180
217
  (render-ui main {
181
218
  children: @config.children
182
219
  onSubmit: @config.onSubmit
@@ -218,7 +255,7 @@ orbital FormSectionOrbital {
218
255
  layout: @config.layout
219
256
  gap: @config.gap
220
257
  className: @config.className
221
- entity: @payload.data
258
+ entity: @entity
222
259
  mode: @config.mode
223
260
  fields: @config.fields
224
261
  initialData: @payload.data
@@ -261,11 +298,19 @@ orbital FormSectionOrbital {
261
298
  @description "Callback when any field value changes"
262
299
  @tier "essential"
263
300
  FormSectionLoaded
264
- @description "FormSection rows finished loading; payload.data holds the collection."
301
+ @description "FormSection row finished loading; payload.data holds the single row."
265
302
  @synonyms "loaded, fetched, retrieved"
266
303
  @tier "essential"
267
304
  }
268
305
 
306
+ listens {
307
+ INIT {
308
+ id : string
309
+ }
310
+ @description "Mount payload; a host that routes to this panel by id (a :id page param) passes it here."
311
+ @tier "internal"
312
+ }
313
+
269
314
  config {
270
315
  children : node
271
316
  @label "Children"
@@ -380,8 +425,8 @@ orbital FormSectionOrbital {
380
425
  @description "Whether the form supports repeatable entries"
381
426
  @tier "presentation"
382
427
  selfFetch : boolean = true
383
- @label "Fetch its own rows on mount?"
384
- @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
428
+ @label "Fetch its own row on mount?"
429
+ @description "true (default) = a mount that carries an id loads that one row (never the collection); a create-mode mount skips the load. false = a composing atom owns the load."
385
430
  @tier "internal"
386
431
  }
387
432
  }
@@ -2,7 +2,7 @@ app ui-form "1.0.0"
2
2
  "Form — UI factory (1:1 with the @almadar/ui form pattern)."
3
3
  ;; @pattern "form"
4
4
  orbital FormOrbital {
5
- type FormLoaded = Event { data : [FormItem] } "Form rows finished loading; payload.data holds the collection"
5
+ type FormLoaded = Event { data : FormItem } "Form row finished loading; payload.data holds the single row"
6
6
  type FormFieldsItem = {
7
7
  name : string
8
8
  field : string
@@ -138,11 +138,45 @@ orbital FormOrbital {
138
138
  }
139
139
 
140
140
  trait FormRender -> @rebindable FormItem [interaction, instance] {
141
- initial: idle
141
+ initial: resolving
142
142
 
143
- state idle {
144
- INIT -> idle when @config.selfFetch
145
- (fetch FormItem { emit: { success: FormLoaded } })
143
+ state resolving {
144
+ INIT -> idle when (and @config.selfFetch (!= (str/default ?id "") "") (!= @config.mode "create"))
145
+ (fetch FormItem { id: ?id, emit: { success: FormLoaded } })
146
+ (render-ui main {
147
+ children: @config.children
148
+ onSubmit: @config.onSubmit
149
+ onCancel: @config.onCancel
150
+ layout: @config.layout
151
+ gap: @config.gap
152
+ className: @config.className
153
+ entity: @entity
154
+ mode: @config.mode
155
+ fields: @config.fields
156
+ initialData: @entity
157
+ isLoading: @config.isLoading
158
+ error: @config.error
159
+ submitLabel: @config.submitLabel
160
+ cancelLabel: @config.cancelLabel
161
+ showCancel: @config.showCancel
162
+ showSubmit: @config.showSubmit
163
+ title: @config.title
164
+ submitEvent: @config.submitEvent
165
+ cancelEvent: @config.cancelEvent
166
+ relationsData: @config.relationsData
167
+ relationsLoading: @config.relationsLoading
168
+ fieldOverrides: @config.fieldOverrides
169
+ conditionalFields: @config.conditionalFields
170
+ hiddenCalculations: @config.hiddenCalculations
171
+ violationTriggers: @config.violationTriggers
172
+ evaluationContext: @config.evaluationContext
173
+ sections: @config.sections
174
+ onFieldChange: @config.onFieldChange
175
+ configPath: @config.configPath
176
+ repeatable: @config.repeatable
177
+ type: form
178
+ })
179
+ INIT -> idle when (not (and @config.selfFetch (!= (str/default ?id "") "") (!= @config.mode "create")))
146
180
  (render-ui main {
147
181
  children: @config.children
148
182
  onSubmit: @config.onSubmit
@@ -176,7 +210,10 @@ orbital FormOrbital {
176
210
  repeatable: @config.repeatable
177
211
  type: form
178
212
  })
179
- INIT -> idle when (not @config.selfFetch)
213
+ }
214
+
215
+ state idle {
216
+ INIT -> idle
180
217
  (render-ui main {
181
218
  children: @config.children
182
219
  onSubmit: @config.onSubmit
@@ -218,7 +255,7 @@ orbital FormOrbital {
218
255
  layout: @config.layout
219
256
  gap: @config.gap
220
257
  className: @config.className
221
- entity: @payload.data
258
+ entity: @entity
222
259
  mode: @config.mode
223
260
  fields: @config.fields
224
261
  initialData: @payload.data
@@ -261,11 +298,19 @@ orbital FormOrbital {
261
298
  @description "Callback when any field value changes"
262
299
  @tier "essential"
263
300
  FormLoaded
264
- @description "Form rows finished loading; payload.data holds the collection."
301
+ @description "Form row finished loading; payload.data holds the single row."
265
302
  @synonyms "loaded, fetched, retrieved"
266
303
  @tier "essential"
267
304
  }
268
305
 
306
+ listens {
307
+ INIT {
308
+ id : string
309
+ }
310
+ @description "Mount payload; a host that routes to this panel by id (a :id page param) passes it here."
311
+ @tier "internal"
312
+ }
313
+
269
314
  config {
270
315
  children : node
271
316
  @label "Children"
@@ -380,8 +425,8 @@ orbital FormOrbital {
380
425
  @description "Whether the form supports repeatable entries"
381
426
  @tier "presentation"
382
427
  selfFetch : boolean = true
383
- @label "Fetch its own rows on mount?"
384
- @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
428
+ @label "Fetch its own row on mount?"
429
+ @description "true (default) = a mount that carries an id loads that one row (never the collection); a create-mode mount skips the load. false = a composing atom owns the load."
385
430
  @tier "internal"
386
431
  }
387
432
  }
@@ -23,6 +23,7 @@ orbital MediaGalleryOrbital {
23
23
  event : event
24
24
  navigatesTo : string
25
25
  variant : "primary" | "secondary" | "ghost"
26
+ roles : [string]
26
27
  }
27
28
 
28
29
  entity MediaGalleryItem [runtime] {
@@ -55,7 +56,7 @@ orbital MediaGalleryOrbital {
55
56
  selectedItems: @config.selectedItems
56
57
  selectionEvent: @config.selectionEvent
57
58
  showUpload: @config.showUpload
58
- actions: @config.actions
59
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
59
60
  aspectRatio: @config.aspectRatio
60
61
  type: media-gallery
61
62
  })
@@ -80,7 +81,7 @@ orbital MediaGalleryOrbital {
80
81
  selectedItems: @config.selectedItems
81
82
  selectionEvent: @config.selectionEvent
82
83
  showUpload: @config.showUpload
83
- actions: @config.actions
84
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
84
85
  aspectRatio: @config.aspectRatio
85
86
  type: media-gallery
86
87
  })
@@ -105,7 +106,7 @@ orbital MediaGalleryOrbital {
105
106
  selectedItems: @config.selectedItems
106
107
  selectionEvent: @config.selectionEvent
107
108
  showUpload: @config.showUpload
108
- actions: @config.actions
109
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
109
110
  aspectRatio: @config.aspectRatio
110
111
  type: media-gallery
111
112
  })
@@ -205,6 +206,10 @@ orbital MediaGalleryOrbital {
205
206
  @label "Aspect Ratio"
206
207
  @description "Aspect ratio for thumbnails"
207
208
  @tier "presentation"
209
+ viewerRole : string = ""
210
+ @label "Viewer's role"
211
+ @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show."
212
+ @tier "policy"
208
213
  selfFetch : boolean = true
209
214
  @label "Fetch its own rows on mount?"
210
215
  @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
@@ -33,6 +33,12 @@ orbital StateMachineViewOrbital {
33
33
  code : string
34
34
  stack : string
35
35
  }
36
+ type StateMachineViewTRANSITIONCLICKTransition = {
37
+ index : number!
38
+ event : string!
39
+ from : string!
40
+ to : string!
41
+ }
36
42
 
37
43
  entity StateMachineViewItem [runtime] {
38
44
  id : string!
@@ -49,6 +55,7 @@ orbital StateMachineViewOrbital {
49
55
  visitedStates: @config.visitedStates
50
56
  stateClickEvent: @config.stateClickEvent
51
57
  transitionClickEvent: @config.transitionClickEvent
58
+ onTransitionClick: @config.onTransitionClick
52
59
  selectedState: @config.selectedState
53
60
  pendingSourceState: @config.pendingSourceState
54
61
  nodeShape: @config.nodeShape
@@ -74,6 +81,7 @@ orbital StateMachineViewOrbital {
74
81
  event : string!
75
82
  from : string!
76
83
  to : string!
84
+ transition : StateMachineViewTRANSITIONCLICKTransition
77
85
  }
78
86
  @description "Emits UI:{transitionClickEvent} with { index, event, from, to } when a transition label is clicked."
79
87
  @tier "essential"
@@ -100,6 +108,10 @@ orbital StateMachineViewOrbital {
100
108
  @label "Transition Click Event"
101
109
  @description "Emits UI:{transitionClickEvent} with { index, event, from, to } when a transition label is clicked."
102
110
  @tier "presentation"
111
+ onTransitionClick : event = "TRANSITION_CLICK"
112
+ @label "On Transition Click"
113
+ @description "Direct transition-click callback, for React hosts (e.g. a canvas node)."
114
+ @tier "presentation"
103
115
  selectedState : string
104
116
  @label "Selected State"
105
117
  @description "State picked in an editor (first click)."
@@ -23,6 +23,7 @@ orbital TimelineOrbital {
23
23
  event : event
24
24
  navigatesTo : string
25
25
  variant : "primary" | "secondary" | "ghost"
26
+ roles : [string]
26
27
  }
27
28
 
28
29
  entity TimelineItem [runtime] {
@@ -43,7 +44,7 @@ orbital TimelineOrbital {
43
44
  title: @config.title
44
45
  items: @config.items
45
46
  fields: @config.fields
46
- itemActions: @config.itemActions
47
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
47
48
  look: @config.look
48
49
  type: timeline
49
50
  })
@@ -56,7 +57,7 @@ orbital TimelineOrbital {
56
57
  title: @config.title
57
58
  items: @config.items
58
59
  fields: @config.fields
59
- itemActions: @config.itemActions
60
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
60
61
  look: @config.look
61
62
  type: timeline
62
63
  })
@@ -69,7 +70,7 @@ orbital TimelineOrbital {
69
70
  title: @config.title
70
71
  items: @config.items
71
72
  fields: @config.fields
72
- itemActions: @config.itemActions
73
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
73
74
  look: @config.look
74
75
  type: timeline
75
76
  })
@@ -121,6 +122,10 @@ orbital TimelineOrbital {
121
122
  @label "Look"
122
123
  @description "Layer 2 visual treatment."
123
124
  @tier "presentation"
125
+ viewerRole : string = ""
126
+ @label "Viewer's role"
127
+ @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show."
128
+ @tier "policy"
124
129
  selfFetch : boolean = true
125
130
  @label "Fetch its own rows on mount?"
126
131
  @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
@@ -2,8 +2,6 @@ app ui-counter-template "1.0.0"
2
2
  "CounterTemplate — UI factory (1:1 with the @almadar/ui counter-template pattern)."
3
3
  ;; @pattern "counter-template"
4
4
  orbital CounterTemplateOrbital {
5
- type CounterTemplateLoaded = Event { data : [CounterTemplateItem] } "CounterTemplate rows finished loading; payload.data holds the collection"
6
-
7
5
  entity CounterTemplateItem [runtime] {
8
6
  id : string!
9
7
  count : number = 1
@@ -18,24 +16,8 @@ orbital CounterTemplateOrbital {
18
16
  initial: idle
19
17
 
20
18
  state idle {
21
- INIT -> idle when @config.selfFetch
22
- (fetch CounterTemplateItem { emit: { success: CounterTemplateLoaded } })
23
- (render-ui main {
24
- entity: @entity
25
- className: @config.className
26
- onIncrement: @config.onIncrement
27
- onDecrement: @config.onDecrement
28
- onReset: @config.onReset
29
- incrementEvent: @config.incrementEvent
30
- decrementEvent: @config.decrementEvent
31
- resetEvent: @config.resetEvent
32
- title: @config.title
33
- showReset: @config.showReset
34
- size: @config.size
35
- variant: @config.variant
36
- type: counter-template
37
- })
38
- INIT -> idle when (not @config.selfFetch)
19
+ INIT -> idle
20
+ (fetch CounterTemplateItem {})
39
21
  (render-ui main {
40
22
  entity: @entity
41
23
  className: @config.className
@@ -51,22 +33,6 @@ orbital CounterTemplateOrbital {
51
33
  variant: @config.variant
52
34
  type: counter-template
53
35
  })
54
- CounterTemplateLoaded -> idle
55
- (render-ui main {
56
- entity: @payload.data
57
- className: @config.className
58
- onIncrement: @config.onIncrement
59
- onDecrement: @config.onDecrement
60
- onReset: @config.onReset
61
- incrementEvent: @config.incrementEvent
62
- decrementEvent: @config.decrementEvent
63
- resetEvent: @config.resetEvent
64
- title: @config.title
65
- showReset: @config.showReset
66
- size: @config.size
67
- variant: @config.variant
68
- type: counter-template
69
- })
70
36
  }
71
37
 
72
38
  emits {
@@ -79,10 +45,6 @@ orbital CounterTemplateOrbital {
79
45
  @config.onReset -> external { }
80
46
  @description "Called when reset is clicked"
81
47
  @tier "essential"
82
- CounterTemplateLoaded
83
- @description "CounterTemplate rows finished loading; payload.data holds the collection."
84
- @synonyms "loaded, fetched, retrieved"
85
- @tier "essential"
86
48
  }
87
49
 
88
50
  config {
@@ -130,10 +92,6 @@ orbital CounterTemplateOrbital {
130
92
  @label "Variant"
131
93
  @description "Template variant"
132
94
  @tier "presentation"
133
- selfFetch : boolean = true
134
- @label "Fetch its own rows on mount?"
135
- @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
136
- @tier "internal"
137
95
  }
138
96
  }
139
97
 
@@ -21,6 +21,7 @@ orbital DashboardLayoutOrbital {
21
21
  navigatesTo : string
22
22
  badge : string
23
23
  variant : "default" | "primary" | "danger"
24
+ roles : [string]
24
25
  }
25
26
  type DashboardLayoutNotificationsItem = {
26
27
  id : string!
@@ -48,7 +49,7 @@ orbital DashboardLayoutOrbital {
48
49
  showSearch: @config.showSearch
49
50
  searchEvent: @config.searchEvent
50
51
  onSearchSubmit: @config.onSearchSubmit
51
- topBarActions: @config.topBarActions
52
+ topBarActions: (array/filter @config.topBarActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
52
53
  notifications: @config.notifications
53
54
  notificationClickEvent: @config.notificationClickEvent
54
55
  onNotificationClick: @config.onNotificationClick
@@ -159,6 +160,10 @@ orbital DashboardLayoutOrbital {
159
160
  @label "Children"
160
161
  @description "Page content rendered inside the main area"
161
162
  @tier "presentation"
163
+ viewerRole : string = ""
164
+ @label "Viewer's role"
165
+ @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show."
166
+ @tier "policy"
162
167
  }
163
168
  }
164
169
 
@@ -2,8 +2,6 @@ app ui-generic-app-template "1.0.0"
2
2
  "GenericAppTemplate — UI factory (1:1 with the @almadar/ui generic-app-template pattern)."
3
3
  ;; @pattern "generic-app-template"
4
4
  orbital GenericAppTemplateOrbital {
5
- type GenericAppTemplateLoaded = Event { data : [GenericAppTemplateItem] } "GenericAppTemplate rows finished loading; payload.data holds the collection"
6
-
7
5
  entity GenericAppTemplateItem [runtime] {
8
6
  id : string!
9
7
  }
@@ -12,19 +10,8 @@ orbital GenericAppTemplateOrbital {
12
10
  initial: idle
13
11
 
14
12
  state idle {
15
- INIT -> idle when @config.selfFetch
16
- (fetch GenericAppTemplateItem { emit: { success: GenericAppTemplateLoaded } })
17
- (render-ui main {
18
- entity: @entity
19
- className: @config.className
20
- title: @config.title
21
- subtitle: @config.subtitle
22
- children: @config.children
23
- headerActions: @config.headerActions
24
- footer: @config.footer
25
- type: generic-app-template
26
- })
27
- INIT -> idle when (not @config.selfFetch)
13
+ INIT -> idle
14
+ (fetch GenericAppTemplateItem {})
28
15
  (render-ui main {
29
16
  entity: @entity
30
17
  className: @config.className
@@ -35,24 +22,6 @@ orbital GenericAppTemplateOrbital {
35
22
  footer: @config.footer
36
23
  type: generic-app-template
37
24
  })
38
- GenericAppTemplateLoaded -> idle
39
- (render-ui main {
40
- entity: @payload.data
41
- className: @config.className
42
- title: @config.title
43
- subtitle: @config.subtitle
44
- children: @config.children
45
- headerActions: @config.headerActions
46
- footer: @config.footer
47
- type: generic-app-template
48
- })
49
- }
50
-
51
- emits {
52
- GenericAppTemplateLoaded
53
- @description "GenericAppTemplate rows finished loading; payload.data holds the collection."
54
- @synonyms "loaded, fetched, retrieved"
55
- @tier "essential"
56
25
  }
57
26
 
58
27
  config {
@@ -80,10 +49,6 @@ orbital GenericAppTemplateOrbital {
80
49
  @label "Footer"
81
50
  @description "Footer content"
82
51
  @tier "presentation"
83
- selfFetch : boolean = true
84
- @label "Fetch its own rows on mount?"
85
- @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
86
- @tier "internal"
87
52
  }
88
53
  }
89
54
 
@@ -10,6 +10,7 @@ orbital GameMenuOrbital {
10
10
  variant : string
11
11
  disabled : boolean
12
12
  subLabel : string
13
+ roles : [string]
13
14
  }
14
15
  type GameMenuMenuItemsItem = {
15
16
  id : string
@@ -19,6 +20,7 @@ orbital GameMenuOrbital {
19
20
  variant : string
20
21
  disabled : boolean
21
22
  subLabel : string
23
+ roles : [string]
22
24
  }
23
25
  type GameMenuLogo = {
24
26
  url : asset!
@@ -56,8 +58,8 @@ orbital GameMenuOrbital {
56
58
  (render-ui main {
57
59
  title: @config.title
58
60
  subtitle: @config.subtitle
59
- options: @config.options
60
- menuItems: @config.menuItems
61
+ options: (array/filter @config.options (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
62
+ menuItems: (array/filter @config.menuItems (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
61
63
  onSelect: @config.onSelect
62
64
  background: @config.background
63
65
  logo: @config.logo
@@ -107,6 +109,10 @@ orbital GameMenuOrbital {
107
109
  @label "Class Name"
108
110
  @description "Additional CSS classes"
109
111
  @tier "presentation"
112
+ viewerRole : string = ""
113
+ @label "Viewer's role"
114
+ @description "The viewer's role that each action's `roles` is checked against; bind it at the call site (e.g. `viewerRole: @user.role`). Empty = only actions with no `roles` show."
115
+ @tier "policy"
110
116
  }
111
117
  }
112
118
 
@@ -215,7 +215,7 @@ orbital ArcadeBoard3DFrameOrbital {
215
215
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
216
216
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (/ (object/get @u health) (object/get @u maxHealth))), height: 0.12, fill: "#22c55e" })) }
217
217
  { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) }
218
- { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
218
+ { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets, sprites: (object/get @config.assetManifest effects) }
219
219
  ] } ]
220
220
  })
221
221
 
@@ -261,7 +261,7 @@ orbital ArcadeBoard3DFrameOrbital {
261
261
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: 0.8, height: 0.12, fill: "rgba(0,0,0,0.6)" })) }
262
262
  { type: draw-shape-layer, items: (array/map @entity.units (fn u { type: draw-shape, shape: "rect", position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.6, width: (* 0.8 (/ (object/get @u health) (object/get @u maxHealth))), height: 0.12, fill: "#22c55e" })) }
263
263
  { type: draw-text-layer, items: (array/map @entity.units (fn u { type: draw-text, text: (object/get @u name), position: { x: (object/get (object/get @u position) x), y: (object/get (object/get @u position) y), z: (object/get @u z) }, offsetY: -0.85, color: "#ffffff" })) }
264
- { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets }
264
+ { type: draw-fx-layer, items: @entity.fx, tickMs: 500, presets: @config.fxPresets, sprites: (object/get @config.assetManifest effects) }
265
265
  ] } ]
266
266
  })
267
267
 
@@ -299,10 +299,6 @@ orbital CrewBoard2DOrbital {
299
299
  @label "Show Minimap"
300
300
  @description "Whether the canvas draws a minimap."
301
301
  @tier "presentation"
302
- scale : number = 1
303
- @label "Scale"
304
- @description "Canvas render scale."
305
- @tier "presentation"
306
302
  backgroundAsset : Asset = {}
307
303
  @label "Background Asset"
308
304
  @description "Game-shell background panel sprite (theme chrome)."