@lexical/table 0.1.14 → 0.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict
8
+ */
9
+
10
+ import type {
11
+ EditorConfig,
12
+ LexicalNode,
13
+ NodeKey,
14
+ ParagraphNode,
15
+ RangeSelection,
16
+ LexicalEditor,
17
+ TextFormatType,
18
+ LexicalCommand,
19
+ } from 'lexical';
20
+
21
+ import {ElementNode} from 'lexical';
22
+
23
+ /**
24
+ * LexicalTableCellNode
25
+ */
26
+
27
+ export const TableCellHeaderStates = {
28
+ NO_STATUS: 0,
29
+ ROW: 1,
30
+ COLUMN: 2,
31
+ BOTH: 3,
32
+ };
33
+
34
+ export type TableCellHeaderState = $Values<typeof TableCellHeaderStates>;
35
+
36
+ declare export class TableCellNode extends ElementNode {
37
+ static getType(): string;
38
+ static clone(node: TableCellNode): TableCellNode;
39
+ constructor(
40
+ headerState?: TableCellHeaderState,
41
+ colSpan?: number,
42
+ width?: ?number,
43
+ key?: NodeKey,
44
+ ): void;
45
+ __headerState: TableCellHeaderState;
46
+ createDOM<EditorContext>(config: EditorConfig<EditorContext>): HTMLElement;
47
+ updateDOM(prevNode: TableCellNode, dom: HTMLElement): boolean;
48
+ insertNewAfter(
49
+ selection: RangeSelection,
50
+ ): null | ParagraphNode | TableCellNode;
51
+ canInsertTab(): true;
52
+ collapseAtStart(): true;
53
+ getTag(): string;
54
+ setHeaderStyles(headerState: TableCellHeaderState): TableCellHeaderState;
55
+ getHeaderStyles(): TableCellHeaderState;
56
+ setWidth(width: number): ?number;
57
+ getWidth(): ?number;
58
+ toggleHeaderStyle(headerState: TableCellHeaderState): TableCellNode;
59
+ hasHeader(): boolean;
60
+ updateDOM(prevNode: TableCellNode): boolean;
61
+ collapseAtStart(): true;
62
+ canBeEmpty(): false;
63
+ }
64
+ declare export function $createTableCellNode(
65
+ headerState: TableCellHeaderState,
66
+ colSpan?: number,
67
+ width?: ?number,
68
+ ): TableCellNode;
69
+ declare export function $isTableCellNode(
70
+ node: ?LexicalNode,
71
+ ): boolean %checks(node instanceof TableCellNode);
72
+
73
+ /**
74
+ * LexicalTableNode
75
+ */
76
+
77
+ declare export class TableNode extends ElementNode {
78
+ static getType(): string;
79
+ static clone(node: TableNode): TableNode;
80
+ constructor(grid: ?Grid, key?: NodeKey): void;
81
+ createDOM<EditorContext>(config: EditorConfig<EditorContext>): HTMLElement;
82
+ updateDOM(prevNode: TableNode, dom: HTMLElement): boolean;
83
+ insertNewAfter(selection: RangeSelection): null | ParagraphNode | TableNode;
84
+ canInsertTab(): true;
85
+ collapseAtStart(): true;
86
+ getCordsFromCellNode(
87
+ tableCellNode: TableCellNode,
88
+ grid: Grid,
89
+ ): {x: number, y: number};
90
+ getCellFromCords(x: number, y: number, grid: Grid): ?Cell;
91
+ getCellFromCordsOrThrow(x: number, y: number, grid: Grid): Cell;
92
+ getCellNodeFromCords(x: number, y: number, grid: Grid): ?TableCellNode;
93
+ getCellNodeFromCordsOrThrow(x: number, y: number, grid: Grid): TableCellNode;
94
+ setGrid(grid: ?Grid): TableNode;
95
+ getGrid(): ?Grid;
96
+ canSelectBefore(): true;
97
+ }
98
+ declare export function $createTableNode(): TableNode;
99
+ declare export function $isTableNode(
100
+ node: ?LexicalNode,
101
+ ): boolean %checks(node instanceof TableNode);
102
+
103
+ /**
104
+ * LexicalTableRowNode
105
+ */
106
+
107
+ declare export class TableRowNode extends ElementNode {
108
+ static getType(): string;
109
+ static clone(node: TableRowNode): TableRowNode;
110
+ constructor(height?: ?number, key?: NodeKey): void;
111
+ createDOM<EditorContext>(config: EditorConfig<EditorContext>): HTMLElement;
112
+ updateDOM(prevNode: TableRowNode, dom: HTMLElement): boolean;
113
+ setHeight(height: number): ?number;
114
+ getHeight(): ?number;
115
+ insertNewAfter(
116
+ selection: RangeSelection,
117
+ ): null | ParagraphNode | TableRowNode;
118
+ canInsertTab(): true;
119
+ collapseAtStart(): true;
120
+ }
121
+ declare export function $createTableRowNode(): TableRowNode;
122
+ declare export function $isTableRowNode(
123
+ node: ?LexicalNode,
124
+ ): boolean %checks(node instanceof TableRowNode);
125
+
126
+ /**
127
+ * LexicalTableSelectionHelpers
128
+ */
129
+
130
+ export type Cell = {
131
+ elem: HTMLElement,
132
+ highlighted: boolean,
133
+ x: number,
134
+ y: number,
135
+ };
136
+
137
+ export type Cells = Array<Array<Cell>>;
138
+
139
+ export type Grid = {
140
+ cells: Cells,
141
+ columns: number,
142
+ rows: number,
143
+ };
144
+
145
+ declare export function applyTableHandlers(
146
+ tableNode: TableNode,
147
+ tableElement: HTMLElement,
148
+ editor: LexicalEditor,
149
+ ): TableSelection;
150
+
151
+ declare export function $getElementGridForTableNode(
152
+ editor: LexicalEditor,
153
+ tableNode: TableNode,
154
+ ): Grid;
155
+
156
+ declare export function getTableSelectionFromTableElement(
157
+ tableElement: HTMLElement,
158
+ ): TableSelection;
159
+
160
+ declare export function getCellFromTarget(node: Node): Cell | null;
161
+
162
+ /**
163
+ * LexicalTableUtils
164
+ */
165
+
166
+ declare export function $createTableNodeWithDimensions(
167
+ rowCount: number,
168
+ columnCount: number,
169
+ includeHeaders?: boolean,
170
+ ): TableNode;
171
+
172
+ declare export function $getTableCellNodeFromLexicalNode(
173
+ startingNode: LexicalNode,
174
+ ): TableCellNode | null;
175
+
176
+ declare export function $getTableRowNodeFromTableCellNodeOrThrow(
177
+ startingNode: LexicalNode,
178
+ ): TableRowNode;
179
+
180
+ declare export function $getTableNodeFromLexicalNodeOrThrow(
181
+ startingNode: LexicalNode,
182
+ ): TableNode;
183
+
184
+ declare export function $getTableRowIndexFromTableCellNode(
185
+ tableCellNode: TableCellNode,
186
+ ): number;
187
+
188
+ declare export function $getTableColumnIndexFromTableCellNode(
189
+ tableCellNode: TableCellNode,
190
+ ): number;
191
+
192
+ declare export function $removeTableRowAtIndex(
193
+ tableNode: TableNode,
194
+ indexToDelete: number,
195
+ ): TableNode;
196
+
197
+ declare export function $insertTableRow(
198
+ tableNode: TableNode,
199
+ targetIndex: number,
200
+ shouldInsertAfter?: boolean,
201
+ rowCount: number,
202
+ grid: Grid,
203
+ ): TableNode;
204
+
205
+ declare export function $insertTableColumn(
206
+ tableNode: TableNode,
207
+ targetIndex: number,
208
+ shouldInsertAfter?: boolean,
209
+ columnCount: number,
210
+ ): TableNode;
211
+
212
+ declare export function $deleteTableColumn(
213
+ tableNode: TableNode,
214
+ targetIndex: number,
215
+ ): TableNode;
216
+
217
+ /**
218
+ * LexicalTableSelection.js
219
+ */
220
+ declare export class TableSelection {
221
+ currentX: number;
222
+ currentY: number;
223
+ listenersToRemove: Set<() => void>;
224
+ domListeners: Set<() => void>;
225
+ grid: Grid;
226
+ isHighlightingCells: boolean;
227
+ isMouseDown: boolean;
228
+ startX: number;
229
+ startY: number;
230
+ nodeKey: string;
231
+ editor: LexicalEditor;
232
+ constructor(editor: LexicalEditor, nodeKey: string): void;
233
+ getGrid(): Grid;
234
+ removeListeners(): void;
235
+ trackTableGrid(): void;
236
+ clearHighlight(): void;
237
+ adjustFocusCellForSelection(cell: Cell): void;
238
+ setAnchorCellForSelection(cell: Cell): void;
239
+ formatCells(type: TextFormatType): void;
240
+ clearText(): void;
241
+ }
242
+
243
+ declare export var INSERT_TABLE_COMMAND: LexicalCommand<{
244
+ rows: string,
245
+ columns: string,
246
+ }>;
@@ -4,30 +4,45 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- var q=require("lexical");function z(a,...b){b.forEach(c=>{null!=c&&"string"===typeof c&&a.classList.add(...c.split(" "))})}
8
- class C extends q.GridCellNode{static getType(){return"tablecell"}static clone(a){return new C(new Set(a.__headerStyles),a.__colSpan,a.__key)}constructor(a,b=1,c){super(b,c);this.__headerStyles=a||new Set}createDOM(a){const b=document.createElement(this.getTag());z(b,a.theme.tableCell,this.hasHeader()&&a.theme.TableCellHeaderStyles);return b}getTag(){return this.hasHeader()?"th":"td"}setHeaderStyles(a){this.getWritable().__headerStyles=new Set(a);return this.__headerStyles}getHeaderStyles(){return this.getLatest().__headerStyles}toggleHeaderStyle(a){const b=
9
- this.getWritable(),c=b.getHeaderStyles();c.has(a)?c.delete(a):c.add(a);b.__headerStyles=new Set(c);return b}hasHeader(){return 0<this.getLatest().__headerStyles.size}updateDOM(a){return a.__headerStyles.size!==this.__headerStyles.size}collapseAtStart(){return!0}canBeEmpty(){return!1}}function D(a){return new C(a)}function E(a){return a instanceof C}function F(a,b){for(;a!==q.$getRoot()&&null!=a;){if(b(a))return a;a=a.getParent()}return null}const G=document.createElement("style");G.appendChild(document.createTextNode("::selection{background-color: transparent}"));
10
- function H(a){for(;null!=a;){const b=a.nodeName;if("TD"===b||"TH"===b){a=a._cell;if(void 0===a)break;return a}a=a.parentNode}return null}
11
- function I(a,b,c){const p=[],d={cells:p,columns:0,rows:0},h=()=>{var e=b.firstChild;let n=0,k=0;for(p.length=0;null!=e;){var f=e.nodeName;if("TD"===f||"TH"===f)f={elem:e,highlighted:!1,x:n,y:k},e._cell=f,void 0===p[k]&&(p[k]=[]),p[k][n]=f;else if(f=e.firstChild,null!=f){e=f;continue}f=e.nextSibling;if(null!=f)n++,e=f;else if(f=e.parentNode,null!=f){e=f.nextSibling;if(null==e)break;k++;n=0}}d.columns=n+1;d.rows=k+1;a.setGrid(d)};(new MutationObserver(e=>{c.update(()=>{let n=!1;for(let k=0;k<e.length;k++){const f=
12
- e[k].target.nodeName;if("TABLE"===f||"TR"===f){n=!0;break}}n&&h()})})).observe(b,{childList:!0,subtree:!0});h();return d}
13
- function J(a,b,c,p,d){const h=[];for(let e=0;e<d.length;e++){const n=d[e];for(let k=0;k<n.length;k++){const f=n[k],r=f.elem.style;k>=a&&k<=b&&e>=c&&e<=p?(f.highlighted||(f.highlighted=!0,r.setProperty("background-color","rgb(163, 187, 255)"),r.setProperty("caret-color","transparent")),h.push(f)):f.highlighted&&(f.highlighted=!1,r.removeProperty("background-color"),r.removeProperty("caret-color"),f.elem.getAttribute("style")||f.elem.removeAttribute("style"))}}return h}
14
- function K(a){throw Error(`Minified Lexical error #${a}; see codes.json for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}
15
- class L extends q.GridNode{static getType(){return"table"}static clone(a){return new L(a.__selectionShape,a.__grid,a.__key)}constructor(a,b,c){super(c);this.__selectionShape=a;this.__grid=b}createDOM(a){const b=document.createElement("table");z(b,a.theme.table);return b}updateDOM(){return!1}canExtractContents(){return!1}canBeEmpty(){return!1}setSelectionState(a){this.getWritable().__selectionShape=a;const b=this.getGrid();return null==b?[]:a?J(a.fromX,a.toX,a.fromY,a.toY,b.cells):J(-1,-1,-1,-1,b.cells)}getSelectionState(){return this.getLatest().__selectionShape}getCordsFromCellNode(a){var b=
16
- this.getGrid();b||K(55);const {rows:c,cells:p}=b;for(b=0;b<c;b++){var d=p[b];if(null==d)throw Error(`Row not found at y:${b}`);d=d.findIndex(({elem:h})=>q.$getNearestNodeFromDOMNode(h)===a);if(-1!==d)return{x:d,y:b}}throw Error("Cell not found in table.");}getCellNodeFromCords(a,b){var c=this.getGrid();c||K(55);({cells:c}=c);b=c[b];if(null==b)return null;a=b[a];if(null==a)return null;a=q.$getNearestNodeFromDOMNode(a.elem);return E(a)?a:null}getCellNodeFromCordsOrThrow(a,b){a=this.getCellNodeFromCords(a,
17
- b);if(!a)throw Error("Node at cords not TableCellNode.");return a}setGrid(a){const b=this.getWritable();b.__grid=a;return b}getGrid(){return this.getLatest().__grid}canSelectBefore(){return!0}}function M(){return new L}function N(a){return a instanceof L}
18
- class P extends q.GridRowNode{static getType(){return"tablerow"}static clone(a){return new P(a.__key)}constructor(a){super(a)}createDOM(a){const b=document.createElement("tr");z(b,a.theme.tableRow);return b}updateDOM(){return!1}canBeEmpty(){return!1}}function Q(){return new P}function R(a){return a instanceof P}function S(a){a=F(a,b=>R(b));if(R(a))return a;throw Error("Expected table cell to be inside of table row.");}
19
- function V(a){a=F(a,b=>N(b));if(N(a))return a;throw Error("Expected table cell to be inside of table.");}
20
- exports.$applyCustomTableHandlers=function(a,b,c){const p=c.getRootElement();if(null===p)throw Error("No root element.");I(a,b,c);const d=a.getGrid();let h=!1,e=!1,n=-1,k=-1,f=-1,r=-1,u=[];const y=new Set;let x=null;if(null==d)throw Error("Table grid not found.");b.addEventListener("mousemove",l=>{if(h){var g=H(l.target);if(null!==g){const m=g.x;g=g.y;if(!e&&(n!==m||k!==g)){l.preventDefault();l=window.getSelection();const t=l.anchorNode;null!==t&&l.setBaseAndExtent(t,0,t,0);e=!0;document.body&&document.body.appendChild(G);
21
- null===x&&(x=c.addListener("command",(w,v)=>{if("deleteCharacter"===w){if(u.length===d.columns*d.rows)return a.selectPrevious(),a.remove(),A(),!0;u.forEach(({elem:B})=>{B=q.$getNearestNodeFromDOMNode(B);if(q.$isElementNode(B)){const O=q.$createParagraphNode(),W=q.$createTextNode();O.append(W);B.append(O);B.getChildren().forEach(T=>{T!==O&&T.remove()})}});a.setSelectionState(null);q.$setSelection(null);return!0}if("formatText"===w)return X(v),!0;"insertText"===w&&A();return!1},1),y.add(x))}else if(m===
22
- f&&g===r)return;f=m;r=g;if(e){const t=Math.min(n,f),w=Math.max(n,f),v=Math.min(k,r),B=Math.max(k,r);c.update(()=>{u=a.setSelectionState({fromX:t,fromY:v,toX:w,toY:B})})}}}});const A=()=>{c.update(()=>{h=e=!1;r=f=k=n=-1;c.update(()=>{a.setSelectionState(null)});u=[];null!==x&&(x(),x=null,y.delete(x));const l=G.parentNode;null!=l&&l.removeChild(G)})};b.addEventListener("mouseleave",()=>{});const X=l=>{let g=q.$getSelection();q.$isRangeSelection(g)||(g=q.$createRangeSelection());const m=g,t=m.anchor,
23
- w=m.focus;u.forEach(v=>{v=q.$getNearestNodeFromDOMNode(v.elem);q.$isElementNode(v)&&0!==v.getTextContentSize()&&(t.set(v.getKey(),0,"element"),w.set(v.getKey(),v.getChildrenSize(),"element"),m.formatText(l))});g.anchor.set(g.anchor.key,g.anchor.offset,g.anchor.type);g.focus.set(g.anchor.key,g.anchor.offset,g.anchor.type);q.$setSelection(g)};b.addEventListener("mousedown",l=>{h?e&&A():setTimeout(()=>{e&&A();const g=H(l.target);null!==g&&(h=!0,n=g.x,k=g.y,document.addEventListener("mouseup",()=>{h=
24
- !1},{capture:!0,once:!0}))},0)});window.addEventListener("click",l=>{0<u.length&&!b.contains(l.target)&&p.contains(l.target)&&c.update(()=>{a.setSelectionState(null)})});const U=(l,g,m)=>{switch(m){case "backward":case "forward":return m="forward"===m,l!==(m?d.columns-1:0)?a.getCellNodeFromCordsOrThrow(l+(m?1:-1),g).select():g!==(m?d.rows-1:0)?a.getCellNodeFromCordsOrThrow(m?0:d.columns-1,g+(m?1:-1)).select():m?a.selectNext():a.selectPrevious(),!0;case "up":return 0!==g?a.getCellNodeFromCordsOrThrow(l,
25
- g-1).select():a.selectPrevious(),!0;case "down":return g!==d.rows-1?a.getCellNodeFromCordsOrThrow(l,g+1).select():a.selectNext(),!0}return!1},Y=c.addListener("command",(l,g)=>{var m=q.$getSelection();if(!q.$isRangeSelection(m))return!1;var t=F(m.anchor.getNode(),w=>E(w));if(!E(t))return!1;if("deleteCharacter"===l&&0===u.length&&m.isCollapsed()&&0===m.anchor.offset&&0===m.anchor.getNode().getPreviousSiblings().length)return!0;if("keyTab"===l&&m.isCollapsed()&&0===u.length)return t=a.getCordsFromCellNode(t),
26
- g.preventDefault(),U(t.x,t.y,g.shiftKey||"keyTab"!==l?"backward":"forward"),!0;if(("keyArrowDown"===l||"keyArrowUp"===l)&&m.isCollapsed()&&0===u.length){const w=a.getCordsFromCellNode(t);m=F(m.anchor.getNode(),v=>q.$isElementNode(v));if("keyArrowUp"===l&&m===t.getFirstChild()||"keyArrowDown"===l&&m===t.getLastChild())return g.preventDefault(),g.stopImmediatePropagation(),U(w.x,w.y,"keyArrowUp"===l?"up":"down"),!0}return!1},4);y.add(Y);return()=>Array.from(y).forEach(l=>l?l():null)};
27
- exports.$createTableCellNode=D;exports.$createTableNode=M;exports.$createTableNodeWithDimensions=function(a,b,c=!0){const p=M();for(let h=0;h<a;h++){const e=Q();for(let n=0;n<b;n++){var d=new Set;c&&(0===h&&d.add("row"),0===n&&d.add("column"));d=D(d);const k=q.$createParagraphNode();k.append(q.$createTextNode());d.append(k);e.append(d)}p.append(e)}return p};exports.$createTableRowNode=Q;
28
- exports.$deleteTableColumn=function(a,b){const c=a.getChildren();for(let d=0;d<c.length;d++){var p=c[d];if(R(p)){p=p.getChildren();if(b>=p.length||0>b)throw Error("Table column target index out of range");p[b].remove()}}return a};exports.$getTableCellNodeFromLexicalNode=function(a){a=F(a,b=>E(b));return E(a)?a:null};exports.$getTableColumnIndexFromTableCellNode=function(a){return S(a).getChildren().findIndex(b=>b.is(a))};exports.$getTableNodeFromLexicalNodeOrThrow=V;
29
- exports.$getTableRowIndexFromTableCellNode=function(a){const b=S(a);return V(b).getChildren().findIndex(c=>c.is(b))};exports.$getTableRowNodeFromTableCellNodeOrThrow=S;
30
- exports.$insertTableColumn=function(a,b,c=!0,p){const d=a.getChildren();for(let n=0;n<d.length;n++){const k=d[n];if(R(k))for(let f=0;f<p;f++){var h=new Set;0===n&&h.add("row");h=D(h);h.append(q.$createParagraphNode());var e=k.getChildren();if(b>=e.length||0>b)throw Error("Table column target index out of range");e=e[b];c?e.insertAfter(h):e.insertBefore(h)}}return a};
31
- exports.$insertTableRow=function(a,b,c=!0,p){var d=a.getChildren();if(b>=d.length||0>b)throw Error("Table row target index out of range");b=d[b];if(R(b))for(d=0;d<p;d++){const e=b.getChildren(),n=e.length,k=Q();for(let f=0;f<n;f++){var h=e[f];if(!E(h))throw Error("Expected table cell");const r=V(h),{x:u,y}=r.getCordsFromCellNode(h);h={above:r.getCellNodeFromCords(u,y-1),below:r.getCellNodeFromCords(u,y+1),left:r.getCellNodeFromCords(u-1,y),right:r.getCellNodeFromCords(u+1,y)};const {above:x,below:A}=
32
- h;h=new Set;(x&&x.getHeaderStyles().has("column")||A&&A.getHeaderStyles().has("column"))&&h.add("column");h=D(h);h.append(q.$createParagraphNode());k.append(h)}c?b.insertAfter(k):b.insertBefore(k)}else throw Error("Row before insertion index does not exist.");return a};exports.$isTableCellNode=E;exports.$isTableNode=N;exports.$isTableRowNode=R;
33
- exports.$removeTableRowAtIndex=function(a,b){const c=a.getChildren();if(b>=c.length||0>b)throw Error("Expected table cell to be inside of table row.");c[b].remove();return a};exports.TableCellNode=C;exports.TableNode=L;exports.TableRowNode=P;
7
+ var g=require("lexical"),n=require("@lexical/utils");const q={NO_STATUS:0,ROW:1,COLUMN:2,BOTH:3};
8
+ class r extends g.GridCellNode{static getType(){return"tablecell"}static clone(a){return new r(a.__headerState,a.__colSpan,a.__width,a.__key)}static convertDOM(){return{td:()=>({conversion:u,priority:0}),th:()=>({conversion:u,priority:0})}}constructor(a=q.NO_STATUS,b=1,f,h){super(b,h);this.__headerState=a;this.__width=f}createDOM(a){const b=document.createElement(this.getTag());this.__width&&(b.style.width=`${this.__width}px`);n.addClassNamesToElement(b,a.theme.tableCell,this.hasHeader()&&a.theme.tableCellHeader);
9
+ return b}getTag(){return this.hasHeader()?"th":"td"}setHeaderStyles(a){this.getWritable().__headerState=a;return this.__headerState}getHeaderStyles(){return this.getLatest().__headerState}setWidth(a){this.getWritable().__width=a;return this.__width}getWidth(){return this.getLatest().__width}toggleHeaderStyle(a){const b=this.getWritable();b.__headerState=(b.__headerState&a)===a?b.__headerState-a:b.__headerState+a;b.__headerState=b.__headerState;return b}hasHeaderState(a){return(this.getHeaderStyles()&
10
+ a)===a}hasHeader(){return this.getLatest().__headerState!==q.NO_STATUS}updateDOM(a){return a.__headerState!==this.__headerState||a.__width!==this.__width}collapseAtStart(){return!0}canBeEmpty(){return!1}}function u(a){a=a.nodeName.toLowerCase();return{node:v("th"===a?q.ROW:q.NO_STATUS),forChild:(b,f)=>{if(w(f)&&!g.$isElementNode(b)){f=g.$createParagraphNode();if(g.$isLineBreakNode(b)&&"\n"===b.getTextContent())return null;f.append(b);return f}return b}}}function v(a,b=1,f){return new r(a,b,f)}
11
+ function w(a){return a instanceof r}function x(a){throw Error(`Minified Lexical error #${a}; see codes.json for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}const y=document.createElement("style");y.appendChild(document.createTextNode("::selection{background-color: transparent}"));
12
+ class z{constructor(a,b){this.isHighlightingCells=!1;this.currentY=this.currentX=this.startY=this.startX=-1;this.listenersToRemove=new Set;this.tableNodeKey=b;this.editor=a;this.grid={cells:[],columns:0,rows:0};this.focusCell=this.anchorCell=this.focusCellNodeKey=this.anchorCellNodeKey=this.gridSelection=null;this.trackTableGrid()}getGrid(){return this.grid}removeListeners(){Array.from(this.listenersToRemove).forEach(a=>a())}trackTableGrid(){const a=new MutationObserver(b=>{this.editor.update(()=>
13
+ {var f=!1;for(let h=0;h<b.length;h++){const c=b[h].target.nodeName;if("TABLE"===c||"TR"===c){f=!0;break}}if(f){f=this.editor.getElementByKey(this.tableNodeKey);if(!f)throw Error("Expected to find TableElement in DOM");this.grid=B(f)}})});this.editor.update(()=>{const b=this.editor.getElementByKey(this.tableNodeKey);if(!b)throw Error("Expected to find TableElement in DOM");this.grid=B(b);a.observe(b,{childList:!0,subtree:!0})})}clearHighlight(){this.editor.update(()=>{var a=g.$getNodeByKey(this.tableNodeKey);
14
+ if(!C(a))throw Error("Expected TableNode.");a=this.editor.getElementByKey(this.tableNodeKey);if(!a)throw Error("Expected to find TableElement in DOM");a=B(a);this.isHighlightingCells=!1;this.currentY=this.currentX=this.startY=this.startX=-1;this.focusCell=this.anchorCell=this.focusCellNodeKey=this.anchorCellNodeKey=this.gridSelection=null;D(a,null);g.$setSelection(null);this.editor.dispatchCommand(g.SELECTION_CHANGE_COMMAND);a=y.parentNode;null!=a&&a.removeChild(y)})}adjustFocusCellForSelection(a,
15
+ b=!1){this.editor.update(()=>{var f=g.$getNodeByKey(this.tableNodeKey);if(!C(f))throw Error("Expected TableNode.");if(!this.editor.getElementByKey(this.tableNodeKey))throw Error("Expected to find TableElement in DOM");f=a.x;const h=a.y;this.focusCell=a;const c=window.getSelection();null!==this.anchorCell&&c.setBaseAndExtent(this.anchorCell.elem,0,a.elem,0);if(!this.isHighlightingCells&&(this.startX!==f||this.startY!==h||b))this.isHighlightingCells=!0,document.body&&document.body.appendChild(y);else if(f===
16
+ this.currentX&&h===this.currentY)return;this.currentX=f;this.currentY=h;this.isHighlightingCells&&(f=g.$getNearestNodeFromDOMNode(a.elem),null!=this.gridSelection&&null!=this.anchorCellNodeKey&&w(f)&&(f=f.getKey(),this.gridSelection=g.$createGridSelection(),this.focusCellNodeKey=f,this.gridSelection.set(this.tableNodeKey,this.anchorCellNodeKey,this.focusCellNodeKey),g.$setSelection(this.gridSelection),this.editor.dispatchCommand(g.SELECTION_CHANGE_COMMAND),D(this.grid,this.gridSelection)))})}setAnchorCellForSelection(a){this.editor.update(()=>
17
+ {this.anchorCell=a;this.startX=a.x;this.startY=a.y;window.getSelection().setBaseAndExtent(a.elem,0,a.elem,0);var b=g.$getNearestNodeFromDOMNode(a.elem);w(b)&&(b=b.getKey(),this.gridSelection=g.$createGridSelection(),this.anchorCellNodeKey=b)})}formatCells(a){this.editor.update(()=>{const b=g.$getSelection();g.$isGridSelection(b)||x(79);const f=g.$createRangeSelection(),h=f.anchor,c=f.focus;b.getNodes().forEach(k=>{w(k)&&0!==k.getTextContentSize()&&(h.set(k.getKey(),0,"element"),c.set(k.getKey(),k.getChildrenSize(),
18
+ "element"),f.formatText(a))});g.$setSelection(b);this.editor.dispatchCommand(g.SELECTION_CHANGE_COMMAND)})}clearText(){this.editor.update(()=>{const a=g.$getNodeByKey(this.tableNodeKey);if(!C(a))throw Error("Expected TableNode.");var b=g.$getSelection();g.$isGridSelection(b)||x(79);b=b.getNodes().filter(w);b.length===this.grid.columns*this.grid.rows?(a.selectPrevious(),a.remove(),this.clearHighlight()):(b.forEach(f=>{if(g.$isElementNode(f)){const h=g.$createParagraphNode(),c=g.$createTextNode();h.append(c);
19
+ f.append(h);f.getChildren().forEach(k=>{k!==h&&k.remove()})}}),D(this.grid,null),g.$setSelection(null),this.editor.dispatchCommand(g.SELECTION_CHANGE_COMMAND))})}}function E(a){for(;null!=a;){const b=a.nodeName;if("TD"===b||"TH"===b){a=a._cell;if(void 0===a)break;return a}a=a.parentNode}return null}
20
+ function B(a){const b=[],f={cells:b,columns:0,rows:0};var h=a.firstChild;let c=a=0;for(b.length=0;null!=h;){var k=h.nodeName;if("TD"===k||"TH"===k)k={elem:h,highlighted:!1,x:a,y:c},h._cell=k,void 0===b[c]&&(b[c]=[]),b[c][a]=k;else if(k=h.firstChild,null!=k){h=k;continue}k=h.nextSibling;if(null!=k)a++,h=k;else if(k=h.parentNode,null!=k){h=k.nextSibling;if(null==h)break;c++;a=0}}f.columns=a+1;f.rows=c+1;return f}
21
+ function D(a,b){const f=[];({cells:a}=a);b=new Set(b?b.getNodes():[]);for(let h=0;h<a.length;h++){const c=a[h];for(let k=0;k<c.length;k++){const p=c[k],d=p.elem.style,e=g.$getNearestNodeFromDOMNode(p.elem);e&&b.has(e)?(p.highlighted=!0,d.setProperty("background-color","rgb(163, 187, 255)"),d.setProperty("caret-color","transparent"),f.push(p)):(p.highlighted=!1,d.removeProperty("background-color"),d.removeProperty("caret-color"),p.elem.getAttribute("style")||p.elem.removeAttribute("style"))}}return f}
22
+ const G=(a,b,f,h,c)=>{switch(c){case "backward":case "forward":return c="forward"===c,f!==(c?a.grid.columns-1:0)?F(b.getCellNodeFromCordsOrThrow(f+(c?1:-1),h,a.grid)):h!==(c?a.grid.rows-1:0)?F(b.getCellNodeFromCordsOrThrow(c?0:a.grid.columns-1,h+(c?1:-1),a.grid)):c?b.selectNext():b.selectPrevious(),!0;case "up":return 0!==h?F(b.getCellNodeFromCordsOrThrow(f,h-1,a.grid)):b.selectPrevious(),!0;case "down":return h!==a.grid.rows-1?F(b.getCellNodeFromCordsOrThrow(f,h+1,a.grid)):b.selectNext(),!0}return!1},
23
+ H=(a,b,f,h,c)=>{switch(c){case "backward":case "forward":return c="forward"===c,f!==(c?a.grid.columns-1:0)&&a.adjustFocusCellForSelection(b.getCellFromCordsOrThrow(f+(c?1:-1),h,a.grid)),!0;case "up":if(0!==h)return a.adjustFocusCellForSelection(b.getCellFromCordsOrThrow(f,h-1,a.grid)),!0;break;case "down":if(h!==a.grid.rows-1)return a.adjustFocusCellForSelection(b.getCellFromCordsOrThrow(f,h+1,a.grid)),!0}return!1};
24
+ function F(a){const b=a.getChildren().find(f=>g.$isParagraphNode(f));g.$isParagraphNode(b)?b.selectEnd():a.selectEnd()}
25
+ class I extends g.GridNode{static getType(){return"table"}static clone(a){return new I(a.__key)}static convertDOM(){return{table:()=>({conversion:N,priority:0})}}constructor(a){super(a)}createDOM(a){const b=document.createElement("table");n.addClassNamesToElement(b,a.theme.table);return b}updateDOM(){return!1}canExtractContents(){return!1}canBeEmpty(){return!1}getCordsFromCellNode(a,b){b||x(55);const {rows:f,cells:h}=b;for(b=0;b<f;b++){var c=h[b];if(null==c)throw Error(`Row not found at y:${b}`);
26
+ c=c.findIndex(({elem:k})=>g.$getNearestNodeFromDOMNode(k)===a);if(-1!==c)return{x:c,y:b}}throw Error("Cell not found in table.");}getCellFromCords(a,b,f){f||x(55);({cells:f}=f);b=f[b];if(null==b)return null;a=b[a];return null==a?null:a}getCellFromCordsOrThrow(a,b,f){a=this.getCellFromCords(a,b,f);if(!a)throw Error("Cell not found at cords.");return a}getCellNodeFromCords(a,b,f){a=this.getCellFromCords(a,b,f);if(null==a)return null;a=g.$getNearestNodeFromDOMNode(a.elem);return w(a)?a:null}getCellNodeFromCordsOrThrow(a,
27
+ b,f){a=this.getCellNodeFromCords(a,b,f);if(!a)throw Error("Node at cords not TableCellNode.");return a}canSelectBefore(){return!0}}function N(){return{node:O()}}function O(){return new I}function C(a){return a instanceof I}
28
+ class P extends g.GridRowNode{static getType(){return"tablerow"}static clone(a){return new P(a.__height,a.__key)}static convertDOM(){return{tr:()=>({conversion:Q,priority:0})}}constructor(a,b){super(b);this.__height=a}createDOM(a){const b=document.createElement("tr");this.__height&&(b.style.height=`${this.__height}px`);n.addClassNamesToElement(b,a.theme.tableRow);return b}setHeight(a){this.getWritable().__height=a;return this.__height}getHeight(){return this.getLatest().__height}updateDOM(a){return a.__height!==
29
+ this.__height}canBeEmpty(){return!1}}function Q(){return{node:R()}}function R(a){return new P(a)}function S(a){return a instanceof P}function T(a){a=n.$findMatchingParent(a,b=>S(b));if(S(a))return a;throw Error("Expected table cell to be inside of table row.");}function U(a){a=n.$findMatchingParent(a,b=>C(b));if(C(a))return a;throw Error("Expected table cell to be inside of table.");}const V=g.createCommand();exports.$createTableCellNode=v;exports.$createTableNode=O;
30
+ exports.$createTableNodeWithDimensions=function(a,b,f=!0){const h=O();for(let k=0;k<a;k++){const p=R();for(let d=0;d<b;d++){var c=q.NO_STATUS;f&&(0===k&&(c|=q.ROW),0===d&&(c|=q.COLUMN));c=v(c);const e=g.$createParagraphNode();e.append(g.$createTextNode());c.append(e);p.append(c)}h.append(p)}return h};exports.$createTableRowNode=R;
31
+ exports.$deleteTableColumn=function(a,b){const f=a.getChildren();for(let c=0;c<f.length;c++){var h=f[c];if(S(h)){h=h.getChildren();if(b>=h.length||0>b)throw Error("Table column target index out of range");h[b].remove()}}return a};exports.$getElementGridForTableNode=function(a,b){a=a.getElementByKey(b.getKey());if(null==a)throw Error("Table Element Not Found");return B(a)};exports.$getTableCellNodeFromLexicalNode=function(a){a=n.$findMatchingParent(a,b=>w(b));return w(a)?a:null};
32
+ exports.$getTableColumnIndexFromTableCellNode=function(a){return T(a).getChildren().findIndex(b=>b.is(a))};exports.$getTableNodeFromLexicalNodeOrThrow=U;exports.$getTableRowIndexFromTableCellNode=function(a){const b=T(a);return U(b).getChildren().findIndex(f=>f.is(b))};exports.$getTableRowNodeFromTableCellNodeOrThrow=T;
33
+ exports.$insertTableColumn=function(a,b,f=!0,h){const c=a.getChildren();for(let d=0;d<c.length;d++){const e=c[d];if(S(e))for(let l=0;l<h;l++){var k=q.NO_STATUS;0===d&&(k|=q.ROW);k=v(k);k.append(g.$createParagraphNode());var p=e.getChildren();if(b>=p.length||0>b)throw Error("Table column target index out of range");p=p[b];f?p.insertAfter(k):p.insertBefore(k)}}return a};
34
+ exports.$insertTableRow=function(a,b,f=!0,h,c){var k=a.getChildren();if(b>=k.length||0>b)throw Error("Table row target index out of range");b=k[b];if(S(b))for(k=0;k<h;k++){const e=b.getChildren(),l=e.length,m=R();for(let t=0;t<l;t++){var p=e[t];w(p)||x(73);var d=c;const A=U(p),{x:J,y:K}=A.getCordsFromCellNode(p,d);p={above:A.getCellNodeFromCords(J,K-1,d),below:A.getCellNodeFromCords(J,K+1,d),left:A.getCellNodeFromCords(J-1,K,d),right:A.getCellNodeFromCords(J+1,K,d)};const {above:L,below:M}=p;p=q.NO_STATUS;
35
+ d=L&&L.getWidth()||M&&M.getWidth()||null;if(L&&L.hasHeaderState(q.COLUMN)||M&&M.hasHeaderState(q.COLUMN))p|=q.COLUMN;p=v(p,1,d);p.append(g.$createParagraphNode());m.append(p)}f?b.insertAfter(m):b.insertBefore(m)}else throw Error("Row before insertion index does not exist.");return a};exports.$isTableCellNode=w;exports.$isTableNode=C;exports.$isTableRowNode=S;
36
+ exports.$removeTableRowAtIndex=function(a,b){const f=a.getChildren();if(b>=f.length||0>b)throw Error("Expected table cell to be inside of table row.");f[b].remove();return a};exports.INSERT_TABLE_COMMAND=V;exports.TableCellHeaderStates=q;exports.TableCellNode=r;exports.TableNode=I;exports.TableRowNode=P;exports.TableSelection=z;
37
+ exports.applyTableHandlers=function(a,b,f){const h=f.getRootElement();if(null===h)throw Error("No root element.");const c=new z(f,a.getKey());b.__lexicalTableSelection=c;let k=!1;b.addEventListener("dblclick",d=>{const e=E(d.target);null!==e&&(d.preventDefault(),d.stopImmediatePropagation(),d.stopPropagation(),c.setAnchorCellForSelection(e),c.adjustFocusCellForSelection(e,!0),k=!1)});b.addEventListener("mousedown",d=>{setTimeout(()=>{if(0===d.button){var e=E(d.target);null!==e&&(k=!0,c.setAnchorCellForSelection(e),
38
+ document.addEventListener("mouseup",()=>{k=!1},{capture:!0,once:!0}))}},0)});b.addEventListener("mousemove",d=>{if(k){const e=E(d.target);if(null!==e){const l=e.x,m=e.y;k&&(c.startX!==l||c.startY!==m||c.isHighlightingCells)&&(d.preventDefault(),k=!0,c.adjustFocusCellForSelection(e))}}});b.addEventListener("mouseup",()=>{k&&(k=!1)});b.addEventListener("mouseleave",()=>{});const p=d=>{0===d.button&&f.update(()=>{const e=g.$getSelection();if(g.$isGridSelection(e)&&e.gridKey===c.tableNodeKey&&h.contains(d.target))return c.clearHighlight()})};
39
+ window.addEventListener("mousedown",p);c.listenersToRemove.add(()=>window.removeEventListener("mousedown",p));c.listenersToRemove.add(f.registerCommand(g.KEY_ARROW_DOWN_COMMAND,d=>{var e=g.$getSelection();if(g.$isRangeSelection(e)){if(e.isCollapsed()){var l=n.$findMatchingParent(e.anchor.getNode(),t=>w(t));if(!w(l))return!1;var m=a.getCordsFromCellNode(l,c.grid);e=n.$findMatchingParent(e.anchor.getNode(),t=>g.$isElementNode(t));if(null==e)throw Error("Expected BlockNode Parent");if((l=l.getLastChild())&&
40
+ e.isParentOf(l)||e===l||d.shiftKey)return d.preventDefault(),d.stopImmediatePropagation(),d.stopPropagation(),d.shiftKey?(c.setAnchorCellForSelection(a.getCellFromCordsOrThrow(m.x,m.y,c.grid)),H(c,a,m.x,m.y,"down")):G(c,a,m.x,m.y,"down")}}else if(g.$isGridSelection(e)&&d.shiftKey){m=e.focus.getNode();if(!w(m))return!1;m=a.getCordsFromCellNode(m,c.grid);d.preventDefault();d.stopImmediatePropagation();d.stopPropagation();return H(c,a,m.x,m.y,"down")}return!1},4));c.listenersToRemove.add(f.registerCommand(g.KEY_ARROW_UP_COMMAND,
41
+ d=>{var e=g.$getSelection();if(g.$isRangeSelection(e)){if(e.isCollapsed()){var l=n.$findMatchingParent(e.anchor.getNode(),t=>w(t));if(!w(l))return!1;var m=a.getCordsFromCellNode(l,c.grid);e=n.$findMatchingParent(e.anchor.getNode(),t=>g.$isElementNode(t));if(null==e)throw Error("Expected BlockNode Parent");if((l=l.getLastChild())&&e.isParentOf(l)||e===l||d.shiftKey)return d.preventDefault(),d.stopImmediatePropagation(),d.stopPropagation(),d.shiftKey?(c.setAnchorCellForSelection(a.getCellFromCordsOrThrow(m.x,
42
+ m.y,c.grid)),H(c,a,m.x,m.y,"up")):G(c,a,m.x,m.y,"up")}}else if(g.$isGridSelection(e)&&d.shiftKey){m=e.focus.getNode();if(!w(m))return!1;m=a.getCordsFromCellNode(m,c.grid);d.preventDefault();d.stopImmediatePropagation();d.stopPropagation();return H(c,a,m.x,m.y,"up")}return!1},4));c.listenersToRemove.add(f.registerCommand(g.KEY_ARROW_LEFT_COMMAND,d=>{var e=g.$getSelection();if(g.$isRangeSelection(e)){if(e.isCollapsed()){var l=n.$findMatchingParent(e.anchor.getNode(),m=>w(m));if(!w(l))return!1;l=a.getCordsFromCellNode(l,
43
+ c.grid);if(null==n.$findMatchingParent(e.anchor.getNode(),m=>g.$isElementNode(m)))throw Error("Expected BlockNode Parent");if(0===e.anchor.offset||d.shiftKey)return d.preventDefault(),d.stopImmediatePropagation(),d.stopPropagation(),d.shiftKey?(c.setAnchorCellForSelection(a.getCellFromCordsOrThrow(l.x,l.y,c.grid)),H(c,a,l.x,l.y,"backward")):G(c,a,l.x,l.y,"backward")}}else if(g.$isGridSelection(e)&&d.shiftKey){e=e.focus.getNode();if(!w(e))return!1;e=a.getCordsFromCellNode(e,c.grid);d.preventDefault();
44
+ d.stopImmediatePropagation();d.stopPropagation();return H(c,a,e.x,e.y,"backward")}return!1},4));c.listenersToRemove.add(f.registerCommand(g.KEY_ARROW_RIGHT_COMMAND,d=>{var e=g.$getSelection();if(g.$isRangeSelection(e)){if(e.isCollapsed()){var l=n.$findMatchingParent(e.anchor.getNode(),m=>w(m));if(!w(l))return!1;l=a.getCordsFromCellNode(l,c.grid);if(null==n.$findMatchingParent(e.anchor.getNode(),m=>g.$isElementNode(m)))throw Error("Expected BlockNode Parent");if(e.anchor.offset===e.anchor.getNode().getTextContentSize()||
45
+ d.shiftKey)return d.preventDefault(),d.stopImmediatePropagation(),d.stopPropagation(),d.shiftKey?(c.setAnchorCellForSelection(a.getCellFromCordsOrThrow(l.x,l.y,c.grid)),H(c,a,l.x,l.y,"forward")):G(c,a,l.x,l.y,"forward")}}else if(g.$isGridSelection(e)&&d.shiftKey){e=e.focus.getNode();if(!w(e))return!1;e=a.getCordsFromCellNode(e,c.grid);d.preventDefault();d.stopImmediatePropagation();d.stopPropagation();return H(c,a,e.x,e.y,"forward")}return!1},4));c.listenersToRemove.add(f.registerCommand(g.DELETE_CHARACTER_COMMAND,
46
+ ()=>{const d=g.$getSelection();if(g.$isGridSelection(d))return c.clearText(),!0;if(g.$isRangeSelection(d)){const e=n.$findMatchingParent(d.anchor.getNode(),l=>w(l));if(!w(e))return!1;if(d.isCollapsed()&&0===d.anchor.offset&&0===d.anchor.getNode().getPreviousSiblings().length)return!0}return!1},4));c.listenersToRemove.add(f.registerCommand(g.KEY_BACKSPACE_COMMAND,d=>{const e=g.$getSelection();if(g.$isGridSelection(e))return d.preventDefault(),d.stopPropagation(),c.clearText(),!0;g.$isRangeSelection(e)&&
47
+ (d=n.$findMatchingParent(e.anchor.getNode(),l=>w(l)),w(d));return!1},4));c.listenersToRemove.add(f.registerCommand(g.FORMAT_TEXT_COMMAND,d=>{const e=g.$getSelection();if(g.$isGridSelection(e))return c.formatCells(d),!0;g.$isRangeSelection(e)&&(d=n.$findMatchingParent(e.anchor.getNode(),l=>w(l)),w(d));return!1},4));c.listenersToRemove.add(f.registerCommand(g.INSERT_TEXT_COMMAND,()=>{var d=g.$getSelection();g.$isGridSelection(d)?c.clearHighlight():g.$isRangeSelection(d)&&(d=n.$findMatchingParent(d.anchor.getNode(),
48
+ e=>w(e)),w(d));return!1},4));c.listenersToRemove.add(f.registerCommand(g.KEY_TAB_COMMAND,d=>{var e=g.$getSelection();if(g.$isRangeSelection(e)){const l=n.$findMatchingParent(e.anchor.getNode(),m=>w(m));if(!w(l))return!1;if(e.isCollapsed())return e=a.getCordsFromCellNode(l,c.grid),d.preventDefault(),G(c,a,e.x,e.y,d.shiftKey?"backward":"forward"),!0}return!1},4));return c};exports.getCellFromTarget=E;exports.getTableSelectionFromTableElement=function(a){return a.__lexicalTableSelection};
package/package.json CHANGED
@@ -1,9 +1,5 @@
1
1
  {
2
2
  "name": "@lexical/table",
3
- "author": {
4
- "name": "Dominic Gannaway",
5
- "email": "dg@domgan.com"
6
- },
7
3
  "description": "This package provides the Table feature for Lexical.",
8
4
  "keywords": [
9
5
  "lexical",
@@ -12,10 +8,13 @@
12
8
  "table"
13
9
  ],
14
10
  "license": "MIT",
15
- "version": "0.1.14",
11
+ "version": "0.1.17",
16
12
  "main": "LexicalTable.js",
17
13
  "peerDependencies": {
18
- "lexical": "0.1.14"
14
+ "lexical": "0.1.17"
15
+ },
16
+ "dependencies": {
17
+ "@lexical/utils": "0.1.17"
19
18
  },
20
19
  "repository": {
21
20
  "type": "git",