@almadar/std 16.150.0 → 16.151.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 (67) hide show
  1. package/behaviors/lolo/ui/core/atoms/std-app-search.lolo +18 -0
  2. package/behaviors/lolo/ui/core/atoms/std-board.lolo +1 -1
  3. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +29 -10
  4. package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +13 -1
  5. package/behaviors/lolo/ui/core/atoms/std-multi-party-flow.lolo +8 -10
  6. package/behaviors/lolo/ui/core/atoms/std-stats.lolo +3 -0
  7. package/behaviors/lolo/ui/core/atoms/ui-typography.lolo +6 -1
  8. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +4 -2
  9. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +15 -1
  10. package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +57 -0
  11. package/behaviors/lolo/ui/core/molecules/ui-simple-grid.lolo +2 -2
  12. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +3 -1
  13. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +4 -2
  14. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +2 -0
  15. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +3 -1
  16. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +3 -1
  17. package/behaviors/lolo/ui/learning/atoms/std-branching-logic.lolo +0 -28
  18. package/behaviors/registry/factory-signatures.json +2435 -782
  19. package/behaviors/registry/ui/core/atoms/std-app-search.orb +60 -0
  20. package/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
  21. package/behaviors/registry/ui/core/atoms/std-browse.orb +166 -35
  22. package/behaviors/registry/ui/core/atoms/std-calendar.orb +25 -1
  23. package/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +8 -10
  24. package/behaviors/registry/ui/core/atoms/std-stats.orb +27 -0
  25. package/behaviors/registry/ui/core/atoms/ui-typography.orb +17 -1
  26. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +39 -2
  27. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +50 -1
  28. package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +296 -0
  29. package/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +0 -2
  30. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +34 -1
  31. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +49 -2
  32. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +2 -0
  33. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +54 -1
  34. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +33 -1
  35. package/behaviors/registry/ui/learning/atoms/std-branching-logic.orb +0 -34
  36. package/dist/behaviors/behaviors-embeddings.json +185 -185
  37. package/dist/behaviors/behaviors-registry.json +3 -2
  38. package/dist/behaviors/exports-reader.js +143 -4
  39. package/dist/behaviors/functions/index.d.ts +19 -18
  40. package/dist/behaviors/functions/index.js +143 -4
  41. package/dist/behaviors/index.js +143 -4
  42. package/dist/behaviors/knob-embeddings.json +1 -1
  43. package/dist/behaviors/query.js +143 -4
  44. package/dist/behaviors/registry/factory-signatures.json +2435 -782
  45. package/dist/behaviors/registry/ui/core/atoms/std-app-search.orb +60 -0
  46. package/dist/behaviors/registry/ui/core/atoms/std-board.orb +1 -1
  47. package/dist/behaviors/registry/ui/core/atoms/std-browse.orb +166 -35
  48. package/dist/behaviors/registry/ui/core/atoms/std-calendar.orb +25 -1
  49. package/dist/behaviors/registry/ui/core/atoms/std-multi-party-flow.orb +8 -10
  50. package/dist/behaviors/registry/ui/core/atoms/std-stats.orb +27 -0
  51. package/dist/behaviors/registry/ui/core/atoms/ui-typography.orb +17 -1
  52. package/dist/behaviors/registry/ui/core/molecules/ui-data-grid.orb +39 -2
  53. package/dist/behaviors/registry/ui/core/molecules/ui-data-list.orb +50 -1
  54. package/dist/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +296 -0
  55. package/dist/behaviors/registry/ui/core/molecules/ui-simple-grid.orb +0 -2
  56. package/dist/behaviors/registry/ui/core/molecules/ui-table-view.orb +34 -1
  57. package/dist/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +49 -2
  58. package/dist/behaviors/registry/ui/core/organisms/ui-entity-list.orb +2 -0
  59. package/dist/behaviors/registry/ui/core/organisms/ui-entity-table.orb +54 -1
  60. package/dist/behaviors/registry/ui/core/organisms/ui-timeline.orb +33 -1
  61. package/dist/behaviors/registry/ui/learning/atoms/std-branching-logic.orb +0 -34
  62. package/dist/behaviors-embeddings.json +185 -185
  63. package/dist/behaviors-registry.json +3 -2
  64. package/dist/index.js +143 -4
  65. package/dist/knob-embeddings.json +1 -1
  66. package/dist/registry/factory-signatures.json +2435 -782
  67. package/package.json +3 -3
