@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,85 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { ShimmerLabel, SwapLabel, collapsePanel, field, mono } from "./surfaces.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { Collapsible } from "@base-ui/react/collapsible";
|
|
6
|
+
import { CheckIcon, ChevronRightIcon } from "lucide-react";
|
|
7
|
+
//#region src/elements/tool-call.tsx
|
|
8
|
+
/**
|
|
9
|
+
* One tool invocation with its request and result tucked behind a disclosure.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { ToolCall } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <ToolCall
|
|
15
|
+
* label="Searched"
|
|
16
|
+
* activeLabel="Searching"
|
|
17
|
+
* query="composer props"
|
|
18
|
+
* request='{"q":"composer"}'
|
|
19
|
+
* result='{"hits":2}'
|
|
20
|
+
* running={false}
|
|
21
|
+
* open
|
|
22
|
+
* onOpenChange={setOpen}
|
|
23
|
+
* />
|
|
24
|
+
*/
|
|
25
|
+
function ToolCall({ label, activeLabel, query, request, result, running, open, onOpenChange, className }) {
|
|
26
|
+
return /* @__PURE__ */ jsxs(Collapsible.Root, {
|
|
27
|
+
"data-slot": "tool-call",
|
|
28
|
+
open,
|
|
29
|
+
onOpenChange,
|
|
30
|
+
className: cn("w-full max-w-sm", className),
|
|
31
|
+
children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
|
|
32
|
+
className: "group/trigger text-fg-muted hover:text-fg flex items-center gap-2 rounded-(--radius-control) py-1 text-(length:--cue-text-body) transition-colors outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-3.5 shrink-0 opacity-60 transition-transform duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] group-data-[panel-open]/trigger:rotate-90 motion-reduce:transition-none" }),
|
|
35
|
+
/* @__PURE__ */ jsxs(SwapLabel, {
|
|
36
|
+
active: running ? 0 : 1,
|
|
37
|
+
className: "text-start",
|
|
38
|
+
children: [/* @__PURE__ */ jsx(ShimmerLabel, {
|
|
39
|
+
active: running,
|
|
40
|
+
className: "relative inline-block leading-none",
|
|
41
|
+
children: activeLabel
|
|
42
|
+
}), /* @__PURE__ */ jsx(Fragment, { children: label })]
|
|
43
|
+
}),
|
|
44
|
+
/* @__PURE__ */ jsx("span", {
|
|
45
|
+
className: cn(mono, "bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5"),
|
|
46
|
+
children: query
|
|
47
|
+
}),
|
|
48
|
+
/* @__PURE__ */ jsx("span", {
|
|
49
|
+
className: "ms-auto flex w-4 items-center justify-end",
|
|
50
|
+
children: !running && /* @__PURE__ */ jsx(CheckIcon, { className: "cue-elements-fade-in cue-elements-zoom-in-90 cue-elements-animate-in size-3.5 text-ok duration-200" })
|
|
51
|
+
})
|
|
52
|
+
]
|
|
53
|
+
}), /* @__PURE__ */ jsx(Collapsible.Panel, {
|
|
54
|
+
className: cn(collapsePanel, "outline-none"),
|
|
55
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
56
|
+
className: cn(field, "mt-2 overflow-hidden rounded-(--radius-overlay) text-(length:--cue-text-ui)"),
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ jsxs("div", {
|
|
59
|
+
className: "px-3.5 pt-2.5 pb-2",
|
|
60
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
61
|
+
className: cn(mono, "text-fg-subtle mb-1"),
|
|
62
|
+
children: "Request"
|
|
63
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
64
|
+
className: "text-fg-muted font-mono",
|
|
65
|
+
children: request
|
|
66
|
+
})]
|
|
67
|
+
}),
|
|
68
|
+
/* @__PURE__ */ jsx("div", { className: "bg-surface-2 mx-3.5 h-px" }),
|
|
69
|
+
/* @__PURE__ */ jsxs("div", {
|
|
70
|
+
className: "px-3.5 pt-2 pb-2.5",
|
|
71
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
72
|
+
className: cn(mono, "text-fg-subtle mb-1"),
|
|
73
|
+
children: "Result"
|
|
74
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
75
|
+
className: "text-fg",
|
|
76
|
+
children: result
|
|
77
|
+
})]
|
|
78
|
+
})
|
|
79
|
+
]
|
|
80
|
+
})
|
|
81
|
+
})]
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { ToolCall };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/tool-error.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* One call failed. The error, the attempt count, and a retry that doesn't restart the
|
|
5
|
+
* turn.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* import { ToolError } from "@cueplusplus/ui/elements";
|
|
9
|
+
*
|
|
10
|
+
* <ToolError
|
|
11
|
+
* name="fetch"
|
|
12
|
+
* target="https://api.example.com/v1/issues"
|
|
13
|
+
* message="ETIMEDOUT after 30000ms"
|
|
14
|
+
* attempt={2}
|
|
15
|
+
* maxAttempts={3}
|
|
16
|
+
* retrying={false}
|
|
17
|
+
* onRetry={retry}
|
|
18
|
+
* />
|
|
19
|
+
*/
|
|
20
|
+
declare function ToolError({ name, target, message, attempt, maxAttempts, retrying, onRetry, onSkip, className, ...props }: Omit<ComponentProps<"div">, "children" | "name" | "target" | "message" | "attempt" | "maxAttempts" | "retrying" | "onRetry" | "onSkip"> & {
|
|
21
|
+
/** Tool that failed. */
|
|
22
|
+
name: string;
|
|
23
|
+
/** What it was called against. */
|
|
24
|
+
target: string;
|
|
25
|
+
/** The raw error, shown in mono rather than reworded. */
|
|
26
|
+
message: string;
|
|
27
|
+
/** Which attempt this was. */
|
|
28
|
+
attempt: number;
|
|
29
|
+
/** How many the runtime will make. */
|
|
30
|
+
maxAttempts: number;
|
|
31
|
+
/** Swaps the retry control for a spinner and disables it. */
|
|
32
|
+
retrying: boolean;
|
|
33
|
+
/** Called to run the call again without restarting the turn. */
|
|
34
|
+
onRetry?: () => void;
|
|
35
|
+
/** Called to give up on this call and let the turn continue. */
|
|
36
|
+
onSkip?: () => void;
|
|
37
|
+
}): import("react").JSX.Element;
|
|
38
|
+
//#endregion
|
|
39
|
+
export { ToolError };
|
|
@@ -0,0 +1,76 @@
|
|
|
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 { AlertCircleIcon, Loader2Icon, RotateCwIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/tool-error.tsx
|
|
7
|
+
/**
|
|
8
|
+
* One call failed. The error, the attempt count, and a retry that doesn't restart the
|
|
9
|
+
* turn.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { ToolError } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <ToolError
|
|
15
|
+
* name="fetch"
|
|
16
|
+
* target="https://api.example.com/v1/issues"
|
|
17
|
+
* message="ETIMEDOUT after 30000ms"
|
|
18
|
+
* attempt={2}
|
|
19
|
+
* maxAttempts={3}
|
|
20
|
+
* retrying={false}
|
|
21
|
+
* onRetry={retry}
|
|
22
|
+
* />
|
|
23
|
+
*/
|
|
24
|
+
function ToolError({ name, target, message, attempt, maxAttempts, retrying, onRetry, onSkip, className, ...props }) {
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
26
|
+
"data-slot": "tool-error",
|
|
27
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
|
|
28
|
+
...props,
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsxs("div", {
|
|
31
|
+
className: "flex items-center gap-2.5",
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx(AlertCircleIcon, { className: "size-3.5 shrink-0 text-danger" }),
|
|
34
|
+
/* @__PURE__ */ jsx("span", {
|
|
35
|
+
className: cn(mono, "text-fg-muted shrink-0"),
|
|
36
|
+
children: name
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
40
|
+
children: target
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ jsxs("span", {
|
|
43
|
+
className: cn(mono, "text-fg-subtle shrink-0 tabular-nums"),
|
|
44
|
+
children: [
|
|
45
|
+
attempt,
|
|
46
|
+
"/",
|
|
47
|
+
maxAttempts
|
|
48
|
+
]
|
|
49
|
+
})
|
|
50
|
+
]
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsx("div", {
|
|
53
|
+
className: cn(field, "rounded-(--radius-surface) px-3 py-2 font-mono text-(length:--cue-text-label) leading-relaxed text-danger"),
|
|
54
|
+
children: message
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: "flex items-center justify-end gap-2",
|
|
58
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
59
|
+
type: "button",
|
|
60
|
+
onClick: onSkip,
|
|
61
|
+
disabled: !onSkip,
|
|
62
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg h-7 rounded-full px-2.5 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96] disabled:pointer-events-none disabled:opacity-30",
|
|
63
|
+
children: "Skip"
|
|
64
|
+
}), /* @__PURE__ */ jsxs("button", {
|
|
65
|
+
type: "button",
|
|
66
|
+
onClick: onRetry,
|
|
67
|
+
disabled: retrying,
|
|
68
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg flex h-7 items-center gap-1.5 rounded-full px-2.5 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96] disabled:pointer-events-none",
|
|
69
|
+
children: [retrying ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3 animate-spin motion-reduce:animate-none" }) : /* @__PURE__ */ jsx(RotateCwIcon, { className: "size-3" }), retrying ? "Retrying" : "Retry"]
|
|
70
|
+
})]
|
|
71
|
+
})
|
|
72
|
+
]
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
export { ToolError };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/tool-group.d.ts
|
|
3
|
+
/** Where one tool in a group got to: still running, finished, or failed. */
|
|
4
|
+
type GroupedToolState = "running" | "done" | "failed";
|
|
5
|
+
/** One row of a tool group: what ran, against what, and how it ended. */
|
|
6
|
+
interface GroupedTool {
|
|
7
|
+
/** Stable identity for the row key. */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Tool name, rendered in mono. */
|
|
10
|
+
name: string;
|
|
11
|
+
/** What the call acted on: a path, a query, an id. */
|
|
12
|
+
target: string;
|
|
13
|
+
/** Per-call state, rolled up into the header summary. */
|
|
14
|
+
state: GroupedToolState;
|
|
15
|
+
/** Printed once the call settles. Omit while running. */
|
|
16
|
+
durationMs?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Calls that went out together, collapsed to one row until you want the detail.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* import { ToolGroup } from "@cueplusplus/ui/elements";
|
|
23
|
+
*
|
|
24
|
+
* <ToolGroup
|
|
25
|
+
* label="Read 4 files in parallel"
|
|
26
|
+
* tools={tools}
|
|
27
|
+
* open={open}
|
|
28
|
+
* onOpenChange={setOpen}
|
|
29
|
+
* />
|
|
30
|
+
*/
|
|
31
|
+
declare function ToolGroup({ label, tools, open, onOpenChange, className, ...props }: Omit<ComponentProps<"div">, "children" | "label" | "tools" | "open" | "onOpenChange"> & {
|
|
32
|
+
/** What the group did, as one line. */
|
|
33
|
+
label: string;
|
|
34
|
+
/**
|
|
35
|
+
* Calls issued together. The header summarizes them: progress while any run,
|
|
36
|
+
* failures if any failed, otherwise the count.
|
|
37
|
+
*/
|
|
38
|
+
tools: readonly GroupedTool[];
|
|
39
|
+
/** Whether the per-call list is expanded. */
|
|
40
|
+
open: boolean;
|
|
41
|
+
/** Called when the group is expanded or collapsed. */
|
|
42
|
+
onOpenChange?: (open: boolean) => void;
|
|
43
|
+
}): import("react").JSX.Element;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { GroupedTool, GroupedToolState, ToolGroup };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon, ChevronRightIcon, Loader2Icon, XIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/tool-group.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Calls that went out together, collapsed to one row until you want the detail.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ToolGroup } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ToolGroup
|
|
14
|
+
* label="Read 4 files in parallel"
|
|
15
|
+
* tools={tools}
|
|
16
|
+
* open={open}
|
|
17
|
+
* onOpenChange={setOpen}
|
|
18
|
+
* />
|
|
19
|
+
*/
|
|
20
|
+
function ToolGroup({ label, tools, open, onOpenChange, className, ...props }) {
|
|
21
|
+
const running = tools.filter((tool) => tool.state === "running").length;
|
|
22
|
+
const failed = tools.filter((tool) => tool.state === "failed").length;
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
"data-slot": "tool-group",
|
|
25
|
+
className: cn(paper, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [/* @__PURE__ */ jsxs("button", {
|
|
28
|
+
type: "button",
|
|
29
|
+
"aria-expanded": open,
|
|
30
|
+
onClick: () => onOpenChange?.(!open),
|
|
31
|
+
className: "hover:bg-surface-1 flex items-center gap-2.5 px-3.5 py-2.5 text-start transition-colors",
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: cn("text-fg-subtle size-3 shrink-0 transition-transform duration-200 motion-reduce:transition-none", open && "rotate-90") }),
|
|
34
|
+
/* @__PURE__ */ jsx("span", {
|
|
35
|
+
className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
36
|
+
children: label
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: cn(mono, "text-fg-subtle shrink-0 tabular-nums"),
|
|
40
|
+
children: running > 0 ? `${tools.length - running}/${tools.length}` : failed > 0 ? `${failed} failed` : `${tools.length} done`
|
|
41
|
+
}),
|
|
42
|
+
running > 0 ? /* @__PURE__ */ jsx(Loader2Icon, { className: "text-fg-subtle size-3.5 shrink-0 animate-spin motion-reduce:animate-none" }) : failed > 0 ? /* @__PURE__ */ jsx(XIcon, { className: "size-3.5 shrink-0 text-danger" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5 shrink-0 text-ok" })
|
|
43
|
+
]
|
|
44
|
+
}), open && /* @__PURE__ */ jsx("div", {
|
|
45
|
+
className: "border-border cue-elements-fade-in cue-elements-slide-in-from-top-1 cue-elements-animate-in flex flex-col border-t duration-200",
|
|
46
|
+
children: tools.map((tool) => /* @__PURE__ */ jsxs("div", {
|
|
47
|
+
className: "flex items-center gap-2.5 px-3.5 py-2",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx("span", {
|
|
50
|
+
className: "flex size-3.5 shrink-0 items-center justify-center",
|
|
51
|
+
children: tool.state === "running" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "text-fg-subtle size-3 animate-spin motion-reduce:animate-none" }) : tool.state === "failed" ? /* @__PURE__ */ jsx(XIcon, { className: "size-3 text-danger" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3 text-ok" })
|
|
52
|
+
}),
|
|
53
|
+
/* @__PURE__ */ jsx("span", {
|
|
54
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-muted shrink-0"),
|
|
55
|
+
children: tool.name
|
|
56
|
+
}),
|
|
57
|
+
/* @__PURE__ */ jsx("span", {
|
|
58
|
+
className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
59
|
+
children: tool.target
|
|
60
|
+
}),
|
|
61
|
+
tool.durationMs !== void 0 && /* @__PURE__ */ jsxs("span", {
|
|
62
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0 tabular-nums"),
|
|
63
|
+
children: [tool.durationMs, "ms"]
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
}, tool.id))
|
|
67
|
+
})]
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
export { ToolGroup };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { LucideIcon } from "lucide-react";
|
|
2
|
+
//#region src/elements/tool-timeline.d.ts
|
|
3
|
+
/** One thing the session did, said as a verb and the thing it was done to. */
|
|
4
|
+
interface TimelineStep {
|
|
5
|
+
/** What was done — `Read`, `Edited`, `Ran`. It shimmers while it is the live step. */
|
|
6
|
+
verb: string;
|
|
7
|
+
/** What it was done to, in a mono chip. Also the step's key, so it has to be distinct. */
|
|
8
|
+
chip: string;
|
|
9
|
+
/** The glyph beside the verb, as a `lucide-react` component rather than an element. */
|
|
10
|
+
icon: LucideIcon;
|
|
11
|
+
}
|
|
12
|
+
/** One file the session touched, with the lines it gained and lost. */
|
|
13
|
+
interface TimelineStat {
|
|
14
|
+
/** The path, in a mono chip. Also the row's key. */
|
|
15
|
+
file: string;
|
|
16
|
+
/** Lines added, shown in the ok hue. Omit for a file that only lost lines. */
|
|
17
|
+
added?: number;
|
|
18
|
+
/** Lines removed, shown in the danger hue. Omit for a file that only gained them. */
|
|
19
|
+
removed?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* What a session summary is told: its steps, its labels, and the files it ended up
|
|
23
|
+
* changing.
|
|
24
|
+
*/
|
|
25
|
+
interface ToolTimelineProps {
|
|
26
|
+
/** Working-session verbs, chips, and icons to reveal over time. */
|
|
27
|
+
steps: readonly TimelineStep[];
|
|
28
|
+
/** How many steps from the start are currently shown. */
|
|
29
|
+
visibleSteps: number;
|
|
30
|
+
/** When true the trigger shows Working with a shimmer and elapsed timer. */
|
|
31
|
+
streaming: boolean;
|
|
32
|
+
/** Whether the collapsible timeline body is expanded. */
|
|
33
|
+
open: boolean;
|
|
34
|
+
/** Called when the user expands or collapses the timeline. */
|
|
35
|
+
onOpenChange: (open: boolean) => void;
|
|
36
|
+
/** Trigger label once streaming finishes. */
|
|
37
|
+
restingLabel: string;
|
|
38
|
+
/** Full-size live label while streaming, for example Working for 12s. */
|
|
39
|
+
activeLabel: string;
|
|
40
|
+
/** Per-file addition and removal counts listed under the steps. */
|
|
41
|
+
stats: TimelineStat[];
|
|
42
|
+
/** Extra classes merged onto the root. */
|
|
43
|
+
className?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A whole working session summarized as verbs, targets, and file stats.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* import { FileSearchIcon } from "lucide-react";
|
|
50
|
+
* import { ToolTimeline } from "@cueplusplus/ui/elements";
|
|
51
|
+
*
|
|
52
|
+
* <ToolTimeline
|
|
53
|
+
* steps={[{ verb: "Read", chip: "thread.tsx", icon: FileSearchIcon }]}
|
|
54
|
+
* visibleSteps={1}
|
|
55
|
+
* streaming
|
|
56
|
+
* open
|
|
57
|
+
* onOpenChange={setOpen}
|
|
58
|
+
* restingLabel="Worked for 12s"
|
|
59
|
+
* activeLabel="Working for 12s"
|
|
60
|
+
* stats={[{ file: "thread.tsx", added: 4, removed: 1 }]}
|
|
61
|
+
* />
|
|
62
|
+
*/
|
|
63
|
+
declare function ToolTimeline({ steps, visibleSteps, streaming, open, onOpenChange, restingLabel, activeLabel, stats, className }: ToolTimelineProps): import("react").JSX.Element;
|
|
64
|
+
//#endregion
|
|
65
|
+
export { TimelineStat, TimelineStep, ToolTimeline, ToolTimelineProps };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { ShimmerLabel, SwapLabel, collapsePanel } from "./surfaces.js";
|
|
4
|
+
import { take } from "./range.js";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Collapsible } from "@base-ui/react/collapsible";
|
|
7
|
+
import { ChevronRightIcon } from "lucide-react";
|
|
8
|
+
//#region src/elements/tool-timeline.tsx
|
|
9
|
+
/**
|
|
10
|
+
* A whole working session summarized as verbs, targets, and file stats.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* import { FileSearchIcon } from "lucide-react";
|
|
14
|
+
* import { ToolTimeline } from "@cueplusplus/ui/elements";
|
|
15
|
+
*
|
|
16
|
+
* <ToolTimeline
|
|
17
|
+
* steps={[{ verb: "Read", chip: "thread.tsx", icon: FileSearchIcon }]}
|
|
18
|
+
* visibleSteps={1}
|
|
19
|
+
* streaming
|
|
20
|
+
* open
|
|
21
|
+
* onOpenChange={setOpen}
|
|
22
|
+
* restingLabel="Worked for 12s"
|
|
23
|
+
* activeLabel="Working for 12s"
|
|
24
|
+
* stats={[{ file: "thread.tsx", added: 4, removed: 1 }]}
|
|
25
|
+
* />
|
|
26
|
+
*/
|
|
27
|
+
function ToolTimeline({ steps, visibleSteps, streaming, open, onOpenChange, restingLabel, activeLabel, stats, className }) {
|
|
28
|
+
return /* @__PURE__ */ jsxs(Collapsible.Root, {
|
|
29
|
+
"data-slot": "tool-timeline",
|
|
30
|
+
open,
|
|
31
|
+
onOpenChange,
|
|
32
|
+
className: cn("w-full max-w-sm", className),
|
|
33
|
+
children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
|
|
34
|
+
className: "group/trigger text-fg-muted hover:text-fg flex items-center gap-1.5 rounded-(--radius-control) py-1 text-(length:--cue-text-body) transition-colors outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
|
|
35
|
+
children: [/* @__PURE__ */ jsx(ChevronRightIcon, { className: "size-3.5 shrink-0 opacity-60 transition-transform duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] group-data-[panel-open]/trigger:rotate-90 motion-reduce:transition-none" }), /* @__PURE__ */ jsxs(SwapLabel, {
|
|
36
|
+
active: streaming ? 0 : 1,
|
|
37
|
+
className: "text-start tabular-nums",
|
|
38
|
+
children: [/* @__PURE__ */ jsx(ShimmerLabel, {
|
|
39
|
+
active: streaming,
|
|
40
|
+
className: "relative inline-block leading-none",
|
|
41
|
+
children: activeLabel
|
|
42
|
+
}), /* @__PURE__ */ jsx(Fragment, { children: restingLabel })]
|
|
43
|
+
})]
|
|
44
|
+
}), /* @__PURE__ */ jsx(Collapsible.Panel, {
|
|
45
|
+
className: cn(collapsePanel, "outline-none"),
|
|
46
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
47
|
+
className: "flex flex-col gap-2.5 ps-4 pt-2.5",
|
|
48
|
+
children: [take(steps, visibleSteps).map((step, index, shown) => {
|
|
49
|
+
const Icon = step.icon;
|
|
50
|
+
const active = streaming && index === shown.length - 1;
|
|
51
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
52
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both text-fg-muted flex items-center gap-2 text-(length:--cue-text-body) duration-300",
|
|
53
|
+
children: [
|
|
54
|
+
/* @__PURE__ */ jsx(Icon, { className: "text-fg-subtle size-3.5 shrink-0" }),
|
|
55
|
+
/* @__PURE__ */ jsx(ShimmerLabel, {
|
|
56
|
+
active,
|
|
57
|
+
className: "relative inline-block leading-none",
|
|
58
|
+
children: step.verb
|
|
59
|
+
}),
|
|
60
|
+
/* @__PURE__ */ jsx("span", {
|
|
61
|
+
className: "bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)",
|
|
62
|
+
children: step.chip
|
|
63
|
+
})
|
|
64
|
+
]
|
|
65
|
+
}, step.chip);
|
|
66
|
+
}), stats.length > 0 && /* @__PURE__ */ jsx("div", {
|
|
67
|
+
className: "flex flex-wrap gap-1.5 pt-1",
|
|
68
|
+
children: stats.map((stat) => /* @__PURE__ */ jsxs("span", {
|
|
69
|
+
className: "bg-surface-2 text-fg-muted inline-flex items-center gap-1 rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)",
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ jsx("span", { children: stat.file }),
|
|
72
|
+
stat.added !== void 0 && /* @__PURE__ */ jsxs("span", {
|
|
73
|
+
className: "text-ok",
|
|
74
|
+
children: ["+", stat.added]
|
|
75
|
+
}),
|
|
76
|
+
stat.removed !== void 0 && /* @__PURE__ */ jsxs("span", {
|
|
77
|
+
className: "text-danger",
|
|
78
|
+
children: ["−", stat.removed]
|
|
79
|
+
})
|
|
80
|
+
]
|
|
81
|
+
}, stat.file))
|
|
82
|
+
})]
|
|
83
|
+
})
|
|
84
|
+
})]
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
export { ToolTimeline };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/trace-waterfall.d.ts
|
|
3
|
+
/** How a span ended, or that it has not: `running`, `completed`, `failed`. */
|
|
4
|
+
type SpanStatus = "running" | "completed" | "failed";
|
|
5
|
+
/** One bar of a trace: where it starts, how long it lasts, and how deep it nests. */
|
|
6
|
+
interface TraceSpan {
|
|
7
|
+
/** Stable identity for the row key. */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Span label in the left rail; truncates rather than wraps. */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Nesting level. Indents the label; the bar position comes from startMs, not from this. */
|
|
12
|
+
depth: number;
|
|
13
|
+
/** Offset from the start of the trace. */
|
|
14
|
+
startMs: number;
|
|
15
|
+
/** How long the span took. A running span still needs one so its bar has width. */
|
|
16
|
+
durationMs: number;
|
|
17
|
+
/** Running pulses in blue, completed is neutral, failed is red. */
|
|
18
|
+
status: SpanStatus;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Every span in a run on one time axis, nested, so you can see where it actually went.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* import { TraceWaterfall } from "@cueplusplus/ui/elements";
|
|
25
|
+
*
|
|
26
|
+
* <TraceWaterfall spans={spans} totalMs={1840} visibleCount={spans.length} />
|
|
27
|
+
*/
|
|
28
|
+
declare function TraceWaterfall({ spans, totalMs, visibleCount, className, ...props }: Omit<ComponentProps<"div">, "children" | "spans" | "totalMs" | "visibleCount"> & {
|
|
29
|
+
/** Flat list in start order. Nesting comes from each span's depth. */
|
|
30
|
+
spans: readonly TraceSpan[];
|
|
31
|
+
/** Width of the axis. Bars are positioned against this, not against the widest span. */
|
|
32
|
+
totalMs: number;
|
|
33
|
+
/** How many spans have been reported so far. */
|
|
34
|
+
visibleCount: number;
|
|
35
|
+
}): import("react").JSX.Element;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { SpanStatus, TraceSpan, TraceWaterfall };
|
|
@@ -0,0 +1,69 @@
|
|
|
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/trace-waterfall.tsx
|
|
7
|
+
const TONE = {
|
|
8
|
+
running: "bg-stream",
|
|
9
|
+
completed: "bg-surface-3",
|
|
10
|
+
failed: "bg-danger/80"
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Every span in a run on one time axis, nested, so you can see where it actually went.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { TraceWaterfall } from "@cueplusplus/ui/elements";
|
|
17
|
+
*
|
|
18
|
+
* <TraceWaterfall spans={spans} totalMs={1840} visibleCount={spans.length} />
|
|
19
|
+
*/
|
|
20
|
+
function TraceWaterfall({ spans, totalMs, visibleCount, className, ...props }) {
|
|
21
|
+
const span = totalMs || 1;
|
|
22
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
23
|
+
"data-slot": "trace-waterfall",
|
|
24
|
+
className: cn(paper, "flex w-full max-w-md flex-col gap-2 rounded-(--radius-overlay) p-4", className),
|
|
25
|
+
...props,
|
|
26
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
27
|
+
className: "flex items-baseline justify-between",
|
|
28
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
29
|
+
className: "text-(length:--cue-text-body) font-medium",
|
|
30
|
+
children: "Trace"
|
|
31
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
32
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
33
|
+
children: [totalMs, "ms"]
|
|
34
|
+
})]
|
|
35
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
36
|
+
className: "flex flex-col gap-1",
|
|
37
|
+
children: take(spans, visibleCount).map((item) => {
|
|
38
|
+
const left = pct(item.startMs, span);
|
|
39
|
+
const width = Math.max(1.5, pct(item.durationMs, span));
|
|
40
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
41
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-left-1 cue-elements-animate-in cue-elements-fill-mode-both grid grid-cols-[7.5rem_1fr_2.5rem] items-center gap-2 duration-300",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ jsx("span", {
|
|
44
|
+
className: "text-fg-muted min-w-0 truncate text-(length:--cue-text-ui)",
|
|
45
|
+
style: { paddingInlineStart: `${item.depth * .75}rem` },
|
|
46
|
+
children: item.name
|
|
47
|
+
}),
|
|
48
|
+
/* @__PURE__ */ jsx("span", {
|
|
49
|
+
className: "relative flex h-4 min-w-0 items-center",
|
|
50
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
51
|
+
className: cn("absolute h-[7px] rounded-full transition-[width] duration-500 ease-out motion-reduce:transition-none", TONE[item.status], item.status === "running" && "animate-pulse"),
|
|
52
|
+
style: {
|
|
53
|
+
insetInlineStart: `${left}%`,
|
|
54
|
+
width: `${width}%`
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ jsx("span", {
|
|
59
|
+
className: cn(mono, "text-fg-subtle text-end tabular-nums"),
|
|
60
|
+
children: item.durationMs
|
|
61
|
+
})
|
|
62
|
+
]
|
|
63
|
+
}, item.id);
|
|
64
|
+
})
|
|
65
|
+
})]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { TraceWaterfall };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
//#region src/elements/transcript-rules.d.ts
|
|
3
|
+
interface TimeBoundaryProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
|
|
4
|
+
/**
|
|
5
|
+
* The label, pre-formatted: `Today`, `Yesterday`, `14 March`. This family
|
|
6
|
+
* does no date arithmetic and owns no locale — the caller knows which one the
|
|
7
|
+
* console is in, and `DaySeparator` next door takes its days the same way.
|
|
8
|
+
*/
|
|
9
|
+
label: string;
|
|
10
|
+
/**
|
|
11
|
+
* The machine-readable instant, rendering the label inside a `<time>`. Worth
|
|
12
|
+
* giving: it is what lets a test, a scraper or a deep link find the boundary
|
|
13
|
+
* without parsing the words a human reads.
|
|
14
|
+
*/
|
|
15
|
+
dateTime?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The rule that says the day changed: a label centred between two hairlines.
|
|
19
|
+
*
|
|
20
|
+
* One row, placed by the caller. That is the difference between this and
|
|
21
|
+
* `DaySeparator`, which takes a whole message list and inserts its own rules:
|
|
22
|
+
* a transcript assembled from a row union — the shape every shipping agent UI
|
|
23
|
+
* converged on — needs the boundary as a *member of that union*, not as a
|
|
24
|
+
* component that owns the list around it.
|
|
25
|
+
*
|
|
26
|
+
* It is a `role="separator"` carrying its label as an accessible name, and the
|
|
27
|
+
* text inside it is `aria-hidden`. A reader hears "Today, separator" once
|
|
28
|
+
* rather than twice, and the hairlines are never announced at all.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* import { TimeBoundary } from "@cueplusplus/ui/elements";
|
|
32
|
+
*
|
|
33
|
+
* <TimeBoundary label="Today" dateTime="2026-08-22" />
|
|
34
|
+
*/
|
|
35
|
+
declare const TimeBoundary: React.ForwardRefExoticComponent<TimeBoundaryProps & React.RefAttributes<HTMLDivElement>>;
|
|
36
|
+
interface UnreadDividerProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
|
|
37
|
+
/**
|
|
38
|
+
* What the rule says. `New` by default — one word, because the row is a place
|
|
39
|
+
* marker and not an announcement, and because the sentence a reader wants is
|
|
40
|
+
* the one below the rule.
|
|
41
|
+
*/
|
|
42
|
+
label?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The rule that says "you have read down to here": an accented line with its
|
|
46
|
+
* label at the end.
|
|
47
|
+
*
|
|
48
|
+
* The second row of Cursor's union that no catalogue ships, and the one with a
|
|
49
|
+
* rule of its own that is easy to get wrong: it marks where the reader *was*,
|
|
50
|
+
* so it does not move while they read. A divider that chased the last-seen
|
|
51
|
+
* message would vanish the moment it appeared, which is why this component
|
|
52
|
+
* takes no messages, no counts and no scroll position — the caller decides
|
|
53
|
+
* where it goes and when it leaves, and the row is only ever the mark.
|
|
54
|
+
*
|
|
55
|
+
* Accented rather than neutral, and asymmetric rather than centred, so it can
|
|
56
|
+
* never be mistaken for a {@link TimeBoundary} two rows above it.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* import { UnreadDivider } from "@cueplusplus/ui/elements";
|
|
60
|
+
*
|
|
61
|
+
* <UnreadDivider />
|
|
62
|
+
* @example
|
|
63
|
+
* <UnreadDivider label="New since you left" />
|
|
64
|
+
*/
|
|
65
|
+
declare const UnreadDivider: React.ForwardRefExoticComponent<UnreadDividerProps & React.RefAttributes<HTMLDivElement>>;
|
|
66
|
+
//#endregion
|
|
67
|
+
export { TimeBoundary, TimeBoundaryProps, UnreadDivider, UnreadDividerProps };
|