@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,190 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Button } from './button.js';
|
|
5
|
+
import { Calendar } from './calendar.js';
|
|
6
|
+
import { IconCalendar, IconChevronDown } from './kortix-icons.js';
|
|
7
|
+
import { Popover, PopoverContent, PopoverTrigger } from './popover.js';
|
|
8
|
+
import { cn } from '../../lib/utils.js';
|
|
9
|
+
const PRESET_ORDER = ['24h', '7d', '30d', '90d'];
|
|
10
|
+
const PRESET_DAYS = {
|
|
11
|
+
'24h': 1,
|
|
12
|
+
'7d': 7,
|
|
13
|
+
'30d': 30,
|
|
14
|
+
'90d': 90,
|
|
15
|
+
};
|
|
16
|
+
const PRESET_LABELS = {
|
|
17
|
+
'24h': 'Last 24 hours',
|
|
18
|
+
'7d': 'Last 7 days',
|
|
19
|
+
'30d': 'Last 30 days',
|
|
20
|
+
'90d': 'Last 90 days',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a preset to concrete UTC ISO bounds, anchored to `now`. Presets are
|
|
24
|
+
* a UI affordance only — every cost endpoint takes just `from`/`to`, so this
|
|
25
|
+
* is where a preset turns into the wire values.
|
|
26
|
+
*/
|
|
27
|
+
export function resolvePreset(preset, now) {
|
|
28
|
+
const to = now.toISOString();
|
|
29
|
+
const from = new Date(now.getTime() - PRESET_DAYS[preset] * 86_400_000).toISOString();
|
|
30
|
+
return { preset, from, to };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Turn a calendar day selection into a half-open UTC window: `from` is the
|
|
34
|
+
* start of `startDay`, `to` is the start of the day *after* `endDay`, so the
|
|
35
|
+
* end day the user clicked is fully covered under `[from, to)`.
|
|
36
|
+
*
|
|
37
|
+
* `startDay`/`endDay` are the `Date` objects `react-day-picker` hands back —
|
|
38
|
+
* local midnight on the clicked calendar day. Reading their *local* calendar
|
|
39
|
+
* parts (`getFullYear`/`getMonth`/`getDate`) and rebuilding the instant with
|
|
40
|
+
* `Date.UTC` is what makes the result independent of the host's timezone;
|
|
41
|
+
* calling `.toISOString()` on the picked `Date` directly would instead bake
|
|
42
|
+
* in the host's UTC offset (see the test file for a worked example).
|
|
43
|
+
*/
|
|
44
|
+
export function toUtcDayRange(startDay, endDay) {
|
|
45
|
+
const from = new Date(Date.UTC(startDay.getFullYear(), startDay.getMonth(), startDay.getDate())).toISOString();
|
|
46
|
+
const to = new Date(Date.UTC(endDay.getFullYear(), endDay.getMonth(), endDay.getDate() + 1)).toISOString();
|
|
47
|
+
return { preset: 'custom', from, to };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The inverse of `toUtcDayRange`, for feeding a stored `CostRange` back into
|
|
51
|
+
* `<Calendar mode="range">` on reopen. The stored bounds are UTC-midnight
|
|
52
|
+
* instants; `react-day-picker` highlights by *local* calendar day. Shifting
|
|
53
|
+
* the instant by milliseconds (an earlier version of this function did
|
|
54
|
+
* `getTime() - 86_400_000`) only relocates the instant — it does nothing to
|
|
55
|
+
* account for how a *different* host timezone reads that instant's local
|
|
56
|
+
* calendar day, so it "corrects" the display for positive-UTC-offset viewers
|
|
57
|
+
* by coincidence and is wrong in the opposite direction for negative-offset
|
|
58
|
+
* viewers (e.g. the Americas): both bounds land a day early there.
|
|
59
|
+
*
|
|
60
|
+
* The fix mirrors `toUtcDayRange` with its two steps reversed: read the
|
|
61
|
+
* *UTC* calendar parts off the stored instant (`getUTCFullYear`/
|
|
62
|
+
* `getUTCMonth`/`getUTCDate` — always host-independent), then rebuild via
|
|
63
|
+
* the *local* `Date` constructor, so the viewer's own host offset decides
|
|
64
|
+
* how the resulting `Date` reads back — the same offset `react-day-picker`
|
|
65
|
+
* itself will later use to highlight it. `new Date(y, m, d)` normalizes an
|
|
66
|
+
* out-of-range day (`d - 1` below zero, `d + 1` past the month's end), so
|
|
67
|
+
* month/year rollover needs no special-casing.
|
|
68
|
+
*/
|
|
69
|
+
export function toCalendarSelection(value) {
|
|
70
|
+
const utcPartsToLocalDay = (iso, dayDelta = 0) => {
|
|
71
|
+
const instant = new Date(iso);
|
|
72
|
+
return new Date(instant.getUTCFullYear(), instant.getUTCMonth(), instant.getUTCDate() + dayDelta);
|
|
73
|
+
};
|
|
74
|
+
// A preset's from/to are real instants (e.g. `now` minus N days), not day
|
|
75
|
+
// boundaries — pass them through unadjusted. Only a custom range's bounds
|
|
76
|
+
// are calendar days that need this local/UTC reconciliation; its `to` is
|
|
77
|
+
// also the exclusive day-after boundary, so the last inclusive calendar
|
|
78
|
+
// day the user clicked is one day earlier.
|
|
79
|
+
if (value.preset !== 'custom') {
|
|
80
|
+
return { from: new Date(value.from), to: new Date(value.to) };
|
|
81
|
+
}
|
|
82
|
+
return { from: utcPartsToLocalDay(value.from), to: utcPartsToLocalDay(value.to, -1) };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The widest label `formatRangeLabel` can ever emit, used to reserve the
|
|
86
|
+
* trigger's width so the control does not resize when the range changes.
|
|
87
|
+
*
|
|
88
|
+
* The shape is fixed: `MMM D – MMM D, YYYY`. Every `en-US` short month name is
|
|
89
|
+
* three characters, the year is always four digits, and the widest day number
|
|
90
|
+
* is two digits — so a two-digit/two-digit pair is the maximum at 21
|
|
91
|
+
* characters. Digits are rendered `tabular-nums` on the trigger, so any
|
|
92
|
+
* two-digit day is exactly as wide as `28` and this string is not merely the
|
|
93
|
+
* longest, it is the widest for its digit positions.
|
|
94
|
+
*
|
|
95
|
+
* NOT `Dec 28, 2026 – Jan 3, 2027`: `formatRangeLabel` prints the year once,
|
|
96
|
+
* after the second day, so a range spanning a year boundary is *shorter* than
|
|
97
|
+
* this (`Dec 28 – Jan 3, 2027`), not longer. Sizing to the two-year shape
|
|
98
|
+
* would reserve ~5 characters of permanent dead space.
|
|
99
|
+
*
|
|
100
|
+
* The four preset labels are all shorter (`Last 24 hours`, 13 characters), so
|
|
101
|
+
* this one string governs the trigger width in every state.
|
|
102
|
+
*/
|
|
103
|
+
export const WIDEST_RANGE_LABEL = 'Dec 28 – Dec 30, 2026';
|
|
104
|
+
/** Human label for the trigger button: the preset name, or both dates for a custom range. */
|
|
105
|
+
export function formatRangeLabel(range) {
|
|
106
|
+
if (range.preset !== 'custom')
|
|
107
|
+
return PRESET_LABELS[range.preset];
|
|
108
|
+
const from = new Date(range.from);
|
|
109
|
+
// `to` is the exclusive day-after boundary (half-open [from, to)) — the
|
|
110
|
+
// last inclusive calendar day the user clicked is one day earlier.
|
|
111
|
+
const to = new Date(new Date(range.to).getTime() - 86_400_000);
|
|
112
|
+
const day = (value) => value.toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'UTC' });
|
|
113
|
+
return `${day(from)} – ${day(to)}, ${to.getUTCFullYear()}`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* What a click on `day` does, given the half-made range currently on screen.
|
|
117
|
+
*
|
|
118
|
+
* This deliberately ignores the range `react-day-picker` hands to `onSelect`,
|
|
119
|
+
* because that value is the bug. Its `addToRange` folds the clicked day into
|
|
120
|
+
* whatever is currently `selected`, and `selected` is always a *complete*
|
|
121
|
+
* range here — a preset resolves to real bounds, so `from` and `to` are both
|
|
122
|
+
* set before the user ever opens the calendar. Feeding a complete range in
|
|
123
|
+
* takes the `from && to` branch, which returns another complete range from a
|
|
124
|
+
* single click:
|
|
125
|
+
*
|
|
126
|
+
* addToRange(Jul 10, { from: Jul 1, to: Jul 31 }) -> { from: Jul 1, to: Jul 10 }
|
|
127
|
+
*
|
|
128
|
+
* So the first click looked finished, the picker committed and closed, and a
|
|
129
|
+
* second date could never be chosen. Worse, the committed range was one the
|
|
130
|
+
* user never asked for: their click became the *end* of the previous range
|
|
131
|
+
* instead of the start of a new one.
|
|
132
|
+
*
|
|
133
|
+
* Deriving from the clicked day instead makes the two clicks explicit — the
|
|
134
|
+
* first opens a range, the second closes it, in whichever order they are
|
|
135
|
+
* clicked. Clicking the same day twice is a legitimate single-day range and
|
|
136
|
+
* completes normally.
|
|
137
|
+
*/
|
|
138
|
+
export function nextRangeDraft(draft, day) {
|
|
139
|
+
// Nothing pending — this click opens a new range rather than editing the
|
|
140
|
+
// committed one.
|
|
141
|
+
if (!draft?.from || draft.to) {
|
|
142
|
+
return { kind: 'pending', draft: { from: day, to: undefined } };
|
|
143
|
+
}
|
|
144
|
+
const start = draft.from;
|
|
145
|
+
return day.getTime() < start.getTime()
|
|
146
|
+
? { kind: 'complete', from: day, to: start }
|
|
147
|
+
: { kind: 'complete', from: start, to: day };
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The main control for all three levels of the cost explorer (project,
|
|
151
|
+
* sessions, session). A Popover holding a vertical preset rail beside a range
|
|
152
|
+
* Calendar; both paths resolve to concrete UTC ISO bounds before calling
|
|
153
|
+
* `onChange`.
|
|
154
|
+
*/
|
|
155
|
+
export function DateRangePicker({ value, onChange }) {
|
|
156
|
+
const [open, setOpen] = useState(false);
|
|
157
|
+
// The range being picked, if the user is mid-selection. While this is set it
|
|
158
|
+
// is what the calendar shows, so the first click reads as "start here"
|
|
159
|
+
// instead of silently editing the committed range.
|
|
160
|
+
const [draft, setDraft] = useState(undefined);
|
|
161
|
+
const selected = draft ?? toCalendarSelection(value);
|
|
162
|
+
const handleOpenChange = (next) => {
|
|
163
|
+
setOpen(next);
|
|
164
|
+
// Closing with only a start day chosen abandons it. Keeping it would mean
|
|
165
|
+
// the next open silently treats an old click as the range's start.
|
|
166
|
+
if (!next)
|
|
167
|
+
setDraft(undefined);
|
|
168
|
+
};
|
|
169
|
+
const handlePresetSelect = (preset) => {
|
|
170
|
+
setDraft(undefined);
|
|
171
|
+
onChange(resolvePreset(preset, new Date()));
|
|
172
|
+
setOpen(false);
|
|
173
|
+
};
|
|
174
|
+
// `range` is ignored on purpose — see `nextRangeDraft`. The clicked day is
|
|
175
|
+
// the only trustworthy input react-day-picker gives us here.
|
|
176
|
+
const handleCalendarSelect = (_range, day) => {
|
|
177
|
+
const step = nextRangeDraft(draft, day);
|
|
178
|
+
if (step.kind === 'pending') {
|
|
179
|
+
setDraft(step.draft);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
setDraft(undefined);
|
|
183
|
+
onChange(toUtcDayRange(step.from, step.to));
|
|
184
|
+
setOpen(false);
|
|
185
|
+
};
|
|
186
|
+
return (_jsxs(Popover, { open: open, onOpenChange: handleOpenChange, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", variant: "outline", size: "sm", className: "gap-1.5 font-normal", children: [_jsx(IconCalendar, { className: "size-3.5 shrink-0" }), _jsxs("span", { className: "grid text-left tabular-nums", children: [_jsx("span", { "aria-hidden": "true", className: "invisible col-start-1 row-start-1", children: WIDEST_RANGE_LABEL }), _jsx("span", { className: "col-start-1 row-start-1", children: formatRangeLabel(value) })] }), _jsx(IconChevronDown, { className: cn('size-3 shrink-0 opacity-50 transition-transform duration-200 ease-out', open && 'rotate-180') })] }) }), _jsx(PopoverContent, { align: "start", sideOffset: 8, className: "w-auto p-0 shadow-md", children: _jsxs("div", { className: "flex flex-col sm:flex-row", children: [_jsx("div", { className: "grid grid-cols-2 gap-1 border-b p-2 sm:w-[136px] sm:grid-cols-1 sm:content-start sm:border-r sm:border-b-0", children: PRESET_ORDER.map((preset) => {
|
|
187
|
+
const active = value.preset === preset;
|
|
188
|
+
return (_jsx(Button, { type: "button", variant: "ghost", size: "sm", "aria-pressed": active, className: cn('h-7 w-full justify-start px-2.5 text-xs font-normal', active ? 'bg-primary/[0.06] text-foreground' : 'text-muted-foreground'), onClick: () => handlePresetSelect(preset), children: PRESET_LABELS[preset] }, preset));
|
|
189
|
+
}) }), _jsx(Calendar, { mode: "range", selected: selected, onSelect: handleCalendarSelect, defaultMonth: selected.from })] }) })] }));
|
|
190
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface DefinitionListProps {
|
|
3
|
+
dividers?: boolean;
|
|
4
|
+
className?: string;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function DefinitionList({ dividers, className, children }: DefinitionListProps): import("react").JSX.Element;
|
|
8
|
+
export interface DefinitionRowProps {
|
|
9
|
+
label: string;
|
|
10
|
+
/** Width reserved for the label column (default 110px) */
|
|
11
|
+
labelWidth?: number;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
title?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function DefinitionRow({ label, labelWidth, children, title }: DefinitionRowProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* Kortix <DefinitionList> — key:value pair list.
|
|
5
|
+
*
|
|
6
|
+
* Used for:
|
|
7
|
+
* • Project About → Details panel
|
|
8
|
+
* • Issue detail sidebar → Properties
|
|
9
|
+
* • Trigger / Channel / Tunnel details
|
|
10
|
+
* • Anywhere you'd otherwise reach for a <table> with two columns
|
|
11
|
+
*
|
|
12
|
+
* Flat, dividerless by default. Set `dividers` to get a 1px rule between
|
|
13
|
+
* rows. Labels are fixed-width so values align.
|
|
14
|
+
*
|
|
15
|
+
* <DefinitionList>
|
|
16
|
+
* <DefinitionRow label="Path"><code>/workspace/foo</code></DefinitionRow>
|
|
17
|
+
* <DefinitionRow label="Created">2 days ago</DefinitionRow>
|
|
18
|
+
* </DefinitionList>
|
|
19
|
+
*/
|
|
20
|
+
import { cn } from '../../lib/utils.js';
|
|
21
|
+
export function DefinitionList({ dividers, className, children }) {
|
|
22
|
+
return (_jsx("dl", { className: cn(dividers && 'divide-border border-border/60 divide-y border-y', className), children: children }));
|
|
23
|
+
}
|
|
24
|
+
export function DefinitionRow({ label, labelWidth = 110, children, title }) {
|
|
25
|
+
return (_jsxs("div", { className: "flex items-baseline gap-6 py-2.5", children: [_jsx("dt", { className: "text-muted-foreground/70 shrink-0 text-xs font-medium", style: { width: labelWidth }, children: label }), _jsx("dd", { className: "text-foreground/90 min-w-0 flex-1 truncate text-sm", title: title, children: children })] }));
|
|
26
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import { type TriggerVariantProps } from './trigger-variants.js';
|
|
5
|
+
/** @deprecated In feature code use `Modal` (`@kortix/ui/modal`). `Dialog` is the primitive other components build on. */
|
|
6
|
+
declare const Dialog: ({ open, defaultOpen, onOpenChange, ...props }: DialogPrimitive.DialogProps) => React.JSX.Element;
|
|
7
|
+
declare const DialogTrigger: ({ className, variant, size, asChild, ...props }: Omit<React.ComponentProps<typeof DialogPrimitive.Trigger>, "size"> & TriggerVariantProps) => React.JSX.Element;
|
|
8
|
+
declare const DialogPortal: React.FC<DialogPrimitive.DialogPortalProps>;
|
|
9
|
+
declare const DialogClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
|
|
10
|
+
declare const DialogOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
/** @deprecated In feature code use `ModalContent` (`@kortix/ui/modal`). */
|
|
12
|
+
declare const DialogContent: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
|
|
13
|
+
variant?: "default" | "transparent" | null | undefined;
|
|
14
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
|
|
15
|
+
hideCloseButton?: boolean;
|
|
16
|
+
showOverlay?: boolean;
|
|
17
|
+
overlayClassName?: string;
|
|
18
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
19
|
+
declare const DialogHeader: {
|
|
20
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
21
|
+
displayName: string;
|
|
22
|
+
};
|
|
23
|
+
declare const DialogFooter: {
|
|
24
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
25
|
+
displayName: string;
|
|
26
|
+
};
|
|
27
|
+
declare const DialogTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
28
|
+
declare const DialogDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
29
|
+
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Close } from '../../icons/close.js';
|
|
5
|
+
import { cn } from '../../lib/utils.js';
|
|
6
|
+
import { useUiStrings } from '../../providers/ui-provider.js';
|
|
7
|
+
import { dialogContentZ, DialogDepthProvider, dialogOverlayZ, useDialogDepth, useDialogRootLayer, } from '../../lib/z-stack.js';
|
|
8
|
+
import { cva } from 'class-variance-authority';
|
|
9
|
+
import { buttonVariants } from './button.js';
|
|
10
|
+
import { triggerVariants } from './trigger-variants.js';
|
|
11
|
+
/** @deprecated In feature code use `Modal` (`@kortix/ui/modal`). `Dialog` is the primitive other components build on. */
|
|
12
|
+
const Dialog = ({ open, defaultOpen, onOpenChange, ...props }) => {
|
|
13
|
+
const layer = useDialogRootLayer({ open, defaultOpen, onOpenChange });
|
|
14
|
+
return (_jsx(DialogDepthProvider, { depth: layer.depth, children: _jsx(DialogPrimitive.Root, { ...props, open: layer.open, onOpenChange: layer.onOpenChange }) }));
|
|
15
|
+
};
|
|
16
|
+
const DialogTrigger = ({ className, variant, size, asChild, ...props }) => (_jsx(DialogPrimitive.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 DialogPortal = DialogPrimitive.Portal;
|
|
20
|
+
const DialogClose = DialogPrimitive.Close;
|
|
21
|
+
const DialogOverlay = React.forwardRef(({ className, style, ...props }, ref) => {
|
|
22
|
+
const depth = useDialogDepth();
|
|
23
|
+
return (_jsx(DialogPrimitive.Overlay, { ref: ref, 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/65 backdrop-blur-xs duration-200', className), style: { zIndex: dialogOverlayZ(depth), ...style }, ...props }));
|
|
24
|
+
});
|
|
25
|
+
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
26
|
+
const DialogVariants = cva(cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 border p-5 shadow-lg duration-200 sm:max-w-lg sm:rounded-lg'), {
|
|
27
|
+
variants: {
|
|
28
|
+
variant: {
|
|
29
|
+
default: 'bg-sidebar border-muted/60',
|
|
30
|
+
transparent: 'bg-transparent border-none p-0',
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
defaultVariants: {
|
|
34
|
+
variant: 'transparent',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
/** @deprecated In feature code use `ModalContent` (`@kortix/ui/modal`). */
|
|
38
|
+
const DialogContent = React.forwardRef(({ className, children, hideCloseButton = false, showOverlay = true, overlayClassName, style, ...props }, ref) => {
|
|
39
|
+
const depth = useDialogDepth();
|
|
40
|
+
const strings = useUiStrings();
|
|
41
|
+
return (_jsxs(DialogPortal, { children: [showOverlay && _jsx(DialogOverlay, { className: overlayClassName }), _jsxs(DialogPrimitive.Content, { ref: ref, className: cn(DialogVariants({ variant: 'default' }), className), style: { zIndex: dialogContentZ(depth), ...style }, ...props, children: [children, !hideCloseButton && (_jsxs(DialogPrimitive.Close, { className: cn(buttonVariants({ variant: 'ghost', size: 'icon' }), 'absolute top-3 right-3'), children: [_jsx(Close, { className: "h-4 w-4" }), _jsx("span", { className: "sr-only", children: strings.close })] }))] })] }));
|
|
42
|
+
});
|
|
43
|
+
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
44
|
+
const DialogHeader = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col space-y-1.5 text-center sm:text-left', className), ...props }));
|
|
45
|
+
DialogHeader.displayName = 'DialogHeader';
|
|
46
|
+
const DialogFooter = ({ className, ...props }) => (_jsx("div", { className: cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className), ...props }));
|
|
47
|
+
DialogFooter.displayName = 'DialogFooter';
|
|
48
|
+
const DialogTitle = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Title, { ref: ref, className: cn('text-lg leading-none font-semibold tracking-tight', className), ...props })));
|
|
49
|
+
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
50
|
+
const DialogDescription = React.forwardRef(({ className, ...props }, ref) => (_jsx(DialogPrimitive.Description, { ref: ref, className: cn('text-muted-foreground text-sm', className), ...props })));
|
|
51
|
+
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
52
|
+
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Transition, Variant } from 'motion/react';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
export type DisclosureContextType = {
|
|
4
|
+
open: boolean;
|
|
5
|
+
toggle: () => void;
|
|
6
|
+
/**
|
|
7
|
+
* Minted once per disclosure so the trigger can point `aria-controls` at the
|
|
8
|
+
* region it expands. `DisclosureContent` stamps the same id on its element —
|
|
9
|
+
* a locally-minted id there could not be reached by the trigger, which is why
|
|
10
|
+
* the attribute was missing entirely.
|
|
11
|
+
*/
|
|
12
|
+
contentId: string;
|
|
13
|
+
variants?: {
|
|
14
|
+
expanded: Variant;
|
|
15
|
+
collapsed: Variant;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* What activating the trigger should do. Extracted as a pure function so the
|
|
20
|
+
* contract has something to test: `apps/web` has no browser test harness (only
|
|
21
|
+
* `renderToStaticMarkup`), so a click cannot be simulated, and this is the exact
|
|
22
|
+
* decision that was wrong before.
|
|
23
|
+
*
|
|
24
|
+
* `nextOpen` negates the value the disclosure is CURRENTLY RENDERING. The old
|
|
25
|
+
* implementation negated a private copy of it instead, which is how a click
|
|
26
|
+
* could resolve to the state the disclosure was already in and appear to do
|
|
27
|
+
* nothing at all.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveDisclosureToggle(state: {
|
|
30
|
+
open: boolean;
|
|
31
|
+
isControlled: boolean;
|
|
32
|
+
}): {
|
|
33
|
+
nextOpen: boolean;
|
|
34
|
+
/** Only an uncontrolled disclosure owns state. A controlled one holds none —
|
|
35
|
+
* keeping a copy is what produced the two-sources-of-truth bug. */
|
|
36
|
+
writesInternalState: boolean;
|
|
37
|
+
};
|
|
38
|
+
export type DisclosureProviderProps = {
|
|
39
|
+
children: React.ReactNode;
|
|
40
|
+
/** Controlled. Omit entirely (not `false`) for an uncontrolled disclosure. */
|
|
41
|
+
open?: boolean;
|
|
42
|
+
/** Uncontrolled starting value. Ignored when `open` is provided. */
|
|
43
|
+
defaultOpen?: boolean;
|
|
44
|
+
onOpenChange?: (open: boolean) => void;
|
|
45
|
+
variants?: {
|
|
46
|
+
expanded: Variant;
|
|
47
|
+
collapsed: Variant;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Controlled OR uncontrolled, with exactly one source of truth for `open` —
|
|
52
|
+
* the same contract every Radix primitive in this codebase uses.
|
|
53
|
+
*
|
|
54
|
+
* This replaces a mirrored-state design that copied `open` into internal state
|
|
55
|
+
* and reconciled the two in a `useEffect`. That shape produced the reported
|
|
56
|
+
* "click does nothing, then it opens by itself" flakiness through four separate
|
|
57
|
+
* defects, all of which are structural rather than incidental:
|
|
58
|
+
*
|
|
59
|
+
* 1. `toggle` computed `!internalCopy`, not `!open`. Any moment the copy and
|
|
60
|
+
* the prop disagreed, a click moved the disclosure the wrong way — or
|
|
61
|
+
* landed on the value it already had, so nothing visibly happened.
|
|
62
|
+
* 2. The prop → copy sync ran in a PASSIVE effect, i.e. after paint. A
|
|
63
|
+
* prop-driven open animated a frame late and looked spontaneous, and in an
|
|
64
|
+
* exclusive accordion (session-scope-control.tsx) both sections were open
|
|
65
|
+
* together for that frame.
|
|
66
|
+
* 3. `onOpenChange` was called from inside the `setState` updater. React
|
|
67
|
+
* requires updaters to be pure and is free to invoke them more than once;
|
|
68
|
+
* a parent whose handler toggles (`onOpenChange={() => toggleThing()}` —
|
|
69
|
+
* what both session lists pass) then nets to zero and never moves.
|
|
70
|
+
* 4. `open` defaulted to `false`, so "controlled and closed" and "uncontrolled"
|
|
71
|
+
* were indistinguishable and no caller could opt out of being controlled.
|
|
72
|
+
*
|
|
73
|
+
* Here `open` is read straight from whichever source owns it, so a controlled
|
|
74
|
+
* parent's change lands in the same commit as its own render, and `toggle`
|
|
75
|
+
* always derives from the value actually on screen.
|
|
76
|
+
*/
|
|
77
|
+
declare function DisclosureProvider({ children, open: openProp, defaultOpen, onOpenChange, variants, }: DisclosureProviderProps): React.JSX.Element;
|
|
78
|
+
export type DisclosureProps = {
|
|
79
|
+
/**
|
|
80
|
+
* Controlled value. Pass it WITH `onOpenChange`, or the disclosure is frozen
|
|
81
|
+
* — there is no internal copy to fall back on any more, by design.
|
|
82
|
+
* For "starts open, then the user decides", use `defaultOpen`.
|
|
83
|
+
*/
|
|
84
|
+
open?: boolean;
|
|
85
|
+
/** Uncontrolled starting value. Ignored when `open` is provided. */
|
|
86
|
+
defaultOpen?: boolean;
|
|
87
|
+
onOpenChange?: (open: boolean) => void;
|
|
88
|
+
children: React.ReactNode;
|
|
89
|
+
className?: string;
|
|
90
|
+
variants?: {
|
|
91
|
+
expanded: Variant;
|
|
92
|
+
collapsed: Variant;
|
|
93
|
+
};
|
|
94
|
+
transition?: Transition;
|
|
95
|
+
variant?: 'default' | 'outline';
|
|
96
|
+
};
|
|
97
|
+
export declare function Disclosure({ open: openProp, defaultOpen, onOpenChange, children, className, transition, variants, variant, }: DisclosureProps): React.JSX.Element;
|
|
98
|
+
export declare function DisclosureTrigger({ children, className, variant, }: {
|
|
99
|
+
children: React.ReactNode;
|
|
100
|
+
className?: string;
|
|
101
|
+
variant?: 'default' | 'outline';
|
|
102
|
+
}): React.JSX.Element;
|
|
103
|
+
export declare function DisclosureContent({ children, className, contentClassName, variant, }: {
|
|
104
|
+
children: React.ReactNode;
|
|
105
|
+
className?: string;
|
|
106
|
+
contentClassName?: string;
|
|
107
|
+
variant?: 'default' | 'outline';
|
|
108
|
+
}): React.JSX.Element;
|
|
109
|
+
export type DisclosureBodyProps = {
|
|
110
|
+
children: React.ReactNode;
|
|
111
|
+
className?: string;
|
|
112
|
+
};
|
|
113
|
+
export declare function DisclosureBody({ children, className }: DisclosureBodyProps): React.JSX.Element;
|
|
114
|
+
declare const _default: {
|
|
115
|
+
Disclosure: typeof Disclosure;
|
|
116
|
+
DisclosureBody: typeof DisclosureBody;
|
|
117
|
+
DisclosureProvider: typeof DisclosureProvider;
|
|
118
|
+
DisclosureTrigger: typeof DisclosureTrigger;
|
|
119
|
+
DisclosureContent: typeof DisclosureContent;
|
|
120
|
+
};
|
|
121
|
+
export default _default;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { cn } from '../../lib/utils.js';
|
|
4
|
+
import { AnimatePresence, m, MotionConfig } from 'motion/react';
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { createContext, useCallback, useContext, useId, useMemo, useState } from 'react';
|
|
7
|
+
const DisclosureContext = createContext(undefined);
|
|
8
|
+
/**
|
|
9
|
+
* What activating the trigger should do. Extracted as a pure function so the
|
|
10
|
+
* contract has something to test: `apps/web` has no browser test harness (only
|
|
11
|
+
* `renderToStaticMarkup`), so a click cannot be simulated, and this is the exact
|
|
12
|
+
* decision that was wrong before.
|
|
13
|
+
*
|
|
14
|
+
* `nextOpen` negates the value the disclosure is CURRENTLY RENDERING. The old
|
|
15
|
+
* implementation negated a private copy of it instead, which is how a click
|
|
16
|
+
* could resolve to the state the disclosure was already in and appear to do
|
|
17
|
+
* nothing at all.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveDisclosureToggle(state) {
|
|
20
|
+
return { nextOpen: !state.open, writesInternalState: !state.isControlled };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Controlled OR uncontrolled, with exactly one source of truth for `open` —
|
|
24
|
+
* the same contract every Radix primitive in this codebase uses.
|
|
25
|
+
*
|
|
26
|
+
* This replaces a mirrored-state design that copied `open` into internal state
|
|
27
|
+
* and reconciled the two in a `useEffect`. That shape produced the reported
|
|
28
|
+
* "click does nothing, then it opens by itself" flakiness through four separate
|
|
29
|
+
* defects, all of which are structural rather than incidental:
|
|
30
|
+
*
|
|
31
|
+
* 1. `toggle` computed `!internalCopy`, not `!open`. Any moment the copy and
|
|
32
|
+
* the prop disagreed, a click moved the disclosure the wrong way — or
|
|
33
|
+
* landed on the value it already had, so nothing visibly happened.
|
|
34
|
+
* 2. The prop → copy sync ran in a PASSIVE effect, i.e. after paint. A
|
|
35
|
+
* prop-driven open animated a frame late and looked spontaneous, and in an
|
|
36
|
+
* exclusive accordion (session-scope-control.tsx) both sections were open
|
|
37
|
+
* together for that frame.
|
|
38
|
+
* 3. `onOpenChange` was called from inside the `setState` updater. React
|
|
39
|
+
* requires updaters to be pure and is free to invoke them more than once;
|
|
40
|
+
* a parent whose handler toggles (`onOpenChange={() => toggleThing()}` —
|
|
41
|
+
* what both session lists pass) then nets to zero and never moves.
|
|
42
|
+
* 4. `open` defaulted to `false`, so "controlled and closed" and "uncontrolled"
|
|
43
|
+
* were indistinguishable and no caller could opt out of being controlled.
|
|
44
|
+
*
|
|
45
|
+
* Here `open` is read straight from whichever source owns it, so a controlled
|
|
46
|
+
* parent's change lands in the same commit as its own render, and `toggle`
|
|
47
|
+
* always derives from the value actually on screen.
|
|
48
|
+
*/
|
|
49
|
+
function DisclosureProvider({ children, open: openProp, defaultOpen = false, onOpenChange, variants, }) {
|
|
50
|
+
const isControlled = openProp !== undefined;
|
|
51
|
+
const contentId = useId();
|
|
52
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
|
|
53
|
+
const open = isControlled ? openProp : uncontrolledOpen;
|
|
54
|
+
const toggle = useCallback(() => {
|
|
55
|
+
const { nextOpen, writesInternalState } = resolveDisclosureToggle({ open, isControlled });
|
|
56
|
+
if (writesInternalState)
|
|
57
|
+
setUncontrolledOpen(nextOpen);
|
|
58
|
+
// In the event handler, once — never inside a state updater.
|
|
59
|
+
onOpenChange?.(nextOpen);
|
|
60
|
+
}, [open, isControlled, onOpenChange]);
|
|
61
|
+
/**
|
|
62
|
+
* A fresh object here re-rendered every `useDisclosure()` consumer on every
|
|
63
|
+
* render of this provider, whether or not `open` had changed — and a session
|
|
64
|
+
* transcript nests two to three disclosures per tool row (the chain step, the
|
|
65
|
+
* tool's own collapsible, sometimes a group), so the churn multiplied by every
|
|
66
|
+
* row on screen.
|
|
67
|
+
*/
|
|
68
|
+
const value = useMemo(() => ({ open, toggle, contentId, variants }), [open, toggle, contentId, variants]);
|
|
69
|
+
return _jsx(DisclosureContext.Provider, { value: value, children: children });
|
|
70
|
+
}
|
|
71
|
+
function useDisclosure() {
|
|
72
|
+
const context = useContext(DisclosureContext);
|
|
73
|
+
if (!context) {
|
|
74
|
+
throw new Error('useDisclosure must be used within a DisclosureProvider');
|
|
75
|
+
}
|
|
76
|
+
return context;
|
|
77
|
+
}
|
|
78
|
+
function DisclosureRoot({ className, children, }) {
|
|
79
|
+
const { open } = useDisclosure();
|
|
80
|
+
return (_jsx("div", { className: className, "data-state": open ? 'open' : 'closed', children: children }));
|
|
81
|
+
}
|
|
82
|
+
export function Disclosure({ open: openProp, defaultOpen, onOpenChange, children, className, transition, variants, variant = 'default', }) {
|
|
83
|
+
return (_jsx(MotionConfig, { transition: transition, children: _jsx(DisclosureProvider, { open: openProp, defaultOpen: defaultOpen, onOpenChange: onOpenChange, variants: variants, children: _jsxs(DisclosureRoot, { className: cn(variant === 'outline' && 'group border-border w-full rounded-md border shadow-none', className), children: [React.Children.toArray(children)[0], React.Children.toArray(children)[1]] }) }) }));
|
|
84
|
+
}
|
|
85
|
+
export function DisclosureTrigger({ children, className, variant = 'default', }) {
|
|
86
|
+
const { toggle, open, contentId } = useDisclosure();
|
|
87
|
+
return (_jsx(_Fragment, { children: React.Children.map(children, (child) => {
|
|
88
|
+
if (!React.isValidElement(child))
|
|
89
|
+
return child;
|
|
90
|
+
const typedChild = child;
|
|
91
|
+
const childClassName = typedChild.props.className;
|
|
92
|
+
return React.cloneElement(typedChild, {
|
|
93
|
+
onClick: toggle,
|
|
94
|
+
role: 'button',
|
|
95
|
+
'aria-expanded': open,
|
|
96
|
+
// The region is unmounted while collapsed, so only promise an id that
|
|
97
|
+
// is actually in the document.
|
|
98
|
+
'aria-controls': open ? contentId : undefined,
|
|
99
|
+
tabIndex: 0,
|
|
100
|
+
onKeyDown: (e) => {
|
|
101
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
102
|
+
e.preventDefault();
|
|
103
|
+
toggle();
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
className: cn(className, 'select-none', childClassName, variant === 'outline' &&
|
|
107
|
+
'group-data-[state=open]:rounded-b-none group-data-[state=open]:border-b-0'),
|
|
108
|
+
});
|
|
109
|
+
}) }));
|
|
110
|
+
}
|
|
111
|
+
export function DisclosureContent({ children, className, contentClassName, variant = 'default', }) {
|
|
112
|
+
const { open, variants, contentId } = useDisclosure();
|
|
113
|
+
const BASE_VARIANTS = {
|
|
114
|
+
expanded: {
|
|
115
|
+
height: 'auto',
|
|
116
|
+
opacity: 1,
|
|
117
|
+
},
|
|
118
|
+
collapsed: {
|
|
119
|
+
height: 0,
|
|
120
|
+
opacity: 0,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
const combinedVariants = {
|
|
124
|
+
expanded: { ...BASE_VARIANTS.expanded, ...variants?.expanded },
|
|
125
|
+
collapsed: { ...BASE_VARIANTS.collapsed, ...variants?.collapsed },
|
|
126
|
+
};
|
|
127
|
+
return (_jsx("div", { className: cn('overflow-hidden', variant === 'outline' && 'group-data-[state=open]:rounded-b-md', className), children: _jsx(AnimatePresence, { initial: false, children: open && (_jsx(m.div, { id: contentId, initial: "collapsed", animate: "expanded", exit: "collapsed", variants: combinedVariants, className: contentClassName, children: children })) }) }));
|
|
128
|
+
}
|
|
129
|
+
export function DisclosureBody({ children, className }) {
|
|
130
|
+
return _jsx("div", { className: cn('p-3 pt-0', className), children: children });
|
|
131
|
+
}
|
|
132
|
+
export default {
|
|
133
|
+
Disclosure,
|
|
134
|
+
DisclosureBody,
|
|
135
|
+
DisclosureProvider,
|
|
136
|
+
DisclosureTrigger,
|
|
137
|
+
DisclosureContent,
|
|
138
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createDotm3x3Component, isCenterCell3, outerRingClockwise3NormFromIndex, outerRingClockwise3OrderValue, wave3PathOpacityFromNorm, } from '../../../lib/dotmatrix-core.js';
|
|
3
|
+
const animationResolver = ({ isActive, index, row, col, reducedMotion, phase, }) => {
|
|
4
|
+
if (!isActive) {
|
|
5
|
+
return { className: 'dmx-inactive' };
|
|
6
|
+
}
|
|
7
|
+
if (isCenterCell3(row, col)) {
|
|
8
|
+
if (reducedMotion || phase === 'idle') {
|
|
9
|
+
return { style: { opacity: 0.2 } };
|
|
10
|
+
}
|
|
11
|
+
return { className: 'dmx-core-pulse-3' };
|
|
12
|
+
}
|
|
13
|
+
const order = outerRingClockwise3OrderValue(index);
|
|
14
|
+
const path = outerRingClockwise3NormFromIndex(index);
|
|
15
|
+
const style = {
|
|
16
|
+
'--dmx-frame-order': order,
|
|
17
|
+
'--dmx-path': path,
|
|
18
|
+
};
|
|
19
|
+
if (reducedMotion || phase === 'idle') {
|
|
20
|
+
return {
|
|
21
|
+
style: {
|
|
22
|
+
...style,
|
|
23
|
+
opacity: wave3PathOpacityFromNorm(path),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return { className: 'dmx-frame-chase-3', style };
|
|
28
|
+
};
|
|
29
|
+
export const Dotm3x3_10 = createDotm3x3Component('Dotm3x3_10', animationResolver, 1.75);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createDotm3x3Component } from '../../../lib/dotmatrix-core.js';
|
|
3
|
+
const animationResolver = ({ isActive, distanceFromCenter, reducedMotion, phase, }) => {
|
|
4
|
+
if (!isActive) {
|
|
5
|
+
return { className: 'dmx-inactive' };
|
|
6
|
+
}
|
|
7
|
+
const ring = Math.max(0, Math.min(2, Math.round(distanceFromCenter)));
|
|
8
|
+
const style = { '--dmx-distance': distanceFromCenter };
|
|
9
|
+
if (reducedMotion || phase === 'idle') {
|
|
10
|
+
return {
|
|
11
|
+
style: {
|
|
12
|
+
...style,
|
|
13
|
+
opacity: 0.06 + (1 - ring / 2) * 0.82,
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return { className: 'dmx-distance-ripple-3', style };
|
|
18
|
+
};
|
|
19
|
+
export const Dotm3x3_12 = createDotm3x3Component('Dotm3x3_12', animationResolver, 1.75);
|