@almadar/std 16.191.0 → 16.193.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 (113) 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-app-layout.lolo +6 -0
  4. package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +1 -0
  5. package/behaviors/lolo/ui/core/atoms/std-browse.lolo +3 -0
  6. package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +37 -4
  7. package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +37 -0
  8. package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +314 -0
  9. package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +195 -13
  10. package/behaviors/lolo/ui/core/atoms/std-tree.lolo +104 -12
  11. package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +3 -1
  12. package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +25 -1
  13. package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +37 -1
  14. package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +46 -1
  15. package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +30 -2
  16. package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +14 -0
  17. package/behaviors/lolo/ui/core/molecules/ui-file-tree.lolo +25 -0
  18. package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +19 -1
  19. package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +21 -1
  20. package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +15 -1
  21. package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +36 -1
  22. package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +41 -1
  23. package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +34 -1
  24. package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +30 -1
  25. package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +36 -1
  26. package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +39 -1
  27. package/behaviors/lolo/ui/core/organisms/ui-form.lolo +39 -1
  28. package/behaviors/lolo/ui/core/organisms/ui-master-detail.lolo +24 -1
  29. package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +30 -1
  30. package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +37 -1
  31. package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +18 -1
  32. package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +21 -1
  33. package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +5 -0
  34. package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +16 -1
  35. package/behaviors/lolo/ui/marketing/organisms/ui-book-chapter-view.lolo +12 -1
  36. package/behaviors/lolo/ui/marketing/organisms/ui-book-table-of-contents.lolo +13 -1
  37. package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +23 -1
  38. package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +23 -1
  39. package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +24 -1
  40. package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +22 -1
  41. package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +23 -1
  42. package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +24 -1
  43. package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +22 -1
  44. package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +25 -1
  45. package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +23 -1
  46. package/behaviors/lolo/ui/marketing/templates/ui-about-page-template.lolo +11 -1
  47. package/behaviors/lolo/ui/marketing/templates/ui-feature-detail-page-template.lolo +11 -1
  48. package/behaviors/lolo/ui/marketing/templates/ui-landing-page-template.lolo +13 -1
  49. package/behaviors/lolo/ui/marketing/templates/ui-pricing-page-template.lolo +11 -1
  50. package/behaviors/registry/infra/atoms/std-approval-gate.orb +717 -45
  51. package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +85 -10
  52. package/behaviors/registry/ui/core/atoms/std-app-layout.orb +8 -0
  53. package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +5 -2
  54. package/behaviors/registry/ui/core/atoms/std-browse.orb +12 -0
  55. package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +129 -7
  56. package/behaviors/registry/ui/core/atoms/std-record-detail.orb +316 -0
  57. package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +1360 -0
  58. package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +564 -10
  59. package/behaviors/registry/ui/core/atoms/std-tree.orb +427 -66
  60. package/behaviors/registry/ui/core/atoms/std-version-history.orb +5 -1
  61. package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +43 -0
  62. package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +55 -0
  63. package/behaviors/registry/ui/core/molecules/ui-data-list.orb +64 -0
  64. package/behaviors/registry/ui/core/molecules/ui-document-details.orb +106 -1
  65. package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +18 -0
  66. package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +41 -0
  67. package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +37 -0
  68. package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +39 -0
  69. package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +45 -0
  70. package/behaviors/registry/ui/core/molecules/ui-table-view.orb +54 -0
  71. package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +59 -0
  72. package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +52 -0
  73. package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +48 -0
  74. package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +54 -0
  75. package/behaviors/registry/ui/core/organisms/ui-form-section.orb +57 -0
  76. package/behaviors/registry/ui/core/organisms/ui-form.orb +57 -0
  77. package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +42 -0
  78. package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +48 -0
  79. package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +55 -0
  80. package/behaviors/registry/ui/core/organisms/ui-timeline.orb +36 -0
  81. package/behaviors/registry/ui/core/templates/ui-counter-template.orb +39 -0
  82. package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +7 -0
  83. package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +34 -0
  84. package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +30 -0
  85. package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +31 -0
  86. package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +41 -0
  87. package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +41 -0
  88. package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +42 -0
  89. package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +40 -0
  90. package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +41 -0
  91. package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +42 -0
  92. package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +40 -0
  93. package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +43 -0
  94. package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +41 -0
  95. package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +29 -0
  96. package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +29 -0
  97. package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +31 -0
  98. package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +29 -0
  99. package/dist/behaviors/exports-reader.js +4884 -1967
  100. package/dist/behaviors/functions/index.d.ts +293 -13
  101. package/dist/behaviors/functions/index.js +4880 -1968
  102. package/dist/behaviors/index.d.ts +1 -1
  103. package/dist/behaviors/index.js +4885 -1968
  104. package/dist/behaviors/query.js +4884 -1967
  105. package/dist/behaviors-embeddings.hash.json +3 -3
  106. package/dist/behaviors-embeddings.json +21 -13
  107. package/dist/behaviors-registry.json +685 -60
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.js +4885 -1968
  110. package/dist/knob-embeddings.hash.json +3 -3
  111. package/dist/knob-embeddings.json +1 -1
  112. package/dist/registry/factory-signatures.json +1 -1
  113. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  app std-tree "1.0.0"
