@mx-space/cli 0.14.2 → 0.15.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.
Files changed (52) hide show
  1. package/LICENSE +33 -0
  2. package/README.md +35 -11
  3. package/dist/{Lexical.dev-CtGmYDoh.mjs → Lexical.dev-Cck4n26y.mjs} +240 -325
  4. package/dist/{Lexical.node-8sRFmq2X.mjs → Lexical.node-D6wf2D5M.mjs} +2 -2
  5. package/dist/{Lexical.prod-D-VfeKDz.mjs → Lexical.prod-DCwS1oTq.mjs} +1753 -1783
  6. package/dist/{LexicalClipboard.dev-CzQ15z6E.mjs → LexicalClipboard.dev-CMkPHV7O.mjs} +6 -6
  7. package/dist/{LexicalClipboard.node-D4gMGws6.mjs → LexicalClipboard.node-m4nZ7IYw.mjs} +2 -2
  8. package/dist/{LexicalClipboard.prod-CltkQpzS.mjs → LexicalClipboard.prod-B_rN1vE1.mjs} +6 -6
  9. package/dist/{LexicalCodeCore.dev-DkYBZRGB.mjs → LexicalCodeCore.dev-DyJw3i8V.mjs} +56 -68
  10. package/dist/{LexicalCodeCore.prod-COc3_QL8.mjs → LexicalCodeCore.prod-DPXLHQLF.mjs} +144 -156
  11. package/dist/{LexicalDragon.dev-Dv5_WUae.mjs → LexicalDragon.dev-ZkNfMwrE.mjs} +3 -3
  12. package/dist/{LexicalDragon.node-DgjrmWkd.mjs → LexicalDragon.node-Ds9oLUFh.mjs} +2 -2
  13. package/dist/{LexicalDragon.prod-DnpbDe-_.mjs → LexicalDragon.prod-B58ic2av.mjs} +3 -3
  14. package/dist/{LexicalExtension.dev-JMH_6-OZ.mjs → LexicalExtension.dev-DvwHs1Xv.mjs} +10 -19
  15. package/dist/{LexicalExtension.node-BUozzx4t.mjs → LexicalExtension.node-5OymZQfy.mjs} +2 -2
  16. package/dist/{LexicalExtension.prod-UiyDgmou.mjs → LexicalExtension.prod-Ce0T5smQ.mjs} +73 -82
  17. package/dist/{LexicalHeadless.dev-BfLGciiX.mjs → LexicalHeadless.dev-DA0WldSR.mjs} +2 -2
  18. package/dist/{LexicalHeadless.prod-CWF7edmQ.mjs → LexicalHeadless.prod-1kQgKB6c.mjs} +2 -2
  19. package/dist/{LexicalHtml.dev-D5EF5PGW.mjs → LexicalHtml.dev-BDB7CUrx.mjs} +6 -6
  20. package/dist/{LexicalHtml.node-BYbzHNVe.mjs → LexicalHtml.node-DpVNt7It.mjs} +2 -2
  21. package/dist/{LexicalHtml.prod-D_FfkvVD.mjs → LexicalHtml.prod-HkxM5scw.mjs} +6 -6
  22. package/dist/{LexicalLink.dev-D3Pgh6ik.mjs → LexicalLink.dev-C5zNJlrm.mjs} +17 -41
  23. package/dist/{LexicalLink.prod-XZoAYVYD.mjs → LexicalLink.prod-Bkt9hQAt.mjs} +113 -137
  24. package/dist/{LexicalList.dev-B5d3ObhB.mjs → LexicalList.dev-B7VgME-m.mjs} +15 -47
  25. package/dist/{LexicalList.prod-OQDpVAEb.mjs → LexicalList.prod-B8c7TDjH.mjs} +208 -224
  26. package/dist/{LexicalMarkdown.dev-BkM8G3DG.mjs → LexicalMarkdown.dev-B5z9kLbV.mjs} +5 -4
  27. package/dist/{LexicalMarkdown.prod-DcVXCex6.mjs → LexicalMarkdown.prod-wKzw7FFH.mjs} +5 -4
  28. package/dist/{LexicalRichText.dev-DppD7IrA.mjs → LexicalRichText.dev-CUd6Li5F.mjs} +76 -82
  29. package/dist/{LexicalRichText.node-CPSn7dkg.mjs → LexicalRichText.node-BKfaQ-CH.mjs} +8 -8
  30. package/dist/{LexicalRichText.prod-h7JPxFNp.mjs → LexicalRichText.prod-SBewjJHx.mjs} +86 -96
  31. package/dist/{LexicalSelection.dev-CD0SLbxP.mjs → LexicalSelection.dev-D27JOCqj.mjs} +2 -2
  32. package/dist/{LexicalSelection.node-CGlJgUlZ.mjs → LexicalSelection.node-DBEwPjBu.mjs} +2 -2
  33. package/dist/{LexicalSelection.prod-DbVZN5AV.mjs → LexicalSelection.prod-OaYhXHOL.mjs} +2 -2
  34. package/dist/{LexicalTable.dev-D0HU14UV.mjs → LexicalTable.dev-6IFFOAE0.mjs} +260 -131
  35. package/dist/{LexicalTable.prod-BcPNSrxP.mjs → LexicalTable.prod-2CaLZ7fH.mjs} +686 -630
  36. package/dist/{LexicalUtils.dev-iKy_TrRT.mjs → LexicalUtils.dev-DJA7J_7v.mjs} +3 -3
  37. package/dist/{LexicalUtils.node-CIgMS8cG.mjs → LexicalUtils.node-Df9oPTlA.mjs} +2 -2
  38. package/dist/{LexicalUtils.prod-DIAsKJzu.mjs → LexicalUtils.prod-Bb7V4Ewg.mjs} +3 -3
  39. package/dist/bin/mxs.mjs +1 -1
  40. package/dist/esm-CDcJmHkG.mjs +2 -0
  41. package/dist/{esm-CwXl1N0a.mjs → esm-DLzrv7gD.mjs} +165 -131
  42. package/dist/index.d.mts +16 -16
  43. package/dist/index.mjs +1 -1
  44. package/dist/{mxs-iW9DgqSZ.mjs → mxs-BIRW5Axj.mjs} +1434 -2233
  45. package/dist/vendor/litexml/cli.mjs +2462 -2557
  46. package/dist/vendor/litexml/litexml-html-preview-client.css +80 -47
  47. package/dist/vendor/litexml/litexml-html-preview-client.js +5276 -4906
  48. package/dist/vendor/litexml/style.css +6 -2
  49. package/package.json +31 -32
  50. package/skills/commands-ai.md +45 -12
  51. package/skills/overview.md +1 -1
  52. package/dist/esm-CH7CrOvh.mjs +0 -2
