@elizaos/ui 2.0.0-alpha.15 → 2.0.0-alpha.151
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 +98 -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 +59 -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,22 @@
|
|
|
1
|
+
export interface ChatConversationRenameDialogProps {
|
|
2
|
+
cancelLabel?: string;
|
|
3
|
+
description: string;
|
|
4
|
+
inputLabel: string;
|
|
5
|
+
onChange: (value: string) => void;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
onSave: () => void | Promise<void>;
|
|
8
|
+
onSuggest?: () => void | Promise<void>;
|
|
9
|
+
open: boolean;
|
|
10
|
+
saving?: boolean;
|
|
11
|
+
saveLabel: string;
|
|
12
|
+
saveDisabled?: boolean;
|
|
13
|
+
savePendingLabel?: string;
|
|
14
|
+
suggesting?: boolean;
|
|
15
|
+
suggestDisabled?: boolean;
|
|
16
|
+
suggestLabel?: string;
|
|
17
|
+
suggestPendingLabel?: string;
|
|
18
|
+
title: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function ChatConversationRenameDialog({ cancelLabel, description, inputLabel, onChange, onClose, onSave, onSuggest, open, saving, saveLabel, savePendingLabel, saveDisabled, suggesting, suggestDisabled, suggestLabel, suggestPendingLabel, title, value, }: ChatConversationRenameDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=chat-conversation-rename-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-conversation-rename-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-conversation-rename-dialog.tsx"],"names":[],"mappings":"AAcA,MAAM,WAAW,iCAAiC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,4BAA4B,CAAC,EAC3C,WAAsB,EACtB,WAAW,EACX,UAAU,EACV,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,EACT,IAAI,EACJ,MAAc,EACd,SAAS,EACT,gBAA4B,EAC5B,YAAoB,EACpB,UAAkB,EAClB,eAAuB,EACvB,YAAwB,EACxB,mBAAkC,EAClC,KAAK,EACL,KAAK,GACN,EAAE,iCAAiC,2CAyEnC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Sparkles } from "lucide-react";
|
|
3
|
+
import { Button } from "../../ui/button";
|
|
4
|
+
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../../ui/dialog";
|
|
5
|
+
import { Input } from "../../ui/input";
|
|
6
|
+
import { Label } from "../../ui/label";
|
|
7
|
+
export function ChatConversationRenameDialog({ cancelLabel = "Cancel", description, inputLabel, onChange, onClose, onSave, onSuggest, open, saving = false, saveLabel, savePendingLabel = saveLabel, saveDisabled = false, suggesting = false, suggestDisabled = false, suggestLabel = "Suggest", suggestPendingLabel = suggestLabel, title, value, }) {
|
|
8
|
+
return (_jsx(Dialog, { open: open, onOpenChange: (nextOpen) => !nextOpen && onClose(), children: _jsxs(DialogContent, { "data-testid": "conv-rename-dialog", className: "max-w-md", onPointerDownOutside: onClose, children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), _jsx(DialogDescription, { children: description })] }), _jsxs("div", { className: "grid gap-2 py-1", children: [_jsx(Label, { htmlFor: "conv-rename-title-input", children: inputLabel }), _jsx(Input, { id: "conv-rename-title-input", "data-testid": "conv-rename-input", value: value, onChange: (event) => onChange(event.target.value), onKeyDown: (event) => {
|
|
9
|
+
if (event.key === "Enter") {
|
|
10
|
+
event.preventDefault();
|
|
11
|
+
void onSave();
|
|
12
|
+
}
|
|
13
|
+
}, disabled: saveDisabled || suggestDisabled, className: "text-txt" })] }), _jsxs(DialogFooter, { className: "flex w-full flex-col-reverse gap-2 sm:flex-row sm:justify-between", children: [onSuggest ? (_jsxs(Button, { type: "button", variant: "outline", size: "sm", "data-testid": "conv-rename-suggest", className: "gap-1.5 border-border", onClick: () => void onSuggest(), disabled: suggestDisabled || saveDisabled, children: [_jsx(Sparkles, { className: "h-3.5 w-3.5 shrink-0", "aria-hidden": true }), suggesting ? suggestPendingLabel : suggestLabel] })) : (_jsx("div", {})), _jsxs("div", { className: "flex w-full justify-end gap-2 sm:w-auto", children: [_jsx(Button, { type: "button", variant: "ghost", size: "sm", "data-testid": "conv-rename-cancel", onClick: onClose, children: cancelLabel }), _jsx(Button, { type: "button", variant: "default", size: "sm", "data-testid": "conv-rename-save", onClick: () => void onSave(), disabled: saveDisabled, children: saving ? savePendingLabel : saveLabel })] })] })] }) }));
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ChatVariant } from "./chat-types";
|
|
3
|
+
export interface ChatEmptyStateProps {
|
|
4
|
+
action?: React.ReactNode;
|
|
5
|
+
agentName: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
hint?: React.ReactNode;
|
|
8
|
+
labels?: {
|
|
9
|
+
chatIconLabel?: string;
|
|
10
|
+
sendMessageTo?: string;
|
|
11
|
+
startConversation?: string;
|
|
12
|
+
toBeginChatting?: string;
|
|
13
|
+
};
|
|
14
|
+
onSuggestionClick?: (suggestion: string) => void;
|
|
15
|
+
suggestions?: string[];
|
|
16
|
+
variant?: ChatVariant;
|
|
17
|
+
}
|
|
18
|
+
export declare function ChatEmptyState({ action, agentName, className, hint, labels, onSuggestionClick, suggestions, variant, }: ChatEmptyStateProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=chat-empty-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-empty-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,CAAC,EAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,SAAS,EACT,IAAI,EACJ,MAAW,EACX,iBAAiB,EACjB,WAA6E,EAC7E,OAAmB,GACpB,EAAE,mBAAmB,2CAgErB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../../lib/utils";
|
|
3
|
+
import { Button } from "../../ui/button";
|
|
4
|
+
export function ChatEmptyState({ action, agentName, className, hint, labels = {}, onSuggestionClick, suggestions = ["Hello!", "How are you?", "Tell me a joke", "Help me with..."], variant = "default", }) {
|
|
5
|
+
return (_jsxs("div", { className: cn("flex flex-1 flex-col items-center justify-center p-6 text-center", variant === "game-modal" &&
|
|
6
|
+
"min-h-full justify-end gap-4 px-2 py-4 text-left", className), children: [variant === "default" ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "mb-4 flex h-16 w-16 items-center justify-center rounded-2xl bg-accent-subtle", children: _jsxs("svg", { width: "32", height: "32", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-accent", "aria-label": labels.chatIconLabel ?? "Chat icon", children: [_jsx("title", { children: labels.chatIconLabel ?? "Chat" }), _jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" })] }) }), _jsx("h3", { className: "mb-2 text-lg font-semibold text-txt-strong", children: labels.startConversation ?? "Start a Conversation" }), _jsxs("p", { className: "mb-6 max-w-sm font-[var(--font-chat)] text-sm text-muted", children: [labels.sendMessageTo ?? "Send a message to", " ", agentName, " ", labels.toBeginChatting ?? "to begin chatting."] })] })) : null, action ? _jsx("div", { className: "mb-4 flex justify-center", children: action }) : null, _jsx("div", { className: "flex flex-wrap justify-center gap-2", children: suggestions.map((suggestion) => (_jsx(Button, { variant: variant === "game-modal" ? "surface" : "outline", size: "sm", className: cn("h-7 rounded-full px-3 py-1.5 text-xs transition-colors", variant === "default" &&
|
|
7
|
+
"border-border bg-bg text-muted hover:border-accent hover:text-accent"), onClick: () => onSuggestionClick?.(suggestion), children: suggestion }, suggestion))) }), hint ? (_jsx("div", { className: "mt-4 max-w-sm text-xs-tight uppercase tracking-[0.16em] text-muted/74", children: hint })) : null] }));
|
|
8
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ChatMessageLabels } from "./chat-types";
|
|
2
|
+
export interface ChatMessageActionsProps {
|
|
3
|
+
canDelete?: boolean;
|
|
4
|
+
canEdit?: boolean;
|
|
5
|
+
canPlay?: boolean;
|
|
6
|
+
copied?: boolean;
|
|
7
|
+
labels?: ChatMessageLabels;
|
|
8
|
+
onCopy?: () => void;
|
|
9
|
+
onDelete?: () => void;
|
|
10
|
+
onEdit?: () => void;
|
|
11
|
+
onPlay?: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function ChatMessageActions({ canDelete, canEdit, canPlay, copied, labels, onCopy, onDelete, onEdit, onPlay, }: ChatMessageActionsProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=chat-message-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-message-actions.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,SAAiB,EACjB,OAAe,EACf,OAAe,EACf,MAAc,EACd,MAAW,EACX,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,GACP,EAAE,uBAAuB,2CA8DzB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Check, Copy, Pencil, Trash2, Volume2 } from "lucide-react";
|
|
3
|
+
import { Button } from "../../ui/button";
|
|
4
|
+
import { PagePanel } from "../page-panel";
|
|
5
|
+
export function ChatMessageActions({ canDelete = false, canEdit = false, canPlay = false, copied = false, labels = {}, onCopy, onDelete, onEdit, onPlay, }) {
|
|
6
|
+
const copyLabel = labels.copy ?? "Copy message";
|
|
7
|
+
const copiedLabel = labels.copied ?? "Copied!";
|
|
8
|
+
const copiedAriaLabel = labels.copiedAria ?? "Copied to clipboard";
|
|
9
|
+
return (_jsxs(PagePanel.ActionRail, { className: "top-1 rounded-lg p-1", children: [_jsx(Button, { variant: "surface", size: "icon", onClick: onCopy, className: "h-8 w-8 rounded-lg", title: copied ? copiedLabel : copyLabel, "aria-label": copied ? copiedAriaLabel : copyLabel, children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-ok" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) }), canPlay ? (_jsx(Button, { variant: "surface", size: "icon", onClick: onPlay, className: "h-8 w-8 rounded-lg", title: labels.play ?? "Play message", "aria-label": labels.play ?? "Play message", children: _jsx(Volume2, { className: "h-3.5 w-3.5" }) })) : null, canEdit ? (_jsx(Button, { variant: "surface", size: "icon", onClick: onEdit, className: "h-8 w-8 rounded-lg", title: labels.edit ?? "Edit message", "aria-label": labels.edit ?? "Edit message", children: _jsx(Pencil, { className: "h-3.5 w-3.5" }) })) : null, canDelete ? (_jsx(Button, { variant: "surfaceDestructive", size: "icon", onClick: onDelete, className: "h-8 w-8 rounded-lg", title: labels.delete ?? "Delete message", "aria-label": labels.delete ?? "Delete message", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })) : null] }));
|
|
10
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ChatMessageData, ChatMessageLabels } from "./chat-types";
|
|
3
|
+
export interface ChatMessageProps {
|
|
4
|
+
agentName?: string;
|
|
5
|
+
children?: React.ReactNode;
|
|
6
|
+
isGrouped?: boolean;
|
|
7
|
+
labels?: ChatMessageLabels;
|
|
8
|
+
message: ChatMessageData;
|
|
9
|
+
onCopy?: (text: string) => void;
|
|
10
|
+
onDelete?: (messageId: string) => void;
|
|
11
|
+
onEdit?: (messageId: string, text: string) => Promise<boolean> | boolean;
|
|
12
|
+
onSpeak?: (messageId: string, text: string) => void;
|
|
13
|
+
replyTarget?: ChatMessageData | null;
|
|
14
|
+
userMessagesOnRight?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function getChatMessageAnchorId(messageId: string): string;
|
|
17
|
+
export declare const ChatMessage: React.NamedExoticComponent<ChatMessageProps>;
|
|
18
|
+
//# sourceMappingURL=chat-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-message.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-message.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAkBpC,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EAElB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACzE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,WAAW,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhE;AA4ID,eAAO,MAAM,WAAW,8CAuXtB,CAAC"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useCallback, useEffect, useRef, useState, } from "react";
|
|
3
|
+
import { cn } from "../../../lib/utils";
|
|
4
|
+
import { Button } from "../../ui/button";
|
|
5
|
+
import { Textarea } from "../../ui/textarea";
|
|
6
|
+
import { ChatBubble } from "./chat-bubble";
|
|
7
|
+
import { ChatMessageActions } from "./chat-message-actions";
|
|
8
|
+
export function getChatMessageAnchorId(messageId) {
|
|
9
|
+
return `chat-message-${messageId}`;
|
|
10
|
+
}
|
|
11
|
+
const DISCORD_CUSTOM_EMOJI_RE = /^<(a?):([^:>]+):(\d+)>$/;
|
|
12
|
+
function normalizeSenderHandle(handle) {
|
|
13
|
+
if (typeof handle !== "string")
|
|
14
|
+
return null;
|
|
15
|
+
const trimmed = handle.trim();
|
|
16
|
+
if (!trimmed)
|
|
17
|
+
return null;
|
|
18
|
+
return trimmed.startsWith("@") ? trimmed : `@${trimmed}`;
|
|
19
|
+
}
|
|
20
|
+
function resolveSenderDisplayName(message) {
|
|
21
|
+
const from = typeof message.from === "string" ? message.from.trim() : "";
|
|
22
|
+
if (from)
|
|
23
|
+
return from;
|
|
24
|
+
return normalizeSenderHandle(message.fromUserName);
|
|
25
|
+
}
|
|
26
|
+
function resolveSenderHandle(message, displayName) {
|
|
27
|
+
const handle = normalizeSenderHandle(message.fromUserName);
|
|
28
|
+
if (!handle)
|
|
29
|
+
return null;
|
|
30
|
+
if (displayName?.replace(/^@/, "").toLowerCase() ===
|
|
31
|
+
handle.slice(1).toLowerCase()) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return handle;
|
|
35
|
+
}
|
|
36
|
+
function resolveReplySenderDisplayName(message, replyTarget) {
|
|
37
|
+
if (replyTarget) {
|
|
38
|
+
const targetDisplayName = resolveSenderDisplayName(replyTarget);
|
|
39
|
+
if (targetDisplayName)
|
|
40
|
+
return targetDisplayName;
|
|
41
|
+
}
|
|
42
|
+
const replyToSenderName = typeof message.replyToSenderName === "string"
|
|
43
|
+
? message.replyToSenderName.trim()
|
|
44
|
+
: "";
|
|
45
|
+
if (replyToSenderName)
|
|
46
|
+
return replyToSenderName;
|
|
47
|
+
return normalizeSenderHandle(message.replyToSenderUserName);
|
|
48
|
+
}
|
|
49
|
+
function formatPossessiveLabel(label) {
|
|
50
|
+
return /s$/i.test(label) ? `${label}'` : `${label}'s`;
|
|
51
|
+
}
|
|
52
|
+
function normalizeMessageReactions(reactions) {
|
|
53
|
+
if (!Array.isArray(reactions)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
return reactions.filter((reaction) => typeof reaction?.emoji === "string" &&
|
|
57
|
+
reaction.emoji.trim().length > 0 &&
|
|
58
|
+
typeof reaction.count === "number" &&
|
|
59
|
+
Number.isFinite(reaction.count) &&
|
|
60
|
+
reaction.count > 0);
|
|
61
|
+
}
|
|
62
|
+
function parseDiscordCustomEmoji(emoji) {
|
|
63
|
+
const match = emoji.match(DISCORD_CUSTOM_EMOJI_RE);
|
|
64
|
+
if (!match)
|
|
65
|
+
return null;
|
|
66
|
+
return {
|
|
67
|
+
animated: match[1] === "a",
|
|
68
|
+
name: match[2],
|
|
69
|
+
id: match[3],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function ReactionEmoji({ emoji }) {
|
|
73
|
+
const customEmoji = parseDiscordCustomEmoji(emoji);
|
|
74
|
+
if (!customEmoji) {
|
|
75
|
+
return _jsx("span", { className: "text-[15px] leading-none", children: emoji });
|
|
76
|
+
}
|
|
77
|
+
const extension = customEmoji.animated ? "gif" : "png";
|
|
78
|
+
const src = `https://cdn.discordapp.com/emojis/${customEmoji.id}.${extension}?size=64&quality=lossless`;
|
|
79
|
+
return (_jsx("img", { src: src, alt: `:${customEmoji.name}:`, className: "h-4 w-4 object-contain" }));
|
|
80
|
+
}
|
|
81
|
+
function ReactionStrip({ alignRight, reactions, }) {
|
|
82
|
+
if (reactions.length === 0) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return (_jsx("div", { className: cn("mt-2 flex flex-wrap gap-1.5", alignRight ? "justify-end" : "justify-start"), children: reactions.map((reaction) => {
|
|
86
|
+
const title = Array.isArray(reaction.users) && reaction.users.length > 0
|
|
87
|
+
? reaction.users.join(", ")
|
|
88
|
+
: undefined;
|
|
89
|
+
return (_jsxs("span", { "data-testid": "chat-reaction-badge", title: title, className: "inline-flex items-center gap-1 rounded-full border border-border/28 bg-bg/70 px-2 py-1 text-xs-tight font-medium text-txt-strong shadow-[0_10px_18px_-16px_rgba(15,23,42,0.45)]", children: [_jsx(ReactionEmoji, { emoji: reaction.emoji }), reaction.count > 1 ? _jsx("span", { children: reaction.count }) : null] }, `${reaction.emoji}:${reaction.count}`));
|
|
90
|
+
}) }));
|
|
91
|
+
}
|
|
92
|
+
export const ChatMessage = memo(function ChatMessage({ message, isGrouped = false, agentName = "Agent", children, labels = {}, onCopy, onSpeak, onEdit, onDelete, replyTarget = null, userMessagesOnRight = true, }) {
|
|
93
|
+
const [copied, setCopied] = useState(false);
|
|
94
|
+
const copiedTimerRef = useRef(null);
|
|
95
|
+
const [showActions, setShowActions] = useState(false);
|
|
96
|
+
const [supportsHover, setSupportsHover] = useState(() => typeof window !== "undefined" && typeof window.matchMedia === "function"
|
|
97
|
+
? window.matchMedia("(hover: hover) and (pointer: fine)").matches
|
|
98
|
+
: true);
|
|
99
|
+
const [isEditing, setIsEditing] = useState(false);
|
|
100
|
+
const [draftText, setDraftText] = useState(message.text);
|
|
101
|
+
const [savingEdit, setSavingEdit] = useState(false);
|
|
102
|
+
const articleRef = useRef(null);
|
|
103
|
+
const editTextareaRef = useRef(null);
|
|
104
|
+
const isUser = message.role === "user";
|
|
105
|
+
const isRightAligned = isUser ? userMessagesOnRight : !userMessagesOnRight;
|
|
106
|
+
const canEdit = isUser &&
|
|
107
|
+
typeof onEdit === "function" &&
|
|
108
|
+
message.source !== "local_command" &&
|
|
109
|
+
!message.id.startsWith("temp-");
|
|
110
|
+
const canPlay = Boolean(!isUser && typeof onSpeak === "function" && message.text.trim());
|
|
111
|
+
const normalizedSource = typeof message.source === "string" &&
|
|
112
|
+
message.source.trim().toLowerCase() !== "app"
|
|
113
|
+
? message.source
|
|
114
|
+
: undefined;
|
|
115
|
+
const senderDisplayName = isUser ? resolveSenderDisplayName(message) : null;
|
|
116
|
+
const senderHandle = isUser
|
|
117
|
+
? resolveSenderHandle(message, senderDisplayName)
|
|
118
|
+
: null;
|
|
119
|
+
const senderPrimaryLabel = senderDisplayName ?? senderHandle ?? "User";
|
|
120
|
+
const replyTargetId = typeof message.replyToMessageId === "string"
|
|
121
|
+
? message.replyToMessageId.trim()
|
|
122
|
+
: "";
|
|
123
|
+
const replySenderLabel = resolveReplySenderDisplayName(message, replyTarget);
|
|
124
|
+
const replyReferenceLabel = replySenderLabel
|
|
125
|
+
? `Reply to ${formatPossessiveLabel(replySenderLabel)} message`
|
|
126
|
+
: "Reply to an earlier message";
|
|
127
|
+
const showReplyReference = Boolean(!isEditing && replyTargetId && normalizedSource);
|
|
128
|
+
const showSenderHeader = isUser && !isGrouped && Boolean(senderDisplayName || senderHandle);
|
|
129
|
+
const visibleReactions = normalizeMessageReactions(message.reactions);
|
|
130
|
+
const handleCopy = useCallback(() => {
|
|
131
|
+
onCopy?.(message.text);
|
|
132
|
+
setCopied(true);
|
|
133
|
+
if (copiedTimerRef.current !== null) {
|
|
134
|
+
clearTimeout(copiedTimerRef.current);
|
|
135
|
+
}
|
|
136
|
+
copiedTimerRef.current = setTimeout(() => {
|
|
137
|
+
setCopied(false);
|
|
138
|
+
copiedTimerRef.current = null;
|
|
139
|
+
}, 2000);
|
|
140
|
+
}, [message.text, onCopy]);
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
return () => {
|
|
143
|
+
if (copiedTimerRef.current !== null) {
|
|
144
|
+
clearTimeout(copiedTimerRef.current);
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}, []);
|
|
148
|
+
const handleStartEditing = useCallback(() => {
|
|
149
|
+
if (!canEdit || savingEdit)
|
|
150
|
+
return;
|
|
151
|
+
setDraftText(message.text);
|
|
152
|
+
setIsEditing(true);
|
|
153
|
+
}, [canEdit, message.text, savingEdit]);
|
|
154
|
+
const handleCancelEditing = useCallback(() => {
|
|
155
|
+
if (savingEdit)
|
|
156
|
+
return;
|
|
157
|
+
setDraftText(message.text);
|
|
158
|
+
setIsEditing(false);
|
|
159
|
+
}, [message.text, savingEdit]);
|
|
160
|
+
const handleSaveEdit = useCallback(async () => {
|
|
161
|
+
if (!onEdit)
|
|
162
|
+
return;
|
|
163
|
+
const nextText = draftText.trim();
|
|
164
|
+
if (!nextText)
|
|
165
|
+
return;
|
|
166
|
+
if (nextText === message.text.trim()) {
|
|
167
|
+
setDraftText(message.text);
|
|
168
|
+
setIsEditing(false);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
setSavingEdit(true);
|
|
172
|
+
try {
|
|
173
|
+
const saved = await onEdit(message.id, nextText);
|
|
174
|
+
if (saved !== false) {
|
|
175
|
+
setIsEditing(false);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
setSavingEdit(false);
|
|
180
|
+
}
|
|
181
|
+
}, [draftText, message.id, message.text, onEdit]);
|
|
182
|
+
const handleTapReveal = useCallback((event) => {
|
|
183
|
+
if (supportsHover || isEditing)
|
|
184
|
+
return;
|
|
185
|
+
const target = event.target;
|
|
186
|
+
if (target?.closest("button, a, textarea, input")) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
setShowActions((prev) => !prev);
|
|
190
|
+
}, [isEditing, supportsHover]);
|
|
191
|
+
const handleEditKeyDown = useCallback((event) => {
|
|
192
|
+
if (event.key === "Escape") {
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
handleCancelEditing();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
|
|
198
|
+
event.preventDefault();
|
|
199
|
+
void handleSaveEdit();
|
|
200
|
+
}
|
|
201
|
+
}, [handleCancelEditing, handleSaveEdit]);
|
|
202
|
+
useEffect(() => {
|
|
203
|
+
if (!isEditing) {
|
|
204
|
+
setDraftText(message.text);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const textarea = editTextareaRef.current;
|
|
208
|
+
if (!textarea)
|
|
209
|
+
return;
|
|
210
|
+
textarea.focus();
|
|
211
|
+
textarea.setSelectionRange(textarea.value.length, textarea.value.length);
|
|
212
|
+
}, [isEditing, message.text]);
|
|
213
|
+
useEffect(() => {
|
|
214
|
+
if (typeof window === "undefined" ||
|
|
215
|
+
typeof window.matchMedia !== "function") {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const mediaQuery = window.matchMedia("(hover: hover) and (pointer: fine)");
|
|
219
|
+
const syncSupportsHover = () => {
|
|
220
|
+
setSupportsHover(mediaQuery.matches);
|
|
221
|
+
if (mediaQuery.matches) {
|
|
222
|
+
setShowActions(false);
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
syncSupportsHover();
|
|
226
|
+
if (typeof mediaQuery.addEventListener === "function") {
|
|
227
|
+
mediaQuery.addEventListener("change", syncSupportsHover);
|
|
228
|
+
return () => mediaQuery.removeEventListener("change", syncSupportsHover);
|
|
229
|
+
}
|
|
230
|
+
mediaQuery.addListener(syncSupportsHover);
|
|
231
|
+
return () => mediaQuery.removeListener(syncSupportsHover);
|
|
232
|
+
}, []);
|
|
233
|
+
useEffect(() => {
|
|
234
|
+
if (supportsHover || !showActions || typeof document === "undefined") {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const handlePointerDown = (event) => {
|
|
238
|
+
const target = event.target;
|
|
239
|
+
if (!(target instanceof Node)) {
|
|
240
|
+
setShowActions(false);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (!articleRef.current?.contains(target)) {
|
|
244
|
+
setShowActions(false);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
document.addEventListener("pointerdown", handlePointerDown);
|
|
248
|
+
return () => document.removeEventListener("pointerdown", handlePointerDown);
|
|
249
|
+
}, [showActions, supportsHover]);
|
|
250
|
+
const actionsVisible = showActions;
|
|
251
|
+
const handleReplyReferenceClick = useCallback((event) => {
|
|
252
|
+
if (!replyTargetId || typeof document === "undefined")
|
|
253
|
+
return;
|
|
254
|
+
const target = document.getElementById(getChatMessageAnchorId(replyTargetId));
|
|
255
|
+
if (!target)
|
|
256
|
+
return;
|
|
257
|
+
event.preventDefault();
|
|
258
|
+
target.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
259
|
+
}, [replyTargetId]);
|
|
260
|
+
return (_jsx("article", { ref: articleRef, id: getChatMessageAnchorId(message.id), className: `flex items-start gap-2 sm:gap-3 ${isRightAligned ? "justify-end" : "justify-start"} ${isGrouped ? "mt-1" : "mt-4"}`, "data-testid": "chat-message", "data-role": message.role, onMouseEnter: supportsHover ? () => setShowActions(true) : undefined, onMouseLeave: supportsHover ? () => setShowActions(false) : undefined, onTouchEnd: handleTapReveal, "aria-label": `${isUser && showSenderHeader
|
|
261
|
+
? senderPrimaryLabel
|
|
262
|
+
: isUser
|
|
263
|
+
? userMessagesOnRight
|
|
264
|
+
? "Your"
|
|
265
|
+
: senderPrimaryLabel
|
|
266
|
+
: agentName} message`, children: _jsxs("div", { className: `max-w-[88%] min-w-0 sm:max-w-[80%] ${isRightAligned ? "mr-1" : "ml-1"}`, children: [!isUser && !isGrouped ? (_jsx("div", { className: cn("mb-1 text-xs font-semibold text-accent", isRightAligned ? "text-right" : "text-left"), children: agentName })) : null, showSenderHeader ? (_jsx("div", { className: cn("mb-1 flex items-center gap-2", isRightAligned ? "justify-end" : "justify-start"), children: _jsxs("div", { className: cn("min-w-0", isRightAligned ? "text-right" : "text-left"), children: [_jsx("div", { className: "truncate text-xs font-semibold text-txt-strong", children: senderPrimaryLabel }), senderHandle ? (_jsx("div", { className: "truncate text-xs-tight text-muted", children: senderHandle })) : null] }) })) : null, _jsxs(ChatBubble, { tone: isUser ? "user" : "assistant", source: normalizedSource, className: `relative group rounded-2xl px-4 py-3 text-[15px] leading-[1.7] whitespace-pre-wrap break-words ${isRightAligned ? "rounded-br-sm" : "rounded-bl-sm"}`, style: { fontFamily: "var(--font-chat)" }, children: [showReplyReference ? (_jsx("a", { href: `#${getChatMessageAnchorId(replyTargetId)}`, onClick: handleReplyReferenceClick, className: "mb-2 block text-xs font-medium text-muted underline decoration-border/60 underline-offset-2 transition-colors hover:text-txt-strong", children: replyReferenceLabel })) : null, isEditing ? (_jsxs("div", { className: "space-y-3", children: [_jsx(Textarea, { ref: editTextareaRef, value: draftText, onChange: (event) => setDraftText(event.target.value), onKeyDown: handleEditKeyDown, className: "min-h-[110px] w-full rounded-xl border border-border/28 bg-[linear-gradient(180deg,color-mix(in_srgb,var(--card)_86%,transparent),color-mix(in_srgb,var(--bg)_95%,transparent))] px-3 py-2.5 text-[15px] leading-[1.7] text-txt outline-none shadow-[inset_0_1px_0_rgba(255,255,255,0.12),0_14px_20px_-20px_rgba(15,23,42,0.1)] focus-visible:border-accent/28 focus-visible:ring-2 focus-visible:ring-accent/12", style: { fontFamily: "var(--font-chat)" }, "aria-label": labels.edit ?? "Edit message", disabled: savingEdit }), _jsxs("div", { className: "flex items-center justify-end gap-2", children: [_jsx(Button, { variant: "surface", size: "sm", onClick: handleCancelEditing, disabled: savingEdit, className: "h-8 rounded-lg px-3 text-xs", children: labels.cancel ?? "Cancel" }), _jsx(Button, { variant: "surfaceAccent", size: "sm", onClick: () => void handleSaveEdit(), disabled: savingEdit ||
|
|
267
|
+
!draftText.trim() ||
|
|
268
|
+
draftText.trim() === message.text.trim(), className: "h-8 rounded-lg px-3 text-xs disabled:border-border/20 disabled:bg-bg-accent disabled:text-muted-strong", children: savingEdit
|
|
269
|
+
? (labels.saving ?? "Saving...")
|
|
270
|
+
: (labels.saveAndResend ?? "Save and resend") })] })] })) : ((children ?? message.text)), !isUser && message.interrupted ? (_jsx("div", { className: "mt-2 border-t border-danger/30 pt-2", children: _jsx("span", { className: "inline-flex rounded-full border border-danger/30 bg-danger/10 px-2 py-0.5 text-xs font-medium text-danger", children: labels.responseInterrupted ?? "Response interrupted" }) })) : null, !isEditing ? (_jsx("div", { className: cn("absolute top-0 flex items-center gap-1 transition-opacity duration-200", isRightAligned
|
|
271
|
+
? "left-0 -translate-x-full"
|
|
272
|
+
: "right-0 translate-x-full", actionsVisible
|
|
273
|
+
? "opacity-100"
|
|
274
|
+
: "pointer-events-none opacity-0"), children: _jsx(ChatMessageActions, { canDelete: Boolean(onDelete), canEdit: canEdit, canPlay: canPlay, copied: copied, labels: labels, onCopy: handleCopy, onDelete: () => onDelete?.(message.id), onEdit: handleStartEditing, onPlay: () => onSpeak?.(message.id, message.text) }) })) : null] }), _jsx(ReactionStrip, { alignRight: isRightAligned, reactions: visibleReactions })] }) }));
|
|
275
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import { SidebarPanel, SidebarScrollRegion } from "../sidebar";
|
|
3
|
+
import { ChatConversationItem } from "./chat-conversation-item";
|
|
4
|
+
import { ChatConversationRenameDialog } from "./chat-conversation-rename-dialog";
|
|
5
|
+
import type { ChatConversationLabels, ChatConversationSummary, ChatVariant } from "./chat-types";
|
|
6
|
+
export interface ChatSidebarProps {
|
|
7
|
+
activeConversationId: string | null;
|
|
8
|
+
confirmDeleteId?: string | null;
|
|
9
|
+
conversations: ChatConversationSummary[];
|
|
10
|
+
deletingId?: string | null;
|
|
11
|
+
labels?: ChatConversationLabels;
|
|
12
|
+
mobile?: boolean;
|
|
13
|
+
onCancelDelete?: () => void;
|
|
14
|
+
onClose?: () => void;
|
|
15
|
+
onConfirmDelete?: (id: string) => void | Promise<void>;
|
|
16
|
+
onCreate: () => void;
|
|
17
|
+
onOpenActions?: (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement> | React.TouchEvent<HTMLButtonElement | HTMLDivElement>, conversation: ChatConversationSummary) => void;
|
|
18
|
+
onRequestDeleteConfirm?: (id: string) => void;
|
|
19
|
+
onRequestRename?: (conversation: ChatConversationSummary) => void;
|
|
20
|
+
onSearchChange?: React.ChangeEventHandler<HTMLInputElement>;
|
|
21
|
+
onSearchClear?: () => void;
|
|
22
|
+
onSelect: (id: string) => void;
|
|
23
|
+
searchValue?: string;
|
|
24
|
+
testId?: string;
|
|
25
|
+
unreadConversations?: Set<string>;
|
|
26
|
+
variant?: ChatVariant;
|
|
27
|
+
}
|
|
28
|
+
declare function ChatSidebarRoot({ activeConversationId, confirmDeleteId, conversations, deletingId, labels, mobile, onCancelDelete, onClose, onConfirmDelete, onCreate, onOpenActions, onRequestDeleteConfirm, onRequestRename, onSearchChange, onSearchClear, onSelect, searchValue, testId, unreadConversations, variant, }: ChatSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export declare const ChatSidebar: typeof ChatSidebarRoot & {
|
|
30
|
+
Content: {
|
|
31
|
+
EmptyState: typeof import("..").SidebarEmptyState;
|
|
32
|
+
ItemBody: typeof import("..").SidebarItemBody;
|
|
33
|
+
ItemDescription: typeof import("..").SidebarItemDescription;
|
|
34
|
+
ItemIcon: typeof import("..").SidebarItemIcon;
|
|
35
|
+
ItemAction: typeof import("..").SidebarItemAction;
|
|
36
|
+
ItemButton: React.ForwardRefExoticComponent<import("..").SidebarItemButtonProps & React.RefAttributes<HTMLButtonElement>>;
|
|
37
|
+
ItemTitle: typeof import("..").SidebarItemTitle;
|
|
38
|
+
Toolbar: typeof import("..").SidebarToolbar;
|
|
39
|
+
ToolbarPrimary: typeof import("..").SidebarToolbarPrimary;
|
|
40
|
+
ToolbarActions: typeof import("..").SidebarToolbarActions;
|
|
41
|
+
SectionLabel: typeof import("..").SidebarSectionLabel;
|
|
42
|
+
SectionHeader: typeof import("..").SidebarSectionHeader;
|
|
43
|
+
Notice: typeof import("..").SidebarNotice;
|
|
44
|
+
Item: React.ForwardRefExoticComponent<import("..").SidebarItemProps & React.RefAttributes<HTMLElement>>;
|
|
45
|
+
RailMedia: typeof import("..").SidebarRailMedia;
|
|
46
|
+
RailItem: React.ForwardRefExoticComponent<import("..").SidebarRailItemProps & React.RefAttributes<HTMLButtonElement>>;
|
|
47
|
+
};
|
|
48
|
+
Item: typeof ChatConversationItem;
|
|
49
|
+
Panel: typeof SidebarPanel;
|
|
50
|
+
RenameDialog: typeof ChatConversationRenameDialog;
|
|
51
|
+
ScrollRegion: typeof SidebarScrollRegion;
|
|
52
|
+
};
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=chat-sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,EAKL,YAAY,EACZ,mBAAmB,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAEjF,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACZ,MAAM,cAAc,CAAC;AAsBtB,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,uBAAuB,EAAE,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,CACd,KAAK,EACD,KAAK,CAAC,UAAU,CAAC,iBAAiB,GAAG,cAAc,CAAC,GACpD,KAAK,CAAC,UAAU,CAAC,iBAAiB,GAAG,cAAc,CAAC,EACxD,YAAY,EAAE,uBAAuB,KAClC,IAAI,CAAC;IACV,sBAAsB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAClE,cAAc,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;IAC5D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,iBAAS,eAAe,CAAC,EACvB,oBAAoB,EACpB,eAAsB,EACtB,aAAa,EACb,UAAiB,EACjB,MAAW,EACX,MAAc,EACd,cAAc,EACd,OAAO,EACP,eAAe,EACf,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,EACR,WAAgB,EAChB,MAAgC,EAChC,mBAAuC,EACvC,OAAmB,GACpB,EAAE,gBAAgB,2CA0IlB;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;CAMtB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Plus } from "lucide-react";
|
|
3
|
+
import { Button } from "../../ui/button";
|
|
4
|
+
import { NewActionButton } from "../../ui/new-action-button";
|
|
5
|
+
import { Sidebar, SidebarCollapsedActionButton, SidebarContent, SidebarHeader, SidebarPanel, SidebarScrollRegion, } from "../sidebar";
|
|
6
|
+
import { ChatConversationItem } from "./chat-conversation-item";
|
|
7
|
+
import { ChatConversationRenameDialog } from "./chat-conversation-rename-dialog";
|
|
8
|
+
import { ChatSourceIcon } from "./chat-source";
|
|
9
|
+
function railMonogram(label) {
|
|
10
|
+
const words = label.trim().split(/\s+/).filter(Boolean);
|
|
11
|
+
const initials = words
|
|
12
|
+
.slice(0, 2)
|
|
13
|
+
.map((word) => word[0]?.toUpperCase() ?? "")
|
|
14
|
+
.join("");
|
|
15
|
+
return (initials || label.slice(0, 1).toUpperCase() || "?").slice(0, 2);
|
|
16
|
+
}
|
|
17
|
+
function renderRailIdentity(conversation) {
|
|
18
|
+
if (typeof conversation.source === "string" &&
|
|
19
|
+
conversation.source.trim().length > 0) {
|
|
20
|
+
return _jsx(ChatSourceIcon, { source: conversation.source, className: "h-4 w-4" });
|
|
21
|
+
}
|
|
22
|
+
return railMonogram(conversation.title);
|
|
23
|
+
}
|
|
24
|
+
function ChatSidebarRoot({ activeConversationId, confirmDeleteId = null, conversations, deletingId = null, labels = {}, mobile = false, onCancelDelete, onClose, onConfirmDelete, onCreate, onOpenActions, onRequestDeleteConfirm, onRequestRename, onSearchChange, onSearchClear, onSelect, searchValue = "", testId = "conversations-sidebar", unreadConversations = new Set(), variant = "default", }) {
|
|
25
|
+
const isGameModal = variant === "game-modal";
|
|
26
|
+
const canCollapse = !mobile && !isGameModal;
|
|
27
|
+
const hasSearch = typeof onSearchChange === "function";
|
|
28
|
+
const searchLabel = labels.searchChats ?? "Search chats";
|
|
29
|
+
const newChatAction = isGameModal ? (_jsx(Button, { variant: "outline", className: "h-11 w-full rounded-xl border-[color:var(--onboarding-accent-border)] bg-[color:var(--onboarding-accent-bg)] px-3 py-2 text-sm font-medium text-[color:var(--onboarding-text-strong)] shadow-[0_12px_28px_rgba(0,0,0,0.18)] hover:border-[color:var(--onboarding-accent-border-hover)] hover:bg-[color:var(--onboarding-accent-bg-hover)] active:scale-[0.98]", onClick: () => {
|
|
30
|
+
onCreate();
|
|
31
|
+
onClose?.();
|
|
32
|
+
}, children: labels.newChat ?? "New chat" })) : (_jsx(NewActionButton, { onClick: () => {
|
|
33
|
+
onCreate();
|
|
34
|
+
onClose?.();
|
|
35
|
+
}, children: labels.newChat ?? "New chat" }));
|
|
36
|
+
return (_jsx(Sidebar, { testId: testId, variant: mobile ? "mobile" : isGameModal ? "game-modal" : "default", collapsible: canCollapse, contentIdentity: mobile ? "chat-mobile" : isGameModal ? "chat-modal" : "chat", collapseButtonTestId: "chat-sidebar-collapse-toggle", expandButtonTestId: "chat-sidebar-expand-toggle", collapseButtonAriaLabel: labels.closePanel ?? "Close panel", expandButtonAriaLabel: labels.expandChatsPanel ?? "Expand chats panel", header: hasSearch ? (_jsx(SidebarHeader, { search: {
|
|
37
|
+
value: searchValue,
|
|
38
|
+
onChange: onSearchChange,
|
|
39
|
+
onClear: onSearchClear,
|
|
40
|
+
placeholder: searchLabel,
|
|
41
|
+
"aria-label": searchLabel,
|
|
42
|
+
clearLabel: labels.clearSearch ?? "Clear search",
|
|
43
|
+
autoComplete: "off",
|
|
44
|
+
spellCheck: false,
|
|
45
|
+
} })) : undefined, collapsedRailAction: _jsx(SidebarCollapsedActionButton, { "aria-label": labels.newChat ?? "New chat", onClick: () => {
|
|
46
|
+
onCreate();
|
|
47
|
+
onClose?.();
|
|
48
|
+
}, children: _jsx(Plus, { className: "h-4 w-4" }) }), collapsedRailItems: conversations.map((conversation) => (_jsx(SidebarContent.RailItem, { "aria-label": conversation.title, title: conversation.title, active: conversation.id === activeConversationId, indicatorTone: unreadConversations.has(conversation.id) ? "accent" : undefined, onClick: () => {
|
|
49
|
+
onSelect(conversation.id);
|
|
50
|
+
onClose?.();
|
|
51
|
+
}, children: renderRailIdentity(conversation) }, conversation.id))), onMobileClose: mobile ? onClose : undefined, mobileCloseLabel: labels.closePanel ?? "Close panel", mobileTitle: mobile ? (_jsx(SidebarContent.SectionLabel, { children: labels.chats ?? "Chats" })) : undefined, mobileMeta: mobile ? String(conversations.length) : undefined, "data-no-window-drag": "", "aria-label": labels.chats ?? "Chats", children: _jsx(SidebarScrollRegion, { variant: isGameModal ? "game-modal" : "default", children: _jsxs(SidebarPanel, { variant: isGameModal ? "game-modal" : "default", children: [_jsx("div", { className: "mb-3", children: newChatAction }), conversations.length === 0 ? (_jsx(SidebarContent.EmptyState, { variant: isGameModal ? "game-modal" : "default", className: !isGameModal ? "border-border/50 bg-bg/35" : undefined, children: searchValue.trim()
|
|
52
|
+
? (labels.noMatchingChats ?? "No matching chats")
|
|
53
|
+
: (labels.none ?? "No conversations yet") })) : (conversations.map((conversation) => (_jsx(ChatConversationItem, { conversation: conversation, deleting: deletingId === conversation.id, isActive: conversation.id === activeConversationId, isConfirmingDelete: confirmDeleteId === conversation.id, isUnread: unreadConversations.has(conversation.id), labels: labels, mobile: mobile, onCancelDelete: onCancelDelete, onConfirmDelete: () => onConfirmDelete?.(conversation.id), onOpenActions: onOpenActions, onRequestDeleteConfirm: () => onRequestDeleteConfirm?.(conversation.id), onRequestRename: () => onRequestRename?.(conversation), onSelect: () => {
|
|
54
|
+
onSelect(conversation.id);
|
|
55
|
+
onClose?.();
|
|
56
|
+
}, variant: variant }, conversation.id))))] }) }) }));
|
|
57
|
+
}
|
|
58
|
+
export const ChatSidebar = Object.assign(ChatSidebarRoot, {
|
|
59
|
+
Content: SidebarContent,
|
|
60
|
+
Item: ChatConversationItem,
|
|
61
|
+
Panel: SidebarPanel,
|
|
62
|
+
RenameDialog: ChatConversationRenameDialog,
|
|
63
|
+
ScrollRegion: SidebarScrollRegion,
|
|
64
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
type SourceIconProps = {
|
|
3
|
+
className?: string;
|
|
4
|
+
};
|
|
5
|
+
type ChatSourceMeta = {
|
|
6
|
+
badgeClassName: string;
|
|
7
|
+
borderClassName: string;
|
|
8
|
+
iconClassName: string;
|
|
9
|
+
Icon: React.ComponentType<SourceIconProps>;
|
|
10
|
+
label: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function getChatSourceMeta(source: string): ChatSourceMeta;
|
|
13
|
+
export declare function ChatSourceIcon({ source, className, decorative, }: {
|
|
14
|
+
className?: string;
|
|
15
|
+
decorative?: boolean;
|
|
16
|
+
source: string;
|
|
17
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=chat-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-source.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/composites/chat/chat-source.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,KAAK,eAAe,GAAG;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAsHF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAWhE;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,SAAS,EACT,UAAkB,GACnB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB,2CAmBA"}
|