@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,24 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as ResizablePrimitive from 'react-resizable-panels';
|
|
3
|
+
declare function ResizablePanelGroup({ className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>): React.JSX.Element;
|
|
4
|
+
declare const ResizablePanel: React.ForwardRefExoticComponent<Omit<Omit<React.HTMLAttributes<HTMLAnchorElement | HTMLElement | HTMLButtonElement | HTMLFormElement | HTMLSpanElement | HTMLDivElement | HTMLParagraphElement | HTMLImageElement | HTMLInputElement | HTMLTextAreaElement | HTMLLabelElement | HTMLObjectElement | HTMLSlotElement | HTMLStyleElement | HTMLTitleElement | HTMLDialogElement | HTMLLinkElement | HTMLOptionElement | HTMLTableElement | HTMLTimeElement | HTMLMapElement | HTMLBaseElement | HTMLAreaElement | HTMLAudioElement | HTMLQuoteElement | HTMLBodyElement | HTMLBRElement | HTMLCanvasElement | HTMLTableColElement | HTMLDataElement | HTMLDataListElement | HTMLModElement | HTMLDetailsElement | HTMLDListElement | HTMLEmbedElement | HTMLFieldSetElement | HTMLHeadingElement | HTMLHeadElement | HTMLHRElement | HTMLHtmlElement | HTMLIFrameElement | HTMLLegendElement | HTMLLIElement | HTMLMetaElement | HTMLMeterElement | HTMLOListElement | HTMLOptGroupElement | HTMLOutputElement | HTMLPreElement | HTMLProgressElement | HTMLScriptElement | HTMLSelectElement | HTMLSourceElement | HTMLTemplateElement | HTMLTableSectionElement | HTMLTableCellElement | HTMLTableRowElement | HTMLTrackElement | HTMLUListElement | HTMLVideoElement | HTMLMenuElement | HTMLTableCaptionElement | HTMLPictureElement>, "id" | "onResize"> & {
|
|
5
|
+
className?: string;
|
|
6
|
+
collapsedSize?: number | undefined;
|
|
7
|
+
collapsible?: boolean | undefined;
|
|
8
|
+
defaultSize?: number | undefined;
|
|
9
|
+
id?: string;
|
|
10
|
+
maxSize?: number | undefined;
|
|
11
|
+
minSize?: number | undefined;
|
|
12
|
+
onCollapse?: ResizablePrimitive.PanelOnCollapse;
|
|
13
|
+
onExpand?: ResizablePrimitive.PanelOnExpand;
|
|
14
|
+
onResize?: ResizablePrimitive.PanelOnResize;
|
|
15
|
+
order?: number;
|
|
16
|
+
style?: object;
|
|
17
|
+
tagName?: keyof HTMLElementTagNameMap | undefined;
|
|
18
|
+
} & {
|
|
19
|
+
children?: import("react").ReactNode | undefined;
|
|
20
|
+
} & React.RefAttributes<ResizablePrimitive.ImperativePanelHandle>, "ref"> & React.RefAttributes<ResizablePrimitive.ImperativePanelHandle>>;
|
|
21
|
+
declare function ResizableHandle({ withHandle, className, ...props }: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
|
|
22
|
+
withHandle?: boolean;
|
|
23
|
+
}): React.JSX.Element;
|
|
24
|
+
export { ResizableHandle, ResizablePanel, ResizablePanelGroup };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import * as ResizablePrimitive from 'react-resizable-panels';
|
|
5
|
+
import { cn } from '../../lib/utils.js';
|
|
6
|
+
function ResizablePanelGroup({ className, ...props }) {
|
|
7
|
+
return (_jsx(ResizablePrimitive.PanelGroup, { "data-slot": "resizable-panel-group", className: cn('flex h-full w-full data-[panel-group-direction=vertical]:flex-col', className), ...props }));
|
|
8
|
+
}
|
|
9
|
+
const ResizablePanel = React.forwardRef((props, ref) => {
|
|
10
|
+
return _jsx(ResizablePrimitive.Panel, { ref: ref, "data-slot": "resizable-panel", ...props });
|
|
11
|
+
});
|
|
12
|
+
ResizablePanel.displayName = 'ResizablePanel';
|
|
13
|
+
function ResizableHandle({ withHandle, className, ...props }) {
|
|
14
|
+
return (_jsx(ResizablePrimitive.PanelResizeHandle, { "data-slot": "resizable-handle", className: cn('focus-visible:ring-ring relative flex cursor-col-resize items-center justify-center focus-visible:ring-1 focus-visible:ring-offset-1 focus-visible:outline-hidden data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:cursor-row-resize [&[data-panel-group-direction=vertical]>div]:rotate-90', className), ...props, children: withHandle && (_jsx("div", { className: "group z-10 flex cursor-col-resize items-center justify-center", children: _jsx("span", { className: "bg-muted-foreground/40 group-hover:bg-muted-foreground/70 h-[15px] w-[3px] rounded-full transition-colors" }) })) }));
|
|
15
|
+
}
|
|
16
|
+
export { ResizableHandle, ResizablePanel, ResizablePanelGroup };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
declare function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.Root>): React.JSX.Element;
|
|
4
|
+
declare function ScrollBar({ className, orientation, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>): React.JSX.Element;
|
|
5
|
+
export { ScrollArea, ScrollBar };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
|
|
4
|
+
import { cn } from '../../lib/utils.js';
|
|
5
|
+
function ScrollArea({ className, children, ...props }) {
|
|
6
|
+
return (_jsxs(ScrollAreaPrimitive.Root, { "data-slot": "scroll-area", className: cn('relative', className), ...props, children: [_jsx(ScrollAreaPrimitive.Viewport, { "data-slot": "scroll-area-viewport", className: "focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1 [&>div]:!block", children: children }), _jsx(ScrollBar, {}), _jsx(ScrollBar, { orientation: "horizontal" }), _jsx(ScrollAreaPrimitive.Corner, {})] }));
|
|
7
|
+
}
|
|
8
|
+
function ScrollBar({ className, orientation = 'vertical', ...props }) {
|
|
9
|
+
return (_jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, { "data-slot": "scroll-area-scrollbar", orientation: orientation, className: cn('flex touch-none p-px transition-colors select-none', orientation === 'vertical' && 'h-full w-2.5 border-l border-l-transparent', orientation === 'horizontal' && 'h-2.5 flex-col border-t border-t-transparent', className), ...props, children: _jsx(ScrollAreaPrimitive.ScrollAreaThumb, { "data-slot": "scroll-area-thumb", className: "bg-border relative flex-1 cursor-grab rounded-full active:cursor-grabbing" }) }));
|
|
10
|
+
}
|
|
11
|
+
export { ScrollArea, ScrollBar };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Kortix <SectionCard>. Deprecated: new panels use <Card> and its slots
|
|
4
|
+
* (`@kortix/ui/card`). It stays for the screens that already render it.
|
|
5
|
+
*
|
|
6
|
+
* Composes the design-system <Card> (rounded-2xl surface) and adds the
|
|
7
|
+
* divided header every settings/list panel needs: a title, an optional
|
|
8
|
+
* muted count, a description, and a trailing action. Use `flush` to let a
|
|
9
|
+
* <List> sit edge-to-edge; otherwise the body gets standard padding.
|
|
10
|
+
* `tone="destructive"` is the standard danger-zone — no separate component.
|
|
11
|
+
*
|
|
12
|
+
* <SectionCard title="Members" count={3} description="People with access"
|
|
13
|
+
* action={<Button size="sm">Invite</Button>} flush>
|
|
14
|
+
* <List>…</List>
|
|
15
|
+
* </SectionCard>
|
|
16
|
+
*
|
|
17
|
+
* <SectionCard tone="destructive" title="Danger zone"
|
|
18
|
+
* description="Irreversible actions.">
|
|
19
|
+
* …
|
|
20
|
+
* </SectionCard>
|
|
21
|
+
*/
|
|
22
|
+
export interface SectionCardProps {
|
|
23
|
+
title?: React.ReactNode;
|
|
24
|
+
/** Muted "(n)" rendered next to the title. */
|
|
25
|
+
count?: number;
|
|
26
|
+
description?: React.ReactNode;
|
|
27
|
+
/** Trailing header slot — usually a button. */
|
|
28
|
+
action?: React.ReactNode;
|
|
29
|
+
tone?: 'default' | 'destructive';
|
|
30
|
+
/** Render children edge-to-edge (for <List>) instead of a padded body. */
|
|
31
|
+
flush?: boolean;
|
|
32
|
+
className?: string;
|
|
33
|
+
bodyClassName?: string;
|
|
34
|
+
children?: React.ReactNode;
|
|
35
|
+
}
|
|
36
|
+
/** @deprecated Use `Card` and its slots (`@kortix/ui/card`). */
|
|
37
|
+
export declare function SectionCard({ title, count, description, action, tone, flush, className, bodyClassName, children, }: SectionCardProps): React.JSX.Element;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Card } from './card.js';
|
|
4
|
+
import { cn } from '../../lib/utils.js';
|
|
5
|
+
/** @deprecated Use `Card` and its slots (`@kortix/ui/card`). */
|
|
6
|
+
export function SectionCard({ title, count, description, action, tone = 'default', flush = false, className, bodyClassName, children, }) {
|
|
7
|
+
const destructive = tone === 'destructive';
|
|
8
|
+
const hasHeader = title != null || description != null || action != null;
|
|
9
|
+
// Danger zones stay calm: red is the brake, not the paint. The panel is a
|
|
10
|
+
// neutral surface with only a faint warm hairline to mark it — the title and
|
|
11
|
+
// description read normally, and the single red action lives on the final
|
|
12
|
+
// confirm (a ConfirmDialog/AlertDialog), never on the panel itself.
|
|
13
|
+
return (_jsxs(Card, { className: cn('gap-0 overflow-hidden py-0', destructive && 'border-destructive/25', className), children: [hasHeader && (_jsxs("div", { className: "border-border/60 flex items-start justify-between gap-3 border-b px-6 py-4", children: [_jsxs("div", { className: "min-w-0", children: [title != null && (_jsxs("h2", { className: "text-foreground text-base font-semibold", children: [title, count != null && (_jsxs("span", { className: "text-muted-foreground font-normal", children: [" (", count, ")"] }))] })), description != null && (_jsx("p", { className: "text-muted-foreground mt-0.5 text-xs", children: description }))] }), action != null && _jsx("div", { className: "shrink-0", children: action })] })), flush ? children : _jsx("div", { className: cn('px-6 py-5', bodyClassName), children: children })] }));
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface SectionProps {
|
|
3
|
+
label?: string;
|
|
4
|
+
action?: ReactNode;
|
|
5
|
+
/** Extra top spacing (defaults to mt-10 between sections) */
|
|
6
|
+
spacing?: 'tight' | 'default' | 'loose';
|
|
7
|
+
className?: string;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export declare function Section({ label, action, spacing, className, children }: SectionProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Kortix <Section> — labelled section used inside PageShell.
|
|
5
|
+
*
|
|
6
|
+
* Uppercase micro-label, optional trailing action, generous top-margin
|
|
7
|
+
* between sections. No border box, no card chrome — the label and
|
|
8
|
+
* whitespace do all the visual work.
|
|
9
|
+
*
|
|
10
|
+
* <Section label="About" action={<Button size="sm">Edit</Button>}>
|
|
11
|
+
* <p>Project description goes here.</p>
|
|
12
|
+
* </Section>
|
|
13
|
+
*/
|
|
14
|
+
import { cn } from '../../lib/utils.js';
|
|
15
|
+
const SPACING = {
|
|
16
|
+
tight: 'mt-6',
|
|
17
|
+
default: 'mt-10',
|
|
18
|
+
loose: 'mt-14',
|
|
19
|
+
};
|
|
20
|
+
export function Section({ label, action, spacing = 'default', className, children }) {
|
|
21
|
+
return (_jsxs("section", { className: cn(SPACING[spacing], 'first:mt-0', className), children: [(label || action) && (_jsxs("div", { className: "mb-3 flex items-center justify-between", children: [label && (_jsx("h3", { className: "text-muted-foreground/60 text-xs font-semibold tracking-[0.08em] uppercase", children: label })), action && _jsx("div", { className: "shrink-0", children: action })] })), children] }));
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { type MenuRowSize } from './menu-recipe.js';
|
|
4
|
+
import { type TriggerVariantProps } from './trigger-variants.js';
|
|
5
|
+
declare const Select: React.FC<SelectPrimitive.SelectProps>;
|
|
6
|
+
declare const SelectGroup: React.ForwardRefExoticComponent<SelectPrimitive.SelectGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
7
|
+
declare const SelectValue: React.ForwardRefExoticComponent<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>>;
|
|
8
|
+
export type SelectTriggerProps = Omit<React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>, 'size'> & TriggerVariantProps & {
|
|
9
|
+
arrow?: boolean;
|
|
10
|
+
};
|
|
11
|
+
declare const SelectTrigger: React.ForwardRefExoticComponent<Omit<Omit<SelectPrimitive.SelectTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref">, "size"> & TriggerVariantProps & {
|
|
12
|
+
arrow?: boolean;
|
|
13
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
14
|
+
declare const SelectScrollUpButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollUpButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
15
|
+
declare const SelectScrollDownButton: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectScrollDownButtonProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
16
|
+
declare const SelectContent: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
17
|
+
declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
18
|
+
declare const SelectItem: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
|
|
19
|
+
/** Row height step — see `MENU_ROW_SIZE` in `./menu-recipe`. */
|
|
20
|
+
size?: MenuRowSize;
|
|
21
|
+
/** Renders below children in the dropdown only — not in the trigger. */
|
|
22
|
+
description?: React.ReactNode;
|
|
23
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
24
|
+
declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
25
|
+
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../../lib/utils.js';
|
|
4
|
+
import { floatingZ, useDialogDepth } from '../../lib/z-stack.js';
|
|
5
|
+
import { CheckIcon as Check, CaretDownIcon as ChevronDown, CaretUpIcon as ChevronUp, } from '@phosphor-icons/react';
|
|
6
|
+
import * as SelectPrimitive from '@radix-ui/react-select';
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import { MENU_INDICATOR, MENU_INDICATOR_ICON, MENU_INSET_END, MENU_LABEL, MENU_PANEL_STATIC, MENU_SEPARATOR, menuRow, } from './menu-recipe.js';
|
|
9
|
+
import { TRIGGER_CARET_CLASS, TRIGGER_ICON_SIZE, triggerVariants, } from './trigger-variants.js';
|
|
10
|
+
/**
|
|
11
|
+
* A select is a menu: the same floating surface holding the same rows, and it
|
|
12
|
+
* shares both with the dropdown and context menu through `./menu-recipe`.
|
|
13
|
+
*
|
|
14
|
+
* Local to a select: `max-h-96` plus the scroll buttons, because the option
|
|
15
|
+
* list is data-length and a dropdown's is authored; and `min-w-56`, because a
|
|
16
|
+
* select is anchored to a trigger it should not visibly undercut.
|
|
17
|
+
*
|
|
18
|
+
* No enter/exit animation, the same as `DropdownMenuContent`: the list paints
|
|
19
|
+
* on the frame it mounts and unmounts on the frame it closes. See
|
|
20
|
+
* `dropdown-menu.tsx` for why.
|
|
21
|
+
*/
|
|
22
|
+
const SELECT_PANEL = cn(MENU_PANEL_STATIC, 'max-h-96 min-w-56 overflow-hidden');
|
|
23
|
+
const Select = SelectPrimitive.Root;
|
|
24
|
+
const SelectGroup = SelectPrimitive.Group;
|
|
25
|
+
const SelectValue = SelectPrimitive.Value;
|
|
26
|
+
const SelectTrigger = React.forwardRef(({ className, children, variant, size, arrow = true, ...props }, ref) => (_jsxs(SelectPrimitive.Trigger, { ref: ref, className: cn(triggerVariants({ variant, size }), className), ...props, children: [children, arrow && (_jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: cn(TRIGGER_CARET_CLASS, TRIGGER_ICON_SIZE[size ?? 'sm']) }) }))] })));
|
|
27
|
+
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
|
28
|
+
const SelectScrollUpButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollUpButton, { ref: ref, className: cn('flex cursor-default items-center justify-center py-1', // cursor-default: hover-scroll area, not a control.
|
|
29
|
+
className), ...props, children: _jsx(ChevronUp, { className: "size-4" }) })));
|
|
30
|
+
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
|
31
|
+
const SelectScrollDownButton = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.ScrollDownButton, { ref: ref, className: cn('flex cursor-default items-center justify-center py-1', // cursor-default: hover-scroll area, not a control.
|
|
32
|
+
className), ...props, children: _jsx(ChevronDown, { className: "size-4" }) })));
|
|
33
|
+
SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
|
|
34
|
+
const SelectContent = React.forwardRef(({ className, children, position = 'popper', style, ...props }, ref) => {
|
|
35
|
+
const depth = useDialogDepth();
|
|
36
|
+
return (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { ref: ref, className: cn(SELECT_PANEL, position === 'popper' &&
|
|
37
|
+
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1', className), style: { zIndex: floatingZ(depth), ...style }, position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn(position === 'popper' &&
|
|
38
|
+
'h-(--radix-select-trigger-height) w-full min-w-[calc(var(--radix-select-trigger-width)-8px)]'), children: children }), _jsx(SelectScrollDownButton, {})] }) }));
|
|
39
|
+
});
|
|
40
|
+
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
|
41
|
+
const SelectLabel = React.forwardRef(({ className, ...props }, ref) => (
|
|
42
|
+
// Was `pl-8 text-sm font-semibold` — the `pl-8` reserved a left gutter for a
|
|
43
|
+
// leading check that this select does not have (its indicator is at
|
|
44
|
+
// `right-3`), so the label sat indented past every option under it.
|
|
45
|
+
_jsx(SelectPrimitive.Label, { ref: ref, className: cn(MENU_LABEL, className), ...props })));
|
|
46
|
+
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
|
47
|
+
const SelectItem = React.forwardRef(({ className, children, size = 'sm', description, ...props }, ref) => (_jsxs(SelectPrimitive.Item, { ref: ref,
|
|
48
|
+
// `MENU_INSET_END` reserves the trailing slot on every row, checked or
|
|
49
|
+
// not, so a long label truncates before the check instead of running
|
|
50
|
+
// under it, and the check column is the same x on every row.
|
|
51
|
+
className: cn(menuRow(size, 'default'), MENU_INSET_END, description && 'items-start', className), ...props, children: [_jsx("span", { "data-slot": "select-item-indicator",
|
|
52
|
+
// Absolute inside a flex row: its static position follows the row's
|
|
53
|
+
// `items-*`, so it centres on a one-line row. On a described row it tops
|
|
54
|
+
// out, and `mt-0.5` centres the ~15px slot on the 20px first line.
|
|
55
|
+
className: cn(MENU_INDICATOR, 'absolute right-2', description && 'mt-0.5'), children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { className: MENU_INDICATOR_ICON }) }) }), description ? (_jsxs("div", { className: "flex min-w-0 flex-col gap-0.5", children: [_jsx(SelectPrimitive.ItemText, { children: children }), _jsx("span", { className: "text-muted-foreground max-w-64 text-xs whitespace-normal", children: description })] })) : (_jsx(SelectPrimitive.ItemText, { children: children }))] })));
|
|
56
|
+
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
|
57
|
+
const SelectSeparator = React.forwardRef(({ className, ...props }, ref) => (_jsx(SelectPrimitive.Separator, { ref: ref, className: cn(MENU_SEPARATOR, className), ...props })));
|
|
58
|
+
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
|
59
|
+
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as SeparatorPrimitive from '@radix-ui/react-separator';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
declare function Separator({ className, orientation, decorative, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>): React.JSX.Element;
|
|
4
|
+
export { Separator };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as SeparatorPrimitive from '@radix-ui/react-separator';
|
|
4
|
+
import { cn } from '../../lib/utils.js';
|
|
5
|
+
function Separator({ className, orientation = 'horizontal', decorative = true, ...props }) {
|
|
6
|
+
return (_jsx(SeparatorPrimitive.Root, { "data-slot": "separator", decorative: decorative, orientation: orientation, className: cn('bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px', className), ...props }));
|
|
7
|
+
}
|
|
8
|
+
export { Separator };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Component, type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* One-shot WebGL2 capability probe. Paper Shaders throws at mount when
|
|
4
|
+
* `getContext('webgl2')` returns null, and its ShaderMount calls
|
|
5
|
+
* `getAttribLocation(null, …)` when shader compilation fails silently —
|
|
6
|
+
* both recurring prod errors on GPUs/browsers without (working) WebGL2.
|
|
7
|
+
*
|
|
8
|
+
* `getSupportedExtensions` is a THIRD such null-context crash path: Paper
|
|
9
|
+
* Shaders' shader-mount `useEffect`/rAF callback calls
|
|
10
|
+
* `gl.getSupportedExtensions()` on a context that became `null` after a
|
|
11
|
+
* context-loss / GPU-blacklist event (the probe canvas may return a non-null
|
|
12
|
+
* context at mount that then fails on real use). A throw inside that async
|
|
13
|
+
* callback ESCAPES the `<ShaderSafe>` error boundary (which only catches
|
|
14
|
+
* render-phase throws via `getDerivedStateFromError`) → global error → Sentry
|
|
15
|
+
* → Better Stack (Better Stack pattern `34127fa4…`, call site `new b2` in
|
|
16
|
+
* `app:///_next/static/chunks/c76173f0.…`, prod, 2 occurrences). So the probe
|
|
17
|
+
* must EXERCISE `getSupportedExtensions` itself: if it throws or returns null
|
|
18
|
+
* on the probe canvas, treat WebGL2 as unsupported and fall back BEFORE the
|
|
19
|
+
* throw can happen at render time. The call is cheap and one-shot (memoized).
|
|
20
|
+
*/
|
|
21
|
+
export declare function supportsWebGL2(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Test-only escape hatch: clears the one-shot `webgl2Support` memo so each
|
|
24
|
+
* unit test can exercise a fresh probe against a stubbed `document`/`window`.
|
|
25
|
+
* Not imported anywhere in app code.
|
|
26
|
+
*/
|
|
27
|
+
export declare function __resetWebGL2ProbeForTests(): void;
|
|
28
|
+
interface ShaderSafeProps {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
fallback?: ReactNode;
|
|
31
|
+
}
|
|
32
|
+
interface ShaderSafeState {
|
|
33
|
+
failed: boolean;
|
|
34
|
+
mounted: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Renders shader children only after mount (no SSR/hydration mismatch) and
|
|
38
|
+
* only when WebGL2 works; any runtime shader crash (context loss, compile
|
|
39
|
+
* failure, texture fetch rejection) degrades to the fallback instead of a
|
|
40
|
+
* client-side error. Decorative canvases must never take the page down.
|
|
41
|
+
*/
|
|
42
|
+
export declare class ShaderSafe extends Component<ShaderSafeProps, ShaderSafeState> {
|
|
43
|
+
state: ShaderSafeState;
|
|
44
|
+
static getDerivedStateFromError(): Partial<ShaderSafeState>;
|
|
45
|
+
componentDidMount(): void;
|
|
46
|
+
render(): ReactNode;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { Component } from 'react';
|
|
3
|
+
let webgl2Support = null;
|
|
4
|
+
/**
|
|
5
|
+
* One-shot WebGL2 capability probe. Paper Shaders throws at mount when
|
|
6
|
+
* `getContext('webgl2')` returns null, and its ShaderMount calls
|
|
7
|
+
* `getAttribLocation(null, …)` when shader compilation fails silently —
|
|
8
|
+
* both recurring prod errors on GPUs/browsers without (working) WebGL2.
|
|
9
|
+
*
|
|
10
|
+
* `getSupportedExtensions` is a THIRD such null-context crash path: Paper
|
|
11
|
+
* Shaders' shader-mount `useEffect`/rAF callback calls
|
|
12
|
+
* `gl.getSupportedExtensions()` on a context that became `null` after a
|
|
13
|
+
* context-loss / GPU-blacklist event (the probe canvas may return a non-null
|
|
14
|
+
* context at mount that then fails on real use). A throw inside that async
|
|
15
|
+
* callback ESCAPES the `<ShaderSafe>` error boundary (which only catches
|
|
16
|
+
* render-phase throws via `getDerivedStateFromError`) → global error → Sentry
|
|
17
|
+
* → Better Stack (Better Stack pattern `34127fa4…`, call site `new b2` in
|
|
18
|
+
* `app:///_next/static/chunks/c76173f0.…`, prod, 2 occurrences). So the probe
|
|
19
|
+
* must EXERCISE `getSupportedExtensions` itself: if it throws or returns null
|
|
20
|
+
* on the probe canvas, treat WebGL2 as unsupported and fall back BEFORE the
|
|
21
|
+
* throw can happen at render time. The call is cheap and one-shot (memoized).
|
|
22
|
+
*/
|
|
23
|
+
export function supportsWebGL2() {
|
|
24
|
+
if (typeof window === 'undefined')
|
|
25
|
+
return false;
|
|
26
|
+
if (webgl2Support !== null)
|
|
27
|
+
return webgl2Support;
|
|
28
|
+
try {
|
|
29
|
+
const ctx = document.createElement('canvas').getContext('webgl2');
|
|
30
|
+
if (!ctx) {
|
|
31
|
+
webgl2Support = false;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Exercise the exact call Paper Shaders makes on the context. A GPU that
|
|
35
|
+
// returns a non-null context but fails on real use (context loss,
|
|
36
|
+
// blacklisted driver, stripped WebView) throws here or returns null —
|
|
37
|
+
// both mean WebGL2 is not usable for decorative shaders, so fall back.
|
|
38
|
+
webgl2Support = ctx.getSupportedExtensions() !== null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
webgl2Support = false;
|
|
43
|
+
}
|
|
44
|
+
return webgl2Support;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Test-only escape hatch: clears the one-shot `webgl2Support` memo so each
|
|
48
|
+
* unit test can exercise a fresh probe against a stubbed `document`/`window`.
|
|
49
|
+
* Not imported anywhere in app code.
|
|
50
|
+
*/
|
|
51
|
+
export function __resetWebGL2ProbeForTests() {
|
|
52
|
+
webgl2Support = null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Renders shader children only after mount (no SSR/hydration mismatch) and
|
|
56
|
+
* only when WebGL2 works; any runtime shader crash (context loss, compile
|
|
57
|
+
* failure, texture fetch rejection) degrades to the fallback instead of a
|
|
58
|
+
* client-side error. Decorative canvases must never take the page down.
|
|
59
|
+
*/
|
|
60
|
+
export class ShaderSafe extends Component {
|
|
61
|
+
state = { failed: false, mounted: false };
|
|
62
|
+
static getDerivedStateFromError() {
|
|
63
|
+
return { failed: true };
|
|
64
|
+
}
|
|
65
|
+
componentDidMount() {
|
|
66
|
+
this.setState({ mounted: true });
|
|
67
|
+
}
|
|
68
|
+
render() {
|
|
69
|
+
const { failed, mounted } = this.state;
|
|
70
|
+
if (!mounted || failed || !supportsWebGL2())
|
|
71
|
+
return this.props.fallback ?? null;
|
|
72
|
+
return this.props.children;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
2
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { type TriggerVariantProps } from './trigger-variants.js';
|
|
5
|
+
declare const Sheet: ({ open, defaultOpen, onOpenChange, ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) => React.JSX.Element;
|
|
6
|
+
declare const SheetTrigger: ({ className, variant, size, asChild, ...props }: Omit<React.ComponentProps<typeof SheetPrimitive.Trigger>, "size"> & TriggerVariantProps) => React.JSX.Element;
|
|
7
|
+
declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
8
|
+
declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
|
|
9
|
+
declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
10
|
+
declare const sheetVariants: (props?: ({
|
|
11
|
+
side?: "left" | "right" | "bottom" | "top" | null | undefined;
|
|
12
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
|
+
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
|
|
14
|
+
showCloseButton?: boolean;
|
|
15
|
+
overlayClassName?: string;
|
|
16
|
+
}
|
|
17
|
+
declare const SheetContent: React.ForwardRefExoticComponent<SheetContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
18
|
+
declare const SheetHeader: {
|
|
19
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
20
|
+
displayName: string;
|
|
21
|
+
};
|
|
22
|
+
declare const SheetFooter: {
|
|
23
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
24
|
+
displayName: string;
|
|
25
|
+
};
|
|
26
|
+
declare const SheetBody: {
|
|
27
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
28
|
+
displayName: string;
|
|
29
|
+
};
|
|
30
|
+
declare const SheetTitle: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
31
|
+
declare const SheetDescription: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
32
|
+
export { Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { Close } from '../../icons/close.js';
|
|
7
|
+
import { cn } from '../../lib/utils.js';
|
|
8
|
+
import { useUiStrings } from '../../providers/ui-provider.js';
|
|
9
|
+
import { DialogDepthProvider, dialogContentZ, dialogOverlayZ, useDialogDepth, useDialogRootLayer, } from '../../lib/z-stack.js';
|
|
10
|
+
import { buttonVariants } from './button.js';
|
|
11
|
+
import { triggerVariants } from './trigger-variants.js';
|
|
12
|
+
const Sheet = ({ open, defaultOpen, onOpenChange, ...props }) => {
|
|
13
|
+
const layer = useDialogRootLayer({ open, defaultOpen, onOpenChange });
|
|
14
|
+
return (_jsx(DialogDepthProvider, { depth: layer.depth, children: _jsx(SheetPrimitive.Root, { ...props, open: layer.open, onOpenChange: layer.onOpenChange }) }));
|
|
15
|
+
};
|
|
16
|
+
const SheetTrigger = ({ className, variant, size, asChild, ...props }) => (_jsx(SheetPrimitive.Trigger, { asChild: asChild,
|
|
17
|
+
// With `asChild` the child owns its styling — merging ours would double it.
|
|
18
|
+
className: asChild ? className : cn(triggerVariants({ variant, size }), className), ...props }));
|
|
19
|
+
const SheetClose = SheetPrimitive.Close;
|
|
20
|
+
const SheetPortal = SheetPrimitive.Portal;
|
|
21
|
+
const SheetOverlay = React.forwardRef(({ className, style, ...props }, ref) => {
|
|
22
|
+
const depth = useDialogDepth();
|
|
23
|
+
return (_jsx(SheetPrimitive.Overlay, { className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 bg-black/80', className), style: { zIndex: dialogOverlayZ(depth), ...style }, ...props, ref: ref }));
|
|
24
|
+
});
|
|
25
|
+
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
|
|
26
|
+
const sheetVariants = cva('fixed flex min-h-0 flex-col gap-4 overflow-hidden bg-sidebar p-4 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out h-[calc(100vh-1.4rem)]', {
|
|
27
|
+
variants: {
|
|
28
|
+
side: {
|
|
29
|
+
top: 'inset-x-0 top-0 border-b-[1.5px] border-border/40 data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
|
|
30
|
+
bottom: 'inset-x-0 bottom-0 border-t-[1.5px] border-border/40 data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
|
|
31
|
+
left: 'inset-y-0 left-0 h-full w-full md:w-3/4 border-r-[1.5px] border-border/40 data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
|
|
32
|
+
right: 'inset-y-0 right-0 h-full md:h-[calc(100vh-1.4rem)] w-full md:w-3/4 border-[1.5px] md:rounded-lg border-border/40 data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm md:m-[0.7rem]',
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
defaultVariants: {
|
|
36
|
+
side: 'right',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const SheetContent = React.forwardRef(({ side = 'right', className, children, showCloseButton = true, overlayClassName, style, ...props }, ref) => {
|
|
40
|
+
const depth = useDialogDepth();
|
|
41
|
+
const strings = useUiStrings();
|
|
42
|
+
return (_jsxs(SheetPortal, { children: [_jsx(SheetOverlay, { className: overlayClassName }), _jsxs(SheetPrimitive.Content, { ref: ref, className: cn(sheetVariants({ side }), className), style: { zIndex: dialogContentZ(depth), ...style }, ...props, children: [children, showCloseButton && (_jsxs(SheetPrimitive.Close, { className: cn('absolute top-4 right-4', buttonVariants({ variant: 'ghost', size: 'icon' })), children: [_jsx(Close, { className: "size-[1.15rem] stroke-0" }), _jsx("span", { className: "sr-only", children: strings.close })] }))] })] }));
|
|
43
|
+
});
|
|
44
|
+
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
45
|
+
const SheetHeader = ({ className, ...props }) => (_jsx("div", { className: cn('flex shrink-0 flex-col space-y-2 text-center sm:text-left', className), ...props }));
|
|
46
|
+
SheetHeader.displayName = 'SheetHeader';
|
|
47
|
+
const SheetFooter = ({ className, ...props }) => (_jsx("div", { className: cn('flex shrink-0 flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className), ...props }));
|
|
48
|
+
SheetFooter.displayName = 'SheetFooter';
|
|
49
|
+
const SheetBody = ({ className, ...props }) => (_jsx("div", { className: cn('flex min-h-0 w-full flex-1 flex-col items-start justify-start gap-4 overflow-y-auto py-6', className), ...props }));
|
|
50
|
+
SheetBody.displayName = 'SheetBody';
|
|
51
|
+
const SheetTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx(SheetPrimitive.Title, { ref: ref, className: cn('text-foreground text-lg font-semibold', className), ...props })));
|
|
52
|
+
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
53
|
+
const SheetDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx(SheetPrimitive.Description, { ref: ref, className: cn('text-muted-foreground text-sm', className), ...props })));
|
|
54
|
+
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
55
|
+
export { Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
declare const SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
3
|
+
declare const SIDEBAR_COOKIE_MAX_AGE: number;
|
|
4
|
+
declare const SIDEBAR_WIDTH = "20rem";
|
|
5
|
+
declare const SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
6
|
+
declare const SIDEBAR_WIDTH_ICON = "1.6rem";
|
|
7
|
+
declare const SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
8
|
+
/**
|
|
9
|
+
* How long the panel keeps its DOCKED geometry after the sidebar collapses.
|
|
10
|
+
* Mirrors `duration-[240ms]` on the container below — the timer has to outlast
|
|
11
|
+
* the transform it covers, or the flyout geometry lands while the panel is
|
|
12
|
+
* still on screen and you see the pop this whole mechanism exists to remove.
|
|
13
|
+
* One number, two places, asserted against each other in `sidebar.test.tsx`.
|
|
14
|
+
*/
|
|
15
|
+
declare const SIDEBAR_UNDOCK_MS = 240;
|
|
16
|
+
/** Keyboard resize step on the rail. Shift multiplies it. */
|
|
17
|
+
declare const SIDEBAR_RESIZE_STEP_PX = 16;
|
|
18
|
+
declare const SIDEBAR_RESIZE_STEP_COARSE_PX = 64;
|
|
19
|
+
/**
|
|
20
|
+
* How a toggle was triggered. Either state it (`{ instant: true }`) or hand the
|
|
21
|
+
* click event straight through — a click synthesized by Enter/Space reports
|
|
22
|
+
* `detail === 0`, so `onClick={toggleSidebar}` makes every keyboard-activated
|
|
23
|
+
* toggle instant for free.
|
|
24
|
+
*/
|
|
25
|
+
export type SidebarToggleOptions = {
|
|
26
|
+
instant?: boolean;
|
|
27
|
+
detail?: number;
|
|
28
|
+
};
|
|
29
|
+
declare const resolveInstant: (options?: SidebarToggleOptions) => boolean;
|
|
30
|
+
type SidebarContextProps = {
|
|
31
|
+
state: 'expanded' | 'collapsed';
|
|
32
|
+
open: boolean;
|
|
33
|
+
setOpen: (open: boolean) => void;
|
|
34
|
+
openMobile: boolean;
|
|
35
|
+
setOpenMobile: (open: boolean) => void;
|
|
36
|
+
isMobile: boolean;
|
|
37
|
+
toggleSidebar: (options?: SidebarToggleOptions) => void;
|
|
38
|
+
/**
|
|
39
|
+
* True for the frames covering a toggle that must not animate. Set by every
|
|
40
|
+
* keyboard-initiated toggle; see the note on `toggleSidebar` above.
|
|
41
|
+
*/
|
|
42
|
+
instantToggle: boolean;
|
|
43
|
+
/** Collapsed-only hover flyout: the sidebar floats over the content while
|
|
44
|
+
* the pointer is near the left edge or on the panel itself. `open` stays
|
|
45
|
+
* false the whole time, so a toggle click while peeking docks it open. */
|
|
46
|
+
peek: boolean;
|
|
47
|
+
peekEnter: () => void;
|
|
48
|
+
peekLeave: () => void;
|
|
49
|
+
/** Pin the flyout open while a menu/popover anchored in the panel is open —
|
|
50
|
+
* its content portals outside the panel, so hovering it would otherwise
|
|
51
|
+
* collapse the flyout. Balanced: `holdPeek(true)` on open, `false` on close. */
|
|
52
|
+
holdPeek: (held: boolean) => void;
|
|
53
|
+
/** Current docked width in px — the resolved value of `--sidebar-width`. */
|
|
54
|
+
width: number;
|
|
55
|
+
/** Clamp, apply, and persist a new width. One render, one cookie write. */
|
|
56
|
+
setWidth: (width: number) => void;
|
|
57
|
+
/**
|
|
58
|
+
* Paint a width straight onto the wrapper's CSS variable, with no React
|
|
59
|
+
* render. Used for the duration of a rail drag; `setWidth` then commits the
|
|
60
|
+
* final value once on pointer-up.
|
|
61
|
+
*/
|
|
62
|
+
previewWidth: (width: number) => void;
|
|
63
|
+
};
|
|
64
|
+
export declare const SidebarContext: React.Context<SidebarContextProps | null>;
|
|
65
|
+
declare function useSidebar(): SidebarContextProps;
|
|
66
|
+
/** Same context as `useSidebar`, but returns `null` outside a
|
|
67
|
+
* `SidebarProvider` instead of throwing. For callers that can genuinely
|
|
68
|
+
* render on both sides of the boundary — e.g. the Easy panel, which also
|
|
69
|
+
* mounts on /debug/tools with no provider at all. */
|
|
70
|
+
declare function useOptionalSidebar(): SidebarContextProps | null;
|
|
71
|
+
export { SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_RESIZE_STEP_COARSE_PX, SIDEBAR_RESIZE_STEP_PX, SIDEBAR_UNDOCK_MS, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WIDTH_MOBILE, resolveInstant, useOptionalSidebar, useSidebar, };
|
|
72
|
+
export type { SidebarContextProps };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
const SIDEBAR_COOKIE_NAME = 'sidebar_state';
|
|
4
|
+
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
5
|
+
const SIDEBAR_WIDTH = '20rem';
|
|
6
|
+
const SIDEBAR_WIDTH_MOBILE = '18rem';
|
|
7
|
+
const SIDEBAR_WIDTH_ICON = '1.6rem';
|
|
8
|
+
const SIDEBAR_KEYBOARD_SHORTCUT = 'b';
|
|
9
|
+
/**
|
|
10
|
+
* How long the panel keeps its DOCKED geometry after the sidebar collapses.
|
|
11
|
+
* Mirrors `duration-[240ms]` on the container below — the timer has to outlast
|
|
12
|
+
* the transform it covers, or the flyout geometry lands while the panel is
|
|
13
|
+
* still on screen and you see the pop this whole mechanism exists to remove.
|
|
14
|
+
* One number, two places, asserted against each other in `sidebar.test.tsx`.
|
|
15
|
+
*/
|
|
16
|
+
const SIDEBAR_UNDOCK_MS = 240;
|
|
17
|
+
/** Keyboard resize step on the rail. Shift multiplies it. */
|
|
18
|
+
const SIDEBAR_RESIZE_STEP_PX = 16;
|
|
19
|
+
const SIDEBAR_RESIZE_STEP_COARSE_PX = 64;
|
|
20
|
+
const resolveInstant = (options) => options?.instant ?? options?.detail === 0;
|
|
21
|
+
export const SidebarContext = React.createContext(null);
|
|
22
|
+
function useSidebar() {
|
|
23
|
+
const context = React.useContext(SidebarContext);
|
|
24
|
+
if (!context) {
|
|
25
|
+
throw new Error('useSidebar must be used within a SidebarProvider.');
|
|
26
|
+
}
|
|
27
|
+
return context;
|
|
28
|
+
}
|
|
29
|
+
/** Same context as `useSidebar`, but returns `null` outside a
|
|
30
|
+
* `SidebarProvider` instead of throwing. For callers that can genuinely
|
|
31
|
+
* render on both sides of the boundary — e.g. the Easy panel, which also
|
|
32
|
+
* mounts on /debug/tools with no provider at all. */
|
|
33
|
+
function useOptionalSidebar() {
|
|
34
|
+
return React.useContext(SidebarContext);
|
|
35
|
+
}
|
|
36
|
+
export { SIDEBAR_COOKIE_MAX_AGE, SIDEBAR_COOKIE_NAME, SIDEBAR_KEYBOARD_SHORTCUT, SIDEBAR_RESIZE_STEP_COARSE_PX, SIDEBAR_RESIZE_STEP_PX, SIDEBAR_UNDOCK_MS, SIDEBAR_WIDTH, SIDEBAR_WIDTH_ICON, SIDEBAR_WIDTH_MOBILE, resolveInstant, useOptionalSidebar, useSidebar, };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { TooltipContent } from './tooltip.js';
|
|
4
|
+
declare function SidebarGroup({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
5
|
+
declare function SidebarGroupLabel({ className, asChild, ...props }: React.ComponentProps<'div'> & {
|
|
6
|
+
asChild?: boolean;
|
|
7
|
+
}): React.JSX.Element;
|
|
8
|
+
declare function SidebarGroupAction({ className, asChild, ...props }: React.ComponentProps<'button'> & {
|
|
9
|
+
asChild?: boolean;
|
|
10
|
+
}): React.JSX.Element;
|
|
11
|
+
declare function SidebarGroupContent({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
12
|
+
declare function SidebarMenu({ className, ...props }: React.ComponentProps<'ul'>): React.JSX.Element;
|
|
13
|
+
declare function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>): React.JSX.Element;
|
|
14
|
+
declare const sidebarMenuButtonVariants: (props?: ({
|
|
15
|
+
variant?: "default" | "outline" | "success" | "primary" | null | undefined;
|
|
16
|
+
size?: "default" | "sm" | "lg" | null | undefined;
|
|
17
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
18
|
+
declare function SidebarMenuButton({ asChild, isActive, variant, size, tooltip, className, ...props }: React.ComponentProps<'button'> & {
|
|
19
|
+
asChild?: boolean;
|
|
20
|
+
isActive?: boolean;
|
|
21
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
22
|
+
} & VariantProps<typeof sidebarMenuButtonVariants>): React.JSX.Element;
|
|
23
|
+
declare function SidebarMenuAction({ className, asChild, showOnHover, ...props }: React.ComponentProps<'button'> & {
|
|
24
|
+
asChild?: boolean;
|
|
25
|
+
showOnHover?: boolean;
|
|
26
|
+
}): React.JSX.Element;
|
|
27
|
+
declare function SidebarMenuBadge({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
28
|
+
declare function SidebarMenuSkeleton({ className, showIcon, ...props }: React.ComponentProps<'div'> & {
|
|
29
|
+
showIcon?: boolean;
|
|
30
|
+
}): React.JSX.Element;
|
|
31
|
+
declare function SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>): React.JSX.Element;
|
|
32
|
+
declare function SidebarMenuSubItem({ className, ...props }: React.ComponentProps<'li'>): React.JSX.Element;
|
|
33
|
+
declare function SidebarMenuSubButton({ asChild, size, isActive, className, ...props }: React.ComponentProps<'a'> & {
|
|
34
|
+
asChild?: boolean;
|
|
35
|
+
size?: 'sm' | 'md';
|
|
36
|
+
isActive?: boolean;
|
|
37
|
+
}): React.JSX.Element;
|
|
38
|
+
export { SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, };
|