@ai-group/chat-sdk 3.7.0 → 3.7.1-alpha2

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.
Files changed (78) hide show
  1. package/dist/cjs/components/Sources/components/CarouselCard.d.ts +12 -0
  2. package/dist/cjs/components/Sources/components/CarouselCard.js +130 -0
  3. package/dist/cjs/components/Sources/components/CarouselCard.js.map +7 -0
  4. package/dist/cjs/components/Sources/index.d.ts +5 -0
  5. package/dist/cjs/components/Sources/index.js +162 -0
  6. package/dist/cjs/components/Sources/index.js.map +7 -0
  7. package/dist/cjs/components/Sources/styles.d.ts +59 -0
  8. package/dist/cjs/components/Sources/styles.js +179 -0
  9. package/dist/cjs/components/Sources/styles.js.map +7 -0
  10. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +25 -0
  11. package/dist/cjs/components/XAdkSender/InlineTagInput.js +485 -0
  12. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +7 -0
  13. package/dist/cjs/components/XAdkSender/InputTags.d.ts +8 -0
  14. package/dist/cjs/components/XAdkSender/InputTags.js +51 -0
  15. package/dist/cjs/components/XAdkSender/InputTags.js.map +7 -0
  16. package/dist/cjs/components/XAdkSender/QuickList.d.ts +16 -0
  17. package/dist/cjs/components/XAdkSender/QuickList.js +105 -0
  18. package/dist/cjs/components/XAdkSender/QuickList.js.map +7 -0
  19. package/dist/cjs/components/XAdkSender/index.d.ts +1 -6
  20. package/dist/cjs/components/XAdkSender/index.js +350 -84
  21. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  22. package/dist/cjs/components/XAdkSender/styles.d.ts +15 -0
  23. package/dist/cjs/components/XAdkSender/styles.js +184 -5
  24. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  25. package/dist/cjs/index.d.ts +4 -2
  26. package/dist/cjs/index.js +3 -3
  27. package/dist/cjs/index.js.map +3 -3
  28. package/dist/cjs/types/Sources.d.ts +30 -0
  29. package/dist/cjs/types/Sources.js +18 -0
  30. package/dist/cjs/types/Sources.js.map +7 -0
  31. package/dist/cjs/types/XAdkSender.d.ts +92 -4
  32. package/dist/cjs/types/XAdkSender.js.map +1 -1
  33. package/dist/cjs/types/index.d.ts +1 -0
  34. package/dist/cjs/types/index.js +3 -1
  35. package/dist/cjs/types/index.js.map +2 -2
  36. package/dist/esm/components/Sources/components/CarouselCard.d.ts +12 -0
  37. package/dist/esm/components/Sources/components/CarouselCard.js +107 -0
  38. package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -0
  39. package/dist/esm/components/Sources/index.d.ts +5 -0
  40. package/dist/esm/components/Sources/index.js +127 -0
  41. package/dist/esm/components/Sources/index.js.map +1 -0
  42. package/dist/esm/components/Sources/styles.d.ts +59 -0
  43. package/dist/esm/components/Sources/styles.js +34 -0
  44. package/dist/esm/components/Sources/styles.js.map +1 -0
  45. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +25 -0
  46. package/dist/esm/components/XAdkSender/InlineTagInput.js +467 -0
  47. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -0
  48. package/dist/esm/components/XAdkSender/InputTags.d.ts +8 -0
  49. package/dist/esm/components/XAdkSender/InputTags.js +36 -0
  50. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -0
  51. package/dist/esm/components/XAdkSender/QuickList.d.ts +16 -0
  52. package/dist/esm/components/XAdkSender/QuickList.js +96 -0
  53. package/dist/esm/components/XAdkSender/QuickList.js.map +1 -0
  54. package/dist/esm/components/XAdkSender/index.d.ts +1 -6
  55. package/dist/esm/components/XAdkSender/index.js +407 -88
  56. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  57. package/dist/esm/components/XAdkSender/styles.d.ts +15 -0
  58. package/dist/esm/components/XAdkSender/styles.js +29 -11
  59. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  60. package/dist/esm/index.d.ts +4 -2
  61. package/dist/esm/index.js +4 -2
  62. package/dist/esm/index.js.map +1 -1
  63. package/dist/esm/types/Sources.d.ts +30 -0
  64. package/dist/esm/types/Sources.js +2 -0
  65. package/dist/esm/types/Sources.js.map +1 -0
  66. package/dist/esm/types/XAdkSender.d.ts +92 -4
  67. package/dist/esm/types/XAdkSender.js.map +1 -1
  68. package/dist/esm/types/index.d.ts +1 -0
  69. package/dist/esm/types/index.js +1 -0
  70. package/dist/esm/types/index.js.map +1 -1
  71. package/dist/umd/chat-sdk.min.js +1 -1
  72. package/package.json +1 -1
  73. package/dist/cjs/components/XAdkSender/Switch.d.ts +0 -16
  74. package/dist/cjs/components/XAdkSender/Switch.js +0 -95
  75. package/dist/cjs/components/XAdkSender/Switch.js.map +0 -7
  76. package/dist/esm/components/XAdkSender/Switch.d.ts +0 -16
  77. package/dist/esm/components/XAdkSender/Switch.js +0 -53
  78. package/dist/esm/components/XAdkSender/Switch.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkSender/index.tsx"],
