@cueplusplus/ui 0.2.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 +2250 -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/brand/_chassis.d.ts +1 -1
- package/dist/brand/cue-mark.d.ts +1 -1
- package/dist/brand/cue-mark.js +1 -1
- 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/_edge-scroller.js +12 -1
- package/dist/chrome/_tabs-scroll.d.ts +1 -1
- package/dist/chrome/_tabs-scroll.js +1 -1
- 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/_overrides.js +18 -6
- 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 +9 -7
- package/dist/index.js +3 -2
- package/dist/instruments/index.d.ts +2 -2
- package/dist/instruments/index.js +2 -2
- package/dist/instruments/table.d.ts +14 -1
- package/dist/instruments/table.js +20 -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 +34 -8
- package/dist/primitives/chip.js +97 -11
- package/dist/styles.css +11 -1
- package/dist/system/agent-skin.d.ts +27 -0
- package/dist/system/agent-skin.js +20 -0
- package/dist/system/index.d.ts +3 -3
- package/dist/system/portal.d.ts +5 -3
- package/dist/system/portal.js +36 -8
- package/dist/system/prepaint.d.ts +20 -2
- package/dist/system/prepaint.js +39 -33
- package/dist/system/theme-provider.d.ts +13 -2
- package/dist/system/theme-provider.js +107 -26
- 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 +124 -8
- package/dist/theming/contrast.d.ts +16 -4
- package/dist/theming/contrast.js +33 -6
- package/dist/theming/create-theme.d.ts +8 -4
- package/dist/theming/create-theme.js +56 -20
- package/dist/theming/serialize.d.ts +11 -2
- package/dist/theming/serialize.js +87 -9
- package/manifest/components/accordion.json +154 -0
- 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-pile.json +116 -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 +190 -0
- package/manifest/components/animated-number.json +67 -0
- package/manifest/components/app-bar.json +244 -0
- package/manifest/components/app-shell.json +383 -0
- package/manifest/components/app-window-frame.json +102 -0
- package/manifest/components/approval-card.json +106 -0
- package/manifest/components/artifact-card.json +81 -0
- package/manifest/components/ask-box.json +209 -0
- package/manifest/components/audience-icon.json +52 -0
- package/manifest/components/autocomplete.json +197 -0
- package/manifest/components/avatar-group.json +72 -0
- package/manifest/components/avatar.json +95 -0
- package/manifest/components/background-inbox.json +71 -0
- package/manifest/components/branch-picker.json +124 -0
- package/manifest/components/breadcrumb.json +74 -0
- package/manifest/components/button-group.json +74 -0
- package/manifest/components/button.json +126 -0
- package/manifest/components/calendar.json +65 -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/card.json +140 -0
- package/manifest/components/carousel.json +200 -0
- package/manifest/components/catalogue-icon.json +52 -0
- package/manifest/components/channel-beta-icon.json +52 -0
- package/manifest/components/channel-matrix.json +173 -0
- package/manifest/components/channel-released-icon.json +52 -0
- package/manifest/components/chart-container.json +111 -0
- package/manifest/components/chart-ramp.json +72 -0
- package/manifest/components/chart-swatch.json +65 -0
- package/manifest/components/chart-tooltip-content.json +114 -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/checkbox-group.json +68 -0
- package/manifest/components/checkbox.json +93 -0
- package/manifest/components/checkpoint-history.json +80 -0
- package/manifest/components/chip.json +144 -0
- 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/collapsible.json +120 -0
- package/manifest/components/color-area.json +59 -0
- package/manifest/components/color-field.json +79 -0
- package/manifest/components/color-picker.json +175 -0
- package/manifest/components/color-slider.json +75 -0
- package/manifest/components/color-swatch.json +68 -0
- package/manifest/components/colors-section.json +66 -0
- package/manifest/components/combobox.json +198 -0
- package/manifest/components/command-palette.json +177 -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/composer.json +176 -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/container.json +60 -0
- package/manifest/components/context-breakdown.json +65 -0
- package/manifest/components/context-menu.json +121 -0
- package/manifest/components/context-usage.json +85 -0
- package/manifest/components/conversation-search.json +92 -0
- package/manifest/components/copy-button.json +93 -0
- package/manifest/components/cost-meter.json +74 -0
- package/manifest/components/cue-logotype.json +96 -0
- package/manifest/components/cue-mark.json +97 -0
- package/manifest/components/cue-portal-frame.json +55 -0
- package/manifest/components/data-table-pagination.json +83 -0
- package/manifest/components/data-table-toolbar.json +104 -0
- package/manifest/components/date-field.json +80 -0
- package/manifest/components/date-picker.json +191 -0
- package/manifest/components/date-range-picker.json +191 -0
- package/manifest/components/day-separator.json +58 -0
- package/manifest/components/delegation-card.json +144 -0
- package/manifest/components/density.json +58 -0
- package/manifest/components/description-list.json +84 -0
- package/manifest/components/diagram.json +100 -0
- package/manifest/components/dialog.json +198 -0
- package/manifest/components/disclosure.json +109 -0
- package/manifest/components/dmx-bar.json +94 -0
- package/manifest/components/dmx-strip.json +101 -0
- package/manifest/components/document-reference.json +90 -0
- package/manifest/components/draft-restore.json +82 -0
- package/manifest/components/drawer.json +179 -0
- package/manifest/components/dropdown-menu.json +229 -0
- 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/empty-state.json +90 -0
- package/manifest/components/end-of-turn-summary.json +77 -0
- package/manifest/components/env-var-input.json +150 -0
- package/manifest/components/error-state.json +80 -0
- package/manifest/components/export-dialog.json +84 -0
- package/manifest/components/eyebrow.json +56 -0
- package/manifest/components/feedback-dialog.json +107 -0
- package/manifest/components/field-description.json +63 -0
- package/manifest/components/field-error.json +77 -0
- package/manifest/components/field-label.json +63 -0
- package/manifest/components/field.json +79 -0
- package/manifest/components/file-tree.json +83 -0
- package/manifest/components/file-upload.json +159 -0
- package/manifest/components/flow-background.json +50 -0
- package/manifest/components/flow-controls.json +50 -0
- package/manifest/components/flow-graph.json +75 -0
- package/manifest/components/folder-icon.json +52 -0
- package/manifest/components/footer.json +112 -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/grid.json +81 -0
- package/manifest/components/group-bar.json +102 -0
- package/manifest/components/guardrail-notice.json +91 -0
- package/manifest/components/hover-card.json +151 -0
- package/manifest/components/icon-button.json +88 -0
- package/manifest/components/image-generation.json +67 -0
- package/manifest/components/info-tip.json +98 -0
- package/manifest/components/inline-citation.json +77 -0
- package/manifest/components/input-group.json +91 -0
- package/manifest/components/input.json +89 -0
- package/manifest/components/item.json +129 -0
- package/manifest/components/job-progress.json +96 -0
- package/manifest/components/kbd.json +52 -0
- package/manifest/components/launcher-bubble.json +105 -0
- package/manifest/components/link.json +81 -0
- package/manifest/components/live-region-announcer.json +79 -0
- package/manifest/components/log-viewer.json +139 -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/menubar.json +157 -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 +100 -0
- 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/message.json +116 -0
- package/manifest/components/meter.json +114 -0
- package/manifest/components/mobile-composer.json +126 -0
- package/manifest/components/model-picker.json +76 -0
- package/manifest/components/multi-select.json +190 -0
- package/manifest/components/musical-time-input.json +113 -0
- package/manifest/components/navigation-menu.json +226 -0
- package/manifest/components/node-card.json +109 -0
- package/manifest/components/node-handle.json +69 -0
- package/manifest/components/number-field.json +107 -0
- package/manifest/components/number-ticker.json +61 -0
- package/manifest/components/onboarding.json +84 -0
- package/manifest/components/otp-field.json +128 -0
- package/manifest/components/page-shell.json +96 -0
- package/manifest/components/pagination.json +92 -0
- package/manifest/components/panel-header.json +77 -0
- package/manifest/components/panel.json +71 -0
- package/manifest/components/password-input.json +119 -0
- package/manifest/components/permission-grant.json +92 -0
- package/manifest/components/permission-scopes.json +139 -0
- package/manifest/components/piano-keyboard.json +120 -0
- package/manifest/components/plussie.json +111 -0
- package/manifest/components/popover.json +193 -0
- package/manifest/components/preset-section.json +73 -0
- package/manifest/components/progress.json +95 -0
- 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/radio-group.json +73 -0
- package/manifest/components/radio.json +80 -0
- package/manifest/components/rating.json +141 -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/resizable.json +88 -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/row.json +109 -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 +91 -0
- package/manifest/components/scrollable-tabs-list.json +83 -0
- package/manifest/components/scrub-input.json +200 -0
- package/manifest/components/seam-cell.json +75 -0
- package/manifest/components/seam-grid.json +75 -0
- package/manifest/components/seam-list.json +56 -0
- package/manifest/components/search-input.json +134 -0
- package/manifest/components/section-header.json +112 -0
- package/manifest/components/segmented-control.json +138 -0
- package/manifest/components/select.json +194 -0
- package/manifest/components/separator.json +53 -0
- package/manifest/components/settings-panel.json +118 -0
- package/manifest/components/shape-section.json +66 -0
- package/manifest/components/shared-conversation.json +89 -0
- package/manifest/components/sheet.json +186 -0
- package/manifest/components/shimmer-label.json +59 -0
- package/manifest/components/sidebar.json +198 -0
- package/manifest/components/signal-edge.json +56 -0
- package/manifest/components/skeleton.json +46 -0
- package/manifest/components/skill-icon.json +52 -0
- package/manifest/components/slider.json +89 -0
- package/manifest/components/sources.json +83 -0
- package/manifest/components/sparkline.json +76 -0
- package/manifest/components/speaker-identity.json +61 -0
- package/manifest/components/spec-sheet.json +80 -0
- package/manifest/components/spectrum-visualizer.json +115 -0
- package/manifest/components/spinner.json +61 -0
- package/manifest/components/stack-icon.json +52 -0
- package/manifest/components/stack.json +96 -0
- package/manifest/components/stacks-matrix-icon.json +52 -0
- package/manifest/components/stat.json +87 -0
- package/manifest/components/status-bar.json +58 -0
- package/manifest/components/status-dot.json +78 -0
- package/manifest/components/stepper.json +89 -0
- 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/switch.json +87 -0
- package/manifest/components/table-scroll-region.json +69 -0
- package/manifest/components/table.json +155 -0
- package/manifest/components/tabs.json +145 -0
- package/manifest/components/tags-input.json +190 -0
- package/manifest/components/tail-status.json +109 -0
- package/manifest/components/terminal-block.json +91 -0
- package/manifest/components/terminal-frame.json +119 -0
- package/manifest/components/textarea.json +76 -0
- package/manifest/components/theme-configurator.json +124 -0
- package/manifest/components/theme-provider.json +134 -0
- 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 +160 -0
- package/manifest/components/time-boundary.json +62 -0
- package/manifest/components/time-field.json +80 -0
- package/manifest/components/timeline-ruler.json +139 -0
- package/manifest/components/timeline.json +115 -0
- package/manifest/components/title-bar.json +82 -0
- package/manifest/components/toast.json +130 -0
- package/manifest/components/todo-list.json +69 -0
- package/manifest/components/toggle-group.json +106 -0
- package/manifest/components/toggle.json +109 -0
- package/manifest/components/token-editor.json +90 -0
- 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 +163 -0
- package/manifest/components/tooltip.json +164 -0
- package/manifest/components/trace-waterfall.json +74 -0
- package/manifest/components/tree-visibility-toggle.json +84 -0
- package/manifest/components/tree.json +140 -0
- package/manifest/components/turn-footer.json +105 -0
- package/manifest/components/two-step-button.json +113 -0
- package/manifest/components/typing-indicator.json +53 -0
- package/manifest/components/universe-grid.json +127 -0
- package/manifest/components/unread-divider.json +55 -0
- package/manifest/components/usage-chart.json +124 -0
- 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 +4779 -0
- package/manifest/tokens.json +159 -0
- package/package.json +54 -5
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { codeScroll, codeSurface, inkButton, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon, XIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/reviewable-diff.tsx
|
|
7
|
+
const GUTTER = {
|
|
8
|
+
context: "",
|
|
9
|
+
added: "+",
|
|
10
|
+
removed: "−"
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* The same diff, but each hunk is a decision: keep it, discard it, apply what
|
|
14
|
+
* survived.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* import { ReviewableDiff } from "@cueplusplus/ui/elements";
|
|
18
|
+
*
|
|
19
|
+
* <ReviewableDiff
|
|
20
|
+
* filename="composer.tsx"
|
|
21
|
+
* hunks={hunks}
|
|
22
|
+
* onKeep={(id) => decide(id, "kept")}
|
|
23
|
+
* onDiscard={(id) => decide(id, "discarded")}
|
|
24
|
+
* onApply={commit}
|
|
25
|
+
* />
|
|
26
|
+
*/
|
|
27
|
+
function ReviewableDiff({ filename, hunks, onKeep, onDiscard, onApply, className, ...props }) {
|
|
28
|
+
const kept = hunks.filter((hunk) => hunk.decision === "kept").length;
|
|
29
|
+
const pending = hunks.filter((hunk) => hunk.decision === "pending").length;
|
|
30
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
31
|
+
"data-slot": "reviewable-diff",
|
|
32
|
+
className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
|
|
33
|
+
...props,
|
|
34
|
+
children: [
|
|
35
|
+
/* @__PURE__ */ jsxs("div", {
|
|
36
|
+
className: "flex items-center justify-between px-4 pt-3 pb-2",
|
|
37
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
38
|
+
className: "font-mono text-(length:--cue-text-ui)",
|
|
39
|
+
children: filename
|
|
40
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
41
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
42
|
+
children: [
|
|
43
|
+
kept,
|
|
44
|
+
" of ",
|
|
45
|
+
hunks.length,
|
|
46
|
+
" kept"
|
|
47
|
+
]
|
|
48
|
+
})]
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ jsx("div", {
|
|
51
|
+
className: "flex flex-col",
|
|
52
|
+
children: hunks.map((hunk) => /* @__PURE__ */ jsxs("div", {
|
|
53
|
+
className: cn("border-border border-t transition-opacity duration-300", hunk.decision === "discarded" && "opacity-40"),
|
|
54
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
55
|
+
className: "flex items-center gap-2 px-4 py-1.5",
|
|
56
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
57
|
+
className: cn(mono, "text-fg-subtle"),
|
|
58
|
+
children: hunk.range
|
|
59
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
60
|
+
className: "ms-auto flex items-center gap-1",
|
|
61
|
+
children: hunk.decision === "pending" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("button", {
|
|
62
|
+
type: "button",
|
|
63
|
+
"aria-label": `Discard hunk ${hunk.range}`,
|
|
64
|
+
onClick: () => onDiscard?.(hunk.id),
|
|
65
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg flex h-6 items-center gap-1 rounded-full px-2 text-(length:--cue-text-label) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96]",
|
|
66
|
+
children: [/* @__PURE__ */ jsx(XIcon, { className: "size-3" }), "Discard"]
|
|
67
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
68
|
+
type: "button",
|
|
69
|
+
"aria-label": `Keep hunk ${hunk.range}`,
|
|
70
|
+
onClick: () => onKeep?.(hunk.id),
|
|
71
|
+
className: "flex h-6 items-center gap-1 rounded-full bg-ok/12 px-2 text-(length:--cue-text-label) font-medium text-ok transition-[background-color,scale] duration-150 hover:bg-ok/20 active:scale-[0.96]",
|
|
72
|
+
children: [/* @__PURE__ */ jsx(CheckIcon, { className: "size-3" }), "Keep"]
|
|
73
|
+
})] }) : /* @__PURE__ */ jsx("span", {
|
|
74
|
+
className: cn(mono, "cue-elements-fade-in cue-elements-animate-in duration-300", hunk.decision === "kept" ? "text-ok" : "text-fg-subtle"),
|
|
75
|
+
children: hunk.decision
|
|
76
|
+
})
|
|
77
|
+
})]
|
|
78
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
79
|
+
className: cn(codeScroll, "pb-1.5 font-mono text-(length:--cue-text-ui)"),
|
|
80
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
81
|
+
className: codeSurface,
|
|
82
|
+
children: hunk.lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
|
|
83
|
+
className: cn("flex px-4 py-0.5 leading-relaxed whitespace-pre", line.kind === "context" && "text-fg-subtle", line.kind === "added" && "bg-ok/10 text-ok", line.kind === "removed" && "bg-danger/10 text-danger"),
|
|
84
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
85
|
+
className: "w-4 shrink-0 select-none",
|
|
86
|
+
children: GUTTER[line.kind]
|
|
87
|
+
}), /* @__PURE__ */ jsx("span", { children: line.text })]
|
|
88
|
+
}, `${hunk.id}-${i}`))
|
|
89
|
+
})
|
|
90
|
+
})]
|
|
91
|
+
}, hunk.id))
|
|
92
|
+
}),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", {
|
|
94
|
+
className: "border-border flex items-center justify-between border-t px-4 py-2.5",
|
|
95
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
96
|
+
className: cn(mono, "text-fg-subtle"),
|
|
97
|
+
children: pending > 0 ? `${pending} left to review` : "All reviewed"
|
|
98
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
99
|
+
type: "button",
|
|
100
|
+
disabled: pending > 0,
|
|
101
|
+
onClick: onApply,
|
|
102
|
+
className: cn(inkButton, "flex h-7 items-center rounded-full px-3 text-(length:--cue-text-ui) font-medium disabled:pointer-events-none disabled:opacity-30"),
|
|
103
|
+
children: ["Apply ", kept]
|
|
104
|
+
})]
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { ReviewableDiff };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SecurityRisk } from "./vocabulary.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/elements/risk-badge.d.ts
|
|
4
|
+
interface RiskBadgeProps extends Omit<React.ComponentPropsWithoutRef<"span">, "children"> {
|
|
5
|
+
/**
|
|
6
|
+
* What the runtime says this call could do: `unknown`, `low`, `medium` or
|
|
7
|
+
* `high`. Stamped as `data-risk`, and as `data-color` for the tone, so a
|
|
8
|
+
* console can restyle the row from the attribute rather than from a prop.
|
|
9
|
+
*/
|
|
10
|
+
risk: SecurityRisk;
|
|
11
|
+
/**
|
|
12
|
+
* What it is called. Defaults to `RISK_LABELS[risk]` — `High risk`, not
|
|
13
|
+
* `HIGH`, because the badge sits inline beside a duration and a diff stat and
|
|
14
|
+
* a bare adjective there is a number about something.
|
|
15
|
+
*/
|
|
16
|
+
label?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Why, in the words the products that guess at risk already use: `outside
|
|
19
|
+
* your workspace`, `protected file`, `arbitrary network access`. Drawn beside
|
|
20
|
+
* the label, truncating before the label does.
|
|
21
|
+
*/
|
|
22
|
+
reason?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* How dangerous this call is, said out loud instead of implied.
|
|
26
|
+
*
|
|
27
|
+
* One of the two elements the field study found nobody shipping. Every agent UI
|
|
28
|
+
* knows which of its tools are frightening — that is what the approval buckets
|
|
29
|
+
* are — but the knowledge lives in the taxonomy rather than on the row, so a
|
|
30
|
+
* `curl` to an arbitrary host and a `cat` of a local file look alike until you
|
|
31
|
+
* read them. A runtime that scores its own actions can put the score on the
|
|
32
|
+
* row, and one element renders it for every tool that will ever exist.
|
|
33
|
+
*
|
|
34
|
+
* `unknown` is a first-class value and it is the default answer for a runtime
|
|
35
|
+
* with no scorer. The alternative — omitting the badge, or falling back to
|
|
36
|
+
* `low` — is how a UI ends up implying that unscored means safe.
|
|
37
|
+
*
|
|
38
|
+
* Colour is never alone: each risk has its own glyph and its own words, so the
|
|
39
|
+
* badge survives a colour-blind reader, a monochrome screenshot and a theme
|
|
40
|
+
* whose danger hue is somebody's brand red.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* import { RiskBadge } from "@cueplusplus/ui/elements";
|
|
44
|
+
*
|
|
45
|
+
* <RiskBadge risk="high" reason="arbitrary network access" />
|
|
46
|
+
* @example
|
|
47
|
+
* // The honest answer from a runtime that does not score its actions.
|
|
48
|
+
* <RiskBadge risk="unknown" />
|
|
49
|
+
*/
|
|
50
|
+
declare const RiskBadge: React.ForwardRefExoticComponent<RiskBadgeProps & React.RefAttributes<HTMLSpanElement>>;
|
|
51
|
+
//#endregion
|
|
52
|
+
export { RiskBadge, RiskBadgeProps };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { RISK_LABELS } from "./vocabulary.js";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { CircleHelpIcon, OctagonAlertIcon, ShieldAlertIcon, ShieldCheckIcon } from "lucide-react";
|
|
7
|
+
//#region src/elements/risk-badge.tsx
|
|
8
|
+
/**
|
|
9
|
+
* What each risk paints, and the glyph that carries it without colour.
|
|
10
|
+
*
|
|
11
|
+
* Four rows rather than three: `unknown` is a real answer, and it is drawn in
|
|
12
|
+
* the family's neutral rather than in the low-risk green, because a runtime
|
|
13
|
+
* that does not score its actions must not be made to look like one that scored
|
|
14
|
+
* them all safe.
|
|
15
|
+
*
|
|
16
|
+
* The paint is written in the alpha form the whole group uses — `bg-danger/10`,
|
|
17
|
+
* not `bg-danger-soft` — so it composites at the point of use and follows an
|
|
18
|
+
* `AgentSurface` island. The derived `*-soft` tokens cannot.
|
|
19
|
+
*/
|
|
20
|
+
const RISK_PAINT = {
|
|
21
|
+
unknown: {
|
|
22
|
+
tone: "border-border bg-fg/[0.06] text-fg-subtle",
|
|
23
|
+
glyph: CircleHelpIcon
|
|
24
|
+
},
|
|
25
|
+
low: {
|
|
26
|
+
tone: "border-ok/30 bg-ok/10 text-ok",
|
|
27
|
+
glyph: ShieldCheckIcon
|
|
28
|
+
},
|
|
29
|
+
medium: {
|
|
30
|
+
tone: "border-warn/30 bg-warn/10 text-warn",
|
|
31
|
+
glyph: ShieldAlertIcon
|
|
32
|
+
},
|
|
33
|
+
high: {
|
|
34
|
+
tone: "border-danger/40 bg-danger/15 text-danger",
|
|
35
|
+
glyph: OctagonAlertIcon
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* How dangerous this call is, said out loud instead of implied.
|
|
40
|
+
*
|
|
41
|
+
* One of the two elements the field study found nobody shipping. Every agent UI
|
|
42
|
+
* knows which of its tools are frightening — that is what the approval buckets
|
|
43
|
+
* are — but the knowledge lives in the taxonomy rather than on the row, so a
|
|
44
|
+
* `curl` to an arbitrary host and a `cat` of a local file look alike until you
|
|
45
|
+
* read them. A runtime that scores its own actions can put the score on the
|
|
46
|
+
* row, and one element renders it for every tool that will ever exist.
|
|
47
|
+
*
|
|
48
|
+
* `unknown` is a first-class value and it is the default answer for a runtime
|
|
49
|
+
* with no scorer. The alternative — omitting the badge, or falling back to
|
|
50
|
+
* `low` — is how a UI ends up implying that unscored means safe.
|
|
51
|
+
*
|
|
52
|
+
* Colour is never alone: each risk has its own glyph and its own words, so the
|
|
53
|
+
* badge survives a colour-blind reader, a monochrome screenshot and a theme
|
|
54
|
+
* whose danger hue is somebody's brand red.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* import { RiskBadge } from "@cueplusplus/ui/elements";
|
|
58
|
+
*
|
|
59
|
+
* <RiskBadge risk="high" reason="arbitrary network access" />
|
|
60
|
+
* @example
|
|
61
|
+
* // The honest answer from a runtime that does not score its actions.
|
|
62
|
+
* <RiskBadge risk="unknown" />
|
|
63
|
+
*/
|
|
64
|
+
const RiskBadge = React.forwardRef(function RiskBadge({ risk, label, reason, className, ...elementProps }, ref) {
|
|
65
|
+
const { tone, glyph: Glyph } = RISK_PAINT[risk];
|
|
66
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
67
|
+
ref,
|
|
68
|
+
"data-slot": "risk-badge",
|
|
69
|
+
"data-risk": risk,
|
|
70
|
+
"data-color": risk,
|
|
71
|
+
className: cn("inline-flex min-w-0 shrink items-center gap-1.5 rounded-full border px-2 py-0.5 text-(length:--cue-text-ui)", tone, className),
|
|
72
|
+
...elementProps,
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Glyph, {
|
|
75
|
+
"aria-hidden": true,
|
|
76
|
+
className: "size-3.5 shrink-0"
|
|
77
|
+
}),
|
|
78
|
+
/* @__PURE__ */ jsx("span", {
|
|
79
|
+
className: "shrink-0 font-medium",
|
|
80
|
+
children: label ?? RISK_LABELS[risk]
|
|
81
|
+
}),
|
|
82
|
+
reason === void 0 ? null : /* @__PURE__ */ jsxs("span", {
|
|
83
|
+
"data-slot": "risk-badge-reason",
|
|
84
|
+
className: "min-w-0 truncate opacity-80",
|
|
85
|
+
children: ["· ", reason]
|
|
86
|
+
})
|
|
87
|
+
]
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//#endregion
|
|
91
|
+
export { RiskBadge };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/schedule-card.d.ts
|
|
3
|
+
/** One past run of a schedule: when it went, and whether it worked. */
|
|
4
|
+
interface ScheduleRun {
|
|
5
|
+
/** Identifies the run, and keys its row. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** When it ran, already phrased — `Today 09:00`, `2h ago`. This element parses no dates. */
|
|
8
|
+
at: string;
|
|
9
|
+
/** Whether it succeeded, which decides the row's glyph and the word that ends it. */
|
|
10
|
+
ok: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A run that repeats on its own, with its cadence and how it has been doing.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { ScheduleCard } from "@cueplusplus/ui/elements";
|
|
17
|
+
*
|
|
18
|
+
* <ScheduleCard
|
|
19
|
+
* name="Triage the issue queue"
|
|
20
|
+
* cadence="every day at 06:00"
|
|
21
|
+
* nextRun="Tomorrow, 06:00"
|
|
22
|
+
* enabled
|
|
23
|
+
* history={history}
|
|
24
|
+
* onToggle={toggle}
|
|
25
|
+
* />
|
|
26
|
+
*/
|
|
27
|
+
declare function ScheduleCard({ name, cadence, nextRun, enabled, history, onToggle, className, ...props }: Omit<ComponentProps<"div">, "children" | "name" | "cadence" | "nextRun" | "enabled" | "history" | "onToggle"> & {
|
|
28
|
+
/** What the scheduled run does. */
|
|
29
|
+
name: string;
|
|
30
|
+
/** Human-readable recurrence, not a cron string. */
|
|
31
|
+
cadence: string;
|
|
32
|
+
/** When it fires next. Replaced by paused when disabled. */
|
|
33
|
+
nextRun: string;
|
|
34
|
+
/** Whether the schedule is live. */
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
/** Recent runs, so a silently failing schedule is visible. */
|
|
37
|
+
history: readonly ScheduleRun[];
|
|
38
|
+
/** Called when the schedule is paused or resumed. */
|
|
39
|
+
onToggle?: () => void;
|
|
40
|
+
}): import("react").JSX.Element;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { ScheduleCard, ScheduleRun };
|
|
@@ -0,0 +1,90 @@
|
|
|
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, ClockIcon, XIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/schedule-card.tsx
|
|
7
|
+
/**
|
|
8
|
+
* A run that repeats on its own, with its cadence and how it has been doing.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ScheduleCard } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ScheduleCard
|
|
14
|
+
* name="Triage the issue queue"
|
|
15
|
+
* cadence="every day at 06:00"
|
|
16
|
+
* nextRun="Tomorrow, 06:00"
|
|
17
|
+
* enabled
|
|
18
|
+
* history={history}
|
|
19
|
+
* onToggle={toggle}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function ScheduleCard({ name, cadence, nextRun, enabled, history, onToggle, className, ...props }) {
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
"data-slot": "schedule-card",
|
|
25
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [
|
|
28
|
+
/* @__PURE__ */ jsxs("div", {
|
|
29
|
+
className: "flex items-center gap-2.5",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx("span", {
|
|
32
|
+
className: "bg-surface-1 text-fg-muted flex size-7 shrink-0 items-center justify-center rounded-(--radius-surface)",
|
|
33
|
+
children: /* @__PURE__ */ jsx(ClockIcon, { className: "size-3.5" })
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ jsxs("div", {
|
|
36
|
+
className: "flex min-w-0 flex-1 flex-col",
|
|
37
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
38
|
+
className: "truncate text-(length:--cue-text-body) font-medium",
|
|
39
|
+
children: name
|
|
40
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
41
|
+
className: cn(mono, "text-fg-subtle"),
|
|
42
|
+
children: cadence
|
|
43
|
+
})]
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ jsx("button", {
|
|
46
|
+
type: "button",
|
|
47
|
+
role: "switch",
|
|
48
|
+
"aria-checked": enabled,
|
|
49
|
+
"aria-label": `${enabled ? "Pause" : "Resume"} ${name}`,
|
|
50
|
+
onClick: onToggle,
|
|
51
|
+
className: cn("flex h-5 w-9 shrink-0 items-center rounded-full p-0.5 transition-colors duration-200", enabled ? "bg-accent" : "bg-surface-3"),
|
|
52
|
+
children: /* @__PURE__ */ jsx("span", { className: cn("bg-bg size-4 rounded-full transition-transform duration-200 motion-reduce:transition-none", enabled && "translate-x-4") })
|
|
53
|
+
})
|
|
54
|
+
]
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: cn(field, "flex items-baseline gap-2 rounded-(--radius-surface) px-3 py-2", !enabled && "opacity-45"),
|
|
58
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
59
|
+
className: cn(mono, "text-fg-subtle"),
|
|
60
|
+
children: "next"
|
|
61
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
62
|
+
className: "text-fg-muted text-(length:--cue-text-body)",
|
|
63
|
+
children: enabled ? nextRun : "paused"
|
|
64
|
+
})]
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ jsxs("div", {
|
|
67
|
+
className: "flex flex-col gap-1",
|
|
68
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
69
|
+
className: cn(mono, "text-fg-subtle"),
|
|
70
|
+
children: "recent runs"
|
|
71
|
+
}), history.map((run) => /* @__PURE__ */ jsxs("div", {
|
|
72
|
+
className: "flex items-baseline gap-2",
|
|
73
|
+
children: [
|
|
74
|
+
run.ok ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-3 shrink-0 translate-y-0.5 text-ok" }) : /* @__PURE__ */ jsx(XIcon, { className: "size-3 shrink-0 translate-y-0.5 text-danger" }),
|
|
75
|
+
/* @__PURE__ */ jsx("span", {
|
|
76
|
+
className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-ui)",
|
|
77
|
+
children: run.at
|
|
78
|
+
}),
|
|
79
|
+
/* @__PURE__ */ jsx("span", {
|
|
80
|
+
className: cn(mono, "text-fg-subtle shrink-0"),
|
|
81
|
+
children: run.ok ? "ok" : "failed"
|
|
82
|
+
})
|
|
83
|
+
]
|
|
84
|
+
}, run.id))]
|
|
85
|
+
})
|
|
86
|
+
]
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
export { ScheduleCard };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/score-breakdown.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* One line of the arithmetic behind a verdict: what was judged, how well, and how much
|
|
5
|
+
* it counted.
|
|
6
|
+
*/
|
|
7
|
+
interface ScoreCriterion {
|
|
8
|
+
/** What is being scored. Truncates rather than wraps. */
|
|
9
|
+
label: string;
|
|
10
|
+
/**
|
|
11
|
+
* Score for this criterion, on the same scale as outOf. Its bar is drawn against
|
|
12
|
+
* outOf, so the two cannot drift apart.
|
|
13
|
+
*/
|
|
14
|
+
score: number;
|
|
15
|
+
/** How much it counted toward the total. */
|
|
16
|
+
weight: number;
|
|
17
|
+
/** Why it scored that way. Worth writing for anything below full marks. */
|
|
18
|
+
note?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A verdict with its arithmetic shown: criteria, weights, and what pulled it down.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* import { ScoreBreakdown } from "@cueplusplus/ui/elements";
|
|
25
|
+
*
|
|
26
|
+
* <ScoreBreakdown
|
|
27
|
+
* verdict="approve"
|
|
28
|
+
* total={4.2}
|
|
29
|
+
* outOf={5}
|
|
30
|
+
* criteria={criteria}
|
|
31
|
+
* visibleCount={3}
|
|
32
|
+
* />
|
|
33
|
+
*/
|
|
34
|
+
declare function ScoreBreakdown({ verdict, total, outOf, criteria, visibleCount, className, ...props }: Omit<ComponentProps<"div">, "children" | "verdict" | "total" | "outOf" | "criteria" | "visibleCount"> & {
|
|
35
|
+
/** The decision in a word. Its tint follows total over outOf. */
|
|
36
|
+
verdict: string;
|
|
37
|
+
/** The composite score. */
|
|
38
|
+
total: number;
|
|
39
|
+
/** Maximum possible, for the headline and for every criterion bar. */
|
|
40
|
+
outOf: number;
|
|
41
|
+
/** What produced the number, so the verdict can be argued with. */
|
|
42
|
+
criteria: readonly ScoreCriterion[];
|
|
43
|
+
/** How many criteria have been scored. */
|
|
44
|
+
visibleCount: number;
|
|
45
|
+
}): import("react").JSX.Element;
|
|
46
|
+
//#endregion
|
|
47
|
+
export { ScoreBreakdown, ScoreCriterion };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono, paper } from "./surfaces.js";
|
|
4
|
+
import { pct, take } from "./range.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/elements/score-breakdown.tsx
|
|
7
|
+
/**
|
|
8
|
+
* A verdict with its arithmetic shown: criteria, weights, and what pulled it down.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ScoreBreakdown } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ScoreBreakdown
|
|
14
|
+
* verdict="approve"
|
|
15
|
+
* total={4.2}
|
|
16
|
+
* outOf={5}
|
|
17
|
+
* criteria={criteria}
|
|
18
|
+
* visibleCount={3}
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
function ScoreBreakdown({ verdict, total, outOf, criteria, visibleCount, className, ...props }) {
|
|
22
|
+
const ratio = outOf === 0 ? 0 : total / outOf;
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
"data-slot": "score-breakdown",
|
|
25
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
28
|
+
className: "flex items-baseline gap-2",
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsx("span", {
|
|
31
|
+
className: "text-(length:--cue-text-title) font-medium tracking-tight tabular-nums",
|
|
32
|
+
children: total.toFixed(1)
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ jsxs("span", {
|
|
35
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
36
|
+
children: ["/ ", outOf]
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: cn("ms-auto rounded-full px-2 py-0.5 text-(length:--cue-text-ui) font-medium", ratio >= .75 ? "bg-ok/12 text-ok" : ratio >= .5 ? "bg-warn/12 text-warn" : "bg-danger/12 text-danger"),
|
|
40
|
+
children: verdict
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
44
|
+
className: "flex flex-col gap-2",
|
|
45
|
+
children: take(criteria, visibleCount).map((criterion) => /* @__PURE__ */ jsxs("div", {
|
|
46
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex flex-col gap-1 duration-300",
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsxs("div", {
|
|
49
|
+
className: "flex items-baseline gap-2",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", {
|
|
52
|
+
className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
53
|
+
children: criterion.label
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ jsxs("span", {
|
|
56
|
+
className: cn(mono, "text-fg-subtle shrink-0"),
|
|
57
|
+
children: ["×", criterion.weight]
|
|
58
|
+
}),
|
|
59
|
+
/* @__PURE__ */ jsx("span", {
|
|
60
|
+
className: cn(mono, "text-fg-muted shrink-0 tabular-nums"),
|
|
61
|
+
children: criterion.score.toFixed(1)
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ jsx("span", {
|
|
66
|
+
className: "bg-surface-2 h-[3px] w-full overflow-hidden rounded-full",
|
|
67
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
68
|
+
className: "block h-full rounded-full bg-stream transition-[width] duration-500 motion-reduce:transition-none",
|
|
69
|
+
style: { width: `${pct(criterion.score, outOf)}%` }
|
|
70
|
+
})
|
|
71
|
+
}),
|
|
72
|
+
criterion.note && /* @__PURE__ */ jsx("span", {
|
|
73
|
+
className: "text-fg-subtle text-(length:--cue-text-ui) leading-relaxed break-words",
|
|
74
|
+
children: criterion.note
|
|
75
|
+
})
|
|
76
|
+
]
|
|
77
|
+
}, criterion.label))
|
|
78
|
+
})]
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
export { ScoreBreakdown };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/scroll-anchor.d.ts
|
|
3
|
+
/** One turn in the transcript this element scrolls: who said it, and what. */
|
|
4
|
+
interface ScrollAnchorMessage {
|
|
5
|
+
/** Who is speaking. The user's turns take the recessed field ground and sit right. */
|
|
6
|
+
role: "user" | "assistant";
|
|
7
|
+
/** The turn itself, as plain text. */
|
|
8
|
+
text: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Streaming never steals your scroll position; a pill offers the way back down.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { ScrollAnchor } from "@cueplusplus/ui/elements";
|
|
15
|
+
*
|
|
16
|
+
* <ScrollAnchor
|
|
17
|
+
* messages={[
|
|
18
|
+
* { role: "user", text: "Keep scrolling pinned?" },
|
|
19
|
+
* { role: "assistant", text: "Only when you are already at the bottom." },
|
|
20
|
+
* ]}
|
|
21
|
+
* />
|
|
22
|
+
*/
|
|
23
|
+
declare function ScrollAnchor({ messages, paused, onSettled, className, ...props }: Omit<ComponentProps<"div">, "children" | "messages" | "paused" | "onSettled"> & {
|
|
24
|
+
/** Conversation messages appended over time inside the scroll viewport. */
|
|
25
|
+
messages: ScrollAnchorMessage[];
|
|
26
|
+
/** Freezes the scene where it is; replay happens by remounting. */
|
|
27
|
+
paused?: boolean;
|
|
28
|
+
/** Called once every message has landed and the viewport is pinned. */
|
|
29
|
+
onSettled?: () => void;
|
|
30
|
+
}): import("react").JSX.Element;
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ScrollAnchor, ScrollAnchorMessage };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { usePrefersReducedMotion } from "../instruments/_motion.js";
|
|
4
|
+
import { field, paper } from "./surfaces.js";
|
|
5
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { ArrowDownIcon } from "lucide-react";
|
|
8
|
+
//#region src/elements/scroll-anchor.tsx
|
|
9
|
+
const INITIAL_COUNT = 3;
|
|
10
|
+
const APPEND_MS = 1300;
|
|
11
|
+
/**
|
|
12
|
+
* Streaming never steals your scroll position; a pill offers the way back down.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { ScrollAnchor } from "@cueplusplus/ui/elements";
|
|
16
|
+
*
|
|
17
|
+
* <ScrollAnchor
|
|
18
|
+
* messages={[
|
|
19
|
+
* { role: "user", text: "Keep scrolling pinned?" },
|
|
20
|
+
* { role: "assistant", text: "Only when you are already at the bottom." },
|
|
21
|
+
* ]}
|
|
22
|
+
* />
|
|
23
|
+
*/
|
|
24
|
+
function ScrollAnchor({ messages, paused = false, onSettled, className, ...props }) {
|
|
25
|
+
const reduced = usePrefersReducedMotion();
|
|
26
|
+
const viewportRef = useRef(null);
|
|
27
|
+
const [count, setCount] = useState(INITIAL_COUNT);
|
|
28
|
+
const [pinned, setPinned] = useState(true);
|
|
29
|
+
const [seenCount, setSeenCount] = useState(INITIAL_COUNT);
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (paused) return;
|
|
32
|
+
if (reduced) {
|
|
33
|
+
setCount(messages.length);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const id = setInterval(() => {
|
|
37
|
+
setCount((current) => {
|
|
38
|
+
if (current >= messages.length) return current;
|
|
39
|
+
return current + 1;
|
|
40
|
+
});
|
|
41
|
+
}, APPEND_MS);
|
|
42
|
+
return () => clearInterval(id);
|
|
43
|
+
}, [
|
|
44
|
+
messages.length,
|
|
45
|
+
paused,
|
|
46
|
+
reduced
|
|
47
|
+
]);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (count >= messages.length && pinned) onSettled?.();
|
|
50
|
+
}, [
|
|
51
|
+
count,
|
|
52
|
+
pinned,
|
|
53
|
+
messages.length,
|
|
54
|
+
onSettled
|
|
55
|
+
]);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (count === 4) {
|
|
58
|
+
setPinned(false);
|
|
59
|
+
const viewport = viewportRef.current;
|
|
60
|
+
if (viewport) viewport.scrollTo({ top: 0 });
|
|
61
|
+
}
|
|
62
|
+
}, [count]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const viewport = viewportRef.current;
|
|
65
|
+
if (!viewport) return;
|
|
66
|
+
if (pinned) {
|
|
67
|
+
viewport.scrollTo({ top: viewport.scrollHeight });
|
|
68
|
+
setSeenCount(count);
|
|
69
|
+
}
|
|
70
|
+
}, [count, pinned]);
|
|
71
|
+
const jump = useCallback(() => {
|
|
72
|
+
const viewport = viewportRef.current;
|
|
73
|
+
if (viewport) viewport.scrollTo({ top: viewport.scrollHeight });
|
|
74
|
+
setPinned(true);
|
|
75
|
+
setSeenCount(count);
|
|
76
|
+
}, [count]);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (paused || pinned || count - seenCount < 2) return;
|
|
79
|
+
const id = setTimeout(jump, 2400);
|
|
80
|
+
return () => clearTimeout(id);
|
|
81
|
+
}, [
|
|
82
|
+
paused,
|
|
83
|
+
pinned,
|
|
84
|
+
count,
|
|
85
|
+
seenCount,
|
|
86
|
+
jump
|
|
87
|
+
]);
|
|
88
|
+
const newCount = count - seenCount;
|
|
89
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
90
|
+
"data-slot": "scroll-anchor",
|
|
91
|
+
className: cn(paper, "relative h-64 w-full max-w-sm overflow-hidden rounded-(--radius-overlay)", className),
|
|
92
|
+
...props,
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsx("div", {
|
|
95
|
+
ref: viewportRef,
|
|
96
|
+
className: "flex h-full flex-col gap-2.5 overflow-y-hidden scroll-smooth motion-reduce:scroll-auto p-4",
|
|
97
|
+
children: messages.slice(0, count).map((message, i) => /* @__PURE__ */ jsx("div", {
|
|
98
|
+
className: cn("cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in max-w-[85%] text-(length:--cue-text-ui) leading-relaxed duration-300 motion-reduce:animate-none", message.role === "user" ? cn(field, "self-end rounded-(--radius-overlay) px-3 py-1.5") : "text-fg-muted self-start"),
|
|
99
|
+
children: message.text
|
|
100
|
+
}, i))
|
|
101
|
+
}),
|
|
102
|
+
/* @__PURE__ */ jsx("div", {
|
|
103
|
+
"aria-hidden": true,
|
|
104
|
+
className: "from-surface-1 pointer-events-none absolute inset-x-0 top-0 h-6 bg-gradient-to-b to-transparent"
|
|
105
|
+
}),
|
|
106
|
+
!pinned && newCount > 0 && /* @__PURE__ */ jsxs("button", {
|
|
107
|
+
type: "button",
|
|
108
|
+
onClick: jump,
|
|
109
|
+
className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-slide-in-from-bottom-2 cue-elements-animate-in absolute inset-x-0 bottom-3 mx-auto flex w-fit items-center gap-1.5 rounded-full px-3.5 py-1.5 text-(length:--cue-text-ui) transition-transform duration-200 hover:-translate-y-px"),
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ jsx(ArrowDownIcon, { className: "size-3 opacity-60" }),
|
|
112
|
+
newCount,
|
|
113
|
+
" new ",
|
|
114
|
+
newCount === 1 ? "message" : "messages"
|
|
115
|
+
]
|
|
116
|
+
})
|
|
117
|
+
]
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//#endregion
|
|
121
|
+
export { ScrollAnchor };
|