@almadar/std 16.209.0 → 16.210.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.
@@ -25,44 +25,19 @@ orbital BrowseItemOrbital {
25
25
  }
26
26
 
27
27
  uses Typography from "std/behaviors/ui-typography"
28
- uses DataGrid from "std/behaviors/ui-data-grid"
29
- uses TableView from "std/behaviors/ui-table-view"
30
28
  uses DataList from "std/behaviors/ui-data-list"
31
29
 
32
- trait DataGrid1 = DataGrid.traits.DataGridRender -> BrowseItem {
33
- config {
34
- cols: @config.cols
35
- fields: @config.fields
36
- gap: @config.gap
37
- imageField: @config.imageField
38
- itemActions: @config.itemActions
39
- maxInlineActions: @config.maxInlineActions
40
- pageSize: @config.displayPageSize
41
- selfFetch: false
42
- }
43
-
44
- listens {
45
- BrowseItemBrowse.BrowseItemLoaded -> DataGridLoaded
46
- }
47
- }
48
-
49
- trait DenseTableView = TableView.traits.TableViewRender -> BrowseItem {
50
- config {
51
- columns: @config.columns
52
- emptyMessage: "No records"
53
- itemActions: @config.itemActions
54
- itemClickEvent: @config.itemClickEvent
55
- look: dense
56
- maxInlineActions: @config.maxInlineActions
57
- pageSize: @config.displayPageSize
58
- selectable: @config.selectable
59
- selfFetch: false
60
- }
61
-
62
- listens {
63
- BrowseItemBrowse.BrowseItemLoaded -> TableViewLoaded
64
- }
65
- }
30
+ ;; table-default and dense looks used to compose separately-listening
31
+ ;; sibling traits (DataGrid1/DenseTableView) here, same shape as
32
+ ;; MasterListView below. Both re-render fully on every BrowseItemLoaded
33
+ ;; (unlike master-detail's VIEW/CLOSE, which doesn't carry `.data`), so
34
+ ;; unlike MasterListView they had no reason to be persistent components —
35
+ ;; inlined into denseBodyContent/bodyContent directly 2026-09-08, matching
36
+ ;; feed/gallery/triage's existing inline shape. A separately-listening
37
+ ;; sibling fires unconditionally regardless of browseLook (a listens guard
38
+ ;; can't gate on @config — both the Rust interpreter and the TS codegen
39
+ ;; path restrict a listens guard's context to @payload only), so all three
40
+ ;; used to race for slot main on every load.
66
41
 
67
42
  trait MasterListView = DataList.traits.DataListRender -> BrowseItem {
68
43
  config {
@@ -461,14 +436,23 @@ orbital BrowseItemOrbital {
461
436
  children: []
462
437
  gap: none
463
438
  type: stack
464
- }), @trait.DataGrid1]
439
+ }), {
440
+ cols: @config.cols
441
+ entity: ?data
442
+ fields: @config.fields
443
+ gap: @config.gap
444
+ imageField: @config.imageField
445
+ itemActions: @config.itemActions
446
+ maxInlineActions: @config.maxInlineActions
447
+ pageSize: @config.displayPageSize
448
+ type: data-grid
449
+ }]
465
450
  direction: vertical
466
451
  gap: md
467
452
  type: stack
468
453
  }
469
454
  @label "Body content tree"
