@ai-group/chat-sdk 3.7.1-alpha1 → 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 (52) 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 +2 -1
  11. package/dist/cjs/components/XAdkSender/InlineTagInput.js +26 -2
  12. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  13. package/dist/cjs/components/XAdkSender/index.js +66 -11
  14. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  15. package/dist/cjs/index.d.ts +3 -0
  16. package/dist/cjs/index.js +3 -0
  17. package/dist/cjs/index.js.map +3 -3
  18. package/dist/cjs/types/Sources.d.ts +30 -0
  19. package/dist/cjs/types/Sources.js +18 -0
  20. package/dist/cjs/types/Sources.js.map +7 -0
  21. package/dist/cjs/types/XAdkSender.d.ts +38 -5
  22. package/dist/cjs/types/XAdkSender.js.map +1 -1
  23. package/dist/cjs/types/index.d.ts +1 -0
  24. package/dist/cjs/types/index.js +3 -1
  25. package/dist/cjs/types/index.js.map +2 -2
  26. package/dist/esm/components/Sources/components/CarouselCard.d.ts +12 -0
  27. package/dist/esm/components/Sources/components/CarouselCard.js +107 -0
  28. package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -0
  29. package/dist/esm/components/Sources/index.d.ts +5 -0
  30. package/dist/esm/components/Sources/index.js +127 -0
  31. package/dist/esm/components/Sources/index.js.map +1 -0
  32. package/dist/esm/components/Sources/styles.d.ts +59 -0
  33. package/dist/esm/components/Sources/styles.js +34 -0
  34. package/dist/esm/components/Sources/styles.js.map +1 -0
  35. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +2 -1
  36. package/dist/esm/components/XAdkSender/InlineTagInput.js +32 -2
  37. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  38. package/dist/esm/components/XAdkSender/index.js +96 -26
  39. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  40. package/dist/esm/index.d.ts +3 -0
  41. package/dist/esm/index.js +3 -0
  42. package/dist/esm/index.js.map +1 -1
  43. package/dist/esm/types/Sources.d.ts +30 -0
  44. package/dist/esm/types/Sources.js +2 -0
  45. package/dist/esm/types/Sources.js.map +1 -0
  46. package/dist/esm/types/XAdkSender.d.ts +38 -5
  47. package/dist/esm/types/XAdkSender.js.map +1 -1
  48. package/dist/esm/types/index.d.ts +1 -0
  49. package/dist/esm/types/index.js +1 -0
  50. package/dist/esm/types/index.js.map +1 -1
  51. package/dist/umd/chat-sdk.min.js +1 -1
  52. package/package.json +1 -1
@@ -67,6 +67,35 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
67
67
  });
68
68
  return normalizeText(text);
69
69
  }, []);
