@almadar/std 16.235.0 → 16.237.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 (283) hide show
  1. package/behaviors/behaviors-registry.json +5621 -1993
  2. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +32 -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-migration-job.lolo +2 -2
  12. package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +40 -18
  13. package/behaviors/lolo/infra/atoms/std-notification-preferences.lolo +25 -11
  14. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +0 -5
  15. package/behaviors/lolo/infra/atoms/std-permission-matrix.lolo +28 -11
  16. package/behaviors/lolo/infra/atoms/std-rate-limiter.lolo +84 -22
  17. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +1 -6
  18. package/behaviors/lolo/ml/atoms/std-graph-builder.lolo +3 -1
  19. package/behaviors/lolo/ml/atoms/std-ml-classify.lolo +0 -4
  20. package/behaviors/lolo/ml/atoms/std-ml-similarity.lolo +0 -4
  21. package/behaviors/lolo/ui/avl/atoms/ui-avl-state-machine.lolo +12 -0
  22. package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +55 -9
  23. package/behaviors/lolo/ui/core/atoms/std-app-search.lolo +6 -2
  24. package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +19 -14
  25. package/behaviors/lolo/ui/core/atoms/std-board.lolo +77 -27
  26. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +76 -33
  27. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +7 -3
  28. package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +25 -13
  29. package/behaviors/lolo/ui/core/atoms/std-esign-request.lolo +5 -0
  30. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +32 -5
  31. package/behaviors/lolo/ui/core/atoms/std-export.lolo +0 -10
  32. package/behaviors/lolo/ui/core/atoms/std-file-store.lolo +15 -4
  33. package/behaviors/lolo/ui/core/atoms/std-form-advanced.lolo +1 -6
  34. package/behaviors/lolo/ui/core/atoms/std-gantt-schedule.lolo +8 -1
  35. package/behaviors/lolo/ui/core/atoms/std-geosearch.lolo +1 -0
  36. package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +20 -4
  37. package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +2 -2
  38. package/behaviors/lolo/ui/core/atoms/std-import.lolo +0 -5
  39. package/behaviors/lolo/ui/core/atoms/std-list.lolo +53 -32
  40. package/behaviors/lolo/ui/core/atoms/std-modal-editor.lolo +2 -2
  41. package/behaviors/lolo/ui/core/atoms/std-multi-party-flow.lolo +24 -0
  42. package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +12 -13
  43. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +29 -13
  44. package/behaviors/lolo/ui/core/atoms/std-recurrence.lolo +14 -1
  45. package/behaviors/lolo/ui/core/atoms/std-role-gate.lolo +39 -0
  46. package/behaviors/lolo/ui/core/atoms/std-saved-search.lolo +84 -16
  47. package/behaviors/lolo/ui/core/atoms/std-selection.lolo +22 -10
  48. package/behaviors/lolo/ui/core/atoms/std-stats.lolo +5 -5
  49. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +3 -0
  50. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +41 -73
  51. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +27 -12
  52. package/behaviors/lolo/ui/core/atoms/std-vote.lolo +0 -4
  53. package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +3 -3
  54. package/behaviors/lolo/ui/core/atoms/ui-presence.lolo +21 -0
  55. package/behaviors/lolo/ui/core/atoms/ui-time-slot-cell.lolo +36 -0
  56. package/behaviors/lolo/ui/core/atoms/ui-typography.lolo +5 -0
  57. package/behaviors/lolo/ui/core/molecules/ui-alert.lolo +5 -0
  58. package/behaviors/lolo/ui/core/molecules/ui-animated-counter.lolo +1 -1
  59. package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +6 -1
  60. package/behaviors/lolo/ui/core/molecules/ui-chart.lolo +11 -1
  61. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +13 -8
  62. package/behaviors/lolo/ui/core/molecules/ui-command-palette.lolo +11 -6
  63. package/behaviors/lolo/ui/core/molecules/ui-commit-row.lolo +2 -2
  64. package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +8 -0
  65. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +60 -5
  66. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +47 -3
  67. package/behaviors/lolo/ui/core/molecules/ui-date-range-picker.lolo +3 -3
  68. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +31 -9
  69. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +8 -3
  70. package/behaviors/lolo/ui/core/molecules/ui-document-viewer.lolo +6 -1
  71. package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +13 -0
  72. package/behaviors/lolo/ui/core/molecules/ui-emoji-picker.lolo +1 -1
  73. package/behaviors/lolo/ui/core/molecules/ui-feature-card.lolo +1 -1
  74. package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +6 -1
  75. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +6 -1
  76. package/behaviors/lolo/ui/core/molecules/ui-form-actions.lolo +6 -1
  77. package/behaviors/lolo/ui/core/molecules/ui-gantt.lolo +9 -1
  78. package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +6 -1
  79. package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +3 -2
  80. package/behaviors/lolo/ui/core/molecules/ui-likert-scale.lolo +1 -1
  81. package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +7 -1
  82. package/behaviors/lolo/ui/core/molecules/ui-meter.lolo +6 -1
  83. package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +5 -0
  84. package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +11 -1
  85. package/behaviors/lolo/ui/core/molecules/ui-page-transition.lolo +1 -1
  86. package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +44 -15
  87. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +57 -5
  88. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +8 -2
  89. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +87 -16
  90. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +37 -10
  91. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +46 -8
  92. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +36 -10
  93. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +57 -10
  94. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +57 -10
  95. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +22 -3
  96. package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +6 -0
  97. package/behaviors/lolo/ui/core/organisms/ui-state-machine-view.lolo +12 -0
  98. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +38 -5
  99. package/behaviors/lolo/ui/core/templates/ui-auth-layout.lolo +1 -1
  100. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +3 -45
  101. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +7 -2
  102. package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +2 -37
  103. package/behaviors/lolo/ui/game/.hand-authored.json +2 -2
  104. package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +1 -1
  105. package/behaviors/lolo/ui/game/atoms/ui-dialogue-bubble.lolo +2 -2
  106. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +9 -3
  107. package/behaviors/lolo/ui/game/atoms/ui-score-display.lolo +1 -1
  108. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +2 -2
  109. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +0 -4
  110. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +2 -66
  111. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +0 -4
  112. package/behaviors/lolo/ui/game/organisms/std-worldmap-board-2d.lolo +0 -4
  113. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +6 -6
  114. package/behaviors/lolo-behavior-contracts.json +1 -1
  115. package/behaviors/registry/factory-signatures.json +1 -1
  116. package/behaviors/registry/infra/atoms/std-approval-gate.orb +194 -67
  117. package/behaviors/registry/infra/atoms/std-audit-capture.orb +0 -8
  118. package/behaviors/registry/infra/atoms/std-cache-aside.orb +0 -84
  119. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -44
  120. package/behaviors/registry/infra/atoms/std-data-erasure.orb +124 -55
  121. package/behaviors/registry/infra/atoms/std-data-import.orb +12 -11
  122. package/behaviors/registry/infra/atoms/std-game-clock.orb +31 -0
  123. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +0 -57
  124. package/behaviors/registry/infra/atoms/std-lifecycle.orb +43 -0
  125. package/behaviors/registry/infra/atoms/std-migration-job.orb +26 -1
  126. package/behaviors/registry/infra/atoms/std-mod-queue.orb +379 -103
  127. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +135 -12
  128. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +0 -11
  129. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +137 -12
  130. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +287 -72
  131. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +5 -8
  132. package/behaviors/registry/ml/atoms/std-graph-builder.orb +11 -0
  133. package/behaviors/registry/ml/atoms/std-ml-classify.orb +0 -7
  134. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +0 -7
  135. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +82 -0
  136. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +417 -9
  137. package/behaviors/registry/ui/core/atoms/std-app-search.orb +53 -1
  138. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +209 -19
  139. package/behaviors/registry/ui/core/atoms/std-board.orb +242 -61
  140. package/behaviors/registry/ui/core/atoms/std-browse.orb +499 -49
  141. package/behaviors/registry/ui/core/atoms/std-calendar.orb +96 -2
  142. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +122 -15
  143. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +11 -0
  144. package/behaviors/registry/ui/core/atoms/std-event-log.orb +42 -6
  145. package/behaviors/registry/ui/core/atoms/std-export.orb +0 -16
  146. package/behaviors/registry/ui/core/atoms/std-file-store.orb +121 -3
  147. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -43
  148. package/behaviors/registry/ui/core/atoms/std-gantt-schedule.orb +25 -1
  149. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +5 -0
  150. package/behaviors/registry/ui/core/atoms/std-graphs.orb +173 -66
  151. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +4 -0
  152. package/behaviors/registry/ui/core/atoms/std-import.orb +0 -8
  153. package/behaviors/registry/ui/core/atoms/std-list.orb +237 -34
  154. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +10 -1
  155. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +24 -0
  156. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +37 -19
  157. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +275 -14
  158. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +93 -4
  159. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +217 -0
  160. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +473 -19
  161. package/behaviors/registry/ui/core/atoms/std-selection.orb +179 -10
  162. package/behaviors/registry/ui/core/atoms/std-stats.orb +73 -1
  163. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +3 -0
  164. package/behaviors/registry/ui/core/atoms/std-thread.orb +190 -115
  165. package/behaviors/registry/ui/core/atoms/std-version-history.orb +138 -14
  166. package/behaviors/registry/ui/core/atoms/std-vote.orb +0 -9
  167. package/behaviors/registry/ui/core/atoms/std-wizard.orb +33 -3
  168. package/behaviors/registry/ui/core/atoms/ui-presence.orb +59 -0
  169. package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +132 -0
  170. package/behaviors/registry/ui/core/atoms/ui-typography.orb +7 -0
  171. package/behaviors/registry/ui/core/molecules/ui-alert.orb +7 -0
  172. package/behaviors/registry/ui/core/molecules/ui-animated-counter.orb +1 -1
  173. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +53 -1
  174. package/behaviors/registry/ui/core/molecules/ui-chart.orb +68 -1
  175. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +291 -8
  176. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +89 -6
  177. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +3 -2
  178. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +32 -0
  179. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +297 -5
  180. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +261 -3
  181. package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +1 -3
  182. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +93 -24
  183. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +121 -3
  184. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +53 -1
  185. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +40 -0
  186. package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +0 -1
  187. package/behaviors/registry/ui/core/molecules/ui-feature-card.orb +0 -1
  188. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +53 -1
  189. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +53 -1
  190. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +53 -1
  191. package/behaviors/registry/ui/core/molecules/ui-gantt.orb +28 -1
  192. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +53 -1
  193. package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +9 -2
  194. package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +1 -1
  195. package/behaviors/registry/ui/core/molecules/ui-menu.orb +74 -1
  196. package/behaviors/registry/ui/core/molecules/ui-meter.orb +53 -1
  197. package/behaviors/registry/ui/core/molecules/ui-modal.orb +8 -0
  198. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +60 -1
  199. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  200. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +393 -23
  201. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +337 -5
  202. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +99 -2
  203. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +415 -33
  204. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +340 -29
  205. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +296 -20
  206. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +489 -9
  207. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +132 -13
  208. package/behaviors/registry/ui/core/organisms/ui-form.orb +132 -13
  209. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +141 -3
  210. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +58 -0
  211. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +82 -0
  212. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +159 -8
  213. package/behaviors/registry/ui/core/templates/ui-auth-layout.orb +0 -1
  214. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -173
  215. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +53 -2
  216. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -116
  217. package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +1 -1
  218. package/behaviors/registry/ui/game/atoms/ui-dialogue-bubble.orb +1 -2
  219. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +100 -3
  220. package/behaviors/registry/ui/game/atoms/ui-score-display.orb +0 -1
  221. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +10 -0
  222. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +0 -7
  223. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -807
  224. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +0 -7
  225. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +0 -7
  226. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +6 -0
  227. package/canonical-operators.json +18 -1
  228. package/dist/behaviors/exports-reader.js +8942 -3946
  229. package/dist/behaviors/functions/index.d.ts +419 -132
  230. package/dist/behaviors/functions/index.js +8931 -3946
  231. package/dist/behaviors/index.d.ts +1 -1
  232. package/dist/behaviors/index.js +8943 -3947
  233. package/dist/behaviors/query.js +8942 -3946
  234. package/dist/behaviors-embeddings.hash.json +3 -3
  235. package/dist/behaviors-embeddings.json +49 -41
  236. package/dist/behaviors-registry.json +5621 -1993
  237. package/dist/index.d.ts +3 -3
  238. package/dist/index.js +8960 -3947
  239. package/dist/knob-embeddings.hash.json +3 -3
  240. package/dist/knob-embeddings.json +774 -374
  241. package/dist/modules/anim.d.ts +1 -1
  242. package/dist/modules/array.d.ts +1 -1
  243. package/dist/modules/array.js +15 -0
  244. package/dist/modules/async.d.ts +1 -1
  245. package/dist/modules/behavior.d.ts +1 -1
  246. package/dist/modules/browser.d.ts +1 -1
  247. package/dist/modules/composition.d.ts +1 -1
  248. package/dist/modules/contract.d.ts +1 -1
  249. package/dist/modules/core.d.ts +1 -1
  250. package/dist/modules/core.js +2 -0
  251. package/dist/modules/data.d.ts +1 -1
  252. package/dist/modules/ease.d.ts +1 -1
  253. package/dist/modules/format.d.ts +1 -1
  254. package/dist/modules/geo.d.ts +1 -1
  255. package/dist/modules/graph.d.ts +1 -1
  256. package/dist/modules/grid.d.ts +1 -1
  257. package/dist/modules/index.d.ts +1 -1
  258. package/dist/modules/index.js +17 -0
  259. package/dist/modules/integration.d.ts +1 -1
  260. package/dist/modules/json.d.ts +1 -1
  261. package/dist/modules/llm.d.ts +1 -1
  262. package/dist/modules/math.d.ts +1 -1
  263. package/dist/modules/memory.d.ts +1 -1
  264. package/dist/modules/nn.d.ts +1 -1
  265. package/dist/modules/noise.d.ts +1 -1
  266. package/dist/modules/object.d.ts +1 -1
  267. package/dist/modules/os.d.ts +1 -1
  268. package/dist/modules/path.d.ts +1 -1
  269. package/dist/modules/prob.d.ts +1 -1
  270. package/dist/modules/session.d.ts +1 -1
  271. package/dist/modules/str.d.ts +1 -1
  272. package/dist/modules/tensor.d.ts +1 -1
  273. package/dist/modules/time.d.ts +1 -1
  274. package/dist/modules/trace.d.ts +1 -1
  275. package/dist/modules/train.d.ts +1 -1
  276. package/dist/modules/validate.d.ts +1 -1
  277. package/dist/modules/vector.d.ts +1 -1
  278. package/dist/modules/workspace.d.ts +1 -1
  279. package/dist/registry/factory-signatures.json +1 -1
  280. package/dist/registry.d.ts +2 -2
  281. package/dist/registry.js +17 -0
  282. package/dist/{types-Ggla7OK7.d.ts → types-DLx38UFZ.d.ts} +23 -3
  283. package/package.json +3 -3