470
- @description "Render-ui SExpr rendered after rows load when browseLook = table (the default). Toolbar (search when bodySearch, filter bar when filters is non-empty) above the canonical data-grid call. Until 2026-08-27 this was the only one of the six looks with no search affordance at all. See denseBodyContent/feedBodyContent/galleryBodyContent for the other browseLook bodies; any may be overridden directly while inheriting the same trait, state machine, emits, and listens."
471
- @tier "internal"
455
+ @description "Render-ui SExpr rendered after rows load when browseLook = table (the default). Toolbar (search when bodySearch, filter bar when filters is non-empty) above the canonical data-grid call. Until 2026-08-27 this was the only one of the six looks with no search affordance at all. See denseBodyContent/feedBodyContent/galleryBodyContent for the other browseLook bodies; any may be overridden directly while inheriting the same trait, state machine, emits, and listens. Inlined directly (not via a composed sibling trait) 2026-09-08 — a separately-listening DataGrid1 sibling fired unconditionally on every BrowseItemLoaded regardless of browseLook, racing the correct body for slot main (a listens guard can't gate this: both the Rust interpreter and the TS codegen path restrict a listens guard's context to @payload only, so a browseLook config check there always evaluates undefined)."
472
456
  denseBodyContent : render-ui = {
473
457
  children: [(if @config.bodySearch {
474
458
  children: [{
@@ -503,7 +487,18 @@ orbital BrowseItemOrbital {
503
487
  gap: none
504
488
  type: stack
505
489
  }), {
506
- children: [@trait.DenseTableView]
490
+ children: [{
491
+ columns: @config.columns
492
+ emptyMessage: "No records"
493
+ entity: ?data
494
+ itemActions: @config.itemActions
495
+ itemClickEvent: @config.itemClickEvent
496
+ look: dense
497
+ maxInlineActions: @config.maxInlineActions
498
+ pageSize: @config.displayPageSize
499
+ selectable: @config.selectable
500
+ type: table-view
501
+ }]
507
502
  className: overflow-x-auto
508
503
  direction: vertical
509
504
  gap: none
@@ -515,7 +510,7 @@ orbital BrowseItemOrbital {
515
510
  type: stack
516
511
  }
517
512
  @label "Dense look body"
518
- @description "Render-ui SExpr rendered after rows load when browseLook = dense. Spreadsheet-style sticky-header data-table with a search bar; composes columns/itemActions/maxInlineActions/displayPageSize/searchPlaceholder. Folded from std-browse-dense (Phase 5.B)."
513
+ @description "Render-ui SExpr rendered after rows load when browseLook = dense. Spreadsheet-style sticky-header data-table with a search bar; composes columns/itemActions/maxInlineActions/displayPageSize/searchPlaceholder. Folded from std-browse-dense (Phase 5.B). Inlined directly (not via a composed sibling trait) 2026-09-08 — see the table-default body's note for why."
519
514
  @tier "internal"
520
515
  feedBodyContent : render-ui = {
521
516
  children: [(if @config.bodySearch {
@@ -2,6 +2,7 @@ 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
3
  type ItemAction = { label : string!, event : event, navigatesTo : string, variant : primary | secondary | ghost | danger, icon : string }
4
4
  type FilterSpec = { field : string!, label : string, options : [string] }
5
+ type FieldSpec = { name : string!, label : string, variant : h3 | h4 | body | caption | badge | small | progress, icon : string, format : date | currency | number | boolean | percent }
5
6
  orbital CalendarEventOrbital {
6
7
  type CalendarEventLoaded = Event { data : [CalendarEvent] } "Fired when CalendarEvent finishes loading; payload.data holds the events"
7
8
 
@@ -226,6 +227,29 @@ orbital CalendarEventOrbital {
226
227
  @label "Description binding"
227
228
  @description "Per-row binding for the event description slot."
228
229
  @tier "presentation"
230
+ fields : [FieldSpec] = [{
231
+ icon: calendar
232
+ label: Event
233
+ name: name
234
+ variant: h4
235
+ }, {
236
+ label: Time
237
+ name: time
238
+ variant: badge
239
+ }, {
240
+ format: date
241
+ label: Date
242
+ name: date
243
+ variant: caption
244
+ }, {
245
+ label: Status
246
+ name: status
247
+ variant: badge
248
+ }]
249
+ @label "Upcoming-events columns"
250
+ @description "Row field descriptors for the 'Upcoming Events' data-list under calendarLook='month'. Rebound hosts must override this — it is a literal entity[field.name] lookup, unlike titleBinding/timeBinding/descriptionBinding (expression bindings), so it does not follow a rebind automatically."
251
+ @synonyms "upcoming events columns, month view fields, event list columns"
252
+ @tier "presentation"
229
253
  include : [string] = []
230
254
  @label "Which relation fields to hydrate?"
231
255
  @description "Entity relation field names to hydrate on fetch (e.g. a `category : Category` field named `category`), so chip bindings can use dot-paths like @item.category.name. Empty = no hydration, the default."
@@ -347,25 +371,7 @@ orbital CalendarEventOrbital {
347
371
  variant: h4
348
372
  }, {
349
373
  entity: ?data
350
- fields: [{
351
- icon: calendar
352
- label: Event
353
- name: name
354
- variant: h4
355
- }, {
356
- label: Time
357
- name: time
358
- variant: badge
359
- }, {
360
- format: date
361
- label: Date
362
- name: date
363
- variant: caption
364
- }, {
365
- label: Status
366
- name: status
367
- variant: badge
368
- }]
374
+ fields: @config.fields
369
375
  itemActions: @config.agendaItemActions
370
376
  look: @config.tableLook
371
377
  type: data-list
@@ -124,22 +124,6 @@
124
124
  "owner": "workspace",
125
125
  "renames": []
126
126
  },
127
- "trt_01KXZ44Y963YXRJDNR4F2M5QHX": {
128
- "bakedName": "DenseTableView",
129
- "curName": "DenseTableView",
130
- "id": "trt_01KXZ44Y963YXRJDNR4F2M5QHX",
131
- "kind": "trait",
132
- "owner": "workspace",
133
- "renames": []
134
- },
135
- "trt_01KXZ44Y965J2Q55E5JN4JKVGR": {
136
- "bakedName": "DataGrid1",
137
- "curName": "DataGrid1",
138
- "id": "trt_01KXZ44Y965J2Q55E5JN4JKVGR",
139
- "kind": "trait",
140
- "owner": "workspace",
141
- "renames": []
142
- },
143
127
  "trt_01KYG176Z400JFKWZ2XPKJ4798": {
144
128
  "bakedName": "MasterListView",
145
129
  "curName": "MasterListView",
@@ -211,112 +195,6 @@
211
195
  }
212
196
  ],
213
197
  "traits": [
214
- {
215
- "config": {
216
- "cols": {
217
- "default": "@config.cols",
218
- "type": "unknown"
219
- },
220
- "fields": {
221
- "default": "@config.fields",
222
- "type": "unknown"
223
- },
224
- "gap": {
225
- "default": "@config.gap",
226
- "type": "unknown"
227
- },
228
- "imageField": {
229
- "default": "@config.imageField",
230
- "type": "unknown"
231
- },
232
- "itemActions": {
233
- "default": "@config.itemActions",
234
- "type": "unknown"
235
- },
236
- "maxInlineActions": {
237
- "default": "@config.maxInlineActions",
238
- "type": "unknown"
239
- },
240
- "pageSize": {
241
- "default": "@config.displayPageSize",
242
- "type": "unknown"
243
- },
244
- "selfFetch": {
245
- "default": false,
246
- "type": "unknown"
247
- }
248
- },
249
- "id": "trt_01KXZ44Y965J2Q55E5JN4JKVGR",
250
- "linkedEntity": "BrowseItem",
251
- "linkedEntityId": "ent_01KXG04FVGGWM52VJZVMAEG5H0",
252
- "listens": [
253
- {
254
- "event": "BrowseItemLoaded",
255
- "source": {
256
- "kind": "trait",
257
- "trait": "BrowseItemBrowse"
258
- },
259
- "triggers": "DataGridLoaded"
260
- }
261
- ],
262
- "name": "DataGrid1",
263
- "ref": "DataGrid.traits.DataGridRender"
264
- },
265
- {
266
- "config": {
267
- "columns": {
268
- "default": "@config.columns",
269
- "type": "unknown"
270
- },
271
- "emptyMessage": {
272
- "default": "No records",
273
- "type": "unknown"
274
- },
275
- "itemActions": {
276
- "default": "@config.itemActions",
277
- "type": "unknown"
278
- },
279
- "itemClickEvent": {
280
- "default": "@config.itemClickEvent",
281
- "type": "unknown"
282
- },
283
- "look": {
284
- "default": "dense",
285
- "type": "unknown"
286
- },
287
- "maxInlineActions": {
288
- "default": "@config.maxInlineActions",
289
- "type": "unknown"
290
- },
291
- "pageSize": {
292
- "default": "@config.displayPageSize",
293
- "type": "unknown"
294
- },
295
- "selectable": {
296
- "default": "@config.selectable",
297
- "type": "unknown"
298
- },
299
- "selfFetch": {
300
- "default": false,
301
- "type": "unknown"
302
- }
303
- },
304
- "id": "trt_01KXZ44Y963YXRJDNR4F2M5QHX",
305
- "linkedEntity": "BrowseItem",
306
- "linkedEntityId": "ent_01KXG04FVGGWM52VJZVMAEG5H0",
307
- "listens": [
308
- {
309
- "event": "BrowseItemLoaded",
310
- "source": {
311
- "kind": "trait",
312
- "trait": "BrowseItemBrowse"
313
- },
314
- "triggers": "TableViewLoaded"
315
- }
316
- ],
317
- "name": "DenseTableView",
318
- "ref": "TableView.traits.TableViewRender"
319
- },
320
198
  {
321
199
  "config": {
322
200
  "fields": {
@@ -433,15 +311,24 @@
433
311
  "type": "stack"
434
312
  }
435
313
  ],
436
- "@trait.DataGrid1"
314
+ {
315
+ "cols": "@config.cols",
316
+ "entity": "@payload.data",
317
+ "fields": "@config.fields",
318
+ "gap": "@config.gap",
319
+ "imageField": "@config.imageField",
320
+ "itemActions": "@config.itemActions",
321
+ "maxInlineActions": "@config.maxInlineActions",
322
+ "pageSize": "@config.displayPageSize",
323
+ "type": "data-grid"
324
+ }
437
325
  ],
438
326
  "direction": "vertical",
439
327
  "gap": "md",
440
328
  "type": "stack"
441
329
  },
442
- "description": "Render-ui SExpr rendered after rows load when browseLook = table (the default). Toolbar (search when bodySearch, filter bar when filters is non-empty) above the canonical data-grid call. Until 2026-08-27 this was the only one of the six looks with no search affordance at all. See denseBodyContent/feedBodyContent/galleryBodyContent for the other browseLook bodies; any may be overridden directly while inheriting the same trait, state machine, emits, and listens.",
330
+ "description": "Render-ui SExpr rendered after rows load when browseLook = table (the default). Toolbar (search when bodySearch, filter bar when filters is non-empty) above the canonical data-grid call. Until 2026-08-27 this was the only one of the six looks with no search affordance at all. See denseBodyContent/feedBodyContent/galleryBodyContent for the other browseLook bodies; any may be overridden directly while inheriting the same trait, state machine, emits, and listens. Inlined directly (not via a composed sibling trait) 2026-09-08 — a separately-listening DataGrid1 sibling fired unconditionally on every BrowseItemLoaded regardless of browseLook, racing the correct body for slot main (a listens guard can't gate this: both the Rust interpreter and the TS codegen path restrict a listens guard's context to @payload only, so a browseLook config check there always evaluates undefined).",
443
331
  "label": "Body content tree",
444
- "tier": "internal",
445
332
  "type": "render-ui"
446
333
  },
447
334
  "bodySearch": {
@@ -638,7 +525,18 @@
638
525
  ],
639
526
  {
640
527
  "children": [
641
- "@trait.DenseTableView"
528
+ {
529
+ "columns": "@config.columns",
530
+ "emptyMessage": "No records",
531
+ "entity": "@payload.data",
532
+ "itemActions": "@config.itemActions",
533
+ "itemClickEvent": "@config.itemClickEvent",
534
+ "look": "dense",
535
+ "maxInlineActions": "@config.maxInlineActions",
536
+ "pageSize": "@config.displayPageSize",
537
+ "selectable": "@config.selectable",
538
+ "type": "table-view"
539
+ }
642
540
  ],
643
541
  "className": "overflow-x-auto",
644
542
  "direction": "vertical",
@@ -651,7 +549,7 @@
651
549
  "gap": "none",
652
550
  "type": "stack"
653
551
  },
654
- "description": "Render-ui SExpr rendered after rows load when browseLook = dense. Spreadsheet-style sticky-header data-table with a search bar; composes columns/itemActions/maxInlineActions/displayPageSize/searchPlaceholder. Folded from std-browse-dense (Phase 5.B).",
552
+ "description": "Render-ui SExpr rendered after rows load when browseLook = dense. Spreadsheet-style sticky-header data-table with a search bar; composes columns/itemActions/maxInlineActions/displayPageSize/searchPlaceholder. Folded from std-browse-dense (Phase 5.B). Inlined directly (not via a composed sibling trait) 2026-09-08 — see the table-default body's note for why.",
655
553
  "label": "Dense look body",
656
554
  "tier": "internal",
657
555
  "type": "render-ui"
@@ -2623,8 +2521,6 @@
2623
2521
  ]
2624
2522
  },
2625
2523
  "traitEmbedIds": {
2626
- "DataGrid1": "trt_01KXZ44Y965J2Q55E5JN4JKVGR",
2627
- "DenseTableView": "trt_01KXZ44Y963YXRJDNR4F2M5QHX",
2628
2524
  "MasterListView": "trt_01KYG176Z400JFKWZ2XPKJ4798"
2629
2525
  }
2630
2526
  }
@@ -2764,14 +2660,6 @@
2764
2660
  "as": "Typography",
2765
2661
  "from": "std/behaviors/ui-typography"
2766
2662
  },
2767
- {
2768
- "as": "DataGrid",
2769
- "from": "std/behaviors/ui-data-grid"
2770
- },
2771
- {
2772
- "as": "TableView",
2773
- "from": "std/behaviors/ui-table-view"
2774
- },
2775
2663
  {
2776
2664
  "as": "DataList",
2777
2665
  "from": "std/behaviors/ui-data-list"
@@ -594,30 +594,7 @@
594
594
  },
595
595
  {
596
596
  "entity": "@payload.data",
597
- "fields": [
598
- {
599
- "icon": "calendar",
600
- "label": "Event",
601
- "name": "name",
602
- "variant": "h4"
603
- },
604
- {
605
- "label": "Time",
606
- "name": "time",
607
- "variant": "badge"
608
- },
609
- {
610
- "format": "date",
611
- "label": "Date",
612
- "name": "date",
613
- "variant": "caption"
614
- },
615
- {
616
- "label": "Status",
617
- "name": "status",
618
- "variant": "badge"
619
- }
620
- ],
597
+ "fields": "@config.fields",
621
598
  "itemActions": "@config.agendaItemActions",
622
599
  "look": "@config.tableLook",
623
600
  "type": "data-list"
@@ -659,6 +636,83 @@
659
636
  "tier": "presentation",
660
637
  "type": "string"
661
638
  },
639
+ "fields": {
640
+ "default": [
641
+ {
642
+ "icon": "calendar",
643
+ "label": "Event",
644
+ "name": "name",
645
+ "variant": "h4"
646
+ },
647
+ {
648
+ "label": "Time",
649
+ "name": "time",
650
+ "variant": "badge"
651
+ },
652
+ {
653
+ "format": "date",
654
+ "label": "Date",
655
+ "name": "date",
656
+ "variant": "caption"
657
+ },
658
+ {
659
+ "label": "Status",
660
+ "name": "status",
661
+ "variant": "badge"
662
+ }
663
+ ],
664
+ "description": "Row field descriptors for the 'Upcoming Events' data-list under calendarLook='month'. Rebound hosts must override this — it is a literal entity[field.name] lookup, unlike titleBinding/timeBinding/descriptionBinding (expression bindings), so it does not follow a rebind automatically.",
665
+ "items": {
666
+ "properties": {
667
+ "format": {
668
+ "name": "format",
669
+ "required": false,
670
+ "type": "string",
671
+ "values": [
672
+ "date",
673
+ "currency",
674
+ "number",
675
+ "boolean",
676
+ "percent"
677
+ ]
678
+ },
679
+ "icon": {
680
+ "name": "icon",
681
+ "required": false,
682
+ "type": "string"
683
+ },
684
+ "label": {
685
+ "name": "label",
686
+ "required": false,
687
+ "type": "string"
688
+ },
689
+ "name": {
690
+ "name": "name",
691
+ "required": true,
692
+ "type": "string"
693
+ },
694
+ "variant": {
695
+ "name": "variant",
696
+ "required": false,
697
+ "type": "string",
698
+ "values": [
699
+ "h3",
700
+ "h4",
701
+ "body",
702
+ "caption",
703
+ "badge",
704
+ "small",
705
+ "progress"
706
+ ]
707
+ }
708
+ },
709
+ "type": "object"
710
+ },
711
+ "label": "Upcoming-events columns",
712
+ "synonyms": "upcoming events columns, month view fields, event list columns",
713
+ "tier": "presentation",
714
+ "type": "[FieldSpec]"
715
+ },
662
716
  "filterBarLook": {
663
717
  "default": "toolbar",
664
718
  "description": "Visual treatment for the embedded filter bar, mirroring std-filter's own enum. Only applies when `filters` is non-empty.",
@@ -1712,6 +1766,29 @@
1712
1766
  }
1713
1767
  ],
1714
1768
  "types": {
1769
+ "FieldSpec": [
1770
+ {
1771
+ "name": "name",
1772
+ "required": true,
1773
+ "type": "string"
1774
+ },
1775
+ {
1776
+ "name": "label",
1777
+ "type": "string"
1778
+ },
1779
+ {
1780
+ "name": "variant",
1781
+ "type": "string"
1782
+ },
1783
+ {
1784
+ "name": "icon",
1785
+ "type": "string"
1786
+ },
1787
+ {
1788
+ "name": "format",
1789
+ "type": "string"
1790
+ }
1791
+ ],
1715
1792
  "FilterSpec": [
1716
1793
  {
1717
1794
  "name": "field",
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "16.209.0",
2
+ "version": "16.210.0",
3
3
  "model": "baai/bge-base-en-v1.5",
4
4
  "dimensions": 768,
5
- "registryHash": "db72ee3aaa3fad148486d6cc0088aa6dfda24443574190a69a22084d101f759f",
5
+ "registryHash": "00d078740308bc4c301c4912e353bea9a661e11d8e7572c2fa31c9fdf0d6629b",
6
6
  "signaturesHash": "c7114e7b08f4461f3f0a1b9a89c8ebb0183e8f9ba578931ad078eac326e84241"
7
7
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "16.208.0",
2
+ "version": "16.209.0",
3
3
  "model": "baai/bge-base-en-v1.5",
4
4
  "dimensions": 768,
5
5
  "encoding": "int8-b64",