leksy-editor 2.6.0 → 3.0.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js","../src/constant.js","../src/gallery.js","../src/utilities.js","../src/tab.js","../src/plugin.js"],"sourcesContent":["import './style.css'\nimport { CLASSES, CSS, CSS_VARIABLES, ERRORS, FONTS, REGEX, SVG } from \"./constant\"\nimport PLUGINS, { applyTextFormat } from './plugin';\nimport { showAnchorPopover, changeAllToolbarState, changeToolbarStateByName, changeToolbarValueByName, cleanHTML, debounce, destroyImageResizer, destroyTableEditPlugin, initImageResizer, initTableEditPlugin, makeToolbarButton, makeToolbarColor, makeToolbarDropdown, makeToolbarSelect, rgbToHex, updateTableResizerPosition, destroyAnchorPopover, changeToolbarHtmlByName, showRemoteCursor, syncRemoteChangesDebounce, applyRemoteChanges, updateCursorPositionDebounce, buildTributeValues, updateHeight, getTableGrid, getCellPosition, makeUnorderedList, makeOrderedList, makeHeading, makeBlockQuote, makeStrikethrough, makeCodeBlock, makeSublist, showTooltip, makeToolbarButtonSelect, navigateToHeading, updateOutlineItems, highlightActiveOutline, findAndReplace, handleBackspaceInList, getCollabColor, trackListSelectionDeletion, cleanupListSelectionDeletion } from './utilities';\nimport { initTabs, findTab, renderTabs, prepareTabs, switchTab } from './tab';\nimport { v4 as uuidv4 } from 'uuid';\n\nclass LeksyEditor {\n\n /**\n * @typedef {Object} EditorOptions\n * @property {String} classPrefix\n * @property {String} placeholder\n * @property {Array<String>} plugins\n * @property {Array<Object>} labels\n * @property {Array<Object>} customPlugins\n * @property {Boolean} spellcheck\n * @property {Boolean} closePluginOnClick\n * @property {Array<Object>} value\n * @property {Boolean} hideNavigation\n * @property {String} giphyApiKey\n * @property {String} pexelsApiKey\n * @property {String} tenorApiKey\n * @property {Object} cssVariables\n * @property {Boolean} disablePastedColorStyles\n * @property {Boolean} removeColorsWhilePasting\n * @property {Boolean} autoHeight\n * @property {String} height\n * @property {String} maxHeight\n * @property {String} minHeight\n * @property {String} iframeStyle\n * @property {Boolean} disabled\n * @property {Function} onFullScreen\n * @property {Boolean} showTabs\n * @property {Boolean} enableFindAndReplace\n * @property {Array<Object>} customTooltip\n * @property {Array<Object>} customIcon\n * @property {Array<{name: String, fontFamily:String, links: Array<String>}>} additionalFonts\n */\n /**\n * \n * @param {HTMLElement} baseElement \n * @param {EditorOptions} options \n */\n static create(baseElement, options = {}) {\n /******************************* validations ******************************* */\n if (!(baseElement instanceof HTMLElement)) throw Error(ERRORS.INVALID_ELEMENT);\n\n /****************************** for development **************************** */\n baseElement.innerHTML = ''\n\n /******************************* initializing ****************************** */\n if (!options.classPrefix) options.classPrefix = CLASSES.PREFIX\n if (!options.placeholder) options.placeholder = ''\n if (options.closePluginOnClick !== false) options.closePluginOnClick = true\n\n // Initialize Tabs Data\n let initialTabs = prepareTabs(options.value)\n const initialCurrentTabId = initialTabs[0].tabId;\n\n /**\n * For Internal Use\n */\n const core = {\n elements: {\n base: baseElement,\n toolbar: {},\n tabsContainer: null,\n tabs: {},\n },\n state: { isCodeViewOpen: false, page: 1, totalPages: null, next: null, tribute: null, tabs: initialTabs, currentTabId: initialCurrentTabId, runtimeDom: {} },\n html: initialTabs[0].content,\n cursor: {\n startIndex: 0,\n endIndex: 0,\n cursorIndex: 0,\n isCollapsed: false,\n },\n history: {\n tabs: {\n [initialCurrentTabId]: {\n stack: [],\n currentIndex: -1 // Keeps track of the current position in the history stack\n }\n },\n push: debounce(() => { core.history.saveHistory() }, 300),\n saveHistory: () => {\n // Save the caret position using the selection range\n const selection = core.elements.iframeWindow.getSelection();\n let caretOffset = null;\n\n if (selection?.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const preCaretRange = range.cloneRange();\n preCaretRange.selectNodeContents(core.elements.editor);\n preCaretRange.setEnd(range.endContainer, range.endOffset);\n caretOffset = preCaretRange.toString().length; // Save the character offset of the caret\n }\n const html = core.elements.editor.innerHTML;\n\n const currentTabHistory = core.history.tabs[core.state.currentTabId] || { stack: [], currentIndex: -1 };\n if (!core.history.tabs[core.state.currentTabId]) core.history.tabs[core.state.currentTabId] = currentTabHistory;\n\n if (currentTabHistory.stack[currentTabHistory.currentIndex]?.html !== html) {\n // If new state is pushed, remove redo states if present\n currentTabHistory.stack = currentTabHistory.stack.slice(0, currentTabHistory.currentIndex + 1);\n currentTabHistory.stack.push({ caretOffset, html });\n currentTabHistory.currentIndex++;\n }\n },\n undo: () => {\n const currentTabHistory = core.history.tabs[core.state.currentTabId];\n if (!currentTabHistory) return;\n\n if (currentTabHistory.currentIndex > 0) {\n currentTabHistory.currentIndex--;\n\n const { html, caretOffset } = currentTabHistory.stack[currentTabHistory.currentIndex];\n core.elements.editor.innerHTML = html;\n core.history.restoreCaretPosition(caretOffset);\n }\n },\n redo: () => {\n const currentTabHistory = core.history.tabs[core.state.currentTabId];\n if (!currentTabHistory) return;\n\n if (currentTabHistory.currentIndex < currentTabHistory.stack.length - 1) {\n currentTabHistory.currentIndex++;\n\n const { html, caretOffset } = currentTabHistory.stack[currentTabHistory.currentIndex];\n core.elements.editor.innerHTML = html;\n core.history.restoreCaretPosition(caretOffset);\n }\n },\n restoreCaretPosition: (caretOffset) => {\n const selection = core.elements.iframeWindow.getSelection();\n const range = document.createRange();\n let charCount = 0;\n\n function setCaret(node) {\n if (node.nodeType === 3) { // Text node\n const length = node.length;\n if (charCount + length >= caretOffset) {\n range.setStart(node, caretOffset - charCount);\n range.setEnd(node, caretOffset - charCount);\n selection.removeAllRanges();\n selection.addRange(range);\n return true;\n } else {\n charCount += length;\n }\n } else if (node.nodeType === 1) { // Element node\n for (const element of node.childNodes) {\n if (setCaret(element)) {\n return true;\n }\n }\n }\n return false;\n }\n setCaret(core.elements.editor);\n }\n },\n onChange: (html = core.elements.editor.innerHTML) => {\n updateHeight(core, options)\n updateTableResizerPosition(options, core)\n if (html === '<br>' || html === '<div><br></div>') html = ''\n core.html = html;\n // Update current tab content\n const currentTab = findTab(core.state.tabs, core.state.currentTabId);\n if (currentTab) currentTab.content = html;\n if (core.state.runtimeDom[core.state.currentTabId]) {\n core.state.runtimeDom[core.state.currentTabId].innerHTML = html;\n }\n\n // Return array of tabs if showTabs is true, otherwise just html string? \n if (typeof editorRef.onChange === 'function') {\n editorRef.onChange(structuredClone(core.state.tabs));\n }\n if (html.trim()) core.hidePlaceholder()\n else core.showPlaceholder()\n core.history.push()\n\n syncRemoteChangesDebounce(core)\n updateOutlineItems(core, options)\n },\n onSave: () => {\n if (editorRef.onSave instanceof Function) editorRef.onSave()\n },\n onBlur: (html) => {\n if (editorRef.onBlur instanceof Function) editorRef.onBlur(html)\n },\n onAttachment: (files) => {\n if (editorRef.onAttachment instanceof Function) editorRef.onAttachment(files)\n },\n onLinkClick: (href) => {\n if (editorRef.onLinkClick instanceof Function) editorRef.onLinkClick(href)\n },\n manuplateImage: async (type, content) => {\n if (editorRef.manuplateImage instanceof Function) {\n core.changeStatus('Loading...')\n const _content = (await editorRef.manuplateImage(type, content)) ?? content\n core.changeStatus('')\n return _content\n }\n return content\n },\n handleFilePicker: async (mimeType, type) => {\n if (editorRef.handleFilePicker instanceof Function) { return await editorRef.handleFilePicker(mimeType, type) }\n return null\n\n },\n updateBreadcumb: (parentTags) => {\n if (!options.hideNavigation && Array.isArray(parentTags)) {\n core.elements.breadcumb.innerHTML = ''\n parentTags.forEach(tag => {\n const li = document.createElement('li');\n li.innerText = tag;\n core.elements.breadcumb.appendChild(li)\n })\n }\n },\n changeStatus: (text) => {\n if (!options.hideNavigation) {\n core.elements.status.innerText = text\n }\n },\n insertNode: (node) => {\n if (core.state.range) {\n core.state.range.deleteContents();\n core.state.range.insertNode(node);\n //cursor at the last with this\n core.state.range.collapse(false);\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(core.state.range);\n } else {\n core.elements.editor.appendChild(node);\n }\n },\n uploadVideo: async (file) => {\n if (editorRef.uploadVideo instanceof Function) {\n core.changeStatus('Loading...')\n changeToolbarHtmlByName(core, 'video', SVG.LOADER)\n const url = await editorRef.uploadVideo(file)\n core.changeStatus('')\n changeToolbarHtmlByName(core, 'video', SVG.VIDEO)\n return url\n }\n },\n showPlaceholder: () => {\n core.elements.placeholder.style.display = 'block'\n },\n hidePlaceholder: () => {\n core.elements.placeholder.style.display = 'none'\n },\n updateCaretPosition: () => {\n const selection = core.elements.iframeWindow.getSelection();\n let parentTags = [];\n let parentElements = [];\n if (selection?.rangeCount !== 0) {\n const range = selection.getRangeAt(0);\n core.state.selection = selection;\n core.state.range = range;\n core.state.parentNode = range.commonAncestorContainer.parentNode;\n\n let element = range.commonAncestorContainer;\n // If the parent is a text node, get the parent element\n if (element.nodeType === Node.TEXT_NODE) {\n element = element.parentNode;\n }\n\n while (element && element !== core.elements.editor) {\n parentElements.push(element)\n parentTags.push(element.tagName);\n element = element.parentElement;\n }\n parentTags = parentTags.reverse()\n parentElements = parentElements.reverse()\n core.updateBreadcumb(parentTags)\n }\n return { parentTags, parentElements }\n },\n updateCursorPosition: () => {\n updateCursorPositionDebounce(core, editorRef)\n },\n onLocalSyncChanges: (diff) => {\n if (options.disabled && diff.type === 'cursor:open') return\n if (editorRef.onLocalSyncChanges instanceof Function) editorRef.onLocalSyncChanges(diff)\n },\n }\n\n /**\n * For External Use\n */\n const editorRef = {\n setContents: (content) => {\n const tabs = prepareTabs(content)\n core.state.tabs = tabs;\n core.state.currentTabId = tabs[0].tabId;\n core.html = tabs[0].content;\n renderTabs(core, options);\n core.elements.editor.innerHTML = core.html;\n core.state.previousDOM = core.elements.editor.cloneNode(true)\n const initAllTabs = (tabs) => {\n\n tabs.forEach(tab => {\n if (!core.state.runtimeDom[tab.tabId]) {\n const div = core.elements.iframeWindow.createElement('div')\n div.className = 'content-editable'\n div.contentEditable = !options.disabled\n div.spellcheck = !!options.spellcheck\n div.innerHTML = tab.content ?? '<div><br></div>'\n core.state.runtimeDom[tab.tabId] = div\n\n core.onLocalSyncChanges({\n type: 'tabs:create',\n tabId: tab.tabId,\n editorHTML: div.outerHTML\n })\n }\n if (tab.children?.length) initAllTabs(tab.children)\n })\n }\n initAllTabs(tabs)\n core.elements.editor.innerHTML = core.html;\n core.state.previousDOM = core.elements.editor.cloneNode(true)\n\n updateHeight(core, options)\n },\n getContents: () => core.state.tabs,\n onChange: () => { },\n onSave: () => { },\n onBlur: () => { },\n onAttachment: () => { },\n onLinkClick: (href) => {\n window.open(href, '_blank', 'noopener noreferrer')\n },\n manuplateImage: async () => { },\n handleFilePicker: async () => { },\n uploadVideo: async () => { },\n focus: () => { core.elements.editor.focus() },\n getCore: () => core,\n updateHeight: (height) => {\n core.elements.iframeContainer.style.setProperty('height', height);\n },\n setDisabled: (disabled) => {\n options.disabled = disabled;\n core.elements.editor.contentEditable = !disabled;\n if (disabled) changeAllToolbarState(core, 'disabled')\n else changeAllToolbarState(core, 'enabled')\n renderTabs(core, options)\n },\n updateCssVariables: (newVariables) => {\n const variableMap = {\n primary: '--primary',\n baseWhite: '--base-white',\n whiteDark: '--base-white-dark',\n shadow: '--shadow',\n resizer: '--resizer',\n resizerBackground: '--resizer-background',\n mention: '--mention',\n mentionHighlight: '--mention-highlight',\n dashedBorder: '--dashed-border',\n tableResizer: '--table-resizer',\n tableResizerOutline: '--table-resizer-outline',\n textColor: '--text-color',\n resizerPosition: '--resizer-position',\n resizerPositionBackground: '--resizer-position-background',\n linkColor: '--link-color',\n scrollbarThumb: '--scrollbar-thumb',\n scrollbarTrack: '--scrollbar-track',\n };\n\n const mergedVariables = {\n ...CSS_VARIABLES,\n ...newVariables\n };\n\n Object.keys(variableMap).forEach(key => {\n const cssVar = variableMap[key];\n const value = mergedVariables[key];\n\n if (value !== undefined) {\n core.elements.iframeWindow.documentElement.style.setProperty(cssVar, value);\n }\n });\n },\n updateLabels: (labels = []) => {\n if (!core.state.tribute) return;\n\n const values = buildTributeValues(labels);\n core.state.tribute.append(0, values, true);\n },\n getLocalCursor: () => core.cursor,\n onLocalSyncChanges: () => { },\n applyRemoteSyncChanges: (message) => {\n const { type, sequence } = message\n switch (type) {\n case 'diff': {\n const currentTab = findTab(core.state.tabs, core.state.currentTabId)\n if (message.tabId && currentTab?.tabId !== message.tabId) {\n if (!core.state.runtimeDom[message.tabId]) {\n const tab = findTab(core.state.tabs, message.tabId)\n if (tab) {\n const div = core.elements.iframeWindow.createElement('div')\n div.className = 'content-editable'\n div.contentEditable = !options.disabled\n div.spellcheck = !!options.spellcheck\n div.innerHTML = tab.content || '<div><br></div>'\n core.state.runtimeDom[message.tabId] = div\n }\n }\n if (core.state.runtimeDom[message.tabId]) {\n applyRemoteChanges(core, message.diff, core.state.runtimeDom[message.tabId])\n }\n return\n }\n\n applyRemoteChanges(core, message.diff)\n\n const currentTabHistory = core.history.tabs[core.state.currentTabId]\n if (currentTabHistory) {\n currentTabHistory.stack = []\n currentTabHistory.currentIndex = -1\n }\n\n requestAnimationFrame(() => {\n if (core.elements.resizerImage && !core.elements.editor.contains(core.elements.resizerImage)) {\n destroyImageResizer(options, core)\n }\n if (core.elements.selectedElement?.tagName === 'A' && !core.elements.editor.contains(core.elements.selectedElement)) {\n destroyAnchorPopover(core)\n }\n if (core.elements.selectedElement &&\n ['TD', 'TH'].includes(core.elements.selectedElement.tagName) &&\n !core.elements.editor.contains(core.elements.selectedElement)) {\n destroyTableEditPlugin(options, core)\n }\n })\n break\n }\n case 'cursor:open': {\n const currentTab = findTab(core.state.tabs, core.state.currentTabId)\n if (message.tabId && currentTab?.tabId !== message.tabId) return\n showRemoteCursor(core,\n { id: message.userId, color: getCollabColor(message.userId), name: message.userName },\n message.cursor\n )\n break\n }\n\n case 'cursor:remove': {\n core.elements.editorCursor?.querySelector(`#remote-overlay-${message.userId}`)?.remove();\n if (core.state.remoteCursors) delete core.state.remoteCursors[message.userId]\n break;\n }\n case 'tabs:switch': {\n core.elements.editorCursor?.querySelector(`#remote-overlay-${message.userId}`)?.remove()\n\n const currentTab = findTab(core.state.tabs, core.state.currentTabId)\n if (currentTab?.tabId === message.tabId) {\n core.onLocalSyncChanges({\n type: 'cursor:open',\n cursor: core.cursor,\n tabId: core.state.currentTabId\n })\n }\n break\n }\n case 'tabs:structure': {\n const existingTabs = new Map();\n const flattenTabs = (tabs) => {\n tabs.forEach(tab => {\n existingTabs.set(tab.tabId, tab);\n if (tab.children?.length) flattenTabs(tab.children);\n });\n };\n flattenTabs(core.state.tabs);\n\n const buildTree = (tabs) => {\n return tabs.map(tab => {\n const existing = existingTabs.get(tab.tabId);\n return {\n ...tab,\n content: existing?.content ?? tab.content ?? '',\n children: buildTree(tab.children || [])\n };\n });\n };\n\n const incomingIds = new Set();\n const collectIds = (tabs) => {\n tabs.forEach(tab => {\n incomingIds.add(tab.tabId);\n if (tab.children?.length) collectIds(tab.children);\n });\n };\n collectIds(message.tabs);\n Object.keys(core.state.runtimeDom).forEach(tabId => {\n if (!incomingIds.has(tabId)) delete core.state.runtimeDom[tabId];\n });\n\n core.state.tabs = buildTree(message.tabs);\n if (!incomingIds.has(core.state.currentTabId)) {\n const firstTab = message.tabs[0];\n if (firstTab) {\n switchTab(core, firstTab.tabId, options);\n }\n }\n\n renderTabs(core, options);\n break;\n }\n case 'tabs:create': {\n if (!core.state.runtimeDom[message.tabId]) {\n const div = core.elements.iframeWindow.createElement('div');\n div.innerHTML = message.editorHTML;\n core.state.runtimeDom[message.tabId] = div.firstElementChild;\n }\n break;\n }\n }\n },\n getCurrentTab: () => findTab(core.state.tabs, core.state.currentTabId),\n parseTabFromHTML: (html) => ({\n tabTitle: 'Tab 1',\n tabId: uuidv4(),\n content: typeof html === 'string' ? html : '<div><br></div>',\n children: []\n }),\n compare: (tabs1, tabs2) => {\n const normalizeTabs = (tabs) => {\n return (tabs || []).map(tab => ({\n tabTitle: tab.tabTitle,\n tabId: tab.tabId,\n content: tab.content || '<div><br></div>',\n children: normalizeTabs(tab.children)\n }));\n }\n return JSON.stringify(normalizeTabs(tabs1)) === JSON.stringify(normalizeTabs(tabs2))\n },\n initRuntimeDoms: (runtimeDoms) => {\n Object.entries(runtimeDoms).forEach(([tabId, html]) => {\n if (!core.state.runtimeDom[tabId]) {\n const div = core.elements.iframeWindow.createElement('div');\n div.innerHTML = html;\n core.state.runtimeDom[tabId] = div.firstElementChild;\n }\n });\n },\n reloadRuntimeDom: (content, runtimeDoms) => {\n core.state.runtimeDom = {}\n editorRef.setContents(content)\n if (runtimeDoms) editorRef.initRuntimeDoms(runtimeDoms)\n },\n showChangeHighlight: (highlights) => {\n const iframeDoc = core.elements.editor.ownerDocument\n if (!iframeDoc.getElementById('highlight-style')) {\n const style = iframeDoc.createElement('style')\n style.id = 'highlight-style'\n style.textContent = `\n .highlight-label { display: none; }\n .highlight:hover .highlight-label { display: block; }\n `\n iframeDoc.head.appendChild(style)\n }\n\n const currentTabId = core.state.currentTabId\n\n const wrapWithHighlight = (node, color, userName) => {\n const span = iframeDoc.createElement('span')\n span.className = 'highlight'\n span.style.backgroundColor = color + '55'\n span.style.position = 'relative'\n span.style.cursor = 'pointer'\n\n const label = iframeDoc.createElement('span')\n label.className = 'highlight-label'\n label.textContent = userName\n label.style.cssText = `\n position: absolute;\n top: -16px;\n left: 0;\n font-size: 12px;\n color: white;\n background-color: ${color};\n border-radius: 4px 4px 0 0;\n padding: 0 4px;\n white-space: nowrap;\n z-index: 999;\n pointer-events: none;\n `\n span.appendChild(label)\n node.parentNode.insertBefore(span, node)\n span.appendChild(node)\n }\n\n const targets = []\n for (const { tabId, route, color, userName } of highlights) {\n const targetElement = tabId === currentTabId\n ? core.elements.editor\n : core.state.runtimeDom[tabId]\n if (!targetElement) continue\n\n let node = targetElement\n for (const index of route) {\n node = node?.childNodes?.[index]\n if (!node) break\n }\n if (node && node.parentNode) targets.push({ node, color, userName })\n }\n\n for (const { node, color, userName } of targets) {\n try {\n wrapWithHighlight(node, color, userName)\n } catch (e) {\n console.error('highlight error', e)\n }\n }\n },\n }\n\n core.elements.base.className = `${options.classPrefix}${CLASSES.CONTAINER}`\n\n if (Array.isArray(options.plugins) && options.plugins.length) this.#initToolbar(options, core)\n\n this.#initPlaceholder(options, core)\n this.#initCodeviewContainer(options, core);\n this.#initEditableContainer(options, core);\n if (!options.hideNavigation) this.#initStepper(options, core);\n\n if (options.value) core.hidePlaceholder()\n core.history.push()\n\n return editorRef\n }\n\n static #initToolbar(options, core) {\n const toolbarContainer = document.createElement('div')\n toolbarContainer.className = `${options.classPrefix}${CLASSES.TOOLBAR}`\n\n /**\n * @param {String} plugin \n * @returns {HTMLElement}\n */\n const initToolbarItems = (plugin) => {\n /************************* to creating button sets ************************* */\n if (Array.isArray(plugin)) {\n const buttonSets = document.createElement('div');\n buttonSets.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEMS}`\n plugin.forEach(plugin => {\n const button = initToolbarItems(plugin)\n buttonSets.appendChild(button)\n })\n return buttonSets\n }\n\n const _plugin = PLUGINS[plugin] ?? options.customPlugins?.[plugin];\n _plugin.pluginId = plugin\n if (_plugin.pluginId === 'font' && options.additionalFonts) {\n options.additionalFonts.forEach(font => FONTS[font.fontFamily] = font.name);\n }\n\n /******************************* validations ******************************* */\n if (!_plugin) throw Error(ERRORS.INVALID_PLUGIN);\n if (_plugin.title === 'GIPHY' && !options.giphyApiKey) throw Error(ERRORS.GIPHY_KEY_NOT_FOUND);\n if (_plugin.title === 'Pexels' && !options.pexelsApiKey) throw Error(ERRORS.PEXELS_KEY_NOT_FOUND);\n if (_plugin.title === 'Tenor' && !options.tenorApiKey) throw Error(ERRORS.TENOR_KEY_NOT_FOUND);\n\n let toolbarPlugin\n if (_plugin.type === 'button' || _plugin.type === 'reset-color') {\n toolbarPlugin = makeToolbarButton(_plugin, options, core)\n } else if (_plugin.type === 'dropdown' || _plugin.type === 'gallery' || _plugin.type === 'category' || _plugin.type === 'mention' || _plugin.type === 'table') {\n toolbarPlugin = makeToolbarDropdown(_plugin, options, core)\n } else if (_plugin.type === 'select') {\n toolbarPlugin = makeToolbarSelect(_plugin, options, core)\n } else if (_plugin.type === 'color') {\n toolbarPlugin = makeToolbarColor(_plugin, options, core)\n } else if (_plugin.type === 'button-select') {\n toolbarPlugin = makeToolbarButtonSelect(_plugin, options, core)\n }\n if (core.elements.toolbar[plugin])\n core.elements.toolbar[plugin].push(toolbarPlugin)\n else\n core.elements.toolbar[plugin] = [toolbarPlugin]\n\n return toolbarPlugin\n }\n\n options.plugins.forEach(plugin => {\n const toolbarButtonSets = initToolbarItems(plugin)\n toolbarContainer.appendChild(toolbarButtonSets)\n })\n\n if (options.disabled) changeAllToolbarState(core, 'disabled')\n showTooltip(options)\n\n core.elements.toolbarContainer = toolbarContainer;\n core.elements.base.appendChild(toolbarContainer);\n }\n\n static #initPlaceholder(options, core) {\n const placeholderContainer = document.createElement('div');\n const placeholder = document.createElement('span');\n placeholder.className = `${options.classPrefix}${CLASSES.PLACEHOLDER}`\n placeholder.innerText = options.placeholder ?? ''\n placeholderContainer.appendChild(placeholder)\n placeholder.onclick = () => core.elements.editor.focus()\n core.elements.placeholder = placeholder\n core.elements.base.appendChild(placeholderContainer)\n }\n\n static #initCodeviewContainer(options, core) {\n const textarea = document.createElement('textarea');\n textarea.className = `${options.classPrefix}${CLASSES.CODEVIEW}`\n textarea.spellcheck = false\n core.elements.codeview = textarea\n core.elements.base.appendChild(textarea)\n }\n\n static #initEditableContainer(options, core) {\n\n const handleCaretPositionAndPlugin = () => {\n try {\n const { parentTags, parentElements } = core.updateCaretPosition()\n\n changeAllToolbarState(core, 'inactive', [])\n const activePlugin = []\n if (parentTags.includes('A')) activePlugin.push('link')\n if (core.elements.iframeWindow.queryCommandState('bold')) activePlugin.push('bold')\n if (core.elements.iframeWindow.queryCommandState('underline')) activePlugin.push('underline')\n if (core.elements.iframeWindow.queryCommandState('italic')) activePlugin.push('italic')\n if (core.elements.iframeWindow.queryCommandState('strikeThrough')) activePlugin.push('strike')\n if (core.elements.iframeWindow.queryCommandState('subscript')) activePlugin.push('subscript')\n if (core.elements.iframeWindow.queryCommandState('superscript')) activePlugin.push('superscript')\n if (core.elements.iframeWindow.queryCommandState('insertOrderedList')) activePlugin.push('ordered_list')\n if (core.elements.iframeWindow.queryCommandState('insertUnorderedList')) activePlugin.push('unordered_list')\n\n let format = ''\n if (parentTags.includes('H1')) format = 'h1'\n if (parentTags.includes('H2')) format = 'h2'\n if (parentTags.includes('H3')) format = 'h3'\n if (parentTags.includes('H4')) format = 'h4'\n if (parentTags.includes('H5')) format = 'h5'\n if (parentTags.includes('H6')) format = 'h6'\n if (parentTags.includes('P')) format = 'P'\n changeToolbarValueByName(core, 'format-block', format)\n\n let selectedNode = core.state.range.commonAncestorContainer;\n if (core.state.range) {\n\n // Traverse up to find the element node if selectedNode is a text node\n if (selectedNode.nodeType === Node.TEXT_NODE) {\n selectedNode = selectedNode.parentNode;\n }\n\n // Get computed styles for the element where the text is contained\n const computedStyle = window.getComputedStyle(selectedNode);\n const align = computedStyle.textAlign;\n if (align) {\n if (align === 'justify')\n activePlugin.push('align_justify')\n else if (align === 'start' || align === 'left' || align === '-moz-left')\n activePlugin.push('align_left')\n else if (align === 'end' || align === 'right' || align === '-moz-right')\n activePlugin.push('align_right')\n else if (align === 'center' || align === '-moz-center')\n activePlugin.push('align_center')\n }\n\n const styles = window.getComputedStyle(selectedNode);\n changeToolbarValueByName(core, 'highlight_color', rgbToHex(styles.backgroundColor))\n }\n\n changeToolbarStateByName(core, 'active', activePlugin)\n const styles = window.getComputedStyle(selectedNode);\n\n const font = parentElements.find(element => element.tagName === 'FONT')\n\n if (font && font.face) {\n changeToolbarValueByName(core, 'font', font.face)\n } else if (styles.fontFamily) {\n const firstFont = styles.fontFamily.split(\",\")[0].trim().replace(/['\"]/g, \"\");;\n const formattedFont = styles.fontFamily.includes(\",\") ? `${firstFont}...` : firstFont;\n changeToolbarValueByName(core, 'font', `<p style='user-select: none;'>${formattedFont}</p>`)\n } else {\n changeToolbarValueByName(core, 'font', '')\n }\n\n if (font && font.size) {\n changeToolbarValueByName(core, 'font-size', font.size)\n } else if (styles.fontSize) {\n const match = styles.fontSize.match(/^([\\d.]+)([a-z%]*)$/);\n const numericValue = parseFloat(match[1]);\n const unit = match[2];\n const fontSize = (numericValue % 1 === 0 ? numericValue.toString() : numericValue.toFixed(2)) + unit;\n changeToolbarValueByName(core, 'font-size', `<p style='user-select: none;'>${fontSize}</p>`)\n } else {\n changeToolbarValueByName(core, 'font-size', '')\n }\n\n if (font && font.color) {\n changeToolbarValueByName(core, 'font_color', font.color)\n } else if (styles.color) {\n changeToolbarValueByName(core, 'font_color', rgbToHex(styles.color))\n } else {\n changeToolbarValueByName(core, 'font_color', '')\n }\n } catch (error) {\n console.error(error)\n }\n\n }\n const keyPressDebounce = debounce(handleCaretPositionAndPlugin, 100)\n const makeObserver = () => {\n const observer = new MutationObserver(() => {\n // Handle mutation and push state to undo stack\n const inputEvent = new Event('custom-input', { bubbles: true });\n contentEditableDiv.dispatchEvent(inputEvent);\n });\n\n // Start observing the editor for attribute changes (like resizing)\n observer.observe(contentEditableDiv, {\n attributes: true,\n childList: true,\n subtree: true\n });\n\n // font / layout reflow\n const ro = new ResizeObserver(() => {\n updateHeight(core, options)\n if (core.state.remoteCursors) {\n Object.values(core.state.remoteCursors).forEach(({ user, data }) => {\n showRemoteCursor(core, user, data)\n })\n }\n });\n ro.observe(contentEditableDiv);\n }\n\n /***************************** for css theme variables ********************************* */\n if (options.cssVariables) {\n const cssVariable = options.cssVariables;\n const _CSS_VARIABLES = structuredClone(CSS_VARIABLES)\n Object.keys(CSS_VARIABLES).forEach((key) => {\n if (cssVariable[key] !== undefined) {\n _CSS_VARIABLES[key] = cssVariable[key];\n }\n });\n\n CSS.IFRAME_VARIABLES = `\n :root {\n --primary: ${_CSS_VARIABLES.primary};\n --base-white: ${_CSS_VARIABLES.baseWhite};\n --base-white-dark: ${_CSS_VARIABLES.whiteDark};\n --shadow: ${_CSS_VARIABLES.shadow};\n --resizer: ${_CSS_VARIABLES.resizer};\n --resizer-background: ${_CSS_VARIABLES.resizerBackground};\n --mention: ${_CSS_VARIABLES.mention};\n --mention-highlight: ${_CSS_VARIABLES.mentionHighlight};\n --dashed-border: ${_CSS_VARIABLES.dashedBorder};\n --table-resizer: ${_CSS_VARIABLES.tableResizer};\n --table-resizer-outline: ${_CSS_VARIABLES.tableResizerOutline};\n --text-color: ${_CSS_VARIABLES.textColor};\n --resizer-position: ${_CSS_VARIABLES.resizerPosition};\n --resizer-position-background: ${_CSS_VARIABLES.resizerPositionBackground};\n --link-color: ${_CSS_VARIABLES.linkColor};\n --scrollbar-thumb: ${_CSS_VARIABLES.scrollbarThumb};\n --scrollbar-track: ${_CSS_VARIABLES.scrollbarTrack};\n }\n `;\n }\n\n const iframe = document.createElement('iframe');\n iframe.style.flex = '1 1 auto';\n\n if (options.autoHeight) iframe.style.height = 'auto';\n else iframe.style.height = options.minHeight ?? options.height ?? '250px';\n iframe.style.minHeight = options.minHeight ?? options.height ?? '250px';\n if (options.maxHeight) iframe.style.maxHeight = options.maxHeight;\n\n iframe.style.border = '0';\n core.elements.base.appendChild(iframe)\n\n const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;\n // Write the basic HTML structure to the iframe's document\n iframeDoc.open();\n\n iframeDoc.write(`\n <!DOCTYPE html>\n <html lang='en'>\n <head>\n ${(options?.additionalFonts || [])\n .map(({ links }) =>\n links.map(link => `<link href=\"${link}\" rel=\"stylesheet\">`).join('')\n )\n .join('')}\n <style>\n ${CSS.IFRAME_VARIABLES}\n ${CSS.IFRAME_BODY}\n ${CSS.IFRAME_TRIBUTE}\n ${CSS.IFRAME_EDITOR}\n ${CSS.IFRAME_RESIZER}\n ${CSS.IFRAME_TAB}\n ${CSS.IFRAME_MEDIA_QUERY}\n ${options.iframeStyle || ''}\n </style>\n </head>\n <body></body>\n </html>\n `);\n\n iframeDoc.close();\n\n iframeDoc.onkeydown = (event) => {\n // Check if Ctrl or Cmd key is pressed\n const isCtrlOrCmd = event.ctrlKey || event.metaKey;\n\n // Check for Ctrl + Z (undo) or Ctrl + Y (redo)\n if (isCtrlOrCmd && ['z', 'y', 'b', 'i', 'u', 'f', 'h', 's'].includes(event.key)) {\n return event.preventDefault(); // Prevent the default undo/redo action\n }\n }\n\n const contentEditableDiv = iframeDoc.createElement('div');\n contentEditableDiv.contentEditable = !options.disabled;\n contentEditableDiv.spellcheck = !!options.spellcheck\n contentEditableDiv.innerHTML = core.html;\n contentEditableDiv.className = 'content-editable';\n\n contentEditableDiv.oninput = (e) => {\n cleanupListSelectionDeletion(core);\n core.onChange(e.target.innerHTML)\n }\n contentEditableDiv.onbeforeinput = (e) => {\n if (e.target.innerHTML === '<br>' || e.target.innerHTML === '') {\n e.target.innerHTML = '<div><br></div>'\n }\n }\n contentEditableDiv.addEventListener('custom-input', (e) => {\n core.onChange(e.target.innerHTML)\n })\n contentEditableDiv.onkeydown = (event) => {\n // Check if Ctrl or Cmd key is pressed\n const isCtrlOrCmd = event.ctrlKey || event.metaKey;\n let isLinkCreated = false\n\n if (isCtrlOrCmd) {\n if (event.key === 'z') {\n core.history.undo()\n } else if (event.key === 'y') {\n core.history.redo()\n } else if (event.key === 'b') {\n applyTextFormat(core, 'bold')\n } else if (event.key === 'u') {\n applyTextFormat(core, 'underline')\n } else if (event.key === 'i') {\n applyTextFormat(core, 'italic')\n } else if (event.key === 'f' || event.key === 'h') {\n findAndReplace(core, options, event)\n } else if (event.key === 's') {\n core.onSave();\n }\n }\n\n if (event.shiftKey && ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n const selection = core.elements.iframeWindow.getSelection();\n if (selection.rangeCount > 0) {\n let element = selection.focusNode;\n if (element.nodeType === Node.TEXT_NODE) element = element.parentElement;\n const td = element.closest('td, th');\n\n if (td) {\n const table = td.closest('table');\n if (table) {\n const grid = getTableGrid(table);\n const pos = getCellPosition(grid, td);\n\n if (pos) {\n let { r, c } = pos;\n\n if (event.key === 'ArrowLeft') {\n const targetCell = grid[r][c - 1];\n if (c === 0) return;\n if (targetCell && targetCell !== td &&\n (targetCell.rowSpan || 1) === (td.rowSpan || 1) &&\n getCellPosition(grid, targetCell).r === r\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML = targetCell.innerHTML + '<br/>' + td.innerHTML;\n }\n td.colSpan = (td.colSpan || 1) + (targetCell.colSpan || 1);\n targetCell.parentNode.insertBefore(td, targetCell);\n targetCell.remove();\n }\n } else if (event.key === 'ArrowRight') {\n const targetCell = grid[r][c + (td.colSpan || 1)];\n if (targetCell && targetCell !== td &&\n (targetCell.rowSpan || 1) === (td.rowSpan || 1) &&\n getCellPosition(grid, targetCell).r === r\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML += '<br/>' + targetCell.innerHTML;\n }\n td.colSpan = (td.colSpan || 1) + (targetCell.colSpan || 1);\n targetCell.remove();\n }\n } else if (event.key === 'ArrowUp') {\n if (r === 0) return;\n const targetCell = grid[r - 1][c];\n\n if (targetCell && targetCell !== td &&\n (targetCell.colSpan || 1) === (td.colSpan || 1) &&\n getCellPosition(grid, targetCell).c === c\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML = targetCell.innerHTML + '<br/>' + td.innerHTML;\n }\n td.rowSpan = (td.rowSpan || 1) + (targetCell.rowSpan || 1);\n targetCell.parentNode.insertBefore(td, targetCell);\n targetCell.remove();\n }\n } else if (event.key === 'ArrowDown') {\n const targetRowIdx = r + (td.rowSpan || 1);\n if (targetRowIdx >= grid.length) return;\n const targetCell = grid[targetRowIdx][c];\n\n if (targetCell && targetCell !== td &&\n (targetCell.colSpan || 1) === (td.colSpan || 1) &&\n getCellPosition(grid, targetCell).c === c\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML += '<br/>' + targetCell.innerHTML;\n }\n td.rowSpan = (td.rowSpan || 1) + (targetCell.rowSpan || 1);\n targetCell.remove();\n }\n }\n core.updateCaretPosition();\n }\n }\n }\n }\n }\n\n if (event.key === 'Tab') {\n makeSublist(event, core);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n\n const tabNode = document.createTextNode(\"\\u00a0\\u00a0\\u00a0\\u00a0\");\n core.state.range.insertNode(tabNode);\n core.state.range.setStartAfter(tabNode);\n core.state.range.setEndAfter(tabNode);\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(core.state.range);\n }\n if (event.key === ' ' || event.key === 'Enter') {\n const sel = core.state.selection;\n const node = sel?.anchorNode;\n\n // Only text nodes, not already inside a link\n if (node && node.nodeType === Node.TEXT_NODE && !node.parentElement.closest('a')) {\n const caretOffset = sel.focusOffset;\n const textBeforeCaret = node.textContent.slice(0, caretOffset);\n const match = textBeforeCaret.match(REGEX.TEXT_URL);\n if (match) {\n const url = match[0];\n\n // Optional: trim trailing punctuation\n const cleanUrl = url.replace(/[.,)]$/, '');\n\n // Replace URL text with <a> element\n const before = textBeforeCaret.slice(0, match.index);\n const after = node.textContent.slice(caretOffset);\n\n const a = document.createElement('a');\n a.href = cleanUrl.toLowerCase().startsWith('http') ? cleanUrl : 'https://' + cleanUrl;\n a.textContent = cleanUrl;\n a.target = '_blank';\n\n const frag = document.createDocumentFragment();\n if (before) frag.appendChild(document.createTextNode(before));\n frag.appendChild(a);\n if (after) frag.appendChild(document.createTextNode(after));\n\n node.replaceWith(frag);\n\n // Move caret after the link\n const range = document.createRange();\n range.setStartAfter(a);\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n isLinkCreated = true\n core.elements.lastCreatedLink = a;\n }\n }\n }\n\n if (core.elements.lastCreatedLink && event.key === 'Backspace') {\n event.preventDefault(); // stop normal backspace\n\n // Unwrap the link\n const textNode = document.createTextNode(core.elements.lastCreatedLink.textContent);\n core.elements.lastCreatedLink.replaceWith(textNode);\n\n // Move caret to end\n const range = document.createRange();\n range.setStart(textNode, textNode.length);\n range.collapse(true);\n }\n\n handleBackspaceInList(event, core);\n trackListSelectionDeletion(event, core);\n\n if (!isLinkCreated) core.elements.lastCreatedLink = null\n\n makeUnorderedList(event, core)\n makeHeading(event, core)\n makeBlockQuote(event, core)\n makeStrikethrough(event, core)\n makeCodeBlock(event, core)\n\n keyPressDebounce()\n }\n contentEditableDiv.onkeyup = () => {\n makeOrderedList(event, core)\n }\n contentEditableDiv.onclick = (e) => {\n if (options.disabled) return\n handleCaretPositionAndPlugin()\n let element = e.target; // The clicked element\n\n core.elements.selectedElement = e.target;\n\n destroyImageResizer(options, core)\n destroyTableEditPlugin(options, core)\n destroyAnchorPopover(core)\n\n if (e.target.closest(\"a\")?.tagName === 'A') {\n const anchor = e.target.closest(\"a\");\n if (anchor && element.tagName !== 'IMG') {\n core.elements.selectedElement = anchor;\n showAnchorPopover(anchor, e.pageX, e.pageY, options, core);\n }\n\n }\n if (element.tagName === 'IMG') initImageResizer('image', e.target, options, core)\n if (element.tagName === 'TD' || element.tagName === 'TH') initTableEditPlugin(e.target, options, core)\n if (element.tagName === \"FIGURE\") initImageResizer('figure', e.target, options, core)\n if (element.tagName === 'LI' && element.dataset.leksyTocHeadingId) navigateToHeading(core, element.dataset.leksyTocHeadingId)\n highlightActiveOutline(core, options)\n }\n contentEditableDiv.onpaste = (e) => {\n e.preventDefault();\n const clipboardData = e.clipboardData;\n\n if (clipboardData.items) {\n for (let item of clipboardData.items) {\n if (item.kind === 'file' && item.type.startsWith('image/')) {\n const file = item.getAsFile();\n const reader = new FileReader();\n reader.onload = async function (event) {\n const img = document.createElement('img');\n const base64String = event.target.result;\n img.src = await core.manuplateImage('base64', base64String);\n core.insertNode(img);\n };\n reader.readAsDataURL(file);\n return;\n }\n }\n }\n\n const pastedData = clipboardData.getData('text/html') || clipboardData.getData('text/plain');\n core.elements.iframeWindow.execCommand('insertHtml', false, cleanHTML(pastedData, options, core))\n };\n contentEditableDiv.ondrop = (e) => {\n e.preventDefault();\n const droppedData = e.dataTransfer.getData('text/html') || e.dataTransfer.getData('text/plain');\n core.elements.iframeWindow.execCommand('insertHtml', false, cleanHTML(droppedData, options, core))\n };\n contentEditableDiv.onblur = (e) => {\n core.onBlur(e.target.innerHTML)\n }\n\n iframeDoc.body.appendChild(contentEditableDiv);\n\n const editorCursor = document.createElement('div')\n editorCursor.style.position = 'absolute'\n editorCursor.style.top = '0'\n iframeDoc.body.appendChild(editorCursor);\n\n if (options.labels?.length) {\n const script = iframeDoc.createElement('script');\n script.src = \"https://cdnjs.cloudflare.com/ajax/libs/tributejs/5.1.3/tribute.js\";\n\n script.onload = () => {\n core.state.tribute = new iframe.contentWindow.Tribute({\n values: buildTributeValues(options.labels),\n noMatchTemplate: () => '<li>No match found</li>',\n menuItemTemplate: (item) => {\n if (item.original.isCategory) return `<div class=\"category\">${item.original.key}</div>`;\n return `<div class=\"item\">${item.original.key}</div>`;\n },\n containerClass: 'tribute',\n selectTemplate: function (item) {\n if (item.original.isCategory) return null;\n return `<span spellcheck=\"false\" contentEditable=\"false\" data-id=\"${item.original.value}\">${item.original.key}</span>`;\n },\n });\n core.state.tribute.attach(contentEditableDiv);\n makeObserver()\n };\n iframeDoc.body.appendChild(script);\n } else {\n makeObserver()\n }\n\n iframeDoc.addEventListener('keydown', core.updateCursorPosition)\n iframeDoc.addEventListener('keyup', () => {\n highlightActiveOutline(core, options)\n })\n iframeDoc.addEventListener('mouseup', core.updateCursorPosition)\n iframeDoc.addEventListener('mousedown', core.updateCursorPosition)\n iframeDoc.addEventListener('selectionchange', core.updateCursorPosition)\n\n core.elements.editor = contentEditableDiv;\n core.elements.editorCursor = editorCursor;\n core.elements.iframeWindow = iframeDoc;\n core.elements.iframeContainer = iframe;\n initTabs(core, options);\n }\n\n static #initStepper(options, core) {\n const stepper = document.createElement('div');\n stepper.className = `${options.classPrefix}${CLASSES.STEPPER}`;\n\n // Create the <ul> element for the breadcrumb\n const breadcrumbList = document.createElement('ul');\n breadcrumbList.className = 'breadcrumb';\n\n const status = document.createElement('span');\n\n stepper.appendChild(breadcrumbList)\n stepper.appendChild(status)\n\n core.elements.base.appendChild(stepper);\n core.elements.breadcumb = breadcrumbList\n core.elements.status = status\n core.elements.stepper = stepper\n }\n\n}\n\nconst convertHtmlToText = (html) => {\n const div = document.createElement('div');\n div.innerHTML = html;\n return div.textContent\n}\n\nconst isHTMLEmpty = (html) => {\n const tempElement = document.createElement('div');\n tempElement.innerHTML = html\n return !tempElement.innerText.trim() && !tempElement.querySelector('img , ol, ul, blockquote, h1, h2, h3');\n}\n\nexport default LeksyEditor\nexport {\n convertHtmlToText,\n isHTMLEmpty,\n}\n","const WHILE_LISTED_TAG = \"br|p|div|pre|blockquote|h|h1|h2|h3|h4|h5|h6|ol|ul|li|hr|figure|figcaption|img|iframe|audio|video|source|table|thead|tbody|tr|th|td|a|b|strong|var|i|em|u|ins|s|span|strike|del|sub|sup|code|svg|path|details|summary|font|article|section|main|header|footer|aside|mark|cite|abbr|dfn|nav|caption|picture|dl|dt|dd|time|label|kbd|samp|wbr\";\nconst WHILE_LISTED_ATTRIBUTES = \"align|alt|bgcolor|border|cellpadding|cellspacing|color|colspan|contenteditable|dir|download|face|height|href|lang|name|rowspan|size|src|style|target|title|valign|width|background|media|sizes|srcset|spellcheck\";\nconst BLOCKED_STYLES = [\n \"position\",\n \"inset\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"z-index\",\n \"float\",\n \"clear\",\n \"overflow\",\n \"overflow-x\",\n \"overflow-y\",\n \"transform\",\n \"transform-origin\",\n \"perspective\",\n \"transition\",\n \"transition-property\",\n \"transition-duration\",\n \"transition-timing-function\",\n \"transition-delay\",\n \"animation\",\n \"animation-name\",\n \"animation-duration\",\n \"animation-timing-function\",\n \"animation-delay\",\n \"animation-iteration-count\",\n \"animation-direction\",\n \"animation-fill-mode\",\n \"animation-play-state\",\n \"flex-basis\",\n \"flex-grow\",\n \"flex-shrink\",\n \"order\",\n \"place-self\",\n \"grid-column\",\n \"grid-row\",\n].join(\"|\")\n\nconst REGEX = {\n TEXT_URL: /(https?:\\/\\/[^\\s]+|www\\.[^\\s]+)$/i,\n URL: /^(https?:\\/\\/)([a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,}(\\/.*)?$/,\n MAILTO: /^mailto:[\\w.-]+@[\\w.-]+\\.\\w+$/,\n TEL: /^tel:\\+?[0-9\\s()-]+$/,\n EMAIL: /^[\\w.-]+@[\\w.-]+\\.\\w+$/,\n MOBILE: /^\\+?[0-9\\s()-]+$/,\n WHILE_LISTED_TAG: new RegExp('^(' + WHILE_LISTED_TAG.replace(/\\|/g, '\\\\b|\\\\b') + ')$', 'i'),\n WHILE_LISTED_ATTRIBUTES: new RegExp('^(' + WHILE_LISTED_ATTRIBUTES.replace(/\\|/g, '\\\\b|\\\\b') + ')$', 'i'),\n BLOCKED_STYLES: new RegExp('^(' + BLOCKED_STYLES.replace(/\\|/g, '\\\\b|\\\\b') + ')$', 'i'),\n}\n\nconst ERRORS = {\n INVALID_ELEMENT: 'Invalid argument: Element must be an instance of HTMLElement.',\n INVALID_PLUGIN: 'Invalid plugin: Plugin not found.',\n GIPHY_KEY_NOT_FOUND: 'GIPHY key not found.',\n PEXELS_KEY_NOT_FOUND: 'Pexels key not found.',\n TENOR_KEY_NOT_FOUND: 'Tenor key not found.',\n}\n\nconst CLASSES = {\n PREFIX: 'leksy-editor',\n CONTAINER: '-container',\n TOOLBAR: '-toolbar',\n TOOLBAR_TABLE: '-toolbar-table',\n TOOLBAR_ITEM: '-toolbar-item',\n TOOLBAR_ITEM_SELECT: 'select',\n TOOLBAR_ITEM_BUTTON_SELECT: 'button-select',\n TOOLBAR_ITEM_COLOR: 'color',\n TOOLBAR_ITEMS: '-toolbar-items',\n PLACEHOLDER: '-placeholder',\n CODEVIEW: '-codeview',\n STEPPER: '-stepper',\n DROPDOWN_CONTENT: '-dropdown-content',\n POPOVER_CONTENT: '-popover-content',\n POPOVER_TABS: '-popover-tabs',\n POPOVER_TAB: '-popover-tab',\n POPOVER_TAB_CONTENT: '-popover-tab-content',\n RESIZE_ITEMS: '-resize-items',\n RESIZE_ITEM: '-resize-item',\n MODAL: '-modal',\n DRAGGABLE_MODAL: '-draggable-modal',\n MODAL_CONTENT: '-modal-content',\n MODAL_HEADER: '-modal-header',\n MODAL_BODY: '-modal-body',\n MODAL_FOOTER: '-modal-footer',\n RESIZER: '-resizer',\n PREVIEW_MODAL_OVERLAY: '-preview-modal-overlay',\n PREVIEW_MODAL_CONTENT: '-preview-modal-content',\n PREVIEW_MODAL_CLOSE: '-preview-modal-close',\n PREVIEW_MODAL_BODY: '-preview-modal-body',\n UPLOAD_IMG_BOX: '-upload-img-box',\n UPLOAD_IMG_PREVIEW_BOX: '-upload-img-preview-box',\n UPLOAD_IMG_PREVIEW: '-upload-img-preview',\n}\n\nconst SVG = {\n REDO: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.59 14.18\"><g><path d=\"M11.58,18.48a6.84,6.84,0,1,1,6.85-6.85s0,.26,0,.67a8,8,0,0,1-.22,1.44l.91-.55a.51.51,0,0,1,.36,0,.45.45,0,0,1,.29.22.47.47,0,0,1,.06.36.45.45,0,0,1-.22.29L17.42,15.3l-.12,0h-.25l-.12-.06-.09-.09-.06-.07,0-.06-.87-2.12a.43.43,0,0,1,0-.37.49.49,0,0,1,.27-.26.41.41,0,0,1,.36,0,.53.53,0,0,1,.27.26l.44,1.09a6.51,6.51,0,0,0,.24-1.36,4.58,4.58,0,0,0,0-.64,5.83,5.83,0,0,0-1.73-4.17,5.88,5.88,0,0,0-8.34,0,5.9,5.9,0,0,0,4.17,10.06.51.51,0,0,1,.33.15.48.48,0,0,1,0,.68.53.53,0,0,1-.33.12Z\" transform=\"translate(-4.48 -4.54)\"/></g></svg>',\n UNDO: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.59 14.18\"><g><path d=\"M5,14a.43.43,0,0,1-.22-.29.46.46,0,0,1,.06-.36.43.43,0,0,1,.29-.22.56.56,0,0,1,.36,0l.91.55a8.27,8.27,0,0,1-.22-1.45,5.07,5.07,0,0,1,0-.67A6.85,6.85,0,1,1,13,18.47a.44.44,0,0,1-.33-.13.48.48,0,0,1,0-.68.51.51,0,0,1,.33-.15A5.89,5.89,0,0,0,17.15,7.45a5.88,5.88,0,0,0-8.33,0,5.84,5.84,0,0,0-1.73,4.17s0,.25,0,.65a6.49,6.49,0,0,0,.24,1.37l.44-1.09a.57.57,0,0,1,.27-.26.41.41,0,0,1,.36,0,.53.53,0,0,1,.27.26.43.43,0,0,1,0,.37L7.82,15l0,.09-.09.09-.1.07-.06,0H7.28l-.13,0-1.09-.63c-.65-.36-1-.57-1.1-.63Z\" transform=\"translate(-4.49 -4.53)\"/></g></svg>',\n BOLD: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11.76 15.75\"><g><path d=\"M6.4,3.76V19.5h6.76a5.55,5.55,0,0,0,2-.32,4.93,4.93,0,0,0,1.52-1,4.27,4.27,0,0,0,1.48-3.34,3.87,3.87,0,0,0-.69-2.37,5.74,5.74,0,0,0-.71-.83,3.44,3.44,0,0,0-1.1-.65,3.6,3.6,0,0,0,1.58-1.36,3.66,3.66,0,0,0,.53-1.93,3.7,3.7,0,0,0-1.21-2.87,4.65,4.65,0,0,0-3.25-1.1H6.4Zm2.46,6.65V5.57h3.52a4.91,4.91,0,0,1,1.36.15,2.3,2.3,0,0,1,.85.45,2.06,2.06,0,0,1,.74,1.71,2.3,2.3,0,0,1-.78,1.92,2.54,2.54,0,0,1-.86.46,4.7,4.7,0,0,1-1.32.15H8.86Zm0,7.27V12.15H12.7a4.56,4.56,0,0,1,1.38.17,3.43,3.43,0,0,1,.95.49,2.29,2.29,0,0,1,.92,2,2.73,2.73,0,0,1-.83,2.1,2.66,2.66,0,0,1-.83.58,3.25,3.25,0,0,1-1.26.2H8.86Z\" transform=\"translate(-6.4 -3.75)\"/></g></svg>',\n UNDERLINE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9.78 15.74\"><g><path d=\"M14.64,3.76h2.52v7.72a4.51,4.51,0,0,1-.59,2.31,3.76,3.76,0,0,1-1.71,1.53,6.12,6.12,0,0,1-2.64.53,5,5,0,0,1-3.57-1.18,4.17,4.17,0,0,1-1.27-3.24V3.76H9.9v7.3a3,3,0,0,0,.55,2,2.3,2.3,0,0,0,1.83.65,2.26,2.26,0,0,0,1.8-.65,3.09,3.09,0,0,0,.55-2V3.76Zm2.52,13.31V19.5H7.39V17.08h9.77Z\" transform=\"translate(-7.38 -3.76)\"/></g></svg>',\n ITALIC: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 10.49 15.76\"><g><path d=\"M17.16,3.79l.37,0-.06.38-.14.52A10,10,0,0,1,16.21,5a9.37,9.37,0,0,0-1,.32,6.68,6.68,0,0,0-.25.89c-.06.31-.11.59-.14.85-.3,1.36-.52,2.41-.68,3.14l-.61,3.18L13.1,15l-.43,2.4-.12.46a.62.62,0,0,0,0,.28c.44.1.85.17,1.23.22l.68.11a4.51,4.51,0,0,1-.08.6l-.09.42a.92.92,0,0,0-.23,0l-.43,0a1.37,1.37,0,0,1-.29,0c-.13,0-.63-.08-1.49-.16l-2,0c-.28,0-.87,0-1.78.12L7,19.5l.17-.88.8-.2A6.61,6.61,0,0,0,9.19,18,2.62,2.62,0,0,0,9.61,17l.28-1.41.58-2.75.12-.66c.05-.3.11-.58.17-.86s.12-.51.17-.69l.12-.48.12-.43.31-1.6.15-.65.31-1.91V5.14a3.86,3.86,0,0,0-1.48-.29l-.38,0,.2-1.06,3.24.14.75,0c.45,0,1.18,0,2.18-.09.23,0,.46,0,.71,0Z\" transform=\"translate(-7.04 -3.76)\"/></g></svg>',\n STRIKE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 14.9\"><g><path d=\"M12.94,13a4.27,4.27,0,0,1,1.32.58,1.46,1.46,0,0,1,.55,1.2,1.87,1.87,0,0,1-.88,1.64,4.17,4.17,0,0,1-2.35.59,4.44,4.44,0,0,1-2.74-.71,2.72,2.72,0,0,1-1-2.17H5.57a4.56,4.56,0,0,0,1.55,3.7,7,7,0,0,0,4.47,1.23,6,6,0,0,0,4.07-1.3,4.24,4.24,0,0,0,1.52-3.37,4,4,0,0,0-.26-1.4h-4ZM6.37,10.24A3.27,3.27,0,0,1,6,8.68a4,4,0,0,1,1.48-3.3,5.92,5.92,0,0,1,3.88-1.21,5.58,5.58,0,0,1,3.91,1.24,4.36,4.36,0,0,1,1.45,3.17H14.44a2.12,2.12,0,0,0-.91-1.81,4.45,4.45,0,0,0-2.44-.55,3.69,3.69,0,0,0-2,.51A1.64,1.64,0,0,0,8.3,8.22a1.3,1.3,0,0,0,.48,1.11,7,7,0,0,0,2.1.78l.28.06.28.08H6.37Zm13.09.68a.73.73,0,0,1,.49.21.66.66,0,0,1,.2.48.64.64,0,0,1-.2.48.71.71,0,0,1-.49.19H5.1a.67.67,0,0,1-.49-.19.66.66,0,0,1-.2-.48.64.64,0,0,1,.2-.48.73.73,0,0,1,.49-.21H19.46Z\" transform=\"translate(-4.41 -4.17)\"/></g></svg>',\n ALIGN_JUSTIFY: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 13.77\"><g><path d=\"M4.41,4.74v2H20.15v-2H4.41Zm0,5.9H20.15v-2H4.41v2Zm0,3.94H20.15v-2H4.41v2Zm0,3.93h7.87v-2H4.41v2Z\" transform=\"translate(-4.41 -4.74)\"/></g></svg>',\n ALIGN_LEFT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 13.77\"><g><path d=\"M4.41,4.74v2H20.15v-2H4.41Zm11.8,3.94H4.41v2H16.22v-2Zm-11.8,5.9H18.18v-2H4.41v2Zm0,3.93h9.84v-2H4.41v2Z\" transform=\"translate(-4.41 -4.74)\"/></g></svg>',\n ALIGN_RIGHT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 13.77\"><g><path d=\"M4.41,4.74v2H20.15v-2H4.41Zm3.93,5.9H20.15v-2H8.34v2Zm-2,3.94H20.14v-2H6.37v2Zm3.94,3.93h9.84v-2H10.31v2Z\" transform=\"translate(-4.41 -4.74)\"/></g></svg>',\n ALIGN_CENTER: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 13.77\"><g><path d=\"M4.41,4.74v2H20.15v-2H4.41Zm2,3.94v2H18.18v-2H6.37Zm-1,5.9H19.16v-2H5.39v2Zm2,3.93H17.2v-2H7.36v2Z\" transform=\"translate(-4.41 -4.74)\"/></g></svg>',\n CODE_VIEW: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.73 11.8\"><g><path d=\"M8.09,7.94a.76.76,0,0,1,.53.22.72.72,0,0,1,.21.52.76.76,0,0,1-.22.54L6.18,11.63l2.43,2.44a.69.69,0,0,1,.2.51.66.66,0,0,1-.21.51.75.75,0,0,1-.51.22.63.63,0,0,1-.51-.21h0L4.63,12.15a.7.7,0,0,1-.22-.53.67.67,0,0,1,.25-.55L7.57,8.16a.82.82,0,0,1,.52-.22Zm12.05,3.69a.7.7,0,0,1-.23.52L17,15.1h0a.66.66,0,0,1-.51.21.73.73,0,0,1-.51-.22.75.75,0,0,1-.22-.51.63.63,0,0,1,.21-.51l2.43-2.44L15.92,9.22a.73.73,0,0,1-.22-.53A.74.74,0,0,1,17,8.18h0l2.91,2.91a.67.67,0,0,1,.27.54Zm-5.9-5.9a.73.73,0,0,1,.61.32.71.71,0,0,1,.07.68L11,17a1,1,0,0,1-.22.32.6.6,0,0,1-.35.16.75.75,0,0,1-.69-.26.69.69,0,0,1-.12-.72L13.56,6.23a.75.75,0,0,1,.26-.35.74.74,0,0,1,.42-.15Z\" transform=\"translate(-4.41 -5.73)\"/></g></svg>',\n ATTACHMENT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 8.38 15.68\"><g><path d=\"M15.23,6h1v9.78a3.88,3.88,0,0,1-1.31,2.45,4,4,0,0,1-6.57-2.45V7A3,3,0,0,1,9.2,4.89a3,3,0,0,1,5,2.09v8.31a1.92,1.92,0,0,1-.58,1.39,2,2,0,0,1-1.39.58,1.92,1.92,0,0,1-1.39-.58,2,2,0,0,1-.58-1.39V8h1v7.32a1,1,0,0,0,.29.69,1,1,0,0,0,.69.28A.9.9,0,0,0,13,16a1,1,0,0,0,.29-.69V7a1.92,1.92,0,0,0-.58-1.39A2,2,0,0,0,11.27,5a1.92,1.92,0,0,0-1.39.58A2,2,0,0,0,9.33,7v8.31a3,3,0,1,0,5.9,0V6Z\" transform=\"translate(-8.08 -3.78)\"/></g></svg>',\n LIST_BULLETS: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 12.37\"><g><path d=\"M7.77,16.12a1.59,1.59,0,0,0-.49-1.18,1.62,1.62,0,0,0-1.19-.49,1.68,1.68,0,1,0,0,3.36,1.67,1.67,0,0,0,1.68-1.69Zm0-4.48A1.67,1.67,0,0,0,6.09,10,1.68,1.68,0,0,0,4.9,12.82a1.62,1.62,0,0,0,1.19.49,1.67,1.67,0,0,0,1.68-1.67Zm12.38,3.64a.27.27,0,0,0-.08-.19.28.28,0,0,0-.2-.09H9.19a.28.28,0,0,0-.2.08.29.29,0,0,0-.08.19V17a.27.27,0,0,0,.28.28H19.87a.27.27,0,0,0,.19-.08.24.24,0,0,0,.08-.2V15.28ZM7.77,7.13a1.63,1.63,0,0,0-.49-1.2,1.61,1.61,0,0,0-1.19-.49,1.61,1.61,0,0,0-1.19.49,1.71,1.71,0,0,0,0,2.4,1.62,1.62,0,0,0,1.19.49,1.61,1.61,0,0,0,1.19-.49,1.63,1.63,0,0,0,.49-1.2Zm12.38,3.66a.28.28,0,0,0-.08-.2.29.29,0,0,0-.19-.08H9.19a.27.27,0,0,0-.28.28v1.69a.27.27,0,0,0,.08.19.24.24,0,0,0,.2.08H19.87a.27.27,0,0,0,.19-.08.25.25,0,0,0,.08-.19V10.79Zm0-4.5a.27.27,0,0,0-.08-.19A.25.25,0,0,0,19.88,6H9.19A.28.28,0,0,0,9,6.1a.26.26,0,0,0-.08.19V8A.27.27,0,0,0,9,8.17a.24.24,0,0,0,.2.08H19.87a.27.27,0,0,0,.19-.08A.25.25,0,0,0,20.14,8V6.29Z\" transform=\"translate(-4.41 -5.44)\"/></g></svg>',\n LIST_NUMBER: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.69 15.74\"><g><path d=\"M7.66,18a1.24,1.24,0,0,0-.26-.78,1.17,1.17,0,0,0-.72-.42l.85-1V15H4.58v1.34h.94v-.46l.85,0h0c-.11.11-.22.23-.32.35s-.23.27-.37.47L5.39,17l.23.51c.61-.05.92.11.92.49a.42.42,0,0,1-.18.37.79.79,0,0,1-.45.12A1.41,1.41,0,0,1,5,18.15l-.51.77A2.06,2.06,0,0,0,6,19.5a1.8,1.8,0,0,0,1.2-.41A1.38,1.38,0,0,0,7.66,18Zm0-5.54H6.75V13H5.63A.72.72,0,0,1,6,12.51a5.45,5.45,0,0,1,.66-.45,2.71,2.71,0,0,0,.67-.57,1.19,1.19,0,0,0,.31-.81,1.29,1.29,0,0,0-.45-1,1.86,1.86,0,0,0-2-.11,1.51,1.51,0,0,0-.62.7l.74.52A.87.87,0,0,1,6,10.28a.51.51,0,0,1,.35.12.42.42,0,0,1,.13.33.55.55,0,0,1-.21.4,3,3,0,0,1-.5.38c-.19.13-.39.27-.58.42a2,2,0,0,0-.5.6,1.63,1.63,0,0,0-.21.81,3.89,3.89,0,0,0,.05.48h3.2V12.44Zm12.45,2.82a.27.27,0,0,0-.08-.19.28.28,0,0,0-.21-.08H9.1a.32.32,0,0,0-.21.08.24.24,0,0,0-.08.2V17a.27.27,0,0,0,.08.19.3.3,0,0,0,.21.08H19.83a.32.32,0,0,0,.21-.08.25.25,0,0,0,.08-.19V15.26ZM7.69,7.32h-1V3.76H5.8L4.6,4.88l.63.68a1.85,1.85,0,0,0,.43-.48h0l0,2.24H4.74V8.2h3V7.32Zm12.43,3.42a.27.27,0,0,0-.08-.19.28.28,0,0,0-.21-.08H9.1a.32.32,0,0,0-.21.08.24.24,0,0,0-.08.2v1.71a.27.27,0,0,0,.08.19.3.3,0,0,0,.21.08H19.83a.32.32,0,0,0,.21-.08.25.25,0,0,0,.08-.19V10.74Zm0-4.52A.27.27,0,0,0,20,6,.28.28,0,0,0,19.83,6H9.1A.32.32,0,0,0,8.89,6a.24.24,0,0,0-.08.19V7.93a.27.27,0,0,0,.08.19.32.32,0,0,0,.21.08H19.83A.32.32,0,0,0,20,8.12a.26.26,0,0,0,.08-.2V6.22Z\" transform=\"translate(-4.43 -3.76)\"/></g></svg>',\n NEW_LIST_NUMBER: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><path d=\"M144,48V208a8,8,0,0,1-16,0V62.13L100.12,78.86a8,8,0,1,1-8.24-13.72l40-24A8,8,0,0,1,144,48Z\"></path></svg>',\n LIST_SQUARE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><path d=\"M224,48V208a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V48A16,16,0,0,1,48,32H208A16,16,0,0,1,224,48Z\"></path></svg>',\n LIST_DISC: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"></path></svg>',\n LIST_CIRCLE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><circle cx=\"128\" cy=\"128\" r=\"96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg>',\n LIST_LOWER_ALPHA: '<svg viewBox=\"-6 0 32 32\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><title>a</title><path d=\"M15.969 12.094v-2.938h2.25v16.438h-2.25v-2.313c-1.563 1.719-3.875 2.844-6.438 2.844-4.75 0-8.906-3.75-8.906-8.438s4.156-8.438 8.906-8.438c2.563 0 4.875 1.125 6.438 2.844zM15.969 17.875v-0.375c-0.125-3.438-2.969-6.188-6.469-6.188-3.594 0-6.719 2.844-6.719 6.375s3.125 6.375 6.719 6.375c3.5 0 6.344-2.75 6.469-6.188z\"></path></svg>',\n LIST_LOWER_ROMAN: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M272 112C272 85.5 293.5 64 320 64C346.5 64 368 85.5 368 112C368 138.5 346.5 160 320 160C293.5 160 272 138.5 272 112zM224 256C224 238.3 238.3 224 256 224L320 224C337.7 224 352 238.3 352 256L352 512L384 512C401.7 512 416 526.3 416 544C416 561.7 401.7 576 384 576L256 576C238.3 576 224 561.7 224 544C224 526.3 238.3 512 256 512L288 512L288 288L256 288C238.3 288 224 273.7 224 256z\"/></svg>',\n LIST_UPPER_ALPHA: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><path d=\"M349.5 115.7C344.6 103.8 332.9 96 320 96C307.1 96 295.4 103.8 290.5 115.7C197.2 339.7 143.8 467.7 130.5 499.7C123.7 516 131.4 534.7 147.7 541.5C164 548.3 182.7 540.6 189.5 524.3L221.3 448L418.6 448L450.4 524.3C457.2 540.6 475.9 548.3 492.2 541.5C508.5 534.7 516.2 516 509.4 499.7C496.1 467.7 442.7 339.7 349.4 115.7zM392 384L248 384L320 211.2L392 384z\"/></svg>',\n SUBSCRIPT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.75 14.61\"><g><path d=\"M15.38,4.33H12.74L11.19,7c-.28.46-.51.87-.69,1.21L10.07,9h0l-.44-.8c-.22-.4-.45-.81-.71-1.23L7.34,4.33H4.68L8.26,10,4.4,16.08H7.1l1.69-2.83c.38-.63.72-1.22,1-1.78l.25-.46h0l.49.92c.24.45.48.89.74,1.32L13,16.08h2.61L11.84,10l1.77-2.84,1.77-2.85Zm4.77,13.75H17v-.15c0-.4.05-.64.16-.72a4.42,4.42,0,0,1,1.16-.31,3.3,3.3,0,0,0,1.54-.56A1.84,1.84,0,0,0,20.15,15a1.78,1.78,0,0,0-.44-1.41A2.8,2.8,0,0,0,18,13.25a2.71,2.71,0,0,0-1.69.37,1.83,1.83,0,0,0-.44,1.43v.23H17v-.23q0-.63.18-.78a1.62,1.62,0,0,1,.88-.15,1.59,1.59,0,0,1,.88.15q.18.15.18.75t-.18.75a3.58,3.58,0,0,1-1.18.33,3.33,3.33,0,0,0-1.52.51,1.57,1.57,0,0,0-.32,1.18v1.15h4.27v-.86Z\" transform=\"translate(-4.4 -4.33)\"/></g></svg>',\n SUPERSCRIPT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.75 15.42\"><g><path d=\"M12,13.14l3.61-5.81H12.94L11.33,10c-.28.46-.51.88-.69,1.25l-.45.83h0l-.45-.85c-.22-.41-.45-.82-.71-1.24L7.4,7.33H4.68l3.66,5.81L4.4,19.33H7.14l1.74-2.87q.58-1,1-1.83l.25-.48h0l.51.94.75,1.37,1.72,2.87h2.67l-1.92-3.09c-1.12-1.8-1.76-2.83-1.92-3.1Zm4.84-4.41h0l0,.15h3.27v.86H15.77V8.58a1.66,1.66,0,0,1,.33-1.22,3.51,3.51,0,0,1,1.56-.51,3.68,3.68,0,0,0,1.21-.34c.13-.1.19-.36.19-.77S19,5.07,18.87,5A1.63,1.63,0,0,0,18,4.8a1.58,1.58,0,0,0-.91.17c-.13.11-.19.38-.19.8V6H15.78V5.76a1.87,1.87,0,0,1,.45-1.47A2.84,2.84,0,0,1,18,3.91a2.8,2.8,0,0,1,1.72.38,1.84,1.84,0,0,1,.45,1.44,1.91,1.91,0,0,1-.34,1.35,3.24,3.24,0,0,1-1.58.57A3.69,3.69,0,0,0,17,8c-.12.1-.17.35-.17.76Z\" transform=\"translate(-4.4 -3.91)\"/></g></svg>',\n INDENT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 12.36\"><g><path d=\"M4.68,14.45a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V9.1a.27.27,0,0,1,.08-.19.28.28,0,0,1,.2-.08.25.25,0,0,1,.19.07l2.54,2.54a.29.29,0,0,1,0,.4L4.88,14.36a.24.24,0,0,1-.2.09Zm15.19,1.12a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.25.25,0,0,1-.08-.19V15.84a.27.27,0,0,1,.27-.27H19.87Zm0-3.38a.27.27,0,0,1,.19.08.28.28,0,0,1,.08.21v1.68a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V12.48a.32.32,0,0,1,.08-.21.24.24,0,0,1,.19-.08h9.56Zm0-3.37a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.27-.27V9.1a.27.27,0,0,1,.27-.27h9.56Zm.2-3.29a.28.28,0,0,1,.08.2V7.41a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V5.73a.32.32,0,0,1,.08-.21.25.25,0,0,1,.19-.08H19.87a.28.28,0,0,1,.2.09Z\" transform=\"translate(-4.41 -5.44)\"/></g></svg>',\n OUTDENT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 12.36\"><g><path d=\"M19.87,15.57a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.25.25,0,0,1-.08-.19V15.84a.27.27,0,0,1,.27-.27H19.87ZM7.5,14.45a.25.25,0,0,1-.2-.09L4.76,11.84a.29.29,0,0,1,0-.4L7.3,8.9a.29.29,0,0,1,.4,0,.31.31,0,0,1,.07.2v5.06a.32.32,0,0,1-.08.21.26.26,0,0,1-.19.08ZM19.87,8.82a.27.27,0,0,1,.19.08.25.25,0,0,1,.08.19v1.69a.27.27,0,0,1-.08.19.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.27-.27V9.1a.27.27,0,0,1,.27-.27h9.56Zm0,3.37a.27.27,0,0,1,.19.08.28.28,0,0,1,.08.21v1.68a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H10.31a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V12.48a.32.32,0,0,1,.08-.21.24.24,0,0,1,.19-.08h9.56Zm.2-6.66a.28.28,0,0,1,.08.2V7.41a.32.32,0,0,1-.08.21.25.25,0,0,1-.19.08H4.68a.27.27,0,0,1-.19-.08.3.3,0,0,1-.08-.21V5.73a.32.32,0,0,1,.08-.21.25.25,0,0,1,.19-.08H19.87a.28.28,0,0,1,.2.09Z\" transform=\"translate(-4.41 -5.44)\"/></g></svg>',\n LINE_HEIGHT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.76 13.56\"><g><path d=\"M4.4,4.88V8.26a2,2,0,0,0,.5.39s.1,0,.18-.12a.62.62,0,0,0,.17-.28c.06-.19.13-.44.21-.74s.14-.52.19-.66a.58.58,0,0,1,.21-.3,2.41,2.41,0,0,1,.63-.21,3.83,3.83,0,0,1,.88-.12,9.15,9.15,0,0,1,1.31.06.16.16,0,0,1,.11,0,.26.26,0,0,1,.06.14,4,4,0,0,1,0,.49v2l.05,3.77c0,1.41,0,2.68-.05,3.81a1.79,1.79,0,0,1-.11.49,10.68,10.68,0,0,1-1.4.45,1.12,1.12,0,0,0-.69.43v.31l0,.22.61,0c.85-.08,1.54-.12,2.06-.12a19.76,19.76,0,0,1,2.09.08,15.08,15.08,0,0,0,1.64.08,1.4,1.4,0,0,0,.29,0,1.58,1.58,0,0,0,0-.26l-.05-.43a2.26,2.26,0,0,0-.43-.17l-.77-.22-.15,0a2.55,2.55,0,0,1-.78-.28,2.56,2.56,0,0,1-.11-.75l0-1.29,0-3.15V7.53a10.51,10.51,0,0,1,.06-1.2,3.83,3.83,0,0,1,.6,0l1.88,0a2.18,2.18,0,0,1,.38,0,.45.45,0,0,1,.23.17.9.9,0,0,1,.05.25c0,.16.06.35.1.58a3.33,3.33,0,0,0,.14.55A6.39,6.39,0,0,0,15,9a2.91,2.91,0,0,0,.6-.15,2.77,2.77,0,0,0,0-.46l0-.51,0-2.95-.25,0-.38,0L15,4.94a.71.71,0,0,1-.18.15.45.45,0,0,1-.25.07l-.29,0H8.75l-.15,0H7.45a17,17,0,0,1-1.86,0L5.36,5l-.25-.13ZM19.75,16.14h-.69v-9h.69A.4.4,0,0,0,20.13,7c.06-.11,0-.24-.1-.39L18.92,5.15a.52.52,0,0,0-.86,0L17,6.58c-.12.15-.16.28-.1.39s.18.16.38.16h.69v9h-.69a.4.4,0,0,0-.38.16c-.06.11,0,.24.1.39l1.11,1.43a.52.52,0,0,0,.86,0L20,16.69c.12-.15.16-.28.1-.39a.4.4,0,0,0-.38-.16Z\" transform=\"translate(-4.4 -4.86)\"/></g></svg>',\n PARAGRAPH_STYLE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 11.81 15.74\"><g><path d=\"M18.18,3.76v2h-2V19.5h-2V5.73h-2V19.5h-2V11.63a3.94,3.94,0,0,1,0-7.87h7.87Z\" transform=\"translate(-6.37 -3.76)\"/></g></svg>',\n TEXT_STYLE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 13.76 15.74\"><g><path d=\"M17.68,6.71a2.22,2.22,0,0,0,1.06-.22.74.74,0,0,0,.42-.7.73.73,0,0,0-.08-.33.67.67,0,0,0-.17-.22,1,1,0,0,0-.31-.15L18.26,5l-.45-.09A15.27,15.27,0,0,0,13.26,5V4.74c0-.66-.63-1-1.92-1-.24,0-.43.15-.59.46a4,4,0,0,0-.36,1.14h0v0a26.45,26.45,0,0,1-3.5.35A2,2,0,0,0,5.77,6a.84.84,0,0,0-.37.79,2.14,2.14,0,0,0,.41,1.29,1.23,1.23,0,0,0,1.05.63,16.62,16.62,0,0,0,3.29-.45l-.34,3.35c-.16,1.61-.29,2.9-.37,3.86s-.12,1.66-.12,2.09l0,.65a5.15,5.15,0,0,0,.05.6,1.28,1.28,0,0,0,.16.54.34.34,0,0,0,.28.18,1.16,1.16,0,0,0,.79-.46,3.66,3.66,0,0,0,.68-1,22.08,22.08,0,0,0,1-4.33q.49-3.1.78-6.15a24.69,24.69,0,0,1,4.62-.84Z\" transform=\"translate(-5.4 -3.76)\"/></g></svg>',\n FONT_COLOR: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 14.61\"><g><path d=\"M18.5,15.57,14.28,4.32h-3.4L6.65,15.57h3l.8-2.26h4.23l.8,2.26h3ZM14,11.07H11.14L12.54,7,13.25,9c.41,1.18.64,1.86.7,2ZM4.41,16.69v2.24H20.15V16.69H4.41Z\" transform=\"translate(-4.41 -4.32)\"/></g></svg>',\n HIGHLIGHT_COLOR: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.66 15.74\"><g><path d=\"M12.32,9.31,13.38,13H11.21l.52-1.83q.46-1.61.54-1.83ZM4.44,3.76H20.1V19.5H4.44V3.76ZM14.71,17.32h2.63L13.7,6H10.89L7.26,17.32H9.89l.63-2.24h3.55l.32,1.12c.18.65.29,1,.32,1.12Z\" transform=\"translate(-4.44 -3.76)\"/></g></svg>',\n TABLE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 15.74\"><g><path d=\"M4.41,8.05V3.76H8.7V8.05H4.41Zm5.71,0V3.76h4.3V8.05h-4.3Zm5.74-4.29h4.29V8.05H15.86V3.76Zm-11.45,10V9.48H8.7v4.3H4.41Zm5.71,0V9.48h4.3v4.3h-4.3Zm5.74,0V9.48h4.29v4.3H15.86ZM4.41,19.5V15.21H8.7V19.5H4.41Zm5.71,0V15.21h4.3V19.5h-4.3Zm5.74,0V15.21h4.29V19.5H15.86Z\" transform=\"translate(-4.41 -3.76)\"/></g></svg>',\n HORIZONTAL_RULE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 2.24\"><g><path d=\"M20.15,12.75V10.51H4.41v2.24H20.15Z\" transform=\"translate(-4.41 -10.51)\"/></g></svg>',\n SHOW_BLOCKS: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.66 15.67\"><g><path d=\"M19.72,5.58a1.64,1.64,0,0,0-1.64-1.64H6.23a1.62,1.62,0,0,0-1.16.48,1.63,1.63,0,0,0-.48,1.16V9.63a1.6,1.6,0,0,0,.48,1.16,1.62,1.62,0,0,0,1.16.47H18.09a1.67,1.67,0,0,0,1.16-.47,1.62,1.62,0,0,0,.48-1.16V5.58Zm-.94,4.05a.68.68,0,0,1-.7.7H6.23a.66.66,0,0,1-.48-.2.74.74,0,0,1-.21-.5V5.58a.66.66,0,0,1,.2-.48.71.71,0,0,1,.48-.21H18.08a.74.74,0,0,1,.5.21.66.66,0,0,1,.2.48ZM6.48,7.72a.21.21,0,0,0,.17-.07.22.22,0,0,0,.07-.17V7.06a1.27,1.27,0,0,1,.11-.52.37.37,0,0,1,.36-.23H8.77A.25.25,0,0,0,9,6.17a.19.19,0,0,0,0-.23.27.27,0,0,0-.2-.12H7.19a.88.88,0,0,0-.72.39,1.51,1.51,0,0,0-.23.85v.42a.24.24,0,0,0,.24.24Zm-.19.81a.21.21,0,0,0,.17-.07.26.26,0,0,0,.07-.17.24.24,0,0,0-.24-.24.2.2,0,0,0-.16.09.2.2,0,0,0-.07.16.22.22,0,0,0,.07.17.23.23,0,0,0,.16.06Zm8.46,5.1a1.63,1.63,0,0,0-.47-1.16A1.61,1.61,0,0,0,13.12,12H6.23a1.6,1.6,0,0,0-1.16.46,1.62,1.62,0,0,0-.48,1.16v4.05a1.64,1.64,0,0,0,1.64,1.64h6.89a1.6,1.6,0,0,0,1.16-.48,1.62,1.62,0,0,0,.47-1.16Zm-.94,4a.7.7,0,0,1-.2.49.65.65,0,0,1-.5.2H6.23a.66.66,0,0,1-.48-.2.75.75,0,0,1-.21-.49v-4a.74.74,0,0,1,.21-.5.66.66,0,0,1,.48-.2h6.89a.68.68,0,0,1,.7.7v4Zm6.15,0v-4a1.6,1.6,0,0,0-.48-1.16A1.67,1.67,0,0,0,18.32,12H17.1a1.63,1.63,0,0,0-1.16.47,1.61,1.61,0,0,0-.47,1.16v4a1.67,1.67,0,0,0,.47,1.16,1.62,1.62,0,0,0,1.16.48h1.22A1.64,1.64,0,0,0,20,17.68Zm-.94-4v4a.75.75,0,0,1-.21.49.62.62,0,0,1-.48.2H17.11a.69.69,0,0,1-.5-.2.7.7,0,0,1-.2-.49v-4a.68.68,0,0,1,.7-.7h1.22a.66.66,0,0,1,.48.2.72.72,0,0,1,.21.5Z\" transform=\"translate(-4.44 -3.79)\"/></g></svg>',\n IMAGE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.75 15.77\"><g><path d=\"M8.77,8.72a.88.88,0,0,1-.61-.27.82.82,0,0,1-.25-.61.89.89,0,0,1,.25-.62A.82.82,0,0,1,8.77,7a.81.81,0,0,1,.61.25.83.83,0,0,1,.27.62.81.81,0,0,1-.25.61.91.91,0,0,1-.63.27Zm9.62-5a1.74,1.74,0,0,1,1.76,1.76V17.76a1.74,1.74,0,0,1-1.76,1.76H6.16A1.74,1.74,0,0,1,4.4,17.76V5.51A1.74,1.74,0,0,1,6.16,3.75H18.39Zm0,1.75H6.16v8L8.53,11.8a.94.94,0,0,1,.54-.17.86.86,0,0,1,.54.2L11.09,13l3.64-4.55a.78.78,0,0,1,.34-.25.85.85,0,0,1,.42-.07.89.89,0,0,1,.39.12.78.78,0,0,1,.28.29l2.24,3.67V5.51Zm0,12.24V15.6L15.3,10.53,11.89,14.8a.89.89,0,0,1-.59.32.82.82,0,0,1-.64-.18L9,13.62,6.16,15.74v2Z\" transform=\"translate(-4.4 -3.75)\"/></g></svg>',\n VIDEO: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 14.55\"><g><path d=\"M20.15,10.26V18.9l-3.94-1.57v1.2H4.41V10.66H16.22v1.23l2-.81,2-.82ZM14.64,17h0V12.54h0v-.31H6V17h8.67Zm3.94-.37v-4l-2.37,1v2l1.18.48,1.19.48ZM7.94,9.86A2.77,2.77,0,0,1,5.19,7.11a2.76,2.76,0,0,1,5.51,0A2.78,2.78,0,0,1,7.94,9.86Zm0-3.93a1.21,1.21,0,0,0-.83.35,1.15,1.15,0,0,0-.34.84A1.09,1.09,0,0,0,7.11,8,1.15,1.15,0,0,0,8,8.28,1.13,1.13,0,0,0,9.11,7.12,1.16,1.16,0,0,0,7.94,5.93Zm5.9,3.93a2.34,2.34,0,0,1-1.67-.68,2.3,2.3,0,0,1-.68-1.67,2.35,2.35,0,0,1,4-1.67,2.37,2.37,0,0,1,0,3.34,2.33,2.33,0,0,1-1.68.68Zm0-3.14a.75.75,0,1,0,.55.22.73.73,0,0,0-.55-.22Z\" transform=\"translate(-4.41 -4.35)\"/></g></svg>',\n LINK: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 15.72\"><g><path d=\"M13.05,13.63a.24.24,0,0,1,.15.22L13.42,16a.19.19,0,0,1-.08.18l-2.12,2.14a4.08,4.08,0,0,1-1.29.85A4,4,0,0,1,4.71,17a3.92,3.92,0,0,1-.3-1.52A4,4,0,0,1,4.71,14a3.91,3.91,0,0,1,.87-1.3L7.7,10.56a.25.25,0,0,1,.2-.06l2.17.22a.21.21,0,0,1,.19.15.24.24,0,0,1,0,.25L7.12,14.23a1.81,1.81,0,0,0,0,2.58,1.78,1.78,0,0,0,1.29.52,1.74,1.74,0,0,0,1.28-.52L12.8,13.7a.24.24,0,0,1,.25-.07ZM19,4.92a4,4,0,0,1,0,5.66L16.86,12.7a.25.25,0,0,1-.17.08l-2.2-.23a.21.21,0,0,1-.19-.15.22.22,0,0,1,0-.25L17.44,9a1.81,1.81,0,0,0,0-2.58,1.78,1.78,0,0,0-1.29-.52,1.74,1.74,0,0,0-1.28.52L11.76,9.57a.21.21,0,0,1-.25,0,.24.24,0,0,1-.16-.21l-.22-2.17a.19.19,0,0,1,.08-.18l2.12-2.14a4.08,4.08,0,0,1,1.29-.85,4.05,4.05,0,0,1,3.06,0,3.85,3.85,0,0,1,1.3.85ZM5.84,9.82a.25.25,0,0,1-.18-.08.19.19,0,0,1-.07-.19l.11-.77a.2.2,0,0,1,.11-.17.24.24,0,0,1,.2,0l2.5.72a.25.25,0,0,1,.15.27.22.22,0,0,1-.23.21l-2.59,0Zm4.12-2-.73-2.5a.27.27,0,0,1,0-.2A.21.21,0,0,1,9.41,5L10.19,5a.25.25,0,0,1,.19,0,.23.23,0,0,1,.08.18l-.05,2.61a.2.2,0,0,1-.19.23h0A.22.22,0,0,1,10,7.85Zm8.76,5.58a.25.25,0,0,1,.18.08.23.23,0,0,1,.06.2l-.11.77a.25.25,0,0,1-.11.17.21.21,0,0,1-.12,0l-.08,0L16,14a.25.25,0,0,1-.15-.27.22.22,0,0,1,.22-.21l1.29,0,1.33,0Zm-4.12,2,.74,2.51a.28.28,0,0,1,0,.2.23.23,0,0,1-.18.11l-.8.11a.23.23,0,0,1-.17-.07.25.25,0,0,1-.08-.18l0-2.61a.22.22,0,0,1,.22-.22.21.21,0,0,1,.26.15Z\" transform=\"translate(-4.41 -3.77)\"/></g></svg>',\n UNLINK: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 15.72\"><g><path d=\"M19,18.32a4,4,0,0,0,0-5.68L15.85,9.5l-1.17,1.55L17.57,14a2,2,0,0,1,.61,1.47,2.08,2.08,0,0,1-2.09,2.09,2,2,0,0,1-1.47-.61l-.38-.37-1.74,1,.8.78a4,4,0,0,0,5.68,0ZM8,9.77a2,2,0,0,1-1.27-1,1.89,1.89,0,0,1-.21-1.57A2.1,2.1,0,0,1,7.45,6,2,2,0,0,1,9,5.76L12.27,7.2l.49-2L9.48,3.9a4,4,0,0,0-3.06.41A3.82,3.82,0,0,0,4.56,6.73a3.8,3.8,0,0,0,.4,3A3.78,3.78,0,0,0,7.39,11.6l5.38,2,.49-2-2.64-.94L8,9.77Z\" transform=\"translate(-4.41 -3.76)\"/></g></svg>',\n REMOVE_FORMAT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 13.76\"><g><path d=\"M13.69,17.2h6.46v1.31H8.56L4.41,14.37,14,4.75l6.06,6.06L16.89,14l-3.2,3.19Zm-4.61,0h2.77L14.09,15,9.88,10.75,6.25,14.38l1.41,1.41c.84.82,1.31,1.29,1.42,1.41Z\" transform=\"translate(-4.41 -4.75)\"/></g></svg>',\n EDIT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 15.73\"><g><path d=\"M7.51,5.68h6l1.52-1.57H6.94a2.4,2.4,0,0,0-1.79.82A2.8,2.8,0,0,0,4.41,6.8V17a2.55,2.55,0,0,0,.75,1.8A2.48,2.48,0,0,0,7,19.5H17.22a2.57,2.57,0,0,0,1.83-.74,2.52,2.52,0,0,0,.77-1.8V8.83l-1.58,1.54v6a1.54,1.54,0,0,1-1.53,1.53H7.51A1.54,1.54,0,0,1,6,16.41V7.21A1.52,1.52,0,0,1,7.51,5.68Zm5.63,7.47h0L10.7,10.74l-1,3.38,1.71-.48,1.7-.49Zm.34-.34h0l5.36-5.32L16.4,5.08,11,10.4l1.23,1.21,1.21,1.2ZM19.93,6.4a.82.82,0,0,0,.22-.48A.54.54,0,0,0,20,5.47L18.45,4A.67.67,0,0,0,18,3.77a.7.7,0,0,0-.48.21l-.74.72,2.44,2.43.37-.37.35-.36Z\" transform=\"translate(-4.41 -3.77)\"/></g></svg>',\n DELETE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.73 15.74\"><g><path d=\"M19.16,6.71a.94.94,0,0,0,.69-.28.91.91,0,0,0,.29-.68A1,1,0,0,0,19.85,5a.93.93,0,0,0-.69-.3H14.24A.94.94,0,0,0,14,4.06a.92.92,0,0,0-.7-.3h-2a1,1,0,0,0-.7.3.93.93,0,0,0-.28.68H5.39A.92.92,0,0,0,4.7,5a1,1,0,0,0-.29.71.91.91,0,0,0,.29.68,1,1,0,0,0,.69.28H19.16Zm-12.79,1a1,1,0,0,0-.7.3.94.94,0,0,0-.28.69v8.85A1.88,1.88,0,0,0,6,18.93a1.9,1.9,0,0,0,1.39.57H17.2a1.87,1.87,0,0,0,1.39-.58,1.91,1.91,0,0,0,.58-1.39V8.68A1,1,0,0,0,18.88,8a.89.89,0,0,0-.7-.29,1,1,0,0,0-.69.29.92.92,0,0,0-.29.68v7.87a1,1,0,0,1-1,1H8.34a.94.94,0,0,1-.69-.28,1,1,0,0,1-.29-.71V8.68a1,1,0,0,0-1-1Z\" transform=\"translate(-4.41 -3.76)\"/></g></svg>',\n REVERT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.76 14.69\"><g><path d=\"M18.26,15V12.3l1.89-2V15a2.58,2.58,0,0,1-.24,1c-.2.58-.75.92-1.65,1H7.56v2L4.41,15.63,7.56,13v2h10.7ZM6.3,8.28V11L4.41,13V8.28a2.58,2.58,0,0,1,.24-1c.2-.58.75-.92,1.65-1H17v-2l3.15,3.34L17,10.3v-2H6.3Z\" transform=\"translate(-4.4 -4.28)\"/></g></svg>',\n AUTO_SIZE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.74 15.74\"><g><path d=\"M6.71,17.19,6.89,16l1.21-.15A6,6,0,0,1,6.81,13.9a5.78,5.78,0,0,1-.45-2.27A6,6,0,0,1,8.1,7.45a5.83,5.83,0,0,1,4.17-1.73l1-1-1-1A7.89,7.89,0,0,0,5,14.64a7.73,7.73,0,0,0,1.71,2.55Zm5.57,2.31h0A7.86,7.86,0,0,0,17.85,6.07L17.67,7.3l-1.21.15a5.9,5.9,0,0,1,1.29,1.92,5.81,5.81,0,0,1,.45,2.26,5.91,5.91,0,0,1-5.9,5.9l-1,1,.49.49.47.5Z\" transform=\"translate(-4.41 -3.76)\"/></g></svg>',\n PLUS: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"16\" height=\"16\" ><path d=\"M11 11V5H13V11H19V13H13V19H11V13H5V11H11Z\"></path></svg>',\n ARROW_DOWN: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.73 8.67\"><g><path d=\"M18.79,7.52a.8.8,0,0,1,.56-.23.82.82,0,0,1,.79.79.8.8,0,0,1-.23.56l-7.07,7.07a.79.79,0,0,1-.57.25.77.77,0,0,1-.57-.25h0L4.64,8.65a.8.8,0,0,1-.23-.57.82.82,0,0,1,.79-.79.8.8,0,0,1,.56.23L12.28,14l3.26-3.26,3.25-3.26Z\" transform=\"translate(-4.41 -7.29)\"/></g></svg>',\n ARROW_LEFT: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M7.82843 10.9999H20V12.9999H7.82843L13.1924 18.3638L11.7782 19.778L4 11.9999L11.7782 4.22168L13.1924 5.63589L7.82843 10.9999Z\"></path></svg>',\n ARROW_UP: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M13.0001 22.0003L11.0002 22.0004L11.0002 5.82845L7.05044 9.77817L5.63623 8.36396L12.0002 2L18.3642 8.36396L16.9499 9.77817L13.0002 5.8284L13.0001 22.0003Z\"></path></svg>',\n ARROW_DOWN_LONG: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M13.0001 1.99974L11.0002 1.9996L11.0002 18.1715L7.05044 14.2218L5.63623 15.636L12.0002 22L18.3642 15.636L16.9499 14.2218L13.0002 18.1716L13.0001 1.99974Z\"></path></svg>',\n ARROW_DROP_DOWN_FILL: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" ><path d=\"M12 14L8 10H16L12 14Z\"></path></svg>',\n ARROW_DROP_RIGHT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16 12L10 18V6L16 12Z\"></path></svg>',\n GIPHY_SVG: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12px\" viewBox=\"0 0 28 35\"><g fill-rule=\"evenodd\" clip-rule=\"evenodd\"><path fill=\"#00ff99\" d=\"M0 3h4v29H0z\"></path><path fill=\"#9933ff\" d=\"M24 11h4v21h-4z\"></path><path fill=\"#00ccff\" d=\"M0 31h28v4H0z\"></path><path fill=\"#fff35c\" d=\"M0 0h16v4H0z\"></path><path fill=\"#ff6666\" d=\"M24 8V4h-4V0h-4v12h12V8\"></path><path class=\"shadow\" d=\"M24 16v-4h4M16 0v4h-4\"></path></g></svg>',\n PEXELS: '<svg viewBox=\"0 0 17 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g> <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 5C12.7111 5 13.3875 5.14845 14 5.41604C15.7659 6.1876 17 7.94968 17 10C17 12.0503 15.7659 13.8124 14 14.584C13.3875 14.8516 12.7111 15 12 15V19H6V5H12ZM8 7V17H10V13H12L12.0032 12.9988C13.6427 13.0303 15.0746 11.6934 15.0443 9.95469L15.0375 9.56529C15.0121 8.10183 13.7882 6.94549 12.3257 7.00299L12.0203 7.00762L12 7H8Z\" fill=\"#07a081\"></path> </g></svg>',\n EMOJI: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M10.5199 19.8634C10.5955 18.6615 10.8833 17.5172 11.3463 16.4676C9.81124 16.3252 8.41864 15.6867 7.33309 14.7151L8.66691 13.2248C9.55217 14.0172 10.7188 14.4978 12 14.4978C12.1763 14.4978 12.3501 14.4887 12.5211 14.471C14.227 12.2169 16.8661 10.7083 19.8634 10.5199C19.1692 6.80877 15.9126 4 12 4C7.58172 4 4 7.58172 4 12C4 15.9126 6.80877 19.1692 10.5199 19.8634ZM19.0233 12.636C15.7891 13.2396 13.2396 15.7891 12.636 19.0233L19.0233 12.636ZM22 12C22 12.1677 21.9959 12.3344 21.9877 12.5L12.5 21.9877C12.3344 21.9959 12.1677 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12ZM10 10C10 10.8284 9.32843 11.5 8.5 11.5C7.67157 11.5 7 10.8284 7 10C7 9.17157 7.67157 8.5 8.5 8.5C9.32843 8.5 10 9.17157 10 10ZM17 10C17 10.8284 16.3284 11.5 15.5 11.5C14.6716 11.5 14 10.8284 14 10C14 9.17157 14.6716 8.5 15.5 8.5C16.3284 8.5 17 9.17157 17 10Z\"></path></svg>',\n MENTION: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 12C20 7.58172 16.4183 4 12 4C7.58172 4 4 7.58172 4 12C4 16.4183 7.58172 20 12 20C13.6418 20 15.1681 19.5054 16.4381 18.6571L17.5476 20.3214C15.9602 21.3818 14.0523 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12V13.5C22 15.433 20.433 17 18.5 17C17.2958 17 16.2336 16.3918 15.6038 15.4659C14.6942 16.4115 13.4158 17 12 17C9.23858 17 7 14.7614 7 12C7 9.23858 9.23858 7 12 7C13.1258 7 14.1647 7.37209 15.0005 8H17V13.5C17 14.3284 17.6716 15 18.5 15C19.3284 15 20 14.3284 20 13.5V12ZM12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9Z\"></path></svg>',\n INSERT_ROW_BELOW: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.8 15.8\"><g><path d=\"M15.7,1.3c-0.1-0.1-0.1-0.2-0.2-0.2L15.3,1H0.4L0.3,1.1c0,0-0.1,0.1-0.1,0.1c0,0-0.1,0.1-0.1,0.1L0,1.4v7.7l0.1,0.1c0,0.1,0.1,0.1,0.2,0.2l0.1,0.1h2.3V9.3l0.1-0.5L3,8.5l0.1-0.2c-0.1,0-0.2,0-0.3,0H1.2v-6h13.3v6h-1.6c-0.1,0-0.2,0-0.3,0l0.1,0.2l0.2,0.4C12.9,9,13,9.2,13,9.3v0.1h2.3l0.2-0.1c0.1,0,0.1-0.1,0.2-0.2l0.1-0.1V1.4L15.7,1.3z\"/><path d=\"M10.5,7.5C9.9,7.1,9.3,6.8,8.6,6.7c-0.2,0-0.5-0.1-0.7,0c-0.2,0-0.5,0-0.7,0C6.6,6.7,6.1,6.9,5.6,7.3C5.2,7.6,4.7,8,4.4,8.4C4.3,8.6,4.2,8.8,4.2,8.9C4.1,9.1,4,9.3,3.9,9.4C3.9,9.6,3.8,9.7,3.8,9.9c0,0.2-0.1,0.3-0.1,0.5v-0.1c-0.1,0.8,0.1,1.6,0.5,2.4c0.4,0.7,1,1.3,1.7,1.7c0.3,0.2,0.6,0.3,0.9,0.3c0.3,0.1,0.7,0.1,1,0.1c0.3,0,0.7,0,1-0.1c0.3-0.1,0.6-0.2,0.9-0.3c0.5-0.3,0.9-0.6,1.3-1c0.3-0.4,0.6-0.8,0.8-1.3c0.1-0.4,0.2-0.9,0.2-1.4c0-0.5-0.1-1-0.3-1.4C11.5,8.6,11.1,8,10.5,7.5z M10.1,11.3H8.5v1.6H8H7.9H7.3v0v-0.1v-1.4H5.7v-0.4v-0.2v-0.6h0h1.5V8.5h1.2v1.6h1.6V11.3z\"/></g></svg>',\n INSERT_ROW_ABOVE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.8 15.8\"><g><path d=\"M0.1,14.5c0.1,0.1,0.1,0.2,0.2,0.2l0.1,0.1h14.9l0.1-0.1c0,0,0.1-0.1,0.1-0.1c0,0,0.1-0.1,0.1-0.1l0.1-0.1V6.7l-0.1-0.1c0-0.1-0.1-0.1-0.2-0.2l-0.1-0.1h-2.3v0.1l-0.1,0.5l-0.2,0.4l-0.1,0.2c0.1,0,0.2,0,0.3,0h1.6v6H1.3v-6h1.6c0.1,0,0.2,0,0.3,0L3.1,7.3L2.9,6.9C2.8,6.8,2.8,6.6,2.7,6.5V6.3H0.4L0.3,6.4c-0.1,0-0.1,0.1-0.2,0.2L0,6.7v7.7L0.1,14.5z\"/><path d=\"M5.3,8.3c0.6,0.5,1.2,0.8,1.9,0.9c0.2,0,0.5,0.1,0.7,0c0.2,0,0.5,0,0.7,0c0.6-0.1,1.1-0.3,1.6-0.6c0.5-0.3,0.9-0.7,1.2-1.2c0.1-0.2,0.2-0.3,0.3-0.5c0.1-0.2,0.2-0.4,0.2-0.5c0.1-0.1,0.1-0.3,0.1-0.4C12,5.8,12,5.6,12,5.4v0.1c0.1-0.8-0.1-1.6-0.5-2.4c-0.4-0.7-1-1.3-1.7-1.7C9.5,1.3,9.2,1.2,8.9,1.1C8.5,1,8.2,1,7.9,1c-0.3,0-0.7,0-1,0.1C6.6,1.2,6.3,1.3,6,1.4C5.5,1.7,5.1,2,4.7,2.4C4.4,2.8,4.1,3.3,3.9,3.8C3.8,4.2,3.7,4.7,3.7,5.2c0,0.5,0.1,1,0.3,1.4C4.3,7.2,4.7,7.8,5.3,8.3z M5.7,4.5h1.6V2.9h0.5h0.1h0.6v0v0.1v1.4H10v0.4v0.2v0.6h0H8.5v1.6H7.3V5.7H5.7V4.5z\"/></g></svg>',\n INSERT_COLUMN_LEFT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.8 15.8\"><g><path d=\"M14.5,15.7c0.1-0.1,0.2-0.1,0.2-0.2l0.1-0.1V0.4l-0.1-0.1c0,0-0.1-0.1-0.1-0.1c0,0-0.1-0.1-0.1-0.1L14.4,0H6.7L6.6,0.1c-0.1,0-0.1,0.1-0.2,0.2L6.3,0.4v2.3h0.1l0.5,0.1L7.3,3l0.2,0.1c0-0.1,0-0.2,0-0.3V1.2h6v13.3h-6v-1.6c0-0.1,0-0.2,0-0.3l-0.2,0.1l-0.4,0.2C6.7,12.9,6.6,13,6.4,13H6.3v2.3l0.1,0.2c0,0.1,0.1,0.1,0.2,0.2l0.1,0.1h7.7L14.5,15.7z\"/><path d=\"M8.3,10.5C8.7,10,9,9.3,9.1,8.6c0-0.2,0.1-0.5,0-0.7c0-0.2,0-0.5,0-0.7C9,6.7,8.8,6.1,8.5,5.7C8.2,5.2,7.8,4.8,7.3,4.5C7.2,4.4,7,4.3,6.9,4.2C6.7,4.1,6.5,4,6.4,4C6.2,3.9,6.1,3.9,5.9,3.8c-0.2,0-0.3-0.1-0.5-0.1h0.1C4.7,3.7,3.8,3.9,3.1,4.3C2.4,4.7,1.8,5.3,1.4,6C1.3,6.3,1.2,6.6,1.1,6.9C1,7.2,1,7.6,1,7.9c0,0.3,0,0.7,0.1,1c0.1,0.3,0.2,0.6,0.3,0.9c0.3,0.5,0.6,0.9,1,1.3c0.4,0.3,0.8,0.6,1.3,0.8C4.2,12,4.7,12.1,5.1,12c0.5,0,1-0.1,1.4-0.3C7.2,11.5,7.8,11.1,8.3,10.5zM4.5,10.1V8.5H2.9V8V7.9V7.3h0H3h1.4V5.7h0.4h0.2h0.6v0v1.5h1.6v1.2H5.7v1.6H4.5z\"/></g></svg>',\n INSERT_COLUMN_RIGHT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.8 15.8\"><g><path d=\"M1.3,0.1C1.2,0.2,1.1,0.2,1.1,0.3L1,0.4v14.9l0.1,0.1c0,0,0.1,0.1,0.1,0.1c0,0,0.1,0.1,0.1,0.1l0.1,0.1h7.7l0.1-0.1c0.1,0,0.1-0.1,0.2-0.2l0.1-0.1v-2.3H9.3l-0.5-0.1l-0.4-0.2l-0.2-0.1c0,0.1,0,0.2,0,0.3v1.6h-6V1.3h6v1.6c0,0.1,0,0.2,0,0.3l0.2-0.1l0.4-0.2C9,2.9,9.2,2.8,9.3,2.8h0.1V0.5L9.4,0.3c0-0.1-0.1-0.1-0.2-0.2L9.1,0H1.4L1.3,0.1z\"/><path d=\"M7.5,5.3C7,5.8,6.7,6.5,6.6,7.2c0,0.2-0.1,0.5,0,0.7c0,0.2,0,0.5,0,0.7c0.1,0.6,0.3,1.1,0.6,1.6c0.3,0.5,0.7,0.9,1.2,1.2c0.2,0.1,0.3,0.2,0.5,0.3c0.2,0.1,0.4,0.2,0.5,0.2c0.1,0.1,0.3,0.1,0.4,0.1c0.2,0,0.3,0.1,0.5,0.1h-0.1c0.8,0.1,1.6-0.1,2.4-0.5c0.7-0.4,1.3-1,1.7-1.7c0.2-0.3,0.3-0.6,0.3-0.9c0.1-0.3,0.1-0.7,0.1-1c0-0.3,0-0.7-0.1-1c-0.1-0.3-0.2-0.6-0.3-0.9c-0.3-0.5-0.6-0.9-1-1.3C13,4.4,12.5,4.2,12,4c-0.4-0.1-0.9-0.2-1.4-0.2c-0.5,0-1,0.1-1.4,0.2C8.5,4.3,7.9,4.7,7.5,5.3z M11.3,5.7v1.6h1.6v0.5v0.1v0.6h0h-0.1h-1.4v1.6h-0.4h-0.2h-0.6v0V8.5H8.5V7.3h1.6V5.7H11.3z\"/></g></svg>',\n DELETE_ROW: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 15.75 13.83\"><g><path d=\"M4.7,18.46l.12.08H19.73l.12-.08a.58.58,0,0,0,.22-.22l.08-.12,0-7.69-.08-.11a.77.77,0,0,0-.18-.18l-.11-.08-2.31,0-.08.28-.1.29a1.58,1.58,0,0,1-.12.29l-.14.34s0,0,.18,0H18.9v6H5.64v-6H7.35c.14,0,.2,0,.18,0l-.14-.34a2.85,2.85,0,0,1-.12-.29l-.1-.29-.07-.27-2.31,0-.11.08a.77.77,0,0,0-.18.18l-.08.11,0,7.69.08.12a.47.47,0,0,0,.09.12l.13.09ZM12.11,13a4,4,0,0,0,1.46-.21,4.51,4.51,0,0,0,1.31-.71A4,4,0,0,0,16.26,10a4.32,4.32,0,0,0-.08-2.54,4.34,4.34,0,0,0-1-1.52,4.15,4.15,0,0,0-1.54-1,4.34,4.34,0,0,0-1.35-.22A4.07,4.07,0,0,0,11,4.93,3.94,3.94,0,0,0,9.24,6.07,3.92,3.92,0,0,0,8.15,8.88a3.91,3.91,0,0,0,.12.95A4.16,4.16,0,0,0,12.11,13Zm2.35-4.14v.58H10.09V8.27h4.37v.58Z\" transform=\"translate(-4.4 -4.71)\"/></g></svg>',\n DELETE_COLUMN: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 13.81 15.74\"><g><path d=\"M5.66,19.42l.12.08,7.69,0,.11-.08a.77.77,0,0,0,.18-.18l.08-.11,0-2.32-.15,0-.45-.15-.42-.18-.17-.07a1,1,0,0,0,0,.27v1.63h-6V5h6V6.62a.9.9,0,0,0,0,.26l.17-.07.42-.17a3.91,3.91,0,0,1,.45-.15l.15,0,0-2.32L13.75,4a.77.77,0,0,0-.18-.18l-.11-.08H5.79l-.13.07a.63.63,0,0,0-.21.22l-.08.12V19.08l.08.12a.47.47,0,0,0,.09.12.35.35,0,0,0,.12.1Zm9-3.67a4.16,4.16,0,0,0,2.36-.51,4.08,4.08,0,0,0,1.67-1.72,4,4,0,0,0,.35-.91,3.79,3.79,0,0,0,.1-1,4.71,4.71,0,0,0-.11-1,5,5,0,0,0-.3-.87,4.25,4.25,0,0,0-1-1.25,4.49,4.49,0,0,0-1.34-.81A4.26,4.26,0,0,0,15,7.48a3.88,3.88,0,0,0-1.41.25A4.32,4.32,0,0,0,11.86,9,4,4,0,0,0,11,10.94a4.4,4.4,0,0,0-.05.68,4.5,4.5,0,0,0,.05.68,3.93,3.93,0,0,0,.61,1.57,4.22,4.22,0,0,0,1.18,1.2,4.59,4.59,0,0,0,.48.27c.2.1.37.17.5.22a2.44,2.44,0,0,0,.45.12,4.61,4.61,0,0,0,.5.07Zm2.54-4.12v.58H12.87V11h4.37v.59Z\" transform=\"translate(-5.37 -3.76)\"/></g></svg>',\n MERGE_CELLS_HORIZONTAL: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM11 5H5V10.999H7V9L10 12L7 15V13H5V19H11V17H13V19H19V13H17V15L14 12L17 9V10.999H19V5H13V7H11V5ZM13 13V15H11V13H13ZM13 9V11H11V9H13Z\"></path></svg>',\n MERGE_CELLS_VERTICAL: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M21 20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20C20.5523 3 21 3.44772 21 4V20ZM19 11V5H13.001V7H15L12 10L9 7H11V5H5V11H7V13H5V19H11V17H9L12 14L15 17H13.001V19H19V13H17V11H19ZM11 13H9V11H11V13ZM15 13H13V11H15V13Z\"></path></svg>',\n SPLIT_CELLS_HORIZONTAL: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM11 5H5V19H11V15H13V19H19V5H13V9H11V5ZM15 9L18 12L15 15V13H9V15L6 12L9 9V11H15V9Z\"></path></svg>',\n SPLIT_CELLS_VERTICAL: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 3C20.5523 3 21 3.44772 21 4V20C21 20.5523 20.5523 21 20 21H4C3.44772 21 3 20.5523 3 20V4C3 3.44772 3.44772 3 4 3H20ZM19 5H5V10.999L9 11V13H5V19H19V13H15V11L19 10.999V5ZM12 6L15 9H13V15H15L12 18L9 15H11V9H9L12 6Z\"></path></svg>',\n CELL_WIDTH: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M4 12H20M4 12L8 8M4 12L8 16M20 12L16 8M20 12L16 16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n CELL_HEIGHT: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 4V20M12 4L8 8M12 4L16 8M12 20L8 16M12 20L16 16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n CELL_PADDING: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M7 7H17V17H7V7Z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-dasharray=\"2 2\"/></svg>',\n CELL_BORDER_BOTTOM: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M13,19 L19.5,19 C19.7761424,19 20,19.2238576 20,19.5 C20,19.7761424 19.7761424,20 19.5,20 L5.5,20 C5.22385763,20 5,19.7761424 5,19.5 C5,19.2238576 5.22385763,19 5.5,19 L12,19 L12,18.5 C12,18.2238576 12.2238576,18 12.5,18 C12.7761424,18 13,18.2238576 13,18.5 L13,19 Z M13,12 L13.5,12 C13.7761424,12 14,12.2238576 14,12.5 C14,12.7761424 13.7761424,13 13.5,13 L13,13 L13,13.5 C13,13.7761424 12.7761424,14 12.5,14 C12.2238576,14 12,13.7761424 12,13.5 L12,13 L11.5,13 C11.2238576,13 11,12.7761424 11,12.5 C11,12.2238576 11.2238576,12 11.5,12 L12,12 L12,11.5 C12,11.2238576 12.2238576,11 12.5,11 C12.7761424,11 13,11.2238576 13,11.5 L13,12 Z M15.5,13 C15.2238576,13 15,12.7761424 15,12.5 C15,12.2238576 15.2238576,12 15.5,12 L16.5,12 C16.7761424,12 17,12.2238576 17,12.5 C17,12.7761424 16.7761424,13 16.5,13 L15.5,13 Z M18.5,13 C18.2238576,13 18,12.7761424 18,12.5 C18,12.2238576 18.2238576,12 18.5,12 L19.5,12 C19.7761424,12 20,12.2238576 20,12.5 C20,12.7761424 19.7761424,13 19.5,13 L18.5,13 Z M5.5,13 C5.22385763,13 5,12.7761424 5,12.5 C5,12.2238576 5.22385763,12 5.5,12 L6.5,12 C6.77614237,12 7,12.2238576 7,12.5 C7,12.7761424 6.77614237,13 6.5,13 L5.5,13 Z M8.5,13 C8.22385763,13 8,12.7761424 8,12.5 C8,12.2238576 8.22385763,12 8.5,12 L9.5,12 C9.77614237,12 10,12.2238576 10,12.5 C10,12.7761424 9.77614237,13 9.5,13 L8.5,13 Z M12,5.5 C12,5.22385763 12.2238576,5 12.5,5 C12.7761424,5 13,5.22385763 13,5.5 L13,6.5 C13,6.77614237 12.7761424,7 12.5,7 C12.2238576,7 12,6.77614237 12,6.5 L12,5.5 Z M12,8.5 C12,8.22385763 12.2238576,8 12.5,8 C12.7761424,8 13,8.22385763 13,8.5 L13,9.5 C13,9.77614237 12.7761424,10 12.5,10 C12.2238576,10 12,9.77614237 12,9.5 L12,8.5 Z M12,15.5 C12,15.2238576 12.2238576,15 12.5,15 C12.7761424,15 13,15.2238576 13,15.5 L13,16.5 C13,16.7761424 12.7761424,17 12.5,17 C12.2238576,17 12,16.7761424 12,16.5 L12,15.5 Z M5.5,3 C5.77614237,3 6,3.22385763 6,3.5 C6,3.77614237 5.77614237,4 5.5,4 C4.67157288,4 4,4.67157288 4,5.5 C4,5.77614237 3.77614237,6 3.5,6 C3.22385763,6 3,5.77614237 3,5.5 C3,4.11928813 4.11928813,3 5.5,3 Z M16.5,4 C16.2238576,4 16,3.77614237 16,3.5 C16,3.22385763 16.2238576,3 16.5,3 L17.5,3 C17.7761424,3 18,3.22385763 18,3.5 C18,3.77614237 17.7761424,4 17.5,4 L16.5,4 Z M13.5,4 C13.2238576,4 13,3.77614237 13,3.5 C13,3.22385763 13.2238576,3 13.5,3 L14.5,3 C14.7761424,3 15,3.22385763 15,3.5 C15,3.77614237 14.7761424,4 14.5,4 L13.5,4 Z M10.5,4 C10.2238576,4 10,3.77614237 10,3.5 C10,3.22385763 10.2238576,3 10.5,3 L11.5,3 C11.7761424,3 12,3.22385763 12,3.5 C12,3.77614237 11.7761424,4 11.5,4 L10.5,4 Z M7.5,4 C7.22385763,4 7,3.77614237 7,3.5 C7,3.22385763 7.22385763,3 7.5,3 L8.5,3 C8.77614237,3 9,3.22385763 9,3.5 C9,3.77614237 8.77614237,4 8.5,4 L7.5,4 Z M19.5,4 C19.2238576,4 19,3.77614237 19,3.5 C19,3.22385763 19.2238576,3 19.5,3 C20.8807119,3 22,4.11928813 22,5.5 L22,5.56155281 C22,5.83769519 21.7761424,6.06155281 21.5,6.06155281 C21.2238576,6.06155281 21,5.83769519 21,5.56155281 L21,5.5 C21,4.67157288 20.3284271,4 19.5,4 Z M21,7.5 C21,7.22385763 21.2238576,7 21.5,7 C21.7761424,7 22,7.22385763 22,7.5 L22,8.5 C22,8.77614237 21.7761424,9 21.5,9 C21.2238576,9 21,8.77614237 21,8.5 L21,7.5 Z M21,10.5 C21,10.2238576 21.2238576,10 21.5,10 C21.7761424,10 22,10.2238576 22,10.5 L22,11.5 C22,11.7761424 21.7761424,12 21.5,12 C21.2238576,12 21,11.7761424 21,11.5 L21,10.5 Z M21,13.5 C21,13.2238576 21.2238576,13 21.5,13 C21.7761424,13 22,13.2238576 22,13.5 L22,14.5 C22,14.7761424 21.7761424,15 21.5,15 C21.2238576,15 21,14.7761424 21,14.5 L21,13.5 Z M21,16.5 C21,16.2238576 21.2238576,16 21.5,16 C21.7761424,16 22,16.2238576 22,16.5 L22,17.5 C22,17.7761424 21.7761424,18 21.5,18 C21.2238576,18 21,17.7761424 21,17.5 L21,16.5 Z M3,7.5 C3,7.22385763 3.22385763,7 3.5,7 C3.77614237,7 4,7.22385763 4,7.5 L4,8.5 C4,8.77614237 3.77614237,9 3.5,9 C3.22385763,9 3,8.77614237 3,8.5 L3,7.5 Z M3,10.5 C3,10.2238576 3.22385763,10 3.5,10 C3.77614237,10 4,10.2238576 4,10.5 L4,11.5 C4,11.7761424 3.77614237,12 3.5,12 C3.22385763,12 3,11.7761424 3,11.5 L3,10.5 Z M3,13.5 C3,13.2238576 3.22385763,13 3.5,13 C3.77614237,13 4,13.2238576 4,13.5 L4,14.5 C4,14.7761424 3.77614237,15 3.5,15 C3.22385763,15 3,14.7761424 3,14.5 L3,13.5 Z M3,16.5 C3,16.2238576 3.22385763,16 3.5,16 C3.77614237,16 4,16.2238576 4,16.5 L4,17.5 C4,17.7761424 3.77614237,18 3.5,18 C3.22385763,18 3,17.7761424 3,17.5 L3,16.5 Z M21,19.5 C21,19.2238576 21.2238576,19 21.5,19 C21.7761424,19 22,19.2238576 22,19.5 C22,20.8807119 20.8807119,22 19.5,22 L5.5,22 C4.11928813,22 3,20.8807119 3,19.5 C3,19.2238576 3.22385763,19 3.5,19 C3.77614237,19 4,19.2238576 4,19.5 C4,20.3284271 4.67157288,21 5.5,21 L19.5,21 C20.3284271,21 21,20.3284271 21,19.5 Z\"/></svg>',\n CELL_BORDER_LEFT: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M13,13 L13,13.5 C13,13.7761424 12.7761424,14 12.5,14 C12.2238576,14 12,13.7761424 12,13.5 L12,13 L11.5,13 C11.2238576,13 11,12.7761424 11,12.5 C11,12.2238576 11.2238576,12 11.5,12 L12,12 L12,11.5 C12,11.2238576 12.2238576,11 12.5,11 C12.7761424,11 13,11.2238576 13,11.5 L13,12 L13.5,12 C13.7761424,12 14,12.2238576 14,12.5 C14,12.7761424 13.7761424,13 13.5,13 L13,13 L13,13 Z M6,12 L6.5,12 C6.77614237,12 7,12.2238576 7,12.5 C7,12.7761424 6.77614237,13 6.5,13 L6,13 L6,19.5 C6,19.7761424 5.77614237,20 5.5,20 C5.22385763,20 5,19.7761424 5,19.5 L5,5.5 C5,5.22385763 5.22385763,5 5.5,5 C5.77614237,5 6,5.22385763 6,5.5 L6,12 Z M22,5.5 C22,5.77614237 21.7761424,6 21.5,6 C21.2238576,6 21,5.77614237 21,5.5 C21,4.67157288 20.3284271,4 19.5,4 C19.2238576,4 19,3.77614237 19,3.5 C19,3.22385763 19.2238576,3 19.5,3 C20.8807119,3 22,4.11928813 22,5.5 Z M21,19.5 C21,19.2238576 21.2238576,19 21.5,19 C21.7761424,19 22,19.2238576 22,19.5 C22,20.8807119 20.8807119,22 19.5,22 L19.4384472,22 C19.1623048,22 18.9384472,21.7761424 18.9384472,21.5 C18.9384472,21.2238576 19.1623048,21 19.4384472,21 L19.5,21 C20.3284271,21 21,20.3284271 21,19.5 Z M5.5,21 C5.77614237,21 6,21.2238576 6,21.5 C6,21.7761424 5.77614237,22 5.5,22 C4.11928813,22 3,20.8807119 3,19.5 L3,5.5 C3,4.11928813 4.11928813,3 5.5,3 C5.77614237,3 6,3.22385763 6,3.5 C6,3.77614237 5.77614237,4 5.5,4 C4.67157288,4 4,4.67157288 4,5.5 L4,19.5 C4,20.3284271 4.67157288,21 5.5,21 Z M7.5,22 C7.22385763,22 7,21.7761424 7,21.5 C7,21.2238576 7.22385763,21 7.5,21 L8.5,21 C8.77614237,21 9,21.2238576 9,21.5 C9,21.7761424 8.77614237,22 8.5,22 L7.5,22 Z M10.5,22 C10.2238576,22 10,21.7761424 10,21.5 C10,21.2238576 10.2238576,21 10.5,21 L11.5,21 C11.7761424,21 12,21.2238576 12,21.5 C12,21.7761424 11.7761424,22 11.5,22 L10.5,22 Z M13.5,22 C13.2238576,22 13,21.7761424 13,21.5 C13,21.2238576 13.2238576,21 13.5,21 L14.5,21 C14.7761424,21 15,21.2238576 15,21.5 C15,21.7761424 14.7761424,22 14.5,22 L13.5,22 Z M16.5,22 C16.2238576,22 16,21.7761424 16,21.5 C16,21.2238576 16.2238576,21 16.5,21 L17.5,21 C17.7761424,21 18,21.2238576 18,21.5 C18,21.7761424 17.7761424,22 17.5,22 L16.5,22 Z M7.5,4 C7.22385763,4 7,3.77614237 7,3.5 C7,3.22385763 7.22385763,3 7.5,3 L8.5,3 C8.77614237,3 9,3.22385763 9,3.5 C9,3.77614237 8.77614237,4 8.5,4 L7.5,4 Z M10.5,4 C10.2238576,4 10,3.77614237 10,3.5 C10,3.22385763 10.2238576,3 10.5,3 L11.5,3 C11.7761424,3 12,3.22385763 12,3.5 C12,3.77614237 11.7761424,4 11.5,4 L10.5,4 Z M13.5,4 C13.2238576,4 13,3.77614237 13,3.5 C13,3.22385763 13.2238576,3 13.5,3 L14.5,3 C14.7761424,3 15,3.22385763 15,3.5 C15,3.77614237 14.7761424,4 14.5,4 L13.5,4 Z M16.5,4 C16.2238576,4 16,3.77614237 16,3.5 C16,3.22385763 16.2238576,3 16.5,3 L17.5,3 C17.7761424,3 18,3.22385763 18,3.5 C18,3.77614237 17.7761424,4 17.5,4 L16.5,4 Z M12,5.5 C12,5.22385763 12.2238576,5 12.5,5 C12.7761424,5 13,5.22385763 13,5.5 L13,6.5 C13,6.77614237 12.7761424,7 12.5,7 C12.2238576,7 12,6.77614237 12,6.5 L12,5.5 Z M21,7.5 C21,7.22385763 21.2238576,7 21.5,7 C21.7761424,7 22,7.22385763 22,7.5 L22,8.5 C22,8.77614237 21.7761424,9 21.5,9 C21.2238576,9 21,8.77614237 21,8.5 L21,7.5 Z M21,10.5 C21,10.2238576 21.2238576,10 21.5,10 C21.7761424,10 22,10.2238576 22,10.5 L22,11.5 C22,11.7761424 21.7761424,12 21.5,12 C21.2238576,12 21,11.7761424 21,11.5 L21,10.5 Z M21,13.5 C21,13.2238576 21.2238576,13 21.5,13 C21.7761424,13 22,13.2238576 22,13.5 L22,14.5 C22,14.7761424 21.7761424,15 21.5,15 C21.2238576,15 21,14.7761424 21,14.5 L21,13.5 Z M21,16.5 C21,16.2238576 21.2238576,16 21.5,16 C21.7761424,16 22,16.2238576 22,16.5 L22,17.5 C22,17.7761424 21.7761424,18 21.5,18 C21.2238576,18 21,17.7761424 21,17.5 L21,16.5 Z M12,8.5 C12,8.22385763 12.2238576,8 12.5,8 C12.7761424,8 13,8.22385763 13,8.5 L13,9.5 C13,9.77614237 12.7761424,10 12.5,10 C12.2238576,10 12,9.77614237 12,9.5 L12,8.5 Z M12,15.5 C12,15.2238576 12.2238576,15 12.5,15 C12.7761424,15 13,15.2238576 13,15.5 L13,16.5 C13,16.7761424 12.7761424,17 12.5,17 C12.2238576,17 12,16.7761424 12,16.5 L12,15.5 Z M12,18.5 C12,18.2238576 12.2238576,18 12.5,18 C12.7761424,18 13,18.2238576 13,18.5 L13,19.5 C13,19.7761424 12.7761424,20 12.5,20 C12.2238576,20 12,19.7761424 12,19.5 L12,18.5 Z M8.5,13 C8.22385763,13 8,12.7761424 8,12.5 C8,12.2238576 8.22385763,12 8.5,12 L9.5,12 C9.77614237,12 10,12.2238576 10,12.5 C10,12.7761424 9.77614237,13 9.5,13 L8.5,13 Z M15.5,13 C15.2238576,13 15,12.7761424 15,12.5 C15,12.2238576 15.2238576,12 15.5,12 L16.5,12 C16.7761424,12 17,12.2238576 17,12.5 C17,12.7761424 16.7761424,13 16.5,13 L15.5,13 Z M18.5,13 C18.2238576,13 18,12.7761424 18,12.5 C18,12.2238576 18.2238576,12 18.5,12 L19.5,12 C19.7761424,12 20,12.2238576 20,12.5 C20,12.7761424 19.7761424,13 19.5,13 L18.5,13 Z\"/></svg>',\n CELL_BORDER_FULL: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M13,12 L13.5,12 C13.7761424,12 14,12.2238576 14,12.5 C14,12.7761424 13.7761424,13 13.5,13 L13,13 L13,13.5 C13,13.7761424 12.7761424,14 12.5,14 C12.2238576,14 12,13.7761424 12,13.5 L12,13 L11.5,13 C11.2238576,13 11,12.7761424 11,12.5 C11,12.2238576 11.2238576,12 11.5,12 L12,12 L12,11.5 C12,11.2238576 12.2238576,11 12.5,11 C12.7761424,11 13,11.2238576 13,11.5 L13,12 Z M3,5.5 C3,4.11928813 4.11928813,3 5.5,3 L19.5000013,3 C20.8807132,3 22.0000013,4.11928813 22.0000013,5.5 L22.0000013,19.5069431 C22.0000013,20.887655 20.8807132,22.0069431 19.5000013,22.0069431 L5.5,22.0069431 C4.11928813,22.0069431 3,20.887655 3,19.5069431 L3,5.5 Z M4,5.5 L4,19.5069431 C4,20.3353702 4.67157288,21.0069431 5.5,21.0069431 L19.5000013,21.0069431 C20.3284285,21.0069431 21.0000013,20.3353702 21.0000013,19.5069431 L21.0000013,5.5 C21.0000013,4.67157288 20.3284285,4 19.5000013,4 L5.5,4 C4.67157288,4 4,4.67157288 4,5.5 Z M15.5,13 C15.2238576,13 15,12.7761424 15,12.5 C15,12.2238576 15.2238576,12 15.5,12 L16.5,12 C16.7761424,12 17,12.2238576 17,12.5 C17,12.7761424 16.7761424,13 16.5,13 L15.5,13 Z M18.5,13 C18.2238576,13 18,12.7761424 18,12.5 C18,12.2238576 18.2238576,12 18.5,12 L19.5,12 C19.7761424,12 20,12.2238576 20,12.5 C20,12.7761424 19.7761424,13 19.5,13 L18.5,13 Z M5.5,13 C5.22385763,13 5,12.7761424 5,12.5 C5,12.2238576 5.22385763,12 5.5,12 L6.5,12 C6.77614237,12 7,12.2238576 7,12.5 C7,12.7761424 6.77614237,13 6.5,13 L5.5,13 Z M8.5,13 C8.22385763,13 8,12.7761424 8,12.5 C8,12.2238576 8.22385763,12 8.5,12 L9.5,12 C9.77614237,12 10,12.2238576 10,12.5 C10,12.7761424 9.77614237,13 9.5,13 L8.5,13 Z M12,5.5 C12,5.22385763 12.2238576,5 12.5,5 C12.7761424,5 13,5.22385763 13,5.5 L13,6.5 C13,6.77614237 12.7761424,7 12.5,7 C12.2238576,7 12,6.77614237 12,6.5 L12,5.5 Z M12,8.5 C12,8.22385763 12.2238576,8 12.5,8 C12.7761424,8 13,8.22385763 13,8.5 L13,9.5 C13,9.77614237 12.7761424,10 12.5,10 C12.2238576,10 12,9.77614237 12,9.5 L12,8.5 Z M12,18.5 C12,18.2238576 12.2238576,18 12.5,18 C12.7761424,18 13,18.2238576 13,18.5 L13,19.5 C13,19.7761424 12.7761424,20 12.5,20 C12.2238576,20 12,19.7761424 12,19.5 L12,18.5 Z M12,15.5 C12,15.2238576 12.2238576,15 12.5,15 C12.7761424,15 13,15.2238576 13,15.5 L13,16.5 C13,16.7761424 12.7761424,17 12.5,17 C12.2238576,17 12,16.7761424 12,16.5 L12,15.5 Z\"/></svg>',\n CELL_BORDER_RIGHT: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M19,13 L18.5,13 C18.2238576,13 18,12.7761424 18,12.5 C18,12.2238576 18.2238576,12 18.5,12 L19,12 L19,5.5 C19,5.22385763 19.2238576,5 19.5,5 C19.7761424,5 20,5.22385763 20,5.5 L20,19.5 C20,19.7761424 19.7761424,20 19.5,20 C19.2238576,20 19,19.7761424 19,19.5 L19,13 Z M13,12 L13.5,12 C13.7761424,12 14,12.2238576 14,12.5 C14,12.7761424 13.7761424,13 13.5,13 L13,13 L13,13.5 C13,13.7761424 12.7761424,14 12.5,14 C12.2238576,14 12,13.7761424 12,13.5 L12,13 L11.5,13 C11.2238576,13 11,12.7761424 11,12.5 C11,12.2238576 11.2238576,12 11.5,12 L12,12 L12,11.5 C12,11.2238576 12.2238576,11 12.5,11 C12.7761424,11 13,11.2238576 13,11.5 L13,12 Z M3,19.5 C3,19.2238576 3.22385763,19 3.5,19 C3.77614237,19 4,19.2238576 4,19.5 C4,20.3284271 4.67157288,21 5.5,21 C5.77614237,21 6,21.2238576 6,21.5 C6,21.7761424 5.77614237,22 5.5,22 C4.11928813,22 3,20.8807119 3,19.5 Z M4,5.5 C4,5.77614237 3.77614237,6 3.5,6 C3.22385763,6 3,5.77614237 3,5.5 C3,4.11928813 4.11928813,3 5.5,3 L5.56155281,3 C5.83769519,3 6.06155281,3.22385763 6.06155281,3.5 C6.06155281,3.77614237 5.83769519,4 5.56155281,4 L5.5,4 C4.67157288,4 4,4.67157288 4,5.5 Z M19.5,4 C19.2238576,4 19,3.77614237 19,3.5 C19,3.22385763 19.2238576,3 19.5,3 C20.8807119,3 22,4.11928813 22,5.5 L22,19.5 C22,20.8807119 20.8807119,22 19.5,22 C19.2238576,22 19,21.7761424 19,21.5 C19,21.2238576 19.2238576,21 19.5,21 C20.3284271,21 21,20.3284271 21,19.5 L21,5.5 C21,4.67157288 20.3284271,4 19.5,4 Z M17.5,21 C17.7761424,21 18,21.2238576 18,21.5 C18,21.7761424 17.7761424,22 17.5,22 L16.5,22 C16.2238576,22 16,21.7761424 16,21.5 C16,21.2238576 16.2238576,21 16.5,21 L17.5,21 Z M14.5,21 C14.7761424,21 15,21.2238576 15,21.5 C15,21.7761424 14.7761424,22 14.5,22 L13.5,22 C13.2238576,22 13,21.7761424 13,21.5 C13,21.2238576 13.2238576,21 13.5,21 L14.5,21 Z M11.5,21 C11.7761424,21 12,21.2238576 12,21.5 C12,21.7761424 11.7761424,22 11.5,22 L10.5,22 C10.2238576,22 10,21.7761424 10,21.5 C10,21.2238576 10.2238576,21 10.5,21 L11.5,21 Z M8.5,21 C8.77614237,21 9,21.2238576 9,21.5 C9,21.7761424 8.77614237,22 8.5,22 L7.5,22 C7.22385763,22 7,21.7761424 7,21.5 C7,21.2238576 7.22385763,21 7.5,21 L8.5,21 Z M17.5,3 C17.7761424,3 18,3.22385763 18,3.5 C18,3.77614237 17.7761424,4 17.5,4 L16.5,4 C16.2238576,4 16,3.77614237 16,3.5 C16,3.22385763 16.2238576,3 16.5,3 L17.5,3 Z M14.5,3 C14.7761424,3 15,3.22385763 15,3.5 C15,3.77614237 14.7761424,4 14.5,4 L13.5,4 C13.2238576,4 13,3.77614237 13,3.5 C13,3.22385763 13.2238576,3 13.5,3 L14.5,3 Z M11.5,3 C11.7761424,3 12,3.22385763 12,3.5 C12,3.77614237 11.7761424,4 11.5,4 L10.5,4 C10.2238576,4 10,3.77614237 10,3.5 C10,3.22385763 10.2238576,3 10.5,3 L11.5,3 Z M8.5,3 C8.77614237,3 9,3.22385763 9,3.5 C9,3.77614237 8.77614237,4 8.5,4 L7.5,4 C7.22385763,4 7,3.77614237 7,3.5 C7,3.22385763 7.22385763,3 7.5,3 L8.5,3 Z M12,5.5 C12,5.22385763 12.2238576,5 12.5,5 C12.7761424,5 13,5.22385763 13,5.5 L13,6.5 C13,6.77614237 12.7761424,7 12.5,7 C12.2238576,7 12,6.77614237 12,6.5 L12,5.5 Z M12,8.5 C12,8.22385763 12.2238576,8 12.5,8 C12.7761424,8 13,8.22385763 13,8.5 L13,9.5 C13,9.77614237 12.7761424,10 12.5,10 C12.2238576,10 12,9.77614237 12,9.5 L12,8.5 Z M3,7.5 C3,7.22385763 3.22385763,7 3.5,7 C3.77614237,7 4,7.22385763 4,7.5 L4,8.5 C4,8.77614237 3.77614237,9 3.5,9 C3.22385763,9 3,8.77614237 3,8.5 L3,7.5 Z M3,10.5 C3,10.2238576 3.22385763,10 3.5,10 C3.77614237,10 4,10.2238576 4,10.5 L4,11.5 C4,11.7761424 3.77614237,12 3.5,12 C3.22385763,12 3,11.7761424 3,11.5 L3,10.5 Z M3,13.5 C3,13.2238576 3.22385763,13 3.5,13 C3.77614237,13 4,13.2238576 4,13.5 L4,14.5 C4,14.7761424 3.77614237,15 3.5,15 C3.22385763,15 3,14.7761424 3,14.5 L3,13.5 Z M3,16.5 C3,16.2238576 3.22385763,16 3.5,16 C3.77614237,16 4,16.2238576 4,16.5 L4,17.5 C4,17.7761424 3.77614237,18 3.5,18 C3.22385763,18 3,17.7761424 3,17.5 L3,16.5 Z M12,15.5 C12,15.2238576 12.2238576,15 12.5,15 C12.7761424,15 13,15.2238576 13,15.5 L13,16.5 C13,16.7761424 12.7761424,17 12.5,17 C12.2238576,17 12,16.7761424 12,16.5 L12,15.5 Z M12,18.5 C12,18.2238576 12.2238576,18 12.5,18 C12.7761424,18 13,18.2238576 13,18.5 L13,19.5 C13,19.7761424 12.7761424,20 12.5,20 C12.2238576,20 12,19.7761424 12,19.5 L12,18.5 Z M15.5,13 C15.2238576,13 15,12.7761424 15,12.5 C15,12.2238576 15.2238576,12 15.5,12 L16.5,12 C16.7761424,12 17,12.2238576 17,12.5 C17,12.7761424 16.7761424,13 16.5,13 L15.5,13 Z M8.5,13 C8.22385763,13 8,12.7761424 8,12.5 C8,12.2238576 8.22385763,12 8.5,12 L9.5,12 C9.77614237,12 10,12.2238576 10,12.5 C10,12.7761424 9.77614237,13 9.5,13 L8.5,13 Z M5.5,13 C5.22385763,13 5,12.7761424 5,12.5 C5,12.2238576 5.22385763,12 5.5,12 L6.5,12 C6.77614237,12 7,12.2238576 7,12.5 C7,12.7761424 6.77614237,13 6.5,13 L5.5,13 Z\"/></svg>',\n CELL_BORDER_TOP: '<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M13,12 L13.5,12 C13.7761424,12 14,12.2238576 14,12.5 C14,12.7761424 13.7761424,13 13.5,13 L13,13 L13,13.5 C13,13.7761424 12.7761424,14 12.5,14 C12.2238576,14 12,13.7761424 12,13.5 L12,13 L11.5,13 C11.2238576,13 11,12.7761424 11,12.5 C11,12.2238576 11.2238576,12 11.5,12 L12,12 L12,11.5 C12,11.2238576 12.2238576,11 12.5,11 C12.7761424,11 13,11.2238576 13,11.5 L13,12 Z M13,6 L13,6.5 C13,6.77614237 12.7761424,7 12.5,7 C12.2238576,7 12,6.77614237 12,6.5 L12,6 L5.5,6 C5.22385763,6 5,5.77614237 5,5.5 C5,5.22385763 5.22385763,5 5.5,5 L19.5,5 C19.7761424,5 20,5.22385763 20,5.5 C20,5.77614237 19.7761424,6 19.5,6 L13,6 Z M19.5,22 C19.2238576,22 19,21.7761424 19,21.5 C19,21.2238576 19.2238576,21 19.5,21 C20.3284271,21 21,20.3284271 21,19.5 C21,19.2238576 21.2238576,19 21.5,19 C21.7761424,19 22,19.2238576 22,19.5 C22,20.8807119 20.8807119,22 19.5,22 Z M5.5,21 C5.77614237,21 6,21.2238576 6,21.5 C6,21.7761424 5.77614237,22 5.5,22 C4.11928813,22 3,20.8807119 3,19.5 L3,19.4384472 C3,19.1623048 3.22385763,18.9384472 3.5,18.9384472 C3.77614237,18.9384472 4,19.1623048 4,19.4384472 L4,19.5 C4,20.3284271 4.67157288,21 5.5,21 Z M4,5.5 C4,5.77614237 3.77614237,6 3.5,6 C3.22385763,6 3,5.77614237 3,5.5 C3,4.11928813 4.11928813,3 5.5,3 L19.5,3 C20.8807119,3 22,4.11928813 22,5.5 C22,5.77614237 21.7761424,6 21.5,6 C21.2238576,6 21,5.77614237 21,5.5 C21,4.67157288 20.3284271,4 19.5,4 L5.5,4 C4.67157288,4 4,4.67157288 4,5.5 Z M3,7.5 C3,7.22385763 3.22385763,7 3.5,7 C3.77614237,7 4,7.22385763 4,7.5 L4,8.5 C4,8.77614237 3.77614237,9 3.5,9 C3.22385763,9 3,8.77614237 3,8.5 L3,7.5 Z M3,10.5 C3,10.2238576 3.22385763,10 3.5,10 C3.77614237,10 4,10.2238576 4,10.5 L4,11.5 C4,11.7761424 3.77614237,12 3.5,12 C3.22385763,12 3,11.7761424 3,11.5 L3,10.5 Z M3,13.5 C3,13.2238576 3.22385763,13 3.5,13 C3.77614237,13 4,13.2238576 4,13.5 L4,14.5 C4,14.7761424 3.77614237,15 3.5,15 C3.22385763,15 3,14.7761424 3,14.5 L3,13.5 Z M3,16.5 C3,16.2238576 3.22385763,16 3.5,16 C3.77614237,16 4,16.2238576 4,16.5 L4,17.5 C4,17.7761424 3.77614237,18 3.5,18 C3.22385763,18 3,17.7761424 3,17.5 L3,16.5 Z M21,7.5 C21,7.22385763 21.2238576,7 21.5,7 C21.7761424,7 22,7.22385763 22,7.5 L22,8.5 C22,8.77614237 21.7761424,9 21.5,9 C21.2238576,9 21,8.77614237 21,8.5 L21,7.5 Z M21,10.5 C21,10.2238576 21.2238576,10 21.5,10 C21.7761424,10 22,10.2238576 22,10.5 L22,11.5 C22,11.7761424 21.7761424,12 21.5,12 C21.2238576,12 21,11.7761424 21,11.5 L21,10.5 Z M21,13.5 C21,13.2238576 21.2238576,13 21.5,13 C21.7761424,13 22,13.2238576 22,13.5 L22,14.5 C22,14.7761424 21.7761424,15 21.5,15 C21.2238576,15 21,14.7761424 21,14.5 L21,13.5 Z M21,16.5 C21,16.2238576 21.2238576,16 21.5,16 C21.7761424,16 22,16.2238576 22,16.5 L22,17.5 C22,17.7761424 21.7761424,18 21.5,18 C21.2238576,18 21,17.7761424 21,17.5 L21,16.5 Z M12,15.5 C12,15.2238576 12.2238576,15 12.5,15 C12.7761424,15 13,15.2238576 13,15.5 L13,16.5 C13,16.7761424 12.7761424,17 12.5,17 C12.2238576,17 12,16.7761424 12,16.5 L12,15.5 Z M12,8.5 C12,8.22385763 12.2238576,8 12.5,8 C12.7761424,8 13,8.22385763 13,8.5 L13,9.5 C13,9.77614237 12.7761424,10 12.5,10 C12.2238576,10 12,9.77614237 12,9.5 L12,8.5 Z M12,18.5 C12,18.2238576 12.2238576,18 12.5,18 C12.7761424,18 13,18.2238576 13,18.5 L13,19.5 C13,19.7761424 12.7761424,20 12.5,20 C12.2238576,20 12,19.7761424 12,19.5 L12,18.5 Z M17.5,21 C17.7761424,21 18,21.2238576 18,21.5 C18,21.7761424 17.7761424,22 17.5,22 L16.5,22 C16.2238576,22 16,21.7761424 16,21.5 C16,21.2238576 16.2238576,21 16.5,21 L17.5,21 Z M14.5,21 C14.7761424,21 15,21.2238576 15,21.5 C15,21.7761424 14.7761424,22 14.5,22 L13.5,22 C13.2238576,22 13,21.7761424 13,21.5 C13,21.2238576 13.2238576,21 13.5,21 L14.5,21 Z M11.5,21 C11.7761424,21 12,21.2238576 12,21.5 C12,21.7761424 11.7761424,22 11.5,22 L10.5,22 C10.2238576,22 10,21.7761424 10,21.5 C10,21.2238576 10.2238576,21 10.5,21 L11.5,21 Z M8.5,21 C8.77614237,21 9,21.2238576 9,21.5 C9,21.7761424 8.77614237,22 8.5,22 L7.5,22 C7.22385763,22 7,21.7761424 7,21.5 C7,21.2238576 7.22385763,21 7.5,21 L8.5,21 Z M5.5,13 C5.22385763,13 5,12.7761424 5,12.5 C5,12.2238576 5.22385763,12 5.5,12 L6.5,12 C6.77614237,12 7,12.2238576 7,12.5 C7,12.7761424 6.77614237,13 6.5,13 L5.5,13 Z M8.5,13 C8.22385763,13 8,12.7761424 8,12.5 C8,12.2238576 8.22385763,12 8.5,12 L9.5,12 C9.77614237,12 10,12.2238576 10,12.5 C10,12.7761424 9.77614237,13 9.5,13 L8.5,13 Z M15.5,13 C15.2238576,13 15,12.7761424 15,12.5 C15,12.2238576 15.2238576,12 15.5,12 L16.5,12 C16.7761424,12 17,12.2238576 17,12.5 C17,12.7761424 16.7761424,13 16.5,13 L15.5,13 Z M18.5,13 C18.2238576,13 18,12.7761424 18,12.5 C18,12.2238576 18.2238576,12 18.5,12 L19.5,12 C19.7761424,12 20,12.2238576 20,12.5 C20,12.7761424 19.7761424,13 19.5,13 L18.5,13 Z\"/></svg>',\n CELL_BORDER_NONE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><path d=\"M32 480a32 32 0 1 1 0-64 32 32 0 1 1 0 64zm96-64a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm0-384a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm0 256a32 32 0 1 1 0-64 32 32 0 1 1 0 64zM320 416a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm0-320a32 32 0 1 1 0-64 32 32 0 1 1 0 64zm0 128a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM224 480a32 32 0 1 1 0-64 32 32 0 1 1 0 64zm0-448a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm0 256a32 32 0 1 1 0-64 32 32 0 1 1 0 64zM416 416a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm0-384a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM32 96a32 32 0 1 1 0-64 32 32 0 1 1 0 64zM416 224a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM32 288a32 32 0 1 1 0-64 32 32 0 1 1 0 64zm192 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm192 64a32 32 0 1 1 0-64 32 32 0 1 1 0 64zM32 320a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM416 192a32 32 0 1 1 0-64 32 32 0 1 1 0 64zM32 128a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm192 64a32 32 0 1 1 0-64 32 32 0 1 1 0 64z\"/></svg>',\n FIXED_COLUMN_WIDTH: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M6,5H18A1,1 0 0,1 19,6A1,1 0 0,1 18,7H6A1,1 0 0,1 5,6A1,1 0 0,1 6,5M21,2V4H3V2H21M15,8H17V22H15V8M7,8H9V22H7V8M11,8H13V22H11V8Z\" /></svg>',\n COLOR: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path d=\"M512 256c0 .9 0 1.8 0 2.7c-.4 36.5-33.6 61.3-70.1 61.3L344 320c-26.5 0-48 21.5-48 48c0 3.4 .4 6.7 1 9.9c2.1 10.2 6.5 20 10.8 29.9c6.1 13.8 12.1 27.5 12.1 42c0 31.8-21.6 60.7-53.4 62c-3.5 .1-7 .2-10.6 .2C114.6 512 0 397.4 0 256S114.6 0 256 0S512 114.6 512 256zM128 288a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zm0-96a32 32 0 1 0 0-64 32 32 0 1 0 0 64zM288 96a32 32 0 1 0 -64 0 32 32 0 1 0 64 0zm96 96a32 32 0 1 0 0-64 32 32 0 1 0 0 64z\" /></svg>',\n CUT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><circle cx=\"60\" cy=\"76\" r=\"28\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><circle cx=\"60\" cy=\"180\" r=\"28\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"136\" y1=\"128\" x2=\"83.11\" y2=\"164.19\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"232\" y1=\"62.32\" x2=\"164.33\" y2=\"108.61\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"232\" y1=\"193.68\" x2=\"83.11\" y2=\"91.81\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg>',\n COPY: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><polyline points=\"168 168 216 168 216 40 88 40 88 88\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><rect x=\"40\" y=\"88\" width=\"128\" height=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg>',\n PASTE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><polyline points=\"48 139.59 48 216 208 216 208 139.59\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M54,40H202a8,8,0,0,1,7.69,5.8L224,96H32L46.34,45.8A8,8,0,0,1,54,40Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M96,96v16a32,32,0,0,1-64,0V96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M160,96v16a32,32,0,0,1-64,0V96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M224,96v16a32,32,0,0,1-64,0V96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg>',\n SELECT_ALL: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><line x1=\"144\" y1=\"40\" x2=\"112\" y2=\"40\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"112\" y1=\"216\" x2=\"144\" y2=\"216\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M184,40h24a8,8,0,0,1,8,8V72\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"216\" y1=\"144\" x2=\"216\" y2=\"112\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M184,216h24a8,8,0,0,0,8-8V184\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"40\" y1=\"112\" x2=\"40\" y2=\"144\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M72,216H48a8,8,0,0,1-8-8V184\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><path d=\"M72,40H48a8,8,0,0,0-8,8V72\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><rect x=\"80\" y=\"80\" width=\"96\" height=\"96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg>',\n FULLSCREEN: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M8 3V5H4V9H2V3H8ZM2 21V15H4V19H8V21H2ZM22 21H16V19H20V15H22V21ZM22 9H20V5H16V3H22V9Z\"></path></svg>',\n FULLSCREEN_EXIT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18 7H22V9H16V3H18V7ZM8 9H2V7H6V3H8V9ZM18 17V21H16V15H22V17H18ZM8 15V21H6V17H2V15H8Z\"></path></svg>',\n PRINT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16.05 16.04\"><g><path d=\"M19.76,15.84a1.29,1.29,0,0,0,.39-.92V8.35A2.05,2.05,0,0,0,19.57,7a1.93,1.93,0,0,0-1.38-.57H6.37a1.95,1.95,0,0,0-2,2v6.56a1.23,1.23,0,0,0,.38.92,1.35,1.35,0,0,0,.93.38h2V14.9l-2,0V8.35a.67.67,0,0,1,.18-.47.62.62,0,0,1,.48-.19H18.18a.6.6,0,0,1,.46.19.66.66,0,0,1,.18.47V14.9h-2v1.32h2A1.35,1.35,0,0,0,19.76,15.84ZM17.52,7.69V5.06a1.31,1.31,0,0,0-.38-.92,1.34,1.34,0,0,0-.94-.38H8.34A1.3,1.3,0,0,0,7,5.06V7.69H8.34V5.06h7.87V7.69h1.31ZM8.34,12.93h7.87l0,5.26H8.34V12.93Zm7.87,5.26v0Zm.65,1.31a.6.6,0,0,0,.46-.19.72.72,0,0,0,.2-.47V12.29a.74.74,0,0,0-.2-.47.6.6,0,0,0-.46-.19H7.68a.6.6,0,0,0-.46.19.72.72,0,0,0-.2.47v6.55a.74.74,0,0,0,.2.47.6.6,0,0,0,.46.19h9.18ZM16.67,9.28a.7.7,0,0,0-.94,0,.63.63,0,0,0-.18.46.67.67,0,0,0,.18.47.68.68,0,0,0,.94,0,.66.66,0,0,0,.18-.47A.58.58,0,0,0,16.67,9.28Z\" transform=\"translate(-4.25 -3.61)\"/></g></svg>',\n SPECIAL_CHARACTER: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><line x1=\"128\" y1=\"40\" x2=\"128\" y2=\"216\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"48\" y1=\"80\" x2=\"208\" y2=\"176\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"48\" y1=\"176\" x2=\"208\" y2=\"80\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg>',\n EMBED: '<svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 122.88 91.26\"><path class=\"cls-1\" d=\"M8.32,0H114.56a8.34,8.34,0,0,1,8.32,8.32V82.94a8.35,8.35,0,0,1-8.32,8.32H8.32A8.35,8.35,0,0,1,0,82.94V8.32A8.34,8.34,0,0,1,8.32,0ZM88.8,54.44a2.36,2.36,0,0,1,4.6,1.07L88.28,77.44a2.36,2.36,0,0,1-4.6-1.07L88.8,54.44ZM16.18,73.22a2.66,2.66,0,0,1,0-5.32h25a2.66,2.66,0,1,1,0,5.32Zm0-16.61a2.66,2.66,0,0,1,0-5.32H59.62a2.66,2.66,0,1,1,0,5.32Zm0-16.61a2.66,2.66,0,0,1,0-5.32H85A2.66,2.66,0,0,1,85,40Zm64.6,32a2.36,2.36,0,0,1-3.1,3.55l-9-7.85a2.35,2.35,0,0,1-.22-3.32,1.67,1.67,0,0,1,.23-.23l9-7.84a2.35,2.35,0,0,1,3.1,3.54l-6.93,6.08L80.78,72ZM100,75.56A2.36,2.36,0,0,1,96.9,72l6.93-6.07L96.9,59.86a2.35,2.35,0,1,1,3.1-3.54l9,7.84a1.67,1.67,0,0,1,.23.23,2.35,2.35,0,0,1-.22,3.32l-9,7.85Zm18-52.27H5.29V83.75A2.26,2.26,0,0,0,6,85.38a2.28,2.28,0,0,0,1.63.67h108a2.28,2.28,0,0,0,1.63-.67,2.26,2.26,0,0,0,.67-1.63V23.29ZM106.64,9.35a4.11,4.11,0,1,1-4.1,4.11,4.11,4.11,0,0,1,4.1-4.11Zm-27.84,0a4.11,4.11,0,1,1-4.11,4.11A4.11,4.11,0,0,1,78.8,9.35Zm13.92,0a4.11,4.11,0,1,1-4.11,4.11,4.11,4.11,0,0,1,4.11-4.11Z \"/></svg>',\n EDIT_LINK: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20px\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M15.7279 9.57627L14.3137 8.16206L5 17.4758V18.89H6.41421L15.7279 9.57627ZM17.1421 8.16206L18.5563 6.74785L17.1421 5.33363L15.7279 6.74785L17.1421 8.16206ZM7.24264 20.89H3V16.6473L16.435 3.21231C16.8256 2.82179 17.4587 2.82179 17.8492 3.21231L20.6777 6.04074C21.0682 6.43126 21.0682 7.06443 20.6777 7.45495L7.24264 20.89Z\"></path></svg>',\n COPY_LINK: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20px\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M6.9998 6V3C6.9998 2.44772 7.44752 2 7.9998 2H19.9998C20.5521 2 20.9998 2.44772 20.9998 3V17C20.9998 17.5523 20.5521 18 19.9998 18H16.9998V20.9991C16.9998 21.5519 16.5499 22 15.993 22H4.00666C3.45059 22 3 21.5554 3 20.9991L3.0026 7.00087C3.0027 6.44811 3.45264 6 4.00942 6H6.9998ZM5.00242 8L5.00019 20H14.9998V8H5.00242ZM8.9998 6H16.9998V16H18.9998V4H8.9998V6Z\"></path></svg>',\n DELETE_LINK: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20px\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M17 6H22V8H20V21C20 21.5523 19.5523 22 19 22H5C4.44772 22 4 21.5523 4 21V8H2V6H7V3C7 2.44772 7.44772 2 8 2H16C16.5523 2 17 2.44772 17 3V6ZM18 8H6V20H18V8ZM9 11H11V17H9V11ZM13 11H15V17H13V11ZM9 4V6H15V4H9Z\"></path></svg>',\n TENOR: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M17.409 19C16.633 16.6012 15.1323 15.1147 13.1434 13.3979C15.0238 11.8971 17.4071 11 20 11V3H21.0082C21.556 3 22 3.44495 22 3.9934V20.0066C22 20.5552 21.5447 21 21.0082 21H2.9918C2.44405 21 2 20.5551 2 20.0066V3.9934C2 3.44476 2.45531 3 2.9918 3H6V1H8V5H4V12C9.22015 12 13.6618 14.4616 15.3127 19H17.409ZM18 1V5H10V3H16V1H18ZM16.5 10C15.6716 10 15 9.32843 15 8.5C15 7.67157 15.6716 7 16.5 7C17.3284 7 18 7.67157 18 8.5C18 9.32843 17.3284 10 16.5 10Z\"></path></svg>',\n LOADER: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 200\"><radialGradient id=\"a12\" cx=\".66\" fx=\".66\" cy=\".3125\" fy=\".3125\" gradientTransform=\"scale(1.5)\"><stop offset=\"0\" stop-color=\"#000000\"></stop><stop offset=\".3\" stop-color=\"#000000\" stop-opacity=\".9\"></stop><stop offset=\".6\" stop-color=\"#000000\" stop-opacity=\".6\"></stop><stop offset=\".8\" stop-color=\"#000000\" stop-opacity=\".3\"></stop><stop offset=\"1\" stop-color=\"#000000\" stop-opacity=\"0\"></stop></radialGradient><circle transform-origin=\"center\" fill=\"none\" stroke=\"url(#a12)\" stroke-width=\"15\" stroke-linecap=\"round\" stroke-dasharray=\"200 1000\" stroke-dashoffset=\"0\" cx=\"100\" cy=\"100\" r=\"70\"><animateTransform type=\"rotate\" attributeName=\"transform\" calcMode=\"spline\" dur=\"2\" values=\"360;0\" keyTimes=\"0;1\" keySplines=\"0 0 1 1\" repeatCount=\"indefinite\"></animateTransform></circle><circle transform-origin=\"center\" fill=\"none\" opacity=\".2\" stroke=\"#000000\" stroke-width=\"15\" stroke-linecap=\"round\" cx=\"100\" cy=\"100\" r=\"70\"></circle></svg>',\n FULLSCREEN_IMAGE: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20px\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 3V5H4V9H2V3H8ZM2 21V15H4V19H8V21H2ZM22 21H16V19H20V15H22V21ZM22 9H20V5H16V3H22V9Z\"></path></svg>',\n CLOSE: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16px\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M10.5859 12L2.79297 4.20706L4.20718 2.79285L12.0001 10.5857L19.793 2.79285L21.2072 4.20706L13.4143 12L21.2072 19.7928L19.793 21.2071L12.0001 13.4142L4.20718 21.2071L2.79297 19.7928L10.5859 12Z\"></path></svg>',\n SPINNER: '<svg class=\"leksy-editor-spinner\" width=\"16\" height=\"16\" viewBox=\"0 0 50 50\"><circle class=\"leksy-editor-path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle></svg>',\n TABLE_OF_CONTENT: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M20 22H4C3.44772 22 3 21.5523 3 21V3C3 2.44772 3.44772 2 4 2H20C20.5523 2 21 2.44772 21 3V21C21 21.5523 20.5523 22 20 22ZM19 20V4H5V20H19ZM8 7H16V9H8V7ZM8 11H16V13H8V11ZM8 15H16V17H8V15Z\"></path></svg>',\n MORE: `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 3C10.9 3 10 3.9 10 5C10 6.1 10.9 7 12 7C13.1 7 14 6.1 14 5C14 3.9 13.1 3 12 3ZM12 17C10.9 17 10 17.9 10 19C10 20.1 10.9 21 12 21C13.1 21 14 20.1 14 19C14 17.9 13.1 17 12 17ZM12 10C10.9 10 10 10.9 10 12C10 13.1 10.9 14 12 14C13.1 14 14 13.1 14 12C14 10.9 13.1 10 12 10Z\"></path></svg>`,\n PLAY_LIST: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M22 18V20H2V18H22ZM2 3.5L10 8.5L2 13.5V3.5ZM22 11V13H12V11H22ZM22 4V6H12V4H22Z\"></path></svg>',\n PENCIL_LINE: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M15.7279 9.57627L14.3137 8.16206L5 17.4758V18.89H6.41421L15.7279 9.57627ZM17.1421 8.16206L18.5563 6.74785L17.1421 5.33363L15.7279 6.74785L17.1421 8.16206ZM7.24264 20.89H3V16.6473L16.435 3.21231C16.8256 2.82179 17.4587 2.82179 17.8492 3.21231L20.6777 6.04074C21.0682 6.43126 21.0682 7.06443 20.6777 7.45495L7.24264 20.89Z\"></path></svg>',\n FIND_AND_REPLACE: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" fill=\"#000000\" viewBox=\"0 0 256 256\"><path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path></svg>',\n}\n\nconst MIMETYPE = {\n IMAGE: 'image/png,image/jpg,image/jpeg,image/webp',\n VIDEO: 'video/mp4,video/quicktime',\n}\n\nconst SOCIAL_MEDIA_PATTERNS = {\n YOUTUBE: /(?:youtube\\.com\\/(?:.*[?&]v=|embed\\/|v\\/|watch\\?v=|live\\/)|youtu\\.be\\/)([^\"&?\\/\\s]{11})/,\n REDDIT: /(?:reddit\\.com\\/r\\/[\\w-]+\\/comments\\/|reddit\\.com\\/comments\\/)([\\w-]+)/,\n INSTAGRAM: /(?:instagram\\.com\\/(?:p|reel|tv|stories\\/[\\w-]+|[\\w-]+\\/posts|share\\/p)\\/|instagr\\.am\\/p\\/)([\\w-]+)/,\n THREADS: /(?:threads\\.net\\/@[\\w-]+\\/post\\/)([\\w-]+)/,\n PINTEREST: /(?:pinterest\\.com\\/pin\\/)(\\d+)/,\n VIMEO: /vimeo\\.com\\/(\\d+)/,\n TWITCH: /twitch\\.tv\\/videos\\/(\\d+)/,\n TWITCH_CHANNEL: /twitch\\.tv\\/([a-zA-Z0-9_]+)/,\n TIKTOK: /tiktok\\.com\\/@[^/]+\\/video\\/(\\d+)/,\n};\n\nconst SOCIAL_MEDIA_BASEURLS = {\n YOUTUBE: \"https://www.youtube.com/embed/\",\n INSTAGRAM: \"https://www.instagram.com/p/\",\n REDDIT: \"https://www.redditmedia.com/r/all/comments/\",\n PINTEREST: \"https://assets.pinterest.com/ext/embed.html?id=\",\n THREADS: \"https://www.threads.net/t/\",\n VIMEO: 'https://player.vimeo.com/video/',\n TWITCH: 'https://player.twitch.tv/?video=',\n TWITCH_CHANNEL: 'https://player.twitch.tv/?channel=',\n TIKTOK: 'https://www.tiktok.com/embed/',\n};\n\nconst CSS_VARIABLES = {\n primary: \"hsl(160, 100%, 40%)\",\n baseWhite: \"hsl(0, 0%, 100%)\",\n whiteDark: \"hsl(223, 5%, 92%)\",\n resizer: \" #3f9dff\",\n resizerBackground: \"hsl(211, 100%, 62%, 0.3)\",\n shadow: \"rgba(0, 0, 0, 0.3)\",\n mention: \" #efefef\",\n mentionHighlight: \"#ddd\",\n dashedBorder: \"gray\",\n tableResizer: \"cornsilk\",\n tableResizerOutline: \"darkblue\",\n textColor: \"hsl(216, 10%, 20%)\",\n resizerPosition: \"#fff\",\n resizerPositionBackground: \"#333\",\n linkColor: \"#0000ff\",\n scrollbarThumb: \"hsl(160, 100%, 40%)\",\n scrollbarTrack: \"hsl(223, 5%, 76%)\",\n}\n\nconst CSS = {\n IFRAME_VARIABLES: `\n :root {\n --primary: hsl(160, 100%, 40%);\n --base-white: hsl(0, 0%, 100%);\n --base-white-dark: hsl(223, 5%, 92%);\n --resizer: #3f9dff;\n --resizer-background: hsl(211, 100%, 62%, 0.3);\n --shadow:rgba(0, 0, 0, 0.3);\n --mention: #efefef;\n --mention-highlight: #ddd;\n --dashed-border: gray;\n --table-resizer: cornsilk;\n --table-resizer-outline: darkblue;\n --text-color: #000000;\n --resizer-position: #ffffff;\n --resizer-position-background: #333;\n --link-color: blue;\n --scrollbar-thumb: hsl(160, 100%, 40%);\n --scrollbar-track: hsl(223, 5%, 76%);\n }\n `,\n IFRAME_TRIBUTE: `.tribute{height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:100;border:1px solid var(--base-white-dark)}.tribute ul{margin:2px 0 0;padding:0;list-style:none;background-color:var(--mention); color:var(--text-color)}.tribute .category{color:var(--text-color); padding:5px;color:var(--primary);background-color:var(--base-white)}.tribute .item{padding:5px;cursor:pointer}.tribute .highlight{background-color:var(--mention-highlight)}`,\n IFRAME_BODY: `\n body { margin: 0}\n a {\n color: var(--link-color);\n }\n ::-webkit-scrollbar {\n width: 6px;\n height: 6px;\n }\n ::-webkit-scrollbar-thumb {\n -webkit-box-shadow: inset 0 0 6px var(--shadow);\n background-color: var(--scrollbar-thumb);\n border-radius: 3px;\n }\n ::-webkit-scrollbar-track {\n -webkit-box-shadow: inset 0 0 6px var(--shadow); \n background-color: var(--scrollbar-track);\n }\n `,\n IFRAME_EDITOR: `\n .content-editable {\n min-height: 100vh;\n height: 100%;\n outline: 0;\n padding: 4px;\n box-sizing: border-box;\n color:var(--text-color);\n }\n .content-editable a{\n cursor: pointer;\n }\n .content-editable span[contentEditable=false] {\n border: 1px solid var(--primary);\n background-color: var(--base-white);\n padding: 0 4px;\n border-radius: 4px;\n font-size-adjust: 0.4;\n }\n .content-editable img {\n cursor: pointer;\n }\n .content-editable td:hover:not(:has(*:hover)) {\n outline: 1px dashed var(--dashed-border);\n }\n .content-editable .iframe-wrapper {\n display:inline-block;\n margin:0;\n position: relative;\n }\n .content-editable .iframe-wrapper::after {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 1;\n background: transparent;\n cursor: default;\n pointer-events: auto;\n } \n `,\n IFRAME_RESIZER: `\n .resizer {\n position: fixed;\n background-color:var(--resizer-background);\n outline: 1px solid var(--resizer);\n cursor: pointer;\n }\n .resizer .dot {\n height: 8px;\n width: 8px;\n background-color: var(--resizer);\n position: absolute;\n padding: 0px;\n border: none;\n }\n .resizer .dot.up-left {\n top: -4px;\n left: -4px;\n cursor: nw-resize;\n }\n .resizer .dot.up {\n top: -4px;\n left: 50%;\n cursor: n-resize;\n transform: translatex(-50%);\n }\n .resizer .dot.up-right {\n top: -4px;\n right: -4px;\n cursor: ne-resize;\n }\n .resizer .dot.right {\n top: 50%;\n right: -4px;\n cursor: e-resize;\n transform: translateY(-50%);\n }\n .resizer .dot.bottom-right {\n bottom: -4px;\n right: -4px;\n cursor: se-resize;\n }\n .resizer .dot.bottom {\n bottom: -4px;\n left: 50%;\n cursor: s-resize;\n transform: translatex(-50%);\n }\n .resizer .dot.bottom-left {\n bottom: -4px;\n left: -4px;\n cursor: sw-resize;\n }\n .resizer .dot.left {\n top: 50%;\n left: -4px;\n cursor: w-resize;\n transform: translateY(-50%);\n }\n .resizer .position {\n position: absolute;\n right: 0;\n bottom: 0;\n user-select: none;\n background-color: var(--resizer-position-background);\n padding: 5px;\n margin: 2px;\n font-size: 12px;\n color:var(--resizer-position);\n border-radius: 4px;\n }\n .table-resizer {\n position: fixed;\n outline: 1px dashed var(--doted-border);\n border: none;\n padding: 0;\n margin: 0;\n pointer-events: none;\n }\n .table-resizer-btn {\n position: fixed;\n background-color: var(--table-resizer);\n outline: 2px solid var(--table-resizer-outline);\n cursor: se-resize;\n border: none;\n width: 8px;\n height: 8px;\n padding: 0;\n margin: 0;\n pointer-events: visible;\n }\n `,\n IFRAME_TAB: `\n .tabs-container {\n width: 260px;\n min-width: 200px;\n border-right: 1px solid var(--base-white-dark);\n display: flex;\n flex-direction: column;\n background-color: var(--base-white);\n overflow-y: auto;\n z-index: 9999;\n color: var(--text-color);\n height: 100vh;\n padding-left: 4px;\n position: sticky;\n top: 0;\n }\n\n .tabs-container .tab-header {\n padding: 12px 12px 8px 12px;\n font-weight: bold;\n font-size: 14px;\n display: flex;\n justify-content: space-between;\n align-items: center;\n border-bottom: 1px solid var(--base-white-dark);\n }\n .tabs-container .tab-header .tab-add-button,\n .tabs-container .tab-header .tab-expand-button {\n cursor: pointer;\n border: none;\n background: transparent;\n width: 24px;\n height: 24px;\n }\n .tabs-container .tab-header .tab-expand-button {\n display: none;\n }\n .tabs-container .tab-header .tab-add-button svg,\n .tabs-container .tab-header .tab-expand-button svg {\n fill: var(--text-color);\n }\n .tabs-container .tab-header .tab-expand-button svg {\n margin-bottom: 4px;\n rotate: 180deg;\n }\n .tabs-container .tab-header .tab-expand-button.show svg {\n rotate: 0deg;\n }\n\n .tabs-container .tab-items {\n overflow-y: auto;\n }\n\n .tabs-container .tab-items.animate {\n transition: max-height 0.3s ease, opacity 0.2s ease;\n }\n\n .tabs-container .tab-items .tab-item {\n padding: 8px;\n cursor: pointer;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n .tabs-container .tab-items .tab-item.active {\n border-left: 4px solid var(--primary);\n padding-left: 4px;\n }\n .tabs-container .tab-items .tab-item:hover {\n background-color: var(--base-white-dark);\n }\n .tabs-container .tab-items .tab-item svg {\n fill: var(--text-color);\n }\n\n .tabs-container .tab-items .tab-item .left {\n display: flex;\n align-items: center;\n flex: 1;\n overflow: hidden;\n }\n\n .tabs-container .tab-items .tab-item .tab-icons {\n width: 16px;\n height: 16px;\n }\n .tabs-container .tab-items .tab-item .tab-icons svg {\n fill: var(--text-color);\n width: 16px;\n height: 16px;\n margin-right: 4px; \n }\n\n .tabs-container .tab-items .tab-item .tab-dropdown {\n visibility: hidden;\n }\n .tabs-container .tab-items .tab-item:hover .tab-dropdown {\n visibility: visible;\n }\n\n .tabs-container .tab-items .tab-item .tab-input {\n border: none;\n margin-left: 4px;\n margin-right: 2px;\n color: var(--text-color);\n flex: 1;\n outline: none;\n background: none;\n text-overflow: ellipsis;\n pointer-events: none;\n border-radius: 4px;\n width: 95%;\n }\n\n .tabs-container .outline-items {\n border-bottom: 1px solid var(--base-white-dark);\n }\n .tabs-container .outline-items .outline-item {\n padding: 4px 0;\n cursor: pointer;\n color: grey;\n font-size: 14px;\n border-left: 2px solid var(--base-white-dark);\n }\n .tabs-container .outline-items .outline-item.active {\n border-color: var(--primary);\n color: var(--primary)\n }\n\n #leksy-editor-tab-context-menu {\n position: fixed;\n background-color: var(--base-white);\n border: 1px solid var(--base-white-dark);\n boxShadow: 0 2px 5px var(--shadow);\n z-index: 10000;\n border-radius: 4px;\n padding: 2px 0;\n min-width: 120px;\n }\n\n #leksy-editor-tab-context-menu .tab-menu-item {\n padding: 8px 16px;\n cursor: pointer;\n font-size: 14px;\n display: flex;\n align-items: center;\n background-color: var(--base-white);\n transition: background-color 0.2s ease;\n color: var(--text-color);\n }\n #leksy-editor-tab-context-menu .tab-menu-item:hover {\n background-color: var(--base-white-dark);\n }\n #leksy-editor-tab-context-menu .tab-submenu {\n position: absolute;\n left: 100%;\n top: 0;\n background-color: var(--base-white);\n border: 1px solid var(--base-white-dark);\n box-shadow: 0 2px 5px var(--shadow);\n z-index: 10001;\n max-height: 200px;\n overflow-y: auto;\n }\n #leksy-editor-tab-context-menu .tab-submenu .tab-menu-item {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: block;\n max-width: 200px;\n }\n #leksy-editor-tab-context-menu .tab-menu-item svg {\n fill: var(--text-color);\n width: 14px;\n height: 14px;\n margin-right: 4px;\n }\n `,\n IFRAME_MEDIA_QUERY: `\n @media only screen and (max-width: 991px) {\n .tabs-container {\n position: fixed;\n outline: 1px solid grey;\n width: 100%;\n bottom: 0px;\n border-radius: 16px 16px 0 0;\n top: initial;\n }\n .tabs-container {\n height: unset;\n }\n .tabs-container .tab-items {\n max-height: 0;\n opacity: 0;\n }\n .tabs-container .tab-header .tab-expand-button {\n display: inline-block;\n }\n .tabs-container .tab-items.show {\n max-height: 30vh;\n opacity: 1;\n }\n .tabs-container .tab-items .tab-item .tab-dropdown {\n visibility: visible;\n }\n }\n `,\n}\n\nconst RESIZER_PLUGINS = [\n { icon: '100%', title: 'Resize 100%', event: '100%' },\n { icon: '75%', title: 'Resize 75%', event: '75%' },\n { icon: '50%', title: 'Resize 50%', event: '50%' },\n { icon: SVG.ALIGN_LEFT, title: 'Left aligned image', event: 'wrap-left' },\n { icon: SVG.ALIGN_RIGHT, title: 'Right aligned image', event: 'wrap-right' },\n { icon: SVG.REVERT, title: 'Revert', event: 'revert' },\n { icon: SVG.AUTO_SIZE, title: 'Auto size', event: 'auto' },\n { icon: SVG.DELETE, title: 'Delete', event: 'delete' },\n]\n\nconst TABLE_PLUGINS = [\n { icon: SVG.INSERT_ROW_ABOVE, title: 'Insert Row Above', event: 'insert-row-above' },\n { icon: SVG.INSERT_ROW_BELOW, title: 'Insert Row Below', event: 'insert-row-below' },\n { icon: SVG.DELETE_ROW, title: 'Delete Row', event: 'delete-row' },\n { icon: SVG.MERGE_CELLS_HORIZONTAL, title: 'Merge Row', event: 'merge-cells-horizontal' },\n\n { icon: SVG.INSERT_COLUMN_LEFT, title: 'Insert Column Left', event: 'insert-column-left' },\n { icon: SVG.INSERT_COLUMN_RIGHT, title: 'Insert Column Right', event: 'insert-column-right' },\n { icon: SVG.DELETE_COLUMN, title: 'Delete Column', event: 'delete-column' },\n\n { icon: SVG.MERGE_CELLS_VERTICAL, title: 'Merge Up', event: 'merge-cell-up' },\n { icon: SVG.MERGE_CELLS_HORIZONTAL, title: 'Merge Right', event: 'merge-cell-right' },\n { icon: SVG.MERGE_CELLS_VERTICAL, title: 'Merge Down', event: 'merge-cell-down' },\n { icon: SVG.MERGE_CELLS_HORIZONTAL, title: 'Merge Left', event: 'merge-cell-left' },\n\n { icon: SVG.SPLIT_CELLS_VERTICAL, title: 'Split Vertically', event: 'split-cell-vertical' },\n { icon: SVG.SPLIT_CELLS_HORIZONTAL, title: 'Split Horizontally', event: 'split-cell-horizontal' },\n\n { icon: SVG.CELL_WIDTH, title: 'Cell Width (px)', event: 'cell-width' },\n { icon: SVG.CELL_HEIGHT, title: 'Cell Height (px)', event: 'cell-height' },\n { icon: SVG.CELL_PADDING, title: 'Cell Padding (px)', event: 'cell-padding' },\n\n { icon: SVG.ALIGN_LEFT, title: 'Align Left', event: 'align-left' },\n { icon: SVG.ALIGN_CENTER, title: 'Align Center', event: 'align-center' },\n { icon: SVG.ALIGN_RIGHT, title: 'Align Right', event: 'align-right' },\n\n { icon: SVG.CELL_BORDER_FULL, title: 'Border Full', event: 'cell-border-full' },\n { icon: SVG.CELL_BORDER_TOP, title: 'Border Top', event: 'cell-border-top' },\n { icon: SVG.CELL_BORDER_RIGHT, title: 'Border Right', event: 'cell-border-right' },\n { icon: SVG.CELL_BORDER_BOTTOM, title: 'Border Bottom', event: 'cell-border-bottom' },\n { icon: SVG.CELL_BORDER_LEFT, title: 'Border Left', event: 'cell-border-left' },\n { icon: SVG.CELL_BORDER_FULL, title: 'Border None', event: 'cell-border-none' },\n\n { icon: SVG.FIXED_COLUMN_WIDTH, title: 'Fixed Column', event: 'fixed-column-width' },\n { icon: SVG.COLOR, title: 'Cell Border Color', event: 'border-color' },\n { icon: SVG.COLOR, title: 'Cell Background Color', event: 'background-color' },\n { icon: SVG.COLOR, title: 'Row Background Color', event: 'row-background-color' },\n { icon: SVG.COLOR, title: 'Column Background Color', event: 'column-background-color' },\n]\n\nconst EMOJI_CATEGORIES = [\n {\n label: 'Smileys & Emotion',\n icons: [\n \"😀\", \"😃\", \"😄\", \"😁\", \"😆\", \"😅\", \"😂\", \"🤣\", \"😊\", \"😇\", \"🙂\", \"🙃\", \"😉\", \"😌\",\n \"😍\", \"🥰\", \"😘\", \"😗\", \"😙\", \"😚\", \"😋\", \"😛\", \"😜\", \"😝\", \"🤑\", \"🤗\", \"🤩\", \"🤔\",\n \"🥲\", \"😶‍🌫️\", \"😔\", \"😪\", \"🤤\", \"😴\", \"😷\", \"🤒\", \"🤕\", \"🤢\", \"🤮\", \"🤧\", \"🥵\", \"🥶\",\n \"🥴\", \"😵\", \"🤯\", \"🤠\", \"🥳\", \"😎\", \"🤓\", \"🧐\"\n ]\n },\n {\n label: 'People & Body',\n icons: [\n \"👶\", \"🧒\", \"👦\", \"👧\", \"🧑\", \"👱\", \"👨\", \"🧔\", \"👩\", \"👱‍♀️\", \"👩‍🦰\", \"👨‍🦰\", \"👩‍🦱\", \"👨‍🦱\",\n \"👩‍🦲\", \"👨‍🦲\", \"🧔\", \"👵\", \"🧓\", \"👴\", \"👲\", \"👳‍♀️\", \"👳‍♂️\", \"🧕\", \"👮‍♀️\", \"👮‍♂️\", \"👷‍♀️\",\n \"👷‍♂️\", \"💂‍♀️\", \"💂‍♂️\", \"🕵️‍♀️\", \"🕵️‍♂️\", \"👩‍⚕️\", \"👨‍⚕️\", \"👩‍🌾\", \"👨‍🌾\", \"👩‍🍳\", \"👨‍🍳\",\n \"👩‍🎓\", \"👨‍🎓\", \"👩‍🎤\", \"👨‍🎤\", \"👩‍🏫\", \"👨‍🏫\", \"👩‍🏭\", \"👨‍🏭\", \"👩‍💻\", \"👨‍💻\", \"👩‍💼\", \"👨‍💼\",\n \"👩‍🔧\", \"👨‍🔧\", \"👩‍🔬\", \"👨‍🔬\", \"👩‍🎨\", \"👨‍🎨\", \"👩‍🚒\", \"👨‍🚒\", \"👩‍✈️\", \"👨‍✈️\", \"👩‍🚀\", \"👨‍🚀\",\n \"👩‍⚖️\", \"👨‍⚖️\", \"👰\", \"🤵\", \"👸\", \"🤴\", \"🤶\", \"🎅\", \"🧙‍♀️\", \"🧙‍♂️\", \"🧝‍♀️\", \"🧝‍♂️\", \"🧛‍♀️\",\n \"🧛‍♂️\", \"🧟‍♀️\", \"🧟‍♂️\", \"🧞‍♀️\", \"🧞‍♂️\", \"🧜‍♀️\", \"🧜‍♂️\", \"🧚‍♀️\", \"🧚‍♂️\", \"👼\", \"🤰\", \"🤱\",\n \"🙇‍♀️\", \"🙇‍♂️\", \"💁‍♀️\", \"💁‍♂️\", \"🙅‍♀️\", \"🙅‍♂️\", \"🙆‍♀️\", \"🙆‍♂️\", \"🙋‍♀️\", \"🙋‍♂️\", \"🧏‍♀️\", \"🧏‍♂️\",\n \"🙎‍♀️\", \"🙎‍♂️\", \"🙍‍♀️\", \"🙍‍♂️\", \"💇‍♀️\", \"💇‍♂️\", \"💆‍♀️\", \"💆‍♂️\", \"🧖‍♀️\", \"🧖‍♂️\", \"💅\", \"🤳\",\n \"💃\", \"🕺\", \"👯‍♀️\", \"👯‍♂️\", \"🕴️\", \"🚶‍♀️\", \"🚶‍♂️\", \"🏃‍♀️\", \"🏃‍♂️\", \"👫\", \"👭\", \"👬\", \"💑\",\n \"👩‍❤️‍👩\", \"👩‍❤️‍👨\", \"👨‍❤️‍👨\", \"👩‍❤️‍💋‍👩\", \"👩‍❤️‍💋‍👨\", \"👨‍❤️‍💋‍👨\", \"👩‍❤️‍💋‍👨\", \"👨‍❤️‍💋‍👨\", \"👩‍❤️‍💋‍👩\"\n ]\n },\n {\n label: 'Animals & Nature',\n icons: [\n \"🐶\", \"🐱\", \"🐭\", \"🐹\", \"🐰\", \"🦊\", \"🐻\", \"🐼\", \"🐨\", \"🐯\",\n \"🦁\", \"🐮\", \"🐷\", \"🐸\", \"🐙\", \"🐵\", \"🦄\", \"🐞\", \"🦋\", \"🐝\",\n \"🦓\", \"🐘\", \"🦏\", \"🦍\", \"🐪\", \"🐫\", \"🦒\", \"🦘\", \"🐿️\", \"🦔\",\n \"🦑\", \"🦞\", \"🦀\", \"🐡\", \"🐠\", \"🐟\", \"🐬\", \"🐳\", \"🐋\", \"🦈\",\n \"🐊\", \"🐅\", \"🐆\", \"🦓\", \"🦍\", \"🐘\", \"🦏\", \"🦛\", \"🦧\", \"🦮\",\n \"🦢\", \"🦩\", \"🦜\", \"🦚\", \"🦉\", \"🦤\", \"🦚\", \"🦜\", \"🦇\", \"🐺\",\n \"🐗\", \"🐴\", \"🦄\", \"🐝\", \"🦋\", \"🐌\", \"🦀\", \"🦑\", \"🐙\", \"🦞\",\n \"🦐\", \"🦞\", \"🦀\", \"🦑\", \"🐡\", \"🐠\", \"🐟\", \"🐬\", \"🐋\", \"🦈\",\n \"🐊\", \"🐅\", \"🐆\", \"🦓\", \"🦍\", \"🐘\", \"🦏\", \"🦛\", \"🦧\", \"🦮\",\n \"🦢\", \"🦩\", \"🦜\", \"🦚\", \"🦉\", \"🦤\", \"🦚\", \"🦜\", \"🦇\"\n ]\n },\n {\n label: 'Food & Drink',\n icons: [\n \"🍇\", \"🍈\", \"🍉\", \"🍊\", \"🍋\", \"🍌\", \"🍍\", \"🥭\", \"🍎\", \"🍏\",\n \"🍐\", \"🍑\", \"🍒\", \"🍓\", \"🥝\", \"🍅\", \"🥥\", \"🥑\", \"🍆\", \"🥔\",\n \"🥕\", \"🌽\", \"🌶️\", \"🥒\", \"🥬\", \"🥦\", \"🧄\", \"🧅\", \"🍄\", \"🥜\",\n \"🌰\", \"🍞\", \"🥐\", \"🥖\", \"🥨\", \"🥯\", \"🥞\", \"🧇\", \"🧀\", \"🍖\",\n \"🍗\", \"🥩\", \"🥓\", \"🍔\", \"🍟\", \"🍕\", \"🌭\", \"🥪\", \"🌮\", \"🌯\",\n \"🥙\", \"🧆\", \"🥚\", \"🍳\", \"🥘\", \"🍲\", \"🥣\", \"🥗\", \"🍿\", \"🧈\",\n \"🧂\", \"🥫\", \"🍱\", \"🍘\", \"🍙\", \"🍚\", \"🍛\", \"🍜\", \"🍝\", \"🍠\",\n \"🍢\", \"🍣\", \"🍤\", \"🍥\", \"🥮\", \"🍡\", \"🥟\", \"🥠\", \"🥡\", \"🦀\",\n \"🦞\", \"🦐\", \"🦑\", \"🍦\", \"🍧\", \"🍨\", \"🍩\", \"🍪\", \"🎂\", \"🍰\",\n \"🧁\", \"🥧\", \"🍫\", \"🍬\", \"🍭\", \"🍮\", \"🍯\", \"🍼\", \"🥛\", \"☕\",\n \"🍵\", \"🍶\", \"🍾\", \"🍷\", \"🍸\", \"🍹\", \"🍺\", \"🍻\", \"🥂\", \"🥃\",\n \"🥤\", \"🧃\", \"🧉\", \"🧊\", \"🥢\", \"🍽️\", \"🍴\", \"🥄\", \"🔪\", \"🏺\"\n ]\n },\n {\n label: 'Activities',\n icons: [\n \"⚽\", \"🏀\", \"🏈\", \"⚾\", \"🥎\", \"🎾\", \"🏐\", \"🏉\", \"🎱\", \"🪀\",\n \"🏓\", \"🏸\", \"🏒\", \"🏑\", \"🥍\", \"🏏\", \"⛳\", \"🏹\", \"🎣\", \"🤿\",\n \"🥊\", \"🥋\", \"🎽\", \"⛸️\", \"🎿\", \"🛷\", \"🪂\", \"🏋️\", \"🤼\", \"🤸\",\n \"⛹️\", \"🤺\", \"🥇\", \"🥈\", \"🥉\", \"🏅\", \"🎖️\", \"🏆\", \"🏵️\", \"🎗️\",\n \"🎫\", \"🎟️\", \"🎪\", \"🤹\", \"🎭\", \"🩰\", \"🎨\", \"🎬\", \"🎤\", \"🎧\",\n \"🎼\", \"🎹\", \"🥁\", \"🎷\", \"🎺\", \"🎸\", \"🪕\", \"🎻\", \"🎲\", \"♟️\",\n \"🎯\", \"🎳\", \"🎮\", \"🎰\", \"🎱\", \"🧩\", \"🧸\", \"♠️\", \"♥️\", \"♦️\",\n \"♣️\", \"🃏\", \"🀄\", \"🎴\", \"🎭\", \"🖼️\", \"🎨\", \"🎻\", \"🎧\", \"🎮\",\n \"🎤\", \"🎬\", \"🎥\", \"📸\", \"📷\", \"📹\", \"📽️\", \"🎞️\", \"📺\", \"📻\",\n \"🎙️\", \"🎚️\", \"🎛️\", \"🧯\", \"🔥\", \"🪵\", \"🛢️\", \"💉\", \"💊\", \"🚬\",\n \"⚰️\", \"🪦\", \"⚱️\", \"🧳\", \"🕳️\", \"🛁\", \"🛀\", \"🚿\", \"🪒\", \"🧴\"\n ]\n },\n {\n label: 'Travel & Places',\n icons: [\n \"🚗\", \"🚕\", \"🚙\", \"🚌\", \"🚎\", \"🏎️\", \"🚓\", \"🚑\", \"🚒\", \"🚐\",\n \"🚚\", \"🚛\", \"🚜\", \"🦯\", \"🦽\", \"🦼\", \"🛴\", \"🚲\", \"🛵\", \"🏍️\",\n \"🛺\", \"🚨\", \"🚔\", \"✈️\", \"🛩️\", \"🛫\", \"🛬\", \"🪂\", \"🚁\", \"🚀\",\n \"🛸\", \"🛰️\", \"🚟\", \"🚠\", \"🚡\", \"🛎️\", \"🧳\", \"⌛\", \"⏳\", \"⌚\",\n \"⏰\", \"⏱️\", \"⏲️\", \"🕰️\", \"🕛\", \"🕧\", \"🕐\", \"🕜\", \"🕑\", \"🕝\",\n \"🕒\", \"🕞\", \"🕓\", \"🕟\", \"🕔\", \"🕠\", \"🕕\", \"🕡\", \"🕖\", \"🕢\",\n \"🕗\", \"🕣\", \"🕘\", \"🕤\", \"🕙\", \"🕥\", \"🕚\", \"🕦\", \"🌑\", \"🌒\",\n \"🌓\", \"🌔\", \"🌕\", \"🌖\", \"🌗\", \"🌘\", \"🌙\", \"🌚\", \"🌛\", \"🌜\",\n \"🌡️\", \"☀️\", \"🌤️\", \"⛅\", \"🌥️\", \"🌦️\", \"🌧️\", \"⛈️\", \"🌩️\", \"🌨️\",\n \"❄️\", \"☃️\", \"⛄\", \"🌬️\", \"💨\", \"🌀\", \"🌪️\", \"🌫️\", \"🌈\", \"🌂\",\n \"☂️\", \"☔\", \"⛱️\", \"⚡\", \"❤️‍🔥\", \"❤️‍🩹\", \"🔥\", \"💧\", \"🌊\", \"🏖️\"\n ]\n },\n {\n label: 'Flags',\n icons: [\n \"🏳️\", \"🏴\", \"🏁\", \"🚩\", \"🏳️‍🌈\", \"🏴‍☠️\", \"🇦🇫\", \"🇦🇽\", \"🇦🇱\", \"🇩🇿\",\n \"🇦🇸\", \"🇦🇩\", \"🇦🇴\", \"🇦🇮\", \"🇦🇶\", \"🇦🇬\", \"🇦🇷\", \"🇦🇲\", \"🇦🇼\", \"🇦🇺\",\n \"🇦🇹\", \"🇦🇿\", \"🇧🇸\", \"🇧🇭\", \"🇧🇩\", \"🇧🇧\", \"🇧🇾\", \"🇧🇪\", \"🇧🇿\", \"🇧🇯\",\n \"🇧🇲\", \"🇧🇹\", \"🇧🇴\", \"🇧🇦\", \"🇧🇼\", \"🇧🇷\", \"🇮🇴\", \"🇻🇬\", \"🇧🇳\", \"🇧🇬\",\n \"🇧🇫\", \"🇧🇮\", \"🇰🇭\", \"🇨🇲\", \"🇨🇦\", \"🇮🇨\", \"🇨🇻\", \"🇧🇶\", \"🇰🇾\", \"🇨🇫\",\n \"🇹🇩\", \"🇨🇱\", \"🇨🇳\", \"🇨🇽\", \"🇨🇨\", \"🇨🇴\", \"🇰🇲\", \"🇨🇬\", \"🇨🇩\", \"🇨🇰\",\n \"🇨🇷\", \"🇨🇮\", \"🇭🇷\", \"🇨🇺\", \"🇨🇼\", \"🇨🇾\", \"🇨🇿\", \"🇩🇰\", \"🇩🇯\", \"🇩🇲\",\n \"🇩🇴\", \"🇪🇨\", \"🇪🇬\", \"🇸🇻\", \"🏴‍☠️\", \"🇬🇶\", \"🇪🇷\", \"🇪🇪\", \"🇸🇿\", \"🇪🇹\",\n \"🇪🇺\", \"🇫🇰\", \"🇫🇴\", \"🇫🇯\", \"🇫🇮\", \"🇫🇷\", \"🇬🇫\", \"🇵🇫\", \"🇹🇫\", \"🇬🇦\",\n \"🇬🇲\", \"🇬🇪\", \"🇩🇪\", \"🇬🇭\", \"🇬🇮\", \"🇬🇷\", \"🇬🇱\", \"🇬🇩\", \"🇬🇵\", \"🇬🇺\",\n \"🇬🇹\", \"🇬🇬\", \"🇬🇳\", \"🇬🇼\", \"🇬🇾\", \"🇭🇹\", \"🇭🇳\", \"🇭🇰\", \"🇭🇺\", \"🇮🇸\",\n \"🇮🇳\", \"🇮🇩\", \"🇮🇷\", \"🇮🇶\", \"🇮🇪\", \"🇮🇲\", \"🇮🇱\", \"🇮🇹\", \"🇯🇲\", \"🇯🇵\",\n \"🎌\", \"🇯🇪\", \"🇯🇴\", \"🇰🇿\", \"🇰🇪\", \"🇰🇮\", \"🇽🇰\", \"🇰🇼\", \"🇰🇬\", \"🇱🇦\",\n \"🇱🇻\", \"🇱🇧\", \"🇱🇸\", \"🇱🇷\", \"🇱🇾\", \"🇱🇮\", \"🇱🇹\", \"🇱🇺\", \"🇲🇴\", \"🇲🇰\",\n \"🇲🇬\", \"🇲🇼\", \"🇲🇾\", \"🇲🇻\", \"🇲🇱\", \"🇲🇹\", \"🇲🇭\", \"🇲🇶\", \"🇲🇷\", \"🇲🇺\",\n \"🇾🇹\", \"🇲🇽\", \"🇫🇲\", \"🇲🇩\", \"🇲🇨\", \"🇲🇳\", \"🇲🇪\", \"🇲🇸\", \"🇲🇦\", \"🇲🇿\",\n \"🇲🇲\", \"🇳🇦\", \"🇳🇷\", \"🇳🇵\", \"🇳🇱\", \"🇳🇨\", \"🇳🇿\", \"🇳🇮\", \"🇳🇪\", \"🇳🇬\",\n \"🇳🇺\", \"🇳🇫\", \"🇰🇵\", \"🇲🇵\", \"🇳🇴\", \"🇴🇲\", \"🇵🇰\", \"🇵🇼\", \"🇵🇸\", \"🇵🇦\",\n \"🇵🇬\", \"🇵🇾\", \"🇵🇪\", \"🇵🇭\", \"🇵🇳\", \"🇵🇱\"\n ]\n },\n]\n\nconst SPECIAL_CHARACTERS = [\n {\n label: 'Punctuation',\n icons: [\n \"!\", \"@\", \"#\", \"$\", \"%\", \"&\", \"*\", \"+\", \"=\", \"|\", \"-\", \"_\", \":\", \";\", \"?\", \"~\", \"`\", \"/\", \"\\\\\"\n ]\n },\n {\n label: 'Brackets',\n icons: [\n \"(\", \")\", \"[\", \"]\", \"{\", \"}\",\n ]\n },\n {\n label: 'Quotes',\n icons: [\n \"'\", '\"', \"‘\", \"’\", \"“\", \"”\", \"»\",\n ]\n },\n {\n label: 'Currency Symbols',\n icons: [\n \"$\", \"€\", \"£\", \"¥\", \"¢\", \"₹\",\n ]\n },\n {\n label: 'Math Symbols',\n icons: [\n \"±\", \"µ\", \"¶\", \"™\", \"©\", \"®\", \"§\", \"¼\", \"½\", \"¾\",\n ]\n },\n {\n label: 'Comparison & Logic',\n icons: [\n \"<\", \">\",\n ]\n },\n {\n label: 'Miscellaneous',\n icons: [\n \"^\", \"µ\",\n ]\n }\n]\n\nconst FONTS = {\n \"arial, sans-serif\": \"<p style='user-select: none; font-family: arial, sans-serif;'>Sans Serif</p>\",\n \"times new roman, serif\": \"<p style='user-select: none; font-family: &quot;times new roman&quot;, serif;'>Times New Roman</p>\",\n \"monospace\": \"<p style='user-select: none; font-family: monospace;'>Fixed Width</p>\",\n \"arial black, sans-serif\": \"<p style='user-select: none; font-family: &quot;arial black&quot;, sans-serif;'>Wide</p>\",\n \"arial narrow, sans-serif\": \"<p style='user-select: none; font-family: &quot;arial narrow&quot;, sans-serif;'>Narrow</p>\",\n \"comic sans ms, sans-serif\": \"<p style='user-select: none; font-family: &quot;comic sans ms&quot;, sans-serif;'>Comic Sans MS</p>\",\n \"garamond, times new roman, serif\": \"<p style='user-select: none; font-family: garamond, &quot;times new roman&quot;, serif;'>Garamond</p>\",\n \"georgia, serif\": \"<p style='user-select: none; font-family: georgia, serif;'>Georgia</p>\",\n \"tahoma, sans-serif\": \"<p style='user-select: none; font-family: tahoma, sans-serif;'>Tahoma</p>\",\n \"trebuchet ms, sans-serif\": \"<p style='user-select: none; font-family: &quot;trebuchet ms&quot;, sans-serif;'>Trebuchet MS</p>\",\n \"verdana, sans-serif\": \"<p style='user-select: none; font-family: verdana, sans-serif;'>Verdana</p>\",\n \"calibri, sans-serif\": \"<p style='user-select: none; font-family: calibri, sans-serif;'>Calibri</p>\",\n}\n\nconst FONT_SIZE_OPTIONS = {\n \"1\": \"<p style='user-select: none; font-size: 10px'>10px</p>\",\n \"2\": \"<p style='user-select: none; font-size: 13px'>13px</p>\",\n \"3\": \"<p style='user-select: none; font-size: 16px'>16px</p>\",\n \"4\": \"<p style='user-select: none; font-size: 18px'>18px</p>\",\n \"5\": \"<p style='user-select: none; font-size: 24px'>24px</p>\",\n \"6\": \"<p style='user-select: none; font-size: 32px'>32px</p>\",\n \"7\": \"<p style='user-select: none; font-size: 48px'>48px</p>\",\n}\n\nconst FONT_SIZES = {\n \"1\": \"<p style='user-select: none;'>10px</p>\",\n \"2\": \"<p style='user-select: none;'>13px</p>\",\n \"3\": \"<p style='user-select: none;'>16px</p>\",\n \"4\": \"<p style='user-select: none;'>18px</p>\",\n \"5\": \"<p style='user-select: none;'>24px</p>\",\n \"6\": \"<p style='user-select: none;'>32px</p>\",\n \"7\": \"<p style='user-select: none;'>48px</p>\",\n}\n\nconst FORMAT_OPTIONS = {\n \"h1\": \"<h1>Heading 1</h1>\",\n \"h2\": \"<h2>Heading 2</h2>\",\n \"h3\": \"<h3>Heading 3</h3>\",\n \"h4\": \"<h4>Heading 4</h4>\",\n \"h5\": \"<h5>Heading 5</h5>\",\n \"h6\": \"<h6>Heading 6</h6>\",\n \"p\": \"<p>Paragraph<p>\",\n}\n\nconst FORMATS = {\n \"h1\": \"Heading 1\",\n \"h2\": \"Heading 2\",\n \"h3\": \"Heading 3\",\n \"h4\": \"Heading 4\",\n \"h5\": \"Heading 5\",\n \"h6\": \"Heading 6\",\n \"p\": \"Paragraph\",\n}\n\nconst GIPHY_POWERED_IMAGE = \"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\"\n\nconst TAB_CATEGORIES = {\n 'Row': {\n '': ['insert-row-above', 'insert-row-below', 'delete-row', 'row-background-color']\n },\n 'Column': {\n '': ['insert-column-left', 'insert-column-right', 'delete-column', 'fixed-column-width', 'column-background-color']\n },\n 'Merge': {\n '': ['merge-cell-up', 'merge-cell-right', 'merge-cell-down', 'merge-cell-left', 'split-cell-vertical', 'split-cell-horizontal']\n },\n 'Cell Property': {\n 'Dimension': ['cell-width', 'cell-height', 'cell-padding'],\n 'Border': ['cell-border-full', 'cell-border-top', 'cell-border-right', 'cell-border-bottom', 'cell-border-left', 'cell-border-none', 'border-color'],\n 'Background': ['background-color']\n },\n 'Table Property': {\n 'Alignment': ['align-left', 'align-center', 'align-right']\n }\n};\n\nconst ORDERED_LIST_OPTIONS = {\n '1': `${SVG.NEW_LIST_NUMBER} Number`,\n 'a': `${SVG.LIST_LOWER_ALPHA} Lower Alpha`,\n 'i': `${SVG.LIST_LOWER_ROMAN} Lower Roman`,\n 'A': `${SVG.LIST_UPPER_ALPHA} Upper Alpha`,\n}\n\nconst UNORDERED_LIST_OPTIONS = {\n 'Disc': `${SVG.LIST_DISC} Disc`,\n 'Circle': `${SVG.LIST_CIRCLE} Circle`,\n 'Square': `${SVG.LIST_SQUARE} Square`,\n}\n\nconst RESIZE_MARGIN = 10;\n\nconst BLOCK_FORMAT_TAGS = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P'];\nconst LIST_STYLES_BY_LEVEL = ['1', 'a', 'i', 'A'];\nconst UNORDERED_LIST_STYLES_BY_LEVEL = ['disc', 'circle', 'square'];\nconst COLLABORATION_COLORS = [\n '#E53935', '#8E24AA', '#1E88E5', '#00897B',\n '#6D4C41', '#D81B60', '#F09300', '#00ACC1',\n '#7CB342', '#C0CA33', '#F4511E', '#039BE5',\n '#0B8043', '#3F51B5', '#E67C73', '#33B679',\n '#8D6E63', '#616161', '#AD1457', '#F6BF26'\n]\n\n\nexport {\n ERRORS,\n CLASSES,\n SVG,\n MIMETYPE,\n CSS,\n REGEX,\n RESIZER_PLUGINS,\n EMOJI_CATEGORIES,\n SPECIAL_CHARACTERS,\n FONTS,\n FONT_SIZE_OPTIONS,\n FONT_SIZES,\n FORMAT_OPTIONS,\n FORMATS,\n TABLE_PLUGINS,\n SOCIAL_MEDIA_BASEURLS,\n SOCIAL_MEDIA_PATTERNS,\n GIPHY_POWERED_IMAGE,\n CSS_VARIABLES,\n TAB_CATEGORIES,\n RESIZE_MARGIN,\n BLOCK_FORMAT_TAGS,\n LIST_STYLES_BY_LEVEL,\n UNORDERED_LIST_STYLES_BY_LEVEL,\n UNORDERED_LIST_OPTIONS,\n ORDERED_LIST_OPTIONS,\n COLLABORATION_COLORS\n}\n\n","\nconst giphy = {\n search: async (options, search, page=1) => {\n try {\n const response = await fetch(`https://api.giphy.com/v1/gifs/search?api_key=${options.giphyApiKey}&q=${encodeURIComponent(search)}&limit=50&offset=${(page - 1) * 50}`)\n if (response.ok) {\n const { data, pagination } = await response.json()\n return {\n images: data.map(gif => ({ src: gif.images.fixed_height_small.url })),\n totalPages: Math.ceil(pagination.total_count / 50) || 1,\n }\n }\n return { images: [], totalPages: 1 };\n } catch (error) {\n console.error(error)\n }\n },\n suggestions: async (options, page=1) => {\n try {\n const response = await fetch(`https://api.giphy.com/v1/gifs/trending?api_key=${options.giphyApiKey}&limit=10&offset=${(page - 1) * 10}`)\n if (response.ok) {\n const { data, pagination } = await response.json()\n\n return {\n images: data.map(gif => ({ src: gif.images.fixed_height_small.url })),\n totalPages: Math.ceil(pagination.total_count / 10) || 1\n }\n }\n return { images: [], totalPages: 1 }\n } catch (error) {\n console.error(error)\n }\n }\n}\n\nconst pexels = {\n search: async (options, search, page = 1) => {\n try {\n const response = await fetch(`https://api.pexels.com/v1/search?query=${encodeURIComponent(search)}&per_page=50&page=${page}`, { headers: { Authorization: options.pexelsApiKey } })\n if (response.ok) {\n const { photos, total_results } = await response.json()\n\n return {\n images: photos.map(photo => ({ src: photo.src.medium })),\n totalPages: Math.ceil(total_results / 50) || 1\n }\n }\n else return { images: [], totalPages: 1 }\n } catch (error) {\n console.error(error)\n }\n },\n suggestions: async (options, page = 1) => {\n try {\n const response = await fetch(`https://api.pexels.com/v1/curated?per_page=10&page=${page}`, { headers: { Authorization: options.pexelsApiKey } })\n if (response.ok) {\n const { photos, total_results } = await response.json()\n\n return {\n images: photos.map(photo => ({ src: photo.src.medium })),\n totalPages: Math.ceil(total_results / 10) || 1\n }\n }\n else return { images: [], totalPages: 1 }\n } catch (error) {\n console.error(error)\n }\n }\n}\n\nconst tenor = {\n search: async (options, search, next=\"\") => {\n try {\n const response = await fetch(`https://tenor.googleapis.com/v2/search?q=${encodeURIComponent(search)}&key=${options.tenorApiKey}&limit=50&pos=${next}`);\n if (response.ok) {\n const data = await response.json();\n return {\n images: data.results.map(gif => ({ src: gif.media_formats.webp.url })),\n next:data.next\n }\n } else return { images: [], next: \"\" }\n } catch (error) {\n console.error(error)\n }\n },\n suggestions: async (options, next=\"\") => {\n try {\n const response = await fetch(`https://tenor.googleapis.com/v2/featured?key=${options.tenorApiKey}&limit=10&pos=${next}`);\n if (response.ok) {\n const data = await response.json();\n\n return {\n images: data.results.map(gif => ({ src: gif.media_formats.webp.url })),\n next:data.next\n }\n } else return { images: [], next: \"\" }\n } catch (error) {\n console.error(error)\n }\n }\n}\n\nexport {\n giphy,\n pexels,\n tenor,\n}","import { BLOCK_FORMAT_TAGS, CLASSES, FONT_SIZES, FONTS, FORMATS, GIPHY_POWERED_IMAGE, REGEX, RESIZER_PLUGINS, SOCIAL_MEDIA_BASEURLS, SOCIAL_MEDIA_PATTERNS, SVG, TABLE_PLUGINS, TAB_CATEGORIES, RESIZE_MARGIN, LIST_STYLES_BY_LEVEL, UNORDERED_LIST_STYLES_BY_LEVEL, COLLABORATION_COLORS } from \"./constant\";\nimport { DiffDOM } from 'diff-dom';\nimport { v4 as uuidv4 } from 'uuid';\nimport { findTab } from \"./tab\";\nimport { applyOrderList, applyUnorderedList } from \"./plugin\";\n\nconst dd = new DiffDOM();\n\nconst removeBlockedStyles = (node) => {\n if (!node?.style) return;\n const styleProperties = Array.from(node.style);\n\n styleProperties.forEach((propertyName) => {\n if (REGEX.BLOCKED_STYLES.test(propertyName)) {\n node.style.removeProperty(propertyName);\n }\n });\n\n if (!node.getAttribute('style')?.trim()) {\n node.removeAttribute('style');\n }\n}\n\nconst traverseAndClean = (element, options, core) => {\n if (!element?.childNodes) return;\n\n // Iterate through child nodes\n const childNodes = element.childNodes;\n for (let i = childNodes.length - 1; i >= 0; i--) {\n const node = childNodes[i];\n\n // Recursively process child elements\n if (node.nodeType === Node.ELEMENT_NODE) {\n // Check if element tag is allowed\n if (!REGEX.WHILE_LISTED_TAG.test(node.tagName)) {\n // Remove the element if not allowed\n node.parentNode.removeChild(node);\n } else {\n // Remove attributes not in the whitelist\n const attributesToRemove = [];\n for (const attr of node.attributes) {\n if (!REGEX.WHILE_LISTED_ATTRIBUTES.test(attr.name) || attr.value.includes('var(')) {\n attributesToRemove.push(attr.name);\n }\n }\n if (options?.disablePastedColorStyles) {\n const nodeStyles = node.style\n let bgColor = nodeStyles.backgroundColor;\n let textColor = nodeStyles.color;\n let currentNode = core?.state?.range?.startContainer;\n let bodyBg = getEffectiveBackgroundColor(currentNode);\n if (bodyBg && bodyBg?.startsWith('rgb')) {\n bodyBg = rgbToHex(bodyBg)\n }\n if (bgColor && bgColor?.startsWith('rgb')) {\n bgColor = rgbToHex(bgColor)\n }\n if (textColor && textColor?.startsWith('rgb')) {\n textColor = rgbToHex(textColor)\n }\n\n if (bodyBg === bgColor) node.style.removeProperty('background-color');\n if (bodyBg === textColor) node.style.removeProperty('color');\n }\n if (options?.removeColorsWhilePasting) {\n node.style.removeProperty('background-color');\n node.style.removeProperty('color');\n }\n removeBlockedStyles(node);\n attributesToRemove.forEach(attr => node.removeAttribute(attr));\n\n // Process child nodes\n traverseAndClean(node, options, core);\n }\n }\n }\n}\n\nconst getEffectiveBackgroundColor = (element) => {\n if (!(element instanceof Element)) return null;\n let el = element;\n while (el) {\n const bgColor = window?.getComputedStyle(el)?.backgroundColor;\n\n if (bgColor !== 'rgba(0, 0, 0, 0)' &&\n bgColor !== 'transparent' &&\n bgColor !== '') {\n return bgColor;\n }\n\n el = el !== document.body ? el.parentElement : null;\n }\n const bodyBg = window?.getComputedStyle(document.body)?.backgroundColor;\n return bodyBg\n}\n\nconst cleanHTML = (html, options, core) => {\n // Create a temporary div to manipulate the HTML\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = html;\n\n // Traverse through all elements and clean attributes\n traverseAndClean(tempDiv, options, core);\n\n // Return manipulated HTML\n return tempDiv.innerHTML;\n}\n\nconst debounce = (fn, delay) => {\n let timeout = null;\n\n return (...args) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(async () => {\n fn(...args);\n timeout = null; // Clear the timeout reference after execution\n }, delay);\n }\n}\n\nfunction asyncDebounce(fn, delay) {\n let timeout = null;\n let isRunning = false;\n let callNextFn = false;\n let newArgs = [];\n\n function call(...args) {\n if (isRunning) {\n newArgs = args;\n callNextFn = true;\n return;\n } else {\n clearTimeout(timeout);\n newArgs = [];\n callNextFn = false;\n }\n\n return new Promise((resolve) => {\n timeout = setTimeout(async () => {\n isRunning = true;\n await fn(...args);\n resolve();\n isRunning = false;\n if (callNextFn) call(...newArgs);\n }, delay);\n });\n }\n\n return call;\n}\n\nfunction getDeviceName() {\n const userAgent = navigator.userAgent;\n\n if (/iPad|iPhone|iPod/.test(userAgent) && !window.MSStream) {\n return \"IOS\";\n } else if (/Android/.test(userAgent)) {\n return \"ANDROID\";\n } else if (/Macintosh/.test(userAgent)) {\n return \"MAC\";\n } else if (/Windows/.test(userAgent)) {\n return \"WINDOWS\";\n } else if (/Linux/.test(userAgent)) {\n return \"LINUX\";\n } else {\n return \"Unknown\";\n }\n}\n\nfunction getScrollParent(element) {\n let parent = element.parentElement;\n while (parent && parent !== document.body) {\n const style = getComputedStyle(parent);\n const overflowX = style.overflowX;\n if (overflowX === 'auto' || overflowX === 'scroll' || overflowX === 'hidden') {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document.body;\n}\n\nconst showTooltip = (options) => {\n document.addEventListener('mouseover', (e) => {\n const el = e.target.closest(`.${options.classPrefix}${CLASSES.TOOLBAR_ITEM}`);\n if (!el) return;\n\n const rect = el.getBoundingClientRect();\n\n let top = rect.bottom + 2;\n let left = rect.left + rect.width / 2;\n\n left = Math.max(68, Math.min(left, window.innerWidth - 68));\n\n el.style.setProperty('--leksy-editor-top', `${top}px`);\n el.style.setProperty('--leksy-editor-left', `${left}px`);\n });\n};\n\nconst getTooltip = (plugin, options) => {\n return options?.customTooltip?.[plugin.pluginId] ?? plugin.title\n}\n\nconst getToolbarIcon = (plugin, options) => {\n return options?.customIcon?.[plugin.pluginId] ?? plugin.icon\n}\n\nconst makeToolbarButton = (_plugin, options, core) => {\n const pluginButton = document.createElement('button');\n pluginButton.type = \"button\"\n pluginButton.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEM} ${_plugin.type === 'reset-color' ? 'reset-color' : ''}`\n\n pluginButton.dataset.title = getTooltip(_plugin, options)\n pluginButton.dataset.type = 'button'\n pluginButton.onclick = (e) => {\n e.preventDefault();\n _plugin.click(e, core, options);\n };\n\n const pluginIcon = document.createElement('div');\n pluginIcon.innerHTML = getToolbarIcon(_plugin, options);\n pluginButton.appendChild(pluginIcon)\n return pluginButton\n}\n\n\nconst makeToolbarButtonSelect = (_plugin, options, core) => {\n const pluginButton = document.createElement('button');\n pluginButton.type = \"button\"\n pluginButton.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEM} ${_plugin.type === 'button-select' ? CLASSES.TOOLBAR_ITEM_BUTTON_SELECT : ''}`\n\n pluginButton.dataset.title = getTooltip(_plugin, options)\n pluginButton.dataset.type = 'button'\n pluginButton.onclick = (e) => {\n e.preventDefault();\n _plugin.mainClick(e, core, options);\n };\n\n const pluginIcon = document.createElement('div');\n pluginIcon.innerHTML = getToolbarIcon(_plugin, options);\n pluginButton.appendChild(pluginIcon)\n const pluginSelect = makeToolbarSelect({ ..._plugin, icon: '' }, options, core);\n\n const pluginButtonSelect = document.createElement('div');\n pluginButtonSelect.dataset.type = 'button-select'\n pluginButtonSelect.style.display = 'flex'\n pluginButtonSelect.appendChild(pluginButton);\n pluginButtonSelect.appendChild(pluginSelect);\n return pluginButtonSelect\n}\n\n\nconst makeToolbarColor = (_plugin, options, core) => {\n const pluginContainer = document.createElement('div');\n pluginContainer.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEM} ${CLASSES.TOOLBAR_ITEM_COLOR}`\n pluginContainer.dataset.title = getTooltip(_plugin, options)\n pluginContainer.dataset.type = 'color'\n\n const pluginButton = document.createElement('input');\n pluginButton.type = \"color\"\n pluginButton.onclick = () => { if (getDeviceName() !== 'IOS') core.elements.editor.focus() }\n\n pluginButton.onchange = (e) => {\n e.preventDefault();\n _plugin.change(e, core, options);\n };\n\n const pluginIcon = document.createElement('div');\n pluginIcon.innerHTML = getToolbarIcon(_plugin, options);\n pluginIcon.onclick = () => pluginButton.click()\n pluginContainer.append(pluginButton, pluginIcon)\n return pluginContainer\n}\n\nconst makeToolbarDropdown = (_plugin, options, core) => {\n const handleOutsideClick = (e, forceFully) => {\n if (!forceFully && (e.target.getAttribute('data-toolbar-option') || dropdownPlugin.contains(e.target))) return\n dropdownContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n }\n const renderGalary = (images) => {\n if ((core.state.page == 1 && !core.state.next) || (!core.state.page && !core.state.next)) container.innerHTML = ''\n images.forEach(image => {\n const imageElement = document.createElement('img');\n imageElement.src = image.src;\n imageElement.style.width = '120px';\n imageElement.style.height = '120px';\n imageElement.style.cursor = 'pointer';\n imageElement.style.margin = '2px';\n imageElement.onclick = (e) => {\n const img = document.createElement('img');\n img.src = image.src\n if (image?.url) { // for video\n const linkNode = document.createElement('a');\n linkNode.href = image.url;\n linkNode.target = '_blank';\n linkNode.appendChild(img);\n core.insertNode(linkNode);\n } else {\n core.insertNode(img);\n }\n core.updateCaretPosition()\n core.elements.editor.focus()\n options.closePluginOnClick && handleOutsideClick(e, true)\n };\n container.appendChild(imageElement);\n })\n }\n const renderMentions = (value) => {\n container.innerHTML = ''\n const labels = JSON.parse(JSON.stringify(options.labels))\n .map(label => {\n label.fields = label.fields.filter(field => field.name.toLowerCase().includes(value.toLowerCase()))\n return label\n })\n .filter(label => label.fields.length)\n labels.forEach(category => {\n const categoryElement = document.createElement('div')\n categoryElement.textContent = category.name\n container.append(categoryElement)\n category.fields.forEach(field => {\n const labelElement = document.createElement('button')\n labelElement.type = \"button\"\n labelElement.textContent = field.name\n labelElement.onclick = (e) => {\n core.elements.editor.focus();\n const span = document.createElement('span');\n span.spellcheck = false\n span.contentEditable = false\n span.innerText = field.name\n span.setAttribute('data-id', field.value);\n\n core.insertNode(span)\n core.updateCaretPosition()\n options.closePluginOnClick && handleOutsideClick(e, true)\n }\n container.append(labelElement)\n })\n })\n }\n\n const dropdownPlugin = document.createElement('div');\n dropdownPlugin.setAttribute('data-type', 'dropdown')\n\n const dropdownButton = document.createElement('button');\n dropdownButton.type = \"button\"\n dropdownButton.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEM}`\n dropdownButton.setAttribute('data-title', getTooltip(_plugin, options))\n\n const pluginIcon = document.createElement('div');\n pluginIcon.innerHTML = getToolbarIcon(_plugin, options);\n dropdownButton.appendChild(pluginIcon)\n\n const dropdownContent = document.createElement('div');\n dropdownContent.className = `${options.classPrefix}${CLASSES.DROPDOWN_CONTENT} ${_plugin.type}`\n\n const container = document.createElement('div');\n\n if (_plugin.type === 'dropdown') {\n _plugin.options.forEach(option => {\n const optionDiv = document.createElement('button');\n optionDiv.type = \"button\"\n optionDiv.textContent = option.label;\n optionDiv.setAttribute('data-value', option.value); // Set custom attribute for value\n optionDiv.setAttribute('data-toolbar-option', true); // Set custom attribute for value\n\n // Event listener to handle selection\n optionDiv.addEventListener('click', function (e) {\n dropdownContent.style.display = 'none';\n _plugin.click(e, core, options)\n });\n\n // Append option to the dropdown content div\n dropdownContent.appendChild(optionDiv);\n });\n } else if (_plugin.type === 'gallery') {\n const search = document.createElement('input');\n search.placeholder = 'Search...'\n const fetchAndRenderImages = async (searchQuery = '', page) => {\n let res;\n if (searchQuery) {\n res = await _plugin.search(options, searchQuery, page);\n } else {\n res = await _plugin.suggestions(options, page);\n }\n if (res.totalPages) core.state.totalPages = res.totalPages; // Update total pages if available\n if (res.next) core.state.next = res.next; // Update next page if available\n renderGalary(res.images); // Pass search query and append flag\n };\n\n const debounce = asyncDebounce(async (value) => {\n core.state.page = 1; // Reset page on new search\n core.state.next = \"\";\n core.state.currentSearch = value; // Store the search term\n if (_plugin.title == \"Tenor\") {\n await fetchAndRenderImages(value, \"\");\n } else {\n await fetchAndRenderImages(value, 1);\n }\n }, 300);\n\n search.oninput = (e) => debounce(e.target.value)\n\n dropdownContent.addEventListener(\"scroll\", async () => {\n if (core.state.isFetching) return; // Prevent multiple calls while fetching\n\n if (dropdownContent.scrollTop + dropdownContent.clientHeight >= dropdownContent.scrollHeight - 10) {\n if (core.state.next) {\n core.state.isFetching = true; // Set fetching state\n await fetchAndRenderImages(core.state.currentSearch, core.state.next); // Fetch new images\n core.state.isFetching = false; // Reset fetching state\n }\n if (core.state.totalPages && core.state.page < core.state.totalPages) {\n core.state.isFetching = true; // Set fetching state\n core.state.page += 1; // Increment page\n await fetchAndRenderImages(core.state.currentSearch, core.state.page); // Fetch new images\n core.state.isFetching = false; // Reset fetching state\n }\n }\n });\n const footer = document.createElement('div');\n footer.className = 'footer';\n if (_plugin.title === \"GIPHY\") {\n const img = document.createElement('img');\n\n img.src = `data:image/png;base64,${GIPHY_POWERED_IMAGE}`;\n img.alt = \"Powered By GIPHY\";\n footer.append(img)\n } else {\n footer.innerHTML = `<span>Powered By ${_plugin.title}</span>`;\n }\n footer.style.position = 'sticky';\n footer.style.bottom = '0';\n footer.style.width = '100%';\n footer.style.background = '#f1f1f1';\n footer.style.textAlign = 'center';\n footer.style.height = '44px';\n footer.style.display = 'flex';\n footer.style.alignItems = 'center';\n footer.style.justifyContent = 'center';\n footer.style.overflow = 'hidden';\n\n dropdownContent.append(search, container, footer)\n } else if (_plugin.type === 'category') {\n _plugin.categories.forEach(category => {\n const categoryElement = document.createElement('div')\n categoryElement.textContent = category.label\n dropdownContent.append(categoryElement)\n category.icons.forEach(emoji => {\n const emojiElement = document.createElement('span')\n emojiElement.textContent = emoji\n emojiElement.onclick = (e) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('insertText', false, emoji)\n options.closePluginOnClick && handleOutsideClick(e, true)\n }\n dropdownContent.append(emojiElement)\n })\n })\n } else if (_plugin.type === 'mention') {\n const search = document.createElement('input');\n search.placeholder = 'Search...'\n search.oninput = (e) => renderMentions(e.target.value)\n dropdownContent.append(search, container)\n renderMentions('')\n } else if (_plugin.type === 'table') {\n const totalRows = 10;\n const totalCols = 10;\n\n // Create wrapper for table and checkbox\n const wrapper = document.createElement('div');\n wrapper.className = 'toolbar-table-wrapper'\n\n // Create header checkbox\n const headerOption = document.createElement('label');\n headerOption.style.display = 'block';\n headerOption.style.marginBottom = '8px';\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = true; // Default to include header\n checkbox.style.marginRight = '6px';\n\n headerOption.appendChild(checkbox);\n headerOption.appendChild(document.createTextNode('Include header row'));\n\n wrapper.appendChild(headerOption);\n\n const table = document.createElement('div');\n table.className = `${options.classPrefix}${CLASSES.TOOLBAR_TABLE}`\n\n // Create table selector grid\n for (let i = 0; i < totalRows; i++) {\n for (let j = 0; j < totalCols; j++) {\n\n const cell = document.createElement('div');\n cell.className = 'cell'\n\n cell.setAttribute('data-row', i);\n cell.setAttribute('data-col', j);\n if (j === 0) {\n cell.setAttribute('tabIndex', '0');\n }\n\n cell.addEventListener('mouseover', () => {\n const cells = table.querySelectorAll('.cell');\n cells.forEach((cell) => {\n const cellRow = parseInt(cell.getAttribute('data-row'));\n const cellCol = parseInt(cell.getAttribute('data-col'));\n\n if (cellRow <= i && cellCol <= j) {\n cell.classList.add('selected');\n } else {\n cell.classList.remove('selected');\n }\n });\n });\n cell.addEventListener('click', () => {\n _plugin.create(core, options, { rows: i, cols: j, header: checkbox.checked })\n dropdownContent.style.display = 'none'\n });\n\n table.appendChild(cell);\n }\n }\n wrapper.appendChild(table);\n dropdownContent.appendChild(wrapper);\n }\n\n let isSuggestionLoaded = false;\n dropdownButton.onclick = () => {\n if (dropdownContent.style.display === 'block') {\n dropdownContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n return\n }\n dropdownContent.style.display = 'block'\n const container = getScrollParent(dropdownContent);\n const containerRect = container.getBoundingClientRect();\n const popoverRect = dropdownContent.getBoundingClientRect();\n\n const overflowRight = popoverRect.right > containerRect.right;\n const overflowLeft = popoverRect.left < containerRect.left;\n\n if (overflowRight) {\n dropdownContent.style.right = '10px';\n } else if (overflowLeft) {\n dropdownContent.style.left = '10px';\n }\n\n if (!isSuggestionLoaded && _plugin.type === 'gallery') {\n _plugin.suggestions(options)\n .then(res => {\n isSuggestionLoaded = true\n if (res.totalPages) {\n core.state.totalPages = res.totalPages;\n core.state.next = \"\"\n } // Update total pages if available\n if (res.next) {\n core.state.next = res.next;\n core.state.totalPages = null\n } // Update next page if available\n renderGalary(res.images)\n })\n }\n\n document.addEventListener('mousedown', handleOutsideClick);\n core.elements.editor.addEventListener('click', handleOutsideClick);\n }\n\n dropdownPlugin.appendChild(dropdownButton)\n dropdownPlugin.appendChild(dropdownContent)\n return dropdownPlugin\n}\n\nconst makeToolbarSelect = (_plugin, options, core) => {\n const handleOutsideClick = (e) => {\n if (e.target.getAttribute('data-toolbar-option') || selectPlugin.contains(e.target)) return\n dropdownContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n }\n\n const selectPlugin = document.createElement('div');\n selectPlugin.dataset.type = 'select'\n\n const dropdownButton = document.createElement('button');\n dropdownButton.type = \"button\"\n dropdownButton.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEM} ${CLASSES.TOOLBAR_ITEM_SELECT} ${_plugin.type === 'button-select' ? CLASSES.TOOLBAR_ITEM_BUTTON_SELECT : ''}`\n dropdownButton.dataset.title = _plugin.type == 'button-select' ? `Options` : getTooltip(_plugin, options)\n\n const pluginIcon = document.createElement('div');\n pluginIcon.style.width = _plugin.width\n pluginIcon.style.textAlign = 'left'\n pluginIcon.style.display = 'flex'\n pluginIcon.style.justifyContent = 'space-between'\n\n const iconName = document.createElement('span');\n iconName.innerHTML = getToolbarIcon(_plugin, options);\n\n const arrow = document.createElement('span');\n if (_plugin.type == 'button-select') {\n arrow.innerHTML = SVG.ARROW_DROP_DOWN_FILL;\n } else {\n arrow.innerHTML = SVG.ARROW_DOWN;\n arrow.style.paddingLeft = '8px';\n }\n pluginIcon.append(iconName, arrow)\n\n dropdownButton.append(pluginIcon)\n\n const dropdownContent = document.createElement('div');\n dropdownContent.className = `${options.classPrefix}${CLASSES.DROPDOWN_CONTENT}`\n\n const _options = structuredClone(_plugin.options)\n if (_plugin.pluginId === 'font' && options.additionalFonts) {\n const fontOptions = options.additionalFonts.map(font => ({\n label: `<span style=\"font-family: '${font.fontFamily}';\">${font.name}</span>`,\n value: font.fontFamily\n }));\n _options.push(...fontOptions);\n }\n\n _options.forEach(option => {\n const optionDiv = document.createElement('button');\n optionDiv.type = \"button\"\n optionDiv.innerHTML = option.label;\n optionDiv.setAttribute('data-value', option.value); // Set custom attribute for value\n optionDiv.setAttribute('data-toolbar-option', true); // Set custom attribute for value\n\n // Event listener to handle selection\n optionDiv.addEventListener('click', function (e) {\n dropdownContent.style.display = 'none';\n _plugin.click(option.value, core, options)\n });\n\n // Append option to the dropdown content div\n dropdownContent.appendChild(optionDiv);\n });\n\n dropdownButton.onclick = () => {\n if (dropdownContent.style.display === 'block') {\n dropdownContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n return\n }\n dropdownContent.style.display = 'block'\n const container = getScrollParent(dropdownContent);\n const containerRect = container.getBoundingClientRect();\n const popoverRect = dropdownContent.getBoundingClientRect();\n\n const overflowRight = popoverRect.right > containerRect.right;\n const overflowLeft = popoverRect.left < containerRect.left;\n\n if (overflowRight) {\n dropdownContent.style.right = '10px';\n } else if (overflowLeft) {\n dropdownContent.style.left = '10px';\n }\n document.addEventListener('mousedown', handleOutsideClick);\n core.elements.editor.addEventListener('click', handleOutsideClick);\n }\n\n selectPlugin.appendChild(dropdownButton)\n selectPlugin.appendChild(dropdownContent)\n return selectPlugin\n}\n\nconst makeEditToolbar = (options, core, { type, td, image, updateImage, updateTable }) => {\n const handleOutsideClick = (e) => {\n if (popoverPlugin.contains(e.target)) return\n popoverContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n }\n\n const popoverPlugin = document.createElement('div');\n popoverPlugin.setAttribute('data-type', 'popover')\n\n const popoverButton = document.createElement('button');\n popoverButton.type = \"button\"\n popoverButton.className = `${options.classPrefix}${CLASSES.TOOLBAR_ITEM}`\n popoverButton.setAttribute('data-title', `Edit ${type === 'td' ? 'Cell' : type === 'image' ? 'Image' : \"Embed\"}`)\n\n const pluginIcon = document.createElement('div');\n pluginIcon.innerHTML = SVG.EDIT;\n popoverButton.appendChild(pluginIcon)\n\n const popoverContent = document.createElement('div');\n popoverContent.className = `${options.classPrefix}${CLASSES.POPOVER_CONTENT}`\n\n if (type === 'image' || type === 'figure') {\n const resizeByIds = {\n byPercentage: Math.random(),\n byPixels: Math.random(),\n percentageWidth: Math.random(),\n percentageHeight: Math.random(),\n pixelsWidth: Math.random(),\n pixelsHeight: Math.random(),\n percentage: Math.random(),\n pixels: Math.random(),\n aspectRatio: Math.random(),\n altText: Math.random(),\n submit: Math.random(),\n }\n\n popoverContent.innerHTML = (`\n <div style=\"border-bottom: 1px solid gray; padding-bottom: 4px;\">\n <div>\n By:\n <input type=\"radio\" value=\"percentage\" id=\"${resizeByIds.byPercentage}\" checked/>\n <label for=\"${resizeByIds.byPercentage}\">Percentage</label>\n <input type=\"radio\" value=\"pixels\" id=\"${resizeByIds.byPixels}\" />\n <label for=\"${resizeByIds.byPixels}\">Pixels</label>\n </div>\n <div id=\"${resizeByIds.percentage}\">\n <div style=\"display: flex; justify-content: space-between; margin-top: 4px\">\n <label for=\"${resizeByIds.percentageWidth}\">Width (%)</label>\n <input style=\"width: 100px\" type=\"number\" name='width' placeholder=\"Width\" id=\"${resizeByIds.percentageWidth}\" />\n </div>\n <div style=\"display: flex; justify-content: space-between; margin-top: 4px\">\n <label for=\"${resizeByIds.percentageHeight}\">Height (%)</label>\n <input style=\"width: 100px\" type=\"number\" name='height' placeholder=\"Height\" id=\"${resizeByIds.percentageHeight}\" />\n </div>\n </div>\n <div id=\"${resizeByIds.pixels}\" style=\"display: none\">\n <div style=\"display: flex; justify-content: space-between; margin-top: 4px\">\n <label for=\"${resizeByIds.pixelsWidth}\">Width (px)</label>\n <input style=\"width: 100px\" type=\"number\" name='width' placeholder=\"Width\" id=\"${resizeByIds.pixelsWidth}\" />\n </div>\n <div style=\"display: flex; justify-content: space-between; margin-top: 4px\">\n <label for=\"${resizeByIds.pixelsHeight}\">Height (px)</label>\n <input style=\"width: 100px\" type=\"number\" name='height' placeholder=\"Height\" id=\"${resizeByIds.pixelsHeight}\" />\n </div>\n </div>\n <div style=\"margin-top: 4px;\">\n <input type=\"checkbox\" id=\"${resizeByIds.aspectRatio}\" checked/>\n <label for=\"${resizeByIds.aspectRatio}\">Maintain Aspect Ratio</label>\n </div>\n ${type === \"image\" ? `\n <div style=\"display: flex; justify-content: space-between; margin-top: 4px\">\n <label for=\"${resizeByIds.altText}\">Alt Text</label>\n <input style=\"width: 100px\" type=\"text\" id=\"${resizeByIds.altText}\" placeholder=\"Enter alt text\" style=\"width: 100%;\" />\n </div>` : \"\"}\n <div style=\"display: flex; justify-content: end; margin-top: 4px;\">\n <button style=\"border: 1px solid gray; padding: 2px 4px; border-radius: 4px; color: white; background-color: hsl(160, 100%, 40%);\" type=\"button\" id=\"${resizeByIds.submit}\">Update</button>\n </div>\n </div >\n `)\n\n const pluginSet = document.createElement('div')\n pluginSet.className = `${options.classPrefix}${CLASSES.RESIZE_ITEMS} `\n RESIZER_PLUGINS.forEach(plugin => {\n const pluginButton = document.createElement('button');\n pluginButton.type = \"button\"\n pluginButton.className = `${options.classPrefix}${CLASSES.RESIZE_ITEM} `\n\n pluginButton.setAttribute('data-title', plugin.title)\n pluginButton.setAttribute('data-type', 'button')\n pluginButton.onclick = (e) => {\n e.preventDefault();\n updateImage(plugin.event);\n };\n\n const pluginIcon = document.createElement('div');\n pluginIcon.innerHTML = plugin.icon;\n pluginButton.appendChild(pluginIcon)\n pluginSet.appendChild(pluginButton)\n })\n popoverContent.appendChild(pluginSet)\n popoverButton.onclick = () => {\n const onInputKeydown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n resizeBy.submit.click();\n }\n }\n\n if (popoverContent.style.display === 'block') {\n popoverContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n return\n }\n popoverContent.style.display = 'block'\n const container = getScrollParent(popoverContent);\n const containerRect = container.getBoundingClientRect();\n const popoverRect = popoverContent.getBoundingClientRect();\n\n const overflowRight = popoverRect.right > containerRect.right;\n const overflowLeft = popoverRect.left < containerRect.left;\n\n if (overflowRight) {\n popoverContent.style.right = '10px';\n } else if (overflowLeft) {\n popoverContent.style.left = '10px';\n }\n const resizeBy = {\n byPercentage: document.getElementById(resizeByIds.byPercentage),\n byPixels: document.getElementById(resizeByIds.byPixels),\n percentageWidth: document.getElementById(resizeByIds.percentageWidth),\n percentageHeight: document.getElementById(resizeByIds.percentageHeight),\n pixelsWidth: document.getElementById(resizeByIds.pixelsWidth),\n pixelsHeight: document.getElementById(resizeByIds.pixelsHeight),\n percentage: document.getElementById(resizeByIds.percentage),\n pixels: document.getElementById(resizeByIds.pixels),\n aspectRatio: document.getElementById(resizeByIds.aspectRatio),\n submit: document.getElementById(resizeByIds.submit),\n }\n if (type == \"image\") resizeBy.altText = document.getElementById(resizeByIds.altText)\n\n const imageClientRect = image.getBoundingClientRect()\n resizeBy.percentageWidth.value = (imageClientRect.width / image.naturalWidth) * 100\n resizeBy.percentageHeight.value = (imageClientRect.height / image.naturalHeight) * 100\n resizeBy.pixelsWidth.value = imageClientRect.width\n resizeBy.pixelsHeight.value = imageClientRect.height\n if (type == \"image\") resizeBy.altText.value = image.alt || \"\";\n\n resizeBy.byPercentage.onchange = (e) => {\n if (e.target.checked) {\n resizeBy.pixels.style.display = 'none'\n resizeBy.percentage.style.display = 'block'\n resizeBy.byPixels.checked = false\n }\n }\n resizeBy.byPixels.onchange = (e) => {\n if (e.target.checked) {\n resizeBy.percentage.style.display = 'none'\n resizeBy.pixels.style.display = 'block'\n resizeBy.byPercentage.checked = false\n }\n }\n\n const handlePercentage = (e) => {\n let value = parseInt(e.target.value)\n if (value) {\n if (value > 100) value = 100;\n if (resizeBy.aspectRatio.checked) {\n resizeBy.percentageWidth.value = value\n resizeBy.percentageHeight.value = value\n } else {\n e.target.value = value\n }\n }\n }\n resizeBy.percentageWidth.oninput = handlePercentage\n resizeBy.percentageHeight.oninput = handlePercentage\n\n const handlePixel = (e) => {\n let value = parseInt(e.target.value)\n if (value) {\n if (resizeBy.aspectRatio.checked) {\n let width, height;\n if (e.target.name === 'width') {\n width = value\n const delta = image.naturalWidth / value\n height = image.naturalHeight / delta\n } else {\n height = value\n const delta = image.naturalHeight / value\n width = image.naturalWidth / delta\n }\n\n resizeBy.pixelsWidth.value = width\n resizeBy.pixelsHeight.value = height\n } else {\n e.target.value = value\n }\n }\n }\n resizeBy.pixelsWidth.oninput = handlePixel\n resizeBy.pixelsHeight.oninput = handlePixel\n\n resizeBy.percentageWidth.onkeydown = onInputKeydown\n resizeBy.percentageHeight.onkeydown = onInputKeydown\n resizeBy.pixelsWidth.onkeydown = onInputKeydown\n resizeBy.pixelsHeight.onkeydown = onInputKeydown\n\n resizeBy.aspectRatio.onchange = (e) => {\n if (e.target.checked) {\n if (resizeBy.byPixels.checked) {\n const delta = image.naturalWidth / parseInt(resizeBy.pixelsWidth.value)\n const height = image.naturalHeight / delta\n resizeBy.pixelsHeight.value = height\n } else {\n resizeBy.percentageHeight.value = resizeBy.percentageWidth.value\n }\n }\n }\n\n resizeBy.submit.onclick = (e) => {\n if (resizeBy.byPixels.checked) {\n if (parseInt(resizeBy.pixelsWidth.value) && parseInt(resizeBy.pixelsHeight.value))\n updateImage('update', { width: resizeBy.pixelsWidth.value + 'px', height: resizeBy.pixelsHeight.value + 'px', })\n } else if (resizeBy.byPercentage.checked) {\n if (parseInt(resizeBy.percentageWidth.value) && parseInt(resizeBy.percentageHeight.value))\n updateImage('update', { width: resizeBy.percentageWidth.value + '%', height: resizeBy.percentageHeight.value + '%', })\n }\n if (type == \"image\") image.alt = resizeBy.altText.value;\n }\n\n document.addEventListener('mousedown', handleOutsideClick);\n core.elements.editor.addEventListener('click', handleOutsideClick);\n }\n } else if (type === 'td') {\n popoverContent.style.padding = '0';\n\n const tabsContainer = document.createElement('div');\n tabsContainer.className = `${options.classPrefix}${CLASSES.POPOVER_TABS}`\n\n const tabContentContainer = document.createElement('div');\n tabContentContainer.style.padding = '0px 2px';\n\n popoverContent.innerHTML = ''; // Clear existing content\n popoverContent.append(tabsContainer, tabContentContainer);\n\n const createPluginItem = (plugin) => {\n const isColorInput =\n plugin.event === 'border-color' ||\n plugin.event === 'background-color' ||\n plugin.event === 'row-background-color' ||\n plugin.event === 'column-background-color';\n const isDimensionInput = ['cell-width', 'cell-height', 'cell-padding'].includes(plugin.event);\n\n let pluginElement;\n\n if (isColorInput) {\n pluginElement = document.createElement('label');\n pluginElement.className = `${options.classPrefix}${CLASSES.RESIZE_ITEM}`;\n pluginElement.style.display = 'flex';\n pluginElement.style.gap = '6px';\n pluginElement.style.alignItems = 'center';\n pluginElement.style.width = '100%';\n pluginElement.style.cursor = 'pointer';\n pluginElement.style.padding = '4px 8px';\n pluginElement.onmouseenter = () => { pluginElement.style.backgroundColor = '#ddd'; };\n pluginElement.onmouseleave = () => { pluginElement.style.backgroundColor = 'transparent'; };\n\n const icon = document.createElement('span');\n icon.innerHTML = plugin.icon;\n\n const title = document.createElement('span');\n title.textContent = plugin.title;\n\n const colorInput = document.createElement('input');\n colorInput.type = \"color\";\n colorInput.style.width = '24px';\n colorInput.style.height = '24px';\n colorInput.style.padding = '0px';\n colorInput.style.border = 'none';\n colorInput.style.background = 'transparent';\n colorInput.style.cursor = 'pointer';\n colorInput.oninput = (e) => {\n updateTable(plugin.event, e.target.value);\n };\n\n pluginElement.append(icon, title, colorInput);\n } else if (isDimensionInput) {\n pluginElement = document.createElement('label');\n pluginElement.className = `${options.classPrefix}${CLASSES.RESIZE_ITEM}`;\n pluginElement.style.display = 'flex';\n pluginElement.style.gap = '8px';\n pluginElement.style.alignItems = 'center';\n pluginElement.style.width = '100%';\n pluginElement.style.cursor = 'pointer';\n pluginElement.style.padding = '4px 8px';\n pluginElement.onmouseenter = () => { pluginElement.style.backgroundColor = '#ddd'; };\n pluginElement.onmouseleave = () => { pluginElement.style.backgroundColor = 'transparent'; };\n\n const icon = document.createElement('span');\n icon.innerHTML = plugin.icon;\n\n const title = document.createElement('span');\n title.textContent = plugin.title;\n\n const input = document.createElement('input');\n input.type = \"number\";\n input.placeholder = \"auto\";\n input.style.width = '60px';\n input.style.padding = '2px';\n input.style.border = '1px solid #ccc';\n input.style.borderRadius = '4px';\n if (plugin.event === 'cell-width') {\n input.value = toPx(td.style.width) || '';\n } else if (plugin.event === 'cell-height') {\n input.value = toPx(td.parentElement.style.height) || '';\n } else if (plugin.event === 'cell-padding') {\n input.value = toPx(td.style.padding) || '';\n }\n input.onchange = (e) => updateTable(plugin.event, (Number.parseInt(e.target.value) || 0) + 'px');\n input.onclick = (e) => e.stopPropagation();\n pluginElement.append(icon, title, input);\n } else {\n pluginElement = document.createElement('button');\n pluginElement.type = \"button\";\n pluginElement.className = `${options.classPrefix}${CLASSES.RESIZE_ITEM}`;\n pluginElement.style.display = 'flex';\n pluginElement.style.alignItems = 'center';\n pluginElement.style.gap = '8px';\n pluginElement.style.width = '100%';\n pluginElement.style.padding = '4px 8px';\n pluginElement.style.border = 'none';\n pluginElement.style.background = 'transparent';\n pluginElement.style.textAlign = 'left';\n pluginElement.onmouseenter = () => { pluginElement.style.backgroundColor = '#ddd'; };\n pluginElement.onmouseleave = () => { pluginElement.style.backgroundColor = 'transparent'; };\n\n pluginElement.onclick = (e) => {\n e.preventDefault();\n updateTable(plugin.event);\n };\n\n const icon = document.createElement('div');\n icon.innerHTML = plugin.icon;\n\n const title = document.createElement('span');\n title.textContent = plugin.title;\n\n pluginElement.append(icon, title);\n }\n return pluginElement;\n };\n\n Object.keys(TAB_CATEGORIES).forEach((categoryName, index) => {\n const tabButton = document.createElement('button');\n tabButton.type = 'button'\n tabButton.textContent = categoryName;\n tabButton.className = `${options.classPrefix}${CLASSES.POPOVER_TAB}`\n\n const tabId = categoryName.replaceAll(' ', '-');\n tabButton.dataset.tab = tabId;\n\n const tabContent = document.createElement('div');\n tabContent.id = tabId;\n tabContent.className = `${options.classPrefix}${CLASSES.POPOVER_TAB_CONTENT}`;\n tabContent.style.display = 'none';\n\n if (index === 0) {\n tabButton.classList.add('active');\n tabContent.style.display = 'block';\n }\n\n const subCategories = TAB_CATEGORIES[categoryName];\n Object.keys(subCategories).forEach(subCategoryName => {\n if (subCategoryName) {\n const subHeader = document.createElement('div');\n subHeader.style.padding = '4px';\n subHeader.textContent = subCategoryName;\n tabContent.appendChild(subHeader);\n }\n\n const pluginListContainer = document.createElement('div');\n pluginListContainer.className = `${options.classPrefix}${CLASSES.RESIZE_ITEMS}`;\n pluginListContainer.style.width = '100%';\n\n subCategories[subCategoryName].forEach(pluginEvent => {\n const plugin = TABLE_PLUGINS.find(p => p.event === pluginEvent);\n if (plugin) {\n const item = createPluginItem(plugin);\n pluginListContainer.appendChild(item);\n }\n });\n tabContent.appendChild(pluginListContainer);\n });\n\n tabsContainer.appendChild(tabButton);\n tabContentContainer.appendChild(tabContent);\n\n tabButton.onclick = (e) => {\n tabsContainer.querySelectorAll(`.${options.classPrefix}${CLASSES.POPOVER_TAB}`).forEach(btn => {\n btn.classList.remove('active');\n });\n tabContentContainer.querySelectorAll(`.${options.classPrefix}${CLASSES.POPOVER_TAB_CONTENT}`).forEach(content => {\n content.style.display = 'none';\n });\n e.currentTarget.classList.add('active');\n tabContentContainer.querySelector(`#${e.currentTarget.getAttribute('data-tab')}`).style.display = 'block';\n };\n });\n\n popoverButton.onclick = () => {\n if (popoverContent.style.display === 'block') {\n popoverContent.style.display = 'none'\n document.removeEventListener('mousedown', handleOutsideClick, false);\n core.elements.editor.removeEventListener('click', handleOutsideClick, false);\n return\n }\n popoverContent.style.display = 'block'\n const container = getScrollParent(popoverContent);\n const containerRect = container.getBoundingClientRect();\n const popoverRect = popoverContent.getBoundingClientRect();\n\n const overflowRight = popoverRect.right > containerRect.right;\n const overflowLeft = popoverRect.left < containerRect.left;\n\n if (overflowRight) {\n popoverContent.style.right = '20px';\n } else if (overflowLeft) {\n popoverContent.style.left = '20px';\n }\n document.addEventListener('mousedown', handleOutsideClick);\n core.elements.editor.addEventListener('click', handleOutsideClick);\n }\n }\n\n popoverPlugin.appendChild(popoverButton)\n popoverPlugin.appendChild(popoverContent)\n core.elements.toolbarContainer.appendChild(popoverPlugin)\n core.elements.resizerPlugin = popoverPlugin\n}\n\nconst openModal = ({ title, bodyNode, footerNode }, core, options) => {\n const modalContainer = document.createElement('div');\n modalContainer.className = `${options.classPrefix}${CLASSES.MODAL} `\n\n const modalContent = document.createElement('div');\n modalContent.className = `${options.classPrefix}${CLASSES.MODAL_CONTENT} `\n\n const modalHeader = document.createElement('div');\n modalHeader.className = `${options.classPrefix}${CLASSES.MODAL_HEADER} `\n const modalTitle = document.createElement('span');\n modalTitle.innerText = title ?? ''\n const modalCloseButton = document.createElement('button');\n modalCloseButton.className = 'modal-close-btn';\n modalCloseButton.innerHTML = SVG.CLOSE;\n modalCloseButton.type = 'button'\n modalCloseButton.onclick = () => {\n core.elements.base.removeChild(modalContainer)\n }\n modalHeader.append(modalTitle, modalCloseButton)\n\n const modalBody = document.createElement('div');\n modalBody.className = `${options.classPrefix}${CLASSES.MODAL_BODY} `\n modalBody.appendChild(bodyNode)\n\n const modalFooter = document.createElement('div');\n modalFooter.className = `${options.classPrefix}${CLASSES.MODAL_FOOTER} `\n modalFooter.appendChild(footerNode)\n\n modalContent.appendChild(modalHeader);\n modalContent.appendChild(modalBody);\n modalContent.appendChild(modalFooter);\n\n modalContainer.appendChild(modalContent)\n core.elements.base.appendChild(modalContainer)\n\n return {\n close: () => { core.elements.base.removeChild(modalContainer) }\n }\n}\n\nconst openDraggableModal = ({ title, bodyNode, footerNode, onClose }, core, options) => {\n const modalContainer = document.createElement('div');\n modalContainer.className = `${options.classPrefix}${CLASSES.MODAL} ${options.classPrefix}${CLASSES.DRAGGABLE_MODAL} `\n\n const modalContent = document.createElement('div');\n modalContent.className = `${options.classPrefix}${CLASSES.MODAL_CONTENT} `\n\n const modalHeader = document.createElement('div');\n modalHeader.className = `${options.classPrefix}${CLASSES.MODAL_HEADER} `\n if (title instanceof HTMLElement) {\n modalHeader.appendChild(title);\n } else {\n const modalTitle = document.createElement('span');\n modalTitle.innerText = title ?? ''\n modalHeader.appendChild(modalTitle);\n }\n const modalCloseButton = document.createElement('button');\n modalCloseButton.className = 'modal-close-btn';\n modalCloseButton.innerHTML = SVG.CLOSE;\n modalCloseButton.type = 'button'\n modalCloseButton.onclick = () => {\n modalContainer.remove();\n if (typeof onClose === 'function') onClose()\n }\n modalHeader.appendChild(modalCloseButton)\n\n let isDragging = false;\n let currentX;\n let currentY;\n let initialX;\n let initialY;\n let xOffset = 0;\n let yOffset = 0;\n\n const dragStart = (e) => {\n if (e.target.closest('button')) return;\n\n if (e.type === \"touchstart\") {\n initialX = e.touches[0].clientX - xOffset;\n initialY = e.touches[0].clientY - yOffset;\n } else {\n initialX = e.clientX - xOffset;\n initialY = e.clientY - yOffset;\n }\n\n isDragging = true;\n\n document.addEventListener('mouseup', dragEnd);\n document.addEventListener('touchend', dragEnd);\n core.elements.iframeWindow.addEventListener('mouseup', dragEnd);\n core.elements.iframeWindow.addEventListener('touchend', dragEnd);\n document.addEventListener('mousemove', drag);\n document.addEventListener('touchmove', drag);\n };\n\n const dragEnd = () => {\n isDragging = false;\n document.removeEventListener('mouseup', dragEnd, false);\n document.removeEventListener('touchend', dragEnd, false);\n core.elements.iframeWindow.removeEventListener('mouseup', dragEnd, false);\n core.elements.iframeWindow.removeEventListener('touchend', dragEnd, false);\n document.removeEventListener('mousemove', drag, false);\n document.removeEventListener('touchmove', drag, false);\n };\n\n const drag = (e) => {\n if (isDragging) {\n e.preventDefault();\n currentX = (e.type === \"touchmove\" ? e.touches[0].clientX : e.clientX) - initialX;\n currentY = (e.type === \"touchmove\" ? e.touches[0].clientY : e.clientY) - initialY;\n\n xOffset = currentX;\n yOffset = currentY;\n\n modalContainer.style.transform = `translate(-50%, -50%) translate3d(${currentX}px, ${currentY}px, 0)`;\n }\n };\n\n modalHeader.addEventListener('mousedown', dragStart, false);\n modalHeader.addEventListener('touchstart', dragStart, false);\n\n const modalBody = document.createElement('div');\n modalBody.className = `${options.classPrefix}${CLASSES.MODAL_BODY} `\n modalBody.appendChild(bodyNode)\n\n const modalFooter = document.createElement('div');\n modalFooter.className = `${options.classPrefix}${CLASSES.MODAL_FOOTER} `\n modalFooter.appendChild(footerNode)\n\n modalContent.appendChild(modalHeader);\n modalContent.appendChild(modalBody);\n modalContent.appendChild(modalFooter);\n\n modalContainer.appendChild(modalContent)\n core.elements.base.appendChild(modalContainer)\n\n return {\n close: () => {\n modalContainer.remove();\n if (typeof onClose === 'function') onClose()\n }\n }\n}\n\n\nconst initImageResizer = (type, image, options, core) => {\n destroyImageResizer(options, core)\n changeAllToolbarState(core, 'disabled', ['link', 'align_justify', 'align_left', 'align_right', 'align_center'])\n core.elements.editor.blur() // to remove focus from the editor\n\n const imageClientRect = image.getBoundingClientRect();\n const resizer = document.createElement('div');\n resizer.className = `resizer`\n resizer.style.width = imageClientRect.width + 'px';\n resizer.style.height = imageClientRect.height + 'px';\n resizer.style.top = imageClientRect.top + 'px';\n resizer.style.left = imageClientRect.left + 'px';\n\n // Full-screen button (only for images)\n if (type === 'image') {\n const fullscreenButton = document.createElement('span');\n fullscreenButton.innerHTML = SVG.FULLSCREEN_IMAGE\n fullscreenButton.style.position = 'absolute';\n fullscreenButton.style.top = '5px';\n fullscreenButton.style.right = '5px';\n fullscreenButton.style.background = 'rgba(0, 0, 0, 0.6)';\n fullscreenButton.style.color = 'white';\n fullscreenButton.style.border = 'none';\n fullscreenButton.style.cursor = 'pointer';\n fullscreenButton.style.borderRadius = '4px';\n fullscreenButton.style.fontSize = '14px';\n fullscreenButton.style.transition = '0.3s ease-in-out';\n fullscreenButton.style.width = '28px';\n fullscreenButton.style.height = '28px';\n fullscreenButton.style.display = 'flex';\n fullscreenButton.style.alignItems = 'center';\n fullscreenButton.style.justifyContent = 'center';\n\n fullscreenButton.addEventListener('click', () => {\n const anchor = image.closest('a');\n let isVideo = false;\n let src = image.src;\n\n if (anchor?.dataset?.leksyPreview === 'video-url') {\n const href = anchor.getAttribute('href');\n if (href) {\n isVideo = true;\n src = href;\n }\n }\n if (options.onFullScreen instanceof Function) {\n const type = isVideo ? 'video/mp4' : 'image/png';\n options.onFullScreen(src, type);\n }\n else createPreviewModal(src, core, options, isVideo);\n });\n\n resizer.appendChild(fullscreenButton);\n }\n\n let firstX, firstY, direction, aspectRatio, resizerClientRect;\n const handleMouseDown = (e) => {\n resizerClientRect = resizer.getBoundingClientRect();\n direction = e.target.getAttribute('data-resize')\n firstX = e.clientX || e.touches[0].clientX;\n firstY = e.clientY || e.touches[0].clientY;\n aspectRatio = resizer.offsetWidth / resizer.offsetHeight;\n core.elements.iframeWindow.addEventListener('mousemove', handleMouseMove)\n core.elements.iframeWindow.addEventListener('mouseup', handleMouseUp)\n core.elements.iframeWindow.addEventListener('touchmove', handleMouseMove)\n core.elements.iframeWindow.addEventListener('touchend', handleMouseUp)\n }\n\n const handleMouseMove = (e) => {\n const position = {\n clientX: e.clientX || e.touches[0].clientX,\n clientY: e.clientY || e.touches[0].clientY,\n }\n // Calculate the new dimensions\n if (direction === 'up') {\n let top = resizerClientRect.top + (position.clientY - firstY);\n let height = resizerClientRect.height - (position.clientY - firstY);\n if (height < 0) {\n top = resizerClientRect.bottom;\n height = 0\n }\n resizer.style.top = top + 'px';\n resizer.style.height = height + 'px';\n } else if (direction === 'bottom') {\n let height = resizerClientRect.height + (position.clientY - firstY);\n if (height < 0) height = 0\n resizer.style.height = height + 'px';\n } else if (direction === 'left') {\n let left = resizerClientRect.left + (position.clientX - firstX);\n let width = resizerClientRect.width - (position.clientX - firstX);\n if (width < 0) {\n left = resizerClientRect.right;\n width = 0\n }\n resizer.style.left = left + 'px';\n resizer.style.width = width + 'px';\n } else if (direction === 'right') {\n let width = resizerClientRect.width + (position.clientX - firstX);\n if (width < 0) width = 0\n resizer.style.width = width + 'px';\n } else if (direction === 'bottom-right') {\n const distanceX = position.clientX - firstX\n const distanceY = position.clientY - firstY\n const delta = Math.sign(distanceX) === -1 || Math.sign(distanceY) === -1\n ? Math.min(distanceX, distanceY)\n : Math.max(distanceX, distanceY)\n const width = resizerClientRect.width + delta;\n const height = width / aspectRatio;\n resizer.style.width = width + 'px';\n resizer.style.height = height + 'px';\n } else if (direction === 'bottom-left') {\n const distanceX = position.clientX - firstX\n const distanceY = position.clientY - firstY\n const delta = distanceX > 0 ? Math.max(distanceX, distanceY) : distanceX\n let width = resizerClientRect.width - delta;\n if (width < 0) width = 0\n let left = resizerClientRect.left + resizerClientRect.width - width;\n const height = width / aspectRatio;\n resizer.style.width = width + 'px';\n resizer.style.left = left + 'px';\n resizer.style.height = height + 'px';\n } else if (direction === 'up-right') {\n const distanceX = position.clientX - firstX\n const distanceY = position.clientY - firstY\n const delta = distanceX > 0 ? Math.max(distanceX, distanceY) : distanceX\n\n let width = resizerClientRect.width + delta;\n if (width < 0) width = 0\n const height = width / aspectRatio;\n const top = resizerClientRect.top + (resizerClientRect.height - height)\n resizer.style.top = top + 'px';\n resizer.style.width = width + 'px';\n resizer.style.height = height + 'px';\n } else if (direction === 'up-left') {\n const distanceX = position.clientX - firstX\n const distanceY = position.clientY - firstY\n const delta = distanceX > 0 ? Math.max(distanceX, distanceY) : distanceX\n let width = resizerClientRect.width - delta;\n if (width < 0) width = 0\n const height = width / aspectRatio;\n const top = resizerClientRect.top + (resizerClientRect.height - height)\n const left = resizerClientRect.left + (resizerClientRect.width - width)\n resizer.style.top = top + 'px';\n resizer.style.width = width + 'px';\n resizer.style.height = height + 'px';\n resizer.style.left = left + 'px';\n }\n position.textContent = `${parseInt(resizer.style.width)}x${parseInt(resizer.style.height)} `;\n }\n\n const handleMouseUp = (e) => {\n image.style.width = parseInt(resizer.style.width) + 'px'\n image.style.height = parseInt(resizer.style.height) + 'px'\n const imageClientRect = image.getBoundingClientRect();\n resizer.style.width = imageClientRect.width + 'px';\n resizer.style.height = imageClientRect.height + 'px';\n resizer.style.top = imageClientRect.top + 'px';\n resizer.style.left = imageClientRect.left + 'px';\n core.elements.iframeWindow.removeEventListener('mousemove', handleMouseMove, false)\n core.elements.iframeWindow.removeEventListener('mouseup', handleMouseUp, false)\n core.elements.iframeWindow.removeEventListener('touchmove', handleMouseMove, false)\n core.elements.iframeWindow.removeEventListener('touchend', handleMouseUp, false)\n }\n\n const dot1 = document.createElement('button');\n dot1.type = 'button'\n dot1.className = 'dot up-left'\n dot1.setAttribute('data-resize', 'up-left')\n dot1.addEventListener('mousedown', handleMouseDown)\n dot1.addEventListener('touchstart', handleMouseDown)\n\n const dot2 = document.createElement('button');\n dot2.type = 'button'\n dot2.className = 'dot up'\n dot2.setAttribute('data-resize', 'up')\n dot2.addEventListener('mousedown', handleMouseDown)\n dot2.addEventListener('touchstart', handleMouseDown)\n\n const dot3 = document.createElement('button');\n dot3.type = 'button'\n dot3.className = 'dot up-right'\n dot3.setAttribute('data-resize', 'up-right')\n dot3.addEventListener('mousedown', handleMouseDown)\n dot3.addEventListener('touchstart', handleMouseDown)\n\n const dot4 = document.createElement('button');\n dot4.type = 'button'\n dot4.className = 'dot right'\n dot4.setAttribute('data-resize', 'right')\n dot4.addEventListener('mousedown', handleMouseDown)\n dot4.addEventListener('touchstart', handleMouseDown)\n\n const dot5 = document.createElement('button');\n dot5.type = 'button'\n dot5.className = 'dot bottom-right'\n dot5.setAttribute('data-resize', 'bottom-right')\n dot5.addEventListener('mousedown', handleMouseDown)\n dot5.addEventListener('touchstart', handleMouseDown)\n\n const dot6 = document.createElement('button');\n dot6.type = 'button'\n dot6.className = 'dot bottom'\n dot6.setAttribute('data-resize', 'bottom')\n dot6.addEventListener('mousedown', handleMouseDown)\n dot6.addEventListener('touchstart', handleMouseDown)\n\n const dot7 = document.createElement('button');\n dot7.type = 'button'\n dot7.className = 'dot bottom-left'\n dot7.setAttribute('data-resize', 'bottom-left')\n dot7.addEventListener('mousedown', handleMouseDown)\n dot7.addEventListener('touchstart', handleMouseDown)\n\n const dot8 = document.createElement('button');\n dot8.type = 'button'\n dot8.className = 'dot left'\n dot8.setAttribute('data-resize', 'left')\n dot8.addEventListener('mousedown', handleMouseDown)\n dot8.addEventListener('touchstart', handleMouseDown)\n\n const position = document.createElement('div')\n position.className = 'position';\n position.textContent = `${parseInt(imageClientRect.width)}x${parseInt(imageClientRect.height)} `;\n\n resizer.append(dot1, dot2, dot3, dot4, dot5, dot6, dot7, dot8, position)\n\n const updateImage = (event, data) => {\n switch (event) {\n case 'update':\n image.style.width = data.width;\n image.style.height = data.height;\n break;\n case '100%':\n case '75%':\n case '50%':\n case 'auto':\n image.style.width = event;\n image.style.height = 'unset';\n break;\n case 'wrap-left':\n image.style.float = 'left';\n image.style.margin = '0 10px 10px 0';\n break;\n case 'wrap-right':\n image.style.float = 'right';\n image.style.margin = '0 0 10px 10px';\n break;\n case 'revert':\n image.style.width = 'unset';\n image.style.height = 'unset';\n image.style.float = 'none';\n image.style.margin = '';\n break;\n case 'delete':\n image.remove()\n destroyImageResizer(options, core)\n break;\n }\n const imageClientRect = image.getBoundingClientRect();\n resizer.style.width = imageClientRect.width + 'px';\n resizer.style.height = imageClientRect.height + 'px';\n resizer.style.top = imageClientRect.top + 'px';\n resizer.style.left = imageClientRect.left + 'px';\n position.textContent = `${parseInt(resizer.style.width)}x${parseInt(resizer.style.height)} `;\n }\n\n makeEditToolbar(options, core, { type, image, updateImage })\n\n core.elements.resizerImage = image\n core.elements.resizer = resizer\n core.elements.iframeWindow.body.appendChild(resizer)\n core.resizerHandler = (e) => updateImageResizerPosition(e, core);\n core.deleteImageHandler = (e) => {\n if (e.key === 'Backspace' || e.key === 'Delete') updateImage('delete')\n }\n core.elements.iframeWindow.addEventListener('scroll', core.resizerHandler)\n core.elements.iframeWindow.addEventListener('keydown', core.deleteImageHandler)\n}\n\nconst createPreviewModal = (src, core, options, isVideo = false) => {\n // Create overlay\n const overlay = document.createElement('div');\n overlay.className = `${options.classPrefix}${CLASSES.PREVIEW_MODAL_OVERLAY} `\n\n // Create modal content\n const modalContent = document.createElement('div');\n modalContent.className = `${options.classPrefix}${CLASSES.PREVIEW_MODAL_CONTENT} `\n\n // Close button\n const closeButton = document.createElement('span');\n closeButton.className = `${options.classPrefix}${CLASSES.PREVIEW_MODAL_CLOSE} `\n closeButton.innerHTML = SVG.CLOSE;\n closeButton.onclick = () => overlay.remove();\n\n // Create modal body\n const modalBody = document.createElement('div');\n modalBody.className = `${options.classPrefix}${CLASSES.PREVIEW_MODAL_BODY} `\n\n let element;\n if (isVideo) {\n element = document.createElement('video');\n element.src = src;\n element.controls = true;\n element.style.maxWidth = '100%';\n element.style.maxHeight = '100%';\n element.setAttribute('controlsList', 'nodownload');\n element.setAttribute('disablePictureInPicture', true);\n } else {\n element = document.createElement('img');\n element.src = src;\n element.alt = 'Preview Image';\n }\n\n modalBody.appendChild(element);\n modalContent.append(closeButton, modalBody);\n overlay.appendChild(modalContent);\n\n // Append to body\n document.body.appendChild(overlay);\n\n overlay.addEventListener('click', (event) => {\n if (event.target !== element) {\n overlay.remove();\n }\n });\n // Show modal\n setTimeout(() => {\n overlay.classList.add('active');\n }, 10);\n}\n\nconst updateImageResizerPosition = (e, core) => {\n const imageClientRect = core.elements.resizerImage.getBoundingClientRect();\n core.elements.resizer.style.width = imageClientRect.width + 'px';\n core.elements.resizer.style.height = imageClientRect.height + 'px';\n core.elements.resizer.style.top = imageClientRect.top + 'px';\n core.elements.resizer.style.left = imageClientRect.left + 'px';\n}\n\nconst destroyImageResizer = (options, core) => {\n if (!options.disabled) changeAllToolbarState(core, 'enabled')\n if (core.elements.resizerPlugin) core.elements.toolbarContainer.removeChild(core.elements.resizerPlugin)\n if (core.elements.resizer) core.elements.iframeWindow.body.removeChild(core.elements.resizer)\n core.elements.iframeWindow.removeEventListener('scroll', core.resizerHandler, false)\n core.elements.iframeWindow.removeEventListener('scroll', core.deleteImageHandler, false)\n core.elements.iframeWindow.removeEventListener('keydown', core.deleteImageHandler, false)\n delete core.elements.resizer\n delete core.resizerHandler\n delete core.deleteImageHandler\n delete core.elements.resizerImage\n delete core.elements.resizerPlugin\n}\n\nconst getTableGrid = (table) => {\n const grid = [];\n const rows = table.rows;\n for (let r = 0; r < rows.length; r++) {\n if (!grid[r]) grid[r] = [];\n const row = rows[r];\n let colIndex = 0;\n for (let c = 0; c < row.cells.length; c++) {\n const cell = row.cells[c];\n // Skip occupied cells\n while (grid[r][colIndex]) colIndex++;\n\n const rowspan = cell.rowSpan || 1;\n const colspan = cell.colSpan || 1;\n\n for (let rs = 0; rs < rowspan; rs++) {\n for (let cs = 0; cs < colspan; cs++) {\n if (!grid[r + rs]) grid[r + rs] = [];\n grid[r + rs][colIndex + cs] = cell;\n }\n }\n colIndex += colspan;\n }\n }\n return grid;\n}\n\nconst getCellPosition = (grid, cell) => {\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c] === cell) return { r, c };\n }\n }\n return null;\n}\n\nconst initTableEditPlugin = (td, options, core) => {\n destroyTableEditPlugin(options, core)\n const table = td.closest('table');\n if (!table) return\n\n const tableClientRect = table.getBoundingClientRect();\n let firstX, firstY;\n\n const handleColumnResizeMouseMove = (e) => {\n const cell = e.target.closest('th, td');\n if (!cell) return;\n\n const rect = cell.getBoundingClientRect();\n const isNearRightEdge =\n rect.right - e.clientX <= RESIZE_MARGIN;\n\n table.style.cursor = isNearRightEdge ? 'col-resize' : 'default';\n };\n\n const handleColumnResizeMouseDown = (e) => {\n const isTouch = e.type === 'touchstart';\n const clientX = isTouch ? e.touches[0].clientX : e.clientX;\n\n if (!isTouch && table.style.cursor !== 'col-resize') return;\n const target = e.target.closest('td, th');\n if (!target) return;\n\n if (isTouch) {\n const rect = target.getBoundingClientRect();\n const isNearRightEdge = rect.right - clientX <= RESIZE_MARGIN;\n if (!isNearRightEdge) return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n\n const startX = clientX;\n\n const firstRowCells = Array.from(table.rows[0].cells);\n firstRowCells.forEach(cell => {\n cell.style.width = cell.getBoundingClientRect().width + 'px';\n });\n\n const targetRect = target.getBoundingClientRect();\n const resizeTargetIndex = firstRowCells.findIndex(cell => Math.abs(cell.getBoundingClientRect().right - targetRect.right) < 5);\n\n if (resizeTargetIndex === -1) return;\n\n const resizeTarget = firstRowCells[resizeTargetIndex];\n const nextTarget = firstRowCells[resizeTargetIndex + 1];\n\n const startWidth = resizeTarget.getBoundingClientRect().width;\n const startNextWidth = nextTarget ? nextTarget.getBoundingClientRect().width : 0;\n const startTableWidth = table.getBoundingClientRect().width;\n\n const handleMouseMove = (event) => {\n const currentX = event.type === 'touchmove' ? event.touches[0].clientX : event.clientX;\n const diff = currentX - startX;\n\n if (nextTarget) {\n const minWidth = 30;\n const constrainedDiff = Math.min(Math.max(diff, minWidth - startWidth), startNextWidth - minWidth);\n resizeTarget.style.width = (startWidth + constrainedDiff) + 'px';\n nextTarget.style.width = (startNextWidth - constrainedDiff) + 'px';\n } else {\n const newWidth = Math.max(startWidth + diff, 30);\n const effectiveDiff = newWidth - startWidth;\n resizeTarget.style.width = newWidth + 'px';\n table.style.width = (startTableWidth + effectiveDiff) + 'px';\n }\n core.elements.iframeWindow.body.style.cursor = 'col-resize';\n };\n\n const handleMouseUp = () => {\n core.elements.iframeWindow.body.style.cursor = '';\n core.elements.iframeWindow.removeEventListener('mousemove', handleMouseMove);\n core.elements.iframeWindow.removeEventListener('mouseup', handleMouseUp);\n core.elements.iframeWindow.removeEventListener('touchmove', handleMouseMove);\n core.elements.iframeWindow.removeEventListener('touchend', handleMouseUp);\n };\n\n core.elements.iframeWindow.addEventListener('mousemove', handleMouseMove);\n core.elements.iframeWindow.addEventListener('mouseup', handleMouseUp);\n core.elements.iframeWindow.addEventListener('touchmove', handleMouseMove);\n core.elements.iframeWindow.addEventListener('touchend', handleMouseUp);\n };\n\n table.addEventListener('mousemove', handleColumnResizeMouseMove);\n table.addEventListener('mousedown', handleColumnResizeMouseDown);\n table.addEventListener('touchstart', handleColumnResizeMouseDown);\n\n core.tableColumnResizeHandlers = {\n mousemove: handleColumnResizeMouseMove,\n mousedown: handleColumnResizeMouseDown,\n touchstart: handleColumnResizeMouseDown\n };\n\n const handleMouseDown = (e) => {\n firstX = e.clientX || e.touches[0].clientX;\n firstY = e.clientY || e.touches[0].clientY;\n\n core.elements.iframeWindow.addEventListener('mousemove', handleMouseMove)\n core.elements.iframeWindow.addEventListener('mouseup', handleMouseUp)\n core.elements.iframeWindow.addEventListener('touchmove', handleMouseMove)\n core.elements.iframeWindow.addEventListener('touchend', handleMouseUp)\n }\n\n const handleMouseMove = (e) => {\n // Calculate the new dimensions\n const distanceX = (e.clientX || e.touches[0].clientX) - firstX\n const distanceY = (e.clientY || e.touches[0].clientY) - firstY\n const width = tableClientRect.width + distanceX;\n const height = tableClientRect.height + distanceY;\n\n table.style.width = width + 'px';\n table.style.height = height + 'px';\n }\n\n const handleMouseUp = (e) => {\n core.elements.iframeWindow.removeEventListener('mousemove', handleMouseMove, false)\n core.elements.iframeWindow.removeEventListener('mouseup', handleMouseUp, false)\n core.elements.iframeWindow.removeEventListener('touchmove', handleMouseMove, false)\n core.elements.iframeWindow.removeEventListener('touchend', handleMouseUp, false)\n }\n\n const updateTable = (event, value) => {\n const rowIndex = td.parentElement.rowIndex;\n const cellIndex = td.cellIndex;\n const colCount = table.rows[0].cells.length; // Number of columns in the table\n\n const addCellWithBorder = (row, index) => {\n const newCell = row.insertCell(index);\n newCell.innerHTML = '\\u00A0'; // Add content (empty for now)\n newCell.style.border = '1px solid black'; // Set the border\n }\n\n // Helper function to toggle border between 'none' and '1px solid black'\n const toggleBorder = (cell, side) => {\n if (cell) {\n const currentBorder = cell.style[side];\n cell.style[side] = ['none', 'medium', 'medium none', '0px none rgb(0, 0, 0)'].includes(currentBorder) ? '1px solid black' : 'none';\n }\n };\n\n // Helper function to check if the table has no rows and remove the table if needed\n const checkAndRemoveTable = () => {\n if (table.rows.length === 0) {\n table.remove();\n }\n };\n\n switch (event) {\n case 'insert-row-above': {\n const newRow = table.insertRow(rowIndex); // Insert row above\n for (let i = 0; i < colCount; i++) {\n addCellWithBorder(newRow, i); // Add proper <td> cells with border\n }\n break;\n }\n case 'insert-row-below': {\n const newRow = table.insertRow(rowIndex + 1); // Insert row below\n for (let i = 0; i < colCount; i++) {\n addCellWithBorder(newRow, i); // Add proper <td> cells with border\n }\n break;\n }\n case 'delete-row': {\n table.deleteRow(rowIndex); // Delete the row\n destroyTableEditPlugin(options, core)\n checkAndRemoveTable()\n break;\n }\n case 'merge-cell-right': {\n const grid = getTableGrid(table);\n const pos = getCellPosition(grid, td);\n if (!pos) break;\n const { r, c } = pos;\n const targetCell = grid[r][c + (td.colSpan || 1)];\n\n if (targetCell && targetCell !== td &&\n (targetCell.rowSpan || 1) === (td.rowSpan || 1) &&\n getCellPosition(grid, targetCell).r === r\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML += '<br/>' + targetCell.innerHTML;\n }\n td.colSpan = (td.colSpan || 1) + (targetCell.colSpan || 1);\n targetCell.remove();\n }\n break;\n }\n case 'merge-cell-left': {\n const grid = getTableGrid(table);\n const pos = getCellPosition(grid, td);\n if (!pos) break;\n const { r, c } = pos;\n if (c === 0) break;\n const targetCell = grid[r][c - 1];\n\n if (targetCell && targetCell !== td &&\n (targetCell.rowSpan || 1) === (td.rowSpan || 1) &&\n getCellPosition(grid, targetCell).r === r\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML = targetCell.innerHTML + '<br/>' + td.innerHTML;\n }\n td.colSpan = (td.colSpan || 1) + (targetCell.colSpan || 1);\n targetCell.parentNode.insertBefore(td, targetCell);\n targetCell.remove();\n }\n break;\n }\n case 'merge-cell-down': {\n const grid = getTableGrid(table);\n const pos = getCellPosition(grid, td);\n if (!pos) break;\n const { r, c } = pos;\n const targetRowIdx = r + (td.rowSpan || 1);\n if (targetRowIdx >= grid.length) break;\n const targetCell = grid[targetRowIdx][c];\n\n if (targetCell && targetCell !== td &&\n (targetCell.colSpan || 1) === (td.colSpan || 1) &&\n getCellPosition(grid, targetCell).c === c\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML += '<br/>' + targetCell.innerHTML;\n }\n td.rowSpan = (td.rowSpan || 1) + (targetCell.rowSpan || 1);\n targetCell.remove();\n }\n break;\n }\n case 'merge-cell-up': {\n const grid = getTableGrid(table);\n const pos = getCellPosition(grid, td);\n if (!pos) break;\n const { r, c } = pos;\n if (r === 0) break;\n const targetCell = grid[r - 1][c];\n\n if (targetCell && targetCell !== td &&\n (targetCell.colSpan || 1) === (td.colSpan || 1) &&\n getCellPosition(grid, targetCell).c === c\n ) {\n if (targetCell.innerHTML.trim() !== '') {\n td.innerHTML = targetCell.innerHTML + '<br/>' + td.innerHTML;\n }\n td.rowSpan = (td.rowSpan || 1) + (targetCell.rowSpan || 1);\n targetCell.parentNode.insertBefore(td, targetCell);\n targetCell.remove();\n }\n break;\n }\n case 'insert-column-left': {\n for (const element of table.rows) {\n const row = element;\n addCellWithBorder(row, cellIndex); // Add a new <td> with border to the left\n }\n break;\n }\n case 'insert-column-right': {\n for (const element of table.rows) {\n const row = element;\n addCellWithBorder(row, cellIndex + 1); // Add a new <td> with border to the right\n }\n break;\n }\n case 'delete-column': {\n for (const element of table.rows) {\n element.deleteCell(cellIndex); // Delete the cell at the current index\n }\n checkAndRemoveTable()\n destroyTableEditPlugin(options, core)\n break;\n }\n case 'split-cell-vertical': {\n const colspan = td.colSpan || 1;\n if (colspan > 1) {\n td.colSpan = colspan - 1;\n const newCell = td.parentNode.insertCell(td.cellIndex + 1);\n newCell.innerHTML = '\\u00A0';\n newCell.style.border = td.style.border;\n newCell.rowSpan = td.rowSpan;\n }\n break;\n }\n case 'split-cell-horizontal': {\n const rowspan = td.rowSpan || 1;\n if (rowspan > 1) {\n td.rowSpan = rowspan - 1;\n const grid = getTableGrid(table);\n const pos = getCellPosition(grid, td);\n const { r, c } = pos;\n const nextRowIdx = r + rowspan - 1;\n const nextRow = table.rows[nextRowIdx];\n let insertIndex = 0;\n for (let i = 0; i < nextRow.cells.length; i++) {\n const cell = nextRow.cells[i];\n const cellPos = getCellPosition(grid, cell);\n if (cellPos.c < c) insertIndex++;\n else break;\n }\n\n const newCell = nextRow.insertCell(insertIndex);\n newCell.innerHTML = '\\u00A0';\n newCell.style.border = td.style.border;\n newCell.colSpan = td.colSpan;\n }\n break;\n }\n case 'align-left': {\n table.style.marginLeft = '0';\n table.style.marginRight = 'auto';\n break;\n }\n case 'align-center': {\n table.style.marginLeft = 'auto';\n table.style.marginRight = 'auto';\n break;\n }\n case 'align-right': {\n table.style.marginLeft = 'auto';\n table.style.marginRight = '0';\n break;\n }\n case 'cell-border-top': {\n toggleBorder(td, 'borderTop');\n if (rowIndex > 0) {\n const aboveCell = table.rows[rowIndex - 1].cells[cellIndex];\n toggleBorder(aboveCell, 'borderBottom');\n }\n break;\n }\n case 'cell-border-right': {\n toggleBorder(td, 'borderRight');\n if (cellIndex < table.rows[rowIndex].cells.length - 1) {\n const rightCell = table.rows[rowIndex].cells[cellIndex + 1];\n toggleBorder(rightCell, 'borderLeft');\n }\n break;\n }\n case 'cell-border-bottom': {\n toggleBorder(td, 'borderBottom');\n if (rowIndex < table.rows.length - 1) {\n const belowCell = table.rows[rowIndex + 1].cells[cellIndex];\n toggleBorder(belowCell, 'borderTop');\n }\n break;\n }\n case 'cell-border-left': {\n toggleBorder(td, 'borderLeft');\n if (cellIndex > 0) {\n const leftCell = table.rows[rowIndex].cells[cellIndex - 1];\n toggleBorder(leftCell, 'borderRight');\n }\n break;\n }\n case 'cell-border-full': {\n td.style.border = '1px solid black';\n // Handle top neighbor\n if (rowIndex > 0) {\n if (table.rows[rowIndex - 1].cells[cellIndex])\n table.rows[rowIndex - 1].cells[cellIndex].style.borderBottom = '1px solid black';\n }\n\n // Handle bottom neighbor\n if (rowIndex < table.rows.length - 1) {\n if (table.rows[rowIndex + 1].cells[cellIndex])\n table.rows[rowIndex + 1].cells[cellIndex].style.borderTop = '1px solid black';\n }\n\n // Handle left neighbor\n if (cellIndex > 0) {\n if (table.rows[rowIndex].cells[cellIndex - 1])\n table.rows[rowIndex].cells[cellIndex - 1].style.borderRight = '1px solid black';\n }\n\n // Handle right neighbor\n if (cellIndex < table.rows[rowIndex].cells.length - 1) {\n if (table.rows[rowIndex].cells[cellIndex + 1])\n table.rows[rowIndex].cells[cellIndex + 1].style.borderLeft = '1px solid black';\n }\n break;\n }\n case 'cell-border-none': {\n // Remove all borders from the current cell\n td.style.border = 'none';\n\n // Handle top neighbor\n if (rowIndex > 0) {\n if (table.rows[rowIndex - 1].cells[cellIndex])\n table.rows[rowIndex - 1].cells[cellIndex].style.borderBottom = 'none';\n }\n\n // Handle bottom neighbor\n if (rowIndex < table.rows.length - 1) {\n if (table.rows[rowIndex + 1].cells[cellIndex])\n table.rows[rowIndex + 1].cells[cellIndex].style.borderTop = 'none';\n }\n\n // Handle left neighbor\n if (cellIndex > 0) {\n if (table.rows[rowIndex].cells[cellIndex - 1])\n table.rows[rowIndex].cells[cellIndex - 1].style.borderRight = 'none';\n }\n\n // Handle right neighbor\n if (cellIndex < table.rows[rowIndex].cells.length - 1) {\n if (table.rows[rowIndex].cells[cellIndex + 1])\n table.rows[rowIndex].cells[cellIndex + 1].style.borderLeft = 'none';\n }\n break;\n }\n case 'fixed-column-width': {\n if (table.style.tableLayout === 'fixed') {\n table.style.tableLayout = 'auto';\n } else {\n table.style.tableLayout = 'fixed';\n table.style.wordBreak = 'break-all'\n }\n break;\n }\n case 'border-color': {\n td.style.borderColor = value;\n\n // Handle top neighbor\n if (rowIndex > 0) {\n if (table.rows[rowIndex - 1].cells[cellIndex])\n table.rows[rowIndex - 1].cells[cellIndex].style.borderBottomColor = value;\n }\n\n // Handle bottom neighbor\n if (rowIndex < table.rows.length - 1) {\n if (table.rows[rowIndex + 1].cells[cellIndex])\n table.rows[rowIndex + 1].cells[cellIndex].style.borderTopColor = value;\n }\n\n // Handle left neighbor\n if (cellIndex > 0) {\n if (table.rows[rowIndex].cells[cellIndex - 1])\n table.rows[rowIndex].cells[cellIndex - 1].style.borderRightColor = value;\n }\n\n // Handle right neighbor\n if (cellIndex < table.rows[rowIndex].cells.length - 1) {\n if (table.rows[rowIndex].cells[cellIndex + 1])\n table.rows[rowIndex].cells[cellIndex + 1].style.borderLeftColor = value;\n }\n break;\n }\n case 'background-color': {\n td.style.backgroundColor = value;\n break;\n }\n case 'row-background-color': {\n const row = td.parentElement;\n for (let i = 0; i < row.cells.length; i++) {\n row.cells[i].style.backgroundColor = value;\n }\n break;\n }\n case 'column-background-color': {\n for (let r = 0; r < table.rows.length; r++) {\n const cell = table.rows[r].cells[cellIndex];\n if (cell) {\n cell.style.backgroundColor = value;\n }\n }\n break;\n }\n case 'cell-width': {\n for (let i = 0; i < table.rows.length; i++) {\n const cell = table.rows[i].cells[cellIndex];\n if (cell) cell.style.width = value;\n }\n break;\n }\n case 'cell-height': {\n td.parentElement.style.height = value;\n break;\n }\n case 'cell-padding': {\n td.style.padding = value;\n break;\n }\n\n }\n }\n\n makeEditToolbar(options, core, { type: 'td', td, updateTable })\n\n\n const resizer = document.createElement('div');\n resizer.className = `table-resizer`\n resizer.style.width = tableClientRect.width + 'px';\n resizer.style.height = tableClientRect.height + 'px';\n resizer.style.top = tableClientRect.top + 'px';\n resizer.style.left = tableClientRect.left + 'px';\n\n const resizerButton = document.createElement('button');\n resizerButton.className = `table-resizer-btn`\n resizerButton.style.top = tableClientRect.bottom - 6 + 'px';\n resizerButton.style.left = tableClientRect.right - 6 + 'px';\n resizerButton.addEventListener('mousedown', handleMouseDown)\n resizerButton.addEventListener('touchstart', handleMouseDown)\n\n resizer.appendChild(resizerButton)\n\n core.elements.table = table\n core.elements.tableResizer = resizer\n core.elements.tableResizerBtn = resizerButton\n core.resizerHandler = (e) => updateTableResizerPosition(options, core);\n core.elements.iframeWindow.addEventListener('scroll', core.resizerHandler)\n core.elements.iframeWindow.body.appendChild(resizer)\n}\n\nconst updateTableResizerPosition = (options, core) => {\n if (core.elements.tableResizerBtn) {\n if (!core.elements.editor.contains(core.elements.table)) return destroyTableEditPlugin(options, core)\n const tableClientRect = core.elements.table.getBoundingClientRect();\n core.elements.tableResizer.style.width = tableClientRect.width + 'px';\n core.elements.tableResizer.style.height = tableClientRect.height + 'px';\n core.elements.tableResizer.style.top = tableClientRect.top + 'px';\n core.elements.tableResizer.style.left = tableClientRect.left + 'px';\n core.elements.tableResizerBtn.style.top = tableClientRect.bottom - 6 + 'px';\n core.elements.tableResizerBtn.style.left = tableClientRect.right - 6 + 'px';\n }\n}\n\nconst destroyTableEditPlugin = (options, core) => {\n if (core.elements.table && core.tableColumnResizeHandlers) {\n core.elements.table.removeEventListener('mousemove', core.tableColumnResizeHandlers.mousemove);\n core.elements.table.removeEventListener('mousedown', core.tableColumnResizeHandlers.mousedown);\n core.elements.table.removeEventListener('touchstart', core.tableColumnResizeHandlers.touchstart);\n core.elements.table.style.cursor = '';\n delete core.tableColumnResizeHandlers;\n }\n if (core.elements.resizerPlugin) core.elements.toolbarContainer.removeChild(core.elements.resizerPlugin)\n if (core.elements.tableResizer) core.elements.iframeWindow.body.removeChild(core.elements.tableResizer)\n core.elements.iframeWindow.removeEventListener('scroll', core.resizerHandler, false)\n delete core.elements.resizerPlugin\n delete core.resizerHandler\n delete core.elements.table\n delete core.elements.tableResizer\n delete core.elements.tableResizerBtn\n}\n\nconst changeToolbarStatByPlugin = (plugin, action, value) => {\n switch (action) {\n case 'disabled':\n if (plugin.getAttribute('data-type') === 'button') {\n plugin.disabled = true\n plugin.classList.add('disabled')\n } else if (plugin.getAttribute('data-type') === 'dropdown' || plugin.getAttribute('data-type') === 'select') {\n plugin.childNodes[0].disabled = true\n plugin.childNodes[0].classList.add('disabled')\n } else if (plugin.getAttribute('data-type') === 'color') {\n plugin.childNodes[0].disabled = true\n plugin.classList.add('disabled')\n } else if (plugin.getAttribute('data-type') === 'button-select') {\n plugin.querySelectorAll('button').forEach(btn => {\n btn.disabled = true\n btn.classList.add('disabled')\n })\n }\n break;\n case 'enabled':\n if (plugin.getAttribute('data-type') === 'button') {\n plugin.disabled = false\n plugin.classList.remove('disabled')\n } else if (plugin.getAttribute('data-type') === 'dropdown' || plugin.getAttribute('data-type') === 'select') {\n plugin.childNodes[0].disabled = false\n plugin.childNodes[0].classList.remove('disabled')\n } else if (plugin.getAttribute('data-type') === 'color') {\n plugin.childNodes[0].disabled = false\n plugin.classList.remove('disabled')\n } else if (plugin.getAttribute('data-type') === 'button-select') {\n plugin.querySelectorAll('button').forEach(btn => {\n btn.disabled = false\n btn.classList.remove('disabled')\n })\n }\n break;\n case 'active':\n if (plugin.getAttribute('data-type') === 'button') {\n plugin.classList.add('active')\n } else if (plugin.getAttribute('data-type') === 'dropdown' || plugin.getAttribute('data-type') === 'select') {\n plugin.childNodes[0].classList.add('active')\n } else if (plugin.getAttribute('data-type') === 'color') {\n plugin.classList.add('active')\n } else if (plugin.getAttribute('data-type') === 'button-select') {\n plugin.querySelector('button[data-type=\"button\"]')?.classList.add('active')\n }\n break;\n case 'inactive':\n if (plugin.getAttribute('data-type') === 'button') {\n plugin.classList.remove('active')\n } else if (plugin.getAttribute('data-type') === 'dropdown' || plugin.getAttribute('data-type') === 'select') {\n plugin.childNodes[0].classList.remove('active')\n } else if (plugin.getAttribute('data-type') === 'color') {\n plugin.classList.remove('active')\n } else if (plugin.getAttribute('data-type') === 'button-select') {\n plugin.querySelector('button[data-type=\"button\"]')?.classList.remove('active')\n }\n break;\n case 'font':\n plugin.childNodes[0].childNodes[0].childNodes[0].innerHTML = FONTS[value] ? FONTS[value] : value ? value : 'Font'\n break;\n case 'font-size':\n plugin.childNodes[0].childNodes[0].childNodes[0].innerHTML = FONT_SIZES[value] ? FONT_SIZES[value] : value ? value : 'Font-Size'\n break;\n case 'format-block':\n plugin.childNodes[0].childNodes[0].childNodes[0].innerHTML = FORMATS[value] ?? 'Format'\n break;\n case 'font_color':\n plugin.childNodes[0].value = value || '#000000'\n break;\n case 'highlight_color':\n plugin.childNodes[0].value = value || '#ffffff'\n break;\n case 'icon':\n plugin.innerHTML = value\n }\n}\n\nconst changeAllToolbarState = (core, action, preventPlugins = []) => {\n Object.keys(core.elements.toolbar).forEach(pluginName => {\n core.elements.toolbar[pluginName].forEach(plugin => {\n if (preventPlugins.includes(pluginName)) return\n changeToolbarStatByPlugin(plugin, action)\n })\n })\n}\n\nconst changeToolbarStateByName = (core, action, pluginNames = []) => {\n Object.keys(core.elements.toolbar).forEach(pluginName => {\n if (!pluginNames.includes(pluginName)) return\n core.elements.toolbar[pluginName].forEach(plugin => {\n changeToolbarStatByPlugin(plugin, action)\n })\n })\n}\n\nconst changeToolbarValueByName = (core, pluginName, value) => {\n core.elements.toolbar[pluginName]?.forEach(plugin => {\n changeToolbarStatByPlugin(plugin, pluginName, value)\n })\n}\n\nconst changeToolbarHtmlByName = (core, pluginName, value) => {\n core.elements.toolbar[pluginName]?.forEach(plugin => {\n changeToolbarStatByPlugin(plugin, 'icon', value)\n })\n}\n\nconst rgbToHex = (rgb) => {\n const rgbArray = rgb.match(/\\d+/g); // Extracts the numeric RGB values\n return `#${rgbArray.map(x => {\n const hex = parseInt(x).toString(16);\n return hex.length === 1 ? '0' + hex : hex; // Pads with 0 if needed\n }).join('')\n } `.slice(0, 7);\n};\n\nconst extractSocialMediaId = (url) => {\n for (const platform in SOCIAL_MEDIA_PATTERNS) {\n const match = url.match(SOCIAL_MEDIA_PATTERNS[platform]);\n if (match) {\n\n return { platform, id: match[1] };\n }\n }\n\n return { platform: null, id: null };\n};\n\nconst constructEmbedUrl = (platform, id) => {\n if (!SOCIAL_MEDIA_BASEURLS[platform] || !id) return null;\n const parentDomain = window.location.hostname;\n switch (platform) {\n case \"INSTAGRAM\":\n case \"THREADS\":\n return `${SOCIAL_MEDIA_BASEURLS[platform]}${id}/embed`;\n case \"REDDIT\":\n return `${SOCIAL_MEDIA_BASEURLS[platform]}${id}/?ref_source=embed&ref=share`;\n case \"TWITCH\":\n case \"TWITCH_CHANNEL\":\n return `${SOCIAL_MEDIA_BASEURLS[platform]}${id}&parent=${parentDomain}&autoplay=false&time=0h0m0s`\n default:\n return `${SOCIAL_MEDIA_BASEURLS[platform]}${id}`;\n }\n};\n\nconst showAnchorPopover = (element, x, y, options, core) => {\n let href = element.getAttribute(\"href\");\n\n // Create popover container\n let popover = document.createElement(\"div\");\n popover.id = \"anchor-popover\";\n popover.style.position = \"absolute\";\n popover.style.top = \"0\";\n popover.style.left = \"0\";\n popover.style.padding = \"8px\";\n popover.style.background = \"white\";\n popover.style.border = \"1px solid #ccc\";\n popover.style.borderRadius = \"6px\";\n popover.style.boxShadow = \"0px 4px 8px rgba(0,0,0,0.2)\";\n popover.style.zIndex = \"1000\";\n popover.style.display = \"flex\";\n popover.style.alignItems = \"center\";\n popover.style.gap = \"5px\";\n popover.style.whiteSpace = \"nowrap\";\n popover.style.maxWidth = \"300px\";\n popover.style.visibility = \"hidden\";\n\n // Create clickable link\n let linkDiv = document.createElement(\"div\");\n linkDiv.textContent = href;\n linkDiv.style.textDecoration = \"none\";\n linkDiv.style.color = \"#007bff\";\n linkDiv.style.padding = \"5px\";\n linkDiv.style.overflow = \"hidden\";\n linkDiv.style.textOverflow = \"ellipsis\";\n linkDiv.style.webkitBoxOrient = \"vertical\";\n linkDiv.style.webkitLineClamp = \"1\";\n linkDiv.style.maxWidth = \"250px\";\n linkDiv.style.wordBreak = \"break-word\";\n linkDiv.style.cursor = \"pointer\";\n linkDiv.onclick = () => core.onLinkClick(href);\n\n // Create Edit button\n let editButton = document.createElement(\"span\");\n editButton.innerHTML = SVG.EDIT_LINK;\n editButton.style.padding = \"5px\";\n editButton.title = \"Edit link\";\n editButton.onclick = (event) => editAnchorTag(event, core, options);\n\n // Create Copy button\n let copyButton = document.createElement(\"span\");\n copyButton.innerHTML = SVG.COPY_LINK;\n copyButton.style.padding = \"5px\";\n copyButton.title = \"Copy link\";\n copyButton.onclick = (event) => navigator.clipboard.writeText(href);\n\n // Create Delete button\n let deleteButton = document.createElement(\"span\");\n deleteButton.innerHTML = SVG.DELETE_LINK;\n deleteButton.style.padding = \"5px\";\n deleteButton.title = \"Remove link\";\n deleteButton.onclick = (event) => removeAnchorTag(event, element, core);\n\n // Append elements to popover\n popover.append(linkDiv, copyButton, editButton, deleteButton);\n\n let parent = core.elements.iframeWindow.body;\n parent.appendChild(popover);\n\n requestAnimationFrame(() => {\n let popoverRect = popover.getBoundingClientRect();\n let parentRect = parent.getBoundingClientRect();\n\n let scrollX = parent.scrollLeft;\n let scrollY = parent.scrollTop;\n\n let finalX = x + scrollX + 5;\n let finalY = y + scrollY + 5;\n\n let spaceRight = parentRect.right - x;\n let spaceLeft = x - parentRect.left;\n let spaceBelow = parentRect.bottom - y;\n let spaceAbove = y - parentRect.top;\n\n if (spaceBelow < popoverRect.height && spaceAbove >= popoverRect.height) {\n finalY = y + scrollY - popoverRect.height - 5;\n } else if (spaceBelow < popoverRect.height) {\n finalY = Math.max(0, y + scrollY - popoverRect.height);\n }\n\n if (spaceRight < popoverRect.width && spaceLeft >= popoverRect.width) {\n finalX = x + scrollX - popoverRect.width - 5;\n } else if (spaceRight < popoverRect.width) {\n finalX = Math.max(0, x + scrollX - popoverRect.width);\n }\n\n // Boundary safety\n finalX = Math.max(5, Math.min(finalX, parent.scrollWidth - popoverRect.width - 5));\n finalY = Math.max(5, Math.min(finalY, parent.scrollHeight - popoverRect.height - 5));\n\n popover.style.left = `${finalX}px`;\n popover.style.top = `${finalY}px`;\n popover.style.visibility = \"visible\";\n });\n\n core.elements.anchorPopover = popover;\n\n const closePopover = (event) => {\n if (!popover.contains(event.target) || event.key === \"Escape\") {\n destroyAnchorPopover(core);\n document.removeEventListener(\"click\", closePopover);\n document.removeEventListener(\"keydown\", closePopover);\n document.removeEventListener(\"scroll\", closePopover, true);\n }\n };\n\n document.addEventListener(\"click\", closePopover);\n document.addEventListener(\"keydown\", closePopover);\n document.addEventListener(\"scroll\", closePopover, true);\n};\n\n\nconst editAnchorTag = (event, core, options) => {\n event.stopPropagation();\n\n if (!core.elements.selectedElement || core.elements.selectedElement.tagName !== \"A\") {\n console.warn(\"No anchor tag selected for editing.\");\n return;\n }\n\n const anchorElement = core.elements.selectedElement;\n let anchorLink = anchorElement.getAttribute(\"href\") || \"\";\n let anchorText = anchorElement.innerText || \"\";\n\n const body = document.createElement(\"div\");\n\n const linkLabel = document.createElement(\"label\");\n linkLabel.innerText = \"Link\";\n linkLabel.style.display = \"block\";\n linkLabel.style.paddingLeft = \"4px\";\n\n // Link Input\n const inputLink = document.createElement(\"input\");\n inputLink.value = anchorLink;\n inputLink.type = \"text\";\n inputLink.placeholder = \"Insert link, mail, phone no\";\n\n const textLabel = document.createElement(\"label\");\n textLabel.innerText = \"Link Text\";\n textLabel.style.display = \"block\";\n textLabel.style.marginTop = \"8px\";\n textLabel.style.paddingLeft = \"4px\";\n\n // Text Input\n const inputText = document.createElement(\"input\");\n inputText.value = anchorText;\n inputText.type = \"text\";\n inputText.placeholder = \"Link text\";\n\n const span = document.createElement(\"span\");\n span.className = \"warning\";\n\n body.append(linkLabel, inputLink, span, textLabel, inputText);\n\n // Footer (Buttons)\n const footer = document.createElement(\"div\");\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"submit\";\n button.innerText = \"Update\";\n\n footer.append(button);\n\n // Open Modal\n const modal = openModal(\n {\n title: \"Edit Link\",\n bodyNode: body,\n footerNode: footer,\n },\n core,\n options\n );\n\n inputLink.focus();\n\n // Handle Enter Key Submission\n const onInputKeydown = (event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n button.click();\n }\n };\n\n inputLink.addEventListener(\"keydown\", onInputKeydown);\n inputText.addEventListener(\"keydown\", onInputKeydown);\n\n // Button Click Logic\n button.onclick = () => {\n const newLink = inputLink.value.trim();\n const newText = inputText.value.trim();\n\n if (REGEX.URL.test(newLink)) {\n anchorElement.setAttribute(\"href\", newLink);\n anchorElement.innerText = newText || newLink;\n modal.close();\n } else {\n span.innerText = \"Invalid URL\";\n }\n };\n destroyAnchorPopover(core);\n core.updateCaretPosition();\n};\n\nconst removeAnchorTag = (event, element, core) => {\n event.stopPropagation();\n const anchorContent = core.elements.selectedElement.innerHTML;\n core.elements.selectedElement.outerHTML = anchorContent;\n\n destroyAnchorPopover(core);\n};\n\nconst destroyAnchorPopover = (core) => {\n if (core.elements.anchorPopover) {\n core.elements.anchorPopover.style.display = \"none\"\n delete core.elements.anchorPopover;\n }\n\n};\n\nfunction getCharIndex(root, node, offset) {\n const range = document.createRange();\n range.selectNodeContents(root);\n range.setEnd(node, offset);\n return range.toString().length;\n}\n\nconst getNodeAndOffsetFromIndex = (root, index) => {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false);\n let currentNode, currentIndex = 0;\n\n while ((currentNode = walker.nextNode())) {\n const len = currentNode.textContent.length;\n if (currentIndex + len >= index) {\n return { node: currentNode, offset: index - currentIndex };\n }\n currentIndex += len;\n }\n\n return null;\n}\n\nconst getTightClientRects = (root, range) => {\n const rects = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, null, false);\n\n let node;\n while ((node = walker.nextNode())) {\n // For each text node, check if it overlaps our range\n const nodeRange = document.createRange();\n nodeRange.selectNodeContents(node);\n\n // If nodeRange and range do not intersect, skip\n if (\n range.compareBoundaryPoints(Range.END_TO_START, nodeRange) >= 0 ||\n range.compareBoundaryPoints(Range.START_TO_END, nodeRange) <= 0\n ) {\n continue;\n }\n\n // Compute the overlap offsets:\n const startOffset = node === range.startContainer\n ? range.startOffset\n : 0;\n const endOffset = node === range.endContainer\n ? range.endOffset\n : node.textContent.length;\n\n // Create a sub-range just for that text node’s overlap\n const subRange = document.createRange();\n subRange.setStart(node, startOffset);\n subRange.setEnd(node, endOffset);\n\n // Gather the tight bounding rect(s) for that fragment\n Array.from(subRange.getClientRects()).forEach(r => rects.push(r));\n\n subRange.detach();\n }\n\n return rects;\n}\n\n/**\n * Draws highlight overlays behind exactly the text selected in `range`.\n * - `editor` is the contenteditable container (positioned ancestor).\n * - `color` is a CSS color (e.g. \"#ff0000\")—we’ll add “33” alpha for a translucent fill.\n */\nconst highlightTextRange = (editor, range, color, overlayContainer) => {\n const containerRect = overlayContainer.getBoundingClientRect();\n\n // 1. Get all tight rectangles for only the text portions\n const tightRects = getTightClientRects(editor, range);\n\n // 2. Draw a div behind each rect\n tightRects.forEach(rect => {\n const highlight = document.createElement('div');\n highlight.style.position = 'absolute';\n highlight.style.left = `${rect.left - containerRect.left}px`;\n highlight.style.top = `${rect.top - containerRect.top}px`;\n highlight.style.width = rect.width + 'px';\n highlight.style.height = rect.height + 'px';\n highlight.style.background = color + '33'; // add alpha for translucency\n overlayContainer.appendChild(highlight);\n });\n}\n\nconst showRemoteCursor = (core, user, data) => {\n const { id, color, name } = user\n const { startIndex, endIndex, cursorIndex, isCollapsed } = data;\n\n core.state.remoteCursors = core.state.remoteCursors || {}\n core.state.remoteCursors[user.id] = { user, data }\n \n const editor = core.elements.editor;\n const overlayContainer = core.elements.editorCursor; // Where overlays go\n\n if (!editor || !overlayContainer) return;\n\n // Remove old overlay (scoped to the correct container)\n const oldOverlay = overlayContainer.querySelector(`#remote-overlay-${id}`);\n if (oldOverlay) oldOverlay.remove();\n\n const overlay = document.createElement('div');\n overlay.id = `remote-overlay-${id}`;\n overlay.style.position = 'absolute';\n overlay.style.pointerEvents = 'none';\n\n if (!isCollapsed) {\n const range = document.createRange();\n\n const startNodeInfo = getNodeAndOffsetFromIndex(editor, startIndex);\n const endNodeInfo = getNodeAndOffsetFromIndex(editor, endIndex);\n\n range.setStart(startNodeInfo.node, startNodeInfo.offset);\n range.setEnd(endNodeInfo.node, endNodeInfo.offset);\n\n highlightTextRange(editor, range, color, overlay);\n\n }\n\n // Create a caret div to indicate cursor position\n if (typeof cursorIndex === 'number') {\n if (editor.innerText.trim() === '') {\n editor.innerHTML = '<div>\\u200B</div>';\n }\n const cursorNodeInfo = getNodeAndOffsetFromIndex(editor, cursorIndex);\n if (!cursorNodeInfo) return;\n\n const cursorRange = document.createRange();\n cursorRange.setStart(cursorNodeInfo.node, cursorNodeInfo.offset);\n cursorRange.collapse(true);\n\n const containerRect = overlayContainer.getBoundingClientRect();\n const cursorRect = cursorRange.getBoundingClientRect();\n\n const left = cursorRect.left - containerRect.left + overlayContainer.scrollLeft;\n const top = cursorRect.top - containerRect.top + overlayContainer.scrollTop;\n\n const cursor = document.createElement('div');\n cursor.style.position = 'absolute';\n cursor.style.left = `${left}px`;\n cursor.style.top = `${top}px`;\n cursor.style.width = '2px';\n cursor.style.height = cursorRect.height + 'px';\n cursor.style.backgroundColor = color;\n cursor.style.borderRadius = '1px';\n\n const label = document.createElement('div')\n label.style.fontSize = '12px'\n label.style.color = 'white';\n label.style.backgroundColor = color;\n label.style.borderRadius = '4px 4px 0 0'\n label.style.padding = '0 4px'\n label.style.position = 'absolute';\n label.style.whiteSpace = 'nowrap';\n label.style.left = `${left}px`;\n label.style.top = `${top - 10}px`;\n label.innerText = name\n\n overlay.appendChild(label);\n overlay.appendChild(cursor);\n }\n overlayContainer.appendChild(overlay);\n}\n\nconst updateCursorPosition = (core, editorRef) => {\n const editor = core.elements.editor;\n const selection = core.elements.iframeWindow.getSelection(); // Use iframe's window\n if (!selection || !editor || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n if (!editor.contains(range.startContainer) || !editor.contains(range.endContainer)) return;\n\n // Helper to get character index from start of editor to a container+offset\n const getCharIndex = (container, offset) => {\n const tempRange = core.elements.iframeWindow.createRange();\n tempRange.selectNodeContents(editor);\n tempRange.setEnd(container, offset);\n return tempRange.toString().length;\n }\n\n const start = getCharIndex(range.startContainer, range.startOffset);\n const end = getCharIndex(range.endContainer, range.endOffset);\n\n const isBackward = (() => {\n const position = selection.anchorNode.compareDocumentPosition(selection.focusNode);\n if (position === 0) {\n return selection.anchorOffset > selection.focusOffset;\n }\n return position === Node.DOCUMENT_POSITION_PRECEDING;\n })();\n\n const cursorIndex = isBackward ? start : end;\n\n core.cursor = {\n startIndex: start,\n endIndex: end,\n cursorIndex,\n isCollapsed: range.collapsed,\n };\n\n core.onLocalSyncChanges({\n type: 'cursor:open',\n cursor: core.cursor,\n tabId: core.state.currentTabId\n })\n}\n\nconst updateCursorPositionDebounce = asyncDebounce(updateCursorPosition, 200)\n\nconst syncRemoteChanges = (core) => {\n if (!core.state.previousDOM) core.state.previousDOM = core.elements.editor.cloneNode(true);\n\n const currentDOM = core.elements.editor.cloneNode(true);\n const diffs = dd.diff(core.state.previousDOM, currentDOM);\n\n if (diffs.length > 0) {\n core.onLocalSyncChanges({\n type: 'diff',\n diff: { diffs },\n tabId: core.state.currentTabId\n })\n core.state.previousDOM = currentDOM;\n }\n}\n\nconst syncRemoteChangesDebounce = debounce(syncRemoteChanges, 50)\n\nconst applyRemoteChanges = (core, diffs, targetElement = null) => {\n const editor = targetElement ?? core.elements.editor;\n\n const iframeWindow = core.elements.iframeWindow;\n if (!editor || !diffs?.diffs) return;\n\n const selection = iframeWindow.getSelection();\n let saved = null;\n\n if (!targetElement && selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n if (editor.contains(range.startContainer) && editor.contains(range.endContainer)) {\n // Save selection as indexes (pre-change)\n saved = {\n start: getCharIndex(editor, range.startContainer, range.startOffset),\n end: getCharIndex(editor, range.endContainer, range.endOffset),\n };\n }\n }\n requestAnimationFrame(() => {\n const filteredDiffs = diffs.diffs.filter(diff => !(diff.action === 'modifyAttribute' && ['contenteditable', 'spellcheck', 'class'].includes(diff.name)))\n dd.apply(editor, filteredDiffs);\n if (!targetElement) {\n core.state.previousDOM = editor.cloneNode(true);\n\n if (saved) {\n const newStart = getNodeAndOffsetFromIndex(editor, saved.start);\n const newEnd = getNodeAndOffsetFromIndex(editor, saved.end);\n if (newStart && newEnd) {\n const newRange = iframeWindow.createRange();\n newRange.setStart(newStart.node, newStart.offset);\n newRange.setEnd(newEnd.node, newEnd.offset);\n const sel = iframeWindow.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(newRange);\n }\n }\n } else {\n // No saved selection: place cursor at start of editor\n const range = iframeWindow.createRange();\n range.setStart(editor, 0);\n range.collapse(true);\n const sel = iframeWindow.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n }\n });\n}\n\nconst isLinkValid = (link) => {\n const trimmed = link.trim();\n\n const isURL = REGEX.URL.test(trimmed);\n const isMailto = REGEX.MAILTO.test(trimmed);\n const isTel = REGEX.TEL.test(trimmed);\n\n return isURL || isMailto || isTel;\n};\n\nconst formatLink = (value) => {\n const trimmed = value.trim();\n if (REGEX.EMAIL.test(trimmed)) {\n return 'mailto:' + trimmed;\n }\n if (REGEX.MOBILE.test(trimmed)) {\n return 'tel:' + trimmed;\n }\n return trimmed;\n};\n\nconst buildTributeValues = (labels = []) => {\n return labels.flatMap(category => ([\n { key: category.name, isCategory: true },\n ...category.fields.map(field => ({\n key: field.name,\n value: field.value,\n }))\n ]));\n};\n\nfunction toPx(value, el = document.body) {\n if (!value) return null;\n if (typeof value === 'number') return value;\n\n const tmp = document.createElement('div');\n tmp.style.width = value;\n tmp.style.position = 'absolute';\n tmp.style.visibility = 'hidden';\n el.appendChild(tmp);\n const px = tmp.getBoundingClientRect().width;\n tmp.remove();\n return px;\n}\n\nconst updateHeight = (core, options) => {\n if (options.autoHeight) {\n let h = core.elements.editor.scrollHeight;\n const minH = toPx(options.minHeight, core.elements.iframeContainer.parentElement);\n const maxH = toPx(options.maxHeight, core.elements.iframeContainer.parentElement);\n if (minH != null) h = Math.max(h, minH);\n if (maxH != null) h = Math.min(h, maxH);\n core.elements.iframeContainer.style.height = h + 'px';\n }\n}\n\nconst isInsideTableCell = (node) => {\n const element =\n node?.nodeType === Node.ELEMENT_NODE\n ? node\n : node?.parentElement;\n\n return element?.closest('td, th');\n};\n\nconst formatListItemContent = (li, tag) => {\n const formattedBlock = document.createElement(tag);\n const childNodes = Array.from(li.childNodes);\n\n childNodes.forEach(child => {\n if (child.nodeType === Node.ELEMENT_NODE && ['UL', 'OL'].includes(child.tagName)) return;\n formattedBlock.appendChild(child);\n });\n\n if (!formattedBlock.childNodes.length) formattedBlock.innerHTML = '<br>';\n\n const firstNestedList = Array.from(li.children).find(child => ['UL', 'OL'].includes(child.tagName));\n li.insertBefore(formattedBlock, firstNestedList || null);\n\n return formattedBlock;\n}\n\nconst applyFormatBlockInListItem = (core, tag) => {\n const selection = core.elements.iframeWindow.getSelection();\n const node = selection?.rangeCount ? selection.getRangeAt(0).startContainer : null;\n const element = node?.nodeType === Node.ELEMENT_NODE ? node : node?.parentElement;\n const li = element?.closest('li');\n\n if (!li || !core.elements.editor.contains(li)) return false;\n\n const currentBlock = element.closest(BLOCK_FORMAT_TAGS.join(','));\n const isCurrentBlockInLi = currentBlock && currentBlock.closest('li') === li;\n let formattedBlock;\n\n const placeCaretAtEnd = (core, element) => {\n const range = document.createRange();\n const selection = core.elements.iframeWindow.getSelection();\n\n range.selectNodeContents(element);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n if (tag === 'p') {\n if (isCurrentBlockInLi) {\n const fragment = document.createDocumentFragment();\n\n while (currentBlock.firstChild) fragment.appendChild(currentBlock.firstChild);\n\n li.insertBefore(fragment, currentBlock);\n currentBlock.remove();\n }\n placeCaretAtEnd(core, li);\n return true;\n }\n\n if (isCurrentBlockInLi) {\n formattedBlock = document.createElement(tag);\n formattedBlock.innerHTML = currentBlock.innerHTML || '<br>';\n currentBlock.replaceWith(formattedBlock);\n } else {\n formattedBlock = formatListItemContent(li, tag);\n }\n\n placeCaretAtEnd(core, formattedBlock);\n return true;\n}\n\nconst normalizeHeadingWrappedLists = (core) => {\n core.elements.editor.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach(heading => {\n const lists = Array.from(heading.children).filter(child => ['UL', 'OL'].includes(child.tagName));\n if (!lists.length) return;\n\n const headingTag = heading.tagName.toLowerCase();\n const fragment = document.createDocumentFragment();\n\n lists.forEach(list => {\n list.querySelectorAll('li').forEach(li => {\n const hasBlock = Array.from(li.children).some(child => BLOCK_FORMAT_TAGS.includes(child.tagName));\n if (!hasBlock) formatListItemContent(li, headingTag);\n });\n fragment.appendChild(list);\n });\n\n heading.parentNode.insertBefore(fragment, heading);\n\n if (heading.textContent.replace(/\\u200B/g, '').trim() || heading.querySelector('img, br')) {\n const paragraph = document.createElement('p');\n paragraph.innerHTML = heading.innerHTML;\n heading.replaceWith(paragraph);\n } else {\n heading.remove();\n }\n });\n}\n\nconst makeUnorderedList = (event, core) => {\n if (event.key !== ' ') return;\n\n core.updateCaretPosition();\n const range = core.state.range;\n if (!range) return;\n\n const textNode = range.startContainer;\n if (textNode.nodeType !== Node.TEXT_NODE) return;\n\n let text = textNode.nodeValue.replace(/\\u00A0/g, ' ');\n if (textNode.parentNode.closest('li')) return;\n\n const cell = isInsideTableCell(textNode);\n\n if ((text + event.key) === '* ' || (text + event.key) === '- ') {\n event.preventDefault();\n\n textNode.nodeValue = text.slice(0, -1);\n\n if (cell) {\n const ul = document.createElement('ul');\n const li = document.createElement('li');\n const text = document.createTextNode('\\u00A0');\n\n li.appendChild(text);\n ul.appendChild(li);\n\n cell.innerHTML = '';\n cell.appendChild(ul);\n\n const newRange = document.createRange();\n newRange.setStart(text, 1);\n newRange.collapse(true);\n\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(newRange);\n\n } else {\n const newRange = document.createRange();\n newRange.setStart(textNode, textNode.nodeValue.length);\n newRange.setEnd(textNode, textNode.nodeValue.length);\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(newRange);\n applyUnorderedList(core)\n }\n }\n}\n\n\nconst makeOrderedList = (event, core) => {\n const textNode = core.state.range.startContainer;\n if (textNode.nodeType === Node.TEXT_NODE) {\n // Get the text typed so far\n let text = textNode.nodeValue.replace(/\\u00A0/g, ' ');\n const haveLiNode = textNode.parentNode.closest('li')\n\n // Detect \"1. \" pattern\n if (!haveLiNode && text === \"1. \") {\n\n const cell = isInsideTableCell(textNode);\n text = text.slice(0, -3);\n textNode.nodeValue = text;\n if (cell) {\n const ol = document.createElement('ol');\n const li = document.createElement('li');\n const text = document.createTextNode('\\u00A0');\n\n li.appendChild(text);\n ol.appendChild(li);\n\n cell.innerHTML = '';\n cell.appendChild(ol);\n\n const newRange = document.createRange();\n newRange.setStart(text, 1);\n newRange.collapse(true);\n\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(newRange);\n\n } else {\n // Update the caret position\n const newRange = document.createRange();\n newRange.setStart(textNode, text.length);\n newRange.setEnd(textNode, text.length);\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(newRange);\n applyOrderList(core)\n }\n }\n }\n\n}\n\nconst makeHeading = (event, core) => {\n if (event.key !== ' ') return;\n core.updateCaretPosition();\n const range = core.state.range;\n const textNode = range.startContainer;\n if (textNode.nodeType !== Node.TEXT_NODE) return;\n\n let text = textNode.nodeValue.replace(/\\u00A0/g, ' ');\n const fullText = text + event.key;\n\n const matches = ['# ', '## ', '### ', '#### ', '##### ', '###### '];\n if (!matches.includes(fullText)) return;\n\n event.preventDefault();\n\n const level = fullText.trim().length;\n const cell = isInsideTableCell(textNode);\n\n textNode.nodeValue = text.slice(0, -level);\n\n if (cell) {\n\n const h = document.createElement(`h${level}`);\n h.innerHTML = '&nbsp;';\n\n cell.innerHTML = '';\n cell.appendChild(h);\n\n const newRange = document.createRange();\n newRange.setStart(h, 0);\n newRange.collapse(true);\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(newRange);\n\n } else {\n core.elements.iframeWindow.execCommand(\n 'formatBlock',\n false,\n `h${level}`\n );\n }\n\n core.elements.editor.focus();\n core.updateCaretPosition();\n changeToolbarValueByName(core, 'format-block', `h${level}`);\n};\n\n\nconst makeBlockQuote = (event, core) => {\n if (event.key !== ' ') return;\n\n core.updateCaretPosition();\n const range = core.state.range;\n const textNode = range.startContainer;\n if (textNode.nodeType !== Node.TEXT_NODE) return;\n\n let text = textNode.nodeValue.replace(/\\u00A0/g, ' ');\n if ((text + event.key) !== '> ') return;\n\n event.preventDefault();\n\n textNode.nodeValue = text.slice(0, -1);\n\n const cell = isInsideTableCell(textNode);\n\n if (cell) {\n\n const blockquote = document.createElement('blockquote');\n blockquote.innerHTML = '&nbsp;';\n\n cell.innerHTML = '';\n cell.appendChild(blockquote);\n const newRange = document.createRange();\n newRange.setStart(blockquote, 0);\n newRange.collapse(true);\n core.state.selection.removeAllRanges();\n core.state.selection.addRange(newRange);\n } else {\n core.elements.iframeWindow.execCommand(\n 'formatBlock',\n false,\n 'blockquote'\n );\n }\n\n core.elements.editor.focus();\n core.updateCaretPosition();\n};\n\n\nconst makeStrikethrough = (event, core) => {\n if (event.key !== '~') return;\n core.updateCaretPosition();\n if (!core.state.range) return;\n\n const range = core.state.range;\n const textNode = range.startContainer;\n if (textNode.nodeType !== Node.TEXT_NODE) return;\n\n const text = textNode.nodeValue.replace(/\\u00A0/g, ' ');\n const offset = range.startOffset;\n const textBeforeCaret = text.slice(0, offset) + event.key;\n const match = textBeforeCaret.match(/~~([^~]+)~~$/);\n if (!match) return;\n\n event.preventDefault();\n\n const content = match[1];\n const startIndex = match.index;\n const endIndex = startIndex + match[0].length - 1;\n\n // Select ~~text~~\n const replaceRange = document.createRange();\n replaceRange.setStart(textNode, startIndex);\n replaceRange.setEnd(textNode, endIndex);\n\n replaceRange.deleteContents();\n\n const strike = document.createElement('strike');\n strike.textContent = content;\n replaceRange.insertNode(strike);\n\n const zeroWidthSpace = document.createTextNode('\\u200B');\n if (strike.nextSibling) {\n strike.parentNode.insertBefore(zeroWidthSpace, strike.nextSibling);\n } else {\n strike.parentNode.appendChild(zeroWidthSpace);\n }\n\n const newRange = document.createRange();\n newRange.setStart(zeroWidthSpace, 1);\n newRange.setEnd(zeroWidthSpace, 1);\n\n const selection = core.state.selection;\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n core.updateCaretPosition();\n\n changeToolbarStateByName(core, 'inactive', ['strike']);\n}\n\nconst makeCodeBlock = (event, core) => {\n if (event.key !== '`') return;\n core.updateCaretPosition();\n if (!core.state.range) return;\n\n const range = core.state.range;\n const textNode = range.startContainer;\n if (textNode.nodeType !== Node.TEXT_NODE) return;\n\n const text = textNode.nodeValue.replace(/\\u00A0/g, ' ');\n const offset = range.startOffset;\n const textBeforeCaret = text.slice(0, offset) + event.key;\n\n const match = textBeforeCaret.match(/`([^`]+)`$/);\n if (!match) return;\n\n event.preventDefault();\n\n const content = match[1];\n const startIndex = match.index;\n const endIndex = startIndex + match[0].length - 1;\n\n // Select ~~text~~\n const replaceRange = document.createRange();\n replaceRange.setStart(textNode, startIndex);\n replaceRange.setEnd(textNode, endIndex);\n\n replaceRange.deleteContents();\n\n const code = document.createElement('code');\n code.textContent = content;\n replaceRange.insertNode(code);\n\n const zeroWidthSpace = document.createTextNode('\\u200B');\n if (code.nextSibling) {\n code.parentNode.insertBefore(zeroWidthSpace, code.nextSibling);\n } else {\n code.parentNode.appendChild(zeroWidthSpace);\n }\n\n const newRange = document.createRange();\n newRange.setStart(zeroWidthSpace, 1);\n newRange.setEnd(zeroWidthSpace, 1);\n\n const selection = core.state.selection;\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n core.updateCaretPosition();\n}\n\nconst getListLevel = (li) => {\n let level = 0;\n let parent = li.parentElement;\n const tagName = parent.tagName;\n\n while (parent && parent.tagName === tagName) {\n level++;\n parent = parent.parentElement?.closest(tagName);\n }\n\n return level;\n};\n\nconst applyListStyle = (list, level) => {\n let type;\n if (list.tagName === 'OL') {\n type = LIST_STYLES_BY_LEVEL[(level - 1) % LIST_STYLES_BY_LEVEL.length];\n } else if (list.tagName === 'UL') {\n type = UNORDERED_LIST_STYLES_BY_LEVEL[(level - 1) % UNORDERED_LIST_STYLES_BY_LEVEL.length];\n }\n if (type) list.setAttribute('type', type);\n};\n\nconst indentListItem = (li, core) => {\n const prevLi = li.previousElementSibling;\n if (!prevLi) return;\n\n const parentList = li.parentElement;\n const parentTag = parentList.tagName; // UL or OL\n\n let subList = prevLi.querySelector(`:scope > ${parentTag}`);\n\n // create sublist if it doesn't exist\n if (!subList) {\n subList = document.createElement(parentTag);\n prevLi.appendChild(subList);\n }\n\n // move the li into the sublist\n subList.appendChild(li);\n const selection = core.elements.iframeWindow.getSelection();\n const range = document.createRange();\n range.selectNodeContents(li);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n core.elements.editor.focus();\n core.updateCaretPosition();\n if (parentTag === 'OL' || parentTag === 'UL') {\n const level = getListLevel(li);\n applyListStyle(subList, level);\n }\n};\n\nconst outdentListItem = (li, core) => {\n const parentOl = li.parentElement;\n const parentLi = parentOl.closest('li');\n if (!parentLi) return;\n parentLi.after(li);\n\n const selection = core.elements.iframeWindow.getSelection();\n const range = document.createRange();\n range.selectNodeContents(li);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n core.elements.editor.focus();\n core.updateCaretPosition();\n\n\n if (parentOl.children.length === 0) {\n parentOl.remove();\n }\n\n if (li.parentElement.tagName === 'OL' || li.parentElement.tagName === 'UL') {\n const level = getListLevel(li);\n applyListStyle(li.parentElement, level);\n }\n};\n\nconst isEmptyLi = (li) => {\n const text = li.textContent.replace(/\\u200B/g, '').trim();\n const hasOnlySublist = li.children.length === 1 && li.querySelector('ul, ol');\n const hasMeaningfulElement = li.querySelector('img, iframe, audio, video, table, hr, figure');\n return text === '' && !hasOnlySublist && !hasMeaningfulElement;\n}\n\nconst trackListSelectionDeletion = (event, core) => {\n if (event.defaultPrevented) {\n delete core.state.pendingListSelectionDeletion;\n return;\n }\n\n if (!['Backspace', 'Delete'].includes(event.key)) {\n delete core.state.pendingListSelectionDeletion;\n return;\n }\n\n const selection = core.elements.iframeWindow.getSelection();\n if (!selection?.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n if (range.collapsed) {\n delete core.state.pendingListSelectionDeletion;\n return;\n }\n\n const getElementFromNode = (node) => {\n if (!node) return null;\n return node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement;\n }\n\n const startElement = getElementFromNode(range.startContainer);\n const endElement = getElementFromNode(range.endContainer);\n const startLi = startElement?.closest('li');\n const endLi = endElement?.closest('li');\n\n if (!startLi || !endLi || startLi === endLi) {\n delete core.state.pendingListSelectionDeletion;\n return;\n }\n\n const listItems = [];\n\n core.elements.editor.querySelectorAll('li').forEach(li => {\n if (range.intersectsNode(li)) listItems.push(li);\n });\n\n if (listItems.length < 2) {\n delete core.state.pendingListSelectionDeletion;\n return;\n }\n\n core.state.pendingListSelectionDeletion = {\n listItems,\n lists: Array.from(new Set(listItems.map(li => li.parentElement).filter(Boolean))),\n };\n}\n\nconst cleanupListSelectionDeletion = (core) => {\n const pendingDeletion = core.state.pendingListSelectionDeletion;\n if (!pendingDeletion) return false;\n\n delete core.state.pendingListSelectionDeletion;\n\n let didChange = false;\n const lists = new Set(pendingDeletion.lists);\n\n pendingDeletion.listItems.forEach(li => {\n if (!li.isConnected || !core.elements.editor.contains(li)) return;\n if (!isEmptyLi(li)) return;\n\n const parentList = li.parentElement;\n if (parentList) lists.add(parentList);\n li.remove();\n didChange = true;\n });\n\n Array.from(lists).reverse().forEach(list => {\n if (!list?.isConnected || !core.elements.editor.contains(list)) return;\n if (list.querySelector('li')) return;\n\n list.remove();\n didChange = true;\n });\n\n if (didChange) {\n if (!core.elements.editor.textContent.replace(/\\u200B/g, '').trim() && !core.elements.editor.querySelector('img, iframe, audio, video, table, hr, figure')) {\n core.elements.editor.innerHTML = '<div><br></div>';\n }\n\n const selection = core.elements.iframeWindow.getSelection();\n if (!selection?.rangeCount || !core.elements.editor.contains(selection.anchorNode)) {\n const range = document.createRange();\n const selection = core.elements.iframeWindow.getSelection();\n\n range.selectNodeContents(core.elements.editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n core.updateCaretPosition();\n }\n\n return didChange;\n}\n\nconst makeSublist = (event, core) => {\n if (event.key !== 'Tab') return;\n\n const selection = core.elements.iframeWindow.getSelection();\n if (!selection.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n const isAtStart = range.startOffset === 0;\n\n let container = range.commonAncestorContainer;\n\n if (container.nodeType === Node.TEXT_NODE) {\n container = container.parentElement;\n }\n // find the nearest list container\n const list = container.closest('ul, ol');\n if (!list) return;\n const allLis = list.querySelectorAll('li');\n\n const selectedLis = [];\n\n allLis.forEach(li => {\n if (range.intersectsNode(li)) {\n selectedLis.push(li);\n }\n });\n\n if (!selectedLis.length) return;\n\n if (!event.shiftKey) {\n const hasContent = selectedLis.some(li => !isEmptyLi(li));\n if (hasContent && !isAtStart) return;\n }\n\n event.preventDefault();\n\n selectedLis.forEach(li => {\n if (event.shiftKey) {\n outdentListItem(li, core);\n } else {\n indentListItem(li, core);\n }\n });\n};\n\nconst transformCase = (text, type) => {\n if (type === 'upper_case') return text.toUpperCase();\n if (type === 'lower_case') return text.toLowerCase();\n if (type === 'title_case') return text.toLowerCase().replace(/\\b\\w/g, s => s.toUpperCase());\n return text;\n};\n\nconst transformTextStyle = (core, type) => {\n const range = core.state.range;\n if (!range) return;\n const startContainer = range.startContainer;\n const startOffset = range.startOffset;\n const endContainer = range.endContainer;\n let endOffset = range.endOffset;\n\n const processTextNode = (node, start, end) => {\n const text = node.nodeValue;\n const transformedText = transformCase(text.slice(start, end), type);\n node.nodeValue = text.slice(0, start) + transformedText + text.slice(end);\n if (node === endContainer) endOffset = start + transformedText.length;\n };\n\n if (range.commonAncestorContainer.nodeType === Node.TEXT_NODE) {\n processTextNode(range.commonAncestorContainer, range.startOffset, range.endOffset);\n } else {\n const iterator = core.elements.iframeWindow.createNodeIterator(\n range.commonAncestorContainer,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n return range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }\n }\n );\n\n const nodes = [];\n let node;\n while ((node = iterator.nextNode())) {\n nodes.push(node);\n }\n\n nodes.forEach(node => {\n let start = 0;\n let end = node.nodeValue.length;\n\n if (node === range.startContainer) start = range.startOffset;\n if (node === range.endContainer) end = range.endOffset;\n\n processTextNode(node, start, end);\n });\n }\n\n const newRange = core.elements.iframeWindow.createRange();\n newRange.setStart(startContainer, startOffset);\n newRange.setEnd(endContainer, endOffset);\n const selection = core.elements.iframeWindow.getSelection();\n selection.removeAllRanges();\n selection.addRange(newRange);\n}\n\nconst assignIdToHeading = (heading) => {\n if (!heading.dataset.leksyHeadingId) heading.dataset.leksyHeadingId = uuidv4()\n return heading.dataset.leksyHeadingId\n};\n\nconst navigateToHeading = (core, headingId) => {\n if (!headingId) return;\n const heading = core.elements.iframeWindow.querySelector(`[data-leksy-heading-id=\"${headingId}\"]`);\n if (!heading) return;\n heading.scrollIntoView({\n behavior: 'smooth',\n block: 'center'\n });\n const range = document.createRange();\n range.selectNodeContents(heading);\n range.collapse(true);\n\n const sel = core.elements.iframeWindow.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n\n core.elements.editor.focus();\n core.updateCaretPosition();\n}\n\nconst insertTOC = (core) => {\n const editor = core.elements.editor;\n const headings = editor.querySelectorAll('h1, h2, h3, h4, h5, h6');\n\n if (!headings.length) return;\n\n const tocContainer = document.createElement('div');\n tocContainer.contentEditable = 'false';\n tocContainer.dataset.leksyElement = 'toc'\n\n tocContainer.style.border = '1px solid gray';\n tocContainer.style.display = 'inline-block';\n tocContainer.style.width = '100%';\n tocContainer.style.boxSizing = 'border-box';\n tocContainer.style.borderRadius = '4px';\n\n const title = document.createElement('div');\n title.innerText = 'Table of Contents';\n title.style.fontWeight = 'bold';\n title.style.marginBottom = '8px';\n title.style.borderBottom = '1px solid gray';\n title.style.padding = '8px 12px';\n\n tocContainer.appendChild(title);\n\n const ul = document.createElement('ul');\n ul.style.listStyle = 'none';\n ul.style.padding = '8px 12px';\n ul.style.margin = '0';\n\n headings.forEach((heading) => {\n const headingId = assignIdToHeading(heading)\n const level = Number(heading.tagName[1]);\n\n const li = document.createElement('li');\n li.style.marginBottom = '4px';\n li.style.marginLeft = `${(level - 1) * 15}px`;\n li.style.color = 'var(--link-color)';\n li.style.cursor = 'pointer';\n li.textContent = heading.textContent;\n li.dataset.leksyTocHeadingId = headingId\n\n ul.appendChild(li);\n });\n\n tocContainer.appendChild(ul);\n\n const selection = core.elements.iframeWindow.getSelection();\n\n if (!selection.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n\n if (!range.collapsed) {\n // Replace selected content with TOC\n range.deleteContents();\n range.insertNode(tocContainer);\n\n // Remove empty list items\n editor.querySelectorAll('li').forEach(li => {\n const text = li.textContent.replace(/\\u00A0/g, '').trim();\n\n if (\n !text &&\n !li.querySelector(\n 'img, video, table, ul, ol, iframe, blockquote'\n )\n ) {\n li.remove();\n }\n });\n\n // Place cursor after TOC\n const p = document.createElement('p');\n p.innerHTML = '<br>';\n tocContainer.after(p);\n\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n } else {\n // No selection -> insert after current block\n let node = range.startContainer;\n\n if (node.nodeType === Node.TEXT_NODE) {\n node = node.parentElement;\n }\n\n const block = node.closest(\n 'p, div, h1, h2, h3, h4, h5, h6, blockquote, pre, li'\n );\n\n if (block) {\n block.insertAdjacentElement('afterend', tocContainer);\n } else {\n editor.appendChild(tocContainer);\n }\n\n // Place cursor after TOC\n const p = document.createElement('p');\n p.innerHTML = '<br>';\n tocContainer.after(p);\n\n const newRange = document.createRange();\n newRange.setStart(p, 0);\n newRange.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n\n core.updateCaretPosition();\n};\n\nfunction insertOutlinesItems(core, options, tab, outlineContainer) {\n if (!options.showTabs) return\n if (!tab.showOutlines) return\n if (tab.tabId !== core.state.currentTabId) return\n\n outlineContainer.innerHTML = '';\n const editor = core.elements.editor;\n const headings = editor.querySelectorAll('h1, h2, h3, h4, h5, h6');\n\n headings.forEach((heading) => {\n if (!heading.textContent?.trim()) return\n const level = Number(heading.tagName[1]);\n\n const item = document.createElement('div');\n item.className = 'outline-item';\n item.textContent = heading.textContent;\n item.style.paddingLeft = `${(level - 1) * 12 + 8}px`;\n\n item.onclick = () => {\n outlineContainer.querySelectorAll('.outline-item').forEach(el => {\n el.classList.remove('active');\n });\n item.classList.add('active');\n\n heading.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n const range = document.createRange();\n range.selectNodeContents(heading);\n range.collapse(true);\n\n const sel = core.elements.iframeWindow.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n\n core.elements.editor.focus();\n core.updateCaretPosition();\n };\n\n outlineContainer.appendChild(item);\n });\n}\n\nfunction highlightActiveOutline(core, options, outlineContainer) {\n if (!options.showTabs) return\n if (!outlineContainer) {\n outlineContainer = core.elements.tabs[core.state.currentTabId].querySelector('.outline-items')\n if (!outlineContainer) return;\n }\n const range = core.state.range;\n const node = range?.startContainer;\n if (!node) return;\n\n const items = outlineContainer.querySelectorAll('.outline-item');\n const editor = core.elements.editor;\n const headings = editor.querySelectorAll('h1, h2, h3, h4, h5, h6');\n\n items.forEach(el => el.classList.remove('active'));\n\n headings.forEach((heading, index) => {\n if (heading.contains(node)) {\n items[index]?.classList.add('active');\n }\n });\n}\n\nconst updateOutlineItems = debounce((core, options) => {\n if (!options.showTabs) return\n const tab = findTab(core.state.tabs, core.state.currentTabId)\n if (!tab) return;\n const outlineContainer = core.elements.tabs[tab.tabId].querySelector('.outline-items')\n if (!outlineContainer) return;\n insertOutlinesItems(core, options, tab, outlineContainer)\n highlightActiveOutline(core, options, outlineContainer);\n}, 300)\n\nconst findAndReplace = (core, options, event) => {\n if (!options.enableFindAndReplace) return;\n if (core.state.findAndReplaceModalOpen) return;\n\n core.state.findAndReplaceModalOpen = true\n const editor = core.elements.editor;\n const iframeWindow = core.elements.iframeWindow;\n\n const headerContainer = document.createElement('div');\n headerContainer.style.display = 'flex';\n headerContainer.style.gap = '15px';\n headerContainer.style.alignItems = 'center';\n\n const findTab = document.createElement('button');\n findTab.type = 'button';\n findTab.innerText = 'Find';\n findTab.className = 'leksy-editor-find-and-replace-modal-tab-btn';\n\n const replaceTab = document.createElement('button');\n replaceTab.type = 'button';\n replaceTab.innerText = 'Replace';\n replaceTab.className = 'leksy-editor-find-and-replace-modal-tab-btn';\n\n headerContainer.append(findTab, replaceTab);\n\n const body = document.createElement('div');\n\n const findLabel = document.createElement(\"label\");\n findLabel.innerText = \"Find\";\n findLabel.style.paddingLeft = \"4px\";\n\n const findInputWrapper = document.createElement('div');\n findInputWrapper.style.position = 'relative';\n findInputWrapper.style.marginBottom = '10px';\n\n const findInput = document.createElement('input');\n findInput.type = 'text';\n findInput.placeholder = 'Search text';\n findInput.style.width = '100%';\n findInput.style.boxSizing = 'border-box';\n findInput.style.paddingRight = '60px';\n\n const countSpan = document.createElement('span');\n countSpan.className = 'leksy-editor-find-and-replace-modal-count';\n\n findInputWrapper.append(findInput, countSpan);\n\n const replaceLabel = document.createElement(\"label\");\n replaceLabel.innerText = \"Replace with\";\n replaceLabel.style.display = \"block\";\n replaceLabel.style.paddingLeft = \"4px\";\n const replaceInput = document.createElement('input');\n replaceInput.type = 'text';\n replaceInput.placeholder = 'Replace text';\n replaceInput.style.marginBottom = '10px';\n\n const optionsContainer = document.createElement('div');\n optionsContainer.style.marginBottom = '10px';\n optionsContainer.style.display = 'flex';\n optionsContainer.style.flexDirection = 'column'\n\n const matchCaseCheckboxContainer = document.createElement('div');\n const matchCaseCheckbox = document.createElement('input');\n matchCaseCheckbox.type = 'checkbox';\n matchCaseCheckbox.id = 'match-case-opt';\n matchCaseCheckbox.style.marginRight = '5px';\n matchCaseCheckbox.style.width = '24px';\n\n const matchCaseLabel = document.createElement('label');\n matchCaseLabel.innerText = \"Match case\";\n matchCaseLabel.htmlFor = 'match-case-opt';\n matchCaseLabel.style.userSelect = 'none';\n matchCaseCheckboxContainer.append(matchCaseCheckbox, matchCaseLabel)\n\n const wholeWordCheckboxContainer = document.createElement('div');\n const wholeWordCheckbox = document.createElement('input');\n wholeWordCheckbox.type = 'checkbox';\n wholeWordCheckbox.id = 'whole-word-opt';\n wholeWordCheckbox.style.marginRight = '5px';\n wholeWordCheckbox.style.width = '24px';\n\n const wholeWordLabel = document.createElement('label');\n wholeWordLabel.innerText = \"Whole word\";\n wholeWordLabel.htmlFor = 'whole-word-opt';\n wholeWordLabel.style.userSelect = 'none';\n wholeWordCheckboxContainer.append(wholeWordCheckbox, wholeWordLabel);\n\n const regexCheckboxContainer = document.createElement('div');\n const useRegexCheckbox = document.createElement('input');\n useRegexCheckbox.type = 'checkbox';\n useRegexCheckbox.id = 'use-regex-opt';\n useRegexCheckbox.style.marginRight = '5px';\n useRegexCheckbox.style.width = '24px';\n\n const useRegexLabel = document.createElement('label');\n useRegexLabel.innerText = \"Use regular expressions\";\n useRegexLabel.htmlFor = 'use-regex-opt';\n useRegexLabel.style.userSelect = 'none';\n regexCheckboxContainer.append(useRegexCheckbox, useRegexLabel)\n\n optionsContainer.append(matchCaseCheckboxContainer, regexCheckboxContainer, wholeWordCheckboxContainer);\n\n const span = document.createElement('span');\n span.className = 'warning';\n\n body.append(findLabel, findInputWrapper, replaceLabel, replaceInput, optionsContainer, span);\n\n const footer = document.createElement('div');\n footer.style.display = 'flex';\n footer.style.gap = '8px';\n footer.style.justifyContent = 'flex-end';\n footer.style.width = '100%';\n\n const prevBtn = document.createElement('button');\n prevBtn.type = 'button';\n prevBtn.className = 'submit';\n prevBtn.innerText = 'Previous';\n\n const nextBtn = document.createElement('button');\n nextBtn.type = 'button';\n nextBtn.className = 'submit';\n nextBtn.innerText = 'Next';\n\n const replaceBtn = document.createElement('button');\n replaceBtn.type = 'button';\n replaceBtn.className = 'submit';\n replaceBtn.innerText = 'Replace';\n\n const replaceAllBtn = document.createElement('button');\n replaceAllBtn.type = 'button';\n replaceAllBtn.className = 'submit';\n replaceAllBtn.innerText = 'Replace All';\n\n footer.append(prevBtn, nextBtn, replaceBtn, replaceAllBtn);\n\n const toggleTab = (mode) => {\n if (mode === 'find') {\n replaceLabel.style.display = 'none';\n replaceInput.style.display = 'none';\n replaceBtn.style.display = 'none';\n replaceAllBtn.style.display = 'none';\n\n findTab.classList.add('active');\n replaceTab.classList.remove('active');\n } else {\n replaceLabel.style.display = 'block';\n replaceInput.style.display = 'block';\n replaceBtn.style.display = 'flex';\n replaceAllBtn.style.display = 'flex';\n\n replaceTab.classList.add('active');\n findTab.classList.remove('active');\n }\n }\n\n findTab.onclick = () => toggleTab('find');\n replaceTab.onclick = () => toggleTab('replace');\n\n openDraggableModal({\n title: headerContainer,\n bodyNode: body,\n footerNode: footer,\n onClose: () => {\n core.state.findAndReplaceModalOpen = false\n }\n }, core, options);\n\n if (event.key === 'f')\n toggleTab('find');\n else\n toggleTab('replace');\n\n\n findInput.focus();\n\n const find = (direction) => {\n const searchText = findInput.value;\n const matchCase = matchCaseCheckbox.checked;\n const useRegex = useRegexCheckbox.checked;\n const wholeWord = wholeWordCheckbox.checked;\n\n span.innerText = \"\";\n countSpan.innerText = \"\";\n\n if (!searchText) {\n span.innerText = \"Please enter text to find\";\n return;\n }\n\n let searchPattern = searchText;\n\n if (!useRegex) {\n const cleaned = wholeWord ? searchText.trim() : searchText;\n const escaped = cleaned.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n searchPattern = wholeWord\n ? `(?<!\\\\w)${escaped}(?!\\\\w)`\n : escaped;\n }\n\n const selection = iframeWindow.getSelection();\n\n let regex;\n try {\n const flags = matchCase ? 'g' : 'gi';\n regex = new RegExp(searchPattern, flags);\n } catch (error) {\n span.innerText = \"Invalid regular expression\";\n return;\n }\n\n // ✅ Collect matches (node-based + global index)\n const walker = core.elements.iframeWindow.createTreeWalker(\n editor,\n NodeFilter.SHOW_TEXT,\n null\n );\n\n const matches = [];\n let node;\n let globalIndex = 0;\n\n while ((node = walker.nextNode())) {\n const text = node.nodeValue;\n regex.lastIndex = 0;\n\n let match;\n while ((match = regex.exec(text)) !== null) {\n matches.push({\n node,\n start: match.index,\n end: match.index + match[0].length,\n globalStart: globalIndex + match.index\n });\n }\n\n globalIndex += text.length;\n }\n\n if (!matches.length) {\n countSpan.innerText = \"0 of 0\";\n return;\n }\n\n // ✅ Get current cursor global position\n let currentGlobal = 0;\n\n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n\n const walker2 = core.elements.iframeWindow.createTreeWalker(\n editor,\n NodeFilter.SHOW_TEXT,\n null\n );\n\n let n, count = 0;\n\n while ((n = walker2.nextNode())) {\n if (n === range.startContainer) {\n currentGlobal = count + range.startOffset;\n break;\n }\n count += n.nodeValue.length;\n }\n }\n\n // ✅ Find next / prev\n let matchIndex = -1;\n\n if (direction === 'next') {\n matchIndex = matches.findIndex(m => m.globalStart > currentGlobal);\n if (matchIndex === -1) matchIndex = 0;\n } else {\n for (let i = matches.length - 1; i >= 0; i--) {\n if (matches[i].globalStart < currentGlobal) {\n matchIndex = i;\n break;\n }\n }\n if (matchIndex === -1) matchIndex = matches.length - 1;\n }\n\n const match = matches[matchIndex];\n\n // ✅ Select\n const newRange = core.elements.iframeWindow.createRange();\n newRange.setStart(match.node, match.start);\n newRange.setEnd(match.node, match.end);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n\n match.node.parentElement?.scrollIntoView({\n block: \"center\",\n behavior: \"smooth\"\n });\n\n countSpan.innerText = `${matchIndex + 1} of ${matches.length}`;\n };\n\n const replace = () => {\n const searchText = findInput.value;\n const replaceText = replaceInput.value;\n const matchCase = matchCaseCheckbox.checked;\n const useRegex = useRegexCheckbox.checked;\n const wholeWord = wholeWordCheckbox.checked;\n\n if (!searchText) return;\n\n // 🔹 Build regex (same as find)\n let pattern = searchText;\n\n if (!useRegex) {\n const cleaned = wholeWord ? searchText.trim() : searchText;\n const escaped = cleaned.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n pattern = wholeWord\n ? `(?<!\\\\w)${escaped}(?!\\\\w)`\n : escaped;\n }\n\n let regex;\n try {\n regex = new RegExp(pattern, matchCase ? '' : 'i');\n } catch {\n return;\n }\n\n const selection = iframeWindow.getSelection();\n\n if (!selection.rangeCount) {\n find('next');\n return;\n }\n\n const range = selection.getRangeAt(0);\n const selectedText = range.toString();\n\n const match = selectedText.match(regex);\n\n if (match && match[0] === selectedText) {\n const newText = selectedText.replace(regex, replaceText);\n\n // ✅ safe replace\n range.deleteContents();\n range.insertNode(core.elements.iframeWindow.createTextNode(newText));\n\n // move cursor after replaced text\n range.setStart(range.endContainer, range.endOffset);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n find('next');\n };\n\n const replaceAll = () => {\n const searchText = findInput.value;\n const replaceText = replaceInput.value;\n const matchCase = matchCaseCheckbox.checked;\n const useRegex = useRegexCheckbox.checked;\n const wholeWord = wholeWordCheckbox.checked;\n\n if (!searchText) return;\n\n let pattern = searchText;\n\n if (!useRegex) {\n const cleaned = wholeWord ? searchText.trim() : searchText;\n const escaped = cleaned.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n pattern = wholeWord\n ? `(?<!\\\\w)${escaped}(?!\\\\w)`\n : escaped;\n }\n\n let regex;\n try {\n regex = new RegExp(pattern, matchCase ? 'g' : 'gi');\n } catch {\n return;\n }\n\n // 🔹 Collect matches (same as find)\n const walker = core.elements.iframeWindow.createTreeWalker(\n editor,\n NodeFilter.SHOW_TEXT,\n null\n );\n\n const matches = [];\n let node;\n\n while ((node = walker.nextNode())) {\n const text = node.nodeValue;\n regex.lastIndex = 0;\n\n let match;\n while ((match = regex.exec(text)) !== null) {\n matches.push({\n node,\n start: match.index,\n end: match.index + match[0].length,\n original: match[0]\n });\n }\n }\n\n // 🔹 Replace in reverse (important)\n let count = 0;\n\n for (let i = matches.length - 1; i >= 0; i--) {\n const m = matches[i];\n const text = m.node.nodeValue;\n\n const newText = m.original.replace(\n new RegExp(pattern, matchCase ? '' : 'i'),\n replaceText\n );\n\n m.node.nodeValue =\n text.slice(0, m.start) +\n newText +\n text.slice(m.end);\n\n count++;\n }\n\n span.innerText = `Replaced ${count} occurrences.`;\n\n find('next');\n };\n\n prevBtn.onclick = () => find('prev');\n nextBtn.onclick = () => find('next');\n replaceBtn.onclick = replace;\n replaceAllBtn.onclick = replaceAll;\n\n const onInputKeydown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n find('next');\n }\n };\n findInput.addEventListener('keydown', onInputKeydown);\n}\n\nconst isCaretAtStart = (range, li) => {\n const preRange = range.cloneRange();\n preRange.selectNodeContents(li);\n preRange.setEnd(range.startContainer, range.startOffset);\n\n return preRange.toString().length === 0;\n};\nconst handleBackspaceInList = (event, core) => {\n if (event.key !== 'Backspace') return;\n\n const selection = core.elements.iframeWindow.getSelection();\n if (!selection.rangeCount) return;\n const range = selection.getRangeAt(0);\n\n if (!range.collapsed) return;\n\n let element = range.startContainer;\n if (element.nodeType === Node.TEXT_NODE) {\n element = element.parentElement;\n }\n\n const li = element.closest('li');\n if (!li || !core.elements.editor.contains(li)) return;\n\n const nestedList = li.querySelector('ul, ol');\n if (!nestedList) return;\n\n\n if (!isCaretAtStart(range, li)) return;\n\n event.preventDefault();\n\n const parentList = li.parentElement;\n const prevLi = li.previousElementSibling;\n\n const clone = li.cloneNode(true);\n const nestedInClone = clone.querySelector('ul, ol');\n if (nestedInClone) nestedInClone.remove();\n\n const parentText = clone.textContent.replace(/\\u200B/g, '').trim();\n\n const fragment = document.createDocumentFragment();\n const children = Array.from(nestedList.children);\n\n children.forEach(child => fragment.appendChild(child));\n\n // Case 1: previous list item exists\n if (prevLi) {\n\n if (parentText.length > 0) {\n prevLi.appendChild(document.createTextNode(parentText));\n }\n\n if (children.length > 0) {\n parentList.insertBefore(fragment, li);\n }\n\n li.remove();\n\n const newRange = document.createRange();\n newRange.selectNodeContents(prevLi);\n newRange.collapse(false);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n // Case 2: first list item\n else {\n const span = document.createElement('span');\n span.textContent = parentText || '';\n\n parentList.parentElement.insertBefore(span, parentList);\n\n if (children.length > 0) {\n parentList.insertBefore(fragment, li);\n }\n\n li.remove();\n\n const newRange = document.createRange();\n newRange.selectNodeContents(span);\n newRange.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n\n core.updateCaretPosition();\n};\n\nconst getCollabColor = (userId) => {\n let hash = 0\n for (let i = 0; i < userId.length; i++)\n hash = userId.charCodeAt(i) + ((hash << 5) - hash)\n return COLLABORATION_COLORS[Math.abs(hash) % COLLABORATION_COLORS.length]\n}\n\n\nexport {\n cleanHTML,\n debounce,\n makeToolbarButton,\n makeToolbarDropdown,\n openModal,\n initImageResizer,\n destroyImageResizer,\n changeAllToolbarState,\n changeToolbarValueByName,\n makeToolbarSelect,\n changeToolbarStateByName,\n changeToolbarHtmlByName,\n makeToolbarColor,\n initTableEditPlugin,\n destroyTableEditPlugin,\n updateTableResizerPosition,\n rgbToHex,\n extractSocialMediaId,\n constructEmbedUrl,\n showAnchorPopover,\n destroyAnchorPopover,\n showRemoteCursor,\n syncRemoteChangesDebounce,\n applyRemoteChanges,\n updateCursorPositionDebounce,\n isLinkValid,\n formatLink,\n buildTributeValues,\n toPx,\n updateHeight,\n getTableGrid,\n getCellPosition,\n applyFormatBlockInListItem,\n normalizeHeadingWrappedLists,\n makeUnorderedList,\n makeOrderedList,\n showTooltip,\n makeHeading,\n makeBlockQuote,\n makeStrikethrough,\n makeCodeBlock,\n makeSublist,\n transformTextStyle,\n makeToolbarButtonSelect,\n insertTOC,\n insertOutlinesItems,\n navigateToHeading,\n updateOutlineItems,\n highlightActiveOutline,\n findAndReplace,\n handleBackspaceInList,\n getCollabColor,\n trackListSelectionDeletion,\n cleanupListSelectionDeletion,\n}\n\n","import { v4 as uuidv4 } from 'uuid';\nimport { SVG } from \"./constant\";\nimport { destroyAnchorPopover, destroyImageResizer, destroyTableEditPlugin, insertOutlinesItems } from './utilities';\n\nconst initTabs = (core, options) => {\n if (!options.showTabs) return;\n\n const tabsContainer = document.createElement('div');\n tabsContainer.className = `tabs-container`;\n core.elements.tabsContainer = tabsContainer;\n core.elements.placeholder.style.visibility = 'hidden';\n core.elements.iframeWindow.body.style.display = 'flex';\n core.elements.iframeWindow.body.prepend(tabsContainer);\n renderTabs(core, options);\n}\n\nconst findTabLocation = (list, tabId, parent = null) => {\n for (let i = 0; i < list.length; i++) {\n if (list[i].tabId === tabId) {\n return { list, index: i, parent };\n }\n if (list[i].children) {\n const result = findTabLocation(list[i].children, tabId, list[i]);\n if (result) return result;\n }\n }\n return null;\n};\n\nconst findTab = (tabs, tabId) => {\n for (const tab of tabs) {\n if (tab.tabId === tabId) return tab;\n if (tab.children) {\n const found = findTab(tab.children, tabId);\n if (found) return found;\n }\n }\n return null;\n};\n\nconst isDescendant = (tabs, parentId, childId) => {\n const parent = findTab(tabs, parentId);\n if (!parent?.children) return false;\n return findTab(parent.children, childId) !== null;\n};\n\nconst renderTabs = (core, options) => {\n if (!core.elements.tabsContainer) return;\n\n core.onChange(core.html);\n core.elements.tabsContainer.innerHTML = '';\n\n const renderLevel = (tabs, container, level) => {\n tabs.forEach(tab => {\n const tabItem = document.createElement('div');\n tabItem.className = `tab-item`;\n tabItem.classList.toggle('active', tab.tabId === core.state.currentTabId)\n\n tabItem.draggable = true;\n\n tabItem.ondragstart = (e) => {\n e.stopPropagation();\n core.state.draggedTabId = tab.tabId;\n e.dataTransfer.effectAllowed = 'move';\n tabItem.style.opacity = '0.5';\n };\n\n tabItem.ondragend = (e) => {\n e.stopPropagation();\n delete core.state.draggedTabId;\n tabItem.style.opacity = '1';\n renderTabs(core, options);\n };\n\n tabItem.ondragover = (e) => {\n e.preventDefault();\n e.stopPropagation();\n const draggedId = core.state.draggedTabId;\n if (!draggedId || draggedId === tab.tabId) return;\n if (isDescendant(core.state.tabs, draggedId, tab.tabId)) return;\n\n const rect = tabItem.getBoundingClientRect();\n const relY = e.clientY - rect.top;\n const height = rect.height;\n\n tabItem.style.borderTop = '';\n tabItem.style.borderBottom = '1px solid #eee';\n tabItem.style.background = '';\n\n if (relY < height * 0.25) {\n tabItem.style.borderTop = '2px solid var(--primary)';\n } else if (relY > height * 0.75) {\n tabItem.style.borderBottom = '2px solid var(--primary)';\n } else {\n tabItem.style.background = 'rgba(0,0,0,0.05)';\n }\n };\n\n tabItem.ondragleave = (e) => {\n e.stopPropagation();\n tabItem.style.borderTop = '';\n tabItem.style.borderBottom = '1px solid #eee';\n tabItem.style.background = '';\n };\n\n tabItem.ondrop = (e) => {\n e.preventDefault();\n e.stopPropagation();\n const draggedId = core.state.draggedTabId;\n if (!draggedId || draggedId === tab.tabId) return;\n if (isDescendant(core.state.tabs, draggedId, tab.tabId) || level > 1) return;\n\n const rect = tabItem.getBoundingClientRect();\n const relY = e.clientY - rect.top;\n const height = rect.height;\n\n if (relY < height * 0.25) {\n moveTabRelative(core, draggedId, tab.tabId, 'before', options);\n } else if (relY > height * 0.75) {\n moveTabRelative(core, draggedId, tab.tabId, 'after', options);\n } else {\n moveTabInto(core, draggedId, tab.tabId, options);\n }\n };\n\n let clickTimer;\n\n tabItem.onclick = () => {\n clearTimeout(clickTimer);\n clickTimer = setTimeout(() => {\n if (tab.tabId === core.state.currentTabId) {\n tab.showOutlines = !tab.showOutlines;\n renderTabs(core, options);\n }\n switchTab(core, tab.tabId, options);\n }, 250);\n };\n\n tabItem.ondblclick = () => {\n if (options.disabled) return\n clearTimeout(clickTimer);\n renameTab(core, tab.tabId, titleInput, options);\n };\n\n const leftSection = document.createElement('div');\n leftSection.className = 'left'\n leftSection.style.paddingLeft = `${level * 12}px`\n\n const hasChildren = tab.children && tab.children.length > 0;\n const arrow = document.createElement('span');\n arrow.style.width = '20px'\n arrow.style.height = '20px';\n arrow.style.marginRight = '4px';\n arrow.style.cursor = 'pointer';\n arrow.style.transition = 'transform 0.2s';\n\n if (hasChildren) {\n arrow.innerHTML = SVG.ARROW_DROP_DOWN_FILL;\n arrow.style.transform = tab.isExpanded ? 'rotate(0deg)' : 'rotate(-90deg)';\n arrow.onclick = (e) => {\n e.stopPropagation();\n tab.isExpanded = !tab.isExpanded;\n renderTabs(core, options);\n };\n }\n\n const titleInput = document.createElement('input');\n titleInput.value = tab.tabTitle || 'Untitled Tab';\n titleInput.disabled = true;\n titleInput.className = 'tab-input';\n\n const menuBtn = document.createElement('span');\n menuBtn.className = 'tab-icons tab-dropdown';\n menuBtn.innerHTML = SVG.MORE;\n\n menuBtn.onclick = (e) => {\n e.stopPropagation();\n showContextMenu(core, tab, e, level, options);\n };\n\n\n const span = document.createElement('span');\n span.className = 'tab-icons';\n span.innerHTML = SVG.TABLE_OF_CONTENT;\n\n leftSection.appendChild(arrow);\n leftSection.appendChild(span);\n leftSection.appendChild(titleInput);\n tabItem.appendChild(leftSection);\n if (!options.disabled) tabItem.appendChild(menuBtn);\n\n const tabItemContainer = document.createElement('div');\n tabItemContainer.id = tab.tabId;\n tabItemContainer.appendChild(tabItem);\n\n const outlineContainer = document.createElement('div');\n outlineContainer.className = 'outline-items';\n outlineContainer.style.paddingLeft = `${32 + level * 12}px`\n tabItemContainer.appendChild(outlineContainer);\n insertOutlinesItems(core, options, tab, outlineContainer)\n container.appendChild(tabItemContainer);\n core.elements.tabs[tab.tabId] = tabItemContainer\n\n if (tab.children && tab.children.length > 0 && tab.isExpanded) {\n const childrenContainer = document.createElement('div');\n renderLevel(tab.children, childrenContainer, level + 1);\n container.appendChild(childrenContainer);\n }\n });\n };\n\n const tabListContainer = document.createElement('div');\n tabListContainer.className = 'tab-items'\n tabListContainer.addEventListener('scroll', () => {\n core.state.tabItemsScrollHeight = tabListContainer.scrollTop;\n });\n renderLevel(core.state.tabs, tabListContainer, 0);\n core.elements.tabsContainer.appendChild(tabListContainer);\n tabListContainer.scrollTop = core.state.tabItemsScrollHeight || 0;\n\n const tabHeader = document.createElement('span');\n tabHeader.className = 'tab-header';\n\n const headerTitle = document.createElement('span');\n headerTitle.innerHTML = \"Tabs\";\n\n const rightDiv = document.createElement('div')\n const addBtn = document.createElement('button');\n addBtn.className = 'tab-add-button'\n addBtn.type = 'button';\n addBtn.innerHTML = SVG.PLUS;\n addBtn.onclick = () => createTab(core, options);\n\n const expandBtn = document.createElement('button');\n expandBtn.className = 'tab-expand-button'\n expandBtn.type = 'button';\n expandBtn.innerHTML = SVG.ARROW_DOWN;\n expandBtn.onclick = () => {\n core.state.isTabExpandInResponsive = !core.state.isTabExpandInResponsive\n expandBtn.classList.toggle('show')\n tabListContainer.classList.toggle('show')\n }\n requestAnimationFrame(() => {\n tabListContainer.classList.add('animate');\n });\n if (core.state.isTabExpandInResponsive) {\n expandBtn.classList.add('show')\n tabListContainer.classList.add('show')\n }\n\n if (!options.disabled) rightDiv.appendChild(addBtn);\n rightDiv.appendChild(expandBtn);\n\n tabHeader.appendChild(headerTitle);\n tabHeader.appendChild(rightDiv);\n core.elements.tabsContainer.prepend(tabHeader);\n}\n\nconst showContextMenu = (core, tab, event, level, options) => {\n const existingMenu = core.elements.iframeWindow.getElementById('leksy-editor-tab-context-menu');\n if (existingMenu) existingMenu.remove();\n\n const menu = document.createElement('div');\n menu.id = 'leksy-editor-tab-context-menu';\n\n // temporary visibility to measure\n menu.style.visibility = 'hidden';\n menu.style.display = 'block';\n\n const closeMenu = (e) => {\n if (!menu.contains(e.target)) {\n menu.remove();\n core.elements.iframeWindow.removeEventListener('click', closeMenu);\n }\n };\n\n const createOption = (text, icon, onClick) => {\n const item = document.createElement('div');\n item.innerHTML = icon + text;\n item.className = 'tab-menu-item';\n item.onclick = (e) => {\n e.stopPropagation();\n menu.remove();\n core.elements.iframeWindow.removeEventListener('click', closeMenu);\n onClick();\n };\n return item;\n };\n\n const createSubmenuOption = (text, items) => {\n const item = document.createElement('div');\n item.className = 'tab-menu-item';\n item.style.position = 'relative';\n\n const span = document.createElement('span');\n span.innerHTML = SVG.PLAY_LIST + text;\n const arrow = document.createElement('span');\n arrow.innerHTML = SVG.ARROW_DROP_RIGHT;\n arrow.style.width = '20px';\n arrow.style.height = '20px';\n arrow.style.marginLeft = '4px';\n arrow.style.display = 'flex';\n arrow.style.alignItems = 'center';\n\n item.appendChild(span);\n item.appendChild(arrow);\n\n let submenu;\n\n item.onmouseenter = () => {\n submenu = document.createElement('div');\n submenu.className = 'tab-submenu';\n submenu.style.position = 'absolute';\n submenu.style.left = '100%';\n submenu.style.top = '0';\n submenu.style.visibility = 'hidden';\n\n items.forEach(subItem => {\n const subOption = createOption(subItem.tabTitle, SVG.TABLE_OF_CONTENT, () => {\n moveTabInto(core, tab.tabId, subItem.tabId, options);\n });\n\n if (subItem.level > 0) {\n subOption.style.paddingLeft = `${16 + subItem.level * 10}px`;\n }\n\n submenu.appendChild(subOption);\n });\n\n item.appendChild(submenu);\n\n const rect = submenu.getBoundingClientRect();\n const itemRect = item.getBoundingClientRect();\n\n const viewportWidth = core.elements.iframeWindow.documentElement.clientWidth;\n const viewportHeight = core.elements.iframeWindow.documentElement.clientHeight;\n\n // if no space on right → open left\n if (rect.right > viewportWidth) {\n submenu.style.left = 'auto';\n submenu.style.right = '100%';\n }\n\n // if no space bottom → shift up\n if (rect.bottom > viewportHeight) {\n submenu.style.top = `${viewportHeight - itemRect.top - rect.height}px`;\n }\n\n submenu.style.visibility = 'visible';\n };\n\n item.onmouseleave = () => {\n if (submenu) submenu.remove();\n submenu = null;\n };\n\n return item;\n };\n\n const location = findTabLocation(core.state.tabs, tab.tabId);\n\n if (level < 2) {\n menu.appendChild(createOption('Add subtab', SVG.PLUS, () => addSublist(core, tab, options)));\n }\n\n menu.appendChild(createOption('Duplicate', SVG.COPY, () => duplicateTab(core, tab, options)));\n\n menu.appendChild(createOption('Rename', SVG.PENCIL_LINE, () => {\n const tabItem = event.target.closest(`.tab-item`);\n if (tabItem) {\n const input = tabItem.querySelector('input');\n if (input) renameTab(core, tab.tabId, input, options);\n }\n }));\n\n menu.appendChild(createOption('Delete', SVG.DELETE, () => deleteTab(core, tab.tabId, options)));\n\n menu.appendChild(createOption('Move up', SVG.ARROW_UP, () => moveTab(core, tab.tabId, 'up', options)));\n menu.appendChild(createOption('Move down', SVG.ARROW_DOWN_LONG, () => moveTab(core, tab.tabId, 'down', options)));\n\n const getTargets = (list, currentTabId, level = 0) => {\n let targets = [];\n for (const t of list) {\n if (t.tabId === currentTabId || level > 1) continue;\n targets.push({ tabId: t.tabId, tabTitle: t.tabTitle, level });\n if (t.children) targets = targets.concat(getTargets(t.children, currentTabId, level + 1));\n }\n return targets;\n };\n const targets = getTargets(core.state.tabs, tab.tabId);\n if (targets.length > 0) {\n menu.appendChild(createSubmenuOption('Move into', targets));\n }\n\n if (location?.parent) {\n menu.appendChild(createOption('Move out', SVG.DELETE, () => outdentTab(core, tab.tabId, options)));\n }\n\n menu.appendChild(createOption(tab.showOutlines ? 'Hide outlines' : 'Show outlines', SVG.LIST_BULLETS, () => {\n tab.showOutlines = !tab.showOutlines;\n renderTabs(core, options);\n if (tab.showOutlines) switchTab(core, tab.tabId, options);\n }));\n\n core.elements.iframeWindow.body.appendChild(menu);\n core.elements.iframeWindow.addEventListener('click', closeMenu);\n\n const rect = menu.getBoundingClientRect();\n const menuWidth = rect.width;\n const menuHeight = rect.height;\n\n const viewportWidth = core.elements.iframeWindow.documentElement.clientWidth;\n const viewportHeight = core.elements.iframeWindow.documentElement.clientHeight;\n\n let left = event.clientX;\n let top = event.clientY;\n\n // if not enough space on right → open to left\n if (left + menuWidth > viewportWidth) {\n left = event.clientX - menuWidth;\n }\n\n // if not enough space on bottom → open above\n if (top + menuHeight > viewportHeight) {\n top = event.clientY - menuHeight;\n }\n\n menu.style.left = `${left}px`;\n menu.style.top = `${top}px`;\n menu.style.visibility = 'visible';\n\n\n};\n\nconst createTab = (core, options) => {\n if (options.disabled) return\n\n const currentTab = findTab(core.state.tabs, core.state.currentTabId)\n if (currentTab) {\n currentTab.content = core.elements.editor.innerHTML\n }\n\n const newTab = {\n tabTitle: `Tab ${core.state.tabs.length + 1}`,\n tabId: uuidv4(),\n content: '<div><br></div>',\n children: []\n };\n\n core.state.tabs.push(newTab);\n core.history.tabs[newTab.tabId] = { stack: [], currentIndex: -1 };\n\n switchTab(core, newTab.tabId, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n}\n\nconst switchTab = (core, tabId, options) => {\n if (core.state.currentTabId === tabId) return;\n\n destroyImageResizer(options, core)\n destroyTableEditPlugin(options, core)\n destroyAnchorPopover(core)\n\n const currentTab = findTab(core.state.tabs, core.state.currentTabId);\n if (currentTab) {\n currentTab.content = core.elements.editor.innerHTML;\n }\n core.state.runtimeDom[core.state.currentTabId] = core.elements.editor.cloneNode(true);\n\n const nextTab = findTab(core.state.tabs, tabId);\n if (nextTab) {\n const runtimeNode = core.state.runtimeDom[tabId];\n core.state.currentTabId = nextTab.tabId;\n core.elements.editor.innerHTML = runtimeNode ? runtimeNode.innerHTML : nextTab.content;\n core.state.previousDOM = core.elements.editor.cloneNode(true)\n core.html = core.elements.editor.innerHTML\n\n if (!core.state.runtimeDom[tabId]) {\n core.state.runtimeDom[tabId] = core.elements.editor.cloneNode(true);\n core.onLocalSyncChanges({\n type: 'tabs:create',\n tabId,\n editorHTML: core.elements.editor.outerHTML\n })\n }\n renderTabs(core, options);\n\n core.updateCaretPosition();\n core.elements.editor.focus();\n\n if (core.elements.editorCursor) {\n core.elements.editorCursor.innerHTML = ''\n }\n core.onLocalSyncChanges({\n type: 'tabs:switch',\n tabId: nextTab.tabId\n })\n }\n}\n\nconst deleteTab = (core, tabId, options) => {\n const cleanupRuntimeDom = (tab) => {\n delete core.state.runtimeDom[tab.tabId];\n if (tab.children?.length) {\n tab.children.forEach(cleanupRuntimeDom);\n }\n };\n\n const cleanupHistory = (tab) => {\n delete core.history.tabs[tab.tabId];\n if (tab.children?.length) {\n tab.children.forEach(cleanupHistory);\n }\n };\n\n const deleteFromList = (list) => {\n const index = list.findIndex(t => t.tabId === tabId);\n if (index > -1) {\n list.splice(index, 1);\n return true;\n }\n for (const tab of list) {\n if (tab.children && deleteFromList(tab.children)) return true;\n }\n return false;\n };\n\n const tabToDelete = findTab(core.state.tabs, tabId);\n if (!tabToDelete) return;\n\n cleanupRuntimeDom(tabToDelete);\n cleanupHistory(tabToDelete);\n\n const isCurrentTabAffected = (tab) => {\n if (tab.tabId === core.state.currentTabId) return true;\n if (tab.children) {\n return tab.children.some(child => isCurrentTabAffected(child));\n }\n return false;\n };\n\n const shouldSwitch = isCurrentTabAffected(tabToDelete);\n\n deleteFromList(core.state.tabs);\n\n if (shouldSwitch) {\n if (core.state.tabs.length > 0) {\n switchTab(core, core.state.tabs[0].tabId, options);\n } else {\n createTab(core, options);\n }\n } else {\n renderTabs(core, options);\n }\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n}\n\nconst duplicateTab = (core, tab, options) => {\n const newTab = structuredClone(tab);\n newTab.tabId = uuidv4();\n newTab.tabTitle = `${newTab.tabTitle} (Copy)`;\n\n const updateIds = (t) => {\n t.tabId = uuidv4();\n core.history.tabs[t.tabId] = { stack: [], currentIndex: -1 };\n if (t.children) t.children.forEach(updateIds);\n };\n if (newTab.children) newTab.children.forEach(updateIds);\n\n core.history.tabs[newTab.tabId] = { stack: [], currentIndex: -1 };\n\n const insertIntoList = (list) => {\n const index = list.findIndex(t => t.tabId === tab.tabId);\n if (index > -1) {\n list.splice(index + 1, 0, newTab);\n return true;\n }\n for (const t of list) {\n if (t.children && insertIntoList(t.children)) return true;\n }\n return false;\n };\n\n insertIntoList(core.state.tabs);\n renderTabs(core, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n};\n\nconst addSublist = (core, parentTab, options) => {\n const newTab = {\n tabTitle: `Subtab ${(parentTab.children?.length || 0) + 1}`,\n tabId: uuidv4(),\n content: '<div><br></div>',\n children: []\n };\n core.history.tabs[newTab.tabId] = { stack: [], currentIndex: -1 };\n\n if (!parentTab.children) parentTab.children = [];\n parentTab.children.push(newTab);\n parentTab.isExpanded = true;\n\n renderTabs(core, options);\n switchTab(core, newTab.tabId, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n};\n\nconst moveTab = (core, tabId, direction, options) => {\n const moveInList = (list) => {\n const index = list.findIndex(t => t.tabId === tabId);\n if (index > -1) {\n if (direction === 'up' && index > 0) {\n [list[index - 1], list[index]] = [list[index], list[index - 1]];\n return true;\n }\n if (direction === 'down' && index < list.length - 1) {\n [list[index], list[index + 1]] = [list[index + 1], list[index]];\n return true;\n }\n return false;\n }\n for (const tab of list) {\n if (tab.children && moveInList(tab.children)) return true;\n }\n return false;\n };\n\n if (moveInList(core.state.tabs)) {\n renderTabs(core, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n }\n};\n\nconst moveTabRelative = (core, tabId, targetTabId, position, options) => {\n const sourceLoc = findTabLocation(core.state.tabs, tabId);\n if (!sourceLoc) return;\n\n const [tab] = sourceLoc.list.splice(sourceLoc.index, 1);\n const targetLoc = findTabLocation(core.state.tabs, targetTabId);\n\n if (targetLoc) {\n if (position === 'before') {\n targetLoc.list.splice(targetLoc.index, 0, tab);\n } else {\n targetLoc.list.splice(targetLoc.index + 1, 0, tab);\n }\n } else {\n sourceLoc.list.splice(sourceLoc.index, 0, tab);\n }\n renderTabs(core, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n};\n\nconst moveTabInto = (core, tabId, targetTabId, options) => {\n const sourceLoc = findTabLocation(core.state.tabs, tabId);\n if (!sourceLoc) return;\n\n const [tab] = sourceLoc.list.splice(sourceLoc.index, 1);\n const targetTab = findTab(core.state.tabs, targetTabId);\n\n if (targetTab) {\n if (!targetTab.children) targetTab.children = [];\n targetTab.children.push(tab);\n targetTab.isExpanded = true;\n }\n renderTabs(core, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n};\n\nconst outdentTab = (core, tabId, options) => {\n const location = findTabLocation(core.state.tabs, tabId);\n if (!location) return;\n const { list, index, parent } = location;\n\n if (parent) {\n const parentLocation = findTabLocation(core.state.tabs, parent.tabId);\n if (!parentLocation) return;\n\n const { list: parentList, index: parentIndex } = parentLocation;\n const tab = list[index];\n\n list.splice(index, 1);\n parentList.splice(parentIndex + 1, 0, tab);\n\n renderTabs(core, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n }\n};\n\nconst renameTab = (core, tabId, titleInput, options) => {\n const tab = findTab(core.state.tabs, tabId);\n if (!tab) return;\n\n titleInput.disabled = false;\n titleInput.style.pointerEvents = 'auto';\n titleInput.style.outline = '1px solid gray';\n\n titleInput.onclick = (e) => e.stopPropagation();\n\n let saved = false;\n const save = () => {\n if (saved) return;\n saved = true;\n if (titleInput.value.trim()) {\n tab.tabTitle = titleInput.value.trim();\n }\n renderTabs(core, options);\n core.onLocalSyncChanges({\n type: 'tabs:structure',\n tabs: structuredClone(core.state.tabs)\n })\n };\n\n titleInput.onblur = save;\n titleInput.onkeydown = (e) => {\n if (e.key === 'Enter') {\n save();\n }\n };\n\n titleInput.focus();\n titleInput.select();\n}\n\nconst validateAndFixTabId = (tabs) => {\n const ids = new Set();\n const traverse = (list) => {\n list.forEach(tab => {\n if (!tab.tabId || ids.has(tab.tabId)) {\n tab.tabId = uuidv4();\n }\n if (!tab.content) tab.content = '<div><br></div>';\n if (!tab.tabTitle) tab.tabTitle = 'Untitled Tab';\n\n ids.add(tab.tabId);\n if (tab.children && tab.children.length > 0) {\n traverse(tab.children);\n }\n });\n };\n traverse(tabs);\n}\n\nconst prepareTabs = (value) => {\n let initialTabs = [];\n if (Array.isArray(value) && value.length) {\n validateAndFixTabId(value);\n initialTabs = value;\n } else {\n initialTabs = [{\n tabTitle: 'Tab 1',\n tabId: uuidv4(),\n content: typeof value === 'string' ? value : '<div><br></div>',\n children: []\n }];\n }\n return initialTabs\n}\n\nexport {\n initTabs,\n renderTabs,\n findTab,\n prepareTabs,\n switchTab\n}\n","import { EMOJI_CATEGORIES, FONT_SIZE_OPTIONS, FONTS, FORMAT_OPTIONS, MIMETYPE, REGEX, SPECIAL_CHARACTERS, SVG, UNORDERED_LIST_OPTIONS, ORDERED_LIST_OPTIONS, CLASSES } from \"./constant\"\nimport { giphy, pexels, tenor } from \"./gallery\";\nimport { formatLink, changeAllToolbarState, changeToolbarHtmlByName, changeToolbarStateByName, changeToolbarValueByName, cleanHTML, constructEmbedUrl, extractSocialMediaId, isLinkValid, openModal, transformTextStyle, insertTOC, applyFormatBlockInListItem, normalizeHeadingWrappedLists, findAndReplace, } from \"./utilities\";\n\nconst applyTextFormat = (core, command) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand(command);\n core.updateCaretPosition()\n\n const isActive = core.elements.iframeWindow.queryCommandState(command);\n if (isActive) changeToolbarStateByName(core, 'active', [command])\n else changeToolbarStateByName(core, 'inactive', [command])\n}\n\nconst applyList = (core, { command, activePlugin, inactivePlugin }) => {\n core.elements.iframeWindow.execCommand(command);\n normalizeHeadingWrappedLists(core);\n core.elements.editor.focus();\n core.updateCaretPosition()\n\n const isActive = core.elements.iframeWindow.queryCommandState(command);\n changeToolbarStateByName(core, isActive ? 'active' : 'inactive', [activePlugin])\n changeToolbarStateByName(core, 'inactive', [inactivePlugin])\n}\n\nconst applyOrderList = (core) => applyList(core, {\n command: 'insertOrderedList',\n activePlugin: 'ordered_list',\n inactivePlugin: 'unordered_list'\n})\n\nconst applyUnorderedList = (core) => applyList(core, {\n command: 'insertUnorderedList',\n activePlugin: 'unordered_list',\n inactivePlugin: 'ordered_list'\n})\n\nconst PLUGINS = {\n 'undo': {\n title: 'Undo',\n icon: SVG.UNDO,\n type: 'button',\n click: (event, core) => {\n core.history.undo()\n core.updateCaretPosition()\n core.elements.editor.focus();\n }\n },\n 'redo': {\n title: 'Redo',\n icon: SVG.REDO,\n type: 'button',\n click: (event, core) => {\n core.history.redo()\n core.updateCaretPosition()\n core.elements.editor.focus();\n }\n },\n 'bold': {\n title: 'Bold',\n icon: SVG.BOLD,\n type: 'button',\n click: (event, core) => {\n applyTextFormat(core, 'bold')\n }\n },\n 'underline': {\n title: 'Underline',\n icon: SVG.UNDERLINE,\n type: 'button',\n click: (event, core) => {\n applyTextFormat(core, 'underline')\n }\n },\n 'italic': {\n title: 'Italic',\n icon: SVG.ITALIC,\n type: 'button',\n click: (event, core) => {\n applyTextFormat(core, 'italic')\n }\n },\n 'strike': {\n title: 'Strike',\n icon: SVG.STRIKE,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('strikeThrough');\n core.updateCaretPosition()\n\n const isActive = core.elements.iframeWindow.queryCommandState('strikeThrough');\n if (isActive) changeToolbarStateByName(core, 'active', ['strike'])\n else changeToolbarStateByName(core, 'inactive', ['strike'])\n }\n },\n 'align_justify': {\n title: 'Align Justify',\n icon: SVG.ALIGN_JUSTIFY,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('justifyFull');\n core.resizerHandler?.()\n core.updateCaretPosition()\n\n changeToolbarStateByName(core, 'active', ['align_justify'])\n changeToolbarStateByName(core, 'inactive', ['align_left', 'align_right', 'align_center'])\n }\n },\n 'align_left': {\n title: 'Align Left',\n icon: SVG.ALIGN_LEFT,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('justifyLeft');\n core.resizerHandler?.()\n core.updateCaretPosition()\n\n changeToolbarStateByName(core, 'active', ['align_left'])\n changeToolbarStateByName(core, 'inactive', ['align_justify', 'align_right', 'align_center'])\n }\n },\n 'align_right': {\n title: 'Align Right',\n icon: SVG.ALIGN_RIGHT,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('justifyRight');\n core.resizerHandler?.()\n core.updateCaretPosition()\n\n changeToolbarStateByName(core, 'active', ['align_right'])\n changeToolbarStateByName(core, 'inactive', ['align_justify', 'align_left', 'align_center'])\n }\n },\n 'align_center': {\n title: 'Align Center',\n icon: SVG.ALIGN_CENTER,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('justifyCenter');\n core.resizerHandler?.()\n core.updateCaretPosition()\n\n changeToolbarStateByName(core, 'active', ['align_center'])\n changeToolbarStateByName(core, 'inactive', ['align_justify', 'align_left', 'align_right'])\n }\n },\n 'code_view': {\n title: 'Code View',\n icon: SVG.CODE_VIEW,\n type: 'button',\n click: (event, core, options) => {\n if (core.state.isCodeViewOpen) {\n core.elements.codeview.style.display = 'none'\n core.elements.iframeContainer.style.display = 'block'\n if (core.elements.stepper) core.elements.stepper.style.display = 'flex'\n const _cleanHTML = cleanHTML(core.elements.codeview.value, options, core)\n core.onChange(_cleanHTML);\n core.elements.editor.innerHTML = _cleanHTML\n core.elements.editor.focus()\n changeAllToolbarState(core, 'enabled')\n } else {\n core.hidePlaceholder()\n core.elements.iframeContainer.style.display = 'none'\n if (core.elements.stepper) core.elements.stepper.style.display = 'none'\n core.elements.codeview.value = core.html\n core.elements.codeview.style.display = 'block'\n core.elements.codeview.focus()\n changeAllToolbarState(core, 'disabled', ['code_view'])\n }\n core.state.isCodeViewOpen = !core.state.isCodeViewOpen\n core.updateCaretPosition()\n }\n },\n 'remove_format': {\n title: \"Remove Format\",\n icon: SVG.REMOVE_FORMAT,\n type: 'button',\n click: (event, core) => {\n core.elements.iframeWindow.execCommand('removeFormat');\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'subscript': {\n title: 'Sub Script',\n icon: SVG.SUBSCRIPT,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('subscript');\n core.updateCaretPosition()\n\n const isActive = core.elements.iframeWindow.queryCommandState('subscript');\n if (isActive) changeToolbarStateByName(core, 'active', ['subscript'])\n else changeToolbarStateByName(core, 'inactive', ['subscript'])\n changeToolbarStateByName(core, 'inactive', ['superscript'])\n }\n },\n 'superscript': {\n title: 'Super Script',\n icon: SVG.SUPERSCRIPT,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('superscript');\n core.updateCaretPosition()\n\n const isActive = core.elements.iframeWindow.queryCommandState('superscript');\n if (isActive) changeToolbarStateByName(core, 'active', ['superscript'])\n else changeToolbarStateByName(core, 'inactive', ['superscript'])\n changeToolbarStateByName(core, 'inactive', ['subscript'])\n }\n },\n 'font': {\n title: 'Font',\n icon: 'Font',\n type: 'select',\n options: Object.keys(FONTS).map(font => ({\n label: FONTS[font], value: font\n })),\n width: '140px',\n click: (name, core, options) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('fontName', false, name);\n\n core.updateCaretPosition()\n changeToolbarValueByName(core, 'font', name)\n }\n },\n 'font-size': {\n title: 'Font Size',\n icon: 'Font Size',\n type: 'select',\n options: Object.keys(FONT_SIZE_OPTIONS).map(size => ({\n label: FONT_SIZE_OPTIONS[size], value: size\n })),\n width: '100px',\n click: (size, core, options) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('fontSize', false, parseInt(size));\n\n core.updateCaretPosition()\n changeToolbarValueByName(core, 'font-size', size)\n }\n },\n 'format-block': {\n title: 'Format Block',\n icon: 'Format',\n type: 'select',\n options: Object.keys(FORMAT_OPTIONS).map(format => ({\n label: FORMAT_OPTIONS[format], value: format\n })),\n width: '110px',\n click: (tag, core, options) => {\n core.elements.editor.focus();\n const isFormattedInList = applyFormatBlockInListItem(core, tag);\n if (!isFormattedInList) {\n core.elements.iframeWindow.execCommand('formatBlock', false, tag);\n }\n normalizeHeadingWrappedLists(core);\n\n core.updateCaretPosition()\n changeToolbarValueByName(core, 'format-block', tag)\n }\n },\n 'ordered_list': {\n title: \"Ordered List\",\n icon: SVG.LIST_NUMBER,\n type: 'button-select',\n options: Object.keys(ORDERED_LIST_OPTIONS).map(list => ({\n label: ORDERED_LIST_OPTIONS[list], value: list\n })),\n click: (value, core, options) => {\n core.elements.editor.focus();\n const isActive = core.elements.iframeWindow.queryCommandState('insertOrderedList');\n if (!isActive) {\n core.elements.iframeWindow.execCommand('insertOrderedList');\n normalizeHeadingWrappedLists(core);\n }\n const selection = core.elements.iframeWindow.getSelection();\n if (selection.rangeCount > 0) {\n let node = selection.anchorNode;\n while (node && node.nodeName !== 'OL' && node !== core.elements.editor) {\n node = node.parentNode;\n }\n if (node?.nodeName === 'OL') {\n node.setAttribute('type', value);\n }\n }\n core.updateCaretPosition()\n changeToolbarStateByName(core, 'active', ['ordered_list'])\n changeToolbarStateByName(core, 'inactive', ['unordered_list'])\n },\n mainClick: (event, core, options) => {\n core.elements.editor.focus();\n applyOrderList(core)\n }\n },\n 'unordered_list': {\n title: \"Unordered List\",\n icon: SVG.LIST_BULLETS,\n type: 'button-select',\n options: Object.keys(UNORDERED_LIST_OPTIONS).map(list => ({\n label: UNORDERED_LIST_OPTIONS[list], value: list\n })),\n click: (value, core, options) => {\n core.elements.editor.focus();\n const isActive = core.elements.iframeWindow.queryCommandState('insertUnorderedList');\n if (!isActive) {\n core.elements.iframeWindow.execCommand('insertUnorderedList');\n normalizeHeadingWrappedLists(core);\n }\n const selection = core.elements.iframeWindow.getSelection();\n if (selection.rangeCount > 0) {\n let node = selection.anchorNode;\n while (node && node.nodeName !== 'UL' && node !== core.elements.editor) {\n node = node.parentNode;\n }\n if (node?.nodeName === 'UL') {\n node.style.listStyleType = value;\n }\n }\n core.updateCaretPosition()\n changeToolbarStateByName(core, 'active', ['unordered_list'])\n changeToolbarStateByName(core, 'inactive', ['ordered_list'])\n },\n mainClick: (event, core, options) => {\n core.elements.editor.focus();\n applyUnorderedList(core)\n }\n },\n 'line_height': {\n title: 'Line Height',\n icon: SVG.LINE_HEIGHT,\n type: 'dropdown',\n options: [\n { label: \"Normal\", value: \"normal\" },\n { label: \"1.0\", value: \"1.0\" },\n { label: \"1.5\", value: \"1.5\" },\n { label: \"2.0\", value: \"2.0\" },\n { label: \"2.5\", value: \"2.5\" },\n { label: \"3.0\", value: \"3.0\" },\n ],\n click: (event, core, options) => {\n core.elements.editor.focus();\n const selection = core.elements.iframeWindow.getSelection();\n const range = selection.getRangeAt(0);\n const selectedNode = range.commonAncestorContainer;\n // Traverse up to the block element\n let blockElement = selectedNode;\n while (blockElement && blockElement.nodeType === Node.TEXT_NODE) {\n blockElement = blockElement.parentNode;\n }\n if (blockElement && blockElement !== core.elements.editor) blockElement.style.lineHeight = event.target.getAttribute('data-value');\n\n core.updateCaretPosition()\n },\n },\n 'font_color': {\n title: 'Font color',\n icon: SVG.FONT_COLOR, // Assuming SVG icon for color picker\n type: \"color\",\n change: (event, core, options) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('foreColor', false, event.target.value); // Apply color to selected text\n core.updateCaretPosition()\n }\n },\n 'remove_font_color': {\n title: 'Remove Font Color',\n icon: `${SVG.REMOVE_FORMAT}${SVG.FONT_COLOR}`,\n type: \"reset-color\",\n click: (event, core, options) => {\n if (!core.state.range) return;\n core.elements.editor.focus();\n const container = document.createElement('div');\n const clonedContents = core.state.range.cloneContents();\n container.appendChild(clonedContents);\n if (container.innerHTML === container.innerText) {\n const parentEl = core.state.range.startContainer.parentElement;\n parentEl.removeAttribute('color');\n parentEl.style.removeProperty('color');\n\n } else {\n container.querySelectorAll('[style]').forEach((el) => {\n el.style.removeProperty('color');\n if (!el.getAttribute('style')) {\n el.removeAttribute('style');\n }\n });\n container.querySelectorAll('font[color]').forEach((el) => {\n el.removeAttribute('color');\n });\n }\n core.state.range.deleteContents();\n const frag = document.createDocumentFragment();\n Array.from(container.childNodes).forEach((node) => {\n frag.appendChild(node);\n });\n core.state.range.insertNode(frag);\n core.updateCaretPosition();\n }\n\n },\n 'highlight_color': {\n title: 'Highlight Color',\n icon: SVG.HIGHLIGHT_COLOR,\n type: \"color\",\n change: (event, core, options) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('hiliteColor', false, event.target.value); // Apply color to selected text\n core.updateCaretPosition()\n }\n },\n 'remove_highlight_color': {\n title: 'Remove Highlight Color',\n icon: `${SVG.REMOVE_FORMAT}${SVG.HIGHLIGHT_COLOR}`,\n type: \"reset-color\",\n click: (event, core, options) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('hiliteColor', false, \"transparent\"); // Apply color to selected text\n core.updateCaretPosition()\n }\n },\n 'text_style': {\n title: 'Text Style',\n icon: SVG.TEXT_STYLE,\n type: 'dropdown',\n options: [\n { label: 'Block Quote', value: 'blockquote' },\n { label: 'Code', value: 'code' },\n { label: 'Translucent', value: 'translucent' },\n { label: 'Shadow', value: 'shadow' },\n { label: 'Upper Case', value: 'upper_case' },\n { label: 'Lower Case', value: 'lower_case' },\n { label: 'Title Case', value: 'title_case' },\n { label: 'Button (Green)', value: 'button_green' },\n { label: 'Button (Black)', value: 'button_black' }\n ],\n click: (event, core, options) => {\n if (!core.state.range) return\n switch (event.target.getAttribute('data-value')) {\n case 'code': {\n const code = document.createElement('code');\n code.textContent = core.state.range.toString();\n core.state.range.deleteContents();\n core.state.range.insertNode(code);\n break;\n }\n case 'translucent': {\n const translucent = document.createElement('span');\n translucent.textContent = core.state.range.toString();\n translucent.style.backgroundColor = 'rgba(200, 151, 231, 0.3)'; // Adjust opacity as needed\n core.state.range.deleteContents();\n core.state.range.insertNode(translucent);\n break;\n }\n case 'shadow': {\n const shadow = document.createElement('span');\n shadow.textContent = core.state.range.toString();\n shadow.style.textShadow = '2px 2px 4px rgba(0, 0, 0, 0.3)'; // Adjust opacity as needed\n core.state.range.deleteContents();\n core.state.range.insertNode(shadow);\n break;\n }\n case 'blockquote': {\n const code = document.createElement('blockquote');\n code.textContent = core.state.range.toString();\n core.state.range.deleteContents();\n core.state.range.insertNode(code);\n break;\n }\n case 'upper_case': {\n transformTextStyle(core, 'upper_case');\n break;\n }\n case 'lower_case': {\n transformTextStyle(core, 'lower_case');\n break;\n }\n case 'title_case': {\n transformTextStyle(core, 'title_case');\n break;\n }\n case 'button_green': {\n core.updateCaretPosition()\n const span = document.createElement('span');\n span.textContent = core.state.range.toString();\n span.style.cssText = 'background-color: #28a745; color: white; font-weight: bold; padding: 8px; border-radius: 4px; text-decoration: none; display: inline-block; cursor: pointer;';\n span.contentEditable = 'false';\n let element = core.state.range.commonAncestorContainer;\n if (element.nodeType === Node.TEXT_NODE) element = element.parentElement;\n if (element.nodeName === 'A') {\n element.style.cssText = 'background-color: #28a745; color: white; font-weight: bold; padding: 8px; border-radius: 4px; text-decoration: none; display: inline-block; cursor: pointer;';\n } else if (span.textContent && !['TR', 'TBODY', 'THEAD', 'TABLE'].includes(element.nodeName)) {\n core.state.range.deleteContents();\n core.state.range.insertNode(span);\n }\n break;\n }\n case 'button_black': {\n core.updateCaretPosition()\n const span = document.createElement('span');\n span.textContent = core.state.range.toString();\n span.style.cssText = 'background-color: black; color: white; font-weight: bold; padding: 8px; border-radius: 4px; text-decoration: none; display: inline-block; cursor: pointer;';\n span.contentEditable = 'false';\n let element = core.state.range.commonAncestorContainer;\n if (element.nodeType === Node.TEXT_NODE) element = element.parentElement;\n if (element.nodeName === 'A') {\n element.style.cssText = 'background-color: black; color: white; font-weight: bold; padding: 8px; border-radius: 4px; text-decoration: none; display: inline-block; cursor: pointer;';\n } else if (span.textContent && !['TR', 'TBODY', 'THEAD', 'TABLE'].includes(element.nodeName)) {\n core.state.range.deleteContents();\n core.state.range.insertNode(span);\n }\n break;\n }\n }\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'paragraph_style': {\n title: 'Paragraph Style',\n icon: SVG.PARAGRAPH_STYLE, // Assuming SVG icon for paragraph style\n type: 'dropdown',\n options: [\n { label: 'Spaced', value: 'letter-spacing: 2px;' },\n { label: 'Neon', value: `color: #FD7500; text-shadow: 0 0 5px #02B59F,0 0 10px #022422,0 0 15px #FF9F03,0 0 20px #02B59F,0 0 25px #017562;font-weight: bold;` },\n { label: 'Bordered', value: 'border: 2px solid black; padding: 5px;' }\n ],\n click: (event, core, option) => {\n core.elements.editor.focus();\n const selection = core.elements.iframeWindow.getSelection();\n const range = selection.getRangeAt(0);\n const selectedNode = range.commonAncestorContainer;\n // Traverse up to the block element\n let blockElement = selectedNode;\n while (blockElement && blockElement.nodeType === Node.TEXT_NODE) {\n blockElement = blockElement.parentNode;\n }\n if (blockElement && blockElement !== core.elements.editor) blockElement.style.cssText = event.target.getAttribute('data-value');\n\n core.updateCaretPosition()\n }\n },\n 'outdent': {\n title: 'Outdent',\n icon: SVG.OUTDENT,\n type: 'button',\n click: (event, core, options) => {\n if (!core.state.range) return\n\n const selectedNode = core.state.range.commonAncestorContainer;\n\n // Traverse up to the block element\n let blockElement = selectedNode;\n while (blockElement && blockElement.nodeType === Node.TEXT_NODE) {\n blockElement = blockElement.parentNode;\n }\n\n if (blockElement) {\n // Decrease the margin-left (outdent)\n const currentIndent = parseInt(blockElement.style.marginLeft || '0', 10);\n blockElement.style.marginLeft = Math.max(0, currentIndent - 40) + 'px';\n }\n core.updateCaretPosition()\n core.elements.editor.focus();\n }\n },\n 'indent': {\n title: 'Indent',\n icon: SVG.INDENT,\n type: 'button',\n click: (event, core, options) => {\n if (!core.state.range) return\n\n const selectedNode = core.state.range.commonAncestorContainer;\n\n // Traverse up to the block element\n let blockElement = selectedNode;\n while (blockElement && blockElement.nodeType === Node.TEXT_NODE) {\n blockElement = blockElement.parentNode;\n }\n\n if (blockElement) {\n // Increase the margin-left (indent)\n const currentIndent = parseInt(blockElement.style.marginLeft || '0', 10);\n blockElement.style.marginLeft = (currentIndent + 40) + 'px';\n }\n core.updateCaretPosition()\n core.elements.editor.focus();\n }\n },\n 'link': {\n title: 'Link',\n icon: SVG.LINK,\n type: 'button',\n click: (event, core, options) => {\n const onInputKeydown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n button.click();\n }\n }\n\n\n /* --------------- If image or text is already have link then show that link and text in respective input fields ----------------- */\n let anchorLink = ''\n let anchorText = '';\n let underAnchor = false;\n if (core.elements.selectedElement && core.elements.selectedElement.tagName === 'IMG') {\n const imgElement = core.elements.selectedElement;\n if (imgElement) {\n const imgParentNode = imgElement.parentNode\n if (imgParentNode.nodeName === 'A') {\n anchorLink = imgParentNode.href\n anchorText = imgElement.alt || ''\n underAnchor = true\n }\n }\n } else if (core.state.range) {\n const selection = core.state.selection;\n if (selection.rangeCount > 0) {\n const range = core.state.range;\n let parentElement = range.commonAncestorContainer;\n\n // If the commonAncestorContainer is a text node, use its parent element\n if (parentElement.nodeType === Node.TEXT_NODE) {\n parentElement = parentElement.parentNode;\n }\n\n if (parentElement.nodeName === 'A') {\n anchorLink = parentElement.getAttribute('href')\n anchorText = parentElement.innerText || ''\n underAnchor = true\n }\n }\n }\n const body = document.createElement('div')\n const linkLabel = document.createElement(\"label\");\n linkLabel.innerText = \"Link\";\n linkLabel.style.display = \"block\";\n linkLabel.style.paddingLeft = \"4px\";\n\n const inputLink = document.createElement('input');\n inputLink.value = anchorLink\n inputLink.type = 'text'\n inputLink.placeholder = 'Insert link, mail, phone no'\n inputLink.addEventListener('keydown', onInputKeydown);\n\n const textLabel = document.createElement(\"label\");\n textLabel.innerText = \"Link Text\";\n textLabel.style.display = \"block\";\n textLabel.style.paddingLeft = \"4px\";\n textLabel.style.marginTop = \"8px\";\n\n const inputText = document.createElement('input');\n inputText.value = anchorText\n inputText.type = 'text'\n inputText.placeholder = 'Link text'\n inputText.addEventListener('keydown', onInputKeydown);\n\n const span = document.createElement('span');\n span.className = 'warning'\n body.append(linkLabel, inputLink, span, textLabel, inputText);\n\n const footer = document.createElement('div')\n const button = document.createElement('button')\n button.type = 'button';\n button.className = 'submit';\n button.innerText = 'Add';\n footer.append(button)\n\n const modal = openModal({\n title: \"Link\",\n bodyNode: body,\n footerNode: footer,\n\n }, core, options)\n inputLink.focus()\n\n button.onclick = () => {\n const link = formatLink(inputLink.value);\n const value = inputText.value\n if (isLinkValid(link)) {\n if (underAnchor) {\n if (core.elements.selectedElement && core.elements.selectedElement.tagName === 'IMG') {\n const imgElement = core.elements.selectedElement;\n if (imgElement) {\n const imgParentNode = imgElement.parentNode\n if (imgParentNode.nodeName === 'A') {\n imgParentNode.href = link\n imgElement.alt = value\n }\n }\n } else if (core.state.range) {\n const selection = core.state.selection;\n if (selection.rangeCount > 0) {\n const range = core.state.range;\n let parentElement = range.commonAncestorContainer;\n\n // If the commonAncestorContainer is a text node, use its parent element\n if (parentElement.nodeType === Node.TEXT_NODE) {\n parentElement = parentElement.parentNode;\n }\n\n if (parentElement.nodeName === 'A') {\n parentElement.setAttribute('href', link)\n parentElement.innerText = value\n }\n }\n }\n } else if (core.elements.selectedElement && core.elements.selectedElement.tagName === 'IMG') {\n const a = document.createElement('a');\n a.href = link\n a.target = '_blank'\n core.elements.selectedElement.parentNode.insertBefore(a, core.elements.selectedElement);\n a.appendChild(core.elements.selectedElement);\n core.elements.selectedElement.alt = value\n } else {\n const a = document.createElement('a');\n a.href = link\n a.target = '_blank'\n a.textContent = value || link\n core.insertNode(a);\n }\n modal.close()\n core.elements.editor.focus();\n } else {\n span.innerText = 'Invalid URL'\n }\n };\n core.updateCaretPosition()\n }\n },\n 'unlink': {\n title: 'Unlink',\n icon: SVG.UNLINK,\n type: 'button',\n click: (event, core, options) => {\n core.elements.iframeWindow.execCommand('unlink');\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'horizontal_rule': {\n title: 'Horizontal Rule',\n icon: SVG.HORIZONTAL_RULE,\n type: 'button',\n click: (event, core, options) => {\n core.elements.iframeWindow.execCommand('insertHorizontalRule');\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'table': {\n title: 'Table',\n icon: SVG.TABLE,\n type: 'table',\n create: (core, options, { rows, cols, header }) => {\n const table = document.createElement('table');\n table.style.borderCollapse = 'collapse';\n table.style.width = core.elements.editor.offsetWidth - 50 + 'px';\n\n for (let i = 0; i <= rows; i++) {\n const tr = document.createElement('tr');\n for (let j = 0; j <= cols; j++) {\n const td = i === 0 && header ? document.createElement('th') : document.createElement('td');\n td.style.border = '1px solid black';\n td.appendChild(document.createTextNode('\\u00A0')); // Non-breaking space\n tr.appendChild(td);\n }\n table.appendChild(tr);\n }\n\n core.insertNode(table);\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'mention': {\n title: 'Mention',\n icon: SVG.MENTION,\n type: 'mention',\n },\n 'emoji': {\n title: 'Emoji',\n icon: SVG.EMOJI,\n type: 'category',\n categories: EMOJI_CATEGORIES\n },\n 'special_character': {\n title: 'Special Character',\n icon: SVG.SPECIAL_CHARACTER,\n type: 'category',\n categories: SPECIAL_CHARACTERS\n },\n 'pexels': {\n title: 'Pexels',\n icon: SVG.PEXELS,\n type: 'gallery',\n suggestions: async (options, page) => pexels.suggestions(options, page),\n search: async (options, search, page) => pexels.search(options, search, page),\n },\n 'giphy': {\n title: 'GIPHY',\n icon: SVG.GIPHY_SVG,\n type: 'gallery',\n suggestions: async (options, page) => giphy.suggestions(options, page),\n search: async (options, search, page) => giphy.search(options, search, page),\n },\n 'tenor': {\n title: 'Tenor',\n icon: SVG.TENOR,\n type: 'gallery',\n suggestions: async (options, next) => tenor.suggestions(options, next),\n search: async (options, search) => tenor.search(options, search),\n },\n 'image': {\n title: \"Image\",\n icon: SVG.IMAGE,\n type: 'dropdown',\n options: [\n { label: 'Upload from device', value: 'upload' },\n { label: 'Using Link', value: 'link' },\n ],\n click: async (event, core, options) => {\n if (event.target.getAttribute('data-value') === 'upload') {\n\n const onInputKeydown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n button.click();\n }\n };\n\n // Top\n const top = document.createElement('div');\n top.style.display = 'flex';\n top.style.gap = '16px';\n\n // Top - left\n const left = document.createElement('div');\n left.style.display = 'flex';\n left.style.flexDirection = 'column';\n left.style.gap = '16px';\n left.style.flex = '1';\n\n const uploadBox = document.createElement('div');\n uploadBox.className = `${options.classPrefix}${CLASSES.UPLOAD_IMG_BOX}`;\n uploadBox.innerHTML = `\n <div style=\"text-align: center; color: #6b7280;\">\n <div style=\"font-size: 32px; font-weight: 500;\">+</div>\n <div style=\"font-size: 14px;\">Click to browse files</div>\n </div>\n `;\n\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = MIMETYPE.IMAGE;\n fileInput.style.display = 'none';\n uploadBox.addEventListener('click', () => fileInput.click());\n\n left.append(uploadBox, fileInput);\n\n // Top - right\n const right = document.createElement('div');\n right.style.display = 'flex';\n right.style.flexDirection = 'column';\n right.style.flex = '1';\n\n const previewBox = document.createElement('div');\n previewBox.className = `${options.classPrefix}${CLASSES.UPLOAD_IMG_PREVIEW_BOX}`;\n\n const imgPreview = document.createElement('img');\n imgPreview.className = `${options.classPrefix}${CLASSES.UPLOAD_IMG_PREVIEW}`;\n imgPreview.style.display = 'none';\n\n previewBox.append(imgPreview);\n right.append(previewBox);\n\n // Complete top\n top.append(left, right)\n\n // other fields\n const span = document.createElement('div');\n span.className = 'warning';\n\n const altLabel = document.createElement('label');\n altLabel.innerText = 'Image Description (Alt Text)';\n altLabel.style.display = \"block\";\n altLabel.style.paddingLeft = \"4px\";\n altLabel.style.marginTop = '4px';\n altLabel.style.marginBottom = '4px';\n\n const altInput = document.createElement('input');\n altInput.type = 'text';\n altInput.placeholder = 'Alternative Text';\n altInput.addEventListener('keydown', onInputKeydown);\n\n const body = document.createElement('div');\n body.append(top, span, altLabel, altInput);\n\n // Footer\n const footer = document.createElement('div');\n footer.style.display = 'flex';\n footer.style.justifyContent = 'space-between';\n footer.style.alignItems = 'center';\n\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'submit';\n button.innerText = 'Add';\n\n footer.append(button);\n\n const modal = openModal(\n {\n title: \"Upload Image\",\n bodyNode: body,\n footerNode: footer,\n },\n core,\n options\n );\n let base64String = '';\n\n fileInput.addEventListener('change', (event) => {\n const file = event.target.files[0];\n if (file && MIMETYPE.IMAGE.includes(file.type)) {\n const reader = new FileReader();\n reader.onload = () => {\n base64String = reader.result;\n imgPreview.src = base64String;\n imgPreview.style.display = 'block';\n };\n reader.readAsDataURL(file);\n span.innerText = \"\";\n }\n });\n\n fileInput.addEventListener('click', async () => {\n let fileFromNative = await core.handleFilePicker(MIMETYPE.IMAGE.split(','), 'image');\n\n if (fileFromNative) {\n base64String = fileFromNative.data;\n fileNameSpan.innerText = fileFromNative.name;\n imgPreview.src = base64String;\n imgPreview.style.display = 'block';\n span.innerText = \"\"; // Clear warning if file is selected\n\n }\n });\n\n button.onclick = async () => {\n if (!base64String) {\n span.innerText = 'Image not selected';\n return;\n }\n button.disabled = true;\n const originalText = button.innerText;\n button.innerHTML = ` <span style=\"margin-left: 8px;\">${originalText}</span> ${SVG.SPINNER}`\n const img = document.createElement('img');\n img.src = await core.manuplateImage('base64', base64String);\n img.alt = altInput.value || \"\";\n button.innerText = originalText\n\n core.insertNode(img);\n modal.close();\n };\n\n }\n else if (event.target.getAttribute('data-value') === 'link') {\n const onInputKeydown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n button.click();\n }\n }\n\n const body = document.createElement('div')\n\n const linkLabel = document.createElement(\"label\");\n linkLabel.innerText = \"Link\";\n linkLabel.style.display = \"block\";\n linkLabel.style.paddingLeft = \"4px\";\n\n const input = document.createElement('input');\n input.value = ''\n input.type = 'text'\n input.placeholder = 'Insert the link'\n input.addEventListener('keydown', onInputKeydown);\n\n const textLabel = document.createElement(\"label\");\n textLabel.innerText = \"Alternative Text\";\n textLabel.style.display = \"block\";\n textLabel.style.marginTop = \"8px\";\n textLabel.style.paddingLeft = \"4px\";\n\n const altInput = document.createElement('input');\n altInput.value = ''\n altInput.style.marginTop = '4px'\n altInput.type = 'text'\n altInput.placeholder = 'Alternative Text'\n altInput.addEventListener('keydown', onInputKeydown);\n\n const span = document.createElement('span');\n span.className = 'warning'\n body.append(linkLabel, input, span, textLabel, altInput);\n\n const footer = document.createElement('div')\n const button = document.createElement('button')\n button.type = 'button';\n button.className = 'submit';\n button.innerText = 'Add';\n footer.append(button)\n\n const modal = openModal({\n title: \"Image\",\n bodyNode: body,\n footerNode: footer,\n\n }, core, options)\n\n button.onclick = () => {\n const value = input.value\n if (REGEX.URL.test(value)) {\n button.disabled = true;\n const img = document.createElement('img');\n img.src = value\n img.alt = altInput.value\n core.insertNode(img);\n modal.close()\n } else {\n span.innerText = 'Invalid url'\n }\n };\n }\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'video': {\n title: \"Video\",\n icon: SVG.VIDEO,\n type: 'button',\n click: (event, core) => {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.accept = MIMETYPE.VIDEO\n fileInput.style.display = 'none';\n fileInput.addEventListener('change', async (event) => {\n const file = event.target.files[0]\n if (MIMETYPE.VIDEO.includes(file.type)) {\n const url = await core.uploadVideo(file);\n if (url) {\n const a = document.createElement('a');\n a.href = url.videoUrl\n a.dataset.leksyPreview = 'video-url'\n a.target = '_blank'\n const img = document.createElement('img');\n img.src = url.thumbnailUrl\n a.appendChild(img)\n core.insertNode(a);\n }\n }\n });\n\n fileInput.addEventListener('click', async () => {\n let file = await core.handleFilePicker(MIMETYPE.VIDEO.split(','), 'video');\n if (file && MIMETYPE.VIDEO.includes(file?.type)) {\n const url = await core.uploadVideo(file);\n if (url) {\n const a = document.createElement('a');\n a.href = url.videoUrl\n a.dataset.leksyPreview = 'video-url'\n a.target = '_blank'\n const img = document.createElement('img');\n img.src = url.thumbnailUrl\n a.appendChild(img)\n core.insertNode(a);\n }\n }\n });\n\n fileInput.click();\n core.updateCaretPosition()\n core.elements.editor.focus();\n }\n },\n 'attachment': {\n title: 'Attachment',\n icon: SVG.ATTACHMENT,\n type: 'button',\n click: (event, core) => {\n const fileInput = document.createElement('input');\n fileInput.type = 'file';\n fileInput.style.display = 'none';\n fileInput.multiple = true;\n fileInput.addEventListener('change', (event) => {\n core.onAttachment(event.target.files);\n });\n\n fileInput.addEventListener('click', async () => {\n let files = await core.handleFilePicker([\"*\"], 'attachment');\n if (files) {\n core.onAttachment(files);\n }\n\n });\n fileInput.click();\n core.updateCaretPosition()\n }\n },\n 'cut': {\n title: 'Cut',\n icon: SVG.CUT,\n type: 'button',\n click: (event, core) => {\n if (!core.state.range) return\n core.elements.editor.focus();\n\n const container = document.createElement('div');\n container.appendChild(core.state.range.cloneContents());\n const htmlContent = container.innerHTML;\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([htmlContent], { type: 'text/html' })\n });\n navigator.clipboard.write([clipboardItem]).then(() => {\n core.state.range.deleteContents();\n core.updateCaretPosition();\n })\n }\n },\n 'copy': {\n title: 'Copy',\n icon: SVG.COPY,\n type: 'button',\n click: (event, core) => {\n if (!core.state.range) return\n core.elements.editor.focus();\n\n const container = document.createElement('div');\n container.appendChild(core.state.range.cloneContents());\n const htmlContent = container.innerHTML;\n\n const clipboardItem = new ClipboardItem({\n 'text/html': new Blob([htmlContent], { type: 'text/html' })\n });\n navigator.clipboard.write([clipboardItem]).then(() => {\n core.updateCaretPosition();\n })\n }\n },\n 'paste': {\n title: 'Paste',\n icon: SVG.PASTE,\n type: 'button',\n click: async (event, core) => {\n core.elements.editor.focus();\n\n const clipboardItems = await navigator.clipboard.read();\n let pastedContentNode;\n\n for (const item of clipboardItems) {\n if (item.types.includes('text/html')) {\n const blob = await item.getType('text/html');\n const container = document.createElement('div');\n if (blob) {\n container.innerHTML = await blob.text();\n pastedContentNode = container;\n }\n break;\n } else if (item.types.includes('text/plain')) {\n const blob = await item.getType('text/plain');\n const plainTextContent = await blob.text();\n pastedContentNode = document.createTextNode(plainTextContent);\n break;\n }\n else if (item.types.find(type => type.startsWith('image/'))) {\n const blob = await item.getType(item.types.find(type => type.startsWith('image/')));\n const reader = new FileReader();\n\n reader.onload = async function (event) {\n const img = document.createElement('img');\n const base64String = event.target.result;\n img.src = await core.manuplateImage('base64', base64String);\n pastedContentNode = img;\n };\n\n reader.readAsDataURL(blob);\n break;\n }\n }\n if (pastedContentNode) {\n core.state.range.deleteContents();\n core.insertNode(pastedContentNode)\n }\n core.updateCaretPosition();\n }\n },\n 'select_all': {\n title: 'Select All',\n icon: SVG.SELECT_ALL,\n type: 'button',\n click: (event, core) => {\n core.elements.editor.focus();\n core.elements.iframeWindow.execCommand('selectAll');\n core.updateCaretPosition()\n }\n },\n 'fullscreen': {\n title: 'Full screen',\n icon: SVG.FULLSCREEN,\n type: 'button',\n click: (event, core) => {\n const isExists = core.elements.base.classList.toggle('fullscreen')\n changeToolbarHtmlByName(core, 'fullscreen', isExists ? SVG.FULLSCREEN_EXIT : SVG.FULLSCREEN)\n }\n },\n 'print': {\n title: 'Print',\n icon: SVG.PRINT,\n type: 'button',\n click: (event, core) => {\n core.elements.iframeContainer.contentWindow.print()\n }\n },\n 'embed': {\n title: 'Embed Link',\n icon: SVG.EMBED,\n type: 'button',\n click: (event, core, options) => {\n const onInputKeydown = (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n button.click();\n }\n };\n\n const body = document.createElement('div');\n body.className = \"link\"\n\n // Input for Embed URL\n const embedLabel = document.createElement(\"label\");\n embedLabel.innerText = \"Embed URL\";\n embedLabel.style.display = \"block\";\n embedLabel.style.paddingLeft = \"4px\";\n const urlInput = document.createElement('input');\n urlInput.type = 'text';\n urlInput.placeholder = 'Enter Embed URL';\n urlInput.style.marginBottom = '10px';\n urlInput.addEventListener('keydown', onInputKeydown);\n\n // Input for Width (%)\n const widthLabel = document.createElement(\"label\");\n widthLabel.innerText = \"Width\";\n widthLabel.style.display = \"block\";\n widthLabel.style.paddingLeft = \"4px\";\n const widthInput = document.createElement('input');\n widthInput.type = 'text';\n widthInput.placeholder = 'Width (px)';\n widthInput.style.marginBottom = '10px';\n widthInput.value = \"400\"; // Default to 400px\n\n // Input for Height (%)\n const heightLabel = document.createElement(\"label\");\n heightLabel.innerText = \"Height\";\n heightLabel.style.display = \"block\";\n heightLabel.style.paddingLeft = \"4px\";\n const heightInput = document.createElement('input');\n heightInput.type = 'text';\n heightInput.placeholder = 'Height (px)';\n heightInput.style.marginBottom = '10px';\n heightInput.value = \"400\"; // Default to 400px\n\n // Warning span\n const span = document.createElement('span');\n span.className = 'warning';\n\n body.append(embedLabel, urlInput, widthLabel, widthInput, heightLabel, heightInput, span);\n\n const footer = document.createElement('div');\n const button = document.createElement('button');\n button.type = 'button';\n button.className = 'submit';\n button.innerText = 'Add';\n footer.append(button);\n\n const modal = openModal(\n {\n title: \"Embed URL\",\n bodyNode: body,\n footerNode: footer,\n },\n core,\n options\n );\n\n button.onclick = () => {\n const enteredUrl = urlInput.value.trim();\n\n const { platform, id } = extractSocialMediaId(enteredUrl);\n if (!platform || !id) {\n span.innerText = 'Invalid URL';\n return;\n }\n\n const url = constructEmbedUrl(platform, id);\n if (!url) {\n span.innerText = 'Unsupported platform';\n return;\n }\n const wrapper = document.createElement('figure');\n wrapper.className = 'iframe-wrapper';\n wrapper.style.height = `${heightInput.value}px`\n wrapper.style.width = `${widthInput.value}px`\n const embed = document.createElement('iframe');\n embed.src = url;\n embed.style.display = \"inline-block\"\n embed.style.height = \"100%\"\n embed.style.width = \"100%\"\n embed.style.border = \"none\";\n wrapper.append(embed)\n core.insertNode(wrapper);\n modal.close();\n };\n core.elements.editor.focus();\n core.updateCaretPosition()\n }\n },\n 'table_of_content': {\n title: 'Table of Content',\n icon: SVG.TABLE_OF_CONTENT,\n type: 'button',\n click: (event, core, options) => {\n insertTOC(core, options);\n }\n },\n 'find_and_replace': {\n title: 'Find And Replace',\n icon: SVG.FIND_AND_REPLACE,\n type: 'button',\n click: (event, core, options) => {\n findAndReplace(core, options, { key: 'f' });\n }\n },\n\n}\n\nexport default PLUGINS\nexport {\n applyTextFormat,\n applyOrderList,\n applyUnorderedList\n}\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MA4FhB,WAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkLZ,mBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KA6BxB,EAEMC,GAAkB,CA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","names":["src_exports","__export","convertHtmlToText","src_default","isHTMLEmpty","__toCommonJS","WHILE_LISTED_TAG","WHILE_LISTED_ATTRIBUTES","BLOCKED_STYLES","REGEX","ERRORS","CLASSES","SVG","MIMETYPE","SOCIAL_MEDIA_PATTERNS","SOCIAL_MEDIA_BASEURLS","CSS_VARIABLES","CSS","RESIZER_PLUGINS","TABLE_PLUGINS","EMOJI_CATEGORIES","SPECIAL_CHARACTERS","FONTS","FONT_SIZE_OPTIONS","FONT_SIZES","FORMAT_OPTIONS","FORMATS","GIPHY_POWERED_IMAGE","TAB_CATEGORIES","ORDERED_LIST_OPTIONS","UNORDERED_LIST_OPTIONS","RESIZE_MARGIN","BLOCK_FORMAT_TAGS","LIST_STYLES_BY_LEVEL","UNORDERED_LIST_STYLES_BY_LEVEL","COLLABORATION_COLORS","giphy","options","search","page","response","data","pagination","gif","error","pexels","photos","total_results","photo","tenor","next","import_diff_dom","import_uuid","import_uuid","initTabs","core","options","tabsContainer","renderTabs","findTabLocation","list","tabId","parent","i","result","findTab","tabs","tab","found","isDescendant","parentId","childId","renderLevel","container","level","tabItem","e","draggedId","rect","relY","height","moveTabRelative","moveTabInto","clickTimer","switchTab","renameTab","titleInput","leftSection","hasChildren","arrow","SVG","menuBtn","showContextMenu","span","tabItemContainer","outlineContainer","insertOutlinesItems","childrenContainer","tabListContainer","tabHeader","headerTitle","rightDiv","addBtn","createTab","expandBtn","event","existingMenu","menu","closeMenu","createOption","text","icon","onClick","item","createSubmenuOption","items","submenu","subItem","subOption","itemRect","viewportWidth","viewportHeight","location","addSublist","duplicateTab","input","deleteTab","moveTab","getTargets","currentTabId","targets","t","outdentTab","menuWidth","menuHeight","left","top","currentTab","newTab","uuidv4","destroyImageResizer","destroyTableEditPlugin","destroyAnchorPopover","nextTab","runtimeNode","cleanupRuntimeDom","_a","cleanupHistory","deleteFromList","index","tabToDelete","isCurrentTabAffected","child","shouldSwitch","updateIds","insertIntoList","parentTab","direction","moveInList","targetTabId","position","sourceLoc","targetLoc","targetTab","parentLocation","parentList","parentIndex","saved","save","validateAndFixTabId","ids","traverse","prepareTabs","value","initialTabs","dd","removeBlockedStyles","node","_a","propertyName","REGEX","traverseAndClean","element","options","core","_b","childNodes","attributesToRemove","attr","nodeStyles","bgColor","textColor","currentNode","bodyBg","getEffectiveBackgroundColor","rgbToHex","el","cleanHTML","html","tempDiv","debounce","fn","delay","timeout","args","asyncDebounce","isRunning","callNextFn","newArgs","call","resolve","getDeviceName","userAgent","getScrollParent","parent","overflowX","showTooltip","CLASSES","rect","top","left","getTooltip","plugin","getToolbarIcon","makeToolbarButton","_plugin","pluginButton","e","pluginIcon","makeToolbarButtonSelect","pluginSelect","makeToolbarSelect","pluginButtonSelect","makeToolbarColor","pluginContainer","makeToolbarDropdown","handleOutsideClick","forceFully","dropdownPlugin","dropdownContent","renderGalary","images","container","image","imageElement","img","linkNode","renderMentions","value","label","field","category","categoryElement","labelElement","span","dropdownButton","option","optionDiv","search","fetchAndRenderImages","searchQuery","page","res","footer","GIPHY_POWERED_IMAGE","emoji","emojiElement","wrapper","headerOption","checkbox","table","i","j","cell","cellRow","cellCol","isSuggestionLoaded","containerRect","popoverRect","overflowRight","overflowLeft","selectPlugin","iconName","arrow","SVG","_options","fontOptions","font","makeEditToolbar","type","td","updateImage","updateTable","popoverPlugin","popoverContent","popoverButton","resizeByIds","pluginSet","RESIZER_PLUGINS","onInputKeydown","event","resizeBy","imageClientRect","handlePercentage","handlePixel","width","height","delta","tabsContainer","tabContentContainer","createPluginItem","isColorInput","isDimensionInput","pluginElement","icon","title","colorInput","input","toPx","TAB_CATEGORIES","categoryName","index","tabButton","tabId","tabContent","subCategories","subCategoryName","subHeader","pluginListContainer","pluginEvent","TABLE_PLUGINS","p","item","btn","content","openModal","bodyNode","footerNode","modalContainer","modalContent","modalHeader","modalTitle","modalCloseButton","modalBody","modalFooter","openDraggableModal","onClose","isDragging","currentX","currentY","initialX","initialY","xOffset","yOffset","dragStart","dragEnd","drag","initImageResizer","destroyImageResizer","changeAllToolbarState","resizer","fullscreenButton","anchor","isVideo","src","href","createPreviewModal","firstX","firstY","direction","aspectRatio","resizerClientRect","handleMouseDown","handleMouseMove","handleMouseUp","position","distanceX","distanceY","dot1","dot2","dot3","dot4","dot5","dot6","dot7","dot8","data","updateImageResizerPosition","overlay","closeButton","getTableGrid","grid","rows","r","row","colIndex","c","rowspan","colspan","rs","cs","getCellPosition","initTableEditPlugin","destroyTableEditPlugin","tableClientRect","handleColumnResizeMouseMove","isNearRightEdge","RESIZE_MARGIN","handleColumnResizeMouseDown","isTouch","clientX","target","startX","firstRowCells","targetRect","resizeTargetIndex","resizeTarget","nextTarget","startWidth","startNextWidth","startTableWidth","diff","constrainedDiff","newWidth","effectiveDiff","rowIndex","cellIndex","colCount","addCellWithBorder","newCell","toggleBorder","side","currentBorder","checkAndRemoveTable","newRow","pos","targetCell","targetRowIdx","nextRowIdx","nextRow","insertIndex","aboveCell","rightCell","belowCell","leftCell","resizerButton","updateTableResizerPosition","changeToolbarStatByPlugin","action","FONTS","FONT_SIZES","FORMATS","preventPlugins","pluginName","changeToolbarStateByName","pluginNames","changeToolbarValueByName","changeToolbarHtmlByName","rgb","x","hex","extractSocialMediaId","url","platform","SOCIAL_MEDIA_PATTERNS","match","constructEmbedUrl","id","SOCIAL_MEDIA_BASEURLS","parentDomain","showAnchorPopover","y","popover","linkDiv","editButton","editAnchorTag","copyButton","deleteButton","removeAnchorTag","parentRect","scrollX","scrollY","finalX","finalY","spaceRight","spaceLeft","spaceBelow","spaceAbove","closePopover","destroyAnchorPopover","anchorElement","anchorLink","anchorText","body","linkLabel","inputLink","textLabel","inputText","button","modal","newLink","newText","anchorContent","getCharIndex","root","offset","range","getNodeAndOffsetFromIndex","walker","currentIndex","len","getTightClientRects","rects","nodeRange","startOffset","endOffset","subRange","highlightTextRange","editor","color","overlayContainer","highlight","showRemoteCursor","user","name","startIndex","endIndex","cursorIndex","isCollapsed","oldOverlay","startNodeInfo","endNodeInfo","cursorNodeInfo","cursorRange","cursorRect","cursor","updateCursorPosition","editorRef","selection","tempRange","start","end","updateCursorPositionDebounce","syncRemoteChanges","currentDOM","diffs","syncRemoteChangesDebounce","applyRemoteChanges","targetElement","iframeWindow","saved","filteredDiffs","newStart","newEnd","newRange","sel","isLinkValid","link","trimmed","isURL","isMailto","isTel","formatLink","buildTributeValues","labels","tmp","px","updateHeight","h","minH","maxH","isInsideTableCell","formatListItemContent","li","tag","formattedBlock","child","firstNestedList","applyFormatBlockInListItem","currentBlock","BLOCK_FORMAT_TAGS","isCurrentBlockInLi","placeCaretAtEnd","fragment","normalizeHeadingWrappedLists","heading","lists","headingTag","list","paragraph","makeUnorderedList","textNode","text","ul","applyUnorderedList","makeOrderedList","ol","applyOrderList","makeHeading","fullText","level","makeBlockQuote","blockquote","makeStrikethrough","replaceRange","strike","zeroWidthSpace","makeCodeBlock","code","getListLevel","tagName","applyListStyle","LIST_STYLES_BY_LEVEL","UNORDERED_LIST_STYLES_BY_LEVEL","indentListItem","prevLi","parentTag","subList","outdentListItem","parentOl","parentLi","isEmptyLi","hasOnlySublist","hasMeaningfulElement","trackListSelectionDeletion","getElementFromNode","startElement","endElement","startLi","endLi","listItems","cleanupListSelectionDeletion","pendingDeletion","didChange","parentList","makeSublist","isAtStart","allLis","selectedLis","transformCase","s","transformTextStyle","startContainer","endContainer","processTextNode","transformedText","iterator","nodes","assignIdToHeading","uuidv4","navigateToHeading","headingId","insertTOC","headings","tocContainer","block","insertOutlinesItems","tab","outlineContainer","highlightActiveOutline","items","updateOutlineItems","findTab","findAndReplace","headerContainer","replaceTab","findLabel","findInputWrapper","findInput","countSpan","replaceLabel","replaceInput","optionsContainer","matchCaseCheckboxContainer","matchCaseCheckbox","matchCaseLabel","wholeWordCheckboxContainer","wholeWordCheckbox","wholeWordLabel","regexCheckboxContainer","useRegexCheckbox","useRegexLabel","prevBtn","nextBtn","replaceBtn","replaceAllBtn","toggleTab","mode","find","searchText","matchCase","useRegex","wholeWord","searchPattern","escaped","regex","flags","matches","globalIndex","currentGlobal","walker2","n","count","matchIndex","m","replace","replaceText","pattern","selectedText","replaceAll","isCaretAtStart","preRange","handleBackspaceInList","nestedList","clone","nestedInClone","parentText","children","getCollabColor","userId","hash","COLLABORATION_COLORS","applyTextFormat","core","command","changeToolbarStateByName","applyList","activePlugin","inactivePlugin","normalizeHeadingWrappedLists","isActive","applyOrderList","applyUnorderedList","PLUGINS","SVG","event","_a","options","_cleanHTML","cleanHTML","changeAllToolbarState","FONTS","font","name","changeToolbarValueByName","FONT_SIZE_OPTIONS","size","FORMAT_OPTIONS","format","tag","applyFormatBlockInListItem","ORDERED_LIST_OPTIONS","list","value","selection","node","UNORDERED_LIST_OPTIONS","blockElement","container","clonedContents","parentEl","el","frag","code","translucent","shadow","transformTextStyle","span","element","option","currentIndent","onInputKeydown","button","anchorLink","anchorText","underAnchor","imgElement","imgParentNode","parentElement","body","linkLabel","inputLink","textLabel","inputText","footer","modal","openModal","link","formatLink","isLinkValid","a","rows","cols","header","table","tr","j","td","EMOJI_CATEGORIES","SPECIAL_CHARACTERS","page","pexels","search","giphy","next","tenor","top","left","uploadBox","CLASSES","fileInput","MIMETYPE","right","previewBox","imgPreview","altLabel","altInput","base64String","file","reader","fileFromNative","originalText","img","input","REGEX","url","files","htmlContent","clipboardItem","clipboardItems","pastedContentNode","item","blob","plainTextContent","type","isExists","changeToolbarHtmlByName","embedLabel","urlInput","widthLabel","widthInput","heightLabel","heightInput","enteredUrl","platform","id","extractSocialMediaId","constructEmbedUrl","wrapper","embed","insertTOC","findAndReplace","plugin_default","import_uuid","LeksyEditor","baseElement","options","ERRORS","CLASSES","initialTabs","prepareTabs","initialCurrentTabId","core","debounce","_a","selection","caretOffset","range","preCaretRange","html","currentTabHistory","charCount","setCaret","node","length","element","updateHeight","updateTableResizerPosition","currentTab","findTab","editorRef","syncRemoteChangesDebounce","updateOutlineItems","files","href","type","content","_content","mimeType","parentTags","tag","li","text","file","changeToolbarHtmlByName","SVG","url","parentElements","updateCursorPositionDebounce","diff","tabs","renderTabs","initAllTabs","tab","div","height","disabled","changeAllToolbarState","newVariables","variableMap","mergedVariables","CSS_VARIABLES","key","cssVar","value","labels","values","buildTributeValues","message","_b","_c","_d","sequence","applyRemoteChanges","destroyImageResizer","destroyAnchorPopover","destroyTableEditPlugin","showRemoteCursor","getCollabColor","existingTabs","flattenTabs","buildTree","existing","incomingIds","collectIds","tabId","firstTab","switchTab","uuidv4","tabs1","tabs2","normalizeTabs","runtimeDoms","highlights","iframeDoc","style","currentTabId","wrapWithHighlight","color","userName","span","label","targets","route","targetElement","index","e","#initToolbar","#initPlaceholder","#initCodeviewContainer","#initEditableContainer","#initStepper","toolbarContainer","initToolbarItems","plugin","buttonSets","button","_plugin","plugin_default","font","FONTS","toolbarPlugin","makeToolbarButton","makeToolbarDropdown","makeToolbarSelect","makeToolbarColor","makeToolbarButtonSelect","toolbarButtonSets","showTooltip","placeholderContainer","placeholder","textarea","handleCaretPositionAndPlugin","activePlugin","format","changeToolbarValueByName","selectedNode","align","styles","rgbToHex","changeToolbarStateByName","firstFont","formattedFont","match","numericValue","unit","fontSize","error","keyPressDebounce","makeObserver","inputEvent","contentEditableDiv","user","data","cssVariable","_CSS_VARIABLES","CSS","iframe","links","link","event","cleanupListSelectionDeletion","isCtrlOrCmd","isLinkCreated","applyTextFormat","findAndReplace","td","table","grid","getTableGrid","pos","getCellPosition","r","c","targetCell","targetRowIdx","makeSublist","tabNode","sel","textBeforeCaret","REGEX","cleanUrl","before","after","a","frag","textNode","handleBackspaceInList","trackListSelectionDeletion","makeUnorderedList","makeHeading","makeBlockQuote","makeStrikethrough","makeCodeBlock","makeOrderedList","anchor","showAnchorPopover","initImageResizer","initTableEditPlugin","navigateToHeading","highlightActiveOutline","clipboardData","item","reader","img","base64String","pastedData","cleanHTML","droppedData","editorCursor","script","initTabs","stepper","breadcrumbList","status","convertHtmlToText","isHTMLEmpty","tempElement","src_default"]}