@almadar/std 16.234.0 → 16.236.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/behaviors/behaviors-registry.json +4402 -1898
  2. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +25 -41
  3. package/behaviors/lolo/infra/atoms/std-audit-capture.lolo +0 -5
  4. package/behaviors/lolo/infra/atoms/std-cache-aside.lolo +0 -24
  5. package/behaviors/lolo/infra/atoms/std-circuit-breaker.lolo +1 -17
  6. package/behaviors/lolo/infra/atoms/std-data-erasure.lolo +17 -24
  7. package/behaviors/lolo/infra/atoms/std-data-import.lolo +8 -11
  8. package/behaviors/lolo/infra/atoms/std-game-clock.lolo +2 -0
  9. package/behaviors/lolo/infra/atoms/std-knowledge-loop.lolo +0 -5
  10. package/behaviors/lolo/infra/atoms/std-lifecycle.lolo +3 -1
  11. package/behaviors/lolo/infra/atoms/std-mod-queue.lolo +40 -18
  12. package/behaviors/lolo/infra/atoms/std-notification-preferences.lolo +20 -11
  13. package/behaviors/lolo/infra/atoms/std-notify-on-event.lolo +0 -5
  14. package/behaviors/lolo/infra/atoms/std-permission-matrix.lolo +23 -11
  15. package/behaviors/lolo/infra/atoms/std-rate-limiter.lolo +84 -22
  16. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +1 -6
  17. package/behaviors/lolo/ml/atoms/std-graph-builder.lolo +3 -1
  18. package/behaviors/lolo/ml/atoms/std-ml-classify.lolo +0 -4
  19. package/behaviors/lolo/ml/atoms/std-ml-similarity.lolo +0 -4
  20. package/behaviors/lolo/ui/avl/atoms/ui-avl-state-machine.lolo +12 -0
  21. package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +55 -9
  22. package/behaviors/lolo/ui/core/atoms/std-app-search.lolo +6 -2
  23. package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +19 -14
  24. package/behaviors/lolo/ui/core/atoms/std-board.lolo +77 -27
  25. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +44 -28
  26. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +7 -3
  27. package/behaviors/lolo/ui/core/atoms/std-esign-flow.lolo +25 -13
  28. package/behaviors/lolo/ui/core/atoms/std-esign-request.lolo +5 -0
  29. package/behaviors/lolo/ui/core/atoms/std-event-log.lolo +0 -5
  30. package/behaviors/lolo/ui/core/atoms/std-export.lolo +0 -10
  31. package/behaviors/lolo/ui/core/atoms/std-file-store.lolo +7 -3
  32. package/behaviors/lolo/ui/core/atoms/std-form-advanced.lolo +1 -6
  33. package/behaviors/lolo/ui/core/atoms/std-geosearch.lolo +1 -0
  34. package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +20 -4
  35. package/behaviors/lolo/ui/core/atoms/std-import.lolo +0 -5
  36. package/behaviors/lolo/ui/core/atoms/std-list.lolo +46 -32
  37. package/behaviors/lolo/ui/core/atoms/std-modal-editor.lolo +2 -2
  38. package/behaviors/lolo/ui/core/atoms/std-rating-review.lolo +12 -13
  39. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +16 -12
  40. package/behaviors/lolo/ui/core/atoms/std-recurrence.lolo +10 -1
  41. package/behaviors/lolo/ui/core/atoms/std-role-gate.lolo +39 -0
  42. package/behaviors/lolo/ui/core/atoms/std-saved-search.lolo +78 -16
  43. package/behaviors/lolo/ui/core/atoms/std-selection.lolo +15 -10
  44. package/behaviors/lolo/ui/core/atoms/std-stats.lolo +5 -5
  45. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +3 -0
  46. package/behaviors/lolo/ui/core/atoms/std-thread.lolo +41 -73
  47. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +20 -11
  48. package/behaviors/lolo/ui/core/atoms/std-vote.lolo +0 -4
  49. package/behaviors/lolo/ui/core/atoms/std-wizard.lolo +3 -3
  50. package/behaviors/lolo/ui/core/atoms/ui-presence.lolo +21 -0
  51. package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +6 -1
  52. package/behaviors/lolo/ui/core/molecules/ui-chart.lolo +11 -1
  53. package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +13 -8
  54. package/behaviors/lolo/ui/core/molecules/ui-command-palette.lolo +7 -2
  55. package/behaviors/lolo/ui/core/molecules/ui-commit-row.lolo +2 -2
  56. package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +8 -0
  57. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +41 -3
  58. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +41 -3
  59. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +30 -9
  60. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +8 -3
  61. package/behaviors/lolo/ui/core/molecules/ui-document-viewer.lolo +6 -1
  62. package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +13 -0
  63. package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +6 -1
  64. package/behaviors/lolo/ui/core/molecules/ui-floating-toolbar.lolo +6 -1
  65. package/behaviors/lolo/ui/core/molecules/ui-form-actions.lolo +6 -1
  66. package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +6 -1
  67. package/behaviors/lolo/ui/core/molecules/ui-menu.lolo +6 -1
  68. package/behaviors/lolo/ui/core/molecules/ui-meter.lolo +6 -1
  69. package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +5 -0
  70. package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +11 -1
  71. package/behaviors/lolo/ui/core/molecules/ui-page-transition.lolo +1 -1
  72. package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +44 -15
  73. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +41 -3
  74. package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +8 -2
  75. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +66 -12
  76. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +9 -3
  77. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +9 -3
  78. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +18 -9
  79. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +55 -10
  80. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +55 -10
  81. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +8 -3
  82. package/behaviors/lolo/ui/core/organisms/ui-state-machine-view.lolo +12 -0
  83. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +8 -3
  84. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +2 -44
  85. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +6 -1
  86. package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +2 -37
  87. package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +8 -2
  88. package/behaviors/lolo/ui/game/organisms/std-arcade-board-3d.lolo +2 -2
  89. package/behaviors/lolo/ui/game/organisms/std-crew-board-2d.lolo +0 -4
  90. package/behaviors/lolo/ui/game/organisms/std-platformer-puzzle.lolo +2 -66
  91. package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +0 -4
  92. package/behaviors/lolo/ui/game/organisms/std-worldmap-board-2d.lolo +0 -4
  93. package/behaviors/lolo/ui/learning/atoms/std-learn-stepper.lolo +6 -6
  94. package/behaviors/lolo-behavior-contracts.json +1 -1
  95. package/behaviors/registry/factory-signatures.json +1 -1
  96. package/behaviors/registry/infra/atoms/std-approval-gate.orb +124 -67
  97. package/behaviors/registry/infra/atoms/std-audit-capture.orb +0 -8
  98. package/behaviors/registry/infra/atoms/std-cache-aside.orb +0 -84
  99. package/behaviors/registry/infra/atoms/std-circuit-breaker.orb +1 -44
  100. package/behaviors/registry/infra/atoms/std-data-erasure.orb +124 -55
  101. package/behaviors/registry/infra/atoms/std-data-import.orb +12 -11
  102. package/behaviors/registry/infra/atoms/std-game-clock.orb +31 -0
  103. package/behaviors/registry/infra/atoms/std-knowledge-loop.orb +0 -57
  104. package/behaviors/registry/infra/atoms/std-lifecycle.orb +43 -0
  105. package/behaviors/registry/infra/atoms/std-mod-queue.orb +379 -103
  106. package/behaviors/registry/infra/atoms/std-notification-preferences.orb +126 -12
  107. package/behaviors/registry/infra/atoms/std-notify-on-event.orb +0 -11
  108. package/behaviors/registry/infra/atoms/std-permission-matrix.orb +128 -12
  109. package/behaviors/registry/infra/atoms/std-rate-limiter.orb +287 -72
  110. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +5 -8
  111. package/behaviors/registry/ml/atoms/std-graph-builder.orb +11 -0
  112. package/behaviors/registry/ml/atoms/std-ml-classify.orb +0 -7
  113. package/behaviors/registry/ml/atoms/std-ml-similarity.orb +0 -7
  114. package/behaviors/registry/ui/avl/atoms/ui-avl-state-machine.orb +82 -0
  115. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +417 -9
  116. package/behaviors/registry/ui/core/atoms/std-app-search.orb +53 -1
  117. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +209 -19
  118. package/behaviors/registry/ui/core/atoms/std-board.orb +242 -61
  119. package/behaviors/registry/ui/core/atoms/std-browse.orb +295 -41
  120. package/behaviors/registry/ui/core/atoms/std-calendar.orb +96 -2
  121. package/behaviors/registry/ui/core/atoms/std-esign-flow.orb +122 -15
  122. package/behaviors/registry/ui/core/atoms/std-esign-request.orb +11 -0
  123. package/behaviors/registry/ui/core/atoms/std-event-log.orb +0 -8
  124. package/behaviors/registry/ui/core/atoms/std-export.orb +0 -16
  125. package/behaviors/registry/ui/core/atoms/std-file-store.orb +109 -2
  126. package/behaviors/registry/ui/core/atoms/std-form-advanced.orb +1 -43
  127. package/behaviors/registry/ui/core/atoms/std-geosearch.orb +5 -0
  128. package/behaviors/registry/ui/core/atoms/std-graphs.orb +173 -66
  129. package/behaviors/registry/ui/core/atoms/std-import.orb +0 -8
  130. package/behaviors/registry/ui/core/atoms/std-list.orb +226 -34
  131. package/behaviors/registry/ui/core/atoms/std-modal-editor.orb +10 -1
  132. package/behaviors/registry/ui/core/atoms/std-rating-review.orb +37 -19
  133. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +204 -11
  134. package/behaviors/registry/ui/core/atoms/std-recurrence.orb +89 -4
  135. package/behaviors/registry/ui/core/atoms/std-role-gate.orb +217 -0
  136. package/behaviors/registry/ui/core/atoms/std-saved-search.orb +419 -19
  137. package/behaviors/registry/ui/core/atoms/std-selection.orb +140 -10
  138. package/behaviors/registry/ui/core/atoms/std-stats.orb +73 -1
  139. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +3 -0
  140. package/behaviors/registry/ui/core/atoms/std-thread.orb +190 -115
  141. package/behaviors/registry/ui/core/atoms/std-version-history.orb +127 -13
  142. package/behaviors/registry/ui/core/atoms/std-vote.orb +0 -9
  143. package/behaviors/registry/ui/core/atoms/std-wizard.orb +33 -3
  144. package/behaviors/registry/ui/core/atoms/ui-presence.orb +59 -0
  145. package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +53 -1
  146. package/behaviors/registry/ui/core/molecules/ui-chart.orb +68 -1
  147. package/behaviors/registry/ui/core/molecules/ui-code-block.orb +291 -8
  148. package/behaviors/registry/ui/core/molecules/ui-command-palette.orb +87 -2
  149. package/behaviors/registry/ui/core/molecules/ui-commit-row.orb +3 -2
  150. package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +32 -0
  151. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +189 -3
  152. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +189 -3
  153. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +81 -24
  154. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +121 -3
  155. package/behaviors/registry/ui/core/molecules/ui-document-viewer.orb +53 -1
  156. package/behaviors/registry/ui/core/molecules/ui-drawer.orb +40 -0
  157. package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +53 -1
  158. package/behaviors/registry/ui/core/molecules/ui-floating-toolbar.orb +53 -1
  159. package/behaviors/registry/ui/core/molecules/ui-form-actions.orb +53 -1
  160. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +53 -1
  161. package/behaviors/registry/ui/core/molecules/ui-menu.orb +57 -1
  162. package/behaviors/registry/ui/core/molecules/ui-meter.orb +53 -1
  163. package/behaviors/registry/ui/core/molecules/ui-modal.orb +8 -0
  164. package/behaviors/registry/ui/core/molecules/ui-page-header.orb +60 -1
  165. package/behaviors/registry/ui/core/molecules/ui-page-transition.orb +1 -1
  166. package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +393 -23
  167. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +189 -3
  168. package/behaviors/registry/ui/core/molecules/ui-tabs.orb +99 -2
  169. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +282 -20
  170. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +130 -3
  171. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +130 -3
  172. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +367 -9
  173. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +104 -13
  174. package/behaviors/registry/ui/core/organisms/ui-form.orb +104 -13
  175. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +121 -3
  176. package/behaviors/registry/ui/core/organisms/ui-state-machine-view.orb +82 -0
  177. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +121 -3
  178. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +1 -172
  179. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +53 -1
  180. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +1 -116
  181. package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +99 -2
  182. package/behaviors/registry/ui/game/organisms/std-arcade-board-3d.orb +10 -0
  183. package/behaviors/registry/ui/game/organisms/std-crew-board-2d.orb +0 -7
  184. package/behaviors/registry/ui/game/organisms/std-platformer-puzzle.orb +1 -807
  185. package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +0 -7
  186. package/behaviors/registry/ui/game/organisms/std-worldmap-board-2d.orb +0 -7
  187. package/behaviors/registry/ui/learning/atoms/std-learn-stepper.orb +6 -0
  188. package/canonical-operators.json +18 -1
  189. package/dist/behaviors/exports-reader.js +7662 -3762
  190. package/dist/behaviors/functions/index.d.ts +309 -104
  191. package/dist/behaviors/functions/index.js +7651 -3762
  192. package/dist/behaviors/index.d.ts +1 -1
  193. package/dist/behaviors/index.js +7663 -3763
  194. package/dist/behaviors/query.js +7662 -3762
  195. package/dist/behaviors-embeddings.hash.json +3 -3
  196. package/dist/behaviors-embeddings.json +35 -27
  197. package/dist/behaviors-registry.json +4402 -1898
  198. package/dist/index.d.ts +3 -3
  199. package/dist/index.js +7697 -3763
  200. package/dist/knob-embeddings.hash.json +3 -3
  201. package/dist/knob-embeddings.json +612 -352
  202. package/dist/modules/anim.d.ts +1 -1
  203. package/dist/modules/array.d.ts +1 -1
  204. package/dist/modules/array.js +15 -0
  205. package/dist/modules/async.d.ts +1 -1
  206. package/dist/modules/async.js +9 -0
  207. package/dist/modules/behavior.d.ts +1 -1
  208. package/dist/modules/browser.d.ts +1 -1
  209. package/dist/modules/composition.d.ts +1 -1
  210. package/dist/modules/contract.d.ts +1 -1
  211. package/dist/modules/core.d.ts +1 -1
  212. package/dist/modules/core.js +10 -0
  213. package/dist/modules/data.d.ts +1 -1
  214. package/dist/modules/ease.d.ts +1 -1
  215. package/dist/modules/format.d.ts +1 -1
  216. package/dist/modules/geo.d.ts +1 -1
  217. package/dist/modules/graph.d.ts +1 -1
  218. package/dist/modules/grid.d.ts +1 -1
  219. package/dist/modules/index.d.ts +1 -1
  220. package/dist/modules/index.js +34 -0
  221. package/dist/modules/integration.d.ts +1 -1
  222. package/dist/modules/json.d.ts +1 -1
  223. package/dist/modules/llm.d.ts +1 -1
  224. package/dist/modules/math.d.ts +1 -1
  225. package/dist/modules/memory.d.ts +1 -1
  226. package/dist/modules/nn.d.ts +1 -1
  227. package/dist/modules/noise.d.ts +1 -1
  228. package/dist/modules/object.d.ts +1 -1
  229. package/dist/modules/os.d.ts +1 -1
  230. package/dist/modules/path.d.ts +1 -1
  231. package/dist/modules/prob.d.ts +1 -1
  232. package/dist/modules/session.d.ts +1 -1
  233. package/dist/modules/str.d.ts +1 -1
  234. package/dist/modules/tensor.d.ts +1 -1
  235. package/dist/modules/time.d.ts +1 -1
  236. package/dist/modules/trace.d.ts +1 -1
  237. package/dist/modules/train.d.ts +1 -1
  238. package/dist/modules/validate.d.ts +1 -1
  239. package/dist/modules/vector.d.ts +1 -1
  240. package/dist/modules/workspace.d.ts +1 -1
  241. package/dist/registry/factory-signatures.json +1 -1
  242. package/dist/registry.d.ts +5 -2
  243. package/dist/registry.js +55 -1
  244. package/dist/{types-DwAW4Nni.d.ts → types-DLx38UFZ.d.ts} +31 -4
  245. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "std-graphs — embeddable chart atom. ITEMS_LOADED groups @payload.data by @config.categoryField (or @config.timeField when timeAxis=true) and aggregates per bucket. Multi-series rendering via @config.series (preformatted ChartSeries shape). Histograms via chartType=histogram pass pre-binned @payload.data through unchanged. Stacked / 100% stacked bars via @config.stack. Post-process sort + limit. Clicking a data point emits UI:@config.drillEvent with { label, value, seriesLabel? }. Drop into a dashboard alongside std-stats / std-browse.",
