@ai-group/chat-sdk 3.7.1-alpha1 → 3.7.1-alpha10

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 (221) hide show
  1. package/README.md +22 -0
  2. package/dist/cjs/components/FileGallery/index.js +59 -40
  3. package/dist/cjs/components/FileGallery/index.js.map +2 -2
  4. package/dist/cjs/components/FileGallery/styles.d.ts +7 -0
  5. package/dist/cjs/components/FileGallery/styles.js +78 -0
  6. package/dist/cjs/components/FileGallery/styles.js.map +2 -2
  7. package/dist/cjs/components/Sources/components/CarouselCard.d.ts +12 -0
  8. package/dist/cjs/components/Sources/components/CarouselCard.js +130 -0
  9. package/dist/cjs/components/Sources/components/CarouselCard.js.map +7 -0
  10. package/dist/cjs/components/Sources/index.d.ts +5 -0
  11. package/dist/cjs/components/Sources/index.js +162 -0
  12. package/dist/cjs/components/Sources/index.js.map +7 -0
  13. package/dist/cjs/components/Sources/styles.d.ts +59 -0
  14. package/dist/cjs/components/Sources/styles.js +179 -0
  15. package/dist/cjs/components/Sources/styles.js.map +7 -0
  16. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
  17. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +232 -22
  18. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  19. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  20. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +83 -0
  21. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  22. package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
  23. package/dist/cjs/components/XAdkChatbot/index.js +75 -8
  24. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  25. package/dist/cjs/components/XAdkChatbot/styles.js +1 -1
  26. package/dist/cjs/components/XAdkChatbot/styles.js.map +1 -1
  27. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
  28. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +30 -12
  29. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  30. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +3 -1
  31. package/dist/cjs/components/XAdkProvider/compound/Sender.js +81 -4
  32. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +3 -3
  33. package/dist/cjs/components/XAdkProvider/compound/styles.d.ts +1 -0
  34. package/dist/cjs/components/XAdkProvider/compound/styles.js +16 -0
  35. package/dist/cjs/components/XAdkProvider/compound/styles.js.map +2 -2
  36. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  37. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
  38. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  39. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js +34 -0
  40. package/dist/cjs/components/XAdkProvider/context/DefaultLayoutContext.js.map +7 -0
  41. package/dist/cjs/components/XAdkProvider/context/index.d.ts +5 -4
  42. package/dist/cjs/components/XAdkProvider/context/index.js +3 -1
  43. package/dist/cjs/components/XAdkProvider/context/index.js.map +2 -2
  44. package/dist/cjs/components/XAdkProvider/index.js +11 -10
  45. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  46. package/dist/cjs/components/XAdkSender/InlineTagInput.d.ts +12 -5
  47. package/dist/cjs/components/XAdkSender/InlineTagInput.js +419 -121
  48. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  49. package/dist/cjs/components/XAdkSender/InputTags.d.ts +2 -2
  50. package/dist/cjs/components/XAdkSender/InputTags.js +8 -8
  51. package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
  52. package/dist/cjs/components/XAdkSender/index.js +173 -112
  53. package/dist/cjs/components/XAdkSender/index.js.map +3 -3
  54. package/dist/cjs/components/XAdkSender/styles.d.ts +4 -0
  55. package/dist/cjs/components/XAdkSender/styles.js +47 -6
  56. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  57. package/dist/cjs/components/XAiConversations/styles.js +11 -1
  58. package/dist/cjs/components/XAiConversations/styles.js.map +2 -2
  59. package/dist/cjs/hooks/useADKChat.js +5 -1
  60. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  61. package/dist/cjs/index.d.ts +8 -2
  62. package/dist/cjs/index.js +44 -7
  63. package/dist/cjs/index.js.map +3 -3
  64. package/dist/cjs/presets/base.d.ts +6 -0
  65. package/dist/cjs/presets/base.js +50 -0
  66. package/dist/cjs/presets/base.js.map +7 -0
  67. package/dist/cjs/presets/define.d.ts +11 -0
  68. package/dist/cjs/presets/define.js +58 -0
  69. package/dist/cjs/presets/define.js.map +7 -0
  70. package/dist/cjs/presets/index.d.ts +3 -0
  71. package/dist/cjs/presets/index.js +28 -0
  72. package/dist/cjs/presets/index.js.map +7 -0
  73. package/dist/cjs/presets/runtime.d.ts +22 -0
  74. package/dist/cjs/presets/runtime.js +75 -0
  75. package/dist/cjs/presets/runtime.js.map +7 -0
  76. package/dist/cjs/presets/xgroup/index.d.ts +5 -0
  77. package/dist/cjs/presets/xgroup/index.js +10 -0
  78. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  79. package/dist/cjs/presets/xgroup/knowledgeReference.d.ts +17 -0
  80. package/dist/cjs/presets/xgroup/knowledgeReference.js +162 -0
  81. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +7 -0
  82. package/dist/cjs/presets/xgroup/preset.d.ts +1 -13
  83. package/dist/cjs/presets/xgroup/preset.js +16 -37
  84. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  85. package/dist/cjs/presets/xgroup/strategies.d.ts +5 -4
  86. package/dist/cjs/presets/xgroup/strategies.js +11 -15
  87. package/dist/cjs/presets/xgroup/strategies.js.map +3 -3
  88. package/dist/cjs/presets/xgroup/webReference.d.ts +10 -0
  89. package/dist/cjs/presets/xgroup/webReference.js +85 -0
  90. package/dist/cjs/presets/xgroup/webReference.js.map +7 -0
  91. package/dist/cjs/types/ChatStrategies.d.ts +11 -2
  92. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  93. package/dist/cjs/types/FileGallery.d.ts +3 -0
  94. package/dist/cjs/types/FileGallery.js.map +1 -1
  95. package/dist/cjs/types/Sources.d.ts +30 -0
  96. package/dist/cjs/types/Sources.js +18 -0
  97. package/dist/cjs/types/Sources.js.map +7 -0
  98. package/dist/cjs/types/XAdkChatbot.d.ts +33 -0
  99. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  100. package/dist/cjs/types/XAdkSender.d.ts +112 -21
  101. package/dist/cjs/types/XAdkSender.js.map +1 -1
  102. package/dist/cjs/types/index.d.ts +1 -0
  103. package/dist/cjs/types/index.js +3 -1
  104. package/dist/cjs/types/index.js.map +2 -2
  105. package/dist/cjs/utils/index.d.ts +1 -0
  106. package/dist/cjs/utils/index.js +3 -1
  107. package/dist/cjs/utils/index.js.map +2 -2
  108. package/dist/cjs/utils/markdownResource.d.ts +14 -0
  109. package/dist/cjs/utils/markdownResource.js +131 -0
  110. package/dist/cjs/utils/markdownResource.js.map +7 -0
  111. package/dist/esm/components/FileGallery/index.js +22 -16
  112. package/dist/esm/components/FileGallery/index.js.map +1 -1
  113. package/dist/esm/components/FileGallery/styles.d.ts +7 -0
  114. package/dist/esm/components/FileGallery/styles.js +24 -17
  115. package/dist/esm/components/FileGallery/styles.js.map +1 -1
  116. package/dist/esm/components/Sources/components/CarouselCard.d.ts +12 -0
  117. package/dist/esm/components/Sources/components/CarouselCard.js +107 -0
  118. package/dist/esm/components/Sources/components/CarouselCard.js.map +1 -0
  119. package/dist/esm/components/Sources/index.d.ts +5 -0
  120. package/dist/esm/components/Sources/index.js +127 -0
  121. package/dist/esm/components/Sources/index.js.map +1 -0
  122. package/dist/esm/components/Sources/styles.d.ts +59 -0
  123. package/dist/esm/components/Sources/styles.js +34 -0
  124. package/dist/esm/components/Sources/styles.js.map +1 -0
  125. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +19 -1
  126. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +190 -11
  127. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  128. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.d.ts +3 -0
  129. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +5 -2
  130. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  131. package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
  132. package/dist/esm/components/XAdkChatbot/index.js +55 -10
  133. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  134. package/dist/esm/components/XAdkChatbot/styles.js +1 -1
  135. package/dist/esm/components/XAdkChatbot/styles.js.map +1 -1
  136. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +7 -2
  137. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +40 -17
  138. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  139. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +3 -1
  140. package/dist/esm/components/XAdkProvider/compound/Sender.js +70 -6
  141. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  142. package/dist/esm/components/XAdkProvider/compound/styles.d.ts +1 -0
  143. package/dist/esm/components/XAdkProvider/compound/styles.js +3 -2
  144. package/dist/esm/components/XAdkProvider/compound/styles.js.map +1 -1
  145. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  146. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
  147. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.d.ts +9 -0
  148. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js +9 -0
  149. package/dist/esm/components/XAdkProvider/context/DefaultLayoutContext.js.map +1 -0
  150. package/dist/esm/components/XAdkProvider/context/index.d.ts +5 -4
  151. package/dist/esm/components/XAdkProvider/context/index.js +1 -0
  152. package/dist/esm/components/XAdkProvider/context/index.js.map +1 -1
  153. package/dist/esm/components/XAdkProvider/index.js +7 -3
  154. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  155. package/dist/esm/components/XAdkSender/InlineTagInput.d.ts +12 -5
  156. package/dist/esm/components/XAdkSender/InlineTagInput.js +408 -111
  157. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  158. package/dist/esm/components/XAdkSender/InputTags.d.ts +2 -2
  159. package/dist/esm/components/XAdkSender/InputTags.js +10 -9
  160. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
  161. package/dist/esm/components/XAdkSender/index.js +206 -122
  162. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  163. package/dist/esm/components/XAdkSender/styles.d.ts +4 -0
  164. package/dist/esm/components/XAdkSender/styles.js +29 -25
  165. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  166. package/dist/esm/components/XAiConversations/styles.js +3 -3
  167. package/dist/esm/components/XAiConversations/styles.js.map +1 -1
  168. package/dist/esm/hooks/useADKChat.js +8 -2
  169. package/dist/esm/hooks/useADKChat.js.map +1 -1
  170. package/dist/esm/index.d.ts +8 -2
  171. package/dist/esm/index.js +7 -3
  172. package/dist/esm/index.js.map +1 -1
  173. package/dist/esm/presets/base.d.ts +6 -0
  174. package/dist/esm/presets/base.js +28 -0
  175. package/dist/esm/presets/base.js.map +1 -0
  176. package/dist/esm/presets/define.d.ts +11 -0
  177. package/dist/esm/presets/define.js +33 -0
  178. package/dist/esm/presets/define.js.map +1 -0
  179. package/dist/esm/presets/index.d.ts +3 -0
  180. package/dist/esm/presets/index.js +4 -0
  181. package/dist/esm/presets/index.js.map +1 -0
  182. package/dist/esm/presets/runtime.d.ts +22 -0
  183. package/dist/esm/presets/runtime.js +45 -0
  184. package/dist/esm/presets/runtime.js.map +1 -0
  185. package/dist/esm/presets/xgroup/index.d.ts +5 -0
  186. package/dist/esm/presets/xgroup/index.js +6 -0
  187. package/dist/esm/presets/xgroup/index.js.map +1 -1
  188. package/dist/esm/presets/xgroup/knowledgeReference.d.ts +17 -0
  189. package/dist/esm/presets/xgroup/knowledgeReference.js +95 -0
  190. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -0
  191. package/dist/esm/presets/xgroup/preset.d.ts +1 -13
  192. package/dist/esm/presets/xgroup/preset.js +9 -29
  193. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  194. package/dist/esm/presets/xgroup/strategies.d.ts +5 -4
  195. package/dist/esm/presets/xgroup/strategies.js +8 -20
  196. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  197. package/dist/esm/presets/xgroup/webReference.d.ts +10 -0
  198. package/dist/esm/presets/xgroup/webReference.js +46 -0
  199. package/dist/esm/presets/xgroup/webReference.js.map +1 -0
  200. package/dist/esm/types/ChatStrategies.d.ts +11 -2
  201. package/dist/esm/types/ChatStrategies.js.map +1 -1
  202. package/dist/esm/types/FileGallery.d.ts +3 -0
  203. package/dist/esm/types/FileGallery.js.map +1 -1
  204. package/dist/esm/types/Sources.d.ts +30 -0
  205. package/dist/esm/types/Sources.js +2 -0
  206. package/dist/esm/types/Sources.js.map +1 -0
  207. package/dist/esm/types/XAdkChatbot.d.ts +33 -0
  208. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  209. package/dist/esm/types/XAdkSender.d.ts +112 -21
  210. package/dist/esm/types/XAdkSender.js.map +1 -1
  211. package/dist/esm/types/index.d.ts +1 -0
  212. package/dist/esm/types/index.js +1 -0
  213. package/dist/esm/types/index.js.map +1 -1
  214. package/dist/esm/utils/index.d.ts +1 -0
  215. package/dist/esm/utils/index.js +1 -0
  216. package/dist/esm/utils/index.js.map +1 -1
  217. package/dist/esm/utils/markdownResource.d.ts +14 -0
  218. package/dist/esm/utils/markdownResource.js +101 -0
  219. package/dist/esm/utils/markdownResource.js.map +1 -0
  220. package/dist/umd/chat-sdk.min.js +1 -1
  221. package/package.json +6 -1
