@baasix/lexical 0.0.2

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 (57) hide show
  1. package/README.md +281 -0
  2. package/dist/DateTimeComponent-4MX2IKXK.css +45 -0
  3. package/dist/DateTimeComponent-4MX2IKXK.css.map +1 -0
  4. package/dist/DateTimeComponent-7V5RW3AE.js +2928 -0
  5. package/dist/DateTimeComponent-7V5RW3AE.js.map +1 -0
  6. package/dist/EquationComponent-3IW3ONJD.js +159 -0
  7. package/dist/EquationComponent-3IW3ONJD.js.map +1 -0
  8. package/dist/EquationComponent-C2C6477P.css +28 -0
  9. package/dist/EquationComponent-C2C6477P.css.map +1 -0
  10. package/dist/ExcalidrawComponent-GZYLHNOY.js +267 -0
  11. package/dist/ExcalidrawComponent-GZYLHNOY.js.map +1 -0
  12. package/dist/ExcalidrawComponent-U6BD7DUB.css +152 -0
  13. package/dist/ExcalidrawComponent-U6BD7DUB.css.map +1 -0
  14. package/dist/ImageComponent-IYUGOT6O.css +73 -0
  15. package/dist/ImageComponent-IYUGOT6O.css.map +1 -0
  16. package/dist/ImageComponent-TTUYUG3M.js +429 -0
  17. package/dist/ImageComponent-TTUYUG3M.js.map +1 -0
  18. package/dist/PollComponent-CWI5UJF5.css +187 -0
  19. package/dist/PollComponent-CWI5UJF5.css.map +1 -0
  20. package/dist/PollComponent-KLJZSW5O.js +199 -0
  21. package/dist/PollComponent-KLJZSW5O.js.map +1 -0
  22. package/dist/StickyComponent-MZSTQF47.css +774 -0
  23. package/dist/StickyComponent-MZSTQF47.css.map +1 -0
  24. package/dist/StickyComponent-ZED6LNTX.js +233 -0
  25. package/dist/StickyComponent-ZED6LNTX.js.map +1 -0
  26. package/dist/chunk-35UCX4ZT.js +168 -0
  27. package/dist/chunk-35UCX4ZT.js.map +1 -0
  28. package/dist/chunk-44LUNGL3.js +16608 -0
  29. package/dist/chunk-44LUNGL3.js.map +1 -0
  30. package/dist/chunk-BHROZTZU.js +42 -0
  31. package/dist/chunk-BHROZTZU.js.map +1 -0
  32. package/dist/chunk-FJ6COZ4H.js +275 -0
  33. package/dist/chunk-FJ6COZ4H.js.map +1 -0
  34. package/dist/chunk-GSFNU3JE.js +211 -0
  35. package/dist/chunk-GSFNU3JE.js.map +1 -0
  36. package/dist/chunk-I43VQAHW.js +918 -0
  37. package/dist/chunk-I43VQAHW.js.map +1 -0
  38. package/dist/chunk-N22RKA5D.js +402 -0
  39. package/dist/chunk-N22RKA5D.js.map +1 -0
  40. package/dist/chunk-OIMMC5C3.js +134 -0
  41. package/dist/chunk-OIMMC5C3.js.map +1 -0
  42. package/dist/chunk-PZ5AY32C.js +10 -0
  43. package/dist/chunk-PZ5AY32C.js.map +1 -0
  44. package/dist/chunk-TVF6V3BJ.js +41 -0
  45. package/dist/chunk-TVF6V3BJ.js.map +1 -0
  46. package/dist/chunk-XTKVR2JI.js +225 -0
  47. package/dist/chunk-XTKVR2JI.js.map +1 -0
  48. package/dist/emoji-list-MUV74SND.js +8 -0
  49. package/dist/emoji-list-MUV74SND.js.map +1 -0
  50. package/dist/index.css +4234 -0
  51. package/dist/index.css.map +1 -0
  52. package/dist/index.d.ts +17 -0
  53. package/dist/index.js +16050 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/landscape-RJWVK6ET.jpg +0 -0
  56. package/dist/yellow-flower-R72KOP74.jpg +0 -0
  57. package/package.json +76 -0
