@kortix/ui 0.0.0-bootstrap.0 → 0.14.3
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 +153 -2
- package/dist/_vendor/kortix-shared.js +341 -0
- package/dist/chat/agent-picker.d.ts +8 -0
- package/dist/chat/agent-picker.js +18 -0
- package/dist/chat/composer.d.ts +31 -0
- package/dist/chat/composer.js +114 -0
- package/dist/chat/index.d.ts +22 -0
- package/dist/chat/index.js +22 -0
- package/dist/chat/markdown.d.ts +10 -0
- package/dist/chat/markdown.js +36 -0
- package/dist/chat/message-list.d.ts +25 -0
- package/dist/chat/message-list.js +73 -0
- package/dist/chat/message-view.d.ts +17 -0
- package/dist/chat/message-view.js +86 -0
- package/dist/chat/model-picker.d.ts +10 -0
- package/dist/chat/model-picker.js +68 -0
- package/dist/chat/permission-prompt.d.ts +10 -0
- package/dist/chat/permission-prompt.js +40 -0
- package/dist/chat/question-prompt.d.ts +8 -0
- package/dist/chat/question-prompt.js +60 -0
- package/dist/chat/send-failure.d.ts +9 -0
- package/dist/chat/send-failure.js +21 -0
- package/dist/chat/session-thread.d.ts +28 -0
- package/dist/chat/session-thread.js +47 -0
- package/dist/chat/streaming-markdown.d.ts +21 -0
- package/dist/chat/streaming-markdown.js +59 -0
- package/dist/chat/tool-call.d.ts +4 -0
- package/dist/chat/tool-call.js +150 -0
- package/dist/chat/user-message-parts.d.ts +6 -0
- package/dist/chat/user-message-parts.js +11 -0
- package/dist/components/ui/accordion.d.ts +7 -0
- package/dist/components/ui/accordion.js +18 -0
- package/dist/components/ui/alert-dialog.d.ts +19 -0
- package/dist/components/ui/alert-dialog.js +48 -0
- package/dist/components/ui/alert.d.ts +13 -0
- package/dist/components/ui/alert.js +67 -0
- package/dist/components/ui/avatar.d.ts +11 -0
- package/dist/components/ui/avatar.js +23 -0
- package/dist/components/ui/back-pill.d.ts +13 -0
- package/dist/components/ui/back-pill.js +18 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.js +42 -0
- package/dist/components/ui/breadcrumb.d.ts +11 -0
- package/dist/components/ui/breadcrumb.js +28 -0
- package/dist/components/ui/bubble.d.ts +20 -0
- package/dist/components/ui/bubble.js +38 -0
- package/dist/components/ui/button-group.d.ts +9 -0
- package/dist/components/ui/button-group.js +32 -0
- package/dist/components/ui/button.d.ts +13 -0
- package/dist/components/ui/button.js +67 -0
- package/dist/components/ui/calendar.d.ts +4 -0
- package/dist/components/ui/calendar.js +39 -0
- package/dist/components/ui/card.d.ts +96 -0
- package/dist/components/ui/card.js +291 -0
- package/dist/components/ui/chain-of-thought.d.ts +75 -0
- package/dist/components/ui/chain-of-thought.js +66 -0
- package/dist/components/ui/chart.d.ts +65 -0
- package/dist/components/ui/chart.js +118 -0
- package/dist/components/ui/checkbox-group.d.ts +19 -0
- package/dist/components/ui/checkbox-group.js +41 -0
- package/dist/components/ui/checkbox.d.ts +14 -0
- package/dist/components/ui/checkbox.js +27 -0
- package/dist/components/ui/collapsible.d.ts +5 -0
- package/dist/components/ui/collapsible.js +14 -0
- package/dist/components/ui/command.d.ts +58 -0
- package/dist/components/ui/command.js +135 -0
- package/dist/components/ui/confirm-dialog.d.ts +19 -0
- package/dist/components/ui/confirm-dialog.js +30 -0
- package/dist/components/ui/context-menu.d.ts +45 -0
- package/dist/components/ui/context-menu.js +93 -0
- package/dist/components/ui/count-badge.d.ts +26 -0
- package/dist/components/ui/count-badge.js +26 -0
- package/dist/components/ui/data-grid.d.ts +24 -0
- package/dist/components/ui/data-grid.js +107 -0
- package/dist/components/ui/date-range-picker.d.ts +119 -0
- package/dist/components/ui/date-range-picker.js +190 -0
- package/dist/components/ui/definition-list.d.ts +15 -0
- package/dist/components/ui/definition-list.js +26 -0
- package/dist/components/ui/dialog.d.ts +29 -0
- package/dist/components/ui/dialog.js +52 -0
- package/dist/components/ui/disclosure.d.ts +121 -0
- package/dist/components/ui/disclosure.js +138 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-10.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-10.js +29 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-12.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-12.js +19 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-13.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-13.js +19 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-15.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-15.js +22 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-16.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-16.js +5 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-18.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-18.js +5 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-19.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-19.js +5 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-2.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-2.js +3 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-20.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-20.js +5 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-21.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-21.js +5 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-3.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-3.js +3 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-4.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-4.js +3 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-5.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-5.js +3 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-6.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-6.js +19 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-7.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-7.js +19 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-8.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-8.js +19 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-9.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-3x3-9.js +23 -0
- package/dist/components/ui/dot-matrix/dotm-circular-1.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-1.js +28 -0
- package/dist/components/ui/dot-matrix/dotm-circular-10.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-10.js +40 -0
- package/dist/components/ui/dot-matrix/dotm-circular-11.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-11.js +37 -0
- package/dist/components/ui/dot-matrix/dotm-circular-12.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-12.js +42 -0
- package/dist/components/ui/dot-matrix/dotm-circular-14.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-14.js +37 -0
- package/dist/components/ui/dot-matrix/dotm-circular-15.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-15.js +49 -0
- package/dist/components/ui/dot-matrix/dotm-circular-17.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-17.js +31 -0
- package/dist/components/ui/dot-matrix/dotm-circular-2.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-2.js +37 -0
- package/dist/components/ui/dot-matrix/dotm-circular-3.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-3.js +54 -0
- package/dist/components/ui/dot-matrix/dotm-circular-4.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-4.js +35 -0
- package/dist/components/ui/dot-matrix/dotm-circular-5.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-5.js +30 -0
- package/dist/components/ui/dot-matrix/dotm-circular-6.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-6.js +37 -0
- package/dist/components/ui/dot-matrix/dotm-circular-7.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-7.js +25 -0
- package/dist/components/ui/dot-matrix/dotm-circular-8.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-8.js +26 -0
- package/dist/components/ui/dot-matrix/dotm-circular-9.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-circular-9.js +41 -0
- package/dist/components/ui/dot-matrix/dotm-square-1.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-1.js +27 -0
- package/dist/components/ui/dot-matrix/dotm-square-10.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-10.js +27 -0
- package/dist/components/ui/dot-matrix/dotm-square-11.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-11.js +25 -0
- package/dist/components/ui/dot-matrix/dotm-square-12.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-12.js +28 -0
- package/dist/components/ui/dot-matrix/dotm-square-13.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-13.js +45 -0
- package/dist/components/ui/dot-matrix/dotm-square-14.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-14.js +38 -0
- package/dist/components/ui/dot-matrix/dotm-square-15.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-15.js +31 -0
- package/dist/components/ui/dot-matrix/dotm-square-16.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-16.js +33 -0
- package/dist/components/ui/dot-matrix/dotm-square-17.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-17.js +27 -0
- package/dist/components/ui/dot-matrix/dotm-square-18.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-18.js +29 -0
- package/dist/components/ui/dot-matrix/dotm-square-19.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-19.js +74 -0
- package/dist/components/ui/dot-matrix/dotm-square-2.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-2.js +72 -0
- package/dist/components/ui/dot-matrix/dotm-square-20.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-20.js +79 -0
- package/dist/components/ui/dot-matrix/dotm-square-3.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-3.js +23 -0
- package/dist/components/ui/dot-matrix/dotm-square-4.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-4.js +41 -0
- package/dist/components/ui/dot-matrix/dotm-square-5.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-5.js +23 -0
- package/dist/components/ui/dot-matrix/dotm-square-6.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-6.js +20 -0
- package/dist/components/ui/dot-matrix/dotm-square-7.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-7.js +43 -0
- package/dist/components/ui/dot-matrix/dotm-square-8.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-8.js +57 -0
- package/dist/components/ui/dot-matrix/dotm-square-9.d.ts +4 -0
- package/dist/components/ui/dot-matrix/dotm-square-9.js +89 -0
- package/dist/components/ui/dot-matrix/session-dot-matrix.d.ts +46 -0
- package/dist/components/ui/dot-matrix/session-dot-matrix.js +153 -0
- package/dist/components/ui/drawer.d.ts +15 -0
- package/dist/components/ui/drawer.js +35 -0
- package/dist/components/ui/dropdown-menu.d.ts +49 -0
- package/dist/components/ui/dropdown-menu.js +113 -0
- package/dist/components/ui/emoji-picker.d.ts +15 -0
- package/dist/components/ui/emoji-picker.js +137 -0
- package/dist/components/ui/emoji-tint.d.ts +41 -0
- package/dist/components/ui/emoji-tint.js +131 -0
- package/dist/components/ui/empty.d.ts +11 -0
- package/dist/components/ui/empty.js +33 -0
- package/dist/components/ui/entity-avatar.d.ts +84 -0
- package/dist/components/ui/entity-avatar.js +106 -0
- package/dist/components/ui/faded-scroll-area.d.ts +8 -0
- package/dist/components/ui/faded-scroll-area.js +80 -0
- package/dist/components/ui/favicon-avatar.d.ts +32 -0
- package/dist/components/ui/favicon-avatar.js +18 -0
- package/dist/components/ui/field.d.ts +15 -0
- package/dist/components/ui/field.js +48 -0
- package/dist/components/ui/file-tree.d.ts +32 -0
- package/dist/components/ui/file-tree.js +30 -0
- package/dist/components/ui/glyph-face.d.ts +18 -0
- package/dist/components/ui/glyph-face.js +37 -0
- package/dist/components/ui/glyph-paths-source.d.ts +2 -0
- package/dist/components/ui/glyph-paths-source.js +40 -0
- package/dist/components/ui/glyph-paths.generated.d.ts +2 -0
- package/dist/components/ui/glyph-paths.generated.js +207 -0
- package/dist/components/ui/glyph-picker.d.ts +22 -0
- package/dist/components/ui/glyph-picker.js +118 -0
- package/dist/components/ui/glyph-registry.d.ts +36 -0
- package/dist/components/ui/glyph-registry.js +479 -0
- package/dist/components/ui/glyph-tint.d.ts +6 -0
- package/dist/components/ui/glyph-tint.js +93 -0
- package/dist/components/ui/hint.d.ts +14 -0
- package/dist/components/ui/hint.js +12 -0
- package/dist/components/ui/histogram-bars.d.ts +38 -0
- package/dist/components/ui/histogram-bars.js +93 -0
- package/dist/components/ui/hover-card.d.ts +28 -0
- package/dist/components/ui/hover-card.js +35 -0
- package/dist/components/ui/icon-provider.d.ts +23 -0
- package/dist/components/ui/icon-provider.js +30 -0
- package/dist/components/ui/info-banner.d.ts +14 -0
- package/dist/components/ui/info-banner.js +72 -0
- package/dist/components/ui/inline-meta.d.ts +6 -0
- package/dist/components/ui/inline-meta.js +8 -0
- package/dist/components/ui/input-group.d.ts +19 -0
- package/dist/components/ui/input-group.js +73 -0
- package/dist/components/ui/input.d.ts +26 -0
- package/dist/components/ui/input.js +23 -0
- package/dist/components/ui/item.d.ts +23 -0
- package/dist/components/ui/item.js +67 -0
- package/dist/components/ui/kbd.d.ts +3 -0
- package/dist/components/ui/kbd.js +20 -0
- package/dist/components/ui/kortix-asterisk.d.ts +6 -0
- package/dist/components/ui/kortix-asterisk.js +17 -0
- package/dist/components/ui/kortix-icons.d.ts +2 -0
- package/dist/components/ui/kortix-icons.js +17 -0
- package/dist/components/ui/kortix-loader.d.ts +76 -0
- package/dist/components/ui/kortix-loader.js +74 -0
- package/dist/components/ui/kortix-logo.d.ts +30 -0
- package/dist/components/ui/kortix-logo.js +47 -0
- package/dist/components/ui/label.d.ts +4 -0
- package/dist/components/ui/label.js +9 -0
- package/dist/components/ui/list.d.ts +15 -0
- package/dist/components/ui/list.js +25 -0
- package/dist/components/ui/loading.d.ts +19 -0
- package/dist/components/ui/loading.js +31 -0
- package/dist/components/ui/local-time.d.ts +34 -0
- package/dist/components/ui/local-time.js +60 -0
- package/dist/components/ui/map.d.ts +101 -0
- package/dist/components/ui/map.js +257 -0
- package/dist/components/ui/marker.d.ts +14 -0
- package/dist/components/ui/marker.js +28 -0
- package/dist/components/ui/menu-recipe.d.ts +102 -0
- package/dist/components/ui/menu-recipe.js +129 -0
- package/dist/components/ui/mermaid-render.d.ts +51 -0
- package/dist/components/ui/mermaid-render.js +65 -0
- package/dist/components/ui/mermaid-renderer.d.ts +13 -0
- package/dist/components/ui/mermaid-renderer.js +340 -0
- package/dist/components/ui/message.d.ts +15 -0
- package/dist/components/ui/message.js +26 -0
- package/dist/components/ui/modal.d.ts +104 -0
- package/dist/components/ui/modal.js +180 -0
- package/dist/components/ui/navigation-menu.d.ts +16 -0
- package/dist/components/ui/navigation-menu.js +35 -0
- package/dist/components/ui/page-search-bar.d.ts +11 -0
- package/dist/components/ui/page-search-bar.js +13 -0
- package/dist/components/ui/phone-input.d.ts +7 -0
- package/dist/components/ui/phone-input.js +59 -0
- package/dist/components/ui/pixel-kortix-mark.d.ts +13 -0
- package/dist/components/ui/pixel-kortix-mark.js +40 -0
- package/dist/components/ui/popover.d.ts +10 -0
- package/dist/components/ui/popover.js +38 -0
- package/dist/components/ui/portal.d.ts +5 -0
- package/dist/components/ui/portal.js +15 -0
- package/dist/components/ui/preview-image.d.ts +14 -0
- package/dist/components/ui/preview-image.js +58 -0
- package/dist/components/ui/progress-ring.d.ts +6 -0
- package/dist/components/ui/progress-ring.js +9 -0
- package/dist/components/ui/progress.d.ts +6 -0
- package/dist/components/ui/progress.js +8 -0
- package/dist/components/ui/radio-group.d.ts +12 -0
- package/dist/components/ui/radio-group.js +20 -0
- package/dist/components/ui/resizable.d.ts +24 -0
- package/dist/components/ui/resizable.js +16 -0
- package/dist/components/ui/scroll-area.d.ts +5 -0
- package/dist/components/ui/scroll-area.js +11 -0
- package/dist/components/ui/section-card.d.ts +37 -0
- package/dist/components/ui/section-card.js +14 -0
- package/dist/components/ui/section.d.ts +10 -0
- package/dist/components/ui/section.js +22 -0
- package/dist/components/ui/select.d.ts +25 -0
- package/dist/components/ui/select.js +59 -0
- package/dist/components/ui/separator.d.ts +4 -0
- package/dist/components/ui/separator.js +8 -0
- package/dist/components/ui/shader-safe.d.ts +48 -0
- package/dist/components/ui/shader-safe.js +74 -0
- package/dist/components/ui/sheet.d.ts +32 -0
- package/dist/components/ui/sheet.js +55 -0
- package/dist/components/ui/sidebar-context.d.ts +72 -0
- package/dist/components/ui/sidebar-context.js +36 -0
- package/dist/components/ui/sidebar-menu-primitives.d.ts +38 -0
- package/dist/components/ui/sidebar-menu-primitives.js +97 -0
- package/dist/components/ui/sidebar-panel.d.ts +36 -0
- package/dist/components/ui/sidebar-panel.js +265 -0
- package/dist/components/ui/sidebar-peek.d.ts +27 -0
- package/dist/components/ui/sidebar-peek.js +70 -0
- package/dist/components/ui/sidebar-width.d.ts +48 -0
- package/dist/components/ui/sidebar-width.js +62 -0
- package/dist/components/ui/sidebar.d.ts +18 -0
- package/dist/components/ui/sidebar.js +194 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.js +6 -0
- package/dist/components/ui/slider-native.d.ts +7 -0
- package/dist/components/ui/slider-native.js +16 -0
- package/dist/components/ui/slider.d.ts +14 -0
- package/dist/components/ui/slider.js +48 -0
- package/dist/components/ui/sliding-tab-indicator.d.ts +61 -0
- package/dist/components/ui/sliding-tab-indicator.js +128 -0
- package/dist/components/ui/split-sheet.d.ts +61 -0
- package/dist/components/ui/split-sheet.js +239 -0
- package/dist/components/ui/spotlight-card.d.ts +8 -0
- package/dist/components/ui/spotlight-card.js +43 -0
- package/dist/components/ui/status-ring.d.ts +38 -0
- package/dist/components/ui/status-ring.js +38 -0
- package/dist/components/ui/status.d.ts +58 -0
- package/dist/components/ui/status.js +76 -0
- package/dist/components/ui/stepper.d.ts +28 -0
- package/dist/components/ui/stepper.js +73 -0
- package/dist/components/ui/switch.d.ts +8 -0
- package/dist/components/ui/switch.js +131 -0
- package/dist/components/ui/system-message.d.ts +23 -0
- package/dist/components/ui/system-message.js +51 -0
- package/dist/components/ui/table.d.ts +10 -0
- package/dist/components/ui/table.js +28 -0
- package/dist/components/ui/tabs.d.ts +73 -0
- package/dist/components/ui/tabs.js +207 -0
- package/dist/components/ui/tag.d.ts +7 -0
- package/dist/components/ui/tag.js +22 -0
- package/dist/components/ui/text-shimmer.d.ts +13 -0
- package/dist/components/ui/text-shimmer.js +91 -0
- package/dist/components/ui/textarea.d.ts +33 -0
- package/dist/components/ui/textarea.js +87 -0
- package/dist/components/ui/toast.d.ts +105 -0
- package/dist/components/ui/toast.js +233 -0
- package/dist/components/ui/toggle.d.ts +12 -0
- package/dist/components/ui/toggle.js +26 -0
- package/dist/components/ui/tooltip.d.ts +9 -0
- package/dist/components/ui/tooltip.js +16 -0
- package/dist/components/ui/trigger-variants.d.ts +14 -0
- package/dist/components/ui/trigger-variants.js +67 -0
- package/dist/components/ui/type-to-confirm-dialog.d.ts +88 -0
- package/dist/components/ui/type-to-confirm-dialog.js +101 -0
- package/dist/components/ui/typed-title-logic.d.ts +22 -0
- package/dist/components/ui/typed-title-logic.js +33 -0
- package/dist/components/ui/typed-title.d.ts +38 -0
- package/dist/components/ui/typed-title.js +66 -0
- package/dist/components/ui/typing-animation.d.ts +36 -0
- package/dist/components/ui/typing-animation.js +141 -0
- package/dist/components/ui/user-avatar.d.ts +47 -0
- package/dist/components/ui/user-avatar.js +46 -0
- package/dist/hooks/use-debounce.d.ts +4 -0
- package/dist/hooks/use-debounce.js +17 -0
- package/dist/hooks/use-is-dark.d.ts +2 -0
- package/dist/hooks/use-is-dark.js +27 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.js +15 -0
- package/dist/hooks/use-proximity-hover.d.ts +52 -0
- package/dist/hooks/use-proximity-hover.js +232 -0
- package/dist/icons/close.d.ts +2 -0
- package/dist/icons/close.js +7 -0
- package/dist/icons/copy.d.ts +3 -0
- package/dist/icons/copy.js +6 -0
- package/dist/icons/sidebar-toggle.d.ts +13 -0
- package/dist/icons/sidebar-toggle.js +13 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +33 -0
- package/dist/lib/dotmatrix-core.d.ts +113 -0
- package/dist/lib/dotmatrix-core.js +920 -0
- package/dist/lib/dotmatrix-hooks.d.ts +28 -0
- package/dist/lib/dotmatrix-hooks.js +151 -0
- package/dist/lib/favicon.d.ts +4 -0
- package/dist/lib/favicon.js +21 -0
- package/dist/lib/font-weight.d.ts +6 -0
- package/dist/lib/font-weight.js +6 -0
- package/dist/lib/icon-config.d.ts +33 -0
- package/dist/lib/icon-config.js +22 -0
- package/dist/lib/icon-context.d.ts +34 -0
- package/dist/lib/icon-context.js +81 -0
- package/dist/lib/portal-root.d.ts +8 -0
- package/dist/lib/portal-root.js +26 -0
- package/dist/lib/settle.d.ts +16 -0
- package/dist/lib/settle.js +29 -0
- package/dist/lib/springs.d.ts +31 -0
- package/dist/lib/springs.js +29 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +5 -0
- package/dist/lib/z-stack.d.ts +55 -0
- package/dist/lib/z-stack.js +130 -0
- package/dist/providers/ui-provider.d.ts +141 -0
- package/dist/providers/ui-provider.js +93 -0
- package/dist/styles/dotmatrix-loader.css +1239 -0
- package/dist/styles/fonts.css +46 -0
- package/dist/styles/tailwind.css +10 -0
- package/dist/styles/theme.css +1019 -0
- package/dist/styles/tokens.css +146 -0
- package/dist/styles.css +2 -0
- package/package.json +874 -4
- package/skills/kortix-ui/SKILL.md +150 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* SplitSheet — a sheet that takes a column of the layout instead of floating
|
|
5
|
+
* above it.
|
|
6
|
+
*
|
|
7
|
+
* `Sheet` portals a fixed panel over the page and dims everything behind it.
|
|
8
|
+
* `SplitSheet` does neither. The root is a CSS grid, the page is its first
|
|
9
|
+
* column, and opening the sheet adds a second column on the right. The page
|
|
10
|
+
* narrows to make room. Nothing is `absolute` or `fixed`.
|
|
11
|
+
*
|
|
12
|
+
* Layout follows the width of the root, not the viewport (`@container`):
|
|
13
|
+
* - Root ≥ 48rem: page and sheet sit side by side, split by a hairline. The
|
|
14
|
+
* sheet column is `size` wide, capped at half the root.
|
|
15
|
+
* - Root < 48rem: the sheet fills the same grid cell as the page. The page stays
|
|
16
|
+
* mounted but `invisible`, so it keeps its scroll position and leaves the tab
|
|
17
|
+
* order and the accessibility tree until the sheet closes.
|
|
18
|
+
*
|
|
19
|
+
* Non-modal: no overlay, no focus trap, no scroll lock. A trigger moves focus
|
|
20
|
+
* into the sheet. Closing returns focus to that trigger when focus was inside
|
|
21
|
+
* the sheet. Escape inside the sheet closes it.
|
|
22
|
+
*
|
|
23
|
+
* The root needs a bounded height (`h-full` in a sized parent, or `h-dvh`).
|
|
24
|
+
* The page and the sheet each scroll inside their own column.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```tsx
|
|
28
|
+
* <SplitSheet>
|
|
29
|
+
* <SplitSheetMain>
|
|
30
|
+
* <SplitSheetTrigger asChild>
|
|
31
|
+
* <Button size="sm" variant="secondary">Details</Button>
|
|
32
|
+
* </SplitSheetTrigger>
|
|
33
|
+
* </SplitSheetMain>
|
|
34
|
+
* <SplitSheetContent>
|
|
35
|
+
* <SplitSheetHeader>
|
|
36
|
+
* <SplitSheetTitle>Title</SplitSheetTitle>
|
|
37
|
+
* <SplitSheetDescription>Description</SplitSheetDescription>
|
|
38
|
+
* </SplitSheetHeader>
|
|
39
|
+
* <SplitSheetBody>{children}</SplitSheetBody>
|
|
40
|
+
* <SplitSheetFooter>
|
|
41
|
+
* <SplitSheetClose asChild>
|
|
42
|
+
* <Button variant="outline-ghost" size="sm">Cancel</Button>
|
|
43
|
+
* </SplitSheetClose>
|
|
44
|
+
* <Button size="sm">Save</Button>
|
|
45
|
+
* </SplitSheetFooter>
|
|
46
|
+
* </SplitSheetContent>
|
|
47
|
+
* </SplitSheet>
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* Controlled:
|
|
51
|
+
* ```tsx
|
|
52
|
+
* <SplitSheet open={open} onOpenChange={setOpen}>...</SplitSheet>
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
import { XIcon } from '@phosphor-icons/react';
|
|
56
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
57
|
+
import * as React from 'react';
|
|
58
|
+
import { cn } from '../../lib/utils.js';
|
|
59
|
+
import { hasOpenFloatingLayer } from '../../lib/z-stack.js';
|
|
60
|
+
import { Button } from './button.js';
|
|
61
|
+
import Hint from './hint.js';
|
|
62
|
+
import { triggerVariants } from './trigger-variants.js';
|
|
63
|
+
/** Sheet column width, from Tailwind's container scale. The grid caps it at
|
|
64
|
+
* `--split-sheet-max` (default 50%) of the root — a caller whose sheet IS
|
|
65
|
+
* the main content may raise the cap (`[--split-sheet-max:60%]`). */
|
|
66
|
+
const SIZE_CLASS = {
|
|
67
|
+
xs: '[--split-sheet-width:var(--container-2xs)]', // 18rem
|
|
68
|
+
sm: '[--split-sheet-width:var(--container-xs)]', // 20rem
|
|
69
|
+
md: '[--split-sheet-width:var(--container-sm)]', // 24rem
|
|
70
|
+
lg: '[--split-sheet-width:var(--container-md)]', // 28rem
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* The one decision every open/close request goes through. A controlled sheet
|
|
74
|
+
* writes no state of its own: the parent's `open` prop is the only source of
|
|
75
|
+
* truth. Same contract `Disclosure` adopted after its mirrored-state bug.
|
|
76
|
+
*/
|
|
77
|
+
export function resolveSplitSheetChange(state) {
|
|
78
|
+
const changed = state.open !== state.nextOpen;
|
|
79
|
+
return { changed, writesInternalState: changed && !state.isControlled };
|
|
80
|
+
}
|
|
81
|
+
const SplitSheetContext = React.createContext(null);
|
|
82
|
+
function useSplitSheetContext(component) {
|
|
83
|
+
const context = React.useContext(SplitSheetContext);
|
|
84
|
+
if (!context)
|
|
85
|
+
throw new Error(`${component} must be rendered inside <SplitSheet>.`);
|
|
86
|
+
return context;
|
|
87
|
+
}
|
|
88
|
+
/** Read or set the nearest sheet's open state from anywhere inside it. */
|
|
89
|
+
function useSplitSheet() {
|
|
90
|
+
const { open, requestOpen } = useSplitSheetContext('useSplitSheet');
|
|
91
|
+
return React.useMemo(() => ({ open, setOpen: (nextOpen) => requestOpen(nextOpen) }), [open, requestOpen]);
|
|
92
|
+
}
|
|
93
|
+
function SplitSheet({ open: openProp, defaultOpen = false, onOpenChange, size = 'md', cover = false, className, children, ...props }) {
|
|
94
|
+
const isControlled = openProp !== undefined;
|
|
95
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);
|
|
96
|
+
const open = isControlled ? openProp : uncontrolledOpen;
|
|
97
|
+
const [instant, setInstant] = React.useState(false);
|
|
98
|
+
const baseId = React.useId();
|
|
99
|
+
const returnFocusRef = React.useRef(null);
|
|
100
|
+
const focusOnOpenRef = React.useRef(false);
|
|
101
|
+
const restoreFocusRef = React.useRef(false);
|
|
102
|
+
const requestOpen = React.useCallback((nextOpen, request = {}) => {
|
|
103
|
+
const { changed, writesInternalState } = resolveSplitSheetChange({
|
|
104
|
+
open,
|
|
105
|
+
nextOpen,
|
|
106
|
+
isControlled,
|
|
107
|
+
});
|
|
108
|
+
if (!changed)
|
|
109
|
+
return;
|
|
110
|
+
if (request.from)
|
|
111
|
+
returnFocusRef.current = request.from;
|
|
112
|
+
if (nextOpen) {
|
|
113
|
+
focusOnOpenRef.current = request.moveFocus ?? false;
|
|
114
|
+
setInstant(request.instant ?? false);
|
|
115
|
+
}
|
|
116
|
+
if (writesInternalState)
|
|
117
|
+
setUncontrolledOpen(nextOpen);
|
|
118
|
+
onOpenChange?.(nextOpen);
|
|
119
|
+
}, [open, isControlled, onOpenChange]);
|
|
120
|
+
// The panel flags `restoreFocusRef` as it unmounts with focus inside it.
|
|
121
|
+
// Without this, focus falls to <body> and the next Tab starts from the top.
|
|
122
|
+
React.useEffect(() => {
|
|
123
|
+
if (open || !restoreFocusRef.current)
|
|
124
|
+
return;
|
|
125
|
+
restoreFocusRef.current = false;
|
|
126
|
+
const target = returnFocusRef.current;
|
|
127
|
+
if (target?.isConnected)
|
|
128
|
+
target.focus({ preventScroll: true });
|
|
129
|
+
}, [open]);
|
|
130
|
+
const context = React.useMemo(() => ({
|
|
131
|
+
open,
|
|
132
|
+
instant,
|
|
133
|
+
cover,
|
|
134
|
+
contentId: `${baseId}-content`,
|
|
135
|
+
titleId: `${baseId}-title`,
|
|
136
|
+
requestOpen,
|
|
137
|
+
returnFocusRef,
|
|
138
|
+
focusOnOpenRef,
|
|
139
|
+
restoreFocusRef,
|
|
140
|
+
}), [open, instant, cover, baseId, requestOpen]);
|
|
141
|
+
return (_jsx(SplitSheetContext.Provider, { value: context, children: _jsx("div", { "data-slot": "split-sheet", "data-state": open ? 'open' : 'closed', className: cn('@container/split-sheet h-full min-h-0 w-full', SIZE_CLASS[size], className), ...props, children: _jsx("div", { "data-slot": "split-sheet-grid", className: cn('grid h-full min-h-0 grid-cols-1 grid-rows-1', open &&
|
|
142
|
+
!cover &&
|
|
143
|
+
'@3xl/split-sheet:grid-cols-[minmax(0,1fr)_min(var(--split-sheet-width),var(--split-sheet-max,50%))]'), children: children }) }) }));
|
|
144
|
+
}
|
|
145
|
+
/** The page. Always the first column; it scrolls on its own. */
|
|
146
|
+
function SplitSheetMain({ className, ...props }) {
|
|
147
|
+
const { open, cover } = useSplitSheetContext('SplitSheetMain');
|
|
148
|
+
return (_jsx("div", { "data-slot": "split-sheet-main", className: cn('col-start-1 row-start-1 min-h-0 min-w-0 overflow-y-auto',
|
|
149
|
+
// Narrow root (or `cover`): the sheet covers this cell. `invisible`
|
|
150
|
+
// keeps the page mounted with its scroll position and hides it from
|
|
151
|
+
// keyboard and AT.
|
|
152
|
+
open && (cover ? 'invisible' : '@max-3xl/split-sheet:invisible'), className), ...props }));
|
|
153
|
+
}
|
|
154
|
+
/** Toggles the sheet. Call `event.preventDefault()` in `onClick` to handle the click yourself. */
|
|
155
|
+
function SplitSheetTrigger({ asChild = false, variant, size, className, type, onClick, ...props }) {
|
|
156
|
+
const { open, contentId, requestOpen } = useSplitSheetContext('SplitSheetTrigger');
|
|
157
|
+
const Comp = asChild ? Slot : 'button';
|
|
158
|
+
return (_jsx(Comp, { ...props, type: asChild ? type : (type ?? 'button'), "data-slot": "split-sheet-trigger", "data-state": open ? 'open' : 'closed', "aria-expanded": open, "aria-controls": open ? contentId : undefined,
|
|
159
|
+
// With `asChild` the child owns its styling — merging ours would double it.
|
|
160
|
+
className: asChild ? className : cn(triggerVariants({ variant, size }), className), onClick: (event) => {
|
|
161
|
+
onClick?.(event);
|
|
162
|
+
if (event.defaultPrevented)
|
|
163
|
+
return;
|
|
164
|
+
requestOpen(!open, {
|
|
165
|
+
from: event.currentTarget,
|
|
166
|
+
// `detail === 0` is an Enter/Space activation. Keyboard is never animated.
|
|
167
|
+
instant: event.detail === 0,
|
|
168
|
+
moveFocus: true,
|
|
169
|
+
});
|
|
170
|
+
} }));
|
|
171
|
+
}
|
|
172
|
+
function SplitSheetClose({ asChild = false, type, onClick, ...props }) {
|
|
173
|
+
const { requestOpen } = useSplitSheetContext('SplitSheetClose');
|
|
174
|
+
const Comp = asChild ? Slot : 'button';
|
|
175
|
+
return (_jsx(Comp, { "data-slot": "split-sheet-close", ...props, type: asChild ? type : (type ?? 'button'), onClick: (event) => {
|
|
176
|
+
onClick?.(event);
|
|
177
|
+
if (event.defaultPrevented)
|
|
178
|
+
return;
|
|
179
|
+
requestOpen(false);
|
|
180
|
+
} }));
|
|
181
|
+
}
|
|
182
|
+
/** The sheet column. Renders nothing while closed. Always include a `SplitSheetTitle`. */
|
|
183
|
+
function SplitSheetContent(props) {
|
|
184
|
+
const { open } = useSplitSheetContext('SplitSheetContent');
|
|
185
|
+
return open ? _jsx(SplitSheetPanel, { ...props }) : null;
|
|
186
|
+
}
|
|
187
|
+
function SplitSheetPanel({ className, onKeyDown, ...props }) {
|
|
188
|
+
const { instant, cover, contentId, titleId, requestOpen, focusOnOpenRef, restoreFocusRef } = useSplitSheetContext('SplitSheetContent');
|
|
189
|
+
const panelRef = React.useRef(null);
|
|
190
|
+
React.useLayoutEffect(() => {
|
|
191
|
+
const panel = panelRef.current;
|
|
192
|
+
restoreFocusRef.current = false;
|
|
193
|
+
if (panel && focusOnOpenRef.current) {
|
|
194
|
+
focusOnOpenRef.current = false;
|
|
195
|
+
panel.focus({ preventScroll: true });
|
|
196
|
+
}
|
|
197
|
+
return () => {
|
|
198
|
+
// Layout cleanup runs before React detaches the panel, so focus is still readable.
|
|
199
|
+
if (panel?.contains(document.activeElement))
|
|
200
|
+
restoreFocusRef.current = true;
|
|
201
|
+
};
|
|
202
|
+
}, [focusOnOpenRef, restoreFocusRef]);
|
|
203
|
+
const handleKeyDown = (event) => {
|
|
204
|
+
onKeyDown?.(event);
|
|
205
|
+
if (event.defaultPrevented || event.key !== 'Escape')
|
|
206
|
+
return;
|
|
207
|
+
// Escape inside a portaled menu or select bubbles here through the React
|
|
208
|
+
// tree. That Escape belongs to the menu, not the sheet — the guard `Modal` uses.
|
|
209
|
+
if (!event.currentTarget.contains(event.target) || hasOpenFloatingLayer())
|
|
210
|
+
return;
|
|
211
|
+
event.preventDefault();
|
|
212
|
+
requestOpen(false);
|
|
213
|
+
};
|
|
214
|
+
return (_jsx("aside", { "aria-labelledby": titleId, ...props, ref: panelRef, id: contentId, tabIndex: -1, "data-slot": "split-sheet-content", "data-state": "open", "data-instant": instant ? '' : undefined, onKeyDown: handleKeyDown, className: cn('bg-surface col-start-1 row-start-1 flex min-h-0 min-w-0 flex-col outline-none',
|
|
215
|
+
// `cover` keeps the panel on the page's own cell at every width.
|
|
216
|
+
!cover && '@3xl/split-sheet:col-start-2 @3xl/split-sheet:border-l',
|
|
217
|
+
// Enter only. The column itself snaps: animating grid tracks re-wraps
|
|
218
|
+
// the page on every frame. Reduced motion keeps the fade, drops the slide.
|
|
219
|
+
// `duration-(--duration-moderate)`, not `duration-moderate`: Tailwind 4 has
|
|
220
|
+
// no `--duration-*` theme namespace, so the bare token class emits no CSS.
|
|
221
|
+
'transition-[opacity,translate] duration-(--duration-moderate) ease-out starting:opacity-0 motion-safe:starting:translate-x-2', 'data-instant:transition-none', className) }));
|
|
222
|
+
}
|
|
223
|
+
function SplitSheetHeader({ className, children, showCloseButton = true, closeLabel = 'Close', ...props }) {
|
|
224
|
+
return (_jsxs("div", { "data-slot": "split-sheet-header", className: cn('flex shrink-0 items-start gap-3 border-b px-4 py-3', className), ...props, children: [_jsx("div", { className: "flex min-h-8 min-w-0 flex-1 flex-col justify-center gap-0.5 pointer-coarse:min-h-11", children: children }), showCloseButton ? (_jsx(Hint, { label: closeLabel, side: "bottom", sideOffset: 4, children: _jsx(SplitSheetClose, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-base", "aria-label": closeLabel, className: "-mr-1.5 shrink-0 pointer-coarse:size-11", children: _jsx(XIcon, { className: "size-4" }) }) }) })) : null] }));
|
|
225
|
+
}
|
|
226
|
+
function SplitSheetTitle({ className, ...props }) {
|
|
227
|
+
const { titleId } = useSplitSheetContext('SplitSheetTitle');
|
|
228
|
+
return (_jsx("h2", { id: titleId, "data-slot": "split-sheet-title", className: cn('text-foreground text-sm font-medium text-pretty wrap-break-word', className), ...props }));
|
|
229
|
+
}
|
|
230
|
+
function SplitSheetDescription({ className, ...props }) {
|
|
231
|
+
return (_jsx("p", { "data-slot": "split-sheet-description", className: cn('text-muted-foreground text-xs text-pretty wrap-break-word', className), ...props }));
|
|
232
|
+
}
|
|
233
|
+
function SplitSheetBody({ className, ...props }) {
|
|
234
|
+
return (_jsx("div", { "data-slot": "split-sheet-body", className: cn('min-h-0 flex-1 overflow-y-auto overscroll-contain px-4 py-5', className), ...props }));
|
|
235
|
+
}
|
|
236
|
+
function SplitSheetFooter({ className, ...props }) {
|
|
237
|
+
return (_jsx("div", { "data-slot": "split-sheet-footer", className: cn('flex shrink-0 flex-wrap items-center justify-end gap-2 border-t px-4 py-3', className), ...props }));
|
|
238
|
+
}
|
|
239
|
+
export { SplitSheet, SplitSheetBody, SplitSheetClose, SplitSheetContent, SplitSheetDescription, SplitSheetFooter, SplitSheetHeader, SplitSheetMain, SplitSheetTitle, SplitSheetTrigger, useSplitSheet, };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface SpotlightCardProps {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
spotlightColor?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function SpotlightCard({ children, className, spotlightColor }: SpotlightCardProps): React.JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../../lib/utils.js';
|
|
4
|
+
import { useRef, useState } from 'react';
|
|
5
|
+
export function SpotlightCard({ children, className, spotlightColor }) {
|
|
6
|
+
const cardRef = useRef(null);
|
|
7
|
+
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });
|
|
8
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
9
|
+
const handleMouseMove = (e) => {
|
|
10
|
+
if (!cardRef.current)
|
|
11
|
+
return;
|
|
12
|
+
const rect = cardRef.current.getBoundingClientRect();
|
|
13
|
+
setMousePosition({
|
|
14
|
+
x: e.clientX - rect.left,
|
|
15
|
+
y: e.clientY - rect.top,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
// Use custom color if provided, otherwise use CSS variables for light/dark mode
|
|
19
|
+
const spotlightBg = spotlightColor
|
|
20
|
+
? `radial-gradient(600px circle at var(--mouse-x) var(--mouse-y), ${spotlightColor}, transparent 40%)`
|
|
21
|
+
: undefined;
|
|
22
|
+
const borderGlowBg = spotlightColor
|
|
23
|
+
? `radial-gradient(400px circle at var(--mouse-x) var(--mouse-y), ${spotlightColor.replace('0.1', '0.2')}, transparent 40%)`
|
|
24
|
+
: undefined;
|
|
25
|
+
return (_jsxs("div", { ref: cardRef, onMouseMove: handleMouseMove, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), className: cn('relative overflow-hidden rounded-2xl', className), style: {
|
|
26
|
+
// @ts-expect-error - CSS custom properties are not in CSSProperties type
|
|
27
|
+
'--mouse-x': `${mousePosition.x}px`,
|
|
28
|
+
'--mouse-y': `${mousePosition.y}px`,
|
|
29
|
+
}, children: [isHovered && (_jsx("div", { className: cn('pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300', !spotlightColor &&
|
|
30
|
+
'bg-[radial-gradient(600px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(0,0,0,0.06),transparent_40%)] dark:bg-[radial-gradient(600px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(255,255,255,0.1),transparent_40%)]'), style: {
|
|
31
|
+
opacity: isHovered ? 1 : 0,
|
|
32
|
+
...(spotlightBg && { background: spotlightBg }),
|
|
33
|
+
} })), isHovered && (_jsx("div", { className: cn('pointer-events-none absolute inset-0 rounded-2xl opacity-0 transition-opacity duration-300', !spotlightColor &&
|
|
34
|
+
'bg-[radial-gradient(400px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(0,0,0,0.1),transparent_40%)] dark:bg-[radial-gradient(400px_circle_at_var(--mouse-x)_var(--mouse-y),rgba(255,255,255,0.2),transparent_40%)]'), style: {
|
|
35
|
+
opacity: isHovered ? 1 : 0,
|
|
36
|
+
...(borderGlowBg && { background: borderGlowBg }),
|
|
37
|
+
mask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',
|
|
38
|
+
WebkitMask: 'linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0)',
|
|
39
|
+
maskComposite: 'exclude',
|
|
40
|
+
WebkitMaskComposite: 'xor',
|
|
41
|
+
padding: '1px',
|
|
42
|
+
} })), _jsx("div", { className: "relative z-10", children: children })] }));
|
|
43
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one circle every status glyph in the app is drawn on.
|
|
3
|
+
*
|
|
4
|
+
* Three components render this ring — `Loading` (`variant="ring"`),
|
|
5
|
+
* `TodoStatusIcon`, and `PlanRing` — and they used to disagree about it. All
|
|
6
|
+
* three were nominally `size-4`, and all three painted something different:
|
|
7
|
+
*
|
|
8
|
+
* pending todo viewBox 16 r 6.3 stroke 1.5 → 14.1px disc, 1.50px stroke
|
|
9
|
+
* completed todo viewBox 256 r 104 (filled) → 13.0px disc (Phosphor)
|
|
10
|
+
* spinner viewBox 24 r 10 stroke 4 → 16.0px disc, 2.67px stroke
|
|
11
|
+
* plan ring viewBox 24 r 9.9 stroke 2 → 15.8px disc, 1.33px stroke
|
|
12
|
+
*
|
|
13
|
+
* Same class, four sizes, three weights. That is why the check read small and
|
|
14
|
+
* the spinner read fat next to each other. Sharing these numbers is what makes
|
|
15
|
+
* the states interchangeable: swap one glyph for another and only the *meaning*
|
|
16
|
+
* changes — the ink never moves.
|
|
17
|
+
*
|
|
18
|
+
* Lives in `components/ui` rather than beside the todo code because `Loading`
|
|
19
|
+
* is a ui primitive and a primitive must not import from a feature.
|
|
20
|
+
*/
|
|
21
|
+
export declare const STATUS_RING: {
|
|
22
|
+
/** Square viewBox. 16 so one user unit is one CSS pixel at `size-4`. */
|
|
23
|
+
readonly BOX: 16;
|
|
24
|
+
readonly CENTER: 8;
|
|
25
|
+
/** Ring centreline. */
|
|
26
|
+
readonly RADIUS: 6.3;
|
|
27
|
+
readonly STROKE: 1.5;
|
|
28
|
+
/** Dash pattern of the `pending` ring, in user units: a 3-long tick against a
|
|
29
|
+
* 6.4 pitch. This is also the plan ring's texture — see `plan-card.tsx`. */
|
|
30
|
+
readonly DASH: 3;
|
|
31
|
+
readonly GAP: 3.4;
|
|
32
|
+
};
|
|
33
|
+
/** Where the ring's ink actually ends: centreline + half the stroke. A filled
|
|
34
|
+
* state uses this as its radius, so a disc and a ring occupy the same circle
|
|
35
|
+
* rather than the disc sitting visibly inside it. */
|
|
36
|
+
export declare const STATUS_RING_OUTER_RADIUS: number;
|
|
37
|
+
/** Dash pitch, in user units. */
|
|
38
|
+
export declare const STATUS_RING_PITCH: number;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one circle every status glyph in the app is drawn on.
|
|
3
|
+
*
|
|
4
|
+
* Three components render this ring — `Loading` (`variant="ring"`),
|
|
5
|
+
* `TodoStatusIcon`, and `PlanRing` — and they used to disagree about it. All
|
|
6
|
+
* three were nominally `size-4`, and all three painted something different:
|
|
7
|
+
*
|
|
8
|
+
* pending todo viewBox 16 r 6.3 stroke 1.5 → 14.1px disc, 1.50px stroke
|
|
9
|
+
* completed todo viewBox 256 r 104 (filled) → 13.0px disc (Phosphor)
|
|
10
|
+
* spinner viewBox 24 r 10 stroke 4 → 16.0px disc, 2.67px stroke
|
|
11
|
+
* plan ring viewBox 24 r 9.9 stroke 2 → 15.8px disc, 1.33px stroke
|
|
12
|
+
*
|
|
13
|
+
* Same class, four sizes, three weights. That is why the check read small and
|
|
14
|
+
* the spinner read fat next to each other. Sharing these numbers is what makes
|
|
15
|
+
* the states interchangeable: swap one glyph for another and only the *meaning*
|
|
16
|
+
* changes — the ink never moves.
|
|
17
|
+
*
|
|
18
|
+
* Lives in `components/ui` rather than beside the todo code because `Loading`
|
|
19
|
+
* is a ui primitive and a primitive must not import from a feature.
|
|
20
|
+
*/
|
|
21
|
+
export const STATUS_RING = {
|
|
22
|
+
/** Square viewBox. 16 so one user unit is one CSS pixel at `size-4`. */
|
|
23
|
+
BOX: 16,
|
|
24
|
+
CENTER: 8,
|
|
25
|
+
/** Ring centreline. */
|
|
26
|
+
RADIUS: 6.3,
|
|
27
|
+
STROKE: 1.5,
|
|
28
|
+
/** Dash pattern of the `pending` ring, in user units: a 3-long tick against a
|
|
29
|
+
* 6.4 pitch. This is also the plan ring's texture — see `plan-card.tsx`. */
|
|
30
|
+
DASH: 3,
|
|
31
|
+
GAP: 3.4,
|
|
32
|
+
};
|
|
33
|
+
/** Where the ring's ink actually ends: centreline + half the stroke. A filled
|
|
34
|
+
* state uses this as its radius, so a disc and a ring occupy the same circle
|
|
35
|
+
* rather than the disc sitting visibly inside it. */
|
|
36
|
+
export const STATUS_RING_OUTER_RADIUS = STATUS_RING.RADIUS + STATUS_RING.STROKE / 2; // 7.05
|
|
37
|
+
/** Dash pitch, in user units. */
|
|
38
|
+
export const STATUS_RING_PITCH = STATUS_RING.DASH + STATUS_RING.GAP; // 6.4
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Kortix status palette — the SINGLE source of truth for "this means
|
|
4
|
+
* success / warning / error / info" coloring.
|
|
5
|
+
*
|
|
6
|
+
* The design system already encapsulates this palette inside `<Badge>` and
|
|
7
|
+
* `<InfoBanner>`. Use those whenever the surface is a chip or a box. But for
|
|
8
|
+
* the cases a component can't cover — a lone status icon, a diff +/- counter,
|
|
9
|
+
* a live activity dot — reach for these maps instead of re-inlining a palette
|
|
10
|
+
* class by hand (which is how shade drift creeps in).
|
|
11
|
+
*
|
|
12
|
+
* Hues follow D5 (kortix-brand color.md): success = kortix-green, warning =
|
|
13
|
+
* kortix-orange, destructive = kortix-red, info = kortix-blue. Accents fail AA
|
|
14
|
+
* as body text on white, so STATUS_TEXT paints glyphs and counters only; a
|
|
15
|
+
* label beside the glyph stays foreground.
|
|
16
|
+
*/
|
|
17
|
+
export type StatusTone = 'success' | 'warning' | 'destructive' | 'info' | 'neutral';
|
|
18
|
+
/** Foreground (text / icon) color per tone. */
|
|
19
|
+
export declare const STATUS_TEXT: Record<StatusTone, string>;
|
|
20
|
+
/** Faint tinted background per tone (for chips / fills). */
|
|
21
|
+
export declare const STATUS_BG: Record<StatusTone, string>;
|
|
22
|
+
/** Solid hairline border per tone. */
|
|
23
|
+
export declare const STATUS_BORDER: Record<StatusTone, string>;
|
|
24
|
+
/** Solid dot fill per tone (for the live activity indicator). */
|
|
25
|
+
export declare const STATUS_DOT: Record<StatusTone, string>;
|
|
26
|
+
export declare function statusText(tone: StatusTone): string;
|
|
27
|
+
/**
|
|
28
|
+
* A faint, tone-based status chip — the member of the status family for
|
|
29
|
+
* "this row/item is success/warning/error/info" labels.
|
|
30
|
+
*
|
|
31
|
+
* Use this (not `<Badge variant="destructive">`) for INFORMATIONAL status,
|
|
32
|
+
* because Badge's `destructive` variant is a SOLID red pill meant for
|
|
33
|
+
* actions — and "red is the brake, not the paint". StatusBadge keeps red
|
|
34
|
+
* faint and consistent with its success/warning/info siblings, sharing the
|
|
35
|
+
* same tone vocabulary as StatusDot / InfoBanner / DiffStat. Geometry matches
|
|
36
|
+
* `<Badge size="sm">` so the two are visually interchangeable for non-red tones.
|
|
37
|
+
*/
|
|
38
|
+
export declare function StatusBadge({ tone, className, children, ...props }: React.ComponentProps<'span'> & {
|
|
39
|
+
tone?: StatusTone;
|
|
40
|
+
}): React.JSX.Element;
|
|
41
|
+
/**
|
|
42
|
+
* A small solid status dot — the canonical replacement for hand-rolled
|
|
43
|
+
* `bg-emerald-500 animate-pulse` indicators.
|
|
44
|
+
*/
|
|
45
|
+
export declare function StatusDot({ tone, pulse, className, }: {
|
|
46
|
+
tone?: StatusTone;
|
|
47
|
+
pulse?: boolean;
|
|
48
|
+
className?: string;
|
|
49
|
+
}): React.JSX.Element;
|
|
50
|
+
/**
|
|
51
|
+
* Diff line-count summary — `+12 −3` in the DS success / destructive colors.
|
|
52
|
+
* Renders nothing when both counts are zero/absent.
|
|
53
|
+
*/
|
|
54
|
+
export declare function DiffStat({ additions, deletions, className, }: {
|
|
55
|
+
additions?: number;
|
|
56
|
+
deletions?: number;
|
|
57
|
+
className?: string;
|
|
58
|
+
}): React.JSX.Element | null;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../../lib/utils.js';
|
|
4
|
+
/** Foreground (text / icon) color per tone. */
|
|
5
|
+
export const STATUS_TEXT = {
|
|
6
|
+
success: 'text-kortix-green',
|
|
7
|
+
warning: 'text-kortix-orange',
|
|
8
|
+
destructive: 'text-kortix-red',
|
|
9
|
+
info: 'text-kortix-blue',
|
|
10
|
+
neutral: 'text-muted-foreground',
|
|
11
|
+
};
|
|
12
|
+
/** Faint tinted background per tone (for chips / fills). */
|
|
13
|
+
export const STATUS_BG = {
|
|
14
|
+
success: 'bg-kortix-green/15',
|
|
15
|
+
warning: 'bg-kortix-orange/15',
|
|
16
|
+
destructive: 'bg-kortix-red/15',
|
|
17
|
+
info: 'bg-kortix-blue/15',
|
|
18
|
+
neutral: 'bg-popover',
|
|
19
|
+
};
|
|
20
|
+
/** Solid hairline border per tone. */
|
|
21
|
+
export const STATUS_BORDER = {
|
|
22
|
+
success: 'border-kortix-green',
|
|
23
|
+
warning: 'border-kortix-orange',
|
|
24
|
+
destructive: 'border-kortix-red',
|
|
25
|
+
info: 'border-kortix-blue',
|
|
26
|
+
neutral: 'border-border',
|
|
27
|
+
};
|
|
28
|
+
/** Solid dot fill per tone (for the live activity indicator). */
|
|
29
|
+
export const STATUS_DOT = {
|
|
30
|
+
success: 'bg-kortix-green',
|
|
31
|
+
warning: 'bg-kortix-orange',
|
|
32
|
+
destructive: 'bg-kortix-red',
|
|
33
|
+
info: 'bg-kortix-blue',
|
|
34
|
+
neutral: 'bg-muted-foreground',
|
|
35
|
+
};
|
|
36
|
+
/** Tone color for an svg glyph inside a chip. The chip label stays foreground. */
|
|
37
|
+
const STATUS_CHIP_GLYPH = {
|
|
38
|
+
success: '[&>svg]:text-kortix-green',
|
|
39
|
+
warning: '[&>svg]:text-kortix-orange',
|
|
40
|
+
destructive: '[&>svg]:text-kortix-red',
|
|
41
|
+
info: '[&>svg]:text-kortix-blue',
|
|
42
|
+
neutral: '[&>svg]:text-muted-foreground',
|
|
43
|
+
};
|
|
44
|
+
export function statusText(tone) {
|
|
45
|
+
return STATUS_TEXT[tone];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A faint, tone-based status chip — the member of the status family for
|
|
49
|
+
* "this row/item is success/warning/error/info" labels.
|
|
50
|
+
*
|
|
51
|
+
* Use this (not `<Badge variant="destructive">`) for INFORMATIONAL status,
|
|
52
|
+
* because Badge's `destructive` variant is a SOLID red pill meant for
|
|
53
|
+
* actions — and "red is the brake, not the paint". StatusBadge keeps red
|
|
54
|
+
* faint and consistent with its success/warning/info siblings, sharing the
|
|
55
|
+
* same tone vocabulary as StatusDot / InfoBanner / DiffStat. Geometry matches
|
|
56
|
+
* `<Badge size="sm">` so the two are visually interchangeable for non-red tones.
|
|
57
|
+
*/
|
|
58
|
+
export function StatusBadge({ tone = 'neutral', className, children, ...props }) {
|
|
59
|
+
return (_jsx("span", { "data-slot": "status-badge", className: cn('text-foreground inline-flex w-fit items-center gap-1 rounded-md px-2 py-0.5 text-xs font-medium whitespace-nowrap', STATUS_BG[tone], STATUS_CHIP_GLYPH[tone], className), ...props, children: children }));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* A small solid status dot — the canonical replacement for hand-rolled
|
|
63
|
+
* `bg-emerald-500 animate-pulse` indicators.
|
|
64
|
+
*/
|
|
65
|
+
export function StatusDot({ tone = 'neutral', pulse = false, className, }) {
|
|
66
|
+
return (_jsx("span", { "data-slot": "status-dot", className: cn('inline-block size-2 shrink-0 rounded-full', STATUS_DOT[tone], pulse && 'animate-pulse', className) }));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Diff line-count summary — `+12 −3` in the DS success / destructive colors.
|
|
70
|
+
* Renders nothing when both counts are zero/absent.
|
|
71
|
+
*/
|
|
72
|
+
export function DiffStat({ additions, deletions, className, }) {
|
|
73
|
+
if (!additions && !deletions)
|
|
74
|
+
return null;
|
|
75
|
+
return (_jsxs("span", { "data-slot": "diff-stat", className: cn('inline-flex items-center gap-1.5 font-mono tabular-nums', className), children: [additions ? _jsxs("span", { className: STATUS_TEXT.success, children: ["+", additions] }) : null, deletions ? _jsx("span", { className: STATUS_TEXT.destructive, children: `−${deletions}` }) : null] }));
|
|
76
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
defaultValue?: number;
|
|
4
|
+
value?: number;
|
|
5
|
+
onValueChange?: (value: number) => void;
|
|
6
|
+
orientation?: 'horizontal' | 'vertical';
|
|
7
|
+
/** Total step count — lets StepperSeparator hide after the last step. */
|
|
8
|
+
count?: number;
|
|
9
|
+
}
|
|
10
|
+
declare function Stepper({ defaultValue, value, onValueChange, orientation, count, className, ...props }: StepperProps): React.JSX.Element;
|
|
11
|
+
interface StepperItemProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
12
|
+
step: number;
|
|
13
|
+
completed?: boolean;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
}
|
|
16
|
+
declare function StepperItem({ step, completed, disabled, className, children, ...props }: StepperItemProps): React.JSX.Element;
|
|
17
|
+
interface StepperTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
18
|
+
asChild?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare function StepperTrigger({ asChild, className, children, ...props }: StepperTriggerProps): React.JSX.Element;
|
|
21
|
+
interface StepperIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
22
|
+
asChild?: boolean;
|
|
23
|
+
}
|
|
24
|
+
declare function StepperIndicator({ asChild, className, children, ...props }: StepperIndicatorProps): React.JSX.Element;
|
|
25
|
+
declare function StepperTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): React.JSX.Element;
|
|
26
|
+
declare function StepperDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
|
|
27
|
+
declare function StepperSeparator({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element | null;
|
|
28
|
+
export { Stepper, StepperDescription, StepperIndicator, StepperItem, StepperSeparator, StepperTitle, StepperTrigger, };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { createContext, useContext } from 'react';
|
|
6
|
+
import { cn } from '../../lib/utils.js';
|
|
7
|
+
const StepperContext = createContext(undefined);
|
|
8
|
+
const StepItemContext = createContext(undefined);
|
|
9
|
+
const useStepper = () => {
|
|
10
|
+
const context = useContext(StepperContext);
|
|
11
|
+
if (!context) {
|
|
12
|
+
throw new Error('useStepper must be used within a Stepper');
|
|
13
|
+
}
|
|
14
|
+
return context;
|
|
15
|
+
};
|
|
16
|
+
const useStepItem = () => {
|
|
17
|
+
const context = useContext(StepItemContext);
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error('useStepItem must be used within a StepperItem');
|
|
20
|
+
}
|
|
21
|
+
return context;
|
|
22
|
+
};
|
|
23
|
+
function Stepper({ defaultValue = 0, value, onValueChange, orientation = 'horizontal', count, className, ...props }) {
|
|
24
|
+
const [activeStep, setInternalStep] = React.useState(defaultValue);
|
|
25
|
+
const setActiveStep = React.useCallback((step) => {
|
|
26
|
+
if (value === undefined) {
|
|
27
|
+
setInternalStep(step);
|
|
28
|
+
}
|
|
29
|
+
onValueChange?.(step);
|
|
30
|
+
}, [value, onValueChange]);
|
|
31
|
+
const currentStep = value ?? activeStep;
|
|
32
|
+
const contextValue = React.useMemo(() => ({
|
|
33
|
+
activeStep: currentStep,
|
|
34
|
+
setActiveStep,
|
|
35
|
+
orientation,
|
|
36
|
+
count,
|
|
37
|
+
}), [currentStep, setActiveStep, orientation, count]);
|
|
38
|
+
return (_jsx(StepperContext.Provider, { value: contextValue, children: _jsx("div", { "data-slot": "stepper", className: cn('group/stepper inline-flex data-[orientation=horizontal]:w-full data-[orientation=horizontal]:flex-row data-[orientation=vertical]:flex-col', className), "data-orientation": orientation, ...props }) }));
|
|
39
|
+
}
|
|
40
|
+
function StepperItem({ step, completed = false, disabled = false, className, children, ...props }) {
|
|
41
|
+
const { activeStep } = useStepper();
|
|
42
|
+
const state = completed || step < activeStep ? 'completed' : activeStep === step ? 'active' : 'inactive';
|
|
43
|
+
const itemContextValue = React.useMemo(() => ({ step, state, isDisabled: disabled }), [step, state, disabled]);
|
|
44
|
+
return (_jsx(StepItemContext.Provider, { value: itemContextValue, children: _jsx("div", { "data-slot": "stepper-item", className: cn('group/step flex items-center group-data-[orientation=horizontal]/stepper:flex-row group-data-[orientation=vertical]/stepper:flex-col group-data-[orientation=vertical]/stepper:justify-start group-data-[orientation=vertical]/stepper:self-stretch', className), "data-state": state, ...props, children: children }) }));
|
|
45
|
+
}
|
|
46
|
+
function StepperTrigger({ asChild = false, className, children, ...props }) {
|
|
47
|
+
const { setActiveStep } = useStepper();
|
|
48
|
+
const { step, isDisabled } = useStepItem();
|
|
49
|
+
if (asChild) {
|
|
50
|
+
const Comp = asChild ? Slot : 'span';
|
|
51
|
+
return (_jsx(Comp, { "data-slot": "stepper-trigger", className: className, children: children }));
|
|
52
|
+
}
|
|
53
|
+
return (_jsx("button", { "data-slot": "stepper-trigger", className: cn('focus-visible:border-ring focus-visible:ring-ring/50 inline-flex items-center gap-3 rounded-full outline-none focus-visible:z-10 focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50', className), onClick: () => setActiveStep(step), disabled: isDisabled, ...props, children: children }));
|
|
54
|
+
}
|
|
55
|
+
function StepperIndicator({ asChild = false, className, children, ...props }) {
|
|
56
|
+
const { state } = useStepItem();
|
|
57
|
+
return (_jsx("span", { "data-slot": "stepper-indicator", className: cn('bg-muted text-muted-foreground data-[state=active]:bg-secondary data-[state=completed]:bg-secondary data-[state=active]:text-secondary-foreground data-[state=completed]:text-secondary-foreground relative flex size-6 shrink-0 items-center justify-center rounded-full text-xs font-medium', className), "data-state": state, ...props, children: asChild ? children : children }));
|
|
58
|
+
}
|
|
59
|
+
function StepperTitle({ className, ...props }) {
|
|
60
|
+
return (_jsx("h3", { "data-slot": "stepper-title", className: cn('text-sm font-medium', className), ...props }));
|
|
61
|
+
}
|
|
62
|
+
function StepperDescription({ className, ...props }) {
|
|
63
|
+
return (_jsx("p", { "data-slot": "stepper-description", className: cn('text-muted-foreground text-sm', className), ...props }));
|
|
64
|
+
}
|
|
65
|
+
function StepperSeparator({ className, ...props }) {
|
|
66
|
+
const { count } = useStepper();
|
|
67
|
+
const stepItem = useContext(StepItemContext);
|
|
68
|
+
if (stepItem && count !== undefined && stepItem.step >= count) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return (_jsx("div", { "data-slot": "stepper-separator", className: cn('bg-secondary group-data-[state=completed]/step:bg-secondary m-0.5 group-data-[orientation=horizontal]/stepper:h-0.5 group-data-[orientation=horizontal]/stepper:w-full group-data-[orientation=horizontal]/stepper:flex-1 group-data-[orientation=vertical]/stepper:min-h-4 group-data-[orientation=vertical]/stepper:w-0.5 group-data-[orientation=vertical]/stepper:flex-1', className), ...props }));
|
|
72
|
+
}
|
|
73
|
+
export { Stepper, StepperDescription, StepperIndicator, StepperItem, StepperSeparator, StepperTitle, StepperTrigger, };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as SwitchPrimitive from '@radix-ui/react-switch';
|
|
2
|
+
import { type ComponentProps } from 'react';
|
|
3
|
+
type SwitchProps = Omit<ComponentProps<typeof SwitchPrimitive.Root>, 'asChild'> & {
|
|
4
|
+
label?: string;
|
|
5
|
+
};
|
|
6
|
+
declare const Switch: import("react").ForwardRefExoticComponent<Omit<SwitchProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
7
|
+
export { Switch };
|
|
8
|
+
export type { SwitchProps };
|