@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.
- package/behaviors/lolo/infra/atoms/std-approval-gate.lolo +184 -18
- package/behaviors/lolo/infra/atoms/std-status-lifecycle.lolo +16 -3
- package/behaviors/lolo/ui/core/atoms/std-billable-hour.lolo +1 -0
- package/behaviors/lolo/ui/core/atoms/std-browse.lolo +3 -0
- package/behaviors/lolo/ui/core/atoms/std-image-upload-multi.lolo +37 -4
- package/behaviors/lolo/ui/core/atoms/std-modal.lolo +20 -6
- package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +40 -3
- package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +176 -4
- package/behaviors/lolo/ui/core/atoms/std-version-history.lolo +3 -1
- package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +25 -1
- package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +37 -1
- package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +46 -1
- package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +30 -2
- package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +14 -29
- package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +19 -1
- package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +21 -1
- package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +15 -1
- package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +36 -1
- package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +41 -1
- package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +34 -1
- package/behaviors/lolo/ui/core/organisms/ui-entity-list.lolo +30 -1
- package/behaviors/lolo/ui/core/organisms/ui-entity-table.lolo +36 -1
- package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +39 -1
- package/behaviors/lolo/ui/core/organisms/ui-form.lolo +39 -1
- package/behaviors/lolo/ui/core/organisms/ui-master-detail.lolo +24 -1
- package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +30 -1
- package/behaviors/lolo/ui/core/organisms/ui-stat-card.lolo +37 -1
- package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +18 -1
- package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +21 -1
- package/behaviors/lolo/ui/core/templates/ui-generic-app-template.lolo +16 -1
- package/behaviors/lolo/ui/game/atoms/std-platformer-body.lolo +7 -2
- package/behaviors/lolo/ui/marketing/organisms/ui-book-chapter-view.lolo +12 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-book-table-of-contents.lolo +13 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-book-viewer.lolo +23 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-case-study-organism.lolo +23 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-feature-grid-organism.lolo +24 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-hero-organism.lolo +22 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-pricing-organism.lolo +23 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-showcase-organism.lolo +24 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-stats-organism.lolo +22 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-step-flow-organism.lolo +25 -1
- package/behaviors/lolo/ui/marketing/organisms/ui-team-organism.lolo +23 -1
- package/behaviors/lolo/ui/marketing/templates/ui-about-page-template.lolo +11 -1
- package/behaviors/lolo/ui/marketing/templates/ui-feature-detail-page-template.lolo +11 -1
- package/behaviors/lolo/ui/marketing/templates/ui-landing-page-template.lolo +13 -1
- package/behaviors/lolo/ui/marketing/templates/ui-pricing-page-template.lolo +11 -1
- package/behaviors/registry/infra/atoms/std-approval-gate.orb +717 -45
- package/behaviors/registry/infra/atoms/std-status-lifecycle.orb +85 -10
- package/behaviors/registry/ui/core/atoms/std-billable-hour.orb +5 -2
- package/behaviors/registry/ui/core/atoms/std-browse.orb +12 -0
- package/behaviors/registry/ui/core/atoms/std-image-upload-multi.orb +129 -7
- package/behaviors/registry/ui/core/atoms/std-modal.orb +95 -3
- package/behaviors/registry/ui/core/atoms/std-record-detail.orb +319 -3
- package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +539 -1
- package/behaviors/registry/ui/core/atoms/std-version-history.orb +5 -1
- package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +43 -0
- package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +55 -0
- package/behaviors/registry/ui/core/molecules/ui-data-list.orb +64 -0
- package/behaviors/registry/ui/core/molecules/ui-document-details.orb +106 -1
- package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +18 -80
- package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +37 -0
- package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +39 -0
- package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +45 -0
- package/behaviors/registry/ui/core/molecules/ui-table-view.orb +54 -0
- package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +59 -0
- package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +52 -0
- package/behaviors/registry/ui/core/organisms/ui-entity-list.orb +48 -0
- package/behaviors/registry/ui/core/organisms/ui-entity-table.orb +54 -0
- package/behaviors/registry/ui/core/organisms/ui-form-section.orb +57 -0
- package/behaviors/registry/ui/core/organisms/ui-form.orb +57 -0
- package/behaviors/registry/ui/core/organisms/ui-master-detail.orb +42 -0
- package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +48 -0
- package/behaviors/registry/ui/core/organisms/ui-stat-card.orb +55 -0
- package/behaviors/registry/ui/core/organisms/ui-timeline.orb +36 -0
- package/behaviors/registry/ui/core/templates/ui-counter-template.orb +39 -0
- package/behaviors/registry/ui/core/templates/ui-generic-app-template.orb +34 -0
- package/behaviors/registry/ui/game/atoms/std-platformer-body.orb +543 -496
- package/behaviors/registry/ui/marketing/organisms/ui-book-chapter-view.orb +30 -0
- package/behaviors/registry/ui/marketing/organisms/ui-book-table-of-contents.orb +31 -0
- package/behaviors/registry/ui/marketing/organisms/ui-book-viewer.orb +41 -0
- package/behaviors/registry/ui/marketing/organisms/ui-case-study-organism.orb +41 -0
- package/behaviors/registry/ui/marketing/organisms/ui-feature-grid-organism.orb +42 -0
- package/behaviors/registry/ui/marketing/organisms/ui-hero-organism.orb +40 -0
- package/behaviors/registry/ui/marketing/organisms/ui-pricing-organism.orb +41 -0
- package/behaviors/registry/ui/marketing/organisms/ui-showcase-organism.orb +42 -0
- package/behaviors/registry/ui/marketing/organisms/ui-stats-organism.orb +40 -0
- package/behaviors/registry/ui/marketing/organisms/ui-step-flow-organism.orb +43 -0
- package/behaviors/registry/ui/marketing/organisms/ui-team-organism.orb +41 -0
- package/behaviors/registry/ui/marketing/templates/ui-about-page-template.orb +29 -0
- package/behaviors/registry/ui/marketing/templates/ui-feature-detail-page-template.orb +29 -0
- package/behaviors/registry/ui/marketing/templates/ui-landing-page-template.orb +31 -0
- package/behaviors/registry/ui/marketing/templates/ui-pricing-page-template.orb +29 -0
- package/dist/behaviors/exports-reader.js +2651 -50
- package/dist/behaviors/functions/index.d.ts +138 -19
- package/dist/behaviors/functions/index.js +2650 -51
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +2652 -51
- package/dist/behaviors/query.js +2651 -50
- package/dist/behaviors-embeddings.hash.json +3 -3
- package/dist/behaviors-embeddings.json +961 -929
- package/dist/behaviors-registry.json +106 -58
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2652 -51
- package/dist/knob-embeddings.hash.json +3 -3
- package/dist/knob-embeddings.json +1 -1
- package/dist/registry/factory-signatures.json +1 -1
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 "
|
|
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
|
-
|
|
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
|
|