4
- "sourcesContent": ["import React, {\n useState,\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport { Popconfirm, message, Tooltip, Input, Modal } from \"antd\";\nimport {\n ClearOutlined,\n LoadingOutlined,\n ArrowUpOutlined,\n PaperClipOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n XAdkSenderHandle,\n ServerFile,\n LocalFile,\n ActionsComponents,\n FileValidator,\n UploadFileResult,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport FileGallery from \"../FileGallery\";\nimport { getExt } from \"@/utils/file\";\n\nconst XAdkSender = forwardRef<XAdkSenderHandle, XAdkSenderProps>(\n (\n {\n clearBtnShow = true,\n allowUpload = false,\n draggable = true,\n loading = false,\n disabled = false,\n value: controlledValue,\n defaultValue = \"\",\n uploadRequest = () => {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n onUploadSuccess,\n onUploadError,\n maxFileSize = 10,\n validators: customValidators = [],\n // allowedFileTypes = [\n // \"image/*\",\n // \"audio/*\",\n // \"video/*\",\n // \"application/pdf\",\n // \"text/plain\",\n // \".doc\",\n // \".docx\",\n // \".xls\",\n // \".xlsx\",\n // \".ppt\",\n // \".pptx\",\n // \"\",\n // ],\n allowedFileTypes = [],\n maxFiles = Infinity,\n sendButtonRender,\n suffix,\n header,\n prefix,\n footer,\n },\n ref,\n ) => {\n const styles = useStyles();\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const setValue = (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n const [files, setFiles] = useState<LocalFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // 生成唯一ID\n const generateId = () => {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n };\n\n const normalizeUploadResponse = (response: any): UploadFileResult => {\n const data = response?.data ?? response;\n return (Array.isArray(data) ? data[0] : data) ?? {};\n };\n\n // 检查文件类型\n const checkFileType = (file: File): boolean => {\n if (allowedFileTypes?.length > 0) {\n const ext = getExt(file);\n\n return allowedFileTypes.some((type) => {\n // 1️⃣ MIME 校验\n if (type.includes(\"/\")) {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.split(\"/\")[0]);\n }\n return file.type === type;\n }\n\n if (type.startsWith(\".\")) {\n return ext === type.slice(1);\n }\n\n return false;\n });\n }\n return true;\n };\n\n // 检查文件大小\n const checkFileSize = (file: File): boolean => {\n const maxSize = maxFileSize * 1024 * 1024;\n return file.size <= maxSize;\n };\n\n // 重复文件检测\n const isDuplicateFile = (file: File, files: LocalFile[]) => {\n return files.some((f) => f.name === file.name && f.size === file.size);\n };\n\n // 内置校验器集合\n const builtInValidators: FileValidator[] = [\n // 数量校验(修复批量 bug)\n (_file, { files }) => {\n if (files.length >= maxFiles) {\n return `最多只能上传 ${maxFiles} 个文件`;\n }\n return null;\n },\n\n // 大小校验\n (file) => {\n const maxSize = maxFileSize * 1024 * 1024;\n if (file.size > maxSize) {\n return `文件大小不能超过 ${maxFileSize}MB`;\n }\n return null;\n },\n\n // 类型校验\n (file) => {\n if (!checkFileType(file)) {\n return \"不支持的文件类型\";\n }\n return null;\n },\n\n // ⭐ 新增:去重校验\n (file, { files }) => {\n if (isDuplicateFile(file, files)) {\n return \"文件已存在\";\n }\n return null;\n },\n ];\n\n const allValidators = [...builtInValidators, ...customValidators];\n\n // 验证文件\n const validateFile = (file: File): { valid: boolean; message?: string } => {\n for (const validator of allValidators) {\n const error = validator(file, { files });\n if (error) {\n return { valid: false, message: error };\n }\n }\n return { valid: true };\n };\n\n // 处理文件选择\n const handleFileSelect = useCallback(\n (selectedFiles: File[]) => {\n const fileArray = Array.from(selectedFiles);\n\n if (files.length + fileArray.length > maxFiles) {\n message.error(`最多只能上传 ${maxFiles} 个文件`);\n return;\n }\n\n const validFiles: LocalFile[] = [];\n\n fileArray.forEach((file) => {\n const validation = validateFile(file);\n\n if (validation.valid) {\n validFiles.push({\n id: generateId(),\n uid: generateId(),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n progress: 0,\n status: \"pending\",\n response: null,\n });\n } else {\n message.error(validation.message);\n }\n });\n\n if (validFiles.length > 0) {\n setFiles((prev) => {\n const next = [...prev, ...validFiles];\n onFilesChange?.(next);\n return next;\n });\n uploadFiles(validFiles);\n }\n },\n [files, maxFiles, maxFileSize, allowedFileTypes],\n );\n\n // 暴露 addFiles 方法供外层(如 DefaultLayout 拖拽上传)调用\n useImperativeHandle(\n ref,\n () => ({\n addFiles: (rawFiles: File[]) => {\n handleFileSelect(rawFiles);\n },\n }),\n [handleFileSelect],\n );\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n // 开始上传\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, status: \"uploading\" } : f,\n ),\n );\n\n try {\n await uploadRequest({\n file: localFile.file,\n onProgress: (e) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, progress: e.percent } : f,\n ),\n );\n },\n onSuccess: (response) => {\n const responseData = normalizeUploadResponse(response);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n });\n },\n onError: (error) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage: error.message,\n }\n : f,\n ),\n );\n onUploadError?.(localFile, error);\n },\n });\n } catch (error) {\n console.error(\"上传处理错误:\", error);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage:\n error instanceof Error ? error.message : \"上传处理失败\",\n }\n : f,\n ),\n );\n message.error(`${localFile.name} 上传失败`);\n }\n }\n };\n\n // 删除文件\n const handleRemoveFile = (id: string) => {\n setFiles((prev) => {\n const next = prev.filter((file) => file.id !== id);\n\n onFilesChange?.(next);\n\n return next;\n });\n };\n\n // 触发文件选择\n const triggerFileSelect = () => {\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\n };\n\n // 处理拖拽事件\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(true);\n }\n },\n [allowUpload],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n },\n [allowUpload],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n allowUpload &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n },\n [allowUpload, handleFileSelect],\n );\n\n // 处理提交\n const handleSubmit = () => {\n if (!value.trim() && files.length === 0) {\n message.warning(\"请输入消息或选择文件\");\n return;\n }\n\n const successFiles = files.filter((file) => file.status === \"success\");\n const uploadingFiles = files.filter(\n (file) => file.status === \"uploading\",\n );\n\n if (uploadingFiles.length > 0) {\n Modal.confirm({\n title: \"文件上传中\",\n content: `还有 ${uploadingFiles.length} 个文件正在上传,是否继续发送?`,\n okText: \"发送已完成的\",\n cancelText: \"等待全部完成\",\n onOk: () => {\n const formattedFiles = formatFilesForServer(successFiles);\n if (onSubmit) {\n onSubmit({\n text: value,\n files: formattedFiles,\n });\n }\n\n setValue(\"\");\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n },\n onCancel: () => {\n message.info(\"请等待文件上传完成后再发送\");\n },\n });\n } else {\n const formattedFiles = formatFilesForServer(successFiles);\n\n if (onSubmit) {\n onSubmit({\n text: value,\n files: formattedFiles,\n });\n }\n\n setValue(\"\");\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n }\n };\n\n // 格式化文件列表为服务端格式\n const formatFilesForServer = (fileList: LocalFile[]): ServerFile[] => {\n return fileList\n .filter((file) => file.status === \"success\" && file.response)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url ||\n \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\n };\n });\n };\n\n // 处理输入框变化\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setValue(newValue);\n };\n\n // 处理回车键\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // 渲染文件列表 - 使用新的 FileGallery 组件\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"12px 0\",\n }}\n >\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n type=\"file\"\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\n };\n\n const containerClass = `${styles.container} ${isDragOver ? \"drag-over\" : \"\"}`;\n const uploading = files.some((f) => f.status === \"uploading\");\n const isDisabled = disabled || uploading || loading;\n const hasContent = value.trim().length > 0;\n const hasFiles = files.some((f) => f.status === \"success\");\n const canSend = hasContent || hasFiles;\n\n // 定义按钮组件(供外部 slot 函数通过 actionsComponents 使用)\n // 注意:sendButtonRender 的结果直接内联到 defaultSuffix 中,避免组件引用变化导致闪烁\n const SendButton = (props: any) => {\n if (sendButtonRender) {\n return (\n <>\n {sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })}\n </>\n );\n }\n return (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n {...props}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n );\n };\n\n const UploadButton = (props: any) => (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n {...props}\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n );\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={isDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={isDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n UploadButton,\n ClearButton,\n };\n\n // 渲染插槽内容\n const renderSlot = (\n slot:\n | React.ReactNode\n | false\n | ((\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n ) => React.ReactNode | false)\n | undefined,\n oriNode: React.ReactNode,\n ): React.ReactNode | null => {\n if (slot === false) return null;\n if (slot === undefined) return oriNode;\n if (typeof slot === \"function\") {\n const result = slot(oriNode, { components: actionsComponents });\n return result === false ? null : result;\n }\n return slot;\n };\n\n // 默认的后缀内容(操作按钮组) - 直接内联渲染避免组件引用变化导致 unmount/remount\n const defaultSuffix = (\n <div className={styles.buttonGroup}>\n {allowUpload && (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n )}\n {sendButtonRender ? (\n sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })\n ) : (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n )}\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={containerClass}\n onDragOver={allowUpload && draggable ? handleDragOver : undefined}\n onDragLeave={allowUpload && draggable ? handleDragLeave : undefined}\n onDrop={allowUpload && draggable ? handleDrop : undefined}\n >\n {/* 头部插槽 */}\n {renderSlot(header, false)}\n\n {allowUpload && files.length > 0 && renderFileList()}\n\n {/* 隐藏的原生 file input */}\n {allowUpload && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={allowedFileTypes.join(\",\")}\n style={{ display: \"none\" }}\n onChange={(e) => {\n if (e.target.files) {\n handleFileSelect(Array.from(e.target.files));\n e.target.value = \"\";\n }\n }}\n />\n )}\n\n <div className={styles.mainArea}>\n <div className={styles.senderWrap}>\n <div className={styles.inputAndButtons}>\n {/* 清除按钮 */}\n {clearBtnShow && <ClearButton />}\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\n <div className={styles.textAreaWrapper}>\n <Input.TextArea\n className={styles.textArea}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n placeholder=\"请输入消息...\"\n autoSize={{ minRows: 1, maxRows: 4 }}\n style={{\n border: \"none\",\n boxShadow: \"none\",\n outline: \"none\",\n padding: 0,\n }}\n />\n </div>\n\n {/* 后缀插槽(默认显示操作按钮) */}\n {renderSlot(suffix, defaultSuffix)}\n </div>\n\n {/* 底部插槽(默认显示提示文字) */}\n {renderSlot(\n footer,\n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>,\n )}\n </div>\n </div>\n </div>\n );\n },\n);\n\nXAdkSender.displayName = \"XAdkSender\";\n\nimport XAdkSenderSwitch from \"./Switch\";\n\ntype XAdkSenderComponent = typeof XAdkSender & {\n Switch: typeof XAdkSenderSwitch;\n};\n\nconst CompoundSender = XAdkSender as XAdkSenderComponent;\nCompoundSender.Switch = XAdkSenderSwitch;\n\nexport default CompoundSender;\n"],
5
- "mappings": "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",
6
- "names": ["files", "FileGallery", "XAdkSenderSwitch"]
4
+ "sourcesContent": ["import React, {\n useState,\n useRef,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useEffect,\n} from \"react\";\nimport { Popconfirm, message, Tooltip, Input, Modal } from \"antd\";\nimport {\n ClearOutlined,\n LoadingOutlined,\n ArrowUpOutlined,\n PaperClipOutlined,\n} from \"@ant-design/icons\";\nimport {\n XAdkSenderProps,\n XAdkSenderHandle,\n ServerFile,\n LocalFile,\n ActionsComponents,\n FileValidator,\n UploadFileResult,\n InputTag,\n XAdkSenderSubmitData,\n XAdkSenderSubmitFormat,\n XAdkSenderSubmitPart,\n} from \"@/types\";\nimport { useStyles } from \"./styles\";\nimport FileGallery from \"../FileGallery\";\nimport QuickList from \"./QuickList\";\nimport InputTags from \"./InputTags\";\nimport InlineTagInput, { InlineTagInputRef } from \"./InlineTagInput\";\nimport { getExt } from \"@/utils/file\";\n\nconst XAdkSender = forwardRef<XAdkSenderHandle, XAdkSenderProps>(\n (\n {\n clearBtnShow = true,\n allowUpload = false,\n draggable = true,\n loading = false,\n disabled = false,\n value: controlledValue,\n defaultValue = \"\",\n uploadRequest = () => {},\n onClear,\n onChange,\n onSubmit,\n onStop,\n onFilesChange,\n onUploadSuccess,\n onUploadError,\n maxFileSize = 10,\n placeholder = \"\",\n validators: customValidators = [],\n allowedFileTypes = [],\n maxFiles = Infinity,\n sendButtonRender,\n suffix,\n header,\n prefix,\n footer,\n footerLeft,\n quickKeys = [],\n inlineTags = false,\n renderTag,\n tags: controlledTags,\n defaultTags = [],\n onTagsChange,\n onQuickKeyTrigger,\n submitFormat = \"text\",\n formatTag,\n },\n ref,\n ) => {\n const styles = useStyles();\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const setValue = (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n // tags 支持受控/非受控两种模式;inlineTags 打开时会和输入内容混排。\n const isTagsControlled = controlledTags !== undefined;\n const [internalTags, setInternalTags] = useState<InputTag[]>(defaultTags);\n const tags = isTagsControlled ? controlledTags : internalTags;\n const setTags = (newTags: InputTag[]) => {\n if (!isTagsControlled) {\n setInternalTags(newTags);\n }\n onTagsChange?.(newTags);\n };\n\n const [files, setFiles] = useState<LocalFile[]>([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const textareaRef = useRef<any>(null);\n const inlineInputRef = useRef<InlineTagInputRef>(null);\n\n // 快捷键弹层状态:记录触发字符、关键词,以及触发字符在纯文本中的位置。\n // SDK 不内置搜索框;业务方可在 onQuickKeyTrigger 中根据 keyword 自行更新 quickKeys.options。\n const [activeQuickKey, setActiveQuickKey] = useState<string | null>(null);\n const [quickKeyKeyword, setQuickKeyKeyword] = useState(\"\");\n const [quickKeyTriggerIdx, setQuickKeyTriggerIdx] = useState(-1);\n const [quickKeyActiveIndex, setQuickKeyActiveIndex] = useState(0);\n\n // 生成唯一ID\n const generateId = () => {\n return Date.now().toString(36) + Math.random().toString(36).substr(2);\n };\n\n const normalizeUploadResponse = (response: any): UploadFileResult => {\n const data = response?.data ?? response;\n return (Array.isArray(data) ? data[0] : data) ?? {};\n };\n\n const escapeXml = (text: string) =>\n text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n\n const escapeMarkdownLabel = (text: string) =>\n text.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\]/g, \"\\\\]\");\n\n const getTagSubmitValue = (tag: InputTag) =>\n String(tag.value ?? tag.data?.value ?? tag.data?.name ?? tag.label ?? \"\");\n\n const defaultFormatTag = (\n tag: InputTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) => {\n const value = getTagSubmitValue(tag);\n if (format === \"xml\") {\n return `<tag type=\"${escapeXml(tag.type)}\" id=\"${escapeXml(tag.id)}\" label=\"${escapeXml(tag.label)}\" value=\"${escapeXml(value)}\" />`;\n }\n\n if (format === \"markdown\") {\n return `[/${escapeMarkdownLabel(tag.label)}](xadk-tag://${encodeURIComponent(tag.type)}/${encodeURIComponent(tag.id)})`;\n }\n\n return `/${value || `tag-${index + 1}`}`;\n };\n\n const serializeTag = (\n tag: InputTag,\n format: Exclude<XAdkSenderSubmitFormat, \"structured\">,\n index: number,\n ) => formatTag?.(tag, { format, index }) ?? defaultFormatTag(tag, format, index);\n\n const getSubmitParts = useCallback((): XAdkSenderSubmitPart[] => {\n if (inlineTags) {\n const parts = inlineInputRef.current?.getParts() || [];\n if (parts.length > 0) return parts;\n }\n\n const textParts: XAdkSenderSubmitPart[] = value ? [{ type: \"text\", text: value }] : [];\n const tagParts = tags.map((tag) => ({ type: \"tag\" as const, tag }));\n return [...tagParts, ...textParts];\n }, [inlineTags, tags, value]);\n\n const serializeParts = (\n parts: XAdkSenderSubmitPart[],\n format: XAdkSenderSubmitFormat,\n ) => {\n if (format === \"structured\") {\n return parts.reduce(\n (content, part) => content + (part.type === \"text\" ? part.text : \"\"),\n \"\",\n );\n }\n\n let tagIndex = 0;\n return parts\n .map((part) => {\n if (part.type === \"text\") return part.text;\n const result = serializeTag(part.tag, format, tagIndex);\n tagIndex += 1;\n return result;\n })\n .join(\"\");\n };\n\n const createSubmitData = (formattedFiles: ServerFile[]): XAdkSenderSubmitData => {\n const parts = getSubmitParts();\n const rawText = parts.reduce(\n (content, part) => content + (part.type === \"text\" ? part.text : \"\"),\n \"\",\n );\n return {\n text: serializeParts(parts, submitFormat),\n rawText,\n format: submitFormat,\n parts,\n files: formattedFiles,\n tags,\n };\n };\n\n // 检查文件类型\n const checkFileType = (file: File): boolean => {\n if (allowedFileTypes?.length > 0) {\n const ext = getExt(file);\n\n return allowedFileTypes.some((type) => {\n if (type.includes(\"/\")) {\n if (type.endsWith(\"/*\")) {\n return file.type.startsWith(type.split(\"/\")[0]);\n }\n return file.type === type;\n }\n\n if (type.startsWith(\".\")) {\n return ext === type.slice(1);\n }\n\n return false;\n });\n }\n return true;\n };\n\n // 重复文件检测\n const isDuplicateFile = (file: File, files: LocalFile[]) => {\n return files.some((f) => f.name === file.name && f.size === file.size);\n };\n\n // 内置校验器集合\n const builtInValidators: FileValidator[] = [\n (_file, { files }) => {\n if (files.length >= maxFiles) {\n return `最多只能上传 ${maxFiles} 个文件`;\n }\n return null;\n },\n (file) => {\n const maxSize = maxFileSize * 1024 * 1024;\n if (file.size > maxSize) {\n return `文件大小不能超过 ${maxFileSize}MB`;\n }\n return null;\n },\n (file) => {\n if (!checkFileType(file)) {\n return \"不支持的文件类型\";\n }\n return null;\n },\n (file, { files }) => {\n if (isDuplicateFile(file, files)) {\n return \"文件已存在\";\n }\n return null;\n },\n ];\n\n const allValidators = [...builtInValidators, ...customValidators];\n\n // 验证文件\n const validateFile = (file: File): { valid: boolean; message?: string } => {\n for (const validator of allValidators) {\n const error = validator(file, { files });\n if (error) {\n return { valid: false, message: error };\n }\n }\n return { valid: true };\n };\n\n // 处理文件选择\n const handleFileSelect = useCallback(\n (selectedFiles: File[]) => {\n const fileArray = Array.from(selectedFiles);\n\n if (files.length + fileArray.length > maxFiles) {\n message.error(`最多只能上传 ${maxFiles} 个文件`);\n return;\n }\n\n const validFiles: LocalFile[] = [];\n\n fileArray.forEach((file) => {\n const validation = validateFile(file);\n\n if (validation.valid) {\n validFiles.push({\n id: generateId(),\n uid: generateId(),\n name: file.name,\n size: file.size,\n type: file.type,\n file,\n progress: 0,\n status: \"pending\",\n response: null,\n });\n } else {\n message.error(validation.message);\n }\n });\n\n if (validFiles.length > 0) {\n setFiles((prev) => {\n const next = [...prev, ...validFiles];\n onFilesChange?.(next);\n return next;\n });\n uploadFiles(validFiles);\n }\n },\n [files, maxFiles, maxFileSize, allowedFileTypes],\n );\n\n // 暴露 addFiles 方法\n useImperativeHandle(\n ref,\n () => ({\n addFiles: (rawFiles: File[]) => {\n handleFileSelect(rawFiles);\n },\n }),\n [handleFileSelect],\n );\n\n // 触发文件选择\n const triggerFileSelect = () => {\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\n };\n\n // 上传文件\n const uploadFiles = async (fileList: LocalFile[]) => {\n for (const localFile of fileList) {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, status: \"uploading\" } : f,\n ),\n );\n\n try {\n await uploadRequest({\n file: localFile.file,\n onProgress: (e) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id ? { ...f, progress: e.percent } : f,\n ),\n );\n },\n onSuccess: (response) => {\n const responseData = normalizeUploadResponse(response);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"success\",\n progress: 100,\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n }\n : f,\n ),\n );\n\n onUploadSuccess?.({\n ...localFile,\n status: \"success\",\n response,\n fileId: responseData.fileId || responseData.id,\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url,\n });\n },\n onError: (error) => {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage: error.message,\n }\n : f,\n ),\n );\n onUploadError?.(localFile, error);\n },\n });\n } catch (error) {\n console.error(\"上传处理错误:\", error);\n setFiles((prev) =>\n prev.map((f) =>\n f.id === localFile.id\n ? {\n ...f,\n status: \"error\",\n errorMessage:\n error instanceof Error ? error.message : \"上传处理失败\",\n }\n : f,\n ),\n );\n message.error(`${localFile.name} 上传失败`);\n }\n }\n };\n\n // 删除文件\n const handleRemoveFile = (id: string) => {\n setFiles((prev) => {\n const next = prev.filter((file) => file.id !== id);\n onFilesChange?.(next);\n return next;\n });\n };\n\n // 处理拖拽事件\n const handleDragOver = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(true);\n }\n },\n [allowUpload],\n );\n\n const handleDragLeave = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (allowUpload) {\n setIsDragOver(false);\n }\n },\n [allowUpload],\n );\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (\n allowUpload &&\n e.dataTransfer.files &&\n e.dataTransfer.files.length > 0\n ) {\n handleFileSelect(Array.from(e.dataTransfer.files));\n }\n },\n [allowUpload, handleFileSelect],\n );\n\n // 删除标签\n const handleRemoveTag = useCallback(\n (id: string) => {\n setTags(tags.filter((t) => t.id !== id));\n },\n [tags, setTags],\n );\n\n // 查找当前活跃的快捷键配置\n const activeQuickKeyConfig = useMemo(() => {\n if (!activeQuickKey) return null;\n return quickKeys.find((qk) => qk.key === activeQuickKey) || null;\n }, [activeQuickKey, quickKeys]);\n\n const activeQuickKeyOptionsLength = activeQuickKeyConfig?.options.length || 0;\n\n useEffect(() => {\n setQuickKeyActiveIndex(0);\n }, [activeQuickKey]);\n\n useEffect(() => {\n if (activeQuickKeyOptionsLength <= 0) {\n setQuickKeyActiveIndex(0);\n return;\n }\n\n // 业务方可能在 onQuickKeyTrigger 中动态更新 options;\n // 这里只做越界归一化,不重置有效索引,避免键盘高亮移动后又跳回第一项。\n setQuickKeyActiveIndex(\n (prev) => ((prev % activeQuickKeyOptionsLength) + activeQuickKeyOptionsLength) %\n activeQuickKeyOptionsLength,\n );\n }, [activeQuickKeyOptionsLength]);\n\n const getNextQuickKeyIndex = useCallback(\n (current: number, step: number) => {\n if (activeQuickKeyOptionsLength <= 0) return 0;\n return (\n (current + step + activeQuickKeyOptionsLength) %\n activeQuickKeyOptionsLength\n );\n },\n [activeQuickKeyOptionsLength],\n );\n\n // 从当前光标前的连续文本片段中查找最近的快捷键,例如 abc@doc 会触发 @。\n const detectQuickKey = useCallback(\n (text: string, cursorPos: number) => {\n const quickKeyChars = quickKeys.map((qk) => qk.key);\n if (quickKeyChars.length === 0) return;\n\n const textBeforeCursor = text.slice(0, cursorPos);\n let found = false;\n for (let i = textBeforeCursor.length - 1; i >= 0; i--) {\n const char = textBeforeCursor[i];\n if (/\\s/.test(char)) break;\n if (quickKeyChars.includes(char)) {\n const keyword = textBeforeCursor.slice(i + 1);\n setActiveQuickKey(char);\n setQuickKeyKeyword(keyword);\n setQuickKeyTriggerIdx(i);\n setQuickKeyActiveIndex(0);\n onQuickKeyTrigger?.(char, keyword);\n found = true;\n break;\n }\n }\n\n if (!found && activeQuickKey) {\n const triggerChar = text[quickKeyTriggerIdx];\n const keyword = text.slice(quickKeyTriggerIdx + 1, cursorPos);\n if (\n quickKeyTriggerIdx < 0 ||\n !triggerChar ||\n !quickKeyChars.includes(triggerChar) ||\n /\\s/.test(keyword)\n ) {\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n } else {\n setQuickKeyKeyword(keyword);\n }\n }\n },\n [activeQuickKey, onQuickKeyTrigger, quickKeyTriggerIdx, quickKeys],\n );\n\n // 选择快捷项后转成结构化 tag;inline 模式会替换掉触发字符和关键词。\n const handleQuickKeySelect = useCallback(\n (option: any) => {\n const newTag: InputTag = {\n id: generateId(),\n label: option.label,\n type: activeQuickKey || \"unknown\",\n value: option.value ?? option.name ?? option.label,\n trigger: activeQuickKey || undefined,\n icon: option.icon,\n data: option,\n };\n activeQuickKeyConfig?.onSelect?.(option);\n\n if (inlineTags) {\n inlineInputRef.current?.insertTag(newTag, {\n start: quickKeyTriggerIdx,\n end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length,\n });\n } else {\n setTags([...tags, newTag]);\n\n // 从输入框中删除快捷键字符和关键词\n if (quickKeyTriggerIdx >= 0) {\n const newValue =\n value.slice(0, quickKeyTriggerIdx) +\n value.slice(quickKeyTriggerIdx + 1 + quickKeyKeyword.length);\n setValue(newValue);\n }\n }\n\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n inlineTags\n ? inlineInputRef.current?.focus()\n : textareaRef.current?.focus();\n },\n [\n activeQuickKey,\n activeQuickKeyConfig,\n inlineTags,\n tags,\n setTags,\n value,\n quickKeyTriggerIdx,\n quickKeyKeyword,\n setValue,\n ],\n );\n\n // 处理输入框变化(含快捷键检测)\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value;\n setValue(newValue);\n\n // 检测快捷键触发\n detectQuickKey(newValue, e.target.selectionStart || 0);\n };\n\n const handleInlineInputChange = (newValue: string) => {\n setValue(newValue);\n // contenteditable 的 selection 不一定和 React state 同步,需实时读取内部光标 offset。\n detectQuickKey(\n newValue,\n inlineInputRef.current?.getCursorOffset() || newValue.length,\n );\n };\n\n const handleQuickKeyByText = (text: string, cursorPos: number) => {\n const quickKeyChars = quickKeys.map((qk) => qk.key);\n if (quickKeyChars.length === 0) return;\n\n const textBeforeCursor = text.slice(0, cursorPos);\n\n // 检测刚输入的字符是否是快捷键\n const lastChar = textBeforeCursor[cursorPos - 1];\n if (lastChar && quickKeyChars.includes(lastChar)) {\n // 上下键导航后会触发 keyup,此时光标前仍是同一个快捷键字符;\n // 如果重复重置 activeIndex,视觉上会“移动一下又回到第一项”。\n if (activeQuickKey === lastChar && quickKeyTriggerIdx === cursorPos - 1) {\n return;\n }\n setActiveQuickKey(lastChar);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(cursorPos - 1);\n setQuickKeyActiveIndex(0);\n onQuickKeyTrigger?.(lastChar, \"\");\n }\n };\n\n // onChange 负责更新搜索词;onKeyUp 兜底捕获刚输入的快捷键字符。\n const isQuickListControlKey = (key: string) =>\n key === \"ArrowDown\" || key === \"ArrowUp\" || key === \"Enter\" || key === \"Escape\";\n\n const handleKeyUp = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (activeQuickKey && isQuickListControlKey(e.key)) return;\n const target = e.target as HTMLTextAreaElement;\n handleQuickKeyByText(target.value || \"\", target.selectionStart || 0);\n };\n\n const handleInlineKeyUp = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (activeQuickKey && isQuickListControlKey(e.key)) return;\n // inline 输入区不是 textarea,不能读 event.target.value,只能从 ref 取纯文本。\n const text = inlineInputRef.current?.getText() || \"\";\n const cursorPos =\n inlineInputRef.current?.getCursorOffset() || text.length;\n handleQuickKeyByText(text, cursorPos);\n };\n\n // 处理提交\n const handleSubmit = () => {\n if (!value.trim() && files.length === 0 && tags.length === 0) {\n message.warning(\"请输入消息或选择文件\");\n return;\n }\n\n const successFiles = files.filter((file) => file.status === \"success\");\n const uploadingFiles = files.filter(\n (file) => file.status === \"uploading\",\n );\n\n if (uploadingFiles.length > 0) {\n Modal.confirm({\n title: \"文件上传中\",\n content: `还有 ${uploadingFiles.length} 个文件正在上传,是否继续发送?`,\n okText: \"发送已完成的\",\n cancelText: \"等待全部完成\",\n onOk: () => {\n const formattedFiles = formatFilesForServer(successFiles);\n if (onSubmit) {\n onSubmit(createSubmitData(formattedFiles));\n }\n\n setValue(\"\");\n setTags([]);\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n },\n onCancel: () => {\n message.info(\"请等待文件上传完成后再发送\");\n },\n });\n } else {\n const formattedFiles = formatFilesForServer(successFiles);\n\n if (onSubmit) {\n onSubmit(createSubmitData(formattedFiles));\n }\n\n setValue(\"\");\n setTags([]);\n setFiles((prev) => prev.filter((f) => f.status !== \"success\"));\n }\n };\n\n // 格式化文件列表为服务端格式\n const formatFilesForServer = (fileList: LocalFile[]): ServerFile[] => {\n return fileList\n .filter((file) => file.status === \"success\" && file.response)\n .map((file) => {\n const responseData = normalizeUploadResponse(file.response);\n\n return {\n fileName: responseData.fileName || file.name,\n fileId: responseData.fileId || responseData.id || \"\",\n tempUrl:\n responseData.tempUrl ||\n responseData.fileUrl ||\n responseData.url ||\n \"\",\n type: responseData.fileType || responseData.type || getExt(file),\n size: responseData.fileSize || responseData.size || file.size,\n mimeType: responseData.mimeType || file.type,\n raw: {\n ...responseData,\n },\n };\n });\n };\n\n // 处理回车键\n const handleKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n const quickKeyOptions = activeQuickKeyConfig?.options || [];\n\n if (activeQuickKey && quickKeyOptions.length > 0) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, 1));\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setQuickKeyActiveIndex((prev) => getNextQuickKeyIndex(prev, -1));\n return;\n }\n\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleQuickKeySelect(\n quickKeyOptions[\n Math.min(quickKeyActiveIndex, quickKeyOptions.length - 1)\n ],\n );\n return;\n }\n\n if (e.key === \"Escape\") {\n e.preventDefault();\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n return;\n }\n }\n\n if (e.key === \"Enter\" && !e.shiftKey && !activeQuickKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // 渲染文件列表\n const renderFileList = () => {\n if (files.length === 0) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n padding: \"12px 0\",\n }}\n >\n {files.map((file) => (\n <FileGallery\n key={file.id}\n file={file}\n removable\n onRemove={handleRemoveFile}\n />\n ))}\n </div>\n );\n };\n\n const containerClass = `${styles.container} ${isDragOver ? \"drag-over\" : \"\"}`;\n const uploading = files.some((f) => f.status === \"uploading\");\n const isDisabled = disabled || uploading || loading;\n const hasContent = value.trim().length > 0;\n const hasFiles = files.some((f) => f.status === \"success\");\n const hasTags = tags.length > 0;\n const canSend = hasContent || hasFiles || hasTags;\n\n // 定义按钮组件\n const SendButton = (props: any) => {\n if (sendButtonRender) {\n return (\n <>\n {sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })}\n </>\n );\n }\n return (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n {...props}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n );\n };\n\n const UploadButton = (props: any) => (\n <Tooltip title=\"上传文件\">\n <button\n className={`${styles.iconButton} ${styles.uploadButton}`}\n onClick={triggerFileSelect}\n disabled={isDisabled}\n aria-label=\"上传文件\"\n {...props}\n >\n <PaperClipOutlined />\n </button>\n </Tooltip>\n );\n\n const ClearButton = (props: any) => (\n <Popconfirm\n title=\"确定要清空聊天记录吗?\"\n onConfirm={onClear}\n placement=\"top\"\n okText=\"确定\"\n cancelText=\"取消\"\n disabled={isDisabled}\n >\n <button\n className={`${styles.iconButton} ${styles.clearButton}`}\n disabled={isDisabled}\n aria-label=\"清空聊天记录\"\n {...props}\n >\n <ClearOutlined />\n </button>\n </Popconfirm>\n );\n\n const actionsComponents: ActionsComponents = {\n SendButton,\n UploadButton,\n ClearButton,\n };\n\n // 渲染插槽内容\n const renderSlot = (\n slot:\n | React.ReactNode\n | false\n | ((\n oriNode: React.ReactNode,\n info: { components: ActionsComponents },\n ) => React.ReactNode | false)\n | undefined,\n oriNode: React.ReactNode,\n ): React.ReactNode | null => {\n if (slot === false) return null;\n if (slot === undefined) return oriNode;\n if (typeof slot === \"function\") {\n const result = slot(oriNode, { components: actionsComponents });\n return result === false ? null : result;\n }\n return slot;\n };\n\n // 默认后缀仅保留发送/停止按钮;上传与清空统一放到底部 actionBar,方便业务扩展左侧按钮组。\n const defaultSuffix = (\n <div className={styles.buttonGroup}>\n {sendButtonRender ? (\n sendButtonRender({\n loading,\n disabled: uploading || disabled,\n canSend,\n onSend: handleSubmit,\n onStop,\n })\n ) : (\n <Tooltip title={loading ? \"停止生成\" : \"发送消息\"}>\n <button\n className={`${styles.iconButton} ${styles.sendButton} ${loading ? \"stop\" : \"\"}`}\n onClick={loading ? onStop : handleSubmit}\n disabled={uploading || disabled}\n aria-label={loading ? \"停止生成\" : \"发送消息\"}\n >\n {loading ? <LoadingOutlined spin /> : <ArrowUpOutlined />}\n </button>\n </Tooltip>\n )}\n </div>\n );\n\n const defaultActionBar = (\n <div className={styles.actionBar}>\n <div className={styles.actionBarLeft}>\n {allowUpload && <UploadButton />}\n {renderSlot(footerLeft, false)}\n </div>\n <div className={styles.actionBarRight}>\n {clearBtnShow && <ClearButton />}\n {renderSlot(suffix, defaultSuffix)}\n </div>\n </div>\n );\n\n return (\n <div\n ref={containerRef}\n className={containerClass}\n onDragOver={allowUpload && draggable ? handleDragOver : undefined}\n onDragLeave={allowUpload && draggable ? handleDragLeave : undefined}\n onDrop={allowUpload && draggable ? handleDrop : undefined}\n >\n {/* 头部插槽 */}\n {renderSlot(header, false)}\n\n {allowUpload && files.length > 0 && renderFileList()}\n\n {/* 隐藏的原生 file input */}\n {allowUpload && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={allowedFileTypes.join(\",\")}\n style={{ display: \"none\" }}\n onChange={(e) => {\n if (e.target.files) {\n handleFileSelect(Array.from(e.target.files));\n e.target.value = \"\";\n }\n }}\n />\n )}\n\n <div className={styles.mainArea}>\n <div className={styles.senderWrap}>\n {/* textarea 模式下保留历史标签展示;inlineTags 模式标签直接混排在输入区内 */}\n {!inlineTags && (\n <InputTags tags={tags} onRemove={handleRemoveTag} />\n )}\n\n <div className={styles.inputAndButtons}>\n {/* 前缀插槽 */}\n {renderSlot(prefix, false)}\n\n {inlineTags ? (\n <InlineTagInput\n ref={inlineInputRef}\n value={value}\n tags={tags}\n placeholder={placeholder}\n disabled={isDisabled}\n onChange={handleInlineInputChange}\n onTagsChange={setTags}\n onKeyDown={handleKeyDown as any}\n onKeyUp={handleInlineKeyUp}\n renderTag={renderTag}\n />\n ) : (\n <div className={styles.textAreaWrapper}>\n <Input.TextArea\n ref={textareaRef}\n className={styles.textArea}\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n placeholder={placeholder}\n autoSize={{ minRows: 1, maxRows: 4 }}\n style={{\n border: \"none\",\n boxShadow: \"none\",\n outline: \"none\",\n padding: 0,\n }}\n />\n </div>\n )}\n </div>\n\n {/* 快捷键弹出列表 */}\n {activeQuickKey && activeQuickKeyConfig && (\n <div className={styles.quickListWrapper}>\n <QuickList\n config={activeQuickKeyConfig}\n activeIndex={quickKeyActiveIndex}\n onSelect={handleQuickKeySelect}\n onClose={() => {\n setActiveQuickKey(null);\n setQuickKeyKeyword(\"\");\n setQuickKeyTriggerIdx(-1);\n setQuickKeyActiveIndex(0);\n }}\n visible={true}\n />\n </div>\n )}\n\n {/* 底部操作行:左侧上传/业务按钮,右侧清空/发送按钮 */}\n {footer === false\n ? defaultActionBar\n : renderSlot(footer, defaultActionBar)}\n </div>\n </div>\n\n {/* 提示文案 */}\n {!footer && (\n <div className={styles.tip}>\n 内容由AI生成,无法确保真实准确,仅供参考\n </div>\n )}\n </div>\n );\n },\n);\n\nXAdkSender.displayName = \"XAdkSender\";\nexport default XAdkSender;\n"],
5
+ "mappings": "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",
6
+ "names": ["value", "files", "FileGallery", "InputTags", "InlineTagInput", "QuickList"]
7
7
  }
