@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
@@ -2,6 +2,7 @@ app std-board "1.3.0"
2
2
  "std-board — generic N-column board primitive. `config.columns` is an array of column definitions ({ key, label, icon, variant }); the trait `array/map`s them on `BoardItemsLoaded` into `@entity.boards` where each board carries its filtered items + a count. The render is a `data-grid` over `@entity.boards` (one card per column) whose `renderItem` lambda nests a `data-list` over `@col.items` (the cards in that stage). N is config-driven — pass any number of columns; the outer `data-grid`'s `cols` is bound to `@config.gridCols` so the grid wraps if you exceed it. Topology = loading / viewing_board / viewing_card / adding / error — distinct from the cookie-cutter `loading/browsing/viewing_single/error` CRUD shape. App-level atoms (e.g. std-pipeline) compose std-board via `uses` and add a sibling persistor + extended source entity. `config.boardLook` switches the board body between the default N-column grid ('columns') and a Trello-style wide-column kanban ('kanban-classic'). `viewing_board` listens for REFETCH_QUERY/REFETCH_FILTER/REFETCH_PAGE (the std-search/std-filter/std-pagination wiring targets, no render on refetch — @entity.boards is bound reactively) and can optionally render its own search box (config.bodySearch, default false) and filter bar (config.filters, default []); no pagination control is rendered — a board's columns are not a paged list."
3
3
  type ObjectSpec = { id : string, label : string, value : string }
4
4
  type ColumnSpec = { key : string!, label : string!, icon : string, variant : string }
5
+ type ItemAction = { label : string!, event : event, variant : primary | secondary | ghost | danger, icon : string, roles : [string] }
5
6
  type FilterSpec = { field : string!, label : string, options : [string] }