@@ -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"
@@ -2,13 +2,15 @@ app ui-swipeable-row "1.0.0"
2
2
  "SwipeableRow — UI factory (1:1 with the @almadar/ui swipeable-row pattern)."
3
3
  ;; @pattern "swipeable-row"
4
4
  orbital SwipeableRowOrbital {
5
- type SwipeableRowLoaded = Event { data : [SwipeableRowItem] } "SwipeableRow rows finished loading; payload.data holds the collection"
5
+ type SwipeableRowLoaded = Event { data : SwipeableRowItem } "SwipeableRow row finished loading; payload.data holds the single row"
6
6
  type SwipeableRowLeftActionsItem = {
7
7
  label : string!
8
8
  icon : icon
9
9
  variant : "primary" | "secondary" | "danger" | "ghost"
10
10
  event : event!
11
11
  eventPayload : @payload event
12
+ when : SExpr
13
+ roles : [string]
12
14
  }
13
15
  type SwipeableRowRightActionsItem = {
14
16
  label : string!
@@ -16,6 +18,8 @@ orbital SwipeableRowOrbital {
16
18
  variant : "primary" | "secondary" | "danger" | "ghost"
17
19
  event : event!
18
20
  eventPayload : @payload event
21
+ when : SExpr
22
+ roles : [string]
19
23
  }
20
24
 
21
25
  entity SwipeableRowItem [runtime] {
@@ -23,24 +27,37 @@ orbital SwipeableRowOrbital {
23
27
  }
24
28
 
25
29
  trait SwipeableRowRender -> @rebindable SwipeableRowItem [interaction, instance] {
26
- initial: idle
30
+ initial: resolving
27
31
 
28
- state idle {
29
- INIT -> idle when @config.selfFetch
30
- (fetch SwipeableRowItem { emit: { success: SwipeableRowLoaded } })
32
+ state resolving {
33
+ INIT -> idle when (and @config.selfFetch (!= (str/default ?id "") ""))
34
+ (fetch SwipeableRowItem { id: ?id, emit: { success: SwipeableRowLoaded } })
35
+ (render-ui main {
36
+ leftActions: (array/filter @config.leftActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
37
+ rightActions: (array/filter @config.rightActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
38
+ threshold: @config.threshold
39
+ children: @config.children
40
+ itemData: @entity
41
+ className: @config.className
42
+ type: swipeable-row
43
+ })
44
+ INIT -> idle when (not (and @config.selfFetch (!= (str/default ?id "") "")))
31
45
  (render-ui main {
32
- leftActions: @config.leftActions
33
- rightActions: @config.rightActions
46
+ leftActions: (array/filter @config.leftActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
47
+ rightActions: (array/filter @config.rightActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
34
48
  threshold: @config.threshold
35
49
  children: @config.children
36
50
  itemData: @entity
37
51
  className: @config.className
38
52
  type: swipeable-row
39
53
  })
40
- INIT -> idle when (not @config.selfFetch)
54
+ }
55
+
56
+ state idle {
57
+ INIT -> idle
41
58
  (render-ui main {
42
- leftActions: @config.leftActions
43
- rightActions: @config.rightActions
59
+ leftActions: (array/filter @config.leftActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
60
+ rightActions: (array/filter @config.rightActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
44
61
  threshold: @config.threshold
45
62
  children: @config.children
46
63
  itemData: @entity
@@ -49,8 +66,8 @@ orbital SwipeableRowOrbital {
49
66
  })
50
67
  SwipeableRowLoaded -> idle
51
68
  (render-ui main {
52
- leftActions: @config.leftActions
53
- rightActions: @config.rightActions
69
+ leftActions: (array/filter @config.leftActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
70
+ rightActions: (array/filter @config.rightActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
54
71
  threshold: @config.threshold
55
72
  children: @config.children
56
73
  itemData: @payload.data
@@ -61,11 +78,19 @@ orbital SwipeableRowOrbital {
61
78
 
62
79
  emits {
63
80
  SwipeableRowLoaded
64
- @description "SwipeableRow rows finished loading; payload.data holds the collection."
81
+ @description "SwipeableRow row finished loading; payload.data holds the single row."
65
82
  @synonyms "loaded, fetched, retrieved"
66
83
  @tier "essential"
67
84
  }
68
85
 
86
+ listens {
87
+ INIT {
88
+ id : string
89
+ }
90
+ @description "Mount payload; a host that routes to this panel by id (a :id page param) passes it here."
91
+ @tier "internal"
92
+ }
93
+
69
94
  config {
70
95
  leftActions : [SwipeableRowLeftActionsItem] = []
71
96
  @label "Left Actions"
@@ -87,9 +112,13 @@ orbital SwipeableRowOrbital {
87
112
  @label "Class Name"
88
113
  @description "className prop"
89
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"
90
119
  selfFetch : boolean = true
91
- @label "Fetch its own rows on mount?"
92
- @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."
120
+ @label "Fetch its own row on mount?"
121
+ @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."
93
122
  @tier "internal"
94
123
  }
95
124
  }
@@ -4,6 +4,10 @@ app ui-table-view "1.0.0"
4
4
  ;; @pattern "table-view"
5
5
  orbital TableViewOrbital {
6
6
  type TableViewLoaded = Event { data : [TableViewItem] } "TableView rows finished loading; payload.data holds the collection"
7
+ type TableViewEmptyAction = {
8
+ label : string!
9
+ event : event
10
+ }
7
11
  type TableViewColumnsItem = {
8
12
  key : string!
9
13
  field : string
@@ -14,9 +18,13 @@ orbital TableViewOrbital {
14
18
  className : string
15
19
  weight : "normal" | "medium" | "semibold"
16
20
  format : "badge" | "date" | "currency" | "number" | "percent" | "boolean"
21
+ colorMap : Map string TableViewColumnsItemColorMapValue
22
+ labels : Map string string
23
+ variant : "h3" | "h4"
17
24
  icon : icon
18
25
  sortable : boolean
19
26
  }
27
+ type TableViewColumnsItemColorMapValue = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "error" | "info" | "neutral" | "destructive"
20
28
  type TableViewFieldsItem = {
21
29
  key : string!
22
30
  field : string
@@ -27,14 +35,20 @@ orbital TableViewOrbital {
27
35
  className : string
28
36
  weight : "normal" | "medium" | "semibold"
29
37
  format : "badge" | "date" | "currency" | "number" | "percent" | "boolean"
38
+ colorMap : Map string TableViewFieldsItemColorMapValue
39
+ labels : Map string string
40
+ variant : "h3" | "h4"
30
41
  icon : icon
31
42
  sortable : boolean
32
43
  }
44
+ type TableViewFieldsItemColorMapValue = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "error" | "info" | "neutral" | "destructive"
33
45
  type TableViewItemActionsItem = {
34
46
  label : string!
35
47
  event : event!
36
48
  icon : icon
37
49
  variant : "primary" | "secondary" | "ghost" | "danger"
50
+ when : SExpr
51
+ roles : [string]
38
52
  }
39
53
  type TableViewError = {
40
54
  message : string!
@@ -68,10 +82,14 @@ orbital TableViewOrbital {
68
82
  positionEvent: @config.positionEvent
69
83
  dndItemIdField: @config.dndItemIdField
70
84
  dndRoot: @config.dndRoot
85
+ emptyIcon: @config.emptyIcon
86
+ emptyTitle: @config.emptyTitle
87
+ emptyDescription: @config.emptyDescription
88
+ emptyAction: @config.emptyAction
71
89
  entity: @entity
72
90
  columns: @config.columns
73
91
  fields: @config.fields
74
- itemActions: @config.itemActions
92
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
75
93
  maxInlineActions: @config.maxInlineActions
76
94
  itemClickEvent: @config.itemClickEvent
77
95
  selectable: @config.selectable
@@ -100,10 +118,14 @@ orbital TableViewOrbital {
100
118
  positionEvent: @config.positionEvent
101
119
  dndItemIdField: @config.dndItemIdField
102
120
  dndRoot: @config.dndRoot
121
+ emptyIcon: @config.emptyIcon
122
+ emptyTitle: @config.emptyTitle
123
+ emptyDescription: @config.emptyDescription
124
+ emptyAction: @config.emptyAction
103
125
  entity: @entity
104
126
  columns: @config.columns
105
127
  fields: @config.fields
106
- itemActions: @config.itemActions
128
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
107
129
  maxInlineActions: @config.maxInlineActions
108
130
  itemClickEvent: @config.itemClickEvent
109
131
  selectable: @config.selectable
@@ -132,10 +154,14 @@ orbital TableViewOrbital {
132
154
  positionEvent: @config.positionEvent
133
155
  dndItemIdField: @config.dndItemIdField
134
156
  dndRoot: @config.dndRoot
157
+ emptyIcon: @config.emptyIcon
158
+ emptyTitle: @config.emptyTitle
159
+ emptyDescription: @config.emptyDescription
160
+ emptyAction: @config.emptyAction
135
161
  entity: @payload.data
136
162
  columns: @config.columns
137
163
  fields: @config.fields
138
- itemActions: @config.itemActions
164
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
139
165
  maxInlineActions: @config.maxInlineActions
140
166
  itemClickEvent: @config.itemClickEvent
141
167
  selectable: @config.selectable
@@ -157,6 +183,12 @@ orbital TableViewOrbital {
157
183
  }
158
184
 
159
185
  emits {
186
+ @config.itemClickEvent -> external {
187
+ id : string!
188
+ row : @entity!
189
+ }
190
+ @description "When set, the whole row is clickable and emits UI:{itemClickEvent} with { id, row } (action-button clicks stopPropagation so they still win). Mirrors DataList's contract. Omit = rows are not clickable."
191
+ @tier "essential"
160
192
  @config.selectEvent -> external {
161
193
  selectedIds : [string]!
162
194
  }
@@ -213,6 +245,22 @@ orbital TableViewOrbital {
213
245
  @label "Dnd Root"
214
246
  @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."
215
247
  @tier "presentation"
248
+ emptyIcon : icon
249
+ @label "Empty Icon"
250
+ @description "Domain icon for the empty state."
251
+ @tier "presentation"
252
+ emptyTitle : string
253
+ @label "Empty Title"
254
+ @description "Specific title ('No orders yet')."
255
+ @tier "presentation"
256
+ emptyDescription : string
257
+ @label "Empty Description"
258
+ @description "What will appear here once rows exist."
259
+ @tier "presentation"
260
+ emptyAction : TableViewEmptyAction
261
+ @label "Empty Action"
262
+ @description "Create-the-first-item action."
263
+ @tier "presentation"
216
264
  columns : [TableViewColumnsItem] = []
217
265
  @label "Columns"
218
266
  @description "Column definitions. The compiler emits `columns`; `fields` is the alias."
@@ -229,9 +277,9 @@ orbital TableViewOrbital {
229
277
  @label "Max Inline Actions"
230
278
  @description "maxInlineActions prop"
231
279
  @tier "presentation"
232
- itemClickEvent : event = ""
280
+ itemClickEvent : event = "ITEM_CLICK"
233
281
  @label "Item Click Event"
234
- @description "When set, the whole row is clickable and emits UI:{itemClickEvent} with { id, row } (action-button clicks stopPropagation so they still win). Mirrors DataList's contract. When OMITTED and `itemActions` exist, the row click defaults to the first non-danger item action (the view/open action by authoring convention) — a danger action never becomes the row default (destructive actions require intentional reach)."
282
+ @description "When set, the whole row is clickable and emits UI:{itemClickEvent} with { id, row } (action-button clicks stopPropagation so they still win). Mirrors DataList's contract. Omit = rows are not clickable."
235
283
  @tier "presentation"
236
284
  selectable : boolean = false
237
285
  @label "Selectable"
@@ -289,6 +337,10 @@ orbital TableViewOrbital {
289
337
  @label "Relations Data"
290
338
  @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 column whose field is relation-typed. Same contract DetailPanel takes."
291
339
  @tier "presentation"
340
+ viewerRole : string = ""
341
+ @label "Viewer's role"
342
+ @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."
343
+ @tier "policy"
292
344
  selfFetch : boolean = true
293
345
  @label "Fetch its own rows on mount?"
294
346
  @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."
@@ -13,6 +13,7 @@ orbital TabsOrbital {
13
13
  disabled : boolean
14
14
  event : event
15
15
  active : boolean
16
+ roles : [string]
16
17
  }
17
18
  type TabsItemsItemIconAsset = {
18
19
  url : asset!
@@ -39,6 +40,7 @@ orbital TabsOrbital {
39
40
  disabled : boolean
40
41
  event : event
41
42
  active : boolean
43
+ roles : [string]
42
44
  }
43
45
  type TabsTabsItemIconAsset = {
44
46
  url : asset!
@@ -65,8 +67,8 @@ orbital TabsOrbital {
65
67
  state idle {
66
68
  INIT -> idle
67
69
  (render-ui main {
68
- items: @config.items
69
- tabs: @config.tabs
70
+ items: (array/filter @config.items (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
71
+ tabs: (array/filter @config.tabs (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
70
72
  defaultActiveTab: @config.defaultActiveTab
71
73
  activeTab: @config.activeTab
72
74
  onTabChange: @config.onTabChange
@@ -123,6 +125,10 @@ orbital TabsOrbital {
123
125
  @label "Class Name"
124
126
  @description "Additional CSS classes"
125
127
  @tier "presentation"
128
+ viewerRole : string = ""
129
+ @label "Viewer's role"
130
+ @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."
131
+ @tier "policy"
126
132
  }
127
133
  }
128
134
 
@@ -2,7 +2,7 @@ app ui-detail-panel "1.0.0"
2
2
  "DetailPanel — UI factory (1:1 with the @almadar/ui detail-panel pattern)."
3
3
  ;; @pattern "detail-panel"
4
4
  orbital DetailPanelOrbital {
5
- type DetailPanelLoaded = Event { data : [DetailPanelItem] } "DetailPanel rows finished loading; payload.data holds the collection"
5
+ type DetailPanelLoaded = Event { data : DetailPanelItem } "DetailPanel row finished loading; payload.data holds the single row"
6
6
  type DetailPanelError = {
7
7
  message : string!
8
8
  name : string
@@ -29,6 +29,8 @@ orbital DetailPanelOrbital {
29
29
  event : event
30
30
  navigatesTo : string
31
31
  variant : "primary" | "secondary" | "ghost" | "danger"
32
+ when : SExpr
33
+ roles : [string]
32
34
  }
33
35
  type DetailPanelBackAction = {
34
36
  label : string!
@@ -36,14 +38,21 @@ orbital DetailPanelOrbital {
36
38
  event : event
37
39
  navigatesTo : string
38
40
  variant : "primary" | "secondary" | "ghost" | "danger"
41
+ when : SExpr
39
42
  }
40
43
  type DetailPanelFieldsItem = {
41
- key : string!
42
- header : string
44
+ name : string!
45
+ label : string
46
+ icon : icon
47
+ variant : "h3" | "h4" | "body" | "caption" | "badge" | "small" | "progress"
48
+ format : "date" | "currency" | "number" | "boolean" | "percent"
49
+ colorMap : Map string DetailPanelFieldsItemColorMapValue
50
+ labels : Map string string
43
51
  type : string
44
52
  values : [string]
45
53
  relation : DetailPanelFieldsItemRelation
46
54
  }
55
+ type DetailPanelFieldsItemColorMapValue = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "error" | "info" | "neutral" | "destructive"
47
56
  type DetailPanelFieldsItemRelation = {
48
57
  entity : string!
49
58
  cardinality : "one" | "many" | "one-to-many" | "many-to-one" | "many-to-many"
@@ -60,11 +69,48 @@ orbital DetailPanelOrbital {
60
69
  }
61
70
 
62
71
  trait DetailPanelRender -> @rebindable DetailPanelItem [interaction, instance] {
63
- initial: idle
72
+ initial: resolving
64
73
 
65
- state idle {
66
- INIT -> idle when @config.selfFetch
67
- (fetch DetailPanelItem { emit: { success: DetailPanelLoaded } })
74
+ state resolving {
75
+ INIT -> idle when (and @config.selfFetch (!= (str/default ?id "") "") (!= @config.mode "create"))
76
+ (fetch DetailPanelItem { id: ?id, emit: { success: DetailPanelLoaded } })
77
+ (render-ui main {
78
+ className: @config.className
79
+ isLoading: @config.isLoading
80
+ error: @config.error
81
+ sortBy: @config.sortBy
82
+ sortDirection: @config.sortDirection
83
+ searchValue: @config.searchValue
84
+ page: @config.pageProp
85
+ pageSize: @config.pageSize
86
+ totalCount: @config.totalCount
87
+ activeFilters: @config.activeFilters
88
+ selectedIds: @config.selectedIds
89
+ entity: @entity
90
+ title: @config.title
91
+ onTitleCommit: @config.onTitleCommit
92
+ subtitle: @config.subtitle
93
+ status: @config.status
94
+ avatar: @config.avatar
95
+ sections: @config.sections
96
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
97
+ maxInlineActions: @config.maxInlineActions
98
+ backAction: @config.backAction
99
+ closeEvent: @config.closeEvent
100
+ footer: @config.footer
101
+ slideOver: @config.slideOver
102
+ fields: @config.fields
103
+ fieldNames: @config.fieldNames
104
+ initialData: @entity
105
+ mode: @config.mode
106
+ position: @config.position
107
+ width: @config.width
108
+ displayFields: @config.displayFields
109
+ showActions: @config.showActions
110
+ relationsData: @config.relationsData
111
+ type: detail-panel
112
+ })
113
+ INIT -> idle when (not (and @config.selfFetch (!= (str/default ?id "") "") (!= @config.mode "create")))
68
114
  (render-ui main {
69
115
  className: @config.className
70
116
  isLoading: @config.isLoading
@@ -84,9 +130,10 @@ orbital DetailPanelOrbital {
84
130
  status: @config.status
85
131
  avatar: @config.avatar
86
132
  sections: @config.sections
87
- actions: @config.actions
133
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
88
134
  maxInlineActions: @config.maxInlineActions
89
135
  backAction: @config.backAction
136
+ closeEvent: @config.closeEvent
90
137
  footer: @config.footer
91
138
  slideOver: @config.slideOver
92
139
  fields: @config.fields
@@ -100,7 +147,10 @@ orbital DetailPanelOrbital {
100
147
  relationsData: @config.relationsData
101
148
  type: detail-panel
102
149
  })
103
- INIT -> idle when (not @config.selfFetch)
150
+ }
151
+
152
+ state idle {
153
+ INIT -> idle
104
154
  (render-ui main {
105
155
  className: @config.className
106
156
  isLoading: @config.isLoading
@@ -120,9 +170,10 @@ orbital DetailPanelOrbital {
120
170
  status: @config.status
121
171
  avatar: @config.avatar
122
172
  sections: @config.sections
123
- actions: @config.actions
173
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
124
174
  maxInlineActions: @config.maxInlineActions
125
175
  backAction: @config.backAction
176
+ closeEvent: @config.closeEvent
126
177
  footer: @config.footer
127
178
  slideOver: @config.slideOver
128
179
  fields: @config.fields
@@ -156,9 +207,10 @@ orbital DetailPanelOrbital {
156
207
  status: @config.status
157
208
  avatar: @config.avatar
158
209
  sections: @config.sections
159
- actions: @config.actions
210
+ actions: (array/filter @config.actions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
160
211
  maxInlineActions: @config.maxInlineActions
161
212
  backAction: @config.backAction
213
+ closeEvent: @config.closeEvent
162
214
  footer: @config.footer
163
215
  slideOver: @config.slideOver
164
216
  fields: @config.fields
@@ -175,12 +227,23 @@ orbital DetailPanelOrbital {
175
227
  }
176
228
 
177
229
  emits {
230
+ @config.closeEvent -> external { }
231
+ @description "The event of the declared action that dismisses the panel. The matching action renders as the header close ×; omitted, no × is drawn."
232
+ @tier "essential"
178
233
  DetailPanelLoaded
179
- @description "DetailPanel rows finished loading; payload.data holds the collection."
234
+ @description "DetailPanel row finished loading; payload.data holds the single row."
180
235
  @synonyms "loaded, fetched, retrieved"
181
236
  @tier "essential"
182
237
  }
183
238
 
239
+ listens {
240
+ INIT {
241
+ id : string
242
+ }
243
+ @description "Mount payload; a host that routes to this panel by id (a :id page param) passes it here."
244
+ @tier "internal"
245
+ }
246
+
184
247
  config {
185
248
  className : string
186
249
  @label "Class Name"
@@ -263,6 +326,10 @@ orbital DetailPanelOrbital {
263
326
  @label "Back Action"
264
327
  @description "Navigation-back affordance. Renders top-LEFT before the title (OS/back convention — Almadar_UX §8.4), spatially separated from the right-aligned action buttons + close X. Never inferred from actions[] labels."
265
328
  @tier "presentation"
329
+ closeEvent : event = "CLOSE"
330
+ @label "Close Event"
331
+ @description "The event of the declared action that dismisses the panel. The matching action renders as the header close ×; omitted, no × is drawn."
332
+ @tier "presentation"
266
333
  footer : node
267
334
  @label "Footer"
268
335
  @description "footer prop"
@@ -271,9 +338,9 @@ orbital DetailPanelOrbital {
271
338
  @label "Slide Over"
272
339
  @description "slideOver prop"
273
340
  @tier "presentation"
274
- fields : [DetailPanelFieldsItem] = [{ key: "Key", header: "Header", type: "Type", values: ["Item", "Item 2"], relation: { entity: "Entity", cardinality: one } }, { key: "Key 2", header: "Header 2", type: "Type 2", values: ["Item", "Item 2"], relation: { entity: "Entity 2", cardinality: many } }]
341
+ fields : [DetailPanelFieldsItem] = [{ name: "Name", label: "Label", icon: "circle", variant: h3, format: date, type: "Type", values: ["Item", "Item 2"], relation: { entity: "Entity", cardinality: one } }, { name: "Name 2", label: "Label 2", icon: "circle", variant: h4, format: currency, type: "Type 2", values: ["Item", "Item 2"], relation: { entity: "Entity 2", cardinality: many } }]
275
342
  @label "Fields"
276
- @description "Fields to display - accepts string[], {key, header}[], or DetailField[]"
343
+ @description "Fields to display: field names, or declared fields ({ name, label, variant, format, colorMap, labels })"
277
344
  @tier "presentation"
278
345
  fieldNames : [string] = []
279
346
  @label "Field Names"
@@ -303,9 +370,13 @@ orbital DetailPanelOrbital {
303
370
  @label "Relations Data"
304
371
  @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."
305
372
  @tier "presentation"
373
+ viewerRole : string = ""
374
+ @label "Viewer's role"
375
+ @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."
376
+ @tier "policy"
306
377
  selfFetch : boolean = true
307
- @label "Fetch its own rows on mount?"
308
- @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."
378
+ @label "Fetch its own row on mount?"
379
+ @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."
309
380
  @tier "internal"
310
381
  }
311
382
  }