@elizaos/ui 2.0.0-alpha.13 → 2.0.0-alpha.140
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/package.json +76 -49
- package/packages/ui/src/components/composites/chat/chat-attachment-strip.d.ts +9 -0
- package/packages/ui/src/components/composites/chat/chat-attachment-strip.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-attachment-strip.js +8 -0
- package/packages/ui/src/components/composites/chat/chat-bubble.d.ts +14 -0
- package/packages/ui/src/components/composites/chat/chat-bubble.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-bubble.js +14 -0
- package/packages/ui/src/components/composites/chat/chat-composer-shell.d.ts +10 -0
- package/packages/ui/src/components/composites/chat/chat-composer-shell.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-composer-shell.js +16 -0
- package/packages/ui/src/components/composites/chat/chat-composer.d.ts +39 -0
- package/packages/ui/src/components/composites/chat/chat-composer.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-composer.js +148 -0
- package/packages/ui/src/components/composites/chat/chat-conversation-item.d.ts +21 -0
- package/packages/ui/src/components/composites/chat/chat-conversation-item.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-conversation-item.js +120 -0
- package/packages/ui/src/components/composites/chat/chat-conversation-rename-dialog.d.ts +22 -0
- package/packages/ui/src/components/composites/chat/chat-conversation-rename-dialog.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-conversation-rename-dialog.js +14 -0
- package/packages/ui/src/components/composites/chat/chat-empty-state.d.ts +19 -0
- package/packages/ui/src/components/composites/chat/chat-empty-state.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-empty-state.js +8 -0
- package/packages/ui/src/components/composites/chat/chat-message-actions.d.ts +14 -0
- package/packages/ui/src/components/composites/chat/chat-message-actions.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-message-actions.js +10 -0
- package/packages/ui/src/components/composites/chat/chat-message.d.ts +18 -0
- package/packages/ui/src/components/composites/chat/chat-message.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-message.js +275 -0
- package/packages/ui/src/components/composites/chat/chat-sidebar.d.ts +54 -0
- package/packages/ui/src/components/composites/chat/chat-sidebar.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-sidebar.js +64 -0
- package/packages/ui/src/components/composites/chat/chat-source.d.ts +19 -0
- package/packages/ui/src/components/composites/chat/chat-source.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-source.js +127 -0
- package/packages/ui/src/components/composites/chat/chat-thread-layout.d.ts +18 -0
- package/packages/ui/src/components/composites/chat/chat-thread-layout.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-thread-layout.js +28 -0
- package/packages/ui/src/components/composites/chat/chat-transcript.d.ts +19 -0
- package/packages/ui/src/components/composites/chat/chat-transcript.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-transcript.js +82 -0
- package/packages/ui/src/components/composites/chat/chat-types.d.ts +90 -0
- package/packages/ui/src/components/composites/chat/chat-types.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-types.js +1 -0
- package/packages/ui/src/components/composites/chat/chat-typing-indicator.d.ts +10 -0
- package/packages/ui/src/components/composites/chat/chat-typing-indicator.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/chat-typing-indicator.js +11 -0
- package/packages/ui/src/components/composites/chat/create-task-popover.d.ts +8 -0
- package/packages/ui/src/components/composites/chat/create-task-popover.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/create-task-popover.js +44 -0
- package/packages/ui/src/components/composites/chat/index.d.ts +17 -0
- package/packages/ui/src/components/composites/chat/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/chat/index.js +16 -0
- package/packages/ui/src/components/composites/form-field/form-field.d.ts +14 -0
- package/packages/ui/src/components/composites/form-field/form-field.d.ts.map +1 -0
- package/packages/ui/src/components/composites/form-field/form-field.js +8 -0
- package/packages/ui/src/components/composites/form-field/index.d.ts +2 -0
- package/packages/ui/src/components/composites/form-field/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/form-field/index.js +1 -0
- package/packages/ui/src/components/composites/index.d.ts +27 -0
- package/packages/ui/src/components/composites/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/index.js +26 -0
- package/packages/ui/src/components/composites/page-panel/index.d.ts +29 -0
- package/packages/ui/src/components/composites/page-panel/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/index.js +28 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-collapsible-section.d.ts +4 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-collapsible-section.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-collapsible-section.js +60 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-empty.d.ts +3 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-empty.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-empty.js +15 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-frame.d.ts +5 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-frame.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-frame.js +9 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-header.d.ts +7 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-header.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-header.js +30 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-loading.d.ts +3 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-loading.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-loading.js +13 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-root.d.ts +7 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-root.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-root.js +17 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-toolbar.d.ts +4 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-toolbar.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-toolbar.js +6 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-types.d.ts +66 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-types.d.ts.map +1 -0
- package/packages/ui/src/components/composites/page-panel/page-panel-types.js +1 -0
- package/packages/ui/src/components/composites/search/index.d.ts +3 -0
- package/packages/ui/src/components/composites/search/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/search/index.js +2 -0
- package/packages/ui/src/components/composites/search/search-input.d.ts.map +1 -0
- package/{dist/components/ui → packages/ui/src/components/composites/search}/search-input.js +3 -2
- package/{dist/components/ui/search-bar.d.ts → packages/ui/src/components/composites/search/searchbar.d.ts} +8 -7
- package/packages/ui/src/components/composites/search/searchbar.d.ts.map +1 -0
- package/packages/ui/src/components/composites/search/searchbar.js +25 -0
- package/packages/ui/src/components/composites/sidebar/index.d.ts +11 -0
- package/packages/ui/src/components/composites/sidebar/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/index.js +10 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-auto-rail.d.ts +15 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-auto-rail.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-auto-rail.js +292 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-body.d.ts +4 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-body.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-body.js +7 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-collapsed-rail.d.ts +11 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-collapsed-rail.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-collapsed-rail.js +13 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-content.d.ts +78 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-content.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-content.js +89 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-filter-bar.d.ts +3 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-filter-bar.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-filter-bar.js +14 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-header-stack.d.ts +3 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-header-stack.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-header-stack.js +6 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-header.d.ts +9 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-header.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-header.js +6 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-panel.d.ts +3 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-panel.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-panel.js +18 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-root.d.ts +4 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-root.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-root.js +448 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-scroll-region.d.ts +3 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-scroll-region.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-scroll-region.js +18 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-types.d.ts +59 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-types.d.ts.map +1 -0
- package/packages/ui/src/components/composites/sidebar/sidebar-types.js +1 -0
- package/packages/ui/src/components/composites/skills/index.d.ts +2 -0
- package/packages/ui/src/components/composites/skills/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/skills/index.js +1 -0
- package/packages/ui/src/components/composites/skills/skill-sidebar-item.d.ts +16 -0
- package/packages/ui/src/components/composites/skills/skill-sidebar-item.d.ts.map +1 -0
- package/packages/ui/src/components/composites/skills/skill-sidebar-item.js +7 -0
- package/packages/ui/src/components/composites/trajectories/index.d.ts +5 -0
- package/packages/ui/src/components/composites/trajectories/index.d.ts.map +1 -0
- package/packages/ui/src/components/composites/trajectories/index.js +4 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-code-block.d.ts +13 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-code-block.d.ts.map +1 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-code-block.js +13 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-llm-call-card.d.ts +34 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-llm-call-card.d.ts.map +1 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-llm-call-card.js +14 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-pipeline-graph.d.ts +26 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-pipeline-graph.d.ts.map +1 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-pipeline-graph.js +46 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-sidebar-item.d.ts +15 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-sidebar-item.d.ts.map +1 -0
- package/packages/ui/src/components/composites/trajectories/trajectory-sidebar-item.js +8 -0
- package/packages/ui/src/components/primitives/index.d.ts +26 -0
- package/packages/ui/src/components/primitives/index.d.ts.map +1 -0
- package/packages/ui/src/components/primitives/index.js +25 -0
- package/packages/ui/src/components/ui/admin-dialog.d.ts +50 -0
- package/packages/ui/src/components/ui/admin-dialog.d.ts.map +1 -0
- package/packages/ui/src/components/ui/admin-dialog.js +48 -0
- package/{dist → packages/ui/src}/components/ui/badge.d.ts +1 -1
- package/packages/ui/src/components/ui/badge.d.ts.map +1 -0
- package/packages/ui/src/components/ui/banner.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/banner.js +2 -1
- package/{dist → packages/ui/src}/components/ui/button.d.ts +1 -1
- package/packages/ui/src/components/ui/button.d.ts.map +1 -0
- package/packages/ui/src/components/ui/button.js +39 -0
- package/{dist → packages/ui/src}/components/ui/card.d.ts +8 -2
- package/packages/ui/src/components/ui/card.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/card.js +17 -2
- package/packages/ui/src/components/ui/checkbox.d.ts.map +1 -0
- package/packages/ui/src/components/ui/confirm-delete.d.ts +20 -0
- package/packages/ui/src/components/ui/confirm-delete.d.ts.map +1 -0
- package/packages/ui/src/components/ui/confirm-delete.js +16 -0
- package/packages/ui/src/components/ui/confirm-dialog.d.ts +49 -0
- package/packages/ui/src/components/ui/confirm-dialog.d.ts.map +1 -0
- package/packages/ui/src/components/ui/confirm-dialog.js +90 -0
- package/{dist → packages/ui/src}/components/ui/connection-status.d.ts +6 -0
- package/packages/ui/src/components/ui/connection-status.d.ts.map +1 -0
- package/packages/ui/src/components/ui/connection-status.js +25 -0
- package/packages/ui/src/components/ui/copy-button.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/dialog.d.ts +6 -1
- package/packages/ui/src/components/ui/dialog.d.ts.map +1 -0
- package/packages/ui/src/components/ui/dialog.js +23 -0
- package/packages/ui/src/components/ui/drawer-sheet.d.ts +19 -0
- package/packages/ui/src/components/ui/drawer-sheet.d.ts.map +1 -0
- package/packages/ui/src/components/ui/drawer-sheet.js +21 -0
- package/packages/ui/src/components/ui/dropdown-menu.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/dropdown-menu.js +1 -1
- package/packages/ui/src/components/ui/empty-state.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/error-boundary.d.ts +5 -1
- package/packages/ui/src/components/ui/error-boundary.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/error-boundary.js +1 -1
- package/packages/ui/src/components/ui/field-switch.d.ts +8 -0
- package/packages/ui/src/components/ui/field-switch.d.ts.map +1 -0
- package/packages/ui/src/components/ui/field-switch.js +10 -0
- package/packages/ui/src/components/ui/field.d.ts +11 -0
- package/packages/ui/src/components/ui/field.d.ts.map +1 -0
- package/packages/ui/src/components/ui/field.js +21 -0
- package/packages/ui/src/components/ui/form-select.d.ts +13 -0
- package/packages/ui/src/components/ui/form-select.d.ts.map +1 -0
- package/packages/ui/src/components/ui/form-select.js +9 -0
- package/{dist → packages/ui/src}/components/ui/grid.d.ts +1 -1
- package/packages/ui/src/components/ui/grid.d.ts.map +1 -0
- package/packages/ui/src/components/ui/input.d.ts +12 -0
- package/packages/ui/src/components/ui/input.d.ts.map +1 -0
- package/packages/ui/src/components/ui/input.js +28 -0
- package/packages/ui/src/components/ui/label.d.ts.map +1 -0
- package/packages/ui/src/components/ui/new-action-button.d.ts +7 -0
- package/packages/ui/src/components/ui/new-action-button.d.ts.map +1 -0
- package/packages/ui/src/components/ui/new-action-button.js +13 -0
- package/packages/ui/src/components/ui/popover.d.ts.map +1 -0
- package/packages/ui/src/components/ui/save-footer.d.ts.map +1 -0
- package/packages/ui/src/components/ui/save-footer.js +10 -0
- package/packages/ui/src/components/ui/section-card.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/section-card.js +3 -2
- package/packages/ui/src/components/ui/segmented-control.d.ts +18 -0
- package/packages/ui/src/components/ui/segmented-control.d.ts.map +1 -0
- package/packages/ui/src/components/ui/segmented-control.js +10 -0
- package/packages/ui/src/components/ui/select.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/select.js +7 -6
- package/packages/ui/src/components/ui/separator.d.ts.map +1 -0
- package/packages/ui/src/components/ui/settings-controls.d.ts +41 -0
- package/packages/ui/src/components/ui/settings-controls.d.ts.map +1 -0
- package/packages/ui/src/components/ui/settings-controls.js +60 -0
- package/packages/ui/src/components/ui/skeleton.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/skeleton.js +1 -2
- package/packages/ui/src/components/ui/slider.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/slider.js +1 -1
- package/packages/ui/src/components/ui/sonner.d.ts +2 -0
- package/packages/ui/src/components/ui/sonner.d.ts.map +1 -0
- package/packages/ui/src/components/ui/sonner.js +1 -0
- package/packages/ui/src/components/ui/spinner.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/stack.d.ts +1 -1
- package/packages/ui/src/components/ui/stack.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/status-badge.d.ts +11 -4
- package/packages/ui/src/components/ui/status-badge.d.ts.map +1 -0
- package/packages/ui/src/components/ui/status-badge.js +70 -0
- package/packages/ui/src/components/ui/switch.d.ts.map +1 -0
- package/packages/ui/src/components/ui/switch.js +7 -0
- package/packages/ui/src/components/ui/tabs.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/tabs.js +1 -1
- package/packages/ui/src/components/ui/tag-editor.d.ts +12 -0
- package/packages/ui/src/components/ui/tag-editor.d.ts.map +1 -0
- package/packages/ui/src/components/ui/tag-editor.js +34 -0
- package/packages/ui/src/components/ui/tag-input.d.ts +3 -0
- package/packages/ui/src/components/ui/tag-input.d.ts.map +1 -0
- package/packages/ui/src/components/ui/tag-input.js +1 -0
- package/packages/ui/src/components/ui/textarea.d.ts +12 -0
- package/packages/ui/src/components/ui/textarea.d.ts.map +1 -0
- package/packages/ui/src/components/ui/textarea.js +28 -0
- package/{dist → packages/ui/src}/components/ui/themed-select.d.ts +3 -8
- package/packages/ui/src/components/ui/themed-select.d.ts.map +1 -0
- package/packages/ui/src/components/ui/themed-select.js +137 -0
- package/{dist → packages/ui/src}/components/ui/tooltip-extended.d.ts +3 -25
- package/packages/ui/src/components/ui/tooltip-extended.d.ts.map +1 -0
- package/packages/ui/src/components/ui/tooltip-extended.js +116 -0
- package/{dist → packages/ui/src}/components/ui/tooltip.d.ts +10 -0
- package/packages/ui/src/components/ui/tooltip.d.ts.map +1 -0
- package/packages/ui/src/components/ui/tooltip.js +13 -0
- package/{dist → packages/ui/src}/components/ui/typography.d.ts +2 -2
- package/packages/ui/src/components/ui/typography.d.ts.map +1 -0
- package/{dist → packages/ui/src}/components/ui/typography.js +1 -1
- package/packages/ui/src/hooks/index.d.ts +6 -0
- package/packages/ui/src/hooks/index.d.ts.map +1 -0
- package/packages/ui/src/hooks/index.js +5 -0
- package/packages/ui/src/hooks/useClickOutside.d.ts +3 -0
- package/packages/ui/src/hooks/useClickOutside.d.ts.map +1 -0
- package/packages/ui/src/hooks/useClickOutside.js +22 -0
- package/packages/ui/src/hooks/useDocumentVisibility.d.ts +3 -0
- package/packages/ui/src/hooks/useDocumentVisibility.d.ts.map +1 -0
- package/packages/ui/src/hooks/useDocumentVisibility.js +28 -0
- package/packages/ui/src/hooks/useKeyboardShortcuts.d.ts +13 -0
- package/packages/ui/src/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/packages/ui/src/hooks/useKeyboardShortcuts.js +34 -0
- package/packages/ui/src/hooks/useLinkedSidebarSelection.d.ts +16 -0
- package/packages/ui/src/hooks/useLinkedSidebarSelection.d.ts.map +1 -0
- package/packages/ui/src/hooks/useLinkedSidebarSelection.js +117 -0
- package/packages/ui/src/hooks/useTimeout.d.ts +5 -0
- package/packages/ui/src/hooks/useTimeout.d.ts.map +1 -0
- package/packages/ui/src/hooks/useTimeout.js +26 -0
- package/packages/ui/src/index.d.ts +8 -0
- package/packages/ui/src/index.d.ts.map +1 -0
- package/packages/ui/src/index.js +7 -0
- package/packages/ui/src/layouts/chat-panel-layout/chat-panel-layout.d.ts +11 -0
- package/packages/ui/src/layouts/chat-panel-layout/chat-panel-layout.d.ts.map +1 -0
- package/packages/ui/src/layouts/chat-panel-layout/chat-panel-layout.js +37 -0
- package/packages/ui/src/layouts/chat-panel-layout/index.d.ts +2 -0
- package/packages/ui/src/layouts/chat-panel-layout/index.d.ts.map +1 -0
- package/packages/ui/src/layouts/chat-panel-layout/index.js +1 -0
- package/packages/ui/src/layouts/content-layout/content-layout.d.ts +21 -0
- package/packages/ui/src/layouts/content-layout/content-layout.d.ts.map +1 -0
- package/packages/ui/src/layouts/content-layout/content-layout.js +5 -0
- package/packages/ui/src/layouts/content-layout/index.d.ts +2 -0
- package/packages/ui/src/layouts/content-layout/index.d.ts.map +1 -0
- package/packages/ui/src/layouts/content-layout/index.js +1 -0
- package/packages/ui/src/layouts/index.d.ts +5 -0
- package/packages/ui/src/layouts/index.d.ts.map +1 -0
- package/packages/ui/src/layouts/index.js +4 -0
- package/packages/ui/src/layouts/layout-test-utils.d.ts +6 -0
- package/packages/ui/src/layouts/layout-test-utils.d.ts.map +1 -0
- package/packages/ui/src/layouts/layout-test-utils.js +36 -0
- package/packages/ui/src/layouts/page-layout/index.d.ts +5 -0
- package/packages/ui/src/layouts/page-layout/index.d.ts.map +1 -0
- package/packages/ui/src/layouts/page-layout/index.js +4 -0
- package/packages/ui/src/layouts/page-layout/page-layout-header.d.ts +5 -0
- package/packages/ui/src/layouts/page-layout/page-layout-header.d.ts.map +1 -0
- package/packages/ui/src/layouts/page-layout/page-layout-header.js +5 -0
- package/packages/ui/src/layouts/page-layout/page-layout-mobile-drawer.d.ts +3 -0
- package/packages/ui/src/layouts/page-layout/page-layout-mobile-drawer.d.ts.map +1 -0
- package/packages/ui/src/layouts/page-layout/page-layout-mobile-drawer.js +18 -0
- package/packages/ui/src/layouts/page-layout/page-layout-types.d.ts +15 -0
- package/packages/ui/src/layouts/page-layout/page-layout-types.d.ts.map +1 -0
- package/packages/ui/src/layouts/page-layout/page-layout-types.js +1 -0
- package/packages/ui/src/layouts/page-layout/page-layout.d.ts +3 -0
- package/packages/ui/src/layouts/page-layout/page-layout.d.ts.map +1 -0
- package/packages/ui/src/layouts/page-layout/page-layout.js +5 -0
- package/packages/ui/src/layouts/workspace-layout/index.d.ts +3 -0
- package/packages/ui/src/layouts/workspace-layout/index.d.ts.map +1 -0
- package/packages/ui/src/layouts/workspace-layout/index.js +2 -0
- package/packages/ui/src/layouts/workspace-layout/workspace-layout-types.d.ts +19 -0
- package/packages/ui/src/layouts/workspace-layout/workspace-layout-types.d.ts.map +1 -0
- package/packages/ui/src/layouts/workspace-layout/workspace-layout-types.js +1 -0
- package/packages/ui/src/layouts/workspace-layout/workspace-layout.d.ts +3 -0
- package/packages/ui/src/layouts/workspace-layout/workspace-layout.d.ts.map +1 -0
- package/packages/ui/src/layouts/workspace-layout/workspace-layout.js +50 -0
- package/packages/ui/src/lib/floating-layers.d.ts +17 -0
- package/packages/ui/src/lib/floating-layers.d.ts.map +1 -0
- package/packages/ui/src/lib/floating-layers.js +20 -0
- package/packages/ui/src/lib/utils.d.ts +3 -0
- package/packages/ui/src/lib/utils.d.ts.map +1 -0
- package/{dist → packages/ui/src}/lib/utils.js +0 -3
- package/packages/ui/src/stories/layout-story-fixtures.d.ts +14 -0
- package/packages/ui/src/stories/layout-story-fixtures.d.ts.map +1 -0
- package/packages/ui/src/stories/layout-story-fixtures.js +33 -0
- package/styles/theme.css +7 -0
- package/README.md +0 -6
- package/dist/components/ui/badge.d.ts.map +0 -1
- package/dist/components/ui/banner.d.ts.map +0 -1
- package/dist/components/ui/button.d.ts.map +0 -1
- package/dist/components/ui/button.js +0 -33
- package/dist/components/ui/card.d.ts.map +0 -1
- package/dist/components/ui/chat-atoms.d.ts +0 -26
- package/dist/components/ui/chat-atoms.d.ts.map +0 -1
- package/dist/components/ui/chat-atoms.js +0 -17
- package/dist/components/ui/checkbox.d.ts.map +0 -1
- package/dist/components/ui/confirm-delete.d.ts +0 -12
- package/dist/components/ui/confirm-delete.d.ts.map +0 -1
- package/dist/components/ui/confirm-delete.js +0 -13
- package/dist/components/ui/confirm-dialog.d.ts +0 -24
- package/dist/components/ui/confirm-dialog.d.ts.map +0 -1
- package/dist/components/ui/confirm-dialog.js +0 -55
- package/dist/components/ui/connection-status.d.ts.map +0 -1
- package/dist/components/ui/connection-status.js +0 -25
- package/dist/components/ui/copy-button.d.ts.map +0 -1
- package/dist/components/ui/dialog.d.ts.map +0 -1
- package/dist/components/ui/dialog.js +0 -22
- package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
- package/dist/components/ui/empty-state.d.ts.map +0 -1
- package/dist/components/ui/error-boundary.d.ts.map +0 -1
- package/dist/components/ui/grid.d.ts.map +0 -1
- package/dist/components/ui/input.d.ts +0 -6
- package/dist/components/ui/input.d.ts.map +0 -1
- package/dist/components/ui/input.js +0 -8
- package/dist/components/ui/label.d.ts.map +0 -1
- package/dist/components/ui/popover.d.ts.map +0 -1
- package/dist/components/ui/save-footer.d.ts.map +0 -1
- package/dist/components/ui/save-footer.js +0 -9
- package/dist/components/ui/search-bar.d.ts.map +0 -1
- package/dist/components/ui/search-bar.js +0 -19
- package/dist/components/ui/search-input.d.ts.map +0 -1
- package/dist/components/ui/section-card.d.ts.map +0 -1
- package/dist/components/ui/select.d.ts.map +0 -1
- package/dist/components/ui/separator.d.ts.map +0 -1
- package/dist/components/ui/skeleton.d.ts.map +0 -1
- package/dist/components/ui/slider.d.ts.map +0 -1
- package/dist/components/ui/sonner.d.ts +0 -5
- package/dist/components/ui/sonner.d.ts.map +0 -1
- package/dist/components/ui/sonner.js +0 -15
- package/dist/components/ui/spinner.d.ts.map +0 -1
- package/dist/components/ui/stack.d.ts.map +0 -1
- package/dist/components/ui/status-badge.d.ts.map +0 -1
- package/dist/components/ui/status-badge.js +0 -41
- package/dist/components/ui/switch.d.ts.map +0 -1
- package/dist/components/ui/switch.js +0 -7
- package/dist/components/ui/tabs.d.ts.map +0 -1
- package/dist/components/ui/tag-editor.d.ts +0 -24
- package/dist/components/ui/tag-editor.d.ts.map +0 -1
- package/dist/components/ui/tag-editor.js +0 -32
- package/dist/components/ui/tag-input.d.ts +0 -19
- package/dist/components/ui/tag-input.d.ts.map +0 -1
- package/dist/components/ui/tag-input.js +0 -28
- package/dist/components/ui/textarea.d.ts +0 -6
- package/dist/components/ui/textarea.d.ts.map +0 -1
- package/dist/components/ui/textarea.js +0 -8
- package/dist/components/ui/themed-select.d.ts.map +0 -1
- package/dist/components/ui/themed-select.js +0 -57
- package/dist/components/ui/tooltip-extended.d.ts.map +0 -1
- package/dist/components/ui/tooltip-extended.js +0 -128
- package/dist/components/ui/tooltip.d.ts.map +0 -1
- package/dist/components/ui/tooltip.js +0 -10
- package/dist/components/ui/typography.d.ts.map +0 -1
- package/dist/index.d.ts +0 -42
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -43
- package/dist/lib/button-styles.d.ts +0 -12
- package/dist/lib/button-styles.d.ts.map +0 -1
- package/dist/lib/button-styles.js +0 -11
- package/dist/lib/utils.d.ts +0 -6
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/package.json +0 -64
- package/dist/styles/theme.css +0 -193
- package/src/styles/theme.css +0 -193
- /package/{dist/components/ui → packages/ui/src/components/composites/search}/search-input.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/badge.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/banner.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/checkbox.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/checkbox.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/copy-button.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/copy-button.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/dropdown-menu.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/empty-state.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/empty-state.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/grid.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/label.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/label.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/popover.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/popover.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/save-footer.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/section-card.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/select.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/separator.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/separator.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/skeleton.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/slider.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/spinner.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/spinner.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/stack.js +0 -0
- /package/{dist → packages/ui/src}/components/ui/switch.d.ts +0 -0
- /package/{dist → packages/ui/src}/components/ui/tabs.d.ts +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronDown } from "lucide-react";
|
|
3
|
+
import { useEffect, useId, useMemo, useRef, useState, } from "react";
|
|
4
|
+
import { Z_MODAL } from "../../lib/floating-layers";
|
|
5
|
+
import { Button } from "./button";
|
|
6
|
+
export function ThemedSelect({ value, groups, onChange, placeholder = "Select…", menuPlacement = "bottom", className = "", triggerClassName = "", menuClassName = "", ariaLabel, ariaLabelledBy, }) {
|
|
7
|
+
const [open, setOpen] = useState(false);
|
|
8
|
+
const [highlightedIndex, setHighlightedIndex] = useState(-1);
|
|
9
|
+
const rootRef = useRef(null);
|
|
10
|
+
const triggerRef = useRef(null);
|
|
11
|
+
const optionRefs = useRef([]);
|
|
12
|
+
const triggerId = useId();
|
|
13
|
+
const listboxId = useId();
|
|
14
|
+
const options = useMemo(() => groups.flatMap((group) => group.items.map((item) => ({
|
|
15
|
+
...item,
|
|
16
|
+
groupLabel: group.label,
|
|
17
|
+
}))), [groups]);
|
|
18
|
+
const selectedIndex = value
|
|
19
|
+
? options.findIndex((option) => option.id === value)
|
|
20
|
+
: -1;
|
|
21
|
+
const selectedItem = selectedIndex >= 0 ? options[selectedIndex] : null;
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!open)
|
|
24
|
+
return;
|
|
25
|
+
const handlePointerDown = (event) => {
|
|
26
|
+
if (!rootRef.current?.contains(event.target)) {
|
|
27
|
+
setOpen(false);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
document.addEventListener("mousedown", handlePointerDown);
|
|
31
|
+
return () => document.removeEventListener("mousedown", handlePointerDown);
|
|
32
|
+
}, [open]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!open) {
|
|
35
|
+
setHighlightedIndex(selectedIndex >= 0 ? selectedIndex : 0);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const nextIndex = highlightedIndex >= 0
|
|
39
|
+
? highlightedIndex
|
|
40
|
+
: selectedIndex >= 0
|
|
41
|
+
? selectedIndex
|
|
42
|
+
: 0;
|
|
43
|
+
setHighlightedIndex(nextIndex);
|
|
44
|
+
optionRefs.current[nextIndex]?.focus();
|
|
45
|
+
}, [highlightedIndex, open, selectedIndex]);
|
|
46
|
+
const moveHighlight = (direction) => {
|
|
47
|
+
if (options.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
const baseIndex = highlightedIndex >= 0
|
|
50
|
+
? highlightedIndex
|
|
51
|
+
: selectedIndex >= 0
|
|
52
|
+
? selectedIndex
|
|
53
|
+
: 0;
|
|
54
|
+
const nextIndex = (baseIndex + direction + options.length) % options.length;
|
|
55
|
+
setHighlightedIndex(nextIndex);
|
|
56
|
+
};
|
|
57
|
+
const commitSelection = (index) => {
|
|
58
|
+
const option = options[index];
|
|
59
|
+
if (!option)
|
|
60
|
+
return;
|
|
61
|
+
onChange(option.id);
|
|
62
|
+
setOpen(false);
|
|
63
|
+
};
|
|
64
|
+
const handleTriggerKeyDown = (event) => {
|
|
65
|
+
switch (event.key) {
|
|
66
|
+
case "ArrowDown":
|
|
67
|
+
case "ArrowUp":
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
if (!open)
|
|
70
|
+
setOpen(true);
|
|
71
|
+
setHighlightedIndex(selectedIndex >= 0
|
|
72
|
+
? selectedIndex
|
|
73
|
+
: event.key === "ArrowUp"
|
|
74
|
+
? options.length - 1
|
|
75
|
+
: 0);
|
|
76
|
+
break;
|
|
77
|
+
case "Enter":
|
|
78
|
+
case " ":
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
setOpen((prev) => !prev);
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const handleOptionKeyDown = (event, index) => {
|
|
87
|
+
switch (event.key) {
|
|
88
|
+
case "ArrowDown":
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
moveHighlight(1);
|
|
91
|
+
break;
|
|
92
|
+
case "ArrowUp":
|
|
93
|
+
event.preventDefault();
|
|
94
|
+
moveHighlight(-1);
|
|
95
|
+
break;
|
|
96
|
+
case "Home":
|
|
97
|
+
event.preventDefault();
|
|
98
|
+
setHighlightedIndex(0);
|
|
99
|
+
break;
|
|
100
|
+
case "End":
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
setHighlightedIndex(options.length - 1);
|
|
103
|
+
break;
|
|
104
|
+
case "Enter":
|
|
105
|
+
case " ":
|
|
106
|
+
event.preventDefault();
|
|
107
|
+
commitSelection(index);
|
|
108
|
+
break;
|
|
109
|
+
case "Escape":
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
setOpen(false);
|
|
112
|
+
triggerRef.current?.focus();
|
|
113
|
+
break;
|
|
114
|
+
case "Tab":
|
|
115
|
+
setOpen(false);
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
return (_jsxs("div", { ref: rootRef, className: `relative min-w-0 w-full ${open ? `z-[${Z_MODAL}]` : ""} ${className}`, children: [_jsxs(Button, { ref: triggerRef, id: triggerId, type: "button", variant: "outline", size: "sm", role: "combobox", "aria-autocomplete": "none", "aria-controls": listboxId, "aria-expanded": open, "aria-haspopup": "listbox", "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, className: `flex h-12 w-full items-center justify-between border-border bg-card px-2.5 py-1.5 text-left text-xs shadow-sm hover:border-accent focus-visible:ring-1 focus-visible:ring-accent ${triggerClassName}`, onClick: () => setOpen((prev) => !prev), onKeyDown: handleTriggerKeyDown, children: [_jsx("span", { className: "truncate", children: selectedItem
|
|
122
|
+
? `${selectedItem.text}${selectedItem.hint ? ` — ${selectedItem.hint}` : ""}`
|
|
123
|
+
: placeholder }), _jsx(ChevronDown, { "aria-hidden": "true", className: `ml-2 h-3.5 w-3.5 shrink-0 text-muted transition-transform ${open ? "rotate-180" : ""}` })] }), open ? (_jsx("div", { id: listboxId, role: "listbox", "aria-labelledby": ariaLabelledBy, className: `absolute left-0 right-0 z-50 max-h-[280px] overflow-y-auto rounded-md border border-border bg-card shadow-lg ${menuPlacement === "top"
|
|
124
|
+
? "bottom-[calc(100%+0.125rem)]"
|
|
125
|
+
: "top-[calc(100%+0.125rem)]"} ${menuClassName}`, children: groups.map((group) => (_jsxs("div", { children: [_jsx("div", { className: "sticky top-0 bg-bg-accent px-2.5 py-1 text-2xs font-semibold text-muted", children: group.label }), group.items.map((item) => {
|
|
126
|
+
const optionIndex = options.findIndex((option) => option.id === item.id);
|
|
127
|
+
const active = item.id === value;
|
|
128
|
+
const highlighted = optionIndex === highlightedIndex;
|
|
129
|
+
return (_jsxs("button", { ref: (node) => {
|
|
130
|
+
optionRefs.current[optionIndex] = node;
|
|
131
|
+
}, type: "button", role: "option", "aria-selected": active, className: `flex w-full items-center justify-between gap-2 px-2.5 py-1.5 text-left text-xs ${active
|
|
132
|
+
? "bg-accent/18 text-accent"
|
|
133
|
+
: highlighted
|
|
134
|
+
? "bg-accent/12 text-txt"
|
|
135
|
+
: "text-txt hover:bg-accent/10 hover:text-txt"}`, onClick: () => commitSelection(optionIndex), onKeyDown: (event) => handleOptionKeyDown(event, optionIndex), children: [_jsx("span", { className: "min-w-0 truncate font-semibold", children: item.text }), item.hint ? (_jsx("span", { className: `min-w-0 truncate ${active ? "text-accent/80" : "text-muted"}`, children: item.hint })) : null] }, item.id));
|
|
136
|
+
})] }, group.label))) })) : null] }));
|
|
137
|
+
}
|
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extended tooltip components for contextual help, icon buttons, guided
|
|
3
|
-
* tours, and spotlight onboarding overlays.
|
|
4
|
-
*
|
|
5
|
-
* All exports here are framework-agnostic (no app context dependency).
|
|
6
|
-
*
|
|
7
|
-
* Note: The Radix-based `Tooltip` is exported from `./tooltip`. This file
|
|
8
|
-
* exports a custom CSS-only hover tooltip (`HoverTooltip`), `IconTooltip`,
|
|
9
|
-
* `Spotlight`, and `useGuidedTour`.
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* CSS-only hover tooltip that wraps any element in a `<button>` and shows
|
|
13
|
-
* a floating content panel on hover/focus. Supports controlled `visible`
|
|
14
|
-
* mode and an optional dismiss button.
|
|
15
|
-
*
|
|
16
|
-
* Use `IconTooltip` for a div-based (non-button) variant that is safe to
|
|
17
|
-
* wrap interactive children.
|
|
18
|
-
*/
|
|
19
1
|
export interface HoverTooltipProps {
|
|
20
2
|
children: React.ReactNode;
|
|
21
3
|
content: React.ReactNode;
|
|
@@ -27,17 +9,13 @@ export interface HoverTooltipProps {
|
|
|
27
9
|
onDismiss?: () => void;
|
|
28
10
|
}
|
|
29
11
|
export declare function HoverTooltip({ children, content, position, delay, showArrow, className, visible: controlledVisible, onDismiss, }: HoverTooltipProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
-
|
|
31
|
-
* Lightweight tooltip for icon buttons.
|
|
32
|
-
*
|
|
33
|
-
* Uses a `<div>` wrapper (not `<button>`) so it can safely wrap interactive
|
|
34
|
-
* elements like icon buttons without nesting buttons.
|
|
35
|
-
*/
|
|
36
|
-
export declare function IconTooltip({ children, label, shortcut, position, }: {
|
|
12
|
+
export declare function IconTooltip({ children, label, shortcut, position, multiline, }: {
|
|
37
13
|
children: React.ReactNode;
|
|
38
14
|
label: string;
|
|
39
15
|
shortcut?: string;
|
|
40
16
|
position?: "top" | "bottom";
|
|
17
|
+
/** Long labels: wrap and cap width. */
|
|
18
|
+
multiline?: boolean;
|
|
41
19
|
}): import("react/jsx-runtime").JSX.Element;
|
|
42
20
|
export interface SpotlightProps {
|
|
43
21
|
target: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip-extended.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/tooltip-extended.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,OAAO,EACP,QAAgB,EAChB,KAAW,EACX,SAAgB,EAChB,SAAc,EACd,OAAO,EAAE,iBAAiB,EAC1B,SAAS,GACV,EAAE,iBAAiB,2CAkFnB;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,SAAiB,GAClB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC5B,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,2CA4BA;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,mCAAmC;IACnC,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,KAAK,EACL,WAAW,EACX,IAAI,EACJ,UAAU,EACV,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAW,GACZ,EAAE,cAAc,kDAsFhB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE;;;;;;;;;EAmC9C"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { X } from "lucide-react";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { Z_OVERLAY, Z_TOOLTIP } from "../../lib/floating-layers";
|
|
5
|
+
import { cn } from "../../lib/utils";
|
|
6
|
+
import { Button } from "./button";
|
|
7
|
+
export function HoverTooltip({ children, content, position = "top", delay = 300, showArrow = true, className = "", visible: controlledVisible, onDismiss, }) {
|
|
8
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
9
|
+
const timeoutRef = useRef(null);
|
|
10
|
+
const containerRef = useRef(null);
|
|
11
|
+
const isVisibleState = controlledVisible !== undefined ? controlledVisible : isVisible;
|
|
12
|
+
const show = useCallback(() => {
|
|
13
|
+
if (timeoutRef.current)
|
|
14
|
+
clearTimeout(timeoutRef.current);
|
|
15
|
+
timeoutRef.current = setTimeout(() => setIsVisible(true), delay);
|
|
16
|
+
}, [delay]);
|
|
17
|
+
const hide = useCallback(() => {
|
|
18
|
+
if (timeoutRef.current)
|
|
19
|
+
clearTimeout(timeoutRef.current);
|
|
20
|
+
timeoutRef.current = setTimeout(() => setIsVisible(false), 150);
|
|
21
|
+
}, []);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
return () => {
|
|
24
|
+
if (timeoutRef.current)
|
|
25
|
+
clearTimeout(timeoutRef.current);
|
|
26
|
+
};
|
|
27
|
+
}, []);
|
|
28
|
+
return (
|
|
29
|
+
// biome-ignore lint/a11y/noStaticElementInteractions: this wrapper centralizes hover/focus handling for arbitrary child content.
|
|
30
|
+
_jsxs("div", { ref: containerRef, className: "relative inline-flex cursor-default", onMouseEnter: show, onMouseLeave: hide, onFocus: show, onBlur: hide, children: [children, isVisibleState && (_jsx("div", { className: cn("absolute z-50", position === "top"
|
|
31
|
+
? "bottom-full left-1/2 -translate-x-1/2 mb-2"
|
|
32
|
+
: position === "bottom"
|
|
33
|
+
? "top-full left-1/2 -translate-x-1/2 mt-2"
|
|
34
|
+
: position === "left"
|
|
35
|
+
? "right-full top-1/2 -translate-y-1/2 mr-2"
|
|
36
|
+
: "left-full top-1/2 -translate-y-1/2 ml-2", className), children: _jsxs("div", { className: "relative bg-bg-elevated border border-border rounded-lg shadow-xl p-3 min-w-[10rem] max-w-xs", children: [onDismiss && (_jsx(Button, { variant: "ghost", size: "icon", onClick: onDismiss, className: "absolute top-1 right-1 h-6 w-6 text-muted hover:text-txt rounded", "aria-label": "Dismiss tooltip", children: _jsx(X, { className: "w-3 h-3" }) })), content, showArrow && (_jsx("div", { className: cn("absolute w-0 h-0 border-4", position === "top"
|
|
37
|
+
? "top-full left-1/2 -translate-x-1/2 border-t-border border-l-transparent border-r-transparent border-b-transparent"
|
|
38
|
+
: position === "bottom"
|
|
39
|
+
? "bottom-full left-1/2 -translate-x-1/2 border-b-border border-l-transparent border-r-transparent border-t-transparent"
|
|
40
|
+
: position === "left"
|
|
41
|
+
? "left-full top-1/2 -translate-y-1/2 border-l-border border-t-transparent border-b-transparent border-r-transparent"
|
|
42
|
+
: "right-full top-1/2 -translate-y-1/2 border-r-border border-t-transparent border-b-transparent border-l-transparent") }))] }) }))] }));
|
|
43
|
+
}
|
|
44
|
+
export function IconTooltip({ children, label, shortcut, position = "top", multiline = false, }) {
|
|
45
|
+
return (_jsxs("div", { className: "relative isolate group", children: [children, _jsxs("div", { className: cn(`absolute px-3 py-2 bg-bg-elevated border border-border text-xs text-txt-strong rounded-lg opacity-0 invisible group-hover:opacity-100 group-hover:visible group-focus-within:opacity-100 group-focus-within:visible transition-opacity duration-200 z-[${Z_OVERLAY}] shadow-lg pointer-events-none`, position === "top"
|
|
46
|
+
? "bottom-full left-1/2 -translate-x-1/2 mb-2"
|
|
47
|
+
: "top-full left-1/2 -translate-x-1/2 mt-2", multiline
|
|
48
|
+
? "min-w-[10rem] max-w-[min(22rem,calc(100vw-1.5rem))] whitespace-normal text-left leading-snug"
|
|
49
|
+
: "min-w-[6rem] whitespace-nowrap"), role: "tooltip", children: [_jsx("div", { className: "font-medium", children: label }), shortcut && _jsx("div", { className: "text-muted mt-0.5", children: shortcut }), _jsx("div", { className: position === "top"
|
|
50
|
+
? "absolute top-full left-1/2 -translate-x-1/2 -mt-1 border-4 border-transparent border-t-bg-elevated"
|
|
51
|
+
: "absolute bottom-full left-1/2 -translate-x-1/2 -mb-1 border-4 border-transparent border-b-bg-elevated" })] })] }));
|
|
52
|
+
}
|
|
53
|
+
export function Spotlight({ target, title, description, step, totalSteps, onNext, onPrev, onSkip, labels = {}, }) {
|
|
54
|
+
const [targetRect, setTargetRect] = useState(null);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
const element = document.querySelector(target);
|
|
57
|
+
if (element) {
|
|
58
|
+
const rect = element.getBoundingClientRect();
|
|
59
|
+
setTargetRect(rect);
|
|
60
|
+
}
|
|
61
|
+
}, [target]);
|
|
62
|
+
if (!targetRect)
|
|
63
|
+
return null;
|
|
64
|
+
const padding = 8;
|
|
65
|
+
return (_jsxs("div", { className: `fixed inset-0 z-[${Z_TOOLTIP}] pointer-events-none`, children: [_jsx("div", { className: "absolute inset-0 bg-black/60 pointer-events-auto", style: {
|
|
66
|
+
clipPath: `polygon(
|
|
67
|
+
0% 0%,
|
|
68
|
+
0% 100%,
|
|
69
|
+
${targetRect.left - padding}px 100%,
|
|
70
|
+
${targetRect.left - padding}px ${targetRect.top - padding}px,
|
|
71
|
+
${targetRect.right + padding}px ${targetRect.top - padding}px,
|
|
72
|
+
${targetRect.right + padding}px ${targetRect.bottom + padding}px,
|
|
73
|
+
${targetRect.left - padding}px ${targetRect.bottom + padding}px,
|
|
74
|
+
${targetRect.left - padding}px 100%,
|
|
75
|
+
100% 100%,
|
|
76
|
+
100% 0%
|
|
77
|
+
)`,
|
|
78
|
+
} }), _jsxs("div", { className: "absolute bg-card border border-border rounded-xl shadow-2xl p-5 max-w-sm pointer-events-auto", style: {
|
|
79
|
+
top: targetRect.bottom + padding + 16,
|
|
80
|
+
left: Math.min(targetRect.left, window.innerWidth - 340),
|
|
81
|
+
}, children: [_jsxs("div", { className: "flex items-center justify-between mb-3", children: [_jsxs("span", { className: "text-xs text-muted font-medium", children: [labels.stepOf ?? "Step", " ", step, " of ", totalSteps] }), _jsx(Button, { variant: "ghost", size: "sm", onClick: onSkip, className: "h-auto px-1 py-0 text-xs text-muted hover:text-txt", children: labels.skipTour ?? "Skip Tour" })] }), _jsx("h3", { className: "text-lg font-bold text-txt-strong mb-2", children: title }), _jsx("p", { className: "text-sm text-muted mb-4", children: description }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx(Button, { variant: "outline", onClick: onPrev, disabled: step === 1, children: labels.previous ?? "Previous" }), _jsx("div", { className: "flex gap-1", children: Array.from({ length: totalSteps }, (_, idx) => idx).map((dotIndex) => (_jsx("div", { className: `w-2 h-2 rounded-full transition-colors ${dotIndex + 1 === step ? "bg-accent" : "bg-border"}` }, `step-dot-${dotIndex}`))) }), _jsx(Button, { onClick: onNext, children: step === totalSteps
|
|
82
|
+
? (labels.finish ?? "Finish")
|
|
83
|
+
: (labels.next ?? "Next") })] })] })] }));
|
|
84
|
+
}
|
|
85
|
+
export function useGuidedTour(steps) {
|
|
86
|
+
const [isActive, setIsActive] = useState(false);
|
|
87
|
+
const [currentStep, setCurrentStep] = useState(0);
|
|
88
|
+
const start = useCallback(() => {
|
|
89
|
+
setIsActive(true);
|
|
90
|
+
setCurrentStep(0);
|
|
91
|
+
}, []);
|
|
92
|
+
const next = useCallback(() => {
|
|
93
|
+
if (currentStep < steps.length - 1) {
|
|
94
|
+
setCurrentStep((prev) => prev + 1);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
setIsActive(false);
|
|
98
|
+
}
|
|
99
|
+
}, [currentStep, steps.length]);
|
|
100
|
+
const prev = useCallback(() => {
|
|
101
|
+
setCurrentStep((prev) => Math.max(0, prev - 1));
|
|
102
|
+
}, []);
|
|
103
|
+
const skip = useCallback(() => {
|
|
104
|
+
setIsActive(false);
|
|
105
|
+
}, []);
|
|
106
|
+
return {
|
|
107
|
+
isActive,
|
|
108
|
+
currentStep,
|
|
109
|
+
step: steps[currentStep],
|
|
110
|
+
start,
|
|
111
|
+
next,
|
|
112
|
+
prev,
|
|
113
|
+
skip,
|
|
114
|
+
totalSteps: steps.length,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -4,5 +4,15 @@ declare const TooltipProvider: React.FC<TooltipPrimitive.TooltipProviderProps>;
|
|
|
4
4
|
declare const Tooltip: React.FC<TooltipPrimitive.TooltipProps>;
|
|
5
5
|
declare const TooltipTrigger: React.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
6
6
|
declare const TooltipContent: React.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
7
|
+
export interface TooltipHintProps {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
content: React.ReactNode;
|
|
10
|
+
side?: React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>["side"];
|
|
11
|
+
sideOffset?: number;
|
|
12
|
+
contentClassName?: string;
|
|
13
|
+
delayDuration?: number;
|
|
14
|
+
skipDelayDuration?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function TooltipHint({ children, content, side, sideOffset, contentClassName, delayDuration, skipDelayDuration, }: TooltipHintProps): import("react/jsx-runtime").JSX.Element;
|
|
7
17
|
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
8
18
|
//# sourceMappingURL=tooltip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,gBAAgB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,eAAe,iDAA4B,CAAC;AAElD,QAAA,MAAM,OAAO,yCAAwB,CAAC;AAEtC,QAAA,MAAM,cAAc,gHAA2B,CAAC;AAEhD,QAAA,MAAM,cAAc,gKAelB,CAAC;AAGH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,IAAI,CAAC,EAAE,KAAK,CAAC,wBAAwB,CACnC,OAAO,gBAAgB,CAAC,OAAO,CAChC,CAAC,MAAM,CAAC,CAAC;IACV,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAO,EACP,IAAe,EACf,UAAc,EACd,gBAAgB,EAChB,aAAmB,EACnB,iBAAuB,GACxB,EAAE,gBAAgB,2CAkBlB;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../../lib/utils";
|
|
5
|
+
const TooltipProvider = TooltipPrimitive.Provider;
|
|
6
|
+
const Tooltip = TooltipPrimitive.Root;
|
|
7
|
+
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
8
|
+
const TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (_jsx(TooltipPrimitive.Portal, { children: _jsx(TooltipPrimitive.Content, { ref: ref, sideOffset: sideOffset, className: cn("z-[140] overflow-hidden rounded-md border border-border bg-card px-3 py-1.5 text-sm text-txt shadow-md max-w-[min(24rem,calc(100vw-2rem))] animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", className), ...props }) })));
|
|
9
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
10
|
+
export function TooltipHint({ children, content, side = "bottom", sideOffset = 4, contentClassName, delayDuration = 200, skipDelayDuration = 100, }) {
|
|
11
|
+
return (_jsx(TooltipProvider, { delayDuration: delayDuration, skipDelayDuration: skipDelayDuration, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: children }), _jsx(TooltipContent, { side: side, sideOffset: sideOffset, className: contentClassName, children: content })] }) }));
|
|
12
|
+
}
|
|
13
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type VariantProps } from "class-variance-authority";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
declare const textVariants: (props?: ({
|
|
4
|
-
variant?: "
|
|
4
|
+
variant?: "small" | "default" | "muted" | "medium" | "large" | "lead" | null | undefined;
|
|
5
5
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
6
|
export interface TextProps extends React.HTMLAttributes<HTMLParagraphElement>, VariantProps<typeof textVariants> {
|
|
7
7
|
asChild?: boolean;
|
|
8
8
|
}
|
|
9
9
|
export declare const Text: React.ForwardRefExoticComponent<TextProps & React.RefAttributes<HTMLParagraphElement>>;
|
|
10
10
|
declare const headingVariants: (props?: ({
|
|
11
|
-
level?: "
|
|
11
|
+
level?: "h2" | "h3" | "h1" | "h4" | "h5" | "h6" | null | undefined;
|
|
12
12
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
13
13
|
export interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement>, VariantProps<typeof headingVariants> {
|
|
14
14
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typography.d.ts","sourceRoot":"","sources":["../../../../../../src/components/ui/typography.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,YAAY;;8EAchB,CAAC;AAEH,MAAM,WAAW,SACf,SAAQ,KAAK,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAChD,YAAY,CAAC,OAAO,YAAY,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,IAAI,wFAWhB,CAAC;AAGF,QAAA,MAAM,eAAe;;8EAcnB,CAAC;AAEH,MAAM,WAAW,YACf,SAAQ,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAC9C,YAAY,CAAC,OAAO,eAAe,CAAC;CAAG;AAE3C,eAAO,MAAM,OAAO,yFAWnB,CAAC"}
|
|
@@ -38,7 +38,7 @@ const headingVariants = cva("text-txt font-semibold tracking-tight", {
|
|
|
38
38
|
},
|
|
39
39
|
});
|
|
40
40
|
export const Heading = React.forwardRef(({ className, level = "h1", ...props }, ref) => {
|
|
41
|
-
const Comp = level
|
|
41
|
+
const Comp = level ?? "h1";
|
|
42
42
|
return (_jsx(Comp, { ref: ref, className: cn(headingVariants({ level }), className), ...props }));
|
|
43
43
|
});
|
|
44
44
|
Heading.displayName = "Heading";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClickOutside.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useClickOutside.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,OAAO,CAAC;AAElD,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAClC,OAAO,EAAE,MAAM,IAAI,EACnB,MAAM,UAAO,QAsBd"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
export function useClickOutside(ref, handler, active = true) {
|
|
3
|
+
useEffect(() => {
|
|
4
|
+
if (!active)
|
|
5
|
+
return;
|
|
6
|
+
const onMouseDown = (e) => {
|
|
7
|
+
if (ref.current && !ref.current.contains(e.target)) {
|
|
8
|
+
handler();
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const onKeyDown = (e) => {
|
|
12
|
+
if (e.key === "Escape")
|
|
13
|
+
handler();
|
|
14
|
+
};
|
|
15
|
+
document.addEventListener("mousedown", onMouseDown);
|
|
16
|
+
document.addEventListener("keydown", onKeyDown);
|
|
17
|
+
return () => {
|
|
18
|
+
document.removeEventListener("mousedown", onMouseDown);
|
|
19
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
20
|
+
};
|
|
21
|
+
}, [ref, handler, active]);
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDocumentVisibility.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useDocumentVisibility.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,IAAI,OAAO,CAgB/C;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,IAAI,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,UAAO,GACb,IAAI,CAYN"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
|
+
export function useDocumentVisibility() {
|
|
3
|
+
const [visible, setVisible] = useState(() => typeof document === "undefined"
|
|
4
|
+
? true
|
|
5
|
+
: document.visibilityState === "visible");
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (typeof document === "undefined")
|
|
8
|
+
return;
|
|
9
|
+
const sync = () => setVisible(document.visibilityState === "visible");
|
|
10
|
+
sync();
|
|
11
|
+
document.addEventListener("visibilitychange", sync);
|
|
12
|
+
return () => document.removeEventListener("visibilitychange", sync);
|
|
13
|
+
}, []);
|
|
14
|
+
return visible;
|
|
15
|
+
}
|
|
16
|
+
export function useIntervalWhenDocumentVisible(callback, delayMs, enabled = true) {
|
|
17
|
+
const saved = useRef(callback);
|
|
18
|
+
saved.current = callback;
|
|
19
|
+
const visible = useDocumentVisibility();
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!enabled || !visible)
|
|
22
|
+
return;
|
|
23
|
+
const id = window.setInterval(() => {
|
|
24
|
+
saved.current();
|
|
25
|
+
}, delayMs);
|
|
26
|
+
return () => window.clearInterval(id);
|
|
27
|
+
}, [enabled, visible, delayMs]);
|
|
28
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ShortcutConfig {
|
|
2
|
+
key: string;
|
|
3
|
+
ctrl?: boolean;
|
|
4
|
+
shift?: boolean;
|
|
5
|
+
alt?: boolean;
|
|
6
|
+
meta?: boolean;
|
|
7
|
+
handler: () => void;
|
|
8
|
+
description: string;
|
|
9
|
+
scope?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function useKeyboardShortcuts(shortcuts: ShortcutConfig[]): void;
|
|
12
|
+
export declare function formatShortcut(s: Omit<ShortcutConfig, "handler">): string;
|
|
13
|
+
//# sourceMappingURL=useKeyboardShortcuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useKeyboardShortcuts.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,EAAE,QAwB/D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,MAAM,CAQzE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { useCallback, useEffect } from "react";
|
|
2
|
+
export function useKeyboardShortcuts(shortcuts) {
|
|
3
|
+
const handleKeyDown = useCallback((event) => {
|
|
4
|
+
for (const shortcut of shortcuts) {
|
|
5
|
+
const keyMatch = event.key.toLowerCase() === shortcut.key.toLowerCase();
|
|
6
|
+
const ctrlMatch = !!shortcut.ctrl === event.ctrlKey;
|
|
7
|
+
const shiftMatch = !!shortcut.shift === event.shiftKey;
|
|
8
|
+
const altMatch = !!shortcut.alt === event.altKey;
|
|
9
|
+
const metaMatch = !!shortcut.meta === event.metaKey;
|
|
10
|
+
if (keyMatch && ctrlMatch && shiftMatch && altMatch && metaMatch) {
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
shortcut.handler();
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}, [shortcuts]);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
19
|
+
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
20
|
+
}, [handleKeyDown]);
|
|
21
|
+
}
|
|
22
|
+
export function formatShortcut(s) {
|
|
23
|
+
const parts = [];
|
|
24
|
+
if (s.ctrl)
|
|
25
|
+
parts.push("Ctrl");
|
|
26
|
+
if (s.shift)
|
|
27
|
+
parts.push("Shift");
|
|
28
|
+
if (s.alt)
|
|
29
|
+
parts.push("Alt");
|
|
30
|
+
if (s.meta)
|
|
31
|
+
parts.push("Cmd");
|
|
32
|
+
parts.push(s.key.length === 1 ? s.key.toUpperCase() : s.key);
|
|
33
|
+
return parts.join("+");
|
|
34
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface UseLinkedSidebarSelectionOptions<T extends string = string> {
|
|
2
|
+
contentTopOffset?: number;
|
|
3
|
+
selectedId: T | null;
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
topAlignedId?: T | null;
|
|
6
|
+
}
|
|
7
|
+
export declare function useLinkedSidebarSelection<T extends string = string>({ contentTopOffset, enabled, selectedId, topAlignedId, }: UseLinkedSidebarSelectionOptions<T>): {
|
|
8
|
+
contentContainerRef: import("react").RefObject<HTMLDivElement | null>;
|
|
9
|
+
queueContentAlignment: (id: T) => void;
|
|
10
|
+
registerContentItem: (id: T) => (node: HTMLElement | null) => void;
|
|
11
|
+
registerRailItem: (id: T) => (node: HTMLElement | null) => void;
|
|
12
|
+
registerSidebarItem: (id: T) => (node: HTMLElement | null) => void;
|
|
13
|
+
registerSidebarViewport: (node: HTMLElement | null) => void;
|
|
14
|
+
scrollContentToItem: (id: T) => void;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=useLinkedSidebarSelection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLinkedSidebarSelection.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useLinkedSidebarSelection.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gCAAgC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CACzB;AAsBD,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,EACnE,gBAAqB,EACrB,OAAc,EACd,UAAU,EACV,YAAmB,GACpB,EAAE,gCAAgC,CAAC,CAAC,CAAC;;gCAuE7B,CAAC;8BA5DD,CAAC,YAAY,WAAW,GAAG,IAAI;2BAc/B,CAAC,YAAY,WAAW,GAAG,IAAI;8BAP/B,CAAC,YAAY,WAAW,GAAG,IAAI;oCAaa,WAAW,GAAG,IAAI;8BAK9D,CAAC;EAiGT"}
|