@almadar/std 16.192.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 +8 -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 +319 -0
- package/behaviors/lolo/ui/core/atoms/std-tag-taxonomy.lolo +27 -17
- package/behaviors/lolo/ui/core/atoms/std-thread.lolo +91 -28
- package/behaviors/lolo/ui/core/atoms/std-tree.lolo +106 -14
- 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 +27 -2
- 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 +11 -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 +12 -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 +1381 -0
- package/behaviors/registry/ui/core/atoms/std-tag-taxonomy.orb +34 -18
- package/behaviors/registry/ui/core/atoms/std-thread.orb +296 -109
- package/behaviors/registry/ui/core/atoms/std-tree.orb +447 -68
- 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 +42 -1
- 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 +13 -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 +2587 -1923
- package/dist/behaviors/functions/index.d.ts +183 -16
- package/dist/behaviors/functions/index.js +2585 -1924
- package/dist/behaviors/index.d.ts +1 -1
- package/dist/behaviors/index.js +2588 -1924
- package/dist/behaviors/query.js +2587 -1923
- package/dist/behaviors-embeddings.hash.json +3 -3
- package/dist/behaviors-embeddings.json +15 -7
- package/dist/behaviors-registry.json +597 -14
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2588 -1924
- 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."
|
|
@@ -41,6 +41,7 @@ orbital AppLayoutOrbital {
|
|
|
41
41
|
notificationClickEvent: @config.notificationClickEvent
|
|
42
42
|
notifications: @config.notifications
|
|
43
43
|
searchEvent: @config.searchEvent
|
|
44
|
+
sidebarContent: @config.sidebarTrait
|
|
44
45
|
topBarActions: @config.topBarActions
|
|
45
46
|
type: @config.layoutPattern
|
|
46
47
|
user: (if @config.viewerName { avatar: @config.viewerAvatar, email: @config.viewerEmail, name: @config.viewerName } null)
|
|
@@ -90,6 +91,11 @@ orbital AppLayoutOrbital {
|
|
|
90
91
|
@label "Content trait"
|
|
91
92
|
@description "Trait rendered inside the app layout content area"
|
|
92
93
|
@tier "presentation"
|
|
94
|
+
sidebarTrait : trait
|
|
95
|
+
@label "Sidebar trait"
|
|
96
|
+
@description "Optional trait rendered in the sidebar between the nav links and the footer — the Notion/Confluence-style always-visible page tree; scrolls independently. Unset renders plain nav only."
|
|
97
|
+
@synonyms "sidebar tree, nav tree, page tree in sidebar, hierarchy rail"
|
|
98
|
+
@tier "presentation"
|
|
93
99
|
appName : string = App
|
|
94
100
|
@label "What should this app be called?"
|
|
95
101
|
@description "Name shown in the top-left of the chrome header."
|
|
@@ -113,7 +119,7 @@ orbital AppLayoutOrbital {
|
|
|
113
119
|
@description "Top-level navigation links shown on the left rail."
|
|
114
120
|
@synonyms "nav links, menu items, sidebar sections, navigation entries, pages"
|
|
115
121
|
@tier "presentation"
|
|
116
|
-
searchEvent :
|
|
122
|
+
searchEvent : event = SEARCH
|
|
117
123
|
@label "Search event"
|
|
118
124
|
@description "Event emitted when the user runs a global search"
|
|
119
125
|
@tier "internal"
|
|
@@ -127,7 +133,7 @@ orbital AppLayoutOrbital {
|
|
|
127
133
|
@description "Items shown in the notifications dropdown."
|
|
128
134
|
@synonyms "alerts, messages, notices, notification items, bell items"
|
|
129
135
|
@tier "presentation"
|
|
130
|
-
notificationClickEvent :
|
|
136
|
+
notificationClickEvent : event = NOTIFY_CLICK
|
|
131
137
|
@label "Notification click event"
|
|
132
138
|
@description "Event emitted when the user picks a notification"
|
|
133
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"
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
app std-tag-strip "1.0.0"
|
|
2
|
+
"std-tag-strip — inline tag editing ON the document surface: the record's tags render as removable chips with a type-to-add input (a typed name that matches an existing tag attaches it; an unknown name is created in the shared taxonomy first), plus one-click chips for every existing tag not yet attached. Emits TAGS_CHANGED { id, tagIds } — the host organism routes it into its persistor's update; the document's refetch re-scopes the strip. Binds any record carrying a tagIds relation array; the tag store is the shared `tags` collection (std-tag-taxonomy's)."
|
|
3
|
+
;; @capabilities "inline tags, tag chips on a document, add tag from taxonomy, create tag by typing, remove tag chip, tag editing in place"
|
|
4
|
+
orbital TagStripOrbital {
|
|
5
|
+
type TagStripOptions = Event { data : [StripTag] } "The shared tag store loaded for the strip's display pass"
|
|
6
|
+
|
|
7
|
+
type TagStripAddOptions = Event { data : [StripTag] } "The shared tag store loaded to resolve a typed tag name on add"
|
|
8
|
+
|
|
9
|
+
type TagStripRemoveOptions = Event { data : [StripTag] } "The shared tag store loaded to resolve the remaining names on remove"
|
|
10
|
+
|
|
11
|
+
type TagStripTagCreated = Event { id : string, row : StripTag } "A typed tag name had no existing row; one was created in the shared taxonomy"
|
|
12
|
+
|
|
13
|
+
type TagStripLoadFailed = Event { error : string, code : string } "The tag store fetch or create failed"
|
|
14
|
+
|
|
15
|
+
entity StripTag [persistent: tags] {
|
|
16
|
+
id : string!
|
|
17
|
+
name : string! @description "The descriptive label for this tag." @synonyms "label, title"
|
|
18
|
+
parentId : StripTag @description "Reference to the parent tag in the hierarchy; empty marks a root." @synonyms "parent, ancestor"
|
|
19
|
+
createdAt : string = ""
|
|
20
|
+
pendingId : string = ""
|
|
21
|
+
docId : string @intrinsic @description "The open record's id, stashed at SHOW_TAG_STRIP so commits know which row to update." @synonyms "record id, scope id" = ""
|
|
22
|
+
docTagIds : [string] @intrinsic @description "The open record's current tag ids, stashed at SHOW_TAG_STRIP for membership tests." @synonyms "attached tags, current tags"
|
|
23
|
+
pendingTagName : string @intrinsic @description "The tag name typed or clicked on add, held across the resolve fetch." @synonyms "typed tag, adding tag" = ""
|
|
24
|
+
pendingNames : [string] @intrinsic @description "The chip names remaining after a remove, held across the resolve fetch." @synonyms "remaining tags, kept names"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
trait TagStrip -> @rebindable StripTag [interaction, collection] {
|
|
28
|
+
initial: idle
|
|
29
|
+
|
|
30
|
+
state idle {
|
|
31
|
+
INIT -> idle
|
|
32
|
+
(fetch StripTag {
|
|
33
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
34
|
+
})
|
|
35
|
+
;; Pre-scope paint: the store is warm but no record is open yet.
|
|
36
|
+
TagStripOptions -> idle
|
|
37
|
+
TagStripLoadFailed -> idle
|
|
38
|
+
SHOW_TAG_STRIP -> loading
|
|
39
|
+
(set @entity.docId ?id)
|
|
40
|
+
(set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
|
|
41
|
+
(fetch StripTag {
|
|
42
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
state loading {
|
|
47
|
+
SHOW_TAG_STRIP -> loading
|
|
48
|
+
(set @entity.docId ?id)
|
|
49
|
+
(set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
|
|
50
|
+
(fetch StripTag {
|
|
51
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
52
|
+
})
|
|
53
|
+
TagStripOptions -> ready
|
|
54
|
+
(render-ui main {
|
|
55
|
+
children: [(if (or @config.readOnly ["=", @config.title, ""]) null {
|
|
56
|
+
color: muted
|
|
57
|
+
content: @config.title
|
|
58
|
+
type: typography
|
|
59
|
+
variant: caption
|
|
60
|
+
}), (if @config.readOnly null {
|
|
61
|
+
addEvent: ADD_TAG
|
|
62
|
+
helperText: @config.helperText
|
|
63
|
+
placeholder: @config.placeholder
|
|
64
|
+
removeEvent: REMOVE_TAG
|
|
65
|
+
type: tag-input
|
|
66
|
+
value: (array/map (array/filter ?data (fn t (array/includes @entity.docTagIds (object/get @t id)))) (fn t (object/get @t name)))
|
|
67
|
+
variant: secondary
|
|
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
|
+
children: (array/map (array/filter ?data (fn t (if (array/includes @entity.docTagIds (object/get @t id)) false true))) (fn t {
|
|
70
|
+
action: ADD_TAG
|
|
71
|
+
actionPayload: { tag: @t.name }
|
|
72
|
+
icon: tag
|
|
73
|
+
label: @t.name
|
|
74
|
+
size: sm
|
|
75
|
+
type: button
|
|
76
|
+
variant: ghost
|
|
77
|
+
}))
|
|
78
|
+
className: flex-wrap
|
|
79
|
+
direction: horizontal
|
|
80
|
+
gap: xs
|
|
81
|
+
type: stack
|
|
82
|
+
})]
|
|
83
|
+
direction: vertical
|
|
84
|
+
gap: xs
|
|
85
|
+
type: stack
|
|
86
|
+
})
|
|
87
|
+
TagStripLoadFailed -> idle
|
|
88
|
+
(render-ui main {
|
|
89
|
+
message: ?error
|
|
90
|
+
type: alert
|
|
91
|
+
variant: error
|
|
92
|
+
})
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
state ready {
|
|
96
|
+
SHOW_TAG_STRIP -> loading
|
|
97
|
+
(set @entity.docId ?id)
|
|
98
|
+
(set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
|
|
99
|
+
(fetch StripTag {
|
|
100
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
101
|
+
})
|
|
102
|
+
ADD_TAG -> adding
|
|
103
|
+
(set @entity.pendingTagName ?tag)
|
|
104
|
+
(fetch StripTag {
|
|
105
|
+
emit: { failure: TagStripLoadFailed, success: TagStripAddOptions }
|
|
106
|
+
})
|
|
107
|
+
(render-ui main {
|
|
108
|
+
align: center
|
|
109
|
+
children: [{ size: sm, type: spinner }]
|
|
110
|
+
direction: horizontal
|
|
111
|
+
gap: xs
|
|
112
|
+
type: stack
|
|
113
|
+
})
|
|
114
|
+
REMOVE_TAG -> removing
|
|
115
|
+
(set @entity.pendingNames ?value)
|
|
116
|
+
(fetch StripTag {
|
|
117
|
+
emit: { failure: TagStripLoadFailed, success: TagStripRemoveOptions }
|
|
118
|
+
})
|
|
119
|
+
(render-ui main {
|
|
120
|
+
align: center
|
|
121
|
+
children: [{ size: sm, type: spinner }]
|
|
122
|
+
direction: horizontal
|
|
123
|
+
gap: xs
|
|
124
|
+
type: stack
|
|
125
|
+
})
|
|
126
|
+
TagStripTagCreated -> ready
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
state adding {
|
|
130
|
+
SHOW_TAG_STRIP -> loading
|
|
131
|
+
(set @entity.docId ?id)
|
|
132
|
+
(set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
|
|
133
|
+
(fetch StripTag {
|
|
134
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
135
|
+
})
|
|
136
|
+
;; The typed name matches an existing tag — attach its id.
|
|
137
|
+
TagStripAddOptions -> ready when (array/includes (array/map ?data (fn t (object/get @t name))) @entity.pendingTagName)
|
|
138
|
+
(emit TAGS_CHANGED {
|
|
139
|
+
id: @entity.docId
|
|
140
|
+
tagIds: (array/append @entity.docTagIds (object/get (array/first (array/filter ?data (fn t ["=", (object/get @t name), @entity.pendingTagName]))) id))
|
|
141
|
+
})
|
|
142
|
+
;; Unknown name — create it in the shared taxonomy, then attach.
|
|
143
|
+
TagStripAddOptions -> creating
|
|
144
|
+
(persist create StripTag { name: @entity.pendingTagName } {
|
|
145
|
+
emit: { failure: TagStripLoadFailed, success: TagStripTagCreated }
|
|
146
|
+
})
|
|
147
|
+
TagStripLoadFailed -> idle
|
|
148
|
+
(render-ui main {
|
|
149
|
+
message: ?error
|
|
150
|
+
type: alert
|
|
151
|
+
variant: error
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
state creating {
|
|
156
|
+
SHOW_TAG_STRIP -> loading
|
|
157
|
+
(set @entity.docId ?id)
|
|
158
|
+
(set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
|
|
159
|
+
(fetch StripTag {
|
|
160
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
161
|
+
})
|
|
162
|
+
TagStripTagCreated -> ready when ["!=", (str/default ?id ""), ""]
|
|
163
|
+
(emit TAGS_CHANGED {
|
|
164
|
+
id: @entity.docId
|
|
165
|
+
tagIds: (array/append @entity.docTagIds ?id)
|
|
166
|
+
})
|
|
167
|
+
TagStripLoadFailed -> idle
|
|
168
|
+
(render-ui main {
|
|
169
|
+
message: ?error
|
|
170
|
+
type: alert
|
|
171
|
+
variant: error
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
state removing {
|
|
176
|
+
SHOW_TAG_STRIP -> loading
|
|
177
|
+
(set @entity.docId ?id)
|
|
178
|
+
(set @entity.docTagIds (array/map ?tagIds (fn t (str/default (object/get @t id) @t))))
|
|
179
|
+
(fetch StripTag {
|
|
180
|
+
emit: { failure: TagStripLoadFailed, success: TagStripOptions }
|
|
181
|
+
})
|
|
182
|
+
;; The remaining chip names map back to ids — every kept name exists
|
|
183
|
+
;; by construction (chips only render attached, existing tags).
|
|
184
|
+
TagStripRemoveOptions -> ready
|
|
185
|
+
(emit TAGS_CHANGED {
|
|
186
|
+
id: @entity.docId
|
|
187
|
+
tagIds: (array/map (array/filter ?data (fn t (array/includes @entity.pendingNames (object/get @t name)))) (fn t (object/get @t id)))
|
|
188
|
+
})
|
|
189
|
+
TagStripLoadFailed -> idle
|
|
190
|
+
(render-ui main {
|
|
191
|
+
message: ?error
|
|
192
|
+
type: alert
|
|
193
|
+
variant: error
|
|
194
|
+
})
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
emits {
|
|
198
|
+
TAGS_CHANGED -> external {
|
|
199
|
+
id : string
|
|
200
|
+
tagIds : [string]
|
|
201
|
+
}
|
|
202
|
+
@description "The record's tag set changed (chip added or removed); the host routes this into its persistor's update so the write and the refetch stay the organism's."
|
|
203
|
+
@synonyms "tags updated, tag set changed, retagged"
|
|
204
|
+
@tier "domain"
|
|
205
|
+
ADD_TAG {
|
|
206
|
+
tag : string!
|
|
207
|
+
}
|
|
208
|
+
@description "A tag name was typed into the strip or an existing tag's suggestion chip was clicked."
|
|
209
|
+
@synonyms "attach tag, add label"
|
|
210
|
+
@tier "presentation"
|
|
211
|
+
REMOVE_TAG {
|
|
212
|
+
tag : string
|
|
213
|
+
value : [string]
|
|
214
|
+
}
|
|
215
|
+
@description "A chip's remove affordance was clicked; value carries the names that remain."
|
|
216
|
+
@synonyms "detach tag, remove label"
|
|
217
|
+
@tier "presentation"
|
|
218
|
+
TagStripOptions {
|
|
219
|
+
data : [StripTag]
|
|
220
|
+
}
|
|
221
|
+
@description "The shared tag store loaded for the display pass."
|
|
222
|
+
@tier "internal"
|
|
223
|
+
TagStripAddOptions {
|
|
224
|
+
data : [StripTag]
|
|
225
|
+
}
|
|
226
|
+
@description "The shared tag store loaded to resolve a typed name on add."
|
|
227
|
+
@tier "internal"
|
|
228
|
+
TagStripRemoveOptions {
|
|
229
|
+
data : [StripTag]
|
|
230
|
+
}
|
|
231
|
+
@description "The shared tag store loaded to resolve the remaining names on remove."
|
|
232
|
+
@tier "internal"
|
|
233
|
+
TagStripTagCreated {
|
|
234
|
+
id : string
|
|
235
|
+
row : StripTag
|
|
236
|
+
}
|
|
237
|
+
@description "A typed name had no existing tag; a fresh row was created in the shared taxonomy."
|
|
238
|
+
@tier "internal"
|
|
239
|
+
TagStripLoadFailed {
|
|
240
|
+
error : string
|
|
241
|
+
code : string
|
|
242
|
+
}
|
|
243
|
+
@description "The tag store fetch or create failed."
|
|
244
|
+
@tier "internal"
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
listens {
|
|
248
|
+
SHOW_TAG_STRIP {
|
|
249
|
+
id : string!
|
|
250
|
+
tagIds : [string]
|
|
251
|
+
}
|
|
252
|
+
@description "Scope the strip to the open record — routed from the document's load events; carries the record's id and current tag ids (hydrated tag rows are normalized to their ids at stash time, so include-hydrated fetches route straight through)."
|
|
253
|
+
@synonyms "load tags, scope tag strip, show tags"
|
|
254
|
+
@tier "domain"
|
|
255
|
+
ADD_TAG {
|
|
256
|
+
tag : string!
|
|
257
|
+
}
|
|
258
|
+
@description "Attach a tag by name — typed into the input or clicked from the existing-tag chips."
|
|
259
|
+
@synonyms "attach tag, add label"
|
|
260
|
+
@tier "presentation"
|
|
261
|
+
REMOVE_TAG {
|
|
262
|
+
tag : string
|
|
263
|
+
value : [string]
|
|
264
|
+
}
|
|
265
|
+
@description "Detach a chip; value carries the names that remain."
|
|
266
|
+
@synonyms "detach tag, remove label"
|
|
267
|
+
@tier "presentation"
|
|
268
|
+
TagStripOptions {
|
|
269
|
+
data : [StripTag]
|
|
270
|
+
}
|
|
271
|
+
@description "Display-pass fetch resolved."
|
|
272
|
+
@tier "internal"
|
|
273
|
+
TagStripAddOptions {
|
|
274
|
+
data : [StripTag]
|
|
275
|
+
}
|
|
276
|
+
@description "Add-resolve fetch resolved."
|
|
277
|
+
@tier "internal"
|
|
278
|
+
TagStripRemoveOptions {
|
|
279
|
+
data : [StripTag]
|
|
280
|
+
}
|
|
281
|
+
@description "Remove-resolve fetch resolved."
|
|
282
|
+
@tier "internal"
|
|
283
|
+
TagStripTagCreated {
|
|
284
|
+
id : string
|
|
285
|
+
row : StripTag
|
|
286
|
+
}
|
|
287
|
+
@description "The taxonomy row for a typed name persisted; attach its id."
|
|
288
|
+
@tier "internal"
|
|
289
|
+
TagStripLoadFailed {
|
|
290
|
+
error : string
|
|
291
|
+
code : string
|
|
292
|
+
}
|
|
293
|
+
@description "The tag store fetch or create failed."
|
|
294
|
+
@tier "internal"
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
config {
|
|
298
|
+
title : string = Tags
|
|
299
|
+
@label "Strip caption"
|
|
300
|
+
@description "Small caption above the chips; empty hides it"
|
|
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"
|
|
307
|
+
placeholder : string = "Add a tag…"
|
|
308
|
+
@label "Input placeholder"
|
|
309
|
+
@description "Placeholder in the type-to-add input"
|
|
310
|
+
@tier "presentation"
|
|
311
|
+
helperText : string = ""
|
|
312
|
+
@label "Helper text"
|
|
313
|
+
@description "Optional helper line under the input"
|
|
314
|
+
@tier "presentation"
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
page "/tagstrip/demo" as TagStripDemoPage -> TagStrip
|
|
319
|
+
}
|