2
+ "description": "std-graphs — embeddable chart atom. ITEMS_LOADED keeps the rows whose @config.filterField equals @config.filterValue (blank = all), groups them by @config.categoryField, or (timeAxis=true) by the @config.period bucket of @config.timeField — rows without a time value have no place on a time axis and are left out — and aggregates per bucket. Multi-series rendering via @config.series (preformatted ChartSeries shape). Histograms via chartType=histogram pass pre-binned @payload.data through unchanged. Stacked / 100% stacked bars via @config.stack. Post-process sort + limit. Clicking a data point emits UI:@config.drillEvent with { label, value, seriesLabel? }. Drop into a dashboard alongside std-stats / std-browse.",
3
3
  "ledger": {
4
4
  "entries": {
5
5
  "ent_01KXG04GN3VS5JTJHRM5AAK86J": {
@@ -173,6 +173,22 @@
173
173
  "tier": "internal",
174
174
  "type": "event"
175
175
  },
176
+ "filterField": {
177
+ "default": "",
178
+ "description": "Row field a row must match to be charted (blank = every row), compared with filterValue — e.g. status + paid charts paid invoices only",
179
+ "label": "Only count rows where field",
180
+ "synonyms": "only include, where, filter by, restrict to. user phrases: 'only paid invoices' -> filterField=status + filterValue=paid; 'just the open deals' -> filterField=status + filterValue=open",
181
+ "tier": "presentation",
182
+ "type": "string"
183
+ },
184
+ "filterValue": {
185
+ "default": "",
186
+ "description": "The value filterField must equal for a row to be charted",
187
+ "label": "Equals",
188
+ "synonyms": "the kept value. user phrases: 'only paid' -> paid; 'just active ones' -> active",
189
+ "tier": "presentation",
190
+ "type": "string"
191
+ },
176
192
  "height": {
177
193
  "default": 280.0,
178
194
  "description": "Pixel height of the rendered chart",
@@ -437,6 +453,7 @@
437
453
  "data": "@entity.chartData",
438
454
  "drillEvent": "@config.drillEvent",
439
455
  "height": "@config.height",
456
+ "period": "@config.period",
440
457
  "series": "@config.series",
441
458
  "showLegend": "@config.showLegend",
442
459
  "showValues": "@config.showValues",
@@ -456,84 +473,141 @@
456
473
  {
457
474
  "effects": [
458
475
  [
459
- "set",
460
- "@entity.chartData",
476
+ "let",
461
477
  [
462
- "if",
463
478
  [
464
- "=",
465
- "@config.chartType",
466
- "histogram"
467
- ],
468
- [
469
- "array/map",
470
- "@payload.data",
479
+ "rows",
471
480
  [
472
- "fn",
473
- "p",
474
- {
475
- "label": [
476
- "object/get",
477
- "@p",
478
- "label"
479
- ],
480
- "value": [
481
- "object/get",
482
- "@p",
483
- "value"
481
+ "if",
482
+ [
483
+ "=",
484
+ "@config.filterField",
485
+ ""
486
+ ],
487
+ "@payload.data",
488
+ [
489
+ "array/filter",
490
+ "@payload.data",
491
+ [
492
+ "fn",
493
+ "row",
494
+ [
495
+ "=",
496
+ [
497
+ "object/get",
498
+ "@row",
499
+ "@config.filterField"
500
+ ],
501
+ "@config.filterValue"
502
+ ]
484
503
  ]
485
- }
504
+ ]
486
505
  ]
487
- ],
506
+ ]
507
+ ],
508
+ [
509
+ "set",
510
+ "@entity.chartData",
488
511
  [
489
- "array/map",
512
+ "if",
490
513
  [
491
- "object/entries",
514
+ "=",
515
+ "@config.chartType",
516
+ "histogram"
517
+ ],
518
+ [
519
+ "array/map",
520
+ "@rows",
492
521
  [
493
- "array/groupBy",
494
- "@payload.data",
495
- [
496
- "if",
497
- "@config.timeAxis",
498
- "@config.timeField",
499
- "@config.categoryField"
500
- ]
522
+ "fn",
523
+ "p",
524
+ {
525
+ "label": [
526
+ "object/get",
527
+ "@p",
528
+ "label"
529
+ ],
530
+ "value": [
531
+ "object/get",
532
+ "@p",
533
+ "value"
534
+ ]
535
+ }
501
536
  ]
502
537
  ],
503
538
  [
504
- "fn",
505
- "entry",
506
- {
507
- "label": [
508
- "object/get",
509
- "@entry",
510
- "0"
511
- ],
512
- "value": [
539
+ "array/map",
540
+ [
541
+ "object/entries",
542
+ [
513
543
  "if",
544
+ "@config.timeAxis",
514
545
  [
515
- "=",
516
- "@config.aggregation",
517
- "sum"
518
- ],
519
- [
520
- "array/sum",
546
+ "array/groupBy",
521
547
  [
522
- "object/get",
523
- "@entry",
524
- "1"
548
+ "array/map",
549
+ [
550
+ "array/filter",
551
+ "@rows",
552
+ [
553
+ "fn",
554
+ "row",
555
+ [
556
+ "object/get",
557
+ "@row",
558
+ "@config.timeField"
559
+ ]
560
+ ]
561
+ ],
562
+ [
563
+ "fn",
564
+ "row",
565
+ [
566
+ "object/set",
567
+ "@row",
568
+ "periodStart",
569
+ [
570
+ "time/startOf",
571
+ [
572
+ "time/parse",
573
+ [
574
+ "object/get",
575
+ "@row",
576
+ "@config.timeField"
577
+ ]
578
+ ],
579
+ "@config.period"
580
+ ]
581
+ ]
582
+ ]
525
583
  ],
526
- "@config.valueField"
584
+ "periodStart"
527
585
  ],
528
586
  [
587
+ "array/groupBy",
588
+ "@rows",
589
+ "@config.categoryField"
590
+ ]
591
+ ]
592
+ ],
593
+ [
594
+ "fn",
595
+ "entry",
596
+ {
597
+ "label": [
598
+ "object/get",
599
+ "@entry",
600
+ "0"
601
+ ],
602
+ "value": [
529
603
  "if",
530
604
  [
531
605
  "=",
532
606
  "@config.aggregation",
533
- "avg"
607
+ "sum"
534
608
  ],
535
609
  [
536
- "array/avg",
610
+ "array/sum",
537
611
  [
538
612
  "object/get",
539
613
  "@entry",
@@ -546,10 +620,10 @@
546
620
  [
547
621
  "=",
548
622
  "@config.aggregation",
549
- "min"
623
+ "avg"
550
624
  ],
551
625
  [
552
- "array/min",
626
+ "array/avg",
553
627
  [
554
628
  "object/get",
555
629
  "@entry",
@@ -562,10 +636,10 @@
562
636
  [
563
637
  "=",
564
638
  "@config.aggregation",
565
- "max"
639
+ "min"
566
640
  ],
567
641
  [
568
- "array/max",
642
+ "array/min",
569
643
  [
570
644
  "object/get",
571
645
  "@entry",
@@ -574,22 +648,54 @@
574
648
  "@config.valueField"
575
649
  ],
576
650
  [
577
- "array/len",
651
+ "if",
578
652
  [
579
- "object/get",
580
- "@entry",
581
- "1"
653
+ "=",
654
+ "@config.aggregation",
655
+ "max"
656
+ ],
657
+ [
658
+ "array/max",
659
+ [
660
+ "object/get",
661
+ "@entry",
662
+ "1"
663
+ ],
664
+ "@config.valueField"
665
+ ],
666
+ [
667
+ "array/len",
668
+ [
669
+ "object/get",
670
+ "@entry",
671
+ "1"
672
+ ]
582
673
  ]
583
674
  ]
584
675
  ]
585
676
  ]
586
677
  ]
587
- ]
588
- }
678
+ }
679
+ ]
589
680
  ]
590
681
  ]
591
682
  ]
592
683
  ],
684
+ [
685
+ "set",
686
+ "@entity.chartData",
687
+ [
688
+ "if",
689
+ "@config.timeAxis",
690
+ [
691
+ "array/sort",
692
+ "@entity.chartData",
693
+ "label",
694
+ "asc"
695
+ ],
696
+ "@entity.chartData"
697
+ ]
698
+ ],
593
699
  [
594
700
  "set",
595
701
  "@entity.chartData",
@@ -635,6 +741,7 @@
635
741
  "data": "@entity.chartData",
636
742
  "drillEvent": "@config.drillEvent",
637
743
  "height": "@config.height",
744
+ "period": "@config.period",
638
745
  "series": "@config.series",
639
746
  "showLegend": "@config.showLegend",
640
747
  "showValues": "@config.showValues",
@@ -283,14 +283,6 @@
283
283
  "tier": "presentation",
284
284
  "type": "string"
285
285
  },
286
- "event": {
287
- "default": "IMPORT_SOURCE_PICKED",
288
- "description": "Event emitted when the user picks a source. Each entry in sources[] carries its own literal event field (no per-item templating in .lolo) — overriding this alone does not retarget the click; also set sources[].event to match.",
289
- "label": "Source-picked event",
290
- "synonyms": "bus event name. internal wiring; users rarely target directly",
291
- "tier": "internal",
292
- "type": "string"
293
- },
294
286
  "sources": {
295
287
  "default": [
296
288
  {
@@ -218,6 +218,22 @@
218
218
  "kind": "trait",
219
219
  "owner": "workspace",
220
220
  "renames": []
221
+ },
222
+ "trt_01M3SFBP29125B6XWS09H2479Q": {
223
+ "bakedName": "ListItemCreateButton",
224
+ "curName": "ListItemCreateButton",
225
+ "id": "trt_01M3SFBP29125B6XWS09H2479Q",
226
+ "kind": "trait",
227
+ "owner": "workspace",
228
+ "renames": []
229
+ },
230
+ "trt_01M3SFBP2919B7ZZAVP0866HMK": {
231
+ "bakedName": "ListItemCreateGate",
232
+ "curName": "ListItemCreateGate",
233
+ "id": "trt_01M3SFBP2919B7ZZAVP0866HMK",
234
+ "kind": "trait",
235
+ "owner": "workspace",
236
+ "renames": []
221
237
  }
222
238
  },
223
239
  "schemaVersion": 1
@@ -317,6 +333,16 @@
317
333
  "tier": "presentation",
318
334
  "type": "boolean"
319
335
  },
336
+ "createRoles": {
337
+ "default": [],
338
+ "description": "Roles (matched against viewerRole) that see the Create button. Empty = everyone.",
339
+ "items": {
340
+ "type": "string"
341
+ },
342
+ "label": "Roles that can create",
343
+ "tier": "policy",
344
+ "type": "[string]"
345
+ },
320
346
  "displayPageSize": {
321
347
  "default": 20.0,
322
348
  "description": "Rows visible per page before the data-grid's own pagination control appears — 20 matches the CRUD-list density sweet spot (Miller's law, 10-25 rows).",
@@ -371,6 +397,57 @@
371
397
  "tier": "presentation",
372
398
  "type": "[FilterSpec]"
373
399
  },
400
+ "itemActions": {
401
+ "default": [
402
+ {
403
+ "event": "EDIT",
404
+ "label": "Edit",
405
+ "variant": "ghost"
406
+ },
407
+ {
408
+ "event": "DELETE",
409
+ "label": "Delete",
410
+ "variant": "danger"
411
+ }
412
+ ],
413
+ "description": "Actions offered on each row; give an item `roles` to show it only to those viewer roles.",
414
+ "items": {
415
+ "properties": {
416
+ "event": {
417
+ "name": "event",
418
+ "required": false,
419
+ "type": "event"
420
+ },
421
+ "label": {
422
+ "name": "label",
423
+ "required": true,
424
+ "type": "string"
425
+ },
426
+ "roles": {
427
+ "items": {
428
+ "type": "string"
429
+ },
430
+ "name": "roles",
431
+ "required": false,
432
+ "type": "array"
433
+ },
434
+ "variant": {
435
+ "name": "variant",
436
+ "required": false,
437
+ "type": "string"
438
+ },
439
+ "when": {
440
+ "name": "when",
441
+ "required": false,
442
+ "type": "object"
443
+ }
444
+ },
445
+ "type": "object"
446
+ },
447
+ "label": "Row actions",
448
+ "tier": "presentation",
449
+ "type": "[ItemAction]"
450
+ },
374
451
  "pageSize": {
375
452
  "default": 20.0,
376
453
  "description": "Records fetched from the server per REFETCH_PAGE request. The initial load and search/filter refetches remain unpaginated (load everything that matches) unless a consumer wires REFETCH_PAGE, so the default list surface is unchanged.",
@@ -394,6 +471,13 @@
394
471
  "synonyms": "search hint, placeholder, search box text",
395
472
  "tier": "presentation",
396
473
  "type": "string"
474
+ },
475
+ "viewerRole": {
476
+ "default": "",
477
+ "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.",
478
+ "label": "Viewer's role",
479
+ "tier": "policy",
480
+ "type": "string"
397
481
  }
398
482
  },
399
483
  "effectRow": [
@@ -908,13 +992,7 @@
908
992
  "gap": "md",
909
993
  "type": "stack"
910
994
  },
911
- {
912
- "action": "CREATE",
913
- "icon": "plus",
914
- "label": "Create",
915
- "type": "button",
916
- "variant": "primary"
917
- }
995
+ "@trait.ListItemCreateGate"
918
996
  ],
919
997
  "direction": "horizontal",
920
998
  "gap": "md",
@@ -998,16 +1076,38 @@
998
1076
  }
999
1077
  ],
1000
1078
  "itemActions": [
1001
- {
1002
- "event": "EDIT",
1003
- "label": "Edit",
1004
- "variant": "ghost"
1005
- },
1006
- {
1007
- "event": "DELETE",
1008
- "label": "Delete",
1009
- "variant": "danger"
1010
- }
1079
+ "array/filter",
1080
+ "@config.itemActions",
1081
+ [
1082
+ "fn",
1083
+ "action",
1084
+ [
1085
+ "or",
1086
+ [
1087
+ "=",
1088
+ [
1089
+ "array/len",
1090
+ [
1091
+ "object/get",
1092
+ "@action",
1093
+ "roles",
1094
+ []
1095
+ ]
1096
+ ],
1097
+ 0.0
1098
+ ],
1099
+ [
1100
+ "array/includes",
1101
+ [
1102
+ "object/get",
1103
+ "@action",
1104
+ "roles",
1105
+ []
1106
+ ],
1107
+ "@config.viewerRole"
1108
+ ]
1109
+ ]
1110
+ ]
1011
1111
  ],
1012
1112
  "pageSize": "@config.displayPageSize",
1013
1113
  "type": "data-grid"
@@ -1241,13 +1341,7 @@
1241
1341
  "gap": "md",
1242
1342
  "type": "stack"
1243
1343
  },
1244
- {
1245
- "action": "CREATE",
1246
- "icon": "plus",
1247
- "label": "Create",
1248
- "type": "button",
1249
- "variant": "primary"
1250
- }
1344
+ "@trait.ListItemCreateGate"
1251
1345
  ],
1252
1346
  "direction": "horizontal",
1253
1347
  "gap": "md",
@@ -1331,16 +1425,38 @@
1331
1425
  }
1332
1426
  ],
