@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,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tint a project's GLYPH wears.
|
|
3
|
+
*
|
|
4
|
+
* Same treatment as an emoji tile — a pale `--color-glyph-fill-*` under a 1px
|
|
5
|
+
* `--color-glyph-ring-*` inset ring — so a glyph project and an emoji project
|
|
6
|
+
* read as one family in the grid. The difference is where the hue comes from:
|
|
7
|
+
* an emoji's is DERIVED from the glyph (emoji-tint.ts), a glyph's is CHOSEN by
|
|
8
|
+
* the user and stored alongside the name.
|
|
9
|
+
*
|
|
10
|
+
* The ring token also paints the glyph itself. A monochrome icon has no colour
|
|
11
|
+
* of its own, so the colour the user picked has to be visible somewhere the eye
|
|
12
|
+
* lands, and a 1px ring alone is too quiet to carry it.
|
|
13
|
+
*/
|
|
14
|
+
import { PROJECT_GLYPH_COLORS } from '../../_vendor/kortix-shared.js';
|
|
15
|
+
/**
|
|
16
|
+
* Every class below is a LITERAL string. Do not build one with a template
|
|
17
|
+
* literal or a .map(): Tailwind v4 extracts class names by scanning source
|
|
18
|
+
* TEXT, so an interpolated name emits no CSS at all and the tints silently
|
|
19
|
+
* never paint. That has already happened once on this feature.
|
|
20
|
+
*
|
|
21
|
+
* There is no `dark:` set — each token is a light-dark() pair and :root / .dark
|
|
22
|
+
* set color-scheme, so one class covers both themes.
|
|
23
|
+
*
|
|
24
|
+
* `border-0` is part of the tint, not the host's business: both hosts bring a
|
|
25
|
+
* 1px border of their own (EntityAvatar's base class list, Button's `outline`
|
|
26
|
+
* variant) and it would sit outside the inset ring as a grey second edge.
|
|
27
|
+
*/
|
|
28
|
+
const TINT = {
|
|
29
|
+
grey: 'border-0 bg-glyph-fill-grey inset-ring-1 inset-ring-glyph-ring-grey',
|
|
30
|
+
red: 'border-0 bg-glyph-fill-red inset-ring-1 inset-ring-glyph-ring-red',
|
|
31
|
+
orange: 'border-0 bg-glyph-fill-orange inset-ring-1 inset-ring-glyph-ring-orange',
|
|
32
|
+
yellow: 'border-0 bg-glyph-fill-yellow inset-ring-1 inset-ring-glyph-ring-yellow',
|
|
33
|
+
lime: 'border-0 bg-glyph-fill-lime inset-ring-1 inset-ring-glyph-ring-lime',
|
|
34
|
+
blue: 'border-0 bg-glyph-fill-blue inset-ring-1 inset-ring-glyph-ring-blue',
|
|
35
|
+
purple: 'border-0 bg-glyph-fill-purple inset-ring-1 inset-ring-glyph-ring-purple',
|
|
36
|
+
magenta: 'border-0 bg-glyph-fill-magenta inset-ring-1 inset-ring-glyph-ring-magenta',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The resting fill again, under `hover:`.
|
|
40
|
+
*
|
|
41
|
+
* Only an INTERACTIVE host needs it. Button's `outline` variant carries
|
|
42
|
+
* `hover:bg-foreground/5`, and a `:hover` rule outranks the resting
|
|
43
|
+
* `bg-glyph-fill-*` on specificity, so hovering the trigger would wipe the tint
|
|
44
|
+
* to a neutral wash. Restating the fill at the same modifier is what holds it.
|
|
45
|
+
*/
|
|
46
|
+
const TINT_HOVER = {
|
|
47
|
+
grey: 'hover:bg-glyph-fill-grey',
|
|
48
|
+
red: 'hover:bg-glyph-fill-red',
|
|
49
|
+
orange: 'hover:bg-glyph-fill-orange',
|
|
50
|
+
yellow: 'hover:bg-glyph-fill-yellow',
|
|
51
|
+
lime: 'hover:bg-glyph-fill-lime',
|
|
52
|
+
blue: 'hover:bg-glyph-fill-blue',
|
|
53
|
+
purple: 'hover:bg-glyph-fill-purple',
|
|
54
|
+
magenta: 'hover:bg-glyph-fill-magenta',
|
|
55
|
+
};
|
|
56
|
+
/** The glyph's own colour — the ring token, not the fill. */
|
|
57
|
+
const FOREGROUND = {
|
|
58
|
+
grey: 'text-glyph-ring-grey',
|
|
59
|
+
red: 'text-glyph-ring-red',
|
|
60
|
+
orange: 'text-glyph-ring-orange',
|
|
61
|
+
yellow: 'text-glyph-ring-yellow',
|
|
62
|
+
lime: 'text-glyph-ring-lime',
|
|
63
|
+
blue: 'text-glyph-ring-blue',
|
|
64
|
+
purple: 'text-glyph-ring-purple',
|
|
65
|
+
magenta: 'text-glyph-ring-magenta',
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Unknown colours resolve to grey rather than to an empty string.
|
|
69
|
+
*
|
|
70
|
+
* An empty string leaves an untinted, unringed tile, which reads as a rendering
|
|
71
|
+
* bug. Grey is a real member of the palette, so the fallback is
|
|
72
|
+
* indistinguishable from a deliberate choice. The server rejects colours
|
|
73
|
+
* outside the palette, so this only fires on stale cached data or a hand-edited
|
|
74
|
+
* row — exactly the cases where failing quietly and legibly is right.
|
|
75
|
+
*/
|
|
76
|
+
const FALLBACK = 'grey';
|
|
77
|
+
function resolve(color) {
|
|
78
|
+
return PROJECT_GLYPH_COLORS.includes(color)
|
|
79
|
+
? color
|
|
80
|
+
: FALLBACK;
|
|
81
|
+
}
|
|
82
|
+
/** The tile: fill + 1px inset ring, in the chosen colour. */
|
|
83
|
+
export function glyphTint(color) {
|
|
84
|
+
return TINT[resolve(color)];
|
|
85
|
+
}
|
|
86
|
+
/** Holds `glyphTint`'s fill through a host variant's own hover background. */
|
|
87
|
+
export function glyphTintHover(color) {
|
|
88
|
+
return TINT_HOVER[resolve(color)];
|
|
89
|
+
}
|
|
90
|
+
/** The glyph itself, in the ring colour. */
|
|
91
|
+
export function glyphForeground(color) {
|
|
92
|
+
return FOREGROUND[resolve(color)];
|
|
93
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Tooltip } from './tooltip.js';
|
|
2
|
+
export type HintProps = {
|
|
3
|
+
label?: React.ReactNode;
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
side?: 'top' | 'right' | 'bottom' | 'left';
|
|
6
|
+
align?: 'start' | 'center' | 'end';
|
|
7
|
+
sideOffset?: number;
|
|
8
|
+
alignOffset?: number;
|
|
9
|
+
className?: string;
|
|
10
|
+
content?: React.ReactNode;
|
|
11
|
+
} & React.ComponentProps<typeof Tooltip>;
|
|
12
|
+
declare const Hint: ({ label, children, className, side, align, sideOffset, alignOffset, content, ...props }: HintProps) => import("react").JSX.Element;
|
|
13
|
+
export { Hint };
|
|
14
|
+
export default Hint;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip.js';
|
|
3
|
+
const Hint = ({ label, children, className, side = 'right', align = 'center', sideOffset = 10, alignOffset = 10, content, ...props }) => {
|
|
4
|
+
return (
|
|
5
|
+
// Own provider, same 300ms delay as the app root's: Radix Tooltip.Root
|
|
6
|
+
// throws without one, and Hint rides along into trees rendered outside
|
|
7
|
+
// the app shell (SSR tests, portals). Nesting under the root provider is
|
|
8
|
+
// supported and harmless.
|
|
9
|
+
_jsx(TooltipProvider, { delayDuration: 300, children: _jsxs(Tooltip, { ...props, children: [_jsx(TooltipTrigger, { asChild: true, children: children }), _jsx(TooltipContent, { side: side, align: align, sideOffset: sideOffset, alignOffset: alignOffset, className: className, children: label ? label : content })] }) }));
|
|
10
|
+
};
|
|
11
|
+
export { Hint };
|
|
12
|
+
export default Hint;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The card's left offset in px: centred on bar `index` of `count` equal bars,
|
|
4
|
+
* clamped to `[0, stripWidth - cardWidth]` so it never clips at an edge.
|
|
5
|
+
*/
|
|
6
|
+
export declare function histogramCardOffset(index: number, count: number, stripWidth: number, cardWidth: number): number;
|
|
7
|
+
/** Where the hover card is and whether it is out. */
|
|
8
|
+
export interface CardState {
|
|
9
|
+
visible: boolean;
|
|
10
|
+
/** The bucket it shows; kept while it fades out. */
|
|
11
|
+
index: number | null;
|
|
12
|
+
/** Animate `translateX` to the next bucket (false: jump, as on first show). */
|
|
13
|
+
sliding: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare const HIDDEN_CARD: CardState;
|
|
16
|
+
/**
|
|
17
|
+
* The card's next state when the (debounced) hovered bucket changes:
|
|
18
|
+
* - pointer gone (`null`): hide, keep the last bucket for the fade-out;
|
|
19
|
+
* - card out: slide to the new bucket, an empty one too (it then reads "no runs");
|
|
20
|
+
* - card hidden: open on a bucket with data, in place, with no slide;
|
|
21
|
+
* a first hover on an empty bucket opens nothing.
|
|
22
|
+
*/
|
|
23
|
+
export declare function nextCardState(prev: CardState, shown: number | null, isEmpty: (index: number) => boolean): CardState;
|
|
24
|
+
export interface HistogramBar {
|
|
25
|
+
key: string | number;
|
|
26
|
+
ariaLabel: string;
|
|
27
|
+
/** No data in this bucket: a first hover opens no card; an open card reads it in one line. */
|
|
28
|
+
empty: boolean;
|
|
29
|
+
/** The drawn bar, inside a `group/bar` button that fills its slot. */
|
|
30
|
+
bar: ReactNode;
|
|
31
|
+
}
|
|
32
|
+
export declare function HistogramBars({ bars, onSelect, renderCard, className, }: {
|
|
33
|
+
bars: HistogramBar[];
|
|
34
|
+
onSelect?: (index: number) => void;
|
|
35
|
+
renderCard: (index: number) => ReactNode;
|
|
36
|
+
/** The strip's own classes: height, alignment, gap. */
|
|
37
|
+
className?: string;
|
|
38
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* The bar strip and hover card of a time histogram, shared by the Models page
|
|
5
|
+
* Logs histogram (`LogHistogram`) and the trigger Runs histogram
|
|
6
|
+
* (`RunHistogram`). The caller draws each bar and the card's content; this
|
|
7
|
+
* owns the hover behaviour:
|
|
8
|
+
*
|
|
9
|
+
* - The bar highlight follows the pointer at once (CSS `group-hover/bar`).
|
|
10
|
+
* - The hovered bucket is debounced (70 ms), so a sweep across the bars does
|
|
11
|
+
* not rebuild the card on every bar it crosses.
|
|
12
|
+
* - The card is ONE element. It moves between buckets by `translateX`,
|
|
13
|
+
* clamped so it never leaves the strip, and fades in with a 4 px y nudge.
|
|
14
|
+
* Opening from hidden does not slide from the last bucket. Reduced motion:
|
|
15
|
+
* opacity only.
|
|
16
|
+
* - The card hides only when the pointer leaves the chart (or focus leaves
|
|
17
|
+
* it). Moving between bars never hides it: it slides by `translateX` (+X
|
|
18
|
+
* right, −X left), and a CSS transition retargets mid-slide. Re-entering
|
|
19
|
+
* fades it in at the bar, with no slide from the old spot.
|
|
20
|
+
* - A first hover on an empty bucket opens nothing; an open card passing over
|
|
21
|
+
* one stays and shows the caller's one-line empty content.
|
|
22
|
+
* - Keyboard focus on a bar opens the same card.
|
|
23
|
+
*
|
|
24
|
+
* Motion: 150 ms (`--duration-normal`) on `--ease-default`, transform and
|
|
25
|
+
* opacity only (animations-dev: tooltips 125–200 ms, ease-out family).
|
|
26
|
+
*/
|
|
27
|
+
import { useDebounce } from '../../hooks/use-debounce.js';
|
|
28
|
+
import { cn } from '../../lib/utils.js';
|
|
29
|
+
import { useEffect, useRef, useState } from 'react';
|
|
30
|
+
/** How long the pointer has to rest on a bucket before the card follows it. */
|
|
31
|
+
const HOVER_DEBOUNCE_MS = 70;
|
|
32
|
+
/**
|
|
33
|
+
* The card's left offset in px: centred on bar `index` of `count` equal bars,
|
|
34
|
+
* clamped to `[0, stripWidth - cardWidth]` so it never clips at an edge.
|
|
35
|
+
*/
|
|
36
|
+
export function histogramCardOffset(index, count, stripWidth, cardWidth) {
|
|
37
|
+
if (count < 1 || stripWidth <= 0)
|
|
38
|
+
return 0;
|
|
39
|
+
const centre = ((index + 0.5) / count) * stripWidth;
|
|
40
|
+
const max = Math.max(0, stripWidth - cardWidth);
|
|
41
|
+
return Math.min(max, Math.max(0, centre - cardWidth / 2));
|
|
42
|
+
}
|
|
43
|
+
export const HIDDEN_CARD = { visible: false, index: null, sliding: false };
|
|
44
|
+
/**
|
|
45
|
+
* The card's next state when the (debounced) hovered bucket changes:
|
|
46
|
+
* - pointer gone (`null`): hide, keep the last bucket for the fade-out;
|
|
47
|
+
* - card out: slide to the new bucket, an empty one too (it then reads "no runs");
|
|
48
|
+
* - card hidden: open on a bucket with data, in place, with no slide;
|
|
49
|
+
* a first hover on an empty bucket opens nothing.
|
|
50
|
+
*/
|
|
51
|
+
export function nextCardState(prev, shown, isEmpty) {
|
|
52
|
+
if (shown === null)
|
|
53
|
+
return { ...prev, visible: false, sliding: false };
|
|
54
|
+
if (prev.visible)
|
|
55
|
+
return { visible: true, index: shown, sliding: true };
|
|
56
|
+
if (isEmpty(shown))
|
|
57
|
+
return prev;
|
|
58
|
+
return { visible: true, index: shown, sliding: false };
|
|
59
|
+
}
|
|
60
|
+
export function HistogramBars({ bars, onSelect, renderCard, className, }) {
|
|
61
|
+
const [active, setActive] = useState(null);
|
|
62
|
+
const { debouncedValue: shown } = useDebounce(active, HOVER_DEBOUNCE_MS);
|
|
63
|
+
// Derived from the previous render (React's "adjust state while rendering"):
|
|
64
|
+
// the card follows the debounced bucket through `nextCardState`.
|
|
65
|
+
const [card, setCard] = useState(HIDDEN_CARD);
|
|
66
|
+
const [prevShown, setPrevShown] = useState(null);
|
|
67
|
+
if (shown !== prevShown) {
|
|
68
|
+
setPrevShown(shown);
|
|
69
|
+
setCard(nextCardState(card, shown, (i) => bars[i]?.empty ?? true));
|
|
70
|
+
}
|
|
71
|
+
const cardIndex = card.index;
|
|
72
|
+
const sliding = card.sliding;
|
|
73
|
+
// Widths come from a ResizeObserver, so the clamp follows a resized column.
|
|
74
|
+
const [widths, setWidths] = useState({ strip: 0, card: 0 });
|
|
75
|
+
const stripRef = useRef(null);
|
|
76
|
+
const cardRef = useRef(null);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
const strip = stripRef.current;
|
|
79
|
+
const card = cardRef.current;
|
|
80
|
+
if (!strip || !card || typeof ResizeObserver === 'undefined')
|
|
81
|
+
return;
|
|
82
|
+
const measure = () => setWidths({ strip: strip.offsetWidth, card: card.offsetWidth });
|
|
83
|
+
const observer = new ResizeObserver(measure);
|
|
84
|
+
observer.observe(strip);
|
|
85
|
+
observer.observe(card);
|
|
86
|
+
return () => observer.disconnect();
|
|
87
|
+
}, []);
|
|
88
|
+
const x = cardIndex === null ? 0 : histogramCardOffset(cardIndex, bars.length, widths.strip, widths.card);
|
|
89
|
+
const visible = card.visible;
|
|
90
|
+
return (_jsxs("div", { className: "relative", onPointerLeave: () => setActive(null), children: [_jsx("div", { ref: stripRef, className: className, children: bars.map((b, i) => (_jsx("button", { type: "button", "aria-label": b.ariaLabel, onClick: () => onSelect?.(i), onPointerEnter: () => setActive(i), onFocus: () => setActive(i), onBlur: () => setActive(null), className: "group/bar flex h-full min-w-0 flex-1 cursor-pointer items-end outline-none", children: b.bar }, b.key))) }), _jsx("div", { ref: cardRef, "aria-hidden": true, style: { transform: `translateX(${x}px)` }, className: cn('pointer-events-none absolute top-full left-0 z-20 mt-1.5 w-60', 'bg-popover text-popover-foreground border-border rounded-lg border p-3 shadow-md', 'ease-default duration-(--duration-normal)', sliding ? 'transition-[transform,opacity,translate]' : 'transition-[opacity,translate]', 'motion-reduce:transition-opacity', visible
|
|
91
|
+
? 'translate-y-0 opacity-100'
|
|
92
|
+
: '-translate-y-1 opacity-0 motion-reduce:translate-y-0'), children: cardIndex !== null && cardIndex < bars.length ? renderCard(cardIndex) : null })] }));
|
|
93
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { HoverCard as HoverCardPrimitive } from 'radix-ui';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
declare function HoverCard({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Root>): React.JSX.Element;
|
|
4
|
+
declare function HoverCardTrigger({ ...props }: React.ComponentProps<typeof HoverCardPrimitive.Trigger>): React.JSX.Element;
|
|
5
|
+
/**
|
|
6
|
+
* The fifth panel to join `FLOATING_PANEL`.
|
|
7
|
+
*
|
|
8
|
+
* `menu-recipe.ts` reconciled the dropdown, context menu, select and popover
|
|
9
|
+
* surfaces onto one description of "a hairline-bordered card lifted off the
|
|
10
|
+
* canvas". This one was missed and kept its own `rounded-md` + `shadow-sm`,
|
|
11
|
+
* so a hover card sat a step flatter and 2px tighter than every other floating
|
|
12
|
+
* panel — which is why `token-progress.tsx` had to patch `shadow-md` back on at
|
|
13
|
+
* its call site. The recipe owns the surface and the enter/exit now.
|
|
14
|
+
*
|
|
15
|
+
* Two things stay local because they are this primitive's own: the transform
|
|
16
|
+
* origin (the Radix variable is named per primitive) and the `motion-reduce`
|
|
17
|
+
* guard, which no other panel ships and which must survive the move.
|
|
18
|
+
*
|
|
19
|
+
* `animated={false}` takes `FLOATING_PANEL_SURFACE` instead, the same split
|
|
20
|
+
* `MENU_PANEL_STATIC` makes for submenus, and for the same reason: a panel that
|
|
21
|
+
* opens INTO the path the pointer is already travelling spends its enter
|
|
22
|
+
* animation moving content away from the cursor, which reads as the card
|
|
23
|
+
* lagging behind the hand rather than as polish.
|
|
24
|
+
*/
|
|
25
|
+
declare function HoverCardContent({ className, align, sideOffset, animated, ...props }: React.ComponentProps<typeof HoverCardPrimitive.Content> & {
|
|
26
|
+
animated?: boolean;
|
|
27
|
+
}): React.JSX.Element;
|
|
28
|
+
export { HoverCard, HoverCardContent, HoverCardTrigger };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { HoverCard as HoverCardPrimitive } from 'radix-ui';
|
|
4
|
+
import { cn } from '../../lib/utils.js';
|
|
5
|
+
import { FLOATING_PANEL, FLOATING_PANEL_SURFACE } from './menu-recipe.js';
|
|
6
|
+
function HoverCard({ ...props }) {
|
|
7
|
+
return _jsx(HoverCardPrimitive.Root, { "data-slot": "hover-card", ...props });
|
|
8
|
+
}
|
|
9
|
+
function HoverCardTrigger({ ...props }) {
|
|
10
|
+
return _jsx(HoverCardPrimitive.Trigger, { "data-slot": "hover-card-trigger", ...props });
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The fifth panel to join `FLOATING_PANEL`.
|
|
14
|
+
*
|
|
15
|
+
* `menu-recipe.ts` reconciled the dropdown, context menu, select and popover
|
|
16
|
+
* surfaces onto one description of "a hairline-bordered card lifted off the
|
|
17
|
+
* canvas". This one was missed and kept its own `rounded-md` + `shadow-sm`,
|
|
18
|
+
* so a hover card sat a step flatter and 2px tighter than every other floating
|
|
19
|
+
* panel — which is why `token-progress.tsx` had to patch `shadow-md` back on at
|
|
20
|
+
* its call site. The recipe owns the surface and the enter/exit now.
|
|
21
|
+
*
|
|
22
|
+
* Two things stay local because they are this primitive's own: the transform
|
|
23
|
+
* origin (the Radix variable is named per primitive) and the `motion-reduce`
|
|
24
|
+
* guard, which no other panel ships and which must survive the move.
|
|
25
|
+
*
|
|
26
|
+
* `animated={false}` takes `FLOATING_PANEL_SURFACE` instead, the same split
|
|
27
|
+
* `MENU_PANEL_STATIC` makes for submenus, and for the same reason: a panel that
|
|
28
|
+
* opens INTO the path the pointer is already travelling spends its enter
|
|
29
|
+
* animation moving content away from the cursor, which reads as the card
|
|
30
|
+
* lagging behind the hand rather than as polish.
|
|
31
|
+
*/
|
|
32
|
+
function HoverCardContent({ className, align = 'center', sideOffset = 4, animated = true, ...props }) {
|
|
33
|
+
return (_jsx(HoverCardPrimitive.Portal, { "data-slot": "hover-card-portal", children: _jsx(HoverCardPrimitive.Content, { "data-slot": "hover-card-content", align: align, sideOffset: sideOffset, className: cn(animated ? FLOATING_PANEL : FLOATING_PANEL_SURFACE, 'z-50 w-64 origin-(--radix-hover-card-content-transform-origin) p-4 outline-hidden motion-reduce:animate-none motion-reduce:transition-none', className), ...props }) }));
|
|
34
|
+
}
|
|
35
|
+
export { HoverCard, HoverCardContent, HoverCardTrigger };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The size a class-less icon renders at. Tailwind size classes and an explicit
|
|
3
|
+
* `size` prop both still win, so this only reaches icons that ask for nothing.
|
|
4
|
+
*
|
|
5
|
+
* Exported because the provider's tests have to rebuild the exact markup this
|
|
6
|
+
* context produces. They previously hard-coded the number, so changing it here
|
|
7
|
+
* failed them from a file that never mentions icons — the failure named the
|
|
8
|
+
* weight, which was not what had moved.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_ICON_SIZE = 32;
|
|
11
|
+
/**
|
|
12
|
+
* Applies the app-wide icon weight (packages/ui/src/lib/icon-config.ts; the
|
|
13
|
+
* apps/web path src/lib/icons/icon-config.ts is a shim) to every
|
|
14
|
+
* Phosphor icon in the client tree — identically in development and
|
|
15
|
+
* production. Icons never need a weight prop; the only intentional override
|
|
16
|
+
* is weight="fill" on solid/status icons.
|
|
17
|
+
*
|
|
18
|
+
* Server components can't read context — they import pre-bound icons from
|
|
19
|
+
* '@/lib/icons/ssr' instead.
|
|
20
|
+
*/
|
|
21
|
+
export declare function IconProvider({ children }: {
|
|
22
|
+
children: React.ReactNode;
|
|
23
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { IconContext } from '@phosphor-icons/react';
|
|
4
|
+
import { DEFAULT_ICON_WEIGHT } from '../../lib/icon-config.js';
|
|
5
|
+
/**
|
|
6
|
+
* The size a class-less icon renders at. Tailwind size classes and an explicit
|
|
7
|
+
* `size` prop both still win, so this only reaches icons that ask for nothing.
|
|
8
|
+
*
|
|
9
|
+
* Exported because the provider's tests have to rebuild the exact markup this
|
|
10
|
+
* context produces. They previously hard-coded the number, so changing it here
|
|
11
|
+
* failed them from a file that never mentions icons — the failure named the
|
|
12
|
+
* weight, which was not what had moved.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_ICON_SIZE = 32;
|
|
15
|
+
/* Frozen at module scope: the value never changes at runtime, so the provider
|
|
16
|
+
never re-renders its subtree and the identity stays stable across renders. */
|
|
17
|
+
const ICON_DEFAULTS = { weight: DEFAULT_ICON_WEIGHT, size: DEFAULT_ICON_SIZE };
|
|
18
|
+
/**
|
|
19
|
+
* Applies the app-wide icon weight (packages/ui/src/lib/icon-config.ts; the
|
|
20
|
+
* apps/web path src/lib/icons/icon-config.ts is a shim) to every
|
|
21
|
+
* Phosphor icon in the client tree — identically in development and
|
|
22
|
+
* production. Icons never need a weight prop; the only intentional override
|
|
23
|
+
* is weight="fill" on solid/status icons.
|
|
24
|
+
*
|
|
25
|
+
* Server components can't read context — they import pre-bound icons from
|
|
26
|
+
* '@/lib/icons/ssr' instead.
|
|
27
|
+
*/
|
|
28
|
+
export function IconProvider({ children }) {
|
|
29
|
+
return _jsx(IconContext.Provider, { value: ICON_DEFAULTS, children: children });
|
|
30
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type StatusTone } from './status.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export type InfoBannerIcon = React.ComponentType<{
|
|
4
|
+
className?: string;
|
|
5
|
+
}> | React.ReactElement<{
|
|
6
|
+
className?: string;
|
|
7
|
+
}>;
|
|
8
|
+
export interface InfoBannerProps extends Omit<React.ComponentProps<'div'>, 'title'> {
|
|
9
|
+
tone?: StatusTone;
|
|
10
|
+
icon?: InfoBannerIcon;
|
|
11
|
+
title?: React.ReactNode;
|
|
12
|
+
action?: React.ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare function InfoBanner({ tone, icon, title, action, className, children, ...props }: InfoBannerProps): React.JSX.Element;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Alert, AlertActions, AlertDescription, AlertMedia, AlertTitle, } from './alert.js';
|
|
4
|
+
import { cn } from '../../lib/utils.js';
|
|
5
|
+
import { cva } from 'class-variance-authority';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Tone is carried by a /15 fill and the icon, never by the text. The 25% fill
|
|
9
|
+
* with a solid-tone title it replaced (Marko, 2026-09-03: "never readable on
|
|
10
|
+
* the core component") put orange type on a beige ground at ~2:1. Text is
|
|
11
|
+
* foreground on every tone. A filled banner has no border color: one boundary,
|
|
12
|
+
* a fill or a hairline, never both (color.md). Hues follow D5: info = blue,
|
|
13
|
+
* success = green, warning = orange, destructive = red.
|
|
14
|
+
*/
|
|
15
|
+
const infoBannerVariants = cva('group/item flex flex-wrap items-center gap-2 rounded-md border px-2.5 py-2 text-sm [&_[data-slot=alert-content]]:gap-1', {
|
|
16
|
+
variants: {
|
|
17
|
+
tone: {
|
|
18
|
+
neutral: 'border-border bg-popover',
|
|
19
|
+
info: 'bg-kortix-blue/15 border-transparent',
|
|
20
|
+
success: 'bg-kortix-green/15 border-transparent',
|
|
21
|
+
warning: 'bg-kortix-orange/15 border-transparent',
|
|
22
|
+
destructive: 'bg-kortix-red/15 border-transparent',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: {
|
|
26
|
+
tone: 'neutral',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
/** The title is always foreground — the tone is the fill and the icon. */
|
|
30
|
+
const infoBannerTitleVariants = cva('text-foreground w-full max-w-full font-medium', {
|
|
31
|
+
variants: {
|
|
32
|
+
tone: {
|
|
33
|
+
neutral: '',
|
|
34
|
+
info: '',
|
|
35
|
+
success: '',
|
|
36
|
+
warning: '',
|
|
37
|
+
destructive: '',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
defaultVariants: {
|
|
41
|
+
tone: 'neutral',
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
/** Status icon tile — mirrors the sandbox template state indicator. */
|
|
45
|
+
const infoBannerMediaVariants = cva('mt-0 group-has-[[data-slot=item-description]]/item:translate-y-0.5 inline-flex size-7 shrink-0 items-center justify-center self-start [&_svg]:pointer-events-none [&_svg]:size-6 [&_svg]:shrink-0', {
|
|
46
|
+
variants: {
|
|
47
|
+
tone: {
|
|
48
|
+
neutral: 'text-muted-foreground border-border',
|
|
49
|
+
info: 'text-kortix-blue',
|
|
50
|
+
success: 'text-kortix-green',
|
|
51
|
+
warning: 'text-kortix-orange',
|
|
52
|
+
destructive: 'text-kortix-red',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
defaultVariants: {
|
|
56
|
+
tone: 'neutral',
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
const infoBannerIconVariants = cva('size-6 shrink-0');
|
|
60
|
+
function renderBannerIcon(icon, className) {
|
|
61
|
+
if (React.isValidElement(icon)) {
|
|
62
|
+
return React.cloneElement(icon, {
|
|
63
|
+
className: cn(className, icon.props.className),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const IconComponent = icon;
|
|
67
|
+
return _jsx(IconComponent, { className: className });
|
|
68
|
+
}
|
|
69
|
+
export function InfoBanner({ tone = 'neutral', icon, title, action, className, children, ...props }) {
|
|
70
|
+
const safeTone = tone ?? 'neutral';
|
|
71
|
+
return (_jsxs(Alert, { variant: "default", className: cn(infoBannerVariants({ tone: safeTone }), className), ...props, children: [icon != null && (_jsx(AlertMedia, { className: infoBannerMediaVariants({ tone: safeTone }), children: renderBannerIcon(icon, infoBannerIconVariants()) })), title != null && (_jsx(AlertTitle, { className: cn(infoBannerTitleVariants({ tone: safeTone }), 'line-clamp-1 min-h-4 leading-snug font-medium tracking-tight'), children: title })), children != null && (_jsx(AlertDescription, { className: "text-muted-foreground leading-normal font-medium [&_p]:leading-relaxed", children: children })), action != null && _jsx(AlertActions, { children: action })] }));
|
|
72
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../../lib/utils.js';
|
|
4
|
+
import { Children, Fragment, isValidElement } from 'react';
|
|
5
|
+
export function InlineMeta({ className, children }) {
|
|
6
|
+
const items = Children.toArray(children).filter((c) => c !== null && c !== undefined && c !== '');
|
|
7
|
+
return (_jsx("div", { className: cn('text-muted-foreground/70 flex items-center gap-2 text-xs', 'min-w-0', className), children: items.map((child, i) => (_jsxs(Fragment, { children: [i > 0 && _jsx("span", { className: "text-muted-foreground/30", children: "\u00B7" }), _jsx("span", { className: "truncate", children: child })] }, isValidElement(child) ? (child.key ?? i) : i))) }));
|
|
8
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Button } from './button.js';
|
|
4
|
+
import { InputProps } from './input.js';
|
|
5
|
+
declare function InputGroup({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
6
|
+
declare const inputGroupAddonVariants: (props?: ({
|
|
7
|
+
align?: "inline-end" | "inline-start" | "block-end" | "block-start" | null | undefined;
|
|
8
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
9
|
+
declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
|
|
10
|
+
declare const inputGroupButtonVariants: (props?: ({
|
|
11
|
+
size?: "xs" | "sm" | "icon-xs" | "icon-sm" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'size'> & VariantProps<typeof inputGroupButtonVariants>): React.JSX.Element;
|
|
14
|
+
declare function InputGroupInput({ className, ...props }: InputProps): React.JSX.Element;
|
|
15
|
+
declare function InputGroupSearch({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
16
|
+
declare function InputGroupSearchIcon({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
17
|
+
declare function InputGroupSearchInput({ className, variant, size, ...props }: InputProps): React.JSX.Element;
|
|
18
|
+
declare function InputGroupSearchClear({ className, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, 'children'>): React.JSX.Element;
|
|
19
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { Button } from './button.js';
|
|
5
|
+
import { Input, inputSurfaceClasses, inputTransitionClasses, } from './input.js';
|
|
6
|
+
import { Close } from '../../icons/close.js';
|
|
7
|
+
import { cn } from '../../lib/utils.js';
|
|
8
|
+
function InputGroup({ className, ...props }) {
|
|
9
|
+
return (_jsx("div", { "data-slot": "input-group", role: "group", className: cn('group/input-group relative flex w-full items-center outline-none', inputSurfaceClasses, inputTransitionClasses, 'h-9 min-w-0 has-[>textarea]:h-auto',
|
|
10
|
+
// Variants based on alignment.
|
|
11
|
+
'has-[>[data-align=inline-start]]:[&>input]:pl-2', 'has-[>[data-align=inline-end]]:[&>input]:pr-2', 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3', 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3',
|
|
12
|
+
// Focus state.
|
|
13
|
+
// Focus state — the same border + halo as `Input`, drawn on the group
|
|
14
|
+
// so addons sit inside the ring rather than beside it.
|
|
15
|
+
'has-[[data-slot=input-group-control]:focus]:border-ring has-[[data-slot=input-group-control]:focus]:ring-ring/15 has-[[data-slot=input-group-control]:focus]:ring-3',
|
|
16
|
+
// Error state.
|
|
17
|
+
'has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-destructive/15 has-[[data-slot][aria-invalid=true]]:ring-3', className), ...props }));
|
|
18
|
+
}
|
|
19
|
+
const inputGroupAddonVariants = cva("flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4", {
|
|
20
|
+
variants: {
|
|
21
|
+
align: {
|
|
22
|
+
'inline-start': 'order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]',
|
|
23
|
+
'inline-end': 'order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]',
|
|
24
|
+
'block-start': 'order-first w-full justify-start px-3 pt-3 group-has-[>input]/input-group:pt-2.5 [.border-b]:pb-3',
|
|
25
|
+
'block-end': 'order-last w-full justify-start px-3 pb-3 group-has-[>input]/input-group:pb-2.5 [.border-t]:pt-3',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: {
|
|
29
|
+
align: 'inline-start',
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
function InputGroupAddon({ className, align = 'inline-start', ...props }) {
|
|
33
|
+
return (_jsx("div", { role: "group", "data-slot": "input-group-addon", "data-align": align, className: cn(inputGroupAddonVariants({ align }), className), onClick: (e) => {
|
|
34
|
+
if (e.target.closest('button')) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
e.currentTarget.parentElement?.querySelector('input')?.focus();
|
|
38
|
+
}, ...props }));
|
|
39
|
+
}
|
|
40
|
+
const inputGroupButtonVariants = cva('flex items-center gap-2 text-sm shadow-none', {
|
|
41
|
+
variants: {
|
|
42
|
+
size: {
|
|
43
|
+
xs: "h-6 gap-1 rounded-[calc(var(--radius)-5px)] px-2 has-[>svg]:px-2 [&>svg:not([class*='size-'])]:size-3.5",
|
|
44
|
+
sm: 'h-8 gap-1.5 rounded-md px-2.5 has-[>svg]:px-2.5',
|
|
45
|
+
'icon-xs': 'size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0',
|
|
46
|
+
'icon-sm': 'size-8 p-0 has-[>svg]:p-0',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
defaultVariants: {
|
|
50
|
+
size: 'xs',
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
function InputGroupButton({ className, type = 'button', variant = 'ghost', size = 'xs', ...props }) {
|
|
54
|
+
return (_jsx(Button, { type: type, "data-size": size, variant: variant, className: cn(inputGroupButtonVariants({ size }), className), ...props }));
|
|
55
|
+
}
|
|
56
|
+
function InputGroupInput({ className, ...props }) {
|
|
57
|
+
return (_jsx(Input, { "data-slot": "input-group-control", className: cn(
|
|
58
|
+
// The group paints the surface, border and ring; the control is bare.
|
|
59
|
+
'flex-1 rounded-none border-0 bg-transparent shadow-none', 'focus:ring-0 focus:outline-none aria-invalid:ring-0', className), ...props }));
|
|
60
|
+
}
|
|
61
|
+
function InputGroupSearch({ className, ...props }) {
|
|
62
|
+
return (_jsx("div", { "data-slot": "input-group-search", className: cn('relative w-full', className), ...props }));
|
|
63
|
+
}
|
|
64
|
+
function InputGroupSearchIcon({ className, ...props }) {
|
|
65
|
+
return (_jsx("div", { "data-slot": "input-group-search-icon", "aria-hidden": "true", className: cn('text-muted-foreground pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 [&_svg:not([class*="size-"])]:size-4', className), ...props }));
|
|
66
|
+
}
|
|
67
|
+
function InputGroupSearchInput({ className, variant = 'transparent', size = 'md', ...props }) {
|
|
68
|
+
return (_jsx(Input, { "data-slot": "input-group-search-control", variant: variant, size: size, className: cn('peer placeholder:text-muted-foreground/60 pl-9', className), ...props }));
|
|
69
|
+
}
|
|
70
|
+
function InputGroupSearchClear({ className, variant = 'ghost', size = 'icon', ...props }) {
|
|
71
|
+
return (_jsx(Button, { type: "button", variant: variant, size: size, "aria-label": "Clear", "data-slot": "input-group-search-clear", className: cn('absolute top-1/2 right-2 size-6 -translate-y-1/2 rounded-sm opacity-0 peer-focus:opacity-100', className), ...props, children: _jsx(Close, { className: "text-muted-foreground size-4" }) }));
|
|
72
|
+
}
|
|
73
|
+
export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupSearch, InputGroupSearchClear, InputGroupSearchIcon, InputGroupSearchInput, };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The one field surface every text input on the web shares — `Input`,
|
|
4
|
+
* `InputGroup`, `Textarea`, and the search field all read these, so a field
|
|
5
|
+
* looks the same on a white page, a gray card, or inside a modal.
|
|
6
|
+
*
|
|
7
|
+
* `bg-popover` is the top surface in both themes (white / #141414), so the well
|
|
8
|
+
* lifts off any substrate instead of sinking into a `bg-card` panel the way the
|
|
9
|
+
* old `bg-input` fill did. Focus is the `ring` token twice: a solid 1px border
|
|
10
|
+
* plus a 3px 15% halo.
|
|
11
|
+
*/
|
|
12
|
+
declare const inputSurfaceClasses = "bg-popover border-border rounded-md border";
|
|
13
|
+
declare const inputFocusClasses = "focus:border-ring focus:ring-ring/15 focus:ring-3 focus:outline-none";
|
|
14
|
+
declare const inputInvalidClasses = "aria-invalid:border-destructive aria-invalid:ring-destructive/15 aria-invalid:ring-3 aria-invalid:motion-safe:animate-shake";
|
|
15
|
+
/** Border and halo change on every focus move, so they swap fast and never move layout. */
|
|
16
|
+
declare const inputTransitionClasses = "transition-[border-color,box-shadow] duration-(--duration-fast) ease-out motion-reduce:transition-none";
|
|
17
|
+
export type InputProps = Omit<React.ComponentProps<'input'>, 'size'> & {
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Every input renders the same surface. Kept so existing
|
|
20
|
+
* callers compile; the value is ignored.
|
|
21
|
+
*/
|
|
22
|
+
variant?: 'default' | 'secondary' | 'transparent' | 'popover';
|
|
23
|
+
size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
24
|
+
};
|
|
25
|
+
declare function Input({ className, type, variant: _variant, size, ...props }: InputProps): React.JSX.Element;
|
|
26
|
+
export { Input, inputFocusClasses, inputInvalidClasses, inputSurfaceClasses, inputTransitionClasses, };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '../../lib/utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* The one field surface every text input on the web shares — `Input`,
|
|
5
|
+
* `InputGroup`, `Textarea`, and the search field all read these, so a field
|
|
6
|
+
* looks the same on a white page, a gray card, or inside a modal.
|
|
7
|
+
*
|
|
8
|
+
* `bg-popover` is the top surface in both themes (white / #141414), so the well
|
|
9
|
+
* lifts off any substrate instead of sinking into a `bg-card` panel the way the
|
|
10
|
+
* old `bg-input` fill did. Focus is the `ring` token twice: a solid 1px border
|
|
11
|
+
* plus a 3px 15% halo.
|
|
12
|
+
*/
|
|
13
|
+
const inputSurfaceClasses = 'bg-popover border-border rounded-md border';
|
|
14
|
+
const inputFocusClasses = 'focus:border-ring focus:ring-ring/15 focus:ring-3 focus:outline-none';
|
|
15
|
+
const inputInvalidClasses = 'aria-invalid:border-destructive aria-invalid:ring-destructive/15 aria-invalid:ring-3 aria-invalid:motion-safe:animate-shake';
|
|
16
|
+
/** Border and halo change on every focus move, so they swap fast and never move layout. */
|
|
17
|
+
const inputTransitionClasses = 'transition-[border-color,box-shadow] duration-(--duration-fast) ease-out motion-reduce:transition-none';
|
|
18
|
+
function Input({ className, type, variant: _variant, size = 'sm', ...props }) {
|
|
19
|
+
return (_jsx("input", { type: type, "data-slot": "input", className: cn(inputSurfaceClasses, inputFocusClasses, inputInvalidClasses, inputTransitionClasses, 'text-foreground file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground flex h-10 w-full min-w-0 px-3 py-1 text-sm font-medium file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50', type === 'search' &&
|
|
20
|
+
'[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none [&::-webkit-search-results-button]:appearance-none [&::-webkit-search-results-decoration]:appearance-none', type === 'file' &&
|
|
21
|
+
'text-muted-foreground file:border-border file:text-foreground p-0 pr-3 italic file:me-3 file:h-full file:border-0 file:border-r file:border-solid file:bg-transparent file:px-3 file:text-sm file:font-medium file:not-italic', size === 'xs' && 'h-8 text-xs', size === 'sm' && 'h-9 text-sm', size === 'md' && 'h-10 text-sm', size === 'lg' && 'h-11 text-sm', size === 'xl' && 'h-12 text-base', className), ...props }));
|
|
22
|
+
}
|
|
23
|
+
export { Input, inputFocusClasses, inputInvalidClasses, inputSurfaceClasses, inputTransitionClasses, };
|