@almadar/std 16.190.0 → 16.192.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 (107) hide show
  1. package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +184 -18
  2. package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +16 -3
  3. package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +1 -0
  4. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +3 -0
  5. package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +37 -4
  6. package/behaviors/lolo/ui/core/atoms/std-modal.lolo +20 -6
  7. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +40 -3
  8. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +176 -4
  9. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +3 -1
  10. package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +25 -1
  11. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +37 -1
  12. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +46 -1
  13. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +30 -2
  14. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +14 -29
  15. package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +19 -1
  16. package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +21 -1
  17. package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +15 -1
  18. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +36 -1
  19. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +41 -1
  20. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +34 -1
  21. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +30 -1
  22. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +36 -1
  23. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +39 -1
  24. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +39 -1
  25. package/behaviors/lolo/ui/core/organisms/ui-master-detail.lolo +24 -1
  26. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +30 -1
  27. package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +37 -1
  28. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +18 -1
  29. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +21 -1
  30. package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +16 -1
  31. package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +7 -2
  32. package/behaviors/lolo/ui/marketing/organisms/ui-book-chapter-view.lolo +12 -1
  33. package/behaviors/lolo/ui/marketing/organisms/ui-book-table-of-contents.lolo +13 -1
  34. package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +23 -1
  35. package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +23 -1
  36. package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +24 -1
  37. package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +22 -1
  38. package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +23 -1
  39. package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +24 -1
  40. package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +22 -1
  41. package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +25 -1
  42. package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +23 -1
  43. package/behaviors/lolo/ui/marketing/templates/ui-about-page-template.lolo +11 -1
  44. package/behaviors/lolo/ui/marketing/templates/ui-feature-detail-page-template.lolo +11 -1
  45. package/behaviors/lolo/ui/marketing/templates/ui-landing-page-template.lolo +13 -1
  46. package/behaviors/lolo/ui/marketing/templates/ui-pricing-page-template.lolo +11 -1
  47. package/behaviors/registry/infra/atoms/std-approval-gate.orb +717 -45
  48. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +85 -10
  49. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +5 -2
  50. package/behaviors/registry/ui/core/atoms/std-browse.orb +12 -0
  51. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +129 -7
  52. package/behaviors/registry/ui/core/atoms/std-modal.orb +95 -3
  53. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +319 -3
  54. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +539 -1
  55. package/behaviors/registry/ui/core/atoms/std-version-history.orb +5 -1
  56. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +43 -0
  57. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +55 -0
  58. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +64 -0
  59. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +106 -1
  60. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +18 -80
  61. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +37 -0
  62. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +39 -0
  63. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +45 -0
  64. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +54 -0
  65. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +59 -0
  66. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +52 -0
  67. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +48 -0
  68. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +54 -0
  69. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +57 -0
  70. package/behaviors/registry/ui/core/organisms/ui-form.orb +57 -0
  71. package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +42 -0
  72. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +48 -0
  73. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +55 -0
  74. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +36 -0
  75. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +39 -0
  76. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +34 -0
  77. package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +543 -496
  78. package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +30 -0
  79. package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +31 -0
  80. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +41 -0
  81. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +41 -0
  82. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +42 -0
  83. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +40 -0
  84. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +41 -0
  85. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +42 -0
  86. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +40 -0
  87. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +43 -0
  88. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +41 -0
  89. package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +29 -0
  90. package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +29 -0
  91. package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +31 -0
  92. package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +29 -0
  93. package/dist/behaviors/exports-reader.js +2651 -50
  94. package/dist/behaviors/functions/index.d.ts +138 -19
  95. package/dist/behaviors/functions/index.js +2650 -51
  96. package/dist/behaviors/index.d.ts +1 -1
  97. package/dist/behaviors/index.js +2652 -51
  98. package/dist/behaviors/query.js +2651 -50
  99. package/dist/behaviors-embeddings.hash.json +3 -3
  100. package/dist/behaviors-embeddings.json +961 -929
  101. package/dist/behaviors-registry.json +106 -58
  102. package/dist/index.d.ts +1 -1
  103. package/dist/index.js +2652 -51
  104. package/dist/knob-embeddings.hash.json +3 -3
  105. package/dist/knob-embeddings.json +1 -1
  106. package/dist/registry/factory-signatures.json +1 -1
  107. package/package.json +3 -3
