@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,80 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, ghostButton, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { ArrowUpIcon, XIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/message-queue.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Turns you typed while a run was in flight, stacked and cancelable until it finishes.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { MessageQueue } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <MessageQueue
|
|
14
|
+
* running="Fix the converter and add a guard"
|
|
15
|
+
* queued={[{ id: "a", text: "Also add a changeset" }]}
|
|
16
|
+
* onCancel={(id) => drop(id)}
|
|
17
|
+
* />
|
|
18
|
+
*/
|
|
19
|
+
function MessageQueue({ running, queued, onCancel, className, ...props }) {
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
"data-slot": "message-queue",
|
|
22
|
+
className: cn("flex w-full max-w-sm flex-col gap-2", className),
|
|
23
|
+
...props,
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ jsxs("div", {
|
|
26
|
+
className: cn(paper, "flex items-center gap-2.5 rounded-(--radius-overlay) p-3"),
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsxs("span", {
|
|
29
|
+
className: "relative flex size-2 shrink-0",
|
|
30
|
+
children: [/* @__PURE__ */ jsx("span", { className: "absolute inline-flex size-full animate-ping rounded-full bg-stream/60 motion-reduce:hidden" }), /* @__PURE__ */ jsx("span", { className: "relative inline-flex size-2 rounded-full bg-stream" })]
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ jsx("span", {
|
|
33
|
+
className: "text-fg min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
34
|
+
children: running
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ jsx("span", {
|
|
37
|
+
className: cn(mono, "text-fg-subtle shrink-0"),
|
|
38
|
+
children: "running"
|
|
39
|
+
})
|
|
40
|
+
]
|
|
41
|
+
}),
|
|
42
|
+
queued.length > 0 && /* @__PURE__ */ jsxs("div", {
|
|
43
|
+
className: "flex items-baseline justify-between px-1",
|
|
44
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
45
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
|
|
46
|
+
children: [queued.length, " queued"]
|
|
47
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
48
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle"),
|
|
49
|
+
children: "sends when this finishes"
|
|
50
|
+
})]
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsx("ul", {
|
|
53
|
+
className: "flex flex-col gap-1.5",
|
|
54
|
+
children: queued.map((message, index) => /* @__PURE__ */ jsxs("li", {
|
|
55
|
+
className: cn(field, "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex items-center gap-2.5 rounded-(--radius-overlay) py-2 pr-2 pl-3 duration-300"),
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsx("span", {
|
|
58
|
+
className: cn(mono, "text-fg-subtle w-3 shrink-0 tabular-nums"),
|
|
59
|
+
children: index + 1
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ jsx("span", {
|
|
62
|
+
className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
63
|
+
children: message.text
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ jsx(ArrowUpIcon, { className: "text-fg-subtle size-3 shrink-0" }),
|
|
66
|
+
/* @__PURE__ */ jsx("button", {
|
|
67
|
+
type: "button",
|
|
68
|
+
"aria-label": `Remove "${message.text}" from the queue`,
|
|
69
|
+
onClick: () => onCancel?.(message.id),
|
|
70
|
+
className: cn(ghostButton, "size-6 shrink-0"),
|
|
71
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5" })
|
|
72
|
+
})
|
|
73
|
+
]
|
|
74
|
+
}, message.id))
|
|
75
|
+
})
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { MessageQueue };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/message-timing.d.ts
|
|
3
|
+
/** One measurement of a finished turn — a label and an already-formatted value. */
|
|
4
|
+
interface TimingStat {
|
|
5
|
+
/** What was measured: `ttft`, `tok/s`, `cost`. Also the row's key. */
|
|
6
|
+
label: string;
|
|
7
|
+
/** The measurement, formatted by the caller. This element does no arithmetic. */
|
|
8
|
+
value: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* What the turn cost: time to first token, throughput, tokens, money.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { MessageTiming } from "@cueplusplus/ui/elements";
|
|
15
|
+
*
|
|
16
|
+
* <MessageTiming
|
|
17
|
+
* stats={[
|
|
18
|
+
* { label: "ttft", value: "0.4s" },
|
|
19
|
+
* { label: "total", value: "2.6s" },
|
|
20
|
+
* ]}
|
|
21
|
+
* />
|
|
22
|
+
*/
|
|
23
|
+
declare function MessageTiming({ stats, streaming, className, ...props }: Omit<ComponentProps<"div">, "children" | "stats" | "streaming"> & {
|
|
24
|
+
/**
|
|
25
|
+
* Label and value pairs, pre-formatted. Show fewer while streaming and the full set
|
|
26
|
+
* once the turn settles.
|
|
27
|
+
*/
|
|
28
|
+
stats: readonly TimingStat[];
|
|
29
|
+
/** Tints the values blue while they are still moving. */
|
|
30
|
+
streaming?: boolean;
|
|
31
|
+
}): import("react").JSX.Element;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { MessageTiming, TimingStat };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/elements/message-timing.tsx
|
|
6
|
+
/**
|
|
7
|
+
* What the turn cost: time to first token, throughput, tokens, money.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { MessageTiming } from "@cueplusplus/ui/elements";
|
|
11
|
+
*
|
|
12
|
+
* <MessageTiming
|
|
13
|
+
* stats={[
|
|
14
|
+
* { label: "ttft", value: "0.4s" },
|
|
15
|
+
* { label: "total", value: "2.6s" },
|
|
16
|
+
* ]}
|
|
17
|
+
* />
|
|
18
|
+
*/
|
|
19
|
+
function MessageTiming({ stats, streaming, className, ...props }) {
|
|
20
|
+
return /* @__PURE__ */ jsx("div", {
|
|
21
|
+
"data-slot": "message-timing",
|
|
22
|
+
className: cn("cue-elements-fade-in cue-elements-animate-in flex w-full max-w-sm flex-wrap items-center gap-x-3 gap-y-1 duration-500", className),
|
|
23
|
+
...props,
|
|
24
|
+
children: stats.map((stat) => /* @__PURE__ */ jsxs("span", {
|
|
25
|
+
className: "flex items-baseline gap-1",
|
|
26
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
27
|
+
className: cn(mono, "text-fg-subtle"),
|
|
28
|
+
children: stat.label
|
|
29
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
30
|
+
className: cn(mono, "tabular-nums", streaming ? "text-stream" : "text-fg-muted"),
|
|
31
|
+
children: stat.value
|
|
32
|
+
})]
|
|
33
|
+
}, stat.label))
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { MessageTiming };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/mobile-composer.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* The bottom sheet: keyboard-aware, quick actions above, thumb-sized targets.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { MobileComposer } from "@cueplusplus/ui/elements";
|
|
8
|
+
*
|
|
9
|
+
* <MobileComposer
|
|
10
|
+
* value={value}
|
|
11
|
+
* keyboardOpen={keyboardOpen}
|
|
12
|
+
* running={false}
|
|
13
|
+
* actions={actions}
|
|
14
|
+
* onValueChange={setValue}
|
|
15
|
+
* onSend={send}
|
|
16
|
+
* />
|
|
17
|
+
*/
|
|
18
|
+
declare function MobileComposer({ value, keyboardOpen, running, actions, onAction, onAttach, onValueChange, onSend, onStop, onFocus, className, ...props }: Omit<ComponentProps<"div">, "children" | "value" | "keyboardOpen" | "running" | "actions" | "onAction" | "onAttach" | "onValueChange" | "onSend" | "onStop" | "onFocus"> & {
|
|
19
|
+
/** Current input. The field is 16px so iOS does not zoom on focus. */
|
|
20
|
+
value: string;
|
|
21
|
+
/** Collapses the quick actions and the home indicator inset when the keyboard is up. */
|
|
22
|
+
keyboardOpen: boolean;
|
|
23
|
+
/** Swaps send for stop, and suppresses Return-to-send while a run is in flight. */
|
|
24
|
+
running: boolean;
|
|
25
|
+
/** Quick actions above the field, scrolled horizontally. */
|
|
26
|
+
actions: readonly string[];
|
|
27
|
+
/**
|
|
28
|
+
* Called when a quick action is tapped. Omit it and the chips render disabled, since
|
|
29
|
+
* actions is required and the row would otherwise be inert.
|
|
30
|
+
*/
|
|
31
|
+
onAction?: (action: string) => void;
|
|
32
|
+
/** Called from the attachment control. Omit it and the control renders disabled. */
|
|
33
|
+
onAttach?: () => void;
|
|
34
|
+
/** Called as the message is typed. */
|
|
35
|
+
onValueChange?: (value: string) => void;
|
|
36
|
+
/** Called to send. */
|
|
37
|
+
onSend?: () => void;
|
|
38
|
+
/** Called to stop a run in flight. */
|
|
39
|
+
onStop?: () => void;
|
|
40
|
+
/** Called when the field takes focus; drive keyboardOpen from it. */
|
|
41
|
+
onFocus?: () => void;
|
|
42
|
+
}): import("react").JSX.Element;
|
|
43
|
+
//#endregion
|
|
44
|
+
export { MobileComposer };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, ghostButton, inkButton } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { ArrowUpIcon, MicIcon, PlusIcon, SquareIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/mobile-composer.tsx
|
|
7
|
+
/**
|
|
8
|
+
* The bottom sheet: keyboard-aware, quick actions above, thumb-sized targets.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { MobileComposer } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <MobileComposer
|
|
14
|
+
* value={value}
|
|
15
|
+
* keyboardOpen={keyboardOpen}
|
|
16
|
+
* running={false}
|
|
17
|
+
* actions={actions}
|
|
18
|
+
* onValueChange={setValue}
|
|
19
|
+
* onSend={send}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function MobileComposer({ value, keyboardOpen, running, actions, onAction, onAttach, onValueChange, onSend, onStop, onFocus, className, ...props }) {
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
"data-slot": "mobile-composer",
|
|
25
|
+
className: cn("bg-bg border-border flex w-full max-w-[19rem] flex-col gap-2.5 rounded-t-(--radius-overlay) border-t px-3 pt-3", keyboardOpen ? "pb-3" : "pb-6", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [
|
|
28
|
+
!keyboardOpen && /* @__PURE__ */ jsx("div", {
|
|
29
|
+
className: "cue-elements-fade-in cue-elements-animate-in -mx-3 flex gap-1.5 overflow-x-auto px-3 pb-0.5 duration-200",
|
|
30
|
+
children: actions.map((action) => /* @__PURE__ */ jsx("button", {
|
|
31
|
+
type: "button",
|
|
32
|
+
onClick: () => onAction?.(action),
|
|
33
|
+
disabled: !onAction,
|
|
34
|
+
className: cn("disabled:pointer-events-none", "bg-fg/[0.06]", "text-fg-muted shrink-0 rounded-full px-3 py-1.5 text-(length:--cue-text-ui) whitespace-nowrap"),
|
|
35
|
+
children: action
|
|
36
|
+
}, action))
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ jsxs("div", {
|
|
39
|
+
className: "flex items-end gap-2",
|
|
40
|
+
children: [
|
|
41
|
+
/* @__PURE__ */ jsx("button", {
|
|
42
|
+
type: "button",
|
|
43
|
+
"aria-label": "Add an attachment",
|
|
44
|
+
onClick: onAttach,
|
|
45
|
+
disabled: !onAttach,
|
|
46
|
+
className: cn(ghostButton, field, "size-9 shrink-0 disabled:pointer-events-none disabled:opacity-30"),
|
|
47
|
+
children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-4" })
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ jsxs("div", {
|
|
50
|
+
className: cn(field, "flex min-w-0 flex-1 items-center gap-2 rounded-(--radius-overlay) px-3 py-2"),
|
|
51
|
+
children: [/* @__PURE__ */ jsx("input", {
|
|
52
|
+
value,
|
|
53
|
+
onChange: (event) => onValueChange?.(event.target.value),
|
|
54
|
+
onFocus,
|
|
55
|
+
onKeyDown: (event) => {
|
|
56
|
+
if (event.key !== "Enter" || event.shiftKey) return;
|
|
57
|
+
if (event.nativeEvent.isComposing) return;
|
|
58
|
+
event.preventDefault();
|
|
59
|
+
if (!running && value !== "") onSend?.();
|
|
60
|
+
},
|
|
61
|
+
placeholder: "Message",
|
|
62
|
+
"aria-label": "Message",
|
|
63
|
+
className: "text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-emphasis) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
|
|
64
|
+
}), value === "" && /* @__PURE__ */ jsx(MicIcon, { className: "text-fg-subtle size-4 shrink-0" })]
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ jsx("button", {
|
|
67
|
+
type: "button",
|
|
68
|
+
"aria-label": running ? "Stop" : "Send",
|
|
69
|
+
onClick: running ? onStop : onSend,
|
|
70
|
+
disabled: !running && value === "",
|
|
71
|
+
className: cn(inkButton, "flex size-9 shrink-0 items-center justify-center rounded-full disabled:pointer-events-none disabled:opacity-25"),
|
|
72
|
+
children: running ? /* @__PURE__ */ jsx(SquareIcon, { className: "size-3 fill-current" }) : /* @__PURE__ */ jsx(ArrowUpIcon, { className: "size-4" })
|
|
73
|
+
})
|
|
74
|
+
]
|
|
75
|
+
}),
|
|
76
|
+
!keyboardOpen && /* @__PURE__ */ jsx("span", {
|
|
77
|
+
"aria-hidden": true,
|
|
78
|
+
className: "bg-surface-3 mx-auto h-1 w-28 rounded-full"
|
|
79
|
+
}),
|
|
80
|
+
keyboardOpen && /* @__PURE__ */ jsx("span", {
|
|
81
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle text-center"),
|
|
82
|
+
children: "return to send"
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
export { MobileComposer };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/model-picker.d.ts
|
|
3
|
+
interface PickableModel {
|
|
4
|
+
/** Stable identity, compared against selectedId and reported by onSelect. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Display name of the model. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Group heading the model sits under. */
|
|
9
|
+
family: string;
|
|
10
|
+
/** Window size, pre-formatted. */
|
|
11
|
+
context: string;
|
|
12
|
+
/** Cost, pre-formatted. The element never does currency math. */
|
|
13
|
+
price: string;
|
|
14
|
+
/** Short capability chips: vision, tools, thinking. */
|
|
15
|
+
capabilities: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The full list rather than the rail: grouped by family, priced, with what each one
|
|
19
|
+
* can do.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* import { ModelPicker } from "@cueplusplus/ui/elements";
|
|
23
|
+
*
|
|
24
|
+
* <ModelPicker models={models} selectedId={selectedId} onSelect={setSelectedId} />
|
|
25
|
+
*/
|
|
26
|
+
declare function ModelPicker({ models, selectedId, onSelect, className, ...props }: Omit<ComponentProps<"div">, "children" | "models" | "selectedId" | "onSelect"> & {
|
|
27
|
+
/**
|
|
28
|
+
* Every model on offer. Families are derived from the entries and keep their
|
|
29
|
+
* first-seen order.
|
|
30
|
+
*/
|
|
31
|
+
models: readonly PickableModel[];
|
|
32
|
+
/** Which model is active. */
|
|
33
|
+
selectedId: string;
|
|
34
|
+
/** Called when a model is picked. */
|
|
35
|
+
onSelect?: (id: string) => void;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { ModelPicker, PickableModel };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/model-picker.tsx
|
|
7
|
+
/**
|
|
8
|
+
* The full list rather than the rail: grouped by family, priced, with what each one
|
|
9
|
+
* can do.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { ModelPicker } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <ModelPicker models={models} selectedId={selectedId} onSelect={setSelectedId} />
|
|
15
|
+
*/
|
|
16
|
+
function ModelPicker({ models, selectedId, onSelect, className, ...props }) {
|
|
17
|
+
const families = [...new Set(models.map((model) => model.family))];
|
|
18
|
+
return /* @__PURE__ */ jsx("div", {
|
|
19
|
+
"data-slot": "model-picker",
|
|
20
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-1 rounded-(--radius-overlay) p-2", className),
|
|
21
|
+
...props,
|
|
22
|
+
children: families.map((family) => /* @__PURE__ */ jsxs("div", {
|
|
23
|
+
className: "flex flex-col",
|
|
24
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
25
|
+
className: cn(mono, "text-fg-subtle px-2 pt-2 pb-1"),
|
|
26
|
+
children: family
|
|
27
|
+
}), models.filter((model) => model.family === family).map((model) => {
|
|
28
|
+
const selected = model.id === selectedId;
|
|
29
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
30
|
+
type: "button",
|
|
31
|
+
"aria-pressed": selected,
|
|
32
|
+
onClick: () => onSelect?.(model.id),
|
|
33
|
+
className: cn("flex items-center gap-2.5 rounded-(--radius-surface) px-2 py-2 text-start transition-colors", selected ? "bg-surface-2" : "hover:bg-surface-1"),
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsx("span", {
|
|
36
|
+
className: "flex size-3.5 shrink-0 items-center justify-center",
|
|
37
|
+
children: selected && /* @__PURE__ */ jsx(CheckIcon, { className: "cue-elements-fade-in cue-elements-zoom-in-90 cue-elements-animate-in text-fg-muted size-3.5 duration-200" })
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ jsxs("span", {
|
|
40
|
+
className: "flex min-w-0 flex-1 flex-col gap-1",
|
|
41
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
42
|
+
className: "truncate text-(length:--cue-text-body)",
|
|
43
|
+
children: model.name
|
|
44
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
45
|
+
className: "flex flex-wrap gap-1",
|
|
46
|
+
children: model.capabilities.map((capability) => /* @__PURE__ */ jsx("span", {
|
|
47
|
+
className: cn(field, mono, "text-fg-muted rounded-(--radius-control) px-1 py-px"),
|
|
48
|
+
children: capability
|
|
49
|
+
}, capability))
|
|
50
|
+
})]
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsxs("span", {
|
|
53
|
+
className: "flex shrink-0 flex-col items-end gap-1",
|
|
54
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
55
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
56
|
+
children: model.context
|
|
57
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
58
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
59
|
+
children: model.price
|
|
60
|
+
})]
|
|
61
|
+
})
|
|
62
|
+
]
|
|
63
|
+
}, model.id);
|
|
64
|
+
})]
|
|
65
|
+
}, family))
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { ModelPicker };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/number-ticker.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Digits that roll into place as a count updates in real time.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { NumberTicker } from "@cueplusplus/ui/elements";
|
|
8
|
+
*
|
|
9
|
+
* <NumberTicker value={1284} label="tokens / sec" />
|
|
10
|
+
*/
|
|
11
|
+
declare function NumberTicker({ value, label, className, ...props }: Omit<ComponentProps<"div">, "children" | "value" | "label"> & {
|
|
12
|
+
/** Numeric value whose digits roll into place as it changes. */
|
|
13
|
+
value: number;
|
|
14
|
+
/** Mono caption rendered under the rolling number. */
|
|
15
|
+
label: string;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { NumberTicker };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/elements/number-ticker.tsx
|
|
6
|
+
function RollingDigit({ digit }) {
|
|
7
|
+
return /* @__PURE__ */ jsx("span", {
|
|
8
|
+
className: "inline-flex h-[1.15em] overflow-hidden",
|
|
9
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
10
|
+
className: "flex flex-col transition-transform duration-500 ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:transition-none",
|
|
11
|
+
style: { transform: `translateY(-${digit * 1.15}em)` },
|
|
12
|
+
children: Array.from({ length: 10 }, (_, i) => /* @__PURE__ */ jsx("span", {
|
|
13
|
+
className: "h-[1.15em] leading-[1.15]",
|
|
14
|
+
children: i
|
|
15
|
+
}, i))
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Digits that roll into place as a count updates in real time.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* import { NumberTicker } from "@cueplusplus/ui/elements";
|
|
24
|
+
*
|
|
25
|
+
* <NumberTicker value={1284} label="tokens / sec" />
|
|
26
|
+
*/
|
|
27
|
+
function NumberTicker({ value, label, className, ...props }) {
|
|
28
|
+
const formatted = value.toLocaleString("en-US");
|
|
29
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
30
|
+
"data-slot": "number-ticker",
|
|
31
|
+
className: cn("flex flex-col items-center gap-2.5", className),
|
|
32
|
+
...props,
|
|
33
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
34
|
+
className: "flex text-(length:--cue-text-title) font-medium tracking-tight tabular-nums",
|
|
35
|
+
"aria-label": formatted,
|
|
36
|
+
children: formatted.split("").map((char, i) => /\d/.test(char) ? /* @__PURE__ */ jsx(RollingDigit, { digit: Number(char) }, i) : /* @__PURE__ */ jsx("span", {
|
|
37
|
+
className: "h-[1.15em] leading-[1.15]",
|
|
38
|
+
children: char
|
|
39
|
+
}, i))
|
|
40
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
41
|
+
className: cn(mono, "text-fg-subtle"),
|
|
42
|
+
children: label
|
|
43
|
+
})]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { NumberTicker };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/onboarding.d.ts
|
|
3
|
+
interface OnboardingStep {
|
|
4
|
+
/** Step heading. */
|
|
5
|
+
title: string;
|
|
6
|
+
/** What this step teaches, in a sentence or two. */
|
|
7
|
+
body: string;
|
|
8
|
+
/** A prompt the user could actually send. Showing beats describing. */
|
|
9
|
+
example: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* First run: three moves that teach what this assistant is actually for.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { Onboarding } from "@cueplusplus/ui/elements";
|
|
16
|
+
*
|
|
17
|
+
* <Onboarding steps={steps} index={index} onNext={next} onSkip={skip} />
|
|
18
|
+
*/
|
|
19
|
+
declare function Onboarding({ steps, index, onNext, onSkip, className, ...props }: Omit<ComponentProps<"div">, "children" | "steps" | "index" | "onNext" | "onSkip"> & {
|
|
20
|
+
/** What to teach, in order. Three is usually the limit before it is skipped. */
|
|
21
|
+
steps: readonly OnboardingStep[];
|
|
22
|
+
/** Which step is showing. The final step's action reads Start instead of Next. */
|
|
23
|
+
index: number;
|
|
24
|
+
/** Called to advance. */
|
|
25
|
+
onNext?: () => void;
|
|
26
|
+
/** Called to dismiss. Always offer it. */
|
|
27
|
+
onSkip?: () => void;
|
|
28
|
+
}): import("react").JSX.Element | null;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { Onboarding, OnboardingStep };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, inkButton, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { indexIn } from "./range.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/elements/onboarding.tsx
|
|
7
|
+
/**
|
|
8
|
+
* First run: three moves that teach what this assistant is actually for.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { Onboarding } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <Onboarding steps={steps} index={index} onNext={next} onSkip={skip} />
|
|
14
|
+
*/
|
|
15
|
+
function Onboarding({ steps, index, onNext, onSkip, className, ...props }) {
|
|
16
|
+
const current = indexIn(steps, index);
|
|
17
|
+
const step = steps[current];
|
|
18
|
+
if (!step) return null;
|
|
19
|
+
const last = current >= steps.length - 1;
|
|
20
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
"data-slot": "onboarding",
|
|
22
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-4 rounded-(--radius-overlay) p-5", className),
|
|
23
|
+
...props,
|
|
24
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
25
|
+
className: "cue-elements-fade-in cue-elements-animate-in flex flex-col gap-2 duration-300",
|
|
26
|
+
children: [
|
|
27
|
+
/* @__PURE__ */ jsxs("span", {
|
|
28
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
29
|
+
children: [
|
|
30
|
+
current + 1,
|
|
31
|
+
" of ",
|
|
32
|
+
steps.length
|
|
33
|
+
]
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ jsx("span", {
|
|
36
|
+
className: "text-(length:--cue-text-emphasis) font-medium tracking-tight",
|
|
37
|
+
children: step.title
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ jsx("p", {
|
|
40
|
+
className: "text-fg-muted text-(length:--cue-text-body) leading-relaxed break-words",
|
|
41
|
+
children: step.body
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ jsx("span", {
|
|
44
|
+
className: cn(field, "text-fg-muted rounded-(--radius-surface) px-3 py-2 text-(length:--cue-text-body) leading-relaxed"),
|
|
45
|
+
children: step.example
|
|
46
|
+
})
|
|
47
|
+
]
|
|
48
|
+
}, current), /* @__PURE__ */ jsxs("div", {
|
|
49
|
+
className: "flex items-center gap-2",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", {
|
|
52
|
+
className: "flex gap-1.5",
|
|
53
|
+
children: steps.map((_, i) => /* @__PURE__ */ jsx("span", {
|
|
54
|
+
"aria-hidden": true,
|
|
55
|
+
className: cn("h-1 rounded-full transition-all duration-300 motion-reduce:transition-none", i === current ? "bg-accent w-4" : "bg-surface-3 w-1")
|
|
56
|
+
}, i))
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ jsx("button", {
|
|
59
|
+
type: "button",
|
|
60
|
+
onClick: onSkip,
|
|
61
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg ms-auto h-8 rounded-full px-3 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96]",
|
|
62
|
+
children: "Skip"
|
|
63
|
+
}),
|
|
64
|
+
/* @__PURE__ */ jsx("button", {
|
|
65
|
+
type: "button",
|
|
66
|
+
onClick: onNext,
|
|
67
|
+
className: cn(inkButton, "flex h-8 items-center rounded-full px-3.5 text-(length:--cue-text-ui) font-medium"),
|
|
68
|
+
children: last ? "Start" : "Next"
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { Onboarding };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/permission-grant.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* How far a granted permission reaches — this session, every session, or nowhere. The
|
|
5
|
+
* prop that carries it also accepts `pending`, before the user has answered.
|
|
6
|
+
*/
|
|
7
|
+
type GrantScope = "session" | "always" | "denied";
|
|
8
|
+
/**
|
|
9
|
+
* Granting a capability rather than approving one action, with the reach spelled out.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { PermissionGrant } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <PermissionGrant
|
|
15
|
+
* capability="Filesystem access"
|
|
16
|
+
* requester="filesystem-mcp"
|
|
17
|
+
* reach={reach}
|
|
18
|
+
* scope="pending"
|
|
19
|
+
* onGrant={setScope}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
declare function PermissionGrant({ capability, requester, reach, scope, onGrant, className, ...props }: Omit<ComponentProps<"div">, "children" | "capability" | "requester" | "reach" | "scope" | "onGrant"> & {
|
|
23
|
+
/** What is being granted, named as a capability rather than an action. */
|
|
24
|
+
capability: string;
|
|
25
|
+
/** Who is asking. */
|
|
26
|
+
requester: string;
|
|
27
|
+
/** Exactly what the grant covers, and what it does not. Write the limits in too. */
|
|
28
|
+
reach: readonly string[];
|
|
29
|
+
/** pending shows the choices; anything else shows the settled outcome. */
|
|
30
|
+
scope: GrantScope | "pending";
|
|
31
|
+
/** Called with the scope the user chose. */
|
|
32
|
+
onGrant?: (scope: GrantScope) => void;
|
|
33
|
+
}): import("react").JSX.Element;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { GrantScope, PermissionGrant };
|