@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.
- package/LICENSE +33 -0
- package/README.md +35 -11
- package/dist/{Lexical.dev-CtGmYDoh.mjs → Lexical.dev-Cck4n26y.mjs} +240 -325
- package/dist/{Lexical.node-8sRFmq2X.mjs → Lexical.node-D6wf2D5M.mjs} +2 -2
- package/dist/{Lexical.prod-D-VfeKDz.mjs → Lexical.prod-DCwS1oTq.mjs} +1753 -1783
- package/dist/{LexicalClipboard.dev-CzQ15z6E.mjs → LexicalClipboard.dev-CMkPHV7O.mjs} +6 -6
- package/dist/{LexicalClipboard.node-D4gMGws6.mjs → LexicalClipboard.node-m4nZ7IYw.mjs} +2 -2
- package/dist/{LexicalClipboard.prod-CltkQpzS.mjs → LexicalClipboard.prod-B_rN1vE1.mjs} +6 -6
- package/dist/{LexicalCodeCore.dev-DkYBZRGB.mjs → LexicalCodeCore.dev-DyJw3i8V.mjs} +56 -68
- package/dist/{LexicalCodeCore.prod-COc3_QL8.mjs → LexicalCodeCore.prod-DPXLHQLF.mjs} +144 -156
- package/dist/{LexicalDragon.dev-Dv5_WUae.mjs → LexicalDragon.dev-ZkNfMwrE.mjs} +3 -3
- package/dist/{LexicalDragon.node-DgjrmWkd.mjs → LexicalDragon.node-Ds9oLUFh.mjs} +2 -2
- package/dist/{LexicalDragon.prod-DnpbDe-_.mjs → LexicalDragon.prod-B58ic2av.mjs} +3 -3
- package/dist/{LexicalExtension.dev-JMH_6-OZ.mjs → LexicalExtension.dev-DvwHs1Xv.mjs} +10 -19
- package/dist/{LexicalExtension.node-BUozzx4t.mjs → LexicalExtension.node-5OymZQfy.mjs} +2 -2
- package/dist/{LexicalExtension.prod-UiyDgmou.mjs → LexicalExtension.prod-Ce0T5smQ.mjs} +73 -82
- package/dist/{LexicalHeadless.dev-BfLGciiX.mjs → LexicalHeadless.dev-DA0WldSR.mjs} +2 -2
- package/dist/{LexicalHeadless.prod-CWF7edmQ.mjs → LexicalHeadless.prod-1kQgKB6c.mjs} +2 -2
- package/dist/{LexicalHtml.dev-D5EF5PGW.mjs → LexicalHtml.dev-BDB7CUrx.mjs} +6 -6
- package/dist/{LexicalHtml.node-BYbzHNVe.mjs → LexicalHtml.node-DpVNt7It.mjs} +2 -2
- package/dist/{LexicalHtml.prod-D_FfkvVD.mjs → LexicalHtml.prod-HkxM5scw.mjs} +6 -6
- package/dist/{LexicalLink.dev-D3Pgh6ik.mjs → LexicalLink.dev-C5zNJlrm.mjs} +17 -41
- package/dist/{LexicalLink.prod-XZoAYVYD.mjs → LexicalLink.prod-Bkt9hQAt.mjs} +113 -137
- package/dist/{LexicalList.dev-B5d3ObhB.mjs → LexicalList.dev-B7VgME-m.mjs} +15 -47
- package/dist/{LexicalList.prod-OQDpVAEb.mjs → LexicalList.prod-B8c7TDjH.mjs} +208 -224
- package/dist/{LexicalMarkdown.dev-BkM8G3DG.mjs → LexicalMarkdown.dev-B5z9kLbV.mjs} +5 -4
- package/dist/{LexicalMarkdown.prod-DcVXCex6.mjs → LexicalMarkdown.prod-wKzw7FFH.mjs} +5 -4
- package/dist/{LexicalRichText.dev-DppD7IrA.mjs → LexicalRichText.dev-CUd6Li5F.mjs} +76 -82
- package/dist/{LexicalRichText.node-CPSn7dkg.mjs → LexicalRichText.node-BKfaQ-CH.mjs} +8 -8
- package/dist/{LexicalRichText.prod-h7JPxFNp.mjs → LexicalRichText.prod-SBewjJHx.mjs} +86 -96
- package/dist/{LexicalSelection.dev-CD0SLbxP.mjs → LexicalSelection.dev-D27JOCqj.mjs} +2 -2
- package/dist/{LexicalSelection.node-CGlJgUlZ.mjs → LexicalSelection.node-DBEwPjBu.mjs} +2 -2
- package/dist/{LexicalSelection.prod-DbVZN5AV.mjs → LexicalSelection.prod-OaYhXHOL.mjs} +2 -2
- package/dist/{LexicalTable.dev-D0HU14UV.mjs → LexicalTable.dev-6IFFOAE0.mjs} +260 -131
- package/dist/{LexicalTable.prod-BcPNSrxP.mjs → LexicalTable.prod-2CaLZ7fH.mjs} +686 -630
- package/dist/{LexicalUtils.dev-iKy_TrRT.mjs → LexicalUtils.dev-DJA7J_7v.mjs} +3 -3
- package/dist/{LexicalUtils.node-CIgMS8cG.mjs → LexicalUtils.node-Df9oPTlA.mjs} +2 -2
- package/dist/{LexicalUtils.prod-DIAsKJzu.mjs → LexicalUtils.prod-Bb7V4Ewg.mjs} +3 -3
- package/dist/bin/mxs.mjs +1 -1
- package/dist/esm-CDcJmHkG.mjs +2 -0
- package/dist/{esm-CwXl1N0a.mjs → esm-DLzrv7gD.mjs} +165 -131
- package/dist/index.d.mts +16 -16
- package/dist/index.mjs +1 -1
- package/dist/{mxs-iW9DgqSZ.mjs → mxs-BIRW5Axj.mjs} +1434 -2233
- package/dist/vendor/litexml/cli.mjs +2462 -2557
- package/dist/vendor/litexml/litexml-html-preview-client.css +80 -47
- package/dist/vendor/litexml/litexml-html-preview-client.js +5276 -4906
- package/dist/vendor/litexml/style.css +6 -2
- package/package.json +31 -32
- package/skills/commands-ai.md +45 -12
- package/skills/overview.md +1 -1
- 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-
|
|
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-
|
|
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-
|
|
4
|
-
import { d as $unwrapAndFilterDescendants, m as objectKlassEquals, n as $dfs, o as $insertFirst$1, s as $insertNodeToNearestRoot, t as $descendantsMatching } from "./LexicalUtils.node-
|
|
5
|
-
import { o as copyToClipboard, t as $getClipboardDataFromSelection } from "./LexicalClipboard.node-
|
|
6
|
-
//#region ../../node_modules/.pnpm/@lexical+table@0.
|
|
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
|
|
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
|
-
|
|
51
|
-
return "tablecell"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
306
|
+
var TableRowNode = class extends ElementNode {
|
|
313
307
|
/** @internal */
|
|
314
308
|
__height;
|
|
315
|
-
|
|
316
|
-
return "tablerow"
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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() : $
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 = (
|
|
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
|
|
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
|
-
|
|
2927
|
-
if (!
|
|
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
|
|
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
|
|
3077
|
+
var TableNode = class extends ElementNode {
|
|
2988
3078
|
/** @internal */
|
|
2989
|
-
__rowStriping;
|
|
2990
|
-
__frozenColumnCount;
|
|
2991
|
-
__frozenRowCount;
|
|
2992
|
-
__colWidths;
|
|
2993
|
-
|
|
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
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
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
|
|
3060
|
-
const
|
|
3061
|
-
|
|
3062
|
-
|
|
3063
|
-
|
|
3064
|
-
|
|
3065
|
-
|
|
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))
|
|
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
|
-
|
|
3667
|
-
|
|
3668
|
-
|
|
3669
|
-
|
|
3670
|
-
|
|
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 };
|