@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
@@ -4,6 +4,10 @@ app ui-data-grid "1.0.0"
4
4
  ;; @pattern "data-grid"
5
5
  orbital DataGridOrbital {
6
6
  type DataGridLoaded = Event { data : [DataGridItem] } "DataGrid rows finished loading; payload.data holds the collection"
7
+ type DataGridEmptyAction = {
8
+ label : string!
9
+ event : event
10
+ }
7
11
  type DataGridFieldsItem = {
8
12
  name : string!
9
13
  label : string
@@ -26,6 +30,8 @@ orbital DataGridOrbital {
26
30
  navigatesTo : string
27
31
  icon : icon
28
32
  variant : "primary" | "secondary" | "ghost" | "danger"
33
+ when : SExpr
34
+ roles : [string]
29
35
  }
30
36
  type DataGridError = {
31
37
  message : string!
@@ -59,10 +65,14 @@ orbital DataGridOrbital {
59
65
  positionEvent: @config.positionEvent
60
66
  dndItemIdField: @config.dndItemIdField
61
67
  dndRoot: @config.dndRoot
68
+ emptyIcon: @config.emptyIcon
69
+ emptyTitle: @config.emptyTitle
70
+ emptyDescription: @config.emptyDescription
71
+ emptyAction: @config.emptyAction
62
72
  entity: @entity
63
73
  fields: @config.fields
64
74
  columns: @config.columns
65
- itemActions: @config.itemActions
75
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
66
76
  maxInlineActions: @config.maxInlineActions
67
77
  scrollX: @config.scrollX
68
78
  cols: @config.cols
@@ -92,10 +102,14 @@ orbital DataGridOrbital {
92
102
  positionEvent: @config.positionEvent
93
103
  dndItemIdField: @config.dndItemIdField
94
104
  dndRoot: @config.dndRoot
105
+ emptyIcon: @config.emptyIcon
106
+ emptyTitle: @config.emptyTitle
107
+ emptyDescription: @config.emptyDescription
108
+ emptyAction: @config.emptyAction
95
109
  entity: @entity
96
110
  fields: @config.fields
97
111
  columns: @config.columns
98
- itemActions: @config.itemActions
112
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
99
113
  maxInlineActions: @config.maxInlineActions
100
114
  scrollX: @config.scrollX
101
115
  cols: @config.cols
@@ -125,10 +139,14 @@ orbital DataGridOrbital {
125
139
  positionEvent: @config.positionEvent
126
140
  dndItemIdField: @config.dndItemIdField
127
141
  dndRoot: @config.dndRoot
142
+ emptyIcon: @config.emptyIcon
143
+ emptyTitle: @config.emptyTitle
144
+ emptyDescription: @config.emptyDescription
145
+ emptyAction: @config.emptyAction
128
146
  entity: @payload.data
129
147
  fields: @config.fields
130
148
  columns: @config.columns
131
- itemActions: @config.itemActions
149
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
132
150
  maxInlineActions: @config.maxInlineActions
133
151
  scrollX: @config.scrollX
134
152
  cols: @config.cols
@@ -204,6 +222,22 @@ orbital DataGridOrbital {
204
222
  @label "Dnd Root"
205
223
  @description "Mark this container as the DnD root for its subtree — descendant zones share one DndContext (cross-container drag). Use on an outer container whose own items are not draggable."
206
224
  @tier "presentation"
225
+ emptyIcon : icon
226
+ @label "Empty Icon"
227
+ @description "Domain icon for the empty state."
228
+ @tier "presentation"
229
+ emptyTitle : string
230
+ @label "Empty Title"
231
+ @description "Specific title ('No orders yet')."
232
+ @tier "presentation"
233
+ emptyDescription : string
234
+ @label "Empty Description"
235
+ @description "What will appear here once rows exist."
236
+ @tier "presentation"
237
+ emptyAction : DataGridEmptyAction
238
+ @label "Empty Action"
239
+ @description "Create-the-first-item action."
240
+ @tier "presentation"
207
241
  fields : [DataGridFieldsItem] = []
208
242
  @label "Fields"
209
243
  @description "Field definitions for rendering each card. The pattern contract in `@almadar/core/patterns` documents `columns` as the wire-format alias the compiler emits — both names resolve to the same shape here. Pass either."
@@ -284,6 +318,10 @@ orbital DataGridOrbital {
284
318
  @label "Relations Data"
285
319
  @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a field whose type is relation. Same contract DetailPanel takes."
286
320
  @tier "presentation"
321
+ viewerRole : string = ""
322
+ @label "Viewer's role"
323
+ @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."
324
+ @tier "policy"
287
325
  selfFetch : boolean = true
288
326
  @label "Fetch its own rows on mount?"
289
327
  @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."
@@ -3,6 +3,10 @@ app ui-data-list "1.0.0"
3
3
  ;; @pattern "data-list"
4
4
  orbital DataListOrbital {
5
5
  type DataListLoaded = Event { data : [DataListItem] } "DataList rows finished loading; payload.data holds the collection"
6
+ type DataListEmptyAction = {
7
+ label : string!
8
+ event : event
9
+ }
6
10
  type DataListFieldsItem = {
7
11
  name : string!
8
12
  label : string
@@ -22,6 +26,8 @@ orbital DataListOrbital {
22
26
  event : event!
23
27
  icon : icon
24
28
  variant : "primary" | "secondary" | "ghost" | "danger"
29
+ when : SExpr
30
+ roles : [string]
25
31
  }
26
32
  type DataListError = {
27
33
  message : string!
@@ -65,10 +71,14 @@ orbital DataListOrbital {
65
71
  positionEvent: @config.positionEvent
66
72
  dndItemIdField: @config.dndItemIdField
67
73
  dndRoot: @config.dndRoot
74
+ emptyIcon: @config.emptyIcon
75
+ emptyTitle: @config.emptyTitle
76
+ emptyDescription: @config.emptyDescription
77
+ emptyAction: @config.emptyAction
68
78
  entity: @entity
69
79
  fields: @config.fields
70
80
  columns: @config.columns
71
- itemActions: @config.itemActions
81
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
72
82
  maxInlineActions: @config.maxInlineActions
73
83
  itemClickEvent: @config.itemClickEvent
74
84
  gap: @config.gap
@@ -107,10 +117,14 @@ orbital DataListOrbital {
107
117
  positionEvent: @config.positionEvent
108
118
  dndItemIdField: @config.dndItemIdField
109
119
  dndRoot: @config.dndRoot
120
+ emptyIcon: @config.emptyIcon
121
+ emptyTitle: @config.emptyTitle
122
+ emptyDescription: @config.emptyDescription
123
+ emptyAction: @config.emptyAction
110
124
  entity: @entity
111
125
  fields: @config.fields
112
126
  columns: @config.columns
113
- itemActions: @config.itemActions
127
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
114
128
  maxInlineActions: @config.maxInlineActions
115
129
  itemClickEvent: @config.itemClickEvent
116
130
  gap: @config.gap
@@ -149,10 +163,14 @@ orbital DataListOrbital {
149
163
  positionEvent: @config.positionEvent
150
164
  dndItemIdField: @config.dndItemIdField
151
165
  dndRoot: @config.dndRoot
166
+ emptyIcon: @config.emptyIcon
167
+ emptyTitle: @config.emptyTitle
168
+ emptyDescription: @config.emptyDescription
169
+ emptyAction: @config.emptyAction
152
170
  entity: @payload.data
153
171
  fields: @config.fields
154
172
  columns: @config.columns
155
- itemActions: @config.itemActions
173
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
156
174
  maxInlineActions: @config.maxInlineActions
157
175
  itemClickEvent: @config.itemClickEvent
158
176
  gap: @config.gap
@@ -250,6 +268,22 @@ orbital DataListOrbital {
250
268
  @label "Dnd Root"
251
269
  @description "Mark this container as the DnD root for its subtree — descendant zones share one DndContext (cross-container drag). Use on an outer container whose own items are not draggable."
252
270
  @tier "presentation"
271
+ emptyIcon : icon
272
+ @label "Empty Icon"
273
+ @description "Domain icon for the empty state."
274
+ @tier "presentation"
275
+ emptyTitle : string
276
+ @label "Empty Title"
277
+ @description "Specific title ('No orders yet')."
278
+ @tier "presentation"
279
+ emptyDescription : string
280
+ @label "Empty Description"
281
+ @description "What will appear here once rows exist."
282
+ @tier "presentation"
283
+ emptyAction : DataListEmptyAction
284
+ @label "Empty Action"
285
+ @description "Create-the-first-item action."
286
+ @tier "presentation"
253
287
  fields : [DataListFieldsItem] = []
254
288
  @label "Fields"
255
289
  @description "Field definitions for rendering each row. The pattern contract in `@almadar/core/patterns` documents `columns` as the wire-format alias the compiler emits — both names resolve to the same shape here. Pass either."
@@ -366,6 +400,10 @@ orbital DataListOrbital {
366
400
  @label "Relations Data"
367
401
  @description "Relation display data: { fieldName: [{value, label}] } — injected server-side by the runtime (relation-option injection) or bound by compiled codegen; resolves stored foreign ids to display names for a field whose type is relation. Same contract DetailPanel takes."
368
402
  @tier "presentation"
403
+ viewerRole : string = ""
404
+ @label "Viewer's role"
405
+ @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."
406
+ @tier "policy"
369
407
  selfFetch : boolean = true
370
408
  @label "Fetch its own rows on mount?"
371
409
  @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."
@@ -3,7 +3,7 @@ app ui-document-details "1.0.0"
3
3
  ;; @capabilities "document settings, page details, post settings sidebar, metadata panel, document properties, publish settings"
4
4
  ;; @pattern "document-details"
5
5
  orbital DocumentDetailsOrbital {
6
- type DocumentDetailsLoaded = Event { data : [DocumentDetailsItem] } "DocumentDetails rows finished loading; payload.data holds the collection"
6
+ type DocumentDetailsLoaded = Event { data : DocumentDetailsItem } "DocumentDetails row finished loading; payload.data holds the single row"
7
7
  type DocumentDetailsFieldsItem = {
8
8
  name : string
9
9
  key : string
@@ -28,11 +28,11 @@ orbital DocumentDetailsOrbital {
28
28
  }
29
29
 
30
30
  trait DocumentDetailsRender -> @rebindable DocumentDetailsItem [interaction, instance] {
31
- initial: idle
31
+ initial: resolving
32
32
 
33
- state idle {
34
- INIT -> idle when @config.selfFetch
35
- (fetch DocumentDetailsItem { emit: { success: DocumentDetailsLoaded } })
33
+ state resolving {
34
+ INIT -> idle when (and @config.selfFetch (!= (str/default ?id "") ""))
35
+ (fetch DocumentDetailsItem { id: ?id, emit: { success: DocumentDetailsLoaded } })
36
36
  (render-ui main {
37
37
  entity: @entity
38
38
  fields: @config.fields
@@ -42,7 +42,20 @@ orbital DocumentDetailsOrbital {
42
42
  className: @config.className
43
43
  type: document-details
44
44
  })
45
- INIT -> idle when (not @config.selfFetch)
45
+ INIT -> idle when (not (and @config.selfFetch (!= (str/default ?id "") "")))
46
+ (render-ui main {
47
+ entity: @entity
48
+ fields: @config.fields
49
+ metaCommitEvent: @config.metaCommitEvent
50
+ relationEvent: @config.relationEvent
51
+ title: @config.title
52
+ className: @config.className
53
+ type: document-details
54
+ })
55
+ }
56
+
57
+ state idle {
58
+ INIT -> idle
46
59
  (render-ui main {
47
60
  entity: @entity
48
61
  fields: @config.fields
@@ -79,11 +92,19 @@ orbital DocumentDetailsOrbital {
79
92
  @description "Makes relation chips clickable: emitted with { field, id, name } when a hydrated relation value (or one row of a many-relation) is clicked — the host routes it to the linked record's own surface."
80
93
  @tier "essential"
81
94
  DocumentDetailsLoaded
82
- @description "DocumentDetails rows finished loading; payload.data holds the collection."
95
+ @description "DocumentDetails row finished loading; payload.data holds the single row."
83
96
  @synonyms "loaded, fetched, retrieved"
84
97
  @tier "essential"
85
98
  }
86
99
 
100
+ listens {
101
+ INIT {
102
+ id : string
103
+ }
104
+ @description "Mount payload; a host that routes to this panel by id (a :id page param) passes it here."
105
+ @tier "internal"
106
+ }
107
+
87
108
  config {
88
109
  fields : [DocumentDetailsFieldsItem] = []
89
110
  @label "Fields"
@@ -106,8 +127,8 @@ orbital DocumentDetailsOrbital {
106
127
  @description "className prop"
107
128
  @tier "presentation"
108
129
  selfFetch : boolean = true
109
- @label "Fetch its own rows on mount?"
110
- @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."
130
+ @label "Fetch its own row on mount?"
131
+ @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."
111
132
  @tier "internal"
112
133
  }
113
134
  }
@@ -8,6 +8,7 @@ orbital DocumentPanelOrbital {
8
8
  event : event
9
9
  icon : icon
10
10
  variant : "primary" | "secondary" | "ghost" | "danger"
11
+ roles : [string]
11
12
  }
12
13
 
13
14
  entity DocumentPanelItem [runtime] {
@@ -29,7 +30,7 @@ orbital DocumentPanelOrbital {
29
30
  coverImage: @config.coverImage
30
31
  icon: @config.icon
31
32
  value: @entity.value
32
- actions: @config.actions
33
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
33
34
  maxInlineActions: @config.maxInlineActions
34
35
  editing: @config.editing
35
36
  titleCommitEvent: @config.titleCommitEvent
@@ -51,7 +52,7 @@ orbital DocumentPanelOrbital {
51
52
  coverImage: @config.coverImage
52
53
  icon: @config.icon
53
54
  value: @entity.value
54
- actions: @config.actions
55
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
55
56
  maxInlineActions: @config.maxInlineActions
56
57
  editing: @config.editing
57
58
  titleCommitEvent: @config.titleCommitEvent
@@ -73,7 +74,7 @@ orbital DocumentPanelOrbital {
73
74
  coverImage: @config.coverImage
74
75
  icon: @config.icon
75
76
  value: @entity.value
76
- actions: @config.actions
77
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
77
78
  maxInlineActions: @config.maxInlineActions
78
79
  editing: @config.editing
79
80
  titleCommitEvent: @config.titleCommitEvent
@@ -192,6 +193,10 @@ orbital DocumentPanelOrbital {
192
193
  @label "Class Name"
193
194
  @description "className prop"
194
195
  @tier "presentation"
196
+ viewerRole : string = ""
197
+ @label "Viewer's role"
198
+ @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."
199
+ @tier "policy"
195
200
  }
196
201
  }
197
202
 
@@ -7,6 +7,7 @@ orbital DocumentViewerOrbital {
7
7
  event : event
8
8
  navigatesTo : string
9
9
  variant : "primary" | "secondary" | "ghost"
10
+ roles : [string]
10
11
  }
11
12
  type DocumentViewerDocumentsItem = {
12
13
  label : string!
@@ -41,7 +42,7 @@ orbital DocumentViewerOrbital {
41
42
  showToolbar: @config.showToolbar
42
43
  showDownload: @config.showDownload
43
44
  showPrint: @config.showPrint
44
- actions: @config.actions
45
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
45
46
  documents: @config.documents
46
47
  isLoading: @config.isLoading
47
48
  error: @config.error
@@ -111,6 +112,10 @@ orbital DocumentViewerOrbital {
111
112
  @label "Class Name"
112
113
  @description "Additional CSS classes"
113
114
  @tier "presentation"
115
+ viewerRole : string = ""
116
+ @label "Viewer's role"
117
+ @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."
118
+ @tier "policy"
114
119
  }
115
120
  }
116
121
 
@@ -19,6 +19,8 @@ orbital DrawerOrbital {
19
19
  OPEN -> open
20
20
  (render-ui drawer {
21
21
  isOpen: @config.isOpen
22
+ onExited: @config.onExited
23
+ contained: @config.contained
22
24
  onClose: @config.onClose
23
25
  title: @config.title
24
26
  children: @config.children
@@ -45,6 +47,9 @@ orbital DrawerOrbital {
45
47
  }
46
48
 
47
49
  emits {
50
+ @config.onExited -> external { }
51
+ @description "Fires after the exit animation completes (the drawer is about to unmount)."
52
+ @tier "essential"
48
53
  @config.onClose -> external { }
49
54
  @description "Callback when drawer should close (injected by slot wrapper)"
50
55
  @tier "essential"
@@ -60,6 +65,14 @@ orbital DrawerOrbital {
60
65
  @label "Is Open"
61
66
  @description "Whether the drawer is open (defaults to true when rendered by slot wrapper)"
62
67
  @tier "presentation"
68
+ onExited : event = "EXITED"
69
+ @label "On Exited"
70
+ @description "Fires after the exit animation completes (the drawer is about to unmount)."
71
+ @tier "presentation"
72
+ contained : boolean = false
73
+ @label "Contained"
74
+ @description "Render inside the nearest positioned ancestor (a preview frame) instead of over the window."
75
+ @tier "presentation"
63
76
  onClose : event = "CLOSE"
64
77
  @label "On Close"
65
78
  @description "Callback when drawer should close (injected by slot wrapper)"
@@ -8,6 +8,7 @@ orbital FloatingActionButtonOrbital {
8
8
  icon : icon!
9
9
  event : event
10
10
  variant : "primary" | "secondary" | "success" | "danger" | "warning"
11
+ roles : [string]
11
12
  }
12
13
 
13
14
  entity FloatingActionButtonItem [runtime] {
@@ -22,7 +23,7 @@ orbital FloatingActionButtonOrbital {
22
23
  (render-ui main {
23
24
  action: @config.action
24
25
  actionPayload: @config.actionPayload
25
- actions: @config.actions
26
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
26
27
  icon: @config.icon
27
28
  onClick: @config.onClick
28
29
  variant: @config.variant
@@ -79,6 +80,10 @@ orbital FloatingActionButtonOrbital {
79
80
  @label "Class Name"
80
81
  @description "Additional CSS classes"
81
82
  @tier "presentation"
83
+ viewerRole : string = ""
84
+ @label "Viewer's role"
85
+ @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."
86
+ @tier "policy"
82
87
  }
83
88
  }
84
89
 
@@ -12,6 +12,7 @@ orbital FloatingToolbarOrbital {
12
12
  active : boolean
13
13
  disabled : boolean
14
14
  testId : string
15
+ roles : [string]
15
16
  }
16
17
 
17
18
  entity FloatingToolbarItem [runtime] {
@@ -24,7 +25,7 @@ orbital FloatingToolbarOrbital {
24
25
  state idle {
25
26
  INIT -> idle
26
27
  (render-ui main {
27
- items: @config.items
28
+ items: (array/filter @config.items (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
28
29
  position: @config.position
29
30
  children: @config.children
30
31
  className: @config.className
@@ -49,6 +50,10 @@ orbital FloatingToolbarOrbital {
49
50
  @label "Class Name"
50
51
  @description "Additional CSS classes on the positioned root"
51
52
  @tier "presentation"
53
+ viewerRole : string = ""
54
+ @label "Viewer's role"
55
+ @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."
56
+ @tier "policy"
52
57
  }
53
58
  }
54
59
 
@@ -15,6 +15,7 @@ orbital FormActionsOrbital {
15
15
  event : event
16
16
  navigatesTo : string
17
17
  variant : string
18
+ roles : [string]
18
19
  }
19
20
  type FormActionsFiltersItem = {
20
21
  field : string!
@@ -40,7 +41,7 @@ orbital FormActionsOrbital {
40
41
  (render-ui main {
41
42
  children: @config.children
42
43
  primary: @config.primary
43
- secondary: @config.secondary
44
+ secondary: (array/filter @config.secondary (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
44
45
  variant: @config.variant
45
46
  orientation: @config.orientation
46
47
  className: @config.className
@@ -84,6 +85,10 @@ orbital FormActionsOrbital {
84
85
  @label "Look"
85
86
  @description "Layer 2 visual treatment for the action-cluster (form-actions) pattern."
86
87
  @tier "presentation"
88
+ viewerRole : string = ""
89
+ @label "Viewer's role"
90
+ @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."
91
+ @tier "policy"
87
92
  }
88
93
  }
89
94
 
@@ -41,6 +41,7 @@ orbital GraphCanvasOrbital {
41
41
  event : event
42
42
  navigatesTo : string
43
43
  variant : "primary" | "secondary" | "ghost"
44
+ roles : [string]
44
45
  }
45
46
  type GraphCanvasError = {
46
47
  message : string!
@@ -128,7 +129,7 @@ orbital GraphCanvasOrbital {
128
129
  showLabels: @config.showLabels
129
130
  interactive: @config.interactive
130
131
  draggable: @config.draggable
131
- actions: @config.actions
132
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
132
133
  onNodeClick: @config.onNodeClick
133
134
  onMarkClick: @config.onMarkClick
134
135
  onNodeDoubleClick: @config.onNodeDoubleClick
@@ -268,6 +269,10 @@ orbital GraphCanvasOrbital {
268
269
  @label "Class Name"
269
270
  @description "Additional CSS classes"
270
271
  @tier "presentation"
272
+ viewerRole : string = ""
273
+ @label "Viewer's role"
274
+ @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."
275
+ @tier "policy"
271
276
  }
272
277
  }
273
278
 
@@ -14,6 +14,7 @@ orbital MenuOrbital {
14
14
  url : string
15
15
  variant : "default" | "danger"
16
16
  subMenu : [MenuItemsItem]
17
+ roles : [string]
17
18
  }
18
19
 
19
20
  entity MenuItem [runtime] {
@@ -27,7 +28,7 @@ orbital MenuOrbital {
27
28
  INIT -> idle
28
29
  (render-ui main {
29
30
  trigger: @config.trigger
30
- items: @config.items
31
+ items: (array/filter @config.items (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
31
32
  position: @config.position
32
33
  className: @config.className
33
34
  header: @config.header
@@ -61,6 +62,10 @@ orbital MenuOrbital {
61
62
  @label "Footer"
62
63
  @description "Optional slot rendered below the items."
63
64
  @tier "presentation"
65
+ viewerRole : string = ""
66
+ @label "Viewer's role"
67
+ @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."
68
+ @tier "policy"
64
69
  }
65
70
  }
66
71
 
@@ -12,6 +12,7 @@ orbital MeterOrbital {
12
12
  event : event
13
13
  navigatesTo : string
14
14
  variant : "primary" | "secondary" | "ghost"
15
+ roles : [string]
15
16
  }
16
17
  type MeterError = {
17
18
  message : string!
@@ -40,7 +41,7 @@ orbital MeterOrbital {
40
41
  segments: @config.segments
41
42
  showValue: @config.showValue
42
43
  size: @config.size
43
- actions: @config.actions
44
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
44
45
  isLoading: @config.isLoading
45
46
  error: @config.error
46
47
  className: @config.className
@@ -105,6 +106,10 @@ orbital MeterOrbital {
105
106
  @label "Class Name"
106
107
  @description "Additional CSS classes"
107
108
  @tier "presentation"
109
+ viewerRole : string = ""
110
+ @label "Viewer's role"
111
+ @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."
112
+ @tier "policy"
108
113
  }
109
114
  }
110
115
 
@@ -32,6 +32,7 @@ orbital ModalOrbital {
32
32
  closeEvent: @config.closeEvent
33
33
  swipeDownToClose: @config.swipeDownToClose
34
34
  look: @config.look
35
+ contained: @config.contained
35
36
  type: modal
36
37
  })
37
38
  }
@@ -117,6 +118,10 @@ orbital ModalOrbital {
117
118
  @label "Look"
118
119
  @description "Layer 2 visual treatment — orthogonal to the semantic variant."
119
120
  @tier "presentation"
121
+ contained : boolean = false
122
+ @label "Contained"
123
+ @description "Render inside the nearest positioned ancestor (a preview frame) instead of portaling over the whole window; page scroll is left alone."
124
+ @tier "presentation"
120
125
  }
121
126
  }
122
127
 
@@ -18,6 +18,7 @@ orbital PageHeaderOrbital {
18
18
  icon : icon
19
19
  loading : boolean
20
20
  disabled : boolean
21
+ roles : [string]
21
22
  }
22
23
  type PageHeaderError = {
23
24
  message : string!
@@ -42,12 +43,13 @@ orbital PageHeaderOrbital {
42
43
  INIT -> idle
43
44
  (render-ui main {
44
45
  title: @config.title
46
+ icon: @config.icon
45
47
  subtitle: @config.subtitle
46
48
  showBack: @config.showBack
47
49
  backEvent: @config.backEvent
48
50
  breadcrumbs: @config.breadcrumbs
49
51
  status: @config.status
50
- actions: @config.actions
52
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
51
53
  isLoading: @config.isLoading
52
54
  error: @config.error
53
55
  tabs: @config.tabs
@@ -75,6 +77,10 @@ orbital PageHeaderOrbital {
75
77
  @label "Title"
76
78
  @description "Page title - accepts string or number from generated code accessing dynamic entity data"
77
79
  @tier "presentation"
80
+ icon : icon
81
+ @label "Icon"
82
+ @description "Icon shown before the title."
83
+ @tier "presentation"
78
84
  subtitle : scalar
79
85
  @label "Subtitle"
80
86
  @description "Optional subtitle/description"
@@ -127,6 +133,10 @@ orbital PageHeaderOrbital {
127
133
  @label "Class Name"
128
134
  @description "className prop"
129
135
  @tier "presentation"
136
+ viewerRole : string = ""
137
+ @label "Viewer's role"
138
+ @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."
139
+ @tier "policy"
130
140
  }
131
141
  }
132
142
 
@@ -22,7 +22,7 @@ orbital PageTransitionOrbital {
22
22
  config {
23
23
  locationKey : string = ""
24
24
  @label "Location Key"
25
- @description "Value that changes on navigation (e.g. `location.pathname`)."
25
+ @description "Value that changes on navigation (a page path)."
26
26
  @tier "presentation"
27
27
  children : node
28
28
  @label "Children"