veryfront 0.1.997 → 0.1.998
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/esm/cli/templates/manifest.js +1 -1
- package/esm/deno.d.ts +7 -0
- package/esm/deno.js +11 -3
- package/esm/deps/esm.sh/react-dom@19.2.4.d.ts +2 -0
- package/esm/deps/esm.sh/react-dom@19.2.4.d.ts.map +1 -0
- package/esm/deps/esm.sh/react-dom@19.2.4.js +3 -0
- package/esm/react/react-dom.d.ts +3 -0
- package/esm/react/react-dom.d.ts.map +1 -0
- package/esm/react/react-dom.js +2 -0
- package/esm/src/agent/ag-ui/host-support.d.ts.map +1 -1
- package/esm/src/agent/ag-ui/host-support.js +12 -0
- package/esm/src/agent/react/index.d.ts +4 -2
- package/esm/src/agent/react/index.d.ts.map +1 -1
- package/esm/src/agent/react/index.js +2 -1
- package/esm/src/agent/react/use-agent-metadata.d.ts +5 -0
- package/esm/src/agent/react/use-agent-metadata.d.ts.map +1 -1
- package/esm/src/agent/react/use-agent-metadata.js +18 -9
- package/esm/src/agent/react/use-agents.d.ts +33 -0
- package/esm/src/agent/react/use-agents.d.ts.map +1 -0
- package/esm/src/agent/react/use-agents.js +72 -0
- package/esm/src/agent/react/use-chat/index.d.ts +1 -1
- package/esm/src/agent/react/use-chat/index.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/types.d.ts +3 -2
- package/esm/src/agent/react/use-chat/types.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.d.ts +12 -1
- package/esm/src/agent/react/use-chat/use-chat.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/use-chat.js +47 -7
- package/esm/src/agent/react/use-chat/utils.d.ts.map +1 -1
- package/esm/src/agent/react/use-chat/utils.js +4 -0
- package/esm/src/agent/runtime/message-adapter.d.ts.map +1 -1
- package/esm/src/agent/runtime/message-adapter.js +3 -1
- package/esm/src/agent/runtime/text-generation-runtime-message-converter.d.ts.map +1 -1
- package/esm/src/agent/runtime/text-generation-runtime-message-converter.js +6 -2
- package/esm/src/chat/index.d.ts +17 -7
- package/esm/src/chat/index.d.ts.map +1 -1
- package/esm/src/chat/index.js +33 -7
- package/esm/src/chat/protocol.d.ts +13 -1
- package/esm/src/chat/protocol.d.ts.map +1 -1
- package/esm/src/chat/upload-handler.d.ts +55 -0
- package/esm/src/chat/upload-handler.d.ts.map +1 -0
- package/esm/src/chat/upload-handler.js +180 -0
- package/esm/src/discovery/import-rewriter.d.ts +1 -1
- package/esm/src/discovery/import-rewriter.d.ts.map +1 -1
- package/esm/src/discovery/import-rewriter.js +2 -0
- package/esm/src/discovery/transpiler.d.ts.map +1 -1
- package/esm/src/discovery/transpiler.js +2 -0
- package/esm/src/react/components/chat/agent-card.d.ts +84 -11
- package/esm/src/react/components/chat/agent-card.d.ts.map +1 -1
- package/esm/src/react/components/chat/agent-card.js +151 -57
- package/esm/src/react/components/chat/agent-picker.d.ts +166 -0
- package/esm/src/react/components/chat/agent-picker.d.ts.map +1 -0
- package/esm/src/react/components/chat/agent-picker.js +183 -0
- package/esm/src/react/components/chat/chat/components/animations.js +1 -1
- package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts +125 -3
- package/esm/src/react/components/chat/chat/components/attachment-pill.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/attachment-pill.js +209 -25
- package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts +149 -0
- package/esm/src/react/components/chat/chat/components/attachments-panel.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/components/attachments-panel.js +187 -0
- package/esm/src/react/components/chat/chat/components/branch-picker.d.ts +13 -2
- package/esm/src/react/components/chat/chat/components/branch-picker.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/branch-picker.js +6 -8
- package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.d.ts +20 -0
- package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/components/chat-messages-skeleton.js +31 -0
- package/esm/src/react/components/chat/chat/components/code-block.d.ts +9 -1
- package/esm/src/react/components/chat/chat/components/code-block.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/code-block.js +14 -6
- package/esm/src/react/components/chat/chat/components/drop-zone.d.ts +11 -4
- package/esm/src/react/components/chat/chat/components/drop-zone.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/drop-zone.js +10 -8
- package/esm/src/react/components/chat/chat/components/empty-state.d.ts +2 -1
- package/esm/src/react/components/chat/chat/components/empty-state.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/empty-state.js +7 -8
- package/esm/src/react/components/chat/chat/components/inference-badge.d.ts +6 -2
- package/esm/src/react/components/chat/chat/components/inference-badge.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/inference-badge.js +5 -4
- package/esm/src/react/components/chat/chat/components/inline-citation.d.ts +9 -1
- package/esm/src/react/components/chat/chat/components/inline-citation.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/inline-citation.js +19 -20
- package/esm/src/react/components/chat/chat/components/message-actions.d.ts +28 -5
- package/esm/src/react/components/chat/chat/components/message-actions.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/message-actions.js +24 -36
- package/esm/src/react/components/chat/chat/components/message-edit-form.d.ts +7 -2
- package/esm/src/react/components/chat/chat/components/message-edit-form.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/message-edit-form.js +5 -5
- package/esm/src/react/components/chat/chat/components/message-feedback.d.ts +11 -1
- package/esm/src/react/components/chat/chat/components/message-feedback.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/message-feedback.js +9 -11
- package/esm/src/react/components/chat/chat/components/quick-actions.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/quick-actions.js +3 -1
- package/esm/src/react/components/chat/chat/components/reasoning.d.ts +66 -3
- package/esm/src/react/components/chat/chat/components/reasoning.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/reasoning.js +95 -21
- package/esm/src/react/components/chat/chat/components/sidebar.d.ts +178 -12
- package/esm/src/react/components/chat/chat/components/sidebar.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/sidebar.js +228 -45
- package/esm/src/react/components/chat/chat/components/skill-badge.d.ts +6 -1
- package/esm/src/react/components/chat/chat/components/skill-badge.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/skill-badge.js +6 -5
- package/esm/src/react/components/chat/chat/components/skill-tool.d.ts +37 -0
- package/esm/src/react/components/chat/chat/components/skill-tool.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/components/skill-tool.js +46 -0
- package/esm/src/react/components/chat/chat/components/sources.d.ts +55 -3
- package/esm/src/react/components/chat/chat/components/sources.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/sources.js +50 -16
- package/esm/src/react/components/chat/chat/components/step-indicator.d.ts +42 -3
- package/esm/src/react/components/chat/chat/components/step-indicator.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/step-indicator.js +55 -12
- package/esm/src/react/components/chat/chat/components/tab-switcher.d.ts +1 -1
- package/esm/src/react/components/chat/chat/components/tab-switcher.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/tab-switcher.js +3 -3
- package/esm/src/react/components/chat/chat/components/tool-ui.d.ts +96 -3
- package/esm/src/react/components/chat/chat/components/tool-ui.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/components/tool-ui.js +158 -36
- package/esm/src/react/components/chat/chat/composition/api.d.ts +4 -2
- package/esm/src/react/components/chat/chat/composition/api.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/api.js +4 -2
- package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts +112 -5
- package/esm/src/react/components/chat/chat/composition/chat-composer.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-composer.js +251 -61
- package/esm/src/react/components/chat/chat/composition/chat-empty-state.d.ts +78 -0
- package/esm/src/react/components/chat/chat/composition/chat-empty-state.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/composition/chat-empty-state.js +63 -0
- package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts +4 -1
- package/esm/src/react/components/chat/chat/composition/chat-empty.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-empty.js +11 -10
- package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts +11 -3
- package/esm/src/react/components/chat/chat/composition/chat-message-list.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-message-list.js +81 -111
- package/esm/src/react/components/chat/chat/composition/chat-root.d.ts +4 -0
- package/esm/src/react/components/chat/chat/composition/chat-root.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/chat-root.js +3 -1
- package/esm/src/react/components/chat/chat/composition/error-banner.d.ts +4 -0
- package/esm/src/react/components/chat/chat/composition/error-banner.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/error-banner.js +10 -7
- package/esm/src/react/components/chat/chat/composition/message.d.ts +123 -5
- package/esm/src/react/components/chat/chat/composition/message.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/message.js +332 -53
- package/esm/src/react/components/chat/chat/composition/model-avatar.d.ts +6 -1
- package/esm/src/react/components/chat/chat/composition/model-avatar.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/composition/model-avatar.js +3 -4
- package/esm/src/react/components/chat/chat/composition/pending-message.d.ts +31 -0
- package/esm/src/react/components/chat/chat/composition/pending-message.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/composition/pending-message.js +31 -0
- package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts +4 -0
- package/esm/src/react/components/chat/chat/contexts/chat-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts +1 -0
- package/esm/src/react/components/chat/chat/contexts/composer-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts +29 -0
- package/esm/src/react/components/chat/chat/contexts/conversations-context.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/contexts/conversations-context.js +39 -0
- package/esm/src/react/components/chat/chat/contexts/index.d.ts +1 -1
- package/esm/src/react/components/chat/chat/contexts/index.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/contexts/index.js +1 -1
- package/esm/src/react/components/chat/chat/contexts/message-context.d.ts +2 -0
- package/esm/src/react/components/chat/chat/contexts/message-context.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/hooks/use-clipboard.d.ts +10 -0
- package/esm/src/react/components/chat/chat/hooks/use-clipboard.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-clipboard.js +34 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts +21 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversation.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversation.js +54 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts +67 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-conversations.js +317 -0
- package/esm/src/react/components/chat/chat/hooks/use-drop-zone.d.ts +27 -0
- package/esm/src/react/components/chat/chat/hooks/use-drop-zone.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-drop-zone.js +50 -0
- package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.d.ts +49 -0
- package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-stick-to-bottom.js +120 -0
- package/esm/src/react/components/chat/chat/hooks/use-upload.d.ts +34 -0
- package/esm/src/react/components/chat/chat/hooks/use-upload.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-upload.js +147 -0
- package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.d.ts +37 -0
- package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/hooks/use-uploads-registry.js +178 -0
- package/esm/src/react/components/chat/chat/index.d.ts +171 -31
- package/esm/src/react/components/chat/chat/index.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/index.js +371 -77
- package/esm/src/react/components/chat/chat/persistence/conversation-store.d.ts +63 -0
- package/esm/src/react/components/chat/chat/persistence/conversation-store.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/persistence/conversation-store.js +1 -0
- package/esm/src/react/components/chat/chat/persistence/local-conversation-store.d.ts +13 -0
- package/esm/src/react/components/chat/chat/persistence/local-conversation-store.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/persistence/local-conversation-store.js +102 -0
- package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.d.ts +11 -0
- package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat/persistence/memory-conversation-store.js +33 -0
- package/esm/src/react/components/chat/chat/utils/message-parts.d.ts +4 -1
- package/esm/src/react/components/chat/chat/utils/message-parts.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat/utils/message-parts.js +4 -0
- package/esm/src/react/components/chat/chat-actions.d.ts +164 -0
- package/esm/src/react/components/chat/chat-actions.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-actions.js +191 -0
- package/esm/src/react/components/chat/chat-agent-picker.d.ts +50 -0
- package/esm/src/react/components/chat/chat-agent-picker.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-agent-picker.js +40 -0
- package/esm/src/react/components/chat/chat-theme-scope.d.ts +26 -0
- package/esm/src/react/components/chat/chat-theme-scope.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-theme-scope.js +27 -0
- package/esm/src/react/components/chat/chat-tokens-style.d.ts +21 -0
- package/esm/src/react/components/chat/chat-tokens-style.d.ts.map +1 -0
- package/esm/src/react/components/chat/chat-tokens-style.js +24 -0
- package/esm/src/react/components/chat/chat.d.ts +5 -5
- package/esm/src/react/components/chat/chat.d.ts.map +1 -1
- package/esm/src/react/components/chat/chat.js +5 -5
- package/esm/src/react/components/chat/color-mode.d.ts +46 -0
- package/esm/src/react/components/chat/color-mode.d.ts.map +1 -0
- package/esm/src/react/components/chat/color-mode.js +123 -0
- package/esm/src/react/components/chat/error-boundary.js +2 -2
- package/esm/src/react/components/chat/icons/index.d.ts +8 -0
- package/esm/src/react/components/chat/icons/index.d.ts.map +1 -1
- package/esm/src/react/components/chat/icons/index.js +64 -0
- package/esm/src/react/components/chat/markdown.d.ts +24 -1
- package/esm/src/react/components/chat/markdown.d.ts.map +1 -1
- package/esm/src/react/components/chat/markdown.js +122 -38
- package/esm/src/react/components/chat/model-selector.d.ts +130 -8
- package/esm/src/react/components/chat/model-selector.d.ts.map +1 -1
- package/esm/src/react/components/chat/model-selector.js +148 -121
- package/esm/src/react/components/chat/theme.d.ts +9 -12
- package/esm/src/react/components/chat/theme.d.ts.map +1 -1
- package/esm/src/react/components/chat/theme.js +149 -93
- package/esm/src/react/components/chat/ui/alert.d.ts +30 -0
- package/esm/src/react/components/chat/ui/alert.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/alert.js +35 -0
- package/esm/src/react/components/chat/ui/app-shell.d.ts +155 -0
- package/esm/src/react/components/chat/ui/app-shell.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/app-shell.js +276 -0
- package/esm/src/react/components/chat/ui/avatar.d.ts +24 -0
- package/esm/src/react/components/chat/ui/avatar.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/avatar.js +44 -0
- package/esm/src/react/components/chat/ui/badge.d.ts +24 -0
- package/esm/src/react/components/chat/ui/badge.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/badge.js +30 -0
- package/esm/src/react/components/chat/ui/button.d.ts +44 -0
- package/esm/src/react/components/chat/ui/button.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/button.js +108 -0
- package/esm/src/react/components/chat/ui/card.d.ts +42 -0
- package/esm/src/react/components/chat/ui/card.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/card.js +55 -0
- package/esm/src/react/components/chat/ui/checkbox.d.ts +28 -0
- package/esm/src/react/components/chat/ui/checkbox.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/checkbox.js +36 -0
- package/esm/src/react/components/chat/ui/code-block.d.ts +89 -0
- package/esm/src/react/components/chat/ui/code-block.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/code-block.js +277 -0
- package/esm/src/react/components/chat/ui/collapsible.d.ts +30 -0
- package/esm/src/react/components/chat/ui/collapsible.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/collapsible.js +44 -0
- package/esm/src/react/components/chat/ui/command.d.ts +65 -0
- package/esm/src/react/components/chat/ui/command.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/command.js +121 -0
- package/esm/src/react/components/chat/ui/cva.d.ts +36 -0
- package/esm/src/react/components/chat/ui/cva.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/cva.js +45 -0
- package/esm/src/react/components/chat/ui/dialog.d.ts +55 -0
- package/esm/src/react/components/chat/ui/dialog.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/dialog.js +116 -0
- package/esm/src/react/components/chat/ui/drawer.d.ts +41 -0
- package/esm/src/react/components/chat/ui/drawer.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/drawer.js +92 -0
- package/esm/src/react/components/chat/ui/dropdown-menu.d.ts +63 -0
- package/esm/src/react/components/chat/ui/dropdown-menu.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/dropdown-menu.js +76 -0
- package/esm/src/react/components/chat/ui/file-type.d.ts +26 -0
- package/esm/src/react/components/chat/ui/file-type.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/file-type.js +235 -0
- package/esm/src/react/components/chat/ui/floating.d.ts +29 -0
- package/esm/src/react/components/chat/ui/floating.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/floating.js +90 -0
- package/esm/src/react/components/chat/ui/icon-button.d.ts +19 -0
- package/esm/src/react/components/chat/ui/icon-button.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/icon-button.js +20 -0
- package/esm/src/react/components/chat/ui/index.d.ts +43 -0
- package/esm/src/react/components/chat/ui/index.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/index.js +42 -0
- package/esm/src/react/components/chat/ui/input.d.ts +27 -0
- package/esm/src/react/components/chat/ui/input.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/input.js +41 -0
- package/esm/src/react/components/chat/ui/label.d.ts +29 -0
- package/esm/src/react/components/chat/ui/label.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/label.js +40 -0
- package/esm/src/react/components/chat/ui/list.d.ts +47 -0
- package/esm/src/react/components/chat/ui/list.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/list.js +40 -0
- package/esm/src/react/components/chat/ui/pill.d.ts +26 -0
- package/esm/src/react/components/chat/ui/pill.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/pill.js +39 -0
- package/esm/src/react/components/chat/ui/popover.d.ts +47 -0
- package/esm/src/react/components/chat/ui/popover.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/popover.js +68 -0
- package/esm/src/react/components/chat/ui/progress-bar.d.ts +20 -0
- package/esm/src/react/components/chat/ui/progress-bar.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/progress-bar.js +31 -0
- package/esm/src/react/components/chat/ui/radio.d.ts +25 -0
- package/esm/src/react/components/chat/ui/radio.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/radio.js +29 -0
- package/esm/src/react/components/chat/ui/scroll-fade.d.ts +23 -0
- package/esm/src/react/components/chat/ui/scroll-fade.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/scroll-fade.js +40 -0
- package/esm/src/react/components/chat/ui/select.d.ts +64 -0
- package/esm/src/react/components/chat/ui/select.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/select.js +148 -0
- package/esm/src/react/components/chat/ui/shimmer.d.ts +25 -0
- package/esm/src/react/components/chat/ui/shimmer.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/shimmer.js +24 -0
- package/esm/src/react/components/chat/ui/skeleton.d.ts +14 -0
- package/esm/src/react/components/chat/ui/skeleton.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/skeleton.js +12 -0
- package/esm/src/react/components/chat/ui/slot.d.ts +21 -0
- package/esm/src/react/components/chat/ui/slot.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/slot.js +70 -0
- package/esm/src/react/components/chat/ui/status.d.ts +28 -0
- package/esm/src/react/components/chat/ui/status.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/status.js +23 -0
- package/esm/src/react/components/chat/ui/switch.d.ts +34 -0
- package/esm/src/react/components/chat/ui/switch.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/switch.js +58 -0
- package/esm/src/react/components/chat/ui/tabs.d.ts +44 -0
- package/esm/src/react/components/chat/ui/tabs.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/tabs.js +51 -0
- package/esm/src/react/components/chat/ui/tag.d.ts +22 -0
- package/esm/src/react/components/chat/ui/tag.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/tag.js +27 -0
- package/esm/src/react/components/chat/ui/textarea.d.ts +22 -0
- package/esm/src/react/components/chat/ui/textarea.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/textarea.js +35 -0
- package/esm/src/react/components/chat/ui/tooltip.d.ts +40 -0
- package/esm/src/react/components/chat/ui/tooltip.d.ts.map +1 -0
- package/esm/src/react/components/chat/ui/tooltip.js +132 -0
- package/esm/src/react/primitives/input-box.d.ts.map +1 -1
- package/esm/src/react/primitives/input-box.js +17 -4
- package/esm/src/server/handlers/dev/framework-candidates.generated.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/framework-candidates.generated.js +9437 -1064
- package/esm/src/server/handlers/dev/projects/html-shell.d.ts +1 -1
- package/esm/src/server/handlers/dev/projects/html-shell.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/projects/html-shell.js +1 -12
- package/esm/src/server/handlers/request/public-agents-list.handler.d.ts +18 -0
- package/esm/src/server/handlers/request/public-agents-list.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/public-agents-list.handler.js +44 -0
- package/esm/src/server/runtime-handler/index.d.ts +1 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +3 -0
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +3 -2
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/workflow/blob/local-storage.d.ts +32 -0
- package/esm/src/workflow/blob/local-storage.d.ts.map +1 -0
- package/esm/src/workflow/blob/local-storage.js +179 -0
- package/esm/src/workflow/blob/types.d.ts +5 -0
- package/esm/src/workflow/blob/types.d.ts.map +1 -1
- package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts +11 -0
- package/esm/src/workflow/blob/veryfront-cloud-storage.d.ts.map +1 -1
- package/esm/src/workflow/blob/veryfront-cloud-storage.js +36 -0
- package/package.json +5 -1
- package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts +0 -20
- package/esm/src/react/components/chat/chat/components/uploads-panel.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat/components/uploads-panel.js +0 -49
- package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts +0 -28
- package/esm/src/react/components/chat/chat/contexts/thread-list-context.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat/contexts/thread-list-context.js +0 -27
- package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts +0 -28
- package/esm/src/react/components/chat/chat/hooks/use-threads.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat/hooks/use-threads.js +0 -151
- package/esm/src/react/components/chat/chat-with-sidebar.d.ts +0 -110
- package/esm/src/react/components/chat/chat-with-sidebar.d.ts.map +0 -1
- package/esm/src/react/components/chat/chat-with-sidebar.js +0 -167
- package/esm/src/react/components/chat/message.d.ts +0 -42
- package/esm/src/react/components/chat/message.d.ts.map +0 -1
- package/esm/src/react/components/chat/message.js +0 -69
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppShell — a chat-independent layout primitive modeled on the shadcn sidebar
|
|
3
|
+
* (https://ui.shadcn.com/blocks). It owns the *layout + sidebar visibility*;
|
|
4
|
+
* everything else is slots. The sidebar is binary — visible or hidden (no
|
|
5
|
+
* collapse/icon-rail mode). Supports a left AND a right sidebar, each with its
|
|
6
|
+
* own toggle and persisted state.
|
|
7
|
+
*
|
|
8
|
+
* Desktop: sidebars are inline flex columns (mounted only while open).
|
|
9
|
+
* Mobile (< sm): sidebars become a focus-trapped off-canvas overlay + backdrop
|
|
10
|
+
* that slides in from the relevant edge, with Escape-to-close, scroll-lock, and
|
|
11
|
+
* focus restore.
|
|
12
|
+
*
|
|
13
|
+
* Purely structural: it injects no theme/token CSS — the host owns theming.
|
|
14
|
+
* Zero external deps (uses the local `cn` + `ui/button`). Built in `chat/ui`
|
|
15
|
+
* for now; designed for a clean `git mv` to a top-level `/ui`.
|
|
16
|
+
*
|
|
17
|
+
* @module react/components/chat/ui/app-shell
|
|
18
|
+
*/
|
|
19
|
+
import * as React from "../../../../../react/react.js";
|
|
20
|
+
import { cn } from "../theme.js";
|
|
21
|
+
import { ChatTokens } from "../chat-tokens-style.js";
|
|
22
|
+
import { PanelLeftIcon, PanelRightIcon } from "../icons/index.js";
|
|
23
|
+
import { Button } from "./button.js";
|
|
24
|
+
const FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
|
|
25
|
+
const AppShellContext = React.createContext(null);
|
|
26
|
+
/** Access the enclosing {@link AppShell}'s state (external triggers, etc.). */
|
|
27
|
+
export function useAppShell() {
|
|
28
|
+
const ctx = React.useContext(AppShellContext);
|
|
29
|
+
if (!ctx)
|
|
30
|
+
throw new Error("AppShell parts must be used within <AppShell>");
|
|
31
|
+
return ctx;
|
|
32
|
+
}
|
|
33
|
+
/** Reactive `< sm` viewport check (matches Tailwind `max-sm`). SSR-safe. */
|
|
34
|
+
function useIsMobile() {
|
|
35
|
+
const [isMobile, setIsMobile] = React.useState(false);
|
|
36
|
+
React.useEffect(() => {
|
|
37
|
+
if (typeof globalThis.matchMedia !== "function")
|
|
38
|
+
return;
|
|
39
|
+
const mql = globalThis.matchMedia("(max-width: 639.98px)");
|
|
40
|
+
const update = () => setIsMobile(mql.matches);
|
|
41
|
+
update();
|
|
42
|
+
mql.addEventListener("change", update);
|
|
43
|
+
return () => mql.removeEventListener("change", update);
|
|
44
|
+
}, []);
|
|
45
|
+
return isMobile;
|
|
46
|
+
}
|
|
47
|
+
function readStored(storageKey, side, fallback) {
|
|
48
|
+
if (!storageKey || typeof localStorage === "undefined")
|
|
49
|
+
return fallback;
|
|
50
|
+
try {
|
|
51
|
+
const raw = localStorage.getItem(`${storageKey}-${side}`);
|
|
52
|
+
if (raw === "true")
|
|
53
|
+
return true;
|
|
54
|
+
if (raw === "false")
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
catch (_) { /* expected: unavailable/blocked storage */ }
|
|
58
|
+
return fallback;
|
|
59
|
+
}
|
|
60
|
+
function writeStored(storageKey, side, value) {
|
|
61
|
+
if (!storageKey || typeof localStorage === "undefined")
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
localStorage.setItem(`${storageKey}-${side}`, String(value));
|
|
65
|
+
}
|
|
66
|
+
catch (_) { /* expected: unavailable/blocked storage */ }
|
|
67
|
+
}
|
|
68
|
+
/** Root — provides sidebar state and the flex layout container. */
|
|
69
|
+
function AppShellRoot({ open, defaultOpen, onOpenChange, storageKey, keyboardShortcut = true, className, children, ref, ...props }) {
|
|
70
|
+
const isMobile = useIsMobile();
|
|
71
|
+
const baseId = React.useId();
|
|
72
|
+
const isControlledLeft = open?.left !== undefined;
|
|
73
|
+
const isControlledRight = open?.right !== undefined;
|
|
74
|
+
const [leftDesktop, setLeftDesktop] = React.useState(() => readStored(storageKey, "left", defaultOpen?.left ?? true));
|
|
75
|
+
const [rightDesktop, setRightDesktop] = React.useState(() => readStored(storageKey, "right", defaultOpen?.right ?? false));
|
|
76
|
+
const [leftMobile, setLeftMobile] = React.useState(false);
|
|
77
|
+
const [rightMobile, setRightMobile] = React.useState(false);
|
|
78
|
+
// Returning to a wider viewport drops any open mobile overlays.
|
|
79
|
+
React.useEffect(() => {
|
|
80
|
+
if (!isMobile) {
|
|
81
|
+
setLeftMobile(false);
|
|
82
|
+
setRightMobile(false);
|
|
83
|
+
}
|
|
84
|
+
}, [isMobile]);
|
|
85
|
+
const desktopOpen = {
|
|
86
|
+
left: isControlledLeft ? open.left : leftDesktop,
|
|
87
|
+
right: isControlledRight ? open.right : rightDesktop,
|
|
88
|
+
};
|
|
89
|
+
const mobileOpen = {
|
|
90
|
+
left: leftMobile,
|
|
91
|
+
right: rightMobile,
|
|
92
|
+
};
|
|
93
|
+
const setOpen = React.useCallback((side, value) => {
|
|
94
|
+
if (isMobile) {
|
|
95
|
+
(side === "left" ? setLeftMobile : setRightMobile)(value);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const controlled = side === "left" ? isControlledLeft : isControlledRight;
|
|
99
|
+
if (!controlled) {
|
|
100
|
+
(side === "left" ? setLeftDesktop : setRightDesktop)(value);
|
|
101
|
+
writeStored(storageKey, side, value);
|
|
102
|
+
}
|
|
103
|
+
onOpenChange?.(side, value);
|
|
104
|
+
}, [isMobile, isControlledLeft, isControlledRight, storageKey, onOpenChange]);
|
|
105
|
+
const value = React.useMemo(() => {
|
|
106
|
+
const isOpen = (side) => isMobile ? mobileOpen[side] : desktopOpen[side];
|
|
107
|
+
return {
|
|
108
|
+
isMobile,
|
|
109
|
+
isOpen,
|
|
110
|
+
setOpen,
|
|
111
|
+
toggle: (side) => setOpen(side, !isOpen(side)),
|
|
112
|
+
sidebarId: (side) => `${baseId}-sidebar-${side}`,
|
|
113
|
+
};
|
|
114
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
115
|
+
}, [
|
|
116
|
+
isMobile,
|
|
117
|
+
setOpen,
|
|
118
|
+
baseId,
|
|
119
|
+
desktopOpen.left,
|
|
120
|
+
desktopOpen.right,
|
|
121
|
+
mobileOpen.left,
|
|
122
|
+
mobileOpen.right,
|
|
123
|
+
]);
|
|
124
|
+
// ⌘/Ctrl+B toggles the left sidebar (shadcn parity).
|
|
125
|
+
React.useEffect(() => {
|
|
126
|
+
if (!keyboardShortcut)
|
|
127
|
+
return;
|
|
128
|
+
const onKeyDown = (e) => {
|
|
129
|
+
if ((e.metaKey || e.ctrlKey) && (e.key === "b" || e.key === "B")) {
|
|
130
|
+
e.preventDefault();
|
|
131
|
+
value.toggle("left");
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
document.addEventListener("keydown", onKeyDown);
|
|
135
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
136
|
+
}, [keyboardShortcut, value]);
|
|
137
|
+
return (React.createElement(AppShellContext.Provider, { value: value },
|
|
138
|
+
React.createElement(ChatTokens, null),
|
|
139
|
+
React.createElement("div", { ref: ref, className: cn("flex h-full w-full", className), "data-vf-appshell": "", "data-vf-chat": "", ...props }, children)));
|
|
140
|
+
}
|
|
141
|
+
/** Focus-trapped off-canvas overlay used on mobile. */
|
|
142
|
+
function SidebarOverlay({ side, width, id, className, children, ...props }) {
|
|
143
|
+
const ctx = useAppShell();
|
|
144
|
+
const panelRef = React.useRef(null);
|
|
145
|
+
const [entered, setEntered] = React.useState(false);
|
|
146
|
+
React.useEffect(() => {
|
|
147
|
+
const panel = panelRef.current;
|
|
148
|
+
const previouslyFocused = document.activeElement;
|
|
149
|
+
const prevOverflow = document.body.style.overflow;
|
|
150
|
+
document.body.style.overflow = "hidden";
|
|
151
|
+
const raf = requestAnimationFrame(() => setEntered(true));
|
|
152
|
+
const focusables = () => Array.from(panel?.querySelectorAll(FOCUSABLE_SELECTOR) ?? []);
|
|
153
|
+
(focusables()[0] ?? panel)?.focus();
|
|
154
|
+
const onKeyDown = (e) => {
|
|
155
|
+
if (e.key === "Escape") {
|
|
156
|
+
ctx.setOpen(side ?? "left", false);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (e.key !== "Tab")
|
|
160
|
+
return;
|
|
161
|
+
const els = focusables();
|
|
162
|
+
const first = els[0];
|
|
163
|
+
const last = els[els.length - 1];
|
|
164
|
+
if (!first || !last) {
|
|
165
|
+
e.preventDefault();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
if (e.shiftKey && document.activeElement === first) {
|
|
169
|
+
e.preventDefault();
|
|
170
|
+
last.focus();
|
|
171
|
+
}
|
|
172
|
+
else if (!e.shiftKey && document.activeElement === last) {
|
|
173
|
+
e.preventDefault();
|
|
174
|
+
first.focus();
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
document.addEventListener("keydown", onKeyDown);
|
|
178
|
+
return () => {
|
|
179
|
+
document.removeEventListener("keydown", onKeyDown);
|
|
180
|
+
document.body.style.overflow = prevOverflow;
|
|
181
|
+
cancelAnimationFrame(raf);
|
|
182
|
+
previouslyFocused?.focus?.();
|
|
183
|
+
};
|
|
184
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
185
|
+
}, []);
|
|
186
|
+
const hiddenTransform = side === "right" ? "translateX(100%)" : "translateX(-100%)";
|
|
187
|
+
return (React.createElement("div", { className: "fixed inset-0 z-50 sm:hidden" },
|
|
188
|
+
React.createElement("div", { className: "absolute inset-0 bg-[var(--overlay)] transition-opacity duration-200 motion-reduce:transition-none", style: { opacity: entered ? 1 : 0 }, onClick: () => ctx.setOpen(side ?? "left", false) }),
|
|
189
|
+
React.createElement("aside", { ref: panelRef, id: id, role: "dialog", "aria-modal": "true", "aria-label": props["aria-label"] ?? "Sidebar", tabIndex: -1, className: cn("absolute inset-y-0 z-50 flex h-full flex-col bg-[var(--background)] shadow-xl outline-none", "transition-transform duration-200 ease-out motion-reduce:transition-none", side === "right" ? "right-0" : "left-0", className), style: { width, transform: entered ? "translateX(0)" : hiddenTransform }, ...props }, children)));
|
|
190
|
+
}
|
|
191
|
+
/** A dockable sidebar. Renders inline on desktop, as an overlay on mobile. */
|
|
192
|
+
function AppShellSidebar({ side = "left", width = 240, className, children, ...props }) {
|
|
193
|
+
const ctx = useAppShell();
|
|
194
|
+
const id = ctx.sidebarId(side);
|
|
195
|
+
if (!ctx.isOpen(side))
|
|
196
|
+
return null;
|
|
197
|
+
if (ctx.isMobile) {
|
|
198
|
+
return (React.createElement(SidebarOverlay, { side: side, width: width, id: id, className: className, ...props }, children));
|
|
199
|
+
}
|
|
200
|
+
return (React.createElement("aside", { id: id, "aria-label": props["aria-label"] ?? "Sidebar", className: cn("flex h-full shrink-0 flex-col", className), style: { width }, ...props }, children));
|
|
201
|
+
}
|
|
202
|
+
/** Sidebar header slot — optional bottom border. */
|
|
203
|
+
function AppShellSidebarHeader({ border = false, className, ...props }) {
|
|
204
|
+
return (React.createElement("div", { className: cn("shrink-0", border && "border-b border-[var(--outline-border)]", className), ...props }));
|
|
205
|
+
}
|
|
206
|
+
/** Sidebar scroll region — grows to fill and scrolls. */
|
|
207
|
+
function AppShellSidebarContent({ className, ...props }) {
|
|
208
|
+
return React.createElement("div", { className: cn("min-h-0 flex-1 overflow-y-auto", className), ...props });
|
|
209
|
+
}
|
|
210
|
+
/** Sidebar footer slot — optional top border. */
|
|
211
|
+
function AppShellSidebarFooter({ border = false, className, ...props }) {
|
|
212
|
+
return (React.createElement("div", { className: cn("shrink-0", border && "border-t border-[var(--outline-border)]", className), ...props }));
|
|
213
|
+
}
|
|
214
|
+
/** The main content column, between/beside the sidebars. */
|
|
215
|
+
function AppShellMain({ className, ...props }) {
|
|
216
|
+
return (React.createElement("div", { className: cn("flex min-w-0 flex-1 flex-col", className), ...props }));
|
|
217
|
+
}
|
|
218
|
+
/** Optional top bar inside the main column — with or without a bottom border. */
|
|
219
|
+
function AppShellHeader({ border = false, className, ...props }) {
|
|
220
|
+
return (React.createElement("header", { className: cn("flex shrink-0 items-center gap-1 px-3 py-2", border && "border-b border-[var(--outline-border)]", className), ...props }));
|
|
221
|
+
}
|
|
222
|
+
/** The main content region — grows to fill, host owns overflow. */
|
|
223
|
+
function AppShellContent({ className, ...props }) {
|
|
224
|
+
return React.createElement("div", { className: cn("min-h-0 flex-1", className), ...props });
|
|
225
|
+
}
|
|
226
|
+
/** Toggle button — built on the shared `Button`, defaults its icon by `side`. */
|
|
227
|
+
function AppShellTrigger({ side = "left", icon, variant = "icon-ghost", size = "icon-default", className, onClick, "aria-label": ariaLabel, ...props }) {
|
|
228
|
+
const ctx = useAppShell();
|
|
229
|
+
const open = ctx.isOpen(side);
|
|
230
|
+
const defaultIcon = side === "right"
|
|
231
|
+
? React.createElement(PanelRightIcon, { className: "size-[18px]" })
|
|
232
|
+
: React.createElement(PanelLeftIcon, { className: "size-[18px]" });
|
|
233
|
+
return (React.createElement(Button, { variant: variant, size: size, className: className, "aria-expanded": open, "aria-controls": ctx.sidebarId(side), "aria-label": ariaLabel ??
|
|
234
|
+
`${open ? "Close" : "Open"} ${side} sidebar`, onClick: (e) => {
|
|
235
|
+
onClick?.(e);
|
|
236
|
+
ctx.toggle(side);
|
|
237
|
+
}, ...props }, icon ?? defaultIcon));
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Compound AppShell. Compose:
|
|
241
|
+
*
|
|
242
|
+
* ```tsx
|
|
243
|
+
* <AppShell storageKey="vf-shell">
|
|
244
|
+
* <AppShell.Sidebar side="left">
|
|
245
|
+
* <AppShell.SidebarHeader border>…</AppShell.SidebarHeader>
|
|
246
|
+
* <AppShell.SidebarContent>…</AppShell.SidebarContent>
|
|
247
|
+
* </AppShell.Sidebar>
|
|
248
|
+
* <AppShell.Main>
|
|
249
|
+
* <AppShell.Header border>
|
|
250
|
+
* <AppShell.Trigger side="left" />
|
|
251
|
+
* </AppShell.Header>
|
|
252
|
+
* <AppShell.Content>…</AppShell.Content>
|
|
253
|
+
* </AppShell.Main>
|
|
254
|
+
* <AppShell.Sidebar side="right">…</AppShell.Sidebar>
|
|
255
|
+
* </AppShell>
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
export const AppShell = Object.assign(AppShellRoot, {
|
|
259
|
+
Sidebar: AppShellSidebar,
|
|
260
|
+
SidebarHeader: AppShellSidebarHeader,
|
|
261
|
+
SidebarContent: AppShellSidebarContent,
|
|
262
|
+
SidebarFooter: AppShellSidebarFooter,
|
|
263
|
+
Main: AppShellMain,
|
|
264
|
+
Header: AppShellHeader,
|
|
265
|
+
Content: AppShellContent,
|
|
266
|
+
Trigger: AppShellTrigger,
|
|
267
|
+
});
|
|
268
|
+
AppShellRoot.displayName = "AppShell";
|
|
269
|
+
AppShellSidebar.displayName = "AppShell.Sidebar";
|
|
270
|
+
AppShellSidebarHeader.displayName = "AppShell.SidebarHeader";
|
|
271
|
+
AppShellSidebarContent.displayName = "AppShell.SidebarContent";
|
|
272
|
+
AppShellSidebarFooter.displayName = "AppShell.SidebarFooter";
|
|
273
|
+
AppShellMain.displayName = "AppShell.Main";
|
|
274
|
+
AppShellHeader.displayName = "AppShell.Header";
|
|
275
|
+
AppShellContent.displayName = "AppShell.Content";
|
|
276
|
+
AppShellTrigger.displayName = "AppShell.Trigger";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avatar — ported 1:1 from Veryfront Studio's `UserAvatar`. The one generic
|
|
3
|
+
* avatar for users, agents, and entities: shows an image when available, else
|
|
4
|
+
* initials (two-letter for `primary` tone, single capital for `muted`).
|
|
5
|
+
* Studio's `vf-avatar-initial` container-query sizing is simplified to a fixed
|
|
6
|
+
* `text-xs` for v1. Private to the chat module.
|
|
7
|
+
*
|
|
8
|
+
* @module react/components/chat/ui/avatar
|
|
9
|
+
*/
|
|
10
|
+
import * as React from "../../../../../react/react.js";
|
|
11
|
+
/** Props accepted by `<Avatar>`. */
|
|
12
|
+
export interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
13
|
+
name: string;
|
|
14
|
+
avatarSrc?: string;
|
|
15
|
+
accentColor?: string;
|
|
16
|
+
/** `filled` fills with accent (default); `bordered` shows an accent ring. */
|
|
17
|
+
variant?: "filled" | "bordered";
|
|
18
|
+
/** `primary` brand bg + two-letter initials; `muted` grey bg + one letter. */
|
|
19
|
+
tone?: "primary" | "muted";
|
|
20
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
21
|
+
}
|
|
22
|
+
/** Render a user / agent / entity avatar. */
|
|
23
|
+
export declare function Avatar({ className, style, name, avatarSrc, accentColor, variant, tone, ref, ...props }: AvatarProps): React.ReactElement;
|
|
24
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/ui/avatar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,KAAK,MAAM,+BAA+B,CAAC;AAcvD,oCAAoC;AACpC,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,8EAA8E;IAC9E,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC;AAED,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,KAAK,EACL,IAAI,EACJ,SAAS,EACT,WAAW,EACX,OAAkB,EAClB,IAAgB,EAChB,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAuDlC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avatar — ported 1:1 from Veryfront Studio's `UserAvatar`. The one generic
|
|
3
|
+
* avatar for users, agents, and entities: shows an image when available, else
|
|
4
|
+
* initials (two-letter for `primary` tone, single capital for `muted`).
|
|
5
|
+
* Studio's `vf-avatar-initial` container-query sizing is simplified to a fixed
|
|
6
|
+
* `text-xs` for v1. Private to the chat module.
|
|
7
|
+
*
|
|
8
|
+
* @module react/components/chat/ui/avatar
|
|
9
|
+
*/
|
|
10
|
+
import * as React from "../../../../../react/react.js";
|
|
11
|
+
import { cn } from "../theme.js";
|
|
12
|
+
function getInitials(name) {
|
|
13
|
+
if (!name)
|
|
14
|
+
return "?";
|
|
15
|
+
const [firstName, lastName] = name.split(" ");
|
|
16
|
+
return [firstName?.charAt(0), lastName?.charAt(0)].filter(Boolean).join("");
|
|
17
|
+
}
|
|
18
|
+
function getSingleInitial(name) {
|
|
19
|
+
const trimmed = name?.trim?.() ?? "";
|
|
20
|
+
return trimmed.length > 0 ? trimmed.charAt(0).toUpperCase() : "?";
|
|
21
|
+
}
|
|
22
|
+
/** Render a user / agent / entity avatar. */
|
|
23
|
+
export function Avatar({ className, style, name, avatarSrc, accentColor, variant = "filled", tone = "primary", ref, ...props }) {
|
|
24
|
+
const isBordered = variant === "bordered";
|
|
25
|
+
const isMuted = tone === "muted" && !accentColor;
|
|
26
|
+
const [imageFailed, setImageFailed] = React.useState(false);
|
|
27
|
+
React.useEffect(() => {
|
|
28
|
+
setImageFailed(false);
|
|
29
|
+
}, [avatarSrc]);
|
|
30
|
+
const showImage = Boolean(avatarSrc) && !imageFailed;
|
|
31
|
+
const accentStyle = accentColor
|
|
32
|
+
? isBordered
|
|
33
|
+
? { borderColor: accentColor }
|
|
34
|
+
: { backgroundColor: accentColor, borderColor: accentColor }
|
|
35
|
+
: undefined;
|
|
36
|
+
return (React.createElement("div", { ref: ref, className: cn("@container rounded-full size-8 shrink-0 flex items-center justify-center overflow-hidden", isMuted ? "bg-[var(--accent)]" : "bg-[var(--primary)]", accentColor && "border", className), style: { ...accentStyle, ...style }, ...props }, showImage
|
|
37
|
+
? (React.createElement("img", { src: avatarSrc, alt: name, referrerPolicy: "no-referrer", onError: () => setImageFailed(true), className: "w-full h-full rounded-full object-cover" }))
|
|
38
|
+
: (React.createElement("span", { className: cn(
|
|
39
|
+
// Scale the initial to the avatar via container-query units, so it
|
|
40
|
+
// fills small pills AND large empty-state avatars (Studio parity).
|
|
41
|
+
"w-full h-full flex items-center justify-center font-medium capitalize leading-none", isMuted
|
|
42
|
+
? "text-[length:44cqw] text-[var(--foreground)]"
|
|
43
|
+
: "text-[length:34cqw] text-white") }, isMuted ? getSingleInitial(name) : getInitials(name)))));
|
|
44
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Badge — ported 1:1 from Veryfront Studio, semantic classes remapped to
|
|
3
|
+
* veryfront's `[var(--token)]` vocabulary. The status fill tokens
|
|
4
|
+
* (`--alert-*-bg`) and `--status-*` text tokens are defined in `theme.ts`, so
|
|
5
|
+
* every variant renders with its proper fill. Private to the chat module.
|
|
6
|
+
*
|
|
7
|
+
* @module react/components/chat/ui/badge
|
|
8
|
+
*/
|
|
9
|
+
import * as React from "../../../../../react/react.js";
|
|
10
|
+
import { type VariantProps } from "./cva.js";
|
|
11
|
+
declare const badgeVariants: (props?: ({
|
|
12
|
+
variant?: "default" | "warning" | "success" | "outline" | "destructive" | null | undefined;
|
|
13
|
+
} & {
|
|
14
|
+
class?: import("../../../../utils/clsx.js").ClassValue;
|
|
15
|
+
className?: import("../../../../utils/clsx.js").ClassValue;
|
|
16
|
+
}) | undefined) => string;
|
|
17
|
+
/** Props accepted by `<Badge>`. */
|
|
18
|
+
export interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
|
|
19
|
+
children?: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
/** Render a badge. */
|
|
22
|
+
export declare function Badge({ className, variant, ...props }: BadgeProps): React.ReactElement;
|
|
23
|
+
export { badgeVariants };
|
|
24
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/ui/badge.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,KAAK,MAAM,+BAA+B,CAAC;AAEvD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAElD,QAAA,MAAM,aAAa;;;;;yBAgBlB,CAAC;AAEF,mCAAmC;AACnC,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,YAAY,CAAC,OAAO,aAAa,CAAC;IACjF,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,sBAAsB;AACtB,wBAAgB,KAAK,CACnB,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,GAC3C,KAAK,CAAC,YAAY,CAEpB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Badge — ported 1:1 from Veryfront Studio, semantic classes remapped to
|
|
3
|
+
* veryfront's `[var(--token)]` vocabulary. The status fill tokens
|
|
4
|
+
* (`--alert-*-bg`) and `--status-*` text tokens are defined in `theme.ts`, so
|
|
5
|
+
* every variant renders with its proper fill. Private to the chat module.
|
|
6
|
+
*
|
|
7
|
+
* @module react/components/chat/ui/badge
|
|
8
|
+
*/
|
|
9
|
+
import * as React from "../../../../../react/react.js";
|
|
10
|
+
import { cn } from "../theme.js";
|
|
11
|
+
import { cva } from "./cva.js";
|
|
12
|
+
const badgeVariants = cva("inline-flex items-center px-2 py-0.5 text-xs font-medium rounded-full", {
|
|
13
|
+
variants: {
|
|
14
|
+
variant: {
|
|
15
|
+
default: "bg-[var(--foreground)] text-[var(--background)]",
|
|
16
|
+
success: "bg-[var(--alert-success-bg)] text-[var(--status-success)]",
|
|
17
|
+
warning: "bg-[var(--alert-warning-bg)] text-[var(--status-warning)]",
|
|
18
|
+
destructive: "bg-[var(--alert-error-bg)] text-[var(--status-error)]",
|
|
19
|
+
outline: "border border-[var(--outline-border)] text-[var(--foreground)]",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
defaultVariants: {
|
|
23
|
+
variant: "default",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
/** Render a badge. */
|
|
27
|
+
export function Badge({ className, variant, ...props }) {
|
|
28
|
+
return React.createElement("span", { className: cn(badgeVariants({ variant }), className), ...props });
|
|
29
|
+
}
|
|
30
|
+
export { badgeVariants };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button — ported 1:1 from the Veryfront Studio `Button` primitive. Studio's
|
|
3
|
+
* semantic Tailwind classes (`bg-primary`, `vf-type-base`, `vf-weight-normal`)
|
|
4
|
+
* are mechanically remapped to veryfront's arbitrary-value vocabulary
|
|
5
|
+
* (`bg-[var(--primary)]`, `text-base`, `font-normal`) — a deterministic token
|
|
6
|
+
* mapping, not a redesign. Private to the chat module.
|
|
7
|
+
*
|
|
8
|
+
* Hover rule: every variant converges to primary/secondary on hover; primary
|
|
9
|
+
* inverts the other way; destructive deepens; outline drops its border; link
|
|
10
|
+
* drops underline. Loading keeps the label, sets `aria-busy` + `disabled`, and
|
|
11
|
+
* applies a subtle opacity pulse.
|
|
12
|
+
*
|
|
13
|
+
* @module react/components/chat/ui/button
|
|
14
|
+
*/
|
|
15
|
+
import * as React from "../../../../../react/react.js";
|
|
16
|
+
import { type VariantProps } from "./cva.js";
|
|
17
|
+
declare const buttonVariants: (props?: ({
|
|
18
|
+
variant?: "link" | "text" | "primary" | "outline" | "destructive" | "ghost" | "icon-ghost" | "icon-primary" | "icon-secondary" | "icon-tertiary" | "secondary" | "secondary-to-link" | "tertiary" | null | undefined;
|
|
19
|
+
on?: "card" | "chrome" | null | undefined;
|
|
20
|
+
iconAfter?: "true" | null | undefined;
|
|
21
|
+
size?: "default" | "icon-default" | "icon-lg" | "icon-sm" | "icon-xl" | "icon-xs" | "lg" | "lg-to-default" | "sm" | null | undefined;
|
|
22
|
+
} & {
|
|
23
|
+
class?: import("../../../../utils/clsx.js").ClassValue;
|
|
24
|
+
className?: import("../../../../utils/clsx.js").ClassValue;
|
|
25
|
+
}) | undefined) => string;
|
|
26
|
+
/** Props accepted by `<Button>`. */
|
|
27
|
+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
|
|
28
|
+
/** Render as a Radix-style Slot, merging props onto the child element. */
|
|
29
|
+
asChild?: boolean;
|
|
30
|
+
/** Slide the icon right on hover. */
|
|
31
|
+
animateIcon?: boolean;
|
|
32
|
+
ref?: React.Ref<HTMLButtonElement>;
|
|
33
|
+
}
|
|
34
|
+
/** Render an action button. */
|
|
35
|
+
export declare function Button({ className, variant, size, iconAfter, on, asChild, animateIcon, type, ref, ...props }: ButtonProps): React.ReactElement;
|
|
36
|
+
/** Props accepted by `<LoadingButton>`. */
|
|
37
|
+
export interface LoadingButtonProps extends ButtonProps {
|
|
38
|
+
/** Pending state — applies the opacity pulse, sets `aria-busy`, disables. */
|
|
39
|
+
isLoading: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** Button that pulses subtly while pending and blocks double-submits. */
|
|
42
|
+
export declare function LoadingButton({ children, isLoading, disabled, className, ref, ...props }: LoadingButtonProps): React.ReactElement;
|
|
43
|
+
export { buttonVariants };
|
|
44
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/ui/button.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,KAAK,MAAM,+BAA+B,CAAC;AAEvD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGlD,QAAA,MAAM,cAAc;;;;;;;;yBA6FnB,CAAC;AAEF,oCAAoC;AACpC,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1F,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;CACpC;AAED,+BAA+B;AAC/B,wBAAgB,MAAM,CAAC,EACrB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,SAAS,EACT,EAAE,EACF,OAAe,EACf,WAAmB,EACnB,IAAI,EACJ,GAAG,EACH,GAAG,KAAK,EACT,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAclC;AAED,2CAA2C;AAC3C,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,GAAG,EACH,GAAG,KAAK,EACT,EAAE,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAYzC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button — ported 1:1 from the Veryfront Studio `Button` primitive. Studio's
|
|
3
|
+
* semantic Tailwind classes (`bg-primary`, `vf-type-base`, `vf-weight-normal`)
|
|
4
|
+
* are mechanically remapped to veryfront's arbitrary-value vocabulary
|
|
5
|
+
* (`bg-[var(--primary)]`, `text-base`, `font-normal`) — a deterministic token
|
|
6
|
+
* mapping, not a redesign. Private to the chat module.
|
|
7
|
+
*
|
|
8
|
+
* Hover rule: every variant converges to primary/secondary on hover; primary
|
|
9
|
+
* inverts the other way; destructive deepens; outline drops its border; link
|
|
10
|
+
* drops underline. Loading keeps the label, sets `aria-busy` + `disabled`, and
|
|
11
|
+
* applies a subtle opacity pulse.
|
|
12
|
+
*
|
|
13
|
+
* @module react/components/chat/ui/button
|
|
14
|
+
*/
|
|
15
|
+
import * as React from "../../../../../react/react.js";
|
|
16
|
+
import { cn } from "../theme.js";
|
|
17
|
+
import { cva } from "./cva.js";
|
|
18
|
+
import { Slot } from "./slot.js";
|
|
19
|
+
const buttonVariants = cva([
|
|
20
|
+
"relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap",
|
|
21
|
+
"font-normal rounded-full",
|
|
22
|
+
"transition-[background-color,color,border-color] duration-150 ease-in",
|
|
23
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--edge-medium)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--background)]",
|
|
24
|
+
"[&_svg]:shrink-0",
|
|
25
|
+
], {
|
|
26
|
+
variants: {
|
|
27
|
+
variant: {
|
|
28
|
+
primary: "bg-[var(--primary)] text-[var(--secondary)] hover:bg-[var(--secondary)] hover:text-[var(--foreground)]",
|
|
29
|
+
secondary: "bg-[var(--secondary)] text-[var(--foreground)] hover:bg-[var(--primary)] hover:text-[var(--secondary)]",
|
|
30
|
+
tertiary: "text-[var(--foreground)] hover:bg-[var(--primary)] hover:text-[var(--secondary)]",
|
|
31
|
+
outline: "border border-[var(--outline-border)] dark:border-[var(--faint)] bg-transparent text-[var(--foreground)] hover:bg-[var(--accent)] hover:border-transparent",
|
|
32
|
+
destructive: "bg-[var(--destructive)] text-white hover:bg-[color-mix(in_oklch,var(--destructive),black_18%)]",
|
|
33
|
+
link: "text-[var(--foreground)] underline underline-offset-4 hover:no-underline !px-0 !gap-2",
|
|
34
|
+
ghost: "bg-transparent text-[var(--foreground)]",
|
|
35
|
+
text: "bg-transparent text-[var(--foreground)] hover:text-[var(--foreground)] !h-auto !w-auto !p-0 !justify-start !gap-1.5 [&_svg]:!mr-0",
|
|
36
|
+
"secondary-to-link": "bg-[var(--secondary)] text-[var(--foreground)] hover:bg-[var(--primary)] hover:text-[var(--secondary)] md:bg-transparent md:text-[var(--foreground)] md:hover:bg-transparent md:hover:text-[var(--foreground)] md:underline md:underline-offset-4 md:hover:no-underline md:!px-0 md:!gap-2",
|
|
37
|
+
"icon-primary": "bg-[var(--primary)] text-[var(--secondary)] hover:bg-[var(--secondary)] hover:text-[var(--foreground)] !p-0 !gap-0 !justify-center",
|
|
38
|
+
"icon-ghost": "bg-transparent text-[var(--foreground)] !p-0 !gap-0 !justify-center",
|
|
39
|
+
"icon-secondary": "bg-[var(--secondary)] text-[var(--foreground)] hover:bg-[var(--primary)] hover:text-[var(--secondary)] !p-0 !gap-0 !justify-center",
|
|
40
|
+
"icon-tertiary": "text-[var(--foreground)] hover:bg-[var(--primary)] hover:text-[var(--secondary)] !p-0 !gap-0 !justify-center",
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Surface the button sits on — drives surface-paired hover for ghost /
|
|
44
|
+
* icon-ghost / primary / icon-primary via compound variants. Default
|
|
45
|
+
* `chrome`; pass `card` inside white card surfaces.
|
|
46
|
+
*/
|
|
47
|
+
on: {
|
|
48
|
+
chrome: "",
|
|
49
|
+
card: "",
|
|
50
|
+
},
|
|
51
|
+
iconAfter: {
|
|
52
|
+
true: "[&_svg]:ml-3.5 has-[svg]:justify-between",
|
|
53
|
+
},
|
|
54
|
+
size: {
|
|
55
|
+
sm: "h-[32px] px-3.5 text-sm [&_svg]:size-3.5",
|
|
56
|
+
default: "h-[38px] px-4.5 text-base [&_svg]:size-3.5",
|
|
57
|
+
lg: "h-[48px] px-6 text-base [&_svg]:size-4.5",
|
|
58
|
+
"lg-to-default": "h-[48px] px-6 text-base [&_svg]:size-4.5 md:h-[38px] md:px-4.5 md:text-base md:[&_svg]:size-3.5",
|
|
59
|
+
"icon-xs": "size-5 [&_svg]:size-3",
|
|
60
|
+
"icon-sm": "size-7 [&_svg]:size-3.5",
|
|
61
|
+
"icon-default": "size-8 [&_svg]:size-3.5",
|
|
62
|
+
"icon-lg": "size-9 [&_svg]:size-4.5",
|
|
63
|
+
"icon-xl": "size-[38px] [&_svg]:size-3.5",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
compoundVariants: [
|
|
67
|
+
{ variant: "tertiary", on: "chrome", class: "bg-[var(--accent)]" },
|
|
68
|
+
{ variant: "icon-tertiary", on: "chrome", class: "bg-[var(--accent)]" },
|
|
69
|
+
{ variant: "ghost", on: "chrome", class: "hover:bg-[var(--accent)]" },
|
|
70
|
+
{ variant: "ghost", on: "card", class: "hover:bg-[var(--tertiary)]" },
|
|
71
|
+
{
|
|
72
|
+
variant: "icon-ghost",
|
|
73
|
+
on: "chrome",
|
|
74
|
+
class: "hover:bg-[var(--accent)]",
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
variant: "icon-ghost",
|
|
78
|
+
on: "card",
|
|
79
|
+
class: "hover:bg-[var(--tertiary)]",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
variant: "primary",
|
|
83
|
+
on: "card",
|
|
84
|
+
class: "hover:bg-[var(--tertiary)] hover:text-[var(--foreground)]",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
variant: "icon-primary",
|
|
88
|
+
on: "card",
|
|
89
|
+
class: "hover:bg-[var(--tertiary)] hover:text-[var(--foreground)]",
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
defaultVariants: {
|
|
93
|
+
variant: "primary",
|
|
94
|
+
on: "chrome",
|
|
95
|
+
size: "default",
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
/** Render an action button. */
|
|
99
|
+
export function Button({ className, variant, size, iconAfter, on, asChild = false, animateIcon = false, type, ref, ...props }) {
|
|
100
|
+
const Comp = asChild ? Slot : "button";
|
|
101
|
+
return (React.createElement(Comp, { className: cn(buttonVariants({ variant, size, iconAfter, on, className }), animateIcon &&
|
|
102
|
+
"group [&_svg]:transition-transform [&_svg]:group-hover:translate-x-0.5"), ref: ref, type: asChild ? type : (type ?? "button"), ...props }));
|
|
103
|
+
}
|
|
104
|
+
/** Button that pulses subtly while pending and blocks double-submits. */
|
|
105
|
+
export function LoadingButton({ children, isLoading, disabled, className, ref, ...props }) {
|
|
106
|
+
return (React.createElement(Button, { ref: ref, disabled: isLoading || disabled, "aria-busy": isLoading || undefined, className: cn(isLoading && "animate-button-loading", className), ...props }, children));
|
|
107
|
+
}
|
|
108
|
+
export { buttonVariants };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card — flat surface primitive, forked dependency-light from Veryfront
|
|
3
|
+
* Studio's `Card` (studio/components/Card). Solid (`bg-secondary`, no border,
|
|
4
|
+
* no shadow) for interactive content; outline (`border-outline-border`, no bg)
|
|
5
|
+
* for layout / non-interactive content. Both flat, radius baked in.
|
|
6
|
+
*
|
|
7
|
+
* Studio deps (cva/class-variance-authority, Heading/Text) are swapped for our
|
|
8
|
+
* private `cva` and plain elements. Private to the chat module.
|
|
9
|
+
*
|
|
10
|
+
* @module react/components/chat/ui/card
|
|
11
|
+
*/
|
|
12
|
+
import * as React from "../../../../../react/react.js";
|
|
13
|
+
import { type VariantProps } from "./cva.js";
|
|
14
|
+
declare const cardVariants: (props?: ({
|
|
15
|
+
surface?: "outline" | "solid" | null | undefined;
|
|
16
|
+
padding?: "none" | "md" | "lg" | "sm" | null | undefined;
|
|
17
|
+
radius?: "default" | "sm" | null | undefined;
|
|
18
|
+
} & {
|
|
19
|
+
class?: import("../../../../utils/clsx.js").ClassValue;
|
|
20
|
+
className?: import("../../../../utils/clsx.js").ClassValue;
|
|
21
|
+
}) | undefined) => string;
|
|
22
|
+
/** Props accepted by `<Card>`. */
|
|
23
|
+
export interface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {
|
|
24
|
+
ref?: React.Ref<HTMLDivElement>;
|
|
25
|
+
}
|
|
26
|
+
/** A flat card surface (Studio `Card`). */
|
|
27
|
+
export declare function Card({ className, surface, padding, radius, ref, ...props }: CardProps): React.ReactElement;
|
|
28
|
+
export declare namespace Card {
|
|
29
|
+
var displayName: string;
|
|
30
|
+
}
|
|
31
|
+
/** Card header row — a flex row (Studio composes these inline). */
|
|
32
|
+
export declare function CardHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.ReactElement;
|
|
33
|
+
export declare namespace CardHeader {
|
|
34
|
+
var displayName: string;
|
|
35
|
+
}
|
|
36
|
+
/** Card body region — vertical stack. */
|
|
37
|
+
export declare function CardContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.ReactElement;
|
|
38
|
+
export declare namespace CardContent {
|
|
39
|
+
var displayName: string;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../../../../../src/src/react/components/chat/ui/card.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,KAAK,MAAM,+BAA+B,CAAC;AAEvD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAElD,QAAA,MAAM,YAAY;;;;;;;yBAyBhB,CAAC;AAEH,kCAAkC;AAClC,MAAM,WAAW,SACf,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,YAAY,CAAC,OAAO,YAAY,CAAC;IAC/E,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC;AAED,2CAA2C;AAC3C,wBAAgB,IAAI,CAClB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,GAChE,KAAK,CAAC,YAAY,CAQpB;yBAVe,IAAI;;;AAapB,mEAAmE;AACnE,wBAAgB,UAAU,CACxB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAC5D,KAAK,CAAC,YAAY,CAOpB;yBATe,UAAU;;;AAY1B,yCAAyC;AACzC,wBAAgB,WAAW,CACzB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAC5D,KAAK,CAAC,YAAY,CAEpB;yBAJe,WAAW"}
|