@@ -1,9 +1,9 @@
1
- import { f as namedSignals, l as effect, p as signal } from "./LexicalExtension.node-BUozzx4t.mjs";
2
- import { $r as isHTMLElement, $t as COMMAND_PRIORITY_LOW, A as $getChildCaret, Ar as getComposedEventTarget, B as $getNodeByKey, Dt as $normalizeSelection__EXPERIMENTAL, Et as $normalizeCaret, Ft as $setSelection, G as $getSelection, Gn as KEY_ARROW_RIGHT_COMMAND, Gr as isCurrentlyReadOnlyMode, Hn as IS_UNDERLINE, I as $getDocument, Jn as KEY_DELETE_COMMAND, Jr as isDOMShadowRoot, K as $getSiblingCaret, Kn as KEY_ARROW_UP_COMMAND, Kr as isDOMDocumentNode, Kt as CLICK_COMMAND, L as $getEditor, Ln as IS_ITALIC, Mr as getDOMSelectionPoints, Nr as getDOMSelectionRange, Or as getActiveElement, Pn as IS_FIREFOX, Pt as $setPointFromCaret, Qn as KEY_TAB_COMMAND, Qt as COMMAND_PRIORITY_HIGH, S as $fullReconcile, St as $isTextNode, Tr as defineExtension, U as $getPreviousSelection, Un as KEY_ARROW_DOWN_COMMAND, V as $getNodeByKeyOrThrow, W as $getRoot, Wn as KEY_ARROW_LEFT_COMMAND, Xn as KEY_ESCAPE_COMMAND, Zt as COMMAND_PRIORITY_EDITOR, _n as FORMAT_ELEMENT_COMMAND, an as CUT_COMMAND, b as $findMatchingParent, br as configExtension, ci as mergeRegister, cn as DELETE_CHARACTER_COMMAND, cr as SELECTION_CHANGE_COMMAND, ct as $isInlineElementOrDecoratorNode, dt as $isLineBreakNode, ei as isHTMLTableRowElement, fi as removeClassNamesFromElement, g as $createRangeSelectionFromDom, gn as FOCUS_COMMAND, gt as $isRootOrShadowRoot, h as $createRangeSelection, hi as setDOMUnmanaged, hn as ElementNode, hr as TEXT_TYPE_TO_FORMAT, ht as $isRootNode, i as $caretFromPoint, in as COPY_COMMAND, jn as IS_BOLD, jr as getDOMSelection, ln as DELETE_LINE_COMMAND, lr as SELECTION_INSERT_CLIPBOARD_NODES_COMMAND, m as $createPoint, mi as setDOMStyleFromCSS, mt as $isRangeSelection, n as $applyNodeReplacement, ot as $isElementNode, p as $createParagraphNode, pi as safeCast, pt as $isParagraphNode, qn as KEY_BACKSPACE_COMMAND, qr as isDOMNode, rn as CONTROLLED_TEXT_INSERTION_COMMAND, rr as PASTE_COMMAND, rt as $isChildCaret, st as $isExtendableTextPointCaret, ui as registerEventListener, un as DELETE_WORD_COMMAND, ur as SELECT_ALL_COMMAND, v as $createTextNode, vn as FORMAT_TEXT_COMMAND, vr as addClassNamesToElement, w as $getAdjacentChildCaret, wn as INSERT_PARAGRAPH_COMMAND, xr as createCommand, y as $extendCaretToRange, yt as $isSiblingCaret, z as $getNearestNodeFromDOMNode, zn as IS_STRIKETHROUGH } from "./Lexical.node-8sRFmq2X.mjs";
3
- import { c as CoreImportExtension, g as defineImportRule, h as contextValue, l as DOMImportExtension, m as ImportTextStyle, o as $propagateTextAlignToBlockChildren, p as ImportTextFormat, y as sel } from "./LexicalHtml.node-BYbzHNVe.mjs";
4
- import { d as $unwrapAndFilterDescendants, m as objectKlassEquals, n as $dfs, o as $insertFirst$1, s as $insertNodeToNearestRoot, t as $descendantsMatching } from "./LexicalUtils.node-CIgMS8cG.mjs";
5
- import { o as copyToClipboard, t as $getClipboardDataFromSelection } from "./LexicalClipboard.node-D4gMGws6.mjs";
6
- //#region ../../node_modules/.pnpm/@lexical+table@0.48.0_typescript@6.0.3/node_modules/@lexical/table/dist/LexicalTable.dev.mjs
1
+ import { d as getPeerDependencyFromEditor, f as namedSignals, l as effect, p as signal } from "./LexicalExtension.node-5OymZQfy.mjs";
2
+ import { $r as isHTMLElement, $t as COMMAND_PRIORITY_LOW, A as $getChildCaret, Ar as getComposedEventTarget, B as $getNodeByKey, Dt as $normalizeSelection__EXPERIMENTAL, Et as $normalizeCaret, Ft as $setSelection, G as $getSelection, Gn as KEY_ARROW_RIGHT_COMMAND, Gr as isCurrentlyReadOnlyMode, Hn as IS_UNDERLINE, I as $getDocument, Jn as KEY_DELETE_COMMAND, Jr as isDOMShadowRoot, K as $getSiblingCaret, Kn as KEY_ARROW_UP_COMMAND, Kr as isDOMDocumentNode, Kt as CLICK_COMMAND, L as $getEditor, Ln as IS_ITALIC, Mr as getDOMSelectionPoints, Nr as getDOMSelectionRange, Or as getActiveElement, Pn as IS_FIREFOX, Pt as $setPointFromCaret, Qn as KEY_TAB_COMMAND, Qt as COMMAND_PRIORITY_HIGH, S as $fullReconcile, St as $isTextNode, Tr as defineExtension, U as $getPreviousSelection, Un as KEY_ARROW_DOWN_COMMAND, V as $getNodeByKeyOrThrow, W as $getRoot, Wn as KEY_ARROW_LEFT_COMMAND, Xn as KEY_ESCAPE_COMMAND, Zt as COMMAND_PRIORITY_EDITOR, _n as FORMAT_ELEMENT_COMMAND, an as CUT_COMMAND, b as $findMatchingParent, br as configExtension, ci as mergeRegister, cn as DELETE_CHARACTER_COMMAND, cr as SELECTION_CHANGE_COMMAND, ct as $isInlineElementOrDecoratorNode, dt as $isLineBreakNode, ei as isHTMLTableRowElement, fi as removeClassNamesFromElement, g as $createRangeSelectionFromDom, gn as FOCUS_COMMAND, gt as $isRootOrShadowRoot, h as $createRangeSelection, hi as setDOMUnmanaged, hn as ElementNode, hr as TEXT_TYPE_TO_FORMAT, ht as $isRootNode, i as $caretFromPoint, in as COPY_COMMAND, jn as IS_BOLD, jr as getDOMSelection, ln as DELETE_LINE_COMMAND, lr as SELECTION_INSERT_CLIPBOARD_NODES_COMMAND, m as $createPoint, mi as setDOMStyleFromCSS, mt as $isRangeSelection, n as $applyNodeReplacement, ot as $isElementNode, p as $createParagraphNode, pi as safeCast, pt as $isParagraphNode, qn as KEY_BACKSPACE_COMMAND, qr as isDOMNode, rn as CONTROLLED_TEXT_INSERTION_COMMAND, rr as PASTE_COMMAND, rt as $isChildCaret, st as $isExtendableTextPointCaret, ui as registerEventListener, un as DELETE_WORD_COMMAND, ur as SELECT_ALL_COMMAND, v as $createTextNode, vn as FORMAT_TEXT_COMMAND, vr as addClassNamesToElement, w as $getAdjacentChildCaret, wn as INSERT_PARAGRAPH_COMMAND, xr as createCommand, y as $extendCaretToRange, yt as $isSiblingCaret, z as $getNearestNodeFromDOMNode, zn as IS_STRIKETHROUGH } from "./Lexical.node-D6wf2D5M.mjs";
3
+ import { c as CoreImportExtension, g as defineImportRule, h as contextValue, l as DOMImportExtension, m as ImportTextStyle, o as $propagateTextAlignToBlockChildren, p as ImportTextFormat, y as sel } from "./LexicalHtml.node-DpVNt7It.mjs";
4
+ import { d as $unwrapAndFilterDescendants, m as objectKlassEquals, n as $dfs, o as $insertFirst$1, s as $insertNodeToNearestRoot, t as $descendantsMatching } from "./LexicalUtils.node-Df9oPTlA.mjs";
5
+ import { o as copyToClipboard, t as $getClipboardDataFromSelection } from "./LexicalClipboard.node-m4nZ7IYw.mjs";
6
+ //#region ../../node_modules/.pnpm/@lexical+table@0.49.0_typescript@6.0.3/node_modules/@lexical/table/dist/LexicalTable.dev.mjs
7
7
  /**
8
8
  * Copyright (c) Meta Platforms, Inc. and affiliates.
9
9
  *
@@ -34,7 +34,7 @@ const TableCellHeaderStates = {
34
34
  ROW: 1
35
35
  };
36
36
  /** @noInheritDoc */