70
+
71
+ // 提交时需要保留文本与 tag 的真实顺序;仅靠 value + tags 无法区分 tag 在句首、句中还是句尾。
72
+ var getParts = useCallback(function () {
73
+ var editor = editorRef.current;
74
+ if (!editor) return [];
75
+ var tagMap = new Map(latestTagsRef.current.map(function (tag) {
76
+ return [tag.id, tag];
77
+ }));
78
+ var parts = [];
79
+ editor.childNodes.forEach(function (node) {
80
+ if (node.nodeType === Node.TEXT_NODE) {
81
+ var text = normalizeText(node.textContent || "");
82
+ if (text) parts.push({
83
+ type: "text",
84
+ text: text
85
+ });
86
+ return;
87
+ }
88
+ if (node instanceof HTMLElement && node.hasAttribute(TAG_ATTR)) {
89
+ var tagId = node.dataset.xadkInlineTagId || "";
90
+ var _tag = tagMap.get(tagId);
91
+ if (_tag) parts.push({
92
+ type: "tag",
93
+ tag: _tag
94
+ });
95
+ }
96
+ });
97
+ return parts;
98
+ }, []);
70
99
  var emitChange = useCallback(function () {
71
100
  onChange(getPlainText());
72
101
  onTagsChange(getOrderedTags());
@@ -341,10 +370,11 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
341
370
  return (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 ? void 0 : _editorRef$current.focus();
342
371
  },
343
372
  getText: getPlainText,
373
+ getParts: getParts,
344
374
  getCursorOffset: getOffsetInEditor,
345
375
  insertTag: insertTag
346
376
  };
347
- }, [getOffsetInEditor, getPlainText, insertTag]);
377
+ }, [getOffsetInEditor, getParts, getPlainText, insertTag]);
348
378
  useEffect(function () {
349
379
  var editor = editorRef.current;
350
380
  if (!editor || editor.childNodes.length > 0) return;
@@ -409,10 +439,10 @@ var InlineTagInput = /*#__PURE__*/forwardRef(function (_ref, ref) {
409
439
  };
410
440
  return /*#__PURE__*/_jsx("div", {
411
441
  className: styles.inlineInputWrapper,
412
- "data-placeholder": placeholder,
413
442
  children: /*#__PURE__*/_jsx("div", {
414
443
  ref: editorRef,
415
444
  className: styles.inlineInput,
445
+ "data-placeholder": placeholder,
416
446
  contentEditable: !disabled,
417
447
  suppressContentEditableWarning: true,
418
448
  role: "textbox",
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","createRoot","useStyles","Fragment","_Fragment","jsx","_jsx","TAG_ATTR","CARET_TEXT","createTextNode","text","document","normalizeText","replace","getPlainLength","length","toRawOffset","plainOffset","current","i","InlineTagInput","_ref","ref","value","tags","placeholder","disabled","onChange","onTagsChange","onKeyDown","onKeyUp","renderTag","styles","editorRef","latestTagsRef","tagRootMapRef","WeakMap","composingRef","lastInsertedCaretRef","getOrderedTags","editor","tagMap","Map","map","tag","id","Array","from","querySelectorAll","concat","node","get","dataset","xadkInlineTagId","filter","Boolean","getPlainText","childNodes","forEach","nodeType","Node","TEXT_NODE","textContent","emitChange","removeTextRange","start","end","slice","remove","removeTagNode","_tagRootMapRef$curren","previous","previousSibling","next","nextSibling","unmount","_text$match","caretLength","match","_text$match2","spaceLength","removeTagById","find","item","focus","buildTagNode","span","createElement","setAttribute","className","inlineTag","root","set","render","children","onRemove","label","close","innerHTML","onclick","event","preventDefault","stopPropagation","append","setCursorAtTextEnd","_node$textContent","range","createRange","selection","window","getSelection","setStart","collapse","removeAllRanges","addRange","restoreCursorAfterInsert","contains","isTagNode","HTMLElement","hasAttribute","isOnlyCaretText","getTagBeforeRange","container","startContainer","beforeCursor","startOffset","getTagAfterRange","afterCursor","getOffsetInEditor","rangeCount","getRangeAt","offset","found","visit","getNodeIndex","index","replaceTextRange","insertRange","nodes","nodeStart","plainLength","nodeEnd","rawStart","Math","max","rawEnd","keepLeft","keepRight","parent","parentNode","nodeIndex","cleanupCaretTextNodes","insertTag","_toConsumableArray","tagNode","caretNode","fragment","createDocumentFragment","insertNode","requestAnimationFrame","_editorRef$current","getText","getCursorOffset","appendChild","existingNodes","nextTagMap","existingIds","Set","tagId","has","_tagRootMapRef$curren2","handleInput","handleKeyDown","key","collapsed","targetTag","inlineInputWrapper","inlineInput","contentEditable","suppressContentEditableWarning","role","onInput","onCompositionStart","onCompositionEnd","displayName"],"sources":["../../../../src/components/XAdkSender/InlineTagInput.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport type { InlineTagRenderInfo, InputTag } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InlineTagInputRef {\n focus: () => void;\n getText: () => string;\n getCursorOffset: () => number;\n insertTag: (tag: InputTag, replace?: { start: number; end: number }) => void;\n}\n\nexport interface InlineTagInputProps {\n value: string;\n tags: InputTag[];\n placeholder?: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n onTagsChange: (tags: InputTag[]) => void;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n renderTag?: (tag: InputTag, info: InlineTagRenderInfo) => React.ReactNode;\n}\n\nconst TAG_ATTR = \"data-xadk-inline-tag-id\";\n// contenteditable 无法把光标放进 contenteditable=false 的标签里,需用零宽字符承接“标签后方”的光标。\nconst CARET_TEXT = \"\\u200B\";\n\nconst createTextNode = (text: string) => document.createTextNode(text);\nconst normalizeText = (text: string) =>\n text.replace(/\\u200B/g, \"\").replace(/\\u00a0/g, \" \");\nconst getPlainLength = (text: string) => normalizeText(text).length;\n// DOM 文本里包含零宽光标锚点,快捷键替换和光标定位都要在“用户可见文本 offset”和 DOM raw offset 之间转换。\nconst toRawOffset = (text: string, plainOffset: number) => {\n let current = 0;\n for (let i = 0; i < text.length; i++) {\n if (current >= plainOffset) return i;\n if (text[i] !== CARET_TEXT) current += 1;\n }\n return text.length;\n};\n\nconst InlineTagInput = forwardRef<InlineTagInputRef, InlineTagInputProps>(\n (\n {\n value,\n tags,\n placeholder,\n disabled,\n onChange,\n onTagsChange,\n onKeyDown,\n onKeyUp,\n renderTag,\n },\n ref,\n ) => {\n const styles = useStyles();\n const editorRef = useRef<HTMLDivElement>(null);\n const latestTagsRef = useRef<InputTag[]>(tags);\n const tagRootMapRef = useRef<WeakMap<Element, Root>>(new WeakMap());\n const composingRef = useRef(false);\n const lastInsertedCaretRef = useRef<Text | null>(null);\n\n useEffect(() => {\n latestTagsRef.current = tags;\n }, [tags]);\n\n const getOrderedTags = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return [];\n const tagMap = new Map(latestTagsRef.current.map((tag) => [tag.id, tag]));\n return Array.from(editor.querySelectorAll(`[${TAG_ATTR}]`))\n .map((node) => tagMap.get((node as HTMLElement).dataset.xadkInlineTagId || \"\"))\n .filter(Boolean) as InputTag[];\n }, []);\n\n // 对外只暴露用户输入的纯文本,内部零宽锚点不进入 value。\n const getPlainText = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return \"\";\n let text = \"\";\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || \"\";\n }\n });\n return normalizeText(text);\n }, []);\n\n const emitChange = useCallback(() => {\n onChange(getPlainText());\n onTagsChange(getOrderedTags());\n }, [getOrderedTags, getPlainText, onChange, onTagsChange]);\n\n const removeTextRange = useCallback((node: Text, start: number, end: number) => {\n const text = node.textContent || \"\";\n node.textContent = `${text.slice(0, start)}${text.slice(end)}`;\n if (!node.textContent) node.remove();\n }, []);\n\n const removeTagNode = useCallback(\n (node: Element) => {\n const previous = node.previousSibling;\n const next = node.nextSibling;\n\n tagRootMapRef.current.get(node)?.unmount();\n node.remove();\n\n // 标签后会补一个不可见光标锚点;删除标签时同步清理,避免留下冗余节点。\n if (next?.nodeType === Node.TEXT_NODE) {\n const text = next.textContent || \"\";\n const caretLength = text.match(/^\\u200B+/)?.[0].length || 0;\n if (caretLength > 0) {\n removeTextRange(next as Text, 0, caretLength);\n return;\n }\n }\n\n if (previous?.nodeType === Node.TEXT_NODE) {\n const text = previous.textContent || \"\";\n const spaceLength = text.match(/\\s+$/)?.[0].length || 0;\n if (spaceLength > 0) {\n removeTextRange(previous as Text, text.length - spaceLength, text.length);\n }\n }\n },\n [removeTextRange],\n );\n\n const removeTagById = useCallback(\n (id: string) => {\n const editor = editorRef.current;\n const node = Array.from(editor?.querySelectorAll(`[${TAG_ATTR}]`) || []).find(\n (item) => (item as HTMLElement).dataset.xadkInlineTagId === id,\n );\n if (node) {\n removeTagNode(node);\n }\n emitChange();\n editor?.focus();\n },\n [emitChange, removeTagNode],\n );\n\n // 标签节点本身不可编辑;删除入口通过 onRemove 回到组件内部统一维护 DOM 与 tags。\n const buildTagNode = useCallback(\n (tag: InputTag) => {\n const span = document.createElement(\"span\");\n span.setAttribute(\"contenteditable\", \"false\");\n span.setAttribute(TAG_ATTR, tag.id);\n span.dataset.xadkInlineTagId = tag.id;\n span.className = styles.inlineTag;\n\n if (renderTag) {\n const root = createRoot(span);\n tagRootMapRef.current.set(span, root);\n root.render(\n <>{renderTag(tag, { onRemove: () => removeTagById(tag.id) })}</>,\n );\n } else {\n const label = document.createElement(\"span\");\n label.className = \"xadk-inline-tag-label\";\n label.textContent = tag.label;\n const close = document.createElement(\"span\");\n close.className = \"xadk-inline-tag-close\";\n close.innerHTML = \"×\";\n close.onclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n removeTagById(tag.id);\n };\n span.append(label, close);\n }\n return span;\n },\n [removeTagById, renderTag, styles.inlineTag],\n );\n\n const setCursorAtTextEnd = useCallback((node: Text) => {\n const range = document.createRange();\n const selection = window.getSelection();\n range.setStart(node, node.textContent?.length || 0);\n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }, []);\n\n const restoreCursorAfterInsert = useCallback(\n (node: Text) => {\n const editor = editorRef.current;\n if (!editor || !editor.contains(node)) return;\n editor.focus();\n setCursorAtTextEnd(node);\n },\n [setCursorAtTextEnd],\n );\n\n const isTagNode = (node: Node | null): node is HTMLElement =>\n node instanceof HTMLElement && node.hasAttribute(TAG_ATTR);\n\n const isOnlyCaretText = (text: string) => normalizeText(text) === \"\";\n\n // Backspace/Delete 需要跨过零宽锚点识别相邻标签,不能只看光标所在文本节点。\n const getTagBeforeRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const beforeCursor = text.slice(0, range.startOffset);\n if (isOnlyCaretText(beforeCursor) && isTagNode(container.previousSibling)) {\n return container.previousSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const previous = container.childNodes[range.startOffset - 1];\n if (isTagNode(previous)) return previous;\n if (\n previous?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(previous.textContent || \"\") &&\n isTagNode(previous.previousSibling)\n ) {\n return previous.previousSibling;\n }\n }\n\n return null;\n };\n\n const getTagAfterRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const afterCursor = text.slice(range.startOffset);\n if (isOnlyCaretText(afterCursor) && isTagNode(container.nextSibling)) {\n return container.nextSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const next = container.childNodes[range.startOffset];\n if (isTagNode(next)) return next;\n if (\n next?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(next.textContent || \"\") &&\n isTagNode(next.nextSibling)\n ) {\n return next.nextSibling;\n }\n }\n\n return null;\n };\n\n // 读取光标在纯文本中的位置,供快捷键搜索词和 tag 插入位置复用。\n const getOffsetInEditor = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor || !selection || selection.rangeCount === 0) return 0;\n const range = selection.getRangeAt(0);\n let offset = 0;\n let found = false;\n\n const visit = (node: Node) => {\n if (found) return;\n if (node === range.startContainer) {\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(\n (node.textContent || \"\").slice(0, range.startOffset),\n );\n }\n found = true;\n return;\n }\n if (node instanceof HTMLElement && node.hasAttribute(TAG_ATTR)) return;\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(node.textContent || \"\");\n return;\n }\n node.childNodes.forEach(visit);\n };\n\n editor.childNodes.forEach(visit);\n return offset;\n }, []);\n\n const getNodeIndex = (node: Node) => {\n let index = 0;\n let current = node;\n while (current.previousSibling) {\n index += 1;\n current = current.previousSibling;\n }\n return index;\n };\n\n // 删除快捷键触发片段,例如把 “@文档” 替换成一个结构化 tag,并返回删除位置对应的真实 DOM Range。\n // 注意:纯文本 offset 不包含 tag,标签前后可能都是 offset 0;插入 tag 必须依赖真实 Range,不能再反推 offset。\n const replaceTextRange = useCallback((start: number, end: number) => {\n const editor = editorRef.current;\n if (!editor) return null;\n let offset = 0;\n let insertRange: Range | null = null;\n const nodes = Array.from(editor.childNodes);\n nodes.forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n const nodeStart = offset;\n const plainLength = getPlainLength(text);\n const nodeEnd = offset + plainLength;\n offset = nodeEnd;\n if (nodeEnd <= start || nodeStart >= end) return;\n const rawStart = toRawOffset(text, Math.max(0, start - nodeStart));\n const rawEnd = toRawOffset(text, Math.max(0, end - nodeStart));\n const keepLeft = text.slice(0, rawStart);\n const keepRight = text.slice(rawEnd);\n const parent = node.parentNode;\n const nodeIndex = getNodeIndex(node);\n\n node.textContent = `${keepLeft}${keepRight}`;\n if (!insertRange) {\n insertRange = document.createRange();\n if (node.textContent) {\n insertRange.setStart(node, rawStart);\n } else if (parent) {\n insertRange.setStart(parent, nodeIndex);\n }\n insertRange.collapse(true);\n }\n if (!node.textContent) node.remove();\n });\n\n return insertRange;\n }, []);\n\n // 浏览器拆分 Range 后可能留下空文本节点;清理后才能保证后续 tag 继续 append 在队尾。\n const cleanupCaretTextNodes = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n Array.from(editor.childNodes).forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n if (!text) {\n node.remove();\n return;\n }\n if (text && normalizeText(text) === \"\") {\n node.textContent = CARET_TEXT;\n }\n });\n }, []);\n\n const insertTag = useCallback(\n (tag: InputTag, replace?: { start: number; end: number }) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.focus();\n latestTagsRef.current = [\n ...latestTagsRef.current.filter((item) => item.id !== tag.id),\n tag,\n ];\n let insertRange: Range | null = null;\n if (replace) {\n insertRange = replaceTextRange(replace.start, replace.end);\n cleanupCaretTextNodes();\n }\n const tagNode = buildTagNode(tag);\n const caretNode = createTextNode(CARET_TEXT);\n const selection = window.getSelection();\n const range =\n insertRange || (selection?.rangeCount ? selection.getRangeAt(0) : null);\n if (range && editor.contains(range.startContainer)) {\n // 用 DocumentFragment 一次性插入,避免连续 insertNode 导致 tag/caret 顺序被浏览器 Range 状态打乱。\n const fragment = document.createDocumentFragment();\n fragment.append(tagNode, caretNode);\n range.insertNode(fragment);\n } else {\n editor.append(tagNode, caretNode);\n }\n cleanupCaretTextNodes();\n lastInsertedCaretRef.current = caretNode;\n setCursorAtTextEnd(caretNode);\n emitChange();\n\n // 关闭快捷列表和父组件同步 tags/value 会触发一次 React 更新;\n // 下一帧再恢复到刚插入 tag 后的零宽锚点,避免光标被 focus 或重渲染带回旧位置。\n window.requestAnimationFrame(() => {\n if (lastInsertedCaretRef.current === caretNode) {\n restoreCursorAfterInsert(caretNode);\n }\n });\n },\n [\n buildTagNode,\n cleanupCaretTextNodes,\n emitChange,\n replaceTextRange,\n restoreCursorAfterInsert,\n setCursorAtTextEnd,\n ],\n );\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getText: getPlainText,\n getCursorOffset: getOffsetInEditor,\n insertTag,\n }), [getOffsetInEditor, getPlainText, insertTag]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || editor.childNodes.length > 0) return;\n if (value) editor.appendChild(createTextNode(value));\n tags.forEach((tag) => editor.append(buildTagNode(tag), createTextNode(CARET_TEXT)));\n }, []);\n\n // 外部受控 tags 变化时,同步补齐或删除 DOM 中的 tag 节点。\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const existingNodes = Array.from(editor.querySelectorAll(`[${TAG_ATTR}]`));\n const nextTagMap = new Map(tags.map((tag) => [tag.id, tag]));\n const existingIds = new Set(\n existingNodes.map((node) => (node as HTMLElement).dataset.xadkInlineTagId || \"\"),\n );\n\n existingNodes.forEach((node) => {\n const tagId = (node as HTMLElement).dataset.xadkInlineTagId || \"\";\n if (!nextTagMap.has(tagId)) {\n removeTagNode(node);\n }\n });\n\n tags.forEach((tag) => {\n if (existingIds.has(tag.id)) return;\n editor.append(buildTagNode(tag), createTextNode(CARET_TEXT));\n });\n }, [buildTagNode, removeTagNode, tags]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!value && tags.length === 0 && editor.childNodes.length > 0) {\n editor.querySelectorAll(`[${TAG_ATTR}]`).forEach((node) => {\n tagRootMapRef.current.get(node)?.unmount();\n });\n editor.innerHTML = \"\";\n }\n }, [tags.length, value]);\n\n const handleInput = () => {\n if (!composingRef.current) emitChange();\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event) => {\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n const selection = window.getSelection();\n if (selection?.rangeCount) {\n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n const targetTag =\n event.key === \"Backspace\"\n ? getTagBeforeRange(range)\n : getTagAfterRange(range);\n\n if (targetTag) {\n event.preventDefault();\n removeTagById(targetTag.dataset.xadkInlineTagId || \"\");\n return;\n }\n }\n }\n }\n onKeyDown?.(event);\n };\n\n return (\n <div className={styles.inlineInputWrapper} data-placeholder={placeholder}>\n <div\n ref={editorRef}\n className={styles.inlineInput}\n contentEditable={!disabled}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onKeyUp={onKeyUp}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={() => {\n composingRef.current = false;\n emitChange();\n }}\n data-empty={!getPlainText() && getOrderedTags().length === 0}\n data-cursor-offset={getOffsetInEditor()}\n />\n </div>\n );\n },\n);\n\nInlineTagInput.displayName = \"InlineTagInput\";\n\nexport default InlineTagInput;\n"],"mappings":";AAAA,OAAOA,KAAK,IACVC,UAAU,EACVC,WAAW,EACXC,SAAS,EACTC,mBAAmB,EACnBC,MAAM,QACD,OAAO;AACd,SAASC,UAAU,QAAmB,kBAAkB;AAExD,SAASC,SAAS;AAAmB,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAqBrC,IAAMC,QAAQ,GAAG,yBAAyB;AAC1C;AACA,IAAMC,UAAU,GAAG,QAAQ;AAE3B,IAAMC,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,IAAY;EAAA,OAAKC,QAAQ,CAACF,cAAc,CAACC,IAAI,CAAC;AAAA;AACtE,IAAME,aAAa,GAAG,SAAhBA,aAAaA,CAAIF,IAAY;EAAA,OACjCA,IAAI,CAACG,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AAAA;AACrD,IAAMC,cAAc,GAAG,SAAjBA,cAAcA,CAAIJ,IAAY;EAAA,OAAKE,aAAa,CAACF,IAAI,CAAC,CAACK,MAAM;AAAA;AACnE;AACA,IAAMC,WAAW,GAAG,SAAdA,WAAWA,CAAIN,IAAY,EAAEO,WAAmB,EAAK;EACzD,IAAIC,OAAO,GAAG,CAAC;EACf,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGT,IAAI,CAACK,MAAM,EAAEI,CAAC,EAAE,EAAE;IACpC,IAAID,OAAO,IAAID,WAAW,EAAE,OAAOE,CAAC;IACpC,IAAIT,IAAI,CAACS,CAAC,CAAC,KAAKX,UAAU,EAAEU,OAAO,IAAI,CAAC;EAC1C;EACA,OAAOR,IAAI,CAACK,MAAM;AACpB,CAAC;AAED,IAAMK,cAAc,gBAAGxB,UAAU,CAC/B,UAAAyB,IAAA,EAYEC,GAAG,EACA;EAAA,IAXDC,KAAK,GAAAF,IAAA,CAALE,KAAK;IACLC,IAAI,GAAAH,IAAA,CAAJG,IAAI;IACJC,WAAW,GAAAJ,IAAA,CAAXI,WAAW;IACXC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IACRC,QAAQ,GAAAN,IAAA,CAARM,QAAQ;IACRC,YAAY,GAAAP,IAAA,CAAZO,YAAY;IACZC,SAAS,GAAAR,IAAA,CAATQ,SAAS;IACTC,OAAO,GAAAT,IAAA,CAAPS,OAAO;IACPC,SAAS,GAAAV,IAAA,CAATU,SAAS;EAIX,IAAMC,MAAM,GAAG9B,SAAS,CAAC,CAAC;EAC1B,IAAM+B,SAAS,GAAGjC,MAAM,CAAiB,IAAI,CAAC;EAC9C,IAAMkC,aAAa,GAAGlC,MAAM,CAAawB,IAAI,CAAC;EAC9C,IAAMW,aAAa,GAAGnC,MAAM,CAAyB,IAAIoC,OAAO,CAAC,CAAC,CAAC;EACnE,IAAMC,YAAY,GAAGrC,MAAM,CAAC,KAAK,CAAC;EAClC,IAAMsC,oBAAoB,GAAGtC,MAAM,CAAc,IAAI,CAAC;EAEtDF,SAAS,CAAC,YAAM;IACdoC,aAAa,CAAChB,OAAO,GAAGM,IAAI;EAC9B,CAAC,EAAE,CAACA,IAAI,CAAC,CAAC;EAEV,IAAMe,cAAc,GAAG1C,WAAW,CAAC,YAAM;IACvC,IAAM2C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE,OAAO,EAAE;IACtB,IAAMC,MAAM,GAAG,IAAIC,GAAG,CAACR,aAAa,CAAChB,OAAO,CAACyB,GAAG,CAAC,UAACC,GAAG;MAAA,OAAK,CAACA,GAAG,CAACC,EAAE,EAAED,GAAG,CAAC;IAAA,EAAC,CAAC;IACzE,OAAOE,KAAK,CAACC,IAAI,CAACP,MAAM,CAACQ,gBAAgB,KAAAC,MAAA,CAAK1C,QAAQ,MAAG,CAAC,CAAC,CACxDoC,GAAG,CAAC,UAACO,IAAI;MAAA,OAAKT,MAAM,CAACU,GAAG,CAAED,IAAI,CAAiBE,OAAO,CAACC,eAAe,IAAI,EAAE,CAAC;IAAA,EAAC,CAC9EC,MAAM,CAACC,OAAO,CAAC;EACpB,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,IAAMC,YAAY,GAAG3D,WAAW,CAAC,YAAM;IACrC,IAAM2C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE,OAAO,EAAE;IACtB,IAAI9B,IAAI,GAAG,EAAE;IACb8B,MAAM,CAACiB,UAAU,CAACC,OAAO,CAAC,UAACR,IAAI,EAAK;MAClC,IAAIA,IAAI,CAACS,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;QACpCnD,IAAI,IAAIwC,IAAI,CAACY,WAAW,IAAI,EAAE;MAChC;IACF,CAAC,CAAC;IACF,OAAOlD,aAAa,CAACF,IAAI,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMqD,UAAU,GAAGlE,WAAW,CAAC,YAAM;IACnC8B,QAAQ,CAAC6B,YAAY,CAAC,CAAC,CAAC;IACxB5B,YAAY,CAACW,cAAc,CAAC,CAAC,CAAC;EAChC,CAAC,EAAE,CAACA,cAAc,EAAEiB,YAAY,EAAE7B,QAAQ,EAAEC,YAAY,CAAC,CAAC;EAE1D,IAAMoC,eAAe,GAAGnE,WAAW,CAAC,UAACqD,IAAU,EAAEe,KAAa,EAAEC,GAAW,EAAK;IAC9E,IAAMxD,IAAI,GAAGwC,IAAI,CAACY,WAAW,IAAI,EAAE;IACnCZ,IAAI,CAACY,WAAW,MAAAb,MAAA,CAAMvC,IAAI,CAACyD,KAAK,CAAC,CAAC,EAAEF,KAAK,CAAC,EAAAhB,MAAA,CAAGvC,IAAI,CAACyD,KAAK,CAACD,GAAG,CAAC,CAAE;IAC9D,IAAI,CAAChB,IAAI,CAACY,WAAW,EAAEZ,IAAI,CAACkB,MAAM,CAAC,CAAC;EACtC,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMC,aAAa,GAAGxE,WAAW,CAC/B,UAACqD,IAAa,EAAK;IAAA,IAAAoB,qBAAA;IACjB,IAAMC,QAAQ,GAAGrB,IAAI,CAACsB,eAAe;IACrC,IAAMC,IAAI,GAAGvB,IAAI,CAACwB,WAAW;IAE7B,CAAAJ,qBAAA,GAAAnC,aAAa,CAACjB,OAAO,CAACiC,GAAG,CAACD,IAAI,CAAC,cAAAoB,qBAAA,eAA/BA,qBAAA,CAAiCK,OAAO,CAAC,CAAC;IAC1CzB,IAAI,CAACkB,MAAM,CAAC,CAAC;;IAEb;IACA,IAAI,CAAAK,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEd,QAAQ,MAAKC,IAAI,CAACC,SAAS,EAAE;MAAA,IAAAe,WAAA;MACrC,IAAMlE,IAAI,GAAG+D,IAAI,CAACX,WAAW,IAAI,EAAE;MACnC,IAAMe,WAAW,GAAG,EAAAD,WAAA,GAAAlE,IAAI,CAACoE,KAAK,CAAC,UAAU,CAAC,cAAAF,WAAA,uBAAtBA,WAAA,CAAyB,CAAC,CAAC,CAAC7D,MAAM,KAAI,CAAC;MAC3D,IAAI8D,WAAW,GAAG,CAAC,EAAE;QACnBb,eAAe,CAACS,IAAI,EAAU,CAAC,EAAEI,WAAW,CAAC;QAC7C;MACF;IACF;IAEA,IAAI,CAAAN,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEZ,QAAQ,MAAKC,IAAI,CAACC,SAAS,EAAE;MAAA,IAAAkB,YAAA;MACzC,IAAMrE,KAAI,GAAG6D,QAAQ,CAACT,WAAW,IAAI,EAAE;MACvC,IAAMkB,WAAW,GAAG,EAAAD,YAAA,GAAArE,KAAI,CAACoE,KAAK,CAAC,MAAM,CAAC,cAAAC,YAAA,uBAAlBA,YAAA,CAAqB,CAAC,CAAC,CAAChE,MAAM,KAAI,CAAC;MACvD,IAAIiE,WAAW,GAAG,CAAC,EAAE;QACnBhB,eAAe,CAACO,QAAQ,EAAU7D,KAAI,CAACK,MAAM,GAAGiE,WAAW,EAAEtE,KAAI,CAACK,MAAM,CAAC;MAC3E;IACF;EACF,CAAC,EACD,CAACiD,eAAe,CAClB,CAAC;EAED,IAAMiB,aAAa,GAAGpF,WAAW,CAC/B,UAACgD,EAAU,EAAK;IACd,IAAML,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAMgC,IAAI,GAAGJ,KAAK,CAACC,IAAI,CAAC,CAAAP,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEQ,gBAAgB,KAAAC,MAAA,CAAK1C,QAAQ,MAAG,CAAC,KAAI,EAAE,CAAC,CAAC2E,IAAI,CAC3E,UAACC,IAAI;MAAA,OAAMA,IAAI,CAAiB/B,OAAO,CAACC,eAAe,KAAKR,EAAE;IAAA,CAChE,CAAC;IACD,IAAIK,IAAI,EAAE;MACRmB,aAAa,CAACnB,IAAI,CAAC;IACrB;IACAa,UAAU,CAAC,CAAC;IACZvB,MAAM,aAANA,MAAM,eAANA,MAAM,CAAE4C,KAAK,CAAC,CAAC;EACjB,CAAC,EACD,CAACrB,UAAU,EAAEM,aAAa,CAC5B,CAAC;;EAED;EACA,IAAMgB,YAAY,GAAGxF,WAAW,CAC9B,UAAC+C,GAAa,EAAK;IACjB,IAAM0C,IAAI,GAAG3E,QAAQ,CAAC4E,aAAa,CAAC,MAAM,CAAC;IAC3CD,IAAI,CAACE,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC;IAC7CF,IAAI,CAACE,YAAY,CAACjF,QAAQ,EAAEqC,GAAG,CAACC,EAAE,CAAC;IACnCyC,IAAI,CAAClC,OAAO,CAACC,eAAe,GAAGT,GAAG,CAACC,EAAE;IACrCyC,IAAI,CAACG,SAAS,GAAGzD,MAAM,CAAC0D,SAAS;IAEjC,IAAI3D,SAAS,EAAE;MACb,IAAM4D,IAAI,GAAG1F,UAAU,CAACqF,IAAI,CAAC;MAC7BnD,aAAa,CAACjB,OAAO,CAAC0E,GAAG,CAACN,IAAI,EAAEK,IAAI,CAAC;MACrCA,IAAI,CAACE,MAAM,eACTvF,IAAA,CAAAF,SAAA;QAAA0F,QAAA,EAAG/D,SAAS,CAACa,GAAG,EAAE;UAAEmD,QAAQ,EAAE,SAAAA,SAAA;YAAA,OAAMd,aAAa,CAACrC,GAAG,CAACC,EAAE,CAAC;UAAA;QAAC,CAAC;MAAC,CAAG,CACjE,CAAC;IACH,CAAC,MAAM;MACL,IAAMmD,KAAK,GAAGrF,QAAQ,CAAC4E,aAAa,CAAC,MAAM,CAAC;MAC5CS,KAAK,CAACP,SAAS,GAAG,uBAAuB;MACzCO,KAAK,CAAClC,WAAW,GAAGlB,GAAG,CAACoD,KAAK;MAC7B,IAAMC,KAAK,GAAGtF,QAAQ,CAAC4E,aAAa,CAAC,MAAM,CAAC;MAC5CU,KAAK,CAACR,SAAS,GAAG,uBAAuB;MACzCQ,KAAK,CAACC,SAAS,GAAG,GAAG;MACrBD,KAAK,CAACE,OAAO,GAAG,UAACC,KAAK,EAAK;QACzBA,KAAK,CAACC,cAAc,CAAC,CAAC;QACtBD,KAAK,CAACE,eAAe,CAAC,CAAC;QACvBrB,aAAa,CAACrC,GAAG,CAACC,EAAE,CAAC;MACvB,CAAC;MACDyC,IAAI,CAACiB,MAAM,CAACP,KAAK,EAAEC,KAAK,CAAC;IAC3B;IACA,OAAOX,IAAI;EACb,CAAC,EACD,CAACL,aAAa,EAAElD,SAAS,EAAEC,MAAM,CAAC0D,SAAS,CAC7C,CAAC;EAED,IAAMc,kBAAkB,GAAG3G,WAAW,CAAC,UAACqD,IAAU,EAAK;IAAA,IAAAuD,iBAAA;IACrD,IAAMC,KAAK,GAAG/F,QAAQ,CAACgG,WAAW,CAAC,CAAC;IACpC,IAAMC,SAAS,GAAGC,MAAM,CAACC,YAAY,CAAC,CAAC;IACvCJ,KAAK,CAACK,QAAQ,CAAC7D,IAAI,EAAE,EAAAuD,iBAAA,GAAAvD,IAAI,CAACY,WAAW,cAAA2C,iBAAA,uBAAhBA,iBAAA,CAAkB1F,MAAM,KAAI,CAAC,CAAC;IACnD2F,KAAK,CAACM,QAAQ,CAAC,IAAI,CAAC;IACpBJ,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEK,eAAe,CAAC,CAAC;IAC5BL,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEM,QAAQ,CAACR,KAAK,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMS,wBAAwB,GAAGtH,WAAW,CAC1C,UAACqD,IAAU,EAAK;IACd,IAAMV,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,IAAI,CAACA,MAAM,CAAC4E,QAAQ,CAAClE,IAAI,CAAC,EAAE;IACvCV,MAAM,CAAC4C,KAAK,CAAC,CAAC;IACdoB,kBAAkB,CAACtD,IAAI,CAAC;EAC1B,CAAC,EACD,CAACsD,kBAAkB,CACrB,CAAC;EAED,IAAMa,SAAS,GAAG,SAAZA,SAASA,CAAInE,IAAiB;IAAA,OAClCA,IAAI,YAAYoE,WAAW,IAAIpE,IAAI,CAACqE,YAAY,CAAChH,QAAQ,CAAC;EAAA;EAE5D,IAAMiH,eAAe,GAAG,SAAlBA,eAAeA,CAAI9G,IAAY;IAAA,OAAKE,aAAa,CAACF,IAAI,CAAC,KAAK,EAAE;EAAA;;EAEpE;EACA,IAAM+G,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAIf,KAAY,EAAK;IAC1C,IAAMgB,SAAS,GAAGhB,KAAK,CAACiB,cAAc;IACtC,IAAID,SAAS,CAAC/D,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;MACzC,IAAMnD,IAAI,GAAGgH,SAAS,CAAC5D,WAAW,IAAI,EAAE;MACxC,IAAM8D,YAAY,GAAGlH,IAAI,CAACyD,KAAK,CAAC,CAAC,EAAEuC,KAAK,CAACmB,WAAW,CAAC;MACrD,IAAIL,eAAe,CAACI,YAAY,CAAC,IAAIP,SAAS,CAACK,SAAS,CAAClD,eAAe,CAAC,EAAE;QACzE,OAAOkD,SAAS,CAAClD,eAAe;MAClC;IACF;IAEA,IAAIkD,SAAS,YAAYJ,WAAW,EAAE;MACpC,IAAM/C,QAAQ,GAAGmD,SAAS,CAACjE,UAAU,CAACiD,KAAK,CAACmB,WAAW,GAAG,CAAC,CAAC;MAC5D,IAAIR,SAAS,CAAC9C,QAAQ,CAAC,EAAE,OAAOA,QAAQ;MACxC,IACE,CAAAA,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEZ,QAAQ,MAAKC,IAAI,CAACC,SAAS,IACrC2D,eAAe,CAACjD,QAAQ,CAACT,WAAW,IAAI,EAAE,CAAC,IAC3CuD,SAAS,CAAC9C,QAAQ,CAACC,eAAe,CAAC,EACnC;QACA,OAAOD,QAAQ,CAACC,eAAe;MACjC;IACF;IAEA,OAAO,IAAI;EACb,CAAC;EAED,IAAMsD,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIpB,KAAY,EAAK;IACzC,IAAMgB,SAAS,GAAGhB,KAAK,CAACiB,cAAc;IACtC,IAAID,SAAS,CAAC/D,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;MACzC,IAAMnD,IAAI,GAAGgH,SAAS,CAAC5D,WAAW,IAAI,EAAE;MACxC,IAAMiE,WAAW,GAAGrH,IAAI,CAACyD,KAAK,CAACuC,KAAK,CAACmB,WAAW,CAAC;MACjD,IAAIL,eAAe,CAACO,WAAW,CAAC,IAAIV,SAAS,CAACK,SAAS,CAAChD,WAAW,CAAC,EAAE;QACpE,OAAOgD,SAAS,CAAChD,WAAW;MAC9B;IACF;IAEA,IAAIgD,SAAS,YAAYJ,WAAW,EAAE;MACpC,IAAM7C,IAAI,GAAGiD,SAAS,CAACjE,UAAU,CAACiD,KAAK,CAACmB,WAAW,CAAC;MACpD,IAAIR,SAAS,CAAC5C,IAAI,CAAC,EAAE,OAAOA,IAAI;MAChC,IACE,CAAAA,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEd,QAAQ,MAAKC,IAAI,CAACC,SAAS,IACjC2D,eAAe,CAAC/C,IAAI,CAACX,WAAW,IAAI,EAAE,CAAC,IACvCuD,SAAS,CAAC5C,IAAI,CAACC,WAAW,CAAC,EAC3B;QACA,OAAOD,IAAI,CAACC,WAAW;MACzB;IACF;IAEA,OAAO,IAAI;EACb,CAAC;;EAED;EACA,IAAMsD,iBAAiB,GAAGnI,WAAW,CAAC,YAAM;IAC1C,IAAM2C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAM0F,SAAS,GAAGC,MAAM,CAACC,YAAY,CAAC,CAAC;IACvC,IAAI,CAACtE,MAAM,IAAI,CAACoE,SAAS,IAAIA,SAAS,CAACqB,UAAU,KAAK,CAAC,EAAE,OAAO,CAAC;IACjE,IAAMvB,KAAK,GAAGE,SAAS,CAACsB,UAAU,CAAC,CAAC,CAAC;IACrC,IAAIC,MAAM,GAAG,CAAC;IACd,IAAIC,KAAK,GAAG,KAAK;IAEjB,IAAMC,KAAK,GAAG,SAARA,KAAKA,CAAInF,IAAU,EAAK;MAC5B,IAAIkF,KAAK,EAAE;MACX,IAAIlF,IAAI,KAAKwD,KAAK,CAACiB,cAAc,EAAE;QACjC,IAAIzE,IAAI,CAACS,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;UACpCsE,MAAM,IAAIrH,cAAc,CACtB,CAACoC,IAAI,CAACY,WAAW,IAAI,EAAE,EAAEK,KAAK,CAAC,CAAC,EAAEuC,KAAK,CAACmB,WAAW,CACrD,CAAC;QACH;QACAO,KAAK,GAAG,IAAI;QACZ;MACF;MACA,IAAIlF,IAAI,YAAYoE,WAAW,IAAIpE,IAAI,CAACqE,YAAY,CAAChH,QAAQ,CAAC,EAAE;MAChE,IAAI2C,IAAI,CAACS,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;QACpCsE,MAAM,IAAIrH,cAAc,CAACoC,IAAI,CAACY,WAAW,IAAI,EAAE,CAAC;QAChD;MACF;MACAZ,IAAI,CAACO,UAAU,CAACC,OAAO,CAAC2E,KAAK,CAAC;IAChC,CAAC;IAED7F,MAAM,CAACiB,UAAU,CAACC,OAAO,CAAC2E,KAAK,CAAC;IAChC,OAAOF,MAAM;EACf,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMG,YAAY,GAAG,SAAfA,YAAYA,CAAIpF,IAAU,EAAK;IACnC,IAAIqF,KAAK,GAAG,CAAC;IACb,IAAIrH,OAAO,GAAGgC,IAAI;IAClB,OAAOhC,OAAO,CAACsD,eAAe,EAAE;MAC9B+D,KAAK,IAAI,CAAC;MACVrH,OAAO,GAAGA,OAAO,CAACsD,eAAe;IACnC;IACA,OAAO+D,KAAK;EACd,CAAC;;EAED;EACA;EACA,IAAMC,gBAAgB,GAAG3I,WAAW,CAAC,UAACoE,KAAa,EAAEC,GAAW,EAAK;IACnE,IAAM1B,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE,OAAO,IAAI;IACxB,IAAI2F,MAAM,GAAG,CAAC;IACd,IAAIM,WAAyB,GAAG,IAAI;IACpC,IAAMC,KAAK,GAAG5F,KAAK,CAACC,IAAI,CAACP,MAAM,CAACiB,UAAU,CAAC;IAC3CiF,KAAK,CAAChF,OAAO,CAAC,UAACR,IAAI,EAAK;MACtB,IAAIA,IAAI,CAACS,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;MACtC,IAAMnD,IAAI,GAAGwC,IAAI,CAACY,WAAW,IAAI,EAAE;MACnC,IAAM6E,SAAS,GAAGR,MAAM;MACxB,IAAMS,WAAW,GAAG9H,cAAc,CAACJ,IAAI,CAAC;MACxC,IAAMmI,OAAO,GAAGV,MAAM,GAAGS,WAAW;MACpCT,MAAM,GAAGU,OAAO;MAChB,IAAIA,OAAO,IAAI5E,KAAK,IAAI0E,SAAS,IAAIzE,GAAG,EAAE;MAC1C,IAAM4E,QAAQ,GAAG9H,WAAW,CAACN,IAAI,EAAEqI,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE/E,KAAK,GAAG0E,SAAS,CAAC,CAAC;MAClE,IAAMM,MAAM,GAAGjI,WAAW,CAACN,IAAI,EAAEqI,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE9E,GAAG,GAAGyE,SAAS,CAAC,CAAC;MAC9D,IAAMO,QAAQ,GAAGxI,IAAI,CAACyD,KAAK,CAAC,CAAC,EAAE2E,QAAQ,CAAC;MACxC,IAAMK,SAAS,GAAGzI,IAAI,CAACyD,KAAK,CAAC8E,MAAM,CAAC;MACpC,IAAMG,MAAM,GAAGlG,IAAI,CAACmG,UAAU;MAC9B,IAAMC,SAAS,GAAGhB,YAAY,CAACpF,IAAI,CAAC;MAEpCA,IAAI,CAACY,WAAW,MAAAb,MAAA,CAAMiG,QAAQ,EAAAjG,MAAA,CAAGkG,SAAS,CAAE;MAC5C,IAAI,CAACV,WAAW,EAAE;QAChBA,WAAW,GAAG9H,QAAQ,CAACgG,WAAW,CAAC,CAAC;QACpC,IAAIzD,IAAI,CAACY,WAAW,EAAE;UACpB2E,WAAW,CAAC1B,QAAQ,CAAC7D,IAAI,EAAE4F,QAAQ,CAAC;QACtC,CAAC,MAAM,IAAIM,MAAM,EAAE;UACjBX,WAAW,CAAC1B,QAAQ,CAACqC,MAAM,EAAEE,SAAS,CAAC;QACzC;QACAb,WAAW,CAACzB,QAAQ,CAAC,IAAI,CAAC;MAC5B;MACA,IAAI,CAAC9D,IAAI,CAACY,WAAW,EAAEZ,IAAI,CAACkB,MAAM,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,OAAOqE,WAAW;EACpB,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA,IAAMc,qBAAqB,GAAG1J,WAAW,CAAC,YAAM;IAC9C,IAAM2C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE;IACbM,KAAK,CAACC,IAAI,CAACP,MAAM,CAACiB,UAAU,CAAC,CAACC,OAAO,CAAC,UAACR,IAAI,EAAK;MAC9C,IAAIA,IAAI,CAACS,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;MACtC,IAAMnD,IAAI,GAAGwC,IAAI,CAACY,WAAW,IAAI,EAAE;MACnC,IAAI,CAACpD,IAAI,EAAE;QACTwC,IAAI,CAACkB,MAAM,CAAC,CAAC;QACb;MACF;MACA,IAAI1D,IAAI,IAAIE,aAAa,CAACF,IAAI,CAAC,KAAK,EAAE,EAAE;QACtCwC,IAAI,CAACY,WAAW,GAAGtD,UAAU;MAC/B;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMgJ,SAAS,GAAG3J,WAAW,CAC3B,UAAC+C,GAAa,EAAE/B,OAAwC,EAAK;IAC3D,IAAM2B,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE;IACbA,MAAM,CAAC4C,KAAK,CAAC,CAAC;IACdlD,aAAa,CAAChB,OAAO,MAAA+B,MAAA,CAAAwG,kBAAA,CAChBvH,aAAa,CAAChB,OAAO,CAACoC,MAAM,CAAC,UAAC6B,IAAI;MAAA,OAAKA,IAAI,CAACtC,EAAE,KAAKD,GAAG,CAACC,EAAE;IAAA,EAAC,IAC7DD,GAAG,EACJ;IACD,IAAI6F,WAAyB,GAAG,IAAI;IACpC,IAAI5H,OAAO,EAAE;MACX4H,WAAW,GAAGD,gBAAgB,CAAC3H,OAAO,CAACoD,KAAK,EAAEpD,OAAO,CAACqD,GAAG,CAAC;MAC1DqF,qBAAqB,CAAC,CAAC;IACzB;IACA,IAAMG,OAAO,GAAGrE,YAAY,CAACzC,GAAG,CAAC;IACjC,IAAM+G,SAAS,GAAGlJ,cAAc,CAACD,UAAU,CAAC;IAC5C,IAAMoG,SAAS,GAAGC,MAAM,CAACC,YAAY,CAAC,CAAC;IACvC,IAAMJ,KAAK,GACT+B,WAAW,KAAK7B,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEqB,UAAU,GAAGrB,SAAS,CAACsB,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACzE,IAAIxB,KAAK,IAAIlE,MAAM,CAAC4E,QAAQ,CAACV,KAAK,CAACiB,cAAc,CAAC,EAAE;MAClD;MACA,IAAMiC,QAAQ,GAAGjJ,QAAQ,CAACkJ,sBAAsB,CAAC,CAAC;MAClDD,QAAQ,CAACrD,MAAM,CAACmD,OAAO,EAAEC,SAAS,CAAC;MACnCjD,KAAK,CAACoD,UAAU,CAACF,QAAQ,CAAC;IAC5B,CAAC,MAAM;MACLpH,MAAM,CAAC+D,MAAM,CAACmD,OAAO,EAAEC,SAAS,CAAC;IACnC;IACAJ,qBAAqB,CAAC,CAAC;IACvBjH,oBAAoB,CAACpB,OAAO,GAAGyI,SAAS;IACxCnD,kBAAkB,CAACmD,SAAS,CAAC;IAC7B5F,UAAU,CAAC,CAAC;;IAEZ;IACA;IACA8C,MAAM,CAACkD,qBAAqB,CAAC,YAAM;MACjC,IAAIzH,oBAAoB,CAACpB,OAAO,KAAKyI,SAAS,EAAE;QAC9CxC,wBAAwB,CAACwC,SAAS,CAAC;MACrC;IACF,CAAC,CAAC;EACJ,CAAC,EACD,CACEtE,YAAY,EACZkE,qBAAqB,EACrBxF,UAAU,EACVyE,gBAAgB,EAChBrB,wBAAwB,EACxBX,kBAAkB,CAEtB,CAAC;EAEDzG,mBAAmB,CAACuB,GAAG,EAAE;IAAA,OAAO;MAC9B8D,KAAK,EAAE,SAAAA,MAAA;QAAA,IAAA4E,kBAAA;QAAA,QAAAA,kBAAA,GAAM/H,SAAS,CAACf,OAAO,cAAA8I,kBAAA,uBAAjBA,kBAAA,CAAmB5E,KAAK,CAAC,CAAC;MAAA;MACvC6E,OAAO,EAAEzG,YAAY;MACrB0G,eAAe,EAAElC,iBAAiB;MAClCwB,SAAS,EAATA;IACF,CAAC;EAAA,CAAC,EAAE,CAACxB,iBAAiB,EAAExE,YAAY,EAAEgG,SAAS,CAAC,CAAC;EAEjD1J,SAAS,CAAC,YAAM;IACd,IAAM0C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,IAAIA,MAAM,CAACiB,UAAU,CAAC1C,MAAM,GAAG,CAAC,EAAE;IAC7C,IAAIQ,KAAK,EAAEiB,MAAM,CAAC2H,WAAW,CAAC1J,cAAc,CAACc,KAAK,CAAC,CAAC;IACpDC,IAAI,CAACkC,OAAO,CAAC,UAACd,GAAG;MAAA,OAAKJ,MAAM,CAAC+D,MAAM,CAAClB,YAAY,CAACzC,GAAG,CAAC,EAAEnC,cAAc,CAACD,UAAU,CAAC,CAAC;IAAA,EAAC;EACrF,CAAC,EAAE,EAAE,CAAC;;EAEN;EACAV,SAAS,CAAC,YAAM;IACd,IAAM0C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE;IACb,IAAM4H,aAAa,GAAGtH,KAAK,CAACC,IAAI,CAACP,MAAM,CAACQ,gBAAgB,KAAAC,MAAA,CAAK1C,QAAQ,MAAG,CAAC,CAAC;IAC1E,IAAM8J,UAAU,GAAG,IAAI3H,GAAG,CAAClB,IAAI,CAACmB,GAAG,CAAC,UAACC,GAAG;MAAA,OAAK,CAACA,GAAG,CAACC,EAAE,EAAED,GAAG,CAAC;IAAA,EAAC,CAAC;IAC5D,IAAM0H,WAAW,GAAG,IAAIC,GAAG,CACzBH,aAAa,CAACzH,GAAG,CAAC,UAACO,IAAI;MAAA,OAAMA,IAAI,CAAiBE,OAAO,CAACC,eAAe,IAAI,EAAE;IAAA,EACjF,CAAC;IAED+G,aAAa,CAAC1G,OAAO,CAAC,UAACR,IAAI,EAAK;MAC9B,IAAMsH,KAAK,GAAItH,IAAI,CAAiBE,OAAO,CAACC,eAAe,IAAI,EAAE;MACjE,IAAI,CAACgH,UAAU,CAACI,GAAG,CAACD,KAAK,CAAC,EAAE;QAC1BnG,aAAa,CAACnB,IAAI,CAAC;MACrB;IACF,CAAC,CAAC;IAEF1B,IAAI,CAACkC,OAAO,CAAC,UAACd,GAAG,EAAK;MACpB,IAAI0H,WAAW,CAACG,GAAG,CAAC7H,GAAG,CAACC,EAAE,CAAC,EAAE;MAC7BL,MAAM,CAAC+D,MAAM,CAAClB,YAAY,CAACzC,GAAG,CAAC,EAAEnC,cAAc,CAACD,UAAU,CAAC,CAAC;IAC9D,CAAC,CAAC;EACJ,CAAC,EAAE,CAAC6E,YAAY,EAAEhB,aAAa,EAAE7C,IAAI,CAAC,CAAC;EAEvC1B,SAAS,CAAC,YAAM;IACd,IAAM0C,MAAM,GAAGP,SAAS,CAACf,OAAO;IAChC,IAAI,CAACsB,MAAM,EAAE;IACb,IAAI,CAACjB,KAAK,IAAIC,IAAI,CAACT,MAAM,KAAK,CAAC,IAAIyB,MAAM,CAACiB,UAAU,CAAC1C,MAAM,GAAG,CAAC,EAAE;MAC/DyB,MAAM,CAACQ,gBAAgB,KAAAC,MAAA,CAAK1C,QAAQ,MAAG,CAAC,CAACmD,OAAO,CAAC,UAACR,IAAI,EAAK;QAAA,IAAAwH,sBAAA;QACzD,CAAAA,sBAAA,GAAAvI,aAAa,CAACjB,OAAO,CAACiC,GAAG,CAACD,IAAI,CAAC,cAAAwH,sBAAA,eAA/BA,sBAAA,CAAiC/F,OAAO,CAAC,CAAC;MAC5C,CAAC,CAAC;MACFnC,MAAM,CAAC0D,SAAS,GAAG,EAAE;IACvB;EACF,CAAC,EAAE,CAAC1E,IAAI,CAACT,MAAM,EAAEQ,KAAK,CAAC,CAAC;EAExB,IAAMoJ,WAAW,GAAG,SAAdA,WAAWA,CAAA,EAAS;IACxB,IAAI,CAACtI,YAAY,CAACnB,OAAO,EAAE6C,UAAU,CAAC,CAAC;EACzC,CAAC;EAED,IAAM6G,aAAyD,GAAG,SAA5DA,aAAyDA,CAAIxE,KAAK,EAAK;IAC3E,IAAIA,KAAK,CAACyE,GAAG,KAAK,WAAW,IAAIzE,KAAK,CAACyE,GAAG,KAAK,QAAQ,EAAE;MACvD,IAAMjE,SAAS,GAAGC,MAAM,CAACC,YAAY,CAAC,CAAC;MACvC,IAAIF,SAAS,aAATA,SAAS,eAATA,SAAS,CAAEqB,UAAU,EAAE;QACzB,IAAMvB,KAAK,GAAGE,SAAS,CAACsB,UAAU,CAAC,CAAC,CAAC;QACrC,IAAIxB,KAAK,CAACoE,SAAS,EAAE;UACnB,IAAMC,SAAS,GACb3E,KAAK,CAACyE,GAAG,KAAK,WAAW,GACrBpD,iBAAiB,CAACf,KAAK,CAAC,GACxBoB,gBAAgB,CAACpB,KAAK,CAAC;UAE7B,IAAIqE,SAAS,EAAE;YACb3E,KAAK,CAACC,cAAc,CAAC,CAAC;YACtBpB,aAAa,CAAC8F,SAAS,CAAC3H,OAAO,CAACC,eAAe,IAAI,EAAE,CAAC;YACtD;UACF;QACF;MACF;IACF;IACAxB,SAAS,aAATA,SAAS,eAATA,SAAS,CAAGuE,KAAK,CAAC;EACpB,CAAC;EAED,oBACE9F,IAAA;IAAKmF,SAAS,EAAEzD,MAAM,CAACgJ,kBAAmB;IAAC,oBAAkBvJ,WAAY;IAAAqE,QAAA,eACvExF,IAAA;MACEgB,GAAG,EAAEW,SAAU;MACfwD,SAAS,EAAEzD,MAAM,CAACiJ,WAAY;MAC9BC,eAAe,EAAE,CAACxJ,QAAS;MAC3ByJ,8BAA8B;MAC9BC,IAAI,EAAC,SAAS;MACd,kBAAe,MAAM;MACrBC,OAAO,EAAEV,WAAY;MACrB9I,SAAS,EAAE+I,aAAc;MACzB9I,OAAO,EAAEA,OAAQ;MACjBwJ,kBAAkB,EAAE,SAAAA,mBAAA,EAAM;QACxBjJ,YAAY,CAACnB,OAAO,GAAG,IAAI;MAC7B,CAAE;MACFqK,gBAAgB,EAAE,SAAAA,iBAAA,EAAM;QACtBlJ,YAAY,CAACnB,OAAO,GAAG,KAAK;QAC5B6C,UAAU,CAAC,CAAC;MACd,CAAE;MACF,cAAY,CAACP,YAAY,CAAC,CAAC,IAAIjB,cAAc,CAAC,CAAC,CAACxB,MAAM,KAAK,CAAE;MAC7D,sBAAoBiH,iBAAiB,CAAC;IAAE,CACzC;EAAC,CACC,CAAC;AAEV,CACF,CAAC;AAED5G,cAAc,CAACoK,WAAW,GAAG,gBAAgB;AAE7C,eAAepK,cAAc"}
1
+ {"version":3,"names":["React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","createRoot","useStyles","Fragment","_Fragment","jsx","_jsx","TAG_ATTR","CARET_TEXT","createTextNode","text","document","normalizeText","replace","getPlainLength","length","toRawOffset","plainOffset","current","i","InlineTagInput","_ref","ref","value","tags","placeholder","disabled","onChange","onTagsChange","onKeyDown","onKeyUp","renderTag","styles","editorRef","latestTagsRef","tagRootMapRef","WeakMap","composingRef","lastInsertedCaretRef","getOrderedTags","editor","tagMap","Map","map","tag","id","Array","from","querySelectorAll","concat","node","get","dataset","xadkInlineTagId","filter","Boolean","getPlainText","childNodes","forEach","nodeType","Node","TEXT_NODE","textContent","getParts","parts","push","type","HTMLElement","hasAttribute","tagId","emitChange","removeTextRange","start","end","slice","remove","removeTagNode","_tagRootMapRef$curren","previous","previousSibling","next","nextSibling","unmount","_text$match","caretLength","match","_text$match2","spaceLength","removeTagById","find","item","focus","buildTagNode","span","createElement","setAttribute","className","inlineTag","root","set","render","children","onRemove","label","close","innerHTML","onclick","event","preventDefault","stopPropagation","append","setCursorAtTextEnd","_node$textContent","range","createRange","selection","window","getSelection","setStart","collapse","removeAllRanges","addRange","restoreCursorAfterInsert","contains","isTagNode","isOnlyCaretText","getTagBeforeRange","container","startContainer","beforeCursor","startOffset","getTagAfterRange","afterCursor","getOffsetInEditor","rangeCount","getRangeAt","offset","found","visit","getNodeIndex","index","replaceTextRange","insertRange","nodes","nodeStart","plainLength","nodeEnd","rawStart","Math","max","rawEnd","keepLeft","keepRight","parent","parentNode","nodeIndex","cleanupCaretTextNodes","insertTag","_toConsumableArray","tagNode","caretNode","fragment","createDocumentFragment","insertNode","requestAnimationFrame","_editorRef$current","getText","getCursorOffset","appendChild","existingNodes","nextTagMap","existingIds","Set","has","_tagRootMapRef$curren2","handleInput","handleKeyDown","key","collapsed","targetTag","inlineInputWrapper","inlineInput","contentEditable","suppressContentEditableWarning","role","onInput","onCompositionStart","onCompositionEnd","displayName"],"sources":["../../../../src/components/XAdkSender/InlineTagInput.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport type { InlineTagRenderInfo, InputTag, XAdkSenderSubmitPart } from \"@/types\";\nimport { useStyles } from \"./styles\";\n\nexport interface InlineTagInputRef {\n focus: () => void;\n getText: () => string;\n getParts: () => XAdkSenderSubmitPart[];\n getCursorOffset: () => number;\n insertTag: (tag: InputTag, replace?: { start: number; end: number }) => void;\n}\n\nexport interface InlineTagInputProps {\n value: string;\n tags: InputTag[];\n placeholder?: string;\n disabled?: boolean;\n onChange: (value: string) => void;\n onTagsChange: (tags: InputTag[]) => void;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n renderTag?: (tag: InputTag, info: InlineTagRenderInfo) => React.ReactNode;\n}\n\nconst TAG_ATTR = \"data-xadk-inline-tag-id\";\n// contenteditable 无法把光标放进 contenteditable=false 的标签里,需用零宽字符承接“标签后方”的光标。\nconst CARET_TEXT = \"\\u200B\";\n\nconst createTextNode = (text: string) => document.createTextNode(text);\nconst normalizeText = (text: string) =>\n text.replace(/\\u200B/g, \"\").replace(/\\u00a0/g, \" \");\nconst getPlainLength = (text: string) => normalizeText(text).length;\n// DOM 文本里包含零宽光标锚点,快捷键替换和光标定位都要在“用户可见文本 offset”和 DOM raw offset 之间转换。\nconst toRawOffset = (text: string, plainOffset: number) => {\n let current = 0;\n for (let i = 0; i < text.length; i++) {\n if (current >= plainOffset) return i;\n if (text[i] !== CARET_TEXT) current += 1;\n }\n return text.length;\n};\n\nconst InlineTagInput = forwardRef<InlineTagInputRef, InlineTagInputProps>(\n (\n {\n value,\n tags,\n placeholder,\n disabled,\n onChange,\n onTagsChange,\n onKeyDown,\n onKeyUp,\n renderTag,\n },\n ref,\n ) => {\n const styles = useStyles();\n const editorRef = useRef<HTMLDivElement>(null);\n const latestTagsRef = useRef<InputTag[]>(tags);\n const tagRootMapRef = useRef<WeakMap<Element, Root>>(new WeakMap());\n const composingRef = useRef(false);\n const lastInsertedCaretRef = useRef<Text | null>(null);\n\n useEffect(() => {\n latestTagsRef.current = tags;\n }, [tags]);\n\n const getOrderedTags = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return [];\n const tagMap = new Map(latestTagsRef.current.map((tag) => [tag.id, tag]));\n return Array.from(editor.querySelectorAll(`[${TAG_ATTR}]`))\n .map((node) => tagMap.get((node as HTMLElement).dataset.xadkInlineTagId || \"\"))\n .filter(Boolean) as InputTag[];\n }, []);\n\n // 对外只暴露用户输入的纯文本,内部零宽锚点不进入 value。\n const getPlainText = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return \"\";\n let text = \"\";\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || \"\";\n }\n });\n return normalizeText(text);\n }, []);\n\n // 提交时需要保留文本与 tag 的真实顺序;仅靠 value + tags 无法区分 tag 在句首、句中还是句尾。\n const getParts = useCallback((): XAdkSenderSubmitPart[] => {\n const editor = editorRef.current;\n if (!editor) return [];\n const tagMap = new Map(latestTagsRef.current.map((tag) => [tag.id, tag]));\n const parts: XAdkSenderSubmitPart[] = [];\n\n editor.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = normalizeText(node.textContent || \"\");\n if (text) parts.push({ type: \"text\", text });\n return;\n }\n\n if (node instanceof HTMLElement && node.hasAttribute(TAG_ATTR)) {\n const tagId = node.dataset.xadkInlineTagId || \"\";\n const tag = tagMap.get(tagId);\n if (tag) parts.push({ type: \"tag\", tag });\n }\n });\n\n return parts;\n }, []);\n\n const emitChange = useCallback(() => {\n onChange(getPlainText());\n onTagsChange(getOrderedTags());\n }, [getOrderedTags, getPlainText, onChange, onTagsChange]);\n\n const removeTextRange = useCallback((node: Text, start: number, end: number) => {\n const text = node.textContent || \"\";\n node.textContent = `${text.slice(0, start)}${text.slice(end)}`;\n if (!node.textContent) node.remove();\n }, []);\n\n const removeTagNode = useCallback(\n (node: Element) => {\n const previous = node.previousSibling;\n const next = node.nextSibling;\n\n tagRootMapRef.current.get(node)?.unmount();\n node.remove();\n\n // 标签后会补一个不可见光标锚点;删除标签时同步清理,避免留下冗余节点。\n if (next?.nodeType === Node.TEXT_NODE) {\n const text = next.textContent || \"\";\n const caretLength = text.match(/^\\u200B+/)?.[0].length || 0;\n if (caretLength > 0) {\n removeTextRange(next as Text, 0, caretLength);\n return;\n }\n }\n\n if (previous?.nodeType === Node.TEXT_NODE) {\n const text = previous.textContent || \"\";\n const spaceLength = text.match(/\\s+$/)?.[0].length || 0;\n if (spaceLength > 0) {\n removeTextRange(previous as Text, text.length - spaceLength, text.length);\n }\n }\n },\n [removeTextRange],\n );\n\n const removeTagById = useCallback(\n (id: string) => {\n const editor = editorRef.current;\n const node = Array.from(editor?.querySelectorAll(`[${TAG_ATTR}]`) || []).find(\n (item) => (item as HTMLElement).dataset.xadkInlineTagId === id,\n );\n if (node) {\n removeTagNode(node);\n }\n emitChange();\n editor?.focus();\n },\n [emitChange, removeTagNode],\n );\n\n // 标签节点本身不可编辑;删除入口通过 onRemove 回到组件内部统一维护 DOM 与 tags。\n const buildTagNode = useCallback(\n (tag: InputTag) => {\n const span = document.createElement(\"span\");\n span.setAttribute(\"contenteditable\", \"false\");\n span.setAttribute(TAG_ATTR, tag.id);\n span.dataset.xadkInlineTagId = tag.id;\n span.className = styles.inlineTag;\n\n if (renderTag) {\n const root = createRoot(span);\n tagRootMapRef.current.set(span, root);\n root.render(\n <>{renderTag(tag, { onRemove: () => removeTagById(tag.id) })}</>,\n );\n } else {\n const label = document.createElement(\"span\");\n label.className = \"xadk-inline-tag-label\";\n label.textContent = tag.label;\n const close = document.createElement(\"span\");\n close.className = \"xadk-inline-tag-close\";\n close.innerHTML = \"×\";\n close.onclick = (event) => {\n event.preventDefault();\n event.stopPropagation();\n removeTagById(tag.id);\n };\n span.append(label, close);\n }\n return span;\n },\n [removeTagById, renderTag, styles.inlineTag],\n );\n\n const setCursorAtTextEnd = useCallback((node: Text) => {\n const range = document.createRange();\n const selection = window.getSelection();\n range.setStart(node, node.textContent?.length || 0);\n range.collapse(true);\n selection?.removeAllRanges();\n selection?.addRange(range);\n }, []);\n\n const restoreCursorAfterInsert = useCallback(\n (node: Text) => {\n const editor = editorRef.current;\n if (!editor || !editor.contains(node)) return;\n editor.focus();\n setCursorAtTextEnd(node);\n },\n [setCursorAtTextEnd],\n );\n\n const isTagNode = (node: Node | null): node is HTMLElement =>\n node instanceof HTMLElement && node.hasAttribute(TAG_ATTR);\n\n const isOnlyCaretText = (text: string) => normalizeText(text) === \"\";\n\n // Backspace/Delete 需要跨过零宽锚点识别相邻标签,不能只看光标所在文本节点。\n const getTagBeforeRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const beforeCursor = text.slice(0, range.startOffset);\n if (isOnlyCaretText(beforeCursor) && isTagNode(container.previousSibling)) {\n return container.previousSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const previous = container.childNodes[range.startOffset - 1];\n if (isTagNode(previous)) return previous;\n if (\n previous?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(previous.textContent || \"\") &&\n isTagNode(previous.previousSibling)\n ) {\n return previous.previousSibling;\n }\n }\n\n return null;\n };\n\n const getTagAfterRange = (range: Range) => {\n const container = range.startContainer;\n if (container.nodeType === Node.TEXT_NODE) {\n const text = container.textContent || \"\";\n const afterCursor = text.slice(range.startOffset);\n if (isOnlyCaretText(afterCursor) && isTagNode(container.nextSibling)) {\n return container.nextSibling;\n }\n }\n\n if (container instanceof HTMLElement) {\n const next = container.childNodes[range.startOffset];\n if (isTagNode(next)) return next;\n if (\n next?.nodeType === Node.TEXT_NODE &&\n isOnlyCaretText(next.textContent || \"\") &&\n isTagNode(next.nextSibling)\n ) {\n return next.nextSibling;\n }\n }\n\n return null;\n };\n\n // 读取光标在纯文本中的位置,供快捷键搜索词和 tag 插入位置复用。\n const getOffsetInEditor = useCallback(() => {\n const editor = editorRef.current;\n const selection = window.getSelection();\n if (!editor || !selection || selection.rangeCount === 0) return 0;\n const range = selection.getRangeAt(0);\n let offset = 0;\n let found = false;\n\n const visit = (node: Node) => {\n if (found) return;\n if (node === range.startContainer) {\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(\n (node.textContent || \"\").slice(0, range.startOffset),\n );\n }\n found = true;\n return;\n }\n if (node instanceof HTMLElement && node.hasAttribute(TAG_ATTR)) return;\n if (node.nodeType === Node.TEXT_NODE) {\n offset += getPlainLength(node.textContent || \"\");\n return;\n }\n node.childNodes.forEach(visit);\n };\n\n editor.childNodes.forEach(visit);\n return offset;\n }, []);\n\n const getNodeIndex = (node: Node) => {\n let index = 0;\n let current = node;\n while (current.previousSibling) {\n index += 1;\n current = current.previousSibling;\n }\n return index;\n };\n\n // 删除快捷键触发片段,例如把 “@文档” 替换成一个结构化 tag,并返回删除位置对应的真实 DOM Range。\n // 注意:纯文本 offset 不包含 tag,标签前后可能都是 offset 0;插入 tag 必须依赖真实 Range,不能再反推 offset。\n const replaceTextRange = useCallback((start: number, end: number) => {\n const editor = editorRef.current;\n if (!editor) return null;\n let offset = 0;\n let insertRange: Range | null = null;\n const nodes = Array.from(editor.childNodes);\n nodes.forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n const nodeStart = offset;\n const plainLength = getPlainLength(text);\n const nodeEnd = offset + plainLength;\n offset = nodeEnd;\n if (nodeEnd <= start || nodeStart >= end) return;\n const rawStart = toRawOffset(text, Math.max(0, start - nodeStart));\n const rawEnd = toRawOffset(text, Math.max(0, end - nodeStart));\n const keepLeft = text.slice(0, rawStart);\n const keepRight = text.slice(rawEnd);\n const parent = node.parentNode;\n const nodeIndex = getNodeIndex(node);\n\n node.textContent = `${keepLeft}${keepRight}`;\n if (!insertRange) {\n insertRange = document.createRange();\n if (node.textContent) {\n insertRange.setStart(node, rawStart);\n } else if (parent) {\n insertRange.setStart(parent, nodeIndex);\n }\n insertRange.collapse(true);\n }\n if (!node.textContent) node.remove();\n });\n\n return insertRange;\n }, []);\n\n // 浏览器拆分 Range 后可能留下空文本节点;清理后才能保证后续 tag 继续 append 在队尾。\n const cleanupCaretTextNodes = useCallback(() => {\n const editor = editorRef.current;\n if (!editor) return;\n Array.from(editor.childNodes).forEach((node) => {\n if (node.nodeType !== Node.TEXT_NODE) return;\n const text = node.textContent || \"\";\n if (!text) {\n node.remove();\n return;\n }\n if (text && normalizeText(text) === \"\") {\n node.textContent = CARET_TEXT;\n }\n });\n }, []);\n\n const insertTag = useCallback(\n (tag: InputTag, replace?: { start: number; end: number }) => {\n const editor = editorRef.current;\n if (!editor) return;\n editor.focus();\n latestTagsRef.current = [\n ...latestTagsRef.current.filter((item) => item.id !== tag.id),\n tag,\n ];\n let insertRange: Range | null = null;\n if (replace) {\n insertRange = replaceTextRange(replace.start, replace.end);\n cleanupCaretTextNodes();\n }\n const tagNode = buildTagNode(tag);\n const caretNode = createTextNode(CARET_TEXT);\n const selection = window.getSelection();\n const range =\n insertRange || (selection?.rangeCount ? selection.getRangeAt(0) : null);\n if (range && editor.contains(range.startContainer)) {\n // 用 DocumentFragment 一次性插入,避免连续 insertNode 导致 tag/caret 顺序被浏览器 Range 状态打乱。\n const fragment = document.createDocumentFragment();\n fragment.append(tagNode, caretNode);\n range.insertNode(fragment);\n } else {\n editor.append(tagNode, caretNode);\n }\n cleanupCaretTextNodes();\n lastInsertedCaretRef.current = caretNode;\n setCursorAtTextEnd(caretNode);\n emitChange();\n\n // 关闭快捷列表和父组件同步 tags/value 会触发一次 React 更新;\n // 下一帧再恢复到刚插入 tag 后的零宽锚点,避免光标被 focus 或重渲染带回旧位置。\n window.requestAnimationFrame(() => {\n if (lastInsertedCaretRef.current === caretNode) {\n restoreCursorAfterInsert(caretNode);\n }\n });\n },\n [\n buildTagNode,\n cleanupCaretTextNodes,\n emitChange,\n replaceTextRange,\n restoreCursorAfterInsert,\n setCursorAtTextEnd,\n ],\n );\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus(),\n getText: getPlainText,\n getParts,\n getCursorOffset: getOffsetInEditor,\n insertTag,\n }), [getOffsetInEditor, getParts, getPlainText, insertTag]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor || editor.childNodes.length > 0) return;\n if (value) editor.appendChild(createTextNode(value));\n tags.forEach((tag) => editor.append(buildTagNode(tag), createTextNode(CARET_TEXT)));\n }, []);\n\n // 外部受控 tags 变化时,同步补齐或删除 DOM 中的 tag 节点。\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n const existingNodes = Array.from(editor.querySelectorAll(`[${TAG_ATTR}]`));\n const nextTagMap = new Map(tags.map((tag) => [tag.id, tag]));\n const existingIds = new Set(\n existingNodes.map((node) => (node as HTMLElement).dataset.xadkInlineTagId || \"\"),\n );\n\n existingNodes.forEach((node) => {\n const tagId = (node as HTMLElement).dataset.xadkInlineTagId || \"\";\n if (!nextTagMap.has(tagId)) {\n removeTagNode(node);\n }\n });\n\n tags.forEach((tag) => {\n if (existingIds.has(tag.id)) return;\n editor.append(buildTagNode(tag), createTextNode(CARET_TEXT));\n });\n }, [buildTagNode, removeTagNode, tags]);\n\n useEffect(() => {\n const editor = editorRef.current;\n if (!editor) return;\n if (!value && tags.length === 0 && editor.childNodes.length > 0) {\n editor.querySelectorAll(`[${TAG_ATTR}]`).forEach((node) => {\n tagRootMapRef.current.get(node)?.unmount();\n });\n editor.innerHTML = \"\";\n }\n }, [tags.length, value]);\n\n const handleInput = () => {\n if (!composingRef.current) emitChange();\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event) => {\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\n const selection = window.getSelection();\n if (selection?.rangeCount) {\n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n const targetTag =\n event.key === \"Backspace\"\n ? getTagBeforeRange(range)\n : getTagAfterRange(range);\n\n if (targetTag) {\n event.preventDefault();\n removeTagById(targetTag.dataset.xadkInlineTagId || \"\");\n return;\n }\n }\n }\n }\n onKeyDown?.(event);\n };\n\n return (\n <div className={styles.inlineInputWrapper}>\n <div\n ref={editorRef}\n className={styles.inlineInput}\n data-placeholder={placeholder}\n contentEditable={!disabled}\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n onInput={handleInput}\n onKeyDown={handleKeyDown}\n onKeyUp={onKeyUp}\n onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={() => {\n composingRef.current = false;\n emitChange();\n }}\n data-empty={!getPlainText() && getOrderedTags().length === 0}\n data-cursor-offset={getOffsetInEditor()}\n />\n </div>\n );\n },\n);\n\nInlineTagInput.displayName = \"InlineTagInput\";\n\nexport default InlineTagInput;\n"],"mappings":"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"}
@@ -64,7 +64,10 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
64
64
  _ref$defaultTags = _ref.defaultTags,
65
65
  defaultTags = _ref$defaultTags === void 0 ? [] : _ref$defaultTags,
66
66
  onTagsChange = _ref.onTagsChange,
67
- onQuickKeyTrigger = _ref.onQuickKeyTrigger;
67
+ onQuickKeyTrigger = _ref.onQuickKeyTrigger,
68
+ _ref$submitFormat = _ref.submitFormat,
69
+ submitFormat = _ref$submitFormat === void 0 ? "text" : _ref$submitFormat,
70
+ formatTag = _ref.formatTag;
68
71
  var styles = useStyles();
69
72
  var isControlled = controlledValue !== undefined;
70
73
  var _useState = useState(defaultValue),
@@ -133,6 +136,79 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
133
136
  var data = (_response$data = response === null || response === void 0 ? void 0 : response.data) !== null && _response$data !== void 0 ? _response$data : response;
134
137
  return (_ref2 = Array.isArray(data) ? data[0] : data) !== null && _ref2 !== void 0 ? _ref2 : {};
135
138
  };
139
+ var escapeXml = function escapeXml(text) {
140
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
141
+ };
142
+ var escapeMarkdownLabel = function escapeMarkdownLabel(text) {
143
+ return text.replace(/\\/g, "\\\\").replace(/\]/g, "\\]");
144
+ };
145
+ var getTagSubmitValue = function getTagSubmitValue(tag) {
146
+ var _ref3, _ref4, _ref5, _tag$value, _tag$data, _tag$data2;
147
+ return String((_ref3 = (_ref4 = (_ref5 = (_tag$value = tag.value) !== null && _tag$value !== void 0 ? _tag$value : (_tag$data = tag.data) === null || _tag$data === void 0 ? void 0 : _tag$data.value) !== null && _ref5 !== void 0 ? _ref5 : (_tag$data2 = tag.data) === null || _tag$data2 === void 0 ? void 0 : _tag$data2.name) !== null && _ref4 !== void 0 ? _ref4 : tag.label) !== null && _ref3 !== void 0 ? _ref3 : "");
148
+ };
149
+ var defaultFormatTag = function defaultFormatTag(tag, format, index) {
150
+ var value = getTagSubmitValue(tag);
151
+ if (format === "xml") {
152
+ return "<tag type=\"".concat(escapeXml(tag.type), "\" id=\"").concat(escapeXml(tag.id), "\" label=\"").concat(escapeXml(tag.label), "\" value=\"").concat(escapeXml(value), "\" />");
153
+ }
154
+ if (format === "markdown") {
155
+ return "[/".concat(escapeMarkdownLabel(tag.label), "](xadk-tag://").concat(encodeURIComponent(tag.type), "/").concat(encodeURIComponent(tag.id), ")");
156
+ }
157
+ return "/".concat(value || "tag-".concat(index + 1));
158
+ };
159
+ var serializeTag = function serializeTag(tag, format, index) {
160
+ var _formatTag;
161
+ return (_formatTag = formatTag === null || formatTag === void 0 ? void 0 : formatTag(tag, {
162
+ format: format,
163
+ index: index
164
+ })) !== null && _formatTag !== void 0 ? _formatTag : defaultFormatTag(tag, format, index);
165
+ };
166
+ var getSubmitParts = useCallback(function () {
167
+ if (inlineTags) {
168
+ var _inlineInputRef$curre;
169
+ var parts = ((_inlineInputRef$curre = inlineInputRef.current) === null || _inlineInputRef$curre === void 0 ? void 0 : _inlineInputRef$curre.getParts()) || [];
170
+ if (parts.length > 0) return parts;
171
+ }
172
+ var textParts = value ? [{
173
+ type: "text",
174
+ text: value
175
+ }] : [];
176
+ var tagParts = tags.map(function (tag) {
177
+ return {
178
+ type: "tag",
179
+ tag: tag
180
+ };
181
+ });
182
+ return [].concat(_toConsumableArray(tagParts), textParts);
183
+ }, [inlineTags, tags, value]);
184
+ var serializeParts = function serializeParts(parts, format) {
185
+ if (format === "structured") {
186
+ return parts.reduce(function (content, part) {
187
+ return content + (part.type === "text" ? part.text : "");
188
+ }, "");
189
+ }
190
+ var tagIndex = 0;
191
+ return parts.map(function (part) {
192
+ if (part.type === "text") return part.text;
193
+ var result = serializeTag(part.tag, format, tagIndex);
194
+ tagIndex += 1;
195
+ return result;
196
+ }).join("");
197
+ };
198
+ var createSubmitData = function createSubmitData(formattedFiles) {
199
+ var parts = getSubmitParts();
200
+ var rawText = parts.reduce(function (content, part) {
201
+ return content + (part.type === "text" ? part.text : "");
202
+ }, "");
203
+ return {
204
+ text: serializeParts(parts, submitFormat),
205
+ rawText: rawText,
206
+ format: submitFormat,
207
+ parts: parts,
208
+ files: formattedFiles,
209
+ tags: tags
210
+ };
211
+ };
136
212
 
137
213
  // 检查文件类型
138
214
  var checkFileType = function checkFileType(file) {
@@ -162,8 +238,8 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
162
238
  };
163
239
 
164
240
  // 内置校验器集合
165
- var builtInValidators = [function (_file, _ref3) {
166
- var files = _ref3.files;
241
+ var builtInValidators = [function (_file, _ref6) {
242
+ var files = _ref6.files;
167
243
  if (files.length >= maxFiles) {
168
244
  return "\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ".concat(maxFiles, " \u4E2A\u6587\u4EF6");
169
245
  }
@@ -179,8 +255,8 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
179
255
  return "不支持的文件类型";
180
256
  }
181
257
  return null;
182
- }, function (file, _ref4) {
183
- var files = _ref4.files;
258
+ }, function (file, _ref7) {
259
+ var files = _ref7.files;
184
260
  if (isDuplicateFile(file, files)) {
185
261
  return "文件已存在";
186
262
  }
@@ -269,7 +345,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
269
345
 
270
346
  // 上传文件
271
347
  var uploadFiles = /*#__PURE__*/function () {
272
- var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
348
+ var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(fileList) {
273
349
  var _iterator2, _step2, _loop;
274
350
  return _regeneratorRuntime().wrap(function _callee$(_context2) {
275
351
  while (1) switch (_context2.prev = _context2.next) {
@@ -384,7 +460,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
384
460
  }, _callee, null, [[1, 10, 13, 16]]);
385
461
  }));
386
462
  return function uploadFiles(_x) {
387
- return _ref5.apply(this, arguments);
463
+ return _ref8.apply(this, arguments);
388
464
  };
389
465
  }();
390
466
 
@@ -496,18 +572,20 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
496
572
 
497
573
  // 选择快捷项后转成结构化 tag;inline 模式会替换掉触发字符和关键词。
498
574
  var handleQuickKeySelect = useCallback(function (option) {
499
- var _activeQuickKeyConfig, _inlineInputRef$curre2, _textareaRef$current;
575
+ var _ref9, _option$value, _activeQuickKeyConfig, _inlineInputRef$curre3, _textareaRef$current;
500
576
  var newTag = {
501
577
  id: generateId(),
502
578
  label: option.label,
503
579
  type: activeQuickKey || "unknown",
580
+ value: (_ref9 = (_option$value = option.value) !== null && _option$value !== void 0 ? _option$value : option.name) !== null && _ref9 !== void 0 ? _ref9 : option.label,
581
+ trigger: activeQuickKey || undefined,
504
582
  icon: option.icon,
505
583
  data: option
506
584
  };
507
585
  activeQuickKeyConfig === null || activeQuickKeyConfig === void 0 || (_activeQuickKeyConfig = activeQuickKeyConfig.onSelect) === null || _activeQuickKeyConfig === void 0 || _activeQuickKeyConfig.call(activeQuickKeyConfig, option);
508
586
  if (inlineTags) {
509
- var _inlineInputRef$curre;
510
- (_inlineInputRef$curre = inlineInputRef.current) === null || _inlineInputRef$curre === void 0 || _inlineInputRef$curre.insertTag(newTag, {
587
+ var _inlineInputRef$curre2;
588
+ (_inlineInputRef$curre2 = inlineInputRef.current) === null || _inlineInputRef$curre2 === void 0 || _inlineInputRef$curre2.insertTag(newTag, {
511
589
  start: quickKeyTriggerIdx,
512
590
  end: quickKeyTriggerIdx + 1 + quickKeyKeyword.length
513
591
  });
@@ -524,7 +602,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
524
602
  setQuickKeyKeyword("");
525
603
  setQuickKeyTriggerIdx(-1);
526
604
  setQuickKeyActiveIndex(0);
527
- inlineTags ? (_inlineInputRef$curre2 = inlineInputRef.current) === null || _inlineInputRef$curre2 === void 0 ? void 0 : _inlineInputRef$curre2.focus() : (_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0 ? void 0 : _textareaRef$current.focus();
605
+ inlineTags ? (_inlineInputRef$curre3 = inlineInputRef.current) === null || _inlineInputRef$curre3 === void 0 ? void 0 : _inlineInputRef$curre3.focus() : (_textareaRef$current = textareaRef.current) === null || _textareaRef$current === void 0 ? void 0 : _textareaRef$current.focus();
528
606
  }, [activeQuickKey, activeQuickKeyConfig, inlineTags, tags, setTags, value, quickKeyTriggerIdx, quickKeyKeyword, setValue]);
529
607
 
530
608
  // 处理输入框变化(含快捷键检测)
@@ -536,10 +614,10 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
536
614
  detectQuickKey(newValue, e.target.selectionStart || 0);
537
615
  };
538
616
  var handleInlineInputChange = function handleInlineInputChange(newValue) {
539
- var _inlineInputRef$curre3;
617
+ var _inlineInputRef$curre4;
540
618
  setValue(newValue);
541
619
  // contenteditable 的 selection 不一定和 React state 同步,需实时读取内部光标 offset。
542
- detectQuickKey(newValue, ((_inlineInputRef$curre3 = inlineInputRef.current) === null || _inlineInputRef$curre3 === void 0 ? void 0 : _inlineInputRef$curre3.getCursorOffset()) || newValue.length);
620
+ detectQuickKey(newValue, ((_inlineInputRef$curre4 = inlineInputRef.current) === null || _inlineInputRef$curre4 === void 0 ? void 0 : _inlineInputRef$curre4.getCursorOffset()) || newValue.length);
543
621
  };
544
622
  var handleQuickKeyByText = function handleQuickKeyByText(text, cursorPos) {
545
623
  var quickKeyChars = quickKeys.map(function (qk) {
@@ -574,11 +652,11 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
574
652
  handleQuickKeyByText(target.value || "", target.selectionStart || 0);
575
653
  };
576
654
  var handleInlineKeyUp = function handleInlineKeyUp(e) {
577
- var _inlineInputRef$curre4, _inlineInputRef$curre5;
655
+ var _inlineInputRef$curre5, _inlineInputRef$curre6;
578
656
  if (activeQuickKey && isQuickListControlKey(e.key)) return;
579
657
  // inline 输入区不是 textarea,不能读 event.target.value,只能从 ref 取纯文本。
580
- var text = ((_inlineInputRef$curre4 = inlineInputRef.current) === null || _inlineInputRef$curre4 === void 0 ? void 0 : _inlineInputRef$curre4.getText()) || "";
581
- var cursorPos = ((_inlineInputRef$curre5 = inlineInputRef.current) === null || _inlineInputRef$curre5 === void 0 ? void 0 : _inlineInputRef$curre5.getCursorOffset()) || text.length;
658
+ var text = ((_inlineInputRef$curre5 = inlineInputRef.current) === null || _inlineInputRef$curre5 === void 0 ? void 0 : _inlineInputRef$curre5.getText()) || "";
659
+ var cursorPos = ((_inlineInputRef$curre6 = inlineInputRef.current) === null || _inlineInputRef$curre6 === void 0 ? void 0 : _inlineInputRef$curre6.getCursorOffset()) || text.length;
582
660
  handleQuickKeyByText(text, cursorPos);
583
661
  };
584
662
 
@@ -603,11 +681,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
603
681
  onOk: function onOk() {
604
682
  var formattedFiles = formatFilesForServer(successFiles);
605
683
  if (onSubmit) {
606
- onSubmit({
607
- text: value,
608
- files: formattedFiles,
609
- tags: tags
610
- });
684
+ onSubmit(createSubmitData(formattedFiles));
611
685
  }
612
686
  setValue("");
613
687
  setTags([]);
@@ -624,11 +698,7 @@ var XAdkSender = /*#__PURE__*/forwardRef(function (_ref, ref) {
624
698
  } else {
625
699
  var formattedFiles = formatFilesForServer(successFiles);
626
700
  if (onSubmit) {
627
- onSubmit({
628
- text: value,
629
- files: formattedFiles,
630
- tags: tags
631
- });
701
+ onSubmit(createSubmitData(formattedFiles));
632
702
  }
633
703
  setValue("");
634
704
  setTags([]);