6
7
  orbital BoardOrbital {
7
8
  type BoardItem = { id : string!, title : string, description : string, stage : string, notes : string, position : number }
@@ -42,6 +43,7 @@ orbital BoardOrbital {
42
43
  INIT -> loading
43
44
  (fetch BoardView {
44
45
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
46
+ include: @config.include
45
47
  })
46
48
  (render-ui main {
47
49
  title: "Loading board…"
@@ -72,6 +74,7 @@ orbital BoardOrbital {
72
74
  BoardItemsSaved -> loading
73
75
  (fetch BoardView {
74
76
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
77
+ include: @config.include
75
78
  })
76
79
  (render-ui main {
77
80
  title: "Refreshing board…"
@@ -82,6 +85,7 @@ orbital BoardOrbital {
82
85
  BoardItemDeleted -> loading
83
86
  (fetch BoardView {
84
87
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
88
+ include: @config.include
85
89
  })
86
90
  (render-ui main {
87
91
  title: "Refreshing board…"
@@ -100,6 +104,7 @@ orbital BoardOrbital {
100
104
  INIT -> loading
101
105
  (fetch BoardView {
102
106
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
107
+ include: @config.include
103
108
  })
104
109
  (render-ui main {
105
110
  title: "Loading board…"
@@ -231,6 +236,7 @@ orbital BoardOrbital {
231
236
  BoardItemsSaved -> viewing_board
232
237
  (fetch BoardView {
233
238
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
239
+ include: @config.include
234
240
  })
235
241
  ;; REFETCH_* stay in viewing_board and issue no render-ui, matching
236
242
  ;; std-browse's REFETCH_QUERY/REFETCH_FILTER/REFETCH_PAGE: a render here
@@ -241,11 +247,13 @@ orbital BoardOrbital {
241
247
  REFETCH_QUERY -> viewing_board
242
248
  (fetch BoardView {
243
249
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
250
+ include: @config.include
244
251
  filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity @config.searchField) ?searchTerm))
245
252
  })
246
253
  REFETCH_FILTER -> viewing_board
247
254
  (fetch BoardView {
248
255
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
256
+ include: @config.include
249
257
  filter: (or ["=", ?value, ""] ["=", (object/get @entity ?field), ?value])
250
258
  })
251
259
  ;; A board's columns are not a paged list — paging the underlying fetch
@@ -256,6 +264,7 @@ orbital BoardOrbital {
256
264
  REFETCH_PAGE -> viewing_board
257
265
  (fetch BoardView {
258
266
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
267
+ include: @config.include
259
268
  limit: @config.pageSize
260
269
  offset: ["*", ["-", ?page, 1], @config.pageSize]
261
270
  })
@@ -280,6 +289,7 @@ orbital BoardOrbital {
280
289
  CLOSE_CARD -> loading
281
290
  (fetch BoardView {
282
291
  emit: { failure: BoardItemsLoadFailed, success: BoardItemsLoaded }
292
+ include: @config.include
283
293
  })
284
294
  (render-ui main {
285
295
  title: "Refreshing board…"
@@ -531,6 +541,10 @@ orbital BoardOrbital {
531
541
  }
532
542
 
533
543
  config {
544
+ showHeader : boolean = true
545
+ @label "Show the board's own title row?"
546
+ @description "Off when the page already carries a page header naming the same thing, so the page shows one title."
547
+ @tier "presentation"
534
548
  title : string = Board
535
549
  @label "Board title"
536
550
  @description "Heading shown above the column board"
@@ -575,6 +589,11 @@ orbital BoardOrbital {
575
589
  @label "Card title binding"
576
590
  @description "Per-card binding for the title slot."
577
591
  @tier "presentation"
592
+ include : [string] = []
593
+ @label "Which relation fields to hydrate?"
594
+ @description "Entity relation field names to hydrate on fetch (e.g. an `assignee : TeamMember` field named `assignee`), so card bindings can use dot-paths like @item.assignee.name. Empty = no hydration, the default."
595
+ @synonyms "relation hydration, populate relations, joined fields, hydrate relations"
596
+ @tier "domain"
578
597
  cardDescriptionBinding : string = @item.description
579
598
  @label "Card description binding"
580
599
  @description "Per-card binding for the description slot."
@@ -624,16 +643,29 @@ orbital BoardOrbital {
624
643
  @description "Records fetched per REFETCH_PAGE request. std-board renders no pagination control itself — this only feeds the fetch limit/offset when a consumer wires a composed std-pagination to REFETCH_PAGE."
625
644
  @synonyms "fetch limit, records per page, batch size, page limit"
626
645
  @tier "presentation"
646
+ cardActions : [ItemAction] = [{
647
+ event: DELETE_CARD
648
+ icon: trash-2
649
+ label: Delete
650
+ variant: danger
651
+ }]
652
+ @label "Card panel action list"
653
+ @description "Buttons on the open-card panel's actions row, built by the default cardActionsContent. Give an item `roles` to show it only to those viewer roles."
654
+ @tier "presentation"
655
+ viewerRole : string = ""
656
+ @label "Viewer's role"
657
+ @description "The signed-in viewer's role that each card action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
658
+ @tier "policy"
627
659
  cardActionsContent : render-ui = {
628
660
  align: center
629
- children: [{
630
- action: DELETE_CARD
661
+ children: (array/map (array/filter @config.cardActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole)))) (fn a {
662
+ action: @a.event
631
663
  actionPayload: { id: @entity.currentId }
632
- icon: trash-2
633
- label: Delete
664
+ icon: @a.icon
665
+ label: @a.label
634
666
  type: button
635
- variant: danger
636
- }]
667
+ variant: @a.variant
668
+ }))
637
669
  direction: horizontal
638
670
  gap: sm
639
671
  type: stack
@@ -642,17 +674,26 @@ orbital BoardOrbital {
642
674
  @description "Actions row of the open-card panel. Default is the Delete button only. Override to add consumer-wired actions — e.g. an Edit button with action: EDIT_CARD and actionPayload: { id: @entity.currentId, row: @entity.currentRow }, listened to by the organism's edit modal. Never leave a button here without a listener."
643
675
  @tier "presentation"
644
676
  bodyContent : render-ui = {
645
- children: [{
646
- align: center
647
- children: [{ name: kanban-square, size: lg, type: icon }, {
648
- content: @config.title
649
- type: typography
650
- variant: h3
651
- }]
652
- direction: horizontal
653
- gap: sm
677
+ children: [(if @config.showHeader {
678
+ children: [{
679
+ align: center
680
+ children: [{ name: kanban-square, size: lg, type: icon }, {
681
+ content: @config.title
682
+ type: typography
683
+ variant: h3
684
+ }]
685
+ direction: horizontal
686
+ gap: sm
687
+ type: stack
688
+ }, { type: divider }]
689
+ direction: vertical
690
+ gap: md
691
+ type: stack
692
+ } {
693
+ children: []
694
+ gap: none
654
695
  type: stack
655
- }, { type: divider }, (if @config.bodySearch {
696
+ }), (if @config.bodySearch {
656
697
  children: [{
657
698
  className: "w-full max-w-md"
658
699
  clearable: true
@@ -771,18 +812,27 @@ orbital BoardOrbital {
771
812
  @description "Render-ui SExpr rendered after the board loads for boardLook='columns' — the canonical column data-grid with nested per-column data-lists. boardLook='kanban-classic' renders kanbanClassicBodyContent instead; both share this trait's state machine, emits, and listens."
772
813
  @tier "internal"
773
814
  kanbanClassicBodyContent : render-ui = {
774
- children: [{
775
- align: center
776
- children: [{ name: kanban-square, size: xl, type: icon }, {
777
- content: @config.title
778
- type: typography
779
- variant: h2
780
- }]
781
- className: px-card-md
782
- direction: horizontal
783
- gap: sm
815
+ children: [(if @config.showHeader {
816
+ children: [{
817
+ align: center
818
+ children: [{ name: kanban-square, size: xl, type: icon }, {
819
+ content: @config.title
820
+ type: typography
821
+ variant: h2
822
+ }]
823
+ className: px-card-md
824
+ direction: horizontal
825
+ gap: sm
826
+ type: stack
827
+ }, { type: divider }]
828
+ direction: vertical
829
+ gap: md
830
+ type: stack
831
+ } {
832
+ children: []
833
+ gap: none
784
834
  type: stack
785
- }, { type: divider }, (if @config.bodySearch {
835
+ }), (if @config.bodySearch {
786
836
  children: [{
787
837
  className: "w-full max-w-md"
788
838
  clearable: true
@@ -1,8 +1,9 @@
1
1
  app std-browse "2.5.0"
2
2
  "std-browse as a Function — single primitive: data-grid. Owns the fetch + REFETCH (query/filter/page) state machine. Consumers configure fields/imageField/itemActions/cols/gap/variant; the atom renders the grid. Each `fields[]` entry accepts `{ name, label, variant }` plus optional `referenceEntity` + `displayField` to render a foreign-key column as the joined entity's display value (data-grid resolves @list[referenceEntity] at render time when both keys are present). `browseLook` (table default / dense / feed / gallery / master-detail / triage) selects one of six render bodies; dense/feed/gallery were folded in from std-browse-dense/-feed/-gallery (Phase 5.B); master-detail (split record view driven by the guarded VIEW/CLOSE self-transitions) and triage (inbox rows) were folded in 2026-07-26. Consumers retarget by setting browseLook."
3
- type FieldSpec = { name : string!, label : string, variant : h3 | h4 | body | caption | badge | small | progress, icon : string, format : date | currency | number | boolean | percent, key : string, header : string }
4
- type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string }
5
- type ColumnSpec = { key : string!, field : string, header : string, width : string, align : left | center | right, className : string, weight : normal | medium | semibold, format : badge | date | currency | number | percent | boolean, icon : string }
3
+ type BadgeColor = "default" | "primary" | "secondary" | "success" | "warning" | "danger" | "error" | "info" | "neutral" | "destructive"
4
+ type FieldSpec = { name : string!, label : string, variant : h3 | h4 | body | caption | badge | small | progress, icon : string, format : date | currency | number | boolean | percent, key : string, header : string, colorMap : Map string BadgeColor, labels : Map string string }
5
+ type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string, roles : [string], when : SExpr }
6
+ type ColumnSpec = { key : string!, field : string, header : string, width : string, align : left | center | right, className : string, weight : normal | medium | semibold, format : badge | date | currency | number | percent | boolean, icon : string, colorMap : Map string BadgeColor, labels : Map string string, variant : h3 | h4 }
6
7
  type FilterSpec = { field : string!, label : string, options : [string] }
7
8
  orbital BrowseItemOrbital {
8
9
  type BrowseDetailAction = {
@@ -10,6 +11,8 @@ orbital BrowseItemOrbital {
10
11
  event : event!
11
12
  icon : string
12
13
  variant : string
14
+ roles : [string]
15
+ when : SExpr
13
16
  }
14
17
 
15
18
  type BrowseItemLoaded = Event { data : [BrowseItem], totalCount : number } "Fired when the BrowseItem collection finishes loading; payload.data holds the (possibly paginated) slice and totalCount holds the unsliced filter total. totalCount is optional so compiled-path emitters that haven't been migrated yet still validate"
@@ -43,6 +46,7 @@ orbital BrowseItemOrbital {
43
46
  config {
44
47
  fields: @config.fields
45
48
  itemActions: @config.itemActions
49
+ viewerRole: @config.viewerRole
46
50
  itemClickEvent: @config.itemClickEvent
47
51
  maxInlineActions: @config.maxInlineActions
48
52
  variant: compact
@@ -283,14 +287,6 @@ orbital BrowseItemOrbital {
283
287
  @label "Badge field binding"
284
288
  @description "Binding path for the status/badge slot."
285
289
  @tier "internal"
286
- imageLabelBinding : string = @item.thumbnailLabel
287
- @label "Image label binding"
288
- @description "Binding path for the image-area label slot."
289
- @tier "internal"
290
- priceBinding : string = @item.price
291
- @label "Price field binding"
292
- @description "Binding path for the price/amount overlay slot."
293
- @tier "internal"
294
290
  metaBinding : string = @item.createdAt
295
291
  @label "Meta field binding"
296
292
  @description "Binding path for the secondary meta slot (timestamp / category). Hosts binding a count or other non-date value should label it in the binding itself (e.g. (str/concat \"Vehicles: \" @item.vehicleCount)) and set metaFormat: none."
@@ -303,14 +299,6 @@ orbital BrowseItemOrbital {
303
299
  @label "Category field binding"
304
300
  @description "Binding path for the category/tag slot."
305
301
  @tier "internal"
306
- priorityBinding : string = @item.priority
307
- @label "Priority field binding"
308
- @description "Binding path for the priority slot."
309
- @tier "internal"
310
- assigneeBinding : string = @item.assignee
311
- @label "Assignee field binding"
312
- @description "Binding path for the assignee/owner slot."
313
- @tier "internal"
314
302
  itemActions : [ItemAction] = []
315
303
  @label "What actions can users take on each row?"
316
304
  @description "Buttons rendered on each row (e.g. Edit, Delete, View)."
@@ -361,6 +349,10 @@ orbital BrowseItemOrbital {
361
349
  @description "Name the field on this entity that holds the viewer's id (e.g. memberId, patientId, assignee). When set, the list loads ONLY rows whose that field equals @user.id — the 'my bookings' / 'my appointments' shape. Left blank the list loads every row, which is the default. Declared, never inferred: guessing the column from its name would silently scope the wrong one."
362
350
  @synonyms "owner field, my records, only mine, only my own, scope to user, per-user list, mine only, owned by me"
363
351
  @tier "policy"
352
+ viewerRole : string = ""
353
+ @label "Viewer's role"
354
+ @description "The signed-in viewer's role that each row action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
355
+ @tier "policy"
364
356
  initialFilterField : string = ""
365
357
  @label "Which field does the first load filter on?"
366
358
  @description "Name the field the INITIAL load filters on, paired with initialFilterValue. This is the detail half of a list-detail pair: a thread that must wait for a conversation to be picked sets the field to its parent key and leaves the value blank, so the first load matches nothing and the empty state shows instead of every record in the table. REFETCH_FILTER then supplies the real selection. Left blank the first load is unfiltered, which is the default."
@@ -396,19 +388,51 @@ orbital BrowseItemOrbital {
396
388
  @description "Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty."
397
389
  @synonyms "filter bar style, facet style, chips, pills"
398
390
  @tier "presentation"
399
- viewPattern : pattern = data-grid
400
- @label "Render pattern"
401
- @description "UI pattern used to render the collection. Used by the default bodyContent tree; Layer 3 variants override bodyContent directly instead and may ignore this knob."
402
- @tier "internal"
391
+ emptyTitle : string = ""
392
+ @label "Empty-state title"
393
+ @description "Specific title shown when there are no rows (\"No orders yet\"). Left blank, a generic line shows."
394
+ @synonyms "empty title, no data title, empty heading"
395
+ @tier "presentation"
396
+ emptyDescription : string = ""
397
+ @label "Empty-state description"
398
+ @description "What will appear here once rows exist."
399
+ @synonyms "empty text, no data message, empty hint"
400
+ @tier "presentation"
401
+ emptyIcon : icon = inbox
402
+ @label "Empty-state icon"
403
+ @description "Domain icon shown when there are no rows."
404
+ @synonyms "empty icon, no data icon"
405
+ @tier "presentation"
403
406
  browseLook : "table" | "dense" | "feed" | "gallery" | "master-detail" | "triage" = table
404
407
  @label "Browse look"
405
408
  @description "Layer 2 visual treatment for the whole browse surface. table = the default data-grid (bodyContent); dense = spreadsheet-style table with toolbar search (denseBodyContent); feed = chronological card stream (feedBodyContent); gallery = image-first responsive card grid (galleryBodyContent); master-detail = record-work split view — dense list left, clicked record's detail right (masterDetailBodyContent); triage = inbox-register compact rows for queue work (triageBodyContent). Selecting a non-table look swaps which body tree renders after rows load; any body may still be overridden directly at the call site for a one-off layout."
406
409
  @tier "presentation"
407
- detailFields : [string] = [name, description, status, createdAt]
410
+ detailFields : [FieldSpec] = [{
411
+ label: Name
412
+ name: name
413
+ variant: h4
414
+ }, {
415
+ label: Description
416
+ name: description
417
+ variant: body
418
+ }, {
419
+ label: Status
420
+ name: status
421
+ variant: badge
422
+ }, {
423
+ format: date
424
+ label: Created
425
+ name: createdAt
426
+ }]
408
427
  @label "Which fields appear in the master-detail record pane?"
409
- @description "Field names shown in the detail panel when browseLook = master-detail; the first entry doubles as the pane title. Consumers overriding columns/fields should override this list to match their entity."
428
+ @description "Fields shown in the detail panel when browseLook = master-detail; the field declared variant h3/h4 is the pane title. Consumers overriding columns/fields should override this list to match their entity."
410
429
  @synonyms "detail columns, record fields, detail pane fields"
411
430
  @tier "presentation"
431
+ detailCloseEvent : event = CLOSE
432
+ @label "Which pane action closes the record?"
433
+ @description "The detailActions entry whose event matches renders as the pane's close (×) button."
434
+ @synonyms "close event, dismiss event, pane close"
435
+ @tier "presentation"
412
436
  detailActions : [BrowseDetailAction] = [{ event: CLOSE, label: Close }]
413
437
  @label "Master-detail record pane actions"
414
438
  @description "Action buttons on the master-detail record pane (detail-panel `actions` descriptors: label/event/icon/variant). Consumers add their own record actions (Edit/Delete/…) alongside or instead of Close."
@@ -451,9 +475,13 @@ orbital BrowseItemOrbital {
451
475
  fields: @config.fields
452
476
  gap: @config.gap
453
477
  imageField: @config.imageField
454
- itemActions: @config.itemActions
478
+ itemClickEvent: @config.itemClickEvent
479
+ itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
455
480
  maxInlineActions: @config.maxInlineActions
456
481
  pageSize: @config.displayPageSize
482
+ emptyDescription: @config.emptyDescription
483
+ emptyIcon: @config.emptyIcon
484
+ emptyTitle: @config.emptyTitle
457
485
  type: data-grid
458
486
  }]
459
487
  direction: vertical
@@ -498,14 +526,16 @@ orbital BrowseItemOrbital {
498
526
  }), {
499
527
  children: [{
500
528
  columns: @config.columns
501
- emptyMessage: "No records"
502
529
  entity: ?data
503
- itemActions: @config.itemActions
530
+ itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
504
531
  itemClickEvent: @config.itemClickEvent
505
532
  look: dense
506
533
  maxInlineActions: @config.maxInlineActions
507
534
  pageSize: @config.displayPageSize
508
535
  selectable: @config.selectable
536
+ emptyDescription: @config.emptyDescription
537
+ emptyIcon: @config.emptyIcon
538
+ emptyTitle: @config.emptyTitle
509
539
  type: table-view
510
540
  }]
511
541
  className: overflow-x-auto
@@ -559,7 +589,8 @@ orbital BrowseItemOrbital {
559
589
  entity: ?data
560
590
  fields: []
561
591
  gap: md
562
- itemActions: @config.itemActions
592
+ itemClickEvent: @config.itemClickEvent
593
+ itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
563
594
  renderItem: (fn item {
564
595
  children: [{
565
596
  align: start
@@ -627,6 +658,9 @@ orbital BrowseItemOrbital {
627
658
  padding: none
628
659
  type: card
629
660
  })
661
+ emptyDescription: @config.emptyDescription
662
+ emptyIcon: @config.emptyIcon
663
+ emptyTitle: @config.emptyTitle
630
664
  type: data-list
631
665
  variant: card
632
666
  }]
@@ -678,9 +712,13 @@ orbital BrowseItemOrbital {
678
712
  fields: @config.fields
679
713
  gap: lg
680
714
  imageField: @config.imageField
681
- itemActions: @config.itemActions
715
+ itemClickEvent: @config.itemClickEvent
716
+ itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
682
717
  maxInlineActions: @config.maxInlineActions
683
718
  minCardWidth: 260
719
+ emptyDescription: @config.emptyDescription
720
+ emptyIcon: @config.emptyIcon
721
+ emptyTitle: @config.emptyTitle
684
722
  type: data-grid
685
723
  }]
686
724
  className: w-full
@@ -728,8 +766,12 @@ orbital BrowseItemOrbital {
728
766
  children: [{
729
767
  entity: ?data
730
768
  fields: @config.fields
731
- itemActions: @config.itemActions
769
+ itemClickEvent: @config.itemClickEvent
770
+ itemActions: (array/filter @config.itemActions (fn item (or (= (array/len (object/get @item roles [])) 0) (array/includes (object/get @item roles []) @config.viewerRole))))
732
771
  maxInlineActions: @config.maxInlineActions
772
+ emptyDescription: @config.emptyDescription
773
+ emptyIcon: @config.emptyIcon
774
+ emptyTitle: @config.emptyTitle
733
775
  type: data-list
734
776
  variant: compact
735
777
  }]
@@ -844,8 +886,9 @@ orbital BrowseItemOrbital {
844
886
  type: stack
845
887
  }), {
846
888
  detail: {
847
- actions: @config.detailActions
848
- fieldNames: @config.detailFields
889
+ actions: (array/filter @config.detailActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
890
+ fields: @config.detailFields
891
+ closeEvent: @config.detailCloseEvent
849
892
  initialData: ?row
850
893
  showActions: true
851
894
  type: detail-panel
@@ -1,6 +1,6 @@
1
1
  app std-calendar "1.4.0"
2
2
  "std-calendar as a Function — owns the fetch + SELECT_DAY state machine; default bodyContent renders the month-grid + upcoming-events tree. `config.calendarLook` switches the body between the default month-grid ('month'), a day-grouped agenda list ('agenda-list'), and a 7-column week timeline ('week-timeline') while inheriting the same trait, state machine, emits, and listens."
3
- type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string }
3
+ type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string, roles : [string], when : SExpr }
4
4
  type FilterSpec = { field : string!, label : string, options : [string] }
5
5
  type FieldSpec = { name : string!, label : string, variant : h3 | h4 | body | caption | badge | small | progress, icon : string, format : date | currency | number | boolean | percent }
6
6
  orbital CalendarEventOrbital {
@@ -279,6 +279,10 @@ orbital CalendarEventOrbital {
279
279
  @description "Per-item action buttons on agenda-list rows — data-list itemActions descriptors (label/event/icon/variant). Consumers override to wire their own row actions (View/Edit/Delete) so agenda hosts never need a second table for actions."
280
280
  @synonyms "agenda actions, row actions, event actions, list actions"
281
281
  @tier "presentation"
282
+ viewerRole : string = ""
283
+ @label "Viewer's role"
284
+ @description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
285
+ @tier "policy"
282
286
  agendaGroupBy : string = date
283
287
  @label "Agenda group-by field"
284
288
  @description "Row field the agenda list groups its day sections by. Rebound hosts point this at their own timestamp column (e.g. startTime, scheduledAt)."
@@ -378,7 +382,7 @@ orbital CalendarEventOrbital {
378
382
  }, {
379
383
  entity: ?data
380
384
  fields: @config.fields
381
- itemActions: @config.agendaItemActions
385
+ itemActions: (array/filter @config.agendaItemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
382
386
  look: @config.tableLook
383
387
  type: data-list
384
388
  }]
@@ -446,7 +450,7 @@ orbital CalendarEventOrbital {
446
450
  fields: []
447
451
  gap: md
448
452
  groupBy: @config.agendaGroupBy
449
- itemActions: @config.agendaItemActions
453
+ itemActions: (array/filter @config.agendaItemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
450
454
  renderItem: (fn item {
451
455
  children: [{
452
456
  align: start
@@ -1,5 +1,6 @@
1
1
  app std-esign-flow "1.2.0"
2
2
  "std-esign-flow — the send-for-signature flow: list signature requests, create one (pick document + recipient), resend or cancel, track status. Composes std-file-store + std-esign-request; no document-rendering or code-preview chrome. v1.2 (W5): EnvelopeDispatcher wires sessions to the real `esign` service — SEND_ENVELOPE dispatches a DocuSign envelope (the document rides the event as an UploadDropZone-shaped file payload, since StoredFile rows are metadata-only) and stamps `envelopeId`/`sentAt`/status=sent; the browse grid's per-row \"Refresh status\" pulls getEnvelopeStatus and maps completed/delivered/declined onto signed/viewed/declined."
3
+ type ItemAction = { label : string!, event : event, variant : string, roles : [string], when : SExpr }
3
4
  orbital SignatureSessionOrbital {
4
5
  uses StoredFile from "std/behaviors/std-file-store"
5
6
 
@@ -95,19 +96,7 @@ orbital SignatureSessionOrbital {
95
96
  name: sentAt
96
97
  variant: caption
97
98
  }]
98
- itemActions: [{
99
- event: RESEND_REQUEST
100
- label: Resend
101
- variant: primary
102
- }, {
103
- event: REQUEST_DELETE
104
- label: Cancel
105
- variant: danger
106
- }, {
107
- event: CHECK_ENVELOPE_STATUS
108
- label: "Refresh status"
109
- variant: secondary
110
- }]
99
+ itemActions: (array/filter @config.itemActions (fn action (or (= (array/len (object/get @action roles [])) 0) (array/includes (object/get @action roles []) @config.viewerRole))))
111
100
  type: data-grid
112
101
  }]
113
102
  direction: vertical
@@ -216,6 +205,29 @@ orbital SignatureSessionOrbital {
216
205
  SignatureSessionPersistor.SESSION_RESENT -> INIT
217
206
  SignatureSessionPersistor.SESSION_DELETED -> INIT
218
207
  }
208
+
209
+ config {
210
+ itemActions : [ItemAction] = [{
211
+ event: RESEND_REQUEST
212
+ label: Resend
213
+ variant: primary
214
+ }, {
215
+ event: REQUEST_DELETE
216
+ label: Cancel
217
+ variant: danger
218
+ }, {
219
+ event: CHECK_ENVELOPE_STATUS
220
+ label: "Refresh status"
221
+ variant: secondary
222
+ }]
223
+ @label "Row actions"
224
+ @description "Actions offered on each row; give an item `roles` to show it only to those viewer roles."
225
+ @tier "presentation"
226
+ viewerRole : string = ""
227
+ @label "Viewer's role"
228
+ @description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
229
+ @tier "policy"
230
+ }
219
231
  }
220
232
 
221
233
  trait SignatureSessionCreate = Modal.traits.ModalRecordModal -> SignatureSession {
@@ -61,6 +61,7 @@ orbital ESignRequestOrbital {
61
61
  label: Revoke
62
62
  variant: danger
63
63
  }]
64
+ viewerRole: @config.viewerRole
64
65
  look: @config.tableLook
65
66
  }
66
67
  }
@@ -178,6 +179,10 @@ orbital ESignRequestOrbital {
178
179
  @label "Table look"
179
180
  @description "Layer 2 visual treatment for the data table rendered by this atom."
180
181
  @tier "presentation"
182
+ viewerRole : string = ""
183
+ @label "Viewer's role"
184
+ @description "The signed-in viewer's role that each action's `roles` is checked against. Bind it explicitly at the call site (e.g. `viewerRole: @user.role`) in an app whose identity carries a role; left empty, only actions with no `roles` show."
185
+ @tier "policy"
181
186
  }
182
187
  }
183
188
 
@@ -128,6 +128,10 @@ orbital EventLogOrbital {
128
128
  }, {
129
129
  entity: @entity.entries
130
130
  fields: (title description date status)
131
+ titleField: @config.titleField
132
+ descriptionField: @config.descriptionField
133
+ dateField: @config.dateField
134
+ statusField: @config.statusField
131
135
  look: @config.timelineLook
132
136
  type: timeline
133
137
  }]
@@ -224,6 +228,10 @@ orbital EventLogOrbital {
224
228
  }, {
225
229
  entity: @entity.entries
226
230
  fields: (title description date status)
231
+ titleField: @config.titleField
232
+ descriptionField: @config.descriptionField
233
+ dateField: @config.dateField
234
+ statusField: @config.statusField
227
235
  look: @config.timelineLook
228
236
  type: timeline
229
237
  }]
@@ -339,6 +347,10 @@ orbital EventLogOrbital {
339
347
  }, {
340
348
  entity: @entity.entries
341
349
  fields: (title description date status)
350
+ titleField: @config.titleField
351
+ descriptionField: @config.descriptionField
352
+ dateField: @config.dateField
353
+ statusField: @config.statusField
342
354
  look: @config.timelineLook
343
355
  type: timeline
344
356
  }]
@@ -451,6 +463,10 @@ orbital EventLogOrbital {
451
463
  }, {
452
464
  entity: @entity.entries
453
465
  fields: (title description date status)
466
+ titleField: @config.titleField
467
+ descriptionField: @config.descriptionField
468
+ dateField: @config.dateField
469
+ statusField: @config.statusField
454
470
  look: @config.timelineLook
455
471
  type: timeline
456
472
  }]
@@ -630,6 +646,22 @@ orbital EventLogOrbital {
630
646
  @label "Card look"
631
647
  @description "Layer 2 visual treatment for cards rendered by this atom."
632
648
  @tier "presentation"
649
+ titleField : string = "title"
650
+ @label "Title field"
651
+ @description "Entity field holding each event's title."
652
+ @tier "presentation"
653
+ descriptionField : string = "description"
654
+ @label "Description field"
655
+ @description "Entity field holding each event's description."
656
+ @tier "presentation"
657
+ dateField : string = "date"
658
+ @label "Date field"
659
+ @description "Entity field holding each event's date."
660
+ @tier "presentation"
661
+ statusField : string = "status"
662
+ @label "Status field"
663
+ @description "Entity field holding each event's status (complete | active | pending | error)."
664
+ @tier "presentation"
633
665
  timelineLook : "vertical-compact" | "vertical-spacious" | "horizontal" | "swimlane" = vertical-spacious
634
666
  @label "Timeline look"
635
667
  @description "Layer 2 visual treatment for the timeline."
@@ -659,11 +691,6 @@ orbital EventLogOrbital {
659
691
  @description "Records fetched from the server per REFETCH_PAGE request. The initial load and every search/kind/filter refetch stay unpaginated (load everything that matches) so the default unlimited activity feed is unchanged; only an explicit REFETCH_PAGE from a composed std-pagination control applies this limit."
660
692
  @synonyms "fetch limit, records per page, page limit"
661
693
  @tier "presentation"
662
- displayPageSize : number = 20
663
- @label "How many entries per page should a pager show?"
664
- @description "Page size a consumer-composed std-pagination control should use to compute total pages (e.g. from totalCount). This atom's own timeline pattern has no built-in pager UI, so this knob is informational for the composed control, not consumed by the timeline itself."
665
- @synonyms "visible rows, items per page, display limit"
666
- @tier "presentation"
667
694
  }
668
695
  }
669
696
 
@@ -59,16 +59,6 @@ orbital ExportOrbital {
59
59
  }
60
60
 
61
61
  config {
62
- tileId : string = ""
63
- @label "Tile id"
64
- @description "Identifier of the dashboard tile being exported"
65
- @synonyms "internal identifier — host orbital wires this; users rarely set it directly"
66
- @tier "internal"
67
- event : string = EXPORT_REQUESTED
68
- @label "Export event"
69
- @description "Event emitted when the user picks a format. Each entry in formats[] carries its own literal event field (no per-item templating in .lolo) — overriding this alone does not retarget the click; also set formats[].event to match."
70
- @synonyms "bus event name. internal wiring; users rarely target directly"
71
- @tier "internal"
72
62
  formats : [FormatOption] = [{
73
63
  event: EXPORT_REQUESTED
74
64
  format: csv