37
- var TableCellNode = class TableCellNode extends ElementNode {
37
+ var TableCellNode = class extends ElementNode {
38
38
  /** @internal */
39
39
  __colSpan;
40
40
  /** @internal */
@@ -47,11 +47,20 @@ var TableCellNode = class TableCellNode extends ElementNode {
47
47
  __backgroundColor;
48
48
  /** @internal */
49
49
  __verticalAlign;
50
- static getType() {
51
- return "tablecell";
52
- }
53
- static clone(node) {
54
- return new TableCellNode(node.__headerState, node.__colSpan, node.__width, node.__key);
50
+ $config() {
51
+ return this.config("tablecell", {
52
+ extends: ElementNode,
53
+ importDOM: {
54
+ td: () => ({
55
+ conversion: $convertTableCellNodeElement,
56
+ priority: 0
57
+ }),
58
+ th: () => ({
59
+ conversion: $convertTableCellNodeElement,
60
+ priority: 0
61
+ })
62
+ }
63
+ });
55
64
  }
56
65
  afterCloneFrom(node) {
57
66
  super.afterCloneFrom(node);
@@ -62,21 +71,6 @@ var TableCellNode = class TableCellNode extends ElementNode {
62
71
  this.__headerState = node.__headerState;
63
72
  this.__width = node.__width;
64
73
  }
65
- static importDOM() {
66
- return {
67
- td: (node) => ({
68
- conversion: $convertTableCellNodeElement,
69
- priority: 0
70
- }),
71
- th: (node) => ({
72
- conversion: $convertTableCellNodeElement,
73
- priority: 0
74
- })
75
- };
76
- }
77
- static importJSON(serializedNode) {
78
- return $createTableCellNode().updateFromJSON(serializedNode);
79
- }
80
74
  updateFromJSON(serializedNode) {
81
75
  return super.updateFromJSON(serializedNode).setHeaderStyles(serializedNode.headerState).setColSpan(serializedNode.colSpan || 1).setRowSpan(serializedNode.rowSpan || 1).setWidth(serializedNode.width || void 0).setBackgroundColor(serializedNode.backgroundColor || null).setVerticalAlign(serializedNode.verticalAlign || void 0);
82
76
  }
@@ -309,32 +303,26 @@ function formatDevErrorMessage(message) {
309
303
  *
310
304
  */
311
305
  /** @noInheritDoc */
312
- var TableRowNode = class TableRowNode extends ElementNode {
306
+ var TableRowNode = class extends ElementNode {
313
307
  /** @internal */
314
308
  __height;
315
- static getType() {
316
- return "tablerow";
317
- }
318
- static clone(node) {
319
- return new TableRowNode(node.__height, node.__key);
309
+ $config() {
310
+ return this.config("tablerow", {
311
+ extends: ElementNode,
312
+ importDOM: { tr: () => ({
313
+ conversion: $convertTableRowElement,
314
+ priority: 0
315
+ }) }
316
+ });
320
317
  }
321
318
  afterCloneFrom(prevNode) {
322
319
  super.afterCloneFrom(prevNode);
323
320
  this.__height = prevNode.__height;
324
321
  }
325
- static importDOM() {
326
- return { tr: (node) => ({
327
- conversion: $convertTableRowElement,
328
- priority: 0
329
- }) };
330
- }
331
- static importJSON(serializedNode) {
332
- return $createTableRowNode().updateFromJSON(serializedNode);
333
- }
334
322
  updateFromJSON(serializedNode) {
335
323
  return super.updateFromJSON(serializedNode).setHeight(serializedNode.height);
336
324
  }
337
- constructor(height, key) {
325
+ constructor(height = void 0, key) {
338
326
  super(key);
339
327
  this.__height = height;
340
328
  }
@@ -1003,6 +991,10 @@ function $computeTableCellRectSpans(map, boundary) {
1003
991
  topSpan
1004
992
  };
1005
993
  }
994
+ /**
995
+ * Compute the bounding rectangle of two table cells in a table map,
996
+ * expanding iteratively to include any merged cells that overlap the boundary.
997
+ */
1006
998
  function $computeTableCellRectBoundary(map, cellAMap, cellBMap) {
1007
999
  let minColumn = Math.min(cellAMap.startColumn, cellBMap.startColumn);
1008
1000
  let minRow = Math.min(cellAMap.startRow, cellBMap.startRow);
@@ -1375,6 +1367,7 @@ var TableSelection = class TableSelection {
1375
1367
  if (!$isElementNode(focusNode)) formatDevErrorMessage(`Expected TableSelection focus to be an ElementNode`);
1376
1368
  $normalizeSelection__EXPERIMENTAL(focusNode.select(0, focusNode.getChildrenSize())).insertNodes(nodes);
1377
1369
  }
1370
+ /** @deprecated Use {@link $computeTableMap} and {@link $computeTableCellRectBoundary} directly. */
1378
1371
  getShape() {
1379
1372
  const { anchorCell, focusCell } = $getCellNodes(this);
1380
1373
  const anchorCellNodeRect = $getTableCellNodeRect(anchorCell);
@@ -1442,12 +1435,23 @@ var TableSelection = class TableSelection {
1442
1435
  return textContent;
1443
1436
  }
1444
1437
  };
1438
+ /** Type guard for {@link TableSelection}. */
1445
1439
  function $isTableSelection(x) {
1446
1440
  return x instanceof TableSelection;
1447
1441
  }
1442
+ /** @deprecated Use {@link $createTableSelectionFrom} instead. */
1448
1443
  function $createTableSelection() {
1449
1444
  return new TableSelection("root", $createPoint("root", 0, "element"), $createPoint("root", 0, "element"));
1450
1445
  }
1446
+ /**
1447
+ * Creates a {@link TableSelection} spanning from `anchorCell` to `focusCell`
1448
+ * within `tableNode`. In `__DEV__` mode, validates that both cells belong to
1449
+ * the given table and that the table is attached to the editor state.
1450
+ *
1451
+ * If the current selection is already a TableSelection, it clones and
1452
+ * re-targets it (preserving identity for dirty-checking); otherwise it
1453
+ * constructs a fresh one.
1454
+ */
1451
1455
  function $createTableSelectionFrom(tableNode, anchorCell, focusCell) {
1452
1456
  const tableNodeKey = tableNode.getKey();
1453
1457
  const anchorCellKey = anchorCell.getKey();
@@ -1456,7 +1460,7 @@ function $createTableSelectionFrom(tableNode, anchorCell, focusCell) {
1456
1460
  if (!tableNode.is($findTableNode(anchorCell))) formatDevErrorMessage(`$createTableSelectionFrom: anchorCell ${anchorCellKey} is not in table ${tableNodeKey}`);
1457
1461
  if (!tableNode.is($findTableNode(focusCell))) formatDevErrorMessage(`$createTableSelectionFrom: focusCell ${focusCellKey} is not in table ${tableNodeKey}`);
1458
1462
  const prevSelection = $getSelection();
1459
- const nextSelection = $isTableSelection(prevSelection) ? prevSelection.clone() : $createTableSelection();
1463
+ const nextSelection = $isTableSelection(prevSelection) ? prevSelection.clone() : new TableSelection("root", $createPoint("root", 0, "element"), $createPoint("root", 0, "element"));
1460
1464
  nextSelection.set(tableNode.getKey(), anchorCell.getKey(), focusCell.getKey());
1461
1465
  return nextSelection;
1462
1466
  }
@@ -1680,7 +1684,7 @@ var TableObserver = class {
1680
1684
  $updateDOMForSelection(editor, getTable(tableNode, tableElement), null);
1681
1685
  if (setEmptySelection && $getSelection() !== null) {
1682
1686
  $setSelection(null);
1683
- editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
1687
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND);
1684
1688
  }
1685
1689
  }
1686
1690
  $enableHighlightStyle() {
@@ -1738,7 +1742,7 @@ var TableObserver = class {
1738
1742
  this.focusCellNodeKey = targetCellNode.getKey();
1739
1743
  this.tableSelection = $createTableSelectionFrom(tableNode, anchorTableCell, targetCellNode);
1740
1744
  $setSelection(this.tableSelection);
1741
- editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
1745
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND);
1742
1746
  $updateDOMForSelection(editor, this.table, this.tableSelection);
1743
1747
  return true;
1744
1748
  }
@@ -1800,7 +1804,7 @@ var TableObserver = class {
1800
1804
  formatSelection.formatText(type, alignFormatWith);
1801
1805
  });
1802
1806
  $setSelection(selection);
1803
- this.editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
1807
+ this.editor.dispatchCommand(SELECTION_CHANGE_COMMAND);
1804
1808
  }
1805
1809
  $clearText() {
1806
1810
  const { editor } = this;
@@ -1815,7 +1819,7 @@ var TableObserver = class {
1815
1819
  tableNode.selectPrevious();
1816
1820
  const parent = tableNode.getParent();
1817
1821
  tableNode.remove();
1818
- if ($isRootNode(parent) && parent.isEmpty()) editor.dispatchCommand(INSERT_PARAGRAPH_COMMAND, void 0);
1822
+ if ($isRootNode(parent) && parent.isEmpty()) editor.dispatchCommand(INSERT_PARAGRAPH_COMMAND);
1819
1823
  return;
1820
1824
  }
1821
1825
  selectedNodes.forEach((cellNode) => {
@@ -1831,7 +1835,7 @@ var TableObserver = class {
1831
1835
  });
1832
1836
  $updateDOMForSelection(editor, this.table, null);
1833
1837
  $setSelection(null);
1834
- editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
1838
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND);
1835
1839
  }
1836
1840
  };
1837
1841
  const LEXICAL_ELEMENT_KEY = "__lexicalTableSelection";
@@ -1893,7 +1897,7 @@ function registerTableWindowHandlers(editor, tableObservers) {
1893
1897
  if ($isTableSelection($getSelection())) {
1894
1898
  for (const [observer] of tableObservers.observers.values()) observer.$clearHighlight(false);
1895
1899
  $setSelection(null);
1896
- editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
1900
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND);
1897
1901
  }
1898
1902
  if (!selectionInfo) return;
1899
1903
  const { tableObserver, tableElement, cellElement } = selectionInfo;
@@ -1943,7 +1947,7 @@ function $handleTableClick(editor, event, selectedDOMCell, tableElement, tableOb
1943
1947
  override,
1944
1948
  tableKey: tableObserver.tableNodeKey
1945
1949
  });
1946
- editor.dispatchCommand(SELECTION_CHANGE_COMMAND, void 0);
1950
+ editor.dispatchCommand(SELECTION_CHANGE_COMMAND);
1947
1951
  }
1948
1952
  };
1949
1953
  const findScrollContainer = (axis) => {
@@ -2089,30 +2093,16 @@ function applyTableHandlers(tableNode, element, editor, hasTabHandler, tableObse
2089
2093
  }
2090
2094
  return false;
2091
2095
  }, COMMAND_PRIORITY_HIGH));
2092
- const deleteTextHandler = (command) => () => {
2096
+ const $deleteTextHandler = () => {
2093
2097
  const selection = $getSelection();
2094
2098
  if (!$isSelectionInTable(selection, tableNode)) return false;
2095
2099
  if ($isTableSelection(selection)) {
2096
2100
  tableObserver.$clearText();
2097
2101
  return true;
2098
- } else if ($isRangeSelection(selection)) {
2099
- if (!$isTableCellNode($findParentTableCellNodeInTable(tableNode, selection.anchor.getNode()))) return false;
2100
- const anchorNode = selection.anchor.getNode();
2101
- const focusNode = selection.focus.getNode();
2102
- const isAnchorInside = tableNode.isParentOf(anchorNode);
2103
- const isFocusInside = tableNode.isParentOf(focusNode);
2104
- if (isAnchorInside && !isFocusInside || isFocusInside && !isAnchorInside) {
2105
- tableObserver.$clearText();
2106
- return true;
2107
- }
2108
- const nearestElementNode = $findMatchingParent(selection.anchor.getNode(), (n) => $isElementNode(n));
2109
- const topLevelCellElementNode = nearestElementNode && $findMatchingParent(nearestElementNode, (n) => $isElementNode(n) && $isTableCellNode(n.getParent()));
2110
- if (!$isElementNode(topLevelCellElementNode) || !$isElementNode(nearestElementNode)) return false;
2111
- if (command === DELETE_LINE_COMMAND && topLevelCellElementNode.getPreviousSibling() === null) return true;
2112
2102
  }
2113
2103
  return false;
2114
2104
  };
2115
- for (const command of DELETE_TEXT_COMMANDS) tableObserver.listenersToRemove.add(editor.registerCommand(command, deleteTextHandler(command), COMMAND_PRIORITY_HIGH));
2105
+ for (const command of DELETE_TEXT_COMMANDS) tableObserver.listenersToRemove.add(editor.registerCommand(command, $deleteTextHandler, COMMAND_PRIORITY_HIGH));
2116
2106
  const $deleteCellHandler = (event) => {
2117
2107
  const selection = $getSelection();
2118
2108
  if (!($isTableSelection(selection) || $isRangeSelection(selection))) return false;
@@ -2179,8 +2169,6 @@ function applyTableHandlers(tableNode, element, editor, hasTabHandler, tableObse
2179
2169
  if ($isTableSelection(selection)) {
2180
2170
  tableObserver.$formatCells(payload);
2181
2171
  return true;
2182
- } else if ($isRangeSelection(selection)) {
2183
- if (!$isTableCellNode($findMatchingParent(selection.anchor.getNode(), (n) => $isTableCellNode(n)))) return false;
2184
2172
  }
2185
2173
  return false;
2186
2174
  }, COMMAND_PRIORITY_HIGH));
@@ -2190,15 +2178,15 @@ function applyTableHandlers(tableNode, element, editor, hasTabHandler, tableObse
2190
2178
  const anchorNode = selection.anchor.getNode();
2191
2179
  const focusNode = selection.focus.getNode();
2192
2180
  if (!$isTableCellNode(anchorNode) || !$isTableCellNode(focusNode)) return false;
2193
- if ($isFullTableSelection(selection, tableNode)) {
2194
- tableNode.setFormat(formatType);
2195
- return true;
2196
- }
2197
2181
  const [tableMap, anchorCell, focusCell] = $computeTableMap(tableNode, anchorNode, focusNode);
2198
2182
  const maxRow = Math.max(anchorCell.startRow + anchorCell.cell.__rowSpan - 1, focusCell.startRow + focusCell.cell.__rowSpan - 1);
2199
2183
  const maxColumn = Math.max(anchorCell.startColumn + anchorCell.cell.__colSpan - 1, focusCell.startColumn + focusCell.cell.__colSpan - 1);
2200
2184
  const minRow = Math.min(anchorCell.startRow, focusCell.startRow);
2201
2185
  const minColumn = Math.min(anchorCell.startColumn, focusCell.startColumn);
2186
+ if (minRow === 0 && minColumn === 0 && maxRow === tableMap.length - 1 && maxColumn === tableMap[0].length - 1) {
2187
+ tableNode.setFormat(formatType);
2188
+ return true;
2189
+ }
2202
2190
  const visited = /* @__PURE__ */ new Set();
2203
2191
  for (let i = minRow; i <= maxRow; i++) for (let j = minColumn; j <= maxColumn; j++) {
2204
2192
  const cell = tableMap[i][j].cell;
@@ -2627,17 +2615,6 @@ function $isSelectionInTable(selection, tableNode) {
2627
2615
  }
2628
2616
  return false;
2629
2617
  }
2630
- function $isFullTableSelection(selection, tableNode) {
2631
- if ($isTableSelection(selection)) {
2632
- const anchorNode = selection.anchor.getNode();
2633
- const focusNode = selection.focus.getNode();
2634
- if (tableNode && anchorNode && focusNode) {
2635
- const [map] = $computeTableMap(tableNode, anchorNode, focusNode);
2636
- return anchorNode.getKey() === map[0][0].cell.getKey() && focusNode.getKey() === map[map.length - 1].at(-1).cell.getKey();
2637
- }
2638
- }
2639
- return false;
2640
- }
2641
2618
  function selectTableCellNode(tableCell, fromStart) {
2642
2619
  if (fromStart) tableCell.selectStart();
2643
2620
  else tableCell.selectEnd();
@@ -2923,12 +2900,20 @@ function isHTMLDivElement(element) {
2923
2900
  return isHTMLElement(element) && element.nodeName === "DIV";
2924
2901
  }
2925
2902
  function $updateColgroup(dom, colCount, colWidths) {
2926
- const colGroup = dom.querySelector("colgroup");
2927
- if (!colGroup) return;
2903
+ let colGroup = dom.querySelector(":scope > colgroup");
2904
+ if (!colWidths) {
2905
+ if (colGroup) colGroup.remove();
2906
+ return;
2907
+ }
2908
+ if (!colGroup) {
2909
+ colGroup = $getDocument().createElement("colgroup");
2910
+ setDOMUnmanaged(colGroup);
2911
+ dom.insertBefore(colGroup, dom.firstChild);
2912
+ }
2928
2913
  const cols = [];
2929
2914
  for (let i = 0; i < colCount; i++) {
2930
2915
  const col = $getDocument().createElement("col");
2931
- const width = colWidths && colWidths[i];
2916
+ const width = colWidths[i];
2932
2917
  if (width) col.style.width = `${width}px`;
2933
2918
  cols.push(col);
2934
2919
  }
@@ -2973,10 +2958,115 @@ function alignTableElement(dom, config, formatType) {
2973
2958
  removeClassNamesFromElement(dom, ...removeClasses);
2974
2959
  addClassNamesToElement(dom, ...addClasses);
2975
2960
  }
2961
+ function $createScrollableWrapper(tableElement, config, hideNativeScrollbar) {
2962
+ const wrapper = $getDocument().createElement("div");
2963
+ const classes = config.theme.tableScrollableWrapper;
2964
+ if (classes) addClassNamesToElement(wrapper, classes);
2965
+ else wrapper.style.overflowX = "auto";
2966
+ if (hideNativeScrollbar) wrapper.style.scrollbarWidth = "none";
2967
+ wrapper.appendChild(tableElement);
2968
+ return wrapper;
2969
+ }
2970
+ function $createStickyScrollbar(config) {
2971
+ const doc = $getDocument();
2972
+ const scrollbar = doc.createElement("div");
2973
+ const classes = config.theme.tableStickyScrollbar;
2974
+ if (classes) addClassNamesToElement(scrollbar, classes);
2975
+ else {
2976
+ scrollbar.style.position = "sticky";
2977
+ scrollbar.style.bottom = "0";
2978
+ scrollbar.style.overflowX = "scroll";
2979
+ scrollbar.style.overflowY = "hidden";
2980
+ }
2981
+ scrollbar.style.display = "none";
2982
+ scrollbar.setAttribute("aria-hidden", "true");
2983
+ scrollbar.tabIndex = -1;
2984
+ const spacer = doc.createElement("div");
2985
+ spacer.style.height = "1px";
2986
+ spacer.style.width = "0px";
2987
+ scrollbar.appendChild(spacer);
2988
+ return scrollbar;
2989
+ }
2990
+ const overlayStickyScrollbars = /* @__PURE__ */ new WeakSet();
2991
+ function measureScrollbarThickness(scrollbar) {
2992
+ const prevDisplay = scrollbar.style.display;
2993
+ scrollbar.style.display = "";
2994
+ const thickness = scrollbar.offsetHeight - scrollbar.clientHeight;
2995
+ scrollbar.style.display = prevDisplay;
2996
+ return thickness;
2997
+ }
2998
+ function attachStickyScrollbarListeners(elements) {
2999
+ const { scrollable, scrollbar, tableElement } = elements;
3000
+ if (scrollbar.classList.length === 0 && measureScrollbarThickness(scrollbar) === 0) {
3001
+ overlayStickyScrollbars.add(scrollbar);
3002
+ scrollbar.style.display = "none";
3003
+ scrollable.style.scrollbarWidth = "auto";
3004
+ return () => {};
3005
+ }
3006
+ const onWrapperScroll = () => {
3007
+ if (scrollbar.scrollLeft !== scrollable.scrollLeft) scrollbar.scrollLeft = scrollable.scrollLeft;
3008
+ };
3009
+ const onScrollbarScroll = () => {
3010
+ if (scrollable.scrollLeft !== scrollbar.scrollLeft) scrollable.scrollLeft = scrollbar.scrollLeft;
3011
+ };
3012
+ scrollable.addEventListener("scroll", onWrapperScroll, { passive: true });
3013
+ scrollbar.addEventListener("scroll", onScrollbarScroll, { passive: true });
3014
+ let resizeObserver = null;
3015
+ if (typeof ResizeObserver !== "undefined") {
3016
+ resizeObserver = new ResizeObserver(() => {
3017
+ syncStickyScrollbar(scrollable, scrollbar);
3018
+ });
3019
+ resizeObserver.observe(scrollable);
3020
+ resizeObserver.observe(tableElement);
3021
+ }
3022
+ const cleanup = () => {
3023
+ scrollable.removeEventListener("scroll", onWrapperScroll);
3024
+ scrollbar.removeEventListener("scroll", onScrollbarScroll);
3025
+ if (resizeObserver) resizeObserver.disconnect();
3026
+ };
3027
+ syncStickyScrollbar(scrollable, scrollbar);
3028
+ return cleanup;
3029
+ }
3030
+ function syncStickyScrollbar(scrollable, scrollbar) {
3031
+ if (overlayStickyScrollbars.has(scrollbar)) return;
3032
+ const spacer = scrollbar.firstElementChild;
3033
+ if (!spacer || !isHTMLElement(spacer) || !scrollable.isConnected) return;
3034
+ const view = scrollable.ownerDocument.defaultView;
3035
+ if (!view) {
3036
+ scrollbar.style.display = "none";
3037
+ return;
3038
+ }
3039
+ const overflowX = view.getComputedStyle(scrollable).overflowX;
3040
+ const isScrollable = overflowX === "auto" || overflowX === "scroll";
3041
+ const scrollWidth = scrollable.scrollWidth;
3042
+ const clientWidth = scrollable.clientWidth;
3043
+ const spacerWidth = scrollWidth + "px";
3044
+ if (spacer.style.width !== spacerWidth) spacer.style.width = spacerWidth;
3045
+ const hasOverflow = isScrollable && scrollWidth > clientWidth;
3046
+ scrollbar.style.display = hasOverflow ? "" : "none";
3047
+ }
3048
+ function findStickyScrollbarElements(dom) {
3049
+ if (!dom.hasAttribute("data-lexical-sticky-scrollbar")) return null;
3050
+ const firstChild = dom.firstElementChild;
3051
+ if (!isHTMLDivElement(firstChild)) return null;
3052
+ const tableElement = firstChild.querySelector(":scope > table");
3053
+ if (!isHTMLTableElement(tableElement)) return null;
3054
+ const scrollbar = firstChild.nextElementSibling;
3055
+ if (!isHTMLDivElement(scrollbar)) return null;
3056
+ return {
3057
+ scrollable: firstChild,
3058
+ scrollbar,
3059
+ tableElement
3060
+ };
3061
+ }
2976
3062
  const scrollableEditors = /* @__PURE__ */ new WeakSet();
2977
3063
  function $isScrollableTablesActive(editor = $getEditor()) {
2978
3064
  return scrollableEditors.has(editor);
2979
3065
  }
3066
+ function $isStickyScrollbarActive(editor = $getEditor()) {
3067
+ const dep = getPeerDependencyFromEditor(editor, "@lexical/table/Table");
3068
+ return dep ? dep.output.hasStickyScrollbar.peek() && dep.output.hasHorizontalScroll.peek() : false;
3069
+ }
2980
3070
  function setScrollableTablesActive(editor, active) {
2981
3071
  if (active) {
2982
3072
  if (!editor._config.theme.tableScrollableWrapper) console.warn("TableNode: hasHorizontalScroll is active but theme.tableScrollableWrapper is not defined.");
@@ -2984,14 +3074,20 @@ function setScrollableTablesActive(editor, active) {
2984
3074
  } else scrollableEditors.delete(editor);
2985
3075
  }
2986
3076
  /** @noInheritDoc */
2987
- var TableNode = class TableNode extends ElementNode {
3077
+ var TableNode = class extends ElementNode {
2988
3078
  /** @internal */
2989
- __rowStriping;
2990
- __frozenColumnCount;
2991
- __frozenRowCount;
2992
- __colWidths;
2993
- static getType() {
2994
- return "table";
3079
+ __rowStriping = false;
3080
+ __frozenColumnCount = 0;
3081
+ __frozenRowCount = 0;
3082
+ __colWidths = void 0;
3083
+ $config() {
3084
+ return this.config("table", {
3085
+ extends: ElementNode,
3086
+ importDOM: { table: () => ({
3087
+ conversion: $convertTableElement,
3088
+ priority: 1
3089
+ }) }
3090
+ });
2995
3091
  }
2996
3092
  getColWidths() {
2997
3093
  return this.getLatest().__colWidths;
@@ -3001,9 +3097,6 @@ var TableNode = class TableNode extends ElementNode {
3001
3097
  self.__colWidths = colWidths !== void 0 && __DEV__ ? Object.freeze(colWidths) : colWidths;
3002
3098
  return self;
3003
3099
  }
3004
- static clone(node) {
3005
- return new TableNode(node.__key);
3006
- }
3007
3100
  afterCloneFrom(prevNode) {
3008
3101
  super.afterCloneFrom(prevNode);
3009
3102
  this.__colWidths = prevNode.__colWidths;
@@ -3011,25 +3104,9 @@ var TableNode = class TableNode extends ElementNode {
3011
3104
  this.__frozenColumnCount = prevNode.__frozenColumnCount;
3012
3105
  this.__frozenRowCount = prevNode.__frozenRowCount;
3013
3106
  }
3014
- static importDOM() {
3015
- return { table: (_node) => ({
3016
- conversion: $convertTableElement,
3017
- priority: 1
3018
- }) };
3019
- }
3020
- static importJSON(serializedNode) {
3021
- return $createTableNode().updateFromJSON(serializedNode);
3022
- }
3023
3107
  updateFromJSON(serializedNode) {
3024
3108
  return super.updateFromJSON(serializedNode).setRowStriping(serializedNode.rowStriping || false).setFrozenColumns(serializedNode.frozenColumnCount || 0).setFrozenRows(serializedNode.frozenRowCount || 0).setColWidths(serializedNode.colWidths);
3025
3109
  }
3026
- constructor(key) {
3027
- super(key);
3028
- this.__rowStriping = false;
3029
- this.__frozenColumnCount = 0;
3030
- this.__frozenRowCount = 0;
3031
- this.__colWidths = void 0;
3032
- }
3033
3110
  exportJSON() {
3034
3111
  return {
3035
3112
  ...super.exportJSON(),
@@ -3045,24 +3122,32 @@ var TableNode = class TableNode extends ElementNode {
3045
3122
  getDOMSlot(element) {
3046
3123
  const tableElement = !isHTMLTableElement(element) ? element.querySelector("table") : element;
3047
3124
  if (!isHTMLTableElement(tableElement)) formatDevErrorMessage(`TableNode.getDOMSlot: createDOM() did not return a table`);
3048
- return super.getDOMSlot(element).withElement(tableElement).withAfter(tableElement.querySelector("colgroup"));
3125
+ return super.getDOMSlot(element).withElement(tableElement).withAfter(tableElement.querySelector(":scope > colgroup"));
3049
3126
  }
3050
3127
  createDOM(config, editor) {
3051
3128
  const tableElement = $getDocument().createElement("table");
3052
3129
  if (this.__style) setDOMStyleFromCSS(tableElement.style, this.__style);
3053
- const colGroup = $getDocument().createElement("colgroup");
3054
- tableElement.appendChild(colGroup);
3055
- setDOMUnmanaged(colGroup);
3130
+ if (this.getColWidths()) {
3131
+ const colGroup = $getDocument().createElement("colgroup");
3132
+ tableElement.appendChild(colGroup);
3133
+ setDOMUnmanaged(colGroup);
3134
+ }
3056
3135
  addClassNamesToElement(tableElement, config.theme.table);
3057
3136
  this.updateTableElement(null, tableElement, config);
3058
3137
  if ($isScrollableTablesActive(editor)) {
3059
- const wrapperElement = $getDocument().createElement("div");
3060
- const classes = config.theme.tableScrollableWrapper;
3061
- if (classes) addClassNamesToElement(wrapperElement, classes);
3062
- else wrapperElement.style.overflowX = "auto";
3063
- wrapperElement.appendChild(tableElement);
3064
- this.updateTableWrapper(null, wrapperElement, tableElement, config);
3065
- return wrapperElement;
3138
+ const hasStickyScrollbar = $isStickyScrollbarActive(editor);
3139
+ const scrollableWrapper = $createScrollableWrapper(tableElement, config, hasStickyScrollbar);
3140
+ this.updateTableWrapper(null, scrollableWrapper, tableElement, config);
3141
+ if (hasStickyScrollbar) {
3142
+ const stickyScrollbar = $createStickyScrollbar(config);
3143
+ const outerWrapper = $getDocument().createElement("div");
3144
+ outerWrapper.setAttribute("data-lexical-sticky-scrollbar", "true");
3145
+ outerWrapper.appendChild(scrollableWrapper);
3146
+ outerWrapper.appendChild(stickyScrollbar);
3147
+ setDOMUnmanaged(stickyScrollbar);
3148
+ return outerWrapper;
3149
+ }
3150
+ return scrollableWrapper;
3066
3151
  }
3067
3152
  return tableElement;
3068
3153
  }
@@ -3081,7 +3166,11 @@ var TableNode = class TableNode extends ElementNode {
3081
3166
  updateDOM(prevNode, dom, config) {
3082
3167
  const tableElement = getTableElement(this, dom);
3083
3168
  if (dom === tableElement === $isScrollableTablesActive()) return true;
3084
- if (isHTMLDivElement(dom)) this.updateTableWrapper(prevNode, dom, tableElement, config);
3169
+ if (isHTMLDivElement(dom)) {
3170
+ if (dom.hasAttribute("data-lexical-sticky-scrollbar") !== $isStickyScrollbarActive()) return true;
3171
+ const scrollable = tableElement.parentElement;
3172
+ if (isHTMLDivElement(scrollable)) this.updateTableWrapper(prevNode, scrollable, tableElement, config);
3173
+ }
3085
3174
  this.updateTableElement(prevNode, tableElement, config);
3086
3175
  return false;
3087
3176
  }
@@ -3637,6 +3726,39 @@ const TableImportRules = [
3637
3726
  * LICENSE file in the root directory of this source tree.
3638
3727
  *
3639
3728
  */
3729
+ function registerStickyScrollbar(editor) {
3730
+ const attached = /* @__PURE__ */ new Map();
3731
+ const detachAll = () => {
3732
+ for (const { cleanup } of attached.values()) cleanup();
3733
+ attached.clear();
3734
+ };
3735
+ return mergeRegister(detachAll, editor.registerMutationListener(TableNode, (nodeMutations) => {
3736
+ for (const [nodeKey, mutation] of nodeMutations) {
3737
+ const prev = attached.get(nodeKey);
3738
+ if (mutation === "destroyed") {
3739
+ if (prev) {
3740
+ prev.cleanup();
3741
+ attached.delete(nodeKey);
3742
+ }
3743
+ continue;
3744
+ }
3745
+ const dom = editor.getElementByKey(nodeKey);
3746
+ const parts = dom && isHTMLElement(dom) ? findStickyScrollbarElements(dom) : null;
3747
+ if (prev && parts && prev.parts.scrollable === parts.scrollable && prev.parts.scrollbar === parts.scrollbar && prev.parts.tableElement === parts.tableElement) {
3748
+ syncStickyScrollbar(parts.scrollable, parts.scrollbar);
3749
+ continue;
3750
+ }
3751
+ if (prev) {
3752
+ prev.cleanup();
3753
+ attached.delete(nodeKey);
3754
+ }
3755
+ if (parts) attached.set(nodeKey, {
3756
+ cleanup: attachStickyScrollbarListeners(parts),
3757
+ parts
3758
+ });
3759
+ }
3760
+ }, { skipInitialization: false }));
3761
+ }
3640
3762
  /**
3641
3763
  * Configures {@link TableNode}, {@link TableRowNode}, {@link TableCellNode} and
3642
3764
  * registers table behaviors (see {@link TableConfig})
@@ -3650,6 +3772,7 @@ const TableExtension = /* @__PURE__ */ defineExtension({
3650
3772
  hasCellMerge: true,
3651
3773
  hasHorizontalScroll: true,
3652
3774
  hasNestedTables: false,
3775
+ hasStickyScrollbar: false,
3653
3776
  hasTabHandler: true
3654
3777
  }),
3655
3778
  dependencies: [CoreImportExtension, /* @__PURE__ */ configExtension(DOMImportExtension, { rules: TableImportRules })],
@@ -3661,13 +3784,19 @@ const TableExtension = /* @__PURE__ */ defineExtension({
3661
3784
  ],
3662
3785
  register(editor, config, state) {
3663
3786
  const stores = state.getOutput();
3787
+ let prevStickyScrollbar = false;
3664
3788
  return mergeRegister(effect(() => {
3665
3789
  const hasHorizontalScroll = stores.hasHorizontalScroll.value;
3666
- if ($isScrollableTablesActive(editor) !== hasHorizontalScroll) {
3667
- setScrollableTablesActive(editor, hasHorizontalScroll);
3668
- editor.update($fullReconcile);
3669
- }
3670
- }), registerTablePlugin(editor, stores), effect(() => registerTableSelectionObserver(editor, stores.hasTabHandler.value)), effect(() => stores.hasCellMerge.value ? void 0 : registerTableCellUnmergeTransform(editor)), effect(() => stores.hasCellBackgroundColor.value ? void 0 : editor.registerNodeTransform(TableCellNode, (node) => {
3790
+ const hasStickyScrollbar = stores.hasStickyScrollbar.value && hasHorizontalScroll;
3791
+ const hadHorizontalScroll = $isScrollableTablesActive(editor);
3792
+ if (hadHorizontalScroll !== hasHorizontalScroll) setScrollableTablesActive(editor, hasHorizontalScroll);
3793
+ if (hadHorizontalScroll !== hasHorizontalScroll || prevStickyScrollbar !== hasStickyScrollbar) editor.update($fullReconcile);
3794
+ prevStickyScrollbar = hasStickyScrollbar;
3795
+ }), registerTablePlugin(editor, stores), effect(() => registerTableSelectionObserver(editor, stores.hasTabHandler.value)), effect(() => {
3796
+ if (stores.hasStickyScrollbar.value && stores.hasHorizontalScroll.value) return editor.registerRootListener((rootElement) => {
3797
+ if (rootElement) return registerStickyScrollbar(editor);
3798
+ });
3799
+ }), effect(() => stores.hasCellMerge.value ? void 0 : registerTableCellUnmergeTransform(editor)), effect(() => stores.hasCellBackgroundColor.value ? void 0 : editor.registerNodeTransform(TableCellNode, (node) => {
3671
3800
  if (node.getBackgroundColor() !== null) node.setBackgroundColor(null);
3672
3801
  })));
3673
3802
  }
@@ -3686,4 +3815,4 @@ const TableImportExtension = /* @__PURE__ */ defineExtension({
3686
3815
  name: "@lexical/table/Import"
3687
3816
  });
3688
3817
  //#endregion
3689
- export { $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, $insertTableColumnAtNode, $insertTableColumnAtSelection, $insertTableColumn__EXPERIMENTAL, $insertTableRow, $insertTableRowAtNode, $insertTableRowAtSelection, $insertTableRow__EXPERIMENTAL, $isScrollableTablesActive, $isSimpleTable, $isTableCellNode, $isTableNode, $isTableRowNode, $isTableSelection, $mergeCells, $moveTableColumn, $moveTableRow, $removeTableRowAtIndex, $setTableColumnIsHeader, $setTableRowIsHeader, $unmergeCell, $unmergeCellNode, INSERT_TABLE_COMMAND, TableCellHeaderStates, TableCellNode, TableExtension, TableImportExtension, TableImportRules, TableNode, TableObserver, TableRowNode, TableRowSchema, TableSchema, applyTableHandlers, getDOMCellFromTarget, getTableElement, getTableObserverFromTableElement, registerTableCellUnmergeTransform, registerTablePlugin, registerTableSelectionObserver, setScrollableTablesActive };
3818
+ export { $computeTableCellRectBoundary, $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, $insertTableColumnAtNode, $insertTableColumnAtSelection, $insertTableColumn__EXPERIMENTAL, $insertTableRow, $insertTableRowAtNode, $insertTableRowAtSelection, $insertTableRow__EXPERIMENTAL, $isScrollableTablesActive, $isSimpleTable, $isStickyScrollbarActive, $isTableCellNode, $isTableNode, $isTableRowNode, $isTableSelection, $mergeCells, $moveTableColumn, $moveTableRow, $removeTableRowAtIndex, $setTableColumnIsHeader, $setTableRowIsHeader, $unmergeCell, $unmergeCellNode, INSERT_TABLE_COMMAND, TableCellHeaderStates, TableCellNode, TableExtension, TableImportExtension, TableImportRules, TableNode, TableObserver, TableRowNode, TableRowSchema, TableSchema, applyTableHandlers, getDOMCellFromTarget, getTableElement, getTableObserverFromTableElement, registerTableCellUnmergeTransform, registerTablePlugin, registerTableSelectionObserver, setScrollableTablesActive };