1333
1427
  "itemActions": [
1334
- {
1335
- "event": "EDIT",
1336
- "label": "Edit",
1337
- "variant": "ghost"
1338
- },
1339
- {
1340
- "event": "DELETE",
1341
- "label": "Delete",
1342
- "variant": "danger"
1343
- }
1428
+ "array/filter",
1429
+ "@config.itemActions",
1430
+ [
1431
+ "fn",
1432
+ "action",
1433
+ [
1434
+ "or",
1435
+ [
1436
+ "=",
1437
+ [
1438
+ "array/len",
1439
+ [
1440
+ "object/get",
1441
+ "@action",
1442
+ "roles",
1443
+ []
1444
+ ]
1445
+ ],
1446
+ 0.0
1447
+ ],
1448
+ [
1449
+ "array/includes",
1450
+ [
1451
+ "object/get",
1452
+ "@action",
1453
+ "roles",
1454
+ []
1455
+ ],
1456
+ "@config.viewerRole"
1457
+ ]
1458
+ ]
1459
+ ]
1344
1460
  ],
1345
1461
  "pageSize": "@config.displayPageSize",
1346
1462
  "type": "data-grid"
@@ -1409,8 +1525,53 @@
1409
1525
  "to": "loading"
1410
1526
  }
1411
1527
  ]