@@ -20,7 +20,9 @@ orbital RecordItemOrbital {
20
20
  status : "active" | "inactive" | "pending" @description "The record's current state." @synonyms "state, condition, stage" = active
21
21
  slug : string @description "URL-friendly identifier, for records opened by address instead of id." @synonyms "permalink, url key, address" = ""
22
22
  content : string @description "The record's rich-text body as HTML, edited in place by the document look." @synonyms "body, text, document, article body" = ""
23
- loadedRow : object @intrinsic @description "The full row exactly as last fetched (relations hydrated when config.include asks). The document look binds it as the panel's entity and hands it to header actions as ?row, so a settings modal seeds from the real record instead of the atom's four mapped columns." = {}
23
+ coverUrl : string @intrinsic @description "The document look's cover/hero image URL, stamped from the loaded row's coverField." = ""
24
+ iconName : string @intrinsic @description "The document look's icon name, stamped from the loaded row's iconField." = ""
25
+ loadedRow : object @intrinsic @description "The full row exactly as last fetched (relations hydrated when config.include asks). The details drawer binds it, and hosts that need it (e.g. a settings modal) stash it from RecordItemLoaded — the document panel itself takes only scalar props and emits scalar payloads ({ id, title })." = {}
24
26
  openDraft : string @intrinsic @description "Set from the navigate payload when the surface was opened on a record that was JUST minted blank; read once the row loads to decide whether the document body opens authoring (draft) or read-only. Absent on a refresh or a normal open, so the draft entry never repeats." @synonyms "new document, just created, draft open" = ""
25
27
  createdAt : string
26
28
  }