@@ -0,0 +1,918 @@
1
+ // src/context/SettingsContext.tsx
2
+ import {
3
+ createContext,
4
+ useCallback,
5
+ useContext,
6
+ useMemo,
7
+ useState
8
+ } from "react";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var DEFAULT_SETTINGS = {
11
+ isCollab: false,
12
+ useCollabV2: false,
13
+ isRichText: true,
14
+ emptyEditor: false,
15
+ isCharLimit: false,
16
+ isCharLimitUtf8: false,
17
+ isAutocomplete: false,
18
+ isMaxLength: false,
19
+ showTreeView: false,
20
+ showTableOfContents: false,
21
+ shouldUseLexicalContextMenu: false,
22
+ shouldPreserveNewLinesInMarkdown: false,
23
+ tableCellMerge: true,
24
+ tableCellBackgroundColor: true,
25
+ tableScrollShadow: true,
26
+ tableFitNestedTables: true,
27
+ tableHorizontalScroll: true,
28
+ hasLinkAttributes: false,
29
+ hasNestedTables: true,
30
+ hasFitNestedTables: true,
31
+ isCodeHighlighted: true,
32
+ isCodeShiki: false,
33
+ selectionAlwaysOnDisplay: false,
34
+ listStrictIndent: false,
35
+ shouldAllowHighlightingWithBrackets: false,
36
+ shouldDisableFocusOnClickChecklist: false
37
+ };
38
+ var INITIAL_SETTINGS = {
39
+ ...DEFAULT_SETTINGS
40
+ };
41
+ var Context = createContext({
42
+ setOption: (_name, _value) => {
43
+ return;
44
+ },
45
+ settings: INITIAL_SETTINGS
46
+ });
47
+ var SettingsContext = ({
48
+ children
49
+ }) => {
50
+ const [settings, setSettings] = useState(INITIAL_SETTINGS);
51
+ const setOption = useCallback((setting, value) => {
52
+ setSettings((options) => ({
53
+ ...options,
54
+ [setting]: value
55
+ }));
56
+ }, []);
57
+ const contextValue = useMemo(() => {
58
+ return { setOption, settings };
59
+ }, [setOption, settings]);
60
+ return /* @__PURE__ */ jsx(Context.Provider, { value: contextValue, children });
61
+ };
62
+ var useSettings = () => {
63
+ return useContext(Context);
64
+ };
65
+
66
+ // src/plugins/EmojisPlugin/index.ts
67
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
68
+ import { TextNode as TextNode2 } from "lexical";
69
+ import { useEffect } from "react";
70
+
71
+ // src/nodes/EmojiNode.tsx
72
+ import { $applyNodeReplacement, TextNode } from "lexical";
73
+ var EmojiNode = class _EmojiNode extends TextNode {
74
+ __className;
75
+ static getType() {
76
+ return "emoji";
77
+ }
78
+ static clone(node) {
79
+ return new _EmojiNode(node.__className, node.__text, node.__key);
80
+ }
81
+ constructor(className, text, key) {
82
+ super(text, key);
83
+ this.__className = className;
84
+ }
85
+ createDOM(config) {
86
+ const dom = document.createElement("span");
87
+ const inner = super.createDOM(config);
88
+ dom.className = this.__className;
89
+ inner.className = "emoji-inner";
90
+ dom.appendChild(inner);
91
+ return dom;
92
+ }
93
+ updateDOM(prevNode, dom, config) {
94
+ const inner = dom.firstChild;
95
+ if (inner === null) {
96
+ return true;
97
+ }
98
+ super.updateDOM(prevNode, inner, config);
99
+ return false;
100
+ }
101
+ static importJSON(serializedNode) {
102
+ return $createEmojiNode(
103
+ serializedNode.className,
104
+ serializedNode.text
105
+ ).updateFromJSON(serializedNode);
106
+ }
107
+ exportJSON() {
108
+ return {
109
+ ...super.exportJSON(),
110
+ className: this.getClassName()
111
+ };
112
+ }
113
+ getClassName() {
114
+ const self = this.getLatest();
115
+ return self.__className;
116
+ }
117
+ };
118
+ function $createEmojiNode(className, emojiText) {
119
+ const node = new EmojiNode(className, emojiText).setMode("token");
120
+ return $applyNodeReplacement(node);
121
+ }
122
+
123
+ // src/plugins/EmojisPlugin/index.ts
124
+ var emojis = /* @__PURE__ */ new Map([
125
+ [":)", ["emoji happysmile", "\u{1F642}"]],
126
+ [":D", ["emoji veryhappysmile", "\u{1F600}"]],
127
+ [":(", ["emoji unhappysmile", "\u{1F641}"]],
128
+ ["<3", ["emoji heart", "\u2764"]]
129
+ ]);
130
+ function $findAndTransformEmoji(node) {
131
+ const text = node.getTextContent();
132
+ for (let i = 0; i < text.length; i++) {
133
+ const emojiData = emojis.get(text[i]) || emojis.get(text.slice(i, i + 2));
134
+ if (emojiData !== void 0) {
135
+ const [emojiStyle, emojiText] = emojiData;
136
+ let targetNode;
137
+ if (i === 0) {
138
+ [targetNode] = node.splitText(i + 2);
139
+ } else {
140
+ [, targetNode] = node.splitText(i, i + 2);
141
+ }
142
+ const emojiNode = $createEmojiNode(emojiStyle, emojiText);
143
+ targetNode.replace(emojiNode);
144
+ return emojiNode;
145
+ }
146
+ }
147
+ return null;
148
+ }
149
+ function $textNodeTransform(node) {
150
+ let targetNode = node;
151
+ while (targetNode !== null) {
152
+ if (!targetNode.isSimpleText()) {
153
+ return;
154
+ }
155
+ targetNode = $findAndTransformEmoji(targetNode);
156
+ }
157
+ }
158
+ function useEmojis(editor) {
159
+ useEffect(() => {
160
+ if (!editor.hasNodes([EmojiNode])) {
161
+ throw new Error("EmojisPlugin: EmojiNode not registered on editor");
162
+ }
163
+ return editor.registerNodeTransform(TextNode2, $textNodeTransform);
164
+ }, [editor]);
165
+ }
166
+ function EmojisPlugin() {
167
+ const [editor] = useLexicalComposerContext();
168
+ useEmojis(editor);
169
+ return null;
170
+ }
171
+
172
+ // src/plugins/KeywordsPlugin/index.ts
173
+ import { useLexicalComposerContext as useLexicalComposerContext2 } from "@lexical/react/LexicalComposerContext";
174
+ import { useLexicalTextEntity } from "@lexical/react/useLexicalTextEntity";
175
+ import { useCallback as useCallback2, useEffect as useEffect2 } from "react";
176
+
177
+ // src/nodes/KeywordNode.ts
178
+ import { $applyNodeReplacement as $applyNodeReplacement2, TextNode as TextNode3 } from "lexical";
179
+ var KeywordNode = class _KeywordNode extends TextNode3 {
180
+ static getType() {
181
+ return "keyword";
182
+ }
183
+ static clone(node) {
184
+ return new _KeywordNode(node.__text, node.__key);
185
+ }
186
+ static importJSON(serializedNode) {
187
+ return $createKeywordNode().updateFromJSON(serializedNode);
188
+ }
189
+ createDOM(config) {
190
+ const dom = super.createDOM(config);
191
+ dom.style.cursor = "default";
192
+ dom.className = "keyword";
193
+ return dom;
194
+ }
195
+ canInsertTextBefore() {
196
+ return false;
197
+ }
198
+ canInsertTextAfter() {
199
+ return false;
200
+ }
201
+ isTextEntity() {
202
+ return true;
203
+ }
204
+ };
205
+ function $createKeywordNode(keyword = "") {
206
+ return $applyNodeReplacement2(new KeywordNode(keyword));
207
+ }
208
+
209
+ // src/plugins/KeywordsPlugin/index.ts
210
+ var KEYWORDS_REGEX = /(^|$|[^A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ])(congrats|congratulations|gratuluju|gratuluji|gratulujeme|blahopřeju|blahopřeji|blahopřejeme|Til lykke|Tillykke|Glückwunsch|Gratuliere|felicitaciones|enhorabuena|paljon onnea|onnittelut|Félicitations|gratula|gratulálok|gratulálunk|congratulazioni|complimenti|おめでとう|おめでとうございます|축하해|축하해요|gratulerer|Gefeliciteerd|gratulacje|Parabéns|parabéns|felicitações|felicitări|мои поздравления|поздравляем|поздравляю|gratulujem|blahoželám|ยินดีด้วย|ขอแสดงความยินดี|tebrikler|tebrik ederim|恭喜|祝贺你|恭喜你|恭喜|恭喜|baie geluk|veels geluk|অভিনন্দন|Čestitam|Čestitke|Čestitamo|Συγχαρητήρια|Μπράβο|અભિનંદન|badhai|बधाई|अभिनंदन|Честитам|Свака част|hongera|வாழ்த்துகள்|வாழ்த்துக்கள்|అభినందనలు|അഭിനന്ദനങ്ങൾ|Chúc mừng|מזל טוב|mazel tov|mazal tov)(^|$|[^A-Za-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԧԱ-Ֆՙա-ևא-תװ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࢠࢢ-ࢬऄ-हऽॐक़-ॡॱ-ॷॹ-ॿঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-ళవ-హఽౘౙౠౡಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൠൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄງຈຊຍດ-ທນ-ຟມ-ຣລວສຫອ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏼᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡷᢀ-ᢨᢪᢰ-ᣵᤀ-ᤜᥐ-ᥭᥰ-ᥴᦀ-ᦫᧁ-ᧇᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᳩ-ᳬᳮ-ᳱᳵᳶᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎↃↄⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞⸯ々〆〱-〵〻〼ぁ-ゖゝ-ゟァ-ヺー-ヿㄅ-ㄭㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿌ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚗꚠ-ꛥꜗ-ꜟꜢ-ꞈꞋ-ꞎꞐ-ꞓꞠ-Ɦꟸ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꪀ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꯀ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ])/i;
211
+ function KeywordsPlugin() {
212
+ const [editor] = useLexicalComposerContext2();
213
+ useEffect2(() => {
214
+ if (!editor.hasNodes([KeywordNode])) {
215
+ throw new Error("KeywordsPlugin: KeywordNode not registered on editor");
216
+ }
217
+ }, [editor]);
218
+ const $createKeywordNode_ = useCallback2((textNode) => {
219
+ return $createKeywordNode(textNode.getTextContent());
220
+ }, []);
221
+ const getKeywordMatch = useCallback2((text) => {
222
+ const matchArr = KEYWORDS_REGEX.exec(text);
223
+ if (matchArr === null) {
224
+ return null;
225
+ }
226
+ const hashtagLength = matchArr[2].length;
227
+ const startOffset = matchArr.index + matchArr[1].length;
228
+ const endOffset = startOffset + hashtagLength;
229
+ return {
230
+ end: endOffset,
231
+ start: startOffset
232
+ };
233
+ }, []);
234
+ useLexicalTextEntity(
235
+ getKeywordMatch,
236
+ KeywordNode,
237
+ $createKeywordNode_
238
+ );
239
+ return null;
240
+ }
241
+
242
+ // src/plugins/LinkPlugin/index.tsx
243
+ import { LinkPlugin as LexicalLinkPlugin } from "@lexical/react/LexicalLinkPlugin";
244
+
245
+ // src/utils/url.ts
246
+ var SUPPORTED_URL_PROTOCOLS = /* @__PURE__ */ new Set([
247
+ "http:",
248
+ "https:",
249
+ "mailto:",
250
+ "sms:",
251
+ "tel:"
252
+ ]);
253
+ function sanitizeUrl(url) {
254
+ try {
255
+ const parsedUrl = new URL(url);
256
+ if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) {
257
+ return "about:blank";
258
+ }
259
+ } catch {
260
+ return url;
261
+ }
262
+ return url;
263
+ }
264
+ var urlRegExp = new RegExp(
265
+ /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-_]*)?\??(?:[-+=&;%@.\w_]*)#?(?:[\w]*))?)/
266
+ );
267
+ function validateUrl(url) {
268
+ return url === "https://" || urlRegExp.test(url);
269
+ }
270
+
271
+ // src/plugins/LinkPlugin/index.tsx
272
+ import { jsx as jsx2 } from "react/jsx-runtime";
273
+ function LinkPlugin({
274
+ hasLinkAttributes = false
275
+ }) {
276
+ return /* @__PURE__ */ jsx2(
277
+ LexicalLinkPlugin,
278
+ {
279
+ validateUrl,
280
+ attributes: hasLinkAttributes ? {
281
+ rel: "noopener noreferrer",
282
+ target: "_blank"
283
+ } : void 0
284
+ }
285
+ );
286
+ }
287
+
288
+ // src/plugins/MentionsPlugin/index.tsx
289
+ import { useLexicalComposerContext as useLexicalComposerContext3 } from "@lexical/react/LexicalComposerContext";
290
+ import {
291
+ LexicalTypeaheadMenuPlugin,
292
+ MenuOption,
293
+ useBasicTypeaheadTriggerMatch
294
+ } from "@lexical/react/LexicalTypeaheadMenuPlugin";
295
+ import { useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo2, useState as useState2 } from "react";
296
+ import * as ReactDOM from "react-dom";
297
+
298
+ // src/context/EditorConfigContext.tsx
299
+ import { createContext as createContext2, useContext as useContext2 } from "react";
300
+ import { jsx as jsx3 } from "react/jsx-runtime";
301
+ var EditorConfigContext = createContext2(null);
302
+ function EditorConfigProvider({
303
+ baasixClient,
304
+ folder,
305
+ children
306
+ }) {
307
+ return /* @__PURE__ */ jsx3(EditorConfigContext.Provider, { value: { baasixClient, folder }, children });
308
+ }
309
+ function useEditorConfig() {
310
+ const ctx = useContext2(EditorConfigContext);
311
+ if (!ctx) {
312
+ throw new Error("useEditorConfig must be used within EditorConfigProvider");
313
+ }
314
+ return ctx;
315
+ }
316
+
317
+ // src/nodes/MentionNode.ts
318
+ import {
319
+ $applyNodeReplacement as $applyNodeReplacement3,
320
+ TextNode as TextNode4
321
+ } from "lexical";
322
+ function $convertMentionElement(domNode) {
323
+ const textContent = domNode.textContent;
324
+ const mentionName = domNode.getAttribute("data-lexical-mention-name");
325
+ if (textContent !== null) {
326
+ const node = $createMentionNode(
327
+ typeof mentionName === "string" ? mentionName : textContent,
328
+ textContent
329
+ );
330
+ return {
331
+ node
332
+ };
333
+ }
334
+ return null;
335
+ }
336
+ var mentionStyle = "background-color: rgba(24, 119, 232, 0.2)";
337
+ var MentionNode = class _MentionNode extends TextNode4 {
338
+ __mention;
339
+ static getType() {
340
+ return "mention";
341
+ }
342
+ static clone(node) {
343
+ return new _MentionNode(node.__mention, node.__text, node.__key);
344
+ }
345
+ static importJSON(serializedNode) {
346
+ return $createMentionNode(serializedNode.mentionName).updateFromJSON(
347
+ serializedNode
348
+ );
349
+ }
350
+ constructor(mentionName, text, key) {
351
+ super(text ?? mentionName, key);
352
+ this.__mention = mentionName;
353
+ }
354
+ exportJSON() {
355
+ return {
356
+ ...super.exportJSON(),
357
+ mentionName: this.__mention
358
+ };
359
+ }
360
+ createDOM(config) {
361
+ const dom = super.createDOM(config);
362
+ dom.style.cssText = mentionStyle;
363
+ dom.className = "mention";
364
+ dom.spellcheck = false;
365
+ return dom;
366
+ }
367
+ exportDOM() {
368
+ const element = document.createElement("span");
369
+ element.setAttribute("data-lexical-mention", "true");
370
+ if (this.__text !== this.__mention) {
371
+ element.setAttribute("data-lexical-mention-name", this.__mention);
372
+ }
373
+ element.textContent = this.__text;
374
+ return { element };
375
+ }
376
+ static importDOM() {
377
+ return {
378
+ span: (domNode) => {
379
+ if (!domNode.hasAttribute("data-lexical-mention")) {
380
+ return null;
381
+ }
382
+ return {
383
+ conversion: $convertMentionElement,
384
+ priority: 1
385
+ };
386
+ }
387
+ };
388
+ }
389
+ isTextEntity() {
390
+ return true;
391
+ }
392
+ canInsertTextBefore() {
393
+ return false;
394
+ }
395
+ canInsertTextAfter() {
396
+ return false;
397
+ }
398
+ };
399
+ function $createMentionNode(mentionName, textContent) {
400
+ const mentionNode = new MentionNode(mentionName, textContent = mentionName);
401
+ mentionNode.setMode("segmented").toggleDirectionless();
402
+ return $applyNodeReplacement3(mentionNode);
403
+ }
404
+
405
+ // src/plugins/MentionsPlugin/index.tsx
406
+ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
407
+ var PUNCTUATION = `\\.,\\+\\*\\?\\$\\@\\|#{}\\(\\)\\^\\-\\[\\]\\\\/!%'"~=<>_:;`;
408
+ var NAME = "\\b[A-Z][^\\s" + PUNCTUATION + "]";
409
+ var DocumentMentionsRegex = {
410
+ NAME,
411
+ PUNCTUATION
412
+ };
413
+ var PUNC = DocumentMentionsRegex.PUNCTUATION;
414
+ var TRIGGERS = ["@"].join("");
415
+ var VALID_CHARS = "[^" + TRIGGERS + PUNC + "\\s]";
416
+ var VALID_JOINS = "(?:\\.[ |$]| |[" + PUNC + "]|)";
417
+ var LENGTH_LIMIT = 75;
418
+ var AtSignMentionsRegex = new RegExp(
419
+ "(^|\\s|\\()([" + TRIGGERS + "]((?:" + VALID_CHARS + VALID_JOINS + "){0," + LENGTH_LIMIT + "}))$"
420
+ );
421
+ var ALIAS_LENGTH_LIMIT = 50;
422
+ var AtSignMentionsRegexAliasRegex = new RegExp(
423
+ "(^|\\s|\\()([" + TRIGGERS + "]((?:" + VALID_CHARS + "){0," + ALIAS_LENGTH_LIMIT + "}))$"
424
+ );
425
+ var SUGGESTION_LIST_LENGTH_LIMIT = 5;
426
+ var mentionsCache = /* @__PURE__ */ new Map();
427
+ async function searchBaasixUsers(client, query) {
428
+ if (!query || query.length < 1) return [];
429
+ try {
430
+ const response = await client.items("baasix_User").find({ search: query, fields: ["id", "fullName"], limit: 10 });
431
+ return (response?.data || []).map(
432
+ (user) => user.fullName || user.id
433
+ );
434
+ } catch {
435
+ return [];
436
+ }
437
+ }
438
+ function useMentionLookupService(client, mentionString) {
439
+ const [results, setResults] = useState2([]);
440
+ useEffect3(() => {
441
+ if (mentionString == null) {
442
+ setResults([]);
443
+ return;
444
+ }
445
+ const cachedResults = mentionsCache.get(mentionString);
446
+ if (cachedResults === null) {
447
+ return;
448
+ }
449
+ if (cachedResults !== void 0) {
450
+ setResults(cachedResults);
451
+ return;
452
+ }
453
+ mentionsCache.set(mentionString, null);
454
+ let cancelled = false;
455
+ searchBaasixUsers(client, mentionString).then((newResults) => {
456
+ mentionsCache.set(mentionString, newResults);
457
+ if (!cancelled) {
458
+ setResults(newResults);
459
+ }
460
+ });
461
+ return () => {
462
+ cancelled = true;
463
+ };
464
+ }, [mentionString]);
465
+ return results;
466
+ }
467
+ function checkForAtSignMentions(text, minMatchLength) {
468
+ let match = AtSignMentionsRegex.exec(text);
469
+ if (match === null) {
470
+ match = AtSignMentionsRegexAliasRegex.exec(text);
471
+ }
472
+ if (match !== null) {
473
+ const maybeLeadingWhitespace = match[1];
474
+ const matchingString = match[3];
475
+ if (matchingString.length >= minMatchLength) {
476
+ return {
477
+ leadOffset: match.index + maybeLeadingWhitespace.length,
478
+ matchingString,
479
+ replaceableString: match[2]
480
+ };
481
+ }
482
+ }
483
+ return null;
484
+ }
485
+ function getPossibleQueryMatch(text) {
486
+ return checkForAtSignMentions(text, 1);
487
+ }
488
+ var MentionTypeaheadOption = class extends MenuOption {
489
+ name;
490
+ picture;
491
+ constructor(name, picture) {
492
+ super(name);
493
+ this.name = name;
494
+ this.picture = picture;
495
+ }
496
+ };
497
+ function MentionsTypeaheadMenuItem({
498
+ index,
499
+ isSelected,
500
+ onClick,
501
+ onMouseEnter,
502
+ option
503
+ }) {
504
+ let className = "item";
505
+ if (isSelected) {
506
+ className += " selected";
507
+ }
508
+ return /* @__PURE__ */ jsxs(
509
+ "li",
510
+ {
511
+ tabIndex: -1,
512
+ className,
513
+ ref: option.setRefElement,
514
+ role: "option",
515
+ "aria-selected": isSelected,
516
+ id: "typeahead-item-" + index,
517
+ onMouseEnter,
518
+ onClick,
519
+ children: [
520
+ option.picture,
521
+ /* @__PURE__ */ jsx4("span", { className: "text", children: option.name })
522
+ ]
523
+ },
524
+ option.key
525
+ );
526
+ }
527
+ function NewMentionsPlugin() {
528
+ const [editor] = useLexicalComposerContext3();
529
+ const { baasixClient } = useEditorConfig();
530
+ const [queryString, setQueryString] = useState2(null);
531
+ const results = useMentionLookupService(baasixClient, queryString);
532
+ const checkForSlashTriggerMatch = useBasicTypeaheadTriggerMatch("/", {
533
+ minLength: 0
534
+ });
535
+ const options = useMemo2(
536
+ () => results.map(
537
+ (result) => new MentionTypeaheadOption(result, /* @__PURE__ */ jsx4("i", { className: "icon user" }))
538
+ ).slice(0, SUGGESTION_LIST_LENGTH_LIMIT),
539
+ [results]
540
+ );
541
+ const onSelectOption = useCallback3(
542
+ (selectedOption, nodeToReplace, closeMenu) => {
543
+ editor.update(() => {
544
+ const mentionNode = $createMentionNode(selectedOption.name);
545
+ if (nodeToReplace) {
546
+ nodeToReplace.replace(mentionNode);
547
+ }
548
+ mentionNode.select();
549
+ closeMenu();
550
+ });
551
+ },
552
+ [editor]
553
+ );
554
+ const checkForMentionMatch = useCallback3(
555
+ (text) => {
556
+ const slashMatch = checkForSlashTriggerMatch(text, editor);
557
+ if (slashMatch !== null) {
558
+ return null;
559
+ }
560
+ return getPossibleQueryMatch(text);
561
+ },
562
+ [checkForSlashTriggerMatch, editor]
563
+ );
564
+ return /* @__PURE__ */ jsx4(
565
+ LexicalTypeaheadMenuPlugin,
566
+ {
567
+ onQueryChange: setQueryString,
568
+ onSelectOption,
569
+ triggerFn: checkForMentionMatch,
570
+ options,
571
+ menuRenderFn: (anchorElementRef, { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }) => anchorElementRef.current && results.length ? ReactDOM.createPortal(
572
+ /* @__PURE__ */ jsx4("div", { className: "typeahead-popover mentions-menu", children: /* @__PURE__ */ jsx4("ul", { children: options.map((option, i) => /* @__PURE__ */ jsx4(
573
+ MentionsTypeaheadMenuItem,
574
+ {
575
+ index: i,
576
+ isSelected: selectedIndex === i,
577
+ onClick: () => {
578
+ setHighlightedIndex(i);
579
+ selectOptionAndCleanUp(option);
580
+ },
581
+ onMouseEnter: () => {
582
+ setHighlightedIndex(i);
583
+ },
584
+ option
585
+ },
586
+ option.key
587
+ )) }) }),
588
+ anchorElementRef.current
589
+ ) : null
590
+ }
591
+ );
592
+ }
593
+
594
+ // src/plugins/TreeViewPlugin/index.tsx
595
+ import { useLexicalComposerContext as useLexicalComposerContext4 } from "@lexical/react/LexicalComposerContext";
596
+ import { TreeView } from "@lexical/react/LexicalTreeView";
597
+ import { jsx as jsx5 } from "react/jsx-runtime";
598
+ function TreeViewPlugin() {
599
+ const [editor] = useLexicalComposerContext4();
600
+ return /* @__PURE__ */ jsx5(
601
+ TreeView,
602
+ {
603
+ viewClassName: "tree-view-output",
604
+ treeTypeButtonClassName: "debug-treetype-button",
605
+ timeTravelPanelClassName: "debug-timetravel-panel",
606
+ timeTravelButtonClassName: "debug-timetravel-button",
607
+ timeTravelPanelSliderClassName: "debug-timetravel-panel-slider",
608
+ timeTravelPanelButtonClassName: "debug-timetravel-panel-button",
609
+ editor
610
+ }
611
+ );
612
+ }
613
+
614
+ // src/nodes/ImageNode.tsx
615
+ import { $insertGeneratedNodes } from "@lexical/clipboard";
616
+ import { HashtagNode } from "@lexical/hashtag";
617
+ import { $generateHtmlFromNodes, $generateNodesFromDOM } from "@lexical/html";
618
+ import { LinkNode } from "@lexical/link";
619
+ import {
620
+ $applyNodeReplacement as $applyNodeReplacement4,
621
+ $createRangeSelection,
622
+ $extendCaretToRange,
623
+ $getChildCaret,
624
+ $getEditor,
625
+ $getRoot,
626
+ $isElementNode,
627
+ $isParagraphNode,
628
+ $selectAll,
629
+ $setSelection,
630
+ createEditor,
631
+ DecoratorNode,
632
+ LineBreakNode,
633
+ ParagraphNode,
634
+ RootNode,
635
+ SKIP_DOM_SELECTION_TAG,
636
+ TextNode as TextNode5
637
+ } from "lexical";
638
+ import * as React2 from "react";
639
+ import { jsx as jsx6 } from "react/jsx-runtime";
640
+ var ImageComponent = React2.lazy(() => import("./ImageComponent-TTUYUG3M.js"));
641
+ function isGoogleDocCheckboxImg(img) {
642
+ return img.parentElement != null && img.parentElement.tagName === "LI" && img.previousSibling === null && img.getAttribute("aria-roledescription") === "checkbox";
643
+ }
644
+ function $convertImageElement(domNode) {
645
+ const img = domNode;
646
+ const src = img.getAttribute("src");
647
+ if (!src || src.startsWith("file:///") || isGoogleDocCheckboxImg(img)) {
648
+ return null;
649
+ }
650
+ const { alt: altText, width, height } = img;
651
+ const node = $createImageNode({ altText, height, src, width });
652
+ return { node };
653
+ }
654
+ function $isCaptionEditorEmpty() {
655
+ for (const { origin } of $extendCaretToRange(
656
+ $getChildCaret($getRoot(), "next")
657
+ )) {
658
+ if (!$isElementNode(origin)) {
659
+ return false;
660
+ }
661
+ }
662
+ return true;
663
+ }
664
+ var ImageNode = class _ImageNode extends DecoratorNode {
665
+ __src;
666
+ __altText;
667
+ __width;
668
+ __height;
669
+ __maxWidth;
670
+ __showCaption;
671
+ __caption;
672
+ // Captions cannot yet be used within editor cells
673
+ __captionsEnabled;
674
+ static getType() {
675
+ return "image";
676
+ }
677
+ static clone(node) {
678
+ return new _ImageNode(
679
+ node.__src,
680
+ node.__altText,
681
+ node.__maxWidth,
682
+ node.__width,
683
+ node.__height,
684
+ node.__showCaption,
685
+ node.__caption,
686
+ node.__captionsEnabled,
687
+ node.__key
688
+ );
689
+ }
690
+ static importJSON(serializedNode) {
691
+ const { altText, height, width, maxWidth, src, showCaption } = serializedNode;
692
+ return $createImageNode({
693
+ altText,
694
+ height,
695
+ maxWidth,
696
+ showCaption,
697
+ src,
698
+ width
699
+ }).updateFromJSON(serializedNode);
700
+ }
701
+ updateFromJSON(serializedNode) {
702
+ const node = super.updateFromJSON(serializedNode);
703
+ const { caption } = serializedNode;
704
+ const nestedEditor = node.__caption;
705
+ const editorState = nestedEditor.parseEditorState(caption.editorState);
706
+ if (!editorState.isEmpty()) {
707
+ nestedEditor.setEditorState(editorState);
708
+ }
709
+ return node;
710
+ }
711
+ exportDOM() {
712
+ const imgElement = document.createElement("img");
713
+ imgElement.setAttribute("src", this.__src);
714
+ imgElement.setAttribute("alt", this.__altText);
715
+ imgElement.setAttribute("width", this.__width.toString());
716
+ imgElement.setAttribute("height", this.__height.toString());
717
+ if (this.__showCaption && this.__caption) {
718
+ const captionEditor = this.__caption;
719
+ const captionHtml = captionEditor.read(() => {
720
+ if ($isCaptionEditorEmpty()) {
721
+ return null;
722
+ }
723
+ let selection = null;
724
+ const firstChild = $getRoot().getFirstChild();
725
+ if ($isParagraphNode(firstChild) && firstChild.getNextSibling() === null) {
726
+ selection = $createRangeSelection();
727
+ selection.anchor.set(firstChild.getKey(), 0, "element");
728
+ selection.focus.set(
729
+ firstChild.getKey(),
730
+ firstChild.getChildrenSize(),
731
+ "element"
732
+ );
733
+ }
734
+ return $generateHtmlFromNodes(captionEditor, selection);
735
+ });
736
+ if (captionHtml) {
737
+ const figureElement = document.createElement("figure");
738
+ const figcaptionElement = document.createElement("figcaption");
739
+ figcaptionElement.innerHTML = captionHtml;
740
+ figureElement.appendChild(imgElement);
741
+ figureElement.appendChild(figcaptionElement);
742
+ return { element: figureElement };
743
+ }
744
+ }
745
+ return { element: imgElement };
746
+ }
747
+ static importDOM() {
748
+ return {
749
+ figcaption: () => ({
750
+ conversion: () => ({ node: null }),
751
+ priority: 0
752
+ }),
753
+ figure: () => ({
754
+ conversion: (node) => {
755
+ return {
756
+ after: (childNodes) => {
757
+ const imageNodes = childNodes.filter($isImageNode);
758
+ const figcaption = node.querySelector("figcaption");
759
+ if (figcaption) {
760
+ for (const imgNode of imageNodes) {
761
+ imgNode.setShowCaption(true);
762
+ imgNode.__caption.update(
763
+ () => {
764
+ const editor = $getEditor();
765
+ $insertGeneratedNodes(
766
+ editor,
767
+ $generateNodesFromDOM(editor, figcaption),
768
+ $selectAll()
769
+ );
770
+ $setSelection(null);
771
+ },
772
+ { tag: SKIP_DOM_SELECTION_TAG }
773
+ );
774
+ }
775
+ }
776
+ return imageNodes;
777
+ },
778
+ node: null
779
+ };
780
+ },
781
+ priority: 0
782
+ }),
783
+ img: () => ({
784
+ conversion: $convertImageElement,
785
+ priority: 0
786
+ })
787
+ };
788
+ }
789
+ constructor(src, altText, maxWidth, width, height, showCaption, caption, captionsEnabled, key) {
790
+ super(key);
791
+ this.__src = src;
792
+ this.__altText = altText;
793
+ this.__maxWidth = maxWidth;
794
+ this.__width = width || "inherit";
795
+ this.__height = height || "inherit";
796
+ this.__showCaption = showCaption || false;
797
+ this.__caption = caption || createEditor({
798
+ namespace: "Playground/ImageNodeCaption",
799
+ nodes: [
800
+ RootNode,
801
+ TextNode5,
802
+ LineBreakNode,
803
+ ParagraphNode,
804
+ LinkNode,
805
+ EmojiNode,
806
+ HashtagNode,
807
+ KeywordNode
808
+ ]
809
+ });
810
+ this.__captionsEnabled = captionsEnabled || captionsEnabled === void 0;
811
+ }
812
+ exportJSON() {
813
+ return {
814
+ ...super.exportJSON(),
815
+ altText: this.getAltText(),
816
+ caption: this.__caption.toJSON(),
817
+ height: this.__height === "inherit" ? 0 : this.__height,
818
+ maxWidth: this.__maxWidth,
819
+ showCaption: this.__showCaption,
820
+ src: this.getSrc(),
821
+ width: this.__width === "inherit" ? 0 : this.__width
822
+ };
823
+ }
824
+ setWidthAndHeight(width, height) {
825
+ const writable = this.getWritable();
826
+ writable.__width = width;
827
+ writable.__height = height;
828
+ }
829
+ setShowCaption(showCaption) {
830
+ const writable = this.getWritable();
831
+ writable.__showCaption = showCaption;
832
+ }
833
+ // View
834
+ createDOM(config) {
835
+ const span = document.createElement("span");
836
+ const theme = config.theme;
837
+ const className = theme.image;
838
+ if (className !== void 0) {
839
+ span.className = className;
840
+ }
841
+ return span;
842
+ }
843
+ updateDOM() {
844
+ return false;
845
+ }
846
+ getSrc() {
847
+ return this.__src;
848
+ }
849
+ getAltText() {
850
+ return this.__altText;
851
+ }
852
+ decorate() {
853
+ return /* @__PURE__ */ jsx6(
854
+ ImageComponent,
855
+ {
856
+ src: this.__src,
857
+ altText: this.__altText,
858
+ width: this.__width,
859
+ height: this.__height,
860
+ maxWidth: this.__maxWidth,
861
+ nodeKey: this.getKey(),
862
+ showCaption: this.__showCaption,
863
+ caption: this.__caption,
864
+ captionsEnabled: this.__captionsEnabled,
865
+ resizable: true
866
+ }
867
+ );
868
+ }
869
+ };
870
+ function $createImageNode({
871
+ altText,
872
+ height,
873
+ maxWidth = 500,
874
+ captionsEnabled,
875
+ src,
876
+ width,
877
+ showCaption,
878
+ caption,
879
+ key
880
+ }) {
881
+ return $applyNodeReplacement4(
882
+ new ImageNode(
883
+ src,
884
+ altText,
885
+ maxWidth,
886
+ width,
887
+ height,
888
+ showCaption,
889
+ caption,
890
+ captionsEnabled,
891
+ key
892
+ )
893
+ );
894
+ }
895
+ function $isImageNode(node) {
896
+ return node instanceof ImageNode;
897
+ }
898
+
899
+ export {
900
+ SettingsContext,
901
+ useSettings,
902
+ EmojiNode,
903
+ KeywordNode,
904
+ EmojisPlugin,
905
+ KeywordsPlugin,
906
+ sanitizeUrl,
907
+ LinkPlugin,
908
+ EditorConfigProvider,
909
+ useEditorConfig,
910
+ MentionNode,
911
+ NewMentionsPlugin,
912
+ TreeViewPlugin,
913
+ $isCaptionEditorEmpty,
914
+ ImageNode,
915
+ $createImageNode,
916
+ $isImageNode
917
+ };
918
+ //# sourceMappingURL=chunk-I43VQAHW.js.map