@@ -25,10 +25,12 @@ module.exports = __toCommonJS(InlineTagInput_exports);
25
25
  var import_react = require("react");
26
26
  var import_client = require("react-dom/client");
27
27
  var import_styles = require("./styles");
28
+ var import_markdownResource = require("../../utils/markdownResource");
28
29
  var import_jsx_runtime = require("react/jsx-runtime");
29
- var TAG_ATTR = "data-xadk-inline-tag-id";
30
+ var MENTION_ATTR = "data-xadk-inline-mention-id";
30
31
  var CARET_TEXT = "​";
31
32
  var createTextNode = (text) => document.createTextNode(text);
33
+ var useIsomorphicLayoutEffect = typeof window === "undefined" ? import_react.useEffect : import_react.useLayoutEffect;
32
34
  var normalizeText = (text) => text.replace(/\u200B/g, "").replace(/\u00a0/g, " ");
33
35
  var getPlainLength = (text) => normalizeText(text).length;
34
36
  var toRawOffset = (text, plainOffset) => {
@@ -44,30 +46,48 @@ var toRawOffset = (text, plainOffset) => {
44
46
  var InlineTagInput = (0, import_react.forwardRef)(
45
47
  ({
46
48
  value,
47
- tags,
49
+ mentions,
50
+ defaultInputParts,
48
51
  placeholder,
49
52
  disabled,
50
53
  onChange,
51
- onTagsChange,
54
+ onMentionsChange,
52
55
  onKeyDown,
53
56
  onKeyUp,
54
- renderTag
57
+ renderMention
55
58
  }, ref) => {
56
59
  const styles = (0, import_styles.useStyles)();
57
60
  const editorRef = (0, import_react.useRef)(null);
58
- const latestTagsRef = (0, import_react.useRef)(tags);
61
+ const latestMentionsRef = (0, import_react.useRef)(mentions);
59
62
  const tagRootMapRef = (0, import_react.useRef)(/* @__PURE__ */ new WeakMap());
60
63
  const composingRef = (0, import_react.useRef)(false);
61
64
  const lastInsertedCaretRef = (0, import_react.useRef)(null);
65
+ const savedRangeRef = (0, import_react.useRef)(null);
66
+ const defaultInputPartsAppliedRef = (0, import_react.useRef)(false);
67
+ const skipEmptyCleanupOnceRef = (0, import_react.useRef)(false);
68
+ const structuralCleanupFrameRef = (0, import_react.useRef)(null);
69
+ const [hasContent, setHasContent] = (0, import_react.useState)(
70
+ () => Boolean(value || mentions.length)
71
+ );
72
+ const lastEmittedStateRef = (0, import_react.useRef)({
73
+ value,
74
+ mentionIds: mentions.map((mention) => mention.id).join("|")
75
+ });
62
76
  (0, import_react.useEffect)(() => {
63
- latestTagsRef.current = tags;
64
- }, [tags]);
65
- const getOrderedTags = (0, import_react.useCallback)(() => {
77
+ latestMentionsRef.current = mentions;
78
+ }, [mentions]);
79
+ const getOrderedMentions = (0, import_react.useCallback)(() => {
66
80
  const editor = editorRef.current;
67
81
  if (!editor)
68
82
  return [];
69
- const tagMap = new Map(latestTagsRef.current.map((tag) => [tag.id, tag]));
70
- return Array.from(editor.querySelectorAll(`[${TAG_ATTR}]`)).map((node) => tagMap.get(node.dataset.xadkInlineTagId || "")).filter(Boolean);
83
+ const mentionMap = new Map(
84
+ latestMentionsRef.current.map((mention) => [mention.id, mention])
85
+ );
86
+ return Array.from(editor.querySelectorAll(`[${MENTION_ATTR}]`)).map(
87
+ (node) => mentionMap.get(
88
+ node.dataset.xadkInlineMentionId || ""
89
+ )
90
+ ).filter(Boolean);
71
91
  }, []);
72
92
  const getPlainText = (0, import_react.useCallback)(() => {
73
93
  const editor = editorRef.current;
@@ -81,17 +101,51 @@ var InlineTagInput = (0, import_react.forwardRef)(
81
101
  });
82
102
  return normalizeText(text);
83
103
  }, []);
84
- const emitChange = (0, import_react.useCallback)(() => {
85
- onChange(getPlainText());
86
- onTagsChange(getOrderedTags());
87
- }, [getOrderedTags, getPlainText, onChange, onTagsChange]);
88
- const removeTextRange = (0, import_react.useCallback)((node, start, end) => {
89
- const text = node.textContent || "";
90
- node.textContent = `${text.slice(0, start)}${text.slice(end)}`;
91
- if (!node.textContent)
92
- node.remove();
104
+ const getParts = (0, import_react.useCallback)(() => {
105
+ const editor = editorRef.current;
106
+ if (!editor)
107
+ return [];
108
+ const mentionMap = new Map(
109
+ latestMentionsRef.current.map((mention) => [mention.id, mention])
110
+ );
111
+ const parts = [];
112
+ editor.childNodes.forEach((node) => {
113
+ if (node.nodeType === Node.TEXT_NODE) {
114
+ const text = normalizeText(node.textContent || "");
115
+ if (text)
116
+ parts.push({ type: "text", text });
117
+ return;
118
+ }
119
+ if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR)) {
120
+ const mentionId = node.dataset.xadkInlineMentionId || "";
121
+ const mention = mentionMap.get(mentionId);
122
+ if (mention)
123
+ parts.push({ type: "mention", mention });
124
+ }
125
+ });
126
+ return parts;
93
127
  }, []);
94
- const removeTagNode = (0, import_react.useCallback)(
128
+ const emitChange = (0, import_react.useCallback)(() => {
129
+ const nextValue = getPlainText();
130
+ const nextMentions = getOrderedMentions();
131
+ setHasContent(Boolean(nextValue || nextMentions.length));
132
+ lastEmittedStateRef.current = {
133
+ value: nextValue,
134
+ mentionIds: nextMentions.map((mention) => mention.id).join("|")
135
+ };
136
+ onChange(nextValue);
137
+ onMentionsChange(nextMentions);
138
+ }, [getOrderedMentions, getPlainText, onChange, onMentionsChange]);
139
+ const removeTextRange = (0, import_react.useCallback)(
140
+ (node, start, end) => {
141
+ const text = node.textContent || "";
142
+ node.textContent = `${text.slice(0, start)}${text.slice(end)}`;
143
+ if (!node.textContent)
144
+ node.remove();
145
+ },
146
+ []
147
+ );
148
+ const removeMentionNode = (0, import_react.useCallback)(
95
149
  (node) => {
96
150
  var _a, _b, _c;
97
151
  const previous = node.previousSibling;
@@ -110,56 +164,87 @@ var InlineTagInput = (0, import_react.forwardRef)(
110
164
  const text = previous.textContent || "";
111
165
  const spaceLength = ((_c = text.match(/\s+$/)) == null ? void 0 : _c[0].length) || 0;
112
166
  if (spaceLength > 0) {
113
- removeTextRange(previous, text.length - spaceLength, text.length);
167
+ removeTextRange(
168
+ previous,
169
+ text.length - spaceLength,
170
+ text.length
171
+ );
114
172
  }
115
173
  }
116
174
  },
117
175
  [removeTextRange]
118
176
  );
119
- const removeTagById = (0, import_react.useCallback)(
177
+ const removeMentionById = (0, import_react.useCallback)(
120
178
  (id) => {
121
179
  const editor = editorRef.current;
122
- const node = Array.from((editor == null ? void 0 : editor.querySelectorAll(`[${TAG_ATTR}]`)) || []).find(
123
- (item) => item.dataset.xadkInlineTagId === id
180
+ const node = Array.from(
181
+ (editor == null ? void 0 : editor.querySelectorAll(`[${MENTION_ATTR}]`)) || []
182
+ ).find(
183
+ (item) => item.dataset.xadkInlineMentionId === id
124
184
  );
125
185
  if (node) {
126
- removeTagNode(node);
186
+ removeMentionNode(node);
127
187
  }
128
188
  emitChange();
129
189
  editor == null ? void 0 : editor.focus();
130
190
  },
131
- [emitChange, removeTagNode]
191
+ [emitChange, removeMentionNode]
132
192
  );
133
- const buildTagNode = (0, import_react.useCallback)(
134
- (tag) => {
193
+ const buildMentionNode = (0, import_react.useCallback)(
194
+ (mention) => {
135
195
  const span = document.createElement("span");
136
196
  span.setAttribute("contenteditable", "false");
137
- span.setAttribute(TAG_ATTR, tag.id);
138
- span.dataset.xadkInlineTagId = tag.id;
197
+ span.setAttribute(MENTION_ATTR, mention.id);
198
+ span.dataset.xadkInlineMentionId = mention.id;
199
+ span.dataset.xadkInlineMentionType = mention.type;
139
200
  span.className = styles.inlineTag;
140
- if (renderTag) {
201
+ if (renderMention) {
141
202
  const root = (0, import_client.createRoot)(span);
142
203
  tagRootMapRef.current.set(span, root);
143
204
  root.render(
144
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: renderTag(tag, { onRemove: () => removeTagById(tag.id) }) })
205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: renderMention(mention, {
206
+ onRemove: () => removeMentionById(mention.id)
207
+ }) })
145
208
  );
146
209
  } else {
147
210
  const label = document.createElement("span");
148
211
  label.className = "xadk-inline-tag-label";
149
- label.textContent = tag.label;
212
+ label.textContent = mention.displayName || mention.label;
150
213
  const close = document.createElement("span");
151
214
  close.className = "xadk-inline-tag-close";
152
215
  close.innerHTML = "×";
153
216
  close.onclick = (event) => {
154
217
  event.preventDefault();
155
218
  event.stopPropagation();
156
- removeTagById(tag.id);
219
+ removeMentionById(mention.id);
157
220
  };
158
221
  span.append(label, close);
159
222
  }
160
223
  return span;
161
224
  },
162
- [removeTagById, renderTag, styles.inlineTag]
225
+ [removeMentionById, renderMention, styles.inlineTag]
226
+ );
227
+ const renderPartsToEditor = (0, import_react.useCallback)(
228
+ (parts) => {
229
+ const editor = editorRef.current;
230
+ if (!editor)
231
+ return;
232
+ editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {
233
+ var _a;
234
+ (_a = tagRootMapRef.current.get(node)) == null ? void 0 : _a.unmount();
235
+ });
236
+ editor.innerHTML = "";
237
+ parts.forEach((part) => {
238
+ if (part.type === "text") {
239
+ if (part.text)
240
+ editor.appendChild(createTextNode(part.text));
241
+ return;
242
+ }
243
+ const mention = part.type === "mention" ? part.mention : part.tag;
244
+ editor.append(buildMentionNode(mention), createTextNode(CARET_TEXT));
245
+ });
246
+ },
247
+ [buildMentionNode]
163
248
  );
164
249
  const setCursorAtTextEnd = (0, import_react.useCallback)((node) => {
165
250
  var _a;
@@ -169,6 +254,18 @@ var InlineTagInput = (0, import_react.forwardRef)(
169
254
  range.collapse(true);
170
255
  selection == null ? void 0 : selection.removeAllRanges();
171
256
  selection == null ? void 0 : selection.addRange(range);
257
+ savedRangeRef.current = range.cloneRange();
258
+ }, []);
259
+ const saveSelectionRange = (0, import_react.useCallback)(() => {
260
+ const editor = editorRef.current;
261
+ const selection = window.getSelection();
262
+ if (!editor || !selection || selection.rangeCount === 0)
263
+ return;
264
+ const range = selection.getRangeAt(0);
265
+ if (!editor.contains(range.startContainer) || !editor.contains(range.endContainer)) {
266
+ return;
267
+ }
268
+ savedRangeRef.current = range.cloneRange();
172
269
  }, []);
173
270
  const restoreCursorAfterInsert = (0, import_react.useCallback)(
174
271
  (node) => {
@@ -180,46 +277,77 @@ var InlineTagInput = (0, import_react.forwardRef)(
180
277
  },
181
278
  [setCursorAtTextEnd]
182
279
  );
183
- const isTagNode = (node) => node instanceof HTMLElement && node.hasAttribute(TAG_ATTR);
280
+ const isMentionNode = (node) => node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR);
184
281
  const isOnlyCaretText = (text) => normalizeText(text) === "";
185
- const getTagBeforeRange = (range) => {
282
+ const getMentionBeforeRange = (range) => {
186
283
  const container = range.startContainer;
187
284
  if (container.nodeType === Node.TEXT_NODE) {
188
285
  const text = container.textContent || "";
189
286
  const beforeCursor = text.slice(0, range.startOffset);
190
- if (isOnlyCaretText(beforeCursor) && isTagNode(container.previousSibling)) {
287
+ if (isOnlyCaretText(beforeCursor) && isMentionNode(container.previousSibling)) {
191
288
  return container.previousSibling;
192
289
  }
193
290
  }
194
291
  if (container instanceof HTMLElement) {
195
292
  const previous = container.childNodes[range.startOffset - 1];
196
- if (isTagNode(previous))
293
+ if (isMentionNode(previous))
197
294
  return previous;
198
- if ((previous == null ? void 0 : previous.nodeType) === Node.TEXT_NODE && isOnlyCaretText(previous.textContent || "") && isTagNode(previous.previousSibling)) {
295
+ if ((previous == null ? void 0 : previous.nodeType) === Node.TEXT_NODE && isOnlyCaretText(previous.textContent || "") && isMentionNode(previous.previousSibling)) {
199
296
  return previous.previousSibling;
200
297
  }
201
298
  }
202
299
  return null;
203
300
  };
204
- const getTagAfterRange = (range) => {
301
+ const getMentionAfterRange = (range) => {
205
302
  const container = range.startContainer;
206
303
  if (container.nodeType === Node.TEXT_NODE) {
207
304
  const text = container.textContent || "";
208
305
  const afterCursor = text.slice(range.startOffset);
209
- if (isOnlyCaretText(afterCursor) && isTagNode(container.nextSibling)) {
306
+ if (isOnlyCaretText(afterCursor) && isMentionNode(container.nextSibling)) {
210
307
  return container.nextSibling;
211
308
  }
212
309
  }
213
310
  if (container instanceof HTMLElement) {
214
311
  const next = container.childNodes[range.startOffset];
215
- if (isTagNode(next))
312
+ if (isMentionNode(next))
216
313
  return next;
217
- if ((next == null ? void 0 : next.nodeType) === Node.TEXT_NODE && isOnlyCaretText(next.textContent || "") && isTagNode(next.nextSibling)) {
314
+ if ((next == null ? void 0 : next.nodeType) === Node.TEXT_NODE && isOnlyCaretText(next.textContent || "") && isMentionNode(next.nextSibling)) {
218
315
  return next.nextSibling;
219
316
  }
220
317
  }
221
318
  return null;
222
319
  };
320
+ const moveCursorAroundMention = (0, import_react.useCallback)(
321
+ (mention, direction) => {
322
+ var _a, _b;
323
+ const editor = editorRef.current;
324
+ const selection = window.getSelection();
325
+ if (!editor || !selection || !editor.contains(mention))
326
+ return;
327
+ const range = document.createRange();
328
+ if (direction === "before") {
329
+ const previous = mention.previousSibling;
330
+ if ((previous == null ? void 0 : previous.nodeType) === Node.TEXT_NODE) {
331
+ range.setStart(previous, ((_a = previous.textContent) == null ? void 0 : _a.length) || 0);
332
+ } else {
333
+ range.setStartBefore(mention);
334
+ }
335
+ } else {
336
+ const next = mention.nextSibling;
337
+ if ((next == null ? void 0 : next.nodeType) === Node.TEXT_NODE) {
338
+ const leadingCaretLength = ((_b = (next.textContent || "").match(/^\u200B+/)) == null ? void 0 : _b[0].length) || 0;
339
+ range.setStart(next, leadingCaretLength);
340
+ } else {
341
+ range.setStartAfter(mention);
342
+ }
343
+ }
344
+ range.collapse(true);
345
+ selection.removeAllRanges();
346
+ selection.addRange(range);
347
+ savedRangeRef.current = range.cloneRange();
348
+ },
349
+ []
350
+ );
223
351
  const getOffsetInEditor = (0, import_react.useCallback)(() => {
224
352
  const editor = editorRef.current;
225
353
  const selection = window.getSelection();
@@ -240,7 +368,7 @@ var InlineTagInput = (0, import_react.forwardRef)(
240
368
  found = true;
241
369
  return;
242
370
  }
243
- if (node instanceof HTMLElement && node.hasAttribute(TAG_ATTR))
371
+ if (node instanceof HTMLElement && node.hasAttribute(MENTION_ATTR))
244
372
  return;
245
373
  if (node.nodeType === Node.TEXT_NODE) {
246
374
  offset += getPlainLength(node.textContent || "");
@@ -315,31 +443,92 @@ var InlineTagInput = (0, import_react.forwardRef)(
315
443
  }
316
444
  });
317
445
  }, []);
318
- const insertTag = (0, import_react.useCallback)(
319
- (tag, replace) => {
446
+ const cleanupEmptyStructuralNodes = (0, import_react.useCallback)(() => {
447
+ const editor = editorRef.current;
448
+ const selection = window.getSelection();
449
+ if (!editor)
450
+ return;
451
+ Array.from(editor.children).forEach((node) => {
452
+ if (node.hasAttribute(MENTION_ATTR))
453
+ return;
454
+ if (node.querySelector(`[${MENTION_ATTR}]`))
455
+ return;
456
+ if (normalizeText(node.textContent || ""))
457
+ return;
458
+ const range = (selection == null ? void 0 : selection.rangeCount) ? selection.getRangeAt(0) : null;
459
+ const nodeIndex = getNodeIndex(node);
460
+ const containsCursor = Boolean(
461
+ range && range.collapsed && (range.startContainer === node || node.contains(range.startContainer) || range.startContainer === editor && (range.startOffset === nodeIndex || range.startOffset === nodeIndex + 1))
462
+ );
463
+ if (containsCursor && selection) {
464
+ const caretNode = createTextNode(CARET_TEXT);
465
+ node.replaceWith(caretNode);
466
+ const nextRange = document.createRange();
467
+ nextRange.setStart(caretNode, CARET_TEXT.length);
468
+ nextRange.collapse(true);
469
+ selection.removeAllRanges();
470
+ selection.addRange(nextRange);
471
+ savedRangeRef.current = nextRange.cloneRange();
472
+ return;
473
+ }
474
+ node.remove();
475
+ });
476
+ }, []);
477
+ (0, import_react.useEffect)(() => {
478
+ const editor = editorRef.current;
479
+ if (!editor)
480
+ return;
481
+ const handleNativeDelete = (event) => {
482
+ if (!(event instanceof InputEvent))
483
+ return;
484
+ if (!event.inputType.startsWith("delete"))
485
+ return;
486
+ if (structuralCleanupFrameRef.current !== null) {
487
+ window.cancelAnimationFrame(structuralCleanupFrameRef.current);
488
+ }
489
+ structuralCleanupFrameRef.current = window.requestAnimationFrame(() => {
490
+ structuralCleanupFrameRef.current = null;
491
+ cleanupEmptyStructuralNodes();
492
+ cleanupCaretTextNodes();
493
+ });
494
+ };
495
+ editor.addEventListener("input", handleNativeDelete);
496
+ return () => editor.removeEventListener("input", handleNativeDelete);
497
+ }, [cleanupCaretTextNodes, cleanupEmptyStructuralNodes]);
498
+ const insertMention = (0, import_react.useCallback)(
499
+ (mention, replace) => {
320
500
  const editor = editorRef.current;
321
501
  if (!editor)
322
502
  return;
503
+ const selectionBeforeFocus = window.getSelection();
504
+ const activeRangeBeforeFocus = (selectionBeforeFocus == null ? void 0 : selectionBeforeFocus.rangeCount) && editor.contains(selectionBeforeFocus.getRangeAt(0).startContainer) ? selectionBeforeFocus.getRangeAt(0).cloneRange() : null;
505
+ const savedRangeBeforeFocus = savedRangeRef.current && editor.contains(savedRangeRef.current.startContainer) ? savedRangeRef.current.cloneRange() : null;
506
+ const rangeBeforeFocus = activeRangeBeforeFocus || savedRangeBeforeFocus;
323
507
  editor.focus();
324
- latestTagsRef.current = [
325
- ...latestTagsRef.current.filter((item) => item.id !== tag.id),
326
- tag
508
+ latestMentionsRef.current = [
509
+ ...latestMentionsRef.current.filter((item) => item.id !== mention.id),
510
+ mention
327
511
  ];
328
512
  let insertRange = null;
329
513
  if (replace) {
330
514
  insertRange = replaceTextRange(replace.start, replace.end);
331
515
  cleanupCaretTextNodes();
332
516
  }
333
- const tagNode = buildTagNode(tag);
517
+ const isSemanticallyEmpty = !getPlainText() && !editor.querySelector(`[${MENTION_ATTR}]`);
518
+ if (isSemanticallyEmpty) {
519
+ editor.innerHTML = "";
520
+ savedRangeRef.current = null;
521
+ insertRange = null;
522
+ }
523
+ const mentionNode = buildMentionNode(mention);
334
524
  const caretNode = createTextNode(CARET_TEXT);
335
- const selection = window.getSelection();
336
- const range = insertRange || ((selection == null ? void 0 : selection.rangeCount) ? selection.getRangeAt(0) : null);
525
+ const range = insertRange || rangeBeforeFocus;
337
526
  if (range && editor.contains(range.startContainer)) {
338
527
  const fragment = document.createDocumentFragment();
339
- fragment.append(tagNode, caretNode);
528
+ fragment.append(mentionNode, caretNode);
340
529
  range.insertNode(fragment);
341
530
  } else {
342
- editor.append(tagNode, caretNode);
531
+ editor.append(mentionNode, caretNode);
343
532
  }
344
533
  cleanupCaretTextNodes();
345
534
  lastInsertedCaretRef.current = caretNode;
@@ -352,78 +541,175 @@ var InlineTagInput = (0, import_react.forwardRef)(
352
541
  });
353
542
  },
354
543
  [
355
- buildTagNode,
544
+ buildMentionNode,
356
545
  cleanupCaretTextNodes,
357
546
  emitChange,
547
+ getPlainText,
358
548
  replaceTextRange,
359
549
  restoreCursorAfterInsert,
360
550
  setCursorAtTextEnd
361
551
  ]
362
552
  );
363
- (0, import_react.useImperativeHandle)(ref, () => ({
364
- focus: () => {
365
- var _a;
366
- return (_a = editorRef.current) == null ? void 0 : _a.focus();
367
- },
368
- getText: getPlainText,
369
- getCursorOffset: getOffsetInEditor,
370
- insertTag
371
- }), [getOffsetInEditor, getPlainText, insertTag]);
372
- (0, import_react.useEffect)(() => {
373
- const editor = editorRef.current;
374
- if (!editor || editor.childNodes.length > 0)
375
- return;
376
- if (value)
377
- editor.appendChild(createTextNode(value));
378
- tags.forEach((tag) => editor.append(buildTagNode(tag), createTextNode(CARET_TEXT)));
379
- }, []);
380
553
  (0, import_react.useEffect)(() => {
554
+ document.addEventListener("selectionchange", saveSelectionRange);
555
+ return () => {
556
+ document.removeEventListener("selectionchange", saveSelectionRange);
557
+ };
558
+ }, [saveSelectionRange]);
559
+ (0, import_react.useEffect)(
560
+ () => () => {
561
+ if (structuralCleanupFrameRef.current !== null) {
562
+ window.cancelAnimationFrame(structuralCleanupFrameRef.current);
563
+ }
564
+ },
565
+ []
566
+ );
567
+ (0, import_react.useImperativeHandle)(
568
+ ref,
569
+ () => ({
570
+ focus: () => {
571
+ var _a;
572
+ return (_a = editorRef.current) == null ? void 0 : _a.focus();
573
+ },
574
+ getText: getPlainText,
575
+ getParts,
576
+ getCursorOffset: getOffsetInEditor,
577
+ insertMention,
578
+ insertTag: insertMention
579
+ }),
580
+ [getOffsetInEditor, getParts, getPlainText, insertMention]
581
+ );
582
+ useIsomorphicLayoutEffect(() => {
381
583
  const editor = editorRef.current;
382
584
  if (!editor)
383
585
  return;
384
- const existingNodes = Array.from(editor.querySelectorAll(`[${TAG_ATTR}]`));
385
- const nextTagMap = new Map(tags.map((tag) => [tag.id, tag]));
386
- const existingIds = new Set(
387
- existingNodes.map((node) => node.dataset.xadkInlineTagId || "")
388
- );
389
- existingNodes.forEach((node) => {
390
- const tagId = node.dataset.xadkInlineTagId || "";
391
- if (!nextTagMap.has(tagId)) {
392
- removeTagNode(node);
393
- }
394
- });
395
- tags.forEach((tag) => {
396
- if (existingIds.has(tag.id))
397
- return;
398
- editor.append(buildTagNode(tag), createTextNode(CARET_TEXT));
399
- });
400
- }, [buildTagNode, removeTagNode, tags]);
401
- (0, import_react.useEffect)(() => {
586
+ if (!defaultInputPartsAppliedRef.current && (defaultInputParts == null ? void 0 : defaultInputParts.length) && !value && mentions.length === 0) {
587
+ defaultInputPartsAppliedRef.current = true;
588
+ skipEmptyCleanupOnceRef.current = true;
589
+ renderPartsToEditor(defaultInputParts);
590
+ emitChange();
591
+ return;
592
+ }
593
+ const incomingMentionIds = mentions.map((mention) => mention.id).join("|");
594
+ const lastEmittedState = lastEmittedStateRef.current;
595
+ const isInternalControlledEcho = value === lastEmittedState.value && incomingMentionIds === lastEmittedState.mentionIds;
596
+ if (isInternalControlledEcho && editor.childNodes.length > 0)
597
+ return;
598
+ renderPartsToEditor([
599
+ ...value ? [{ type: "text", text: value }] : [],
600
+ ...mentions.map((mention) => ({ type: "mention", mention }))
601
+ ]);
602
+ setHasContent(Boolean(value || mentions.length));
603
+ const lastTextNode = Array.from(editor.childNodes).reverse().find((node) => node.nodeType === Node.TEXT_NODE);
604
+ if (document.activeElement === editor && lastTextNode) {
605
+ setCursorAtTextEnd(lastTextNode);
606
+ }
607
+ }, [
608
+ defaultInputParts,
609
+ emitChange,
610
+ renderPartsToEditor,
611
+ setCursorAtTextEnd,
612
+ mentions,
613
+ value
614
+ ]);
615
+ useIsomorphicLayoutEffect(() => {
402
616
  const editor = editorRef.current;
403
617
  if (!editor)
404
618
  return;
405
- if (!value && tags.length === 0 && editor.childNodes.length > 0) {
406
- editor.querySelectorAll(`[${TAG_ATTR}]`).forEach((node) => {
619
+ if (skipEmptyCleanupOnceRef.current) {
620
+ skipEmptyCleanupOnceRef.current = false;
621
+ return;
622
+ }
623
+ if (!value && mentions.length === 0 && editor.childNodes.length > 0) {
624
+ editor.querySelectorAll(`[${MENTION_ATTR}]`).forEach((node) => {
407
625
  var _a;
408
626
  (_a = tagRootMapRef.current.get(node)) == null ? void 0 : _a.unmount();
409
627
  });
410
628
  editor.innerHTML = "";
411
629
  }
412
- }, [tags.length, value]);
630
+ }, [mentions.length, value]);
413
631
  const handleInput = () => {
414
- if (!composingRef.current)
632
+ if (!composingRef.current) {
633
+ cleanupEmptyStructuralNodes();
634
+ cleanupCaretTextNodes();
415
635
  emitChange();
636
+ if (structuralCleanupFrameRef.current !== null) {
637
+ window.cancelAnimationFrame(structuralCleanupFrameRef.current);
638
+ }
639
+ structuralCleanupFrameRef.current = window.requestAnimationFrame(() => {
640
+ structuralCleanupFrameRef.current = null;
641
+ cleanupEmptyStructuralNodes();
642
+ cleanupCaretTextNodes();
643
+ });
644
+ }
645
+ };
646
+ const handlePaste = (event) => {
647
+ event.preventDefault();
648
+ const editor = editorRef.current;
649
+ if (!editor)
650
+ return;
651
+ const text = event.clipboardData.getData("text/plain");
652
+ if (!text)
653
+ return;
654
+ const parts = (0, import_markdownResource.parseMarkdownResourceLinksAsParts)(text);
655
+ const selection = window.getSelection();
656
+ const range = (selection == null ? void 0 : selection.rangeCount) && editor.contains(selection.getRangeAt(0).startContainer) ? selection.getRangeAt(0) : null;
657
+ const fragment = document.createDocumentFragment();
658
+ let lastTextNode = null;
659
+ for (const part of parts) {
660
+ if (part.type === "text") {
661
+ lastTextNode = createTextNode(part.text);
662
+ fragment.append(lastTextNode);
663
+ continue;
664
+ }
665
+ latestMentionsRef.current = [
666
+ ...latestMentionsRef.current,
667
+ part.mention
668
+ ];
669
+ fragment.append(buildMentionNode(part.mention));
670
+ lastTextNode = createTextNode(CARET_TEXT);
671
+ fragment.append(lastTextNode);
672
+ }
673
+ if (range) {
674
+ range.deleteContents();
675
+ range.insertNode(fragment);
676
+ } else {
677
+ editor.append(fragment);
678
+ }
679
+ cleanupCaretTextNodes();
680
+ if (lastTextNode)
681
+ setCursorAtTextEnd(lastTextNode);
682
+ emitChange();
416
683
  };
417
684
  const handleKeyDown = (event) => {
685
+ if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
686
+ const selection = window.getSelection();
687
+ if (selection == null ? void 0 : selection.rangeCount) {
688
+ const range = selection.getRangeAt(0);
689
+ if (range.collapsed) {
690
+ const targetMention = event.key === "ArrowLeft" ? getMentionBeforeRange(range) : getMentionAfterRange(range);
691
+ if (targetMention) {
692
+ event.preventDefault();
693
+ moveCursorAroundMention(
694
+ targetMention,
695
+ event.key === "ArrowLeft" ? "before" : "after"
696
+ );
697
+ return;
698
+ }
699
+ }
700
+ }
701
+ }
418
702
  if (event.key === "Backspace" || event.key === "Delete") {
419
703
  const selection = window.getSelection();
420
704
  if (selection == null ? void 0 : selection.rangeCount) {
421
705
  const range = selection.getRangeAt(0);
422
706
  if (range.collapsed) {
423
- const targetTag = event.key === "Backspace" ? getTagBeforeRange(range) : getTagAfterRange(range);
424
- if (targetTag) {
707
+ const targetMention = event.key === "Backspace" ? getMentionBeforeRange(range) : getMentionAfterRange(range);
708
+ if (targetMention) {
425
709
  event.preventDefault();
426
- removeTagById(targetTag.dataset.xadkInlineTagId || "");
710
+ removeMentionById(
711
+ targetMention.dataset.xadkInlineMentionId || ""
712
+ );
427
713
  return;
428
714
  }
429
715
  }
@@ -431,29 +717,41 @@ var InlineTagInput = (0, import_react.forwardRef)(
431
717
  }
432
718
  onKeyDown == null ? void 0 : onKeyDown(event);
433
719
  };
434
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.inlineInputWrapper, "data-placeholder": placeholder, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
435
- "div",
436
- {
437
- ref: editorRef,
438
- className: styles.inlineInput,
439
- contentEditable: !disabled,
440
- suppressContentEditableWarning: true,
441
- role: "textbox",
442
- "aria-multiline": "true",
443
- onInput: handleInput,
444
- onKeyDown: handleKeyDown,
445
- onKeyUp,
446
- onCompositionStart: () => {
447
- composingRef.current = true;
448
- },
449
- onCompositionEnd: () => {
450
- composingRef.current = false;
451
- emitChange();
452
- },
453
- "data-empty": !getPlainText() && getOrderedTags().length === 0,
454
- "data-cursor-offset": getOffsetInEditor()
455
- }
456
- ) });
720
+ const showPlaceholder = !hasContent;
721
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: styles.inlineInputWrapper, children: [
722
+ showPlaceholder && placeholder && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: styles.inlinePlaceholder, children: placeholder }),
723
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
724
+ "div",
725
+ {
726
+ ref: editorRef,
727
+ className: styles.inlineInput,
728
+ contentEditable: !disabled,
729
+ suppressContentEditableWarning: true,
730
+ role: "textbox",
731
+ "aria-multiline": "true",
732
+ onInput: handleInput,
733
+ onPaste: handlePaste,
734
+ onKeyDown: handleKeyDown,
735
+ onKeyUp: (event) => {
736
+ cleanupEmptyStructuralNodes();
737
+ cleanupCaretTextNodes();
738
+ saveSelectionRange();
739
+ onKeyUp == null ? void 0 : onKeyUp(event);
740
+ },
741
+ onMouseUp: saveSelectionRange,
742
+ onFocus: saveSelectionRange,
743
+ onCompositionStart: () => {
744
+ composingRef.current = true;
745
+ setHasContent(true);
746
+ },
747
+ onCompositionEnd: () => {
748
+ composingRef.current = false;
749
+ emitChange();
750
+ },
751
+ "data-cursor-offset": getOffsetInEditor()
752
+ }
753
+ )
754
+ ] });
457
755
  }
458
756
  );
459
757
  InlineTagInput.displayName = "InlineTagInput";