2
- "std-tree — generic hierarchical node browser. Fetches a flat TreeNode collection and renders it through file-tree's flat `items` mode (parentId-nested at render time by the component, not the .lolo); OPEN_NODE is the external handoff for a selected node's id. Rebindable: pass `fields` at the call site to retarget it at any parent-pointer entity (categories, org units, comment threads). Search/filter are wired (REFETCH_QUERY/REFETCH_FILTER re-fetch the flat node set server-side); pagination is deliberately NOT offered — a hierarchy is not a paged list, and paging a flat node set would sever children from parents that fell on another page."
2
+ "std-tree — generic hierarchical node browser. Fetches a flat TreeNode collection and renders it through file-tree's flat `items` mode (parentId-nested at render time by the component, not the .lolo); OPEN_NODE is the external handoff for a selected node's id. Rebindable: pass `fields` at the call site to retarget it at any parent-pointer entity (categories, org units, comment threads). Search/filter are wired (REFETCH_QUERY/REFETCH_FILTER re-fetch the flat node set server-side). `look: rail` renders the compact sidebar-navigation form (slim caption, nav-styled rows) for mounting in an app layout's sidebarTrait; SET_CURRENT marks the open record so the row highlights and its ancestors auto-expand; `childAction: true` renders a hover plus-affordance per row emitting CHILD_REQUESTED { parentId } for the host's create-draft writer; pagination is deliberately NOT offered — a hierarchy is not a paged list, and paging a flat node set would sever children from parents that fell on another page."
3
3
  type FilterSpec = { field : string!, label : string, options : [string] }
