@cueplusplus/ui 0.13.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 +4028 -0
- package/LICENSE +21 -0
- package/NOTICE.md +34 -0
- package/README.md +237 -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 +54 -0
- package/dist/brand/_chassis.js +81 -0
- package/dist/brand/_geometry.js +41 -0
- package/dist/brand/cue-logotype.d.ts +29 -0
- package/dist/brand/cue-logotype.js +60 -0
- package/dist/brand/cue-mark.d.ts +30 -0
- package/dist/brand/cue-mark.js +61 -0
- package/dist/brand/index.d.ts +5 -0
- package/dist/brand/plussie.d.ts +67 -0
- package/dist/brand/plussie.js +125 -0
- package/dist/charts/_token.js +39 -0
- package/dist/charts/container.d.ts +58 -0
- package/dist/charts/container.js +77 -0
- package/dist/charts/index.d.ts +5 -0
- package/dist/charts/index.js +5 -0
- package/dist/charts/ramps.d.ts +140 -0
- package/dist/charts/ramps.js +615 -0
- package/dist/charts/theme.d.ts +112 -0
- package/dist/charts/theme.js +165 -0
- package/dist/charts/tones.d.ts +111 -0
- package/dist/charts/tones.js +127 -0
- package/dist/chat/_glyphs.js +55 -0
- package/dist/chat/agent-color.d.ts +84 -0
- package/dist/chat/agent-color.js +101 -0
- package/dist/chat/agent-pile.d.ts +55 -0
- package/dist/chat/agent-pile.js +121 -0
- package/dist/chat/ask-box.d.ts +88 -0
- package/dist/chat/ask-box.js +341 -0
- package/dist/chat/composer.d.ts +66 -0
- package/dist/chat/composer.js +144 -0
- package/dist/chat/delegation-card.d.ts +60 -0
- package/dist/chat/delegation-card.js +129 -0
- package/dist/chat/index.d.ts +8 -0
- package/dist/chat/index.js +8 -0
- package/dist/chat/message-list.d.ts +45 -0
- package/dist/chat/message-list.js +141 -0
- package/dist/chat/message.d.ts +47 -0
- package/dist/chat/message.js +108 -0
- package/dist/chrome/_band.js +54 -0
- package/dist/chrome/_drag.js +59 -0
- package/dist/chrome/_edge-scroller.d.ts +45 -0
- package/dist/chrome/_edge-scroller.js +149 -0
- package/dist/chrome/_glyphs.js +119 -0
- package/dist/chrome/_status-bar-item.js +85 -0
- package/dist/chrome/_status-bar.d.ts +15 -0
- package/dist/chrome/_status-bar.js +171 -0
- package/dist/chrome/_tabs-scroll.d.ts +67 -0
- package/dist/chrome/_tabs-scroll.js +73 -0
- package/dist/chrome/_tree.d.ts +75 -0
- package/dist/chrome/_tree.js +49 -0
- package/dist/chrome/app-bar.d.ts +103 -0
- package/dist/chrome/app-bar.js +175 -0
- package/dist/chrome/app-shell.d.ts +243 -0
- package/dist/chrome/app-shell.js +266 -0
- package/dist/chrome/band.d.ts +106 -0
- package/dist/chrome/band.js +97 -0
- package/dist/chrome/empty-state.d.ts +37 -0
- package/dist/chrome/empty-state.js +57 -0
- package/dist/chrome/eyebrow.d.ts +29 -0
- package/dist/chrome/eyebrow.js +36 -0
- package/dist/chrome/footer.d.ts +88 -0
- package/dist/chrome/footer.js +83 -0
- package/dist/chrome/index.d.ts +24 -0
- package/dist/chrome/index.js +22 -0
- package/dist/chrome/inspector.d.ts +61 -0
- package/dist/chrome/inspector.js +121 -0
- package/dist/chrome/navigation-menu.d.ts +80 -0
- package/dist/chrome/navigation-menu.js +121 -0
- package/dist/chrome/page-shell.d.ts +38 -0
- package/dist/chrome/page-shell.js +76 -0
- package/dist/chrome/panel.d.ts +55 -0
- package/dist/chrome/panel.js +67 -0
- package/dist/chrome/row.d.ts +82 -0
- package/dist/chrome/row.js +106 -0
- package/dist/chrome/scroll-area.d.ts +39 -0
- package/dist/chrome/scroll-area.js +70 -0
- package/dist/chrome/section-header.d.ts +42 -0
- package/dist/chrome/section-header.js +79 -0
- package/dist/chrome/segmented-control.d.ts +77 -0
- package/dist/chrome/segmented-control.js +95 -0
- package/dist/chrome/status-bar.d.ts +129 -0
- package/dist/chrome/status-bar.js +120 -0
- package/dist/chrome/tabs.d.ts +80 -0
- package/dist/chrome/tabs.js +132 -0
- package/dist/chrome/title-bar.d.ts +47 -0
- package/dist/chrome/title-bar.js +43 -0
- package/dist/chrome/toolbar.d.ts +68 -0
- package/dist/chrome/toolbar.js +83 -0
- package/dist/chrome/tree.d.ts +98 -0
- package/dist/chrome/tree.js +248 -0
- package/dist/color/_checker.js +14 -0
- package/dist/color/_convert.d.ts +52 -0
- package/dist/color/_convert.js +66 -0
- package/dist/color/_glyphs.js +28 -0
- package/dist/color/_thumb.js +15 -0
- package/dist/color/_value.js +28 -0
- package/dist/color/color-area.d.ts +27 -0
- package/dist/color/color-area.js +40 -0
- package/dist/color/color-field.d.ts +32 -0
- package/dist/color/color-field.js +43 -0
- package/dist/color/color-picker.d.ts +71 -0
- package/dist/color/color-picker.js +178 -0
- package/dist/color/color-slider.d.ts +31 -0
- package/dist/color/color-slider.js +51 -0
- package/dist/color/color-swatch.d.ts +32 -0
- package/dist/color/color-swatch.js +44 -0
- package/dist/color/index.d.ts +7 -0
- package/dist/color/index.js +7 -0
- package/dist/configurator/_export.d.ts +78 -0
- package/dist/configurator/_export.js +302 -0
- package/dist/configurator/_glyphs.js +92 -0
- package/dist/configurator/_overrides.d.ts +266 -0
- package/dist/configurator/_overrides.js +541 -0
- package/dist/configurator/configurator.d.ts +71 -0
- package/dist/configurator/configurator.js +284 -0
- package/dist/configurator/export-dialog.d.ts +30 -0
- package/dist/configurator/export-dialog.js +121 -0
- package/dist/configurator/index.d.ts +8 -0
- package/dist/configurator/index.js +8 -0
- package/dist/configurator/panel-sections.d.ts +86 -0
- package/dist/configurator/panel-sections.js +352 -0
- package/dist/configurator/token-editor.d.ts +74 -0
- package/dist/configurator/token-editor.js +152 -0
- package/dist/configurator/use-zoom.d.ts +87 -0
- package/dist/configurator/use-zoom.js +113 -0
- package/dist/date/_glyphs.js +34 -0
- package/dist/date/_segments.js +101 -0
- package/dist/date/_trigger.js +31 -0
- package/dist/date/calendar.d.ts +25 -0
- package/dist/date/calendar.js +125 -0
- package/dist/date/date-field.d.ts +34 -0
- package/dist/date/date-field.js +41 -0
- package/dist/date/date-picker.d.ts +69 -0
- package/dist/date/date-picker.js +89 -0
- package/dist/date/date-range-picker.d.ts +65 -0
- package/dist/date/date-range-picker.js +92 -0
- package/dist/date/index.d.ts +6 -0
- package/dist/date/index.js +6 -0
- package/dist/date/time-field.d.ts +29 -0
- package/dist/date/time-field.js +36 -0
- package/dist/dmx/_ramp.d.ts +77 -0
- package/dist/dmx/_ramp.js +169 -0
- package/dist/dmx/_readout.js +53 -0
- package/dist/dmx/_universe.d.ts +105 -0
- package/dist/dmx/_universe.js +112 -0
- package/dist/dmx/channel-matrix.d.ts +81 -0
- package/dist/dmx/channel-matrix.js +285 -0
- package/dist/dmx/dmx-bar.d.ts +50 -0
- package/dist/dmx/dmx-bar.js +107 -0
- package/dist/dmx/dmx-strip.d.ts +41 -0
- package/dist/dmx/dmx-strip.js +196 -0
- package/dist/dmx/index.d.ts +7 -0
- package/dist/dmx/index.js +7 -0
- package/dist/dmx/universe-grid.d.ts +61 -0
- package/dist/dmx/universe-grid.js +182 -0
- 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 +123 -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 +108 -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/flow/_frame.d.ts +52 -0
- package/dist/flow/_frame.js +38 -0
- package/dist/flow/controls.d.ts +41 -0
- package/dist/flow/controls.js +53 -0
- package/dist/flow/flow.css +121 -0
- package/dist/flow/handles.d.ts +40 -0
- package/dist/flow/handles.js +61 -0
- package/dist/flow/index.d.ts +7 -0
- package/dist/flow/index.js +7 -0
- package/dist/flow/node-card.d.ts +71 -0
- package/dist/flow/node-card.js +102 -0
- package/dist/flow/signal-edge.d.ts +60 -0
- package/dist/flow/signal-edge.js +108 -0
- package/dist/flow/use-flow-theme.d.ts +69 -0
- package/dist/flow/use-flow-theme.js +109 -0
- package/dist/forms/_chassis.d.ts +164 -0
- package/dist/forms/_chassis.js +159 -0
- package/dist/forms/_glyphs.js +143 -0
- package/dist/forms/_listbox.js +55 -0
- package/dist/forms/autocomplete.d.ts +61 -0
- package/dist/forms/autocomplete.js +88 -0
- package/dist/forms/button-group.d.ts +47 -0
- package/dist/forms/button-group.js +52 -0
- package/dist/forms/checkbox.d.ts +51 -0
- package/dist/forms/checkbox.js +98 -0
- package/dist/forms/combobox.d.ts +73 -0
- package/dist/forms/combobox.js +108 -0
- package/dist/forms/env-var-input.d.ts +74 -0
- package/dist/forms/env-var-input.js +116 -0
- package/dist/forms/field.d.ts +89 -0
- package/dist/forms/field.js +102 -0
- package/dist/forms/file-upload.d.ts +113 -0
- package/dist/forms/file-upload.js +232 -0
- package/dist/forms/index.d.ts +26 -0
- package/dist/forms/index.js +26 -0
- package/dist/forms/input-group.d.ts +36 -0
- package/dist/forms/input-group.js +59 -0
- package/dist/forms/input.d.ts +45 -0
- package/dist/forms/input.js +36 -0
- package/dist/forms/multi-select.d.ts +62 -0
- package/dist/forms/multi-select.js +107 -0
- package/dist/forms/number-field.d.ts +39 -0
- package/dist/forms/number-field.js +65 -0
- package/dist/forms/otp-field.d.ts +54 -0
- package/dist/forms/otp-field.js +59 -0
- package/dist/forms/password-input.d.ts +46 -0
- package/dist/forms/password-input.js +62 -0
- package/dist/forms/radio-group.d.ts +50 -0
- package/dist/forms/radio-group.js +64 -0
- package/dist/forms/rating.d.ts +69 -0
- package/dist/forms/rating.js +103 -0
- package/dist/forms/scrub-input.d.ts +81 -0
- package/dist/forms/scrub-input.js +249 -0
- package/dist/forms/search-input.d.ts +54 -0
- package/dist/forms/search-input.js +112 -0
- package/dist/forms/select.d.ts +75 -0
- package/dist/forms/select.js +91 -0
- package/dist/forms/slider.d.ts +44 -0
- package/dist/forms/slider.js +65 -0
- package/dist/forms/switch.d.ts +36 -0
- package/dist/forms/switch.js +71 -0
- package/dist/forms/tags-input.d.ts +69 -0
- package/dist/forms/tags-input.js +148 -0
- package/dist/forms/textarea.d.ts +39 -0
- package/dist/forms/textarea.js +37 -0
- package/dist/forms/toggle-group.d.ts +41 -0
- package/dist/forms/toggle-group.js +56 -0
- package/dist/forms/toggle.d.ts +47 -0
- package/dist/forms/toggle.js +100 -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 +138 -0
- package/dist/index.js +124 -0
- package/dist/instruments/_ansi.js +116 -0
- package/dist/instruments/_data-row.d.ts +68 -0
- package/dist/instruments/_data-row.js +139 -0
- package/dist/instruments/_glyphs.js +90 -0
- package/dist/instruments/_ledger-disclosure.js +103 -0
- package/dist/instruments/_ledger.d.ts +21 -0
- package/dist/instruments/_ledger.js +5 -0
- package/dist/instruments/_motion.js +56 -0
- package/dist/instruments/_rem.js +21 -0
- package/dist/instruments/app-window-frame.d.ts +48 -0
- package/dist/instruments/app-window-frame.js +76 -0
- package/dist/instruments/code-block.d.ts +35 -0
- package/dist/instruments/code-block.js +173 -0
- package/dist/instruments/copy-button.d.ts +41 -0
- package/dist/instruments/copy-button.js +112 -0
- package/dist/instruments/data-row.d.ts +94 -0
- package/dist/instruments/data-row.js +151 -0
- package/dist/instruments/data-table.d.ts +168 -0
- package/dist/instruments/data-table.js +212 -0
- package/dist/instruments/data-tree.d.ts +126 -0
- package/dist/instruments/data-tree.js +303 -0
- package/dist/instruments/group-bar.d.ts +63 -0
- package/dist/instruments/group-bar.js +122 -0
- package/dist/instruments/index.d.ts +18 -0
- package/dist/instruments/index.js +18 -0
- package/dist/instruments/ledger.d.ts +204 -0
- package/dist/instruments/ledger.js +204 -0
- package/dist/instruments/log-viewer.d.ts +74 -0
- package/dist/instruments/log-viewer.js +215 -0
- package/dist/instruments/meter.d.ts +81 -0
- package/dist/instruments/meter.js +96 -0
- package/dist/instruments/progress.d.ts +61 -0
- package/dist/instruments/progress.js +79 -0
- package/dist/instruments/seam-grid.d.ts +66 -0
- package/dist/instruments/seam-grid.js +78 -0
- package/dist/instruments/sparkline.d.ts +39 -0
- package/dist/instruments/sparkline.js +85 -0
- package/dist/instruments/stat.d.ts +35 -0
- package/dist/instruments/stat.js +59 -0
- package/dist/instruments/table.d.ts +170 -0
- package/dist/instruments/table.js +237 -0
- package/dist/instruments/terminal-frame.d.ts +89 -0
- package/dist/instruments/terminal-frame.js +256 -0
- package/dist/instruments/two-step-button.d.ts +47 -0
- package/dist/instruments/two-step-button.js +166 -0
- package/dist/instruments/usage-chart.d.ts +55 -0
- package/dist/instruments/usage-chart.js +235 -0
- package/dist/layout/_collapse.js +46 -0
- package/dist/layout/_glyphs.js +45 -0
- package/dist/layout/_ground.d.ts +22 -0
- package/dist/layout/_ground.js +9 -0
- package/dist/layout/accordion.d.ts +52 -0
- package/dist/layout/accordion.js +81 -0
- package/dist/layout/bento.d.ts +144 -0
- package/dist/layout/bento.js +266 -0
- package/dist/layout/breadcrumb.d.ts +35 -0
- package/dist/layout/breadcrumb.js +67 -0
- package/dist/layout/card.d.ts +51 -0
- package/dist/layout/card.js +76 -0
- package/dist/layout/carousel.d.ts +96 -0
- package/dist/layout/carousel.js +211 -0
- package/dist/layout/collapsible.d.ts +74 -0
- package/dist/layout/collapsible.js +126 -0
- package/dist/layout/container.d.ts +27 -0
- package/dist/layout/container.js +43 -0
- package/dist/layout/description-list.d.ts +24 -0
- package/dist/layout/description-list.js +37 -0
- package/dist/layout/frames.d.ts +70 -0
- package/dist/layout/frames.js +298 -0
- package/dist/layout/grid.d.ts +40 -0
- package/dist/layout/grid.js +48 -0
- package/dist/layout/index.d.ts +19 -0
- package/dist/layout/index.js +18 -0
- package/dist/layout/item.d.ts +65 -0
- package/dist/layout/item.js +100 -0
- package/dist/layout/link.d.ts +48 -0
- package/dist/layout/link.js +63 -0
- package/dist/layout/pagination.d.ts +54 -0
- package/dist/layout/pagination.js +121 -0
- package/dist/layout/preview.d.ts +177 -0
- package/dist/layout/preview.js +628 -0
- package/dist/layout/resizable.d.ts +38 -0
- package/dist/layout/resizable.js +68 -0
- package/dist/layout/sidebar.d.ts +105 -0
- package/dist/layout/sidebar.js +158 -0
- package/dist/layout/stack.d.ts +46 -0
- package/dist/layout/stack.js +62 -0
- package/dist/layout/stepper.d.ts +49 -0
- package/dist/layout/stepper.js +81 -0
- package/dist/layout/timeline.d.ts +43 -0
- package/dist/layout/timeline.js +63 -0
- package/dist/lib/aria-class.js +24 -0
- package/dist/lib/cn.js +18 -0
- package/dist/lib/compose.js +38 -0
- package/dist/lib/cva.d.ts +18 -0
- package/dist/lib/cva.js +65 -0
- package/dist/midi/_notes.d.ts +101 -0
- package/dist/midi/_notes.js +183 -0
- package/dist/midi/_ruler.d.ts +100 -0
- package/dist/midi/_ruler.js +105 -0
- package/dist/midi/_time.d.ts +107 -0
- package/dist/midi/_time.js +130 -0
- package/dist/midi/index.d.ts +9 -0
- package/dist/midi/index.js +9 -0
- package/dist/midi/musical-time-input.d.ts +48 -0
- package/dist/midi/musical-time-input.js +154 -0
- package/dist/midi/piano-keyboard.d.ts +50 -0
- package/dist/midi/piano-keyboard.js +197 -0
- package/dist/midi/spectrum-visualizer.d.ts +65 -0
- package/dist/midi/spectrum-visualizer.js +213 -0
- package/dist/midi/threshold-rail.d.ts +72 -0
- package/dist/midi/threshold-rail.js +214 -0
- package/dist/midi/timeline-ruler.d.ts +83 -0
- package/dist/midi/timeline-ruler.js +152 -0
- package/dist/overlays/_debounce.js +34 -0
- package/dist/overlays/_glyphs.js +59 -0
- package/dist/overlays/_surface.d.ts +70 -0
- package/dist/overlays/_surface.js +70 -0
- package/dist/overlays/_wheel.js +42 -0
- package/dist/overlays/alert-dialog.d.ts +67 -0
- package/dist/overlays/alert-dialog.js +117 -0
- package/dist/overlays/command-palette.d.ts +93 -0
- package/dist/overlays/command-palette.js +193 -0
- package/dist/overlays/context-menu.d.ts +64 -0
- package/dist/overlays/context-menu.js +78 -0
- package/dist/overlays/dialog.d.ts +72 -0
- package/dist/overlays/dialog.js +124 -0
- package/dist/overlays/drawer.d.ts +75 -0
- package/dist/overlays/drawer.js +151 -0
- package/dist/overlays/dropdown-menu.d.ts +79 -0
- package/dist/overlays/dropdown-menu.js +156 -0
- package/dist/overlays/hover-card.d.ts +58 -0
- package/dist/overlays/hover-card.js +91 -0
- package/dist/overlays/index.d.ts +15 -0
- package/dist/overlays/index.js +15 -0
- package/dist/overlays/info-tip.d.ts +41 -0
- package/dist/overlays/info-tip.js +45 -0
- package/dist/overlays/menubar.d.ts +72 -0
- package/dist/overlays/menubar.js +100 -0
- package/dist/overlays/popover.d.ts +66 -0
- package/dist/overlays/popover.js +114 -0
- package/dist/overlays/sheet.d.ts +78 -0
- package/dist/overlays/sheet.js +131 -0
- package/dist/overlays/toast.d.ts +106 -0
- package/dist/overlays/toast.js +146 -0
- package/dist/overlays/tooltip.d.ts +57 -0
- package/dist/overlays/tooltip.js +95 -0
- package/dist/primitives/avatar.d.ts +51 -0
- package/dist/primitives/avatar.js +93 -0
- package/dist/primitives/button.d.ts +58 -0
- package/dist/primitives/button.js +104 -0
- package/dist/primitives/chip.d.ts +73 -0
- package/dist/primitives/chip.js +238 -0
- package/dist/primitives/icon-button.d.ts +41 -0
- package/dist/primitives/icon-button.js +59 -0
- package/dist/primitives/index.d.ts +10 -0
- package/dist/primitives/index.js +10 -0
- package/dist/primitives/kbd.d.ts +17 -0
- package/dist/primitives/kbd.js +24 -0
- package/dist/primitives/separator.d.ts +25 -0
- package/dist/primitives/separator.js +30 -0
- package/dist/primitives/skeleton.d.ts +20 -0
- package/dist/primitives/skeleton.js +27 -0
- package/dist/primitives/spinner.d.ts +26 -0
- package/dist/primitives/spinner.js +31 -0
- package/dist/primitives/status-dot.d.ts +51 -0
- package/dist/primitives/status-dot.js +57 -0
- package/dist/styles.css +97 -0
- package/dist/system/agent-skin.d.ts +27 -0
- package/dist/system/agent-skin.js +20 -0
- package/dist/system/density.d.ts +73 -0
- package/dist/system/density.js +111 -0
- package/dist/system/index.d.ts +12 -0
- package/dist/system/index.js +10 -0
- package/dist/system/overrides.d.ts +80 -0
- package/dist/system/overrides.js +277 -0
- package/dist/system/portal.d.ts +56 -0
- package/dist/system/portal.js +193 -0
- package/dist/system/prepaint.d.ts +134 -0
- package/dist/system/prepaint.js +120 -0
- package/dist/system/theme-provider.d.ts +290 -0
- package/dist/system/theme-provider.js +543 -0
- package/dist/system/theme-registry.d.ts +53 -0
- package/dist/system/theme-registry.js +66 -0
- package/dist/system/use-density.d.ts +50 -0
- package/dist/system/use-density.js +232 -0
- package/dist/system/use-isomorphic-layout-effect.js +33 -0
- package/dist/system/use-theme.d.ts +30 -0
- package/dist/system/use-theme.js +36 -0
- package/dist/system/vocabulary.d.ts +16 -0
- package/dist/system/vocabulary.js +125 -0
- package/dist/theming/contrast.d.ts +2 -0
- package/dist/theming/contrast.js +2 -0
- package/dist/theming/create-theme.d.ts +195 -0
- package/dist/theming/create-theme.js +524 -0
- package/dist/theming/index.d.ts +4 -0
- package/dist/theming/index.js +4 -0
- package/dist/theming/serialize.d.ts +167 -0
- package/dist/theming/serialize.js +241 -0
- package/manifest/components/accordion.json +173 -0
- package/manifest/components/activity-graph.json +104 -0
- package/manifest/components/agent-card.json +150 -0
- package/manifest/components/agent-handoff.json +104 -0
- package/manifest/components/agent-mode-badge.json +102 -0
- package/manifest/components/agent-pile.json +147 -0
- package/manifest/components/agent-plan.json +74 -0
- package/manifest/components/agent-status.json +87 -0
- package/manifest/components/agent-surface.json +93 -0
- package/manifest/components/alert-dialog.json +215 -0
- package/manifest/components/animated-number.json +75 -0
- package/manifest/components/app-bar.json +297 -0
- package/manifest/components/app-shell.json +526 -0
- package/manifest/components/app-window-frame.json +124 -0
- package/manifest/components/approval-card.json +136 -0
- package/manifest/components/artifact-card.json +93 -0
- package/manifest/components/ask-box.json +288 -0
- package/manifest/components/audience-icon.json +46 -0
- package/manifest/components/autocomplete.json +262 -0
- package/manifest/components/avatar-group.json +83 -0
- package/manifest/components/avatar.json +113 -0
- package/manifest/components/background-inbox.json +79 -0
- package/manifest/components/band.json +104 -0
- package/manifest/components/bento.json +306 -0
- package/manifest/components/branch-picker.json +146 -0
- package/manifest/components/breadcrumb.json +85 -0
- package/manifest/components/button-group.json +91 -0
- package/manifest/components/button.json +163 -0
- package/manifest/components/calendar.json +65 -0
- package/manifest/components/canvas-split-body.json +66 -0
- package/manifest/components/canvas-split-document.json +55 -0
- package/manifest/components/canvas-split-header.json +97 -0
- package/manifest/components/canvas-split-line.json +66 -0
- package/manifest/components/canvas-split-message.json +70 -0
- package/manifest/components/canvas-split-thread.json +55 -0
- package/manifest/components/canvas-split.json +61 -0
- package/manifest/components/card.json +152 -0
- package/manifest/components/carousel.json +242 -0
- package/manifest/components/catalogue-icon.json +46 -0
- package/manifest/components/channel-beta-icon.json +46 -0
- package/manifest/components/channel-matrix.json +239 -0
- package/manifest/components/channel-released-icon.json +46 -0
- package/manifest/components/chart-container.json +127 -0
- package/manifest/components/chart-ramp.json +82 -0
- package/manifest/components/chart-swatch.json +72 -0
- package/manifest/components/chart-tooltip-content.json +140 -0
- package/manifest/components/chart.json +117 -0
- package/manifest/components/chat-empty-state.json +55 -0
- package/manifest/components/chat-panel-assistant-message.json +52 -0
- package/manifest/components/chat-panel-composer.json +74 -0
- package/manifest/components/chat-panel-messages.json +52 -0
- package/manifest/components/chat-panel-typing.json +52 -0
- package/manifest/components/chat-panel-user-message.json +52 -0
- package/manifest/components/chat-panel.json +58 -0
- package/manifest/components/checkbox-group.json +70 -0
- package/manifest/components/checkbox.json +106 -0
- package/manifest/components/checkpoint-history.json +91 -0
- package/manifest/components/chip.json +174 -0
- package/manifest/components/clamp.json +125 -0
- package/manifest/components/cli-tool-icon.json +46 -0
- package/manifest/components/code-block.json +107 -0
- package/manifest/components/code-diff.json +104 -0
- package/manifest/components/code-runner.json +124 -0
- package/manifest/components/collapsible.json +133 -0
- package/manifest/components/color-area.json +62 -0
- package/manifest/components/color-field.json +91 -0
- package/manifest/components/color-picker.json +235 -0
- package/manifest/components/color-slider.json +84 -0
- package/manifest/components/color-swatch.json +79 -0
- package/manifest/components/colors-section.json +70 -0
- package/manifest/components/combobox.json +265 -0
- package/manifest/components/command-palette.json +222 -0
- package/manifest/components/compaction-row.json +128 -0
- package/manifest/components/comparison-card.json +98 -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 +83 -0
- package/manifest/components/composer-attachments.json +60 -0
- package/manifest/components/composer-bar.json +76 -0
- package/manifest/components/composer-command-item.json +85 -0
- package/manifest/components/composer-context.json +71 -0
- package/manifest/components/composer-input.json +77 -0
- package/manifest/components/composer-menu-item.json +75 -0
- package/manifest/components/composer-menu.json +89 -0
- package/manifest/components/composer-model-item.json +82 -0
- package/manifest/components/composer-model-trigger.json +81 -0
- package/manifest/components/composer-person-item.json +86 -0
- package/manifest/components/composer-send.json +86 -0
- package/manifest/components/composer-toolbar.json +65 -0
- package/manifest/components/composer-voice-button.json +71 -0
- package/manifest/components/composer-voice.json +81 -0
- package/manifest/components/composer.json +238 -0
- package/manifest/components/computer-use.json +98 -0
- package/manifest/components/confidence-marker.json +86 -0
- package/manifest/components/connection-state.json +103 -0
- package/manifest/components/container.json +75 -0
- package/manifest/components/context-breakdown.json +72 -0
- package/manifest/components/context-menu.json +134 -0
- package/manifest/components/context-usage.json +98 -0
- package/manifest/components/conversation-search.json +111 -0
- package/manifest/components/copy-button.json +118 -0
- package/manifest/components/cost-meter.json +84 -0
- package/manifest/components/cue-logotype.json +110 -0
- package/manifest/components/cue-mark.json +111 -0
- package/manifest/components/cue-portal-frame.json +65 -0
- package/manifest/components/data-row.json +222 -0
- package/manifest/components/data-table-pagination.json +97 -0
- package/manifest/components/data-table-toolbar.json +127 -0
- package/manifest/components/data-tree.json +185 -0
- package/manifest/components/date-field.json +93 -0
- package/manifest/components/date-picker.json +255 -0
- package/manifest/components/date-range-picker.json +255 -0
- package/manifest/components/day-separator.json +63 -0
- package/manifest/components/delegation-card.json +196 -0
- package/manifest/components/density.json +93 -0
- package/manifest/components/description-list.json +91 -0
- package/manifest/components/diagram.json +126 -0
- package/manifest/components/dialog.json +222 -0
- package/manifest/components/disclosure.json +134 -0
- package/manifest/components/dmx-bar.json +107 -0
- package/manifest/components/dmx-strip.json +117 -0
- package/manifest/components/document-reference.json +108 -0
- package/manifest/components/draft-restore.json +96 -0
- package/manifest/components/drawer.json +204 -0
- package/manifest/components/dropdown-menu.json +275 -0
- package/manifest/components/edit-message.json +131 -0
- package/manifest/components/elements-command-palette.json +122 -0
- package/manifest/components/elements-composer.json +71 -0
- package/manifest/components/elements-data-table.json +75 -0
- package/manifest/components/elements-timeline.json +77 -0
- package/manifest/components/elicitation-form.json +130 -0
- package/manifest/components/empty-state-composer.json +71 -0
- package/manifest/components/empty-state-greeting.json +49 -0
- package/manifest/components/empty-state-suggestion.json +60 -0
- package/manifest/components/empty-state-suggestions.json +49 -0
- package/manifest/components/empty-state.json +111 -0
- package/manifest/components/end-of-turn-summary.json +89 -0
- package/manifest/components/env-var-input.json +194 -0
- package/manifest/components/error-state.json +93 -0
- package/manifest/components/export-dialog.json +101 -0
- package/manifest/components/eyebrow.json +59 -0
- package/manifest/components/feedback-dialog.json +133 -0
- package/manifest/components/field-description.json +66 -0
- package/manifest/components/field-error.json +87 -0
- package/manifest/components/field-label.json +66 -0
- package/manifest/components/field.json +82 -0
- package/manifest/components/file-tree.json +96 -0
- package/manifest/components/file-upload.json +204 -0
- package/manifest/components/flow-background.json +50 -0
- package/manifest/components/flow-controls.json +50 -0
- package/manifest/components/flow-graph.json +86 -0
- package/manifest/components/folder-icon.json +46 -0
- package/manifest/components/footer.json +133 -0
- package/manifest/components/frac.json +68 -0
- package/manifest/components/frames.json +210 -0
- package/manifest/components/generation-loader.json +78 -0
- package/manifest/components/generative-ui.json +125 -0
- package/manifest/components/grid.json +132 -0
- package/manifest/components/group-bar.json +122 -0
- package/manifest/components/guardrail-notice.json +109 -0
- package/manifest/components/hover-card.json +189 -0
- package/manifest/components/icon-button.json +106 -0
- package/manifest/components/image-generation.json +73 -0
- package/manifest/components/info-tip.json +133 -0
- package/manifest/components/inline-citation.json +90 -0
- package/manifest/components/input-group.json +112 -0
- package/manifest/components/input.json +121 -0
- package/manifest/components/inspector.json +199 -0
- package/manifest/components/item.json +163 -0
- package/manifest/components/job-progress.json +116 -0
- package/manifest/components/kbd.json +52 -0
- package/manifest/components/launcher-bubble.json +130 -0
- package/manifest/components/ledger.json +330 -0
- package/manifest/components/link.json +94 -0
- package/manifest/components/live-region-announcer.json +95 -0
- package/manifest/components/log-viewer.json +172 -0
- package/manifest/components/map-answer.json +97 -0
- package/manifest/components/markdown-text.json +126 -0
- package/manifest/components/math-block.json +84 -0
- package/manifest/components/mcp-server-icon.json +46 -0
- package/manifest/components/mcp-server-panel.json +102 -0
- package/manifest/components/memory-chips.json +73 -0
- package/manifest/components/menubar.json +184 -0
- package/manifest/components/message-actions.json +125 -0
- package/manifest/components/message-attachments.json +71 -0
- package/manifest/components/message-branches.json +83 -0
- package/manifest/components/message-list.json +121 -0
- package/manifest/components/message-pair.json +107 -0
- package/manifest/components/message-queue.json +85 -0
- package/manifest/components/message-timing.json +69 -0
- package/manifest/components/message.json +149 -0
- package/manifest/components/meter.json +150 -0
- package/manifest/components/mobile-composer.json +163 -0
- package/manifest/components/model-picker.json +87 -0
- package/manifest/components/multi-select.json +255 -0
- package/manifest/components/musical-time-input.json +141 -0
- package/manifest/components/navigation-menu.json +269 -0
- package/manifest/components/node-card.json +144 -0
- package/manifest/components/node-handle.json +84 -0
- package/manifest/components/number-field.json +131 -0
- package/manifest/components/number-ticker.json +67 -0
- package/manifest/components/onboarding.json +100 -0
- package/manifest/components/otp-field.json +163 -0
- package/manifest/components/page-shell.json +129 -0
- package/manifest/components/pagination.json +108 -0
- package/manifest/components/panel-header.json +89 -0
- package/manifest/components/panel.json +71 -0
- package/manifest/components/password-input.json +171 -0
- package/manifest/components/permission-grant.json +115 -0
- package/manifest/components/permission-scopes.json +184 -0
- package/manifest/components/piano-keyboard.json +149 -0
- package/manifest/components/plussie.json +140 -0
- package/manifest/components/popover.json +231 -0
- package/manifest/components/preset-section.json +80 -0
- package/manifest/components/preview.json +294 -0
- package/manifest/components/progress.json +114 -0
- package/manifest/components/prompt-library.json +122 -0
- package/manifest/components/queue-dock.json +139 -0
- package/manifest/components/quota-banner.json +113 -0
- package/manifest/components/quote-reply.json +129 -0
- package/manifest/components/radio-group.json +83 -0
- package/manifest/components/radio.json +94 -0
- package/manifest/components/rating.json +188 -0
- package/manifest/components/read-aloud.json +139 -0
- package/manifest/components/reasoning-effort.json +95 -0
- package/manifest/components/reasoning-panel.json +135 -0
- package/manifest/components/recommendation-card.json +133 -0
- package/manifest/components/regenerate-menu.json +107 -0
- package/manifest/components/replay-player.json +124 -0
- package/manifest/components/research-report.json +87 -0
- package/manifest/components/resizable.json +91 -0
- package/manifest/components/retrieval-chunks.json +98 -0
- package/manifest/components/revert-dock.json +197 -0
- package/manifest/components/reviewable-diff.json +113 -0
- package/manifest/components/risk-badge.json +89 -0
- package/manifest/components/row.json +122 -0
- package/manifest/components/schedule-card.json +121 -0
- package/manifest/components/score-breakdown.json +108 -0
- package/manifest/components/scroll-anchor.json +84 -0
- package/manifest/components/scroll-area.json +114 -0
- package/manifest/components/scrollable-tabs-list.json +91 -0
- package/manifest/components/scrub-input.json +268 -0
- package/manifest/components/seam-cell.json +91 -0
- package/manifest/components/seam-grid.json +84 -0
- package/manifest/components/seam-list.json +56 -0
- package/manifest/components/search-input.json +195 -0
- package/manifest/components/section-header.json +140 -0
- package/manifest/components/segmented-control.json +178 -0
- package/manifest/components/select.json +253 -0
- package/manifest/components/separator.json +56 -0
- package/manifest/components/settings-panel.json +152 -0
- package/manifest/components/shape-section.json +70 -0
- package/manifest/components/shared-conversation.json +107 -0
- package/manifest/components/sheet.json +210 -0
- package/manifest/components/shimmer-label.json +61 -0
- package/manifest/components/sidebar.json +245 -0
- package/manifest/components/signal-edge.json +56 -0
- package/manifest/components/skeleton.json +46 -0
- package/manifest/components/skill-icon.json +46 -0
- package/manifest/components/slider.json +106 -0
- package/manifest/components/sources.json +97 -0
- package/manifest/components/sparkline.json +89 -0
- package/manifest/components/speaker-identity.json +66 -0
- package/manifest/components/spec-sheet.json +93 -0
- package/manifest/components/spectrum-visualizer.json +147 -0
- package/manifest/components/spinner.json +71 -0
- package/manifest/components/stack-icon.json +46 -0
- package/manifest/components/stack.json +143 -0
- package/manifest/components/stacks-matrix-icon.json +46 -0
- package/manifest/components/stat.json +111 -0
- package/manifest/components/status-bar.json +233 -0
- package/manifest/components/status-dot.json +97 -0
- package/manifest/components/stepper.json +107 -0
- package/manifest/components/stopped-run.json +97 -0
- package/manifest/components/streaming-text.json +82 -0
- package/manifest/components/sub.json +45 -0
- package/manifest/components/subagent-list.json +106 -0
- package/manifest/components/suggestions.json +106 -0
- package/manifest/components/sup.json +45 -0
- package/manifest/components/swap-label.json +86 -0
- package/manifest/components/switch.json +102 -0
- package/manifest/components/table-scroll-region.json +78 -0
- package/manifest/components/table.json +306 -0
- package/manifest/components/tabs.json +156 -0
- package/manifest/components/tags-input.json +255 -0
- package/manifest/components/tail-status.json +138 -0
- package/manifest/components/terminal-block.json +111 -0
- package/manifest/components/terminal-frame.json +146 -0
- package/manifest/components/textarea.json +104 -0
- package/manifest/components/theme-configurator.json +158 -0
- package/manifest/components/theme-provider.json +228 -0
- package/manifest/components/thinking-indicator.json +69 -0
- package/manifest/components/thread-list.json +87 -0
- package/manifest/components/thread-search.json +108 -0
- package/manifest/components/threshold-rail.json +223 -0
- package/manifest/components/time-boundary.json +68 -0
- package/manifest/components/time-field.json +93 -0
- package/manifest/components/timeline-ruler.json +178 -0
- package/manifest/components/timeline.json +131 -0
- package/manifest/components/title-bar.json +97 -0
- package/manifest/components/toast.json +140 -0
- package/manifest/components/todo-list.json +76 -0
- package/manifest/components/toggle-group.json +134 -0
- package/manifest/components/toggle.json +140 -0
- package/manifest/components/token-editor.json +106 -0
- package/manifest/components/tool-call-card.json +268 -0
- package/manifest/components/tool-call.json +147 -0
- package/manifest/components/tool-error.json +141 -0
- package/manifest/components/tool-group.json +97 -0
- package/manifest/components/tool-timeline.json +147 -0
- package/manifest/components/toolbar.json +192 -0
- package/manifest/components/tooltip.json +199 -0
- package/manifest/components/trace-waterfall.json +84 -0
- package/manifest/components/tree-visibility-toggle.json +99 -0
- package/manifest/components/tree.json +182 -0
- package/manifest/components/turn-footer.json +133 -0
- package/manifest/components/two-step-button.json +150 -0
- package/manifest/components/typing-indicator.json +60 -0
- package/manifest/components/universe-grid.json +155 -0
- package/manifest/components/unread-divider.json +58 -0
- package/manifest/components/usage-chart.json +162 -0
- package/manifest/components/verdict-row.json +106 -0
- package/manifest/components/voice-conversation.json +141 -0
- package/manifest/components/web-preview.json +105 -0
- package/manifest/components/web-search.json +108 -0
- package/manifest/components/work-collapse.json +125 -0
- package/manifest/fixtures.json +776 -0
- package/manifest/manifest.json +5037 -0
- package/manifest/tokens.json +288 -0
- package/package.json +278 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { useIsomorphicInsertionEffect, useIsomorphicLayoutEffect } from "./use-isomorphic-layout-effect.js";
|
|
4
|
+
import { AmbientThemeContext, DensityContext, StyleSetContext } from "./density.js";
|
|
5
|
+
import { buildRegistry, isStyleSet, vocabulary, warnOnce } from "./vocabulary.js";
|
|
6
|
+
import { OverridesContext, inlineOverrides, overridesCss, reportOverrides } from "./overrides.js";
|
|
7
|
+
import { DEFAULT_STORAGE_KEY } from "./prepaint.js";
|
|
8
|
+
import { ThemeRegistryContext } from "./theme-registry.js";
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { MODES, THEME_NAME_PATTERN, validateManifest } from "@cueplusplus/theme-base";
|
|
12
|
+
//#region src/system/theme-provider.tsx
|
|
13
|
+
/**
|
|
14
|
+
* The empty registry, at module scope so the default is referentially stable.
|
|
15
|
+
*
|
|
16
|
+
* Every memo below is keyed on `themes`, and a fresh `[]` per render would
|
|
17
|
+
* rebuild the registry, the vocabulary and the context value on every commit of
|
|
18
|
+
* every app that has not registered anything yet — which, for one release, is
|
|
19
|
+
* all of them.
|
|
20
|
+
*/
|
|
21
|
+
const EMPTY = [];
|
|
22
|
+
/**
|
|
23
|
+
* Dark-first defaults, and the one thing to know about the first of them: it is
|
|
24
|
+
* a *name*, and since this release nothing in the library paints it.
|
|
25
|
+
*
|
|
26
|
+
* A bare `:root` used to carry `cue`'s palette, because `@cueplusplus/tokens`
|
|
27
|
+
* shipped ten presets and put the default one there. `styles.css` now imports
|
|
28
|
+
* `@cueplusplus/theme-base/base.css` instead, whose `:root` is the blank base —
|
|
29
|
+
* greys and one desaturated accent. So an app that registers nothing and stamps
|
|
30
|
+
* nothing gets `data-theme="cue"` on its provider element and paints the blank
|
|
31
|
+
* base, because no stylesheet on the page declares a `[data-theme="cue"]` block.
|
|
32
|
+
* Colour is decided by CSS, not by this constant.
|
|
33
|
+
*
|
|
34
|
+
* That is deliberate and it is why the name stays `cue`: the alternative — a
|
|
35
|
+
* default of `"base"` or `""` — would change what every app that *does* import
|
|
36
|
+
* `@cueplusplus/theme-cue/theme.css` renders when it passes no `theme` prop, to
|
|
37
|
+
* buy nothing, since a name that matches no imported block already paints the
|
|
38
|
+
* base.
|
|
39
|
+
*/
|
|
40
|
+
const DEFAULT_THEME = "cue";
|
|
41
|
+
const DEFAULT_MODE = "dark";
|
|
42
|
+
const DEFAULT_RESOLVED_MODE = "dark";
|
|
43
|
+
/**
|
|
44
|
+
* Ambient theme state. `null` outside a provider, which is how `useTheme()`
|
|
45
|
+
* knows to throw and how the portal helpers know to use the defaults.
|
|
46
|
+
*
|
|
47
|
+
* Internal: consumers read it through `useTheme()`.
|
|
48
|
+
*/
|
|
49
|
+
const ThemeContext = React.createContext(null);
|
|
50
|
+
/**
|
|
51
|
+
* The nearest provider's `fontScale`, published on its own so portal roots can
|
|
52
|
+
* republish it. A portal mounts outside the provider's DOM subtree and so
|
|
53
|
+
* inherits none of its custom properties — including `--cue-font-scale`, which
|
|
54
|
+
* every text token multiplies by. `null` means "no provider above", in which
|
|
55
|
+
* case a portal leaves whatever the document already declares alone.
|
|
56
|
+
*
|
|
57
|
+
* Internal: not part of the public API.
|
|
58
|
+
*/
|
|
59
|
+
const FontScaleContext = React.createContext(null);
|
|
60
|
+
/** Effective font-family overrides from the nearest provider chain. */
|
|
61
|
+
const FontFamiliesContext = React.createContext(null);
|
|
62
|
+
function isOneOf(allowed, value) {
|
|
63
|
+
return typeof value === "string" && allowed.includes(value);
|
|
64
|
+
}
|
|
65
|
+
function readPreferences(storageKey) {
|
|
66
|
+
if (typeof localStorage === "undefined") return {};
|
|
67
|
+
try {
|
|
68
|
+
const raw = localStorage.getItem(storageKey);
|
|
69
|
+
if (raw === null) return {};
|
|
70
|
+
const parsed = JSON.parse(raw);
|
|
71
|
+
if (parsed === null || typeof parsed !== "object") return {};
|
|
72
|
+
return parsed;
|
|
73
|
+
} catch {
|
|
74
|
+
return {};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The stored quadruple, accepted the way the pre-paint script accepts it:
|
|
79
|
+
* **theme first**, then each axis under the theme resolution actually chose.
|
|
80
|
+
*
|
|
81
|
+
* A rung a theme adds is scoped by the cascade to that theme's `data-theme`, so
|
|
82
|
+
* checking it against the theme that is about to be replaced rejects exactly
|
|
83
|
+
* the pairing the registry exists to allow — and on every commit that reads
|
|
84
|
+
* storage the component's `theme` is still the *prop*, never the theme the
|
|
85
|
+
* visitor stored. The script does `var t=…; var a=A[t]`; so does this, and it
|
|
86
|
+
* is the only place either rule is applied.
|
|
87
|
+
*
|
|
88
|
+
* `mode` is returned as stored, including the literal `"system"`. Resolving it
|
|
89
|
+
* here is what used to put `data-mode="dark"` on `<html>` for one commit under
|
|
90
|
+
* a stored `system`, which the stamp's own comment says must not happen.
|
|
91
|
+
*
|
|
92
|
+
* **The fallback is judged too.** It is the app's own default quadruple, which
|
|
93
|
+
* was chosen under the app's own default *theme* — and the theme resolution
|
|
94
|
+
* just chose need not be that one. Handing back `fallback.density` unchecked
|
|
95
|
+
* puts a rung the resolved theme does not declare onto `<html>`: an attribute
|
|
96
|
+
* no block matches, which is the precise failure the registry exists to
|
|
97
|
+
* prevent, arrived at by the code that was meant to prevent it. So each axis
|
|
98
|
+
* falls through the stored value, then the app default, then the base default,
|
|
99
|
+
* which every theme offers by construction.
|
|
100
|
+
*
|
|
101
|
+
* A *refused theme* is the one case here worth a word to the developer. The
|
|
102
|
+
* other three axes have a visible fallback the reader can see and change back;
|
|
103
|
+
* a theme that was registered when the visitor chose it and is not registered
|
|
104
|
+
* now is almost always a registration that was dropped by accident, and it
|
|
105
|
+
* shows up as "my users keep losing their theme" long after the commit that
|
|
106
|
+
* caused it. With an empty registry nothing is refused for being unregistered
|
|
107
|
+
* — theme validation is off — so the only refusal left there is a name that
|
|
108
|
+
* could not be a `data-theme` value at all, and it gets the other sentence:
|
|
109
|
+
* "register it" is not the fix for `"9bad"`.
|
|
110
|
+
*/
|
|
111
|
+
function acceptedPreferences(vocab, stored, fallback) {
|
|
112
|
+
const theme = vocab.acceptsTheme(stored.theme) ? stored.theme : fallback.theme;
|
|
113
|
+
if (stored.theme !== void 0 && stored.theme !== theme) warnOnce(vocab.themes === null ? `stored theme "${stored.theme}" is not a valid theme name; falling back to "${theme}". A theme name must match ${String(THEME_NAME_PATTERN)}.` : `stored theme "${stored.theme}" is not registered; falling back to "${theme}". A visitor who chose it keeps losing it until its manifest is back in ThemeProvider's themes prop.`);
|
|
114
|
+
return {
|
|
115
|
+
theme,
|
|
116
|
+
density: vocab.acceptsDensity(theme, stored.density) ? stored.density : vocab.acceptsDensity(theme, fallback.density) ? fallback.density : vocab.preferredDensity(theme),
|
|
117
|
+
font: vocab.acceptsFont(theme, stored.font) ? stored.font : vocab.acceptsFont(theme, fallback.font) ? fallback.font : vocab.preferredFont(theme),
|
|
118
|
+
mode: isOneOf(MODES, stored.mode) ? stored.mode : fallback.mode,
|
|
119
|
+
styleSet: isStyleSet(stored.style) ? stored.style : fallback.styleSet
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function writePreferences(storageKey, preferences) {
|
|
123
|
+
if (typeof localStorage === "undefined") return;
|
|
124
|
+
const { styleSet, ...axes } = preferences;
|
|
125
|
+
const payload = styleSet === null ? axes : {
|
|
126
|
+
...axes,
|
|
127
|
+
style: styleSet
|
|
128
|
+
};
|
|
129
|
+
try {
|
|
130
|
+
localStorage.setItem(storageKey, JSON.stringify(payload));
|
|
131
|
+
} catch {}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Root of the theme system: stamps `data-theme`, `data-density` and `data-mode`
|
|
135
|
+
* so the token layer resolves, puts `data-font` on `<html>`, publishes
|
|
136
|
+
* `--cue-font-scale`, owns the persisted user preference, and publishes the
|
|
137
|
+
* registry the three axis hooks read.
|
|
138
|
+
*
|
|
139
|
+
* Rendering: `<div data-cue-root data-theme data-density data-mode style={{ colorScheme, --cue-font-scale }}>`
|
|
140
|
+
* (or the single child when `asChild`), plus `data-style` when — and only when —
|
|
141
|
+
* a style set is in force. The `theme`/`density`/`font`/`mode`/`styleSet` props are
|
|
142
|
+
* *initial* values — the provider holds the state so `setTheme` and friends can
|
|
143
|
+
* drive it — but a changed prop is adopted after mount, so a controlling parent
|
|
144
|
+
* still works.
|
|
145
|
+
*
|
|
146
|
+
* The font pairing is the one axis that never lands on this element: it has no
|
|
147
|
+
* island form, `<html>` is its only home, and restating it here would shadow the
|
|
148
|
+
* pre-paint stamp for the whole page on the first frame. See the `stamp` object
|
|
149
|
+
* below.
|
|
150
|
+
*
|
|
151
|
+
* Persistence and the pre-paint contract: setters write
|
|
152
|
+
* `{ theme, density, font, mode }` to `localStorage[storageKey]`, plus a `style`
|
|
153
|
+
* key holding the style set when there is one — omitted entirely when there is
|
|
154
|
+
* not, so an application that never touches that axis writes the same four-key
|
|
155
|
+
* object it always wrote. That is exactly what
|
|
156
|
+
* {@link prepaintScript} reads to stamp `<html>` before the first paint. The
|
|
157
|
+
* outermost provider keeps `<html>` in sync while the app runs (and restores the
|
|
158
|
+
* previous stamp on unmount) so the page ground, UA scrollbars and form controls
|
|
159
|
+
* follow the theme; nested providers never touch `<html>`, and never own the
|
|
160
|
+
* font pairing — `useTheme().font` and `setFont` inside one are the root's.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* // `cue` and `terminal` are the `manifest.json` each theme package ships, read
|
|
164
|
+
* // from the `…/manifest.json` subpath of `@cueplusplus/theme-cue` and
|
|
165
|
+
* // `@cueplusplus/theme-terminal`. Written that way round on purpose: a literal
|
|
166
|
+
* // import statement in this comment reads, to every import-graph gate in this
|
|
167
|
+
* // repository, as `ui` depending on a theme package — which is the one thing
|
|
168
|
+
* // it may not do.
|
|
169
|
+
* <ThemeProvider themes={[cue, terminal]} theme="terminal" density="ultra-compact" font="plex" mode="system">
|
|
170
|
+
* <App />
|
|
171
|
+
* </ThemeProvider>
|
|
172
|
+
*/
|
|
173
|
+
function ThemeProvider({ themes: themesProp, theme: themeProp, density: densityProp, mode: modeProp = DEFAULT_MODE, font: fontProp, styleSet: styleSetProp, fontScale = 1, fontFamilies, overrides, storageKey = DEFAULT_STORAGE_KEY, persistPreferences = true, asChild = false, className, style: styleProp, children }) {
|
|
174
|
+
const ambient = React.useContext(ThemeContext);
|
|
175
|
+
const isRoot = ambient === null;
|
|
176
|
+
const outerStyleSet = React.useContext(StyleSetContext);
|
|
177
|
+
const ambientRegistry = React.useContext(ThemeRegistryContext);
|
|
178
|
+
const themes = themesProp ?? ambientRegistry?.themes ?? EMPTY;
|
|
179
|
+
const vocab = React.useMemo(() => vocabulary(themes), [themes]);
|
|
180
|
+
React.useMemo(() => {
|
|
181
|
+
if (process.env.NODE_ENV === "production") return;
|
|
182
|
+
for (const manifest of themes) {
|
|
183
|
+
const problems = validateManifest(manifest);
|
|
184
|
+
if (problems.length > 0) throw new TypeError(`ThemeProvider: manifest ${JSON.stringify(manifest.name)} is invalid\n${problems.map((p) => ` ${p.path}: ${p.message}`).join("\n")}`);
|
|
185
|
+
}
|
|
186
|
+
for (const manifest of themes) {
|
|
187
|
+
const rung = manifest.densities.default;
|
|
188
|
+
if (rung !== void 0 && !vocab.acceptsDensity(manifest.name, rung)) warnOnce(`manifest "${manifest.name}": densities.default "${rung}" is neither a base rung nor one this theme adds; the base default is used`);
|
|
189
|
+
const pairing = manifest.fontPairings.default;
|
|
190
|
+
if (pairing !== void 0 && !vocab.acceptsFont(manifest.name, pairing)) warnOnce(`manifest "${manifest.name}": fontPairings.default "${pairing}" is neither a base pairing nor one this theme adds; the base default is used`);
|
|
191
|
+
}
|
|
192
|
+
if (isRoot && themes.length === 0) warnOnce("ThemeProvider: no `themes` were registered, so there is no registry: useThemes() is empty, useTheme().manifest is null, the pre-paint script accepts any well-formed theme name out of storage, and no theme's added density rungs or font pairings are offered. Whatever [data-theme] blocks the page imported still paint. Pass themes={[…]} — see @cueplusplus/theme-base.");
|
|
193
|
+
}, [
|
|
194
|
+
themes,
|
|
195
|
+
vocab,
|
|
196
|
+
isRoot
|
|
197
|
+
]);
|
|
198
|
+
const initialTheme = themeProp ?? (isRoot ? themes[0]?.name : ambient?.theme) ?? DEFAULT_THEME;
|
|
199
|
+
const initialDensity = densityProp ?? vocab.preferredDensity(initialTheme);
|
|
200
|
+
const initialFont = fontProp ?? vocab.preferredFont(initialTheme);
|
|
201
|
+
const initialStyleSet = styleSetProp ?? (isRoot ? null : outerStyleSet);
|
|
202
|
+
const [theme, setThemeState] = React.useState(initialTheme);
|
|
203
|
+
const [densityState, setDensityState] = React.useState(initialDensity);
|
|
204
|
+
const [mode, setModeState] = React.useState(modeProp);
|
|
205
|
+
const [styleSet, setStyleSetState] = React.useState(initialStyleSet);
|
|
206
|
+
const [storedSeed] = React.useState(() => {
|
|
207
|
+
if (!isRoot || !persistPreferences) return {
|
|
208
|
+
theme: initialTheme,
|
|
209
|
+
font: initialFont
|
|
210
|
+
};
|
|
211
|
+
const stored = readPreferences(storageKey);
|
|
212
|
+
const theme = vocab.acceptsTheme(stored.theme) ? stored.theme : initialTheme;
|
|
213
|
+
const fallback = fontProp ?? (theme === initialTheme ? initialFont : vocab.preferredFont(theme));
|
|
214
|
+
return {
|
|
215
|
+
theme,
|
|
216
|
+
font: vocab.acceptsFont(theme, stored.font) ? stored.font : fallback
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
const [rootFont, setRootFontState] = React.useState(storedSeed.font);
|
|
220
|
+
const rawFont = isRoot ? rootFont : ambient.font;
|
|
221
|
+
const [systemMode, setSystemMode] = React.useState(DEFAULT_RESOLVED_MODE);
|
|
222
|
+
const restoredKey = React.useRef(null);
|
|
223
|
+
const [restored, setRestored] = React.useState(false);
|
|
224
|
+
const manifest = React.useMemo(() => themes.find((m) => m.name === theme) ?? null, [themes, theme]);
|
|
225
|
+
if (vocab.themes !== null && manifest === null) warnOnce(`theme "${theme}" is not registered; useTheme().manifest is null and only the base axes are offered. Add its manifest to ThemeProvider's themes prop.`);
|
|
226
|
+
const density = vocab.acceptsDensity(theme, densityState) ? densityState : vocab.preferredDensity(theme);
|
|
227
|
+
if (density !== densityState) warnOnce(`density "${densityState}" is not offered by theme "${theme}"; using "${density}"`);
|
|
228
|
+
const fontTheme = isRoot && persistPreferences && !restored ? storedSeed.theme : theme;
|
|
229
|
+
const font = vocab.acceptsFont(fontTheme, rawFont) ? rawFont : vocab.preferredFont(fontTheme);
|
|
230
|
+
if (font !== rawFont) warnOnce(`font "${rawFont}" is not offered by theme "${fontTheme}"; using "${font}"`);
|
|
231
|
+
const resolvedMode = manifest?.supportsLight === false ? "dark" : mode === "system" ? systemMode : mode;
|
|
232
|
+
useIsomorphicLayoutEffect(() => {
|
|
233
|
+
if (!isRoot) return;
|
|
234
|
+
if (!persistPreferences) {
|
|
235
|
+
setRestored(true);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (restoredKey.current === storageKey) return;
|
|
239
|
+
restoredKey.current = storageKey;
|
|
240
|
+
setRestored(true);
|
|
241
|
+
const stored = readPreferences(storageKey);
|
|
242
|
+
const next = acceptedPreferences(vocab, stored, {
|
|
243
|
+
theme,
|
|
244
|
+
density,
|
|
245
|
+
font,
|
|
246
|
+
mode,
|
|
247
|
+
styleSet
|
|
248
|
+
});
|
|
249
|
+
setThemeState(next.theme);
|
|
250
|
+
setDensityState(next.density);
|
|
251
|
+
setRootFontState(next.font);
|
|
252
|
+
setModeState(next.mode);
|
|
253
|
+
setStyleSetState(next.styleSet);
|
|
254
|
+
if (stored.theme !== void 0 && stored.theme !== next.theme || stored.density !== void 0 && stored.density !== next.density || stored.font !== void 0 && stored.font !== next.font || stored.mode !== void 0 && stored.mode !== next.mode || stored.style !== void 0 && !isStyleSet(stored.style)) writePreferences(storageKey, next);
|
|
255
|
+
}, [
|
|
256
|
+
isRoot,
|
|
257
|
+
persistPreferences,
|
|
258
|
+
storageKey
|
|
259
|
+
]);
|
|
260
|
+
const lastProps = React.useRef({
|
|
261
|
+
theme: themeProp,
|
|
262
|
+
density: densityProp,
|
|
263
|
+
mode: modeProp,
|
|
264
|
+
font: fontProp,
|
|
265
|
+
styleSet: styleSetProp
|
|
266
|
+
});
|
|
267
|
+
React.useEffect(() => {
|
|
268
|
+
const previous = lastProps.current;
|
|
269
|
+
lastProps.current = {
|
|
270
|
+
theme: themeProp,
|
|
271
|
+
density: densityProp,
|
|
272
|
+
mode: modeProp,
|
|
273
|
+
font: fontProp,
|
|
274
|
+
styleSet: styleSetProp
|
|
275
|
+
};
|
|
276
|
+
if (previous.theme !== themeProp && themeProp !== void 0) setThemeState(themeProp);
|
|
277
|
+
if (previous.density !== densityProp && densityProp !== void 0) setDensityState(densityProp);
|
|
278
|
+
if (previous.mode !== modeProp) setModeState(modeProp);
|
|
279
|
+
if (previous.font !== fontProp && fontProp !== void 0) setRootFontState(fontProp);
|
|
280
|
+
if (previous.styleSet !== styleSetProp && styleSetProp !== void 0) setStyleSetState(styleSetProp);
|
|
281
|
+
}, [
|
|
282
|
+
themeProp,
|
|
283
|
+
densityProp,
|
|
284
|
+
modeProp,
|
|
285
|
+
fontProp,
|
|
286
|
+
styleSetProp
|
|
287
|
+
]);
|
|
288
|
+
useIsomorphicLayoutEffect(() => {
|
|
289
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
290
|
+
const query = window.matchMedia("(prefers-color-scheme: light)");
|
|
291
|
+
const sync = () => setSystemMode(query.matches ? "light" : "dark");
|
|
292
|
+
sync();
|
|
293
|
+
query.addEventListener("change", sync);
|
|
294
|
+
return () => query.removeEventListener("change", sync);
|
|
295
|
+
}, []);
|
|
296
|
+
const stateRef = React.useRef({
|
|
297
|
+
theme,
|
|
298
|
+
density: densityState,
|
|
299
|
+
mode,
|
|
300
|
+
font: rawFont,
|
|
301
|
+
styleSet
|
|
302
|
+
});
|
|
303
|
+
useIsomorphicLayoutEffect(() => {
|
|
304
|
+
stateRef.current = {
|
|
305
|
+
theme,
|
|
306
|
+
density: densityState,
|
|
307
|
+
mode,
|
|
308
|
+
font: rawFont,
|
|
309
|
+
styleSet
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
const persist = React.useCallback((patch) => {
|
|
313
|
+
const next = {
|
|
314
|
+
...stateRef.current,
|
|
315
|
+
...patch
|
|
316
|
+
};
|
|
317
|
+
stateRef.current = next;
|
|
318
|
+
if (!isRoot || !persistPreferences) return;
|
|
319
|
+
writePreferences(storageKey, next);
|
|
320
|
+
}, [
|
|
321
|
+
isRoot,
|
|
322
|
+
persistPreferences,
|
|
323
|
+
storageKey
|
|
324
|
+
]);
|
|
325
|
+
const setTheme = React.useCallback((next) => {
|
|
326
|
+
setThemeState(next);
|
|
327
|
+
persist({ theme: next });
|
|
328
|
+
}, [persist]);
|
|
329
|
+
const setDensity = React.useCallback((next) => {
|
|
330
|
+
setDensityState(next);
|
|
331
|
+
persist({ density: next });
|
|
332
|
+
}, [persist]);
|
|
333
|
+
const setMode = React.useCallback((next) => {
|
|
334
|
+
setModeState(next);
|
|
335
|
+
persist({ mode: next });
|
|
336
|
+
}, [persist]);
|
|
337
|
+
const rootSetFont = React.useCallback((next) => {
|
|
338
|
+
setRootFontState(next);
|
|
339
|
+
persist({ font: next });
|
|
340
|
+
}, [persist]);
|
|
341
|
+
/** Nested providers hand the axis straight up: one document, one pairing. */
|
|
342
|
+
const setFont = isRoot ? rootSetFont : ambient.setFont;
|
|
343
|
+
const setStyleSet = React.useCallback((next) => {
|
|
344
|
+
setStyleSetState(next);
|
|
345
|
+
persist({ styleSet: next });
|
|
346
|
+
}, [persist]);
|
|
347
|
+
const originalStamp = React.useRef(null);
|
|
348
|
+
useIsomorphicInsertionEffect(() => {
|
|
349
|
+
if (!isRoot || typeof document === "undefined") return;
|
|
350
|
+
const root = document.documentElement;
|
|
351
|
+
const current = {
|
|
352
|
+
theme,
|
|
353
|
+
density,
|
|
354
|
+
font,
|
|
355
|
+
mode,
|
|
356
|
+
styleSet
|
|
357
|
+
};
|
|
358
|
+
const next = restored || !persistPreferences ? current : acceptedPreferences(vocab, readPreferences(storageKey), current);
|
|
359
|
+
originalStamp.current ??= {
|
|
360
|
+
theme: root.getAttribute("data-theme"),
|
|
361
|
+
density: root.getAttribute("data-density"),
|
|
362
|
+
font: root.getAttribute("data-font"),
|
|
363
|
+
mode: root.getAttribute("data-mode"),
|
|
364
|
+
style: root.getAttribute("data-style"),
|
|
365
|
+
colorScheme: root.style.colorScheme
|
|
366
|
+
};
|
|
367
|
+
const write = (name, value) => {
|
|
368
|
+
if (root.getAttribute(name) !== value) root.setAttribute(name, value);
|
|
369
|
+
};
|
|
370
|
+
write("data-theme", next.theme);
|
|
371
|
+
write("data-density", next.density);
|
|
372
|
+
write("data-font", next.font);
|
|
373
|
+
write("data-mode", next.mode);
|
|
374
|
+
if (next.styleSet === null) {
|
|
375
|
+
if (root.hasAttribute("data-style")) root.removeAttribute("data-style");
|
|
376
|
+
} else write("data-style", next.styleSet);
|
|
377
|
+
const scheme = (themes.find((m) => m.name === next.theme) ?? null)?.supportsLight === false ? "dark" : next.mode === "system" ? "light dark" : next.mode;
|
|
378
|
+
if (root.style.colorScheme !== scheme) root.style.colorScheme = scheme;
|
|
379
|
+
}, [
|
|
380
|
+
isRoot,
|
|
381
|
+
restored,
|
|
382
|
+
persistPreferences,
|
|
383
|
+
storageKey,
|
|
384
|
+
theme,
|
|
385
|
+
density,
|
|
386
|
+
font,
|
|
387
|
+
mode,
|
|
388
|
+
styleSet,
|
|
389
|
+
themes,
|
|
390
|
+
vocab
|
|
391
|
+
]);
|
|
392
|
+
React.useEffect(() => () => {
|
|
393
|
+
const original = originalStamp.current;
|
|
394
|
+
if (original === null || typeof document === "undefined") return;
|
|
395
|
+
originalStamp.current = null;
|
|
396
|
+
const root = document.documentElement;
|
|
397
|
+
const restore = (name, value) => {
|
|
398
|
+
if (value === null) root.removeAttribute(name);
|
|
399
|
+
else root.setAttribute(name, value);
|
|
400
|
+
};
|
|
401
|
+
restore("data-theme", original.theme);
|
|
402
|
+
restore("data-density", original.density);
|
|
403
|
+
restore("data-font", original.font);
|
|
404
|
+
restore("data-mode", original.mode);
|
|
405
|
+
restore("data-style", original.style);
|
|
406
|
+
root.style.colorScheme = original.colorScheme;
|
|
407
|
+
}, []);
|
|
408
|
+
const effectiveStyleSet = styleSet ?? outerStyleSet;
|
|
409
|
+
const contextValue = React.useMemo(() => ({
|
|
410
|
+
theme,
|
|
411
|
+
manifest,
|
|
412
|
+
density,
|
|
413
|
+
mode,
|
|
414
|
+
font,
|
|
415
|
+
styleSet: effectiveStyleSet,
|
|
416
|
+
resolvedMode,
|
|
417
|
+
setTheme,
|
|
418
|
+
setDensity,
|
|
419
|
+
setMode,
|
|
420
|
+
setFont,
|
|
421
|
+
setStyleSet
|
|
422
|
+
}), [
|
|
423
|
+
theme,
|
|
424
|
+
manifest,
|
|
425
|
+
density,
|
|
426
|
+
mode,
|
|
427
|
+
font,
|
|
428
|
+
effectiveStyleSet,
|
|
429
|
+
resolvedMode,
|
|
430
|
+
setTheme,
|
|
431
|
+
setDensity,
|
|
432
|
+
setMode,
|
|
433
|
+
setFont,
|
|
434
|
+
setStyleSet
|
|
435
|
+
]);
|
|
436
|
+
/** The axes on offer under the theme that is actually active. */
|
|
437
|
+
const registry = React.useMemo(() => buildRegistry(themes, theme), [themes, theme]);
|
|
438
|
+
const parentFontFamilies = React.useContext(FontFamiliesContext);
|
|
439
|
+
const effectiveFontFamilies = React.useMemo(() => {
|
|
440
|
+
const sans = fontFamilies?.sans ?? parentFontFamilies?.sans;
|
|
441
|
+
const mono = fontFamilies?.mono ?? parentFontFamilies?.mono;
|
|
442
|
+
return sans === void 0 && mono === void 0 ? null : {
|
|
443
|
+
sans,
|
|
444
|
+
mono
|
|
445
|
+
};
|
|
446
|
+
}, [
|
|
447
|
+
fontFamilies?.sans,
|
|
448
|
+
fontFamilies?.mono,
|
|
449
|
+
parentFontFamilies?.sans,
|
|
450
|
+
parentFontFamilies?.mono
|
|
451
|
+
]);
|
|
452
|
+
const overridesKey = JSON.stringify(overrides ?? null);
|
|
453
|
+
const inline = React.useMemo(() => inlineOverrides(overrides, resolvedMode), [overridesKey, resolvedMode]);
|
|
454
|
+
const overridesStyle = React.useMemo(() => overridesCss(overrides), [overridesKey]);
|
|
455
|
+
const parentOverrides = React.useContext(OverridesContext);
|
|
456
|
+
const effectiveOverrides = React.useMemo(() => {
|
|
457
|
+
const merged = {
|
|
458
|
+
...parentOverrides,
|
|
459
|
+
...inline
|
|
460
|
+
};
|
|
461
|
+
return Object.keys(merged).length === 0 ? null : merged;
|
|
462
|
+
}, [parentOverrides, inline]);
|
|
463
|
+
React.useEffect(() => {
|
|
464
|
+
if (process.env.NODE_ENV === "production") return;
|
|
465
|
+
reportOverrides(manifest, resolvedMode, overrides, theme);
|
|
466
|
+
}, [
|
|
467
|
+
manifest,
|
|
468
|
+
resolvedMode,
|
|
469
|
+
overridesKey,
|
|
470
|
+
theme
|
|
471
|
+
]);
|
|
472
|
+
const style = React.useMemo(() => ({
|
|
473
|
+
colorScheme: manifest?.supportsLight === false ? "dark" : mode === "system" ? "light dark" : mode,
|
|
474
|
+
"--cue-font-scale": fontScale,
|
|
475
|
+
...fontFamilies?.sans === void 0 ? null : { "--cue-font-sans": fontFamilies.sans },
|
|
476
|
+
...fontFamilies?.mono === void 0 ? null : { "--cue-font-mono": fontFamilies.mono },
|
|
477
|
+
...inline,
|
|
478
|
+
...styleProp
|
|
479
|
+
}), [
|
|
480
|
+
manifest?.supportsLight,
|
|
481
|
+
mode,
|
|
482
|
+
fontScale,
|
|
483
|
+
fontFamilies?.sans,
|
|
484
|
+
fontFamilies?.mono,
|
|
485
|
+
inline,
|
|
486
|
+
styleProp
|
|
487
|
+
]);
|
|
488
|
+
const stamp = {
|
|
489
|
+
"data-cue-root": "",
|
|
490
|
+
"data-theme": theme,
|
|
491
|
+
"data-density": density,
|
|
492
|
+
"data-mode": mode,
|
|
493
|
+
...styleSet === null ? null : { "data-style": styleSet }
|
|
494
|
+
};
|
|
495
|
+
let root;
|
|
496
|
+
if (asChild) {
|
|
497
|
+
const child = React.Children.only(children);
|
|
498
|
+
root = React.cloneElement(child, {
|
|
499
|
+
...stamp,
|
|
500
|
+
className: cn(className, child.props.className),
|
|
501
|
+
style: {
|
|
502
|
+
...style,
|
|
503
|
+
...child.props.style
|
|
504
|
+
}
|
|
505
|
+
});
|
|
506
|
+
} else root = /* @__PURE__ */ jsx("div", {
|
|
507
|
+
...stamp,
|
|
508
|
+
className,
|
|
509
|
+
style,
|
|
510
|
+
children
|
|
511
|
+
});
|
|
512
|
+
const densityLayer = overridesStyle === "" ? null : /* @__PURE__ */ jsx("style", {
|
|
513
|
+
"data-cue-overrides": "",
|
|
514
|
+
children: overridesStyle
|
|
515
|
+
});
|
|
516
|
+
return /* @__PURE__ */ jsx(ThemeRegistryContext.Provider, {
|
|
517
|
+
value: registry,
|
|
518
|
+
children: /* @__PURE__ */ jsx(ThemeContext.Provider, {
|
|
519
|
+
value: contextValue,
|
|
520
|
+
children: /* @__PURE__ */ jsx(AmbientThemeContext.Provider, {
|
|
521
|
+
value: theme,
|
|
522
|
+
children: /* @__PURE__ */ jsx(FontScaleContext.Provider, {
|
|
523
|
+
value: fontScale,
|
|
524
|
+
children: /* @__PURE__ */ jsx(FontFamiliesContext.Provider, {
|
|
525
|
+
value: effectiveFontFamilies,
|
|
526
|
+
children: /* @__PURE__ */ jsx(OverridesContext.Provider, {
|
|
527
|
+
value: effectiveOverrides,
|
|
528
|
+
children: /* @__PURE__ */ jsx(DensityContext.Provider, {
|
|
529
|
+
value: density,
|
|
530
|
+
children: /* @__PURE__ */ jsxs(StyleSetContext.Provider, {
|
|
531
|
+
value: effectiveStyleSet,
|
|
532
|
+
children: [root, densityLayer]
|
|
533
|
+
})
|
|
534
|
+
})
|
|
535
|
+
})
|
|
536
|
+
})
|
|
537
|
+
})
|
|
538
|
+
})
|
|
539
|
+
})
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
//#endregion
|
|
543
|
+
export { FontFamiliesContext, FontScaleContext, ThemeContext, ThemeProvider };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ThemeRegistry } from "./vocabulary.js";
|
|
2
|
+
import "react";
|
|
3
|
+
import { DensityEntry, FontEntry, ThemeManifest } from "@cueplusplus/theme-base";
|
|
4
|
+
//#region src/system/theme-registry.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Every registered manifest, in registration order.
|
|
7
|
+
*
|
|
8
|
+
* The array a picker enumerates. It is the `themes` prop the nearest provider
|
|
9
|
+
* was handed, not a copy: registration is an application decision, and this
|
|
10
|
+
* library never discovers a theme by itself.
|
|
11
|
+
*
|
|
12
|
+
* @throws If called outside a `<ThemeProvider>`, like `useTheme()`.
|
|
13
|
+
* @example
|
|
14
|
+
* const themes = useThemes();
|
|
15
|
+
* const { theme, setTheme } = useTheme();
|
|
16
|
+
* return themes.map((m) => (
|
|
17
|
+
* <Chip key={m.name} selected={m.name === theme} onClick={() => setTheme(m.name)}>
|
|
18
|
+
* {m.name}
|
|
19
|
+
* </Chip>
|
|
20
|
+
* ));
|
|
21
|
+
*/
|
|
22
|
+
declare function useThemes(): readonly ThemeManifest[];
|
|
23
|
+
/**
|
|
24
|
+
* The rungs an app may offer right now: the base five, then the ACTIVE theme's
|
|
25
|
+
* additions.
|
|
26
|
+
*
|
|
27
|
+
* Active, not registered: a rung a theme adds is emitted under that theme's
|
|
28
|
+
* `[data-theme]`, so offering another theme's rung would offer a control that
|
|
29
|
+
* changes nothing. Switch theme and this list changes with it.
|
|
30
|
+
*
|
|
31
|
+
* @throws If called outside a `<ThemeProvider>`.
|
|
32
|
+
* @example
|
|
33
|
+
* const rungs = useDensities();
|
|
34
|
+
* const { density, setDensity } = useTheme();
|
|
35
|
+
* <Select
|
|
36
|
+
* items={rungs.map((d) => ({ value: d.name, label: d.name }))}
|
|
37
|
+
* value={density}
|
|
38
|
+
* onValueChange={setDensity}
|
|
39
|
+
* />
|
|
40
|
+
*/
|
|
41
|
+
declare function useDensities(): readonly DensityEntry[];
|
|
42
|
+
/**
|
|
43
|
+
* The font pairings, by the same rule: the base eight, then the active theme's.
|
|
44
|
+
*
|
|
45
|
+
* @throws If called outside a `<ThemeProvider>`.
|
|
46
|
+
* @example
|
|
47
|
+
* // The stacks a pairing resolves to, for a specimen that renders its own row.
|
|
48
|
+
* const { font } = useTheme();
|
|
49
|
+
* const sans = useFonts().find((f) => f.name === font)?.stacks["font-sans"];
|
|
50
|
+
*/
|
|
51
|
+
declare function useFonts(): readonly FontEntry[];
|
|
52
|
+
//#endregion
|
|
53
|
+
export { type ThemeRegistry, useDensities, useFonts, useThemes };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import "./vocabulary.js";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
//#region src/system/theme-registry.tsx
|
|
5
|
+
/** Internal: consumers read it through the three hooks. `null` outside a provider. */
|
|
6
|
+
const ThemeRegistryContext = React.createContext(null);
|
|
7
|
+
function useRegistry(hook) {
|
|
8
|
+
const registry = React.useContext(ThemeRegistryContext);
|
|
9
|
+
if (registry === null) throw new Error(`${hook}() must be called inside a <ThemeProvider>.`);
|
|
10
|
+
return registry;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Every registered manifest, in registration order.
|
|
14
|
+
*
|
|
15
|
+
* The array a picker enumerates. It is the `themes` prop the nearest provider
|
|
16
|
+
* was handed, not a copy: registration is an application decision, and this
|
|
17
|
+
* library never discovers a theme by itself.
|
|
18
|
+
*
|
|
19
|
+
* @throws If called outside a `<ThemeProvider>`, like `useTheme()`.
|
|
20
|
+
* @example
|
|
21
|
+
* const themes = useThemes();
|
|
22
|
+
* const { theme, setTheme } = useTheme();
|
|
23
|
+
* return themes.map((m) => (
|
|
24
|
+
* <Chip key={m.name} selected={m.name === theme} onClick={() => setTheme(m.name)}>
|
|
25
|
+
* {m.name}
|
|
26
|
+
* </Chip>
|
|
27
|
+
* ));
|
|
28
|
+
*/
|
|
29
|
+
function useThemes() {
|
|
30
|
+
return useRegistry("useThemes").themes;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The rungs an app may offer right now: the base five, then the ACTIVE theme's
|
|
34
|
+
* additions.
|
|
35
|
+
*
|
|
36
|
+
* Active, not registered: a rung a theme adds is emitted under that theme's
|
|
37
|
+
* `[data-theme]`, so offering another theme's rung would offer a control that
|
|
38
|
+
* changes nothing. Switch theme and this list changes with it.
|
|
39
|
+
*
|
|
40
|
+
* @throws If called outside a `<ThemeProvider>`.
|
|
41
|
+
* @example
|
|
42
|
+
* const rungs = useDensities();
|
|
43
|
+
* const { density, setDensity } = useTheme();
|
|
44
|
+
* <Select
|
|
45
|
+
* items={rungs.map((d) => ({ value: d.name, label: d.name }))}
|
|
46
|
+
* value={density}
|
|
47
|
+
* onValueChange={setDensity}
|
|
48
|
+
* />
|
|
49
|
+
*/
|
|
50
|
+
function useDensities() {
|
|
51
|
+
return useRegistry("useDensities").densities;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The font pairings, by the same rule: the base eight, then the active theme's.
|
|
55
|
+
*
|
|
56
|
+
* @throws If called outside a `<ThemeProvider>`.
|
|
57
|
+
* @example
|
|
58
|
+
* // The stacks a pairing resolves to, for a specimen that renders its own row.
|
|
59
|
+
* const { font } = useTheme();
|
|
60
|
+
* const sans = useFonts().find((f) => f.name === font)?.stacks["font-sans"];
|
|
61
|
+
*/
|
|
62
|
+
function useFonts() {
|
|
63
|
+
return useRegistry("useFonts").fonts;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { ThemeRegistryContext, useDensities, useFonts, useThemes };
|