@almadar/std 16.193.0 → 16.194.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 +9 -3
- package/behaviors/lolo/ui/core/atoms/std-app-layout.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/std-browse.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-calendar.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-date-range.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-detail-layout.lolo +3 -3
- package/behaviors/lolo/ui/core/atoms/std-filter.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-geosearch.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-graphs.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-modal.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-pagination.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-record-detail.lolo +13 -2
- package/behaviors/lolo/ui/core/atoms/std-scatter.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-search.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/std-tag-strip.lolo +8 -3
- package/behaviors/lolo/ui/core/atoms/std-thread.lolo +91 -28
- package/behaviors/lolo/ui/core/atoms/std-tree.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/ui-avatar.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/ui-badge.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-box.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/ui-button.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-card.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-checkbox.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-day-cell.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-filter-pill.lolo +4 -4
- package/behaviors/lolo/ui/core/atoms/ui-flip-container.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-hstack.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-infinite-scroll-sentinel.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-input.lolo +3 -3
- package/behaviors/lolo/ui/core/atoms/ui-overlay.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-radio.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-range-slider.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/ui-select.lolo +3 -3
- package/behaviors/lolo/ui/core/atoms/ui-stack.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-switch.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-text-highlight.lolo +5 -5
- package/behaviors/lolo/ui/core/atoms/ui-textarea.lolo +2 -2
- package/behaviors/lolo/ui/core/atoms/ui-time-slot-cell.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-typewriter-text.lolo +1 -1
- package/behaviors/lolo/ui/core/atoms/ui-vstack.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-accordion.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-alert.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-branching-logic-builder.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-breadcrumb.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-calendar-grid.lolo +6 -6
- package/behaviors/lolo/ui/core/molecules/ui-carousel.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-code-block.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-confirm-dialog.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-data-grid.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-data-list.lolo +7 -7
- package/behaviors/lolo/ui/core/molecules/ui-date-range-picker.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-date-range-selector.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-document-details.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-document-panel.lolo +5 -5
- package/behaviors/lolo/ui/core/molecules/ui-drawer.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-emoji-picker.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-empty-state.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-error-state.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-file-tree.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-filter-group.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-flip-card.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-floating-action-button.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-form-section-header.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-graph-canvas.lolo +5 -5
- package/behaviors/lolo/ui/core/molecules/ui-graph-view.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-header.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-import-preview-tree.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-import-source-picker.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-input-group.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-lightbox.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-likert-scale.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-map-view.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-matrix-question.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-modal.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-notification.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-number-stepper.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-option-constraint-group.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-orbital-visualization.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-page-header.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-pagination.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-popover.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-positioned-canvas.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-progress-dots.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-pull-to-refresh.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-qr-scanner.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-relation-select.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-repeatable-form-section.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-reply-tree.lolo +8 -8
- package/behaviors/lolo/ui/core/molecules/ui-rich-text-editor.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-search-input.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-side-panel.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-sidebar.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-signature-pad.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-sortable-list.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-star-rating.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-swipeable-row.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-table-view.lolo +4 -4
- package/behaviors/lolo/ui/core/molecules/ui-tabs.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-tag-input.lolo +3 -3
- package/behaviors/lolo/ui/core/molecules/ui-upload-drop-zone.lolo +1 -1
- package/behaviors/lolo/ui/core/molecules/ui-version-diff.lolo +6 -6
- package/behaviors/lolo/ui/core/molecules/ui-violation-alert.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-vote-stack.lolo +2 -2
- package/behaviors/lolo/ui/core/molecules/ui-wizard-container.lolo +5 -5
- package/behaviors/lolo/ui/core/molecules/ui-wizard-navigation.lolo +6 -6
- package/behaviors/lolo/ui/core/molecules/ui-wizard-progress.lolo +2 -2
- package/behaviors/lolo/ui/core/organisms/ui-detail-panel.lolo +1 -1
- package/behaviors/lolo/ui/core/organisms/ui-entity-cards.lolo +1 -1
- package/behaviors/lolo/ui/core/organisms/ui-form-section.lolo +3 -3
- package/behaviors/lolo/ui/core/organisms/ui-form.lolo +3 -3
- package/behaviors/lolo/ui/core/organisms/ui-media-gallery.lolo +1 -1
- package/behaviors/lolo/ui/core/organisms/ui-subagent-trace-panel.lolo +1 -1
- package/behaviors/lolo/ui/core/organisms/ui-tabbed-container.lolo +1 -1
- package/behaviors/lolo/ui/core/organisms/ui-timeline.lolo +1 -1
- package/behaviors/lolo/ui/core/templates/ui-counter-template.lolo +6 -6
- package/behaviors/lolo/ui/core/templates/ui-dashboard-layout.lolo +6 -6
- package/behaviors/lolo/ui/game/atoms/ui-canvas-2d.lolo +4 -4
- package/behaviors/lolo/ui/game/atoms/ui-canvas.lolo +5 -5
- package/behaviors/lolo/ui/game/atoms/ui-choice-button.lolo +2 -2
- package/behaviors/lolo/ui/game/atoms/ui-control-button.lolo +4 -4
- package/behaviors/lolo/ui/game/atoms/ui-control-grid.lolo +4 -4
- package/behaviors/lolo/ui/game/atoms/ui-game-menu.lolo +1 -1
- package/behaviors/lolo/ui/game/atoms/ui-sequence-bar.lolo +4 -4
- package/behaviors/lolo/ui/game/atoms/ui-state-graph.lolo +1 -1
- package/behaviors/lolo/ui/game/atoms/ui-trait-slot.lolo +7 -7
- package/behaviors/lolo/ui/game/organisms/std-tactics-board-2d.lolo +1 -1
- package/behaviors/lolo/ui/learning/atoms/ui-algo-graph-canvas.lolo +2 -2
- package/behaviors/lolo/ui/learning/atoms/ui-algorithm-canvas.lolo +1 -1
- package/behaviors/lolo/ui/learning/atoms/ui-biology-canvas.lolo +1 -1
- package/behaviors/lolo/ui/learning/atoms/ui-chemistry-canvas.lolo +1 -1
- package/behaviors/lolo/ui/learning/atoms/ui-learning-canvas.lolo +2 -2
- package/behaviors/lolo/ui/learning/atoms/ui-math-canvas.lolo +1 -1
- package/behaviors/lolo/ui/learning/atoms/ui-physics-canvas.lolo +1 -1
- package/behaviors/registry/infra/atoms/std-approval-gate.orb +37 -9
- package/behaviors/registry/ui/core/atoms/std-app-layout.orb +4 -2
- package/behaviors/registry/ui/core/atoms/std-browse.orb +2 -1
- package/behaviors/registry/ui/core/atoms/std-calendar.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-date-range.orb +2 -1
- package/behaviors/registry/ui/core/atoms/std-detail-layout.orb +3 -3
- package/behaviors/registry/ui/core/atoms/std-filter.orb +2 -1
- package/behaviors/registry/ui/core/atoms/std-geosearch.orb +2 -1
- package/behaviors/registry/ui/core/atoms/std-graphs.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-modal.orb +5 -1
- package/behaviors/registry/ui/core/atoms/std-pagination.orb +2 -1
- package/behaviors/registry/ui/core/atoms/std-record-detail.orb +38 -2
- package/behaviors/registry/ui/core/atoms/std-scatter.orb +1 -1
- package/behaviors/registry/ui/core/atoms/std-search.orb +2 -1
- package/behaviors/registry/ui/core/atoms/std-tag-strip.orb +75 -54
- package/behaviors/registry/ui/core/atoms/std-thread.orb +296 -109
- package/behaviors/registry/ui/core/atoms/std-tree.orb +20 -2
- package/behaviors/registry/ui/core/atoms/ui-avatar.orb +2 -2
- package/behaviors/registry/ui/core/atoms/ui-badge.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-box.orb +2 -2
- package/behaviors/registry/ui/core/atoms/ui-button.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-card.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-checkbox.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-day-cell.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-filter-pill.orb +5 -4
- package/behaviors/registry/ui/core/atoms/ui-flip-container.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-hstack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-infinite-scroll-sentinel.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-input.orb +3 -3
- package/behaviors/registry/ui/core/atoms/ui-overlay.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-radio.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-range-slider.orb +2 -2
- package/behaviors/registry/ui/core/atoms/ui-select.orb +3 -3
- package/behaviors/registry/ui/core/atoms/ui-stack.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-switch.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-text-highlight.orb +5 -5
- package/behaviors/registry/ui/core/atoms/ui-textarea.orb +2 -2
- package/behaviors/registry/ui/core/atoms/ui-time-slot-cell.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-typewriter-text.orb +1 -1
- package/behaviors/registry/ui/core/atoms/ui-vstack.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-accordion.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-alert.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-branching-logic-builder.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-breadcrumb.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-calendar-grid.orb +6 -6
- package/behaviors/registry/ui/core/molecules/ui-carousel.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-code-block.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-confirm-dialog.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-data-grid.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-data-list.orb +7 -7
- package/behaviors/registry/ui/core/molecules/ui-date-range-picker.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-date-range-selector.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-document-details.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-document-panel.orb +5 -5
- package/behaviors/registry/ui/core/molecules/ui-drawer.orb +3 -2
- package/behaviors/registry/ui/core/molecules/ui-emoji-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-empty-state.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-error-state.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-file-tree.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-filter-group.orb +4 -4
- package/behaviors/registry/ui/core/molecules/ui-flip-card.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-floating-action-button.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-form-section-header.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-graph-canvas.orb +5 -5
- package/behaviors/registry/ui/core/molecules/ui-graph-view.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-header.orb +4 -4
- package/behaviors/registry/ui/core/molecules/ui-import-preview-tree.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-import-source-picker.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-input-group.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-lightbox.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-likert-scale.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-map-view.orb +4 -4
- package/behaviors/registry/ui/core/molecules/ui-matrix-question.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-modal.orb +4 -3
- package/behaviors/registry/ui/core/molecules/ui-notification.orb +4 -4
- package/behaviors/registry/ui/core/molecules/ui-number-stepper.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-option-constraint-group.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-orbital-visualization.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-page-header.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-pagination.orb +5 -4
- package/behaviors/registry/ui/core/molecules/ui-popover.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-positioned-canvas.orb +4 -4
- package/behaviors/registry/ui/core/molecules/ui-progress-dots.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-pull-to-refresh.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-qr-scanner.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-relation-select.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-repeatable-form-section.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-reply-tree.orb +8 -8
- package/behaviors/registry/ui/core/molecules/ui-rich-text-editor.orb +3 -2
- package/behaviors/registry/ui/core/molecules/ui-search-input.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-side-panel.orb +3 -2
- package/behaviors/registry/ui/core/molecules/ui-sidebar.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-signature-pad.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-sortable-list.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-star-rating.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-swipeable-row.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-table-view.orb +4 -4
- package/behaviors/registry/ui/core/molecules/ui-tabs.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-tag-input.orb +3 -3
- package/behaviors/registry/ui/core/molecules/ui-upload-drop-zone.orb +1 -1
- package/behaviors/registry/ui/core/molecules/ui-version-diff.orb +6 -6
- package/behaviors/registry/ui/core/molecules/ui-violation-alert.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-vote-stack.orb +2 -2
- package/behaviors/registry/ui/core/molecules/ui-wizard-container.orb +5 -5
- package/behaviors/registry/ui/core/molecules/ui-wizard-navigation.orb +6 -6
- package/behaviors/registry/ui/core/molecules/ui-wizard-progress.orb +2 -2
- package/behaviors/registry/ui/core/organisms/ui-detail-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-entity-cards.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-form-section.orb +3 -3
- package/behaviors/registry/ui/core/organisms/ui-form.orb +3 -3
- package/behaviors/registry/ui/core/organisms/ui-media-gallery.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-subagent-trace-panel.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-tabbed-container.orb +1 -1
- package/behaviors/registry/ui/core/organisms/ui-timeline.orb +1 -1
- package/behaviors/registry/ui/core/templates/ui-counter-template.orb +6 -6
- package/behaviors/registry/ui/core/templates/ui-dashboard-layout.orb +6 -6
- package/behaviors/registry/ui/game/atoms/ui-canvas-2d.orb +4 -4
- package/behaviors/registry/ui/game/atoms/ui-canvas.orb +5 -5
- package/behaviors/registry/ui/game/atoms/ui-choice-button.orb +2 -2
- package/behaviors/registry/ui/game/atoms/ui-control-button.orb +4 -4
- package/behaviors/registry/ui/game/atoms/ui-control-grid.orb +4 -4
- package/behaviors/registry/ui/game/atoms/ui-game-menu.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-sequence-bar.orb +4 -4
- package/behaviors/registry/ui/game/atoms/ui-state-graph.orb +1 -1
- package/behaviors/registry/ui/game/atoms/ui-trait-slot.orb +8 -7
- package/behaviors/registry/ui/game/organisms/std-tactics-board-2d.orb +7 -13
- package/behaviors/registry/ui/learning/atoms/ui-algo-graph-canvas.orb +2 -2
- package/behaviors/registry/ui/learning/atoms/ui-algorithm-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-biology-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-chemistry-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-learning-canvas.orb +2 -2
- package/behaviors/registry/ui/learning/atoms/ui-math-canvas.orb +1 -1
- package/behaviors/registry/ui/learning/atoms/ui-physics-canvas.orb +1 -1
- package/dist/behaviors/exports-reader.js +413 -144
- package/dist/behaviors/functions/index.d.ts +24 -14
- package/dist/behaviors/functions/index.js +413 -144
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +413 -144
- package/dist/behaviors/query.js +413 -144
- package/dist/behaviors-embeddings.hash.json +3 -3
- package/dist/behaviors-embeddings.json +5 -5
- package/dist/behaviors-registry.json +8 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.js +413 -144
- 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 +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
app std-approval-gate "1.1.0"
|
|
2
|
-
"std-approval-gate — generic approval gate / approver workflow. Use when a user voices that an action must be reviewed, approved, signed off, or authorized by a privileged role before it proceeds (admin approval, supervisor sign-off, manager approval, gatekeeper review, editor approval, senior editor approval, reviewer approval, publishing approval, draft approval, content review, submit drafts then editors review and approve or reject, needs approval before going live, requires sign-off before publish). Persists ApprovalRequest rows + surfaces the PENDING ones in a review queue showing what is being approved and who asked, with Approve / Deny actions — Deny captures a written reason. approverRoles is ENFORCED by the review transitions themselves: an APPROVE/DENY from a viewer whose role is not listed does not fire. On approval emits ApprovalGranted; on denial emits ApprovalDenied (with the reason). Hosts that replay the gated action MUST route a failed replay back via APPROVAL_REPLAY_FAILED so the request reopens instead of being silently consumed. Compose onto any orbital whose action you want to gate: the target orbital emits an external event, an ApprovalRequest row is created (stamp subjectLabel/subjectId/requestedBy so reviewers see what they are judging), and downstream effects wait on ApprovalGranted. Differs from std-mod-queue, which is content-moderation-specific."
|
|
2
|
+
"std-approval-gate — generic approval gate / approver workflow. Use when a user voices that an action must be reviewed, approved, signed off, or authorized by a privileged role before it proceeds (admin approval, supervisor sign-off, manager approval, gatekeeper review, editor approval, senior editor approval, reviewer approval, publishing approval, draft approval, content review, submit drafts then editors review and approve or reject, needs approval before going live, requires sign-off before publish). Persists ApprovalRequest rows + surfaces the PENDING ones in a review queue showing what is being approved and who asked, with Approve / Deny actions — Deny captures a written reason. approverRoles is ENFORCED by the review transitions themselves: an APPROVE/DENY from a viewer whose role is not listed does not fire. blockSelfApproval additionally stops a reviewer approving their own request (four-eyes) — DENY stays allowed as self-withdrawal. On approval emits ApprovalGranted; on denial emits ApprovalDenied (with the reason). Hosts that replay the gated action MUST route a failed replay back via APPROVAL_REPLAY_FAILED so the request reopens instead of being silently consumed. Compose onto any orbital whose action you want to gate: the target orbital emits an external event, an ApprovalRequest row is created (stamp subjectLabel/subjectId/requestedBy so reviewers see what they are judging), and downstream effects wait on ApprovalGranted. Differs from std-mod-queue, which is content-moderation-specific."
|
|
3
3
|
orbital ApprovalGateOrbital {
|
|
4
4
|
uses Spinner from "std/behaviors/ui-spinner"
|
|
5
5
|
uses Typography from "std/behaviors/ui-typography"
|
|
@@ -227,8 +227,9 @@ orbital ApprovalGateOrbital {
|
|
|
227
227
|
;; The role guard IS the enforcement (both execution paths honor
|
|
228
228
|
;; transition guards, for the button and for a bus-delivered event
|
|
229
229
|
;; alike): empty approverRoles = ungated, otherwise the viewer's role
|
|
230
|
-
;; must be listed or the decision does not fire.
|
|
231
|
-
|
|
230
|
+
;; must be listed or the decision does not fire. blockSelfApproval
|
|
231
|
+
;; additionally blocks APPROVE when ?row.requestedBy is the viewer.
|
|
232
|
+
APPROVE -> reviewing when (and (or ["=", (array/len @config.approverRoles), 0] (array/includes @config.approverRoles @user.role)) (or ["=", @config.blockSelfApproval, false] ["!=", (object/get ?row requestedBy), @user.id]))
|
|
232
233
|
(set @entity.id ?id)
|
|
233
234
|
(set @entity.status approved)
|
|
234
235
|
(set @entity.reviewer @user.id)
|
|
@@ -499,6 +500,11 @@ orbital ApprovalGateOrbital {
|
|
|
499
500
|
@description "Roles eligible to decide. ENFORCED by the APPROVE/DENY transition guards: a viewer whose @user.role is not listed cannot fire a decision, from the button or from the bus. Empty = every signed-in viewer may decide (ungated)."
|
|
500
501
|
@synonyms "approver, reviewer, authorized roles, sign-off roles, who approves"
|
|
501
502
|
@tier "policy"
|
|
503
|
+
blockSelfApproval : boolean = false
|
|
504
|
+
@label "Block approving your own requests?"
|
|
505
|
+
@description "When on, a reviewer cannot APPROVE a request they submitted themselves (requestedBy = the viewer's id) — enforced by the APPROVE transition guard, from the button or from the bus. Requires hosts to stamp requestedBy at request creation. DENY stays allowed on your own request (denying your own request withdraws it). Off by default."
|
|
506
|
+
@synonyms "self approval, self-approval, four eyes, four-eyes, separation of duties, cannot approve own, no self sign-off, dual control"
|
|
507
|
+
@tier "policy"
|
|
502
508
|
threshold : number = 0
|
|
503
509
|
@label "Auto-approve below this value"
|
|
504
510
|
@description "Requests whose gated value is below this threshold are auto-approved. v1.0 declarative only."
|
|
@@ -119,7 +119,7 @@ orbital AppLayoutOrbital {
|
|
|
119
119
|
@description "Top-level navigation links shown on the left rail."
|
|
120
120
|
@synonyms "nav links, menu items, sidebar sections, navigation entries, pages"
|
|
121
121
|
@tier "presentation"
|
|
122
|
-
searchEvent :
|
|
122
|
+
searchEvent : event = SEARCH
|
|
123
123
|
@label "Search event"
|
|
124
124
|
@description "Event emitted when the user runs a global search"
|
|
125
125
|
@tier "internal"
|
|
@@ -133,7 +133,7 @@ orbital AppLayoutOrbital {
|
|
|
133
133
|
@description "Items shown in the notifications dropdown."
|
|
134
134
|
@synonyms "alerts, messages, notices, notification items, bell items"
|
|
135
135
|
@tier "presentation"
|
|
136
|
-
notificationClickEvent :
|
|
136
|
+
notificationClickEvent : event = NOTIFY_CLICK
|
|
137
137
|
@label "Notification click event"
|
|
138
138
|
@description "Event emitted when the user picks a notification"
|
|
139
139
|
@tier "internal"
|
|
@@ -370,7 +370,7 @@ orbital BrowseItemOrbital {
|
|
|
370
370
|
@description "Actions beyond this count collapse into a '⋯' overflow menu. Set 2–3 for dense tables."
|
|
371
371
|
@synonyms "inline actions limit, overflow threshold, max buttons per row"
|
|
372
372
|
@tier "presentation"
|
|
373
|
-
itemClickEvent :
|
|
373
|
+
itemClickEvent : event = VIEW
|
|
374
374
|
@label "Which event does clicking a row fire?"
|
|
375
375
|
@description "Row-click channel. Retarget when two browse lists coexist in one orbital and their VIEW payloads differ, so each gets its own typed channel."
|
|
376
376
|
@synonyms "row click event, item click, open event, select event"
|
|
@@ -234,7 +234,7 @@ orbital CalendarEventOrbital {
|
|
|
234
234
|
@description "Row column holding the timestamp the calendar grid places each chip by. Rebound hosts point this at their own column (e.g. startTime, startsAt, dueAt); the chip's LABEL comes from titleBinding, not from here."
|
|
235
235
|
@synonyms "start column, date column, when field, timestamp field"
|
|
236
236
|
@tier "presentation"
|
|
237
|
-
onEventClick :
|
|
237
|
+
onEventClick : event = ""
|
|
238
238
|
@label "On Event Click"
|
|
239
239
|
@description "Event emitted when a calendar chip is clicked: UI:{onEventClick} with { event } carrying the clicked row. Empty means chips are not clickable."
|
|
240
240
|
@synonyms "open event, event click, select event, chip click"
|
|
@@ -18,9 +18,9 @@ orbital DetailLayoutOrbital {
|
|
|
18
18
|
className: "w-full"
|
|
19
19
|
children: [{
|
|
20
20
|
type: stack
|
|
21
|
-
direction:
|
|
22
|
-
align:
|
|
23
|
-
gap:
|
|
21
|
+
direction: vertical
|
|
22
|
+
align: start
|
|
23
|
+
gap: xs
|
|
24
24
|
className: "w-full border-b border-border pb-3"
|
|
25
25
|
children: [{
|
|
26
26
|
type: button
|
|
@@ -82,7 +82,7 @@ orbital FilterTargetOrbital {
|
|
|
82
82
|
@description "Field, label, control type, and options for each filter input. numberrange renders a min/max slider pair (bounded by min/max/step) and emits one FILTER per side as `<field>_min` / `<field>_max`, mirroring daterange's `<field>_from` / `<field>_to` convention."
|
|
83
83
|
@synonyms "numeric range, price range, min max, slider filter, range filter, threshold filter"
|
|
84
84
|
@tier "presentation"
|
|
85
|
-
event :
|
|
85
|
+
event : event = FILTER
|
|
86
86
|
@label "Filter event"
|
|
87
87
|
@description "Event emitted when the user changes a filter selection"
|
|
88
88
|
@tier "internal"
|
|
@@ -112,7 +112,7 @@ orbital GeoSearchResultOrbital {
|
|
|
112
112
|
@label "Default radius (km)"
|
|
113
113
|
@description "Initial search radius around the chosen center"
|
|
114
114
|
@tier "presentation"
|
|
115
|
-
event :
|
|
115
|
+
event : event = GEO_SEARCH
|
|
116
116
|
@label "Search event"
|
|
117
117
|
@description "Event emitted when the user runs a geo search"
|
|
118
118
|
@tier "internal"
|
|
@@ -128,7 +128,7 @@ orbital GraphItemOrbital {
|
|
|
128
128
|
@description "Keep only the first N points after sorting (0 = all)"
|
|
129
129
|
@synonyms "user phrases: 'top 5' -> 5; 'top 10' -> 10; 'first 3' -> 3; 'all' / 'no limit' -> 0; 'show all' -> 0"
|
|
130
130
|
@tier "presentation"
|
|
131
|
-
drillEvent :
|
|
131
|
+
drillEvent : event = ""
|
|
132
132
|
@label "Drill event"
|
|
133
133
|
@description "Event emitted when a user clicks a chart point"
|
|
134
134
|
@synonyms "click-through navigation event. user phrases: 'on click navigate to X' / 'drill into X' / 'when clicked open X' -> X event name"
|
|
@@ -154,7 +154,7 @@ orbital ModalRecordOrbital {
|
|
|
154
154
|
@description "Per-field label/placeholder/hint overrides, keyed by field name. Types, options and required-ness stay entity-schema-driven (declare once on the entity); override only display copy the entity's @description doesn't fit."
|
|
155
155
|
@synonyms "field labels, custom labels, help text overrides, placeholder text"
|
|
156
156
|
@tier "presentation"
|
|
157
|
-
mode :
|
|
157
|
+
mode : "create" | "edit" = create
|
|
158
158
|
@label "Is this for creating or editing?"
|
|
159
159
|
@description "create = blank form; edit = pre-filled from the selected row."
|
|
160
160
|
@synonyms "form mode, create or edit, new or update, add or modify"
|
|
@@ -97,7 +97,7 @@ orbital PagedItemOrbital {
|
|
|
97
97
|
@label "Page size"
|
|
98
98
|
@description "Rows per page used to derive total page count"
|
|
99
99
|
@tier "presentation"
|
|
100
|
-
event :
|
|
100
|
+
event : event = PAGE
|
|
101
101
|
@label "Page-change event"
|
|
102
102
|
@description "Event emitted when the user picks a new page"
|
|
103
103
|
@tier "internal"
|
|
@@ -70,6 +70,12 @@ orbital RecordItemOrbital {
|
|
|
70
70
|
include: @config.include
|
|
71
71
|
})
|
|
72
72
|
(render-ui main { rows: 4, type: skeleton })
|
|
73
|
+
;; Event-opened overlay (openOn: event): stays blank until OPEN_VIEW,
|
|
74
|
+
;; but renders the blank EXPLICITLY — an embedded @trait.X reference to
|
|
75
|
+
;; a trait with no indexed content is flagged by the compiled client's
|
|
76
|
+
;; render probe (trait_bindings_resolved).
|
|
77
|
+
INIT -> idle when ["=", @config.openOn, "event"]
|
|
78
|
+
(render-ui main null)
|
|
73
79
|
;; self-loops on the external emits so the validator sees in-atom
|
|
74
80
|
;; listeners — the real consumers are the composing organism's
|
|
75
81
|
;; persistor (CONTENT_SAVED, TITLE_COMMITTED) and its refetch /
|
|
@@ -535,6 +541,11 @@ orbital RecordItemOrbital {
|
|
|
535
541
|
@label "Edit button label"
|
|
536
542
|
@description "Label of the quiet button above the document body that starts an editing session (the body itself is also clickable)."
|
|
537
543
|
@tier "presentation"
|
|
544
|
+
allowEdit : boolean = true
|
|
545
|
+
@label "Allow editing the document?"
|
|
546
|
+
@description "When false the document look is a pure read surface: no header Edit button, no click-to-edit body, no click-to-rename title. Hosts pass a role condition here so read-only viewers get the page without its authoring affordances; the entity's own access predicates stay the enforcement floor."
|
|
547
|
+
@synonyms "read only document, viewer mode, can edit, editing allowed"
|
|
548
|
+
@tier "policy"
|
|
538
549
|
doneLabel : string = "Done"
|
|
539
550
|
@label "Done button label"
|
|
540
551
|
@description "Label of the button that ends the document editing session; work is already autosaved when it is pressed."
|
|
@@ -613,14 +624,14 @@ orbital RecordItemOrbital {
|
|
|
613
624
|
actions: @config.actions
|
|
614
625
|
coverImage: @entity.coverUrl
|
|
615
626
|
icon: @entity.iconName
|
|
616
|
-
editEvent: EDIT_CONTENT
|
|
627
|
+
editEvent: (if @config.allowEdit EDIT_CONTENT null)
|
|
617
628
|
editLabel: @config.editLabel
|
|
618
629
|
id: @entity.id
|
|
619
630
|
maxInlineActions: @config.maxInlineActions
|
|
620
631
|
placeholder: @config.placeholder
|
|
621
632
|
subtitle: @entity.description
|
|
622
633
|
title: @entity.name
|
|
623
|
-
titleCommitEvent: TITLE_COMMITTED
|
|
634
|
+
titleCommitEvent: (if @config.allowEdit TITLE_COMMITTED null)
|
|
624
635
|
type: document-panel
|
|
625
636
|
value: @entity.content
|
|
626
637
|
className: "w-full"
|
|
@@ -118,7 +118,7 @@ orbital ScatterItemOrbital {
|
|
|
118
118
|
@label "Chart height"
|
|
119
119
|
@description "Pixel height of the rendered scatter plot"
|
|
120
120
|
@tier "presentation"
|
|
121
|
-
drillEvent :
|
|
121
|
+
drillEvent : event = ""
|
|
122
122
|
@label "Drill event"
|
|
123
123
|
@description "Event emitted when the user clicks a data point"
|
|
124
124
|
@tier "internal"
|
|
@@ -48,7 +48,7 @@ orbital SearchResultOrbital {
|
|
|
48
48
|
@label "Placeholder text"
|
|
49
49
|
@description "Hint text shown inside the empty search input"
|
|
50
50
|
@tier "presentation"
|
|
51
|
-
event :
|
|
51
|
+
event : event = SEARCH
|
|
52
52
|
@label "Search event"
|
|
53
53
|
@description "Event emitted when the user submits a query"
|
|
54
54
|
@tier "internal"
|
|
@@ -52,12 +52,12 @@ orbital TagStripOrbital {
|
|
|
52
52
|
})
|
|
53
53
|
TagStripOptions -> ready
|
|
54
54
|
(render-ui main {
|
|
55
|
-
children: [(if ["
|
|
55
|
+
children: [(if (or @config.readOnly ["=", @config.title, ""]) null {
|
|
56
56
|
color: muted
|
|
57
57
|
content: @config.title
|
|
58
58
|
type: typography
|
|
59
59
|
variant: caption
|
|
60
|
-
}
|
|
60
|
+
}), (if @config.readOnly null {
|
|
61
61
|
addEvent: ADD_TAG
|
|
62
62
|
helperText: @config.helperText
|
|
63
63
|
placeholder: @config.placeholder
|
|
@@ -65,7 +65,7 @@ orbital TagStripOrbital {
|
|
|
65
65
|
type: tag-input
|
|
66
66
|
value: (array/map (array/filter ?data (fn t (array/includes @entity.docTagIds (object/get @t id)))) (fn t (object/get @t name)))
|
|
67
67
|
variant: secondary
|
|
68
|
-
}, (if ["=", (array/len (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true)))), 0] null {
|
|
68
|
+
}), (if (or @config.readOnly ["=", (array/len (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true)))), 0]) null {
|
|
69
69
|
children: (array/map (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true))) (fn t {
|
|
70
70
|
action: ADD_TAG
|
|
71
71
|
actionPayload: { tag: @t.name }
|
|
@@ -299,6 +299,11 @@ orbital TagStripOrbital {
|
|
|
299
299
|
@label "Strip caption"
|
|
300
300
|
@description "Small caption above the chips; empty hides it"
|
|
301
301
|
@tier "presentation"
|
|
302
|
+
readOnly : boolean = false
|
|
303
|
+
@label "Read-only?"
|
|
304
|
+
@description "When true the strip renders nothing — no add input, no remove, no suggestion chips. Hosts pass a role condition here so read-only viewers rely on the record's read-only rails (which keep showing the tags) instead of an editing surface."
|
|
305
|
+
@synonyms "read only tags, viewer mode, no tag editing, hide tag input"
|
|
306
|
+
@tier "policy"
|
|
302
307
|
placeholder : string = "Add a tag…"
|
|
303
308
|
@label "Input placeholder"
|
|
304
309
|
@description "Placeholder in the type-to-add input"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
app std-thread "1.3.0"
|
|
2
|
-
"std-thread — forum-style nested replies with collapse + flat-mode toggle. Owns ThreadPost (persistent). flat:true covers 1:1 linear inquiry threads; flat:false renders forum-style nested. INIT fetches, scoped by @config.threadRootId when set (blank = every root, the default). REPLY persists a child post under @payload.parentId, stamped with the real @user identity. A consumer that mounts this as page comments forwards its own document-opened signal to SET_THREAD_ROOT { rootId }, which stamps the frame and refetches filtered by the payload; the after-create and after-select refetch arms keep filtering by @config.threadRootId, so a mutation re-widens the panel until the consumer re-fires SET_THREAD_ROOT. Layer 3 variants override `bodyContent` to deliver chat-bubble, email-threaded, or linear-comments UX while inheriting the same trait, state machine, emits, and listens."
|
|
2
|
+
"std-thread — forum-style nested replies with collapse + flat-mode toggle. Owns ThreadPost (persistent). flat:true covers 1:1 linear inquiry threads; flat:false renders forum-style nested. INIT fetches, scoped by @config.threadRootId when set (blank = every root, the default). REPLY persists a child post under @payload.parentId, stamped with the real @user identity. A consumer that mounts this as page comments forwards its own document-opened signal to SET_THREAD_ROOT { rootId }, which stamps the frame and refetches filtered by the payload; the after-create and after-select refetch arms keep filtering by @config.threadRootId, so a mutation re-widens the panel until the consumer re-fires SET_THREAD_ROOT. Layer 3 variants override `bodyContent` to deliver chat-bubble, email-threaded, or linear-comments UX while inheriting the same trait, state machine, emits, and listens. A non-empty sectionTitle switches the default bodyContent into titled-comments mode: header + post list + a standalone composer button (without it an empty thread has no REPLY emitter at all — the affordance only existed per-row)."
|
|
3
3
|
orbital ThreadPostOrbital {
|
|
4
4
|
;; Forward relation: array of child ThreadPost IDs whose parentId === this.id.
|
|
5
5
|
;; Lowers to `type: "relation", cardinality: "many"` (orbital-lolo lower.rs).
|
|
@@ -15,7 +15,15 @@ orbital ThreadPostOrbital {
|
|
|
15
15
|
|
|
16
16
|
type ThreadPostLoadFailed = Event { error : string, code : string } "Fired when the thread-post collection fails to load"
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
;; Bare entity alias, not { row: ThreadPost } — `persist create`'s success
|
|
19
|
+
;; emit is the created row itself (flat), matching @almadar/runtime's
|
|
20
|
+
;; EffectExecutor.ts (`successPayload = persisted ?? data`, emitted
|
|
21
|
+
;; directly) AND orbital-core's executor.rs (`executed_with_value(effect,
|
|
22
|
+
;; value)`), verified live 2026-08-30: a wrapped declaration validates and
|
|
23
|
+
;; compiles clean but silently returns undefined for every `?row.<field>`
|
|
24
|
+
;; access — no validator connects a persist-emit's declared shape to what
|
|
25
|
+
;; the effect that fires it actually produces.
|
|
26
|
+
type ThreadPostCreated = Event ThreadPost "Fired after a new thread-post persists successfully"
|
|
19
27
|
|
|
20
28
|
type ThreadPostCreateFailed = Event { error : string, code : string } "Fired when a new thread-post fails to persist"
|
|
21
29
|
|
|
@@ -97,7 +105,7 @@ orbital ThreadPostOrbital {
|
|
|
97
105
|
type: typography
|
|
98
106
|
variant: h4
|
|
99
107
|
}, {
|
|
100
|
-
|
|
108
|
+
onChange: EDIT_REPLY
|
|
101
109
|
placeholder: "Your reply…"
|
|
102
110
|
type: textarea
|
|
103
111
|
}, {
|
|
@@ -121,19 +129,50 @@ orbital ThreadPostOrbital {
|
|
|
121
129
|
gap: md
|
|
122
130
|
type: stack
|
|
123
131
|
})
|
|
132
|
+
;; Scoped to the row just created, not @config.threadRootId — a runtime-
|
|
133
|
+
;; scoped consumer (SET_THREAD_ROOT-driven, e.g. std-wiki's WikiComments)
|
|
134
|
+
;; never sets config.threadRootId, so that filter was permanently blank/
|
|
135
|
+
;; unfiltered here and every document's posts bled together on refetch.
|
|
136
|
+
;; ?threadRootId is the FLAT field on ThreadPostCreated's payload (the
|
|
137
|
+
;; row's own scope, per the create effect's fallback chain) — NOT
|
|
138
|
+
;; ?row.threadRootId; ThreadPostCreated's payload is the created row
|
|
139
|
+
;; itself (see the type alias above), no `row` wrapper exists.
|
|
124
140
|
ThreadPostCreated -> browsing
|
|
141
|
+
(set @entity.content "")
|
|
142
|
+
(set @entity.parentId "")
|
|
125
143
|
(fetch ThreadPost {
|
|
126
144
|
emit: { failure: ThreadPostLoadFailed, success: ThreadPostLoaded }
|
|
127
|
-
filter: (or ["=",
|
|
145
|
+
filter: (or ["=", ?threadRootId, ""] ["=", (object/get @entity threadRootId), ?threadRootId])
|
|
128
146
|
include: (replies)
|
|
129
147
|
})
|
|
148
|
+
;; SELECT's payload IS { id, row } (caller-constructed, unlike the
|
|
149
|
+
;; persist-auto-emitted ThreadPostCreated) — ?row.threadRootId is
|
|
150
|
+
;; correct here.
|
|
130
151
|
SELECT -> loading
|
|
131
152
|
(set @entity.focusedRow ?row)
|
|
132
153
|
(fetch ThreadPost {
|
|
133
154
|
emit: { failure: ThreadPostLoadFailed, success: ThreadPostLoaded }
|
|
134
|
-
filter: (or ["=",
|
|
155
|
+
filter: (or ["=", ?row.threadRootId, ""] ["=", (object/get @entity threadRootId), ?row.threadRootId])
|
|
135
156
|
include: (replies)
|
|
136
157
|
})
|
|
158
|
+
;; Inline composers (bodyContent overrides with their own textarea +
|
|
159
|
+
;; submit button) fire the composer triad while the trait sits in
|
|
160
|
+
;; browsing — without these arms every such click is swallowed.
|
|
161
|
+
EDIT_REPLY -> browsing
|
|
162
|
+
(set @entity.content ?value)
|
|
163
|
+
SUBMIT_REPLY -> browsing when (not ["=", (str/default @entity.content ""), ""])
|
|
164
|
+
(persist create ThreadPost {
|
|
165
|
+
authorId: @user.id
|
|
166
|
+
authorName: @user.name
|
|
167
|
+
content: @entity.content
|
|
168
|
+
parentId: (str/default @entity.parentId "")
|
|
169
|
+
threadRootId: (str/default @entity.threadRootId (str/default @config.threadRootId root))
|
|
170
|
+
} {
|
|
171
|
+
emit: { failure: ThreadPostCreateFailed, success: ThreadPostCreated }
|
|
172
|
+
})
|
|
173
|
+
CANCEL_REPLY -> browsing
|
|
174
|
+
(set @entity.content "")
|
|
175
|
+
(set @entity.parentId "")
|
|
137
176
|
;; replying.SUBMIT_REPLY -> browsing lands here before the persist
|
|
138
177
|
;; resolves; a failure must be caught here too, not just replying's twin arm.
|
|
139
178
|
ThreadPostCreateFailed -> browsing
|
|
@@ -163,19 +202,27 @@ orbital ThreadPostOrbital {
|
|
|
163
202
|
state replying {
|
|
164
203
|
EDIT_REPLY -> replying
|
|
165
204
|
(set @entity.content ?value)
|
|
166
|
-
SUBMIT_REPLY -> browsing
|
|
167
|
-
(persist create ThreadPost
|
|
205
|
+
SUBMIT_REPLY -> browsing when (not ["=", (str/default @entity.content ""), ""])
|
|
206
|
+
(persist create ThreadPost {
|
|
207
|
+
authorId: @user.id
|
|
208
|
+
authorName: @user.name
|
|
209
|
+
content: @entity.content
|
|
210
|
+
parentId: (str/default @entity.parentId "")
|
|
211
|
+
threadRootId: (str/default @entity.threadRootId (str/default @config.threadRootId root))
|
|
212
|
+
} {
|
|
168
213
|
emit: { failure: ThreadPostCreateFailed, success: ThreadPostCreated }
|
|
169
214
|
})
|
|
170
215
|
CANCEL_REPLY -> browsing
|
|
171
216
|
(set @entity.content "")
|
|
172
217
|
(set @entity.parentId "")
|
|
218
|
+
;; Scoped to the row just created (?threadRootId, flat) — see the twin
|
|
219
|
+
;; arm in `browsing` for why.
|
|
173
220
|
ThreadPostCreated -> browsing
|
|
174
221
|
(set @entity.content "")
|
|
175
222
|
(set @entity.parentId "")
|
|
176
223
|
(fetch ThreadPost {
|
|
177
224
|
emit: { failure: ThreadPostLoadFailed, success: ThreadPostLoaded }
|
|
178
|
-
filter: (or ["=",
|
|
225
|
+
filter: (or ["=", ?threadRootId, ""] ["=", (object/get @entity threadRootId), ?threadRootId])
|
|
179
226
|
include: (replies)
|
|
180
227
|
})
|
|
181
228
|
ThreadPostCreateFailed -> replying
|
|
@@ -234,10 +281,8 @@ orbital ThreadPostOrbital {
|
|
|
234
281
|
@description "Indicates a reply has been modified."
|
|
235
282
|
@synonyms "update, change, modify"
|
|
236
283
|
@tier "presentation"
|
|
237
|
-
SUBMIT_REPLY
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
@description "Signals a new reply has been successfully submitted."
|
|
284
|
+
SUBMIT_REPLY
|
|
285
|
+
@description "Signals the composed draft should be persisted as a new post — the draft is read from the entity frame (@entity.content), so bare buttons can emit it."
|
|
241
286
|
@synonyms "post, send, add, publish"
|
|
242
287
|
@tier "domain"
|
|
243
288
|
CANCEL_REPLY
|
|
@@ -257,10 +302,8 @@ orbital ThreadPostOrbital {
|
|
|
257
302
|
@description "Indicates a failure to load a thread post."
|
|
258
303
|
@synonyms "load error, fetch failed, retrieval failed"
|
|
259
304
|
@tier "internal"
|
|
260
|
-
ThreadPostCreated
|
|
261
|
-
row :
|
|
262
|
-
}
|
|
263
|
-
@description "A new post has been added to the thread."
|
|
305
|
+
ThreadPostCreated
|
|
306
|
+
@description "A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field."
|
|
264
307
|
@synonyms "new post, added, created"
|
|
265
308
|
@tier "domain"
|
|
266
309
|
ThreadPostCreateFailed {
|
|
@@ -294,10 +337,8 @@ orbital ThreadPostOrbital {
|
|
|
294
337
|
@description "A reply is being modified."
|
|
295
338
|
@synonyms "update, change, revise"
|
|
296
339
|
@tier "presentation"
|
|
297
|
-
SUBMIT_REPLY
|
|
298
|
-
|
|
299
|
-
}
|
|
300
|
-
@description "A new reply has been submitted and is awaiting processing."
|
|
340
|
+
SUBMIT_REPLY
|
|
341
|
+
@description "A new reply has been submitted and is awaiting processing — the draft is read from the entity frame (@entity.content), no payload required."
|
|
301
342
|
@synonyms "post, send, add, submit"
|
|
302
343
|
@tier "domain"
|
|
303
344
|
CANCEL_REPLY
|
|
@@ -317,10 +358,8 @@ orbital ThreadPostOrbital {
|
|
|
317
358
|
@description "Indicates a failure to load a thread post."
|
|
318
359
|
@synonyms "error, failure, load failed"
|
|
319
360
|
@tier "internal"
|
|
320
|
-
ThreadPostCreated
|
|
321
|
-
row :
|
|
322
|
-
}
|
|
323
|
-
@description "A new post has been added to the thread."
|
|
361
|
+
ThreadPostCreated
|
|
362
|
+
@description "A new post has been added to the thread — payload is the created ThreadPost row itself (flat: ?id, ?threadRootId, ?authorId, ?content, …), not wrapped under a row field."
|
|
324
363
|
@synonyms "new post, added, created"
|
|
325
364
|
@tier "domain"
|
|
326
365
|
ThreadPostCreateFailed {
|
|
@@ -356,9 +395,15 @@ orbital ThreadPostOrbital {
|
|
|
356
395
|
@label "recipientName"
|
|
357
396
|
@description "Header/recipient label for chat-style threads."
|
|
358
397
|
@tier "presentation"
|
|
359
|
-
sectionTitle : string =
|
|
398
|
+
sectionTitle : string = ""
|
|
360
399
|
@label "sectionTitle"
|
|
361
|
-
@description "Section header for
|
|
400
|
+
@description "Section header rendered by the default bodyContent when non-empty, along with a standalone composer button — the only REPLY affordance an empty thread has. Blank (the default) keeps the bare post list for embedded threads that bring their own chrome (chat rails, custom comment sections)."
|
|
401
|
+
@synonyms "header, comments title, discussion title"
|
|
402
|
+
@tier "presentation"
|
|
403
|
+
composerLabel : string = "Add comment"
|
|
404
|
+
@label "composerLabel"
|
|
405
|
+
@description "Label of the standalone composer button rendered under the post list when sectionTitle is non-empty."
|
|
406
|
+
@synonyms "reply label, comment button, add comment"
|
|
362
407
|
@tier "presentation"
|
|
363
408
|
emailAuthorBinding : string = @item.authorName
|
|
364
409
|
@label "emailAuthorBinding"
|
|
@@ -413,7 +458,15 @@ orbital ThreadPostOrbital {
|
|
|
413
458
|
@description "Reply binding for the reply body."
|
|
414
459
|
@tier "presentation"
|
|
415
460
|
bodyContent : render-ui = {
|
|
416
|
-
children: [{
|
|
461
|
+
children: [(if ["!=", @config.sectionTitle, ""] {
|
|
462
|
+
content: @config.sectionTitle
|
|
463
|
+
type: typography
|
|
464
|
+
variant: h4
|
|
465
|
+
} {
|
|
466
|
+
children: []
|
|
467
|
+
gap: none
|
|
468
|
+
type: stack
|
|
469
|
+
}), {
|
|
417
470
|
entity: ?data
|
|
418
471
|
fields: [{
|
|
419
472
|
label: Author
|
|
@@ -437,7 +490,17 @@ orbital ThreadPostOrbital {
|
|
|
437
490
|
look: @config.tableLook
|
|
438
491
|
type: data-list
|
|
439
492
|
variant: card
|
|
440
|
-
}]
|
|
493
|
+
}, (if ["!=", @config.sectionTitle, ""] {
|
|
494
|
+
action: REPLY
|
|
495
|
+
icon: message-square
|
|
496
|
+
label: @config.composerLabel
|
|
497
|
+
type: button
|
|
498
|
+
variant: secondary
|
|
499
|
+
} {
|
|
500
|
+
children: []
|
|
501
|
+
gap: none
|
|
502
|
+
type: stack
|
|
503
|
+
})]
|
|
441
504
|
direction: vertical
|
|
442
505
|
gap: md
|
|
443
506
|
type: stack
|
|
@@ -113,7 +113,7 @@ orbital TreeNodeOrbital {
|
|
|
113
113
|
type: file-tree
|
|
114
114
|
}]
|
|
115
115
|
direction: vertical
|
|
116
|
-
gap: md
|
|
116
|
+
gap: (if ["=", @config.look, "rail"] none md)
|
|
117
117
|
type: stack
|
|
118
118
|
})
|
|
119
119
|
TreeNodeLoadFailed -> error
|
|
@@ -265,7 +265,7 @@ orbital TreeNodeOrbital {
|
|
|
265
265
|
type: file-tree
|
|
266
266
|
}]
|
|
267
267
|
direction: vertical
|
|
268
|
-
gap: md
|
|
268
|
+
gap: (if ["=", @config.look, "rail"] none md)
|
|
269
269
|
type: stack
|
|
270
270
|
})
|
|
271
271
|
TreeNodeLoadFailed -> error
|
|
@@ -77,11 +77,11 @@ orbital AvatarOrbital {
|
|
|
77
77
|
@label "Class Name"
|
|
78
78
|
@description "Additional CSS classes"
|
|
79
79
|
@tier "presentation"
|
|
80
|
-
onClick :
|
|
80
|
+
onClick : event = "CLICK"
|
|
81
81
|
@label "On Click"
|
|
82
82
|
@description "Click handler"
|
|
83
83
|
@tier "presentation"
|
|
84
|
-
action :
|
|
84
|
+
action : event = "ACTION"
|
|
85
85
|
@label "Action"
|
|
86
86
|
@description "Declarative event name — emits UI:{action} via eventBus on click"
|
|
87
87
|
@tier "presentation"
|
|
@@ -68,7 +68,7 @@ orbital BadgeOrbital {
|
|
|
68
68
|
@label "Icon Asset"
|
|
69
69
|
@description "Asset image rendered as the badge icon; takes precedence over icon when provided."
|
|
70
70
|
@tier "presentation"
|
|
71
|
-
onRemove :
|
|
71
|
+
onRemove : event = ""
|
|
72
72
|
@label "On Remove"
|
|
73
73
|
@description "When set, renders a small X button on the right of the badge that invokes this handler — turns the badge into a removable chip. Used by the TagInput molecule and other 'list of removable values' surfaces."
|
|
74
74
|
@tier "presentation"
|
|
@@ -115,7 +115,7 @@ orbital BoxOrbital {
|
|
|
115
115
|
@label "Position"
|
|
116
116
|
@description "Position"
|
|
117
117
|
@tier "presentation"
|
|
118
|
-
action :
|
|
118
|
+
action : event = "ACTION"
|
|
119
119
|
@label "Action"
|
|
120
120
|
@description "Declarative event name — emits UI:{action} via eventBus on click"
|
|
121
121
|
@tier "presentation"
|
|
@@ -123,7 +123,7 @@ orbital BoxOrbital {
|
|
|
123
123
|
@label "Action Payload"
|
|
124
124
|
@description "Payload to include with the action event"
|
|
125
125
|
@tier "presentation"
|
|
126
|
-
hoverEvent :
|
|
126
|
+
hoverEvent : event = "HOVER"
|
|
127
127
|
@label "Hover Event"
|
|
128
128
|
@description "Declarative hover event — emits UI:{hoverEvent} with { hovered: true/false } on mouseEnter/mouseLeave"
|
|
129
129
|
@tier "presentation"
|
|
@@ -88,7 +88,7 @@ orbital ButtonOrbital {
|
|
|
88
88
|
@label "Icon Asset"
|
|
89
89
|
@description "Asset image rendered as the leading icon; takes precedence over icon/leftIcon when provided."
|
|
90
90
|
@tier "presentation"
|
|
91
|
-
action :
|
|
91
|
+
action : event = "ACTION"
|
|
92
92
|
@label "Action"
|
|
93
93
|
@description "Declarative event name — emits UI:{action} via eventBus on click"
|
|
94
94
|
@tier "presentation"
|
|
@@ -66,7 +66,7 @@ orbital CardOrbital {
|
|
|
66
66
|
@label "Children"
|
|
67
67
|
@description "Card content"
|
|
68
68
|
@tier "presentation"
|
|
69
|
-
action :
|
|
69
|
+
action : event = "ACTION"
|
|
70
70
|
@label "Action"
|
|
71
71
|
@description "Declarative event key emitted on click for trait dispatch"
|
|
72
72
|
@tier "presentation"
|
|
@@ -45,7 +45,7 @@ orbital CheckboxOrbital {
|
|
|
45
45
|
@label "Label"
|
|
46
46
|
@description "label prop"
|
|
47
47
|
@tier "presentation"
|
|
48
|
-
onChange :
|
|
48
|
+
onChange : event = "CHANGE"
|
|
49
49
|
@label "On Change"
|
|
50
50
|
@description "onChange handler or declarative event key for trait dispatch"
|
|
51
51
|
@tier "presentation"
|
|
@@ -36,7 +36,7 @@ orbital DayCellOrbital {
|
|
|
36
36
|
@label "Is Today"
|
|
37
37
|
@description "Whether this date is today"
|
|
38
38
|
@tier "presentation"
|
|
39
|
-
onClick :
|
|
39
|
+
onClick : event = "CLICK"
|
|
40
40
|
@label "On Click"
|
|
41
41
|
@description "Called when the day is clicked"
|
|
42
42
|
@tier "presentation"
|
|
@@ -77,7 +77,7 @@ orbital FilterPillOrbital {
|
|
|
77
77
|
@label "Icon"
|
|
78
78
|
@description "Lucide icon component or canonical kebab-case icon name string"
|
|
79
79
|
@tier "presentation"
|
|
80
|
-
onRemove :
|
|
80
|
+
onRemove : event = ""
|
|
81
81
|
@label "On Remove"
|
|
82
82
|
@description "Called when the user clicks the remove (×) button"
|
|
83
83
|
@tier "presentation"
|
|
@@ -85,15 +85,15 @@ orbital FilterPillOrbital {
|
|
|
85
85
|
@label "Removable"
|
|
86
86
|
@description "Disable the remove button (renders without × control)"
|
|
87
87
|
@tier "presentation"
|
|
88
|
-
onClick :
|
|
88
|
+
onClick : event = "CLICK"
|
|
89
89
|
@label "On Click"
|
|
90
90
|
@description "Click handler for the body of the pill (filter toggle)"
|
|
91
91
|
@tier "presentation"
|
|
92
|
-
clickEvent :
|
|
92
|
+
clickEvent : event = "CLICK"
|
|
93
93
|
@label "Click Event"
|
|
94
94
|
@description "Event name dispatched via event bus when the pill body is clicked. Payload: { label }"
|
|
95
95
|
@tier "presentation"
|
|
96
|
-
removeEvent :
|
|
96
|
+
removeEvent : event = ""
|
|
97
97
|
@label "Remove Event"
|
|
98
98
|
@description "Event name dispatched via event bus when the remove (×) button is clicked. Payload: { label }"
|
|
99
99
|
@tier "presentation"
|
|
@@ -40,7 +40,7 @@ orbital FlipContainerOrbital {
|
|
|
40
40
|
@label "Children"
|
|
41
41
|
@description "The two face elements (front and back)"
|
|
42
42
|
@tier "presentation"
|
|
43
|
-
onClick :
|
|
43
|
+
onClick : event = "CLICK"
|
|
44
44
|
@label "On Click"
|
|
45
45
|
@description "Click handler on the outer wrapper"
|
|
46
46
|
@tier "presentation"
|
|
@@ -82,7 +82,7 @@ orbital HstackOrbital {
|
|
|
82
82
|
@label "Tab Index"
|
|
83
83
|
@description "Tab index for focus management"
|
|
84
84
|
@tier "presentation"
|
|
85
|
-
action :
|
|
85
|
+
action : event = "ACTION"
|
|
86
86
|
@label "Action"
|
|
87
87
|
@description "Declarative event name — emits UI:{action} via eventBus on click"
|
|
88
88
|
@tier "presentation"
|