@ctrl-ui/react 0.8.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/README.md +70 -0
- package/dist/action-bar.d.ts +44 -0
- package/dist/action-bar.js +89 -0
- package/dist/activity.d.ts +53 -0
- package/dist/activity.js +188 -0
- package/dist/audio-recorder.d.ts +32 -0
- package/dist/audio-recorder.js +235 -0
- package/dist/audio-visualizer.d.ts +12 -0
- package/dist/audio-visualizer.js +58 -0
- package/dist/blocks/chat.d.ts +10 -0
- package/dist/blocks/chat.js +12 -0
- package/dist/blocks/coding-agent.d.ts +61 -0
- package/dist/blocks/coding-agent.js +255 -0
- package/dist/blocks/file-explorer-data.d.ts +57 -0
- package/dist/blocks/file-explorer-data.js +74 -0
- package/dist/blocks/file-explorer.d.ts +24 -0
- package/dist/blocks/file-explorer.js +427 -0
- package/dist/blocks/settings-data.d.ts +36 -0
- package/dist/blocks/settings-data.js +66 -0
- package/dist/blocks/settings.d.ts +19 -0
- package/dist/blocks/settings.js +282 -0
- package/dist/blocks/theme-toggle.d.ts +43 -0
- package/dist/blocks/theme-toggle.js +180 -0
- package/dist/chat-composer-attachment.d.ts +55 -0
- package/dist/chat-composer-attachment.js +267 -0
- package/dist/chat-composer-editor/extensions/mention.d.ts +14 -0
- package/dist/chat-composer-editor/extensions/mention.js +278 -0
- package/dist/chat-composer-editor/ghost.d.ts +5 -0
- package/dist/chat-composer-editor/ghost.js +55 -0
- package/dist/chat-composer-editor/schema.d.ts +6 -0
- package/dist/chat-composer-editor/schema.js +25 -0
- package/dist/chat-composer-editor/serialize.d.ts +6 -0
- package/dist/chat-composer-editor/serialize.js +16 -0
- package/dist/chat-composer-editor/types.d.ts +29 -0
- package/dist/chat-composer-editor/types.js +0 -0
- package/dist/chat-composer-editor.d.ts +9 -0
- package/dist/chat-composer-editor.js +154 -0
- package/dist/chat-composer.d.ts +60 -0
- package/dist/chat-composer.js +134 -0
- package/dist/chat-layout.d.ts +27 -0
- package/dist/chat-layout.js +114 -0
- package/dist/chat-message.d.ts +31 -0
- package/dist/chat-message.js +95 -0
- package/dist/code-block-editor.d.ts +59 -0
- package/dist/code-block-editor.js +250 -0
- package/dist/context-model.d.ts +33 -0
- package/dist/context-model.js +52 -0
- package/dist/context.d.ts +47 -0
- package/dist/context.js +335 -0
- package/dist/control-props.d.ts +28 -0
- package/dist/control-props.js +4 -0
- package/dist/control-variants.d.ts +8 -0
- package/dist/control-variants.js +14 -0
- package/dist/dynamic-notification-glass.d.ts +10 -0
- package/dist/dynamic-notification-glass.js +311 -0
- package/dist/dynamic-notification-liquid.d.ts +24 -0
- package/dist/dynamic-notification-liquid.js +682 -0
- package/dist/dynamic-notification-siri-wave.d.ts +4 -0
- package/dist/dynamic-notification-siri-wave.js +82 -0
- package/dist/dynamic-notification.d.ts +74 -0
- package/dist/dynamic-notification.js +342 -0
- package/dist/environment-variables.d.ts +124 -0
- package/dist/environment-variables.js +492 -0
- package/dist/extensions/create-track-highlight.d.ts +12 -0
- package/dist/extensions/create-track-highlight.js +147 -0
- package/dist/extensions/track-highlight.d.ts +22 -0
- package/dist/extensions/track-highlight.js +52 -0
- package/dist/hooks/use-audio-recorder.d.ts +107 -0
- package/dist/hooks/use-audio-recorder.js +577 -0
- package/dist/hooks/use-chat-composer.d.ts +56 -0
- package/dist/hooks/use-chat-composer.js +63 -0
- package/dist/hooks/use-chat-message.d.ts +28 -0
- package/dist/hooks/use-chat-message.js +24 -0
- package/dist/hooks/use-color-area.d.ts +18 -0
- package/dist/hooks/use-color-area.js +60 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts +22 -0
- package/dist/hooks/use-copy-to-clipboard.js +90 -0
- package/dist/hooks/use-dropzone.d.ts +59 -0
- package/dist/hooks/use-dropzone.js +372 -0
- package/dist/hooks/use-dynamic-notification.d.ts +37 -0
- package/dist/hooks/use-dynamic-notification.js +87 -0
- package/dist/hooks/use-environment-variables.d.ts +51 -0
- package/dist/hooks/use-environment-variables.js +188 -0
- package/dist/hooks/use-mobile.d.ts +5 -0
- package/dist/hooks/use-mobile.js +29 -0
- package/dist/hooks/use-textarea-trigger-menu.d.ts +8 -0
- package/dist/hooks/use-textarea-trigger-menu.js +69 -0
- package/dist/hooks/use-trigger-menu.d.ts +49 -0
- package/dist/hooks/use-trigger-menu.js +102 -0
- package/dist/hooks/use-user-ask.d.ts +48 -0
- package/dist/hooks/use-user-ask.js +167 -0
- package/dist/inline-attachment.d.ts +37 -0
- package/dist/inline-attachment.js +192 -0
- package/dist/inline-citation.d.ts +56 -0
- package/dist/inline-citation.js +319 -0
- package/dist/knob-contracts/accordion-knobs.d.ts +5 -0
- package/dist/knob-contracts/accordion-knobs.js +9 -0
- package/dist/knob-contracts/action-bar-knobs.d.ts +5 -0
- package/dist/knob-contracts/action-bar-knobs.js +4 -0
- package/dist/knob-contracts/activity-knobs.d.ts +5 -0
- package/dist/knob-contracts/activity-knobs.js +9 -0
- package/dist/knob-contracts/alert-knobs.d.ts +5 -0
- package/dist/knob-contracts/alert-knobs.js +9 -0
- package/dist/knob-contracts/audio-recorder-knobs.d.ts +5 -0
- package/dist/knob-contracts/audio-recorder-knobs.js +9 -0
- package/dist/knob-contracts/audio-visualizer-knobs.d.ts +5 -0
- package/dist/knob-contracts/audio-visualizer-knobs.js +9 -0
- package/dist/knob-contracts/avatar-knobs.d.ts +5 -0
- package/dist/knob-contracts/avatar-knobs.js +9 -0
- package/dist/knob-contracts/badge-knobs.d.ts +5 -0
- package/dist/knob-contracts/badge-knobs.js +9 -0
- package/dist/knob-contracts/button-group-knobs.d.ts +5 -0
- package/dist/knob-contracts/button-group-knobs.js +9 -0
- package/dist/knob-contracts/button-knobs.d.ts +5 -0
- package/dist/knob-contracts/button-knobs.js +25 -0
- package/dist/knob-contracts/calendar-knobs.d.ts +5 -0
- package/dist/knob-contracts/calendar-knobs.js +10 -0
- package/dist/knob-contracts/card-knobs.d.ts +5 -0
- package/dist/knob-contracts/card-knobs.js +11 -0
- package/dist/knob-contracts/chat-composer-attachment-knobs.d.ts +5 -0
- package/dist/knob-contracts/chat-composer-attachment-knobs.js +11 -0
- package/dist/knob-contracts/chat-composer-knobs.d.ts +5 -0
- package/dist/knob-contracts/chat-composer-knobs.js +18 -0
- package/dist/knob-contracts/chat-layout-knobs.d.ts +5 -0
- package/dist/knob-contracts/chat-layout-knobs.js +11 -0
- package/dist/knob-contracts/chat-message-knobs.d.ts +5 -0
- package/dist/knob-contracts/chat-message-knobs.js +17 -0
- package/dist/knob-contracts/choice-knobs.d.ts +5 -0
- package/dist/knob-contracts/choice-knobs.js +9 -0
- package/dist/knob-contracts/code-block-editor-knobs.d.ts +5 -0
- package/dist/knob-contracts/code-block-editor-knobs.js +11 -0
- package/dist/knob-contracts/code-diff-knobs.d.ts +5 -0
- package/dist/knob-contracts/code-diff-knobs.js +18 -0
- package/dist/knob-contracts/code-knobs.d.ts +5 -0
- package/dist/knob-contracts/code-knobs.js +11 -0
- package/dist/knob-contracts/collapsible-knobs.d.ts +5 -0
- package/dist/knob-contracts/collapsible-knobs.js +4 -0
- package/dist/knob-contracts/color-picker-knobs.d.ts +5 -0
- package/dist/knob-contracts/color-picker-knobs.js +12 -0
- package/dist/knob-contracts/context-knobs.d.ts +5 -0
- package/dist/knob-contracts/context-knobs.js +13 -0
- package/dist/knob-contracts/dockable-panel-knobs.d.ts +5 -0
- package/dist/knob-contracts/dockable-panel-knobs.js +12 -0
- package/dist/knob-contracts/dropzone-knobs.d.ts +5 -0
- package/dist/knob-contracts/dropzone-knobs.js +11 -0
- package/dist/knob-contracts/dynamic-notification-knobs.d.ts +5 -0
- package/dist/knob-contracts/dynamic-notification-knobs.js +18 -0
- package/dist/knob-contracts/empty-knobs.d.ts +5 -0
- package/dist/knob-contracts/empty-knobs.js +12 -0
- package/dist/knob-contracts/environment-variables-knobs.d.ts +5 -0
- package/dist/knob-contracts/environment-variables-knobs.js +11 -0
- package/dist/knob-contracts/field-knobs.d.ts +5 -0
- package/dist/knob-contracts/field-knobs.js +16 -0
- package/dist/knob-contracts/gradient-editor-knobs.d.ts +5 -0
- package/dist/knob-contracts/gradient-editor-knobs.js +13 -0
- package/dist/knob-contracts/infinite-canvas-knobs.d.ts +5 -0
- package/dist/knob-contracts/infinite-canvas-knobs.js +13 -0
- package/dist/knob-contracts/inline-attachment-knobs.d.ts +5 -0
- package/dist/knob-contracts/inline-attachment-knobs.js +14 -0
- package/dist/knob-contracts/inline-citation-knobs.d.ts +5 -0
- package/dist/knob-contracts/inline-citation-knobs.js +14 -0
- package/dist/knob-contracts/item-knobs.d.ts +5 -0
- package/dist/knob-contracts/item-knobs.js +10 -0
- package/dist/knob-contracts/kbd-knobs.d.ts +5 -0
- package/dist/knob-contracts/kbd-knobs.js +10 -0
- package/dist/knob-contracts/markdown-block-knobs.d.ts +5 -0
- package/dist/knob-contracts/markdown-block-knobs.js +11 -0
- package/dist/knob-contracts/markdown-knobs.d.ts +5 -0
- package/dist/knob-contracts/markdown-knobs.js +14 -0
- package/dist/knob-contracts/morphing-panel-knobs.d.ts +5 -0
- package/dist/knob-contracts/morphing-panel-knobs.js +11 -0
- package/dist/knob-contracts/pagination-knobs.d.ts +5 -0
- package/dist/knob-contracts/pagination-knobs.js +10 -0
- package/dist/knob-contracts/phone-input-knobs.d.ts +5 -0
- package/dist/knob-contracts/phone-input-knobs.js +10 -0
- package/dist/knob-contracts/popup-knobs.d.ts +5 -0
- package/dist/knob-contracts/popup-knobs.js +21 -0
- package/dist/knob-contracts/range-knobs.d.ts +5 -0
- package/dist/knob-contracts/range-knobs.js +13 -0
- package/dist/knob-contracts/resizable-knobs.d.ts +5 -0
- package/dist/knob-contracts/resizable-knobs.js +14 -0
- package/dist/knob-contracts/rich-tooltip-knobs.d.ts +5 -0
- package/dist/knob-contracts/rich-tooltip-knobs.js +13 -0
- package/dist/knob-contracts/scroll-area-knobs.d.ts +5 -0
- package/dist/knob-contracts/scroll-area-knobs.js +8 -0
- package/dist/knob-contracts/separator-knobs.d.ts +5 -0
- package/dist/knob-contracts/separator-knobs.js +4 -0
- package/dist/knob-contracts/sidebar-knobs.d.ts +5 -0
- package/dist/knob-contracts/sidebar-knobs.js +26 -0
- package/dist/knob-contracts/skeleton-knobs.d.ts +5 -0
- package/dist/knob-contracts/skeleton-knobs.js +4 -0
- package/dist/knob-contracts/source-badge-knobs.d.ts +5 -0
- package/dist/knob-contracts/source-badge-knobs.js +11 -0
- package/dist/knob-contracts/spinner-knobs.d.ts +5 -0
- package/dist/knob-contracts/spinner-knobs.js +4 -0
- package/dist/knob-contracts/stepper-knobs.d.ts +5 -0
- package/dist/knob-contracts/stepper-knobs.js +11 -0
- package/dist/knob-contracts/switch-knobs.d.ts +5 -0
- package/dist/knob-contracts/switch-knobs.js +12 -0
- package/dist/knob-contracts/table-knobs.d.ts +5 -0
- package/dist/knob-contracts/table-knobs.js +12 -0
- package/dist/knob-contracts/table-of-contents-knobs.d.ts +5 -0
- package/dist/knob-contracts/table-of-contents-knobs.js +8 -0
- package/dist/knob-contracts/tabs-knobs.d.ts +5 -0
- package/dist/knob-contracts/tabs-knobs.js +16 -0
- package/dist/knob-contracts/task-list-knobs.d.ts +5 -0
- package/dist/knob-contracts/task-list-knobs.js +14 -0
- package/dist/knob-contracts/thread-rail-knobs.d.ts +5 -0
- package/dist/knob-contracts/thread-rail-knobs.js +14 -0
- package/dist/knob-contracts/timeline-knobs.d.ts +5 -0
- package/dist/knob-contracts/timeline-knobs.js +12 -0
- package/dist/knob-contracts/toolbar-knobs.d.ts +5 -0
- package/dist/knob-contracts/toolbar-knobs.js +20 -0
- package/dist/knob-contracts/track-highlight-knobs.d.ts +5 -0
- package/dist/knob-contracts/track-highlight-knobs.js +11 -0
- package/dist/knob-contracts/transcript-divider-knobs.d.ts +5 -0
- package/dist/knob-contracts/transcript-divider-knobs.js +10 -0
- package/dist/knob-contracts/tree-knobs.d.ts +5 -0
- package/dist/knob-contracts/tree-knobs.js +13 -0
- package/dist/knob-contracts/user-ask-knobs.d.ts +5 -0
- package/dist/knob-contracts/user-ask-knobs.js +17 -0
- package/dist/lib/cn.d.ts +5 -0
- package/dist/lib/cn.js +34 -0
- package/dist/lib/code-block-shiki.d.ts +9 -0
- package/dist/lib/code-block-shiki.js +6 -0
- package/dist/lib/code-tokens.d.ts +28 -0
- package/dist/lib/code-tokens.js +160 -0
- package/dist/lib/color.d.ts +72 -0
- package/dist/lib/color.js +490 -0
- package/dist/lib/contrast.d.ts +30 -0
- package/dist/lib/contrast.js +64 -0
- package/dist/lib/diff.d.ts +50 -0
- package/dist/lib/diff.js +315 -0
- package/dist/lib/dropzone-validation.d.ts +66 -0
- package/dist/lib/dropzone-validation.js +228 -0
- package/dist/lib/env-file.d.ts +28 -0
- package/dist/lib/env-file.js +218 -0
- package/dist/lib/format-audio-recorder-duration.d.ts +4 -0
- package/dist/lib/format-audio-recorder-duration.js +7 -0
- package/dist/lib/liquid-glass-optics.d.ts +4 -0
- package/dist/lib/liquid-glass-optics.js +96 -0
- package/dist/lib/phone-input-format.d.ts +6 -0
- package/dist/lib/phone-input-format.js +26 -0
- package/dist/lib/phone-number.d.ts +18 -0
- package/dist/lib/phone-number.js +28 -0
- package/dist/lib/trigger-detect.d.ts +15 -0
- package/dist/lib/trigger-detect.js +77 -0
- package/dist/markdown-block.d.ts +25 -0
- package/dist/markdown-block.js +77 -0
- package/dist/skin.config.d.ts +5 -0
- package/dist/skin.config.js +4 -0
- package/dist/skin.d.ts +69 -0
- package/dist/skin.js +62 -0
- package/dist/source-badge.d.ts +23 -0
- package/dist/source-badge.js +72 -0
- package/dist/styles/chat-composer-editor.css +44 -0
- package/dist/styles/code.css +57 -0
- package/dist/styles/effects.css +126 -0
- package/dist/styles/index.css +81 -0
- package/dist/styles/recipes/accordion.css +87 -0
- package/dist/styles/recipes/action-bar.css +19 -0
- package/dist/styles/recipes/activity.css +129 -0
- package/dist/styles/recipes/alert.css +75 -0
- package/dist/styles/recipes/audio-recorder.css +102 -0
- package/dist/styles/recipes/audio-visualizer.css +90 -0
- package/dist/styles/recipes/avatar.css +52 -0
- package/dist/styles/recipes/badge.css +110 -0
- package/dist/styles/recipes/button-group.css +64 -0
- package/dist/styles/recipes/button.css +305 -0
- package/dist/styles/recipes/calendar.css +152 -0
- package/dist/styles/recipes/card.css +93 -0
- package/dist/styles/recipes/chat-composer-attachment.css +177 -0
- package/dist/styles/recipes/chat-composer.css +195 -0
- package/dist/styles/recipes/chat-layout.css +108 -0
- package/dist/styles/recipes/chat-message.css +160 -0
- package/dist/styles/recipes/choice.css +108 -0
- package/dist/styles/recipes/code-block-editor.css +136 -0
- package/dist/styles/recipes/code-diff.css +256 -0
- package/dist/styles/recipes/code.css +136 -0
- package/dist/styles/recipes/collapsible.css +27 -0
- package/dist/styles/recipes/color-picker-details.css +61 -0
- package/dist/styles/recipes/color-picker-values.css +117 -0
- package/dist/styles/recipes/color-picker.css +158 -0
- package/dist/styles/recipes/context.css +237 -0
- package/dist/styles/recipes/dockable-panel.css +106 -0
- package/dist/styles/recipes/dropzone.css +149 -0
- package/dist/styles/recipes/dynamic-notification-input.css +29 -0
- package/dist/styles/recipes/dynamic-notification-motion.css +298 -0
- package/dist/styles/recipes/dynamic-notification.css +241 -0
- package/dist/styles/recipes/empty.css +96 -0
- package/dist/styles/recipes/environment-variables.css +173 -0
- package/dist/styles/recipes/field-parts.css +148 -0
- package/dist/styles/recipes/field.css +234 -0
- package/dist/styles/recipes/gradient-editor.css +109 -0
- package/dist/styles/recipes/infinite-canvas.css +78 -0
- package/dist/styles/recipes/inline-attachment.css +182 -0
- package/dist/styles/recipes/inline-citation.css +174 -0
- package/dist/styles/recipes/item.css +107 -0
- package/dist/styles/recipes/kbd.css +55 -0
- package/dist/styles/recipes/markdown-block.css +75 -0
- package/dist/styles/recipes/markdown.css +204 -0
- package/dist/styles/recipes/morphing-panel.css +123 -0
- package/dist/styles/recipes/pagination.css +86 -0
- package/dist/styles/recipes/phone-input.css +105 -0
- package/dist/styles/recipes/popup-controls.css +59 -0
- package/dist/styles/recipes/popup-drawer.css +162 -0
- package/dist/styles/recipes/popup-lists.css +198 -0
- package/dist/styles/recipes/popup-motion.css +94 -0
- package/dist/styles/recipes/popup-toast.css +126 -0
- package/dist/styles/recipes/popup.css +396 -0
- package/dist/styles/recipes/range.css +259 -0
- package/dist/styles/recipes/resizable.css +170 -0
- package/dist/styles/recipes/rich-tooltip.css +272 -0
- package/dist/styles/recipes/scroll-area.css +59 -0
- package/dist/styles/recipes/separator.css +12 -0
- package/dist/styles/recipes/sidebar.css +345 -0
- package/dist/styles/recipes/skeleton.css +23 -0
- package/dist/styles/recipes/source-badge.css +77 -0
- package/dist/styles/recipes/spinner.css +33 -0
- package/dist/styles/recipes/stepper.css +178 -0
- package/dist/styles/recipes/switch.css +149 -0
- package/dist/styles/recipes/table-of-contents.css +107 -0
- package/dist/styles/recipes/table.css +124 -0
- package/dist/styles/recipes/tabs.css +235 -0
- package/dist/styles/recipes/task-list.css +146 -0
- package/dist/styles/recipes/thread-rail.css +247 -0
- package/dist/styles/recipes/timeline.css +107 -0
- package/dist/styles/recipes/toolbar.css +260 -0
- package/dist/styles/recipes/track-highlight.css +73 -0
- package/dist/styles/recipes/transcript-divider.css +64 -0
- package/dist/styles/recipes/tree.css +137 -0
- package/dist/styles/recipes/user-ask-details.css +45 -0
- package/dist/styles/recipes/user-ask.css +204 -0
- package/dist/styles/skin-theme.css +137 -0
- package/dist/styles/skin.css +143 -0
- package/dist/styles/theme.css +628 -0
- package/dist/styles/type-scale.css +45 -0
- package/dist/surface-variants.d.ts +6 -0
- package/dist/surface-variants.js +16 -0
- package/dist/task-list.d.ts +34 -0
- package/dist/task-list.js +177 -0
- package/dist/thread-rail.d.ts +52 -0
- package/dist/thread-rail.js +190 -0
- package/dist/transcript-divider.d.ts +15 -0
- package/dist/transcript-divider.js +25 -0
- package/dist/ui/accordion.d.ts +31 -0
- package/dist/ui/accordion.js +60 -0
- package/dist/ui/alert-dialog.d.ts +36 -0
- package/dist/ui/alert-dialog.js +100 -0
- package/dist/ui/alert.d.ts +21 -0
- package/dist/ui/alert.js +36 -0
- package/dist/ui/aspect-ratio.d.ts +8 -0
- package/dist/ui/aspect-ratio.js +17 -0
- package/dist/ui/autocomplete.d.ts +70 -0
- package/dist/ui/autocomplete.js +150 -0
- package/dist/ui/avatar.d.ts +24 -0
- package/dist/ui/avatar.js +44 -0
- package/dist/ui/badge.d.ts +20 -0
- package/dist/ui/badge.js +36 -0
- package/dist/ui/button-group.d.ts +24 -0
- package/dist/ui/button-group.js +45 -0
- package/dist/ui/button.d.ts +36 -0
- package/dist/ui/button.js +104 -0
- package/dist/ui/calendar.d.ts +11 -0
- package/dist/ui/calendar.js +160 -0
- package/dist/ui/card.d.ts +36 -0
- package/dist/ui/card.js +70 -0
- package/dist/ui/checkbox-group.d.ts +11 -0
- package/dist/ui/checkbox-group.js +16 -0
- package/dist/ui/checkbox.d.ts +23 -0
- package/dist/ui/checkbox.js +58 -0
- package/dist/ui/code-diff.d.ts +28 -0
- package/dist/ui/code-diff.js +561 -0
- package/dist/ui/code.d.ts +62 -0
- package/dist/ui/code.js +292 -0
- package/dist/ui/collapsible.d.ts +31 -0
- package/dist/ui/collapsible.js +72 -0
- package/dist/ui/color-picker.d.ts +137 -0
- package/dist/ui/color-picker.js +797 -0
- package/dist/ui/combobox-disabled-selection.d.ts +5 -0
- package/dist/ui/combobox-disabled-selection.js +11 -0
- package/dist/ui/combobox.d.ts +70 -0
- package/dist/ui/combobox.js +194 -0
- package/dist/ui/command.d.ts +44 -0
- package/dist/ui/command.js +166 -0
- package/dist/ui/context-menu.d.ts +86 -0
- package/dist/ui/context-menu.js +202 -0
- package/dist/ui/dialog.d.ts +38 -0
- package/dist/ui/dialog.js +124 -0
- package/dist/ui/dockable-panel-geometry.d.ts +18 -0
- package/dist/ui/dockable-panel-geometry.js +17 -0
- package/dist/ui/dockable-panel.d.ts +58 -0
- package/dist/ui/dockable-panel.js +366 -0
- package/dist/ui/drawer.d.ts +42 -0
- package/dist/ui/drawer.js +182 -0
- package/dist/ui/dropdown-menu.d.ts +46 -0
- package/dist/ui/dropdown-menu.js +89 -0
- package/dist/ui/dropzone.d.ts +66 -0
- package/dist/ui/dropzone.js +311 -0
- package/dist/ui/empty.d.ts +28 -0
- package/dist/ui/empty.js +59 -0
- package/dist/ui/field.d.ts +64 -0
- package/dist/ui/field.js +166 -0
- package/dist/ui/form.d.ts +10 -0
- package/dist/ui/form.js +17 -0
- package/dist/ui/gradient-editor.d.ts +47 -0
- package/dist/ui/gradient-editor.js +301 -0
- package/dist/ui/hover-card.d.ts +25 -0
- package/dist/ui/hover-card.js +46 -0
- package/dist/ui/infinite-canvas.d.ts +40 -0
- package/dist/ui/infinite-canvas.js +278 -0
- package/dist/ui/input-group.d.ts +21 -0
- package/dist/ui/input-group.js +44 -0
- package/dist/ui/input-otp.d.ts +38 -0
- package/dist/ui/input-otp.js +45 -0
- package/dist/ui/input.d.ts +12 -0
- package/dist/ui/input.js +18 -0
- package/dist/ui/item.d.ts +46 -0
- package/dist/ui/item.js +110 -0
- package/dist/ui/kbd.d.ts +12 -0
- package/dist/ui/kbd.js +23 -0
- package/dist/ui/markdown-elements.d.ts +52 -0
- package/dist/ui/markdown-elements.js +211 -0
- package/dist/ui/markdown.d.ts +14 -0
- package/dist/ui/markdown.js +31 -0
- package/dist/ui/menubar.d.ts +74 -0
- package/dist/ui/menubar.js +162 -0
- package/dist/ui/meter.d.ts +34 -0
- package/dist/ui/meter.js +57 -0
- package/dist/ui/morphing-panel.d.ts +24 -0
- package/dist/ui/morphing-panel.js +87 -0
- package/dist/ui/native-select.d.ts +12 -0
- package/dist/ui/native-select.js +41 -0
- package/dist/ui/navigation-menu.d.ts +51 -0
- package/dist/ui/navigation-menu.js +135 -0
- package/dist/ui/number-field.d.ts +72 -0
- package/dist/ui/number-field.js +124 -0
- package/dist/ui/pagination.d.ts +26 -0
- package/dist/ui/pagination.js +77 -0
- package/dist/ui/phone-input.d.ts +30 -0
- package/dist/ui/phone-input.js +263 -0
- package/dist/ui/popover.d.ts +34 -0
- package/dist/ui/popover.js +87 -0
- package/dist/ui/progress.d.ts +34 -0
- package/dist/ui/progress.js +57 -0
- package/dist/ui/radio-group.d.ts +29 -0
- package/dist/ui/radio-group.js +37 -0
- package/dist/ui/resizable.d.ts +56 -0
- package/dist/ui/resizable.js +82 -0
- package/dist/ui/responsive-dialog.d.ts +18 -0
- package/dist/ui/responsive-dialog.js +121 -0
- package/dist/ui/rich-tooltip-tour.d.ts +12 -0
- package/dist/ui/rich-tooltip-tour.js +20 -0
- package/dist/ui/rich-tooltip.d.ts +83 -0
- package/dist/ui/rich-tooltip.js +331 -0
- package/dist/ui/scroll-area.d.ts +25 -0
- package/dist/ui/scroll-area.js +93 -0
- package/dist/ui/select.d.ts +44 -0
- package/dist/ui/select.js +124 -0
- package/dist/ui/separator.d.ts +9 -0
- package/dist/ui/separator.js +16 -0
- package/dist/ui/sheet.d.ts +25 -0
- package/dist/ui/sheet.js +76 -0
- package/dist/ui/sidebar.d.ts +88 -0
- package/dist/ui/sidebar.js +362 -0
- package/dist/ui/skeleton.d.ts +8 -0
- package/dist/ui/skeleton.js +13 -0
- package/dist/ui/slider.d.ts +24 -0
- package/dist/ui/slider.js +114 -0
- package/dist/ui/spinner.d.ts +12 -0
- package/dist/ui/spinner.js +26 -0
- package/dist/ui/stepper.d.ts +58 -0
- package/dist/ui/stepper.js +232 -0
- package/dist/ui/switch.d.ts +26 -0
- package/dist/ui/switch.js +71 -0
- package/dist/ui/table-of-contents.d.ts +22 -0
- package/dist/ui/table-of-contents.js +181 -0
- package/dist/ui/table.d.ts +37 -0
- package/dist/ui/table.js +83 -0
- package/dist/ui/tabs.d.ts +36 -0
- package/dist/ui/tabs.js +127 -0
- package/dist/ui/textarea.d.ts +9 -0
- package/dist/ui/textarea.js +16 -0
- package/dist/ui/timeline.d.ts +40 -0
- package/dist/ui/timeline.js +80 -0
- package/dist/ui/toast.d.ts +28 -0
- package/dist/ui/toast.js +132 -0
- package/dist/ui/toggle.d.ts +20 -0
- package/dist/ui/toggle.js +71 -0
- package/dist/ui/toolbar.d.ts +40 -0
- package/dist/ui/toolbar.js +72 -0
- package/dist/ui/tooltip.d.ts +27 -0
- package/dist/ui/tooltip.js +93 -0
- package/dist/ui/tree.d.ts +56 -0
- package/dist/ui/tree.js +438 -0
- package/dist/ui/trigger-menu.d.ts +46 -0
- package/dist/ui/trigger-menu.js +116 -0
- package/dist/user-ask.d.ts +50 -0
- package/dist/user-ask.js +398 -0
- package/package.json +115 -0
package/dist/skin.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { SelectionIndicator } from "./control-props.js";
|
|
2
|
+
import { ControlTone, ControlVariant } from "./control-variants.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
//#region src/skin.d.ts
|
|
5
|
+
type StatelessPart = Record<never, never>;
|
|
6
|
+
type SkinAdornmentContexts = {
|
|
7
|
+
button: {
|
|
8
|
+
layer: {
|
|
9
|
+
variant: ControlVariant;
|
|
10
|
+
tone: ControlTone;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
"chat-layout": {
|
|
14
|
+
titlebar: StatelessPart;
|
|
15
|
+
};
|
|
16
|
+
"chat-thought": {
|
|
17
|
+
details: StatelessPart;
|
|
18
|
+
};
|
|
19
|
+
dialog: {
|
|
20
|
+
titlebar: StatelessPart;
|
|
21
|
+
};
|
|
22
|
+
"chat-composer": {
|
|
23
|
+
"send-layer": {
|
|
24
|
+
sendCount: number;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
type SkinAdornmentScope = keyof SkinAdornmentContexts;
|
|
29
|
+
type SkinAdornmentPart<Scope extends SkinAdornmentScope> = keyof SkinAdornmentContexts[Scope];
|
|
30
|
+
type AdornmentEntry<Ctx> = ReactNode | ((ctx: Ctx) => ReactNode);
|
|
31
|
+
type ControlUiSkin = {
|
|
32
|
+
/** Scopes theme.css/skin.css via data-skin; components stamp it on portal containers. */
|
|
33
|
+
id: string;
|
|
34
|
+
/** Stamps data-motion="reduced", collapsing --duration-* to 0ms. Never `animation:none` — ripple cleanup still needs `animationend` to fire. */
|
|
35
|
+
motion?: "reduced";
|
|
36
|
+
/** Locks skin to one scheme; page's .dark class must then follow it, since Shiki, native color-scheme, and dark: utilities key off .dark, not skin tokens. Undefined = adaptive, both blocks authored. */
|
|
37
|
+
colorScheme?: "light" | "dark";
|
|
38
|
+
/** Geometry, not slot restyle — padding, gap, rounding, and shadow across sidebar gap/container/inner. explicit `variant` prop wins; undefined keeps "sidebar". */
|
|
39
|
+
sidebarLayout?: SidebarLayout;
|
|
40
|
+
/** App-wide choice: sidebars and trees all glide or none do. Explicit `indicator` still wins; undefined also skips highlight engine's lazy chunk. */
|
|
41
|
+
indicators?: {
|
|
42
|
+
sidebar?: SelectionIndicator;
|
|
43
|
+
tree?: SelectionIndicator;
|
|
44
|
+
};
|
|
45
|
+
/** Any CSS length. Seeds --sidebar-width; caller's own value still wins. Undefined keeps shadcn's 16rem. */
|
|
46
|
+
sidebarWidth?: string;
|
|
47
|
+
/** effects.css keys off data-effects ancestor attribute. top-shine is CSS-only; ripple needs runtime's document pointer listener. */
|
|
48
|
+
effects?: ControlEffect[];
|
|
49
|
+
adornments?: { [Scope in SkinAdornmentScope]?: { [Part in SkinAdornmentPart<Scope>]?: AdornmentEntry<SkinAdornmentContexts[Scope][Part]>; }; };
|
|
50
|
+
};
|
|
51
|
+
type SidebarLayout = "sidebar" | "floating" | "inset";
|
|
52
|
+
type ControlEffect = "top-shine" | "ripple" | "hover-circle";
|
|
53
|
+
type ControlEffectValue = ControlEffect | ControlEffect[];
|
|
54
|
+
declare function controlEffectsAttribute(effects?: ControlEffectValue): string | undefined;
|
|
55
|
+
/** Read at render time so getter-based configs stay live. Portals stamp it on their positioner, which lands outside any token-scoped ancestor. */
|
|
56
|
+
declare function activeSkin(): ControlUiSkin;
|
|
57
|
+
declare function skinId(): string;
|
|
58
|
+
/** Sidebar falls back: variant prop → this → "sidebar". */
|
|
59
|
+
declare function skinSidebarLayout(): SidebarLayout | undefined;
|
|
60
|
+
/** Component falls back: indicator prop → this → "none". */
|
|
61
|
+
declare function skinIndicator(component: "sidebar" | "tree"): SelectionIndicator | undefined;
|
|
62
|
+
/** SidebarProvider seeds --sidebar-width from this; caller-provided value still wins. */
|
|
63
|
+
declare function skinSidebarWidth(): string | undefined;
|
|
64
|
+
/** Portals stamp result next to data-skin; ControlEffectsRuntime mirrors it on <html>. */
|
|
65
|
+
declare function skinEffects(): string | undefined;
|
|
66
|
+
declare function skinAdornment<Scope extends SkinAdornmentScope, Part extends SkinAdornmentPart<Scope>>(scope: Scope, part: Part, ctx: SkinAdornmentContexts[Scope][Part]): ReactNode | undefined;
|
|
67
|
+
declare function hasSkinAdornment<Scope extends SkinAdornmentScope, Part extends SkinAdornmentPart<Scope>>(scope: Scope, part: Part): boolean;
|
|
68
|
+
//#endregion
|
|
69
|
+
export { ControlEffect, ControlEffectValue, ControlUiSkin, SidebarLayout, SkinAdornmentContexts, SkinAdornmentPart, SkinAdornmentScope, activeSkin, controlEffectsAttribute, hasSkinAdornment, skinAdornment, skinEffects, skinId, skinIndicator, skinSidebarLayout, skinSidebarWidth };
|
package/dist/skin.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { skin } from "./skin.config.js";
|
|
2
|
+
//#region src/skin.ts
|
|
3
|
+
function controlEffectsAttribute(effects) {
|
|
4
|
+
if (!effects) return void 0;
|
|
5
|
+
const value = (Array.isArray(effects) ? effects : [effects]).join(" ");
|
|
6
|
+
return value.length > 0 ? value : void 0;
|
|
7
|
+
}
|
|
8
|
+
/** Read at render time so getter-based configs stay live. Portals stamp it on their positioner, which lands outside any token-scoped ancestor. */
|
|
9
|
+
function activeSkin() {
|
|
10
|
+
return skin;
|
|
11
|
+
}
|
|
12
|
+
const verifiedSkinIds = /* @__PURE__ */ new Set();
|
|
13
|
+
function skinScopeProblem(id) {
|
|
14
|
+
const boundary = document.querySelector(`[data-skin="${id}"]`);
|
|
15
|
+
if (!boundary) return `Control UI: skin.config id is "${id}" but no element carries data-skin="${id}" (root has ${JSON.stringify(document.documentElement.dataset.skin ?? null)}); every token is undeclared until they match.`;
|
|
16
|
+
if (getComputedStyle(boundary).getPropertyValue("--background").trim()) return void 0;
|
|
17
|
+
return `Control UI: skin-theme.css declares no tokens for data-skin="${id}"; check the CSS entry imports (../components/control-ui/styles/skin-theme.css) or run scripts/control-ui-doctor.mjs.`;
|
|
18
|
+
}
|
|
19
|
+
function verifySkinScope(id) {
|
|
20
|
+
if (process.env.NODE_ENV === "production" || typeof document === "undefined" || verifiedSkinIds.has(id)) return;
|
|
21
|
+
verifiedSkinIds.add(id);
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
if (skin.id !== id) {
|
|
24
|
+
verifiedSkinIds.delete(id);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const problem = skinScopeProblem(id);
|
|
28
|
+
if (problem) console.error(problem);
|
|
29
|
+
}, 0);
|
|
30
|
+
}
|
|
31
|
+
function skinId() {
|
|
32
|
+
verifySkinScope(skin.id);
|
|
33
|
+
return skin.id;
|
|
34
|
+
}
|
|
35
|
+
/** Sidebar falls back: variant prop → this → "sidebar". */
|
|
36
|
+
function skinSidebarLayout() {
|
|
37
|
+
return skin.sidebarLayout;
|
|
38
|
+
}
|
|
39
|
+
/** Component falls back: indicator prop → this → "none". */
|
|
40
|
+
function skinIndicator(component) {
|
|
41
|
+
return skin.indicators?.[component];
|
|
42
|
+
}
|
|
43
|
+
/** SidebarProvider seeds --sidebar-width from this; caller-provided value still wins. */
|
|
44
|
+
function skinSidebarWidth() {
|
|
45
|
+
return skin.sidebarWidth;
|
|
46
|
+
}
|
|
47
|
+
/** Portals stamp result next to data-skin; ControlEffectsRuntime mirrors it on <html>. */
|
|
48
|
+
function skinEffects() {
|
|
49
|
+
return controlEffectsAttribute(skin.effects);
|
|
50
|
+
}
|
|
51
|
+
function resolveAdornment(entry, ctx) {
|
|
52
|
+
if (entry === void 0) return void 0;
|
|
53
|
+
return typeof entry === "function" ? entry(ctx) : entry;
|
|
54
|
+
}
|
|
55
|
+
function skinAdornment(scope, part, ctx) {
|
|
56
|
+
return resolveAdornment(skin.adornments?.[scope]?.[part], ctx);
|
|
57
|
+
}
|
|
58
|
+
function hasSkinAdornment(scope, part) {
|
|
59
|
+
return skin.adornments?.[scope]?.[part] !== void 0;
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { activeSkin, controlEffectsAttribute, hasSkinAdornment, skinAdornment, skinEffects, skinId, skinIndicator, skinSidebarLayout, skinSidebarWidth };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BadgeKnobStyle } from "./knob-contracts/badge-knobs.js";
|
|
2
|
+
import { SourceBadgeKnobStyle } from "./knob-contracts/source-badge-knobs.js";
|
|
3
|
+
import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar.js";
|
|
4
|
+
import { CSSProperties, ComponentProps } from "react";
|
|
5
|
+
//#region src/source-badge.d.ts
|
|
6
|
+
type SourceBadgeProps = Omit<ComponentProps<"a">, "href" | "style"> & {
|
|
7
|
+
faviconSrc?: string | false;
|
|
8
|
+
href: string;
|
|
9
|
+
style?: CSSProperties & SourceBadgeKnobStyle & BadgeKnobStyle;
|
|
10
|
+
};
|
|
11
|
+
declare function sourceHostname(href: string): string;
|
|
12
|
+
declare function sourceFaviconHref(href: string): string | undefined;
|
|
13
|
+
type SourceFaviconProps = Omit<ComponentProps<typeof Avatar>, "children" | "style"> & {
|
|
14
|
+
faviconSrc?: string | false;
|
|
15
|
+
href: string;
|
|
16
|
+
imageProps?: Omit<ComponentProps<typeof AvatarImage>, "src">;
|
|
17
|
+
fallbackProps?: ComponentProps<typeof AvatarFallback>;
|
|
18
|
+
style?: CSSProperties & SourceBadgeKnobStyle;
|
|
19
|
+
};
|
|
20
|
+
declare function SourceFavicon({ faviconSrc, href, imageProps, fallbackProps, className, ...props }: SourceFaviconProps): import("react").JSX.Element;
|
|
21
|
+
declare function SourceBadge({ faviconSrc, href, children, className, rel, target, ...props }: SourceBadgeProps): import("react").JSX.Element;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { SourceBadge, SourceBadgeProps, SourceFavicon, SourceFaviconProps, sourceFaviconHref, sourceHostname };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./lib/cn.js";
|
|
3
|
+
import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar.js";
|
|
4
|
+
import { Badge } from "./ui/badge.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Globe } from "lucide-react";
|
|
7
|
+
//#region src/source-badge.tsx
|
|
8
|
+
function sourceHostname(href) {
|
|
9
|
+
try {
|
|
10
|
+
return new URL(href).hostname.replace(/^www\./, "") || href;
|
|
11
|
+
} catch {
|
|
12
|
+
return href;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function sourceFaviconHref(href) {
|
|
16
|
+
try {
|
|
17
|
+
const source = new URL(href);
|
|
18
|
+
if (source.protocol !== "https:" && source.protocol !== "http:") return void 0;
|
|
19
|
+
return new URL("/favicon.ico", source.origin).href;
|
|
20
|
+
} catch {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function SourceFavicon({ faviconSrc, href, imageProps, fallbackProps, className, ...props }) {
|
|
25
|
+
const resolvedFaviconSrc = faviconSrc === false ? void 0 : faviconSrc ?? sourceFaviconHref(href);
|
|
26
|
+
return /* @__PURE__ */ jsxs(Avatar, {
|
|
27
|
+
"data-control-ui": "source-badge",
|
|
28
|
+
"data-source-badge-favicon": "",
|
|
29
|
+
"data-slot": "root",
|
|
30
|
+
...props,
|
|
31
|
+
className,
|
|
32
|
+
children: [resolvedFaviconSrc ? /* @__PURE__ */ jsx(AvatarImage, {
|
|
33
|
+
src: resolvedFaviconSrc,
|
|
34
|
+
alt: "",
|
|
35
|
+
...imageProps
|
|
36
|
+
}) : null, /* @__PURE__ */ jsx(AvatarFallback, {
|
|
37
|
+
...fallbackProps,
|
|
38
|
+
className: fallbackProps?.className,
|
|
39
|
+
children: /* @__PURE__ */ jsx(Globe, {
|
|
40
|
+
"aria-hidden": "true",
|
|
41
|
+
className: "size-2.5"
|
|
42
|
+
})
|
|
43
|
+
})]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function SourceBadge({ faviconSrc, href, children, className, rel, target, ...props }) {
|
|
47
|
+
const hostname = sourceHostname(href);
|
|
48
|
+
return /* @__PURE__ */ jsxs(Badge, {
|
|
49
|
+
variant: "outline",
|
|
50
|
+
render: /* @__PURE__ */ jsx("a", {
|
|
51
|
+
"data-source-badge": "",
|
|
52
|
+
"data-control-ui": "source-badge",
|
|
53
|
+
"data-slot": "root",
|
|
54
|
+
href,
|
|
55
|
+
target,
|
|
56
|
+
rel: rel ?? (target === "_blank" ? "noreferrer noopener" : void 0),
|
|
57
|
+
className: cn(className),
|
|
58
|
+
...props
|
|
59
|
+
}),
|
|
60
|
+
children: [/* @__PURE__ */ jsx(SourceFavicon, {
|
|
61
|
+
href,
|
|
62
|
+
faviconSrc
|
|
63
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
64
|
+
"data-control-ui": "source-badge",
|
|
65
|
+
"data-slot": "label",
|
|
66
|
+
className: "truncate",
|
|
67
|
+
children: children ?? hostname
|
|
68
|
+
})]
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { SourceBadge, SourceFavicon, sourceFaviconHref, sourceHostname };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Blur choreography, token-driven (kill-switch collapses to 0).
|
|
3
|
+
* Entry: pill blurs+scales IN via @starting-style (freshly appended by ProseMirror). Exit: pill-delete/message-submit blur OUT via [data-chat-composer-exit] on a throwaway clone (ghost.ts) since ProseMirror removes nodes synchronously.
|
|
4
|
+
* Reads the shared --duration-* and --ease-* tokens.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
@layer components {
|
|
8
|
+
/* resting look + blur-IN transition; :not([data-chat-composer-exit] *) excludes exit ghosts/cloned pills from entry choreography */
|
|
9
|
+
:where([data-control-ui="chat-composer"][data-slot="mention"]):not([data-chat-composer-exit]):not([data-chat-composer-exit] *) {
|
|
10
|
+
opacity: 1;
|
|
11
|
+
filter: blur(0);
|
|
12
|
+
scale: 1;
|
|
13
|
+
transition:
|
|
14
|
+
opacity var(--duration-base) var(--ease-emphasized),
|
|
15
|
+
filter var(--duration-base) var(--ease-emphasized),
|
|
16
|
+
scale var(--duration-base) var(--ease-emphasized);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@starting-style {
|
|
20
|
+
:where([data-control-ui="chat-composer"][data-slot="mention"]):not([data-chat-composer-exit]):not([data-chat-composer-exit] *) {
|
|
21
|
+
opacity: 0;
|
|
22
|
+
filter: blur(6px);
|
|
23
|
+
scale: 0.82;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* exit ghost: fixed-position clone, keyframe blurs it out then self-removes on animationend; finite duration lets kill-switch snap it away invisibly */
|
|
28
|
+
:where([data-chat-composer-exit][data-exiting]) {
|
|
29
|
+
opacity: 1;
|
|
30
|
+
filter: blur(0);
|
|
31
|
+
scale: 1;
|
|
32
|
+
translate: 0 0;
|
|
33
|
+
animation: chat-composer-blur-out var(--duration-base) var(--ease-emphasized) forwards;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@keyframes chat-composer-blur-out {
|
|
38
|
+
to {
|
|
39
|
+
opacity: 0;
|
|
40
|
+
filter: blur(8px);
|
|
41
|
+
scale: 0.94;
|
|
42
|
+
translate: 0 -0.25rem;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Control UI — code + diff tokens, derived from the shared theme contract.
|
|
3
|
+
* --code-token-*: Shiki CSS-variables syntax palette (lib/code-tokens.ts) — follows active skin instead of a frozen palette. --diff-*: 3-tier diff colors (line/emphasis/gutter/fg per side), à la @pierre/diffs. Both skin-overridable via pack skin.css.
|
|
4
|
+
* Scoped to the root color mode at zero specificity so every skin inherits the correct palette and can override it locally.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
:where(:root) {
|
|
8
|
+
/* syntax — light (github-light adjacent, retinted onto the neutral token hue family) */
|
|
9
|
+
--code-foreground: var(--foreground);
|
|
10
|
+
--code-token-constant: oklch(0.5 0.15 250);
|
|
11
|
+
--code-token-string: oklch(0.49 0.13 150);
|
|
12
|
+
--code-token-string-expression: oklch(0.49 0.13 150);
|
|
13
|
+
--code-token-comment: oklch(0.48 0.015 285);
|
|
14
|
+
--code-token-keyword: oklch(0.53 0.2 18);
|
|
15
|
+
--code-token-parameter: oklch(0.52 0.09 55);
|
|
16
|
+
--code-token-function: oklch(0.54 0.17 300);
|
|
17
|
+
--code-token-punctuation: oklch(0.5 0.02 285);
|
|
18
|
+
--code-token-link: oklch(0.5 0.15 250);
|
|
19
|
+
|
|
20
|
+
/* diff — light. add ≈ green (H150), del ≈ red (H22). */
|
|
21
|
+
--diff-add-line: oklch(0.93 0.055 150 / 0.65);
|
|
22
|
+
--diff-add-emphasis: oklch(0.86 0.11 150 / 0.8);
|
|
23
|
+
--diff-add-gutter: oklch(0.91 0.07 150);
|
|
24
|
+
--diff-add-fg: oklch(0.48 0.11 150);
|
|
25
|
+
--diff-del-line: oklch(0.94 0.05 22 / 0.6);
|
|
26
|
+
--diff-del-emphasis: oklch(0.87 0.12 22 / 0.8);
|
|
27
|
+
--diff-del-gutter: oklch(0.92 0.07 22);
|
|
28
|
+
--diff-del-fg: oklch(0.53 0.16 22);
|
|
29
|
+
--diff-context-fg: var(--muted-foreground);
|
|
30
|
+
--diff-gutter-bg: oklch(from var(--muted) l c h / 0.5);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
:where(.dark) {
|
|
34
|
+
/* syntax — dark (github-dark adjacent) */
|
|
35
|
+
--code-foreground: var(--foreground);
|
|
36
|
+
--code-token-constant: oklch(0.78 0.13 235);
|
|
37
|
+
--code-token-string: oklch(0.8 0.13 150);
|
|
38
|
+
--code-token-string-expression: oklch(0.8 0.13 150);
|
|
39
|
+
--code-token-comment: oklch(0.76 0.02 285);
|
|
40
|
+
--code-token-keyword: oklch(0.75 0.16 12);
|
|
41
|
+
--code-token-parameter: oklch(0.82 0.09 60);
|
|
42
|
+
--code-token-function: oklch(0.8 0.14 300);
|
|
43
|
+
--code-token-punctuation: oklch(0.72 0.02 285);
|
|
44
|
+
--code-token-link: oklch(0.78 0.13 235);
|
|
45
|
+
|
|
46
|
+
/* diff — dark */
|
|
47
|
+
--diff-add-line: oklch(0.5 0.11 150 / 0.22);
|
|
48
|
+
--diff-add-emphasis: oklch(0.6 0.14 150 / 0.34);
|
|
49
|
+
--diff-add-gutter: oklch(0.5 0.1 150 / 0.3);
|
|
50
|
+
--diff-add-fg: oklch(0.82 0.13 150);
|
|
51
|
+
--diff-del-line: oklch(0.55 0.16 22 / 0.24);
|
|
52
|
+
--diff-del-emphasis: oklch(0.62 0.18 22 / 0.36);
|
|
53
|
+
--diff-del-gutter: oklch(0.55 0.14 22 / 0.3);
|
|
54
|
+
--diff-del-fg: oklch(0.78 0.15 22);
|
|
55
|
+
--diff-context-fg: var(--muted-foreground);
|
|
56
|
+
--diff-gutter-bg: oklch(from var(--muted) l c h / 0.4);
|
|
57
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/* Every utility here reads theme tokens, so a theme rewrite restyles the effects too. Tailwind only emits an @utility that scanned source references. */
|
|
2
|
+
|
|
3
|
+
/* apply to a sized block */
|
|
4
|
+
@utility shimmer {
|
|
5
|
+
background-image: linear-gradient(100deg, var(--muted) 30%, oklch(from var(--muted-foreground) l c h / 0.25) 50%, var(--muted) 70%);
|
|
6
|
+
background-size: 220% 100%;
|
|
7
|
+
animation: shimmer calc(var(--duration-slow) * 5) var(--ease-standard) infinite;
|
|
8
|
+
|
|
9
|
+
/* Reduced motion: hold resting gradient (infinite animation ignores 0ms collapse, must still explicitly) under OS pref + motion kill-switch attribute. */
|
|
10
|
+
@media (prefers-reduced-motion: reduce) {
|
|
11
|
+
animation: none;
|
|
12
|
+
}
|
|
13
|
+
:where([data-motion="reduced"]) & {
|
|
14
|
+
animation: none;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* shimmer-text — same sweep clipped to text ("AI is generating" treatment); subtle --muted-foreground↔--foreground stops keep it readable. */
|
|
19
|
+
@utility shimmer-text {
|
|
20
|
+
background-image: linear-gradient(100deg, var(--muted-foreground) 35%, var(--foreground) 50%, var(--muted-foreground) 65%);
|
|
21
|
+
background-size: 220% 100%;
|
|
22
|
+
background-clip: text;
|
|
23
|
+
-webkit-background-clip: text;
|
|
24
|
+
-webkit-text-fill-color: transparent;
|
|
25
|
+
color: transparent;
|
|
26
|
+
animation: shimmer calc(var(--duration-slow) * 6) var(--ease-standard) infinite;
|
|
27
|
+
|
|
28
|
+
/* Reduced motion: static muted-foreground text, no sweep — stilled under OS pref + motion kill-switch (infinite animation ignores 0ms tempo). */
|
|
29
|
+
@media (prefers-reduced-motion: reduce) {
|
|
30
|
+
animation: none;
|
|
31
|
+
}
|
|
32
|
+
:where([data-motion="reduced"]) & {
|
|
33
|
+
animation: none;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@keyframes shimmer {
|
|
38
|
+
from {
|
|
39
|
+
background-position: 180% 0;
|
|
40
|
+
}
|
|
41
|
+
to {
|
|
42
|
+
background-position: -80% 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* halftone — "media is being generated" fill for a box whose final size is already reserved (image gen placeholder).
|
|
47
|
+
* The lattice never moves and the mask is a fixed corner-to-corner fade; the dots themselves breathe, which is what
|
|
48
|
+
* reads as halftone. A travelling mask was tried and rejected: it leaves the box blank for most of the cycle.
|
|
49
|
+
* Registration required to interpolate the radius — browsers without @property hold the resting dot, never a broken box.
|
|
50
|
+
* Token-parameterized (pack re-values, no fork): --halftone-color, -dot (resting radius), -gap (lattice pitch). */
|
|
51
|
+
@property --cui-halftone-pulse {
|
|
52
|
+
syntax: "<number>";
|
|
53
|
+
inherits: false;
|
|
54
|
+
initial-value: 1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@utility halftone {
|
|
58
|
+
--halftone-radius: calc(var(--halftone-dot, 1.4px) * var(--cui-halftone-pulse));
|
|
59
|
+
background-image: radial-gradient(
|
|
60
|
+
circle at center,
|
|
61
|
+
var(--halftone-color, oklch(from var(--muted-foreground) l c h / 0.7)) var(--halftone-radius),
|
|
62
|
+
transparent calc(var(--halftone-radius) + 0.4px)
|
|
63
|
+
);
|
|
64
|
+
background-size: var(--halftone-gap, 11px) var(--halftone-gap, 11px);
|
|
65
|
+
-webkit-mask-image: linear-gradient(to top left, transparent 0%, oklch(0 0 0) 30%, oklch(0 0 0) 70%, transparent 100%);
|
|
66
|
+
mask-image: linear-gradient(to top left, transparent 0%, oklch(0 0 0) 30%, oklch(0 0 0) 70%, transparent 100%);
|
|
67
|
+
-webkit-mask-size: 100% 100%;
|
|
68
|
+
mask-size: 100% 100%;
|
|
69
|
+
-webkit-mask-repeat: no-repeat;
|
|
70
|
+
mask-repeat: no-repeat;
|
|
71
|
+
animation: aui-halftone calc(var(--duration-slow) * 6) var(--ease-standard) infinite;
|
|
72
|
+
|
|
73
|
+
/* Reduced motion: dots hold at their resting radius — still a legible placeholder, just no breathing. */
|
|
74
|
+
@media (prefers-reduced-motion: reduce) {
|
|
75
|
+
animation: none;
|
|
76
|
+
}
|
|
77
|
+
:where([data-motion="reduced"]) & {
|
|
78
|
+
animation: none;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@keyframes aui-halftone {
|
|
83
|
+
0%,
|
|
84
|
+
100% {
|
|
85
|
+
--cui-halftone-pulse: 0.55;
|
|
86
|
+
}
|
|
87
|
+
50% {
|
|
88
|
+
--cui-halftone-pulse: 1.5;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* progress-sweep — retro alt to shimmer-text: hard-edged --primary blocks marching L-to-R, clipped to text (Minecraft/Windows XP bar).
|
|
93
|
+
* Token-parameterized (pack re-values, no fork): --progress-sweep-color, -block/-step (lit width/repeat period, gap=step−block), -fade (dim gap alpha).
|
|
94
|
+
* text-shadow cleared — glyph shadow would paint over transparent fill (same reason as the fill reset). */
|
|
95
|
+
@utility progress-sweep {
|
|
96
|
+
background-image: repeating-linear-gradient(
|
|
97
|
+
90deg,
|
|
98
|
+
var(--progress-sweep-color, var(--primary)) 0 var(--progress-sweep-block, 8px),
|
|
99
|
+
oklch(from var(--progress-sweep-color, var(--primary)) l c h / var(--progress-sweep-fade, 0.4)) var(--progress-sweep-block, 8px)
|
|
100
|
+
var(--progress-sweep-step, 12px)
|
|
101
|
+
);
|
|
102
|
+
background-size: 200% 100%;
|
|
103
|
+
background-clip: text;
|
|
104
|
+
-webkit-background-clip: text;
|
|
105
|
+
-webkit-text-fill-color: transparent;
|
|
106
|
+
color: transparent;
|
|
107
|
+
text-shadow: none;
|
|
108
|
+
animation: aui-progress-sweep calc(var(--duration-slow) * 12) linear infinite;
|
|
109
|
+
|
|
110
|
+
/* Reduced motion: static blocks, no march — stilled under OS pref + motion kill-switch (infinite animation ignores 0ms tempo). */
|
|
111
|
+
@media (prefers-reduced-motion: reduce) {
|
|
112
|
+
animation: none;
|
|
113
|
+
}
|
|
114
|
+
:where([data-motion="reduced"]) & {
|
|
115
|
+
animation: none;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
@keyframes aui-progress-sweep {
|
|
120
|
+
from {
|
|
121
|
+
background-position: 0 0;
|
|
122
|
+
}
|
|
123
|
+
to {
|
|
124
|
+
background-position: -200% 0;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
@import "./theme.css";
|
|
2
|
+
@import "./recipes/accordion.css";
|
|
3
|
+
@import "./recipes/button.css";
|
|
4
|
+
@import "./recipes/action-bar.css";
|
|
5
|
+
@import "./recipes/collapsible.css";
|
|
6
|
+
@import "./recipes/scroll-area.css";
|
|
7
|
+
@import "./recipes/activity.css";
|
|
8
|
+
@import "./recipes/alert.css";
|
|
9
|
+
@import "./recipes/popup.css";
|
|
10
|
+
@import "./recipes/popup-controls.css";
|
|
11
|
+
@import "./recipes/popup-lists.css";
|
|
12
|
+
@import "./recipes/popup-motion.css";
|
|
13
|
+
@import "./recipes/audio-visualizer.css";
|
|
14
|
+
@import "./recipes/audio-recorder.css";
|
|
15
|
+
@import "./recipes/field.css";
|
|
16
|
+
@import "./recipes/field-parts.css";
|
|
17
|
+
@import "./recipes/avatar.css";
|
|
18
|
+
@import "./recipes/badge.css";
|
|
19
|
+
@import "./recipes/button-group.css";
|
|
20
|
+
@import "./recipes/calendar.css";
|
|
21
|
+
@import "./recipes/card.css";
|
|
22
|
+
@import "./recipes/chat-layout.css";
|
|
23
|
+
@import "./effects.css";
|
|
24
|
+
@import "./recipes/chat-message.css";
|
|
25
|
+
@import "./recipes/chat-composer.css";
|
|
26
|
+
@import "./chat-composer-editor.css";
|
|
27
|
+
@import "./recipes/chat-composer-attachment.css";
|
|
28
|
+
@import "./recipes/choice.css";
|
|
29
|
+
@import "./code.css";
|
|
30
|
+
@import "./recipes/code.css";
|
|
31
|
+
@import "./recipes/code-block-editor.css";
|
|
32
|
+
@import "./recipes/code-diff.css";
|
|
33
|
+
@import "./recipes/track-highlight.css";
|
|
34
|
+
@import "./recipes/sidebar.css";
|
|
35
|
+
@import "./recipes/color-picker.css";
|
|
36
|
+
@import "./recipes/color-picker-details.css";
|
|
37
|
+
@import "./recipes/color-picker-values.css";
|
|
38
|
+
@import "./recipes/context.css";
|
|
39
|
+
@import "./recipes/popup-drawer.css";
|
|
40
|
+
@import "./recipes/dockable-panel.css";
|
|
41
|
+
@import "./recipes/separator.css";
|
|
42
|
+
@import "./recipes/item.css";
|
|
43
|
+
@import "./recipes/dropzone.css";
|
|
44
|
+
@import "./recipes/dynamic-notification.css";
|
|
45
|
+
@import "./recipes/dynamic-notification-input.css";
|
|
46
|
+
@import "./recipes/dynamic-notification-motion.css";
|
|
47
|
+
@import "./recipes/empty.css";
|
|
48
|
+
@import "./recipes/environment-variables.css";
|
|
49
|
+
@import "./recipes/resizable.css";
|
|
50
|
+
@import "./recipes/gradient-editor.css";
|
|
51
|
+
@import "./recipes/infinite-canvas.css";
|
|
52
|
+
@import "./recipes/inline-attachment.css";
|
|
53
|
+
@import "./recipes/source-badge.css";
|
|
54
|
+
@import "./recipes/inline-citation.css";
|
|
55
|
+
@import "./recipes/kbd.css";
|
|
56
|
+
@import "./recipes/markdown.css";
|
|
57
|
+
@import "./recipes/markdown-block.css";
|
|
58
|
+
@import "./recipes/range.css";
|
|
59
|
+
@import "./recipes/morphing-panel.css";
|
|
60
|
+
@import "./recipes/pagination.css";
|
|
61
|
+
@import "./recipes/phone-input.css";
|
|
62
|
+
@import "./recipes/rich-tooltip.css";
|
|
63
|
+
@import "./recipes/skeleton.css";
|
|
64
|
+
@import "./recipes/spinner.css";
|
|
65
|
+
@import "./recipes/stepper.css";
|
|
66
|
+
@import "./recipes/switch.css";
|
|
67
|
+
@import "./recipes/table.css";
|
|
68
|
+
@import "./recipes/table-of-contents.css";
|
|
69
|
+
@import "./recipes/tabs.css";
|
|
70
|
+
@import "./recipes/task-list.css";
|
|
71
|
+
@import "./recipes/thread-rail.css";
|
|
72
|
+
@import "./recipes/timeline.css";
|
|
73
|
+
@import "./recipes/popup-toast.css";
|
|
74
|
+
@import "./recipes/toolbar.css";
|
|
75
|
+
@import "./recipes/transcript-divider.css";
|
|
76
|
+
@import "./recipes/tree.css";
|
|
77
|
+
@import "./type-scale.css";
|
|
78
|
+
@import "./recipes/user-ask.css";
|
|
79
|
+
@import "./recipes/user-ask-details.css";
|
|
80
|
+
@import "./skin-theme.css";
|
|
81
|
+
@import "./skin.css";
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
:where([data-control-family="accordion"][data-slot="root"]) {
|
|
3
|
+
--cui-accordion-item-border-color: var(--border);
|
|
4
|
+
--cui-accordion-trigger-foreground: var(--foreground);
|
|
5
|
+
--cui-accordion-trigger-hover-foreground: oklch(from var(--foreground) l c h / 0.8);
|
|
6
|
+
--cui-accordion-icon-foreground: var(--muted-foreground);
|
|
7
|
+
}
|
|
8
|
+
:where([data-control-family="accordion"][data-slot="item"]) {
|
|
9
|
+
border-block-end: 1px solid var(--cui-accordion-item-border-color);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
:where([data-control-family="accordion"][data-slot="item"]:last-child) {
|
|
13
|
+
border-block-end: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:where([data-control-family="accordion"][data-slot="trigger"]) {
|
|
17
|
+
gap: calc(var(--spacing) * 4);
|
|
18
|
+
padding-block: calc(var(--spacing) * 3);
|
|
19
|
+
color: var(--cui-accordion-trigger-foreground);
|
|
20
|
+
font-size: var(--text-body);
|
|
21
|
+
outline: none;
|
|
22
|
+
transition: color var(--duration-fast) var(--ease-standard);
|
|
23
|
+
text-align: left;
|
|
24
|
+
font-weight: var(--font-weight-medium);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
:where([data-control-family="accordion"][data-slot="trigger"]:hover) {
|
|
28
|
+
color: var(--cui-accordion-trigger-hover-foreground);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
:where([data-control-family="accordion"][data-slot="trigger"][data-disabled]) {
|
|
32
|
+
cursor: not-allowed;
|
|
33
|
+
opacity: 0.5;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:where([data-control-family="accordion"][data-slot="icon"]) {
|
|
37
|
+
inline-size: calc(var(--spacing) * 4);
|
|
38
|
+
block-size: calc(var(--spacing) * 4);
|
|
39
|
+
color: var(--cui-accordion-icon-foreground);
|
|
40
|
+
transition: rotate var(--duration-base) var(--ease-standard);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
:where([data-control-family="accordion"][data-slot="trigger"][data-panel-open] > [data-slot="icon"]) {
|
|
44
|
+
rotate: 180deg;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:where([data-control-family="accordion"][data-slot="panel-content"]) {
|
|
48
|
+
padding-block-end: calc(var(--spacing) * 3);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
:where([data-control-family="accordion"][data-slot="panel"]) {
|
|
52
|
+
color: var(--muted-foreground);
|
|
53
|
+
font-size: var(--text-body);
|
|
54
|
+
height: var(--accordion-panel-height);
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
transition: height var(--duration-base) var(--ease-emphasized);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:where([data-control-family="accordion"][data-slot="panel"][data-starting-style]),
|
|
60
|
+
:where([data-control-family="accordion"][data-slot="panel"][data-ending-style]) {
|
|
61
|
+
height: 0;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@property --cui-accordion-item-border-color {
|
|
66
|
+
syntax: "<color>";
|
|
67
|
+
inherits: true;
|
|
68
|
+
initial-value: transparent;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@property --cui-accordion-trigger-foreground {
|
|
72
|
+
syntax: "<color>";
|
|
73
|
+
inherits: true;
|
|
74
|
+
initial-value: transparent;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@property --cui-accordion-trigger-hover-foreground {
|
|
78
|
+
syntax: "<color>";
|
|
79
|
+
inherits: true;
|
|
80
|
+
initial-value: transparent;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@property --cui-accordion-icon-foreground {
|
|
84
|
+
syntax: "<color>";
|
|
85
|
+
inherits: true;
|
|
86
|
+
initial-value: transparent;
|
|
87
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
:where([data-control-family="action-bar"][data-slot="root"]) {
|
|
3
|
+
margin-block-start: calc(var(--spacing) * 1);
|
|
4
|
+
min-block-size: calc(var(--spacing) * 8);
|
|
5
|
+
gap: calc(var(--spacing) * 1);
|
|
6
|
+
opacity: 0;
|
|
7
|
+
transition: opacity var(--duration-base) var(--ease-standard);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
@media (hover: hover) {
|
|
11
|
+
:where([data-control-family="chat-layout"][data-slot="turn"]:hover [data-control-family="action-bar"][data-slot="root"]) {
|
|
12
|
+
opacity: 1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:where([data-control-family="chat-layout"][data-slot="turn"]:focus-within [data-control-family="action-bar"][data-slot="root"]) {
|
|
17
|
+
opacity: 1;
|
|
18
|
+
}
|
|
19
|
+
}
|