@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
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { RotateCcwIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/checkpoint-history.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Points you can fall back to, with what each one would give back.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { CheckpointHistory } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <CheckpointHistory checkpoints={checkpoints} currentId="3" onRestore={restore} />
|
|
14
|
+
*/
|
|
15
|
+
function CheckpointHistory({ checkpoints, currentId, onRestore, className, ...props }) {
|
|
16
|
+
const currentIndex = checkpoints.findIndex((checkpoint) => checkpoint.id === currentId);
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
18
|
+
"data-slot": "checkpoint-history",
|
|
19
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-(--radius-overlay) p-3", className),
|
|
20
|
+
...props,
|
|
21
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
22
|
+
className: "px-1.5 pb-1 text-(length:--cue-text-body) font-medium",
|
|
23
|
+
children: "Checkpoints"
|
|
24
|
+
}), checkpoints.map((checkpoint, i) => {
|
|
25
|
+
const ahead = currentIndex >= 0 && i > currentIndex;
|
|
26
|
+
const current = checkpoint.id === currentId;
|
|
27
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
28
|
+
className: cn("group flex items-center gap-2.5 rounded-(--radius-surface) px-1.5 py-1.5 transition-colors", current ? "bg-surface-1" : "hover:bg-surface-1", ahead && "opacity-40"),
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsx("span", {
|
|
31
|
+
"aria-hidden": true,
|
|
32
|
+
className: cn("size-1.5 shrink-0 rounded-full", current ? "bg-stream" : ahead ? "border-border-strong border" : "bg-surface-3")
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ jsxs("span", {
|
|
35
|
+
className: "flex min-w-0 flex-1 flex-col",
|
|
36
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
37
|
+
className: "truncate text-(length:--cue-text-body)",
|
|
38
|
+
children: checkpoint.label
|
|
39
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
40
|
+
className: cn(mono, "text-fg-subtle"),
|
|
41
|
+
children: [
|
|
42
|
+
checkpoint.at,
|
|
43
|
+
" · ",
|
|
44
|
+
checkpoint.files,
|
|
45
|
+
" files"
|
|
46
|
+
]
|
|
47
|
+
})]
|
|
48
|
+
}),
|
|
49
|
+
current ? /* @__PURE__ */ jsx("span", {
|
|
50
|
+
className: cn(mono, "text-fg-subtle shrink-0"),
|
|
51
|
+
children: "current"
|
|
52
|
+
}) : /* @__PURE__ */ jsxs("button", {
|
|
53
|
+
type: "button",
|
|
54
|
+
"aria-label": `Restore to ${checkpoint.label}`,
|
|
55
|
+
onClick: () => onRestore?.(checkpoint.id),
|
|
56
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-(length:--cue-text-label) font-medium opacity-0 transition-[background-color,color,opacity,scale] duration-150 group-hover:opacity-100 focus-visible:opacity-100 active:scale-[0.96]",
|
|
57
|
+
children: [/* @__PURE__ */ jsx(RotateCcwIcon, { className: "size-2.5" }), "Restore"]
|
|
58
|
+
})
|
|
59
|
+
]
|
|
60
|
+
}, checkpoint.id);
|
|
61
|
+
})]
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//#endregion
|
|
65
|
+
export { CheckpointHistory };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ClampLabels } from "./vocabulary.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/elements/clamp.d.ts
|
|
4
|
+
interface ClampProps extends Omit<React.ComponentPropsWithoutRef<"div">, "onToggle"> {
|
|
5
|
+
/**
|
|
6
|
+
* How tall the content may be before it is cut, as a number of pixels or any
|
|
7
|
+
* CSS length. Defaults to `250` — the reference's own default, with `60` the
|
|
8
|
+
* value it uses for a quoted user message.
|
|
9
|
+
*
|
|
10
|
+
* Published as `--cue-elements-clamp-height` on the root, so a console can
|
|
11
|
+
* retune one clamp from a stylesheet without a prop.
|
|
12
|
+
*/
|
|
13
|
+
height?: number | string;
|
|
14
|
+
/**
|
|
15
|
+
* How deep the dissolve at the cut is, in pixels. Defaults to `50`, the
|
|
16
|
+
* reference's most-used depth.
|
|
17
|
+
*
|
|
18
|
+
* Fixed pixels rather than a fraction, deliberately: a percentage fade is a
|
|
19
|
+
* different effect on a short row than on a long one. Published as
|
|
20
|
+
* `--cue-elements-clamp-fade`.
|
|
21
|
+
*/
|
|
22
|
+
fade?: number;
|
|
23
|
+
/** Whether the content is showing in full. */
|
|
24
|
+
open: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Called when the reveal is used. Omit it and the clamp is a hard cut with a
|
|
27
|
+
* fade and no promise of more — which is the reference's own tool-result row,
|
|
28
|
+
* where the full text opens somewhere else entirely.
|
|
29
|
+
*/
|
|
30
|
+
onOpenChange?: (open: boolean) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the content is taller than `height`, when the caller already knows.
|
|
33
|
+
* Left out, the clamp measures itself and re-measures as the content and the
|
|
34
|
+
* box change.
|
|
35
|
+
*
|
|
36
|
+
* The measurement is the right default and the override is for the cases it
|
|
37
|
+
* cannot serve: a virtualised row that knows its own text, a replay frame
|
|
38
|
+
* that must paint the same way on every mount, a server render.
|
|
39
|
+
*/
|
|
40
|
+
overflows?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* The two words on the reveal. Defaults to {@link CLAMP_LABELS} — `Show more`
|
|
43
|
+
* and `Show less`, which is the reference's copy verbatim.
|
|
44
|
+
*/
|
|
45
|
+
labels?: Partial<ClampLabels>;
|
|
46
|
+
/** The content being clamped. */
|
|
47
|
+
children?: React.ReactNode;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Long content, cut to a height, dissolving at the cut, with a way back.
|
|
51
|
+
*
|
|
52
|
+
* The truncation trio as one element. Everything a transcript truncates —
|
|
53
|
+
* command output, a pasted file, a reasoning trace, a quoted message — wants
|
|
54
|
+
* exactly these three things, and a family that leaves them to each component
|
|
55
|
+
* gets five slightly different cuts and one of them hard-coded to a colour that
|
|
56
|
+
* breaks in light mode.
|
|
57
|
+
*
|
|
58
|
+
* The fade is a **mask**, not an overlay: it fades the content rather than
|
|
59
|
+
* painting a gradient of the surface colour over it, so it needs no idea of
|
|
60
|
+
* what is behind it and cannot drift when the theme changes. The height and the
|
|
61
|
+
* depth are published as custom properties on the root, so a console can retune
|
|
62
|
+
* a clamp from CSS — and because the mask is expressed in terms of them, a
|
|
63
|
+
* height overridden in a stylesheet moves the fade with it.
|
|
64
|
+
*
|
|
65
|
+
* The reveal is the part this element does not copy exactly. The reference
|
|
66
|
+
* shows its `Show more` chip on hover only, which is unreachable for anyone
|
|
67
|
+
* who is not holding a mouse; here the control is always in the DOM and always
|
|
68
|
+
* focusable, and hover and focus only decide how loudly it is drawn. Once the
|
|
69
|
+
* content is open, `Show less` is drawn at full strength — a long expansion you
|
|
70
|
+
* cannot close without hunting for the control is a real defect.
|
|
71
|
+
*
|
|
72
|
+
* Open state is a prop, like everything else in this family: a scripted replay
|
|
73
|
+
* of this component is a caller changing `open`.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* import { Clamp } from "@cueplusplus/ui/elements";
|
|
77
|
+
*
|
|
78
|
+
* <Clamp open={open} onOpenChange={setOpen}>
|
|
79
|
+
* <pre>{output}</pre>
|
|
80
|
+
* </Clamp>
|
|
81
|
+
* @example
|
|
82
|
+
* // The reference's tool-result row: 60px of output, a 10px dissolve, and no
|
|
83
|
+
* // reveal at all — the full text opens in an editor tab instead.
|
|
84
|
+
* <Clamp height={60} fade={10} open={false} overflows onClick={openInEditor}>
|
|
85
|
+
* {result}
|
|
86
|
+
* </Clamp>
|
|
87
|
+
*/
|
|
88
|
+
declare const Clamp: React.ForwardRefExoticComponent<ClampProps & React.RefAttributes<HTMLDivElement>>;
|
|
89
|
+
//#endregion
|
|
90
|
+
export { Clamp, ClampProps };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
|
|
4
|
+
import { CLAMP_LABELS } from "./vocabulary.js";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/elements/clamp.tsx
|
|
8
|
+
/** A height as CSS: a bare number is pixels, a string is whatever it says. */
|
|
9
|
+
const asLength = (value) => typeof value === "number" ? `${value}px` : value;
|
|
10
|
+
/**
|
|
11
|
+
* Long content, cut to a height, dissolving at the cut, with a way back.
|
|
12
|
+
*
|
|
13
|
+
* The truncation trio as one element. Everything a transcript truncates —
|
|
14
|
+
* command output, a pasted file, a reasoning trace, a quoted message — wants
|
|
15
|
+
* exactly these three things, and a family that leaves them to each component
|
|
16
|
+
* gets five slightly different cuts and one of them hard-coded to a colour that
|
|
17
|
+
* breaks in light mode.
|
|
18
|
+
*
|
|
19
|
+
* The fade is a **mask**, not an overlay: it fades the content rather than
|
|
20
|
+
* painting a gradient of the surface colour over it, so it needs no idea of
|
|
21
|
+
* what is behind it and cannot drift when the theme changes. The height and the
|
|
22
|
+
* depth are published as custom properties on the root, so a console can retune
|
|
23
|
+
* a clamp from CSS — and because the mask is expressed in terms of them, a
|
|
24
|
+
* height overridden in a stylesheet moves the fade with it.
|
|
25
|
+
*
|
|
26
|
+
* The reveal is the part this element does not copy exactly. The reference
|
|
27
|
+
* shows its `Show more` chip on hover only, which is unreachable for anyone
|
|
28
|
+
* who is not holding a mouse; here the control is always in the DOM and always
|
|
29
|
+
* focusable, and hover and focus only decide how loudly it is drawn. Once the
|
|
30
|
+
* content is open, `Show less` is drawn at full strength — a long expansion you
|
|
31
|
+
* cannot close without hunting for the control is a real defect.
|
|
32
|
+
*
|
|
33
|
+
* Open state is a prop, like everything else in this family: a scripted replay
|
|
34
|
+
* of this component is a caller changing `open`.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* import { Clamp } from "@cueplusplus/ui/elements";
|
|
38
|
+
*
|
|
39
|
+
* <Clamp open={open} onOpenChange={setOpen}>
|
|
40
|
+
* <pre>{output}</pre>
|
|
41
|
+
* </Clamp>
|
|
42
|
+
* @example
|
|
43
|
+
* // The reference's tool-result row: 60px of output, a 10px dissolve, and no
|
|
44
|
+
* // reveal at all — the full text opens in an editor tab instead.
|
|
45
|
+
* <Clamp height={60} fade={10} open={false} overflows onClick={openInEditor}>
|
|
46
|
+
* {result}
|
|
47
|
+
* </Clamp>
|
|
48
|
+
*/
|
|
49
|
+
const Clamp = React.forwardRef(function Clamp({ height = 250, fade = 50, open, onOpenChange, overflows, labels, children, className, style, ...elementProps }, ref) {
|
|
50
|
+
const [measured, setMeasured] = React.useState(false);
|
|
51
|
+
const box = React.useRef(null);
|
|
52
|
+
const inner = React.useRef(null);
|
|
53
|
+
const said = {
|
|
54
|
+
...CLAMP_LABELS,
|
|
55
|
+
...labels
|
|
56
|
+
};
|
|
57
|
+
useIsomorphicLayoutEffect(() => {
|
|
58
|
+
if (overflows !== void 0 || open) return;
|
|
59
|
+
const element = box.current;
|
|
60
|
+
const content = inner.current;
|
|
61
|
+
if (element === null || content === null) return;
|
|
62
|
+
const read = () => setMeasured(element.scrollHeight > element.clientHeight + 1);
|
|
63
|
+
read();
|
|
64
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
65
|
+
const observer = new ResizeObserver(read);
|
|
66
|
+
observer.observe(content);
|
|
67
|
+
return () => observer.disconnect();
|
|
68
|
+
}, [
|
|
69
|
+
height,
|
|
70
|
+
open,
|
|
71
|
+
overflows
|
|
72
|
+
]);
|
|
73
|
+
const over = overflows ?? measured;
|
|
74
|
+
const clamped = !open && over;
|
|
75
|
+
const revealable = onOpenChange !== void 0 && (open || over);
|
|
76
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
77
|
+
ref,
|
|
78
|
+
"data-slot": "clamp",
|
|
79
|
+
"data-open": String(open),
|
|
80
|
+
"data-clamped": String(clamped),
|
|
81
|
+
className: cn("group/clamp relative flex w-full min-w-0 flex-col", className),
|
|
82
|
+
style: {
|
|
83
|
+
"--cue-elements-clamp-height": asLength(height),
|
|
84
|
+
"--cue-elements-clamp-fade": `${fade}px`,
|
|
85
|
+
"--cue-elements-clamp-mask": "linear-gradient(to bottom, black calc(var(--cue-elements-clamp-height) - var(--cue-elements-clamp-fade)), transparent var(--cue-elements-clamp-height))",
|
|
86
|
+
...style
|
|
87
|
+
},
|
|
88
|
+
...elementProps,
|
|
89
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
90
|
+
ref: box,
|
|
91
|
+
"data-slot": "clamp-content",
|
|
92
|
+
className: cn("min-w-0", !open && "overflow-hidden [max-height:var(--cue-elements-clamp-height)]", clamped && "[mask-image:var(--cue-elements-clamp-mask)] [-webkit-mask-image:var(--cue-elements-clamp-mask)]"),
|
|
93
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
94
|
+
ref: inner,
|
|
95
|
+
className: "min-w-0",
|
|
96
|
+
children
|
|
97
|
+
})
|
|
98
|
+
}), revealable ? /* @__PURE__ */ jsx("button", {
|
|
99
|
+
type: "button",
|
|
100
|
+
"data-slot": "clamp-reveal",
|
|
101
|
+
"aria-expanded": open,
|
|
102
|
+
onClick: () => onOpenChange?.(!open),
|
|
103
|
+
className: cn("text-fg-muted hover:text-fg self-start rounded-(--radius-control) py-0.5 text-(length:--cue-text-ui) transition-opacity focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent motion-reduce:transition-none", !open && "opacity-60 group-hover/clamp:opacity-100 focus-visible:opacity-100"),
|
|
104
|
+
children: open ? said.less : said.more
|
|
105
|
+
}) : null]
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//#endregion
|
|
109
|
+
export { Clamp };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/code-diff.d.ts
|
|
3
|
+
/** What a diff row is — unchanged context, an addition, or a deletion. */
|
|
4
|
+
type DiffKind = "context" | "added" | "removed";
|
|
5
|
+
/** One row of a diff: its kind, which decides its gutter mark and its ink, and its text. */
|
|
6
|
+
interface DiffLine {
|
|
7
|
+
/** Whether the row is context, an addition or a deletion. */
|
|
8
|
+
kind: DiffKind;
|
|
9
|
+
/** The line itself, rendered with its own whitespace kept. */
|
|
10
|
+
text: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A unified diff with tinted additions and removals, sized for chat.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { CodeDiff } from "@cueplusplus/ui/elements";
|
|
17
|
+
*
|
|
18
|
+
* <CodeDiff
|
|
19
|
+
* filename="thread.tsx"
|
|
20
|
+
* additions={2}
|
|
21
|
+
* deletions={1}
|
|
22
|
+
* lines={[
|
|
23
|
+
* { kind: "removed", text: "const x = 1" },
|
|
24
|
+
* { kind: "added", text: "const x = 2" },
|
|
25
|
+
* ]}
|
|
26
|
+
* cycle={0}
|
|
27
|
+
* />
|
|
28
|
+
*/
|
|
29
|
+
declare function CodeDiff({ filename, additions, deletions, lines, cycle, className, ...props }: Omit<ComponentProps<"div">, "children" | "filename" | "additions" | "deletions" | "lines" | "cycle"> & {
|
|
30
|
+
/** File path shown in the diff header. */
|
|
31
|
+
filename: string;
|
|
32
|
+
/** Addition count rendered in green next to the filename. */
|
|
33
|
+
additions: number;
|
|
34
|
+
/** Deletion count rendered in red next to the filename. */
|
|
35
|
+
deletions: number;
|
|
36
|
+
/** Unified diff lines with context, added, or removed kind. */
|
|
37
|
+
lines: readonly DiffLine[];
|
|
38
|
+
/** Identity key that remounts the body so entrance animation can replay. */
|
|
39
|
+
cycle: number;
|
|
40
|
+
}): import("react").JSX.Element;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { CodeDiff, DiffKind, DiffLine };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { codeScroll, codeSurface, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/elements/code-diff.tsx
|
|
6
|
+
const GUTTER = {
|
|
7
|
+
context: "",
|
|
8
|
+
added: "+",
|
|
9
|
+
removed: "−"
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* A unified diff with tinted additions and removals, sized for chat.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { CodeDiff } from "@cueplusplus/ui/elements";
|
|
16
|
+
*
|
|
17
|
+
* <CodeDiff
|
|
18
|
+
* filename="thread.tsx"
|
|
19
|
+
* additions={2}
|
|
20
|
+
* deletions={1}
|
|
21
|
+
* lines={[
|
|
22
|
+
* { kind: "removed", text: "const x = 1" },
|
|
23
|
+
* { kind: "added", text: "const x = 2" },
|
|
24
|
+
* ]}
|
|
25
|
+
* cycle={0}
|
|
26
|
+
* />
|
|
27
|
+
*/
|
|
28
|
+
function CodeDiff({ filename, additions, deletions, lines, cycle, className, ...props }) {
|
|
29
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
30
|
+
"data-slot": "code-diff",
|
|
31
|
+
className: cn(paper, "w-full max-w-md overflow-hidden rounded-(--radius-overlay) font-mono text-(length:--cue-text-ui)", className),
|
|
32
|
+
...props,
|
|
33
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
34
|
+
className: "flex items-center justify-between px-4 pt-3 pb-2",
|
|
35
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
36
|
+
className: "text-fg",
|
|
37
|
+
children: filename
|
|
38
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
39
|
+
className: cn(mono, "tabular-nums"),
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("span", {
|
|
42
|
+
className: "text-ok",
|
|
43
|
+
children: ["+", additions]
|
|
44
|
+
}),
|
|
45
|
+
" ",
|
|
46
|
+
/* @__PURE__ */ jsxs("span", {
|
|
47
|
+
className: "text-danger",
|
|
48
|
+
children: ["−", deletions]
|
|
49
|
+
})
|
|
50
|
+
]
|
|
51
|
+
})]
|
|
52
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
53
|
+
className: codeScroll,
|
|
54
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
55
|
+
className: codeSurface,
|
|
56
|
+
children: lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both flex px-4 py-0.5 leading-relaxed whitespace-pre duration-300", line.kind === "context" && "text-fg-muted", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
|
|
58
|
+
style: { animationDelay: `${i * 60}ms` },
|
|
59
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
60
|
+
className: "w-4 shrink-0 select-none",
|
|
61
|
+
children: GUTTER[line.kind]
|
|
62
|
+
}), /* @__PURE__ */ jsx("span", { children: line.text })]
|
|
63
|
+
}, `${cycle}-${i}-${line.text}`))
|
|
64
|
+
})
|
|
65
|
+
})]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { CodeDiff };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/code-runner.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Where the snippet is: `idle` before anybody asks, `running`, then `ok` or `error`.
|
|
5
|
+
* The last two both show output — a failure is a result, not an absence.
|
|
6
|
+
*/
|
|
7
|
+
type RunState = "idle" | "running" | "ok" | "error";
|
|
8
|
+
/**
|
|
9
|
+
* A snippet with a run button, and the output it produced attached below it.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { CodeRunner } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <CodeRunner
|
|
15
|
+
* language="typescript"
|
|
16
|
+
* code={code}
|
|
17
|
+
* state="ok"
|
|
18
|
+
* output={["1"]}
|
|
19
|
+
* durationMs={38}
|
|
20
|
+
* onRun={run}
|
|
21
|
+
* />
|
|
22
|
+
*/
|
|
23
|
+
declare function CodeRunner({ language, code, state, output, durationMs, onRun, className, ...props }: Omit<ComponentProps<"div">, "children" | "language" | "code" | "state" | "output" | "durationMs" | "onRun"> & {
|
|
24
|
+
/** Language label above the snippet. */
|
|
25
|
+
language: string;
|
|
26
|
+
/** The snippet. Rendered as plain mono; wrap it yourself for highlighting. */
|
|
27
|
+
code: string;
|
|
28
|
+
/** idle hides the output pane entirely; error tints the output red. */
|
|
29
|
+
state: RunState;
|
|
30
|
+
/** Output lines, revealed in sequence. */
|
|
31
|
+
output: readonly string[];
|
|
32
|
+
/** How long the run took, printed once it settles. */
|
|
33
|
+
durationMs?: number;
|
|
34
|
+
/** Called when the run control is pressed. */
|
|
35
|
+
onRun?: () => void;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { CodeRunner, RunState };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { ghostButton, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { Loader2Icon, PlayIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/code-runner.tsx
|
|
7
|
+
/**
|
|
8
|
+
* A snippet with a run button, and the output it produced attached below it.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { CodeRunner } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <CodeRunner
|
|
14
|
+
* language="typescript"
|
|
15
|
+
* code={code}
|
|
16
|
+
* state="ok"
|
|
17
|
+
* output={["1"]}
|
|
18
|
+
* durationMs={38}
|
|
19
|
+
* onRun={run}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function CodeRunner({ language, code, state, output, durationMs, onRun, className, ...props }) {
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
"data-slot": "code-runner",
|
|
25
|
+
className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsxs("div", {
|
|
29
|
+
className: "flex items-center gap-2 px-3.5 py-2",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx("span", {
|
|
32
|
+
className: cn(mono, "text-fg-subtle min-w-0 flex-1"),
|
|
33
|
+
children: language
|
|
34
|
+
}),
|
|
35
|
+
durationMs !== void 0 && state !== "running" && /* @__PURE__ */ jsxs("span", {
|
|
36
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0 tabular-nums"),
|
|
37
|
+
children: [durationMs, "ms"]
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ jsx("button", {
|
|
40
|
+
type: "button",
|
|
41
|
+
"aria-label": "Run this snippet",
|
|
42
|
+
onClick: onRun,
|
|
43
|
+
disabled: state === "running",
|
|
44
|
+
className: cn(ghostButton, "size-7 shrink-0 disabled:pointer-events-none"),
|
|
45
|
+
children: state === "running" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3.5 animate-spin motion-reduce:animate-none" }) : /* @__PURE__ */ jsx(PlayIcon, { className: "size-3.5 translate-x-px" })
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ jsx("pre", {
|
|
50
|
+
className: "border-border overflow-x-auto border-t px-3.5 py-2.5 font-mono text-(length:--cue-text-ui) leading-relaxed",
|
|
51
|
+
children: /* @__PURE__ */ jsx("code", {
|
|
52
|
+
className: "text-fg-muted",
|
|
53
|
+
children: code
|
|
54
|
+
})
|
|
55
|
+
}),
|
|
56
|
+
state !== "idle" && /* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: "border-border cue-elements-fade-in cue-elements-animate-in flex flex-col border-t px-3.5 py-2.5 duration-300",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx("span", {
|
|
60
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle pb-1"),
|
|
61
|
+
children: "output"
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ jsx("div", {
|
|
64
|
+
className: "overflow-x-auto",
|
|
65
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
66
|
+
className: cn("w-max min-w-full", "flex flex-col"),
|
|
67
|
+
children: output.map((line, i) => /* @__PURE__ */ jsx("span", {
|
|
68
|
+
className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both font-mono text-(length:--cue-text-ui) leading-relaxed whitespace-pre", state === "error" ? "text-danger" : "text-fg-muted"),
|
|
69
|
+
style: { animationDelay: `${i * 80}ms` },
|
|
70
|
+
children: line
|
|
71
|
+
}, `${i}-${line}`))
|
|
72
|
+
})
|
|
73
|
+
}),
|
|
74
|
+
state === "running" && /* @__PURE__ */ jsx("span", {
|
|
75
|
+
"aria-hidden": true,
|
|
76
|
+
className: "bg-surface-3 h-[1em] w-[2px] animate-pulse rounded-full motion-reduce:animate-none"
|
|
77
|
+
})
|
|
78
|
+
]
|
|
79
|
+
})
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { CodeRunner };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/command-palette.d.ts
|
|
3
|
+
interface PaletteCommand {
|
|
4
|
+
/** Stable identity, compared against activeId and reported by onRun. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Command text, and the field the query filters on. */
|
|
7
|
+
label: string;
|
|
8
|
+
/** Heading the command sits under. */
|
|
9
|
+
group: string;
|
|
10
|
+
/** Shortcut, one chip per key. */
|
|
11
|
+
keys: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Everything the app can do, one keystroke away and grouped by where it acts.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* import { CommandPalette } from "@cueplusplus/ui/elements";
|
|
18
|
+
*
|
|
19
|
+
* <CommandPalette
|
|
20
|
+
* commands={commands}
|
|
21
|
+
* query={query}
|
|
22
|
+
* activeId={activeId}
|
|
23
|
+
* onQueryChange={setQuery}
|
|
24
|
+
* onRun={run}
|
|
25
|
+
* />
|
|
26
|
+
*/
|
|
27
|
+
declare function ElementsCommandPalette({ commands, query, activeId, onQueryChange, onActiveChange, onRun, className, ...props }: Omit<ComponentProps<"div">, "children" | "commands" | "query" | "activeId" | "onQueryChange" | "onActiveChange" | "onRun"> & {
|
|
28
|
+
/** Everything runnable. Groups are derived from the entries and keep first-seen order. */
|
|
29
|
+
commands: readonly PaletteCommand[];
|
|
30
|
+
/** Current filter text. */
|
|
31
|
+
query: string;
|
|
32
|
+
/**
|
|
33
|
+
* Which row is highlighted. Arrow keys move it and Enter runs it, both handled by
|
|
34
|
+
* the element; it reports the move through onActiveChange.
|
|
35
|
+
*/
|
|
36
|
+
activeId: string;
|
|
37
|
+
/** Called as the filter is typed. */
|
|
38
|
+
onQueryChange?: (query: string) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Called as the arrow keys walk the list. The element owns the key handling and
|
|
41
|
+
* reports where it landed, so activeId stays yours to hold.
|
|
42
|
+
*/
|
|
43
|
+
onActiveChange?: (id: string) => void;
|
|
44
|
+
/** Called when a command is chosen. */
|
|
45
|
+
onRun?: (id: string) => void;
|
|
46
|
+
}): import("react").JSX.Element;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { ElementsCommandPalette, PaletteCommand };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, floating, mono } from "./surfaces.js";
|
|
4
|
+
import { useEffect, useId } from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { SearchIcon } from "lucide-react";
|
|
7
|
+
//#region src/elements/command-palette.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Everything the app can do, one keystroke away and grouped by where it acts.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { CommandPalette } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <CommandPalette
|
|
15
|
+
* commands={commands}
|
|
16
|
+
* query={query}
|
|
17
|
+
* activeId={activeId}
|
|
18
|
+
* onQueryChange={setQuery}
|
|
19
|
+
* onRun={run}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function ElementsCommandPalette({ commands, query, activeId, onQueryChange, onActiveChange, onRun, className, ...props }) {
|
|
23
|
+
const listId = useId();
|
|
24
|
+
const optionId = (id) => `${listId}-${id}`;
|
|
25
|
+
const matches = commands.filter((command) => command.label.toLowerCase().includes(query.toLowerCase()));
|
|
26
|
+
const groups = [...new Set(matches.map((command) => command.group))];
|
|
27
|
+
const ordered = groups.flatMap((group) => matches.filter((command) => command.group === group));
|
|
28
|
+
const move = (delta) => {
|
|
29
|
+
if (ordered.length === 0) return;
|
|
30
|
+
const at = ordered.findIndex((command) => command.id === activeId);
|
|
31
|
+
const next = ordered[((at === -1 ? delta > 0 ? -1 : 0 : at) + delta + ordered.length) % ordered.length];
|
|
32
|
+
if (next) onActiveChange?.(next.id);
|
|
33
|
+
};
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
document.getElementById(optionId(activeId))?.scrollIntoView({ block: "nearest" });
|
|
36
|
+
}, [activeId, listId]);
|
|
37
|
+
const onKeyDown = (event) => {
|
|
38
|
+
if (event.nativeEvent.isComposing) return;
|
|
39
|
+
if (event.key === "ArrowDown") {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
move(1);
|
|
42
|
+
} else if (event.key === "ArrowUp") {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
move(-1);
|
|
45
|
+
} else if (event.key === "Enter") {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
const active = ordered.find((command) => command.id === activeId);
|
|
48
|
+
if (active) onRun?.(active.id);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
52
|
+
"data-slot": "command-palette",
|
|
53
|
+
className: cn(floating, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
|
|
54
|
+
...props,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: "flex items-center gap-2.5 px-3.5 py-3",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx(SearchIcon, { className: "text-fg-subtle size-3.5 shrink-0" }),
|
|
60
|
+
/* @__PURE__ */ jsx("input", {
|
|
61
|
+
value: query,
|
|
62
|
+
onChange: (event) => onQueryChange?.(event.target.value),
|
|
63
|
+
onKeyDown,
|
|
64
|
+
placeholder: "Type a command",
|
|
65
|
+
"aria-label": "Type a command",
|
|
66
|
+
role: "combobox",
|
|
67
|
+
"aria-expanded": ordered.length > 0,
|
|
68
|
+
"aria-controls": listId,
|
|
69
|
+
"aria-autocomplete": "list",
|
|
70
|
+
"aria-activedescendant": ordered.some((command) => command.id === activeId) ? optionId(activeId) : void 0,
|
|
71
|
+
className: "text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-body) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
|
|
72
|
+
}),
|
|
73
|
+
/* @__PURE__ */ jsx("span", {
|
|
74
|
+
className: cn(field, mono, "text-fg-subtle rounded-(--radius-control) px-1.5 py-0.5"),
|
|
75
|
+
children: "esc"
|
|
76
|
+
})
|
|
77
|
+
]
|
|
78
|
+
}),
|
|
79
|
+
/* @__PURE__ */ jsx("div", {
|
|
80
|
+
id: listId,
|
|
81
|
+
role: "listbox",
|
|
82
|
+
"aria-label": "Commands",
|
|
83
|
+
className: "border-border flex max-h-72 flex-col overflow-y-auto border-t p-1.5",
|
|
84
|
+
children: groups.map((group) => /* @__PURE__ */ jsxs("div", {
|
|
85
|
+
role: "group",
|
|
86
|
+
"aria-label": group,
|
|
87
|
+
className: "flex flex-col",
|
|
88
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
89
|
+
"aria-hidden": true,
|
|
90
|
+
className: cn(mono, "text-fg-subtle px-2 pt-2 pb-1"),
|
|
91
|
+
children: group
|
|
92
|
+
}), matches.filter((command) => command.group === group).map((command) => /* @__PURE__ */ jsxs("button", {
|
|
93
|
+
id: optionId(command.id),
|
|
94
|
+
type: "button",
|
|
95
|
+
role: "option",
|
|
96
|
+
tabIndex: -1,
|
|
97
|
+
"aria-selected": command.id === activeId,
|
|
98
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
99
|
+
onClick: () => onRun?.(command.id),
|
|
100
|
+
className: cn("flex items-center gap-2 rounded-(--radius-surface) px-2 py-1.5 text-start transition-colors", command.id === activeId ? "bg-surface-2" : "hover:bg-surface-1"),
|
|
101
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
102
|
+
className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
103
|
+
children: command.label
|
|
104
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
105
|
+
className: "flex shrink-0 gap-1",
|
|
106
|
+
children: command.keys.map((key) => /* @__PURE__ */ jsx("span", {
|
|
107
|
+
className: cn(field, mono, "text-fg-subtle rounded-(--radius-control) px-1.5 py-0.5"),
|
|
108
|
+
children: key
|
|
109
|
+
}, key))
|
|
110
|
+
})]
|
|
111
|
+
}, command.id))]
|
|
112
|
+
}, group))
|
|
113
|
+
}),
|
|
114
|
+
matches.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
115
|
+
className: "border-border border-t p-1.5",
|
|
116
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
117
|
+
className: "text-fg-subtle block px-2 py-4 text-center text-(length:--cue-text-ui) break-words",
|
|
118
|
+
children: [
|
|
119
|
+
"No command matches “",
|
|
120
|
+
query,
|
|
121
|
+
"”"
|
|
122
|
+
]
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
]
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
export { ElementsCommandPalette };
|