@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,105 @@
|
|
|
1
|
+
import { DEFAULT_TIME_SIGNATURE, SIXTEENTH_BEATS, barBeats, beatsToMusical } from "./_time.js";
|
|
2
|
+
//#region src/midi/_ruler.ts
|
|
3
|
+
/**
|
|
4
|
+
* Ruler arithmetic: how far apart the ticks go at a given zoom, and which of
|
|
5
|
+
* them are actually on screen.
|
|
6
|
+
*
|
|
7
|
+
* Both halves are pure, and both are the part of a timeline that is easy to get
|
|
8
|
+
* subtly wrong — a ruler that re-picks its interval one frame late flickers, and
|
|
9
|
+
* a ruler that renders every tick of an eight-thousand-beat song locks the tab
|
|
10
|
+
* on the first scroll.
|
|
11
|
+
*
|
|
12
|
+
* @internal `chooseInterval` and `rulerTicks` are re-exported from the `/midi`
|
|
13
|
+
* barrel; the module itself is not public.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The pixel spacing a tick aims for: one centimetre at a nominal 96 DPI.
|
|
17
|
+
*
|
|
18
|
+
* A centimetre is the density a ruler stays *readable* at — close enough to
|
|
19
|
+
* count by eye, far enough apart that the labels do not collide. Ported from
|
|
20
|
+
* ableton-sync, which then multiplied the chosen interval by four "to make
|
|
21
|
+
* markers 4x less dense", i.e. targeted 4 cm while claiming to target 1. The
|
|
22
|
+
* multiplier is gone; callers who want a sparser ruler pass a bigger target.
|
|
23
|
+
*/
|
|
24
|
+
const TICK_TARGET_PX = 37.8;
|
|
25
|
+
/** How far either side of the viewport ticks are still rendered, in px. */
|
|
26
|
+
const DEFAULT_BUFFER_PX = 120;
|
|
27
|
+
/**
|
|
28
|
+
* How many beats apart the ticks should be at this zoom.
|
|
29
|
+
*
|
|
30
|
+
* The candidates are musical divisions only — sixteenth, eighth, quarter, half,
|
|
31
|
+
* then the bar and multiples of it. A ruler that ticked every 3.7 beats because
|
|
32
|
+
* that is what the arithmetic wanted would be unreadable; the whole point of a
|
|
33
|
+
* musical ruler is that the numbers on it are numbers a musician counts in.
|
|
34
|
+
*
|
|
35
|
+
* @param pxPerBeat - Current zoom.
|
|
36
|
+
* @param beatsPerBar - Length of a bar in quarter-note beats.
|
|
37
|
+
* @param targetPx - Spacing to aim for. Defaults to {@link TICK_TARGET_PX}.
|
|
38
|
+
* @returns The finest interval whose spacing reaches the target, or the coarsest
|
|
39
|
+
* candidate when even that does not — a ruler always ticks somewhere.
|
|
40
|
+
*/
|
|
41
|
+
function chooseInterval(pxPerBeat, beatsPerBar, targetPx = TICK_TARGET_PX) {
|
|
42
|
+
const bar = beatsPerBar > 0 ? beatsPerBar : barBeats();
|
|
43
|
+
const candidates = [
|
|
44
|
+
SIXTEENTH_BEATS,
|
|
45
|
+
.5,
|
|
46
|
+
1,
|
|
47
|
+
2,
|
|
48
|
+
bar,
|
|
49
|
+
bar * 2,
|
|
50
|
+
bar * 4,
|
|
51
|
+
bar * 8,
|
|
52
|
+
bar * 16,
|
|
53
|
+
bar * 32
|
|
54
|
+
].filter((value, index, all) => all.indexOf(value) === index).sort((a, b) => a - b);
|
|
55
|
+
const coarsest = candidates.at(-1);
|
|
56
|
+
return candidates.find((interval) => interval * pxPerBeat >= targetPx) ?? coarsest;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The ticks worth rendering, and where they go.
|
|
60
|
+
*
|
|
61
|
+
* Culling is against a **pixel** buffer either side of the viewport, not a beat
|
|
62
|
+
* buffer. The ported version kept fifty beats of margin, which at a tight zoom
|
|
63
|
+
* is a thousand pixels of work nobody will scroll to and at a loose zoom is a
|
|
64
|
+
* few pixels — the one thing a buffer must be is a constant amount of *screen*.
|
|
65
|
+
*
|
|
66
|
+
* @param options - Song length, zoom, and what is on screen.
|
|
67
|
+
*/
|
|
68
|
+
function rulerTicks(options) {
|
|
69
|
+
const { totalBeats, pxPerBeat, viewport, timeSignature = DEFAULT_TIME_SIGNATURE, targetPx = TICK_TARGET_PX, bufferPx = DEFAULT_BUFFER_PX } = options;
|
|
70
|
+
const bar = barBeats(timeSignature);
|
|
71
|
+
const interval = chooseInterval(pxPerBeat, bar, targetPx);
|
|
72
|
+
const width = Math.max(0, totalBeats * pxPerBeat);
|
|
73
|
+
const from = viewport === void 0 || pxPerBeat <= 0 ? 0 : Math.max(0, (viewport.offset - bufferPx) / pxPerBeat);
|
|
74
|
+
const to = viewport === void 0 || pxPerBeat <= 0 ? totalBeats : Math.min(totalBeats, (viewport.offset + viewport.width + bufferPx) / pxPerBeat);
|
|
75
|
+
const ticks = [];
|
|
76
|
+
const firstIndex = Math.max(0, Math.floor(from / interval));
|
|
77
|
+
const lastIndex = Math.floor(to / interval + EPSILON);
|
|
78
|
+
for (let index = firstIndex; index <= lastIndex; index += 1) {
|
|
79
|
+
const beat = round(index * interval);
|
|
80
|
+
const { bar: barNumber, beat: beatInBar, sixteenth } = beatsToMusical(beat, timeSignature);
|
|
81
|
+
const barStart = beat % bar === 0;
|
|
82
|
+
ticks.push({
|
|
83
|
+
beat,
|
|
84
|
+
left: beat * pxPerBeat,
|
|
85
|
+
bar: barNumber,
|
|
86
|
+
beatInBar,
|
|
87
|
+
sixteenth,
|
|
88
|
+
barStart,
|
|
89
|
+
label: barStart ? String(barNumber) : sixteenth === 0 ? String(beatInBar) : `${beatInBar}.${sixteenth}`
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
interval,
|
|
94
|
+
width,
|
|
95
|
+
ticks
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Slack for the "is the last tick exactly on the end?" comparison. */
|
|
99
|
+
const EPSILON = 1e-9;
|
|
100
|
+
/** Trim the float noise a multiplication by a fractional interval leaves. */
|
|
101
|
+
function round(beats) {
|
|
102
|
+
return Math.round(beats * 1e6) / 1e6;
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
export { TICK_TARGET_PX, chooseInterval, rulerTicks };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
//#region src/midi/_time.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Musical time: turning a position in beats into the `bars.beats.sixteenths`
|
|
4
|
+
* a transport displays, and back.
|
|
5
|
+
*
|
|
6
|
+
* One convention runs through the whole module and is worth stating once: a
|
|
7
|
+
* **beat is a quarter note**. That is what every DAW's API reports a song
|
|
8
|
+
* position in, so it is the unit this system stores and passes around. What the
|
|
9
|
+
* *display* counts is a different thing — in 6/8 a bar is three quarter notes
|
|
10
|
+
* but the transport shows six beats — and reconciling those two is precisely
|
|
11
|
+
* what this module is for.
|
|
12
|
+
*
|
|
13
|
+
* The ported implementation assumed 4/4 throughout (`beatsPerBar = numerator`),
|
|
14
|
+
* which is right for four-four and silently wrong for everything else. Here the
|
|
15
|
+
* denominator is honoured: {@link barBeats} and {@link beatBeats} answer "how
|
|
16
|
+
* many quarter notes" and every conversion goes through them.
|
|
17
|
+
*
|
|
18
|
+
* @internal Not part of the public API surface beyond the `/midi` barrel.
|
|
19
|
+
*/
|
|
20
|
+
/** How a bar is divided. */
|
|
21
|
+
interface TimeSignature {
|
|
22
|
+
/** Beats per bar — the top number. */
|
|
23
|
+
numerator: number;
|
|
24
|
+
/** Which note gets the beat — the bottom number. */
|
|
25
|
+
denominator: number;
|
|
26
|
+
}
|
|
27
|
+
/** Four-four, because most of the world is. */
|
|
28
|
+
declare const DEFAULT_TIME_SIGNATURE: TimeSignature;
|
|
29
|
+
/** A sixteenth note, in quarter-note beats. The finest grid this notation shows. */
|
|
30
|
+
declare const SIXTEENTH_BEATS = 0.25;
|
|
31
|
+
/**
|
|
32
|
+
* The highest bar the field will count to.
|
|
33
|
+
*
|
|
34
|
+
* Ported from the original's three-digit bars field. It is a display limit, not
|
|
35
|
+
* a musical one: 999 bars is over half an hour at 120 BPM, and a four-digit
|
|
36
|
+
* segment would cost the width the readout needs.
|
|
37
|
+
*/
|
|
38
|
+
declare const MAX_BAR = 999;
|
|
39
|
+
/** A position, as a transport spells it. */
|
|
40
|
+
interface MusicalTime {
|
|
41
|
+
/** Bar number, counting from 1. */
|
|
42
|
+
bar: number;
|
|
43
|
+
/** Beat within the bar, counting from 1. */
|
|
44
|
+
beat: number;
|
|
45
|
+
/** Sixteenth within the beat, counting from 0. */
|
|
46
|
+
sixteenth: number;
|
|
47
|
+
}
|
|
48
|
+
/** Which part of the notation an edit is aimed at. */
|
|
49
|
+
type MusicalSegment = "bars" | "beats" | "sixteenths";
|
|
50
|
+
/** How many quarter-note beats a bar of this signature lasts. */
|
|
51
|
+
declare function barBeats(signature?: TimeSignature): number;
|
|
52
|
+
/** How many quarter-note beats one displayed beat of this signature lasts. */
|
|
53
|
+
declare function beatBeats(signature?: TimeSignature): number;
|
|
54
|
+
/** How many sixteenth notes fit in one displayed beat of this signature. */
|
|
55
|
+
declare function sixteenthsPerBeat(signature?: TimeSignature): number;
|
|
56
|
+
/**
|
|
57
|
+
* A position in quarter-note beats, spelled out.
|
|
58
|
+
*
|
|
59
|
+
* Quantised to the sixteenth grid on the way in, because the notation has three
|
|
60
|
+
* segments and no fourth: reporting `1.1.0` for a position that is actually a
|
|
61
|
+
* thirty-second late would be a lie the field could not correct.
|
|
62
|
+
*
|
|
63
|
+
* @param beats - Position in quarter-note beats. Negative clamps to the start.
|
|
64
|
+
* @param signature - The signature in force.
|
|
65
|
+
*/
|
|
66
|
+
declare function beatsToMusical(beats: number, signature?: TimeSignature): MusicalTime;
|
|
67
|
+
/**
|
|
68
|
+
* A spelled-out position back in quarter-note beats.
|
|
69
|
+
*
|
|
70
|
+
* @param time - The position as the transport spells it.
|
|
71
|
+
* @param signature - The signature in force.
|
|
72
|
+
*/
|
|
73
|
+
declare function musicalToBeats(time: MusicalTime, signature?: TimeSignature): number;
|
|
74
|
+
/** The transport's own notation: `002.1.1`, bars padded to three digits. */
|
|
75
|
+
declare function formatMusicalTime(time: MusicalTime): string;
|
|
76
|
+
/**
|
|
77
|
+
* Nudge one segment, carrying into the ones above it.
|
|
78
|
+
*
|
|
79
|
+
* Done in sixteenths rather than by mutating the segment, which is what makes
|
|
80
|
+
* the carry fall out for free: the fourth beat of a bar plus one beat is the
|
|
81
|
+
* first beat of the next bar because that is what the arithmetic says, not
|
|
82
|
+
* because three nested `if` statements said so (the ported version needed
|
|
83
|
+
* eight branches for this, one per overflow case, and had no way to express
|
|
84
|
+
* "one bar" in a signature where a bar is not four beats).
|
|
85
|
+
*
|
|
86
|
+
* @param beats - Current position in quarter-note beats.
|
|
87
|
+
* @param segment - Which segment the caller is stepping.
|
|
88
|
+
* @param delta - How many of that segment, positive or negative.
|
|
89
|
+
* @param signature - The signature in force.
|
|
90
|
+
* @returns The new position, never below zero and never past {@link MAX_BAR}.
|
|
91
|
+
*/
|
|
92
|
+
declare function stepMusicalTime(beats: number, segment: MusicalSegment, delta: number, signature?: TimeSignature): number;
|
|
93
|
+
/**
|
|
94
|
+
* Set one segment to a typed value, leaving the others alone.
|
|
95
|
+
*
|
|
96
|
+
* Each segment is clamped to what it can hold — bars to 1…{@link MAX_BAR},
|
|
97
|
+
* beats to the signature's count, sixteenths to the beat's — so a typo produces
|
|
98
|
+
* a legal position rather than a rejected keystroke.
|
|
99
|
+
*
|
|
100
|
+
* @param beats - Current position in quarter-note beats.
|
|
101
|
+
* @param segment - Which segment the caller typed into.
|
|
102
|
+
* @param value - What they typed.
|
|
103
|
+
* @param signature - The signature in force.
|
|
104
|
+
*/
|
|
105
|
+
declare function setMusicalSegment(beats: number, segment: MusicalSegment, value: number, signature?: TimeSignature): number;
|
|
106
|
+
//#endregion
|
|
107
|
+
export { DEFAULT_TIME_SIGNATURE, MAX_BAR, MusicalSegment, MusicalTime, SIXTEENTH_BEATS, TimeSignature, barBeats, beatBeats, beatsToMusical, formatMusicalTime, musicalToBeats, setMusicalSegment, sixteenthsPerBeat, stepMusicalTime };
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
//#region src/midi/_time.ts
|
|
2
|
+
/** Four-four, because most of the world is. */
|
|
3
|
+
const DEFAULT_TIME_SIGNATURE = {
|
|
4
|
+
numerator: 4,
|
|
5
|
+
denominator: 4
|
|
6
|
+
};
|
|
7
|
+
/** A sixteenth note, in quarter-note beats. The finest grid this notation shows. */
|
|
8
|
+
const SIXTEENTH_BEATS = .25;
|
|
9
|
+
/**
|
|
10
|
+
* The highest bar the field will count to.
|
|
11
|
+
*
|
|
12
|
+
* Ported from the original's three-digit bars field. It is a display limit, not
|
|
13
|
+
* a musical one: 999 bars is over half an hour at 120 BPM, and a four-digit
|
|
14
|
+
* segment would cost the width the readout needs.
|
|
15
|
+
*/
|
|
16
|
+
const MAX_BAR = 999;
|
|
17
|
+
/** How many quarter-note beats a bar of this signature lasts. */
|
|
18
|
+
function barBeats(signature = DEFAULT_TIME_SIGNATURE) {
|
|
19
|
+
return signature.numerator * beatBeats(signature);
|
|
20
|
+
}
|
|
21
|
+
/** How many quarter-note beats one displayed beat of this signature lasts. */
|
|
22
|
+
function beatBeats(signature = DEFAULT_TIME_SIGNATURE) {
|
|
23
|
+
return 4 / signature.denominator;
|
|
24
|
+
}
|
|
25
|
+
/** How many sixteenth notes fit in one displayed beat of this signature. */
|
|
26
|
+
function sixteenthsPerBeat(signature = DEFAULT_TIME_SIGNATURE) {
|
|
27
|
+
return beatBeats(signature) / SIXTEENTH_BEATS;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A position in quarter-note beats, spelled out.
|
|
31
|
+
*
|
|
32
|
+
* Quantised to the sixteenth grid on the way in, because the notation has three
|
|
33
|
+
* segments and no fourth: reporting `1.1.0` for a position that is actually a
|
|
34
|
+
* thirty-second late would be a lie the field could not correct.
|
|
35
|
+
*
|
|
36
|
+
* @param beats - Position in quarter-note beats. Negative clamps to the start.
|
|
37
|
+
* @param signature - The signature in force.
|
|
38
|
+
*/
|
|
39
|
+
function beatsToMusical(beats, signature = DEFAULT_TIME_SIGNATURE) {
|
|
40
|
+
const grid = quantise(beats);
|
|
41
|
+
const bar = Math.floor(grid / barBeats(signature));
|
|
42
|
+
const inBar = grid - bar * barBeats(signature);
|
|
43
|
+
const beat = Math.floor(inBar / beatBeats(signature));
|
|
44
|
+
const inBeat = inBar - beat * beatBeats(signature);
|
|
45
|
+
return {
|
|
46
|
+
bar: bar + 1,
|
|
47
|
+
beat: beat + 1,
|
|
48
|
+
sixteenth: Math.round(inBeat / SIXTEENTH_BEATS)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* A spelled-out position back in quarter-note beats.
|
|
53
|
+
*
|
|
54
|
+
* @param time - The position as the transport spells it.
|
|
55
|
+
* @param signature - The signature in force.
|
|
56
|
+
*/
|
|
57
|
+
function musicalToBeats(time, signature = DEFAULT_TIME_SIGNATURE) {
|
|
58
|
+
return round((time.bar - 1) * barBeats(signature) + (time.beat - 1) * beatBeats(signature) + time.sixteenth * SIXTEENTH_BEATS);
|
|
59
|
+
}
|
|
60
|
+
/** The transport's own notation: `002.1.1`, bars padded to three digits. */
|
|
61
|
+
function formatMusicalTime(time) {
|
|
62
|
+
return `${String(time.bar).padStart(3, "0")}.${time.beat}.${time.sixteenth}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Nudge one segment, carrying into the ones above it.
|
|
66
|
+
*
|
|
67
|
+
* Done in sixteenths rather than by mutating the segment, which is what makes
|
|
68
|
+
* the carry fall out for free: the fourth beat of a bar plus one beat is the
|
|
69
|
+
* first beat of the next bar because that is what the arithmetic says, not
|
|
70
|
+
* because three nested `if` statements said so (the ported version needed
|
|
71
|
+
* eight branches for this, one per overflow case, and had no way to express
|
|
72
|
+
* "one bar" in a signature where a bar is not four beats).
|
|
73
|
+
*
|
|
74
|
+
* @param beats - Current position in quarter-note beats.
|
|
75
|
+
* @param segment - Which segment the caller is stepping.
|
|
76
|
+
* @param delta - How many of that segment, positive or negative.
|
|
77
|
+
* @param signature - The signature in force.
|
|
78
|
+
* @returns The new position, never below zero and never past {@link MAX_BAR}.
|
|
79
|
+
*/
|
|
80
|
+
function stepMusicalTime(beats, segment, delta, signature = DEFAULT_TIME_SIGNATURE) {
|
|
81
|
+
const step = segmentBeats(segment, signature);
|
|
82
|
+
return clampToTransport(quantise(beats) + delta * step, signature);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Set one segment to a typed value, leaving the others alone.
|
|
86
|
+
*
|
|
87
|
+
* Each segment is clamped to what it can hold — bars to 1…{@link MAX_BAR},
|
|
88
|
+
* beats to the signature's count, sixteenths to the beat's — so a typo produces
|
|
89
|
+
* a legal position rather than a rejected keystroke.
|
|
90
|
+
*
|
|
91
|
+
* @param beats - Current position in quarter-note beats.
|
|
92
|
+
* @param segment - Which segment the caller typed into.
|
|
93
|
+
* @param value - What they typed.
|
|
94
|
+
* @param signature - The signature in force.
|
|
95
|
+
*/
|
|
96
|
+
function setMusicalSegment(beats, segment, value, signature = DEFAULT_TIME_SIGNATURE) {
|
|
97
|
+
return clampToTransport(musicalToBeats({
|
|
98
|
+
...beatsToMusical(beats, signature),
|
|
99
|
+
...segment === "bars" ? { bar: clamp(value, 1, 999) } : null,
|
|
100
|
+
...segment === "beats" ? { beat: clamp(value, 1, signature.numerator) } : null,
|
|
101
|
+
...segment === "sixteenths" ? { sixteenth: clamp(value, 0, sixteenthsPerBeat(signature) - 1) } : null
|
|
102
|
+
}, signature), signature);
|
|
103
|
+
}
|
|
104
|
+
/** How many quarter-note beats one step of a segment is worth. */
|
|
105
|
+
function segmentBeats(segment, signature) {
|
|
106
|
+
if (segment === "bars") return barBeats(signature);
|
|
107
|
+
if (segment === "beats") return beatBeats(signature);
|
|
108
|
+
return SIXTEENTH_BEATS;
|
|
109
|
+
}
|
|
110
|
+
/** Snap to the sixteenth grid and drop the float noise a division leaves. */
|
|
111
|
+
function quantise(beats) {
|
|
112
|
+
if (!Number.isFinite(beats) || beats <= 0) return 0;
|
|
113
|
+
return round(Math.round(beats / SIXTEENTH_BEATS) * SIXTEENTH_BEATS);
|
|
114
|
+
}
|
|
115
|
+
/** Keep a position inside the transport's range. */
|
|
116
|
+
function clampToTransport(beats, signature) {
|
|
117
|
+
const last = 999 * barBeats(signature) - SIXTEENTH_BEATS;
|
|
118
|
+
return Math.min(last, Math.max(0, round(beats)));
|
|
119
|
+
}
|
|
120
|
+
/** Trim the float noise repeated addition accumulates. */
|
|
121
|
+
function round(beats) {
|
|
122
|
+
return Math.round(beats * 1e6) / 1e6;
|
|
123
|
+
}
|
|
124
|
+
/** Clamp an integer segment, tolerating a typo that is not a number at all. */
|
|
125
|
+
function clamp(value, low, high) {
|
|
126
|
+
if (!Number.isFinite(value)) return low;
|
|
127
|
+
return Math.min(high, Math.max(low, Math.round(value)));
|
|
128
|
+
}
|
|
129
|
+
//#endregion
|
|
130
|
+
export { DEFAULT_TIME_SIGNATURE, MAX_BAR, SIXTEENTH_BEATS, barBeats, beatBeats, beatsToMusical, formatMusicalTime, musicalToBeats, setMusicalSegment, sixteenthsPerBeat, stepMusicalTime };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BLACK_KEY_PX, KeyboardLayout, MIDI_NOTES, NOTE_NAMES, NoteRange, OCTAVE_PX, PianoKey, WHITE_KEY_PX, isBlackKey, keyboardLayout, keyboardWindow, noteAtOffset, noteName } from "./_notes.js";
|
|
2
|
+
import { DEFAULT_TIME_SIGNATURE, MAX_BAR, MusicalSegment, MusicalTime, SIXTEENTH_BEATS, TimeSignature, barBeats, beatBeats, beatsToMusical, formatMusicalTime, musicalToBeats, setMusicalSegment, sixteenthsPerBeat, stepMusicalTime } from "./_time.js";
|
|
3
|
+
import { RulerTick, RulerTicks, RulerTicksOptions, RulerViewport, TICK_TARGET_PX, chooseInterval, rulerTicks } from "./_ruler.js";
|
|
4
|
+
import { MusicalTimeInput, MusicalTimeInputProps } from "./musical-time-input.js";
|
|
5
|
+
import { PianoKeyboard, PianoKeyboardProps } from "./piano-keyboard.js";
|
|
6
|
+
import { SPECTRUM_WIDTH, SpectrumMode, SpectrumVisualizer, SpectrumVisualizerProps } from "./spectrum-visualizer.js";
|
|
7
|
+
import { ThresholdRail, ThresholdRailProps, ThresholdTone } from "./threshold-rail.js";
|
|
8
|
+
import { LoopRegion, RulerMarker, TimelineRuler, TimelineRulerProps } from "./timeline-ruler.js";
|
|
9
|
+
export { BLACK_KEY_PX, DEFAULT_TIME_SIGNATURE, type KeyboardLayout, type LoopRegion, MAX_BAR, MIDI_NOTES, type MusicalSegment, type MusicalTime, MusicalTimeInput, type MusicalTimeInputProps, NOTE_NAMES, type NoteRange, OCTAVE_PX, type PianoKey, PianoKeyboard, type PianoKeyboardProps, type RulerMarker, type RulerTick, type RulerTicks, type RulerTicksOptions, type RulerViewport, SIXTEENTH_BEATS, SPECTRUM_WIDTH, type SpectrumMode, SpectrumVisualizer, type SpectrumVisualizerProps, TICK_TARGET_PX, ThresholdRail, type ThresholdRailProps, type ThresholdTone, type TimeSignature, TimelineRuler, type TimelineRulerProps, WHITE_KEY_PX, barBeats, beatBeats, beatsToMusical, chooseInterval, formatMusicalTime, isBlackKey, keyboardLayout, keyboardWindow, musicalToBeats, noteAtOffset, noteName, rulerTicks, setMusicalSegment, sixteenthsPerBeat, stepMusicalTime };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BLACK_KEY_PX, MIDI_NOTES, NOTE_NAMES, OCTAVE_PX, WHITE_KEY_PX, isBlackKey, keyboardLayout, keyboardWindow, noteAtOffset, noteName } from "./_notes.js";
|
|
2
|
+
import { DEFAULT_TIME_SIGNATURE, MAX_BAR, SIXTEENTH_BEATS, barBeats, beatBeats, beatsToMusical, formatMusicalTime, musicalToBeats, setMusicalSegment, sixteenthsPerBeat, stepMusicalTime } from "./_time.js";
|
|
3
|
+
import { TICK_TARGET_PX, chooseInterval, rulerTicks } from "./_ruler.js";
|
|
4
|
+
import { MusicalTimeInput } from "./musical-time-input.js";
|
|
5
|
+
import { PianoKeyboard } from "./piano-keyboard.js";
|
|
6
|
+
import { SPECTRUM_WIDTH, SpectrumVisualizer } from "./spectrum-visualizer.js";
|
|
7
|
+
import { ThresholdRail } from "./threshold-rail.js";
|
|
8
|
+
import { TimelineRuler } from "./timeline-ruler.js";
|
|
9
|
+
export { BLACK_KEY_PX, DEFAULT_TIME_SIGNATURE, MAX_BAR, MIDI_NOTES, MusicalTimeInput, NOTE_NAMES, OCTAVE_PX, PianoKeyboard, SIXTEENTH_BEATS, SPECTRUM_WIDTH, SpectrumVisualizer, TICK_TARGET_PX, ThresholdRail, TimelineRuler, WHITE_KEY_PX, barBeats, beatBeats, beatsToMusical, chooseInterval, formatMusicalTime, isBlackKey, keyboardLayout, keyboardWindow, musicalToBeats, noteAtOffset, noteName, rulerTicks, setMusicalSegment, sixteenthsPerBeat, stepMusicalTime };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { FormControlSize } from "../forms/_chassis.js";
|
|
2
|
+
import { TimeSignature } from "./_time.js";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
//#region src/midi/musical-time-input.d.ts
|
|
5
|
+
interface MusicalTimeInputProps extends Omit<React.ComponentPropsWithoutRef<"div">, "onChange" | "defaultValue"> {
|
|
6
|
+
/** The position, in quarter-note beats. Always controlled. */
|
|
7
|
+
value: number;
|
|
8
|
+
/** Called with the new position after every edit. */
|
|
9
|
+
onChange: (beats: number) => void;
|
|
10
|
+
/** The signature the display counts in. Defaults to 4/4. */
|
|
11
|
+
timeSignature?: TimeSignature;
|
|
12
|
+
/** Rung of the control ladder. Defaults to `"md"`. */
|
|
13
|
+
size?: FormControlSize;
|
|
14
|
+
/** Print the total in beats after the segments. Defaults to `true`. */
|
|
15
|
+
total?: boolean;
|
|
16
|
+
/** Refuse every edit. */
|
|
17
|
+
disabled?: boolean;
|
|
18
|
+
/** Accessible name for the field as a whole. Defaults to `"Musical time"`. */
|
|
19
|
+
label?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* `bars.beats.sixteenths` — a position in a song, typed the way a song is
|
|
23
|
+
* counted.
|
|
24
|
+
*
|
|
25
|
+
* A number field would ask for 4.25 and mean "bar 2, beat 1, one sixteenth in",
|
|
26
|
+
* which is a conversion the musician has to do in their head every time. This
|
|
27
|
+
* field does it instead: three segments, each one stepping in its own musical
|
|
28
|
+
* unit, and the carry between them handled by the arithmetic rather than by the
|
|
29
|
+
* typist (bar 1 beat 4 plus one beat is bar 2 beat 1).
|
|
30
|
+
*
|
|
31
|
+
* Three interactions, because the three are used at different moments: **arrows**
|
|
32
|
+
* for a nudge while listening, **scroll** for a sweep, and **typing** for a
|
|
33
|
+
* position read off a cue sheet. Tab moves between the segments on its own — the
|
|
34
|
+
* ported version intercepted Tab to reimplement the focus order the browser
|
|
35
|
+
* already had, which broke Shift+Tab out of the field entirely.
|
|
36
|
+
*
|
|
37
|
+
* The scroll gesture is bound natively rather than through React's `onWheel`,
|
|
38
|
+
* because React attaches wheel listeners passively at the root: `preventDefault`
|
|
39
|
+
* there is a no-op and the page scrolls away underneath the edit.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* <MusicalTimeInput value={beats} onChange={setBeats} />
|
|
43
|
+
* @example
|
|
44
|
+
* <MusicalTimeInput value={beats} onChange={setBeats} timeSignature={{ numerator: 6, denominator: 8 }} />
|
|
45
|
+
*/
|
|
46
|
+
declare const MusicalTimeInput: React.ForwardRefExoticComponent<MusicalTimeInputProps & React.RefAttributes<HTMLDivElement>>;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { MusicalTimeInput, MusicalTimeInputProps };
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { bareControlClasses, controlGroupFocusClasses, controlVariants } from "../forms/_chassis.js";
|
|
4
|
+
import { DEFAULT_TIME_SIGNATURE, beatsToMusical, setMusicalSegment, stepMusicalTime } from "./_time.js";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/midi/musical-time-input.tsx
|
|
8
|
+
/** The three segments, in reading order, with the width each needs. */
|
|
9
|
+
const SEGMENTS = [
|
|
10
|
+
{
|
|
11
|
+
segment: "bars",
|
|
12
|
+
label: "Bars",
|
|
13
|
+
width: "w-[3ch]"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
segment: "beats",
|
|
17
|
+
label: "Beats",
|
|
18
|
+
width: "w-[2ch]"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
segment: "sixteenths",
|
|
22
|
+
label: "Sixteenths",
|
|
23
|
+
width: "w-[2ch]"
|
|
24
|
+
}
|
|
25
|
+
];
|
|
26
|
+
/** What a segment shows when it is not being typed into. */
|
|
27
|
+
function segmentText(time, segment) {
|
|
28
|
+
if (segment === "bars") return String(time.bar).padStart(3, "0");
|
|
29
|
+
if (segment === "beats") return String(time.beat);
|
|
30
|
+
return String(time.sixteenth);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* `bars.beats.sixteenths` — a position in a song, typed the way a song is
|
|
34
|
+
* counted.
|
|
35
|
+
*
|
|
36
|
+
* A number field would ask for 4.25 and mean "bar 2, beat 1, one sixteenth in",
|
|
37
|
+
* which is a conversion the musician has to do in their head every time. This
|
|
38
|
+
* field does it instead: three segments, each one stepping in its own musical
|
|
39
|
+
* unit, and the carry between them handled by the arithmetic rather than by the
|
|
40
|
+
* typist (bar 1 beat 4 plus one beat is bar 2 beat 1).
|
|
41
|
+
*
|
|
42
|
+
* Three interactions, because the three are used at different moments: **arrows**
|
|
43
|
+
* for a nudge while listening, **scroll** for a sweep, and **typing** for a
|
|
44
|
+
* position read off a cue sheet. Tab moves between the segments on its own — the
|
|
45
|
+
* ported version intercepted Tab to reimplement the focus order the browser
|
|
46
|
+
* already had, which broke Shift+Tab out of the field entirely.
|
|
47
|
+
*
|
|
48
|
+
* The scroll gesture is bound natively rather than through React's `onWheel`,
|
|
49
|
+
* because React attaches wheel listeners passively at the root: `preventDefault`
|
|
50
|
+
* there is a no-op and the page scrolls away underneath the edit.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* <MusicalTimeInput value={beats} onChange={setBeats} />
|
|
54
|
+
* @example
|
|
55
|
+
* <MusicalTimeInput value={beats} onChange={setBeats} timeSignature={{ numerator: 6, denominator: 8 }} />
|
|
56
|
+
*/
|
|
57
|
+
const MusicalTimeInput = React.forwardRef(function MusicalTimeInput({ className, value, onChange, timeSignature = DEFAULT_TIME_SIGNATURE, size = "md", total = true, disabled = false, label = "Musical time", ...elementProps }, ref) {
|
|
58
|
+
/** The segment being typed into, and the raw text in it. */
|
|
59
|
+
const [draft, setDraft] = React.useState(null);
|
|
60
|
+
const time = beatsToMusical(value, timeSignature);
|
|
61
|
+
const step = React.useCallback((segment, delta) => {
|
|
62
|
+
if (disabled) return;
|
|
63
|
+
const next = stepMusicalTime(value, segment, delta, timeSignature);
|
|
64
|
+
if (next !== value) onChange(next);
|
|
65
|
+
}, [
|
|
66
|
+
disabled,
|
|
67
|
+
onChange,
|
|
68
|
+
timeSignature,
|
|
69
|
+
value
|
|
70
|
+
]);
|
|
71
|
+
const type = (segment, text) => {
|
|
72
|
+
if (disabled) return;
|
|
73
|
+
setDraft({
|
|
74
|
+
segment,
|
|
75
|
+
text
|
|
76
|
+
});
|
|
77
|
+
const parsed = Number.parseInt(text, 10);
|
|
78
|
+
if (Number.isNaN(parsed)) return;
|
|
79
|
+
const next = setMusicalSegment(value, segment, parsed, timeSignature);
|
|
80
|
+
if (next !== value) onChange(next);
|
|
81
|
+
};
|
|
82
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
83
|
+
ref,
|
|
84
|
+
role: "group",
|
|
85
|
+
"aria-label": label,
|
|
86
|
+
"data-slot": "musical-time-input",
|
|
87
|
+
className: cn(controlVariants({ size }), "inline-flex w-auto items-center gap-px", controlGroupFocusClasses, disabled && "opacity-40", className),
|
|
88
|
+
...elementProps,
|
|
89
|
+
children: [SEGMENTS.map(({ segment, label: segmentLabel, width }, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [index === 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
90
|
+
"aria-hidden": "true",
|
|
91
|
+
"data-slot": "musical-time-separator",
|
|
92
|
+
className: "text-fg-subtle",
|
|
93
|
+
children: "."
|
|
94
|
+
}), /* @__PURE__ */ jsx(TimeSegmentField, {
|
|
95
|
+
segment,
|
|
96
|
+
label: segmentLabel,
|
|
97
|
+
width,
|
|
98
|
+
disabled,
|
|
99
|
+
text: draft?.segment === segment ? draft.text : segmentText(time, segment),
|
|
100
|
+
onStep: step,
|
|
101
|
+
onType: type,
|
|
102
|
+
onSettle: () => setDraft(null)
|
|
103
|
+
})] }, segment)), total ? /* @__PURE__ */ jsx("span", {
|
|
104
|
+
"data-slot": "musical-time-total",
|
|
105
|
+
className: "ml-(--cue-space-2) text-(length:--cue-text-micro) text-fg-subtle tabular-nums",
|
|
106
|
+
children: `${value.toFixed(2)} beats`
|
|
107
|
+
}) : null]
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
/** One segment of the notation: a text box that also steps. */
|
|
111
|
+
function TimeSegmentField({ segment, label, width, text, disabled, onStep, onType, onSettle }) {
|
|
112
|
+
const ref = React.useRef(null);
|
|
113
|
+
const stepRef = React.useRef(onStep);
|
|
114
|
+
stepRef.current = onStep;
|
|
115
|
+
React.useEffect(() => {
|
|
116
|
+
const element = ref.current;
|
|
117
|
+
if (element === null || disabled) return;
|
|
118
|
+
const onWheel = (event) => {
|
|
119
|
+
if (event.deltaY === 0) return;
|
|
120
|
+
event.preventDefault();
|
|
121
|
+
stepRef.current(segment, event.deltaY < 0 ? 1 : -1);
|
|
122
|
+
};
|
|
123
|
+
element.addEventListener("wheel", onWheel, { passive: false });
|
|
124
|
+
return () => element.removeEventListener("wheel", onWheel);
|
|
125
|
+
}, [disabled, segment]);
|
|
126
|
+
return /* @__PURE__ */ jsx("input", {
|
|
127
|
+
ref,
|
|
128
|
+
type: "text",
|
|
129
|
+
inputMode: "numeric",
|
|
130
|
+
autoComplete: "off",
|
|
131
|
+
"data-slot": "musical-time-segment",
|
|
132
|
+
"data-segment": segment,
|
|
133
|
+
"aria-label": label,
|
|
134
|
+
value: text,
|
|
135
|
+
disabled,
|
|
136
|
+
onChange: (event) => onType(segment, event.currentTarget.value),
|
|
137
|
+
onBlur: onSettle,
|
|
138
|
+
onKeyDown: (event) => {
|
|
139
|
+
if (event.key === "ArrowUp") {
|
|
140
|
+
event.preventDefault();
|
|
141
|
+
onStep(segment, 1);
|
|
142
|
+
} else if (event.key === "ArrowDown") {
|
|
143
|
+
event.preventDefault();
|
|
144
|
+
onStep(segment, -1);
|
|
145
|
+
} else if (event.key === "Enter") {
|
|
146
|
+
event.preventDefault();
|
|
147
|
+
onSettle();
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
className: cn(bareControlClasses, width, "flex-none text-center tabular-nums")
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//#endregion
|
|
154
|
+
export { MusicalTimeInput };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { NoteRange } from "./_notes.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/midi/piano-keyboard.d.ts
|
|
4
|
+
interface PianoKeyboardProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children" | "onChange"> {
|
|
5
|
+
/** The selected range. Use with `onRangeChange` for a controlled widget. */
|
|
6
|
+
range?: NoteRange;
|
|
7
|
+
/** Initial range for an uncontrolled widget. Defaults to C2–C4. */
|
|
8
|
+
defaultRange?: NoteRange;
|
|
9
|
+
/** Called with the range each edit produces. */
|
|
10
|
+
onRangeChange?: (range: NoteRange) => void;
|
|
11
|
+
/** How many octaves to draw. Defaults to `3`. */
|
|
12
|
+
octaves?: number;
|
|
13
|
+
/** Notes sounding right now, painted solid. */
|
|
14
|
+
highlight?: readonly number[];
|
|
15
|
+
/** White-key height in px at the 16px root, emitted as `rem`. Defaults to `48`. */
|
|
16
|
+
keyHeight?: number;
|
|
17
|
+
/** What the range is *of*. Names the group and both markers. Defaults to `"Note range"`. */
|
|
18
|
+
label?: string;
|
|
19
|
+
/** Print the range and its size under the board. Defaults to `true`. */
|
|
20
|
+
readout?: boolean;
|
|
21
|
+
/** Refuse every edit. The board still draws. */
|
|
22
|
+
disabled?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* A piano keyboard as a range control: drag the markers, or arrow the edges.
|
|
26
|
+
*
|
|
27
|
+
* Ported from ableton-sync's note-range picker, geometry intact — 16px whites,
|
|
28
|
+
* 10px blacks over the seams — and rebuilt around three things the original did
|
|
29
|
+
* not have:
|
|
30
|
+
*
|
|
31
|
+
* 1. **The edges are sliders.** The port moved its markers with `mousedown` and
|
|
32
|
+
* a window listener, which means no keyboard, no screen reader and no touch.
|
|
33
|
+
* Here each marker is a `role="slider"` announcing its note by name, so
|
|
34
|
+
* "set the low end to C2" is reachable without a pointer.
|
|
35
|
+
* 2. **The board holds still while you drag.** The window is centred on the
|
|
36
|
+
* selection, so moving an edge moves the window, which moves the note under
|
|
37
|
+
* the cursor — the port's markers slid away from the pointer mid-drag. The
|
|
38
|
+
* window is frozen for the length of a gesture instead.
|
|
39
|
+
* 3. **It is drawn in console materials, not in white and black.** A photo of a
|
|
40
|
+
* piano inverts in a light theme; a `surface-3` white key and a
|
|
41
|
+
* `--cue-data-ground` black key read the same in both. The information — what
|
|
42
|
+
* is in range, what is sounding — is carried by the accent, which is the only
|
|
43
|
+
* thing here that a theme is allowed to move.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* <PianoKeyboard range={range} onRangeChange={setRange} highlight={sounding} />
|
|
47
|
+
*/
|
|
48
|
+
declare const PianoKeyboard: React.ForwardRefExoticComponent<PianoKeyboardProps & React.RefAttributes<HTMLDivElement>>;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { PianoKeyboard, PianoKeyboardProps };
|