@@ -128,6 +130,8 @@ orbital RecordItemOrbital {
128
130
  (set @entity.name (object/get ?data @config.titleField))
129
131
  (set @entity.description (str/default (object/get ?data @config.subtitleField) ""))
130
132
  (set @entity.content (object/get ?data @config.contentField))
133
+ (set @entity.coverUrl (str/default (object/get ?data @config.coverField) ""))
134
+ (set @entity.iconName (str/default (object/get ?data @config.iconField) ""))
131
135
  (render-ui main @config.documentEditingContent)
132
136
  RecordItemLoaded -> viewing when ["!=", (str/default (object/get @entity openDraft) ""), "1"]
133
137
  ;; (object/merge … {}) is a type adapter only: type_compat lacks "declared object accepts a named row type" (ledgered)
@@ -136,6 +140,8 @@ orbital RecordItemOrbital {
136
140
  (set @entity.name (object/get ?data @config.titleField))
137
141
  (set @entity.description (str/default (object/get ?data @config.subtitleField) ""))
138
142
  (set @entity.content (object/get ?data @config.contentField))
143
+ (set @entity.coverUrl (str/default (object/get ?data @config.coverField) ""))
144
+ (set @entity.iconName (str/default (object/get ?data @config.iconField) ""))
139
145
  (if ["=", @config.detailLook, document]
140
146
  (render-ui main @config.documentBodyContent)
141
147
  (if ["=", @config.detailLook, slide-over]
@@ -149,6 +155,8 @@ orbital RecordItemOrbital {
149
155
  (set @entity.name (object/get (array/first ?data) @config.titleField))
150
156
  (set @entity.description (str/default (object/get (array/first ?data) @config.subtitleField) ""))
151
157
  (set @entity.content (object/get (array/first ?data) @config.contentField))
158
+ (set @entity.coverUrl (str/default (object/get (array/first ?data) @config.coverField) ""))
159
+ (set @entity.iconName (str/default (object/get (array/first ?data) @config.iconField) ""))
152
160
  (render-ui main @config.documentEditingContent)
153
161
  RecordItemSlugLoaded -> viewing when (and [">", (array/len ?data), 0] ["!=", (str/default (object/get @entity openDraft) ""), "1"])
154
162
  (set @entity.loadedRow (array/first ?data))
@@ -156,6 +164,8 @@ orbital RecordItemOrbital {
156
164
  (set @entity.name (object/get (array/first ?data) @config.titleField))
157
165
  (set @entity.description (str/default (object/get (array/first ?data) @config.subtitleField) ""))
158
166
  (set @entity.content (object/get (array/first ?data) @config.contentField))
167
+ (set @entity.coverUrl (str/default (object/get (array/first ?data) @config.coverField) ""))
168
+ (set @entity.iconName (str/default (object/get (array/first ?data) @config.iconField) ""))
159
169
  (if ["=", @config.detailLook, document]
160
170
  (render-ui main @config.documentBodyContent)
161
171
  (if ["=", @config.detailLook, slide-over]
@@ -245,6 +255,8 @@ orbital RecordItemOrbital {
245
255
  (set @entity.name (object/get ?data @config.titleField))
246
256
  (set @entity.description (str/default (object/get ?data @config.subtitleField) ""))
247
257
  (set @entity.content (object/get ?data @config.contentField))
258
+ (set @entity.coverUrl (str/default (object/get ?data @config.coverField) ""))
259
+ (set @entity.iconName (str/default (object/get ?data @config.iconField) ""))
248
260
  (if ["=", @config.detailLook, document]
249
261
  (render-ui main @config.documentBodyContent)
250
262
  (if ["=", @config.detailLook, slide-over]
@@ -258,6 +270,8 @@ orbital RecordItemOrbital {
258
270
  (set @entity.name (object/get (array/first ?data) @config.titleField))
259
271
  (set @entity.description (str/default (object/get (array/first ?data) @config.subtitleField) ""))
260
272
  (set @entity.content (object/get (array/first ?data) @config.contentField))
273
+ (set @entity.coverUrl (str/default (object/get (array/first ?data) @config.coverField) ""))
274
+ (set @entity.iconName (str/default (object/get (array/first ?data) @config.iconField) ""))
261
275
  (if ["=", @config.detailLook, document]
262
276
  (render-ui main @config.documentBodyContent)
263
277
  (if ["=", @config.detailLook, slide-over]
@@ -507,6 +521,16 @@ orbital RecordItemOrbital {
507
521
  @description "Name of the field on the loaded record that carries the rich-text HTML body the document look renders and edits (e.g. content, body, articleText)."
508
522
  @synonyms "body field, content field, document field"
509
523
  @tier "presentation"
524
+ coverField : string = ""
525
+ @label "Which field is the cover image?"
526
+ @description "Name of the image-typed field on the loaded record painted as the document look's full-bleed hero banner (e.g. coverImage, heroImage). Empty = no banner, the default."
527
+ @synonyms "cover field, hero image field, banner field"
528
+ @tier "presentation"
529
+ iconField : string = ""
530
+ @label "Which field is the document icon?"
531
+ @description "Name of the field on the loaded record whose icon name renders beside the document title (e.g. icon). Empty = no icon, the default."
532
+ @synonyms "icon field, glyph field"
533
+ @tier "presentation"
510
534
  editLabel : string = "Edit"
511
535
  @label "Edit button label"
512
536
  @description "Label of the quiet button above the document body that starts an editing session (the body itself is also clickable)."
@@ -587,9 +611,11 @@ orbital RecordItemOrbital {
587
611
  @tier "internal"
588
612
  documentBodyContent : render-ui = {
589
613
  actions: @config.actions
614
+ coverImage: @entity.coverUrl
615
+ icon: @entity.iconName
590
616
  editEvent: EDIT_CONTENT
591
617
  editLabel: @config.editLabel
592
- entity: @entity.loadedRow
618
+ id: @entity.id
593
619
  maxInlineActions: @config.maxInlineActions
594
620
  placeholder: @config.placeholder
595
621
  subtitle: @entity.description
@@ -604,12 +630,14 @@ orbital RecordItemOrbital {
604
630
  @tier "internal"
605
631
  documentEditingContent : render-ui = {
606
632
  actions: @config.actions
633
+ coverImage: @entity.coverUrl
634
+ icon: @entity.iconName
607
635
  autosaveHint: @config.autosaveHint
608
636
  contentChangeEvent: CONTENT_CHANGE
609
637
  doneEvent: DONE_EDITING
610
638
  doneLabel: @config.doneLabel
611
639
  editing: true
612
- entity: @entity.loadedRow
640
+ id: @entity.id
613
641
  maxInlineActions: @config.maxInlineActions
614
642
  placeholder: @config.placeholder
615
643
  subtitle: @entity.description
@@ -675,6 +703,14 @@ orbital RecordItemOrbital {
675
703
  @description "A property in the settings rail committed in place; patch carries the row id plus the one changed field, ready to hand straight to a persist update. Quiet contract: the host persists without refetching or repainting the open document."
676
704
  @synonyms "property saved, metadata changed, field committed, update property"
677
705
  @tier "domain"
706
+ RELATION_OPEN -> external {
707
+ field : string!
708
+ id : string!
709
+ name : string
710
+ }
711
+ @description "A relation chip in the details drawer was clicked (a tag, the author, the category); id is the linked row's id. Hosts route it to the linked record's own surface — a navigate, a scoped overlay, a filtered list."
712
+ @synonyms "open relation, linked record clicked, tag clicked, chip clicked"
713
+ @tier "domain"
678
714
  }
679
715
 
680
716
  listens {
@@ -718,6 +754,7 @@ orbital RecordItemOrbital {
718
754
  detailsContent : render-ui = {
719
755
  entity: @entity.loadedRow
720
756
  fields: @config.metaFields
757
+ relationEvent: RELATION_OPEN
721
758
  title: @config.detailsTitle
722
759
  type: document-details
723
760
  }
@@ -7,6 +7,8 @@ orbital TagTaxonomyOrbital {
7
7
 
8
8
  type TagSelected = Event { tagId : string! } "Fired when a tag is selected to drill into its children"
9
9
 
10
+ type TagCommit = { name : string!, parentId : string }
11
+
10
12
  entity Tag [persistent: tags] {
11
13
  id : string!
12
14
  name : string! @description "The descriptive label for this item." @synonyms "label, title, description"
@@ -21,6 +23,11 @@ orbital TagTaxonomyOrbital {
21
23
  initial: loading
22
24
 
23
25
  state loading {
26
+ LEVEL_RELOAD -> loading
27
+ (fetch Tag {
28
+ filter: ["=", (object/get @entity parentId), (str/default ?tagId "")]
29
+ emit: { failure: TagLoadFailed, success: TagLoaded }
30
+ })
24
31
  INIT -> loading
25
32
  (set @entity.id "")
26
33
  (set @entity.parentId "")
@@ -55,7 +62,14 @@ orbital TagTaxonomyOrbital {
55
62
  content: @config.title
56
63
  type: typography
57
64
  variant: h3
58
- }, {
65
+ }, (if @config.allowEdit {
66
+ action: NEW_TAG
67
+ icon: plus
68
+ label: "New category"
69
+ size: sm
70
+ type: button
71
+ variant: secondary
72
+ } null), {
59
73
  entity: ?data
60
74
  fields: []
61
75
  gap: sm
@@ -200,7 +214,14 @@ orbital TagTaxonomyOrbital {
200
214
  content: @config.title
201
215
  type: typography
202
216
  variant: h3
203
- }, {
217
+ }, (if @config.allowEdit {
218
+ action: NEW_TAG
219
+ icon: plus
220
+ label: "New category"
221
+ size: sm
222
+ type: button
223
+ variant: secondary
224
+ } null), {
204
225
  entity: ?data
205
226
  fields: []
206
227
  gap: sm
@@ -261,6 +282,29 @@ orbital TagTaxonomyOrbital {
261
282
  gap: md
262
283
  type: stack
263
284
  })
285
+ NEW_TAG -> creating when @config.allowEdit
286
+ (render-ui modal {
287
+ children: [{
288
+ content: "New category"
289
+ type: typography
290
+ variant: h3
291
+ }, {
292
+ color: muted
293
+ content: (if (!= @entity.id "") "Created inside the open category." "Created at the top level.")
294
+ type: typography
295
+ variant: caption
296
+ }, { type: divider }, {
297
+ cancelEvent: CANCEL_TAG
298
+ entity: { parentId: @entity.id }
299
+ fields: (name)
300
+ mode: create
301
+ submitEvent: COMMIT_TAG
302
+ type: form-section
303
+ }]
304
+ direction: vertical
305
+ gap: md
306
+ type: stack
307
+ })
264
308
  TagLoadFailed -> error
265
309
  (render-ui main {
266
310
  message: ?error
@@ -269,6 +313,61 @@ orbital TagTaxonomyOrbital {
269
313
  })
270
314
  }
271
315
 
316
+ state creating {
317
+ COMMIT_TAG -> creating
318
+ (persist create Tag {
319
+ name: (object/get ?data name)
320
+ parentId: (str/default (object/get ?data parentId) "")
321
+ } {
322
+ emit: { failure: TagCreateFailed, success: TagCreated }
323
+ })
324
+ ;; A filter expression binds @entity to the candidate ROW, so the open
325
+ ;; level must travel by payload: the arm emits LEVEL_RELOAD carrying the
326
+ ;; trait's own level id, and loading refetches from it.
327
+ CANCEL_TAG -> loading
328
+ (render-ui modal null)
329
+ (render-ui main {
330
+ align: center
331
+ children: [{ type: spinner }, {
332
+ color: muted
333
+ content: "Loading categories…"
334
+ type: typography
335
+ variant: caption
336
+ }]
337
+ className: py-12
338
+ direction: vertical
339
+ gap: md
340
+ type: stack
341
+ })
342
+ (emit LEVEL_RELOAD { tagId: @entity.id })
343
+ ;; Refetch the level the new tag landed on — its own parentId names it.
344
+ TagCreated -> loading
345
+ (render-ui modal null)
346
+ (render-ui main {
347
+ align: center
348
+ children: [{ type: spinner }, {
349
+ color: muted
350
+ content: "Loading categories…"
351
+ type: typography
352
+ variant: caption
353
+ }]
354
+ className: py-12
355
+ direction: vertical
356
+ gap: md
357
+ type: stack
358
+ })
359
+ (fetch Tag {
360
+ filter: ["=", (object/get @entity parentId), (str/default (object/get ?row parentId) "")]
361
+ emit: { failure: TagLoadFailed, success: TagLoaded }
362
+ })
363
+ TagCreateFailed -> creating
364
+ (render-ui modal {
365
+ message: ?error
366
+ type: alert
367
+ variant: error
368
+ })
369
+ }
370
+
272
371
  state editing {
273
372
  INIT -> loading
274
373
  (set @entity.id "")
@@ -311,7 +410,14 @@ orbital TagTaxonomyOrbital {
311
410
  content: @config.title
312
411
  type: typography
313
412
  variant: h3
314
- }, {
413
+ }, (if @config.allowEdit {
414
+ action: NEW_TAG
415
+ icon: plus
416
+ label: "New category"
417
+ size: sm
418
+ type: button
419
+ variant: secondary
420
+ } null), {
315
421
  entity: ?data
316
422
  fields: []
317
423
  gap: sm
@@ -429,6 +535,39 @@ orbital TagTaxonomyOrbital {
429
535
  @description "Signals a tag has been chosen for further exploration."
430
536
  @synonyms "chosen, picked, activated, highlighted"
431
537
  @tier "domain"
538
+ NEW_TAG
539
+ @description "Opens the new-category form (rendered only when allowEdit is on); the creation lands at the level currently open."
540
+ @synonyms "add tag, create category, new category"
541
+ @tier "domain"
542
+ COMMIT_TAG {
543
+ data : TagCommit
544
+ }
545
+ @description "The new-category form committed; data carries the name and the parent level."
546
+ @synonyms "save tag, create tag"
547
+ @tier "internal"
548
+ CANCEL_TAG
549
+ @description "The new-category form was dismissed without creating."
550
+ @synonyms "cancel, back"
551
+ @tier "internal"
552
+ LEVEL_RELOAD {
553
+ tagId : string
554
+ }
555
+ @description "Internal hop that refetches the open level after the new-category form closes (a fetch filter cannot read trait state, so the level travels by payload)."
556
+ @synonyms "reload level, refresh"
557
+ @tier "internal"
558
+ TagCreated {
559
+ row : Tag
560
+ }
561
+ @description "A new tag row persisted; the open level refetches to show it."
562
+ @synonyms "created, added"
563
+ @tier "internal"
564
+ TagCreateFailed {
565
+ error : string
566
+ code : string
567
+ }
568
+ @description "The tag create failed."
569
+ @synonyms "error, failure"
570
+ @tier "internal"
432
571
  }
433
572
 
434
573
  listens {
@@ -457,6 +596,39 @@ orbital TagTaxonomyOrbital {
457
596
  @description "A tag in the taxonomy has been chosen by the user."
458
597
  @synonyms "chosen, picked, activated, selected"
459
598
  @tier "domain"
599
+ NEW_TAG
600
+ @description "The New-category affordance was clicked."
601
+ @synonyms "add tag, create category"
602
+ @tier "domain"
603
+ COMMIT_TAG {
604
+ data : TagCommit
605
+ }
606
+ @description "The new-category form committed."
607
+ @synonyms "save tag, create tag"
608
+ @tier "internal"
609
+ CANCEL_TAG
610
+ @description "The new-category form was dismissed."
611
+ @synonyms "cancel, back"
612
+ @tier "internal"
613
+ LEVEL_RELOAD {
614
+ tagId : string
615
+ }
616
+ @description "Refetch the open level."
617
+ @synonyms "reload level, refresh"
618
+ @tier "internal"
619
+ TagCreated {
620
+ row : Tag
621
+ }
622
+ @description "A new tag row persisted."
623
+ @synonyms "created, added"
624
+ @tier "internal"
625
+ TagCreateFailed {
626
+ error : string
627
+ code : string
628
+ }
629
+ @description "The tag create failed."
630
+ @synonyms "error, failure"
631
+ @tier "internal"
460
632
  }
461
633
 
462
634
  config {
@@ -466,7 +638,7 @@ orbital TagTaxonomyOrbital {
466
638
  @tier "presentation"
467
639
  allowEdit : boolean = false
468
640
  @label "Allow editing"
469
- @description "Show inline controls to create or rename tags"
641
+ @description "Render the New-category affordance: creations land at the level currently open (top level, or inside the drilled-into category). Rename is a follow-up (ledgered)."
470
642
  @tier "domain"
471
643
  tableLook : "dense" | "spacious" | "striped" | "borderless" | "card-rows" = dense
472
644
  @label "Table look"
@@ -245,7 +245,9 @@ orbital RevisionOrbital {
245
245
  label: Document
246
246
  look: @config.statLook
247
247
  type: stat-display
248
- value: @entity.documentId
248
+ ;; The captured title, never the raw foreign id — also keeps this
249
+ ;; binding scalar when a consumer retypes documentId as a relation.
250
+ value: (str/default @entity.summary "")
249
251
  }, {
250
252
  icon: layers
251
253
  label: Type
@@ -15,7 +15,7 @@ orbital CalendarGridOrbital {
15
15
  initial: idle
16
16
 
17
17
  state idle {
18
- INIT -> idle
18
+ INIT -> idle when @config.selfFetch
19
19
  (fetch CalendarGridItem { emit: { success: CalendarGridLoaded } })
20
20
  (render-ui main {
21
21
  weekStart: @config.weekStart
@@ -36,6 +36,26 @@ orbital CalendarGridOrbital {
36
36
  colorField: @config.colorField
37
37
  type: calendar-grid
38
38
  })
39
+ INIT -> idle when (not @config.selfFetch)
40
+ (render-ui main {
41
+ weekStart: @config.weekStart
42
+ timeSlots: @config.timeSlots
43
+ events: @entity
44
+ onSlotClick: @config.onSlotClick
45
+ onDayClick: @config.onDayClick
46
+ onEventClick: @config.onEventClick
47
+ className: @config.className
48
+ longPressEvent: @config.longPressEvent
49
+ longPressPayload: @config.longPressPayload
50
+ swipeLeftEvent: @config.swipeLeftEvent
51
+ swipeRightEvent: @config.swipeRightEvent
52
+ dayWindow: @config.dayWindow
53
+ titleField: @config.titleField
54
+ startField: @config.startField
55
+ endField: @config.endField
56
+ colorField: @config.colorField
57
+ type: calendar-grid
58
+ })
39
59
  CalendarGridLoaded -> idle
40
60
  (render-ui main {
41
61
  weekStart: @config.weekStart
@@ -158,6 +178,10 @@ orbital CalendarGridOrbital {
158
178
  @label "Color Field"
159
179
  @description "Row field holding the chip's Tailwind colour class. Defaults to `color`."
160
180
  @tier "presentation"
181
+ selfFetch : boolean = true
182
+ @label "Fetch its own rows on mount?"
183
+ @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
184
+ @tier "internal"
161
185
  }
162
186
  }
163
187
 
@@ -41,7 +41,7 @@ orbital DataGridOrbital {
41
41
  initial: idle
42
42
 
43
43
  state idle {
44
- INIT -> idle
44
+ INIT -> idle when @config.selfFetch
45
45
  (fetch DataGridItem { emit: { success: DataGridLoaded } })
46
46
  (render-ui main {
47
47
  dragGroup: @config.dragGroup
@@ -74,6 +74,38 @@ orbital DataGridOrbital {
74
74
  look: @config.look
75
75
  type: data-grid
76
76
  })
77
+ INIT -> idle when (not @config.selfFetch)
78
+ (render-ui main {
79
+ dragGroup: @config.dragGroup
80
+ accepts: @config.accepts
81
+ sortable: @config.sortable
82
+ dropEvent: @config.dropEvent
83
+ reorderEvent: @config.reorderEvent
84
+ positionEvent: @config.positionEvent
85
+ dndItemIdField: @config.dndItemIdField
86
+ dndRoot: @config.dndRoot
87
+ entity: @entity
88
+ fields: @config.fields
89
+ columns: @config.columns
90
+ itemActions: @config.itemActions
91
+ maxInlineActions: @config.maxInlineActions
92
+ scrollX: @config.scrollX
93
+ cols: @config.cols
94
+ gap: @config.gap
95
+ minCardWidth: @config.minCardWidth
96
+ className: @config.className
97
+ isLoading: @config.isLoading
98
+ error: @config.error
99
+ imageField: @config.imageField
100
+ selectable: @config.selectable
101
+ selectionEvent: @config.selectionEvent
102
+ infiniteScroll: @config.infiniteScroll
103
+ loadMoreEvent: @config.loadMoreEvent
104
+ hasMore: @config.hasMore
105
+ pageSize: @config.pageSize
106
+ look: @config.look
107
+ type: data-grid
108
+ })
77
109
  DataGridLoaded -> idle
78
110
  (render-ui main {
79
111
  dragGroup: @config.dragGroup
@@ -239,6 +271,10 @@ orbital DataGridOrbital {
239
271
  @label "Look"
240
272
  @description "Layer 2 visual treatment — mirrors the `entity-table` look enum so data-grid / data-list / entity-table share one knob name from authors."
241
273
  @tier "presentation"
274
+ selfFetch : boolean = true
275
+ @label "Fetch its own rows on mount?"
276
+ @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
277
+ @tier "internal"
242
278
  }
243
279
  }
244
280
 
@@ -47,7 +47,7 @@ orbital DataListOrbital {
47
47
  initial: idle
48
48
 
49
49
  state idle {
50
- INIT -> idle
50
+ INIT -> idle when @config.selfFetch
51
51
  (fetch DataListItem { emit: { success: DataListLoaded } })
52
52
  (render-ui main {
53
53
  dragGroup: @config.dragGroup
@@ -89,6 +89,47 @@ orbital DataListOrbital {
89
89
  look: @config.look
90
90
  type: data-list
91
91
  })
92
+ INIT -> idle when (not @config.selfFetch)
93
+ (render-ui main {
94
+ dragGroup: @config.dragGroup
95
+ accepts: @config.accepts
96
+ sortable: @config.sortable
97
+ dropEvent: @config.dropEvent
98
+ reorderEvent: @config.reorderEvent
99
+ positionEvent: @config.positionEvent
100
+ dndItemIdField: @config.dndItemIdField
101
+ dndRoot: @config.dndRoot
102
+ entity: @entity
103
+ fields: @config.fields
104
+ columns: @config.columns
105
+ itemActions: @config.itemActions
106
+ maxInlineActions: @config.maxInlineActions
107
+ itemClickEvent: @config.itemClickEvent
108
+ gap: @config.gap
109
+ variant: @config.variant
110
+ groupBy: @config.groupBy
111
+ senderField: @config.senderField
112
+ senderLabelField: @config.senderLabelField
113
+ currentUser: @config.currentUser
114
+ emptyMessage: @config.emptyMessage
115
+ className: @config.className
116
+ isLoading: @config.isLoading
117
+ error: @config.error
118
+ reorderable: @config.reorderable
119
+ swipeLeftEvent: @config.swipeLeftEvent
120
+ swipeLeftActions: @config.swipeLeftActions
121
+ swipeRightEvent: @config.swipeRightEvent
122
+ swipeRightActions: @config.swipeRightActions
123
+ longPressEvent: @config.longPressEvent
124
+ infiniteScroll: @config.infiniteScroll
125
+ loadMoreEvent: @config.loadMoreEvent
126
+ hasMore: @config.hasMore
127
+ pageSize: @config.pageSize
128
+ sortBy: @config.sortBy
129
+ sortDirection: @config.sortDirection
130
+ look: @config.look
131
+ type: data-list
132
+ })
92
133
  DataListLoaded -> idle
93
134
  (render-ui main {
94
135
  dragGroup: @config.dragGroup
@@ -319,6 +360,10 @@ orbital DataListOrbital {
319
360
  @label "Look"
320
361
  @description "Layer 2 visual treatment — mirrors the `entity-table` look enum so data-grid / data-list / entity-table share one knob name from authors."
321
362
  @tier "presentation"
363
+ selfFetch : boolean = true
364
+ @label "Fetch its own rows on mount?"
365
+ @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
366
+ @tier "internal"
322
367
  }
323
368
  }
324
369
 
@@ -9,9 +9,10 @@ orbital DocumentDetailsOrbital {
9
9
  label : string
10
10
  header : string
11
11
  icon : icon
12
- kind : "text" | "boolean" | "select" | "readonly"
12
+ kind : "text" | "boolean" | "select" | "readonly" | "image"
13
13
  options : [string]
14
14
  format : "date" | "currency" | "number" | "boolean" | "percent"
15
+ type : string
15
16
  }
16
17
 
17
18
  entity DocumentDetailsItem [runtime] {
@@ -22,12 +23,23 @@ orbital DocumentDetailsOrbital {
22
23
  initial: idle
23
24
 
24
25
  state idle {
25
- INIT -> idle
26
+ INIT -> idle when @config.selfFetch
26
27
  (fetch DocumentDetailsItem { emit: { success: DocumentDetailsLoaded } })
27
28
  (render-ui main {
28
29
  entity: @entity
29
30
  fields: @config.fields
30
31
  metaCommitEvent: @config.metaCommitEvent
32
+ relationEvent: @config.relationEvent
33
+ title: @config.title
34
+ className: @config.className
35
+ type: document-details
36
+ })
37
+ INIT -> idle when (not @config.selfFetch)
38
+ (render-ui main {
39
+ entity: @entity
40
+ fields: @config.fields
41
+ metaCommitEvent: @config.metaCommitEvent
42
+ relationEvent: @config.relationEvent
31
43
  title: @config.title
32
44
  className: @config.className
33
45
  type: document-details
@@ -37,6 +49,7 @@ orbital DocumentDetailsOrbital {
37
49
  entity: @payload.data
38
50
  fields: @config.fields
39
51
  metaCommitEvent: @config.metaCommitEvent
52
+ relationEvent: @config.relationEvent
40
53
  title: @config.title
41
54
  className: @config.className
42
55
  type: document-details
@@ -50,6 +63,13 @@ orbital DocumentDetailsOrbital {
50
63
  }
51
64
  @description "Emitted when a property commits: { id, patch } — patch carries the id plus the one changed field, ready for a partial persist update."
52
65
  @tier "essential"
66
+ @config.relationEvent -> external {
67
+ field : string!
68
+ id : string!
69
+ name : string!
70
+ }
71
+ @description "Makes relation chips clickable: emitted with { field, id, name } when a hydrated relation value (or one row of a many-relation) is clicked — the host routes it to the linked record's own surface."
72
+ @tier "essential"
53
73
  DocumentDetailsLoaded
54
74
  @description "DocumentDetails rows finished loading; payload.data holds the collection."
55
75
  @synonyms "loaded, fetched, retrieved"
@@ -65,6 +85,10 @@ orbital DocumentDetailsOrbital {
65
85
  @label "Meta Commit Event"
66
86
  @description "Emitted when a property commits: { id, patch } — patch carries the id plus the one changed field, ready for a partial persist update."
67
87
  @tier "presentation"
88
+ relationEvent : string = "RELATION"
89
+ @label "Relation Event"
90
+ @description "Makes relation chips clickable: emitted with { field, id, name } when a hydrated relation value (or one row of a many-relation) is clicked — the host routes it to the linked record's own surface."
91
+ @tier "presentation"
68
92
  title : string
69
93
  @label "Title"
70
94
  @description "Card heading (defaults to the localized 'Details')"
@@ -73,6 +97,10 @@ orbital DocumentDetailsOrbital {
73
97
  @label "Class Name"
74
98
  @description "className prop"
75
99
  @tier "presentation"
100
+ selfFetch : boolean = true
101
+ @label "Fetch its own rows on mount?"
102
+ @description "true (default) = standalone mount self-populates on INIT. false = a composing atom owns the fetch and routes its loaded event here — suppresses the wrapper's own un-hydrated fetch so it cannot race the composer's."
103
+ @tier "internal"
76
104
  }
77
105
  }
78
106