@webiny/lexical-nodes 0.0.0-unstable.06b2ede40f
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/FontColorNode.d.ts +43 -0
- package/FontColorNode.js +122 -0
- package/FontColorNode.js.map +1 -0
- package/HeadingNode.d.ts +40 -0
- package/HeadingNode.js +195 -0
- package/HeadingNode.js.map +1 -0
- package/ImageNode.d.ts +56 -0
- package/ImageNode.js +164 -0
- package/ImageNode.js.map +1 -0
- package/LICENSE +21 -0
- package/LinkNode.d.ts +101 -0
- package/LinkNode.js +327 -0
- package/LinkNode.js.map +1 -0
- package/ListItemNode.d.ts +43 -0
- package/ListItemNode.js +363 -0
- package/ListItemNode.js.map +1 -0
- package/ListNode.d.ts +53 -0
- package/ListNode.js +248 -0
- package/ListNode.js.map +1 -0
- package/ParagraphNode.d.ts +39 -0
- package/ParagraphNode.js +157 -0
- package/ParagraphNode.js.map +1 -0
- package/QuoteNode.d.ts +38 -0
- package/QuoteNode.js +120 -0
- package/QuoteNode.js.map +1 -0
- package/README.md +6 -0
- package/components/ImageNode/ContentEditable.css +22 -0
- package/components/ImageNode/ContentEditable.d.ts +12 -0
- package/components/ImageNode/ContentEditable.js +19 -0
- package/components/ImageNode/ContentEditable.js.map +1 -0
- package/components/ImageNode/ImageComponent.css +43 -0
- package/components/ImageNode/ImageComponent.d.ts +18 -0
- package/components/ImageNode/ImageComponent.js +235 -0
- package/components/ImageNode/ImageComponent.js.map +1 -0
- package/components/ImageNode/ImageResizer.d.ts +24 -0
- package/components/ImageNode/ImageResizer.js +211 -0
- package/components/ImageNode/ImageResizer.js.map +1 -0
- package/components/ImageNode/Placeholder.css +20 -0
- package/components/ImageNode/Placeholder.d.ts +15 -0
- package/components/ImageNode/Placeholder.js +24 -0
- package/components/ImageNode/Placeholder.js.map +1 -0
- package/components/ImageNode/SharedHistoryContext.d.ts +10 -0
- package/components/ImageNode/SharedHistoryContext.js +19 -0
- package/components/ImageNode/SharedHistoryContext.js.map +1 -0
- package/generateInitialLexicalValue.d.ts +4 -0
- package/generateInitialLexicalValue.js +27 -0
- package/generateInitialLexicalValue.js.map +1 -0
- package/index.d.ts +19 -0
- package/index.js +51 -0
- package/index.js.map +1 -0
- package/package.json +39 -0
- package/prepareLexicalState.d.ts +2 -0
- package/prepareLexicalState.js +53 -0
- package/prepareLexicalState.js.map +1 -0
- package/types.d.ts +11 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
- package/utils/clearNodeFormating.d.ts +2 -0
- package/utils/clearNodeFormating.js +23 -0
- package/utils/clearNodeFormating.js.map +1 -0
- package/utils/formatList.d.ts +19 -0
- package/utils/formatList.js +412 -0
- package/utils/formatList.js.map +1 -0
- package/utils/formatToHeading.d.ts +3 -0
- package/utils/formatToHeading.js +19 -0
- package/utils/formatToHeading.js.map +1 -0
- package/utils/formatToParagraph.d.ts +2 -0
- package/utils/formatToParagraph.js +13 -0
- package/utils/formatToParagraph.js.map +1 -0
- package/utils/formatToQuote.d.ts +2 -0
- package/utils/formatToQuote.js +19 -0
- package/utils/formatToQuote.js.map +1 -0
- package/utils/getStyleId.d.ts +11 -0
- package/utils/getStyleId.js +14 -0
- package/utils/getStyleId.js.map +1 -0
- package/utils/listNode.d.ts +21 -0
- package/utils/listNode.js +103 -0
- package/utils/listNode.js.map +1 -0
- package/utils/toggleLink.d.ts +8 -0
- package/utils/toggleLink.js +131 -0
- package/utils/toggleLink.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["$isRangeSelection","$isTextNode","$selectAll","$getNearestBlockElementAncestorOrThrow","$isDecoratorBlockNode","clearNodeFormatting","activeEditor","selection","update","getNodes","forEach","node","setFormat","setStyle"],"sources":["clearNodeFormating.ts"],"sourcesContent":["import type { LexicalEditor, RangeSelection } from \"lexical\";\nimport { $isRangeSelection, $isTextNode } from \"lexical\";\nimport { $selectAll } from \"@lexical/selection\";\nimport { $getNearestBlockElementAncestorOrThrow } from \"@lexical/utils\";\nimport { $isDecoratorBlockNode } from \"@lexical/react/LexicalDecoratorBlockNode\";\n\nexport const clearNodeFormatting = (\n activeEditor: LexicalEditor,\n selection: RangeSelection | null\n) => {\n activeEditor.update(() => {\n if ($isRangeSelection(selection)) {\n $selectAll(selection);\n selection.getNodes().forEach(node => {\n if ($isTextNode(node)) {\n node.setFormat(0);\n node.setStyle(\"\");\n $getNearestBlockElementAncestorOrThrow(node).setFormat(\"\");\n }\n if ($isDecoratorBlockNode(node)) {\n node.setFormat(\"\");\n }\n });\n }\n });\n};\n"],"mappings":"AACA,SAASA,iBAAiB,EAAEC,WAAW,QAAQ,SAAS;AACxD,SAASC,UAAU,QAAQ,oBAAoB;AAC/C,SAASC,sCAAsC,QAAQ,gBAAgB;AACvE,SAASC,qBAAqB,QAAQ,0CAA0C;AAEhF,OAAO,MAAMC,mBAAmB,GAAGA,CAC/BC,YAA2B,EAC3BC,SAAgC,KAC/B;EACDD,YAAY,CAACE,MAAM,CAAC,MAAM;IACtB,IAAIR,iBAAiB,CAACO,SAAS,CAAC,EAAE;MAC9BL,UAAU,CAACK,SAAS,CAAC;MACrBA,SAAS,CAACE,QAAQ,CAAC,CAAC,CAACC,OAAO,CAACC,IAAI,IAAI;QACjC,IAAIV,WAAW,CAACU,IAAI,CAAC,EAAE;UACnBA,IAAI,CAACC,SAAS,CAAC,CAAC,CAAC;UACjBD,IAAI,CAACE,QAAQ,CAAC,EAAE,CAAC;UACjBV,sCAAsC,CAACQ,IAAI,CAAC,CAACC,SAAS,CAAC,EAAE,CAAC;QAC9D;QACA,IAAIR,qBAAqB,CAACO,IAAI,CAAC,EAAE;UAC7BA,IAAI,CAACC,SAAS,CAAC,EAAE,CAAC;QACtB;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LexicalEditor, LexicalNode } from "lexical";
|
|
2
|
+
import type { ListNode } from "../ListNode";
|
|
3
|
+
import { ListItemNode } from "../ListItemNode";
|
|
4
|
+
import type { ListType } from "@lexical/list";
|
|
5
|
+
export declare function insertList(editor: LexicalEditor, listType: ListType, styleId?: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* A recursive function that goes through each list and their children, including nested lists,
|
|
8
|
+
* appending list2 children after list1 children and updating ListItemNode values.
|
|
9
|
+
* @param list1 - The first list to be merged.
|
|
10
|
+
* @param list2 - The second list to be merged.
|
|
11
|
+
*/
|
|
12
|
+
export declare function mergeLists(list1: ListNode, list2: ListNode): void;
|
|
13
|
+
export declare function removeList(editor: LexicalEditor): void;
|
|
14
|
+
export declare function updateChildrenListItemValue(list: ListNode, children?: Array<LexicalNode>): void;
|
|
15
|
+
export declare function $handleIndent(WebinyListItemNodes: Array<ListItemNode>): void;
|
|
16
|
+
export declare function $handleOutdent(WebinyListItemNodes: Array<ListItemNode>): void;
|
|
17
|
+
export declare function indentList(): void;
|
|
18
|
+
export declare function outdentList(): void;
|
|
19
|
+
export declare function $handleListInsertParagraph(): boolean;
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { $getSelection, $isElementNode, $isLeafNode, $isParagraphNode, $isRangeSelection, $isRootOrShadowRoot } from "lexical";
|
|
2
|
+
import { $createListNode, $isListNode } from "../ListNode";
|
|
3
|
+
import { $getNearestNodeOfType } from "@lexical/utils";
|
|
4
|
+
import { $createListItemNode, $isListItemNode, ListItemNode } from "../ListItemNode";
|
|
5
|
+
import { $createParagraphNode } from "../ParagraphNode";
|
|
6
|
+
import { $getAllListItems, $getTopListNode, $removeHighestEmptyListParent, findNearestListItemNode, getUniqueListItemNodes, isNestedListNode } from "./listNode";
|
|
7
|
+
const DEFAULT_LIST_START_NUMBER = 1;
|
|
8
|
+
function $isSelectingEmptyListItem(anchorNode, nodes) {
|
|
9
|
+
return $isListItemNode(anchorNode) && (nodes.length === 0 || nodes.length === 1 && anchorNode.is(nodes[0]) && anchorNode.getChildrenSize() === 0);
|
|
10
|
+
}
|
|
11
|
+
function $getListItemValue(listItem) {
|
|
12
|
+
const list = listItem.getParent();
|
|
13
|
+
let value = 1;
|
|
14
|
+
if (list !== null) {
|
|
15
|
+
if (!$isListNode(list)) {
|
|
16
|
+
console.log("$getListItemValue: webiny list node is not parent of webiny list item node");
|
|
17
|
+
return DEFAULT_LIST_START_NUMBER;
|
|
18
|
+
} else {
|
|
19
|
+
value = list.getStart();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const siblings = listItem.getPreviousSiblings();
|
|
23
|
+
for (let i = 0; i < siblings.length; i++) {
|
|
24
|
+
const sibling = siblings[i];
|
|
25
|
+
if ($isListItemNode(sibling) && !$isListNode(sibling.getFirstChild())) {
|
|
26
|
+
value++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
export function insertList(editor, listType, styleId) {
|
|
32
|
+
editor.update(() => {
|
|
33
|
+
const selection = $getSelection();
|
|
34
|
+
if (selection && $isRangeSelection(selection)) {
|
|
35
|
+
const nodes = selection.getNodes();
|
|
36
|
+
const anchor = selection.anchor;
|
|
37
|
+
const anchorNode = anchor.getNode();
|
|
38
|
+
const anchorNodeParent = anchorNode.getParent();
|
|
39
|
+
if ($isSelectingEmptyListItem(anchorNode, nodes)) {
|
|
40
|
+
const list = $createListNode(listType, styleId);
|
|
41
|
+
if ($isRootOrShadowRoot(anchorNodeParent)) {
|
|
42
|
+
anchorNode.replace(list);
|
|
43
|
+
const listItem = $createListItemNode();
|
|
44
|
+
if ($isElementNode(anchorNode)) {
|
|
45
|
+
listItem.setFormat(anchorNode.getFormatType());
|
|
46
|
+
listItem.setIndent(anchorNode.getIndent());
|
|
47
|
+
}
|
|
48
|
+
list.append(listItem);
|
|
49
|
+
} else if ($isListItemNode(anchorNode)) {
|
|
50
|
+
const parent = anchorNode.getParentOrThrow();
|
|
51
|
+
append(list, parent.getChildren());
|
|
52
|
+
parent.replace(list);
|
|
53
|
+
}
|
|
54
|
+
return;
|
|
55
|
+
} else {
|
|
56
|
+
const handled = new Set();
|
|
57
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
58
|
+
const node = nodes[i];
|
|
59
|
+
if ($isElementNode(node) && node.isEmpty() && !handled.has(node.getKey())) {
|
|
60
|
+
createListOrMerge(node, listType, styleId);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if ($isLeafNode(node)) {
|
|
64
|
+
let parent = node.getParent();
|
|
65
|
+
while (parent != null) {
|
|
66
|
+
const parentKey = parent.getKey();
|
|
67
|
+
if ($isListNode(parent)) {
|
|
68
|
+
if (!handled.has(parentKey)) {
|
|
69
|
+
const newListNode = $createListNode(listType, styleId);
|
|
70
|
+
append(newListNode, parent.getChildren());
|
|
71
|
+
parent.replace(newListNode);
|
|
72
|
+
updateChildrenListItemValue(newListNode);
|
|
73
|
+
handled.add(parentKey);
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
} else {
|
|
77
|
+
const nextParent = parent.getParent();
|
|
78
|
+
if ($isRootOrShadowRoot(nextParent) && !handled.has(parentKey)) {
|
|
79
|
+
handled.add(parentKey);
|
|
80
|
+
createListOrMerge(parent, listType, styleId);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
parent = nextParent;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function append(node, nodesToAppend) {
|
|
93
|
+
node.splice(node.getChildrenSize(), 0, nodesToAppend);
|
|
94
|
+
}
|
|
95
|
+
function createListOrMerge(node, listType, styleId) {
|
|
96
|
+
if ($isListNode(node)) {
|
|
97
|
+
return node;
|
|
98
|
+
}
|
|
99
|
+
const previousSibling = node.getPreviousSibling();
|
|
100
|
+
const nextSibling = node.getNextSibling();
|
|
101
|
+
const listItem = $createListItemNode();
|
|
102
|
+
listItem.setFormat(node.getFormatType());
|
|
103
|
+
listItem.setIndent(node.getIndent());
|
|
104
|
+
append(listItem, node.getChildren());
|
|
105
|
+
if ($isListNode(previousSibling) && listType === previousSibling.getListType()) {
|
|
106
|
+
previousSibling.append(listItem);
|
|
107
|
+
node.remove();
|
|
108
|
+
// if the same type of list is on both sides, merge them.
|
|
109
|
+
|
|
110
|
+
if ($isListNode(nextSibling) && listType === nextSibling.getListType()) {
|
|
111
|
+
append(previousSibling, nextSibling.getChildren());
|
|
112
|
+
nextSibling.remove();
|
|
113
|
+
}
|
|
114
|
+
return previousSibling;
|
|
115
|
+
} else if ($isListNode(nextSibling) && listType === nextSibling.getListType()) {
|
|
116
|
+
nextSibling.getFirstChildOrThrow().insertBefore(listItem);
|
|
117
|
+
node.remove();
|
|
118
|
+
return nextSibling;
|
|
119
|
+
} else {
|
|
120
|
+
const list = $createListNode(listType, styleId);
|
|
121
|
+
list.append(listItem);
|
|
122
|
+
node.replace(list);
|
|
123
|
+
updateChildrenListItemValue(list);
|
|
124
|
+
return list;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* A recursive function that goes through each list and their children, including nested lists,
|
|
130
|
+
* appending list2 children after list1 children and updating ListItemNode values.
|
|
131
|
+
* @param list1 - The first list to be merged.
|
|
132
|
+
* @param list2 - The second list to be merged.
|
|
133
|
+
*/
|
|
134
|
+
export function mergeLists(list1, list2) {
|
|
135
|
+
const listItem1 = list1.getLastChild();
|
|
136
|
+
const listItem2 = list2.getFirstChild();
|
|
137
|
+
if (listItem1 && listItem2 && isNestedListNode(listItem1) && isNestedListNode(listItem2)) {
|
|
138
|
+
mergeLists(listItem1.getFirstChild(), listItem2.getFirstChild());
|
|
139
|
+
listItem2.remove();
|
|
140
|
+
}
|
|
141
|
+
const toMerge = list2.getChildren();
|
|
142
|
+
if (toMerge.length > 0) {
|
|
143
|
+
list1.append(...toMerge);
|
|
144
|
+
updateChildrenListItemValue(list1);
|
|
145
|
+
}
|
|
146
|
+
list2.remove();
|
|
147
|
+
}
|
|
148
|
+
export function removeList(editor) {
|
|
149
|
+
editor.update(() => {
|
|
150
|
+
const selection = $getSelection();
|
|
151
|
+
if ($isRangeSelection(selection)) {
|
|
152
|
+
const listNodes = new Set();
|
|
153
|
+
const nodes = selection.getNodes();
|
|
154
|
+
const anchorNode = selection.anchor.getNode();
|
|
155
|
+
if ($isSelectingEmptyListItem(anchorNode, nodes)) {
|
|
156
|
+
listNodes.add($getTopListNode(anchorNode));
|
|
157
|
+
} else {
|
|
158
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
159
|
+
const node = nodes[i];
|
|
160
|
+
if ($isLeafNode(node)) {
|
|
161
|
+
const listItemNode = $getNearestNodeOfType(node, ListItemNode);
|
|
162
|
+
if (listItemNode != null) {
|
|
163
|
+
listNodes.add($getTopListNode(listItemNode));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const listNode of listNodes) {
|
|
169
|
+
let insertionPoint = listNode;
|
|
170
|
+
const listItems = $getAllListItems(listNode);
|
|
171
|
+
for (const listItemNode of listItems) {
|
|
172
|
+
const paragraph = $createParagraphNode();
|
|
173
|
+
append(paragraph, listItemNode.getChildren());
|
|
174
|
+
insertionPoint.insertAfter(paragraph);
|
|
175
|
+
insertionPoint = paragraph;
|
|
176
|
+
|
|
177
|
+
// When the anchor and focus fall on the textNode
|
|
178
|
+
// we don't have to change the selection because the textNode will be appended to
|
|
179
|
+
// the newly generated paragraph.
|
|
180
|
+
// When selection is in empty nested list item, selection is actually on the listItemNode.
|
|
181
|
+
// When the corresponding listItemNode is deleted and replaced by the newly generated paragraph
|
|
182
|
+
// we should manually set the selection's focus and anchor to the newly generated paragraph.
|
|
183
|
+
if (listItemNode.__key === selection.anchor.key) {
|
|
184
|
+
selection.anchor.set(paragraph.getKey(), 0, "element");
|
|
185
|
+
}
|
|
186
|
+
if (listItemNode.__key === selection.focus.key) {
|
|
187
|
+
selection.focus.set(paragraph.getKey(), 0, "element");
|
|
188
|
+
}
|
|
189
|
+
listItemNode.remove();
|
|
190
|
+
}
|
|
191
|
+
listNode.remove();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
export function updateChildrenListItemValue(list, children) {
|
|
197
|
+
const childrenOrExisting = children || list.getChildren();
|
|
198
|
+
if (childrenOrExisting !== undefined) {
|
|
199
|
+
for (let i = 0; i < childrenOrExisting.length; i++) {
|
|
200
|
+
const child = childrenOrExisting[i];
|
|
201
|
+
if ($isListItemNode(child)) {
|
|
202
|
+
const prevValue = child.getValue();
|
|
203
|
+
const nextValue = $getListItemValue(child);
|
|
204
|
+
if (prevValue !== nextValue) {
|
|
205
|
+
child.setValue(nextValue);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export function $handleIndent(WebinyListItemNodes) {
|
|
212
|
+
// go through each node and decide where to move it.
|
|
213
|
+
const removed = new Set();
|
|
214
|
+
WebinyListItemNodes.forEach(WebinyListItemNode => {
|
|
215
|
+
if (isNestedListNode(WebinyListItemNode) || removed.has(WebinyListItemNode.getKey())) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const parent = WebinyListItemNode.getParent();
|
|
219
|
+
|
|
220
|
+
// We can cast both of the below `isNestedListNode` only returns a boolean type instead of a user-defined type guards
|
|
221
|
+
const nextSibling = WebinyListItemNode.getNextSibling();
|
|
222
|
+
const previousSibling = WebinyListItemNode.getPreviousSibling();
|
|
223
|
+
// if there are nested lists on either side, merge them all together.
|
|
224
|
+
|
|
225
|
+
if (isNestedListNode(nextSibling) && isNestedListNode(previousSibling)) {
|
|
226
|
+
const innerList = previousSibling.getFirstChild();
|
|
227
|
+
if ($isListNode(innerList)) {
|
|
228
|
+
innerList.append(WebinyListItemNode);
|
|
229
|
+
const nextInnerList = nextSibling.getFirstChild();
|
|
230
|
+
if ($isListNode(nextInnerList)) {
|
|
231
|
+
const children = nextInnerList.getChildren();
|
|
232
|
+
append(innerList, children);
|
|
233
|
+
nextSibling.remove();
|
|
234
|
+
removed.add(nextSibling.getKey());
|
|
235
|
+
}
|
|
236
|
+
updateChildrenListItemValue(innerList);
|
|
237
|
+
}
|
|
238
|
+
} else if (isNestedListNode(nextSibling)) {
|
|
239
|
+
// if the WebinyListItemNode is next to a nested ListNode, merge them
|
|
240
|
+
const innerList = nextSibling.getFirstChild();
|
|
241
|
+
if ($isListNode(innerList)) {
|
|
242
|
+
const firstChild = innerList.getFirstChild();
|
|
243
|
+
if (firstChild !== null) {
|
|
244
|
+
firstChild.insertBefore(WebinyListItemNode);
|
|
245
|
+
}
|
|
246
|
+
updateChildrenListItemValue(innerList);
|
|
247
|
+
}
|
|
248
|
+
} else if (isNestedListNode(previousSibling)) {
|
|
249
|
+
const innerList = previousSibling.getFirstChild();
|
|
250
|
+
if ($isListNode(innerList)) {
|
|
251
|
+
innerList.append(WebinyListItemNode);
|
|
252
|
+
updateChildrenListItemValue(innerList);
|
|
253
|
+
}
|
|
254
|
+
} else {
|
|
255
|
+
// otherwise, we need to create a new nested ListNode
|
|
256
|
+
|
|
257
|
+
if ($isListNode(parent)) {
|
|
258
|
+
const newListItem = $createListItemNode();
|
|
259
|
+
const newList = $createListNode(parent.getListType(), parent.getStyleId());
|
|
260
|
+
newListItem.append(newList);
|
|
261
|
+
newList.append(WebinyListItemNode);
|
|
262
|
+
if (previousSibling) {
|
|
263
|
+
previousSibling.insertAfter(newListItem);
|
|
264
|
+
} else if (nextSibling) {
|
|
265
|
+
nextSibling.insertBefore(newListItem);
|
|
266
|
+
} else {
|
|
267
|
+
parent.append(newListItem);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if ($isListNode(parent)) {
|
|
272
|
+
updateChildrenListItemValue(parent);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
export function $handleOutdent(WebinyListItemNodes) {
|
|
277
|
+
// go through each node and decide where to move it.
|
|
278
|
+
|
|
279
|
+
WebinyListItemNodes.forEach(WebinyListItemNode => {
|
|
280
|
+
if (isNestedListNode(WebinyListItemNode)) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
const parentList = WebinyListItemNode.getParent();
|
|
284
|
+
const grandparentListItem = parentList ? parentList.getParent() : undefined;
|
|
285
|
+
const greatGrandparentList = grandparentListItem ? grandparentListItem.getParent() : undefined;
|
|
286
|
+
// If it doesn't have these ancestors, it's not indented.
|
|
287
|
+
|
|
288
|
+
if ($isListNode(greatGrandparentList) && $isListItemNode(grandparentListItem) && $isListNode(parentList)) {
|
|
289
|
+
// if it's the first child in it's parent list, insert it into the
|
|
290
|
+
// great grandparent list before the grandparent
|
|
291
|
+
const firstChild = parentList ? parentList.getFirstChild() : undefined;
|
|
292
|
+
const lastChild = parentList ? parentList.getLastChild() : undefined;
|
|
293
|
+
if (WebinyListItemNode.is(firstChild)) {
|
|
294
|
+
grandparentListItem.insertBefore(WebinyListItemNode);
|
|
295
|
+
if (parentList.isEmpty()) {
|
|
296
|
+
grandparentListItem.remove();
|
|
297
|
+
}
|
|
298
|
+
// if it's the last child in it's parent list, insert it into the
|
|
299
|
+
// great grandparent list after the grandparent.
|
|
300
|
+
} else if (WebinyListItemNode.is(lastChild)) {
|
|
301
|
+
grandparentListItem.insertAfter(WebinyListItemNode);
|
|
302
|
+
if (parentList.isEmpty()) {
|
|
303
|
+
grandparentListItem.remove();
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
// otherwise, we need to split the siblings into two new nested lists
|
|
307
|
+
const listType = parentList.getListType();
|
|
308
|
+
const themeStyleId = parentList.getStyleId();
|
|
309
|
+
const previousSiblingsListItem = $createListItemNode();
|
|
310
|
+
const previousSiblingsList = $createListNode(listType, themeStyleId);
|
|
311
|
+
previousSiblingsListItem.append(previousSiblingsList);
|
|
312
|
+
WebinyListItemNode.getPreviousSiblings().forEach(sibling => previousSiblingsList.append(sibling));
|
|
313
|
+
const nextSiblingsListItem = $createListItemNode();
|
|
314
|
+
const nextSiblingsList = $createListNode(listType, themeStyleId);
|
|
315
|
+
nextSiblingsListItem.append(nextSiblingsList);
|
|
316
|
+
append(nextSiblingsList, WebinyListItemNode.getNextSiblings());
|
|
317
|
+
// put the sibling nested lists on either side of the grandparent list item in the great grandparent.
|
|
318
|
+
grandparentListItem.insertBefore(previousSiblingsListItem);
|
|
319
|
+
grandparentListItem.insertAfter(nextSiblingsListItem);
|
|
320
|
+
// replace the grandparent list item (now between the siblings) with the outdented list item.
|
|
321
|
+
grandparentListItem.replace(WebinyListItemNode);
|
|
322
|
+
}
|
|
323
|
+
updateChildrenListItemValue(parentList);
|
|
324
|
+
updateChildrenListItemValue(greatGrandparentList);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function maybeIndentOrOutdent(direction) {
|
|
329
|
+
const selection = $getSelection();
|
|
330
|
+
if (!$isRangeSelection(selection)) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const selectedNodes = selection.getNodes();
|
|
334
|
+
let webinyListItemNodes = [];
|
|
335
|
+
if (selectedNodes.length === 0) {
|
|
336
|
+
selectedNodes.push(selection.anchor.getNode());
|
|
337
|
+
}
|
|
338
|
+
if (selectedNodes.length === 1) {
|
|
339
|
+
// Only 1 node selected. Selection may not contain the ListNodeItem so we traverse the tree to
|
|
340
|
+
// find whether this is part of a WebinyListItemNode
|
|
341
|
+
const nearestWebinyListItemNode = findNearestListItemNode(selectedNodes[0]);
|
|
342
|
+
if (nearestWebinyListItemNode !== null) {
|
|
343
|
+
webinyListItemNodes = [nearestWebinyListItemNode];
|
|
344
|
+
}
|
|
345
|
+
} else {
|
|
346
|
+
webinyListItemNodes = getUniqueListItemNodes(selectedNodes);
|
|
347
|
+
}
|
|
348
|
+
if (webinyListItemNodes.length > 0) {
|
|
349
|
+
if (direction === "indent") {
|
|
350
|
+
$handleIndent(webinyListItemNodes);
|
|
351
|
+
} else {
|
|
352
|
+
$handleOutdent(webinyListItemNodes);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
export function indentList() {
|
|
357
|
+
maybeIndentOrOutdent("indent");
|
|
358
|
+
}
|
|
359
|
+
export function outdentList() {
|
|
360
|
+
maybeIndentOrOutdent("outdent");
|
|
361
|
+
}
|
|
362
|
+
export function $handleListInsertParagraph() {
|
|
363
|
+
const selection = $getSelection();
|
|
364
|
+
if (!$isRangeSelection(selection) || !selection.isCollapsed()) {
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Only run this code on empty list items
|
|
369
|
+
const anchor = selection.anchor.getNode();
|
|
370
|
+
if (!$isListItemNode(anchor) || anchor.getTextContent() !== "") {
|
|
371
|
+
return false;
|
|
372
|
+
}
|
|
373
|
+
const topListNode = $getTopListNode(anchor);
|
|
374
|
+
const parent = anchor.getParent();
|
|
375
|
+
if (!$isListNode(parent)) {
|
|
376
|
+
console.log("A WebinyListItemNode must have a WebinyListNode for a parent.");
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
const grandparent = parent?.getParent() || null;
|
|
380
|
+
let replacementNode;
|
|
381
|
+
if ($isRootOrShadowRoot(grandparent)) {
|
|
382
|
+
replacementNode = $createParagraphNode();
|
|
383
|
+
topListNode.insertAfter(replacementNode);
|
|
384
|
+
} else if ($isListItemNode(grandparent)) {
|
|
385
|
+
replacementNode = $createListItemNode();
|
|
386
|
+
grandparent.insertAfter(replacementNode);
|
|
387
|
+
} else {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
replacementNode.select();
|
|
391
|
+
const nextSiblings = anchor.getNextSiblings();
|
|
392
|
+
if (nextSiblings.length > 0) {
|
|
393
|
+
const newList = $createListNode(parent?.getListType(), parent?.getStyleId());
|
|
394
|
+
if ($isParagraphNode(replacementNode)) {
|
|
395
|
+
replacementNode.insertAfter(newList);
|
|
396
|
+
} else {
|
|
397
|
+
const newListItem = $createListItemNode();
|
|
398
|
+
newListItem.append(newList);
|
|
399
|
+
replacementNode.insertAfter(newListItem);
|
|
400
|
+
}
|
|
401
|
+
nextSiblings.forEach(sibling => {
|
|
402
|
+
sibling.remove();
|
|
403
|
+
newList.append(sibling);
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Don't leave hanging nested empty lists
|
|
408
|
+
$removeHighestEmptyListParent(anchor);
|
|
409
|
+
return true;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
//# sourceMappingURL=formatList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["$getSelection","$isElementNode","$isLeafNode","$isParagraphNode","$isRangeSelection","$isRootOrShadowRoot","$createListNode","$isListNode","$getNearestNodeOfType","$createListItemNode","$isListItemNode","ListItemNode","$createParagraphNode","$getAllListItems","$getTopListNode","$removeHighestEmptyListParent","findNearestListItemNode","getUniqueListItemNodes","isNestedListNode","DEFAULT_LIST_START_NUMBER","$isSelectingEmptyListItem","anchorNode","nodes","length","is","getChildrenSize","$getListItemValue","listItem","list","getParent","value","console","log","getStart","siblings","getPreviousSiblings","i","sibling","getFirstChild","insertList","editor","listType","styleId","update","selection","getNodes","anchor","getNode","anchorNodeParent","replace","setFormat","getFormatType","setIndent","getIndent","append","parent","getParentOrThrow","getChildren","handled","Set","node","isEmpty","has","getKey","createListOrMerge","parentKey","newListNode","updateChildrenListItemValue","add","nextParent","nodesToAppend","splice","previousSibling","getPreviousSibling","nextSibling","getNextSibling","getListType","remove","getFirstChildOrThrow","insertBefore","mergeLists","list1","list2","listItem1","getLastChild","listItem2","toMerge","removeList","listNodes","listItemNode","listNode","insertionPoint","listItems","paragraph","insertAfter","__key","key","set","focus","children","childrenOrExisting","undefined","child","prevValue","getValue","nextValue","setValue","$handleIndent","WebinyListItemNodes","removed","forEach","WebinyListItemNode","innerList","nextInnerList","firstChild","newListItem","newList","getStyleId","$handleOutdent","parentList","grandparentListItem","greatGrandparentList","lastChild","themeStyleId","previousSiblingsListItem","previousSiblingsList","nextSiblingsListItem","nextSiblingsList","getNextSiblings","maybeIndentOrOutdent","direction","selectedNodes","webinyListItemNodes","push","nearestWebinyListItemNode","indentList","outdentList","$handleListInsertParagraph","isCollapsed","getTextContent","topListNode","grandparent","replacementNode","select","nextSiblings"],"sources":["formatList.ts"],"sourcesContent":["import type { ElementNode, LexicalEditor, LexicalNode, NodeKey } from \"lexical\";\nimport {\n $getSelection,\n $isElementNode,\n $isLeafNode,\n $isParagraphNode,\n $isRangeSelection,\n $isRootOrShadowRoot\n} from \"lexical\";\nimport type { ListNode } from \"~/ListNode\";\nimport { $createListNode, $isListNode } from \"~/ListNode\";\nimport { $getNearestNodeOfType } from \"@lexical/utils\";\nimport { $createListItemNode, $isListItemNode, ListItemNode } from \"~/ListItemNode\";\nimport type { ListType } from \"@lexical/list\";\nimport type { ParagraphNode } from \"~/ParagraphNode\";\nimport { $createParagraphNode } from \"~/ParagraphNode\";\nimport {\n $getAllListItems,\n $getTopListNode,\n $removeHighestEmptyListParent,\n findNearestListItemNode,\n getUniqueListItemNodes,\n isNestedListNode\n} from \"~/utils/listNode\";\n\nconst DEFAULT_LIST_START_NUMBER = 1;\n\nfunction $isSelectingEmptyListItem(\n anchorNode: ListItemNode | LexicalNode,\n nodes: Array<LexicalNode>\n): boolean {\n return (\n $isListItemNode(anchorNode) &&\n (nodes.length === 0 ||\n (nodes.length === 1 && anchorNode.is(nodes[0]) && anchorNode.getChildrenSize() === 0))\n );\n}\n\nfunction $getListItemValue(listItem: ListItemNode): number {\n const list = listItem.getParent();\n\n let value = 1;\n\n if (list !== null) {\n if (!$isListNode(list)) {\n console.log(\n \"$getListItemValue: webiny list node is not parent of webiny list item node\"\n );\n return DEFAULT_LIST_START_NUMBER;\n } else {\n value = list.getStart();\n }\n }\n\n const siblings = listItem.getPreviousSiblings();\n for (let i = 0; i < siblings.length; i++) {\n const sibling = siblings[i];\n\n if ($isListItemNode(sibling) && !$isListNode(sibling.getFirstChild())) {\n value++;\n }\n }\n return value;\n}\n\nexport function insertList(editor: LexicalEditor, listType: ListType, styleId?: string): void {\n editor.update(() => {\n const selection = $getSelection();\n\n if (selection && $isRangeSelection(selection)) {\n const nodes = selection.getNodes();\n const anchor = selection.anchor;\n const anchorNode = anchor.getNode();\n const anchorNodeParent = anchorNode.getParent();\n\n if ($isSelectingEmptyListItem(anchorNode, nodes)) {\n const list = $createListNode(listType, styleId);\n\n if ($isRootOrShadowRoot(anchorNodeParent)) {\n anchorNode.replace(list);\n const listItem = $createListItemNode();\n if ($isElementNode(anchorNode)) {\n listItem.setFormat(anchorNode.getFormatType());\n listItem.setIndent(anchorNode.getIndent());\n }\n list.append(listItem);\n } else if ($isListItemNode(anchorNode)) {\n const parent = anchorNode.getParentOrThrow();\n append(list, parent.getChildren());\n parent.replace(list);\n }\n\n return;\n } else {\n const handled = new Set();\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if ($isElementNode(node) && node.isEmpty() && !handled.has(node.getKey())) {\n createListOrMerge(node, listType, styleId);\n continue;\n }\n\n if ($isLeafNode(node)) {\n let parent = node.getParent();\n while (parent != null) {\n const parentKey = parent.getKey();\n\n if ($isListNode(parent)) {\n if (!handled.has(parentKey)) {\n const newListNode = $createListNode(listType, styleId);\n append(newListNode, parent.getChildren());\n parent.replace(newListNode);\n updateChildrenListItemValue(newListNode);\n handled.add(parentKey);\n }\n\n break;\n } else {\n const nextParent = parent.getParent();\n\n if ($isRootOrShadowRoot(nextParent) && !handled.has(parentKey)) {\n handled.add(parentKey);\n createListOrMerge(parent, listType, styleId);\n break;\n }\n\n parent = nextParent;\n }\n }\n }\n }\n }\n }\n });\n}\n\nfunction append(node: ElementNode, nodesToAppend: Array<LexicalNode>) {\n node.splice(node.getChildrenSize(), 0, nodesToAppend);\n}\n\nfunction createListOrMerge(node: ElementNode, listType: ListType, styleId?: string): ListNode {\n if ($isListNode(node)) {\n return node;\n }\n\n const previousSibling = node.getPreviousSibling();\n const nextSibling = node.getNextSibling();\n const listItem = $createListItemNode();\n listItem.setFormat(node.getFormatType());\n listItem.setIndent(node.getIndent());\n append(listItem, node.getChildren());\n\n if ($isListNode(previousSibling) && listType === previousSibling.getListType()) {\n previousSibling.append(listItem);\n node.remove();\n // if the same type of list is on both sides, merge them.\n\n if ($isListNode(nextSibling) && listType === nextSibling.getListType()) {\n append(previousSibling, nextSibling.getChildren());\n nextSibling.remove();\n }\n return previousSibling;\n } else if ($isListNode(nextSibling) && listType === nextSibling.getListType()) {\n nextSibling.getFirstChildOrThrow().insertBefore(listItem);\n node.remove();\n return nextSibling;\n } else {\n const list = $createListNode(listType, styleId);\n list.append(listItem);\n node.replace(list);\n updateChildrenListItemValue(list);\n return list;\n }\n}\n\n/**\n * A recursive function that goes through each list and their children, including nested lists,\n * appending list2 children after list1 children and updating ListItemNode values.\n * @param list1 - The first list to be merged.\n * @param list2 - The second list to be merged.\n */\nexport function mergeLists(list1: ListNode, list2: ListNode): void {\n const listItem1 = list1.getLastChild();\n const listItem2 = list2.getFirstChild();\n\n if (listItem1 && listItem2 && isNestedListNode(listItem1) && isNestedListNode(listItem2)) {\n mergeLists(listItem1.getFirstChild(), listItem2.getFirstChild());\n listItem2.remove();\n }\n\n const toMerge = list2.getChildren();\n if (toMerge.length > 0) {\n list1.append(...toMerge);\n updateChildrenListItemValue(list1);\n }\n\n list2.remove();\n}\n\nexport function removeList(editor: LexicalEditor): void {\n editor.update(() => {\n const selection = $getSelection();\n\n if ($isRangeSelection(selection)) {\n const listNodes = new Set<ListNode>();\n const nodes = selection.getNodes();\n const anchorNode = selection.anchor.getNode();\n\n if ($isSelectingEmptyListItem(anchorNode, nodes)) {\n listNodes.add($getTopListNode(anchorNode));\n } else {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if ($isLeafNode(node)) {\n const listItemNode = $getNearestNodeOfType(node, ListItemNode);\n\n if (listItemNode != null) {\n listNodes.add($getTopListNode(listItemNode));\n }\n }\n }\n }\n\n for (const listNode of listNodes) {\n let insertionPoint: ListNode | ParagraphNode = listNode;\n\n const listItems = $getAllListItems(listNode);\n\n for (const listItemNode of listItems) {\n const paragraph = $createParagraphNode();\n\n append(paragraph, listItemNode.getChildren());\n\n insertionPoint.insertAfter(paragraph);\n insertionPoint = paragraph;\n\n // When the anchor and focus fall on the textNode\n // we don't have to change the selection because the textNode will be appended to\n // the newly generated paragraph.\n // When selection is in empty nested list item, selection is actually on the listItemNode.\n // When the corresponding listItemNode is deleted and replaced by the newly generated paragraph\n // we should manually set the selection's focus and anchor to the newly generated paragraph.\n if (listItemNode.__key === selection.anchor.key) {\n selection.anchor.set(paragraph.getKey(), 0, \"element\");\n }\n if (listItemNode.__key === selection.focus.key) {\n selection.focus.set(paragraph.getKey(), 0, \"element\");\n }\n\n listItemNode.remove();\n }\n listNode.remove();\n }\n }\n });\n}\n\nexport function updateChildrenListItemValue(list: ListNode, children?: Array<LexicalNode>): void {\n const childrenOrExisting = children || list.getChildren();\n if (childrenOrExisting !== undefined) {\n for (let i = 0; i < childrenOrExisting.length; i++) {\n const child = childrenOrExisting[i];\n if ($isListItemNode(child)) {\n const prevValue = child.getValue();\n const nextValue = $getListItemValue(child);\n\n if (prevValue !== nextValue) {\n child.setValue(nextValue);\n }\n }\n }\n }\n}\n\nexport function $handleIndent(WebinyListItemNodes: Array<ListItemNode>): void {\n // go through each node and decide where to move it.\n const removed = new Set<NodeKey>();\n\n WebinyListItemNodes.forEach((WebinyListItemNode: ListItemNode) => {\n if (isNestedListNode(WebinyListItemNode) || removed.has(WebinyListItemNode.getKey())) {\n return;\n }\n\n const parent = WebinyListItemNode.getParent();\n\n // We can cast both of the below `isNestedListNode` only returns a boolean type instead of a user-defined type guards\n const nextSibling = WebinyListItemNode.getNextSibling<ListItemNode>() as ListItemNode;\n const previousSibling =\n WebinyListItemNode.getPreviousSibling<ListItemNode>() as ListItemNode;\n // if there are nested lists on either side, merge them all together.\n\n if (isNestedListNode(nextSibling) && isNestedListNode(previousSibling)) {\n const innerList = previousSibling.getFirstChild();\n\n if ($isListNode(innerList)) {\n innerList.append(WebinyListItemNode);\n const nextInnerList = nextSibling.getFirstChild();\n\n if ($isListNode(nextInnerList)) {\n const children = nextInnerList.getChildren();\n append(innerList, children);\n nextSibling.remove();\n removed.add(nextSibling.getKey());\n }\n updateChildrenListItemValue(innerList);\n }\n } else if (isNestedListNode(nextSibling)) {\n // if the WebinyListItemNode is next to a nested ListNode, merge them\n const innerList = nextSibling.getFirstChild();\n\n if ($isListNode(innerList)) {\n const firstChild = innerList.getFirstChild();\n\n if (firstChild !== null) {\n firstChild.insertBefore(WebinyListItemNode);\n }\n updateChildrenListItemValue(innerList);\n }\n } else if (isNestedListNode(previousSibling)) {\n const innerList = previousSibling.getFirstChild();\n\n if ($isListNode(innerList)) {\n innerList.append(WebinyListItemNode);\n updateChildrenListItemValue(innerList);\n }\n } else {\n // otherwise, we need to create a new nested ListNode\n\n if ($isListNode(parent)) {\n const newListItem = $createListItemNode();\n const newList = $createListNode(parent.getListType(), parent.getStyleId());\n newListItem.append(newList);\n newList.append(WebinyListItemNode);\n\n if (previousSibling) {\n previousSibling.insertAfter(newListItem);\n } else if (nextSibling) {\n nextSibling.insertBefore(newListItem);\n } else {\n parent.append(newListItem);\n }\n }\n }\n\n if ($isListNode(parent)) {\n updateChildrenListItemValue(parent);\n }\n });\n}\n\nexport function $handleOutdent(WebinyListItemNodes: Array<ListItemNode>): void {\n // go through each node and decide where to move it.\n\n WebinyListItemNodes.forEach(WebinyListItemNode => {\n if (isNestedListNode(WebinyListItemNode)) {\n return;\n }\n const parentList = WebinyListItemNode.getParent();\n const grandparentListItem = parentList ? parentList.getParent() : undefined;\n const greatGrandparentList = grandparentListItem\n ? grandparentListItem.getParent()\n : undefined;\n // If it doesn't have these ancestors, it's not indented.\n\n if (\n $isListNode(greatGrandparentList) &&\n $isListItemNode(grandparentListItem) &&\n $isListNode(parentList)\n ) {\n // if it's the first child in it's parent list, insert it into the\n // great grandparent list before the grandparent\n const firstChild = parentList ? parentList.getFirstChild() : undefined;\n const lastChild = parentList ? parentList.getLastChild() : undefined;\n\n if (WebinyListItemNode.is(firstChild)) {\n grandparentListItem.insertBefore(WebinyListItemNode);\n\n if (parentList.isEmpty()) {\n grandparentListItem.remove();\n }\n // if it's the last child in it's parent list, insert it into the\n // great grandparent list after the grandparent.\n } else if (WebinyListItemNode.is(lastChild)) {\n grandparentListItem.insertAfter(WebinyListItemNode);\n\n if (parentList.isEmpty()) {\n grandparentListItem.remove();\n }\n } else {\n // otherwise, we need to split the siblings into two new nested lists\n const listType = parentList.getListType();\n const themeStyleId = parentList.getStyleId();\n const previousSiblingsListItem = $createListItemNode();\n const previousSiblingsList = $createListNode(listType, themeStyleId);\n previousSiblingsListItem.append(previousSiblingsList);\n WebinyListItemNode.getPreviousSiblings().forEach(sibling =>\n previousSiblingsList.append(sibling)\n );\n const nextSiblingsListItem = $createListItemNode();\n const nextSiblingsList = $createListNode(listType, themeStyleId);\n nextSiblingsListItem.append(nextSiblingsList);\n append(nextSiblingsList, WebinyListItemNode.getNextSiblings());\n // put the sibling nested lists on either side of the grandparent list item in the great grandparent.\n grandparentListItem.insertBefore(previousSiblingsListItem);\n grandparentListItem.insertAfter(nextSiblingsListItem);\n // replace the grandparent list item (now between the siblings) with the outdented list item.\n grandparentListItem.replace(WebinyListItemNode);\n }\n updateChildrenListItemValue(parentList);\n updateChildrenListItemValue(greatGrandparentList);\n }\n });\n}\n\nfunction maybeIndentOrOutdent(direction: \"indent\" | \"outdent\"): void {\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection)) {\n return;\n }\n const selectedNodes = selection.getNodes();\n let webinyListItemNodes: Array<ListItemNode> = [];\n\n if (selectedNodes.length === 0) {\n selectedNodes.push(selection.anchor.getNode());\n }\n\n if (selectedNodes.length === 1) {\n // Only 1 node selected. Selection may not contain the ListNodeItem so we traverse the tree to\n // find whether this is part of a WebinyListItemNode\n const nearestWebinyListItemNode = findNearestListItemNode(selectedNodes[0]);\n\n if (nearestWebinyListItemNode !== null) {\n webinyListItemNodes = [nearestWebinyListItemNode];\n }\n } else {\n webinyListItemNodes = getUniqueListItemNodes(selectedNodes);\n }\n\n if (webinyListItemNodes.length > 0) {\n if (direction === \"indent\") {\n $handleIndent(webinyListItemNodes);\n } else {\n $handleOutdent(webinyListItemNodes);\n }\n }\n}\n\nexport function indentList(): void {\n maybeIndentOrOutdent(\"indent\");\n}\n\nexport function outdentList(): void {\n maybeIndentOrOutdent(\"outdent\");\n}\n\nexport function $handleListInsertParagraph(): boolean {\n const selection = $getSelection();\n\n if (!$isRangeSelection(selection) || !selection.isCollapsed()) {\n return false;\n }\n\n // Only run this code on empty list items\n const anchor = selection.anchor.getNode();\n\n if (!$isListItemNode(anchor) || anchor.getTextContent() !== \"\") {\n return false;\n }\n const topListNode = $getTopListNode(anchor);\n const parent = anchor.getParent();\n\n if (!$isListNode(parent)) {\n console.log(\"A WebinyListItemNode must have a WebinyListNode for a parent.\");\n return false;\n }\n\n const grandparent = parent?.getParent() || null;\n\n let replacementNode;\n\n if ($isRootOrShadowRoot(grandparent)) {\n replacementNode = $createParagraphNode();\n topListNode.insertAfter(replacementNode);\n } else if ($isListItemNode(grandparent)) {\n replacementNode = $createListItemNode();\n grandparent.insertAfter(replacementNode);\n } else {\n return false;\n }\n replacementNode.select();\n\n const nextSiblings = anchor.getNextSiblings();\n\n if (nextSiblings.length > 0) {\n const newList = $createListNode(parent?.getListType(), parent?.getStyleId());\n\n if ($isParagraphNode(replacementNode)) {\n replacementNode.insertAfter(newList);\n } else {\n const newListItem = $createListItemNode();\n newListItem.append(newList);\n replacementNode.insertAfter(newListItem);\n }\n nextSiblings.forEach(sibling => {\n sibling.remove();\n newList.append(sibling);\n });\n }\n\n // Don't leave hanging nested empty lists\n $removeHighestEmptyListParent(anchor);\n\n return true;\n}\n"],"mappings":"AACA,SACIA,aAAa,EACbC,cAAc,EACdC,WAAW,EACXC,gBAAgB,EAChBC,iBAAiB,EACjBC,mBAAmB,QAChB,SAAS;AAEhB,SAASC,eAAe,EAAEC,WAAW;AACrC,SAASC,qBAAqB,QAAQ,gBAAgB;AACtD,SAASC,mBAAmB,EAAEC,eAAe,EAAEC,YAAY;AAG3D,SAASC,oBAAoB;AAC7B,SACIC,gBAAgB,EAChBC,eAAe,EACfC,6BAA6B,EAC7BC,uBAAuB,EACvBC,sBAAsB,EACtBC,gBAAgB;AAGpB,MAAMC,yBAAyB,GAAG,CAAC;AAEnC,SAASC,yBAAyBA,CAC9BC,UAAsC,EACtCC,KAAyB,EAClB;EACP,OACIZ,eAAe,CAACW,UAAU,CAAC,KAC1BC,KAAK,CAACC,MAAM,KAAK,CAAC,IACdD,KAAK,CAACC,MAAM,KAAK,CAAC,IAAIF,UAAU,CAACG,EAAE,CAACF,KAAK,CAAC,CAAC,CAAC,CAAC,IAAID,UAAU,CAACI,eAAe,CAAC,CAAC,KAAK,CAAE,CAAC;AAElG;AAEA,SAASC,iBAAiBA,CAACC,QAAsB,EAAU;EACvD,MAAMC,IAAI,GAAGD,QAAQ,CAACE,SAAS,CAAC,CAAC;EAEjC,IAAIC,KAAK,GAAG,CAAC;EAEb,IAAIF,IAAI,KAAK,IAAI,EAAE;IACf,IAAI,CAACrB,WAAW,CAACqB,IAAI,CAAC,EAAE;MACpBG,OAAO,CAACC,GAAG,CACP,4EACJ,CAAC;MACD,OAAOb,yBAAyB;IACpC,CAAC,MAAM;MACHW,KAAK,GAAGF,IAAI,CAACK,QAAQ,CAAC,CAAC;IAC3B;EACJ;EAEA,MAAMC,QAAQ,GAAGP,QAAQ,CAACQ,mBAAmB,CAAC,CAAC;EAC/C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,QAAQ,CAACX,MAAM,EAAEa,CAAC,EAAE,EAAE;IACtC,MAAMC,OAAO,GAAGH,QAAQ,CAACE,CAAC,CAAC;IAE3B,IAAI1B,eAAe,CAAC2B,OAAO,CAAC,IAAI,CAAC9B,WAAW,CAAC8B,OAAO,CAACC,aAAa,CAAC,CAAC,CAAC,EAAE;MACnER,KAAK,EAAE;IACX;EACJ;EACA,OAAOA,KAAK;AAChB;AAEA,OAAO,SAASS,UAAUA,CAACC,MAAqB,EAAEC,QAAkB,EAAEC,OAAgB,EAAQ;EAC1FF,MAAM,CAACG,MAAM,CAAC,MAAM;IAChB,MAAMC,SAAS,GAAG5C,aAAa,CAAC,CAAC;IAEjC,IAAI4C,SAAS,IAAIxC,iBAAiB,CAACwC,SAAS,CAAC,EAAE;MAC3C,MAAMtB,KAAK,GAAGsB,SAAS,CAACC,QAAQ,CAAC,CAAC;MAClC,MAAMC,MAAM,GAAGF,SAAS,CAACE,MAAM;MAC/B,MAAMzB,UAAU,GAAGyB,MAAM,CAACC,OAAO,CAAC,CAAC;MACnC,MAAMC,gBAAgB,GAAG3B,UAAU,CAACQ,SAAS,CAAC,CAAC;MAE/C,IAAIT,yBAAyB,CAACC,UAAU,EAAEC,KAAK,CAAC,EAAE;QAC9C,MAAMM,IAAI,GAAGtB,eAAe,CAACmC,QAAQ,EAAEC,OAAO,CAAC;QAE/C,IAAIrC,mBAAmB,CAAC2C,gBAAgB,CAAC,EAAE;UACvC3B,UAAU,CAAC4B,OAAO,CAACrB,IAAI,CAAC;UACxB,MAAMD,QAAQ,GAAGlB,mBAAmB,CAAC,CAAC;UACtC,IAAIR,cAAc,CAACoB,UAAU,CAAC,EAAE;YAC5BM,QAAQ,CAACuB,SAAS,CAAC7B,UAAU,CAAC8B,aAAa,CAAC,CAAC,CAAC;YAC9CxB,QAAQ,CAACyB,SAAS,CAAC/B,UAAU,CAACgC,SAAS,CAAC,CAAC,CAAC;UAC9C;UACAzB,IAAI,CAAC0B,MAAM,CAAC3B,QAAQ,CAAC;QACzB,CAAC,MAAM,IAAIjB,eAAe,CAACW,UAAU,CAAC,EAAE;UACpC,MAAMkC,MAAM,GAAGlC,UAAU,CAACmC,gBAAgB,CAAC,CAAC;UAC5CF,MAAM,CAAC1B,IAAI,EAAE2B,MAAM,CAACE,WAAW,CAAC,CAAC,CAAC;UAClCF,MAAM,CAACN,OAAO,CAACrB,IAAI,CAAC;QACxB;QAEA;MACJ,CAAC,MAAM;QACH,MAAM8B,OAAO,GAAG,IAAIC,GAAG,CAAC,CAAC;QACzB,KAAK,IAAIvB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGd,KAAK,CAACC,MAAM,EAAEa,CAAC,EAAE,EAAE;UACnC,MAAMwB,IAAI,GAAGtC,KAAK,CAACc,CAAC,CAAC;UAErB,IAAInC,cAAc,CAAC2D,IAAI,CAAC,IAAIA,IAAI,CAACC,OAAO,CAAC,CAAC,IAAI,CAACH,OAAO,CAACI,GAAG,CAACF,IAAI,CAACG,MAAM,CAAC,CAAC,CAAC,EAAE;YACvEC,iBAAiB,CAACJ,IAAI,EAAEnB,QAAQ,EAAEC,OAAO,CAAC;YAC1C;UACJ;UAEA,IAAIxC,WAAW,CAAC0D,IAAI,CAAC,EAAE;YACnB,IAAIL,MAAM,GAAGK,IAAI,CAAC/B,SAAS,CAAC,CAAC;YAC7B,OAAO0B,MAAM,IAAI,IAAI,EAAE;cACnB,MAAMU,SAAS,GAAGV,MAAM,CAACQ,MAAM,CAAC,CAAC;cAEjC,IAAIxD,WAAW,CAACgD,MAAM,CAAC,EAAE;gBACrB,IAAI,CAACG,OAAO,CAACI,GAAG,CAACG,SAAS,CAAC,EAAE;kBACzB,MAAMC,WAAW,GAAG5D,eAAe,CAACmC,QAAQ,EAAEC,OAAO,CAAC;kBACtDY,MAAM,CAACY,WAAW,EAAEX,MAAM,CAACE,WAAW,CAAC,CAAC,CAAC;kBACzCF,MAAM,CAACN,OAAO,CAACiB,WAAW,CAAC;kBAC3BC,2BAA2B,CAACD,WAAW,CAAC;kBACxCR,OAAO,CAACU,GAAG,CAACH,SAAS,CAAC;gBAC1B;gBAEA;cACJ,CAAC,MAAM;gBACH,MAAMI,UAAU,GAAGd,MAAM,CAAC1B,SAAS,CAAC,CAAC;gBAErC,IAAIxB,mBAAmB,CAACgE,UAAU,CAAC,IAAI,CAACX,OAAO,CAACI,GAAG,CAACG,SAAS,CAAC,EAAE;kBAC5DP,OAAO,CAACU,GAAG,CAACH,SAAS,CAAC;kBACtBD,iBAAiB,CAACT,MAAM,EAAEd,QAAQ,EAAEC,OAAO,CAAC;kBAC5C;gBACJ;gBAEAa,MAAM,GAAGc,UAAU;cACvB;YACJ;UACJ;QACJ;MACJ;IACJ;EACJ,CAAC,CAAC;AACN;AAEA,SAASf,MAAMA,CAACM,IAAiB,EAAEU,aAAiC,EAAE;EAClEV,IAAI,CAACW,MAAM,CAACX,IAAI,CAACnC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE6C,aAAa,CAAC;AACzD;AAEA,SAASN,iBAAiBA,CAACJ,IAAiB,EAAEnB,QAAkB,EAAEC,OAAgB,EAAY;EAC1F,IAAInC,WAAW,CAACqD,IAAI,CAAC,EAAE;IACnB,OAAOA,IAAI;EACf;EAEA,MAAMY,eAAe,GAAGZ,IAAI,CAACa,kBAAkB,CAAC,CAAC;EACjD,MAAMC,WAAW,GAAGd,IAAI,CAACe,cAAc,CAAC,CAAC;EACzC,MAAMhD,QAAQ,GAAGlB,mBAAmB,CAAC,CAAC;EACtCkB,QAAQ,CAACuB,SAAS,CAACU,IAAI,CAACT,aAAa,CAAC,CAAC,CAAC;EACxCxB,QAAQ,CAACyB,SAAS,CAACQ,IAAI,CAACP,SAAS,CAAC,CAAC,CAAC;EACpCC,MAAM,CAAC3B,QAAQ,EAAEiC,IAAI,CAACH,WAAW,CAAC,CAAC,CAAC;EAEpC,IAAIlD,WAAW,CAACiE,eAAe,CAAC,IAAI/B,QAAQ,KAAK+B,eAAe,CAACI,WAAW,CAAC,CAAC,EAAE;IAC5EJ,eAAe,CAAClB,MAAM,CAAC3B,QAAQ,CAAC;IAChCiC,IAAI,CAACiB,MAAM,CAAC,CAAC;IACb;;IAEA,IAAItE,WAAW,CAACmE,WAAW,CAAC,IAAIjC,QAAQ,KAAKiC,WAAW,CAACE,WAAW,CAAC,CAAC,EAAE;MACpEtB,MAAM,CAACkB,eAAe,EAAEE,WAAW,CAACjB,WAAW,CAAC,CAAC,CAAC;MAClDiB,WAAW,CAACG,MAAM,CAAC,CAAC;IACxB;IACA,OAAOL,eAAe;EAC1B,CAAC,MAAM,IAAIjE,WAAW,CAACmE,WAAW,CAAC,IAAIjC,QAAQ,KAAKiC,WAAW,CAACE,WAAW,CAAC,CAAC,EAAE;IAC3EF,WAAW,CAACI,oBAAoB,CAAC,CAAC,CAACC,YAAY,CAACpD,QAAQ,CAAC;IACzDiC,IAAI,CAACiB,MAAM,CAAC,CAAC;IACb,OAAOH,WAAW;EACtB,CAAC,MAAM;IACH,MAAM9C,IAAI,GAAGtB,eAAe,CAACmC,QAAQ,EAAEC,OAAO,CAAC;IAC/Cd,IAAI,CAAC0B,MAAM,CAAC3B,QAAQ,CAAC;IACrBiC,IAAI,CAACX,OAAO,CAACrB,IAAI,CAAC;IAClBuC,2BAA2B,CAACvC,IAAI,CAAC;IACjC,OAAOA,IAAI;EACf;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASoD,UAAUA,CAACC,KAAe,EAAEC,KAAe,EAAQ;EAC/D,MAAMC,SAAS,GAAGF,KAAK,CAACG,YAAY,CAAC,CAAC;EACtC,MAAMC,SAAS,GAAGH,KAAK,CAAC5C,aAAa,CAAC,CAAC;EAEvC,IAAI6C,SAAS,IAAIE,SAAS,IAAInE,gBAAgB,CAACiE,SAAS,CAAC,IAAIjE,gBAAgB,CAACmE,SAAS,CAAC,EAAE;IACtFL,UAAU,CAACG,SAAS,CAAC7C,aAAa,CAAC,CAAC,EAAE+C,SAAS,CAAC/C,aAAa,CAAC,CAAC,CAAC;IAChE+C,SAAS,CAACR,MAAM,CAAC,CAAC;EACtB;EAEA,MAAMS,OAAO,GAAGJ,KAAK,CAACzB,WAAW,CAAC,CAAC;EACnC,IAAI6B,OAAO,CAAC/D,MAAM,GAAG,CAAC,EAAE;IACpB0D,KAAK,CAAC3B,MAAM,CAAC,GAAGgC,OAAO,CAAC;IACxBnB,2BAA2B,CAACc,KAAK,CAAC;EACtC;EAEAC,KAAK,CAACL,MAAM,CAAC,CAAC;AAClB;AAEA,OAAO,SAASU,UAAUA,CAAC/C,MAAqB,EAAQ;EACpDA,MAAM,CAACG,MAAM,CAAC,MAAM;IAChB,MAAMC,SAAS,GAAG5C,aAAa,CAAC,CAAC;IAEjC,IAAII,iBAAiB,CAACwC,SAAS,CAAC,EAAE;MAC9B,MAAM4C,SAAS,GAAG,IAAI7B,GAAG,CAAW,CAAC;MACrC,MAAMrC,KAAK,GAAGsB,SAAS,CAACC,QAAQ,CAAC,CAAC;MAClC,MAAMxB,UAAU,GAAGuB,SAAS,CAACE,MAAM,CAACC,OAAO,CAAC,CAAC;MAE7C,IAAI3B,yBAAyB,CAACC,UAAU,EAAEC,KAAK,CAAC,EAAE;QAC9CkE,SAAS,CAACpB,GAAG,CAACtD,eAAe,CAACO,UAAU,CAAC,CAAC;MAC9C,CAAC,MAAM;QACH,KAAK,IAAIe,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGd,KAAK,CAACC,MAAM,EAAEa,CAAC,EAAE,EAAE;UACnC,MAAMwB,IAAI,GAAGtC,KAAK,CAACc,CAAC,CAAC;UAErB,IAAIlC,WAAW,CAAC0D,IAAI,CAAC,EAAE;YACnB,MAAM6B,YAAY,GAAGjF,qBAAqB,CAACoD,IAAI,EAAEjD,YAAY,CAAC;YAE9D,IAAI8E,YAAY,IAAI,IAAI,EAAE;cACtBD,SAAS,CAACpB,GAAG,CAACtD,eAAe,CAAC2E,YAAY,CAAC,CAAC;YAChD;UACJ;QACJ;MACJ;MAEA,KAAK,MAAMC,QAAQ,IAAIF,SAAS,EAAE;QAC9B,IAAIG,cAAwC,GAAGD,QAAQ;QAEvD,MAAME,SAAS,GAAG/E,gBAAgB,CAAC6E,QAAQ,CAAC;QAE5C,KAAK,MAAMD,YAAY,IAAIG,SAAS,EAAE;UAClC,MAAMC,SAAS,GAAGjF,oBAAoB,CAAC,CAAC;UAExC0C,MAAM,CAACuC,SAAS,EAAEJ,YAAY,CAAChC,WAAW,CAAC,CAAC,CAAC;UAE7CkC,cAAc,CAACG,WAAW,CAACD,SAAS,CAAC;UACrCF,cAAc,GAAGE,SAAS;;UAE1B;UACA;UACA;UACA;UACA;UACA;UACA,IAAIJ,YAAY,CAACM,KAAK,KAAKnD,SAAS,CAACE,MAAM,CAACkD,GAAG,EAAE;YAC7CpD,SAAS,CAACE,MAAM,CAACmD,GAAG,CAACJ,SAAS,CAAC9B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;UAC1D;UACA,IAAI0B,YAAY,CAACM,KAAK,KAAKnD,SAAS,CAACsD,KAAK,CAACF,GAAG,EAAE;YAC5CpD,SAAS,CAACsD,KAAK,CAACD,GAAG,CAACJ,SAAS,CAAC9B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;UACzD;UAEA0B,YAAY,CAACZ,MAAM,CAAC,CAAC;QACzB;QACAa,QAAQ,CAACb,MAAM,CAAC,CAAC;MACrB;IACJ;EACJ,CAAC,CAAC;AACN;AAEA,OAAO,SAASV,2BAA2BA,CAACvC,IAAc,EAAEuE,QAA6B,EAAQ;EAC7F,MAAMC,kBAAkB,GAAGD,QAAQ,IAAIvE,IAAI,CAAC6B,WAAW,CAAC,CAAC;EACzD,IAAI2C,kBAAkB,KAAKC,SAAS,EAAE;IAClC,KAAK,IAAIjE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgE,kBAAkB,CAAC7E,MAAM,EAAEa,CAAC,EAAE,EAAE;MAChD,MAAMkE,KAAK,GAAGF,kBAAkB,CAAChE,CAAC,CAAC;MACnC,IAAI1B,eAAe,CAAC4F,KAAK,CAAC,EAAE;QACxB,MAAMC,SAAS,GAAGD,KAAK,CAACE,QAAQ,CAAC,CAAC;QAClC,MAAMC,SAAS,GAAG/E,iBAAiB,CAAC4E,KAAK,CAAC;QAE1C,IAAIC,SAAS,KAAKE,SAAS,EAAE;UACzBH,KAAK,CAACI,QAAQ,CAACD,SAAS,CAAC;QAC7B;MACJ;IACJ;EACJ;AACJ;AAEA,OAAO,SAASE,aAAaA,CAACC,mBAAwC,EAAQ;EAC1E;EACA,MAAMC,OAAO,GAAG,IAAIlD,GAAG,CAAU,CAAC;EAElCiD,mBAAmB,CAACE,OAAO,CAAEC,kBAAgC,IAAK;IAC9D,IAAI7F,gBAAgB,CAAC6F,kBAAkB,CAAC,IAAIF,OAAO,CAAC/C,GAAG,CAACiD,kBAAkB,CAAChD,MAAM,CAAC,CAAC,CAAC,EAAE;MAClF;IACJ;IAEA,MAAMR,MAAM,GAAGwD,kBAAkB,CAAClF,SAAS,CAAC,CAAC;;IAE7C;IACA,MAAM6C,WAAW,GAAGqC,kBAAkB,CAACpC,cAAc,CAAe,CAAiB;IACrF,MAAMH,eAAe,GACjBuC,kBAAkB,CAACtC,kBAAkB,CAAe,CAAiB;IACzE;;IAEA,IAAIvD,gBAAgB,CAACwD,WAAW,CAAC,IAAIxD,gBAAgB,CAACsD,eAAe,CAAC,EAAE;MACpE,MAAMwC,SAAS,GAAGxC,eAAe,CAAClC,aAAa,CAAC,CAAC;MAEjD,IAAI/B,WAAW,CAACyG,SAAS,CAAC,EAAE;QACxBA,SAAS,CAAC1D,MAAM,CAACyD,kBAAkB,CAAC;QACpC,MAAME,aAAa,GAAGvC,WAAW,CAACpC,aAAa,CAAC,CAAC;QAEjD,IAAI/B,WAAW,CAAC0G,aAAa,CAAC,EAAE;UAC5B,MAAMd,QAAQ,GAAGc,aAAa,CAACxD,WAAW,CAAC,CAAC;UAC5CH,MAAM,CAAC0D,SAAS,EAAEb,QAAQ,CAAC;UAC3BzB,WAAW,CAACG,MAAM,CAAC,CAAC;UACpBgC,OAAO,CAACzC,GAAG,CAACM,WAAW,CAACX,MAAM,CAAC,CAAC,CAAC;QACrC;QACAI,2BAA2B,CAAC6C,SAAS,CAAC;MAC1C;IACJ,CAAC,MAAM,IAAI9F,gBAAgB,CAACwD,WAAW,CAAC,EAAE;MACtC;MACA,MAAMsC,SAAS,GAAGtC,WAAW,CAACpC,aAAa,CAAC,CAAC;MAE7C,IAAI/B,WAAW,CAACyG,SAAS,CAAC,EAAE;QACxB,MAAME,UAAU,GAAGF,SAAS,CAAC1E,aAAa,CAAC,CAAC;QAE5C,IAAI4E,UAAU,KAAK,IAAI,EAAE;UACrBA,UAAU,CAACnC,YAAY,CAACgC,kBAAkB,CAAC;QAC/C;QACA5C,2BAA2B,CAAC6C,SAAS,CAAC;MAC1C;IACJ,CAAC,MAAM,IAAI9F,gBAAgB,CAACsD,eAAe,CAAC,EAAE;MAC1C,MAAMwC,SAAS,GAAGxC,eAAe,CAAClC,aAAa,CAAC,CAAC;MAEjD,IAAI/B,WAAW,CAACyG,SAAS,CAAC,EAAE;QACxBA,SAAS,CAAC1D,MAAM,CAACyD,kBAAkB,CAAC;QACpC5C,2BAA2B,CAAC6C,SAAS,CAAC;MAC1C;IACJ,CAAC,MAAM;MACH;;MAEA,IAAIzG,WAAW,CAACgD,MAAM,CAAC,EAAE;QACrB,MAAM4D,WAAW,GAAG1G,mBAAmB,CAAC,CAAC;QACzC,MAAM2G,OAAO,GAAG9G,eAAe,CAACiD,MAAM,CAACqB,WAAW,CAAC,CAAC,EAAErB,MAAM,CAAC8D,UAAU,CAAC,CAAC,CAAC;QAC1EF,WAAW,CAAC7D,MAAM,CAAC8D,OAAO,CAAC;QAC3BA,OAAO,CAAC9D,MAAM,CAACyD,kBAAkB,CAAC;QAElC,IAAIvC,eAAe,EAAE;UACjBA,eAAe,CAACsB,WAAW,CAACqB,WAAW,CAAC;QAC5C,CAAC,MAAM,IAAIzC,WAAW,EAAE;UACpBA,WAAW,CAACK,YAAY,CAACoC,WAAW,CAAC;QACzC,CAAC,MAAM;UACH5D,MAAM,CAACD,MAAM,CAAC6D,WAAW,CAAC;QAC9B;MACJ;IACJ;IAEA,IAAI5G,WAAW,CAACgD,MAAM,CAAC,EAAE;MACrBY,2BAA2B,CAACZ,MAAM,CAAC;IACvC;EACJ,CAAC,CAAC;AACN;AAEA,OAAO,SAAS+D,cAAcA,CAACV,mBAAwC,EAAQ;EAC3E;;EAEAA,mBAAmB,CAACE,OAAO,CAACC,kBAAkB,IAAI;IAC9C,IAAI7F,gBAAgB,CAAC6F,kBAAkB,CAAC,EAAE;MACtC;IACJ;IACA,MAAMQ,UAAU,GAAGR,kBAAkB,CAAClF,SAAS,CAAC,CAAC;IACjD,MAAM2F,mBAAmB,GAAGD,UAAU,GAAGA,UAAU,CAAC1F,SAAS,CAAC,CAAC,GAAGwE,SAAS;IAC3E,MAAMoB,oBAAoB,GAAGD,mBAAmB,GAC1CA,mBAAmB,CAAC3F,SAAS,CAAC,CAAC,GAC/BwE,SAAS;IACf;;IAEA,IACI9F,WAAW,CAACkH,oBAAoB,CAAC,IACjC/G,eAAe,CAAC8G,mBAAmB,CAAC,IACpCjH,WAAW,CAACgH,UAAU,CAAC,EACzB;MACE;MACA;MACA,MAAML,UAAU,GAAGK,UAAU,GAAGA,UAAU,CAACjF,aAAa,CAAC,CAAC,GAAG+D,SAAS;MACtE,MAAMqB,SAAS,GAAGH,UAAU,GAAGA,UAAU,CAACnC,YAAY,CAAC,CAAC,GAAGiB,SAAS;MAEpE,IAAIU,kBAAkB,CAACvF,EAAE,CAAC0F,UAAU,CAAC,EAAE;QACnCM,mBAAmB,CAACzC,YAAY,CAACgC,kBAAkB,CAAC;QAEpD,IAAIQ,UAAU,CAAC1D,OAAO,CAAC,CAAC,EAAE;UACtB2D,mBAAmB,CAAC3C,MAAM,CAAC,CAAC;QAChC;QACA;QACA;MACJ,CAAC,MAAM,IAAIkC,kBAAkB,CAACvF,EAAE,CAACkG,SAAS,CAAC,EAAE;QACzCF,mBAAmB,CAAC1B,WAAW,CAACiB,kBAAkB,CAAC;QAEnD,IAAIQ,UAAU,CAAC1D,OAAO,CAAC,CAAC,EAAE;UACtB2D,mBAAmB,CAAC3C,MAAM,CAAC,CAAC;QAChC;MACJ,CAAC,MAAM;QACH;QACA,MAAMpC,QAAQ,GAAG8E,UAAU,CAAC3C,WAAW,CAAC,CAAC;QACzC,MAAM+C,YAAY,GAAGJ,UAAU,CAACF,UAAU,CAAC,CAAC;QAC5C,MAAMO,wBAAwB,GAAGnH,mBAAmB,CAAC,CAAC;QACtD,MAAMoH,oBAAoB,GAAGvH,eAAe,CAACmC,QAAQ,EAAEkF,YAAY,CAAC;QACpEC,wBAAwB,CAACtE,MAAM,CAACuE,oBAAoB,CAAC;QACrDd,kBAAkB,CAAC5E,mBAAmB,CAAC,CAAC,CAAC2E,OAAO,CAACzE,OAAO,IACpDwF,oBAAoB,CAACvE,MAAM,CAACjB,OAAO,CACvC,CAAC;QACD,MAAMyF,oBAAoB,GAAGrH,mBAAmB,CAAC,CAAC;QAClD,MAAMsH,gBAAgB,GAAGzH,eAAe,CAACmC,QAAQ,EAAEkF,YAAY,CAAC;QAChEG,oBAAoB,CAACxE,MAAM,CAACyE,gBAAgB,CAAC;QAC7CzE,MAAM,CAACyE,gBAAgB,EAAEhB,kBAAkB,CAACiB,eAAe,CAAC,CAAC,CAAC;QAC9D;QACAR,mBAAmB,CAACzC,YAAY,CAAC6C,wBAAwB,CAAC;QAC1DJ,mBAAmB,CAAC1B,WAAW,CAACgC,oBAAoB,CAAC;QACrD;QACAN,mBAAmB,CAACvE,OAAO,CAAC8D,kBAAkB,CAAC;MACnD;MACA5C,2BAA2B,CAACoD,UAAU,CAAC;MACvCpD,2BAA2B,CAACsD,oBAAoB,CAAC;IACrD;EACJ,CAAC,CAAC;AACN;AAEA,SAASQ,oBAAoBA,CAACC,SAA+B,EAAQ;EACjE,MAAMtF,SAAS,GAAG5C,aAAa,CAAC,CAAC;EAEjC,IAAI,CAACI,iBAAiB,CAACwC,SAAS,CAAC,EAAE;IAC/B;EACJ;EACA,MAAMuF,aAAa,GAAGvF,SAAS,CAACC,QAAQ,CAAC,CAAC;EAC1C,IAAIuF,mBAAwC,GAAG,EAAE;EAEjD,IAAID,aAAa,CAAC5G,MAAM,KAAK,CAAC,EAAE;IAC5B4G,aAAa,CAACE,IAAI,CAACzF,SAAS,CAACE,MAAM,CAACC,OAAO,CAAC,CAAC,CAAC;EAClD;EAEA,IAAIoF,aAAa,CAAC5G,MAAM,KAAK,CAAC,EAAE;IAC5B;IACA;IACA,MAAM+G,yBAAyB,GAAGtH,uBAAuB,CAACmH,aAAa,CAAC,CAAC,CAAC,CAAC;IAE3E,IAAIG,yBAAyB,KAAK,IAAI,EAAE;MACpCF,mBAAmB,GAAG,CAACE,yBAAyB,CAAC;IACrD;EACJ,CAAC,MAAM;IACHF,mBAAmB,GAAGnH,sBAAsB,CAACkH,aAAa,CAAC;EAC/D;EAEA,IAAIC,mBAAmB,CAAC7G,MAAM,GAAG,CAAC,EAAE;IAChC,IAAI2G,SAAS,KAAK,QAAQ,EAAE;MACxBvB,aAAa,CAACyB,mBAAmB,CAAC;IACtC,CAAC,MAAM;MACHd,cAAc,CAACc,mBAAmB,CAAC;IACvC;EACJ;AACJ;AAEA,OAAO,SAASG,UAAUA,CAAA,EAAS;EAC/BN,oBAAoB,CAAC,QAAQ,CAAC;AAClC;AAEA,OAAO,SAASO,WAAWA,CAAA,EAAS;EAChCP,oBAAoB,CAAC,SAAS,CAAC;AACnC;AAEA,OAAO,SAASQ,0BAA0BA,CAAA,EAAY;EAClD,MAAM7F,SAAS,GAAG5C,aAAa,CAAC,CAAC;EAEjC,IAAI,CAACI,iBAAiB,CAACwC,SAAS,CAAC,IAAI,CAACA,SAAS,CAAC8F,WAAW,CAAC,CAAC,EAAE;IAC3D,OAAO,KAAK;EAChB;;EAEA;EACA,MAAM5F,MAAM,GAAGF,SAAS,CAACE,MAAM,CAACC,OAAO,CAAC,CAAC;EAEzC,IAAI,CAACrC,eAAe,CAACoC,MAAM,CAAC,IAAIA,MAAM,CAAC6F,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5D,OAAO,KAAK;EAChB;EACA,MAAMC,WAAW,GAAG9H,eAAe,CAACgC,MAAM,CAAC;EAC3C,MAAMS,MAAM,GAAGT,MAAM,CAACjB,SAAS,CAAC,CAAC;EAEjC,IAAI,CAACtB,WAAW,CAACgD,MAAM,CAAC,EAAE;IACtBxB,OAAO,CAACC,GAAG,CAAC,+DAA+D,CAAC;IAC5E,OAAO,KAAK;EAChB;EAEA,MAAM6G,WAAW,GAAGtF,MAAM,EAAE1B,SAAS,CAAC,CAAC,IAAI,IAAI;EAE/C,IAAIiH,eAAe;EAEnB,IAAIzI,mBAAmB,CAACwI,WAAW,CAAC,EAAE;IAClCC,eAAe,GAAGlI,oBAAoB,CAAC,CAAC;IACxCgI,WAAW,CAAC9C,WAAW,CAACgD,eAAe,CAAC;EAC5C,CAAC,MAAM,IAAIpI,eAAe,CAACmI,WAAW,CAAC,EAAE;IACrCC,eAAe,GAAGrI,mBAAmB,CAAC,CAAC;IACvCoI,WAAW,CAAC/C,WAAW,CAACgD,eAAe,CAAC;EAC5C,CAAC,MAAM;IACH,OAAO,KAAK;EAChB;EACAA,eAAe,CAACC,MAAM,CAAC,CAAC;EAExB,MAAMC,YAAY,GAAGlG,MAAM,CAACkF,eAAe,CAAC,CAAC;EAE7C,IAAIgB,YAAY,CAACzH,MAAM,GAAG,CAAC,EAAE;IACzB,MAAM6F,OAAO,GAAG9G,eAAe,CAACiD,MAAM,EAAEqB,WAAW,CAAC,CAAC,EAAErB,MAAM,EAAE8D,UAAU,CAAC,CAAC,CAAC;IAE5E,IAAIlH,gBAAgB,CAAC2I,eAAe,CAAC,EAAE;MACnCA,eAAe,CAAChD,WAAW,CAACsB,OAAO,CAAC;IACxC,CAAC,MAAM;MACH,MAAMD,WAAW,GAAG1G,mBAAmB,CAAC,CAAC;MACzC0G,WAAW,CAAC7D,MAAM,CAAC8D,OAAO,CAAC;MAC3B0B,eAAe,CAAChD,WAAW,CAACqB,WAAW,CAAC;IAC5C;IACA6B,YAAY,CAAClC,OAAO,CAACzE,OAAO,IAAI;MAC5BA,OAAO,CAACwC,MAAM,CAAC,CAAC;MAChBuC,OAAO,CAAC9D,MAAM,CAACjB,OAAO,CAAC;IAC3B,CAAC,CAAC;EACN;;EAEA;EACAtB,6BAA6B,CAAC+B,MAAM,CAAC;EAErC,OAAO,IAAI;AACf","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { $getSelection, $isRangeSelection } from "lexical";
|
|
2
|
+
import { $setBlocksType } from "@lexical/selection";
|
|
3
|
+
import { $createHeadingNode } from "../HeadingNode";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Will change the selected HTML tag to specified heading or h1-h6.
|
|
7
|
+
* For example if the selection is p with content inside after formatting the root tag
|
|
8
|
+
* will be h1 with heading 1 theme style and the same content inside.
|
|
9
|
+
* */
|
|
10
|
+
export const formatToHeading = (editor, tag, typographyStyleId) => {
|
|
11
|
+
editor.update(() => {
|
|
12
|
+
const selection = $getSelection();
|
|
13
|
+
if ($isRangeSelection(selection)) {
|
|
14
|
+
$setBlocksType(selection, () => $createHeadingNode(tag, typographyStyleId));
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=formatToHeading.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["$getSelection","$isRangeSelection","$setBlocksType","$createHeadingNode","formatToHeading","editor","tag","typographyStyleId","update","selection"],"sources":["formatToHeading.ts"],"sourcesContent":["import type { LexicalEditor } from \"lexical\";\nimport { $getSelection, $isRangeSelection } from \"lexical\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport type { HeadingTagType } from \"@lexical/rich-text\";\nimport { $createHeadingNode } from \"~/HeadingNode\";\n\n/*\n * Will change the selected HTML tag to specified heading or h1-h6.\n * For example if the selection is p with content inside after formatting the root tag\n * will be h1 with heading 1 theme style and the same content inside.\n * */\nexport const formatToHeading = (\n editor: LexicalEditor,\n tag: HeadingTagType,\n typographyStyleId?: string\n) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createHeadingNode(tag, typographyStyleId));\n }\n });\n};\n"],"mappings":"AACA,SAASA,aAAa,EAAEC,iBAAiB,QAAQ,SAAS;AAC1D,SAASC,cAAc,QAAQ,oBAAoB;AAEnD,SAASC,kBAAkB;;AAE3B;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAGA,CAC3BC,MAAqB,EACrBC,GAAmB,EACnBC,iBAA0B,KACzB;EACDF,MAAM,CAACG,MAAM,CAAC,MAAM;IAChB,MAAMC,SAAS,GAAGT,aAAa,CAAC,CAAC;IACjC,IAAIC,iBAAiB,CAACQ,SAAS,CAAC,EAAE;MAC9BP,cAAc,CAACO,SAAS,EAAE,MAAMN,kBAAkB,CAACG,GAAG,EAAEC,iBAAiB,CAAC,CAAC;IAC/E;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { $getSelection, $isRangeSelection } from "lexical";
|
|
2
|
+
import { $setBlocksType } from "@lexical/selection";
|
|
3
|
+
import { $createParagraphNode } from "../ParagraphNode";
|
|
4
|
+
export const formatToParagraph = (editor, typographyStyleId) => {
|
|
5
|
+
editor.update(() => {
|
|
6
|
+
const selection = $getSelection();
|
|
7
|
+
if ($isRangeSelection(selection)) {
|
|
8
|
+
$setBlocksType(selection, () => $createParagraphNode(typographyStyleId));
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=formatToParagraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["$getSelection","$isRangeSelection","$setBlocksType","$createParagraphNode","formatToParagraph","editor","typographyStyleId","update","selection"],"sources":["formatToParagraph.ts"],"sourcesContent":["import type { LexicalEditor } from \"lexical\";\nimport { $getSelection, $isRangeSelection } from \"lexical\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $createParagraphNode } from \"~/ParagraphNode\";\n\nexport const formatToParagraph = (editor: LexicalEditor, typographyStyleId?: string) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createParagraphNode(typographyStyleId));\n }\n });\n};\n"],"mappings":"AACA,SAASA,aAAa,EAAEC,iBAAiB,QAAQ,SAAS;AAC1D,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,oBAAoB;AAE7B,OAAO,MAAMC,iBAAiB,GAAGA,CAACC,MAAqB,EAAEC,iBAA0B,KAAK;EACpFD,MAAM,CAACE,MAAM,CAAC,MAAM;IAChB,MAAMC,SAAS,GAAGR,aAAa,CAAC,CAAC;IACjC,IAAIC,iBAAiB,CAACO,SAAS,CAAC,EAAE;MAC9BN,cAAc,CAACM,SAAS,EAAE,MAAML,oBAAoB,CAACG,iBAAiB,CAAC,CAAC;IAC5E;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { $getSelection, $isRangeSelection } from "lexical";
|
|
2
|
+
import { $setBlocksType } from "@lexical/selection";
|
|
3
|
+
import { $createQuoteNode } from "../QuoteNode";
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Will change the selected root HTML tag to specified blockquote tag.
|
|
7
|
+
* For example if the selection is paragraph <p> with content inside after formatting the root tag
|
|
8
|
+
* will be blockquote with same content inside.
|
|
9
|
+
* */
|
|
10
|
+
export const formatToQuote = (editor, themeStyleId) => {
|
|
11
|
+
editor.update(() => {
|
|
12
|
+
const selection = $getSelection();
|
|
13
|
+
if ($isRangeSelection(selection)) {
|
|
14
|
+
$setBlocksType(selection, () => $createQuoteNode(themeStyleId));
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=formatToQuote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["$getSelection","$isRangeSelection","$setBlocksType","$createQuoteNode","formatToQuote","editor","themeStyleId","update","selection"],"sources":["formatToQuote.ts"],"sourcesContent":["import type { LexicalEditor } from \"lexical\";\nimport { $getSelection, $isRangeSelection } from \"lexical\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $createQuoteNode } from \"~/QuoteNode\";\n\n/*\n * Will change the selected root HTML tag to specified blockquote tag.\n * For example if the selection is paragraph <p> with content inside after formatting the root tag\n * will be blockquote with same content inside.\n * */\nexport const formatToQuote = (editor: LexicalEditor, themeStyleId?: string) => {\n editor.update(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n $setBlocksType(selection, () => $createQuoteNode(themeStyleId));\n }\n });\n};\n"],"mappings":"AACA,SAASA,aAAa,EAAEC,iBAAiB,QAAQ,SAAS;AAC1D,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,gBAAgB;;AAEzB;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,aAAa,GAAGA,CAACC,MAAqB,EAAEC,YAAqB,KAAK;EAC3ED,MAAM,CAACE,MAAM,CAAC,MAAM;IAChB,MAAMC,SAAS,GAAGR,aAAa,CAAC,CAAC;IACjC,IAAIC,iBAAiB,CAACO,SAAS,CAAC,EAAE;MAC9BN,cAAc,CAACM,SAAS,EAAE,MAAML,gBAAgB,CAACG,YAAY,CAAC,CAAC;IACnE;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ThemeStyleValue } from "../types";
|
|
2
|
+
type StylesInput = {
|
|
3
|
+
styleId?: string;
|
|
4
|
+
styles?: ThemeStyleValue[];
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* In older versions, we used to have styles as an array of objects. We must handle that
|
|
8
|
+
* scenario to not break content for older projects.
|
|
9
|
+
*/
|
|
10
|
+
export declare const getStyleId: (input: StylesInput) => string | undefined;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In older versions, we used to have styles as an array of objects. We must handle that
|
|
3
|
+
* scenario to not break content for older projects.
|
|
4
|
+
*/
|
|
5
|
+
export const getStyleId = input => {
|
|
6
|
+
if (input.styleId) {
|
|
7
|
+
return input.styleId;
|
|
8
|
+
}
|
|
9
|
+
const styles = input.styles ?? [];
|
|
10
|
+
const style = styles.find(x => x.type === "typography");
|
|
11
|
+
return style?.styleId || undefined;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=getStyleId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getStyleId","input","styleId","styles","style","find","x","type","undefined"],"sources":["getStyleId.ts"],"sourcesContent":["import type { ThemeStyleValue } from \"~/types\";\n\ntype StylesInput = {\n styleId?: string;\n styles?: ThemeStyleValue[];\n};\n\n/**\n * In older versions, we used to have styles as an array of objects. We must handle that\n * scenario to not break content for older projects.\n */\nexport const getStyleId = (input: StylesInput) => {\n if (input.styleId) {\n return input.styleId;\n }\n\n const styles = input.styles ?? [];\n const style = styles.find(x => x.type === \"typography\");\n\n return style?.styleId || undefined;\n};\n"],"mappings":"AAOA;AACA;AACA;AACA;AACA,OAAO,MAAMA,UAAU,GAAIC,KAAkB,IAAK;EAC9C,IAAIA,KAAK,CAACC,OAAO,EAAE;IACf,OAAOD,KAAK,CAACC,OAAO;EACxB;EAEA,MAAMC,MAAM,GAAGF,KAAK,CAACE,MAAM,IAAI,EAAE;EACjC,MAAMC,KAAK,GAAGD,MAAM,CAACE,IAAI,CAACC,CAAC,IAAIA,CAAC,CAACC,IAAI,KAAK,YAAY,CAAC;EAEvD,OAAOH,KAAK,EAAEF,OAAO,IAAIM,SAAS;AACtC,CAAC","ignoreList":[]}
|