@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,112 @@
|
|
|
1
|
+
import "./_ramp.js";
|
|
2
|
+
//#region src/dmx/_universe.ts
|
|
3
|
+
/**
|
|
4
|
+
* The ruler's addresses: the start, the end, and every 64 in between.
|
|
5
|
+
*
|
|
6
|
+
* 64 is the interval a patch sheet is written in, so these are the numbers an
|
|
7
|
+
* operator already counts by — not a tick density chosen to fill the width.
|
|
8
|
+
*/
|
|
9
|
+
const UNIVERSE_TICKS = [
|
|
10
|
+
1,
|
|
11
|
+
64,
|
|
12
|
+
128,
|
|
13
|
+
192,
|
|
14
|
+
256,
|
|
15
|
+
320,
|
|
16
|
+
384,
|
|
17
|
+
448,
|
|
18
|
+
512
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Where a channel sits along the bar, as a percentage.
|
|
22
|
+
*
|
|
23
|
+
* 1-based in, 0-based out: channel 1 is the left edge, and the last channel
|
|
24
|
+
* starts one slot short of the right one — a channel is a *slot* with width,
|
|
25
|
+
* not a point.
|
|
26
|
+
*
|
|
27
|
+
* @param channel - The address, 1-based.
|
|
28
|
+
* @param slots - Frame length. Defaults to a full universe.
|
|
29
|
+
*/
|
|
30
|
+
function channelPercent(channel, slots = 512) {
|
|
31
|
+
return (channel - 1) / slots * 100;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Place a patch on a universe bar and find its collisions.
|
|
35
|
+
*
|
|
36
|
+
* Three rules, each one a thing a patch tool has to get right:
|
|
37
|
+
*
|
|
38
|
+
* 1. **An allocation that occupies nothing is not drawn.** A zero-width block
|
|
39
|
+
* with a two-pixel floor would draw a fixture that is not patched.
|
|
40
|
+
* 2. **A run that walks off the end is cut, not hidden** — and marked `clipped`,
|
|
41
|
+
* because "your 32-channel fixture at 500 does not fit" is exactly the thing
|
|
42
|
+
* the operator needs to see.
|
|
43
|
+
* 3. **Occupancy is counted in distinct slots.** Summing sizes would let a
|
|
44
|
+
* double patch report more capacity in use than the universe has.
|
|
45
|
+
*
|
|
46
|
+
* @param allocations - The patch, in display order.
|
|
47
|
+
* @param slots - Frame length. Defaults to a full universe.
|
|
48
|
+
*/
|
|
49
|
+
function universeLayout(allocations, slots = 512) {
|
|
50
|
+
const placed = [];
|
|
51
|
+
for (const [index, allocation] of allocations.entries()) {
|
|
52
|
+
if (!Number.isFinite(allocation.start) || !Number.isFinite(allocation.size)) continue;
|
|
53
|
+
const first = Math.round(allocation.start);
|
|
54
|
+
const size = Math.round(allocation.size);
|
|
55
|
+
if (size <= 0) continue;
|
|
56
|
+
const start = Math.max(1, first);
|
|
57
|
+
const end = Math.min(slots, first + size - 1);
|
|
58
|
+
if (end < start) continue;
|
|
59
|
+
placed.push({
|
|
60
|
+
allocation,
|
|
61
|
+
index,
|
|
62
|
+
start,
|
|
63
|
+
end,
|
|
64
|
+
clipped: first < 1 || first + size - 1 > slots
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
const occupancy = new Uint16Array(slots + 1);
|
|
68
|
+
for (const entry of placed) for (let channel = entry.start; channel <= entry.end; channel += 1) occupancy[channel] = occupancy[channel] + 1;
|
|
69
|
+
const conflicts = [];
|
|
70
|
+
let used = 0;
|
|
71
|
+
let run = null;
|
|
72
|
+
for (let channel = 1; channel <= slots; channel += 1) {
|
|
73
|
+
const count = occupancy[channel];
|
|
74
|
+
if (count > 0) used += 1;
|
|
75
|
+
if (count > 1) {
|
|
76
|
+
if (run === null) run = {
|
|
77
|
+
start: channel,
|
|
78
|
+
end: channel
|
|
79
|
+
};
|
|
80
|
+
else run.end = channel;
|
|
81
|
+
} else if (run !== null) {
|
|
82
|
+
conflicts.push(run);
|
|
83
|
+
run = null;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (run !== null) conflicts.push(run);
|
|
87
|
+
return {
|
|
88
|
+
slots,
|
|
89
|
+
blocks: placed.map((entry) => {
|
|
90
|
+
let conflict = false;
|
|
91
|
+
for (let channel = entry.start; channel <= entry.end && !conflict; channel += 1) if (occupancy[channel] > 1) conflict = true;
|
|
92
|
+
return {
|
|
93
|
+
key: entry.allocation.id ?? `${entry.allocation.label}#${entry.index}`,
|
|
94
|
+
allocation: entry.allocation,
|
|
95
|
+
label: entry.allocation.label,
|
|
96
|
+
tone: entry.allocation.tone ?? "neutral",
|
|
97
|
+
start: entry.start,
|
|
98
|
+
end: entry.end,
|
|
99
|
+
size: entry.end - entry.start + 1,
|
|
100
|
+
left: channelPercent(entry.start, slots),
|
|
101
|
+
width: (entry.end - entry.start + 1) / slots * 100,
|
|
102
|
+
conflict,
|
|
103
|
+
clipped: entry.clipped
|
|
104
|
+
};
|
|
105
|
+
}),
|
|
106
|
+
conflicts,
|
|
107
|
+
used,
|
|
108
|
+
utilisation: Math.round(used / slots * 100)
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
export { UNIVERSE_TICKS, channelPercent, universeLayout };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { DmxRamp } from "./_ramp.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/dmx/channel-matrix.d.ts
|
|
4
|
+
/** Columns of the detail grid. 32 × 16 is the one factorisation of 512 that reads as a page. */
|
|
5
|
+
declare const CHANNEL_MATRIX_COLUMNS = 32;
|
|
6
|
+
/** Rows of the detail grid. */
|
|
7
|
+
declare const CHANNEL_MATRIX_ROWS = 16;
|
|
8
|
+
/** Which view the matrix is showing. */
|
|
9
|
+
type ChannelMatrixMode = "detail" | "overview";
|
|
10
|
+
interface ChannelMatrixProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
|
|
11
|
+
/**
|
|
12
|
+
* The frame buffer: `universes × 512` bytes, universe 0 first.
|
|
13
|
+
*
|
|
14
|
+
* Read on every animation frame rather than on every render, so mutating it
|
|
15
|
+
* in place is the intended usage — that is what makes a 40 Hz stream cost one
|
|
16
|
+
* `requestAnimationFrame` instead of one React render per packet. The one
|
|
17
|
+
* thing that does not follow an in-place write is the accessible summary,
|
|
18
|
+
* which is computed in render and so refreshes when a new reference arrives.
|
|
19
|
+
*/
|
|
20
|
+
data?: Uint8Array;
|
|
21
|
+
/** How many universes the buffer holds. Defaults to `1`. */
|
|
22
|
+
universes?: number;
|
|
23
|
+
/** Selected universe, 0-based. Use with `onUniverseChange` for a controlled widget. */
|
|
24
|
+
universe?: number;
|
|
25
|
+
/** Initially selected universe for an uncontrolled widget. Defaults to `0`. */
|
|
26
|
+
defaultUniverse?: number;
|
|
27
|
+
/** Called with the universe a drill-in selected. */
|
|
28
|
+
onUniverseChange?: (universe: number) => void;
|
|
29
|
+
/** Current view. Use with `onModeChange` for a controlled widget. */
|
|
30
|
+
mode?: ChannelMatrixMode;
|
|
31
|
+
/** Initial view for an uncontrolled widget. Defaults to `"detail"`. */
|
|
32
|
+
defaultMode?: ChannelMatrixMode;
|
|
33
|
+
/** Called when the view changes, including on a drill-in. */
|
|
34
|
+
onModeChange?: (mode: ChannelMatrixMode) => void;
|
|
35
|
+
/** Cell colouring. Use with `onRampChange` for a controlled widget. */
|
|
36
|
+
ramp?: DmxRamp;
|
|
37
|
+
/** Initial cell colouring for an uncontrolled widget. Defaults to `"mono"`. */
|
|
38
|
+
defaultRamp?: DmxRamp;
|
|
39
|
+
/** Called when the colouring changes. */
|
|
40
|
+
onRampChange?: (ramp: DmxRamp) => void;
|
|
41
|
+
/** Whether frames are still arriving. Defaults to `true`; `false` stops the repaint loop. */
|
|
42
|
+
live?: boolean;
|
|
43
|
+
/** Show the view and colouring buttons. Defaults to `true`. */
|
|
44
|
+
controls?: boolean;
|
|
45
|
+
/** What this output is. Defaults to `"DMX output"`. */
|
|
46
|
+
label?: string;
|
|
47
|
+
/** Name a universe for its button and card. Defaults to `"Universe 3"` / `U03`. */
|
|
48
|
+
formatUniverse?: (universe: number) => string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The channel-by-channel view: 512 addressed cells, repainted imperatively.
|
|
52
|
+
*
|
|
53
|
+
* Ported from dmxhub's bridge debugger. The interesting part is not the grid —
|
|
54
|
+
* it is what happens between frames. Five hundred and twelve React elements
|
|
55
|
+
* re-rendered forty times a second is a locked tab, so this component renders
|
|
56
|
+
* the grid *once* and then never re-renders it: an animation loop reads the
|
|
57
|
+
* buffer, diffs each slot against a previous-value cache, and writes only the
|
|
58
|
+
* cells whose level actually moved. A typical lighting state changes a handful
|
|
59
|
+
* of channels per frame, so a typical frame touches a handful of nodes.
|
|
60
|
+
*
|
|
61
|
+
* That is also why `data` is read through a ref rather than through props: a
|
|
62
|
+
* decoder that writes into one buffer forever is the cheapest thing it can do,
|
|
63
|
+
* and this component is built to be pointed at exactly that.
|
|
64
|
+
*
|
|
65
|
+
* Two things it keeps from the port, and one it fixes:
|
|
66
|
+
*
|
|
67
|
+
* - **Two ramps.** Grey answers "how bright", the status ramp answers "which
|
|
68
|
+
* ones are hot". Both are lookup tables, built once per theme (see `_ramp.ts`).
|
|
69
|
+
* - **Overview and drill-in.** Thirty-two universes as thumbnails, drawn through
|
|
70
|
+
* one 32×16 offscreen canvas and scaled up unsmoothed; clicking one opens it.
|
|
71
|
+
* - **It stops.** The original left `requestAnimationFrame` running forever. Here
|
|
72
|
+
* the loop is off under `prefers-reduced-motion` and off when `live` is
|
|
73
|
+
* `false`; a new `data` reference still repaints, so a paused stream is never
|
|
74
|
+
* a stale grid.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* <ChannelMatrix label="Output" data={buffer} universes={32} />
|
|
78
|
+
*/
|
|
79
|
+
declare const ChannelMatrix: React.ForwardRefExoticComponent<ChannelMatrixProps & React.RefAttributes<HTMLDivElement>>;
|
|
80
|
+
//#endregion
|
|
81
|
+
export { CHANNEL_MATRIX_COLUMNS, CHANNEL_MATRIX_ROWS, ChannelMatrix, ChannelMatrixMode, ChannelMatrixProps };
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
|
|
4
|
+
import { useComposedRefs } from "../lib/compose.js";
|
|
5
|
+
import { useCuePortalProps } from "../system/portal.js";
|
|
6
|
+
import { usePrefersReducedMotion } from "../instruments/_motion.js";
|
|
7
|
+
import { DMX_RAMP_NAMES, activeChannels, dmxPalette, dmxPaletteColor, dmxPaletteInk } from "./_ramp.js";
|
|
8
|
+
import { DmxReadout } from "./_readout.js";
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
//#region src/dmx/channel-matrix.tsx
|
|
12
|
+
/** Columns of the detail grid. 32 × 16 is the one factorisation of 512 that reads as a page. */
|
|
13
|
+
const CHANNEL_MATRIX_COLUMNS = 32;
|
|
14
|
+
/** Rows of the detail grid. */
|
|
15
|
+
const CHANNEL_MATRIX_ROWS = 16;
|
|
16
|
+
/** Opaque alpha for every pixel of a thumbnail. */
|
|
17
|
+
const OPAQUE = 255;
|
|
18
|
+
/** Human labels for the ramp buttons. */
|
|
19
|
+
const RAMP_LABELS = {
|
|
20
|
+
mono: "Mono",
|
|
21
|
+
value: "Value"
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* The channel-by-channel view: 512 addressed cells, repainted imperatively.
|
|
25
|
+
*
|
|
26
|
+
* Ported from dmxhub's bridge debugger. The interesting part is not the grid —
|
|
27
|
+
* it is what happens between frames. Five hundred and twelve React elements
|
|
28
|
+
* re-rendered forty times a second is a locked tab, so this component renders
|
|
29
|
+
* the grid *once* and then never re-renders it: an animation loop reads the
|
|
30
|
+
* buffer, diffs each slot against a previous-value cache, and writes only the
|
|
31
|
+
* cells whose level actually moved. A typical lighting state changes a handful
|
|
32
|
+
* of channels per frame, so a typical frame touches a handful of nodes.
|
|
33
|
+
*
|
|
34
|
+
* That is also why `data` is read through a ref rather than through props: a
|
|
35
|
+
* decoder that writes into one buffer forever is the cheapest thing it can do,
|
|
36
|
+
* and this component is built to be pointed at exactly that.
|
|
37
|
+
*
|
|
38
|
+
* Two things it keeps from the port, and one it fixes:
|
|
39
|
+
*
|
|
40
|
+
* - **Two ramps.** Grey answers "how bright", the status ramp answers "which
|
|
41
|
+
* ones are hot". Both are lookup tables, built once per theme (see `_ramp.ts`).
|
|
42
|
+
* - **Overview and drill-in.** Thirty-two universes as thumbnails, drawn through
|
|
43
|
+
* one 32×16 offscreen canvas and scaled up unsmoothed; clicking one opens it.
|
|
44
|
+
* - **It stops.** The original left `requestAnimationFrame` running forever. Here
|
|
45
|
+
* the loop is off under `prefers-reduced-motion` and off when `live` is
|
|
46
|
+
* `false`; a new `data` reference still repaints, so a paused stream is never
|
|
47
|
+
* a stale grid.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* <ChannelMatrix label="Output" data={buffer} universes={32} />
|
|
51
|
+
*/
|
|
52
|
+
const ChannelMatrix = React.forwardRef(function ChannelMatrix({ className, data, universes = 1, universe: universeProp, defaultUniverse = 0, onUniverseChange, mode: modeProp, defaultMode = "detail", onModeChange, ramp: rampProp, defaultRamp = "mono", onRampChange, live = true, controls = true, label, formatUniverse = (value) => `Universe ${value}`, ...elementProps }, forwardedRef) {
|
|
53
|
+
const [uncontrolledUniverse, setUncontrolledUniverse] = React.useState(defaultUniverse);
|
|
54
|
+
const [uncontrolledMode, setUncontrolledMode] = React.useState(defaultMode);
|
|
55
|
+
const [uncontrolledRamp, setUncontrolledRamp] = React.useState(defaultRamp);
|
|
56
|
+
const universe = universeProp ?? uncontrolledUniverse;
|
|
57
|
+
const mode = modeProp ?? uncontrolledMode;
|
|
58
|
+
const ramp = rampProp ?? uncontrolledRamp;
|
|
59
|
+
const rootRef = React.useRef(null);
|
|
60
|
+
const ref = useComposedRefs(forwardedRef, rootRef);
|
|
61
|
+
const cellsRef = React.useRef([]);
|
|
62
|
+
const thumbnailsRef = React.useRef([]);
|
|
63
|
+
const offscreenRef = React.useRef(null);
|
|
64
|
+
const imageRef = React.useRef(null);
|
|
65
|
+
const previousRef = React.useRef((/* @__PURE__ */ new Int16Array(512)).fill(-1));
|
|
66
|
+
const paletteRef = React.useRef(dmxPalette("mono"));
|
|
67
|
+
const hoverIndexRef = React.useRef(null);
|
|
68
|
+
const valueElementRef = React.useRef(null);
|
|
69
|
+
const dataRef = React.useRef(data);
|
|
70
|
+
dataRef.current = data;
|
|
71
|
+
const modeRef = React.useRef(mode);
|
|
72
|
+
modeRef.current = mode;
|
|
73
|
+
const universeRef = React.useRef(universe);
|
|
74
|
+
universeRef.current = universe;
|
|
75
|
+
const universesRef = React.useRef(universes);
|
|
76
|
+
universesRef.current = universes;
|
|
77
|
+
const [hover, setHover] = React.useState(null);
|
|
78
|
+
const portal = useCuePortalProps();
|
|
79
|
+
const reduced = usePrefersReducedMotion();
|
|
80
|
+
const streaming = live && !reduced;
|
|
81
|
+
const paint = React.useCallback(() => {
|
|
82
|
+
const bytes = dataRef.current;
|
|
83
|
+
const palette = paletteRef.current;
|
|
84
|
+
if (modeRef.current === "detail") {
|
|
85
|
+
const base = universeRef.current * 512;
|
|
86
|
+
const previous = previousRef.current;
|
|
87
|
+
for (let slot = 0; slot < 512; slot += 1) {
|
|
88
|
+
const level = bytes?.[base + slot] ?? 0;
|
|
89
|
+
if (previous[slot] === level) continue;
|
|
90
|
+
previous[slot] = level;
|
|
91
|
+
const cell = cellsRef.current[slot];
|
|
92
|
+
if (!cell) continue;
|
|
93
|
+
if (level === 0) {
|
|
94
|
+
cell.style.backgroundColor = "";
|
|
95
|
+
cell.style.color = "";
|
|
96
|
+
cell.textContent = String(slot + 1);
|
|
97
|
+
} else {
|
|
98
|
+
cell.style.backgroundColor = dmxPaletteColor(palette, level);
|
|
99
|
+
cell.style.color = dmxPaletteInk(palette, level);
|
|
100
|
+
cell.textContent = String(level);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const hovered = hoverIndexRef.current;
|
|
104
|
+
if (hovered !== null && valueElementRef.current !== null) valueElementRef.current.textContent = String(bytes?.[base + hovered] ?? 0);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const offscreen = offscreenRef.current ??= createOffscreen();
|
|
108
|
+
const offscreenContext = offscreen?.getContext("2d");
|
|
109
|
+
if (!offscreen || !offscreenContext) return;
|
|
110
|
+
const image = imageRef.current ??= offscreenContext.createImageData(32, 16);
|
|
111
|
+
for (let index = 0; index < universesRef.current; index += 1) {
|
|
112
|
+
const thumbnail = thumbnailsRef.current[index];
|
|
113
|
+
const context = thumbnail?.getContext("2d");
|
|
114
|
+
if (!thumbnail || !context) continue;
|
|
115
|
+
const base = index * 512;
|
|
116
|
+
for (let slot = 0; slot < 512; slot += 1) {
|
|
117
|
+
const level = bytes?.[base + slot] ?? 0;
|
|
118
|
+
const offset = slot * 4;
|
|
119
|
+
image.data[offset] = palette[level * 3];
|
|
120
|
+
image.data[offset + 1] = palette[level * 3 + 1];
|
|
121
|
+
image.data[offset + 2] = palette[level * 3 + 2];
|
|
122
|
+
image.data[offset + 3] = OPAQUE;
|
|
123
|
+
}
|
|
124
|
+
offscreenContext.putImageData(image, 0, 0);
|
|
125
|
+
context.imageSmoothingEnabled = false;
|
|
126
|
+
context.drawImage(offscreen, 0, 0, 32, 16, 0, 0, thumbnail.width, thumbnail.height);
|
|
127
|
+
}
|
|
128
|
+
}, []);
|
|
129
|
+
useIsomorphicLayoutEffect(() => {
|
|
130
|
+
paletteRef.current = dmxPalette(ramp, rootRef.current);
|
|
131
|
+
previousRef.current.fill(-1);
|
|
132
|
+
paint();
|
|
133
|
+
}, [
|
|
134
|
+
paint,
|
|
135
|
+
data,
|
|
136
|
+
mode,
|
|
137
|
+
ramp,
|
|
138
|
+
universe,
|
|
139
|
+
universes
|
|
140
|
+
]);
|
|
141
|
+
React.useEffect(() => {
|
|
142
|
+
if (!streaming) return;
|
|
143
|
+
let frame = 0;
|
|
144
|
+
const loop = () => {
|
|
145
|
+
frame = requestAnimationFrame(loop);
|
|
146
|
+
paint();
|
|
147
|
+
};
|
|
148
|
+
frame = requestAnimationFrame(loop);
|
|
149
|
+
return () => cancelAnimationFrame(frame);
|
|
150
|
+
}, [streaming, paint]);
|
|
151
|
+
const selectUniverse = (next) => {
|
|
152
|
+
if (universeProp === void 0) setUncontrolledUniverse(next);
|
|
153
|
+
onUniverseChange?.(next);
|
|
154
|
+
};
|
|
155
|
+
const selectMode = (next) => {
|
|
156
|
+
if (modeProp === void 0) setUncontrolledMode(next);
|
|
157
|
+
onModeChange?.(next);
|
|
158
|
+
};
|
|
159
|
+
const selectRamp = (next) => {
|
|
160
|
+
if (rampProp === void 0) setUncontrolledRamp(next);
|
|
161
|
+
onRampChange?.(next);
|
|
162
|
+
};
|
|
163
|
+
const onCellOver = (event) => {
|
|
164
|
+
const cell = event.target.closest("[data-channel]");
|
|
165
|
+
if (cell === null) return;
|
|
166
|
+
const index = Number(cell.dataset["channel"]) - 1;
|
|
167
|
+
if (!Number.isInteger(index)) return;
|
|
168
|
+
const box = cell.getBoundingClientRect();
|
|
169
|
+
hoverIndexRef.current = index;
|
|
170
|
+
setHover({
|
|
171
|
+
index,
|
|
172
|
+
x: box.left + box.width / 2,
|
|
173
|
+
y: box.top
|
|
174
|
+
});
|
|
175
|
+
};
|
|
176
|
+
const onGridLeave = () => {
|
|
177
|
+
hoverIndexRef.current = null;
|
|
178
|
+
setHover(null);
|
|
179
|
+
};
|
|
180
|
+
const base = universe * 512;
|
|
181
|
+
const summary = `${label ?? "DMX output"}: ${activeChannels(data, base)} of 512 channels active`;
|
|
182
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
183
|
+
ref,
|
|
184
|
+
"data-slot": "channel-matrix",
|
|
185
|
+
"data-mode": mode,
|
|
186
|
+
"data-streaming": String(streaming),
|
|
187
|
+
className: cn("flex min-w-0 flex-col gap-(--cue-space-3)", className),
|
|
188
|
+
...elementProps,
|
|
189
|
+
children: [
|
|
190
|
+
controls ? /* @__PURE__ */ jsxs("div", {
|
|
191
|
+
"data-slot": "channel-matrix-controls",
|
|
192
|
+
className: "flex items-center gap-(--cue-space-4)",
|
|
193
|
+
children: [universes > 1 ? /* @__PURE__ */ jsx("div", {
|
|
194
|
+
className: "flex items-center gap-(--cue-space-1)",
|
|
195
|
+
children: ["detail", "overview"].map((value) => /* @__PURE__ */ jsx(ControlButton, {
|
|
196
|
+
pressed: mode === value,
|
|
197
|
+
onClick: () => selectMode(value),
|
|
198
|
+
children: value === "detail" ? "Detail" : "Overview"
|
|
199
|
+
}, value))
|
|
200
|
+
}) : null, /* @__PURE__ */ jsx("div", {
|
|
201
|
+
className: "flex items-center gap-(--cue-space-1)",
|
|
202
|
+
children: DMX_RAMP_NAMES.map((value) => /* @__PURE__ */ jsx(ControlButton, {
|
|
203
|
+
pressed: ramp === value,
|
|
204
|
+
onClick: () => selectRamp(value),
|
|
205
|
+
children: RAMP_LABELS[value]
|
|
206
|
+
}, value))
|
|
207
|
+
})]
|
|
208
|
+
}) : null,
|
|
209
|
+
mode === "detail" ? /* @__PURE__ */ jsx("div", {
|
|
210
|
+
role: "img",
|
|
211
|
+
"aria-label": summary,
|
|
212
|
+
"data-slot": "channel-matrix-grid",
|
|
213
|
+
className: "grid gap-px",
|
|
214
|
+
style: { gridTemplateColumns: `repeat(32, minmax(0, 1fr))` },
|
|
215
|
+
onMouseOver: onCellOver,
|
|
216
|
+
onMouseLeave: onGridLeave,
|
|
217
|
+
children: Array.from({ length: 512 }, (_unused, slot) => /* @__PURE__ */ jsx("div", {
|
|
218
|
+
ref: (node) => {
|
|
219
|
+
cellsRef.current[slot] = node;
|
|
220
|
+
},
|
|
221
|
+
"data-slot": "channel-matrix-cell",
|
|
222
|
+
"data-channel": slot + 1,
|
|
223
|
+
className: "flex aspect-square items-center justify-center rounded-[2px] border border-border bg-(--cue-data-ground) font-mono text-(length:--cue-text-micro) tabular-nums text-fg-subtle select-none",
|
|
224
|
+
children: slot + 1
|
|
225
|
+
}, slot))
|
|
226
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
227
|
+
"data-slot": "channel-matrix-overview",
|
|
228
|
+
className: "grid gap-(--cue-space-3)",
|
|
229
|
+
style: { gridTemplateColumns: "repeat(auto-fill, minmax(9rem, 1fr))" },
|
|
230
|
+
children: Array.from({ length: universes }, (_unused, index) => /* @__PURE__ */ jsxs("button", {
|
|
231
|
+
type: "button",
|
|
232
|
+
"data-slot": "channel-matrix-universe",
|
|
233
|
+
"data-universe": index,
|
|
234
|
+
"data-selected": index === universe ? "true" : void 0,
|
|
235
|
+
"aria-label": formatUniverse(index),
|
|
236
|
+
onClick: () => {
|
|
237
|
+
selectUniverse(index);
|
|
238
|
+
selectMode("detail");
|
|
239
|
+
},
|
|
240
|
+
className: "flex cursor-pointer flex-col gap-(--cue-space-2) rounded-(--radius-control) border border-border bg-surface-1 p-(--cue-space-2) text-left outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent data-[selected=true]:border-accent",
|
|
241
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
242
|
+
className: "font-mono text-(length:--cue-text-micro) tabular-nums text-fg-muted",
|
|
243
|
+
children: ["U", String(index).padStart(2, "0")]
|
|
244
|
+
}), /* @__PURE__ */ jsx("canvas", {
|
|
245
|
+
ref: (node) => {
|
|
246
|
+
thumbnailsRef.current[index] = node;
|
|
247
|
+
},
|
|
248
|
+
width: 160,
|
|
249
|
+
height: 80,
|
|
250
|
+
"aria-hidden": "true",
|
|
251
|
+
className: "block w-full rounded-[2px] bg-(--cue-data-ground) [image-rendering:pixelated]"
|
|
252
|
+
})]
|
|
253
|
+
}, index))
|
|
254
|
+
}),
|
|
255
|
+
hover === null || mode !== "detail" ? null : /* @__PURE__ */ jsx(DmxReadout, {
|
|
256
|
+
container: portal.container,
|
|
257
|
+
channel: hover.index + 1,
|
|
258
|
+
value: data?.[base + hover.index] ?? 0,
|
|
259
|
+
x: hover.x,
|
|
260
|
+
y: hover.y,
|
|
261
|
+
valueRef: valueElementRef
|
|
262
|
+
})
|
|
263
|
+
]
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
/** The 32×16 scratch canvas every thumbnail is drawn through. */
|
|
267
|
+
function createOffscreen() {
|
|
268
|
+
if (typeof document === "undefined") return null;
|
|
269
|
+
const canvas = document.createElement("canvas");
|
|
270
|
+
canvas.width = 32;
|
|
271
|
+
canvas.height = 16;
|
|
272
|
+
return canvas;
|
|
273
|
+
}
|
|
274
|
+
/** One toggle of the matrix's own control strip — a chromeless mono rung. */
|
|
275
|
+
function ControlButton({ pressed, onClick, children }) {
|
|
276
|
+
return /* @__PURE__ */ jsx("button", {
|
|
277
|
+
type: "button",
|
|
278
|
+
"aria-pressed": pressed,
|
|
279
|
+
onClick,
|
|
280
|
+
className: "flex h-control-sm cursor-pointer items-center rounded-(--radius-control) px-(--cue-space-3) font-mono text-(length:--cue-text-label) text-fg-muted outline-none transition-colors duration-150 hover:text-fg focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent aria-pressed:bg-accent-soft aria-pressed:text-accent motion-reduce:transition-none",
|
|
281
|
+
children
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
//#endregion
|
|
285
|
+
export { CHANNEL_MATRIX_COLUMNS, CHANNEL_MATRIX_ROWS, ChannelMatrix };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
//#region src/dmx/dmx-bar.d.ts
|
|
3
|
+
interface DmxBarProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
|
|
4
|
+
/**
|
|
5
|
+
* The current frame: one byte per channel, 512 long.
|
|
6
|
+
*
|
|
7
|
+
* Repainting is keyed on the array's *identity*, which is what a frame decoder
|
|
8
|
+
* naturally produces (a fresh buffer per packet). A buffer mutated in place
|
|
9
|
+
* will not repaint — hand a new view, or use `ChannelMatrix`, which owns an
|
|
10
|
+
* animation loop for exactly that case.
|
|
11
|
+
*/
|
|
12
|
+
data?: Uint8Array;
|
|
13
|
+
/** Bar height in px at the 16px root, emitted as `rem`. Defaults to `12`. */
|
|
14
|
+
height?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Whether frames are still arriving. Defaults to `true`. When `false` the bar
|
|
17
|
+
* dims and says so in its accessible name — a stalled stream and a blacked-out
|
|
18
|
+
* universe look identical otherwise.
|
|
19
|
+
*/
|
|
20
|
+
live?: boolean;
|
|
21
|
+
/** What this universe is. Defaults to `"DMX output"`. */
|
|
22
|
+
label?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The whole universe as one strip: 512 columns, black at 0, white at 255.
|
|
26
|
+
*
|
|
27
|
+
* Ported from dmxhub's bridge, where it sits under every node in the routing
|
|
28
|
+
* graph and updates at the wire rate. Three decisions are what make it cheap
|
|
29
|
+
* enough to leave running:
|
|
30
|
+
*
|
|
31
|
+
* 1. **It is a 512×1 texture, stretched.** One `putImageData` per frame paints
|
|
32
|
+
* every channel; the browser scales it. Drawing 512 rectangles would be 512
|
|
33
|
+
* state changes for the same picture.
|
|
34
|
+
* 2. **The pixels are never smoothed.** `image-rendering: pixelated` keeps one
|
|
35
|
+
* channel one hard column. Interpolation here would invent levels between
|
|
36
|
+
* channels, which is the one thing a monitoring bar must not do.
|
|
37
|
+
* 3. **The crosshair is anchored in percent, not pixels.** The bar routinely
|
|
38
|
+
* sits inside a zoom transform (a node graph, a canvas). A pixel offset gets
|
|
39
|
+
* scaled with the parent and drifts off the cursor; a percentage resolves in
|
|
40
|
+
* the bar's own width and lands correctly at any zoom.
|
|
41
|
+
*
|
|
42
|
+
* The ground is `--cue-data-ground`, true black in every theme: a level of 0 is
|
|
43
|
+
* *nothing*, and it should not read as the panel it happens to sit on.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* <DmxBar label="Universe 0" data={frame} live={connected} />
|
|
47
|
+
*/
|
|
48
|
+
declare const DmxBar: React.ForwardRefExoticComponent<DmxBarProps & React.RefAttributes<HTMLDivElement>>;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { DmxBar, DmxBarProps };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { useIsomorphicLayoutEffect } from "../system/use-isomorphic-layout-effect.js";
|
|
4
|
+
import { useCuePortalProps } from "../system/portal.js";
|
|
5
|
+
import { toRem } from "../instruments/_rem.js";
|
|
6
|
+
import { activeChannels } from "./_ramp.js";
|
|
7
|
+
import { DmxReadout } from "./_readout.js";
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
//#region src/dmx/dmx-bar.tsx
|
|
11
|
+
/** Default bar height in px at the 16px root: readable, still an inline strip. */
|
|
12
|
+
const DEFAULT_HEIGHT_PX = 12;
|
|
13
|
+
/** Opaque alpha for every pixel of the texture. */
|
|
14
|
+
const OPAQUE = 255;
|
|
15
|
+
/**
|
|
16
|
+
* The whole universe as one strip: 512 columns, black at 0, white at 255.
|
|
17
|
+
*
|
|
18
|
+
* Ported from dmxhub's bridge, where it sits under every node in the routing
|
|
19
|
+
* graph and updates at the wire rate. Three decisions are what make it cheap
|
|
20
|
+
* enough to leave running:
|
|
21
|
+
*
|
|
22
|
+
* 1. **It is a 512×1 texture, stretched.** One `putImageData` per frame paints
|
|
23
|
+
* every channel; the browser scales it. Drawing 512 rectangles would be 512
|
|
24
|
+
* state changes for the same picture.
|
|
25
|
+
* 2. **The pixels are never smoothed.** `image-rendering: pixelated` keeps one
|
|
26
|
+
* channel one hard column. Interpolation here would invent levels between
|
|
27
|
+
* channels, which is the one thing a monitoring bar must not do.
|
|
28
|
+
* 3. **The crosshair is anchored in percent, not pixels.** The bar routinely
|
|
29
|
+
* sits inside a zoom transform (a node graph, a canvas). A pixel offset gets
|
|
30
|
+
* scaled with the parent and drifts off the cursor; a percentage resolves in
|
|
31
|
+
* the bar's own width and lands correctly at any zoom.
|
|
32
|
+
*
|
|
33
|
+
* The ground is `--cue-data-ground`, true black in every theme: a level of 0 is
|
|
34
|
+
* *nothing*, and it should not read as the panel it happens to sit on.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* <DmxBar label="Universe 0" data={frame} live={connected} />
|
|
38
|
+
*/
|
|
39
|
+
const DmxBar = React.forwardRef(function DmxBar({ className, data, height = DEFAULT_HEIGHT_PX, live = true, label, ...elementProps }, ref) {
|
|
40
|
+
const canvasRef = React.useRef(null);
|
|
41
|
+
const [hover, setHover] = React.useState(null);
|
|
42
|
+
const portal = useCuePortalProps();
|
|
43
|
+
useIsomorphicLayoutEffect(() => {
|
|
44
|
+
const context = canvasRef.current?.getContext("2d");
|
|
45
|
+
if (!context) return;
|
|
46
|
+
const image = context.createImageData(512, 1);
|
|
47
|
+
for (let slot = 0; slot < 512; slot += 1) {
|
|
48
|
+
const level = data?.[slot] ?? 0;
|
|
49
|
+
const offset = slot * 4;
|
|
50
|
+
image.data[offset] = level;
|
|
51
|
+
image.data[offset + 1] = level;
|
|
52
|
+
image.data[offset + 2] = level;
|
|
53
|
+
image.data[offset + 3] = OPAQUE;
|
|
54
|
+
}
|
|
55
|
+
context.putImageData(image, 0, 0);
|
|
56
|
+
}, [data]);
|
|
57
|
+
const onMouseMove = (event) => {
|
|
58
|
+
const box = event.currentTarget.getBoundingClientRect();
|
|
59
|
+
if (box.width === 0) return;
|
|
60
|
+
const fraction = Math.min(.999, Math.max(0, (event.clientX - box.left) / box.width));
|
|
61
|
+
setHover({
|
|
62
|
+
index: Math.floor(fraction * 512),
|
|
63
|
+
percent: fraction * 100,
|
|
64
|
+
x: event.clientX,
|
|
65
|
+
y: box.top
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
const active = activeChannels(data);
|
|
69
|
+
const summary = `${label ?? "DMX output"}: ${active} of 512 channels active${live ? "" : ", stream idle"}`;
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
71
|
+
ref,
|
|
72
|
+
"data-slot": "dmx-bar",
|
|
73
|
+
"data-live": String(live),
|
|
74
|
+
className: cn("relative min-w-0", className),
|
|
75
|
+
onMouseMove,
|
|
76
|
+
onMouseLeave: () => setHover(null),
|
|
77
|
+
...elementProps,
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsx("canvas", {
|
|
80
|
+
ref: canvasRef,
|
|
81
|
+
width: 512,
|
|
82
|
+
height: 1,
|
|
83
|
+
role: "img",
|
|
84
|
+
"aria-label": summary,
|
|
85
|
+
"data-slot": "dmx-bar-canvas",
|
|
86
|
+
"data-live": String(live),
|
|
87
|
+
className: "block w-full cursor-crosshair rounded-(--radius-control) border border-border bg-(--cue-data-ground) [image-rendering:pixelated] data-[live=false]:opacity-45",
|
|
88
|
+
style: { height: toRem(height) }
|
|
89
|
+
}),
|
|
90
|
+
hover === null ? null : /* @__PURE__ */ jsx("span", {
|
|
91
|
+
"aria-hidden": "true",
|
|
92
|
+
"data-slot": "dmx-bar-crosshair",
|
|
93
|
+
className: "pointer-events-none absolute -inset-y-px w-px bg-accent",
|
|
94
|
+
style: { left: `${hover.percent}%` }
|
|
95
|
+
}),
|
|
96
|
+
hover === null ? null : /* @__PURE__ */ jsx(DmxReadout, {
|
|
97
|
+
container: portal.container,
|
|
98
|
+
channel: hover.index + 1,
|
|
99
|
+
value: data?.[hover.index] ?? 0,
|
|
100
|
+
x: hover.x,
|
|
101
|
+
y: hover.y
|
|
102
|
+
})
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//#endregion
|
|
107
|
+
export { DmxBar };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
//#region src/dmx/dmx-strip.d.ts
|
|
3
|
+
interface DmxStripProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
|
|
4
|
+
/** Columns, one per simulated channel. Defaults to `128`. */
|
|
5
|
+
cells?: number;
|
|
6
|
+
/** Strip height in px at the 16px root, emitted as `rem`. Defaults to `14`. */
|
|
7
|
+
height?: number;
|
|
8
|
+
/** Seed for the whole simulation. The same seed always plays the same way. Defaults to `1`. */
|
|
9
|
+
seed?: number;
|
|
10
|
+
/** Run the simulation. Defaults to `true`; `false` holds the seeded first frame. */
|
|
11
|
+
simulate?: boolean;
|
|
12
|
+
/** What the strip depicts. Defaults to `"Simulated DMX activity"`. */
|
|
13
|
+
label?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `DmxBar`'s picture with no console behind it — a lighting rig, simulated.
|
|
17
|
+
*
|
|
18
|
+
* This is the marketing device from dmxhub's site: the same 1px-tall pixelated
|
|
19
|
+
* canvas the bridge uses for real output, driven by a model of a plausible rig
|
|
20
|
+
* instead of a wire. Channels are grouped into six-channel fixtures; most sit
|
|
21
|
+
* where they were left, some are dark, and every so often one re-cues and
|
|
22
|
+
* crossfades to its new level. That grouping is what makes it read as *lighting*
|
|
23
|
+
* rather than as noise — a random 512 bytes looks like static, and a rig does
|
|
24
|
+
* not.
|
|
25
|
+
*
|
|
26
|
+
* Everything about it is seeded, including the re-cues the original left to
|
|
27
|
+
* `Math.random()`. A screenshot, a visual-regression run and a test all see the
|
|
28
|
+
* same rig from the same `seed`.
|
|
29
|
+
*
|
|
30
|
+
* Under `prefers-reduced-motion` the strip paints its first frame and stops.
|
|
31
|
+
* There is no information in the animation — the point of the component is the
|
|
32
|
+
* texture — so stilling it costs the reader nothing.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* <DmxStrip seed={7} />
|
|
36
|
+
* @example
|
|
37
|
+
* <DmxStrip cells={256} simulate={false} label="Rig activity" />
|
|
38
|
+
*/
|
|
39
|
+
declare const DmxStrip: React.ForwardRefExoticComponent<DmxStripProps & React.RefAttributes<HTMLDivElement>>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { DmxStrip, DmxStripProps };
|