@cueplusplus/ui 0.3.0 → 0.5.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/CHANGELOG.md +2229 -0
- package/dist/agent-runtime/_glyphs.js +43 -0
- package/dist/agent-runtime/branch-picker.d.ts +45 -0
- package/dist/agent-runtime/branch-picker.js +87 -0
- package/dist/agent-runtime/index.d.ts +4 -0
- package/dist/agent-runtime/index.js +4 -0
- package/dist/agent-runtime/tool-call-card.d.ts +69 -0
- package/dist/agent-runtime/tool-call-card.js +187 -0
- package/dist/agent-runtime/use-agent-thread.d.ts +164 -0
- package/dist/agent-runtime/use-agent-thread.js +251 -0
- package/dist/chat/index.d.ts +2 -2
- package/dist/chat/message-list.d.ts +6 -0
- package/dist/chat/message-list.js +35 -0
- package/dist/chrome/app-shell.d.ts +52 -2
- package/dist/chrome/app-shell.js +80 -8
- package/dist/chrome/index.d.ts +2 -2
- package/dist/configurator/_export.js +3 -2
- package/dist/configurator/_overrides.d.ts +1 -1
- package/dist/configurator/token-editor.js +4 -1
- package/dist/date/_segments.js +37 -2
- package/dist/elements/activity-graph.d.ts +40 -0
- package/dist/elements/activity-graph.js +81 -0
- package/dist/elements/agent-card.d.ts +49 -0
- package/dist/elements/agent-card.js +91 -0
- package/dist/elements/agent-handoff.d.ts +24 -0
- package/dist/elements/agent-handoff.js +53 -0
- package/dist/elements/agent-mode-badge.d.ts +72 -0
- package/dist/elements/agent-mode-badge.js +110 -0
- package/dist/elements/agent-plan.d.ts +24 -0
- package/dist/elements/agent-plan.js +74 -0
- package/dist/elements/agent-status.d.ts +29 -0
- package/dist/elements/agent-status.js +46 -0
- package/dist/elements/agent-surface.d.ts +65 -0
- package/dist/elements/agent-surface.js +68 -0
- package/dist/elements/animated-number.d.ts +86 -0
- package/dist/elements/animated-number.js +118 -0
- package/dist/elements/approval-card.d.ts +40 -0
- package/dist/elements/approval-card.js +78 -0
- package/dist/elements/artifact-card.d.ts +30 -0
- package/dist/elements/artifact-card.js +58 -0
- package/dist/elements/background-inbox.d.ts +39 -0
- package/dist/elements/background-inbox.js +60 -0
- package/dist/elements/canvas-split.d.ts +77 -0
- package/dist/elements/canvas-split.js +138 -0
- package/dist/elements/chart.d.ts +41 -0
- package/dist/elements/chart.js +117 -0
- package/dist/elements/chat-panel.d.ts +46 -0
- package/dist/elements/chat-panel.js +104 -0
- package/dist/elements/checkpoint-history.d.ts +31 -0
- package/dist/elements/checkpoint-history.js +65 -0
- package/dist/elements/clamp.d.ts +90 -0
- package/dist/elements/clamp.js +109 -0
- package/dist/elements/code-diff.d.ts +42 -0
- package/dist/elements/code-diff.js +69 -0
- package/dist/elements/code-runner.d.ts +38 -0
- package/dist/elements/code-runner.js +84 -0
- package/dist/elements/command-palette.d.ts +48 -0
- package/dist/elements/command-palette.js +129 -0
- package/dist/elements/compaction-row.d.ts +63 -0
- package/dist/elements/compaction-row.js +110 -0
- package/dist/elements/comparison-card.d.ts +47 -0
- package/dist/elements/comparison-card.js +69 -0
- package/dist/elements/composer.d.ts +274 -0
- package/dist/elements/composer.js +505 -0
- package/dist/elements/computer-use.d.ts +40 -0
- package/dist/elements/computer-use.js +92 -0
- package/dist/elements/confidence-marker.d.ts +39 -0
- package/dist/elements/confidence-marker.js +64 -0
- package/dist/elements/connection-state.d.ts +29 -0
- package/dist/elements/connection-state.js +66 -0
- package/dist/elements/context-breakdown.d.ts +30 -0
- package/dist/elements/context-breakdown.js +86 -0
- package/dist/elements/context-usage.d.ts +99 -0
- package/dist/elements/context-usage.js +225 -0
- package/dist/elements/conversation-search.d.ts +48 -0
- package/dist/elements/conversation-search.js +88 -0
- package/dist/elements/cost-meter.d.ts +33 -0
- package/dist/elements/cost-meter.js +75 -0
- package/dist/elements/data-table.d.ts +31 -0
- package/dist/elements/data-table.js +67 -0
- package/dist/elements/day-separator.d.ts +34 -0
- package/dist/elements/day-separator.js +50 -0
- package/dist/elements/diagram.d.ts +34 -0
- package/dist/elements/diagram.js +75 -0
- package/dist/elements/document-reference.d.ts +37 -0
- package/dist/elements/document-reference.js +66 -0
- package/dist/elements/draft-restore.d.ts +27 -0
- package/dist/elements/draft-restore.js +54 -0
- package/dist/elements/edit-message.d.ts +36 -0
- package/dist/elements/edit-message.js +77 -0
- package/dist/elements/elements.css +459 -0
- package/dist/elements/elicitation-form.d.ts +48 -0
- package/dist/elements/elicitation-form.js +106 -0
- package/dist/elements/empty-state.d.ts +52 -0
- package/dist/elements/empty-state.js +98 -0
- package/dist/elements/end-of-turn-summary.d.ts +60 -0
- package/dist/elements/end-of-turn-summary.js +75 -0
- package/dist/elements/error-state.d.ts +29 -0
- package/dist/elements/error-state.js +55 -0
- package/dist/elements/feedback-dialog.d.ts +36 -0
- package/dist/elements/feedback-dialog.js +81 -0
- package/dist/elements/file-tree.d.ts +45 -0
- package/dist/elements/file-tree.js +84 -0
- package/dist/elements/flow-graph.d.ts +45 -0
- package/dist/elements/flow-graph.js +78 -0
- package/dist/elements/generative/chart.js +200 -0
- package/dist/elements/generative/faults.js +111 -0
- package/dist/elements/generative/icons.d.ts +41 -0
- package/dist/elements/generative/icons.js +190 -0
- package/dist/elements/generative/intrinsics.js +483 -0
- package/dist/elements/generative/spec.d.ts +110 -0
- package/dist/elements/generative/spec.js +366 -0
- package/dist/elements/generative.css +1145 -0
- package/dist/elements/generative.d.ts +144 -0
- package/dist/elements/generative.js +126 -0
- package/dist/elements/guardrail-notice.d.ts +29 -0
- package/dist/elements/guardrail-notice.js +63 -0
- package/dist/elements/image-generation.d.ts +18 -0
- package/dist/elements/image-generation.js +64 -0
- package/dist/elements/index.d.ts +116 -0
- package/dist/elements/index.js +115 -0
- package/dist/elements/inline-citation.d.ts +43 -0
- package/dist/elements/inline-citation.js +93 -0
- package/dist/elements/job-progress.d.ts +49 -0
- package/dist/elements/job-progress.js +74 -0
- package/dist/elements/launcher-bubble.d.ts +34 -0
- package/dist/elements/launcher-bubble.js +72 -0
- package/dist/elements/live-region-announcer.d.ts +130 -0
- package/dist/elements/live-region-announcer.js +230 -0
- package/dist/elements/loading-state.d.ts +27 -0
- package/dist/elements/loading-state.js +36 -0
- package/dist/elements/map-answer.d.ts +38 -0
- package/dist/elements/map-answer.js +93 -0
- package/dist/elements/markdown.d.ts +131 -0
- package/dist/elements/markdown.js +528 -0
- package/dist/elements/math-block.d.ts +51 -0
- package/dist/elements/math-block.js +70 -0
- package/dist/elements/mcp-server-panel.d.ts +41 -0
- package/dist/elements/mcp-server-panel.js +115 -0
- package/dist/elements/memory-chips.d.ts +30 -0
- package/dist/elements/memory-chips.js +43 -0
- package/dist/elements/message-actions.d.ts +38 -0
- package/dist/elements/message-actions.js +71 -0
- package/dist/elements/message-attachment.d.ts +48 -0
- package/dist/elements/message-attachment.js +63 -0
- package/dist/elements/message-branches.d.ts +25 -0
- package/dist/elements/message-branches.js +65 -0
- package/dist/elements/message-pair.d.ts +33 -0
- package/dist/elements/message-pair.js +65 -0
- package/dist/elements/message-queue.d.ts +31 -0
- package/dist/elements/message-queue.js +80 -0
- package/dist/elements/message-timing.d.ts +33 -0
- package/dist/elements/message-timing.js +37 -0
- package/dist/elements/mobile-composer.d.ts +44 -0
- package/dist/elements/mobile-composer.js +88 -0
- package/dist/elements/model-picker.d.ts +38 -0
- package/dist/elements/model-picker.js +69 -0
- package/dist/elements/number-ticker.d.ts +18 -0
- package/dist/elements/number-ticker.js +47 -0
- package/dist/elements/onboarding.d.ts +30 -0
- package/dist/elements/onboarding.js +75 -0
- package/dist/elements/permission-grant.d.ts +35 -0
- package/dist/elements/permission-grant.js +86 -0
- package/dist/elements/permission-scopes.d.ts +215 -0
- package/dist/elements/permission-scopes.js +249 -0
- package/dist/elements/prompt-library.d.ts +43 -0
- package/dist/elements/prompt-library.js +117 -0
- package/dist/elements/queue-dock.d.ts +101 -0
- package/dist/elements/queue-dock.js +132 -0
- package/dist/elements/quota-banner.d.ts +26 -0
- package/dist/elements/quota-banner.js +66 -0
- package/dist/elements/quote-reply.d.ts +44 -0
- package/dist/elements/quote-reply.js +79 -0
- package/dist/elements/range.d.ts +29 -0
- package/dist/elements/range.js +45 -0
- package/dist/elements/read-aloud.d.ts +45 -0
- package/dist/elements/read-aloud.js +75 -0
- package/dist/elements/reasoning-effort.d.ts +36 -0
- package/dist/elements/reasoning-effort.js +67 -0
- package/dist/elements/reasoning-panel.d.ts +46 -0
- package/dist/elements/reasoning-panel.js +75 -0
- package/dist/elements/recommendation-card.d.ts +45 -0
- package/dist/elements/recommendation-card.js +83 -0
- package/dist/elements/regenerate-menu.d.ts +45 -0
- package/dist/elements/regenerate-menu.js +51 -0
- package/dist/elements/replay.d.ts +217 -0
- package/dist/elements/replay.js +498 -0
- package/dist/elements/research-report.d.ts +38 -0
- package/dist/elements/research-report.js +69 -0
- package/dist/elements/retrieval-chunks.d.ts +43 -0
- package/dist/elements/retrieval-chunks.js +81 -0
- package/dist/elements/revert-dock.d.ts +159 -0
- package/dist/elements/revert-dock.js +327 -0
- package/dist/elements/reviewable-diff.d.ts +45 -0
- package/dist/elements/reviewable-diff.js +110 -0
- package/dist/elements/risk-badge.d.ts +52 -0
- package/dist/elements/risk-badge.js +91 -0
- package/dist/elements/schedule-card.d.ts +42 -0
- package/dist/elements/schedule-card.js +90 -0
- package/dist/elements/score-breakdown.d.ts +47 -0
- package/dist/elements/score-breakdown.js +82 -0
- package/dist/elements/scroll-anchor.d.ts +32 -0
- package/dist/elements/scroll-anchor.js +121 -0
- package/dist/elements/settings-panel.d.ts +52 -0
- package/dist/elements/settings-panel.js +107 -0
- package/dist/elements/shared-conversation.d.ts +39 -0
- package/dist/elements/shared-conversation.js +68 -0
- package/dist/elements/sources.d.ts +33 -0
- package/dist/elements/sources.js +61 -0
- package/dist/elements/speaker-identity.d.ts +32 -0
- package/dist/elements/speaker-identity.js +51 -0
- package/dist/elements/spec-sheet.d.ts +31 -0
- package/dist/elements/spec-sheet.js +45 -0
- package/dist/elements/stopped-run.d.ts +22 -0
- package/dist/elements/stopped-run.js +50 -0
- package/dist/elements/streaming-text.d.ts +31 -0
- package/dist/elements/streaming-text.js +45 -0
- package/dist/elements/subagent-list.d.ts +37 -0
- package/dist/elements/subagent-list.js +79 -0
- package/dist/elements/suggestions.d.ts +30 -0
- package/dist/elements/suggestions.js +36 -0
- package/dist/elements/surfaces.d.ts +85 -0
- package/dist/elements/surfaces.js +107 -0
- package/dist/elements/tail-status.d.ts +131 -0
- package/dist/elements/tail-status.js +94 -0
- package/dist/elements/terminal-block.d.ts +29 -0
- package/dist/elements/terminal-block.js +54 -0
- package/dist/elements/thinking-indicator.d.ts +18 -0
- package/dist/elements/thinking-indicator.js +36 -0
- package/dist/elements/thread-list.d.ts +35 -0
- package/dist/elements/thread-list.js +68 -0
- package/dist/elements/thread-search.d.ts +42 -0
- package/dist/elements/thread-search.js +99 -0
- package/dist/elements/timeline.d.ts +37 -0
- package/dist/elements/timeline.js +46 -0
- package/dist/elements/todo-list.d.ts +42 -0
- package/dist/elements/todo-list.js +59 -0
- package/dist/elements/tool-call.d.ts +41 -0
- package/dist/elements/tool-call.js +85 -0
- package/dist/elements/tool-error.d.ts +39 -0
- package/dist/elements/tool-error.js +76 -0
- package/dist/elements/tool-group.d.ts +45 -0
- package/dist/elements/tool-group.js +71 -0
- package/dist/elements/tool-timeline.d.ts +65 -0
- package/dist/elements/tool-timeline.js +88 -0
- package/dist/elements/trace-waterfall.d.ts +37 -0
- package/dist/elements/trace-waterfall.js +69 -0
- package/dist/elements/transcript-rules.d.ts +67 -0
- package/dist/elements/transcript-rules.js +95 -0
- package/dist/elements/turn-footer.d.ts +74 -0
- package/dist/elements/turn-footer.js +101 -0
- package/dist/elements/typing-indicator.d.ts +16 -0
- package/dist/elements/typing-indicator.js +51 -0
- package/dist/elements/verdict-row.d.ts +89 -0
- package/dist/elements/verdict-row.js +150 -0
- package/dist/elements/vocabulary.d.ts +612 -0
- package/dist/elements/vocabulary.js +611 -0
- package/dist/elements/voice-conversation.d.ts +49 -0
- package/dist/elements/voice-conversation.js +123 -0
- package/dist/elements/web-preview.d.ts +32 -0
- package/dist/elements/web-preview.js +66 -0
- package/dist/elements/web-search.d.ts +37 -0
- package/dist/elements/web-search.js +66 -0
- package/dist/elements/work-collapse.d.ts +103 -0
- package/dist/elements/work-collapse.js +131 -0
- package/dist/icons/containers.d.ts +89 -0
- package/dist/icons/containers.js +295 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +2 -1
- package/dist/instruments/two-step-button.js +25 -6
- package/dist/layout/sidebar.d.ts +19 -1
- package/dist/layout/sidebar.js +19 -1
- package/dist/primitives/button.js +11 -1
- package/dist/primitives/chip.d.ts +35 -9
- package/dist/primitives/chip.js +97 -11
- package/dist/system/agent-skin.d.ts +27 -0
- package/dist/system/agent-skin.js +20 -0
- package/dist/system/portal.d.ts +5 -3
- package/dist/system/portal.js +19 -5
- package/dist/system/theme-provider.js +54 -9
- package/dist/system/use-density.d.ts +9 -0
- package/dist/system/use-density.js +9 -0
- package/dist/system/use-isomorphic-layout-effect.js +19 -1
- package/dist/theming/_presets.d.ts +1 -1
- package/dist/theming/_presets.js +71 -8
- package/dist/theming/contrast.d.ts +16 -4
- package/dist/theming/contrast.js +33 -6
- package/dist/theming/create-theme.d.ts +6 -2
- package/dist/theming/create-theme.js +32 -5
- package/dist/theming/serialize.d.ts +10 -1
- package/dist/theming/serialize.js +62 -8
- package/manifest/components/activity-graph.json +88 -0
- package/manifest/components/agent-card.json +120 -0
- package/manifest/components/agent-handoff.json +87 -0
- package/manifest/components/agent-mode-badge.json +84 -0
- package/manifest/components/agent-plan.json +67 -0
- package/manifest/components/agent-status.json +73 -0
- package/manifest/components/agent-surface.json +78 -0
- package/manifest/components/alert-dialog.json +1 -1
- package/manifest/components/animated-number.json +67 -0
- package/manifest/components/app-shell.json +99 -7
- package/manifest/components/approval-card.json +106 -0
- package/manifest/components/artifact-card.json +81 -0
- package/manifest/components/audience-icon.json +52 -0
- package/manifest/components/background-inbox.json +71 -0
- package/manifest/components/branch-picker.json +124 -0
- package/manifest/components/button.json +1 -0
- package/manifest/components/canvas-split-body.json +62 -0
- package/manifest/components/canvas-split-document.json +54 -0
- package/manifest/components/canvas-split-header.json +83 -0
- package/manifest/components/canvas-split-line.json +62 -0
- package/manifest/components/canvas-split-message.json +62 -0
- package/manifest/components/canvas-split-thread.json +54 -0
- package/manifest/components/canvas-split.json +60 -0
- package/manifest/components/catalogue-icon.json +52 -0
- package/manifest/components/channel-beta-icon.json +52 -0
- package/manifest/components/channel-released-icon.json +52 -0
- package/manifest/components/chart.json +93 -0
- package/manifest/components/chat-empty-state.json +55 -0
- package/manifest/components/chat-panel-assistant-message.json +51 -0
- package/manifest/components/chat-panel-composer.json +66 -0
- package/manifest/components/chat-panel-messages.json +51 -0
- package/manifest/components/chat-panel-typing.json +51 -0
- package/manifest/components/chat-panel-user-message.json +51 -0
- package/manifest/components/chat-panel.json +57 -0
- package/manifest/components/checkpoint-history.json +80 -0
- package/manifest/components/chip.json +24 -12
- package/manifest/components/clamp.json +102 -0
- package/manifest/components/cli-tool-icon.json +52 -0
- package/manifest/components/code-diff.json +87 -0
- package/manifest/components/code-runner.json +97 -0
- package/manifest/components/compaction-row.json +100 -0
- package/manifest/components/comparison-card.json +83 -0
- package/manifest/components/composer-actions.json +65 -0
- package/manifest/components/composer-attach-button.json +65 -0
- package/manifest/components/composer-attachment-chip.json +75 -0
- package/manifest/components/composer-attachments.json +60 -0
- package/manifest/components/composer-bar.json +73 -0
- package/manifest/components/composer-command-item.json +79 -0
- package/manifest/components/composer-context.json +67 -0
- package/manifest/components/composer-input.json +73 -0
- package/manifest/components/composer-menu-item.json +72 -0
- package/manifest/components/composer-menu.json +79 -0
- package/manifest/components/composer-model-item.json +75 -0
- package/manifest/components/composer-model-trigger.json +75 -0
- package/manifest/components/composer-person-item.json +79 -0
- package/manifest/components/composer-send.json +80 -0
- package/manifest/components/composer-toolbar.json +65 -0
- package/manifest/components/composer-voice-button.json +68 -0
- package/manifest/components/composer-voice.json +75 -0
- package/manifest/components/computer-use.json +84 -0
- package/manifest/components/confidence-marker.json +74 -0
- package/manifest/components/connection-state.json +84 -0
- package/manifest/components/context-breakdown.json +65 -0
- package/manifest/components/context-usage.json +85 -0
- package/manifest/components/conversation-search.json +92 -0
- package/manifest/components/cost-meter.json +74 -0
- package/manifest/components/cue-portal-frame.json +1 -1
- package/manifest/components/day-separator.json +58 -0
- package/manifest/components/delegation-card.json +1 -1
- package/manifest/components/density.json +1 -1
- package/manifest/components/diagram.json +100 -0
- package/manifest/components/document-reference.json +90 -0
- package/manifest/components/draft-restore.json +82 -0
- package/manifest/components/drawer.json +1 -1
- package/manifest/components/dropdown-menu.json +1 -1
- package/manifest/components/edit-message.json +105 -0
- package/manifest/components/elements-command-palette.json +100 -0
- package/manifest/components/elements-composer.json +71 -0
- package/manifest/components/elements-data-table.json +68 -0
- package/manifest/components/elements-timeline.json +69 -0
- package/manifest/components/elicitation-form.json +103 -0
- package/manifest/components/empty-state-composer.json +64 -0
- package/manifest/components/empty-state-greeting.json +49 -0
- package/manifest/components/empty-state-suggestion.json +57 -0
- package/manifest/components/empty-state-suggestions.json +49 -0
- package/manifest/components/end-of-turn-summary.json +77 -0
- package/manifest/components/error-state.json +80 -0
- package/manifest/components/feedback-dialog.json +107 -0
- package/manifest/components/file-tree.json +83 -0
- package/manifest/components/flow-graph.json +75 -0
- package/manifest/components/folder-icon.json +52 -0
- package/manifest/components/frac.json +59 -0
- package/manifest/components/generation-loader.json +64 -0
- package/manifest/components/generative-ui.json +93 -0
- package/manifest/components/guardrail-notice.json +91 -0
- package/manifest/components/hover-card.json +1 -1
- package/manifest/components/image-generation.json +67 -0
- package/manifest/components/info-tip.json +1 -1
- package/manifest/components/inline-citation.json +77 -0
- package/manifest/components/job-progress.json +96 -0
- package/manifest/components/launcher-bubble.json +105 -0
- package/manifest/components/live-region-announcer.json +79 -0
- package/manifest/components/map-answer.json +83 -0
- package/manifest/components/markdown-text.json +94 -0
- package/manifest/components/math-block.json +74 -0
- package/manifest/components/mcp-server-icon.json +52 -0
- package/manifest/components/mcp-server-panel.json +87 -0
- package/manifest/components/memory-chips.json +65 -0
- package/manifest/components/message-actions.json +99 -0
- package/manifest/components/message-attachments.json +63 -0
- package/manifest/components/message-branches.json +71 -0
- package/manifest/components/message-list.json +1 -1
- package/manifest/components/message-pair.json +86 -0
- package/manifest/components/message-queue.json +74 -0
- package/manifest/components/message-timing.json +62 -0
- package/manifest/components/mobile-composer.json +126 -0
- package/manifest/components/model-picker.json +76 -0
- package/manifest/components/node-card.json +1 -1
- package/manifest/components/node-handle.json +1 -1
- package/manifest/components/number-ticker.json +61 -0
- package/manifest/components/onboarding.json +84 -0
- package/manifest/components/otp-field.json +7 -7
- package/manifest/components/permission-grant.json +92 -0
- package/manifest/components/permission-scopes.json +139 -0
- package/manifest/components/popover.json +1 -1
- package/manifest/components/prompt-library.json +99 -0
- package/manifest/components/queue-dock.json +110 -0
- package/manifest/components/quota-banner.json +94 -0
- package/manifest/components/quote-reply.json +105 -0
- package/manifest/components/read-aloud.json +111 -0
- package/manifest/components/reasoning-effort.json +81 -0
- package/manifest/components/reasoning-panel.json +108 -0
- package/manifest/components/recommendation-card.json +107 -0
- package/manifest/components/regenerate-menu.json +89 -0
- package/manifest/components/replay-player.json +102 -0
- package/manifest/components/research-report.json +76 -0
- package/manifest/components/retrieval-chunks.json +84 -0
- package/manifest/components/revert-dock.json +150 -0
- package/manifest/components/reviewable-diff.json +93 -0
- package/manifest/components/risk-badge.json +74 -0
- package/manifest/components/schedule-card.json +101 -0
- package/manifest/components/score-breakdown.json +91 -0
- package/manifest/components/scroll-anchor.json +72 -0
- package/manifest/components/scroll-area.json +7 -7
- package/manifest/components/search-input.json +7 -7
- package/manifest/components/segmented-control.json +21 -21
- package/manifest/components/settings-panel.json +118 -0
- package/manifest/components/shared-conversation.json +89 -0
- package/manifest/components/shimmer-label.json +59 -0
- package/manifest/components/skill-icon.json +52 -0
- package/manifest/components/sources.json +83 -0
- package/manifest/components/speaker-identity.json +61 -0
- package/manifest/components/spec-sheet.json +80 -0
- package/manifest/components/stack-icon.json +52 -0
- package/manifest/components/stacks-matrix-icon.json +52 -0
- package/manifest/components/stat.json +1 -1
- package/manifest/components/status-dot.json +1 -1
- package/manifest/components/stopped-run.json +81 -0
- package/manifest/components/streaming-text.json +71 -0
- package/manifest/components/sub.json +44 -0
- package/manifest/components/subagent-list.json +88 -0
- package/manifest/components/suggestions.json +84 -0
- package/manifest/components/sup.json +44 -0
- package/manifest/components/swap-label.json +71 -0
- package/manifest/components/tail-status.json +109 -0
- package/manifest/components/terminal-block.json +91 -0
- package/manifest/components/theme-provider.json +2 -2
- package/manifest/components/thinking-indicator.json +63 -0
- package/manifest/components/thread-list.json +76 -0
- package/manifest/components/thread-search.json +90 -0
- package/manifest/components/threshold-rail.json +2 -2
- package/manifest/components/time-boundary.json +62 -0
- package/manifest/components/timeline.json +1 -1
- package/manifest/components/todo-list.json +69 -0
- package/manifest/components/toggle-group.json +7 -7
- package/manifest/components/token-editor.json +1 -1
- package/manifest/components/tool-call-card.json +200 -0
- package/manifest/components/tool-call.json +119 -0
- package/manifest/components/tool-error.json +114 -0
- package/manifest/components/tool-group.json +83 -0
- package/manifest/components/tool-timeline.json +119 -0
- package/manifest/components/toolbar.json +7 -7
- package/manifest/components/tooltip.json +1 -1
- package/manifest/components/trace-waterfall.json +74 -0
- package/manifest/components/turn-footer.json +105 -0
- package/manifest/components/typing-indicator.json +53 -0
- package/manifest/components/unread-divider.json +55 -0
- package/manifest/components/usage-chart.json +1 -1
- package/manifest/components/verdict-row.json +91 -0
- package/manifest/components/voice-conversation.json +109 -0
- package/manifest/components/web-preview.json +87 -0
- package/manifest/components/web-search.json +92 -0
- package/manifest/components/work-collapse.json +102 -0
- package/manifest/manifest.json +2670 -33
- package/manifest/tokens.json +22 -1
- package/package.json +46 -4
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
"importPath": "@cueplusplus/ui",
|
|
6
6
|
"peerDependencies": [],
|
|
7
7
|
"clientOnly": true,
|
|
8
|
-
"description": "The console frame: title bar, navigation, work area, status bar — one\nviewport tall, with exactly one thing scrolling.\n\nEvery console screen in this system is the same five parts in the same\narrangement, and the value here is not the parts (they already exist as\n`TitleBar`, `Sidebar`, `Toolbar` and `StatusBar`) but the arithmetic between\nthem: `h-dvh` on the frame rather than `min-h-dvh`, an unbroken `min-h-0`\nchain from the frame down to the scroller, `min-w-0` on the content column,\nand a scroller that is not the document. Get one of those wrong and the\nstatus bar leaves the screen or the navigation column gets shoved off the\nside; the shell exists so no page has to get them right again.\n\nThe bars are ordinary children — `TitleBar` and `StatusBar` are already\n`shrink-0` and need no wrapper — so a shell reads as the page's outline.\n\nThis is also the only component in the library with a viewport breakpoint:\nbelow `md` the navigation column becomes a drawer and a trigger appears in\nthe bar. See {@link AppShellSidebar} for the ruling.",
|
|
8
|
+
"description": "The console frame: title bar, navigation, work area, status bar — one\nviewport tall, with exactly one thing scrolling.\n\nEvery console screen in this system is the same five parts in the same\narrangement, and the value here is not the parts (they already exist as\n`TitleBar`, `Sidebar`, `Toolbar` and `StatusBar`) but the arithmetic between\nthem: `h-dvh` on the frame rather than `min-h-dvh`, an unbroken `min-h-0`\nchain from the frame down to the scroller, `min-w-0` on the content column,\nand a scroller that is not the document. Get one of those wrong and the\nstatus bar leaves the screen or the navigation column gets shoved off the\nside; the shell exists so no page has to get them right again.\n\nThe bars are ordinary children — `TitleBar` and `StatusBar` are already\n`shrink-0` and need no wrapper — so a shell reads as the page's outline. The\none bar the shell does own is {@link AppShellBar}, and it owns it for one\nreason: it is divided by the navigation column, which means it has to be\nmeasured from the same length the column is.\n\nThat length is `--cue-nav-width`, written on the frame. `rail` rewrites it,\n`data-rail` announces it, and the column and the header cell over it move\ntogether because neither holds a width of its own. Persistence and the\ntoggle are the caller's — see {@link AppShellRootProps.rail}.\n\nThis is also the only component in the library with a viewport breakpoint:\nbelow `md` the navigation column becomes a drawer and a trigger appears in\nthe bar. See {@link AppShellSidebar} for the ruling.",
|
|
9
9
|
"props": [],
|
|
10
10
|
"typeReferences": [],
|
|
11
11
|
"subcomponents": [
|
|
12
12
|
"Root",
|
|
13
|
+
"Bar",
|
|
13
14
|
"Body",
|
|
14
15
|
"Sidebar",
|
|
15
16
|
"NavTrigger",
|
|
@@ -21,7 +22,7 @@
|
|
|
21
22
|
{
|
|
22
23
|
"name": "Root",
|
|
23
24
|
"usage": "AppShell.Root",
|
|
24
|
-
"description": "The frame: one viewport tall, a column, and the only element on the page that\nknows how tall the window is.\n\n`h-dvh`, not `min-h-dvh`. A console is a fixed frame with a scrolling middle;\na shell that grows past the viewport puts the status bar below the fold, where\na status bar is worthless. Everything under here is either `shrink-0` (the\nbars) or `min-h-0 flex-1` (the middle), which is what keeps the document\nitself from ever scrolling.\n\n`relative overflow-clip` is the other half of that promise, and it took a\nbrowser to find. The flex arithmetic only governs boxes *in the flow*: an\nabsolutely positioned descendant is laid out against its containing block,\nand a frame that is neither positioned nor clipping is not one — so the\ninitial containing block is, and the descendant's scrollable overflow lands\non `<html>`. `.sr-only` is the everyday case (it is `position: absolute`, and\nmost emitters give it no positioned ancestor), which is how a page carrying\na few thousand visually-hidden labels made the document 46,760px tall inside\na frame exactly one viewport high, with every visible box still on screen:\na browser scrollbar that scrolled nothing.\n\n`relative` makes the frame that containing block; the clip is then the\nguarantee, whatever any descendant leaks. `overflow-clip` rather than\n`overflow-hidden` on purpose — `hidden` makes the frame a *scroll container*,\nso a focus ring or a `scrollIntoView()` on something just outside it can\nscroll the whole console sideways with no scrollbar to put it back. `clip`\ncannot be scrolled at all, which is what a frame wants.",
|
|
25
|
+
"description": "The frame: one viewport tall, a column, and the only element on the page that\nknows how tall the window is.\n\n`h-dvh`, not `min-h-dvh`. A console is a fixed frame with a scrolling middle;\na shell that grows past the viewport puts the status bar below the fold, where\na status bar is worthless. Everything under here is either `shrink-0` (the\nbars) or `min-h-0 flex-1` (the middle), which is what keeps the document\nitself from ever scrolling.\n\n`relative overflow-clip` is the other half of that promise, and it took a\nbrowser to find. The flex arithmetic only governs boxes *in the flow*: an\nabsolutely positioned descendant is laid out against its containing block,\nand a frame that is neither positioned nor clipping is not one — so the\ninitial containing block is, and the descendant's scrollable overflow lands\non `<html>`. `.sr-only` is the everyday case (it is `position: absolute`, and\nmost emitters give it no positioned ancestor), which is how a page carrying\na few thousand visually-hidden labels made the document 46,760px tall inside\na frame exactly one viewport high, with every visible box still on screen:\na browser scrollbar that scrolled nothing.\n\n`relative` makes the frame that containing block; the clip is then the\nguarantee, whatever any descendant leaks. `overflow-clip` rather than\n`overflow-hidden` on purpose — `hidden` makes the frame a *scroll container*,\nso a focus ring or a `scrollIntoView()` on something just outside it can\nscroll the whole console sideways with no scrollbar to put it back. `clip`\ncannot be scrolled at all, which is what a frame wants.\n\nIt is also where the navigation column's width is decided. `--cue-nav-width`\nis written here and read by both the column and the header cell over it, so\nrailing the console rewrites one length and the two boxes move together;\n`data-rail` and the `group/app-shell` beside it are how anything else in the\nframe answers to the same state — `group-data-[rail]/app-shell:hidden` on a\nwordmark, say, the way `Sidebar` already publishes `data-collapsed`.",
|
|
25
26
|
"props": [
|
|
26
27
|
{
|
|
27
28
|
"name": "navOpen",
|
|
@@ -43,6 +44,65 @@
|
|
|
43
44
|
"required": false,
|
|
44
45
|
"defaultValue": null,
|
|
45
46
|
"description": "Called with the next open state whenever the drawer is opened or dismissed."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "rail",
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"required": false,
|
|
52
|
+
"defaultValue": null,
|
|
53
|
+
"description": "Whether the navigation column is collapsed to an icon rail, when\ncontrolled. Pass with `onRailChange`. Defaults to expanded.\n\nIt is the column's own collapse, owned one level up. Collapsing is a\nproperty of the column, but the header cell over it is a child of the bar\n— a different branch of the tree — and a length only one of them knows is\na length they will eventually disagree about. So the frame holds the\nstate, stamps `data-rail` on itself for anything that has to answer to it,\nand hands it down to `Sidebar.Root` as its controlled `collapsed`.\n\n**Persistence is the caller's.** A rail is set once and expected to be\nremembered, and where it is remembered — `localStorage`, a cookie the\nserver can read before first paint, a user record — is a decision about\nhydration and privacy that a layout component has no business making."
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "defaultRail",
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"required": false,
|
|
59
|
+
"defaultValue": "false",
|
|
60
|
+
"description": "Initial rail state when uncontrolled. Defaults to `false`."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "onRailChange",
|
|
64
|
+
"type": "((rail: boolean) => void)",
|
|
65
|
+
"required": false,
|
|
66
|
+
"defaultValue": null,
|
|
67
|
+
"description": "Called with the next rail state whenever the column is collapsed or expanded."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "navWidth",
|
|
71
|
+
"type": "string",
|
|
72
|
+
"required": false,
|
|
73
|
+
"defaultValue": "14rem",
|
|
74
|
+
"description": "Width of the navigation column while expanded. Any CSS length. Defaults to `\"14rem\"`."
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "railWidth",
|
|
78
|
+
"type": "string",
|
|
79
|
+
"required": false,
|
|
80
|
+
"defaultValue": "3.5rem",
|
|
81
|
+
"description": "Width of the navigation column while railed. Any CSS length. Defaults to\n`\"3.5rem\"` — a `--cue-icon-md` glyph centred in a `--cue-control-md` row,\nwith a gutter either side that still reads as a column rather than a strip."
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"typeReferences": [
|
|
85
|
+
"React.ComponentPropsWithoutRef<\"div\">"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "Bar",
|
|
90
|
+
"usage": "AppShell.Bar",
|
|
91
|
+
"description": "The bar across the top of the frame, divided by the navigation column: a\nheader cell exactly the column's width, and the rest of the bar beside it.\n\n`TitleBar` and `AppBar` span the whole frame and know nothing about the\ncolumn under them, which is right for a document and wrong for a console\nthat has an app mark over its navigation: two boxes that are meant to read\nas one column have to be measured from one length, or they drift the first\ntime the column changes width. This is the bar that is measured that way. It\nreads `--cue-nav-width` from {@link AppShellRoot}, so railing the console\nmoves the cell and the column together with nothing to keep in sync.\n\nBelow `md` the cell takes its content's width instead. That is the same\ndecision the column and the drawer trigger already make and not a third one:\nbelow the breakpoint the column is not in the layout, and a cell aligned to\na column that is not there is 14rem of a 390px bar walled off for nothing.\n\nA `<div>` rather than a `<header>`, like `TitleBar` beside it: a console\nframe that also carries an `AppBar` would otherwise have two `banner`\nlandmarks, and a page that wants one can say `role=\"banner\"` here.",
|
|
92
|
+
"props": [
|
|
93
|
+
{
|
|
94
|
+
"name": "brand",
|
|
95
|
+
"type": "ReactNode",
|
|
96
|
+
"required": false,
|
|
97
|
+
"defaultValue": null,
|
|
98
|
+
"description": "The header cell over the navigation column: the app mark, and whatever\ncontrol rails it.\n\nOmit it and the bar is one undivided strip — no empty bordered cell, which\nis worse than no cell."
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "brandClassName",
|
|
102
|
+
"type": "string",
|
|
103
|
+
"required": false,
|
|
104
|
+
"defaultValue": null,
|
|
105
|
+
"description": "Extra classes for the header cell."
|
|
46
106
|
}
|
|
47
107
|
],
|
|
48
108
|
"typeReferences": [
|
|
@@ -61,7 +121,7 @@
|
|
|
61
121
|
{
|
|
62
122
|
"name": "Sidebar",
|
|
63
123
|
"usage": "AppShell.Sidebar",
|
|
64
|
-
"description": "The navigation, in both of its shapes: a column on a wide viewport and a\ndrawer on a narrow one, from one set of children.\n\n**This part carries the only viewport breakpoint in `@cueplusplus/ui`, and it\nis deliberate.** The rest of the library is intrinsically responsive —\n`min()` clamps, `auto-fill` grids, overflow scrollers — and density is never\nviewport-driven. Navigation shape is the one decision that cannot be made\nthat way: `Sidebar.Root` is 14rem wide, a phone is 390px, and no amount of\nclamping turns a column into a drawer. So the switch is Tailwind's stock\n`md` (48rem), used **only** here
|
|
124
|
+
"description": "The navigation, in both of its shapes: a column on a wide viewport and a\ndrawer on a narrow one, from one set of children.\n\n**This part carries the only viewport breakpoint in `@cueplusplus/ui`, and it\nis deliberate.** The rest of the library is intrinsically responsive —\n`min()` clamps, `auto-fill` grids, overflow scrollers — and density is never\nviewport-driven. Navigation shape is the one decision that cannot be made\nthat way: `Sidebar.Root` is 14rem wide, a phone is 390px, and no amount of\nclamping turns a column into a drawer. So the switch is Tailwind's stock\n`md` (48rem), used **only** here, in {@link AppShellNavTrigger} and in\n{@link AppShellBar}'s header cell — one decision wearing three faces, since\nthe trigger exists exactly where the column does not and the cell aligns\nwith a column that below `md` is not in the layout at all. Anything beyond\nnav shape stays intrinsic; a later component that wants a breakpoint is a\nnew decision, not a precedent this one set.\n\nIt is a CSS-only dual render: both shapes are in the markup and one is hidden\nper viewport. No `useMediaQuery`, no hook, no JavaScript branch — so the\nfirst server-rendered frame is already correct and there is nothing to flash.\n\n`children` is rendered into both, so a console has one navigation definition\nand two presentations. Inside the drawer the items are not wrapped in a\n`Sidebar.Root`, which is what makes their labels stay visible there even when\nthe desktop column is collapsed to its rail — collapse is a property of the\ncolumn, not of the navigation, and the rail is drawn by the shell rather than\ntaken as a child for exactly that reason.\n\n**The column's collapse is the frame's rail.** This part hands\n{@link AppShellRoot}'s `rail` down to `Sidebar.Root` as its controlled\n`collapsed` and writes the rail back whenever the column's own hairline rail\nis pressed, so the two can never disagree and the header cell over the column\nmoves with it. Both widths come from the frame's `--cue-nav-width` for the\nsame reason. A `collapsed` or `defaultCollapsed` passed here instead is the\npre-rail spelling and still means exactly what it did: the column keeps its\nown state and its own two lengths, and the frame stays out of it.\n\n**Both halves announce as the same landmark**, from the one `landmark` prop:\nthe same navigation cannot be `navigation` on a phone and `complementary` on\na laptop, and until the prop existed it was, because the drawer was a `<nav>`\nand `Sidebar.Root` was an `<aside>`. `\"navigation\"` is the default, which is\nwhat a shell's primary column nearly always is.",
|
|
65
125
|
"props": [
|
|
66
126
|
{
|
|
67
127
|
"name": "drawerTitle",
|
|
@@ -141,7 +201,7 @@
|
|
|
141
201
|
{
|
|
142
202
|
"name": "NavTrigger",
|
|
143
203
|
"usage": "AppShell.NavTrigger",
|
|
144
|
-
"description": "The control that opens the navigation drawer. Put it in the shell's bar.\n\nPresent only below the same `md` breakpoint {@link AppShellSidebar} switches\non — above it the column is right there and a trigger would open a drawer\nduplicating navigation the reader can already see. That is the second
|
|
204
|
+
"description": "The control that opens the navigation drawer. Put it in the shell's bar.\n\nPresent only below the same `md` breakpoint {@link AppShellSidebar} switches\non — above it the column is right there and a trigger would open a drawer\nduplicating navigation the reader can already see. That is the second of the\nthree faces of the library's one viewport breakpoint, and all three are the\nsame navigation-shape decision — see {@link AppShellSidebar} for the ruling.\n\nIt is the one piece of window furniture in this library that defaults to\n`size=\"md\"` rather than `\"sm\"`, and the breakpoint above is the whole reason:\na control that only ever renders on a touch screen has to clear WCAG 2.5.8's\n24×24 floor, and `sm` is 20px.",
|
|
145
205
|
"props": [
|
|
146
206
|
{
|
|
147
207
|
"name": "label",
|
|
@@ -226,7 +286,12 @@
|
|
|
226
286
|
"tokensUsed": [
|
|
227
287
|
"--cue-bg",
|
|
228
288
|
"--cue-border",
|
|
289
|
+
"--cue-chrome-titlebar",
|
|
290
|
+
"--cue-control-md",
|
|
229
291
|
"--cue-fg",
|
|
292
|
+
"--cue-icon-md",
|
|
293
|
+
"--cue-nav-width",
|
|
294
|
+
"--cue-pad-row-x",
|
|
230
295
|
"--cue-space-3",
|
|
231
296
|
"--cue-space-4",
|
|
232
297
|
"--cue-space-5",
|
|
@@ -239,6 +304,31 @@
|
|
|
239
304
|
"code": "<AppShell.Root>\n <TitleBar center=\"main-stage.cue\" actions={<Chip tone=\"ok\">live</Chip>}>\n <AppShell.NavTrigger />\n <Eyebrow>CUE++</Eyebrow>\n </TitleBar>\n\n <AppShell.Body>\n <AppShell.Sidebar aria-label=\"Console\" drawerTitle=\"Console\">\n <Sidebar.Section label=\"Show\">\n <Sidebar.Item icon={List} active>Cues</Sidebar.Item>\n <Sidebar.Item icon={Lightbulb} badge={<Chip>48</Chip>}>Fixtures</Sidebar.Item>\n </Sidebar.Section>\n </AppShell.Sidebar>\n\n <AppShell.Content>\n <Toolbar.Root aria-label=\"Playback\">\n <Toolbar.Button icon={Play}>Go</Toolbar.Button>\n </Toolbar.Root>\n <AppShell.Scroller>\n <Panel>…</Panel>\n </AppShell.Scroller>\n </AppShell.Content>\n\n <AppShell.Aside aria-label=\"Inspector\">…</AppShell.Aside>\n </AppShell.Body>\n\n <StatusBar>\n <StatusBar.Item tone=\"ok\">Art-Net 10.0.0.42</StatusBar.Item>\n <StatusBar.Item push>Cue 4</StatusBar.Item>\n </StatusBar>\n</AppShell.Root>",
|
|
240
305
|
"language": "tsx"
|
|
241
306
|
},
|
|
307
|
+
{
|
|
308
|
+
"title": "The rail",
|
|
309
|
+
"code": "<AppShell.Root rail={rail} onRailChange={setRail}>",
|
|
310
|
+
"language": "tsx"
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
"title": "The rail",
|
|
314
|
+
"code": "<AppShell.Root rail={rail} onRailChange={setRail}>\n <AppShell.Bar brand={<><AppShell.NavTrigger /><CueMark /><RailToggle /></>}>\n <h1>Cue stack</h1>\n </AppShell.Bar>\n\n <AppShell.Body>\n <AppShell.Sidebar aria-label=\"Console\" drawerTitle=\"Console\">\n <Sidebar.Section label=\"Show\">\n <Sidebar.Item icon={List} active>Cues</Sidebar.Item>\n </Sidebar.Section>\n </AppShell.Sidebar>\n …\n </AppShell.Body>\n</AppShell.Root>",
|
|
315
|
+
"language": "tsx"
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
"title": "The toggle is yours",
|
|
319
|
+
"code": "function RailToggle() {\n return (\n <IconButton\n icon={PanelLeft}\n size=\"sm\"\n aria-label={rail ? \"Expand the sidebar\" : \"Collapse the sidebar\"}\n aria-pressed={rail}\n aria-controls={navId}\n onClick={() => setRail(!rail)}\n />\n );\n}",
|
|
320
|
+
"language": "tsx"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"title": "Persistence is yours too",
|
|
324
|
+
"code": "const [rail, setRail] = React.useState(() => readCookie(\"rail\") === \"1\");\n\n<AppShell.Root\n rail={rail}\n onRailChange={(next) => {\n setRail(next);\n writeCookie(\"rail\", next ? \"1\" : \"0\");\n }}\n>",
|
|
325
|
+
"language": "tsx"
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"title": "What answers to it",
|
|
329
|
+
"code": "<span className=\"group-data-[rail]/app-shell:hidden\">CUE++</span>",
|
|
330
|
+
"language": "tsx"
|
|
331
|
+
},
|
|
242
332
|
{
|
|
243
333
|
"title": "Where the footer goes",
|
|
244
334
|
"code": "<AppShell.Content>\n <AppShell.Scroller className=\"flex flex-col\">\n <div className=\"flex-1\">{children}</div>\n <Footer meta={…}>…</Footer>\n </AppShell.Scroller>\n</AppShell.Content>",
|
|
@@ -274,6 +364,8 @@
|
|
|
274
364
|
"Adding a second scroller. `AppShell.Scroller` is the only element that may scroll; giving `AppShell.Content` an `overflow-y-auto` too puts a scrollbar inside a scrollbar and detaches the toolbar from the work area.",
|
|
275
365
|
"Nesting a shell inside a page that already has a `<main>`. Pass `main={false}` on `AppShell.Content` — a document may have only one.",
|
|
276
366
|
"Reaching for a viewport variant of your own because the shell has one. The `md` switch is licensed for navigation shape and nothing else; everything else in this system is intrinsically responsive.",
|
|
367
|
+
"Hard-coding the navigation column's width somewhere else in the frame — a header cell, a toolbar offset, a sticky rule. Read `--cue-nav-width` instead, or the two drift the first time the column rails.",
|
|
368
|
+
"Railing a column of items with no icons. At 3.5rem the label goes `sr-only` and the icon is all that is left; without one the reader gets an empty strip. `AppShell.Sidebar` takes `collapsible={false}` for exactly that column.",
|
|
277
369
|
"Ending the page with a `Footer` after `AppShell.Body`. A footer belongs to the content column — the last child of `AppShell.Scroller` — or it stretches under the navigation and pretends to be part of the frame."
|
|
278
370
|
],
|
|
279
371
|
"specimens": [
|
|
@@ -283,9 +375,9 @@
|
|
|
283
375
|
"components": [
|
|
284
376
|
"AppShell"
|
|
285
377
|
],
|
|
286
|
-
"code": "<div className=\"w-full overflow-hidden rounded-(--radius-surface) border border-border\">\n {/* `h-[26rem]` overrides the shell's own `h-dvh`, and `main={false}`\n * keeps it from emitting a second `<main>` inside the page already\n * wrapping this corpus. Both are what embedding a whole-screen\n * component in a bench costs. */}\n <AppShell.Root className=\"h-[26rem]\">\n <
|
|
287
|
-
"note": "The console frame, and the arithmetic that holds it up: one viewport tall, an unbroken min-h-0 chain, and exactly one thing scrolling. Boxed to 26rem here — a bench has no viewport to give it.",
|
|
288
|
-
"interaction": "the 4px
|
|
378
|
+
"code": "<div className=\"w-full overflow-hidden rounded-(--radius-surface) border border-border\">\n {/* `h-[26rem]` overrides the shell's own `h-dvh`, and `main={false}`\n * keeps it from emitting a second `<main>` inside the page already\n * wrapping this corpus. Both are what embedding a whole-screen\n * component in a bench costs. */}\n <AppShell.Root className=\"h-[26rem]\" rail={rail} onRailChange={setRail}>\n {/* The toggle is rendered here rather than by the shell: where the\n * control lives is a decision about this bar, and persisting what\n * it sets is a decision about hydration. Both are the caller's. */}\n <AppShell.Bar\n brand={\n <>\n <AppShell.NavTrigger />\n <Eyebrow className=\"group-data-[rail]/app-shell:hidden\">CUE++</Eyebrow>\n <IconButton\n icon={PanelLeft}\n size=\"sm\"\n aria-label={rail ? \"Expand the sidebar\" : \"Collapse the sidebar\"}\n aria-pressed={rail}\n className=\"ms-auto\"\n onClick={() => setRail(!rail)}\n />\n </>\n }\n >\n <span className=\"font-mono text-(length:--cue-text-label) text-fg-muted\">\n main-stage.cue\n </span>\n <Chip tone=\"ok\" className=\"ms-auto\">\n live\n </Chip>\n </AppShell.Bar>\n\n <AppShell.Body>\n <AppShell.Sidebar aria-label=\"Console\" drawerTitle=\"Console\">\n <Sidebar.Section label=\"Show\">\n <Sidebar.Item icon={List} active>\n Cues\n </Sidebar.Item>\n <Sidebar.Item icon={Lightbulb} badge={<Chip>48</Chip>}>\n Fixtures\n </Sidebar.Item>\n </Sidebar.Section>\n </AppShell.Sidebar>\n\n <AppShell.Content main={false}>\n <Toolbar.Root aria-label=\"Cue list\">\n <Toolbar.Button icon={Plus}>Add cue</Toolbar.Button>\n <Toolbar.Separator />\n <Toolbar.Button icon={Monitor}>Live</Toolbar.Button>\n </Toolbar.Root>\n\n <AppShell.Scroller>\n <Panel>\n <PanelHeader title=\"Cue stack\" actions={<Chip tone=\"ok\">live</Chip>} />\n {CUES.map((cue) => (\n <Row key={cue.id}>\n <span className=\"w-[2rem] shrink-0 font-mono tabular-nums\">{cue.id}</span>\n <span className=\"flex-1 truncate\">{cue.label}</span>\n <span className=\"font-mono tabular-nums text-fg-muted\">{cue.time}</span>\n </Row>\n ))}\n </Panel>\n </AppShell.Scroller>\n </AppShell.Content>\n\n <AppShell.Aside aria-label=\"Inspector\" width=\"11rem\">\n <SectionHeader label=\"Selected\" />\n <p className=\"font-mono text-(length:--cue-text-ui) text-fg-muted\">\n Its own scroller, so reading it never moves the work area.\n </p>\n </AppShell.Aside>\n </AppShell.Body>\n\n <StatusBar>\n <StatusBar.Item tone=\"ok\">Art-Net</StatusBar.Item>\n <StatusBar.Item push>Cue 4</StatusBar.Item>\n </StatusBar>\n </AppShell.Root>\n</div>",
|
|
379
|
+
"note": "The console frame, and the arithmetic that holds it up: one viewport tall, an unbroken min-h-0 chain, and exactly one thing scrolling. AppShell.Bar divides the bar at the navigation column, so the mark over the column and the column itself are one box measured from one length. Boxed to 26rem here — a bench has no viewport to give it.",
|
|
380
|
+
"interaction": "the button beside the mark rails the column to 3.5rem of icons, and the header cell over it narrows with it — one --cue-nav-width, rewritten once. The 4px strip on the column's edge does the same. Below 48rem the column is not rendered at all and the trigger opens the same navigation as a drawer."
|
|
289
381
|
}
|
|
290
382
|
]
|
|
291
383
|
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ApprovalCard",
|
|
3
|
+
"slug": "approval-card",
|
|
4
|
+
"group": "elements",
|
|
5
|
+
"importPath": "@cueplusplus/ui/elements",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"lucide-react"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "Human in the loop: the agent asks before it runs anything with side effects.",
|
|
11
|
+
"props": [
|
|
12
|
+
{
|
|
13
|
+
"name": "state",
|
|
14
|
+
"type": "\"done\" | \"running\" | \"request\" | \"denied\"",
|
|
15
|
+
"required": true,
|
|
16
|
+
"defaultValue": null,
|
|
17
|
+
"description": "Lifecycle of the card: request with actions, running spinner, done check, or denied."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "command",
|
|
21
|
+
"type": "string",
|
|
22
|
+
"required": true,
|
|
23
|
+
"defaultValue": null,
|
|
24
|
+
"description": "Command shown in the mono field the agent wants to run."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "title",
|
|
28
|
+
"type": "string",
|
|
29
|
+
"required": true,
|
|
30
|
+
"defaultValue": null,
|
|
31
|
+
"description": "Headline naming the action that needs approval."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "subtitle",
|
|
35
|
+
"type": "string",
|
|
36
|
+
"required": true,
|
|
37
|
+
"defaultValue": null,
|
|
38
|
+
"description": "Supporting line under the title explaining the request."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "onAllowOnce",
|
|
42
|
+
"type": "(() => void)",
|
|
43
|
+
"required": false,
|
|
44
|
+
"defaultValue": null,
|
|
45
|
+
"description": "Called when the user clicks Allow once."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "onAlwaysAllow",
|
|
49
|
+
"type": "(() => void)",
|
|
50
|
+
"required": false,
|
|
51
|
+
"defaultValue": null,
|
|
52
|
+
"description": "Called when the user clicks Always allow."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "onDeny",
|
|
56
|
+
"type": "(() => void)",
|
|
57
|
+
"required": false,
|
|
58
|
+
"defaultValue": null,
|
|
59
|
+
"description": "Called when the user clicks Deny."
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"typeReferences": [
|
|
63
|
+
"Omit<\n ComponentProps<\"div\">,\n | \"children\"\n | \"state\"\n | \"command\"\n | \"title\"\n | \"subtitle\"\n | \"onAllowOnce\"\n | \"onAlwaysAllow\"\n | \"onDeny\"\n> & {\n /** Lifecycle of the card: request with actions, running spinner, done check, or denied. */\n state: ApprovalState;\n /** Command shown in the mono field the agent wants to run. */\n command: string;\n /** Headline naming the action that needs approval. */\n title: string;\n /** Supporting line under the title explaining the request. */\n subtitle: string;\n /** Called when the user clicks Allow once. */\n onAllowOnce?: () => void;\n /** Called when the user clicks Always allow. */\n onAlwaysAllow?: () => void;\n /** Called when the user clicks Deny. */\n onDeny?: () => void;\n}"
|
|
64
|
+
],
|
|
65
|
+
"subcomponents": [],
|
|
66
|
+
"parts": [],
|
|
67
|
+
"variants": {},
|
|
68
|
+
"defaultVariants": {},
|
|
69
|
+
"tokensUsed": [
|
|
70
|
+
"--cue-fg",
|
|
71
|
+
"--cue-fg-muted",
|
|
72
|
+
"--cue-font-mono",
|
|
73
|
+
"--cue-ok",
|
|
74
|
+
"--cue-radius-overlay",
|
|
75
|
+
"--cue-radius-surface",
|
|
76
|
+
"--cue-surface-1",
|
|
77
|
+
"--cue-surface-2",
|
|
78
|
+
"--cue-text-body",
|
|
79
|
+
"--cue-text-ui"
|
|
80
|
+
],
|
|
81
|
+
"summary": "Human in the loop: the agent asks before it runs anything with side effects.",
|
|
82
|
+
"examples": [
|
|
83
|
+
{
|
|
84
|
+
"title": "Usage",
|
|
85
|
+
"code": "import { ApprovalCard } from \"@cueplusplus/ui/elements\";\n\n<ApprovalCard\n state=\"request\"\n command=\"pnpm db:migrate\"\n title=\"Run migration\"\n subtitle=\"Needs your approval\"\n onAllowOnce={() => approve()}\n onDeny={() => deny()}\n/>",
|
|
86
|
+
"language": "tsx"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"status": "todo-docs",
|
|
90
|
+
"url": "/docs/components/approval-card",
|
|
91
|
+
"mdUrl": "/docs/components/approval-card.md",
|
|
92
|
+
"jsonUrl": "/r/components/approval-card.json",
|
|
93
|
+
"specimens": [
|
|
94
|
+
{
|
|
95
|
+
"title": "ApprovalCard",
|
|
96
|
+
"group": "elements",
|
|
97
|
+
"components": [
|
|
98
|
+
"ApprovalCard"
|
|
99
|
+
],
|
|
100
|
+
"code": "<Specimens>\n {APPROVALS.map((state) => (\n <Specimen key={state} label={state} wide>\n <ApprovalCard\n state={approvals[state] ?? state}\n command=\"cue unpatch --universe 4 --all\"\n title=\"Unpatch universe 4\"\n subtitle=\"48 channels stop responding until they are patched again.\"\n onAllowOnce={settle(state, \"running\")}\n onAlwaysAllow={settle(state, \"running\")}\n onDeny={settle(state, \"denied\")}\n />\n </Specimen>\n ))}\n</Specimens>",
|
|
101
|
+
"note": "Human in the loop for one action: the command in mono exactly as it will run, and three answers. The four specimens are the four states of the union, and the first one is live: answer it and it moves.",
|
|
102
|
+
"interaction": "Allow once and Always allow are separate answers, never one control with a modifier. Denying settles the card rather than hiding it."
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"todo": true
|
|
106
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ArtifactCard",
|
|
3
|
+
"slug": "artifact-card",
|
|
4
|
+
"group": "elements",
|
|
5
|
+
"importPath": "@cueplusplus/ui/elements",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"lucide-react"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "A generated document as a tangible object, written live and versioned.",
|
|
11
|
+
"props": [
|
|
12
|
+
{
|
|
13
|
+
"name": "title",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"required": true,
|
|
16
|
+
"defaultValue": null,
|
|
17
|
+
"description": "Name of the generated artifact."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "meta",
|
|
21
|
+
"type": "string",
|
|
22
|
+
"required": true,
|
|
23
|
+
"defaultValue": null,
|
|
24
|
+
"description": "Resting meta line shown once generation finishes, for example kind, version, and\nrecency."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "generating",
|
|
28
|
+
"type": "boolean",
|
|
29
|
+
"required": false,
|
|
30
|
+
"defaultValue": "false",
|
|
31
|
+
"description": "While true the icon pulses and the meta line shows a live word count with a shimmer."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "words",
|
|
35
|
+
"type": "number",
|
|
36
|
+
"required": false,
|
|
37
|
+
"defaultValue": "0",
|
|
38
|
+
"description": "Live word count shown while generating."
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"typeReferences": [
|
|
42
|
+
"Omit<\n ComponentProps<\"div\">,\n \"children\" | \"title\" | \"meta\" | \"generating\" | \"words\"\n> & {\n /** Name of the generated artifact. */\n title: string;\n /**\n * Resting meta line shown once generation finishes, for example kind, version, and\n * recency.\n */\n meta: string;\n /** While true the icon pulses and the meta line shows a live word count with a shimmer. */\n generating?: boolean;\n /** Live word count shown while generating. */\n words?: number;\n}"
|
|
43
|
+
],
|
|
44
|
+
"subcomponents": [],
|
|
45
|
+
"parts": [],
|
|
46
|
+
"variants": {},
|
|
47
|
+
"defaultVariants": {},
|
|
48
|
+
"tokensUsed": [
|
|
49
|
+
"--cue-fg-muted",
|
|
50
|
+
"--cue-fg-subtle",
|
|
51
|
+
"--cue-radius-overlay",
|
|
52
|
+
"--cue-radius-surface",
|
|
53
|
+
"--cue-surface-1",
|
|
54
|
+
"--cue-text-body"
|
|
55
|
+
],
|
|
56
|
+
"summary": "A generated document as a tangible object, written live and versioned.",
|
|
57
|
+
"examples": [
|
|
58
|
+
{
|
|
59
|
+
"title": "Usage",
|
|
60
|
+
"code": "import { ArtifactCard } from \"@cueplusplus/ui/elements\";\n\n<ArtifactCard\n title=\"Draft persistence RFC\"\n meta=\"Document · v3 · just now\"\n generating={isWriting}\n words={wordCount}\n/>",
|
|
61
|
+
"language": "tsx"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"status": "todo-docs",
|
|
65
|
+
"url": "/docs/components/artifact-card",
|
|
66
|
+
"mdUrl": "/docs/components/artifact-card.md",
|
|
67
|
+
"jsonUrl": "/r/components/artifact-card.json",
|
|
68
|
+
"specimens": [
|
|
69
|
+
{
|
|
70
|
+
"title": "ArtifactCard",
|
|
71
|
+
"group": "elements-knowledge",
|
|
72
|
+
"components": [
|
|
73
|
+
"ArtifactCard"
|
|
74
|
+
],
|
|
75
|
+
"code": "<Specimens>\n <Specimen label=\"writing\">\n <ArtifactCard title=\"Front truss — fixture spec\" meta=\"\" generating words={214} />\n </Specimen>\n <Specimen label=\"written\">\n <ArtifactCard title=\"Front truss — fixture spec\" meta=\"1.4 KB · v3\" />\n </Specimen>\n</Specimens>",
|
|
76
|
+
"note": "The document the answer produced, as an object you can pick up. While it is being written the icon pulses, the label shimmers and the word count climbs; when it lands, the meta line blurs in with its size and version. It is the handle — the document itself opens in a canvas.",
|
|
77
|
+
"interaction": "the whole card is the target and lifts a pixel under the pointer; the arrow only appears on hover, so a resting card is quiet."
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"todo": true
|
|
81
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "AudienceIcon",
|
|
3
|
+
"slug": "audience-icon",
|
|
4
|
+
"group": "icons",
|
|
5
|
+
"importPath": "@cueplusplus/ui",
|
|
6
|
+
"peerDependencies": [],
|
|
7
|
+
"clientOnly": false,
|
|
8
|
+
"description": "An audience: a named group of people something is published to.\n\nPeople, not an abstract shape. An audience is the one container in this set\nwhose members are humans rather than artefacts, and drawing it as a diamond\nor a tag would have filed it with the folders — which is exactly the mistake\na reader makes when deciding where to publish something.",
|
|
9
|
+
"props": [],
|
|
10
|
+
"typeReferences": [
|
|
11
|
+
"React.SVGProps<SVGSVGElement>"
|
|
12
|
+
],
|
|
13
|
+
"subcomponents": [],
|
|
14
|
+
"parts": [],
|
|
15
|
+
"variants": {},
|
|
16
|
+
"defaultVariants": {},
|
|
17
|
+
"tokensUsed": [
|
|
18
|
+
"--cue-danger",
|
|
19
|
+
"--cue-fg",
|
|
20
|
+
"--cue-icon-",
|
|
21
|
+
"--cue-icon-md",
|
|
22
|
+
"--cue-icon-sm"
|
|
23
|
+
],
|
|
24
|
+
"summary": "An audience: a named group of people something is published to.",
|
|
25
|
+
"examples": [],
|
|
26
|
+
"status": "todo-docs",
|
|
27
|
+
"url": "/docs/components/audience-icon",
|
|
28
|
+
"mdUrl": "/docs/components/audience-icon.md",
|
|
29
|
+
"jsonUrl": "/r/components/audience-icon.json",
|
|
30
|
+
"specimens": [
|
|
31
|
+
{
|
|
32
|
+
"title": "The container icon set",
|
|
33
|
+
"group": "icons",
|
|
34
|
+
"components": [
|
|
35
|
+
"CatalogueIcon",
|
|
36
|
+
"StackIcon",
|
|
37
|
+
"StacksMatrixIcon",
|
|
38
|
+
"AudienceIcon",
|
|
39
|
+
"ChannelReleasedIcon",
|
|
40
|
+
"ChannelBetaIcon",
|
|
41
|
+
"FolderIcon",
|
|
42
|
+
"McpServerIcon",
|
|
43
|
+
"CliToolIcon",
|
|
44
|
+
"SkillIcon"
|
|
45
|
+
],
|
|
46
|
+
"code": "<Specimens>\n {CONTAINERS.map(([label, name, Icon]) => (\n <Specimen key={name} label={label}>\n <Icon className=\"size-icon-md text-fg\" />\n </Specimen>\n ))}\n</Specimens>\n<Specimens>\n <Specimen label=\"icon-sm\">\n <SkillIcon className=\"size-icon-sm text-fg\" />\n </Specimen>\n <Specimen label=\"icon-md\">\n <SkillIcon className=\"size-icon-md text-fg\" />\n </Specimen>\n <Specimen label=\"inherited\">\n <SkillIcon className=\"size-icon-md\" />\n </Specimen>\n <Specimen label=\"muted\">\n <SkillIcon className=\"size-icon-md text-fg-muted\" />\n </Specimen>\n <Specimen label=\"accent\">\n <SkillIcon className=\"size-icon-md text-accent\" />\n </Specimen>\n <Specimen label=\"danger\">\n <SkillIcon className=\"size-icon-md text-danger\" />\n </Specimen>\n</Specimens>\n<Specimens>\n <Specimen label=\"in a row\" wide>\n <span className=\"inline-flex items-center gap-(--cue-space-2) font-mono text-(length:--cue-text-ui) text-fg-muted\">\n <ChannelReleasedIcon className=\"size-icon-md shrink-0\" />\n Our skills · released\n </span>\n </Specimen>\n <Specimen label=\"current row\" wide>\n <span className=\"inline-flex items-center gap-(--cue-space-2) font-mono text-(length:--cue-text-ui) text-fg\">\n <ChannelBetaIcon className=\"size-icon-md shrink-0\" />\n Our skills · beta\n </span>\n </Specimen>\n</Specimens>",
|
|
47
|
+
"note": "One grid and one weight across all ten, at size-icon-md — the size a navigation row draws them at. Each is a plain <svg> that takes every SVG prop.",
|
|
48
|
+
"interaction": "none. They are decorative by default: aria-hidden, announced by nothing, because the row they mark already carries its name."
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"todo": true
|
|
52
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "BackgroundInbox",
|
|
3
|
+
"slug": "background-inbox",
|
|
4
|
+
"group": "elements",
|
|
5
|
+
"importPath": "@cueplusplus/ui/elements",
|
|
6
|
+
"peerDependencies": [
|
|
7
|
+
"lucide-react"
|
|
8
|
+
],
|
|
9
|
+
"clientOnly": true,
|
|
10
|
+
"description": "Work still going somewhere else, and the results waiting to be collected.",
|
|
11
|
+
"props": [
|
|
12
|
+
{
|
|
13
|
+
"name": "runs",
|
|
14
|
+
"type": "readonly BackgroundRun[]",
|
|
15
|
+
"required": true,
|
|
16
|
+
"defaultValue": null,
|
|
17
|
+
"description": "Detached runs. The header counts what is ready rather than what is in flight,\nbecause ready is the thing that needs you."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "onCollect",
|
|
21
|
+
"type": "((id: string) => void)",
|
|
22
|
+
"required": false,
|
|
23
|
+
"defaultValue": null,
|
|
24
|
+
"description": "Called to pull a finished run back into the thread. Running rows are not clickable."
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"typeReferences": [
|
|
28
|
+
"Omit<ComponentProps<\"div\">, \"children\" | \"runs\" | \"onCollect\"> & {\n /**\n * Detached runs. The header counts what is ready rather than what is in flight,\n * because ready is the thing that needs you.\n */\n runs: readonly BackgroundRun[];\n /** Called to pull a finished run back into the thread. Running rows are not clickable. */\n onCollect?: (id: string) => void;\n}"
|
|
29
|
+
],
|
|
30
|
+
"subcomponents": [],
|
|
31
|
+
"parts": [],
|
|
32
|
+
"variants": {},
|
|
33
|
+
"defaultVariants": {},
|
|
34
|
+
"tokensUsed": [
|
|
35
|
+
"--cue-danger",
|
|
36
|
+
"--cue-fg",
|
|
37
|
+
"--cue-fg-muted",
|
|
38
|
+
"--cue-fg-subtle",
|
|
39
|
+
"--cue-ok",
|
|
40
|
+
"--cue-radius-overlay",
|
|
41
|
+
"--cue-radius-surface",
|
|
42
|
+
"--cue-stream",
|
|
43
|
+
"--cue-surface-1",
|
|
44
|
+
"--cue-text-body"
|
|
45
|
+
],
|
|
46
|
+
"summary": "Work still going somewhere else, and the results waiting to be collected.",
|
|
47
|
+
"examples": [
|
|
48
|
+
{
|
|
49
|
+
"title": "Usage",
|
|
50
|
+
"code": "import { BackgroundInbox } from \"@cueplusplus/ui/elements\";\n\n<BackgroundInbox runs={runs} onCollect={collect} />",
|
|
51
|
+
"language": "tsx"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"status": "todo-docs",
|
|
55
|
+
"url": "/docs/components/background-inbox",
|
|
56
|
+
"mdUrl": "/docs/components/background-inbox.md",
|
|
57
|
+
"jsonUrl": "/r/components/background-inbox.json",
|
|
58
|
+
"specimens": [
|
|
59
|
+
{
|
|
60
|
+
"title": "BackgroundInbox",
|
|
61
|
+
"group": "elements-agents",
|
|
62
|
+
"components": [
|
|
63
|
+
"BackgroundInbox"
|
|
64
|
+
],
|
|
65
|
+
"code": "<Specimens>\n <Specimen label=\"one ready\" wide>\n <BackgroundInbox\n runs={inbox}\n onCollect={(id) => setCollected((current) => [...current, id])}\n />\n </Specimen>\n <Specimen label=\"nothing back yet\" wide>\n <BackgroundInbox\n runs={INBOX.map((item) => ({ ...item, state: \"running\" as const, summary: undefined }))}\n />\n </Specimen>\n</Specimens>",
|
|
66
|
+
"note": "Work that left the conversation and is still going somewhere else. The header counts what is *ready* rather than what is in flight, because ready is the half that needs a person; a running row is not clickable at all, so there is nothing to press before there is something to collect.",
|
|
67
|
+
"interaction": "a ready or failed row is a button and takes cue's focus ring; a running one is `disabled`, which is what makes the spinner mean wait rather than try again."
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"todo": true
|
|
71
|
+
}
|