@@ -67,6 +67,15 @@ orbital AppSearchOrbital {
67
67
  }
68
68
 
69
69
  state searching {
70
+ INIT -> idle
71
+ (set @entity.searchTerm "")
72
+ (fetch AppSearchTarget {})
73
+ (render-ui main {
74
+ type: stack
75
+ direction: vertical
76
+ gap: md
77
+ children: [@config.idleContent]
78
+ })
70
79
  APP_SEARCH -> searching
71
80
  (set @entity.searchTerm ?value)
72
81
  (fetch AppSearchTarget {
@@ -135,6 +144,15 @@ orbital AppSearchOrbital {
135
144
  }
136
145
 
137
146
  state results {
147
+ INIT -> idle
148
+ (set @entity.searchTerm "")
149
+ (fetch AppSearchTarget {})
150
+ (render-ui main {
151
+ type: stack
152
+ direction: vertical
153
+ gap: md
154
+ children: [@config.idleContent]
155
+ })
138
156
  APP_SEARCH -> searching
139
157
  (set @entity.searchTerm ?value)
140
158
  (fetch AppSearchTarget {
@@ -694,7 +694,7 @@ orbital BoardOrbital {
694
694
  label: @config.cardStageBinding
695
695
  size: sm
696
696
  type: badge
697
- variant: primary
697
+ variant: @col.variant
698
698
  }, {
699
699
  action: OPEN_CARD
700
700
  actionPayload: { description: @config.cardDescriptionBinding, id: @config.cardIdBinding, row: @item, stage: @config.cardStageBinding, title: @config.cardTitleBinding }
@@ -1,4 +1,4 @@
1
- app std-browse "2.3.0"
1
+ app std-browse "2.4.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
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
4
  type ItemAction = { label : string!, event : string, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string }
@@ -75,6 +75,7 @@ orbital BrowseItemOrbital {
75
75
  INIT -> loading
76
76
  (fetch BrowseItem {
77
77
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
78
+ filter: (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id])
78
79
  limit: @config.pageSize
79
80
  offset: 0
80
81
  })
@@ -96,13 +97,17 @@ orbital BrowseItemOrbital {
96
97
  }
97
98
 
98
99
  state browsing {
100
+ ;; No skeleton repaint here, for the same reason REFETCH_* has none: from
101
+ ;; a POPULATED body a skeleton unmounts the grid and flickers. First mount
102
+ ;; is unaffected — `initial: loading` and `state loading`'s own INIT still
103
+ ;; paint it; `browsing` is only reachable after a successful load.
99
104
  INIT -> loading
100
105
  (fetch BrowseItem {
101
106
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
107
+ filter: (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id])
102
108
  limit: @config.pageSize
103
109
  offset: 0
104
110
  })
105
- (render-ui main { rows: 4, type: skeleton })
106
111
  ;; REFETCH_* stays in `browsing` and DOES NOT replace the data-grid
107
112
  ;; with a spinner. Replacing during search-as-you-type unmounts the
108
113
  ;; grid every keystroke and causes a visible flicker. The fetch fires
@@ -112,20 +117,21 @@ orbital BrowseItemOrbital {
112
117
  REFETCH_QUERY -> browsing
113
118
  (fetch BrowseItem {
114
119
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
115
- filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm))
120
+ filter: (and (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id]) (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm)))
116
121
  limit: @config.pageSize
117
122
  offset: 0
118
123
  })
119
124
  REFETCH_FILTER -> browsing
120
125
  (fetch BrowseItem {
121
126
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
122
- filter: (or ["=", ?value, ""] ["=", (object/get @entity ?field), ?value])
127
+ filter: (and (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id]) (or ["=", ?value, ""] ["=", (object/get @entity ?field), ?value]))
123
128
  limit: @config.pageSize
124
129
  offset: 0
125
130
  })
126
131
  REFETCH_PAGE -> browsing
127
132
  (fetch BrowseItem {
128
133
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
134
+ filter: (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id])
129
135
  limit: @config.pageSize
130
136
  offset: ["*", ["-", ?page, 1], @config.pageSize]
131
137
  })
@@ -155,6 +161,7 @@ orbital BrowseItemOrbital {
155
161
  INIT -> loading
156
162
  (fetch BrowseItem {
157
163
  emit: { failure: BrowseItemLoadFailed, success: BrowseItemLoaded }
164
+ filter: (or ["=", @config.scopeField, ""] ["=", (object/get @entity @config.scopeField), @user.id])
158
165
  limit: @config.pageSize
159
166
  offset: 0
160
167
  })
@@ -288,8 +295,12 @@ orbital BrowseItemOrbital {
288
295
  @tier "internal"
289
296
  metaBinding : string = @item.createdAt
290
297
  @label "Meta field binding"
291
- @description "Binding path for the secondary meta slot (timestamp / category)."
298
+ @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."
292
299
  @tier "internal"
300
+ metaFormat : "none" | "date" | "time" | "datetime" | "number" = date
301
+ @label "Meta value format"
302
+ @description "Typography format for the feed meta slot — date by default so the createdAt binding renders human-readable instead of raw ISO; set none for non-date bindings."
303
+ @tier "presentation"
293
304
  categoryBinding : string = @item.category
294
305
  @label "Category field binding"
295
306
  @description "Binding path for the category/tag slot."
@@ -337,6 +348,11 @@ orbital BrowseItemOrbital {
337
348
  @description "Actions beyond this count collapse into a '⋯' overflow menu. Set 2–3 for dense tables."
338
349
  @synonyms "inline actions limit, overflow threshold, max buttons per row"
339
350
  @tier "presentation"
351
+ scopeField : string = ""
352
+ @label "Only show records owned by the signed-in user?"
353
+ @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."
354
+ @synonyms "owner field, my records, only mine, only my own, scope to user, per-user list, mine only, owned by me"
355
+ @tier "policy"
340
356
  selectable : boolean = false
341
357
  @label "Show row selection checkboxes?"
342
358
  @description "Adds a checkbox column with select-all to the dense table. Enable only when the surface offers bulk actions — checkboxes with nothing to act on are a dead affordance."
@@ -365,6 +381,11 @@ orbital BrowseItemOrbital {
365
381
  @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."
366
382
  @synonyms "detail columns, record fields, detail pane fields"
367
383
  @tier "presentation"
384
+ detailActions : json = [{ event: CLOSE, label: Close }]
385
+ @label "Master-detail record pane actions"
386
+ @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."
387
+ @synonyms "record actions, detail actions, pane actions"
388
+ @tier "presentation"
368
389
  bodyContent : render-ui = {
369
390
  children: [@trait.DataGrid1]
370
391
  direction: vertical
@@ -465,6 +486,7 @@ orbital BrowseItemOrbital {
465
486
  children: [{
466
487
  color: muted
467
488
  content: @config.metaBinding
489
+ format: @config.metaFormat
468
490
  type: typography
469
491
  variant: caption
470
492
  }, {
@@ -639,13 +661,10 @@ orbital BrowseItemOrbital {
639
661
  type: stack
640
662
  }, {
641
663
  detail: {
642
- actions: [{
643
- event: CLOSE
644
- label: Close
645
- }]
664
+ actions: @config.detailActions
646
665
  fieldNames: @config.detailFields
647
666
  initialData: ?row
648
- showActions: false
667
+ showActions: true
649
668
  type: detail-panel
650
669
  }
651
670
  hasSelection: true
@@ -194,6 +194,16 @@ orbital CalendarEventOrbital {
194
194
  @label "Title"
195
195
  @description "Header text shown above the calendar body."
196
196
  @tier "presentation"
197
+ agendaItemActions : json = [{ event: SELECT_DAY, icon: eye, label: View }]
198
+ @label "Agenda item actions"
199
+ @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."
200
+ @synonyms "agenda actions, row actions, event actions, list actions"
201
+ @tier "presentation"
202
+ agendaGroupBy : string = date
203
+ @label "Agenda group-by field"
204
+ @description "Row field the agenda list groups its day sections by. Rebound hosts point this at their own timestamp column (e.g. startTime, scheduledAt)."
205
+ @synonyms "group field, section field, day field"
206
+ @tier "presentation"
197
207
  bodyContent : render-ui = {
198
208
  children: [{
199
209
  align: center
@@ -292,7 +302,8 @@ orbital CalendarEventOrbital {
292
302
  entity: ?data
293
303
  fields: []
294
304
  gap: md
295
- groupBy: date
305
+ groupBy: @config.agendaGroupBy
306
+ itemActions: @config.agendaItemActions
296
307
  renderItem: (fn item {
297
308
  children: [{
298
309
  align: start
@@ -301,6 +312,7 @@ orbital CalendarEventOrbital {
301
312
  children: [{
302
313
  color: muted
303
314
  content: @config.timeBinding
315
+ format: time
304
316
  type: typography
305
317
  variant: overline
306
318
  }, {
@@ -1220,41 +1220,39 @@ orbital MultiPartyFlowOrbital {
1220
1220
  @label "Page title"
1221
1221
  @description "Heading shown above the transaction view"
1222
1222
  @tier "presentation"
1223
- transactionSubject : string = "Sale of 2024 Honda CR-V"
1223
+ transactionSubject : string = "Sale of item"
1224
1224
  @label "Subject"
1225
1225
  @description "Short description of what is being transacted"
1226
1226
  @tier "presentation"
1227
- transactionAmount : string = "$28,500"
1227
+ transactionAmount : string = "$0.00"
1228
1228
  @label "Amount"
1229
1229
  @description "Formatted amount held in escrow"
1230
1230
  @tier "presentation"
1231
- transactionReference : string = TXN-A8B2C-2024-001
1231
+ transactionReference : string = ""
1232
1232
  @label "Reference"
1233
1233
  @description "External identifier shown in the summary"
1234
1234
  @tier "presentation"
1235
1235
  parties : [PartySpec] = [{
1236
- actionDescription: "Authorize $28,500 to be held in escrow until delivery is confirmed."
1236
+ actionDescription: "Authorize the funds to be held in escrow until delivery is confirmed."
1237
1237
  actionIcon: credit-card
1238
1238
  actionLabel: "Confirm payment"
1239
- actor: "Alice Chen"
1240
- description: "Funds the transaction and confirms receipt of the vehicle."
1239
+ description: "Funds the transaction and confirms receipt."
1241
1240
  icon: user
1242
1241
  id: buyer
1243
1242
  stepLabel: "Step 1 of 2"
1244
1243
  title: Buyer
1245
1244
  }, {
1246
- actionDescription: "Mark the vehicle as shipped. Funds will release after the buyer confirms receipt."
1245
+ actionDescription: "Mark the item as shipped. Funds release after the buyer confirms receipt."
1247
1246
  actionIcon: package
1248
1247
  actionLabel: "Confirm shipment"
1249
- actor: "Bob's Auto Sales LLC"
1250
- description: "Ships the vehicle and uploads delivery proof."
1248
+ description: "Ships the item and uploads delivery proof."
1251
1249
  icon: user-check
1252
1250
  id: seller
1253
1251
  stepLabel: "Step 2 of 2"
1254
1252
  title: Seller
1255
1253
  }]
1256
1254
  @label "Parties"
1257
- @description "Ordered participants with role, actor name, and required action"
1255
+ @description "Ordered participants with role, actor name, and required action. stepLabel entries should track the party count when overriding."
1258
1256
  @tier "domain"
1259
1257
  releaseLabel : string = "Release funds"
1260
1258
  @label "Release button"
@@ -93,12 +93,14 @@ orbital StatsItemOrbital {
93
93
  format: number
94
94
  icon: list
95
95
  label: "Total Items"
96
+ sparklineData: [2, 4, 3, 6, 5, 8, 7]
96
97
  variant: primary
97
98
  }, {
98
99
  aggregation: count
99
100
  format: number
100
101
  icon: check-circle
101
102
  label: Active
103
+ sparklineData: [1, 3, 2, 4, 6, 5, 7]
102
104
  variant: success
103
105
  }, {
104
106
  aggregation: avg
@@ -106,6 +108,7 @@ orbital StatsItemOrbital {
106
108
  format: number
107
109
  icon: trending-up
108
110
  label: "Avg Value"
111
+ sparklineData: [5, 4, 6, 3, 5, 7, 6]
109
112
  variant: info
110
113
  }]
111
114
  @label "Metrics"
@@ -21,6 +21,7 @@ orbital TypographyOrbital {
21
21
  overflow: @config.overflow
22
22
  className: @config.className
23
23
  style: @config.style
24
+ format: @config.format
24
25
  content: @config.content
25
26
  children: @config.children
26
27
  type: typography
@@ -32,7 +33,7 @@ orbital TypographyOrbital {
32
33
  @label "Variant"
33
34
  @description "Typography variant"
34
35
  @tier "presentation"
35
- level : number = 1
36
+ level : number
36
37
  @label "Level"
37
38
  @description "Heading level (1-6) - alternative to variant for headings"
38
39
  @tier "presentation"
@@ -68,6 +69,10 @@ orbital TypographyOrbital {
68
69
  @label "Style"
69
70
  @description "Inline style"
70
71
  @tier "presentation"
72
+ format : "none" | "date" | "time" | "datetime" | "number" | "currency" | "percent" = none
73
+ @label "Format"
74
+ @description "Value formatting applied to string/number/Date content — `none` (the default) renders content as-is. Covers the raw-ISO-date class: a bound datetime renders human-readable via `format='date'|'time'|'datetime'`."
75
+ @tier "presentation"
71
76
  content : node
72
77
  @label "Content"
73
78
  @description "Text content (alternative to children)"
@@ -171,7 +171,9 @@ orbital DataGridOrbital {
171
171
  @label "Columns"
172
172
  @description "Alias for `fields` — the compiler emits `columns` for field defs."
173
173
  @tier "presentation"
174
- itemActions : json = []
174
+ itemActions : [DataGridItemActionsItem] = []
175
+ @label "Item Actions"
176
+ @description "Per-item action buttons"
175
177
  @tier "presentation"
176
178
  maxInlineActions : number
177
179
  @label "Max Inline Actions"
@@ -181,7 +183,7 @@ orbital DataGridOrbital {
181
183
  @label "Scroll X"
182
184
  @description "Lay items in a single horizontally-scrolling row (kanban columns) sized to `minCardWidth` instead of a wrapping grid."
183
185
  @tier "presentation"
184
- cols : number = 1
186
+ cols : number
185
187
  @label "Cols"
186
188
  @description "Number of columns (uses auto-fit if omitted)"
187
189
  @tier "presentation"
@@ -68,7 +68,9 @@ orbital DataListOrbital {
68
68
  variant: @config.variant
69
69
  groupBy: @config.groupBy
70
70
  senderField: @config.senderField
71
+ senderLabelField: @config.senderLabelField
71
72
  currentUser: @config.currentUser
73
+ emptyMessage: @config.emptyMessage
72
74
  className: @config.className
73
75
  isLoading: @config.isLoading
74
76
  error: @config.error
@@ -105,7 +107,9 @@ orbital DataListOrbital {
105
107
  variant: @config.variant
106
108
  groupBy: @config.groupBy
107
109
  senderField: @config.senderField
110
+ senderLabelField: @config.senderLabelField
108
111
  currentUser: @config.currentUser
112
+ emptyMessage: @config.emptyMessage
109
113
  className: @config.className
110
114
  isLoading: @config.isLoading
111
115
  error: @config.error
@@ -207,7 +211,9 @@ orbital DataListOrbital {
207
211
  @label "Columns"
208
212
  @description "Alias for `fields` — the compiler emits `columns` for field defs."
209
213
  @tier "presentation"
210
- itemActions : json = []
214
+ itemActions : [DataListItemActionsItem] = []
215
+ @label "Item Actions"
216
+ @description "Per-item action buttons"
211
217
  @tier "presentation"
212
218
  maxInlineActions : number
213
219
  @label "Max Inline Actions"
@@ -233,10 +239,18 @@ orbital DataListOrbital {
233
239
  @label "Sender Field"
234
240
  @description "Field name identifying the sender (used with variant: 'message')"
235
241
  @tier "presentation"
242
+ senderLabelField : string
243
+ @label "Sender Label Field"
244
+ @description "Field holding the sender's human-readable name (used with variant: 'message'). Defaults to `senderField`. Set this when `senderField` holds an id — an id-keyed thread otherwise labels bubbles `staff-1` instead of `Sam Staff`."
245
+ @tier "presentation"
236
246
  currentUser : string
237
247
  @label "Current User"
238
248
  @description "Current user identifier; messages matching this value align right (used with variant: 'message')"
239
249
  @tier "presentation"
250
+ emptyMessage : string
251
+ @label "Empty Message"
252
+ @description "Message shown when there are no rows. Falls back to the generic 'no items' translation. `TableView` already exposes this; an agenda or an inbox wants to say what 'empty' means in its own words."
253
+ @tier "presentation"
240
254
  className : string
241
255
  @label "Class Name"
242
256
  @description "Additional CSS classes"
@@ -8,9 +8,14 @@ orbital GraphCanvasOrbital {
8
8
  color : string
9
9
  size : number
10
10
  badge : number
11
+ mark : GraphCanvasNodesItemMark
11
12
  x : number
12
13
  y : number
13
14
  }
15
+ type GraphCanvasNodesItemMark = {
16
+ kind : json!
17
+ suggestionId : string!
18
+ }
14
19
  type GraphCanvasEdgesItem = {
15
20
  source : string!
16
21
  target : string!
@@ -18,6 +23,13 @@ orbital GraphCanvasOrbital {
18
23
  weight : number
19
24
  color : string
20
25
  }
26
+ type GraphCanvasProposedEdgesItem = {
27
+ source : string!
28
+ target : string!
29
+ label : string
30
+ weight : number
31
+ color : string
32
+ }
21
33
  type GraphCanvasSimilarityItem = {
22
34
  source : string!
23
35
  target : string!
@@ -42,9 +54,29 @@ orbital GraphCanvasOrbital {
42
54
  color : string
43
55
  size : number
44
56
  badge : number
57
+ mark : GraphCanvasNODECLICKNodeMark
58
+ x : number
59
+ y : number
60
+ }
61
+ type GraphCanvasNODECLICKNodeMark = {
62
+ kind : json!
63
+ suggestionId : string!
64
+ }
65
+ type GraphCanvasMARKCLICKNode = {
66
+ id : string!
67
+ label : string
68
+ group : string
69
+ color : string
70
+ size : number
71
+ badge : number
72
+ mark : GraphCanvasMARKCLICKNodeMark
45
73
  x : number
46
74
  y : number
47
75
  }
76
+ type GraphCanvasMARKCLICKNodeMark = {
77
+ kind : json!
78
+ suggestionId : string!
79
+ }
48
80
  type GraphCanvasNODEDOUBLECLICKNode = {
49
81
  id : string!
50
82
  label : string
@@ -52,9 +84,14 @@ orbital GraphCanvasOrbital {
52
84
  color : string
53
85
  size : number
54
86
  badge : number
87
+ mark : GraphCanvasNODEDOUBLECLICKNodeMark
55
88
  x : number
56
89
  y : number
57
90
  }
91
+ type GraphCanvasNODEDOUBLECLICKNodeMark = {
92
+ kind : json!
93
+ suggestionId : string!
94
+ }
58
95
  type GraphCanvasBADGECLICKNode = {
59
96
  id : string!
60
97
  label : string
@@ -62,9 +99,14 @@ orbital GraphCanvasOrbital {
62
99
  color : string
63
100
  size : number
64
101
  badge : number
102
+ mark : GraphCanvasBADGECLICKNodeMark
65
103
  x : number
66
104
  y : number
67
105
  }
106
+ type GraphCanvasBADGECLICKNodeMark = {
107
+ kind : json!
108
+ suggestionId : string!
109
+ }
68
110
 
69
111
  entity GraphCanvasItem [runtime] {
70
112
  id : string!
@@ -79,6 +121,7 @@ orbital GraphCanvasOrbital {
79
121
  title: @config.title
80
122
  nodes: @config.nodes
81
123
  edges: @config.edges
124
+ proposedEdges: @config.proposedEdges
82
125
  similarity: @config.similarity
83
126
  height: @config.height
84
127
  showLabels: @config.showLabels
@@ -86,6 +129,7 @@ orbital GraphCanvasOrbital {
86
129
  draggable: @config.draggable
87
130
  actions: @config.actions
88
131
  onNodeClick: @config.onNodeClick
132
+ onMarkClick: @config.onMarkClick
89
133
  onNodeDoubleClick: @config.onNodeDoubleClick
90
134
  onBadgeClick: @config.onBadgeClick
91
135
  nodeClickEvent: @config.nodeClickEvent
@@ -109,6 +153,11 @@ orbital GraphCanvasOrbital {
109
153
  }
110
154
  @description "On node click"
111
155
  @tier "essential"
156
+ @config.onMarkClick -> external {
157
+ node : GraphCanvasMARKCLICKNode
158
+ }
159
+ @description "On marked-node click (suggestion/proposal target). Takes priority over onNodeClick."
160
+ @tier "essential"
112
161
  @config.onNodeDoubleClick -> external {
113
162
  node : GraphCanvasNODEDOUBLECLICKNode
114
163
  }
@@ -134,6 +183,10 @@ orbital GraphCanvasOrbital {
134
183
  @label "Edges"
135
184
  @description "Graph edges (the only rendered links)"
136
185
  @tier "presentation"
186
+ proposedEdges : [GraphCanvasProposedEdgesItem] = []
187
+ @label "Proposed Edges"
188
+ @description "Uncommitted proposal links — rendered dashed/faint in a separate pass, never folded into the layout springs."
189
+ @tier "presentation"
137
190
  similarity : [GraphCanvasSimilarityItem] = []
138
191
  @label "Similarity"
139
192
  @description "All-pairs similarity (cosine 0–1) used ONLY for layout, never drawn. It is the secondary macro-layout: non-connected pairs get a weak spring (higher cosine ⇒ closer) so clusters arrange relative to each other; drawn `edges` stay the primary tight structure. When omitted, edges alone drive the layout."
@@ -162,6 +215,10 @@ orbital GraphCanvasOrbital {
162
215
  @label "On Node Click"
163
216
  @description "On node click"
164
217
  @tier "presentation"
218
+ onMarkClick : string = "MARK_CLICK"
219
+ @label "On Mark Click"
220
+ @description "On marked-node click (suggestion/proposal target). Takes priority over onNodeClick."
221
+ @tier "presentation"
165
222
  onNodeDoubleClick : string = "NODE_DOUBLE_CLICK"
166
223
  @label "On Node Double Click"
167
224
  @description "On node double-click (e.g. to drill in)"
@@ -26,11 +26,11 @@ orbital SimpleGridOrbital {
26
26
  @label "Min Child Width"
27
27
  @description "Minimum width of each child (e.g., 200, '200px', '15rem')"
28
28
  @tier "presentation"
29
- maxCols : number = 1
29
+ maxCols : number
30
30
  @label "Max Cols"
31
31
  @description "Maximum number of columns"
32
32
  @tier "presentation"
33
- cols : number = 1
33
+ cols : number
34
34
  @label "Cols"
35
35
  @description "Exact number of columns (disables auto-fit)"
36
36
  @tier "presentation"
@@ -176,7 +176,9 @@ orbital TableViewOrbital {
176
176
  @label "Fields"
177
177
  @description "Alias for `columns`."
178
178
  @tier "presentation"
179
- itemActions : json = []
179
+ itemActions : [TableViewItemActionsItem] = []
180
+ @label "Item Actions"
181
+ @description "Per-row action buttons (trailing column)."
180
182
  @tier "presentation"
181
183
  maxInlineActions : number
182
184
  @label "Max Inline Actions"
@@ -160,7 +160,7 @@ orbital EntityCardsOrbital {
160
160
  @label "Min Card Width"
161
161
  @description "Minimum width of each card (default: 280px)"
162
162
  @tier "presentation"
163
- maxCols : number = 1
163
+ maxCols : number
164
164
  @label "Max Cols"
165
165
  @description "Maximum number of columns"
166
166
  @tier "presentation"
@@ -188,7 +188,9 @@ orbital EntityCardsOrbital {
188
188
  @label "Columns"
189
189
  @description "Alias for fields - backwards compatibility"
190
190
  @tier "presentation"
191
- itemActions : json = [{ event: VIEW, label: View, variant: ghost }]
191
+ itemActions : [EntityCardsItemActionsItem] = [{ event: VIEW, label: View, variant: ghost }]
192
+ @label "Item Actions"
193
+ @description "Actions for each card item (schema-driven)"
192
194
  @tier "presentation"
193
195
  showTotal : boolean = true
194
196
  @label "Show Total"
@@ -148,6 +148,8 @@ orbital EntityListOrbital {
148
148
  @description "selectable prop"
149
149
  @tier "presentation"
150
150
  itemActions : json = [{ event: VIEW, label: View, variant: ghost }]
151
+ @label "Item Actions"
152
+ @description "Item actions - schema-driven or function-based"
151
153
  @tier "presentation"
152
154
  showDividers : boolean
153
155
  @label "Show Dividers"
@@ -189,7 +189,9 @@ orbital EntityTableOrbital {
189
189
  @label "Columns"
190
190
  @description "Columns can be Column objects or simple string field names"
191
191
  @tier "presentation"
192
- itemActions : json = [{ event: VIEW, label: View, variant: ghost }]
192
+ itemActions : [EntityTableItemActionsItem] = [{ event: VIEW, label: View, variant: ghost }]
193
+ @label "Item Actions"
194
+ @description "Item actions from generated code - maps to rowActions"
193
195
  @tier "presentation"
194
196
  emptyIcon : icon
195
197
  @label "Empty Icon"
@@ -98,7 +98,9 @@ orbital TimelineOrbital {
98
98
  @label "Fields"
99
99
  @description "Fields to display"
100
100
  @tier "presentation"
101
- itemActions : json = []
101
+ itemActions : [TimelineItemActionsItem] = []
102
+ @label "Item Actions"
103
+ @description "Actions per item"
102
104
  @tier "presentation"
103
105
  look : "vertical-compact" | "vertical-spacious" | "horizontal" | "swimlane" = "vertical-spacious"
104
106
  @label "Look"
@@ -48,34 +48,6 @@ orbital BranchingLogicOrbital {
48
48
  direction: horizontal
49
49
  gap: sm
50
50
  type: stack
51
- }, {
52
- children: [{
53
- icon: git-branch
54
- label: "Total rules"
55
- look: @config.statLook
56
- type: stat-display
57
- value: ?data.length
58
- }, {
59
- icon: clipboard-list
60
- label: "Active surveys"
61
- look: @config.statLook
62
- type: stat-display
63
- value: "8"
64
- }, {
65
- icon: skip-forward
66
- label: "Skip jumps"
67
- look: @config.statLook
68
- type: stat-display
69
- value: "42"
70
- }, {
71
- icon: trending-up
72
- label: "Priority avg"
73
- look: @config.statLook
74
- type: stat-display
75
- value: "3"
76
- }]
77
- cols: 4
78
- type: simple-grid
79
51
  }, { type: divider }, {
80
52
  cols: 1
81
53
  entity: ?data