4
4
  orbital TreeNodeOrbital {
5
5
  type TreeNodeLoaded = Event { data : [TreeNode] } "Fired when the tree node collection finishes loading"
@@ -18,6 +18,11 @@ orbital TreeNodeOrbital {
18
18
  initial: loading
19
19
 
20
20
  state loading {
21
+ SET_CURRENT -> loading
22
+ (set @entity.id ?id)
23
+ (fetch TreeNode {
24
+ emit: { failure: TreeNodeLoadFailed, success: TreeNodeLoaded }
25
+ })
21
26
  INIT -> loading
22
27
  (fetch TreeNode {
23
28
  emit: { failure: TreeNodeLoadFailed, success: TreeNodeLoaded }
@@ -37,7 +42,13 @@ orbital TreeNodeOrbital {
37
42
  })
38
43
  TreeNodeLoaded -> browsing
39
44
  (render-ui main {
40
- children: [{
45
+ children: [(if ["=", @config.look, "rail"] {
46
+ className: "px-2 pb-1 uppercase tracking-wide"
47
+ color: muted
48
+ content: @config.title
49
+ type: typography
50
+ variant: caption
51
+ } {
41
52
  align: center
42
53
  children: [{ name: list-tree, type: icon }, {
43
54
  content: @config.title
@@ -52,7 +63,11 @@ orbital TreeNodeOrbital {
52
63
  direction: horizontal
53
64
  gap: sm
54
65
  type: stack
55
- }, { type: divider }, (if @config.bodySearch {
66
+ }), (if ["=", @config.look, "rail"] {
67
+ children: []
68
+ gap: none
69
+ type: stack
70
+ } { type: divider }), (if @config.bodySearch {
56
71
  children: [{
57
72
  className: "w-full max-w-md"
58
73
  clearable: true
@@ -84,12 +99,17 @@ orbital TreeNodeOrbital {
84
99
  type: stack
85
100
  }), {
86
101
  items: (array/map ?data (fn row {
87
- icon: @row.icon
102
+ icon: (str/default (object/get @row @config.iconField) "")
88
103
  id: @row.id
89
- label: @row.name
90
- parentId: @row.parentId
104
+ label: (str/default (object/get @row @config.labelField) "")
105
+ parentId: (str/default (object/get @row @config.parentField) "")
91
106
  }))
107
+ look: (if ["=", @config.look, "rail"] nav files)
108
+ nodeActionIcon: plus
109
+ nodeActionLabel: @config.childActionLabel
110
+ onNodeAction: (if @config.childAction ADD_CHILD null)
92
111
  onNodeSelect: OPEN_NODE
112
+ selectedId: (str/default (object/get @entity id) "")
93
113
  type: file-tree
94
114
  }]
95
115
  direction: vertical
@@ -153,7 +173,7 @@ orbital TreeNodeOrbital {
153
173
  REFETCH_QUERY -> browsing
154
174
  (fetch TreeNode {
155
175
  emit: { failure: TreeNodeLoadFailed, success: TreeNodeLoaded }
156
- filter: (or ["=", ?searchTerm, ""] (str/includes (object/get @entity name) ?searchTerm))
176
+ filter: (or ["=", ?searchTerm, ""] (str/includes (str/default (object/get @entity @config.labelField) "") ?searchTerm))
157
177
  })
158
178
  REFETCH_FILTER -> browsing
159
179
  (fetch TreeNode {
@@ -162,9 +182,25 @@ orbital TreeNodeOrbital {
162
182
  })
163
183
  OPEN_NODE -> browsing
164
184
  (set @entity.id ?id)
185
+ ;; The open record changed (routed from the host document's load
186
+ ;; events): remember it and re-fetch so the re-render highlights the
187
+ ;; row and unfolds its ancestors.
188
+ SET_CURRENT -> browsing
189
+ (set @entity.id ?id)
190
+ (fetch TreeNode {
191
+ emit: { failure: TreeNodeLoadFailed, success: TreeNodeLoaded }
192
+ })
193
+ ADD_CHILD -> browsing
194
+ (emit CHILD_REQUESTED { parentId: ?id })
165
195
  TreeNodeLoaded -> browsing
166
196
  (render-ui main {
167
- children: [{
197
+ children: [(if ["=", @config.look, "rail"] {
198
+ className: "px-2 pb-1 uppercase tracking-wide"
199
+ color: muted
200
+ content: @config.title
201
+ type: typography
202
+ variant: caption
203
+ } {
168
204
  align: center
169
205
  children: [{ name: list-tree, type: icon }, {
170
206
  content: @config.title
@@ -179,7 +215,11 @@ orbital TreeNodeOrbital {
179
215
  direction: horizontal
180
216
  gap: sm
181
217
  type: stack
182
- }, { type: divider }, (if @config.bodySearch {
218
+ }), (if ["=", @config.look, "rail"] {
219
+ children: []
220
+ gap: none
221
+ type: stack
222
+ } { type: divider }), (if @config.bodySearch {
183
223
  children: [{
184
224
  className: "w-full max-w-md"
185
225
  clearable: true
@@ -211,12 +251,17 @@ orbital TreeNodeOrbital {
211
251
  type: stack
212
252
  }), {
213
253
  items: (array/map ?data (fn row {
214
- icon: @row.icon
254
+ icon: (str/default (object/get @row @config.iconField) "")
215
255
  id: @row.id
216
- label: @row.name
217
- parentId: @row.parentId
256
+ label: (str/default (object/get @row @config.labelField) "")
257
+ parentId: (str/default (object/get @row @config.parentField) "")
218
258
  }))
259
+ look: (if ["=", @config.look, "rail"] nav files)
260
+ nodeActionIcon: plus
261
+ nodeActionLabel: @config.childActionLabel
262
+ onNodeAction: (if @config.childAction ADD_CHILD null)
219
263
  onNodeSelect: OPEN_NODE
264
+ selectedId: (str/default (object/get @entity id) "")
220
265
  type: file-tree
221
266
  }]
222
267
  direction: vertical
@@ -275,6 +320,12 @@ orbital TreeNodeOrbital {
275
320
  @description "Signals a tree node has been selected for external handoff."
276
321
  @synonyms "select, choose, open, activate"
277
322
  @tier "domain"
323
+ CHILD_REQUESTED -> external {
324
+ parentId : string!
325
+ }
326
+ @description "Create a new record under this node — the host routes it into its create-draft writer with parentId stamped."
327
+ @synonyms "new subpage, add child page, create under"
328
+ @tier "domain"
278
329
  TreeNodeLoaded {
279
330
  data : [TreeNode]
280
331
  }
@@ -291,6 +342,18 @@ orbital TreeNodeOrbital {
291
342
  }
292
343
 
293
344
  listens {
345
+ SET_CURRENT {
346
+ id : string!
347
+ }
348
+ @description "Mark this record as the open one (routed from the host document's load events); its row highlights and its ancestors auto-expand."
349
+ @synonyms "highlight current, select node, you are here"
350
+ @tier "domain"
351
+ ADD_CHILD {
352
+ id : string!
353
+ }
354
+ @description "The row's hover + affordance was clicked."
355
+ @synonyms "add inside, new child"
356
+ @tier "presentation"
294
357
  REFETCH_QUERY {
295
358
  searchTerm : string!
296
359
  }
@@ -330,6 +393,35 @@ orbital TreeNodeOrbital {
330
393
  @label "Section title"
331
394
  @description "Heading shown above the tree"
332
395
  @tier "presentation"
396
+ labelField : string = name
397
+ @label "Label column"
398
+ @description "Entity field rendered as each node's label. Config-driven on purpose: the trait-level `fields {}` remap is compiled-path-only (the JS runtime never applies it), so a rebind names its columns here and both execution paths agree."
399
+ @synonyms "title field, name column, display field"
400
+ @tier "domain"
401
+ parentField : string = parentId
402
+ @label "Parent column"
403
+ @description "Entity field holding the parent reference the hierarchy nests by."
404
+ @synonyms "parent id field, hierarchy column"
405
+ @tier "domain"
406
+ iconField : string = icon
407
+ @label "Icon column"
408
+ @description "Entity field holding each node's icon name; point it at a nonexistent field (or empty) to suppress per-node icons."
409
+ @synonyms "glyph field, icon column"
410
+ @tier "presentation"
411
+ look : "full" | "rail" = full
412
+ @label "Tree look"
413
+ @description "full = standalone section (heading, count, divider); rail = compact sidebar navigation (slim caption, nav-styled rows) for an app layout's sidebarTrait slot."
414
+ @synonyms "sidebar tree, rail look, nav tree, compact"
415
+ @tier "presentation"
416
+ childAction : boolean = false
417
+ @label "Row + affordance?"
418
+ @description "Render a hover + on every row that emits CHILD_REQUESTED { parentId } — wire it to the host's create-draft writer so new records are born inside the node."
419
+ @synonyms "add inside, new subpage button, plus on rows"
420
+ @tier "domain"
421
+ childActionLabel : string = "Add inside"
422
+ @label "Row + tooltip"
423
+ @description "Accessible label on the row's + affordance (e.g. New subpage)."
424
+ @tier "presentation"
333
425
  bodySearch : boolean = false
334
426
  @label "Show the tree's own search box?"
335
427
  @description "Embeds a search box above the tree that re-fetches the flat node set server-side. Set false (the default) when the page already provides a search affordance (a toolbar Search molecule), so the surface shows one search box instead of two."
@@ -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
 
@@ -25,6 +25,8 @@ orbital DocumentPanelOrbital {
25
25
  (render-ui main {
26
26
  title: @entity.title
27
27
  subtitle: @config.subtitle
28
+ coverImage: @config.coverImage
29
+ icon: @config.icon
28
30
  value: @entity.value
29
31
  actions: @config.actions
30
32
  maxInlineActions: @config.maxInlineActions
@@ -45,6 +47,8 @@ orbital DocumentPanelOrbital {
45
47
  (render-ui main {
46
48
  title: @entity.title
47
49
  subtitle: @config.subtitle
50
+ coverImage: @config.coverImage
51
+ icon: @config.icon
48
52
  value: @entity.value
49
53
  actions: @config.actions
50
54
  maxInlineActions: @config.maxInlineActions
@@ -65,6 +69,8 @@ orbital DocumentPanelOrbital {
65
69
  (render-ui main {
66
70
  title: @entity.title
67
71
  subtitle: @config.subtitle
72
+ coverImage: @config.coverImage
73
+ icon: @config.icon
68
74
  value: @entity.value
69
75
  actions: @config.actions
70
76
  maxInlineActions: @config.maxInlineActions
@@ -125,6 +131,14 @@ orbital DocumentPanelOrbital {
125
131
  @label "Subtitle"
126
132
  @description "Muted byline under the title; hidden when empty"
127
133
  @tier "presentation"
134
+ coverImage : string
135
+ @label "Cover Image"
136
+ @description "Cover/hero image URL painted as a full-bleed banner above the header row (Notion/article-hero shape); hidden when empty"
137
+ @tier "presentation"
138
+ icon : icon
139
+ @label "Icon"
140
+ @description "Document icon rendered beside the title (a file glyph, a domain icon); hidden when empty"
141
+ @tier "presentation"
128
142
  value : string
129
143
  @label "Value"
130
144
  @description "The document body as rich-text HTML"
@@ -29,8 +29,13 @@ orbital FileTreeOrbital {
29
29
  tree: @config.tree
30
30
  items: @config.items
31
31
  selectedPath: @config.selectedPath
32
+ selectedId: @config.selectedId
33
+ look: @config.look
32
34
  onFileSelect: @config.onFileSelect
33
35
  onNodeSelect: @config.onNodeSelect
36
+ onNodeAction: @config.onNodeAction
37
+ nodeActionIcon: @config.nodeActionIcon
38
+ nodeActionLabel: @config.nodeActionLabel
34
39
  className: @config.className
35
40
  indent: @config.indent
36
41
  type: file-tree
@@ -58,6 +63,14 @@ orbital FileTreeOrbital {
58
63
  @label "Selected Path"
59
64
  @description "Currently selected file path"
60
65
  @tier "presentation"
66
+ selectedId : string
67
+ @label "Selected Id"
68
+ @description "Currently selected node id, in flat `items` mode: the row highlights and every ancestor auto-expands so the selection is always visible — the 'you are here' a navigation tree needs."
69
+ @tier "presentation"
70
+ look : "files" | "nav" = files
71
+ @label "Look"
72
+ @description "Visual treatment for flat `items` mode: `files` (default) keeps the monospace file-browser look; `nav` renders a sidebar navigation tree — regular font, document icons, roomier hit areas."
73
+ @tier "presentation"
61
74
  onFileSelect : string = "FILE_SELECT"
62
75
  @label "On File Select"
63
76
  @description "Called when a file is clicked"
@@ -66,6 +79,18 @@ orbital FileTreeOrbital {
66
79
  @label "On Node Select"
67
80
  @description "Called when a node is clicked, in flat `items` mode; carries the selected node's id. Presence-gated: binding this prop is what turns on the click-to-select affordance, mirroring Badge's `onRemove`."
68
81
  @tier "presentation"
82
+ onNodeAction : string = ""
83
+ @label "On Node Action"
84
+ @description "Called from the row's hover action button, in flat `items` mode; carries that node's id. Presence-gated: binding it renders the action."
85
+ @tier "presentation"
86
+ nodeActionIcon : string
87
+ @label "Node Action Icon"
88
+ @description "Icon for the row hover action (default: plus)."
89
+ @tier "presentation"
90
+ nodeActionLabel : string
91
+ @label "Node Action Label"
92
+ @description "Accessible label/tooltip for the row hover action."
93
+ @tier "presentation"
69
94
  className : string
70
95
  @label "Class Name"
71
96
  @description "CSS class"
@@ -19,7 +19,7 @@ orbital PositionedCanvasOrbital {
19
19
  initial: idle
20
20
 
21
21
  state idle {
22
- INIT -> idle
22
+ INIT -> idle when @config.selfFetch
23
23
  (fetch PositionedCanvasItem { emit: { success: PositionedCanvasLoaded } })
24
24
  (render-ui main {
25
25
  items: @entity
@@ -34,6 +34,20 @@ orbital PositionedCanvasOrbital {
34
34
  className: @config.className
35
35
  type: positioned-canvas
36
36
  })
37
+ INIT -> idle when (not @config.selfFetch)
38
+ (render-ui main {
39
+ items: @entity
40
+ width: @config.width
41
+ height: @config.height
42
+ selectedId: @config.selectedId
43
+ editable: @config.editable
44
+ onSelect: @config.onSelect
45
+ onMove: @config.onMove
46
+ selectEvent: @config.selectEvent
47
+ moveEvent: @config.moveEvent
48
+ className: @config.className
49
+ type: positioned-canvas
50
+ })
37
51
  PositionedCanvasLoaded -> idle
38
52
  (render-ui main {
39
53
  items: @payload.data
@@ -106,6 +120,10 @@ orbital PositionedCanvasOrbital {
106
120
  @label "Class Name"
107
121
  @description "className prop"
108
122
  @tier "presentation"
123
+ selfFetch : boolean = true
124
+ @label "Fetch its own rows on mount?"
125
+ @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."
126
+ @tier "internal"
109
127
  }
110
128
  }
111
129
 
@@ -19,7 +19,7 @@ orbital ReplyTreeOrbital {
19
19
  initial: idle
20
20
 
21
21
  state idle {
22
- INIT -> idle
22
+ INIT -> idle when @config.selfFetch
23
23
  (fetch ReplyTreeItem { emit: { success: ReplyTreeLoaded } })
24
24
  (render-ui main {
25
25
  nodes: @entity
@@ -36,6 +36,22 @@ orbital ReplyTreeOrbital {
36
36
  className: @config.className
37
37
  type: reply-tree
38
38
  })
39
+ INIT -> idle when (not @config.selfFetch)
40
+ (render-ui main {
41
+ nodes: @entity
42
+ maxDepth: @config.maxDepth
43
+ onVote: @config.onVote
44
+ onReply: @config.onReply
45
+ onFlag: @config.onFlag
46
+ onContinueThread: @config.onContinueThread
47
+ voteEvent: @config.voteEvent
48
+ replyEvent: @config.replyEvent
49
+ flagEvent: @config.flagEvent
50
+ continueThreadEvent: @config.continueThreadEvent
51
+ showActions: @config.showActions
52
+ className: @config.className
53
+ type: reply-tree
54
+ })
39
55
  ReplyTreeLoaded -> idle
40
56
  (render-ui main {
41
57
  nodes: @payload.data
@@ -128,6 +144,10 @@ orbital ReplyTreeOrbital {
128
144
  @label "Class Name"
129
145
  @description "className prop"
130
146
  @tier "presentation"
147
+ selfFetch : boolean = true
148
+ @label "Fetch its own rows on mount?"
149
+ @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."
150
+ @tier "internal"
131
151
  }
132
152
  }
133
153