@mx-space/cli 0.1.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.
- package/LICENSE +33 -0
- package/README.md +375 -0
- package/ROADMAP.md +42 -0
- package/bin/mxs.cjs +40 -0
- package/dist/Lexical.dev-DpU35QTu.mjs +10992 -0
- package/dist/Lexical.dev-DpU35QTu.mjs.map +1 -0
- package/dist/Lexical.node-gYNDt_p9.mjs +247 -0
- package/dist/Lexical.node-gYNDt_p9.mjs.map +1 -0
- package/dist/Lexical.prod-t4c3bHV3.mjs +5579 -0
- package/dist/Lexical.prod-t4c3bHV3.mjs.map +1 -0
- package/dist/LexicalClipboard.dev-CdeeWCIq.mjs +496 -0
- package/dist/LexicalClipboard.dev-CdeeWCIq.mjs.map +1 -0
- package/dist/LexicalClipboard.node-0e9GBL1g.mjs +26 -0
- package/dist/LexicalClipboard.node-0e9GBL1g.mjs.map +1 -0
- package/dist/LexicalClipboard.prod-CsCWYmV7.mjs +293 -0
- package/dist/LexicalClipboard.prod-CsCWYmV7.mjs.map +1 -0
- package/dist/LexicalCodeCore.dev-haI2cqH8.mjs +539 -0
- package/dist/LexicalCodeCore.dev-haI2cqH8.mjs.map +1 -0
- package/dist/LexicalCodeCore.prod-D_k7zuE5.mjs +383 -0
- package/dist/LexicalCodeCore.prod-D_k7zuE5.mjs.map +1 -0
- package/dist/LexicalDragon.dev-CAggdFh_.mjs +90 -0
- package/dist/LexicalDragon.dev-CAggdFh_.mjs.map +1 -0
- package/dist/LexicalDragon.node-QMR_wqJg.mjs +15 -0
- package/dist/LexicalDragon.node-QMR_wqJg.mjs.map +1 -0
- package/dist/LexicalDragon.prod-OssQhwS-.mjs +61 -0
- package/dist/LexicalDragon.prod-OssQhwS-.mjs.map +1 -0
- package/dist/LexicalExtension.dev-CtDZiMCU.mjs +1665 -0
- package/dist/LexicalExtension.dev-CtDZiMCU.mjs.map +1 -0
- package/dist/LexicalExtension.node-BM0gh8zu.mjs +51 -0
- package/dist/LexicalExtension.node-BM0gh8zu.mjs.map +1 -0
- package/dist/LexicalExtension.prod-Ug6emhEO.mjs +971 -0
- package/dist/LexicalExtension.prod-Ug6emhEO.mjs.map +1 -0
- package/dist/LexicalHeadless.dev-D4yQpl_s.mjs +45 -0
- package/dist/LexicalHeadless.dev-D4yQpl_s.mjs.map +1 -0
- package/dist/LexicalHeadless.prod-jeN65B3k.mjs +31 -0
- package/dist/LexicalHeadless.prod-jeN65B3k.mjs.map +1 -0
- package/dist/LexicalHtml.dev-BdU1_ITQ.mjs +686 -0
- package/dist/LexicalHtml.dev-BdU1_ITQ.mjs.map +1 -0
- package/dist/LexicalHtml.node-DLtAh00E.mjs +26 -0
- package/dist/LexicalHtml.node-DLtAh00E.mjs.map +1 -0
- package/dist/LexicalHtml.prod-DdLE1HHT.mjs +432 -0
- package/dist/LexicalHtml.prod-DdLE1HHT.mjs.map +1 -0
- package/dist/LexicalLink.dev-DK87Biuy.mjs +1084 -0
- package/dist/LexicalLink.dev-DK87Biuy.mjs.map +1 -0
- package/dist/LexicalLink.prod-fssuv6Sf.mjs +717 -0
- package/dist/LexicalLink.prod-fssuv6Sf.mjs.map +1 -0
- package/dist/LexicalList.dev-BJ4dr_rk.mjs +1352 -0
- package/dist/LexicalList.dev-BJ4dr_rk.mjs.map +1 -0
- package/dist/LexicalList.prod-jWBbaWfi.mjs +841 -0
- package/dist/LexicalList.prod-jWBbaWfi.mjs.map +1 -0
- package/dist/LexicalMarkdown.dev-C8e-eh6y.mjs +1207 -0
- package/dist/LexicalMarkdown.dev-C8e-eh6y.mjs.map +1 -0
- package/dist/LexicalMarkdown.prod-k73tZVb2.mjs +756 -0
- package/dist/LexicalMarkdown.prod-k73tZVb2.mjs.map +1 -0
- package/dist/LexicalRichText.dev-CrSqq3K-.mjs +645 -0
- package/dist/LexicalRichText.dev-CrSqq3K-.mjs.map +1 -0
- package/dist/LexicalRichText.node-B7k7wlQz.mjs +106 -0
- package/dist/LexicalRichText.node-B7k7wlQz.mjs.map +1 -0
- package/dist/LexicalRichText.prod-CqvyxQ9m.mjs +429 -0
- package/dist/LexicalRichText.prod-CqvyxQ9m.mjs.map +1 -0
- package/dist/LexicalSelection.dev-sNOHKHe_.mjs +725 -0
- package/dist/LexicalSelection.dev-sNOHKHe_.mjs.map +1 -0
- package/dist/LexicalSelection.node-Di7GwBCZ.mjs +38 -0
- package/dist/LexicalSelection.node-Di7GwBCZ.mjs.map +1 -0
- package/dist/LexicalSelection.prod-SWllPJop.mjs +388 -0
- package/dist/LexicalSelection.prod-SWllPJop.mjs.map +1 -0
- package/dist/LexicalTable.dev-CQkLHXJx.mjs +3262 -0
- package/dist/LexicalTable.dev-CQkLHXJx.mjs.map +1 -0
- package/dist/LexicalTable.prod-BtqCwKSi.mjs +2218 -0
- package/dist/LexicalTable.prod-BtqCwKSi.mjs.map +1 -0
- package/dist/LexicalUtils.dev-DiUpsXE8.mjs +850 -0
- package/dist/LexicalUtils.dev-DiUpsXE8.mjs.map +1 -0
- package/dist/LexicalUtils.node-CmK462d1.mjs +66 -0
- package/dist/LexicalUtils.node-CmK462d1.mjs.map +1 -0
- package/dist/LexicalUtils.prod-bWwV4GAF.mjs +377 -0
- package/dist/LexicalUtils.prod-bWwV4GAF.mjs.map +1 -0
- package/dist/auth-DIFZzoMm.mjs +211 -0
- package/dist/auth-DIFZzoMm.mjs.map +1 -0
- package/dist/bin/mxs.d.mts +927 -0
- package/dist/bin/mxs.mjs +3249 -0
- package/dist/bin/mxs.mjs.map +1 -0
- package/dist/chunk-hT5z_Zn9.mjs +35 -0
- package/dist/config-store-DIu7x0ao.mjs +121 -0
- package/dist/config-store-DIu7x0ao.mjs.map +1 -0
- package/dist/create-B2AOQL1e.mjs +24 -0
- package/dist/create-B2AOQL1e.mjs.map +1 -0
- package/dist/create-CwjGcv2n.mjs +23 -0
- package/dist/create-CwjGcv2n.mjs.map +1 -0
- package/dist/create-DT1l2hue.mjs +23 -0
- package/dist/create-DT1l2hue.mjs.map +1 -0
- package/dist/create-DjlRHPXy.mjs +23 -0
- package/dist/create-DjlRHPXy.mjs.map +1 -0
- package/dist/create-Dz6rJJSS.mjs +19 -0
- package/dist/create-Dz6rJJSS.mjs.map +1 -0
- package/dist/delete-B4dGrrus.mjs +22 -0
- package/dist/delete-B4dGrrus.mjs.map +1 -0
- package/dist/delete-BH6ZngTz.mjs +22 -0
- package/dist/delete-BH6ZngTz.mjs.map +1 -0
- package/dist/delete-BrY5zJ6S.mjs +22 -0
- package/dist/delete-BrY5zJ6S.mjs.map +1 -0
- package/dist/delete-CaG2d_xt.mjs +31 -0
- package/dist/delete-CaG2d_xt.mjs.map +1 -0
- package/dist/delete-YzRliRn8.mjs +31 -0
- package/dist/delete-YzRliRn8.mjs.map +1 -0
- package/dist/document-output-BVB8emLt.mjs +145 -0
- package/dist/document-output-BVB8emLt.mjs.map +1 -0
- package/dist/edit-Bb0Ze4w6.mjs +79 -0
- package/dist/edit-Bb0Ze4w6.mjs.map +1 -0
- package/dist/edit-BeFmC3XD.mjs +80 -0
- package/dist/edit-BeFmC3XD.mjs.map +1 -0
- package/dist/edit-DLDw_ZWX.mjs +86 -0
- package/dist/edit-DLDw_ZWX.mjs.map +1 -0
- package/dist/edit-z55ofr1S.mjs +40 -0
- package/dist/edit-z55ofr1S.mjs.map +1 -0
- package/dist/editor-xrF-j3UE.mjs +42 -0
- package/dist/editor-xrF-j3UE.mjs.map +1 -0
- package/dist/envelope-overlays-DPAlMNW1.mjs +26 -0
- package/dist/envelope-overlays-DPAlMNW1.mjs.map +1 -0
- package/dist/get-2qjq0wgG.mjs +28 -0
- package/dist/get-2qjq0wgG.mjs.map +1 -0
- package/dist/get-BGAk1Zmv.mjs +14 -0
- package/dist/get-BGAk1Zmv.mjs.map +1 -0
- package/dist/get-CRR13lgj.mjs +10 -0
- package/dist/get-CRR13lgj.mjs.map +1 -0
- package/dist/get-ClkpDBTL.mjs +13 -0
- package/dist/get-ClkpDBTL.mjs.map +1 -0
- package/dist/get-DJfUJ3sP.mjs +10 -0
- package/dist/get-DJfUJ3sP.mjs.map +1 -0
- package/dist/get-DiqaQvoS.mjs +14 -0
- package/dist/get-DiqaQvoS.mjs.map +1 -0
- package/dist/index.d.mts +338 -0
- package/dist/index.mjs +10 -0
- package/dist/list-BYzhflDg.mjs +14 -0
- package/dist/list-BYzhflDg.mjs.map +1 -0
- package/dist/list-DY-tPNG-.mjs +10 -0
- package/dist/list-DY-tPNG-.mjs.map +1 -0
- package/dist/list-DlQSkbqx.mjs +10 -0
- package/dist/list-DlQSkbqx.mjs.map +1 -0
- package/dist/list-DsrA5wIz.mjs +15 -0
- package/dist/list-DsrA5wIz.mjs.map +1 -0
- package/dist/list-Fp4nKfQb.mjs +10 -0
- package/dist/list-Fp4nKfQb.mjs.map +1 -0
- package/dist/list-s_tloiEX.mjs +10 -0
- package/dist/list-s_tloiEX.mjs.map +1 -0
- package/dist/litexml-codec-CDoRloiR.mjs +13451 -0
- package/dist/litexml-codec-CDoRloiR.mjs.map +1 -0
- package/dist/login-CLOJ-fTJ.mjs +579 -0
- package/dist/login-CLOJ-fTJ.mjs.map +1 -0
- package/dist/logout-v8ihxsim.mjs +11 -0
- package/dist/logout-v8ihxsim.mjs.map +1 -0
- package/dist/onboarding-640IldLz.mjs +888 -0
- package/dist/onboarding-640IldLz.mjs.map +1 -0
- package/dist/output-BM7aBFwt.mjs +120 -0
- package/dist/output-BM7aBFwt.mjs.map +1 -0
- package/dist/output-CTnO1lYt.d.mts +16 -0
- package/dist/payload-CN11pUto.mjs +547 -0
- package/dist/payload-CN11pUto.mjs.map +1 -0
- package/dist/publish-DkTYB-eK.mjs +23 -0
- package/dist/publish-DkTYB-eK.mjs.map +1 -0
- package/dist/publish-pRBfTJfe.mjs +23 -0
- package/dist/publish-pRBfTJfe.mjs.map +1 -0
- package/dist/resolve-BogJOR7R.mjs +119 -0
- package/dist/resolve-BogJOR7R.mjs.map +1 -0
- package/dist/resolve-Bp1AfBmM.mjs +26 -0
- package/dist/resolve-Bp1AfBmM.mjs.map +1 -0
- package/dist/resolve-Bw5Po9yK.mjs +16 -0
- package/dist/resolve-Bw5Po9yK.mjs.map +1 -0
- package/dist/resolve-CyjMlaoJ.mjs +23 -0
- package/dist/resolve-CyjMlaoJ.mjs.map +1 -0
- package/dist/resolve-helpers-CahPoJ0Y.mjs +30 -0
- package/dist/resolve-helpers-CahPoJ0Y.mjs.map +1 -0
- package/dist/set-BEGQz2si.mjs +43 -0
- package/dist/set-BEGQz2si.mjs.map +1 -0
- package/dist/shared-D0HVBDHI.mjs +39 -0
- package/dist/shared-D0HVBDHI.mjs.map +1 -0
- package/dist/status-LXrN9fI-.mjs +22 -0
- package/dist/status-LXrN9fI-.mjs.map +1 -0
- package/dist/update-B9ynFCdZ.mjs +30 -0
- package/dist/update-B9ynFCdZ.mjs.map +1 -0
- package/dist/update-BMZQPOvR.mjs +28 -0
- package/dist/update-BMZQPOvR.mjs.map +1 -0
- package/dist/update-BXz0l7Lz.mjs +36 -0
- package/dist/update-BXz0l7Lz.mjs.map +1 -0
- package/dist/update-Dx6AF8tf.mjs +30 -0
- package/dist/update-Dx6AF8tf.mjs.map +1 -0
- package/dist/update-q66TLS38.mjs +37 -0
- package/dist/update-q66TLS38.mjs.map +1 -0
- package/dist/whoami-CTkctOEd.mjs +22 -0
- package/dist/whoami-CTkctOEd.mjs.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LexicalTable.dev-CQkLHXJx.mjs","names":[],"sources":["../../../node_modules/.pnpm/@lexical+table@0.44.0/node_modules/@lexical/table/LexicalTable.dev.mjs"],"sourcesContent":["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { addClassNamesToElement, $descendantsMatching, $findMatchingParent, removeClassNamesFromElement, objectKlassEquals, isHTMLElement as isHTMLElement$1, $insertFirst as $insertFirst$1, mergeRegister, $insertNodeToNearestRoot, $dfs, $unwrapAndFilterDescendants } from '@lexical/utils';\nimport { ElementNode, isHTMLElement, $isInlineElementOrDecoratorNode, $isTextNode, $isLineBreakNode, $createParagraphNode, $applyNodeReplacement, createCommand, $createTextNode, $getSelection, $isRangeSelection, $isParagraphNode, $createPoint, $getNodeByKey, $isElementNode, $normalizeSelection__EXPERIMENTAL, isCurrentlyReadOnlyMode, TEXT_TYPE_TO_FORMAT, $getEditor, $setSelection, SELECTION_CHANGE_COMMAND, getDOMSelection, $createRangeSelection, $isRootNode, INSERT_PARAGRAPH_COMMAND, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, KEY_ARROW_LEFT_COMMAND, KEY_ARROW_RIGHT_COMMAND, COMMAND_PRIORITY_HIGH, KEY_ESCAPE_COMMAND, DELETE_WORD_COMMAND, DELETE_LINE_COMMAND, DELETE_CHARACTER_COMMAND, KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND, CUT_COMMAND, FORMAT_TEXT_COMMAND, FORMAT_ELEMENT_COMMAND, CONTROLLED_TEXT_INSERTION_COMMAND, KEY_TAB_COMMAND, FOCUS_COMMAND, $getNearestNodeFromDOMNode, isDOMNode, $isRootOrShadowRoot, $getPreviousSelection, $getNodeByKeyOrThrow, $caretFromPoint, $isExtendableTextPointCaret, $extendCaretToRange, $isSiblingCaret, $getSiblingCaret, $setPointFromCaret, $normalizeCaret, $createRangeSelectionFromDom, $isChildCaret, $getChildCaret, $getAdjacentChildCaret, setDOMStyleFromCSS, setDOMUnmanaged, COMMAND_PRIORITY_EDITOR, SELECTION_INSERT_CLIPBOARD_NODES_COMMAND, SELECT_ALL_COMMAND, COMMAND_PRIORITY_LOW, CLICK_COMMAND, $getRoot, defineExtension, safeCast } from 'lexical';\nimport { signal, effect, namedSignals } from '@lexical/extension';\nimport { copyToClipboard, $getClipboardDataFromSelection } from '@lexical/clipboard';\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst PIXEL_VALUE_REG_EXP = /^(\\d+(?:\\.\\d+)?)px$/;\n\n// .PlaygroundEditorTheme__tableCell width value from\n// packages/lexical-playground/src/themes/PlaygroundEditorTheme.css\nconst COLUMN_WIDTH = 75;\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst TableCellHeaderStates = {\n BOTH: 3,\n COLUMN: 2,\n NO_STATUS: 0,\n ROW: 1\n};\n/** @noInheritDoc */\nclass TableCellNode extends ElementNode {\n /** @internal */\n __colSpan;\n /** @internal */\n __rowSpan;\n /** @internal */\n __headerState;\n /** @internal */\n __width;\n /** @internal */\n __backgroundColor;\n /** @internal */\n __verticalAlign;\n static getType() {\n return 'tablecell';\n }\n static clone(node) {\n return new TableCellNode(node.__headerState, node.__colSpan, node.__width, node.__key);\n }\n afterCloneFrom(node) {\n super.afterCloneFrom(node);\n this.__rowSpan = node.__rowSpan;\n this.__backgroundColor = node.__backgroundColor;\n this.__verticalAlign = node.__verticalAlign;\n this.__colSpan = node.__colSpan;\n this.__headerState = node.__headerState;\n this.__width = node.__width;\n }\n static importDOM() {\n return {\n td: node => ({\n conversion: $convertTableCellNodeElement,\n priority: 0\n }),\n th: node => ({\n conversion: $convertTableCellNodeElement,\n priority: 0\n })\n };\n }\n static importJSON(serializedNode) {\n return $createTableCellNode().updateFromJSON(serializedNode);\n }\n updateFromJSON(serializedNode) {\n return super.updateFromJSON(serializedNode).setHeaderStyles(serializedNode.headerState).setColSpan(serializedNode.colSpan || 1).setRowSpan(serializedNode.rowSpan || 1).setWidth(serializedNode.width || undefined).setBackgroundColor(serializedNode.backgroundColor || null).setVerticalAlign(serializedNode.verticalAlign || undefined);\n }\n constructor(headerState = TableCellHeaderStates.NO_STATUS, colSpan = 1, width, key) {\n super(key);\n this.__colSpan = colSpan;\n this.__rowSpan = 1;\n this.__headerState = headerState;\n this.__width = width;\n this.__backgroundColor = null;\n this.__verticalAlign = undefined;\n }\n createDOM(config) {\n const element = document.createElement(this.getTag());\n if (this.__width) {\n element.style.width = `${this.__width}px`;\n }\n if (this.__colSpan > 1) {\n element.colSpan = this.__colSpan;\n }\n if (this.__rowSpan > 1) {\n element.rowSpan = this.__rowSpan;\n }\n if (this.__backgroundColor !== null) {\n element.style.backgroundColor = this.__backgroundColor;\n }\n if (isValidVerticalAlign(this.__verticalAlign)) {\n element.style.verticalAlign = this.__verticalAlign;\n }\n addClassNamesToElement(element, config.theme.tableCell, this.hasHeader() && config.theme.tableCellHeader);\n return element;\n }\n exportDOM(editor) {\n const output = super.exportDOM(editor);\n if (isHTMLElement(output.element)) {\n const element = output.element;\n element.setAttribute('data-temporary-table-cell-lexical-key', this.getKey());\n element.style.border = '1px solid black';\n if (this.__colSpan > 1) {\n element.colSpan = this.__colSpan;\n }\n if (this.__rowSpan > 1) {\n element.rowSpan = this.__rowSpan;\n }\n element.style.width = `${this.getWidth() || COLUMN_WIDTH}px`;\n element.style.verticalAlign = this.getVerticalAlign() || 'top';\n element.style.textAlign = 'start';\n if (this.__backgroundColor === null && this.hasHeader()) {\n element.style.backgroundColor = '#f2f3f5';\n }\n }\n return output;\n }\n exportJSON() {\n return {\n ...super.exportJSON(),\n ...(isValidVerticalAlign(this.__verticalAlign) && {\n verticalAlign: this.__verticalAlign\n }),\n backgroundColor: this.getBackgroundColor(),\n colSpan: this.__colSpan,\n headerState: this.__headerState,\n rowSpan: this.__rowSpan,\n width: this.getWidth()\n };\n }\n getColSpan() {\n return this.getLatest().__colSpan;\n }\n setColSpan(colSpan) {\n const self = this.getWritable();\n self.__colSpan = colSpan;\n return self;\n }\n getRowSpan() {\n return this.getLatest().__rowSpan;\n }\n setRowSpan(rowSpan) {\n const self = this.getWritable();\n self.__rowSpan = rowSpan;\n return self;\n }\n getTag() {\n return this.hasHeader() ? 'th' : 'td';\n }\n setHeaderStyles(headerState, mask = TableCellHeaderStates.BOTH) {\n const self = this.getWritable();\n self.__headerState = headerState & mask | self.__headerState & ~mask;\n return self;\n }\n getHeaderStyles() {\n return this.getLatest().__headerState;\n }\n setWidth(width) {\n const self = this.getWritable();\n self.__width = width;\n return self;\n }\n getWidth() {\n return this.getLatest().__width;\n }\n getBackgroundColor() {\n return this.getLatest().__backgroundColor;\n }\n setBackgroundColor(newBackgroundColor) {\n const self = this.getWritable();\n self.__backgroundColor = newBackgroundColor;\n return self;\n }\n getVerticalAlign() {\n return this.getLatest().__verticalAlign;\n }\n setVerticalAlign(newVerticalAlign) {\n const self = this.getWritable();\n self.__verticalAlign = newVerticalAlign || undefined;\n return self;\n }\n toggleHeaderStyle(headerStateToToggle) {\n const self = this.getWritable();\n if ((self.__headerState & headerStateToToggle) === headerStateToToggle) {\n self.__headerState -= headerStateToToggle;\n } else {\n self.__headerState += headerStateToToggle;\n }\n return self;\n }\n hasHeaderState(headerState) {\n return (this.getHeaderStyles() & headerState) === headerState;\n }\n hasHeader() {\n return this.getLatest().__headerState !== TableCellHeaderStates.NO_STATUS;\n }\n updateDOM(prevNode) {\n return prevNode.__headerState !== this.__headerState || prevNode.__width !== this.__width || prevNode.__colSpan !== this.__colSpan || prevNode.__rowSpan !== this.__rowSpan || prevNode.__backgroundColor !== this.__backgroundColor || prevNode.__verticalAlign !== this.__verticalAlign;\n }\n isShadowRoot() {\n return true;\n }\n collapseAtStart() {\n return true;\n }\n canBeEmpty() {\n return false;\n }\n canIndent() {\n return false;\n }\n}\nfunction isValidVerticalAlign(verticalAlign) {\n return verticalAlign === 'middle' || verticalAlign === 'bottom';\n}\nfunction $convertTableCellNodeElement(domNode) {\n const domNode_ = domNode;\n const nodeName = domNode.nodeName.toLowerCase();\n let width = undefined;\n if (PIXEL_VALUE_REG_EXP.test(domNode_.style.width)) {\n width = parseFloat(domNode_.style.width);\n }\n\n // Determine header state based on the 'scope' attribute\n let headerState = TableCellHeaderStates.NO_STATUS;\n if (nodeName === 'th') {\n const scope = domNode_.getAttribute('scope');\n if (scope === 'col') {\n headerState = TableCellHeaderStates.COLUMN;\n } else if (scope === 'row') {\n headerState = TableCellHeaderStates.ROW;\n } else {\n const parentRow = domNode_.parentElement;\n const isInHeaderRow = isHTMLElement(parentRow) && parentRow.nodeName.toLowerCase() === 'tr' && isHTMLElement(parentRow.parentElement) && (parentRow.parentElement.nodeName.toLowerCase() === 'thead' || parentRow.rowIndex === 0);\n const isFirstColumn = domNode_.cellIndex === 0;\n if (isInHeaderRow) {\n headerState |= TableCellHeaderStates.ROW;\n }\n if (isFirstColumn) {\n headerState |= TableCellHeaderStates.COLUMN;\n }\n if (headerState === TableCellHeaderStates.NO_STATUS) {\n headerState = TableCellHeaderStates.ROW;\n }\n }\n }\n const tableCellNode = $createTableCellNode(headerState, domNode_.colSpan, width);\n tableCellNode.__rowSpan = domNode_.rowSpan;\n const backgroundColor = domNode_.style.backgroundColor;\n if (backgroundColor !== '') {\n tableCellNode.__backgroundColor = backgroundColor;\n }\n const verticalAlign = domNode_.style.verticalAlign;\n if (isValidVerticalAlign(verticalAlign)) {\n tableCellNode.__verticalAlign = verticalAlign;\n }\n const style = domNode_.style;\n const textDecoration = (style && style.textDecoration || '').split(' ');\n const hasBoldFontWeight = style.fontWeight === '700' || style.fontWeight === 'bold';\n const hasLinethroughTextDecoration = textDecoration.includes('line-through');\n const hasItalicFontStyle = style.fontStyle === 'italic';\n const hasUnderlineTextDecoration = textDecoration.includes('underline');\n const color = style.color;\n return {\n after: childLexicalNodes => {\n const result = [];\n let paragraphNode = null;\n const removeSingleLineBreakNode = () => {\n if (paragraphNode) {\n const firstChild = paragraphNode.getFirstChild();\n if ($isLineBreakNode(firstChild) && paragraphNode.getChildrenSize() === 1) {\n firstChild.remove();\n }\n }\n };\n for (const child of childLexicalNodes) {\n if ($isInlineElementOrDecoratorNode(child) || $isTextNode(child) || $isLineBreakNode(child)) {\n if ($isTextNode(child)) {\n if (hasBoldFontWeight) {\n child.toggleFormat('bold');\n }\n if (hasLinethroughTextDecoration) {\n child.toggleFormat('strikethrough');\n }\n if (hasItalicFontStyle) {\n child.toggleFormat('italic');\n }\n if (hasUnderlineTextDecoration) {\n child.toggleFormat('underline');\n }\n if (color) {\n const existingStyle = child.getStyle();\n if (!existingStyle.includes('color:')) {\n child.setStyle(existingStyle + `color: ${color};`);\n }\n }\n }\n if (paragraphNode) {\n paragraphNode.append(child);\n } else {\n paragraphNode = $createParagraphNode().append(child);\n result.push(paragraphNode);\n }\n } else {\n result.push(child);\n removeSingleLineBreakNode();\n paragraphNode = null;\n }\n }\n removeSingleLineBreakNode();\n if (result.length === 0) {\n result.push($createParagraphNode());\n }\n return result;\n },\n node: tableCellNode\n };\n}\nfunction $createTableCellNode(headerState = TableCellHeaderStates.NO_STATUS, colSpan = 1, width) {\n return $applyNodeReplacement(new TableCellNode(headerState, colSpan, width));\n}\nfunction $isTableCellNode(node) {\n return node instanceof TableCellNode;\n}\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst INSERT_TABLE_COMMAND = createCommand('INSERT_TABLE_COMMAND');\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n// Do not require this module directly! Use normal `invariant` calls.\n\nfunction formatDevErrorMessage(message) {\n throw new Error(message);\n}\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/** @noInheritDoc */\nclass TableRowNode extends ElementNode {\n /** @internal */\n __height;\n static getType() {\n return 'tablerow';\n }\n static clone(node) {\n return new TableRowNode(node.__height, node.__key);\n }\n afterCloneFrom(prevNode) {\n super.afterCloneFrom(prevNode);\n this.__height = prevNode.__height;\n }\n static importDOM() {\n return {\n tr: node => ({\n conversion: $convertTableRowElement,\n priority: 0\n })\n };\n }\n static importJSON(serializedNode) {\n return $createTableRowNode().updateFromJSON(serializedNode);\n }\n updateFromJSON(serializedNode) {\n return super.updateFromJSON(serializedNode).setHeight(serializedNode.height);\n }\n constructor(height, key) {\n super(key);\n this.__height = height;\n }\n exportJSON() {\n const height = this.getHeight();\n return {\n ...super.exportJSON(),\n ...(height === undefined ? undefined : {\n height\n })\n };\n }\n createDOM(config) {\n const element = document.createElement('tr');\n if (this.__height) {\n element.style.height = `${this.__height}px`;\n }\n addClassNamesToElement(element, config.theme.tableRow);\n return element;\n }\n extractWithChild(child, selection, destination) {\n return destination === 'html';\n }\n isShadowRoot() {\n return true;\n }\n setHeight(height) {\n const self = this.getWritable();\n self.__height = height;\n return self;\n }\n getHeight() {\n return this.getLatest().__height;\n }\n updateDOM(prevNode) {\n return prevNode.__height !== this.__height;\n }\n canBeEmpty() {\n return false;\n }\n canIndent() {\n return false;\n }\n}\nfunction $convertTableRowElement(domNode) {\n const domNode_ = domNode;\n let height = undefined;\n if (PIXEL_VALUE_REG_EXP.test(domNode_.style.height)) {\n height = parseFloat(domNode_.style.height);\n }\n return {\n after: children => $descendantsMatching(children, $isTableCellNode),\n node: $createTableRowNode(height)\n };\n}\nfunction $createTableRowNode(height) {\n return $applyNodeReplacement(new TableRowNode(height));\n}\nfunction $isTableRowNode(node) {\n return node instanceof TableRowNode;\n}\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst CAN_USE_DOM = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined';\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nconst documentMode = CAN_USE_DOM && 'documentMode' in document ? document.documentMode : null;\nconst IS_FIREFOX = CAN_USE_DOM && /^(?!.*Seamonkey)(?=.*Firefox).*/i.test(navigator.userAgent);\nCAN_USE_DOM && 'InputEvent' in window && !documentMode ? 'getTargetRanges' in new window.InputEvent('input') : false;\n\nfunction $createTableNodeWithDimensions(rowCount, columnCount, includeHeaders = true) {\n const tableNode = $createTableNode();\n for (let iRow = 0; iRow < rowCount; iRow++) {\n const tableRowNode = $createTableRowNode();\n for (let iColumn = 0; iColumn < columnCount; iColumn++) {\n let headerState = TableCellHeaderStates.NO_STATUS;\n if (typeof includeHeaders === 'object') {\n if (iRow === 0 && includeHeaders.rows) {\n headerState |= TableCellHeaderStates.ROW;\n }\n if (iColumn === 0 && includeHeaders.columns) {\n headerState |= TableCellHeaderStates.COLUMN;\n }\n } else if (includeHeaders) {\n if (iRow === 0) {\n headerState |= TableCellHeaderStates.ROW;\n }\n if (iColumn === 0) {\n headerState |= TableCellHeaderStates.COLUMN;\n }\n }\n const tableCellNode = $createTableCellNode(headerState);\n const paragraphNode = $createParagraphNode();\n paragraphNode.append($createTextNode());\n tableCellNode.append(paragraphNode);\n tableRowNode.append(tableCellNode);\n }\n tableNode.append(tableRowNode);\n }\n return tableNode;\n}\nfunction $getTableCellNodeFromLexicalNode(startingNode) {\n const node = $findMatchingParent(startingNode, n => $isTableCellNode(n));\n if ($isTableCellNode(node)) {\n return node;\n }\n return null;\n}\nfunction $getTableRowNodeFromTableCellNodeOrThrow(startingNode) {\n const node = $findMatchingParent(startingNode, n => $isTableRowNode(n));\n if ($isTableRowNode(node)) {\n return node;\n }\n throw new Error('Expected table cell to be inside of table row.');\n}\nfunction $getTableNodeFromLexicalNodeOrThrow(startingNode) {\n const node = $findMatchingParent(startingNode, n => $isTableNode(n));\n if ($isTableNode(node)) {\n return node;\n }\n throw new Error('Expected table cell to be inside of table.');\n}\nfunction $getTableRowIndexFromTableCellNode(tableCellNode) {\n const tableRowNode = $getTableRowNodeFromTableCellNodeOrThrow(tableCellNode);\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableRowNode);\n return tableNode.getChildren().findIndex(n => n.is(tableRowNode));\n}\nfunction $getTableColumnIndexFromTableCellNode(tableCellNode) {\n const tableRowNode = $getTableRowNodeFromTableCellNodeOrThrow(tableCellNode);\n return tableRowNode.getChildren().findIndex(n => n.is(tableCellNode));\n}\nfunction $getTableCellSiblingsFromTableCellNode(tableCellNode, table) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode);\n const {\n x,\n y\n } = tableNode.getCordsFromCellNode(tableCellNode, table);\n return {\n above: tableNode.getCellNodeFromCords(x, y - 1, table),\n below: tableNode.getCellNodeFromCords(x, y + 1, table),\n left: tableNode.getCellNodeFromCords(x - 1, y, table),\n right: tableNode.getCellNodeFromCords(x + 1, y, table)\n };\n}\nfunction $removeTableRowAtIndex(tableNode, indexToDelete) {\n const tableRows = tableNode.getChildren();\n if (indexToDelete >= tableRows.length || indexToDelete < 0) {\n throw new Error('Expected table cell to be inside of table row.');\n }\n const targetRowNode = tableRows[indexToDelete];\n targetRowNode.remove();\n return tableNode;\n}\n\n/**\n * @deprecated This function does not support merged cells. Use {@link $insertTableRowAtSelection} or {@link $insertTableRowAtNode} instead.\n */\nfunction $insertTableRow(tableNode, targetIndex, shouldInsertAfter = true, rowCount, table) {\n const tableRows = tableNode.getChildren();\n if (targetIndex >= tableRows.length || targetIndex < 0) {\n throw new Error('Table row target index out of range');\n }\n const targetRowNode = tableRows[targetIndex];\n if ($isTableRowNode(targetRowNode)) {\n for (let r = 0; r < rowCount; r++) {\n const tableRowCells = targetRowNode.getChildren();\n const tableColumnCount = tableRowCells.length;\n const newTableRowNode = $createTableRowNode();\n for (let c = 0; c < tableColumnCount; c++) {\n const tableCellFromTargetRow = tableRowCells[c];\n if (!$isTableCellNode(tableCellFromTargetRow)) {\n formatDevErrorMessage(`Expected table cell`);\n }\n const {\n above,\n below\n } = $getTableCellSiblingsFromTableCellNode(tableCellFromTargetRow, table);\n let headerState = TableCellHeaderStates.NO_STATUS;\n const width = above && above.getWidth() || below && below.getWidth() || undefined;\n if (above && above.hasHeaderState(TableCellHeaderStates.COLUMN) || below && below.hasHeaderState(TableCellHeaderStates.COLUMN)) {\n headerState |= TableCellHeaderStates.COLUMN;\n }\n const tableCellNode = $createTableCellNode(headerState, 1, width);\n tableCellNode.append($createParagraphNode());\n newTableRowNode.append(tableCellNode);\n }\n if (shouldInsertAfter) {\n targetRowNode.insertAfter(newTableRowNode);\n } else {\n targetRowNode.insertBefore(newTableRowNode);\n }\n }\n } else {\n throw new Error('Row before insertion index does not exist.');\n }\n return tableNode;\n}\nconst getHeaderState = (currentState, possibleState) => {\n if (currentState === TableCellHeaderStates.BOTH || currentState === possibleState) {\n return possibleState;\n }\n return TableCellHeaderStates.NO_STATUS;\n};\n\n/**\n * Inserts a table row before or after the current focus cell node,\n * taking into account any spans. If successful, returns the\n * inserted table row node.\n */\nfunction $insertTableRowAtSelection(insertAfter = true) {\n const selection = $getSelection();\n if (!($isRangeSelection(selection) || $isTableSelection(selection))) {\n formatDevErrorMessage(`Expected a RangeSelection or TableSelection`);\n }\n const anchor = selection.anchor.getNode();\n const focus = selection.focus.getNode();\n const [anchorCell] = $getNodeTriplet(anchor);\n const [focusCell,, grid] = $getNodeTriplet(focus);\n const [, focusCellMap, anchorCellMap] = $computeTableMap(grid, focusCell, anchorCell);\n const {\n startRow: anchorStartRow\n } = anchorCellMap;\n const {\n startRow: focusStartRow\n } = focusCellMap;\n if (insertAfter) {\n return $insertTableRowAtNode(anchorStartRow + anchorCell.__rowSpan > focusStartRow + focusCell.__rowSpan ? anchorCell : focusCell, true);\n } else {\n return $insertTableRowAtNode(focusStartRow < anchorStartRow ? focusCell : anchorCell, false);\n }\n}\n\n/**\n * @deprecated renamed to {@link $insertTableRowAtSelection}\n */\nconst $insertTableRow__EXPERIMENTAL = $insertTableRowAtSelection;\n\n/**\n * Inserts a table row before or after the given cell node,\n * taking into account any spans. If successful, returns the\n * inserted table row node.\n */\nfunction $insertTableRowAtNode(cellNode, insertAfter = true) {\n const [,, grid] = $getNodeTriplet(cellNode);\n const [gridMap, cellMap] = $computeTableMap(grid, cellNode, cellNode);\n const columnCount = gridMap[0].length;\n const {\n startRow: cellStartRow\n } = cellMap;\n let insertedRow = null;\n if (insertAfter) {\n const insertAfterEndRow = cellStartRow + cellNode.__rowSpan - 1;\n const insertAfterEndRowMap = gridMap[insertAfterEndRow];\n const newRow = $createTableRowNode();\n for (let i = 0; i < columnCount; i++) {\n const {\n cell,\n startRow\n } = insertAfterEndRowMap[i];\n if (startRow + cell.__rowSpan - 1 <= insertAfterEndRow) {\n const currentCell = insertAfterEndRowMap[i].cell;\n const currentCellHeaderState = currentCell.__headerState;\n const headerState = getHeaderState(currentCellHeaderState, TableCellHeaderStates.COLUMN);\n newRow.append($createTableCellNode(headerState).append($createParagraphNode()));\n } else {\n cell.setRowSpan(cell.__rowSpan + 1);\n }\n }\n const insertAfterEndRowNode = grid.getChildAtIndex(insertAfterEndRow);\n if (!$isTableRowNode(insertAfterEndRowNode)) {\n formatDevErrorMessage(`insertAfterEndRow is not a TableRowNode`);\n }\n insertAfterEndRowNode.insertAfter(newRow);\n insertedRow = newRow;\n } else {\n const insertBeforeStartRow = cellStartRow;\n const insertBeforeStartRowMap = gridMap[insertBeforeStartRow];\n const newRow = $createTableRowNode();\n for (let i = 0; i < columnCount; i++) {\n const {\n cell,\n startRow\n } = insertBeforeStartRowMap[i];\n if (startRow === insertBeforeStartRow) {\n const currentCell = insertBeforeStartRowMap[i].cell;\n const currentCellHeaderState = currentCell.__headerState;\n const headerState = getHeaderState(currentCellHeaderState, TableCellHeaderStates.COLUMN);\n newRow.append($createTableCellNode(headerState).append($createParagraphNode()));\n } else {\n cell.setRowSpan(cell.__rowSpan + 1);\n }\n }\n const insertBeforeStartRowNode = grid.getChildAtIndex(insertBeforeStartRow);\n if (!$isTableRowNode(insertBeforeStartRowNode)) {\n formatDevErrorMessage(`insertBeforeStartRow is not a TableRowNode`);\n }\n insertBeforeStartRowNode.insertBefore(newRow);\n insertedRow = newRow;\n }\n return insertedRow;\n}\n\n/**\n * @deprecated This function does not support merged cells. Use {@link $insertTableColumnAtSelection} or {@link $insertTableColumnAtNode} instead.\n */\nfunction $insertTableColumn(tableNode, targetIndex, shouldInsertAfter = true, columnCount, table) {\n const tableRows = tableNode.getChildren();\n const tableCellsToBeInserted = [];\n for (let r = 0; r < tableRows.length; r++) {\n const currentTableRowNode = tableRows[r];\n if ($isTableRowNode(currentTableRowNode)) {\n for (let c = 0; c < columnCount; c++) {\n const tableRowChildren = currentTableRowNode.getChildren();\n if (targetIndex >= tableRowChildren.length || targetIndex < 0) {\n throw new Error('Table column target index out of range');\n }\n const targetCell = tableRowChildren[targetIndex];\n if (!$isTableCellNode(targetCell)) {\n formatDevErrorMessage(`Expected table cell`);\n }\n const {\n left,\n right\n } = $getTableCellSiblingsFromTableCellNode(targetCell, table);\n let headerState = TableCellHeaderStates.NO_STATUS;\n if (left && left.hasHeaderState(TableCellHeaderStates.ROW) || right && right.hasHeaderState(TableCellHeaderStates.ROW)) {\n headerState |= TableCellHeaderStates.ROW;\n }\n const newTableCell = $createTableCellNode(headerState);\n newTableCell.append($createParagraphNode());\n tableCellsToBeInserted.push({\n newTableCell,\n targetCell\n });\n }\n }\n }\n tableCellsToBeInserted.forEach(({\n newTableCell,\n targetCell\n }) => {\n if (shouldInsertAfter) {\n targetCell.insertAfter(newTableCell);\n } else {\n targetCell.insertBefore(newTableCell);\n }\n });\n return tableNode;\n}\n\n/**\n * Inserts a column before or after the current focus cell node,\n * taking into account any spans. If successful, returns the\n * first inserted cell node.\n */\nfunction $insertTableColumnAtSelection(insertAfter = true) {\n const selection = $getSelection();\n if (!($isRangeSelection(selection) || $isTableSelection(selection))) {\n formatDevErrorMessage(`Expected a RangeSelection or TableSelection`);\n }\n const anchor = selection.anchor.getNode();\n const focus = selection.focus.getNode();\n const [anchorCell] = $getNodeTriplet(anchor);\n const [focusCell,, grid] = $getNodeTriplet(focus);\n const [, focusCellMap, anchorCellMap] = $computeTableMap(grid, focusCell, anchorCell);\n const {\n startColumn: anchorStartColumn\n } = anchorCellMap;\n const {\n startColumn: focusStartColumn\n } = focusCellMap;\n if (insertAfter) {\n return $insertTableColumnAtNode(anchorStartColumn + anchorCell.__colSpan > focusStartColumn + focusCell.__colSpan ? anchorCell : focusCell, true);\n } else {\n return $insertTableColumnAtNode(focusStartColumn < anchorStartColumn ? focusCell : anchorCell, false);\n }\n}\n\n/**\n * @deprecated renamed to {@link $insertTableColumnAtSelection}\n */\nconst $insertTableColumn__EXPERIMENTAL = $insertTableColumnAtSelection;\n\n/**\n * Inserts a column before or after the given cell node,\n * taking into account any spans. If successful, returns the\n * first inserted cell node.\n */\nfunction $insertTableColumnAtNode(cellNode, insertAfter = true, shouldSetSelection = true) {\n const [,, grid] = $getNodeTriplet(cellNode);\n const [gridMap, cellMap] = $computeTableMap(grid, cellNode, cellNode);\n const rowCount = gridMap.length;\n const {\n startColumn\n } = cellMap;\n const insertAfterColumn = insertAfter ? startColumn + cellNode.__colSpan - 1 : startColumn - 1;\n const gridFirstChild = grid.getFirstChild();\n if (!$isTableRowNode(gridFirstChild)) {\n formatDevErrorMessage(`Expected firstTable child to be a row`);\n }\n let firstInsertedCell = null;\n function $createTableCellNodeForInsertTableColumn(headerState = TableCellHeaderStates.NO_STATUS) {\n const cell = $createTableCellNode(headerState).append($createParagraphNode());\n if (firstInsertedCell === null) {\n firstInsertedCell = cell;\n }\n return cell;\n }\n let loopRow = gridFirstChild;\n rowLoop: for (let i = 0; i < rowCount; i++) {\n if (i !== 0) {\n const currentRow = loopRow.getNextSibling();\n if (!$isTableRowNode(currentRow)) {\n formatDevErrorMessage(`Expected row nextSibling to be a row`);\n }\n loopRow = currentRow;\n }\n const rowMap = gridMap[i];\n const currentCellHeaderState = rowMap[insertAfterColumn < 0 ? 0 : insertAfterColumn].cell.__headerState;\n const headerState = getHeaderState(currentCellHeaderState, TableCellHeaderStates.ROW);\n if (insertAfterColumn < 0) {\n $insertFirst(loopRow, $createTableCellNodeForInsertTableColumn(headerState));\n continue;\n }\n const {\n cell: currentCell,\n startColumn: currentStartColumn,\n startRow: currentStartRow\n } = rowMap[insertAfterColumn];\n if (currentStartColumn + currentCell.__colSpan - 1 <= insertAfterColumn) {\n let insertAfterCell = currentCell;\n let insertAfterCellRowStart = currentStartRow;\n let prevCellIndex = insertAfterColumn;\n while (insertAfterCellRowStart !== i && insertAfterCell.__rowSpan > 1) {\n prevCellIndex -= currentCell.__colSpan;\n if (prevCellIndex >= 0) {\n const {\n cell: cell_,\n startRow: startRow_\n } = rowMap[prevCellIndex];\n insertAfterCell = cell_;\n insertAfterCellRowStart = startRow_;\n } else {\n loopRow.append($createTableCellNodeForInsertTableColumn(headerState));\n continue rowLoop;\n }\n }\n insertAfterCell.insertAfter($createTableCellNodeForInsertTableColumn(headerState));\n } else {\n currentCell.setColSpan(currentCell.__colSpan + 1);\n }\n }\n if (firstInsertedCell !== null && shouldSetSelection) {\n $moveSelectionToCell(firstInsertedCell);\n }\n const colWidths = grid.getColWidths();\n if (colWidths) {\n const newColWidths = [...colWidths];\n const columnIndex = insertAfterColumn < 0 ? 0 : insertAfterColumn;\n const newWidth = newColWidths[columnIndex];\n newColWidths.splice(columnIndex, 0, newWidth);\n grid.setColWidths(newColWidths);\n }\n return firstInsertedCell;\n}\n\n/**\n * @deprecated This function does not support merged cells. Use {@link $deleteTableColumnAtSelection} instead.\n */\nfunction $deleteTableColumn(tableNode, targetIndex) {\n const tableRows = tableNode.getChildren();\n for (let i = 0; i < tableRows.length; i++) {\n const currentTableRowNode = tableRows[i];\n if ($isTableRowNode(currentTableRowNode)) {\n const tableRowChildren = currentTableRowNode.getChildren();\n if (targetIndex >= tableRowChildren.length || targetIndex < 0) {\n throw new Error('Table column target index out of range');\n }\n tableRowChildren[targetIndex].remove();\n }\n }\n return tableNode;\n}\nfunction $deleteTableRowAtSelection() {\n const selection = $getSelection();\n if (!($isRangeSelection(selection) || $isTableSelection(selection))) {\n formatDevErrorMessage(`Expected a RangeSelection or TableSelection`);\n }\n const [anchor, focus] = selection.isBackward() ? [selection.focus.getNode(), selection.anchor.getNode()] : [selection.anchor.getNode(), selection.focus.getNode()];\n const [anchorCell,, grid] = $getNodeTriplet(anchor);\n const [focusCell] = $getNodeTriplet(focus);\n const [gridMap, anchorCellMap, focusCellMap] = $computeTableMap(grid, anchorCell, focusCell);\n const {\n startRow: anchorStartRow\n } = anchorCellMap;\n const {\n startRow: focusStartRow\n } = focusCellMap;\n const focusEndRow = focusStartRow + focusCell.__rowSpan - 1;\n if (gridMap.length === focusEndRow - anchorStartRow + 1) {\n // Empty grid\n grid.remove();\n return;\n }\n const columnCount = gridMap[0].length;\n const nextRow = gridMap[focusEndRow + 1];\n const nextRowNode = grid.getChildAtIndex(focusEndRow + 1);\n for (let row = focusEndRow; row >= anchorStartRow; row--) {\n for (let column = columnCount - 1; column >= 0; column--) {\n const {\n cell,\n startRow: cellStartRow,\n startColumn: cellStartColumn\n } = gridMap[row][column];\n if (cellStartColumn !== column) {\n // Don't repeat work for the same Cell\n continue;\n }\n // Rows overflowing top or bottom have to be trimmed\n if (cellStartRow < anchorStartRow || cellStartRow + cell.__rowSpan - 1 > focusEndRow) {\n const intersectionStart = Math.max(cellStartRow, anchorStartRow);\n const intersectionEnd = Math.min(cell.__rowSpan + cellStartRow - 1, focusEndRow);\n const overflowRowsCount = intersectionStart <= intersectionEnd ? intersectionEnd - intersectionStart + 1 : 0;\n cell.setRowSpan(cell.__rowSpan - overflowRowsCount);\n }\n // Rows overflowing bottom have to be moved to the next row\n if (cellStartRow >= anchorStartRow && cellStartRow + cell.__rowSpan - 1 > focusEndRow &&\n // Handle overflow only once\n row === focusEndRow) {\n if (!(nextRowNode !== null)) {\n formatDevErrorMessage(`Expected nextRowNode not to be null`);\n }\n let insertAfterCell = null;\n for (let columnIndex = 0; columnIndex < column; columnIndex++) {\n const currentCellMap = nextRow[columnIndex];\n const currentCell = currentCellMap.cell;\n // Checking the cell having startRow as same as nextRow\n if (currentCellMap.startRow === row + 1) {\n insertAfterCell = currentCell;\n }\n if (currentCell.__colSpan > 1) {\n columnIndex += currentCell.__colSpan - 1;\n }\n }\n if (insertAfterCell === null) {\n $insertFirst(nextRowNode, cell);\n } else {\n insertAfterCell.insertAfter(cell);\n }\n }\n }\n const rowNode = grid.getChildAtIndex(row);\n if (!$isTableRowNode(rowNode)) {\n formatDevErrorMessage(`Expected TableNode childAtIndex(${String(row)}) to be RowNode`);\n }\n rowNode.remove();\n }\n if (nextRow !== undefined) {\n const {\n cell\n } = nextRow[0];\n $moveSelectionToCell(cell);\n } else {\n const previousRow = gridMap[anchorStartRow - 1];\n const {\n cell\n } = previousRow[0];\n $moveSelectionToCell(cell);\n }\n}\n\n/**\n * @deprecated renamed to {@link $deleteTableRowAtSelection}\n */\nconst $deleteTableRow__EXPERIMENTAL = $deleteTableRowAtSelection;\nfunction $deleteTableColumnAtSelection() {\n const selection = $getSelection();\n if (!($isRangeSelection(selection) || $isTableSelection(selection))) {\n formatDevErrorMessage(`Expected a RangeSelection or TableSelection`);\n }\n const anchor = selection.anchor.getNode();\n const focus = selection.focus.getNode();\n const [anchorCell,, grid] = $getNodeTriplet(anchor);\n const [focusCell] = $getNodeTriplet(focus);\n const [gridMap, anchorCellMap, focusCellMap] = $computeTableMap(grid, anchorCell, focusCell);\n const {\n startColumn: anchorStartColumn\n } = anchorCellMap;\n const {\n startRow: focusStartRow,\n startColumn: focusStartColumn\n } = focusCellMap;\n const startColumn = Math.min(anchorStartColumn, focusStartColumn);\n const endColumn = Math.max(anchorStartColumn + anchorCell.__colSpan - 1, focusStartColumn + focusCell.__colSpan - 1);\n const selectedColumnCount = endColumn - startColumn + 1;\n const columnCount = gridMap[0].length;\n if (columnCount === endColumn - startColumn + 1) {\n // Empty grid\n grid.selectPrevious();\n grid.remove();\n return;\n }\n const rowCount = gridMap.length;\n for (let row = 0; row < rowCount; row++) {\n for (let column = startColumn; column <= endColumn; column++) {\n const {\n cell,\n startColumn: cellStartColumn\n } = gridMap[row][column];\n if (cellStartColumn < startColumn) {\n if (column === startColumn) {\n const overflowLeft = startColumn - cellStartColumn;\n // Overflowing left\n cell.setColSpan(cell.__colSpan -\n // Possible overflow right too\n Math.min(selectedColumnCount, cell.__colSpan - overflowLeft));\n }\n } else if (cellStartColumn + cell.__colSpan - 1 > endColumn) {\n if (column === endColumn) {\n // Overflowing right\n const inSelectedArea = endColumn - cellStartColumn + 1;\n cell.setColSpan(cell.__colSpan - inSelectedArea);\n }\n } else {\n cell.remove();\n }\n }\n }\n const focusRowMap = gridMap[focusStartRow];\n const nextColumn = anchorStartColumn > focusStartColumn ? focusRowMap[anchorStartColumn + anchorCell.__colSpan] : focusRowMap[focusStartColumn + focusCell.__colSpan];\n if (nextColumn !== undefined) {\n const {\n cell\n } = nextColumn;\n $moveSelectionToCell(cell);\n } else {\n const previousRow = focusStartColumn < anchorStartColumn ? focusRowMap[focusStartColumn - 1] : focusRowMap[anchorStartColumn - 1];\n const {\n cell\n } = previousRow;\n $moveSelectionToCell(cell);\n }\n const colWidths = grid.getColWidths();\n if (colWidths) {\n const newColWidths = [...colWidths];\n newColWidths.splice(startColumn, selectedColumnCount);\n grid.setColWidths(newColWidths);\n }\n}\n\n/**\n * @deprecated renamed to {@link $deleteTableColumnAtSelection}\n */\nconst $deleteTableColumn__EXPERIMENTAL = $deleteTableColumnAtSelection;\nfunction $moveSelectionToCell(cell) {\n const firstDescendant = cell.getFirstDescendant();\n if (firstDescendant == null) {\n cell.selectStart();\n } else {\n firstDescendant.getParentOrThrow().selectStart();\n }\n}\nfunction $insertFirst(parent, node) {\n const firstChild = parent.getFirstChild();\n if (firstChild !== null) {\n firstChild.insertBefore(node);\n } else {\n parent.append(node);\n }\n}\nfunction $mergeCells(cellNodes) {\n if (cellNodes.length === 0) {\n return null;\n }\n\n // Find the table node\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(cellNodes[0]);\n const [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\n\n // Find the boundaries of the selection including merged cells\n let minRow = Infinity;\n let maxRow = -Infinity;\n let minCol = Infinity;\n let maxCol = -Infinity;\n\n // First pass: find the actual boundaries considering merged cells\n const processedCells = new Set();\n for (const row of gridMap) {\n for (const mapCell of row) {\n if (!mapCell || !mapCell.cell) {\n continue;\n }\n const cellKey = mapCell.cell.getKey();\n if (processedCells.has(cellKey)) {\n continue;\n }\n if (cellNodes.some(cell => cell.is(mapCell.cell))) {\n processedCells.add(cellKey);\n // Get the actual position of this cell in the grid\n const cellStartRow = mapCell.startRow;\n const cellStartCol = mapCell.startColumn;\n const cellRowSpan = mapCell.cell.__rowSpan || 1;\n const cellColSpan = mapCell.cell.__colSpan || 1;\n\n // Update boundaries considering the cell's actual position and span\n minRow = Math.min(minRow, cellStartRow);\n maxRow = Math.max(maxRow, cellStartRow + cellRowSpan - 1);\n minCol = Math.min(minCol, cellStartCol);\n maxCol = Math.max(maxCol, cellStartCol + cellColSpan - 1);\n }\n }\n }\n\n // Validate boundaries\n if (minRow === Infinity || minCol === Infinity) {\n return null;\n }\n\n // The total span of the merged cell\n const totalRowSpan = maxRow - minRow + 1;\n const totalColSpan = maxCol - minCol + 1;\n\n // Use the top-left cell as the target cell\n const targetCellMap = gridMap[minRow][minCol];\n if (!targetCellMap.cell) {\n return null;\n }\n const targetCell = targetCellMap.cell;\n\n // Set the spans for the target cell\n targetCell.setColSpan(totalColSpan);\n targetCell.setRowSpan(totalRowSpan);\n\n // Move content from other cells to the target cell\n const seenCells = new Set([targetCell.getKey()]);\n\n // Second pass: merge content and remove other cells\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n const mapCell = gridMap[row][col];\n if (!mapCell.cell) {\n continue;\n }\n const currentCell = mapCell.cell;\n const key = currentCell.getKey();\n if (!seenCells.has(key)) {\n seenCells.add(key);\n const isEmpty = $cellContainsEmptyParagraph(currentCell);\n if (!isEmpty) {\n targetCell.append(...currentCell.getChildren());\n }\n currentCell.remove();\n }\n }\n }\n\n // Ensure target cell has content\n if (targetCell.getChildrenSize() === 0) {\n targetCell.append($createParagraphNode());\n }\n return targetCell;\n}\nfunction $cellContainsEmptyParagraph(cell) {\n if (cell.getChildrenSize() !== 1) {\n return false;\n }\n const firstChild = cell.getFirstChildOrThrow();\n if (!$isParagraphNode(firstChild) || !firstChild.isEmpty()) {\n return false;\n }\n return true;\n}\nfunction $unmergeCell() {\n const selection = $getSelection();\n if (!($isRangeSelection(selection) || $isTableSelection(selection))) {\n formatDevErrorMessage(`Expected a RangeSelection or TableSelection`);\n }\n const anchor = selection.anchor.getNode();\n const cellNode = $findMatchingParent(anchor, $isTableCellNode);\n if (!$isTableCellNode(cellNode)) {\n formatDevErrorMessage(`Expected to find a parent TableCellNode`);\n }\n return $unmergeCellNode(cellNode);\n}\nfunction $unmergeCellNode(cellNode) {\n const [cell, row, grid] = $getNodeTriplet(cellNode);\n const colSpan = cell.__colSpan;\n const rowSpan = cell.__rowSpan;\n if (colSpan === 1 && rowSpan === 1) {\n return;\n }\n const [map, cellMap] = $computeTableMap(grid, cell, cell);\n const {\n startColumn,\n startRow\n } = cellMap;\n // Create a heuristic for what the style of the unmerged cells should be\n // based on whether every row or column already had that state before the\n // unmerge.\n const baseColStyle = cell.__headerState & TableCellHeaderStates.COLUMN;\n const colStyles = Array.from({\n length: colSpan\n }, (_v, i) => {\n let colStyle = baseColStyle;\n for (let rowIdx = 0; colStyle !== 0 && rowIdx < map.length; rowIdx++) {\n colStyle &= map[rowIdx][i + startColumn].cell.__headerState;\n }\n return colStyle;\n });\n const baseRowStyle = cell.__headerState & TableCellHeaderStates.ROW;\n const rowStyles = Array.from({\n length: rowSpan\n }, (_v, i) => {\n let rowStyle = baseRowStyle;\n for (let colIdx = 0; rowStyle !== 0 && colIdx < map[0].length; colIdx++) {\n rowStyle &= map[i + startRow][colIdx].cell.__headerState;\n }\n return rowStyle;\n });\n if (colSpan > 1) {\n for (let i = 1; i < colSpan; i++) {\n cell.insertAfter($createTableCellNode(colStyles[i] | rowStyles[0]).append($createParagraphNode()));\n }\n cell.setColSpan(1);\n }\n if (rowSpan > 1) {\n let currentRowNode;\n for (let i = 1; i < rowSpan; i++) {\n const currentRow = startRow + i;\n const currentRowMap = map[currentRow];\n currentRowNode = (currentRowNode || row).getNextSibling();\n if (!$isTableRowNode(currentRowNode)) {\n formatDevErrorMessage(`Expected row next sibling to be a row`);\n }\n let insertAfterCell = null;\n for (let column = 0; column < startColumn; column++) {\n const currentCellMap = currentRowMap[column];\n const currentCell = currentCellMap.cell;\n if (currentCellMap.startRow === currentRow) {\n insertAfterCell = currentCell;\n }\n if (currentCell.__colSpan > 1) {\n column += currentCell.__colSpan - 1;\n }\n }\n if (insertAfterCell === null) {\n for (let j = colSpan - 1; j >= 0; j--) {\n $insertFirst(currentRowNode, $createTableCellNode(colStyles[j] | rowStyles[i]).append($createParagraphNode()));\n }\n } else {\n for (let j = colSpan - 1; j >= 0; j--) {\n insertAfterCell.insertAfter($createTableCellNode(colStyles[j] | rowStyles[i]).append($createParagraphNode()));\n }\n }\n }\n cell.setRowSpan(1);\n }\n}\nfunction $computeTableMap(tableNode, cellA, cellB) {\n const [tableMap, cellAValue, cellBValue] = $computeTableMapSkipCellCheck(tableNode, cellA, cellB);\n if (!(cellAValue !== null)) {\n formatDevErrorMessage(`Anchor not found in Table`);\n }\n if (!(cellBValue !== null)) {\n formatDevErrorMessage(`Focus not found in Table`);\n }\n return [tableMap, cellAValue, cellBValue];\n}\nfunction $computeTableMapSkipCellCheck(tableNode, cellA, cellB) {\n const tableMap = [];\n let cellAValue = null;\n let cellBValue = null;\n function getMapRow(i) {\n let row = tableMap[i];\n if (row === undefined) {\n tableMap[i] = row = [];\n }\n return row;\n }\n const gridChildren = tableNode.getChildren();\n for (let rowIdx = 0; rowIdx < gridChildren.length; rowIdx++) {\n const row = gridChildren[rowIdx];\n if (!$isTableRowNode(row)) {\n formatDevErrorMessage(`Expected TableNode children to be TableRowNode`);\n }\n const startMapRow = getMapRow(rowIdx);\n for (let cell = row.getFirstChild(), colIdx = 0; cell != null; cell = cell.getNextSibling()) {\n if (!$isTableCellNode(cell)) {\n formatDevErrorMessage(`Expected TableRowNode children to be TableCellNode`);\n } // Skip past any columns that were merged from a higher row\n while (startMapRow[colIdx] !== undefined) {\n colIdx++;\n }\n const value = {\n cell,\n startColumn: colIdx,\n startRow: rowIdx\n };\n const {\n __rowSpan: rowSpan,\n __colSpan: colSpan\n } = cell;\n for (let j = 0; j < rowSpan; j++) {\n if (rowIdx + j >= gridChildren.length) {\n // The table is non-rectangular with a rowSpan\n // below the last <tr> in the table.\n // We should probably handle this with a node transform\n // to ensure that tables are always rectangular but this\n // will avoid crashes such as #6584\n // Note that there are probably still latent bugs\n // regarding colSpan or general cell count mismatches.\n break;\n }\n const mapRow = getMapRow(rowIdx + j);\n for (let i = 0; i < colSpan; i++) {\n mapRow[colIdx + i] = value;\n }\n }\n if (cellA !== null && cellAValue === null && cellA.is(cell)) {\n cellAValue = value;\n }\n if (cellB !== null && cellBValue === null && cellB.is(cell)) {\n cellBValue = value;\n }\n }\n }\n return [tableMap, cellAValue, cellBValue];\n}\nfunction $getNodeTriplet(source) {\n let cell;\n if (source instanceof TableCellNode) {\n cell = source;\n } else if ('__type' in source) {\n const cell_ = $findMatchingParent(source, $isTableCellNode);\n if (!$isTableCellNode(cell_)) {\n formatDevErrorMessage(`Expected to find a parent TableCellNode`);\n }\n cell = cell_;\n } else {\n const cell_ = $findMatchingParent(source.getNode(), $isTableCellNode);\n if (!$isTableCellNode(cell_)) {\n formatDevErrorMessage(`Expected to find a parent TableCellNode`);\n }\n cell = cell_;\n }\n const row = cell.getParent();\n if (!$isTableRowNode(row)) {\n formatDevErrorMessage(`Expected TableCellNode to have a parent TableRowNode`);\n }\n const grid = row.getParent();\n if (!$isTableNode(grid)) {\n formatDevErrorMessage(`Expected TableRowNode to have a parent TableNode`);\n }\n return [cell, row, grid];\n}\nfunction $computeTableCellRectSpans(map, boundary) {\n const {\n minColumn,\n maxColumn,\n minRow,\n maxRow\n } = boundary;\n let topSpan = 1;\n let leftSpan = 1;\n let rightSpan = 1;\n let bottomSpan = 1;\n const topRow = map[minRow];\n const bottomRow = map[maxRow];\n for (let col = minColumn; col <= maxColumn; col++) {\n topSpan = Math.max(topSpan, topRow[col].cell.__rowSpan);\n bottomSpan = Math.max(bottomSpan, bottomRow[col].cell.__rowSpan);\n }\n for (let row = minRow; row <= maxRow; row++) {\n leftSpan = Math.max(leftSpan, map[row][minColumn].cell.__colSpan);\n rightSpan = Math.max(rightSpan, map[row][maxColumn].cell.__colSpan);\n }\n return {\n bottomSpan,\n leftSpan,\n rightSpan,\n topSpan\n };\n}\nfunction $computeTableCellRectBoundary(map, cellAMap, cellBMap) {\n // Initial boundaries based on the anchor and focus cells\n let minColumn = Math.min(cellAMap.startColumn, cellBMap.startColumn);\n let minRow = Math.min(cellAMap.startRow, cellBMap.startRow);\n let maxColumn = Math.max(cellAMap.startColumn + cellAMap.cell.__colSpan - 1, cellBMap.startColumn + cellBMap.cell.__colSpan - 1);\n let maxRow = Math.max(cellAMap.startRow + cellAMap.cell.__rowSpan - 1, cellBMap.startRow + cellBMap.cell.__rowSpan - 1);\n\n // Keep expanding until we have a complete rectangle\n let hasChanges;\n do {\n hasChanges = false;\n\n // Check all cells in the table\n for (let row = 0; row < map.length; row++) {\n for (let col = 0; col < map[0].length; col++) {\n const cell = map[row][col];\n if (!cell) {\n continue;\n }\n const cellEndCol = cell.startColumn + cell.cell.__colSpan - 1;\n const cellEndRow = cell.startRow + cell.cell.__rowSpan - 1;\n\n // Check if this cell intersects with our current selection rectangle\n const intersectsHorizontally = cell.startColumn <= maxColumn && cellEndCol >= minColumn;\n const intersectsVertically = cell.startRow <= maxRow && cellEndRow >= minRow;\n\n // If the cell intersects either horizontally or vertically\n if (intersectsHorizontally && intersectsVertically) {\n // Expand boundaries to include this cell completely\n const newMinColumn = Math.min(minColumn, cell.startColumn);\n const newMaxColumn = Math.max(maxColumn, cellEndCol);\n const newMinRow = Math.min(minRow, cell.startRow);\n const newMaxRow = Math.max(maxRow, cellEndRow);\n\n // Check if boundaries changed\n if (newMinColumn !== minColumn || newMaxColumn !== maxColumn || newMinRow !== minRow || newMaxRow !== maxRow) {\n minColumn = newMinColumn;\n maxColumn = newMaxColumn;\n minRow = newMinRow;\n maxRow = newMaxRow;\n hasChanges = true;\n }\n }\n }\n }\n } while (hasChanges);\n return {\n maxColumn,\n maxRow,\n minColumn,\n minRow\n };\n}\n\n/**\n * Checks if the table does not have any merged cells.\n *\n * @param table Table to check for if it has any merged cells.\n * @returns True if the table does not have any merged cells, false otherwise.\n */\nfunction $isSimpleTable(table) {\n const rows = table.getChildren();\n let columns = null;\n for (const row of rows) {\n if (!$isTableRowNode(row)) {\n return false;\n }\n if (columns === null) {\n columns = row.getChildrenSize();\n }\n if (row.getChildrenSize() !== columns) {\n return false;\n }\n const cells = row.getChildren();\n for (const cell of cells) {\n if (!$isTableCellNode(cell) || cell.getRowSpan() !== 1 || cell.getColSpan() !== 1) {\n return false;\n }\n }\n }\n return (columns || 0) > 0;\n}\n\n/**\n * Moves a column from one position to another within a simple (non-merged) table.\n *\n * @param tableNode The table node to modify.\n * @param originColumn The index of the column to move.\n * @param targetColumn The index to move the column to.\n */\nfunction $moveTableColumn(tableNode, originColumn, targetColumn) {\n if (originColumn === targetColumn) {\n return;\n }\n const columnCount = tableNode.getColumnCount();\n if (originColumn < 0 || originColumn >= columnCount || targetColumn < 0 || targetColumn >= columnCount) {\n return;\n }\n if (!$isSimpleTable(tableNode)) {\n return;\n }\n const rows = tableNode.getChildren().filter($isTableRowNode);\n rows.forEach(row => {\n const cells = row.getChildren();\n const [moved] = cells.splice(originColumn, 1);\n cells.splice(targetColumn, 0, moved);\n row.splice(0, cells.length, cells);\n });\n const colWidths = tableNode.getColWidths();\n if (colWidths && colWidths.length === columnCount) {\n const newWidths = [...colWidths];\n const [movedWidth] = newWidths.splice(originColumn, 1);\n newWidths.splice(targetColumn, 0, movedWidth);\n tableNode.setColWidths(newWidths);\n }\n}\nfunction $getTableCellNodeRect(tableCellNode) {\n const [cellNode,, gridNode] = $getNodeTriplet(tableCellNode);\n const rows = gridNode.getChildren();\n const rowCount = rows.length;\n const columnCount = rows[0].getChildren().length;\n\n // Create a matrix of the same size as the table to track the position of each cell\n const cellMatrix = new Array(rowCount);\n for (let i = 0; i < rowCount; i++) {\n cellMatrix[i] = new Array(columnCount);\n }\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n const row = rows[rowIndex];\n const cells = row.getChildren();\n let columnIndex = 0;\n for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n // Find the next available position in the matrix, skip the position of merged cells\n while (cellMatrix[rowIndex][columnIndex]) {\n columnIndex++;\n }\n const cell = cells[cellIndex];\n const rowSpan = cell.__rowSpan || 1;\n const colSpan = cell.__colSpan || 1;\n\n // Put the cell into the corresponding position in the matrix\n for (let i = 0; i < rowSpan; i++) {\n for (let j = 0; j < colSpan; j++) {\n cellMatrix[rowIndex + i][columnIndex + j] = cell;\n }\n }\n\n // Return to the original index, row span and column span of the cell.\n if (cellNode === cell) {\n return {\n colSpan,\n columnIndex,\n rowIndex,\n rowSpan\n };\n }\n columnIndex += colSpan;\n }\n }\n return null;\n}\n\nfunction $getCellNodes(tableSelection) {\n const [[anchorNode, anchorCell, anchorRow, anchorTable], [focusNode, focusCell, focusRow, focusTable]] = ['anchor', 'focus'].map(k => {\n const node = tableSelection[k].getNode();\n const cellNode = $findMatchingParent(node, $isTableCellNode);\n if (!$isTableCellNode(cellNode)) {\n formatDevErrorMessage(`Expected TableSelection ${k} to be (or a child of) TableCellNode, got key ${node.getKey()} of type ${node.getType()}`);\n }\n const rowNode = cellNode.getParent();\n if (!$isTableRowNode(rowNode)) {\n formatDevErrorMessage(`Expected TableSelection ${k} cell parent to be a TableRowNode`);\n }\n const tableNode = rowNode.getParent();\n if (!$isTableNode(tableNode)) {\n formatDevErrorMessage(`Expected TableSelection ${k} row parent to be a TableNode`);\n }\n return [node, cellNode, rowNode, tableNode];\n });\n // TODO: nested tables may violate this\n if (!anchorTable.is(focusTable)) {\n formatDevErrorMessage(`Expected TableSelection anchor and focus to be in the same table`);\n }\n return {\n anchorCell,\n anchorNode,\n anchorRow,\n anchorTable,\n focusCell,\n focusNode,\n focusRow,\n focusTable\n };\n}\nclass TableSelection {\n tableKey;\n anchor;\n focus;\n _cachedNodes;\n dirty;\n constructor(tableKey, anchor, focus) {\n this.anchor = anchor;\n this.focus = focus;\n anchor._selection = this;\n focus._selection = this;\n this._cachedNodes = null;\n this.dirty = false;\n this.tableKey = tableKey;\n }\n getStartEndPoints() {\n return [this.anchor, this.focus];\n }\n\n /**\n * {@link $createTableSelection} unfortunately makes it very easy to create\n * nonsense selections, so we have a method to see if the selection probably\n * makes sense.\n *\n * @returns true if the TableSelection is (probably) valid\n */\n isValid() {\n if (this.tableKey === 'root' || this.anchor.key === 'root' || this.anchor.type !== 'element' || this.focus.key === 'root' || this.focus.type !== 'element') {\n return false;\n }\n\n // Check if the referenced nodes still exist in the editor\n const tableNode = $getNodeByKey(this.tableKey);\n const anchorNode = $getNodeByKey(this.anchor.key);\n const focusNode = $getNodeByKey(this.focus.key);\n return tableNode !== null && anchorNode !== null && focusNode !== null;\n }\n\n /**\n * Returns whether the Selection is \"backwards\", meaning the focus\n * logically precedes the anchor in the EditorState.\n * @returns true if the Selection is backwards, false otherwise.\n */\n isBackward() {\n return this.focus.isBefore(this.anchor);\n }\n getCachedNodes() {\n return this._cachedNodes;\n }\n setCachedNodes(nodes) {\n this._cachedNodes = nodes;\n }\n is(selection) {\n return $isTableSelection(selection) && this.tableKey === selection.tableKey && this.anchor.is(selection.anchor) && this.focus.is(selection.focus);\n }\n set(tableKey, anchorCellKey, focusCellKey) {\n // note: closure compiler's acorn does not support ||=\n this.dirty = this.dirty || tableKey !== this.tableKey || anchorCellKey !== this.anchor.key || focusCellKey !== this.focus.key;\n this.tableKey = tableKey;\n this.anchor.key = anchorCellKey;\n this.focus.key = focusCellKey;\n this._cachedNodes = null;\n }\n clone() {\n return new TableSelection(this.tableKey, $createPoint(this.anchor.key, this.anchor.offset, this.anchor.type), $createPoint(this.focus.key, this.focus.offset, this.focus.type));\n }\n isCollapsed() {\n return false;\n }\n extract() {\n return this.getNodes();\n }\n insertRawText(text) {\n // Do nothing?\n }\n insertText() {\n // Do nothing?\n }\n\n /**\n * Returns whether the provided TextFormatType is present on the Selection.\n * This will be true if any paragraph in table cells has the specified format.\n *\n * @param type the TextFormatType to check for.\n * @returns true if the provided format is currently toggled on on the Selection, false otherwise.\n */\n hasFormat(type) {\n let format = 0;\n const cellNodes = this.getNodes().filter($isTableCellNode);\n cellNodes.forEach(cellNode => {\n const paragraph = cellNode.getFirstChild();\n if ($isParagraphNode(paragraph)) {\n format |= paragraph.getTextFormat();\n }\n });\n const formatFlag = TEXT_TYPE_TO_FORMAT[type];\n return (format & formatFlag) !== 0;\n }\n insertNodes(nodes) {\n const focusNode = this.focus.getNode();\n if (!$isElementNode(focusNode)) {\n formatDevErrorMessage(`Expected TableSelection focus to be an ElementNode`);\n }\n const selection = $normalizeSelection__EXPERIMENTAL(focusNode.select(0, focusNode.getChildrenSize()));\n selection.insertNodes(nodes);\n }\n\n // TODO Deprecate this method. It's confusing when used with colspan|rowspan\n getShape() {\n const {\n anchorCell,\n focusCell\n } = $getCellNodes(this);\n const anchorCellNodeRect = $getTableCellNodeRect(anchorCell);\n if (!(anchorCellNodeRect !== null)) {\n formatDevErrorMessage(`getCellRect: expected to find AnchorNode`);\n }\n const focusCellNodeRect = $getTableCellNodeRect(focusCell);\n if (!(focusCellNodeRect !== null)) {\n formatDevErrorMessage(`getCellRect: expected to find focusCellNode`);\n }\n const startX = Math.min(anchorCellNodeRect.columnIndex, focusCellNodeRect.columnIndex);\n const stopX = Math.max(anchorCellNodeRect.columnIndex + anchorCellNodeRect.colSpan - 1, focusCellNodeRect.columnIndex + focusCellNodeRect.colSpan - 1);\n const startY = Math.min(anchorCellNodeRect.rowIndex, focusCellNodeRect.rowIndex);\n const stopY = Math.max(anchorCellNodeRect.rowIndex + anchorCellNodeRect.rowSpan - 1, focusCellNodeRect.rowIndex + focusCellNodeRect.rowSpan - 1);\n return {\n fromX: Math.min(startX, stopX),\n fromY: Math.min(startY, stopY),\n toX: Math.max(startX, stopX),\n toY: Math.max(startY, stopY)\n };\n }\n getNodes() {\n if (!this.isValid()) {\n return [];\n }\n const cachedNodes = this._cachedNodes;\n if (cachedNodes !== null) {\n return cachedNodes;\n }\n const {\n anchorTable: tableNode,\n anchorCell,\n focusCell\n } = $getCellNodes(this);\n const focusCellGrid = focusCell.getParents()[1];\n if (focusCellGrid !== tableNode) {\n if (!tableNode.isParentOf(focusCell)) {\n // focus is on higher Grid level than anchor\n const gridParent = tableNode.getParent();\n if (!(gridParent != null)) {\n formatDevErrorMessage(`Expected gridParent to have a parent`);\n }\n this.set(this.tableKey, gridParent.getKey(), focusCell.getKey());\n } else {\n // anchor is on higher Grid level than focus\n const focusCellParent = focusCellGrid.getParent();\n if (!(focusCellParent != null)) {\n formatDevErrorMessage(`Expected focusCellParent to have a parent`);\n }\n this.set(this.tableKey, focusCell.getKey(), focusCellParent.getKey());\n }\n return this.getNodes();\n }\n\n // TODO Mapping the whole Grid every time not efficient. We need to compute the entire state only\n // once (on load) and iterate on it as updates occur. However, to do this we need to have the\n // ability to store a state. Killing TableSelection and moving the logic to the plugin would make\n // this possible.\n const [map, cellAMap, cellBMap] = $computeTableMap(tableNode, anchorCell, focusCell);\n const {\n minColumn,\n maxColumn,\n minRow,\n maxRow\n } = $computeTableCellRectBoundary(map, cellAMap, cellBMap);\n\n // We use a Map here because merged cells in the grid would otherwise\n // show up multiple times in the nodes array\n const nodeMap = new Map([[tableNode.getKey(), tableNode]]);\n let lastRow = null;\n for (let i = minRow; i <= maxRow; i++) {\n for (let j = minColumn; j <= maxColumn; j++) {\n const {\n cell\n } = map[i][j];\n const currentRow = cell.getParent();\n if (!$isTableRowNode(currentRow)) {\n formatDevErrorMessage(`Expected TableCellNode parent to be a TableRowNode`);\n }\n if (currentRow !== lastRow) {\n nodeMap.set(currentRow.getKey(), currentRow);\n lastRow = currentRow;\n }\n if (!nodeMap.has(cell.getKey())) {\n $visitRecursively(cell, childNode => {\n nodeMap.set(childNode.getKey(), childNode);\n });\n }\n }\n }\n const nodes = Array.from(nodeMap.values());\n if (!isCurrentlyReadOnlyMode()) {\n this._cachedNodes = nodes;\n }\n return nodes;\n }\n getTextContent() {\n const nodes = this.getNodes().filter(node => $isTableCellNode(node));\n let textContent = '';\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const row = node.__parent;\n const nextRow = (nodes[i + 1] || {}).__parent;\n textContent += node.getTextContent() + (nextRow !== row ? '\\n' : '\\t');\n }\n return textContent;\n }\n}\nfunction $isTableSelection(x) {\n return x instanceof TableSelection;\n}\nfunction $createTableSelection() {\n // TODO this is a suboptimal design, it doesn't make sense to have\n // a table selection that isn't associated with a table. This\n // constructor should have required arguments and in true we\n // should check that they point to a table and are element points to\n // cell nodes of that table.\n const anchor = $createPoint('root', 0, 'element');\n const focus = $createPoint('root', 0, 'element');\n return new TableSelection('root', anchor, focus);\n}\nfunction $createTableSelectionFrom(tableNode, anchorCell, focusCell) {\n const tableNodeKey = tableNode.getKey();\n const anchorCellKey = anchorCell.getKey();\n const focusCellKey = focusCell.getKey();\n {\n if (!tableNode.isAttached()) {\n formatDevErrorMessage(`$createTableSelectionFrom: tableNode ${tableNodeKey} is not attached`);\n }\n if (!tableNode.is($findTableNode(anchorCell))) {\n formatDevErrorMessage(`$createTableSelectionFrom: anchorCell ${anchorCellKey} is not in table ${tableNodeKey}`);\n }\n if (!tableNode.is($findTableNode(focusCell))) {\n formatDevErrorMessage(`$createTableSelectionFrom: focusCell ${focusCellKey} is not in table ${tableNodeKey}`);\n } // TODO: Check for rectangular grid\n }\n const prevSelection = $getSelection();\n const nextSelection = $isTableSelection(prevSelection) ? prevSelection.clone() : $createTableSelection();\n nextSelection.set(tableNode.getKey(), anchorCell.getKey(), focusCell.getKey());\n return nextSelection;\n}\n\n/**\n * Depth first visitor\n * @param node The starting node\n * @param $visit The function to call for each node. If the function returns false, then children of this node will not be explored\n */\nfunction $visitRecursively(node, $visit) {\n const stack = [[node]];\n for (let currentArray = stack.at(-1); currentArray !== undefined && stack.length > 0; currentArray = stack.at(-1)) {\n const currentNode = currentArray.pop();\n if (currentNode === undefined) {\n stack.pop();\n } else if ($visit(currentNode) !== false && $isElementNode(currentNode)) {\n stack.push(currentNode.getChildren());\n }\n }\n}\n\nfunction $getTableAndElementByKey(tableNodeKey, editor = $getEditor()) {\n const tableNode = $getNodeByKey(tableNodeKey);\n if (!$isTableNode(tableNode)) {\n formatDevErrorMessage(`TableObserver: Expected tableNodeKey ${tableNodeKey} to be a TableNode`);\n }\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNodeKey));\n if (!(tableElement !== null)) {\n formatDevErrorMessage(`TableObserver: Expected to find TableElement in DOM for key ${tableNodeKey}`);\n }\n return {\n tableElement,\n tableNode\n };\n}\n/**\n * Tracks table selection state that sits across all tables.\n */\nclass TableObservers {\n observers;\n nextFocus;\n shouldCheckSelectionForTable;\n constructor() {\n this.observers = new Map();\n this.nextFocus = null;\n this.shouldCheckSelectionForTable = null;\n }\n\n /**\n * @internal\n * When handling mousemove events we track what the focus cell should be, but\n * the DOM selection may end up somewhere else entirely. We don't have an elegant\n * way to handle this after the DOM selection has been resolved in a\n * SELECTION_CHANGE_COMMAND callback.\n */\n setNextFocus(nextFocus) {\n this.nextFocus = nextFocus;\n }\n\n /** @internal */\n getAndClearNextFocus() {\n const {\n nextFocus\n } = this;\n if (nextFocus !== null) {\n this.nextFocus = null;\n }\n return nextFocus;\n }\n\n /**\n * @internal\n * Firefox has a strange behavior where pressing the down arrow key from\n * above the table will move the caret after the table and then lexical\n * will select the last cell instead of the first.\n * We do still want to let the browser handle caret movement but we will\n * use this property to \"tag\" the update so that we can recheck the\n * selection after the event is processed.\n */\n setShouldCheckSelectionForTable(tableKey) {\n this.shouldCheckSelectionForTable = tableKey;\n }\n /**\n * @internal\n */\n getAndClearShouldCheckSelectionForTable() {\n const {\n shouldCheckSelectionForTable\n } = this;\n if (shouldCheckSelectionForTable) {\n this.shouldCheckSelectionForTable = null;\n return shouldCheckSelectionForTable;\n }\n return null;\n }\n}\nclass TableObserver {\n focusX;\n focusY;\n listenersToRemove;\n table;\n isHighlightingCells;\n anchorX;\n anchorY;\n tableNodeKey;\n anchorCell;\n focusCell;\n anchorCellNodeKey;\n focusCellNodeKey;\n editor;\n tableSelection;\n hasHijackedSelectionStyles;\n isSelecting;\n pointerType;\n abortController;\n listenerOptions;\n constructor(editor, tableNodeKey) {\n this.isHighlightingCells = false;\n this.anchorX = -1;\n this.anchorY = -1;\n this.focusX = -1;\n this.focusY = -1;\n this.listenersToRemove = new Set();\n this.tableNodeKey = tableNodeKey;\n this.editor = editor;\n this.table = {\n columns: 0,\n domRows: [],\n rows: 0\n };\n this.tableSelection = null;\n this.anchorCellNodeKey = null;\n this.focusCellNodeKey = null;\n this.anchorCell = null;\n this.focusCell = null;\n this.hasHijackedSelectionStyles = false;\n this.isSelecting = false;\n this.pointerType = null;\n this.abortController = new AbortController();\n this.listenerOptions = {\n signal: this.abortController.signal\n };\n this.trackTable();\n }\n getTable() {\n return this.table;\n }\n removeListeners() {\n this.abortController.abort('removeListeners');\n Array.from(this.listenersToRemove).forEach(removeListener => removeListener());\n this.listenersToRemove.clear();\n }\n $lookup() {\n return $getTableAndElementByKey(this.tableNodeKey, this.editor);\n }\n trackTable() {\n const observer = new MutationObserver(records => {\n this.editor.getEditorState().read(() => {\n let gridNeedsRedraw = false;\n for (let i = 0; i < records.length; i++) {\n const record = records[i];\n const target = record.target;\n const nodeName = target.nodeName;\n if (nodeName === 'TABLE' || nodeName === 'TBODY' || nodeName === 'THEAD' || nodeName === 'TR') {\n gridNeedsRedraw = true;\n break;\n }\n }\n if (!gridNeedsRedraw) {\n return;\n }\n const {\n tableNode,\n tableElement\n } = this.$lookup();\n this.table = getTable(tableNode, tableElement);\n }, {\n editor: this.editor\n });\n });\n this.editor.getEditorState().read(() => {\n const {\n tableNode,\n tableElement\n } = this.$lookup();\n this.table = getTable(tableNode, tableElement);\n observer.observe(tableElement, {\n attributes: true,\n childList: true,\n subtree: true\n });\n }, {\n editor: this.editor\n });\n }\n $clearHighlight(setEmptySelection = true) {\n const editor = this.editor;\n this.isHighlightingCells = false;\n this.anchorX = -1;\n this.anchorY = -1;\n this.focusX = -1;\n this.focusY = -1;\n this.tableSelection = null;\n this.anchorCellNodeKey = null;\n this.focusCellNodeKey = null;\n this.anchorCell = null;\n this.focusCell = null;\n this.hasHijackedSelectionStyles = false;\n this.$enableHighlightStyle();\n const {\n tableNode,\n tableElement\n } = this.$lookup();\n const grid = getTable(tableNode, tableElement);\n $updateDOMForSelection(editor, grid, null);\n if (setEmptySelection && $getSelection() !== null) {\n $setSelection(null);\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n }\n }\n $enableHighlightStyle() {\n const editor = this.editor;\n const {\n tableElement\n } = this.$lookup();\n removeClassNamesFromElement(tableElement, editor._config.theme.tableSelection);\n tableElement.classList.remove('disable-selection');\n this.hasHijackedSelectionStyles = false;\n }\n $disableHighlightStyle() {\n const {\n tableElement\n } = this.$lookup();\n addClassNamesToElement(tableElement, this.editor._config.theme.tableSelection);\n this.hasHijackedSelectionStyles = true;\n }\n $updateTableTableSelection(selection) {\n if (selection !== null) {\n if (!(selection.tableKey === this.tableNodeKey)) {\n formatDevErrorMessage(`TableObserver.$updateTableTableSelection: selection.tableKey !== this.tableNodeKey ('${selection.tableKey}' !== '${this.tableNodeKey}')`);\n }\n const editor = this.editor;\n this.tableSelection = selection;\n this.isHighlightingCells = true;\n this.$disableHighlightStyle();\n this.updateDOMSelection();\n $updateDOMForSelection(editor, this.table, this.tableSelection);\n } else {\n this.$clearHighlight();\n }\n }\n\n /** @internal */\n updateDOMSelection() {\n if (this.anchorCell !== null && this.focusCell !== null) {\n const domSelection = getDOMSelection(this.editor._window);\n // We are not using a native selection for tables, and if we\n // set one then the reconciler will undo it.\n // TODO - it would make sense to have one so that native\n // copy/paste worked. Right now we have to emulate with\n // keyboard events but it won't fire if triggered from the menu\n if (domSelection && domSelection.rangeCount > 0) {\n domSelection.removeAllRanges();\n }\n }\n }\n $setFocusCellForSelection(cell, ignoreStart = false) {\n const editor = this.editor;\n const {\n tableNode\n } = this.$lookup();\n const cellX = cell.x;\n const cellY = cell.y;\n this.focusCell = cell;\n\n // Enable highlighting if: ignoreStart is true, or anchor differs from focus,\n // or we have valid tableSelection with anchor (for first drag after column switch)\n if (!this.isHighlightingCells) {\n const shouldEnable = ignoreStart || this.anchorX !== cellX || this.anchorY !== cellY || this.tableSelection != null && this.anchorCellNodeKey != null;\n if (shouldEnable) {\n this.isHighlightingCells = true;\n this.$disableHighlightStyle();\n }\n }\n\n // Skip if we're trying to select the same cell we already have selected\n // But only if focusX/focusY are valid (not -1, which means not reset)\n if (this.focusX !== -1 && this.focusY !== -1 && cellX === this.focusX && cellY === this.focusY) {\n return false;\n }\n this.focusX = cellX;\n this.focusY = cellY;\n if (this.isHighlightingCells) {\n const focusTableCellNode = $getNearestTableCellInTableFromDOMNode(tableNode, cell.elem);\n if (this.tableSelection != null && this.anchorCellNodeKey != null) {\n let targetCellNode = focusTableCellNode;\n\n // Fallback: use coordinates if DOM lookup failed (handles timing issues on first drag)\n if (targetCellNode === null && ignoreStart) {\n targetCellNode = tableNode.getCellNodeFromCords(cellX, cellY, this.table);\n }\n if (targetCellNode !== null) {\n const anchorTableCell = this.$getAnchorTableCellOrThrow();\n this.focusCellNodeKey = targetCellNode.getKey();\n this.tableSelection = $createTableSelectionFrom(tableNode, anchorTableCell, targetCellNode);\n $setSelection(this.tableSelection);\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n $updateDOMForSelection(editor, this.table, this.tableSelection);\n return true;\n }\n }\n }\n return false;\n }\n $getAnchorTableCell() {\n return this.anchorCellNodeKey ? $getNodeByKey(this.anchorCellNodeKey) : null;\n }\n $getAnchorTableCellOrThrow() {\n const anchorTableCell = this.$getAnchorTableCell();\n if (!(anchorTableCell !== null)) {\n formatDevErrorMessage(`TableObserver anchorTableCell is null`);\n }\n return anchorTableCell;\n }\n $getFocusTableCell() {\n return this.focusCellNodeKey ? $getNodeByKey(this.focusCellNodeKey) : null;\n }\n $getFocusTableCellOrThrow() {\n const focusTableCell = this.$getFocusTableCell();\n if (!(focusTableCell !== null)) {\n formatDevErrorMessage(`TableObserver focusTableCell is null`);\n }\n return focusTableCell;\n }\n $setAnchorCellForSelection(cell) {\n this.isHighlightingCells = false;\n this.anchorCell = cell;\n this.anchorX = cell.x;\n this.anchorY = cell.y;\n // Reset focus state to prevent stale values from previous selections\n this.focusX = -1;\n this.focusY = -1;\n this.focusCell = null;\n this.focusCellNodeKey = null;\n const {\n tableNode\n } = this.$lookup();\n const anchorTableCellNode = $getNearestTableCellInTableFromDOMNode(tableNode, cell.elem);\n if (anchorTableCellNode !== null) {\n const anchorNodeKey = anchorTableCellNode.getKey();\n if (this.tableSelection != null) {\n this.tableSelection = this.tableSelection.clone();\n this.tableSelection.set(tableNode.getKey(), anchorNodeKey, anchorNodeKey);\n } else {\n this.tableSelection = $createTableSelectionFrom(tableNode, anchorTableCellNode, anchorTableCellNode);\n }\n this.anchorCellNodeKey = anchorNodeKey;\n }\n }\n $formatCells(type) {\n const selection = $getSelection();\n if (!$isTableSelection(selection)) {\n formatDevErrorMessage(`Expected Table selection`);\n }\n const formatSelection = $createRangeSelection();\n const anchor = formatSelection.anchor;\n const focus = formatSelection.focus;\n const cellNodes = selection.getNodes().filter($isTableCellNode);\n if (!(cellNodes.length > 0)) {\n formatDevErrorMessage(`No table cells present`);\n }\n const paragraph = cellNodes[0].getFirstChild();\n const alignFormatWith = $isParagraphNode(paragraph) ? paragraph.getFormatFlags(type, null) : null;\n cellNodes.forEach(cellNode => {\n anchor.set(cellNode.getKey(), 0, 'element');\n focus.set(cellNode.getKey(), cellNode.getChildrenSize(), 'element');\n formatSelection.formatText(type, alignFormatWith);\n });\n $setSelection(selection);\n this.editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n }\n $clearText() {\n const {\n editor\n } = this;\n const tableNode = $getNodeByKey(this.tableNodeKey);\n if (!$isTableNode(tableNode)) {\n throw new Error('Expected TableNode.');\n }\n const selection = $getSelection();\n if (!$isTableSelection(selection)) {\n formatDevErrorMessage(`Expected TableSelection`);\n }\n const selectedNodes = selection.getNodes().filter($isTableCellNode);\n\n // Check if the entire table is selected by verifying first and last cells\n const firstRow = tableNode.getFirstChild();\n const lastRow = tableNode.getLastChild();\n const isEntireTableSelected = selectedNodes.length > 0 && firstRow !== null && lastRow !== null && $isTableRowNode(firstRow) && $isTableRowNode(lastRow) && selectedNodes[0] === firstRow.getFirstChild() && selectedNodes[selectedNodes.length - 1] === lastRow.getLastChild();\n if (isEntireTableSelected) {\n tableNode.selectPrevious();\n const parent = tableNode.getParent();\n // Delete entire table\n tableNode.remove();\n // Handle case when table was the only node\n if ($isRootNode(parent) && parent.isEmpty()) {\n editor.dispatchCommand(INSERT_PARAGRAPH_COMMAND, undefined);\n }\n return;\n }\n selectedNodes.forEach(cellNode => {\n if ($isElementNode(cellNode)) {\n const paragraphNode = $createParagraphNode();\n const textNode = $createTextNode();\n paragraphNode.append(textNode);\n cellNode.append(paragraphNode);\n cellNode.getChildren().forEach(child => {\n if (child !== paragraphNode) {\n child.remove();\n }\n });\n }\n });\n $updateDOMForSelection(editor, this.table, null);\n $setSelection(null);\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n }\n}\n\nconst LEXICAL_ELEMENT_KEY = '__lexicalTableSelection';\nconst isPointerDownOnEvent = event => {\n return (event.buttons & 1) === 1;\n};\nfunction isHTMLTableElement(el) {\n return isHTMLElement(el) && el.nodeName === 'TABLE';\n}\nfunction getTableElement(tableNode, dom) {\n if (!dom) {\n return dom;\n }\n const element = isHTMLTableElement(dom) ? dom : dom.querySelector('table');\n if (!isHTMLTableElement(element)) {\n formatDevErrorMessage(`getTableElement: Expecting table in DOM node for ${tableNode.constructor.name} of type ${tableNode.getType()} with key ${tableNode.getKey()}, not ${dom.nodeName}`);\n }\n return element;\n}\nfunction getEditorWindow(editor) {\n return editor._window;\n}\nfunction $findParentTableCellNodeInTable(tableNode, node) {\n for (let currentNode = node, lastTableCellNode = null; currentNode !== null; currentNode = currentNode.getParent()) {\n if (tableNode.is(currentNode)) {\n return lastTableCellNode;\n } else if ($isTableCellNode(currentNode)) {\n lastTableCellNode = currentNode;\n }\n }\n return null;\n}\nconst ARROW_KEY_COMMANDS_WITH_DIRECTION = [[KEY_ARROW_DOWN_COMMAND, 'down'], [KEY_ARROW_UP_COMMAND, 'up'], [KEY_ARROW_LEFT_COMMAND, 'backward'], [KEY_ARROW_RIGHT_COMMAND, 'forward']];\nconst DELETE_TEXT_COMMANDS = [DELETE_WORD_COMMAND, DELETE_LINE_COMMAND, DELETE_CHARACTER_COMMAND];\nconst DELETE_KEY_COMMANDS = [KEY_BACKSPACE_COMMAND, KEY_DELETE_COMMAND];\nfunction registerTableWindowHandlers(editor, tableObservers) {\n const rootElement = editor.getRootElement();\n const editorWindow = editor._window;\n if (!rootElement || !editorWindow) {\n return () => {};\n }\n const pointerDownCallback = event => {\n const target = event.target;\n if (event.button !== 0 || !isDOMNode(target) || !rootElement.contains(target)) {\n return;\n }\n const selectionInfo = getTableObserverFromCellNode(target);\n editor.update(() => {\n // Clear highlights from all tables (even one we're actively clicking on)\n const selection = $getSelection();\n if ($isTableSelection(selection)) {\n for (const [observer] of tableObservers.observers.values()) {\n observer.$clearHighlight(false);\n }\n $setSelection(null);\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n }\n if (!selectionInfo) {\n return;\n }\n const {\n tableObserver,\n tableElement,\n cellElement\n } = selectionInfo;\n $handleTableClick(editor, event, cellElement, tableElement, tableObserver, tableObservers);\n });\n };\n editorWindow.addEventListener('pointerdown', pointerDownCallback);\n return () => {\n editorWindow.removeEventListener('pointerdown', pointerDownCallback);\n };\n}\nfunction $handleTableClick(editor, event, selectedDOMCell, tableElement, tableObserver, tableObservers) {\n const editorWindow = editor._window;\n if (!editorWindow) {\n return;\n }\n const createPointerHandlers = startingCell => {\n if (tableObserver.isSelecting) {\n return;\n }\n tableObserver.isSelecting = true;\n\n // Set anchor immediately if starting cell provided (handles direct drag without click)\n if (startingCell !== null && tableObserver.anchorCell === null) {\n editor.update(() => {\n tableObserver.$setAnchorCellForSelection(startingCell);\n });\n }\n const onPointerUp = () => {\n tableObserver.isSelecting = false;\n editorWindow.removeEventListener('pointerup', onPointerUp);\n editorWindow.removeEventListener('pointermove', onPointerMove);\n };\n const onPointerMove = moveEvent => {\n if (!isPointerDownOnEvent(moveEvent) && tableObserver.isSelecting) {\n tableObserver.isSelecting = false;\n editorWindow.removeEventListener('pointerup', onPointerUp);\n editorWindow.removeEventListener('pointermove', onPointerMove);\n return;\n }\n if (!isDOMNode(moveEvent.target)) {\n return;\n }\n let focusCell = null;\n // In firefox the moveEvent.target may be captured so we must always\n // consult the coordinates #7245\n const override = !(IS_FIREFOX || tableElement.contains(moveEvent.target));\n if (override) {\n focusCell = getDOMCellInTableFromTarget(tableElement, moveEvent.target);\n } else {\n for (const el of document.elementsFromPoint(moveEvent.clientX, moveEvent.clientY)) {\n focusCell = getDOMCellInTableFromTarget(tableElement, el);\n if (focusCell) {\n break;\n }\n }\n }\n if (focusCell) {\n const anchorCell = focusCell;\n // Fallback: set anchor if still missing (handles race conditions)\n if (tableObserver.anchorCell === null) {\n editor.update(() => {\n tableObserver.$setAnchorCellForSelection(anchorCell);\n });\n }\n if (tableObserver.focusCell === null || focusCell.elem !== tableObserver.focusCell.elem) {\n tableObservers.setNextFocus({\n focusCell,\n override,\n tableKey: tableObserver.tableNodeKey\n });\n editor.dispatchCommand(SELECTION_CHANGE_COMMAND, undefined);\n }\n }\n };\n editorWindow.addEventListener('pointerup', onPointerUp, tableObserver.listenerOptions);\n editorWindow.addEventListener('pointermove', onPointerMove, tableObserver.listenerOptions);\n };\n tableObserver.pointerType = event.pointerType;\n const tableNode = $getNodeByKeyOrThrow(tableObserver.tableNodeKey);\n const prevSelection = $getPreviousSelection();\n // We can't trust Firefox to do the right thing with the selection and\n // we don't have a proper state machine to do this \"correctly\" but\n // if we go ahead and make the table selection now it will work\n if (IS_FIREFOX && event.shiftKey && $isSelectionInTable(prevSelection, tableNode) && ($isRangeSelection(prevSelection) || $isTableSelection(prevSelection))) {\n const prevAnchorNode = prevSelection.anchor.getNode();\n const prevAnchorCell = $findParentTableCellNodeInTable(tableNode, prevSelection.anchor.getNode());\n if (prevAnchorCell) {\n tableObserver.$setAnchorCellForSelection($getObserverCellFromCellNodeOrThrow(tableObserver, prevAnchorCell));\n tableObserver.$setFocusCellForSelection(selectedDOMCell);\n stopEvent(event);\n } else {\n const newSelection = tableNode.isBefore(prevAnchorNode) ? tableNode.selectStart() : tableNode.selectEnd();\n newSelection.anchor.set(prevSelection.anchor.key, prevSelection.anchor.offset, prevSelection.anchor.type);\n }\n } else {\n // Only set anchor cell for selection if this is not a simple touch tap\n // Touch taps should not initiate table selection mode\n if (event.pointerType !== 'touch') {\n tableObserver.$setAnchorCellForSelection(selectedDOMCell);\n }\n }\n\n // Pass the target cell to createPointerHandlers so it can be used as anchor\n // if user drags directly without clicking first\n createPointerHandlers(selectedDOMCell);\n}\nfunction applyTableHandlers(tableNode, element, editor, hasTabHandler, tableObservers) {\n const rootElement = editor.getRootElement();\n const editorWindow = getEditorWindow(editor);\n if (!(rootElement !== null && editorWindow !== null)) {\n formatDevErrorMessage(`applyTableHandlers: editor has no root element set`);\n }\n const tableObserver = new TableObserver(editor, tableNode.getKey());\n const tableElement = getTableElement(tableNode, element);\n attachTableObserverToTableElement(tableElement, tableObserver);\n tableObserver.listenersToRemove.add(() => detachTableObserverFromTableElement(tableElement, tableObserver));\n const onTripleClick = event => {\n if (event.detail >= 3 && isDOMNode(event.target)) {\n const targetCell = getDOMCellFromTarget(event.target);\n if (targetCell !== null) {\n event.preventDefault();\n }\n }\n };\n tableElement.addEventListener('mousedown', onTripleClick, tableObserver.listenerOptions);\n tableObserver.listenersToRemove.add(() => {\n tableElement.removeEventListener('mousedown', onTripleClick);\n });\n for (const [command, direction] of ARROW_KEY_COMMANDS_WITH_DIRECTION) {\n tableObserver.listenersToRemove.add(editor.registerCommand(command, event => $handleArrowKey(editor, event, direction, tableNode, tableObserver, tableObservers), COMMAND_PRIORITY_HIGH));\n }\n tableObserver.listenersToRemove.add(editor.registerCommand(KEY_ESCAPE_COMMAND, event => {\n const selection = $getSelection();\n if ($isTableSelection(selection)) {\n const focusCellNode = $findParentTableCellNodeInTable(tableNode, selection.focus.getNode());\n if (focusCellNode !== null) {\n stopEvent(event);\n focusCellNode.selectEnd();\n return true;\n }\n }\n return false;\n }, COMMAND_PRIORITY_HIGH));\n const deleteTextHandler = command => () => {\n const selection = $getSelection();\n if (!$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n if ($isTableSelection(selection)) {\n tableObserver.$clearText();\n return true;\n } else if ($isRangeSelection(selection)) {\n const tableCellNode = $findParentTableCellNodeInTable(tableNode, selection.anchor.getNode());\n if (!$isTableCellNode(tableCellNode)) {\n return false;\n }\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n const isAnchorInside = tableNode.isParentOf(anchorNode);\n const isFocusInside = tableNode.isParentOf(focusNode);\n const selectionContainsPartialTable = isAnchorInside && !isFocusInside || isFocusInside && !isAnchorInside;\n if (selectionContainsPartialTable) {\n tableObserver.$clearText();\n return true;\n }\n const nearestElementNode = $findMatchingParent(selection.anchor.getNode(), n => $isElementNode(n));\n const topLevelCellElementNode = nearestElementNode && $findMatchingParent(nearestElementNode, n => $isElementNode(n) && $isTableCellNode(n.getParent()));\n if (!$isElementNode(topLevelCellElementNode) || !$isElementNode(nearestElementNode)) {\n return false;\n }\n if (command === DELETE_LINE_COMMAND && topLevelCellElementNode.getPreviousSibling() === null) {\n // TODO: Fix Delete Line in Table Cells.\n return true;\n }\n }\n return false;\n };\n for (const command of DELETE_TEXT_COMMANDS) {\n tableObserver.listenersToRemove.add(editor.registerCommand(command, deleteTextHandler(command), COMMAND_PRIORITY_HIGH));\n }\n const $deleteCellHandler = event => {\n const selection = $getSelection();\n if (!($isTableSelection(selection) || $isRangeSelection(selection))) {\n return false;\n }\n\n // If the selection is inside the table but should remove the whole table\n // we expand the selection so that both the anchor and focus are outside\n // the table and the editor's command listener will handle the delete\n const isAnchorInside = tableNode.isParentOf(selection.anchor.getNode());\n const isFocusInside = tableNode.isParentOf(selection.focus.getNode());\n if (isAnchorInside !== isFocusInside) {\n const tablePoint = isAnchorInside ? 'anchor' : 'focus';\n const outerPoint = isAnchorInside ? 'focus' : 'anchor';\n // Preserve the outer point\n const {\n key,\n offset,\n type\n } = selection[outerPoint];\n // Expand the selection around the table\n const newSelection = tableNode[selection[tablePoint].isBefore(selection[outerPoint]) ? 'selectPrevious' : 'selectNext']();\n // Restore the outer point of the selection\n newSelection[outerPoint].set(key, offset, type);\n // Let the base implementation handle the rest\n return false;\n }\n if (!$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n if ($isTableSelection(selection)) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n tableObserver.$clearText();\n return true;\n }\n return false;\n };\n for (const command of DELETE_KEY_COMMANDS) {\n tableObserver.listenersToRemove.add(editor.registerCommand(command, $deleteCellHandler, COMMAND_PRIORITY_HIGH));\n }\n tableObserver.listenersToRemove.add(editor.registerCommand(CUT_COMMAND, event => {\n const selection = $getSelection();\n if (selection) {\n if (!($isTableSelection(selection) || $isRangeSelection(selection))) {\n return false;\n }\n // Copying to the clipboard is async so we must capture the data\n // before we delete it\n void copyToClipboard(editor, objectKlassEquals(event, ClipboardEvent) ? event : null, $getClipboardDataFromSelection(selection));\n const intercepted = $deleteCellHandler(event);\n if ($isRangeSelection(selection)) {\n selection.removeText();\n return true;\n }\n return intercepted;\n }\n return false;\n }, COMMAND_PRIORITY_HIGH));\n tableObserver.listenersToRemove.add(editor.registerCommand(FORMAT_TEXT_COMMAND, payload => {\n const selection = $getSelection();\n if (!$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n if ($isTableSelection(selection)) {\n tableObserver.$formatCells(payload);\n return true;\n } else if ($isRangeSelection(selection)) {\n const tableCellNode = $findMatchingParent(selection.anchor.getNode(), n => $isTableCellNode(n));\n if (!$isTableCellNode(tableCellNode)) {\n return false;\n }\n }\n return false;\n }, COMMAND_PRIORITY_HIGH));\n tableObserver.listenersToRemove.add(editor.registerCommand(FORMAT_ELEMENT_COMMAND, formatType => {\n const selection = $getSelection();\n if (!$isTableSelection(selection) || !$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (!$isTableCellNode(anchorNode) || !$isTableCellNode(focusNode)) {\n return false;\n }\n\n // Align the table if the entire table is selected\n if ($isFullTableSelection(selection, tableNode)) {\n tableNode.setFormat(formatType);\n return true;\n }\n const [tableMap, anchorCell, focusCell] = $computeTableMap(tableNode, anchorNode, focusNode);\n const maxRow = Math.max(anchorCell.startRow + anchorCell.cell.__rowSpan - 1, focusCell.startRow + focusCell.cell.__rowSpan - 1);\n const maxColumn = Math.max(anchorCell.startColumn + anchorCell.cell.__colSpan - 1, focusCell.startColumn + focusCell.cell.__colSpan - 1);\n const minRow = Math.min(anchorCell.startRow, focusCell.startRow);\n const minColumn = Math.min(anchorCell.startColumn, focusCell.startColumn);\n const visited = new Set();\n for (let i = minRow; i <= maxRow; i++) {\n for (let j = minColumn; j <= maxColumn; j++) {\n const cell = tableMap[i][j].cell;\n if (visited.has(cell)) {\n continue;\n }\n visited.add(cell);\n cell.setFormat(formatType);\n const cellChildren = cell.getChildren();\n for (let k = 0; k < cellChildren.length; k++) {\n const child = cellChildren[k];\n if ($isElementNode(child) && !child.isInline()) {\n child.setFormat(formatType);\n }\n }\n }\n }\n return true;\n }, COMMAND_PRIORITY_HIGH));\n tableObserver.listenersToRemove.add(editor.registerCommand(CONTROLLED_TEXT_INSERTION_COMMAND, payload => {\n const selection = $getSelection();\n if (!$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n if ($isTableSelection(selection)) {\n tableObserver.$clearHighlight();\n return false;\n } else if ($isRangeSelection(selection)) {\n const tableCellNode = $findMatchingParent(selection.anchor.getNode(), n => $isTableCellNode(n));\n if (!$isTableCellNode(tableCellNode)) {\n return false;\n }\n if (typeof payload === 'string') {\n const edgePosition = $getTableEdgeCursorPosition(editor, selection, tableNode);\n if (edgePosition) {\n $insertParagraphAtTableEdge(edgePosition, tableNode, [$createTextNode(payload)]);\n return true;\n }\n }\n }\n return false;\n }, COMMAND_PRIORITY_HIGH));\n if (hasTabHandler) {\n tableObserver.listenersToRemove.add(editor.registerCommand(KEY_TAB_COMMAND, event => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed() || !$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n const tableCellNode = $findCellNode(selection.anchor.getNode());\n if (tableCellNode === null || !tableNode.is($findTableNode(tableCellNode))) {\n return false;\n }\n stopEvent(event);\n $selectAdjacentCell(tableCellNode, event.shiftKey ? 'previous' : 'next');\n return true;\n }, COMMAND_PRIORITY_HIGH));\n }\n tableObserver.listenersToRemove.add(editor.registerCommand(FOCUS_COMMAND, payload => {\n return tableNode.isSelected();\n }, COMMAND_PRIORITY_HIGH));\n tableObserver.listenersToRemove.add(editor.registerCommand(INSERT_PARAGRAPH_COMMAND, () => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection) || !selection.isCollapsed() || !$isSelectionInTable(selection, tableNode)) {\n return false;\n }\n const edgePosition = $getTableEdgeCursorPosition(editor, selection, tableNode);\n if (edgePosition) {\n $insertParagraphAtTableEdge(edgePosition, tableNode);\n return true;\n }\n return false;\n }, COMMAND_PRIORITY_HIGH));\n return tableObserver;\n}\n\n/** @internal */\nfunction $handleTableSelectionChangeCommand(tableObservers, editor) {\n const selection = $getSelection();\n const prevSelection = $getPreviousSelection();\n const nextFocus = tableObservers.getAndClearNextFocus();\n if (nextFocus !== null) {\n const {\n tableKey,\n focusCell\n } = nextFocus;\n const observerAndTable = tableObservers.observers.get(tableKey);\n if (!!!observerAndTable) {\n formatDevErrorMessage(`tableObserver not found for tableKey: ${tableKey}`);\n }\n const [tableObserver] = observerAndTable;\n if ($isTableSelection(selection) && selection.tableKey === tableObserver.tableNodeKey) {\n if (focusCell.x === tableObserver.focusX && focusCell.y === tableObserver.focusY) {\n // The selection is already the correct table selection\n return false;\n } else {\n tableObserver.$setFocusCellForSelection(focusCell);\n return true;\n }\n } else if (tableObserver.anchorCell !== null && tableObserver.anchorCellNodeKey !== null && focusCell.elem !== tableObserver.anchorCell.elem && tableObserver.tableSelection !== null) {\n // The selection has crossed cells\n // If we have an anchor cell set and tableSelection initialized,\n // we have all the necessary state to create the selection.\n // The presence of nextFocus means we're dragging, so process it.\n // Use ignoreStart=true to ensure isHighlightingCells is set correctly\n // on the first drag attempt, especially when switching columns.\n tableObserver.$setFocusCellForSelection(focusCell, true);\n return true;\n }\n }\n const shouldCheckSelectionForTable = tableObservers.getAndClearShouldCheckSelectionForTable();\n // If they pressed the down arrow with the selection outside of the\n // table, and then the selection ends up in the table but not in the\n // first cell, then move the selection to the first cell.\n if (!!shouldCheckSelectionForTable && $isRangeSelection(prevSelection) && $isRangeSelection(selection) && selection.isCollapsed()) {\n const tableNode = $getNodeByKeyOrThrow(shouldCheckSelectionForTable);\n const anchor = selection.anchor.getNode();\n const firstRow = tableNode.getFirstChild();\n const anchorCell = $findCellNode(anchor);\n if (anchorCell !== null && $isTableRowNode(firstRow)) {\n const firstCell = firstRow.getFirstChild();\n if ($isTableCellNode(firstCell) && tableNode.is($findMatchingParent(anchorCell, node => node.is(tableNode) || node.is(firstCell)))) {\n // The selection moved to the table, but not in the first cell\n firstCell.selectStart();\n return true;\n }\n }\n }\n if ($isTableSelection(selection)) {\n $fixTableSelectionForSelectedTable(editor, selection);\n }\n if ($isRangeSelection(selection)) {\n $fixRangeSelectionForSelectedTable(selection, tableObservers);\n }\n\n // Generic selection logic that runs across every table observer when the selection changes.\n // Note: the selection might have changed in the code above, which re-dispatches the selection change command\n // and gets handled here on the second pass. This should be refactored.\n const tableNodesAndObservers = Array.from(tableObservers.observers.entries()).map(([tableKey, [tableObserver]]) => ({\n tableNode: $getNodeByKeyOrThrow(tableKey),\n tableObserver\n }));\n for (const {\n tableNode,\n tableObserver\n } of tableNodesAndObservers) {\n $syncTableSelectionState(editor, tableNode, tableObserver);\n }\n return false;\n}\n\n/**\n * Handles cases where range selections cross into, out of, or within tables.\n */\nfunction $fixRangeSelectionForSelectedTable(selection, tableObservers) {\n const prevSelection = $getPreviousSelection();\n const {\n anchor,\n focus\n } = selection;\n const anchorNode = anchor.getNode();\n const focusNode = focus.getNode();\n // Using explicit comparison with table node to ensure it's not a nested table\n // as in that case we'll leave selection resolving to that table\n const anchorCellNode = $findCellNode(anchorNode);\n const focusCellNode = $findCellNode(focusNode);\n const anchorCellTable = anchorCellNode ? $findTableNode(anchorCellNode) : null;\n const focusCellTable = focusCellNode ? $findTableNode(focusCellNode) : null;\n const isBackward = selection.isBackward();\n const isSameTable = anchorCellNode && focusCellNode && anchorCellTable && focusCellTable && anchorCellTable.is(focusCellTable);\n\n // The focus should be moved (to cover the whole focus table) if it is moved outside of the anchor's table.\n // For example, when dragging from outside a table into it.\n const shouldMoveFocus = focusCellTable && (!anchorCellTable || anchorCellTable.isParentOf(focusCellTable));\n // The anchor should be moved (to cover the whole anchor table) if the focus is moved outside of the anchor table.\n // For example, when dragging from inside a table out of it.\n const shouldMoveAnchor = anchorCellTable && (!focusCellTable || focusCellTable.isParentOf(anchorCellTable));\n if (shouldMoveFocus) {\n // Select the whole focus table.\n const newSelection = selection.clone();\n const [tableMap] = $computeTableMap(focusCellTable, focusCellNode, focusCellNode);\n const firstCell = tableMap[0][0].cell;\n const lastCell = tableMap[tableMap.length - 1].at(-1).cell;\n newSelection.focus.set(isBackward ? firstCell.getKey() : lastCell.getKey(), isBackward ? 0 : lastCell.getChildrenSize(), 'element');\n $setSelection(newSelection);\n } else if (shouldMoveAnchor) {\n // Select the whole anchor table.\n const newSelection = selection.clone();\n const [tableMap] = $computeTableMap(anchorCellTable, anchorCellNode, anchorCellNode);\n const firstCell = tableMap[0][0].cell;\n const lastCell = tableMap[tableMap.length - 1].at(-1).cell;\n newSelection.anchor.set(isBackward ? lastCell.getKey() : firstCell.getKey(), isBackward ? lastCell.getChildrenSize() : 0, 'element');\n $setSelection(newSelection);\n } else if (isSameTable) {\n // Handle case when selection spans across multiple cells but still\n // has range selection, then we convert it into table selection\n // For example, this fires when dragging up from first cell, outside of the table, or when clicking a cell\n // then shift-clicking another cell.\n const observerInfo = tableObservers.observers.get(anchorCellTable.getKey());\n if (!!!observerInfo) {\n formatDevErrorMessage(`tableObserver not found for tableKey: ${anchorCellTable.getKey()}`);\n }\n const [tableObserver] = observerInfo;\n if (!anchorCellNode.is(focusCellNode)) {\n tableObserver.$setAnchorCellForSelection($getObserverCellFromCellNodeOrThrow(tableObserver, anchorCellNode));\n tableObserver.$setFocusCellForSelection($getObserverCellFromCellNodeOrThrow(tableObserver, focusCellNode), true);\n }\n\n // Handle case when the pointer type is touch and the current and\n // previous selection are collapsed, and the previous anchor and current\n // focus cell nodes are different, then we convert it into table selection\n // However, only do this if the table observer is actively selecting (user dragging)\n // to prevent unwanted selections when simply tapping between cells on mobile\n if (tableObserver.pointerType === 'touch' && tableObserver.isSelecting && selection.isCollapsed() && $isRangeSelection(prevSelection) && prevSelection.isCollapsed()) {\n const prevAnchorCellNode = $findCellNode(prevSelection.anchor.getNode());\n if (prevAnchorCellNode && !prevAnchorCellNode.is(focusCellNode)) {\n tableObserver.$setAnchorCellForSelection($getObserverCellFromCellNodeOrThrow(tableObserver, prevAnchorCellNode));\n tableObserver.$setFocusCellForSelection($getObserverCellFromCellNodeOrThrow(tableObserver, focusCellNode), true);\n tableObserver.pointerType = null;\n }\n }\n }\n}\n\n/**\n * Ensures that a TableSelection is automatically changed to a RangeSelection when the selection goes outside of the table.\n */\nfunction $fixTableSelectionForSelectedTable(editor, selection) {\n const editorWindow = getEditorWindow(editor);\n const prevSelection = $getPreviousSelection();\n if (!selection.is(prevSelection)) {\n return;\n }\n const tableNode = $getNodeByKeyOrThrow(selection.tableKey);\n // if selection goes outside of the table we need to change it to Range selection\n const domSelection = getDOMSelection(editorWindow);\n if (domSelection && domSelection.anchorNode && domSelection.focusNode) {\n const focusNode = $getNearestNodeFromDOMNode(domSelection.focusNode);\n const isFocusOutside = focusNode && !tableNode.isParentOf(focusNode);\n const anchorNode = $getNearestNodeFromDOMNode(domSelection.anchorNode);\n const isAnchorInside = anchorNode && tableNode.isParentOf(anchorNode);\n if (isFocusOutside && isAnchorInside && domSelection.rangeCount > 0) {\n const newSelection = $createRangeSelectionFromDom(domSelection, editor);\n if (newSelection) {\n newSelection.anchor.set(tableNode.getKey(), selection.isBackward() ? tableNode.getChildrenSize() : 0, 'element');\n domSelection.removeAllRanges();\n $setSelection(newSelection);\n }\n }\n }\n}\n\n// Handle keeping the table observer/DOM in sync with the selection.\nfunction $syncTableSelectionState(editor, tableNode, tableObserver) {\n const selection = $getSelection();\n const prevSelection = $getPreviousSelection();\n if (selection && !selection.is(prevSelection) && ($isTableSelection(selection) || $isTableSelection(prevSelection)) && tableObserver.tableSelection && !tableObserver.tableSelection.is(prevSelection)) {\n if ($isTableSelection(selection) && selection.tableKey === tableObserver.tableNodeKey) {\n tableObserver.$updateTableTableSelection(selection);\n } else if (!$isTableSelection(selection) && $isTableSelection(prevSelection) && prevSelection.tableKey === tableObserver.tableNodeKey) {\n tableObserver.$updateTableTableSelection(null);\n }\n }\n if (tableObserver.hasHijackedSelectionStyles && !tableNode.isSelected()) {\n $removeHighlightStyleToTable(editor, tableObserver);\n } else if (!tableObserver.hasHijackedSelectionStyles && tableNode.isSelected()) {\n $addHighlightStyleToTable(editor, tableObserver);\n }\n}\nfunction detachTableObserverFromTableElement(tableElement, tableObserver) {\n if (getTableObserverFromTableElement(tableElement) === tableObserver) {\n delete tableElement[LEXICAL_ELEMENT_KEY];\n }\n}\nfunction attachTableObserverToTableElement(tableElement, tableObserver) {\n if (!(getTableObserverFromTableElement(tableElement) === null)) {\n formatDevErrorMessage(`tableElement already has an attached TableObserver`);\n }\n tableElement[LEXICAL_ELEMENT_KEY] = tableObserver;\n}\nfunction getTableObserverFromTableElement(tableElement) {\n return tableElement[LEXICAL_ELEMENT_KEY] || null;\n}\nfunction getTableObserverFromCellNode(node) {\n const cellNode = getDOMCellFromTarget(node);\n if (cellNode === null) {\n return null;\n }\n let currentNode = cellNode.elem;\n while (currentNode != null) {\n const nodeName = currentNode.nodeName;\n if (nodeName === 'TABLE' && LEXICAL_ELEMENT_KEY in currentNode && !!currentNode[LEXICAL_ELEMENT_KEY]) {\n return {\n cellElement: cellNode,\n tableElement: currentNode,\n tableObserver: currentNode[LEXICAL_ELEMENT_KEY]\n };\n }\n currentNode = currentNode.parentNode;\n }\n return null;\n}\nfunction getDOMCellFromTarget(node) {\n let currentNode = node;\n while (currentNode != null) {\n const nodeName = currentNode.nodeName;\n if (nodeName === 'TD' || nodeName === 'TH') {\n // @ts-expect-error: internal field\n const cell = currentNode._cell;\n if (cell === undefined) {\n return null;\n }\n return cell;\n }\n currentNode = currentNode.parentNode;\n }\n return null;\n}\nfunction getDOMCellInTableFromTarget(table, node) {\n if (!table.contains(node)) {\n return null;\n }\n let cell = null;\n for (let currentNode = node; currentNode != null; currentNode = currentNode.parentNode) {\n if (currentNode === table) {\n return cell;\n }\n const nodeName = currentNode.nodeName;\n if (nodeName === 'TD' || nodeName === 'TH') {\n // @ts-expect-error: internal field\n cell = currentNode._cell || null;\n }\n }\n return null;\n}\nfunction getTable(tableNode, dom) {\n const tableElement = getTableElement(tableNode, dom);\n const domRows = [];\n const grid = {\n columns: 0,\n domRows,\n rows: 0\n };\n let currentNode = tableElement.querySelector('tr');\n let x = 0;\n let y = 0;\n domRows.length = 0;\n while (currentNode != null) {\n const nodeMame = currentNode.nodeName;\n if (nodeMame === 'TD' || nodeMame === 'TH') {\n const elem = currentNode;\n const cell = {\n elem,\n hasBackgroundColor: elem.style.backgroundColor !== '',\n highlighted: false,\n x,\n y\n };\n\n // @ts-expect-error: internal field\n currentNode._cell = cell;\n let row = domRows[y];\n if (row === undefined) {\n row = domRows[y] = [];\n }\n row[x] = cell;\n } else {\n const child = currentNode.firstChild;\n if (child != null) {\n currentNode = child;\n continue;\n }\n }\n const sibling = currentNode.nextSibling;\n if (sibling != null) {\n x++;\n currentNode = sibling;\n continue;\n }\n const parent = currentNode.parentNode;\n if (parent != null) {\n const parentSibling = parent.nextSibling;\n if (parentSibling == null) {\n break;\n }\n y++;\n x = 0;\n currentNode = parentSibling;\n }\n }\n grid.columns = x + 1;\n grid.rows = y + 1;\n return grid;\n}\nfunction $updateDOMForSelection(editor, table, selection) {\n const selectedCellNodes = new Set(selection ? selection.getNodes() : []);\n $forEachTableCell(table, (cell, lexicalNode) => {\n const elem = cell.elem;\n if (selectedCellNodes.has(lexicalNode)) {\n cell.highlighted = true;\n $addHighlightToDOM(editor, cell);\n } else {\n cell.highlighted = false;\n $removeHighlightFromDOM(editor, cell);\n if (!elem.getAttribute('style')) {\n elem.removeAttribute('style');\n }\n }\n });\n}\nfunction $forEachTableCell(grid, cb) {\n const {\n domRows\n } = grid;\n for (let y = 0; y < domRows.length; y++) {\n const row = domRows[y];\n if (!row) {\n continue;\n }\n for (let x = 0; x < row.length; x++) {\n const cell = row[x];\n if (!cell) {\n continue;\n }\n const lexicalNode = $getNearestNodeFromDOMNode(cell.elem);\n if (lexicalNode !== null) {\n cb(cell, lexicalNode, {\n x,\n y\n });\n }\n }\n }\n}\nfunction $addHighlightStyleToTable(editor, tableSelection) {\n tableSelection.$disableHighlightStyle();\n $forEachTableCell(tableSelection.table, cell => {\n cell.highlighted = true;\n $addHighlightToDOM(editor, cell);\n });\n}\nfunction $removeHighlightStyleToTable(editor, tableObserver) {\n tableObserver.$enableHighlightStyle();\n $forEachTableCell(tableObserver.table, cell => {\n const elem = cell.elem;\n cell.highlighted = false;\n $removeHighlightFromDOM(editor, cell);\n if (!elem.getAttribute('style')) {\n elem.removeAttribute('style');\n }\n });\n}\nfunction $selectAdjacentCell(tableCellNode, direction) {\n const siblingMethod = direction === 'next' ? 'getNextSibling' : 'getPreviousSibling';\n const childMethod = direction === 'next' ? 'getFirstChild' : 'getLastChild';\n const sibling = tableCellNode[siblingMethod]();\n if ($isElementNode(sibling)) {\n return sibling.selectEnd();\n }\n const parentRow = $findMatchingParent(tableCellNode, $isTableRowNode);\n if (!(parentRow !== null)) {\n formatDevErrorMessage(`selectAdjacentCell: Cell not in table row`);\n }\n for (let nextRow = parentRow[siblingMethod](); $isTableRowNode(nextRow); nextRow = nextRow[siblingMethod]()) {\n const child = nextRow[childMethod]();\n if ($isElementNode(child)) {\n return child.selectEnd();\n }\n }\n const parentTable = $findMatchingParent(parentRow, $isTableNode);\n if (!(parentTable !== null)) {\n formatDevErrorMessage(`selectAdjacentCell: Row not in table`);\n }\n return direction === 'next' ? parentTable.selectNext() : parentTable.selectPrevious();\n}\nconst selectTableNodeInDirection = (tableObserver, tableNode, x, y, direction) => {\n const isForward = direction === 'forward';\n switch (direction) {\n case 'backward':\n case 'forward':\n if (x !== (isForward ? tableObserver.table.columns - 1 : 0)) {\n selectTableCellNode(tableNode.getCellNodeFromCordsOrThrow(x + (isForward ? 1 : -1), y, tableObserver.table), isForward);\n } else {\n if (y !== (isForward ? tableObserver.table.rows - 1 : 0)) {\n selectTableCellNode(tableNode.getCellNodeFromCordsOrThrow(isForward ? 0 : tableObserver.table.columns - 1, y + (isForward ? 1 : -1), tableObserver.table), isForward);\n } else if (!isForward) {\n tableNode.selectPrevious();\n } else {\n tableNode.selectNext();\n }\n }\n return true;\n case 'up':\n if (y !== 0) {\n selectTableCellNode(tableNode.getCellNodeFromCordsOrThrow(x, y - 1, tableObserver.table), false);\n } else {\n tableNode.selectPrevious();\n }\n return true;\n case 'down':\n if (y !== tableObserver.table.rows - 1) {\n selectTableCellNode(tableNode.getCellNodeFromCordsOrThrow(x, y + 1, tableObserver.table), true);\n } else {\n tableNode.selectNext();\n }\n return true;\n default:\n return false;\n }\n};\nfunction getCorner(rect, cellValue) {\n let colName;\n let rowName;\n if (cellValue.startColumn === rect.minColumn) {\n colName = 'minColumn';\n } else if (cellValue.startColumn + cellValue.cell.__colSpan - 1 === rect.maxColumn) {\n colName = 'maxColumn';\n } else {\n return null;\n }\n if (cellValue.startRow === rect.minRow) {\n rowName = 'minRow';\n } else if (cellValue.startRow + cellValue.cell.__rowSpan - 1 === rect.maxRow) {\n rowName = 'maxRow';\n } else {\n return null;\n }\n return [colName, rowName];\n}\nfunction getCornerOrThrow(rect, cellValue) {\n const corner = getCorner(rect, cellValue);\n if (!(corner !== null)) {\n formatDevErrorMessage(`getCornerOrThrow: cell ${cellValue.cell.getKey()} is not at a corner of rect`);\n }\n return corner;\n}\nfunction oppositeCorner([colName, rowName]) {\n return [colName === 'minColumn' ? 'maxColumn' : 'minColumn', rowName === 'minRow' ? 'maxRow' : 'minRow'];\n}\nfunction cellAtCornerOrThrow(tableMap, rect, [colName, rowName]) {\n const rowNum = rect[rowName];\n const rowMap = tableMap[rowNum];\n if (!(rowMap !== undefined)) {\n formatDevErrorMessage(`cellAtCornerOrThrow: ${rowName} = ${String(rowNum)} missing in tableMap`);\n }\n const colNum = rect[colName];\n const cell = rowMap[colNum];\n if (!(cell !== undefined)) {\n formatDevErrorMessage(`cellAtCornerOrThrow: ${colName} = ${String(colNum)} missing in tableMap`);\n }\n return cell;\n}\nfunction $extractRectCorners(tableMap, anchorCellValue, newFocusCellValue) {\n // We are sure that the focus now either contracts or expands the rect\n // but both the anchor and focus might be moved to ensure a rectangle\n // given a potentially ragged merge shape\n const rect = $computeTableCellRectBoundary(tableMap, anchorCellValue, newFocusCellValue);\n const anchorCorner = getCorner(rect, anchorCellValue);\n if (anchorCorner) {\n return [cellAtCornerOrThrow(tableMap, rect, anchorCorner), cellAtCornerOrThrow(tableMap, rect, oppositeCorner(anchorCorner))];\n }\n const newFocusCorner = getCorner(rect, newFocusCellValue);\n if (newFocusCorner) {\n return [cellAtCornerOrThrow(tableMap, rect, oppositeCorner(newFocusCorner)), cellAtCornerOrThrow(tableMap, rect, newFocusCorner)];\n }\n // TODO this doesn't have to be arbitrary, use the closest corner instead\n const newAnchorCorner = ['minColumn', 'minRow'];\n return [cellAtCornerOrThrow(tableMap, rect, newAnchorCorner), cellAtCornerOrThrow(tableMap, rect, oppositeCorner(newAnchorCorner))];\n}\nfunction $adjustFocusInDirection(tableObserver, tableMap, anchorCellValue, focusCellValue, direction) {\n const rect = $computeTableCellRectBoundary(tableMap, anchorCellValue, focusCellValue);\n const spans = $computeTableCellRectSpans(tableMap, rect);\n const {\n topSpan,\n leftSpan,\n bottomSpan,\n rightSpan\n } = spans;\n const anchorCorner = getCornerOrThrow(rect, anchorCellValue);\n const [focusColumn, focusRow] = oppositeCorner(anchorCorner);\n let fCol = rect[focusColumn];\n let fRow = rect[focusRow];\n if (direction === 'forward') {\n fCol += focusColumn === 'maxColumn' ? 1 : leftSpan;\n } else if (direction === 'backward') {\n fCol -= focusColumn === 'minColumn' ? 1 : rightSpan;\n } else if (direction === 'down') {\n fRow += focusRow === 'maxRow' ? 1 : topSpan;\n } else if (direction === 'up') {\n fRow -= focusRow === 'minRow' ? 1 : bottomSpan;\n }\n const targetRowMap = tableMap[fRow];\n if (targetRowMap === undefined) {\n return false;\n }\n const newFocusCellValue = targetRowMap[fCol];\n if (newFocusCellValue === undefined) {\n return false;\n }\n // We can be certain that anchorCellValue and newFocusCellValue are\n // contained within the desired selection, but we are not certain if\n // they need to be expanded or not to maintain a rectangular shape\n const [finalAnchorCell, finalFocusCell] = $extractRectCorners(tableMap, anchorCellValue, newFocusCellValue);\n const anchorDOM = $getObserverCellFromCellNodeOrThrow(tableObserver, finalAnchorCell.cell);\n const focusDOM = $getObserverCellFromCellNodeOrThrow(tableObserver, finalFocusCell.cell);\n tableObserver.$setAnchorCellForSelection(anchorDOM);\n tableObserver.$setFocusCellForSelection(focusDOM, true);\n return true;\n}\nfunction $isSelectionInTable(selection, tableNode) {\n if ($isRangeSelection(selection) || $isTableSelection(selection)) {\n // TODO this should probably return false if there's an unrelated\n // shadow root between the node and the table (e.g. another table,\n // collapsible, etc.)\n const isAnchorInside = tableNode.isParentOf(selection.anchor.getNode());\n const isFocusInside = tableNode.isParentOf(selection.focus.getNode());\n return isAnchorInside && isFocusInside;\n }\n return false;\n}\nfunction $isFullTableSelection(selection, tableNode) {\n if ($isTableSelection(selection)) {\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n if (tableNode && anchorNode && focusNode) {\n const [map] = $computeTableMap(tableNode, anchorNode, focusNode);\n return anchorNode.getKey() === map[0][0].cell.getKey() && focusNode.getKey() === map[map.length - 1].at(-1).cell.getKey();\n }\n }\n return false;\n}\nfunction selectTableCellNode(tableCell, fromStart) {\n if (fromStart) {\n tableCell.selectStart();\n } else {\n tableCell.selectEnd();\n }\n}\nfunction $addHighlightToDOM(editor, cell) {\n const element = cell.elem;\n const editorThemeClasses = editor._config.theme;\n const node = $getNearestNodeFromDOMNode(element);\n if (!$isTableCellNode(node)) {\n formatDevErrorMessage(`Expected to find LexicalNode from Table Cell DOMNode`);\n }\n addClassNamesToElement(element, editorThemeClasses.tableCellSelected);\n}\nfunction $removeHighlightFromDOM(editor, cell) {\n const element = cell.elem;\n const node = $getNearestNodeFromDOMNode(element);\n if (!$isTableCellNode(node)) {\n formatDevErrorMessage(`Expected to find LexicalNode from Table Cell DOMNode`);\n }\n const editorThemeClasses = editor._config.theme;\n removeClassNamesFromElement(element, editorThemeClasses.tableCellSelected);\n}\nfunction $findCellNode(node) {\n const cellNode = $findMatchingParent(node, $isTableCellNode);\n return $isTableCellNode(cellNode) ? cellNode : null;\n}\nfunction $findTableNode(node) {\n const tableNode = $findMatchingParent(node, $isTableNode);\n return $isTableNode(tableNode) ? tableNode : null;\n}\nfunction $getBlockParentIfFirstNode(node) {\n for (let prevNode = node, currentNode = node; currentNode !== null; prevNode = currentNode, currentNode = currentNode.getParent()) {\n if ($isElementNode(currentNode)) {\n if (currentNode !== prevNode && currentNode.getFirstChild() !== prevNode) {\n // Not the first child or the initial node\n return null;\n } else if (!currentNode.isInline()) {\n return currentNode;\n }\n }\n }\n return null;\n}\nfunction $handleHorizontalArrowKeyRangeSelection(editor, event, selection, alter, isBackward, tableNode, tableObserver) {\n const initialFocus = $caretFromPoint(selection.focus, isBackward ? 'previous' : 'next');\n if ($isExtendableTextPointCaret(initialFocus)) {\n return false;\n }\n let lastCaret = initialFocus;\n // TableCellNode is the only shadow root we are interested in piercing so\n // we find the last internal caret and then check its parent\n for (const nextCaret of $extendCaretToRange(initialFocus).iterNodeCarets('shadowRoot')) {\n if (!($isSiblingCaret(nextCaret) && $isElementNode(nextCaret.origin))) {\n return false;\n }\n lastCaret = nextCaret;\n }\n const lastCaretParent = lastCaret.getParentAtCaret();\n if (!$isTableCellNode(lastCaretParent)) {\n return false;\n }\n const anchorCell = lastCaretParent;\n const focusCaret = $findNextTableCell($getSiblingCaret(anchorCell, lastCaret.direction));\n const anchorCellTable = $findMatchingParent(anchorCell, $isTableNode);\n if (!(anchorCellTable && anchorCellTable.is(tableNode))) {\n return false;\n }\n const anchorCellDOM = editor.getElementByKey(anchorCell.getKey());\n const anchorDOMCell = getDOMCellFromTarget(anchorCellDOM);\n if (!anchorCellDOM || !anchorDOMCell) {\n return false;\n }\n const anchorCellTableElement = $getElementForTableNode(editor, anchorCellTable);\n tableObserver.table = anchorCellTableElement;\n if (!focusCaret) {\n if (alter === 'extend') {\n // extend the selection from a range inside the cell to a table selection of the cell\n tableObserver.$setAnchorCellForSelection(anchorDOMCell);\n tableObserver.$setFocusCellForSelection(anchorDOMCell, true);\n } else {\n // exit the table\n const outerFocusCaret = $getTableExitCaret($getSiblingCaret(anchorCellTable, initialFocus.direction));\n $setPointFromCaret(selection.anchor, outerFocusCaret);\n $setPointFromCaret(selection.focus, outerFocusCaret);\n }\n } else if (alter === 'extend') {\n const focusDOMCell = getDOMCellFromTarget(editor.getElementByKey(focusCaret.origin.getKey()));\n if (!focusDOMCell) {\n return false;\n }\n tableObserver.$setAnchorCellForSelection(anchorDOMCell);\n tableObserver.$setFocusCellForSelection(focusDOMCell, true);\n } else {\n // alter === 'move'\n const innerFocusCaret = $normalizeCaret(focusCaret);\n $setPointFromCaret(selection.anchor, innerFocusCaret);\n $setPointFromCaret(selection.focus, innerFocusCaret);\n }\n stopEvent(event);\n return true;\n}\nfunction $getTableExitCaret(initialCaret) {\n const adjacent = $getAdjacentChildCaret(initialCaret);\n return $isChildCaret(adjacent) ? $normalizeCaret(adjacent) : initialCaret;\n}\nfunction $findNextTableCell(initialCaret) {\n for (const nextCaret of $extendCaretToRange(initialCaret).iterNodeCarets('root')) {\n const {\n origin\n } = nextCaret;\n if ($isTableCellNode(origin)) {\n // not sure why ts isn't narrowing here (even if the guard is on nextCaret.origin)\n // but returning a new caret is fine\n if ($isChildCaret(nextCaret)) {\n return $getChildCaret(origin, initialCaret.direction);\n }\n } else if (!$isTableRowNode(origin)) {\n break;\n }\n }\n return null;\n}\nfunction $handleArrowKey(editor, event, direction, tableNode, tableObserver, tableObservers) {\n if ((direction === 'up' || direction === 'down') && isTypeaheadMenuInView(editor)) {\n return false;\n }\n const selection = $getSelection();\n if (!$isSelectionInTable(selection, tableNode)) {\n if ($isRangeSelection(selection)) {\n if (direction === 'backward') {\n if (selection.focus.offset > 0) {\n return false;\n }\n const parentNode = $getBlockParentIfFirstNode(selection.focus.getNode());\n if (!parentNode) {\n return false;\n }\n const siblingNode = parentNode.getPreviousSibling();\n if (!$isTableNode(siblingNode)) {\n return false;\n }\n stopEvent(event);\n if (event.shiftKey) {\n selection.focus.set(siblingNode.getParentOrThrow().getKey(), siblingNode.getIndexWithinParent(), 'element');\n } else {\n siblingNode.selectEnd();\n }\n return true;\n } else if (event.shiftKey && (direction === 'up' || direction === 'down')) {\n const focusNode = selection.focus.getNode();\n const isTableUnselect = !selection.isCollapsed() && (direction === 'up' && !selection.isBackward() || direction === 'down' && selection.isBackward());\n if (isTableUnselect) {\n let focusParentNode = $findMatchingParent(focusNode, n => $isTableNode(n));\n if ($isTableCellNode(focusParentNode)) {\n focusParentNode = $findMatchingParent(focusParentNode, $isTableNode);\n }\n if (focusParentNode !== tableNode) {\n return false;\n }\n if (!focusParentNode) {\n return false;\n }\n const sibling = direction === 'down' ? focusParentNode.getNextSibling() : focusParentNode.getPreviousSibling();\n if (!sibling) {\n return false;\n }\n let newOffset = 0;\n if (direction === 'up') {\n if ($isElementNode(sibling)) {\n newOffset = sibling.getChildrenSize();\n }\n }\n let newFocusNode = sibling;\n if (direction === 'up') {\n if ($isElementNode(sibling)) {\n const lastCell = sibling.getLastChild();\n newFocusNode = lastCell ? lastCell : sibling;\n newOffset = $isTextNode(newFocusNode) ? newFocusNode.getTextContentSize() : 0;\n }\n }\n const newSelection = selection.clone();\n newSelection.focus.set(newFocusNode.getKey(), newOffset, $isTextNode(newFocusNode) ? 'text' : 'element');\n $setSelection(newSelection);\n stopEvent(event);\n return true;\n } else if ($isRootOrShadowRoot(focusNode)) {\n const selectedNode = direction === 'up' ? selection.getNodes()[selection.getNodes().length - 1] : selection.getNodes()[0];\n if (selectedNode) {\n const tableCellNode = $findParentTableCellNodeInTable(tableNode, selectedNode);\n if (tableCellNode !== null) {\n const firstDescendant = tableNode.getFirstDescendant();\n const lastDescendant = tableNode.getLastDescendant();\n if (!firstDescendant || !lastDescendant) {\n return false;\n }\n const [firstCellNode] = $getNodeTriplet(firstDescendant);\n const [lastCellNode] = $getNodeTriplet(lastDescendant);\n const firstCellCoords = tableNode.getCordsFromCellNode(firstCellNode, tableObserver.table);\n const lastCellCoords = tableNode.getCordsFromCellNode(lastCellNode, tableObserver.table);\n const firstCellDOM = tableNode.getDOMCellFromCordsOrThrow(firstCellCoords.x, firstCellCoords.y, tableObserver.table);\n const lastCellDOM = tableNode.getDOMCellFromCordsOrThrow(lastCellCoords.x, lastCellCoords.y, tableObserver.table);\n tableObserver.$setAnchorCellForSelection(firstCellDOM);\n tableObserver.$setFocusCellForSelection(lastCellDOM, true);\n return true;\n }\n }\n return false;\n } else {\n let focusParentNode = $findMatchingParent(focusNode, n => $isElementNode(n) && !n.isInline());\n if ($isTableCellNode(focusParentNode)) {\n focusParentNode = $findMatchingParent(focusParentNode, $isTableNode);\n }\n if (!focusParentNode) {\n return false;\n }\n const sibling = direction === 'down' ? focusParentNode.getNextSibling() : focusParentNode.getPreviousSibling();\n if ($isTableNode(sibling) && tableObserver.tableNodeKey === sibling.getKey()) {\n const firstDescendant = sibling.getFirstDescendant();\n const lastDescendant = sibling.getLastDescendant();\n if (!firstDescendant || !lastDescendant) {\n return false;\n }\n const [firstCellNode] = $getNodeTriplet(firstDescendant);\n const [lastCellNode] = $getNodeTriplet(lastDescendant);\n const newSelection = selection.clone();\n newSelection.focus.set((direction === 'up' ? firstCellNode : lastCellNode).getKey(), direction === 'up' ? 0 : lastCellNode.getChildrenSize(), 'element');\n stopEvent(event);\n $setSelection(newSelection);\n return true;\n }\n }\n }\n }\n if (direction === 'down' && $isScrollableTablesActive(editor)) {\n // Enable Firefox workaround\n tableObservers.setShouldCheckSelectionForTable(tableNode.getKey());\n }\n return false;\n }\n if ($isRangeSelection(selection)) {\n if (direction === 'backward' || direction === 'forward') {\n const alter = event.shiftKey ? 'extend' : 'move';\n return $handleHorizontalArrowKeyRangeSelection(editor, event, selection, alter, direction === 'backward', tableNode, tableObserver);\n }\n if (selection.isCollapsed()) {\n const {\n anchor,\n focus\n } = selection;\n const anchorCellNode = $findMatchingParent(anchor.getNode(), $isTableCellNode);\n const focusCellNode = $findMatchingParent(focus.getNode(), $isTableCellNode);\n if (!$isTableCellNode(anchorCellNode) || !anchorCellNode.is(focusCellNode)) {\n return false;\n }\n const anchorCellTable = $findTableNode(anchorCellNode);\n if (anchorCellTable !== tableNode && anchorCellTable != null) {\n const anchorCellTableElement = getTableElement(anchorCellTable, editor.getElementByKey(anchorCellTable.getKey()));\n if (anchorCellTableElement != null) {\n tableObserver.table = getTable(anchorCellTable, anchorCellTableElement);\n return $handleArrowKey(editor, event, direction, anchorCellTable, tableObserver, tableObservers);\n }\n }\n const anchorCellDom = editor.getElementByKey(anchorCellNode.__key);\n const anchorDOM = editor.getElementByKey(anchor.key);\n if (anchorDOM == null || anchorCellDom == null) {\n return false;\n }\n let edgeSelectionRect;\n if (anchor.type === 'element') {\n edgeSelectionRect = anchorDOM.getBoundingClientRect();\n } else {\n const domSelection = getDOMSelection(getEditorWindow(editor));\n if (domSelection === null || domSelection.rangeCount === 0) {\n return false;\n }\n const range = domSelection.getRangeAt(0);\n edgeSelectionRect = range.getBoundingClientRect();\n }\n const edgeChild = direction === 'up' ? anchorCellNode.getFirstChild() : anchorCellNode.getLastChild();\n if (edgeChild == null) {\n return false;\n }\n const edgeChildDOM = editor.getElementByKey(edgeChild.__key);\n if (edgeChildDOM == null) {\n return false;\n }\n const edgeRect = edgeChildDOM.getBoundingClientRect();\n const isExiting = direction === 'up' ? edgeRect.top > edgeSelectionRect.top - edgeSelectionRect.height : edgeSelectionRect.bottom + edgeSelectionRect.height > edgeRect.bottom;\n if (isExiting) {\n stopEvent(event);\n const cords = tableNode.getCordsFromCellNode(anchorCellNode, tableObserver.table);\n if (event.shiftKey) {\n const cell = tableNode.getDOMCellFromCordsOrThrow(cords.x, cords.y, tableObserver.table);\n tableObserver.$setAnchorCellForSelection(cell);\n tableObserver.$setFocusCellForSelection(cell, true);\n } else {\n return selectTableNodeInDirection(tableObserver, tableNode, cords.x, cords.y, direction);\n }\n return true;\n }\n }\n } else if ($isTableSelection(selection)) {\n const {\n anchor,\n focus\n } = selection;\n const anchorCellNode = $findMatchingParent(anchor.getNode(), $isTableCellNode);\n const focusCellNode = $findMatchingParent(focus.getNode(), $isTableCellNode);\n const [tableNodeFromSelection] = selection.getNodes();\n if (!$isTableNode(tableNodeFromSelection)) {\n formatDevErrorMessage(`$handleArrowKey: TableSelection.getNodes()[0] expected to be TableNode`);\n }\n const tableElement = getTableElement(tableNodeFromSelection, editor.getElementByKey(tableNodeFromSelection.getKey()));\n if (!$isTableCellNode(anchorCellNode) || !$isTableCellNode(focusCellNode) || !$isTableNode(tableNodeFromSelection) || tableElement == null) {\n return false;\n }\n tableObserver.$updateTableTableSelection(selection);\n const grid = getTable(tableNodeFromSelection, tableElement);\n const cordsAnchor = tableNode.getCordsFromCellNode(anchorCellNode, grid);\n const anchorCell = tableNode.getDOMCellFromCordsOrThrow(cordsAnchor.x, cordsAnchor.y, grid);\n tableObserver.$setAnchorCellForSelection(anchorCell);\n stopEvent(event);\n if (event.shiftKey) {\n const [tableMap, anchorValue, focusValue] = $computeTableMap(tableNode, anchorCellNode, focusCellNode);\n return $adjustFocusInDirection(tableObserver, tableMap, anchorValue, focusValue, direction);\n } else {\n focusCellNode.selectEnd();\n }\n return true;\n }\n return false;\n}\nfunction stopEvent(event) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n}\nfunction isTypeaheadMenuInView(editor) {\n // There is no inbuilt way to check if the component picker is in view\n // but we can check if the root DOM element has the aria-controls attribute \"typeahead-menu\".\n const root = editor.getRootElement();\n if (!root) {\n return false;\n }\n return root.hasAttribute('aria-controls') && root.getAttribute('aria-controls') === 'typeahead-menu';\n}\nfunction $insertParagraphAtTableEdge(edgePosition, tableNode, children) {\n const paragraphNode = $createParagraphNode();\n if (edgePosition === 'first') {\n tableNode.insertBefore(paragraphNode);\n } else {\n tableNode.insertAfter(paragraphNode);\n }\n paragraphNode.append(...(children || []));\n paragraphNode.selectEnd();\n}\nfunction $getTableEdgeCursorPosition(editor, selection, tableNode) {\n const tableNodeParent = tableNode.getParent();\n if (!tableNodeParent) {\n return undefined;\n }\n\n // TODO: Add support for nested tables\n const domSelection = getDOMSelection(getEditorWindow(editor));\n if (!domSelection) {\n return undefined;\n }\n const domAnchorNode = domSelection.anchorNode;\n const tableNodeParentDOM = editor.getElementByKey(tableNodeParent.getKey());\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()));\n // We are only interested in the scenario where the\n // native selection anchor is:\n // - at or inside the table's parent DOM\n // - and NOT at or inside the table DOM\n // It may be adjacent to the table DOM (e.g. in a wrapper)\n if (!domAnchorNode || !tableNodeParentDOM || !tableElement || !tableNodeParentDOM.contains(domAnchorNode) || tableElement.contains(domAnchorNode)) {\n return undefined;\n }\n const anchorCellNode = $findMatchingParent(selection.anchor.getNode(), n => $isTableCellNode(n));\n if (!anchorCellNode) {\n return undefined;\n }\n const parentTable = $findMatchingParent(anchorCellNode, n => $isTableNode(n));\n if (!$isTableNode(parentTable) || !parentTable.is(tableNode)) {\n return undefined;\n }\n const [tableMap, cellValue] = $computeTableMap(tableNode, anchorCellNode, anchorCellNode);\n const firstCell = tableMap[0][0];\n const lastCell = tableMap[tableMap.length - 1][tableMap[0].length - 1];\n const {\n startRow,\n startColumn\n } = cellValue;\n const isAtFirstCell = startRow === firstCell.startRow && startColumn === firstCell.startColumn;\n const isAtLastCell = startRow === lastCell.startRow && startColumn === lastCell.startColumn;\n if (isAtFirstCell) {\n return 'first';\n } else if (isAtLastCell) {\n return 'last';\n } else {\n return undefined;\n }\n}\nfunction $getObserverCellFromCellNodeOrThrow(tableObserver, tableCellNode) {\n const {\n tableNode\n } = tableObserver.$lookup();\n const currentCords = tableNode.getCordsFromCellNode(tableCellNode, tableObserver.table);\n return tableNode.getDOMCellFromCordsOrThrow(currentCords.x, currentCords.y, tableObserver.table);\n}\nfunction $getNearestTableCellInTableFromDOMNode(tableNode, startingDOM, editorState) {\n return $findParentTableCellNodeInTable(tableNode, $getNearestNodeFromDOMNode(startingDOM, editorState));\n}\n\nfunction isHTMLDivElement(element) {\n return isHTMLElement$1(element) && element.nodeName === 'DIV';\n}\nfunction updateColgroup(dom, colCount, colWidths) {\n const colGroup = dom.querySelector('colgroup');\n if (!colGroup) {\n return;\n }\n const cols = [];\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n const width = colWidths && colWidths[i];\n if (width) {\n col.style.width = `${width}px`;\n }\n cols.push(col);\n }\n colGroup.replaceChildren(...cols);\n}\nfunction setRowStriping(dom, config, rowStriping) {\n if (rowStriping) {\n addClassNamesToElement(dom, config.theme.tableRowStriping);\n dom.setAttribute('data-lexical-row-striping', 'true');\n } else {\n removeClassNamesFromElement(dom, config.theme.tableRowStriping);\n dom.removeAttribute('data-lexical-row-striping');\n }\n}\nfunction setFrozenColumns(dom, tableElement, config, frozenColumnCount) {\n if (frozenColumnCount > 0) {\n addClassNamesToElement(dom, config.theme.tableFrozenColumn);\n tableElement.setAttribute('data-lexical-frozen-column', 'true');\n } else {\n removeClassNamesFromElement(dom, config.theme.tableFrozenColumn);\n tableElement.removeAttribute('data-lexical-frozen-column');\n }\n}\nfunction setFrozenRows(dom, tableElement, config, frozenRowCount) {\n if (frozenRowCount > 0) {\n addClassNamesToElement(dom, config.theme.tableFrozenRow);\n tableElement.setAttribute('data-lexical-frozen-row', 'true');\n } else {\n removeClassNamesFromElement(dom, config.theme.tableFrozenRow);\n tableElement.removeAttribute('data-lexical-frozen-row');\n }\n}\nfunction alignTableElement(dom, config, formatType) {\n if (!config.theme.tableAlignment) {\n return;\n }\n const removeClasses = [];\n const addClasses = [];\n for (const format of ['center', 'right']) {\n const classes = config.theme.tableAlignment[format];\n if (!classes) {\n continue;\n }\n (format === formatType ? addClasses : removeClasses).push(classes);\n }\n removeClassNamesFromElement(dom, ...removeClasses);\n addClassNamesToElement(dom, ...addClasses);\n}\nconst scrollableEditors = new WeakSet();\nfunction $isScrollableTablesActive(editor = $getEditor()) {\n return scrollableEditors.has(editor);\n}\nfunction setScrollableTablesActive(editor, active) {\n if (active) {\n if (!editor._config.theme.tableScrollableWrapper) {\n console.warn('TableNode: hasHorizontalScroll is active but theme.tableScrollableWrapper is not defined.');\n }\n scrollableEditors.add(editor);\n } else {\n scrollableEditors.delete(editor);\n }\n}\n\n/** @noInheritDoc */\nclass TableNode extends ElementNode {\n /** @internal */\n __rowStriping;\n __frozenColumnCount;\n __frozenRowCount;\n __colWidths;\n static getType() {\n return 'table';\n }\n getColWidths() {\n const self = this.getLatest();\n return self.__colWidths;\n }\n setColWidths(colWidths) {\n const self = this.getWritable();\n // NOTE: Node properties should be immutable. Freeze to prevent accidental mutation.\n self.__colWidths = colWidths !== undefined && true ? Object.freeze(colWidths) : colWidths;\n return self;\n }\n static clone(node) {\n return new TableNode(node.__key);\n }\n afterCloneFrom(prevNode) {\n super.afterCloneFrom(prevNode);\n this.__colWidths = prevNode.__colWidths;\n this.__rowStriping = prevNode.__rowStriping;\n this.__frozenColumnCount = prevNode.__frozenColumnCount;\n this.__frozenRowCount = prevNode.__frozenRowCount;\n }\n static importDOM() {\n return {\n table: _node => ({\n conversion: $convertTableElement,\n priority: 1\n })\n };\n }\n static importJSON(serializedNode) {\n return $createTableNode().updateFromJSON(serializedNode);\n }\n updateFromJSON(serializedNode) {\n return super.updateFromJSON(serializedNode).setRowStriping(serializedNode.rowStriping || false).setFrozenColumns(serializedNode.frozenColumnCount || 0).setFrozenRows(serializedNode.frozenRowCount || 0).setColWidths(serializedNode.colWidths);\n }\n constructor(key) {\n super(key);\n this.__rowStriping = false;\n this.__frozenColumnCount = 0;\n this.__frozenRowCount = 0;\n this.__colWidths = undefined;\n }\n exportJSON() {\n return {\n ...super.exportJSON(),\n colWidths: this.getColWidths(),\n frozenColumnCount: this.__frozenColumnCount ? this.__frozenColumnCount : undefined,\n frozenRowCount: this.__frozenRowCount ? this.__frozenRowCount : undefined,\n rowStriping: this.__rowStriping ? this.__rowStriping : undefined\n };\n }\n extractWithChild(child, selection, destination) {\n return destination === 'html';\n }\n getDOMSlot(element) {\n const tableElement = !isHTMLTableElement(element) ? element.querySelector('table') : element;\n if (!isHTMLTableElement(tableElement)) {\n formatDevErrorMessage(`TableNode.getDOMSlot: createDOM() did not return a table`);\n }\n return super.getDOMSlot(element).withElement(tableElement).withAfter(tableElement.querySelector('colgroup'));\n }\n createDOM(config, editor) {\n const tableElement = document.createElement('table');\n if (this.__style) {\n setDOMStyleFromCSS(tableElement.style, this.__style);\n }\n const colGroup = document.createElement('colgroup');\n tableElement.appendChild(colGroup);\n setDOMUnmanaged(colGroup);\n addClassNamesToElement(tableElement, config.theme.table);\n this.updateTableElement(null, tableElement, config);\n if ($isScrollableTablesActive(editor)) {\n const wrapperElement = document.createElement('div');\n const classes = config.theme.tableScrollableWrapper;\n if (classes) {\n addClassNamesToElement(wrapperElement, classes);\n } else {\n wrapperElement.style.overflowX = 'auto';\n }\n wrapperElement.appendChild(tableElement);\n this.updateTableWrapper(null, wrapperElement, tableElement, config);\n return wrapperElement;\n }\n return tableElement;\n }\n updateTableWrapper(prevNode, tableWrapper, tableElement, config) {\n if (this.__frozenColumnCount !== (prevNode ? prevNode.__frozenColumnCount : 0)) {\n setFrozenColumns(tableWrapper, tableElement, config, this.__frozenColumnCount);\n }\n if (this.__frozenRowCount !== (prevNode ? prevNode.__frozenRowCount : 0)) {\n setFrozenRows(tableWrapper, tableElement, config, this.__frozenRowCount);\n }\n }\n updateTableElement(prevNode, tableElement, config) {\n if (this.__style !== (prevNode ? prevNode.__style : '')) {\n setDOMStyleFromCSS(tableElement.style, this.__style, prevNode ? prevNode.__style : '');\n }\n if (this.__rowStriping !== (prevNode ? prevNode.__rowStriping : false)) {\n setRowStriping(tableElement, config, this.__rowStriping);\n }\n const prevColCount = prevNode ? prevNode.getColumnCount() : 0;\n const prevColWidths = prevNode ? prevNode.__colWidths : undefined;\n if (this.getColumnCount() !== prevColCount || this.getColWidths() !== prevColWidths) {\n updateColgroup(tableElement, this.getColumnCount(), this.getColWidths());\n }\n alignTableElement(tableElement, config, this.getFormatType());\n }\n updateDOM(prevNode, dom, config) {\n const tableElement = getTableElement(this, dom);\n if (dom === tableElement === $isScrollableTablesActive()) {\n return true;\n }\n if (isHTMLDivElement(dom)) {\n this.updateTableWrapper(prevNode, dom, tableElement, config);\n }\n this.updateTableElement(prevNode, tableElement, config);\n return false;\n }\n scaleDOMColWidths(dom, scale) {\n const colWidths = this.getColWidths();\n if (!colWidths) {\n return;\n }\n const tableElement = getTableElement(this, dom);\n updateColgroup(tableElement, this.getColumnCount(), colWidths.map(width => width * scale));\n }\n exportDOM(editor) {\n const superExport = super.exportDOM(editor);\n const {\n element\n } = superExport;\n return {\n after: tableElement => {\n if (superExport.after) {\n tableElement = superExport.after(tableElement);\n }\n if (!isHTMLTableElement(tableElement) && isHTMLElement$1(tableElement)) {\n tableElement = tableElement.querySelector('table');\n }\n if (!isHTMLTableElement(tableElement)) {\n return null;\n }\n alignTableElement(tableElement, editor._config, this.getFormatType());\n\n // Scan the table map to build a map of table cell key to the columns it needs\n const [tableMap] = $computeTableMapSkipCellCheck(this, null, null);\n const cellValues = new Map();\n for (const mapRow of tableMap) {\n for (const mapValue of mapRow) {\n const key = mapValue.cell.getKey();\n if (!cellValues.has(key)) {\n cellValues.set(key, {\n colSpan: mapValue.cell.getColSpan(),\n startColumn: mapValue.startColumn\n });\n }\n }\n }\n\n // scan the DOM to find the table cell keys that were used and mark those columns\n const knownColumns = new Set();\n for (const cellDOM of tableElement.querySelectorAll(':scope > tr > [data-temporary-table-cell-lexical-key]')) {\n const key = cellDOM.getAttribute('data-temporary-table-cell-lexical-key');\n if (key) {\n const cellSpan = cellValues.get(key);\n cellDOM.removeAttribute('data-temporary-table-cell-lexical-key');\n if (cellSpan) {\n cellValues.delete(key);\n for (let i = 0; i < cellSpan.colSpan; i++) {\n knownColumns.add(i + cellSpan.startColumn);\n }\n }\n }\n }\n\n // Compute the colgroup and columns in the export\n const colGroup = tableElement.querySelector(':scope > colgroup');\n if (colGroup) {\n // Only include the <col /> for rows that are in the output\n const cols = Array.from(tableElement.querySelectorAll(':scope > colgroup > col')).filter((dom, i) => knownColumns.has(i));\n colGroup.replaceChildren(...cols);\n }\n\n // Wrap direct descendant rows in a tbody for export\n const rows = tableElement.querySelectorAll(':scope > tr');\n if (rows.length > 0) {\n const tBody = document.createElement('tbody');\n for (const row of rows) {\n tBody.appendChild(row);\n }\n tableElement.append(tBody);\n }\n return tableElement;\n },\n element: !isHTMLTableElement(element) && isHTMLElement$1(element) ? element.querySelector('table') : element\n };\n }\n canBeEmpty() {\n return false;\n }\n isShadowRoot() {\n return true;\n }\n getCordsFromCellNode(tableCellNode, table) {\n const {\n rows,\n domRows\n } = table;\n for (let y = 0; y < rows; y++) {\n const row = domRows[y];\n if (row == null) {\n continue;\n }\n for (let x = 0; x < row.length; x++) {\n const cell = row[x];\n if (cell == null) {\n continue;\n }\n const {\n elem\n } = cell;\n const cellNode = $getNearestTableCellInTableFromDOMNode(this, elem);\n if (cellNode !== null && tableCellNode.is(cellNode)) {\n return {\n x,\n y\n };\n }\n }\n }\n throw new Error('Cell not found in table.');\n }\n getDOMCellFromCords(x, y, table) {\n const {\n domRows\n } = table;\n const row = domRows[y];\n if (row == null) {\n return null;\n }\n const index = x < row.length ? x : row.length - 1;\n const cell = row[index];\n if (cell == null) {\n return null;\n }\n return cell;\n }\n getDOMCellFromCordsOrThrow(x, y, table) {\n const cell = this.getDOMCellFromCords(x, y, table);\n if (!cell) {\n throw new Error('Cell not found at cords.');\n }\n return cell;\n }\n getCellNodeFromCords(x, y, table) {\n const cell = this.getDOMCellFromCords(x, y, table);\n if (cell == null) {\n return null;\n }\n const node = $getNearestNodeFromDOMNode(cell.elem);\n if ($isTableCellNode(node)) {\n return node;\n }\n return null;\n }\n getCellNodeFromCordsOrThrow(x, y, table) {\n const node = this.getCellNodeFromCords(x, y, table);\n if (!node) {\n throw new Error('Node at cords not TableCellNode.');\n }\n return node;\n }\n getRowStriping() {\n return Boolean(this.getLatest().__rowStriping);\n }\n setRowStriping(newRowStriping) {\n const self = this.getWritable();\n self.__rowStriping = newRowStriping;\n return self;\n }\n setFrozenColumns(columnCount) {\n const self = this.getWritable();\n self.__frozenColumnCount = columnCount;\n return self;\n }\n getFrozenColumns() {\n return this.getLatest().__frozenColumnCount;\n }\n setFrozenRows(rowCount) {\n const self = this.getWritable();\n self.__frozenRowCount = rowCount;\n return self;\n }\n getFrozenRows() {\n return this.getLatest().__frozenRowCount;\n }\n canSelectBefore() {\n return true;\n }\n canIndent() {\n return false;\n }\n getColumnCount() {\n const firstRow = this.getFirstChild();\n if (!firstRow) {\n return 0;\n }\n let columnCount = 0;\n firstRow.getChildren().forEach(cell => {\n if ($isTableCellNode(cell)) {\n columnCount += cell.getColSpan();\n }\n });\n return columnCount;\n }\n}\nfunction $getElementForTableNode(editor, tableNode) {\n const tableElement = editor.getElementByKey(tableNode.getKey());\n if (!(tableElement !== null)) {\n formatDevErrorMessage(`$getElementForTableNode: Table Element Not Found`);\n }\n return getTable(tableNode, tableElement);\n}\nfunction $convertTableElement(domNode) {\n const tableNode = $createTableNode();\n if (domNode.hasAttribute('data-lexical-row-striping')) {\n tableNode.setRowStriping(true);\n }\n if (domNode.hasAttribute('data-lexical-frozen-column')) {\n tableNode.setFrozenColumns(1);\n }\n if (domNode.hasAttribute('data-lexical-frozen-row')) {\n tableNode.setFrozenRows(1);\n }\n const colGroup = domNode.querySelector(':scope > colgroup');\n if (colGroup) {\n let columns = [];\n for (const col of colGroup.querySelectorAll(':scope > col')) {\n let width = col.style.width || '';\n if (!PIXEL_VALUE_REG_EXP.test(width)) {\n // Also support deprecated width attribute for google docs\n width = col.getAttribute('width') || '';\n if (!/^\\d+$/.test(width)) {\n columns = undefined;\n break;\n }\n }\n columns.push(parseFloat(width));\n }\n if (columns) {\n tableNode.setColWidths(columns);\n }\n }\n return {\n after: children => $descendantsMatching(children, $isTableRowNode),\n node: tableNode\n };\n}\nfunction $createTableNode() {\n return $applyNodeReplacement(new TableNode());\n}\nfunction $isTableNode(node) {\n return node instanceof TableNode;\n}\n\nfunction $insertTable({\n rows,\n columns,\n includeHeaders\n}, hasNestedTables) {\n const selection = $getSelection() || $getPreviousSelection();\n if (!selection || !$isRangeSelection(selection)) {\n return false;\n }\n\n // Prevent nested tables by checking if we're already inside a table\n if (!hasNestedTables && $findTableNode(selection.anchor.getNode())) {\n return false;\n }\n const tableNode = $createTableNodeWithDimensions(Number(rows), Number(columns), includeHeaders);\n $insertNodeToNearestRoot(tableNode);\n const firstDescendant = tableNode.getFirstDescendant();\n if ($isTextNode(firstDescendant)) {\n firstDescendant.select();\n }\n return true;\n}\nfunction $tableCellTransform(node) {\n if (!$isTableRowNode(node.getParent())) {\n // TableCellNode must be a child of TableRowNode.\n node.remove();\n } else if (node.isEmpty()) {\n // TableCellNode should never be empty\n node.append($createParagraphNode());\n }\n}\nfunction $tableRowTransform(node) {\n if (!$isTableNode(node.getParent())) {\n // TableRowNode must be a child of TableNode.\n // TODO: Future support of tbody/thead/tfoot may change this\n node.remove();\n } else {\n $unwrapAndFilterDescendants(node, $isTableCellNode);\n }\n}\nfunction $tableTransform(node) {\n // TableRowNode is the only valid child for TableNode\n // TODO: Future support of tbody/thead/tfoot/caption may change this\n $unwrapAndFilterDescendants(node, $isTableRowNode);\n const [gridMap] = $computeTableMapSkipCellCheck(node, null, null);\n const maxRowLength = gridMap.reduce((curLength, row) => {\n return Math.max(curLength, row.length);\n }, 0);\n const rowNodes = node.getChildren();\n for (let i = 0; i < gridMap.length; ++i) {\n const rowNode = rowNodes[i];\n if (!rowNode) {\n continue;\n }\n if (!$isTableRowNode(rowNode)) {\n formatDevErrorMessage(`TablePlugin: Expecting all children of TableNode to be TableRowNode, found ${rowNode.constructor.name} (type ${rowNode.getType()})`);\n }\n const rowLength = gridMap[i].reduce((acc, cell) => cell ? 1 + acc : acc, 0);\n if (rowLength === maxRowLength) {\n continue;\n }\n for (let j = rowLength; j < maxRowLength; ++j) {\n // TODO: inherit header state from another header or body\n const newCell = $createTableCellNode();\n newCell.append($createParagraphNode());\n rowNode.append(newCell);\n }\n }\n const colWidths = node.getColWidths();\n const columnCount = node.getColumnCount();\n if (colWidths && colWidths.length !== columnCount) {\n let newColWidths = undefined;\n if (columnCount < colWidths.length) {\n newColWidths = colWidths.slice(0, columnCount);\n } else if (colWidths.length > 0) {\n // Repeat the last column width.\n const fillWidth = colWidths[colWidths.length - 1];\n newColWidths = [...colWidths, ...Array(columnCount - colWidths.length).fill(fillWidth)];\n }\n node.setColWidths(newColWidths);\n }\n}\nfunction $tableClickCommand(event) {\n if (event.detail < 3 || !isDOMNode(event.target)) {\n return false;\n }\n const startNode = $getNearestNodeFromDOMNode(event.target);\n if (startNode === null) {\n return false;\n }\n const blockNode = $findMatchingParent(startNode, node => $isElementNode(node) && !node.isInline());\n if (blockNode === null) {\n return false;\n }\n const rootNode = blockNode.getParent();\n if (!$isTableCellNode(rootNode)) {\n return false;\n }\n blockNode.select(0);\n return true;\n}\nfunction $tableSelectAllCommand() {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n // Check if the selection is inside a table\n const anchorNode = selection.anchor.getNode();\n const tableNode = $findTableNode(anchorNode);\n if (tableNode === null) {\n return false;\n }\n\n // CRITICAL: Only intercept if table is the ONLY child of root\n // This is required to reproduce the bug: table must be the only content, no empty paragraphs\n // This prevents breaking other tests that expect RangeSelection when there's content outside table\n const root = $getRoot();\n if (!root.is(tableNode.getParent()) || root.getChildrenSize() !== 1) {\n return false;\n }\n\n // At this point, table is the only child\n // This is the exact scenario from issue #8074: table is the only content in editor\n\n // Get the table map to find first and last cells (handles merged cells correctly)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\n if (tableMap.length === 0 || tableMap[0].length === 0) {\n return false;\n }\n\n // Get the first cell (top-left)\n const firstCellMap = tableMap[0][0];\n if (!firstCellMap || !firstCellMap.cell) {\n return false;\n }\n\n // Get the last cell (bottom-right)\n const lastRow = tableMap[tableMap.length - 1];\n const lastCellMap = lastRow[lastRow.length - 1];\n if (!lastCellMap || !lastCellMap.cell) {\n return false;\n }\n\n // Create a TableSelection that selects all cells\n const tableSelection = $createTableSelectionFrom(tableNode, firstCellMap.cell, lastCellMap.cell);\n $setSelection(tableSelection);\n return true;\n}\n\n/**\n * Register a transform to ensure that all TableCellNode have a colSpan and rowSpan of 1.\n * This should only be registered when you do not want to support merged cells.\n *\n * @param editor The editor\n * @returns An unregister callback\n */\nfunction registerTableCellUnmergeTransform(editor) {\n return editor.registerNodeTransform(TableCellNode, node => {\n if (node.getColSpan() > 1 || node.getRowSpan() > 1) {\n // When we have rowSpan we have to map the entire Table to understand where the new Cells\n // fit best; let's analyze all Cells at once to save us from further transform iterations\n const [,, gridNode] = $getNodeTriplet(node);\n const [gridMap] = $computeTableMap(gridNode, node, node);\n // TODO this function expects Tables to be normalized. Look into this once it exists\n const rowsCount = gridMap.length;\n const columnsCount = gridMap[0].length;\n let row = gridNode.getFirstChild();\n if (!$isTableRowNode(row)) {\n formatDevErrorMessage(`Expected TableNode first child to be a RowNode`);\n }\n const unmerged = [];\n for (let i = 0; i < rowsCount; i++) {\n if (i !== 0) {\n row = row.getNextSibling();\n if (!$isTableRowNode(row)) {\n formatDevErrorMessage(`Expected TableNode first child to be a RowNode`);\n }\n }\n let lastRowCell = null;\n for (let j = 0; j < columnsCount; j++) {\n const cellMap = gridMap[i][j];\n const cell = cellMap.cell;\n if (cellMap.startRow === i && cellMap.startColumn === j) {\n lastRowCell = cell;\n unmerged.push(cell);\n } else if (cell.getColSpan() > 1 || cell.getRowSpan() > 1) {\n if (!$isTableCellNode(cell)) {\n formatDevErrorMessage(`Expected TableNode cell to be a TableCellNode`);\n }\n const newCell = $createTableCellNode(cell.__headerState);\n if (lastRowCell !== null) {\n lastRowCell.insertAfter(newCell);\n } else {\n $insertFirst$1(row, newCell);\n }\n }\n }\n }\n for (const cell of unmerged) {\n cell.setColSpan(1);\n cell.setRowSpan(1);\n }\n }\n });\n}\nfunction registerTableSelectionObserver(editor, hasTabHandler = true) {\n const tableObservers = new TableObservers();\n const initializeTableNode = (tableNode, nodeKey, dom) => {\n const tableElement = getTableElement(tableNode, dom);\n const tableSelection = applyTableHandlers(tableNode, tableElement, editor, hasTabHandler, tableObservers);\n tableObservers.observers.set(nodeKey, [tableSelection, tableElement]);\n };\n return mergeRegister(registerTableWindowHandlers(editor, tableObservers), editor.registerCommand(SELECTION_CHANGE_COMMAND, () => {\n return $handleTableSelectionChangeCommand(tableObservers, editor);\n }, COMMAND_PRIORITY_HIGH), editor.registerMutationListener(TableNode, nodeMutations => {\n editor.getEditorState().read(() => {\n for (const [nodeKey, mutation] of nodeMutations) {\n const tableSelection = tableObservers.observers.get(nodeKey);\n if (mutation === 'created' || mutation === 'updated') {\n const {\n tableNode,\n tableElement\n } = $getTableAndElementByKey(nodeKey);\n if (tableSelection === undefined) {\n initializeTableNode(tableNode, nodeKey, tableElement);\n } else if (tableElement !== tableSelection[1]) {\n // The update created a new DOM node, destroy the existing TableObserver\n tableSelection[0].removeListeners();\n tableObservers.observers.delete(nodeKey);\n initializeTableNode(tableNode, nodeKey, tableElement);\n }\n } else if (mutation === 'destroyed') {\n if (tableSelection !== undefined) {\n tableSelection[0].removeListeners();\n tableObservers.observers.delete(nodeKey);\n }\n }\n }\n }, {\n editor\n });\n }, {\n skipInitialization: false\n }), () => {\n // Hook might be called multiple times so cleaning up tables listeners as well,\n // as it'll be reinitialized during recurring call\n for (const [, [tableSelection]] of tableObservers.observers) {\n tableSelection.removeListeners();\n }\n });\n}\n\n/**\n * Register table command listeners and the table integrity transforms. The\n * table selection observer should be registered separately after this with\n * {@link registerTableSelectionObserver}.\n *\n * @param editor The editor\n * @returns An unregister callback\n */\nfunction registerTablePlugin(editor, options) {\n if (!editor.hasNodes([TableNode])) {\n {\n formatDevErrorMessage(`TablePlugin: TableNode is not registered on editor`);\n }\n }\n const {\n hasNestedTables = signal(false)\n } = options ?? {};\n return mergeRegister(editor.registerCommand(INSERT_TABLE_COMMAND, payload => {\n return $insertTable(payload, hasNestedTables.peek());\n }, COMMAND_PRIORITY_EDITOR), editor.registerCommand(SELECTION_INSERT_CLIPBOARD_NODES_COMMAND, (payload, dispatchEditor) => {\n if (editor !== dispatchEditor) {\n return false;\n }\n return $tableSelectionInsertClipboardNodesCommand(payload, hasNestedTables);\n }, COMMAND_PRIORITY_EDITOR), editor.registerCommand(SELECT_ALL_COMMAND, $tableSelectAllCommand, COMMAND_PRIORITY_LOW), editor.registerCommand(CLICK_COMMAND, $tableClickCommand, COMMAND_PRIORITY_EDITOR), editor.registerNodeTransform(TableNode, $tableTransform), editor.registerNodeTransform(TableRowNode, $tableRowTransform), editor.registerNodeTransform(TableCellNode, $tableCellTransform));\n}\nfunction $tableSelectionInsertClipboardNodesCommand(selectionPayload, hasNestedTables) {\n const {\n nodes,\n selection\n } = selectionPayload;\n const hasTables = nodes.some(n => $isTableNode(n) || $dfs(n).some(d => $isTableNode(d.node)));\n if (!hasTables) {\n // Not pasting a table - no special handling required.\n return false;\n }\n const isTableSelection = $isTableSelection(selection);\n const isRangeSelection = $isRangeSelection(selection);\n const isSelectionInsideOfGrid = isRangeSelection && $findMatchingParent(selection.anchor.getNode(), n => $isTableCellNode(n)) !== null && $findMatchingParent(selection.focus.getNode(), n => $isTableCellNode(n)) !== null || isTableSelection;\n if (!isSelectionInsideOfGrid) {\n // Not pasting in a grid - no special handling required.\n return false;\n }\n\n // When pasting just a table, flatten the table on the destination table, even when nested tables are allowed.\n if (nodes.length === 1 && $isTableNode(nodes[0])) {\n return $insertTableIntoGrid(nodes[0], selection);\n }\n\n // If nested tables are enabled, allow pasting a table into a single cell.\n if (isRangeSelection && hasNestedTables.peek() && !$isMultiCellTableSelection(selection)) {\n return false;\n }\n\n // If we reached this point, there's a table in the selection and nested tables are not allowed - reject the paste.\n return true;\n}\nfunction $insertTableIntoGrid(tableNode, selection) {\n const anchorAndFocus = selection.getStartEndPoints();\n const isTableSelection = $isTableSelection(selection);\n if (anchorAndFocus === null) {\n return false;\n }\n const [anchor, focus] = anchorAndFocus;\n const [anchorCellNode, anchorRowNode, gridNode] = $getNodeTriplet(anchor);\n const focusCellNode = $findMatchingParent(focus.getNode(), n => $isTableCellNode(n));\n if (!$isTableCellNode(anchorCellNode) || !$isTableCellNode(focusCellNode) || !$isTableRowNode(anchorRowNode) || !$isTableNode(gridNode)) {\n return false;\n }\n const [initialGridMap, anchorCellMap, focusCellMap] = $computeTableMap(gridNode, anchorCellNode, focusCellNode);\n const [templateGridMap] = $computeTableMapSkipCellCheck(tableNode, null, null);\n const initialRowCount = initialGridMap.length;\n const initialColCount = initialRowCount > 0 ? initialGridMap[0].length : 0;\n\n // If we have a range selection, we'll fit the template grid into the\n // table, growing the table if necessary.\n let startRow = anchorCellMap.startRow;\n let startCol = anchorCellMap.startColumn;\n let affectedRowCount = templateGridMap.length;\n let affectedColCount = affectedRowCount > 0 ? templateGridMap[0].length : 0;\n if (isTableSelection) {\n // If we have a table selection, we'll only modify the cells within\n // the selection boundary.\n const selectionBoundary = $computeTableCellRectBoundary(initialGridMap, anchorCellMap, focusCellMap);\n const selectionRowCount = selectionBoundary.maxRow - selectionBoundary.minRow + 1;\n const selectionColCount = selectionBoundary.maxColumn - selectionBoundary.minColumn + 1;\n startRow = selectionBoundary.minRow;\n startCol = selectionBoundary.minColumn;\n affectedRowCount = Math.min(affectedRowCount, selectionRowCount);\n affectedColCount = Math.min(affectedColCount, selectionColCount);\n }\n\n // Step 1: Unmerge all merged cells within the affected area\n let didPerformMergeOperations = false;\n const lastRowForUnmerge = Math.min(initialRowCount, startRow + affectedRowCount) - 1;\n const lastColForUnmerge = Math.min(initialColCount, startCol + affectedColCount) - 1;\n const unmergedKeys = new Set();\n for (let row = startRow; row <= lastRowForUnmerge; row++) {\n for (let col = startCol; col <= lastColForUnmerge; col++) {\n const cellMap = initialGridMap[row][col];\n if (unmergedKeys.has(cellMap.cell.getKey())) {\n continue; // cell was a merged cell that was already handled\n }\n if (cellMap.cell.__rowSpan === 1 && cellMap.cell.__colSpan === 1) {\n continue; // cell is not a merged cell\n }\n $unmergeCellNode(cellMap.cell);\n unmergedKeys.add(cellMap.cell.getKey());\n didPerformMergeOperations = true;\n }\n }\n let [interimGridMap] = $computeTableMapSkipCellCheck(gridNode.getWritable(), null, null);\n\n // Step 2: Expand current table (if needed)\n const rowsToInsert = affectedRowCount - initialRowCount + startRow;\n for (let i = 0; i < rowsToInsert; i++) {\n const cellMap = interimGridMap[initialRowCount - 1][0];\n $insertTableRowAtNode(cellMap.cell);\n }\n const colsToInsert = affectedColCount - initialColCount + startCol;\n for (let i = 0; i < colsToInsert; i++) {\n const cellMap = interimGridMap[0][initialColCount - 1];\n $insertTableColumnAtNode(cellMap.cell, true, false);\n }\n [interimGridMap] = $computeTableMapSkipCellCheck(gridNode.getWritable(), null, null);\n\n // Step 3: Merge cells and set cell content, to match template grid\n for (let row = startRow; row < startRow + affectedRowCount; row++) {\n for (let col = startCol; col < startCol + affectedColCount; col++) {\n const templateRow = row - startRow;\n const templateCol = col - startCol;\n const templateCellMap = templateGridMap[templateRow][templateCol];\n if (templateCellMap.startRow !== templateRow || templateCellMap.startColumn !== templateCol) {\n continue; // cell is a merged cell that was already handled\n }\n const templateCell = templateCellMap.cell;\n if (templateCell.__rowSpan !== 1 || templateCell.__colSpan !== 1) {\n const cellsToMerge = [];\n const lastRowForMerge = Math.min(row + templateCell.__rowSpan, startRow + affectedRowCount) - 1;\n const lastColForMerge = Math.min(col + templateCell.__colSpan, startCol + affectedColCount) - 1;\n for (let r = row; r <= lastRowForMerge; r++) {\n for (let c = col; c <= lastColForMerge; c++) {\n const cellMap = interimGridMap[r][c];\n cellsToMerge.push(cellMap.cell);\n }\n }\n $mergeCells(cellsToMerge);\n didPerformMergeOperations = true;\n }\n const {\n cell\n } = interimGridMap[row][col];\n const backgroundColor = templateCell.getBackgroundColor();\n if (backgroundColor !== null && backgroundColor !== undefined) {\n cell.setBackgroundColor(backgroundColor);\n }\n const originalChildren = cell.getChildren();\n templateCell.getChildren().forEach(child => {\n if ($isTextNode(child)) {\n const paragraphNode = $createParagraphNode();\n paragraphNode.append(child);\n cell.append(child);\n } else {\n cell.append(child);\n }\n });\n originalChildren.forEach(n => n.remove());\n }\n }\n if (isTableSelection && didPerformMergeOperations) {\n // reset the table selection in case the anchor or focus cell was\n // removed via merge operations\n const [finalGridMap] = $computeTableMapSkipCellCheck(gridNode.getWritable(), null, null);\n const newAnchorCellMap = finalGridMap[anchorCellMap.startRow][anchorCellMap.startColumn];\n newAnchorCellMap.cell.selectEnd();\n }\n return true;\n}\nfunction $isMultiCellTableSelection(selection) {\n if ($isTableSelection(selection) && !selection.focus.getNode().is(selection.anchor.getNode())) {\n return true;\n }\n if ($isRangeSelection(selection) && $isTableCellNode(selection.anchor.getNode()) && !selection.anchor.getNode().is(selection.focus.getNode())) {\n return true;\n }\n return false;\n}\n\n/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n/**\n * Configures {@link TableNode}, {@link TableRowNode}, {@link TableCellNode} and\n * registers table behaviors (see {@link TableConfig})\n */\nconst TableExtension = defineExtension({\n build(editor, config, state) {\n return namedSignals(config);\n },\n config: safeCast({\n hasCellBackgroundColor: true,\n hasCellMerge: true,\n hasHorizontalScroll: true,\n hasNestedTables: false,\n hasTabHandler: true\n }),\n name: '@lexical/table/Table',\n nodes: () => [TableNode, TableRowNode, TableCellNode],\n register(editor, config, state) {\n const stores = state.getOutput();\n return mergeRegister(effect(() => {\n const hasHorizontalScroll = stores.hasHorizontalScroll.value;\n const hadHorizontalScroll = $isScrollableTablesActive(editor);\n if (hadHorizontalScroll !== hasHorizontalScroll) {\n setScrollableTablesActive(editor, hasHorizontalScroll);\n // Registering the transform has the side-effect of marking all existing\n // TableNodes as dirty. The handler is immediately unregistered.\n editor.registerNodeTransform(TableNode, () => {})();\n }\n }), registerTablePlugin(editor, stores), effect(() => registerTableSelectionObserver(editor, stores.hasTabHandler.value)), effect(() => stores.hasCellMerge.value ? undefined : registerTableCellUnmergeTransform(editor)), effect(() => stores.hasCellBackgroundColor.value ? undefined : editor.registerNodeTransform(TableCellNode, node => {\n if (node.getBackgroundColor() !== null) {\n node.setBackgroundColor(null);\n }\n })));\n }\n});\n\nexport { $computeTableMap, $computeTableMapSkipCellCheck, $createTableCellNode, $createTableNode, $createTableNodeWithDimensions, $createTableRowNode, $createTableSelection, $createTableSelectionFrom, $deleteTableColumn, $deleteTableColumnAtSelection, $deleteTableColumn__EXPERIMENTAL, $deleteTableRowAtSelection, $deleteTableRow__EXPERIMENTAL, $findCellNode, $findTableNode, $getElementForTableNode, $getNodeTriplet, $getTableAndElementByKey, $getTableCellNodeFromLexicalNode, $getTableCellNodeRect, $getTableColumnIndexFromTableCellNode, $getTableNodeFromLexicalNodeOrThrow, $getTableRowIndexFromTableCellNode, $getTableRowNodeFromTableCellNodeOrThrow, $insertTableColumn, $insertTableColumnAtSelection, $insertTableColumn__EXPERIMENTAL, $insertTableRow, $insertTableRowAtSelection, $insertTableRow__EXPERIMENTAL, $isScrollableTablesActive, $isSimpleTable, $isTableCellNode, $isTableNode, $isTableRowNode, $isTableSelection, $mergeCells, $moveTableColumn, $removeTableRowAtIndex, $unmergeCell, INSERT_TABLE_COMMAND, TableCellHeaderStates, TableCellNode, TableExtension, TableNode, TableObserver, TableRowNode, applyTableHandlers, getDOMCellFromTarget, getTableElement, getTableObserverFromTableElement, registerTableCellUnmergeTransform, registerTablePlugin, registerTableSelectionObserver, setScrollableTablesActive };\n"],"x_google_ignoreList":[0],"mappings":"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"}
|