@@ -5,12 +5,27 @@ export declare const useStyles: () => {
5
5
  inputAndButtons: string;
6
6
  textAreaWrapper: string;
7
7
  textArea: string;
8
+ inlineInputWrapper: string;
9
+ inlineInput: string;
10
+ inlineTag: string;
8
11
  buttonGroup: string;
9
12
  iconButton: string;
10
13
  clearButton: string;
11
14
  uploadButton: string;
12
15
  sendButton: string;
13
16
  tip: string;
17
+ actionBar: string;
18
+ actionBarLeft: string;
19
+ actionBarRight: string;
20
+ quickListWrapper: string;
21
+ quickList: string;
22
+ quickListHeader: string;
23
+ quickListBody: string;
24
+ quickListEmpty: string;
25
+ quickListGroup: string;
26
+ quickListItem: string;
27
+ inputTags: string;
28
+ inputTag: string;
14
29
  } & {
15
30
  w: (width: string | number) => string;
16
31
  h: (height: string | number) => string;
@@ -41,7 +41,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
41
41
  // 主内容区域
42
42
  mainArea: import_css.css`
43
43
  border-radius: 20px;
44
- overflow: hidden;
44
+ overflow: visible;
45
45
  background: #fff;
46
46
  `,
47
47
  // 发送区域
@@ -57,7 +57,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
57
57
  flex: auto;
58
58
  font-size: 14px;
59
59
  line-height: 22px;
60
- padding: 7px 12px;
60
+ padding: 10px 12px 8px;
61
61
  position: relative;
62
62
  z-index: 1;
63
63
  transition-duration: 0.2s;
@@ -71,7 +71,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
71
71
  inputAndButtons: import_css.css`
72
72
  flex: 1;
73
73
  display: flex;
74
- align-items: flex-end;
74
+ align-items: center;
75
75
  gap: 8px;
76
76
  `,
77
77
  // 文本输入框容器
@@ -80,7 +80,7 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
80
80
  display: flex;
81
81
  align-items: center;
82
82
  background: #fff;
83
- padding: 0 16px;
83
+ padding: 0 4px;
84
84
  min-height: 44px;
85
85
 
86
86
  /* 移除所有蓝色效果 */
@@ -108,12 +108,69 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
108
108
  outline: none;
109
109
  color: #262626;
110
110
  `,
111
+ inlineInputWrapper: import_css.css`
112
+ flex: 1;
113
+ min-height: 44px;
114
+ display: flex;
115
+ align-items: center;
116
+ padding: 0 4px;
117
+ background: #fff;
118
+ `,
119
+ inlineInput: import_css.css`
120
+ width: 100%;
121
+ min-height: 24px;
122
+ max-height: 112px;
123
+ overflow-y: auto;
124
+ outline: none;
125
+ border: none;
126
+ color: #262626;
127
+ font-size: 14px;
128
+ line-height: 24px;
129
+ white-space: pre-wrap;
130
+ word-break: break-word;
131
+
132
+ &[data-empty="true"]::before {
133
+ content: attr(data-placeholder);
134
+ color: #bfbfbf;
135
+ pointer-events: none;
136
+ }
137
+ `,
138
+ inlineTag: import_css.css`
139
+ display: inline-flex;
140
+ align-items: center;
141
+ gap: 4px;
142
+ max-width: 180px;
143
+ height: 22px;
144
+ padding: 0 7px;
145
+ margin: 0 3px;
146
+ vertical-align: baseline;
147
+ border-radius: 6px;
148
+ border: 1px solid #d6e4ff;
149
+ background: #f0f7ff;
150
+ color: #0958d9;
151
+ font-size: 12px;
152
+ line-height: 20px;
153
+ user-select: none;
154
+
155
+ .xadk-inline-tag-label {
156
+ overflow: hidden;
157
+ text-overflow: ellipsis;
158
+ white-space: nowrap;
159
+ }
160
+
161
+ .xadk-inline-tag-close {
162
+ cursor: pointer;
163
+ color: #597ef7;
164
+ font-size: 12px;
165
+ line-height: 1;
166
+ }
167
+ `,
111
168
  // 按钮组
112
169
  buttonGroup: import_css.css`
113
170
  display: flex;
114
171
  gap: 8px;
115
172
  align-items: center;
116
- height: 44px;
173
+ height: 36px;
117
174
  `,
118
175
  // 按钮统一样式
119
176
  iconButton: import_css.css`
@@ -202,6 +259,128 @@ var useStyles = (0, import_common.withBasicStyles)(() => ({
202
259
  text-align: center;
203
260
  font-size: 12px;
204
261
  color: #8c8c8c;
262
+ `,
263
+ actionBar: import_css.css`
264
+ display: flex;
265
+ align-items: center;
266
+ justify-content: space-between;
267
+ gap: 12px;
268
+ min-height: 36px;
269
+ `,
270
+ actionBarLeft: import_css.css`
271
+ min-width: 0;
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 8px;
275
+ flex: 1;
276
+ `,
277
+ actionBarRight: import_css.css`
278
+ display: flex;
279
+ align-items: center;
280
+ justify-content: flex-end;
281
+ gap: 8px;
282
+ flex-shrink: 0;
283
+ `,
284
+ // 快捷键弹出列表外层容器
285
+ quickListWrapper: import_css.css`
286
+ position: absolute;
287
+ left: 0;
288
+ bottom: 100%;
289
+ margin-bottom: 4px;
290
+ z-index: 100;
291
+ `,
292
+ // 快捷键弹出列表
293
+ quickList: import_css.css`
294
+ max-height: 320px;
295
+ width: 280px;
296
+ display: flex;
297
+ flex-direction: column;
298
+ overflow: hidden;
299
+ background: #fff;
300
+ border-radius: 12px;
301
+ box-shadow: 0 8px 40px 0 rgba(0, 0, 0, 0.12);
302
+ `,
303
+ quickListHeader: import_css.css`
304
+ padding: 12px 16px 0;
305
+ font-size: 13px;
306
+ font-weight: 500;
307
+ color: #8c8c8c;
308
+ `,
309
+ quickListBody: import_css.css`
310
+ flex: 1;
311
+ overflow-y: auto;
312
+ padding: 4px 0;
313
+ `,
314
+ quickListEmpty: import_css.css`
315
+ padding: 24px 16px;
316
+ text-align: center;
317
+ color: #8c8c8c;
318
+ font-size: 13px;
319
+ `,
320
+ quickListGroup: import_css.css`
321
+ padding: 8px 16px 4px;
322
+ font-size: 11px;
323
+ font-weight: 500;
324
+ color: #8c8c8c;
325
+ text-transform: uppercase;
326
+ letter-spacing: 0.5px;
327
+ `,
328
+ quickListItem: import_css.css`
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 10px;
332
+ padding: 8px 16px;
333
+ cursor: pointer;
334
+ transition: background 0.15s ease;
335
+
336
+ &:hover {
337
+ background: #f5f5f5;
338
+ }
339
+
340
+ &.active {
341
+ background: #f0f7ff;
342
+ }
343
+
344
+ .quick-list-item-icon {
345
+ width: 28px;
346
+ height: 28px;
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ border-radius: 6px;
351
+ background: #f5f5f5;
352
+ flex-shrink: 0;
353
+ }
354
+
355
+ .quick-list-item-content {
356
+ flex: 1;
357
+ min-width: 0;
358
+ }
359
+
360
+ .quick-list-item-label {
361
+ font-size: 13px;
362
+ font-weight: 500;
363
+ color: #262626;
364
+ line-height: 1.4;
365
+ }
366
+
367
+ .quick-list-item-desc {
368
+ font-size: 12px;
369
+ color: #8c8c8c;
370
+ line-height: 1.4;
371
+ }
372
+ `,
373
+ // 输入框内标签
374
+ inputTags: import_css.css`
375
+ display: flex;
376
+ flex-wrap: wrap;
377
+ gap: 6px;
378
+ padding: 4px 0 8px;
379
+ `,
380
+ inputTag: import_css.css`
381
+ margin: 0;
382
+ font-size: 12px;
383
+ border-radius: 6px;
205
384
  `
206
385
  }));
207
386
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/components/XAdkSender/styles.tsx"],
4
- "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n // 容器样式 - 最外层边框\n container: css`\n position: relative;\n padding: 0 15px 10px;\n overflow: visible;\n border: 2px solid transparent;\n transition: all 0.3s ease;\n\n &.drag-over {\n border: 2px dashed #000;\n background: rgba(0, 0, 0, 0.02);\n }\n `,\n\n // 主内容区域\n mainArea: css`\n border-radius: 20px;\n overflow: hidden;\n background: #fff;\n `,\n\n // 发送区域\n senderWrap: css`\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: var(--yb-input-bg-color);\n border: 0.5px solid var(--widget-line, rgba(0, 0, 0, 0.08));\n border-radius: 20px;\n box-sizing: border-box;\n caret-color: var(--yb-input-caret-color);\n flex: auto;\n font-size: 14px;\n line-height: 22px;\n padding: 7px 12px;\n position: relative;\n z-index: 1;\n transition-duration: 0.2s;\n transition-property:\n color, background-color, border-color, text-decoration-color, fill,\n stroke, box-shadow;\n transition-timing-function: linear;\n box-shadow: 0 6px 30px 0 rgba(0, 0, 0, 0.08);\n `,\n\n // 输入框和按钮容器\n inputAndButtons: css`\n flex: 1;\n display: flex;\n align-items: flex-end;\n gap: 8px;\n `,\n\n // 文本输入框容器\n textAreaWrapper: css`\n flex: 1;\n display: flex;\n align-items: center;\n background: #fff;\n padding: 0 16px;\n min-height: 44px;\n\n /* 移除所有蓝色效果 */\n &:focus-within {\n border-color: #d9d9d9;\n box-shadow: none;\n }\n\n .ant-input:disabled {\n background: transparent !important;\n }\n\n &::placeholder {\n color: #bfbfbf;\n }\n `,\n\n // 文本输入框\n textArea: css`\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n line-height: 1.5;\n padding: 12px 0;\n outline: none;\n color: #262626;\n `,\n\n // 按钮组\n buttonGroup: css`\n display: flex;\n gap: 8px;\n align-items: center;\n height: 44px;\n `,\n\n // 按钮统一样式\n iconButton: css`\n width: 36px;\n height: 36px;\n min-width: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n\n &:hover {\n transform: translateY(-1px);\n }\n\n &:active {\n transform: translateY(0);\n }\n `,\n\n // 清空按钮\n clearButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n color: #8c8c8c;\n\n &:hover {\n border-color: #d9d9d9;\n color: #262626;\n background: #fafafa;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n // 上传按钮\n uploadButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n\n &:hover {\n //\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n border-color: #f0f0f0;\n background: #fafafa;\n }\n `,\n\n // 发送按钮\n sendButton: css`\n background: #000;\n border: none;\n color: #fff;\n\n &:hover:not(:disabled) {\n background: #333; /* 悬停状态 */\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background: #cccccc;\n color: #fff;\n }\n\n &.stop {\n //\n\n &:hover:not(:disabled) {\n //\n }\n\n &:disabled {\n background: #cccccc; /* 禁用状态也保持淡灰色 */\n }\n }\n `,\n\n // 底部提示\n tip: css`\n margin: 12px 0;\n text-align: center;\n font-size: 12px;\n color: #8c8c8c;\n `,\n}));\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAoB;AACpB,oBAAgC;AAEzB,IAAM,gBAAY,+BAAgB,OAAO;AAAA;AAAA,EAE9C,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBZ,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQjB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBjB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYV,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQb,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBZ,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBd,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BZ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAMP,EAAE;",
4
+ "sourcesContent": ["import { css } from \"@emotion/css\";\nimport { withBasicStyles } from \"@/styles/common\";\n\nexport const useStyles = withBasicStyles(() => ({\n // 容器样式 - 最外层边框\n container: css`\n position: relative;\n padding: 0 15px 10px;\n overflow: visible;\n border: 2px solid transparent;\n transition: all 0.3s ease;\n\n &.drag-over {\n border: 2px dashed #000;\n background: rgba(0, 0, 0, 0.02);\n }\n `,\n\n // 主内容区域\n mainArea: css`\n border-radius: 20px;\n overflow: visible;\n background: #fff;\n `,\n\n // 发送区域\n senderWrap: css`\n display: flex;\n flex-direction: column;\n gap: 6px;\n background: var(--yb-input-bg-color);\n border: 0.5px solid var(--widget-line, rgba(0, 0, 0, 0.08));\n border-radius: 20px;\n box-sizing: border-box;\n caret-color: var(--yb-input-caret-color);\n flex: auto;\n font-size: 14px;\n line-height: 22px;\n padding: 10px 12px 8px;\n position: relative;\n z-index: 1;\n transition-duration: 0.2s;\n transition-property:\n color, background-color, border-color, text-decoration-color, fill,\n stroke, box-shadow;\n transition-timing-function: linear;\n box-shadow: 0 6px 30px 0 rgba(0, 0, 0, 0.08);\n `,\n\n // 输入框和按钮容器\n inputAndButtons: css`\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n `,\n\n // 文本输入框容器\n textAreaWrapper: css`\n flex: 1;\n display: flex;\n align-items: center;\n background: #fff;\n padding: 0 4px;\n min-height: 44px;\n\n /* 移除所有蓝色效果 */\n &:focus-within {\n border-color: #d9d9d9;\n box-shadow: none;\n }\n\n .ant-input:disabled {\n background: transparent !important;\n }\n\n &::placeholder {\n color: #bfbfbf;\n }\n `,\n\n // 文本输入框\n textArea: css`\n flex: 1;\n border: none;\n background: transparent;\n font-size: 14px;\n line-height: 1.5;\n padding: 12px 0;\n outline: none;\n color: #262626;\n `,\n\n inlineInputWrapper: css`\n flex: 1;\n min-height: 44px;\n display: flex;\n align-items: center;\n padding: 0 4px;\n background: #fff;\n `,\n\n inlineInput: css`\n width: 100%;\n min-height: 24px;\n max-height: 112px;\n overflow-y: auto;\n outline: none;\n border: none;\n color: #262626;\n font-size: 14px;\n line-height: 24px;\n white-space: pre-wrap;\n word-break: break-word;\n\n &[data-empty=\"true\"]::before {\n content: attr(data-placeholder);\n color: #bfbfbf;\n pointer-events: none;\n }\n `,\n\n inlineTag: css`\n display: inline-flex;\n align-items: center;\n gap: 4px;\n max-width: 180px;\n height: 22px;\n padding: 0 7px;\n margin: 0 3px;\n vertical-align: baseline;\n border-radius: 6px;\n border: 1px solid #d6e4ff;\n background: #f0f7ff;\n color: #0958d9;\n font-size: 12px;\n line-height: 20px;\n user-select: none;\n\n .xadk-inline-tag-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .xadk-inline-tag-close {\n cursor: pointer;\n color: #597ef7;\n font-size: 12px;\n line-height: 1;\n }\n `,\n\n // 按钮组\n buttonGroup: css`\n display: flex;\n gap: 8px;\n align-items: center;\n height: 36px;\n `,\n\n // 按钮统一样式\n iconButton: css`\n width: 36px;\n height: 36px;\n min-width: 36px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n\n &:hover {\n transform: translateY(-1px);\n }\n\n &:active {\n transform: translateY(0);\n }\n `,\n\n // 清空按钮\n clearButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n color: #8c8c8c;\n\n &:hover {\n border-color: #d9d9d9;\n color: #262626;\n background: #fafafa;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n\n // 上传按钮\n uploadButton: css`\n border: 1px solid #f0f0f0;\n background: #fff;\n\n &:hover {\n //\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n border-color: #f0f0f0;\n background: #fafafa;\n }\n `,\n\n // 发送按钮\n sendButton: css`\n background: #000;\n border: none;\n color: #fff;\n\n &:hover:not(:disabled) {\n background: #333; /* 悬停状态 */\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n background: #cccccc;\n color: #fff;\n }\n\n &.stop {\n //\n\n &:hover:not(:disabled) {\n //\n }\n\n &:disabled {\n background: #cccccc; /* 禁用状态也保持淡灰色 */\n }\n }\n `,\n\n // 底部提示\n tip: css`\n margin: 12px 0;\n text-align: center;\n font-size: 12px;\n color: #8c8c8c;\n `,\n\n actionBar: css`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n min-height: 36px;\n `,\n\n actionBarLeft: css`\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n `,\n\n actionBarRight: css`\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n flex-shrink: 0;\n `,\n\n // 快捷键弹出列表外层容器\n quickListWrapper: css`\n position: absolute;\n left: 0;\n bottom: 100%;\n margin-bottom: 4px;\n z-index: 100;\n `,\n\n // 快捷键弹出列表\n quickList: css`\n max-height: 320px;\n width: 280px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px 0 rgba(0, 0, 0, 0.12);\n `,\n\n quickListHeader: css`\n padding: 12px 16px 0;\n font-size: 13px;\n font-weight: 500;\n color: #8c8c8c;\n `,\n\n quickListBody: css`\n flex: 1;\n overflow-y: auto;\n padding: 4px 0;\n `,\n\n quickListEmpty: css`\n padding: 24px 16px;\n text-align: center;\n color: #8c8c8c;\n font-size: 13px;\n `,\n\n quickListGroup: css`\n padding: 8px 16px 4px;\n font-size: 11px;\n font-weight: 500;\n color: #8c8c8c;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n `,\n\n quickListItem: css`\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 16px;\n cursor: pointer;\n transition: background 0.15s ease;\n\n &:hover {\n background: #f5f5f5;\n }\n\n &.active {\n background: #f0f7ff;\n }\n\n .quick-list-item-icon {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n background: #f5f5f5;\n flex-shrink: 0;\n }\n\n .quick-list-item-content {\n flex: 1;\n min-width: 0;\n }\n\n .quick-list-item-label {\n font-size: 13px;\n font-weight: 500;\n color: #262626;\n line-height: 1.4;\n }\n\n .quick-list-item-desc {\n font-size: 12px;\n color: #8c8c8c;\n line-height: 1.4;\n }\n `,\n\n // 输入框内标签\n inputTags: css`\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n padding: 4px 0 8px;\n `,\n\n inputTag: css`\n margin: 0;\n font-size: 12px;\n border-radius: 6px;\n `,\n}));\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -11,14 +11,16 @@ import request from "./utils/request";
11
11
  import XAdkProvider from "./components/XAdkProvider";
12
12
  import XAdkChatbot from "./components/XAdkChatbot";
13
13
  import XAdkSender from "./components/XAdkSender";
14
- import XAdkSenderSwitch from "./components/XAdkSender/Switch";
15
14
  import useADKChat from "./hooks/useADKChat";
16
15
  import { baseChatStrategies, basePreset, baseToolKindResolver, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, createXGroupUploadRequest, xGroupAdkPreset, xGroupToolKindResolver } from "./presets/xgroup";
17
16
  export { useChatState, useChatActions, useSession, } from "./components/XAdkProvider/context";
18
17
  export * from "./types";
19
18
  export type { ChatHookResult, ChatHookFactory } from "./types/ChatHook";
20
19
  export { useXAi, XAiProvider, XAiChatbot, XAiSDK, XAiSender, XAiConversations, useXAiSDK, request, };
21
- export { XAdkProvider, XAdkChatbot, XAdkSender, XAdkSenderSwitch, FileGallery, XAdkThoughtChain, useADKChat, baseChatStrategies, basePreset, baseToolKindResolver, createXGroupUploadRequest, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, xGroupAdkPreset, xGroupToolKindResolver, };
20
+ export { XAdkProvider, XAdkChatbot, XAdkSender, FileGallery, XAdkThoughtChain, useADKChat, baseChatStrategies, basePreset, baseToolKindResolver, createXGroupUploadRequest, mergeChatStrategies, resolvePresetUploadRequest, resolveChatPreset, xGroupAdkPreset, xGroupToolKindResolver, };
21
+ import Sources from "./components/Sources";
22
+ export { Sources };
23
+ export type { SourcesProps, SourcesItem, SourcesRef } from "./types/Sources";
22
24
  import FolderTree from "./components/FolderTree";
23
25
  export { FolderTree };
24
26
  export type { FolderTreeProps, FolderTreeData, FileContentService, FolderTreeRef, } from "./components/FolderTree";
package/dist/cjs/index.js CHANGED
@@ -34,11 +34,11 @@ __export(src_exports, {
34
34
  FolderTree: () => import_FolderTree.default,
35
35
  FunctionCallRender: () => import_FunctionCallRender.default,
36
36
  MarkdownRender: () => import_MarkdownRender.default,
37
+ Sources: () => import_Sources.default,
37
38
  ThinkRender: () => import_ThinkRender.default,
38
39
  XAdkChatbot: () => import_XAdkChatbot.default,
39
40
  XAdkProvider: () => import_XAdkProvider.default,
40
41
  XAdkSender: () => import_XAdkSender.default,
41
- XAdkSenderSwitch: () => import_Switch.default,
42
42
  XAdkThoughtChain: () => import_XAdkThoughtChain.default,
43
43
  XAiChatbot: () => import_XAiChatbot.default,
44
44
  XAiConversations: () => import_XAiConversations.default,
@@ -82,11 +82,11 @@ var import_request = __toESM(require("./utils/request"));
82
82
  var import_XAdkProvider = __toESM(require("./components/XAdkProvider"));
83
83
  var import_XAdkChatbot = __toESM(require("./components/XAdkChatbot"));
84
84
  var import_XAdkSender = __toESM(require("./components/XAdkSender"));
85
- var import_Switch = __toESM(require("./components/XAdkSender/Switch"));
86
85
  var import_useADKChat = __toESM(require("./hooks/useADKChat"));
87
86
  var import_xgroup = require("./presets/xgroup");
88
87
  var import_context = require("./components/XAdkProvider/context");
89
88
  __reExport(src_exports, require("./types"), module.exports);
89
+ var import_Sources = __toESM(require("./components/Sources"));
90
90
  var import_FolderTree = __toESM(require("./components/FolderTree"));
91
91
  var import_MarkdownRender = __toESM(require("./components/XAdkChatbot/components/MarkdownRender"));
92
92
  var import_FunctionCallRender = __toESM(require("./components/XAdkChatbot/components/FunctionCallRender"));
@@ -101,11 +101,11 @@ var import_xgroup2 = require("./presets/xgroup");
101
101
  FolderTree,
102
102
  FunctionCallRender,
103
103
  MarkdownRender,
104
+ Sources,
104
105
  ThinkRender,
105
106
  XAdkChatbot,
106
107
  XAdkProvider,
107
108
  XAdkSender,
108
- XAdkSenderSwitch,
109
109
  XAdkThoughtChain,
110
110
  XAiChatbot,
111
111
  XAiConversations,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["// index.ts\nimport { useXAi } from \"./context/AiProviderContext\";\nimport XAiProvider from \"./components/XAiProvider\";\nimport XAiChatbot from \"./components/XAiChatbot\";\nimport XAiSDK from \"./components/XAiSDK\";\nimport XAiSender from \"./components/XAiSender\";\nimport FileGallery from \"./components/FileGallery\";\nimport XAiConversations from \"./components/XAiConversations\";\nimport XAdkThoughtChain from \"./components/XAdkThoughtChain\";\nimport useXAiSDK from \"./hooks/useXAiSDK\";\nimport request from \"./utils/request\";\n\n// 新的 Compound Components 架构\nimport XAdkProvider from \"./components/XAdkProvider\";\nimport XAdkChatbot from \"./components/XAdkChatbot\";\nimport XAdkSender from \"./components/XAdkSender\";\nimport XAdkSenderSwitch from \"./components/XAdkSender/Switch\";\nimport useADKChat from \"./hooks/useADKChat\";\nimport {\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n createXGroupUploadRequest,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n} from \"./presets/xgroup\";\n\n// 导出新的 Context Hooks\nexport {\n useChatState,\n useChatActions,\n useSession,\n} from \"./components/XAdkProvider/context\";\n\nexport * from \"./types\";\n\n// 导出自定义 Hook 相关类型\nexport type { ChatHookResult, ChatHookFactory } from \"./types/ChatHook\";\n\n// 旧 API - 保持向后兼容\nexport {\n useXAi,\n XAiProvider,\n XAiChatbot,\n XAiSDK,\n XAiSender,\n XAiConversations,\n useXAiSDK,\n request,\n};\n\n// 新 API - 推荐使用\nexport {\n XAdkProvider,\n XAdkChatbot,\n XAdkSender,\n XAdkSenderSwitch,\n FileGallery,\n XAdkThoughtChain,\n useADKChat,\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n createXGroupUploadRequest,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n};\n\n// FolderTree 文件树组件\nimport FolderTree from \"./components/FolderTree\";\nexport { FolderTree };\nexport type {\n FolderTreeProps,\n FolderTreeData,\n FileContentService,\n FolderTreeRef,\n} from \"./components/FolderTree\";\n\n// 基础组件导出 - 供高级用户和业务侧使用\nexport { default as MarkdownRender } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport { default as FunctionCallRender } from \"./components/XAdkChatbot/components/FunctionCallRender\";\nexport { default as ThinkRender } from \"./components/XAdkChatbot/components/ThinkRender\";\n\n// 基础组件类型导出\nexport type { MarkdownRenderProps } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport type { FunctionCallRenderProps } from \"./types/FunctionCallRender\";\nexport type {\n XAdkThoughtChainProps,\n ThoughtChainItemType,\n ThoughtChainStatus,\n} from \"./types/XAdkThoughtChain\";\n\n// 设计令牌导出 - 供引用方覆盖样式\nexport { tokens, tokenDefaults, token, cssVarStyle } from \"./styles/tokens\";\n\n// Headless ADK data-flow APIs\nexport * from \"./core\";\nexport { default as useAdkConversation } from \"./react/useAdkConversation\";\nexport type { UseAdkConversationResult } from \"./react/useAdkConversation\";\nexport { createXGroupOpenApiTransport } from \"./presets/xgroup\";\nexport type { XGroupOpenApiTransportOptions } from \"./presets/xgroup\";\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA,wCAAAC;AAAA,EAAA,wCAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,sCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,sCAAAC;AAAA,EAAA,4BAAAC;AAAA,EAAA,kCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AACA,+BAAuB;AACvB,yBAAwB;AACxB,wBAAuB;AACvB,oBAAmB;AACnB,uBAAsB;AACtB,yBAAwB;AACxB,8BAA6B;AAC7B,8BAA6B;AAC7B,uBAAsB;AACtB,qBAAoB;AAGpB,0BAAyB;AACzB,yBAAwB;AACxB,wBAAuB;AACvB,oBAA6B;AAC7B,wBAAuB;AACvB,oBAUO;AAGP,qBAIO;AAEP,wBAAc,oBArCd;AA2EA,wBAAuB;AAUvB,4BAA0C;AAC1C,gCAA8C;AAC9C,yBAAuC;AAYvC,oBAA0D;AAG1D,wBAAc,mBAtGd;AAuGA,gCAA8C;AAE9C,IAAAC,iBAA6C;",
6
- "names": ["FileGallery", "FolderTree", "XAdkChatbot", "XAdkProvider", "XAdkSender", "XAdkSenderSwitch", "XAdkThoughtChain", "XAiChatbot", "XAiConversations", "XAiProvider", "XAiSDK", "XAiSender", "request", "useADKChat", "useXAiSDK", "import_xgroup"]
4
+ "sourcesContent": ["// index.ts\nimport { useXAi } from \"./context/AiProviderContext\";\nimport XAiProvider from \"./components/XAiProvider\";\nimport XAiChatbot from \"./components/XAiChatbot\";\nimport XAiSDK from \"./components/XAiSDK\";\nimport XAiSender from \"./components/XAiSender\";\nimport FileGallery from \"./components/FileGallery\";\nimport XAiConversations from \"./components/XAiConversations\";\nimport XAdkThoughtChain from \"./components/XAdkThoughtChain\";\nimport useXAiSDK from \"./hooks/useXAiSDK\";\nimport request from \"./utils/request\";\n\n// 新的 Compound Components 架构\nimport XAdkProvider from \"./components/XAdkProvider\";\nimport XAdkChatbot from \"./components/XAdkChatbot\";\nimport XAdkSender from \"./components/XAdkSender\";\nimport useADKChat from \"./hooks/useADKChat\";\nimport {\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n createXGroupUploadRequest,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n} from \"./presets/xgroup\";\n\n// 导出新的 Context Hooks\nexport {\n useChatState,\n useChatActions,\n useSession,\n} from \"./components/XAdkProvider/context\";\n\nexport * from \"./types\";\n\n// 导出自定义 Hook 相关类型\nexport type { ChatHookResult, ChatHookFactory } from \"./types/ChatHook\";\n\n// 旧 API - 保持向后兼容\nexport {\n useXAi,\n XAiProvider,\n XAiChatbot,\n XAiSDK,\n XAiSender,\n XAiConversations,\n useXAiSDK,\n request,\n};\n\n// 新 API - 推荐使用\nexport {\n XAdkProvider,\n XAdkChatbot,\n XAdkSender,\n FileGallery,\n XAdkThoughtChain,\n useADKChat,\n baseChatStrategies,\n basePreset,\n baseToolKindResolver,\n createXGroupUploadRequest,\n mergeChatStrategies,\n resolvePresetUploadRequest,\n resolveChatPreset,\n xGroupAdkPreset,\n xGroupToolKindResolver,\n};\n\n// Sources 来源引用组件\nimport Sources from \"./components/Sources\";\nexport { Sources };\nexport type { SourcesProps, SourcesItem, SourcesRef } from \"./types/Sources\";\n\n// FolderTree 文件树组件\nimport FolderTree from \"./components/FolderTree\";\nexport { FolderTree };\nexport type {\n FolderTreeProps,\n FolderTreeData,\n FileContentService,\n FolderTreeRef,\n} from \"./components/FolderTree\";\n\n// 基础组件导出 - 供高级用户和业务侧使用\nexport { default as MarkdownRender } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport { default as FunctionCallRender } from \"./components/XAdkChatbot/components/FunctionCallRender\";\nexport { default as ThinkRender } from \"./components/XAdkChatbot/components/ThinkRender\";\n\n// 基础组件类型导出\nexport type { MarkdownRenderProps } from \"./components/XAdkChatbot/components/MarkdownRender\";\nexport type { FunctionCallRenderProps } from \"./types/FunctionCallRender\";\nexport type {\n XAdkThoughtChainProps,\n ThoughtChainItemType,\n ThoughtChainStatus,\n} from \"./types/XAdkThoughtChain\";\n\n// 设计令牌导出 - 供引用方覆盖样式\nexport { tokens, tokenDefaults, token, cssVarStyle } from \"./styles/tokens\";\n\n// Headless ADK data-flow APIs\nexport * from \"./core\";\nexport { default as useAdkConversation } from \"./react/useAdkConversation\";\nexport type { UseAdkConversationResult } from \"./react/useAdkConversation\";\nexport { createXGroupOpenApiTransport } from \"./presets/xgroup\";\nexport type { XGroupOpenApiTransportOptions } from \"./presets/xgroup\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,wCAAAA;AAAA,EAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA,wCAAAC;AAAA,EAAA,wCAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,oCAAAC;AAAA,EAAA,gDAAAC;AAAA,EAAA,sCAAAC;AAAA,EAAA,4BAAAC;AAAA,EAAA,kCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AACA,+BAAuB;AACvB,yBAAwB;AACxB,wBAAuB;AACvB,oBAAmB;AACnB,uBAAsB;AACtB,yBAAwB;AACxB,8BAA6B;AAC7B,8BAA6B;AAC7B,uBAAsB;AACtB,qBAAoB;AAGpB,0BAAyB;AACzB,yBAAwB;AACxB,wBAAuB;AACvB,wBAAuB;AACvB,oBAUO;AAGP,qBAIO;AAEP,wBAAc,oBApCd;AAyEA,qBAAoB;AAKpB,wBAAuB;AAUvB,4BAA0C;AAC1C,gCAA8C;AAC9C,yBAAuC;AAYvC,oBAA0D;AAG1D,wBAAc,mBAzGd;AA0GA,gCAA8C;AAE9C,IAAAC,iBAA6C;",
6
+ "names": ["FileGallery", "FolderTree", "Sources", "XAdkChatbot", "XAdkProvider", "XAdkSender", "XAdkThoughtChain", "XAiChatbot", "XAiConversations", "XAiProvider", "XAiSDK", "XAiSender", "request", "useADKChat", "useXAiSDK", "import_xgroup"]
7
7
  }
@@ -0,0 +1,30 @@
1
+ /// <reference types="react" />
2
+ export type SemanticType = 'root' | 'title' | 'content';
3
+ export interface SourcesItem {
4
+ key?: React.Key;
5
+ title: React.ReactNode;
6
+ url?: string;
7
+ icon?: React.ReactNode;
8
+ description?: React.ReactNode;
9
+ }
10
+ export interface SourcesProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title' | 'onClick'> {
11
+ prefixCls?: string;
12
+ style?: React.CSSProperties;
13
+ styles?: Partial<Record<SemanticType, React.CSSProperties>>;
14
+ className?: string;
15
+ classNames?: Partial<Record<SemanticType, string>>;
16
+ rootClassName?: string;
17
+ inline?: boolean;
18
+ items?: Array<SourcesItem>;
19
+ title?: React.ReactNode;
20
+ expandIconPosition?: 'start' | 'end';
21
+ onClick?: (item: SourcesItem) => void;
22
+ popoverOverlayWidth?: number | string;
23
+ activeKey?: React.Key;
24
+ expanded?: boolean;
25
+ onExpand?: (expand: boolean) => void;
26
+ defaultExpanded?: boolean;
27
+ }
28
+ export type SourcesRef = {
29
+ nativeElement: HTMLElement;
30
+ };