1528
+ },
1529
+ "traitEmbedIds": {
1530
+ "ListItemCreateGate": "trt_01M3SFBP2919B7ZZAVP0866HMK"
1412
1531
  }
1413
1532
  },
1533
+ {
1534
+ "config": {
1535
+ "action": {
1536
+ "default": "CREATE",
1537
+ "type": "unknown"
1538
+ },
1539
+ "icon": {
1540
+ "default": "plus",
1541
+ "type": "unknown"
1542
+ },
1543
+ "label": {
1544
+ "default": "Create",
1545
+ "type": "unknown"
1546
+ },
1547
+ "variant": {
1548
+ "default": "primary",
1549
+ "type": "unknown"
1550
+ }
1551
+ },
1552
+ "id": "trt_01M3SFBP29125B6XWS09H2479Q",
1553
+ "name": "ListItemCreateButton",
1554
+ "ref": "Button.traits.ButtonRender"
1555
+ },
1556
+ {
1557
+ "config": {
1558
+ "content": {
1559
+ "default": "@trait.ListItemCreateButton",
1560
+ "type": "unknown"
1561
+ },
1562
+ "roles": {
1563
+ "default": "@config.createRoles",
1564
+ "type": "unknown"
1565
+ },
1566
+ "viewerRole": {
1567
+ "default": "@config.viewerRole",
1568
+ "type": "unknown"
1569
+ }
1570
+ },
1571
+ "id": "trt_01M3SFBP2919B7ZZAVP0866HMK",
1572
+ "name": "ListItemCreateGate",
1573
+ "ref": "RoleGate.traits.RoleGate"
1574
+ },
1414
1575
  {
1415
1576
  "config": {
1416
1577
  "fields": {
@@ -1876,9 +2037,40 @@
1876
2037
  "name": "options",
1877
2038
  "type": "[string]"
1878
2039
  }
2040
+ ],
2041
+ "ItemAction": [
2042
+ {
2043
+ "name": "label",
2044
+ "required": true,
2045
+ "type": "string"
2046
+ },
2047
+ {
2048
+ "name": "event",
2049
+ "type": "event"
2050
+ },
2051
+ {
2052
+ "name": "variant",
2053
+ "type": "string"
2054
+ },
2055
+ {
2056
+ "name": "roles",
2057
+ "type": "[string]"
2058
+ },
2059
+ {
2060
+ "name": "when",
2061
+ "type": "SExpr"
2062
+ }
1879
2063
  ]
1880
2064
  },
1881
2065
  "uses": [
2066
+ {
2067
+ "as": "RoleGate",
2068
+ "from": "std/behaviors/std-role-gate"
2069
+ },
2070
+ {
2071
+ "as": "Button",
2072
+ "from": "std/behaviors/ui-button"
2073
+ },
1882
2074
  {
1883
2075
  "as": "Confirmation",
1884
2076
  "from": "std/behaviors/std-confirmation"