@tiptap/extension-list 3.24.0 → 3.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -86,6 +86,115 @@ var BulletList = Node.create({
86
86
 
87
87
  // src/item/list-item.ts
88
88
  import { mergeAttributes as mergeAttributes2, Node as Node2, renderNestedMarkdownContent } from "@tiptap/core";
89
+
90
+ // src/helpers/createBranchingListDeleteKeymap.ts
91
+ import { Extension } from "@tiptap/core";
92
+
93
+ // src/helpers/hoistBranchingNestedList.ts
94
+ import { Fragment } from "@tiptap/pm/model";
95
+
96
+ // src/helpers/getBranchingNestedListAtCursor.ts
97
+ var getBranchingNestedListAtCursor = (state, itemName, wrapperNames) => {
98
+ const { selection } = state;
99
+ if (!selection.empty) {
100
+ return null;
101
+ }
102
+ const { $from } = selection;
103
+ if (!$from.parent.isTextblock) {
104
+ return null;
105
+ }
106
+ if ($from.parentOffset !== $from.parent.content.size) {
107
+ return null;
108
+ }
109
+ let listItemDepth = -1;
110
+ for (let depth = $from.depth; depth > 0; depth -= 1) {
111
+ if ($from.node(depth).type.name === itemName) {
112
+ listItemDepth = depth;
113
+ break;
114
+ }
115
+ }
116
+ if (listItemDepth < 0) {
117
+ return null;
118
+ }
119
+ const listItem = $from.node(listItemDepth);
120
+ const indexInListItem = $from.index(listItemDepth);
121
+ if (indexInListItem + 1 >= listItem.childCount) {
122
+ return null;
123
+ }
124
+ const nextChild = listItem.child(indexInListItem + 1);
125
+ if (!wrapperNames.includes(nextChild.type.name)) {
126
+ return null;
127
+ }
128
+ const itemType = state.schema.nodes[itemName];
129
+ let hasBranching = false;
130
+ nextChild.forEach((child) => {
131
+ if (child.type === itemType && child.childCount > 1) {
132
+ hasBranching = true;
133
+ }
134
+ });
135
+ if (!hasBranching) {
136
+ return null;
137
+ }
138
+ const nodeAfter = state.doc.resolve($from.after()).nodeAfter;
139
+ if (!nodeAfter || !wrapperNames.includes(nodeAfter.type.name)) {
140
+ return null;
141
+ }
142
+ const items = [];
143
+ nodeAfter.forEach((child) => {
144
+ items.push(child);
145
+ });
146
+ if (items.length === 0) {
147
+ return null;
148
+ }
149
+ return {
150
+ listItemDepth,
151
+ nestedList: nodeAfter,
152
+ nestedListPos: $from.after(),
153
+ insertPos: $from.after(listItemDepth),
154
+ items
155
+ };
156
+ };
157
+
158
+ // src/helpers/hoistBranchingNestedList.ts
159
+ var hoistBranchingNestedList = (state, dispatch, itemName, wrapperNames) => {
160
+ const context = getBranchingNestedListAtCursor(state, itemName, wrapperNames);
161
+ if (!context) {
162
+ return false;
163
+ }
164
+ const { selection } = state;
165
+ const { nestedList, nestedListPos, insertPos, items } = context;
166
+ const tr = state.tr;
167
+ tr.delete(nestedListPos, nestedListPos + nestedList.nodeSize);
168
+ const mappedInsertPos = tr.mapping.map(insertPos);
169
+ tr.insert(mappedInsertPos, Fragment.from(items));
170
+ tr.setSelection(selection.map(tr.doc, tr.mapping));
171
+ if (dispatch) {
172
+ dispatch(tr);
173
+ }
174
+ return true;
175
+ };
176
+
177
+ // src/helpers/handleDeleteBranchingNestedList.ts
178
+ var handleDeleteBranchingNestedList = (editor, itemName, wrapperNames) => {
179
+ return hoistBranchingNestedList(editor.state, editor.view.dispatch, itemName, wrapperNames);
180
+ };
181
+
182
+ // src/helpers/createBranchingListDeleteKeymap.ts
183
+ var createBranchingListDeleteKeymap = (itemName, wrapperNames) => {
184
+ return Extension.create({
185
+ name: `${itemName}BranchingDeleteKeymap`,
186
+ priority: 101,
187
+ addKeyboardShortcuts() {
188
+ const handleDelete2 = () => handleDeleteBranchingNestedList(this.editor, itemName, wrapperNames);
189
+ return {
190
+ Delete: handleDelete2,
191
+ "Mod-Delete": handleDelete2
192
+ };
193
+ }
194
+ });
195
+ };
196
+
197
+ // src/item/list-item.ts
89
198
  function isSameLineOrderedListToken(token) {
90
199
  var _a, _b;
91
200
  const nestedToken = (_a = token.tokens) == null ? void 0 : _a[0];
@@ -200,6 +309,14 @@ var ListItem = Node2.create({
200
309
  ctx
201
310
  );
202
311
  },
312
+ addExtensions() {
313
+ return [
314
+ createBranchingListDeleteKeymap(this.name, [
315
+ this.options.bulletListTypeName,
316
+ this.options.orderedListTypeName
317
+ ])
318
+ ];
319
+ },
203
320
  addKeyboardShortcuts() {
204
321
  return {
205
322
  Enter: () => this.editor.commands.splitListItem(this.name),
@@ -210,7 +327,7 @@ var ListItem = Node2.create({
210
327
  });
211
328
 
212
329
  // src/keymap/list-keymap.ts
213
- import { Extension } from "@tiptap/core";
330
+ import { Extension as Extension2 } from "@tiptap/core";
214
331
 
215
332
  // src/keymap/listHelpers/index.ts
216
333
  var listHelpers_exports = {};
@@ -276,36 +393,6 @@ var hasListBefore = (editorState, name, parentListTypes) => {
276
393
  return true;
277
394
  };
278
395
 
279
- // src/keymap/listHelpers/hasListItemBefore.ts
280
- var hasListItemBefore = (typeOrName, state) => {
281
- var _a;
282
- const { $anchor } = state.selection;
283
- const $targetPos = state.doc.resolve($anchor.pos - 2);
284
- if ($targetPos.index() === 0) {
285
- return false;
286
- }
287
- if (((_a = $targetPos.nodeBefore) == null ? void 0 : _a.type.name) !== typeOrName) {
288
- return false;
289
- }
290
- return true;
291
- };
292
-
293
- // src/keymap/listHelpers/listItemHasSubList.ts
294
- import { getNodeType as getNodeType2 } from "@tiptap/core";
295
- var listItemHasSubList = (typeOrName, state, node) => {
296
- if (!node) {
297
- return false;
298
- }
299
- const nodeType = getNodeType2(typeOrName, state.schema);
300
- let hasSubList = false;
301
- node.descendants((child) => {
302
- if (child.type === nodeType) {
303
- hasSubList = true;
304
- }
305
- });
306
- return hasSubList;
307
- };
308
-
309
396
  // src/keymap/listHelpers/handleBackspace.ts
310
397
  var handleBackspace = (editor, name, parentListTypes) => {
311
398
  if (editor.commands.undoInputRule()) {
@@ -336,16 +423,6 @@ var handleBackspace = (editor, name, parentListTypes) => {
336
423
  if (!isAtStartOfNode(editor.state)) {
337
424
  return false;
338
425
  }
339
- const listItemPos = findListItemPos(name, editor.state);
340
- if (!listItemPos) {
341
- return false;
342
- }
343
- const $prev = editor.state.doc.resolve(listItemPos.$pos.pos - 2);
344
- const prevNode = $prev.node(listItemPos.depth);
345
- const previousListItemHasSubList = listItemHasSubList(name, editor.state, prevNode);
346
- if (hasListItemBefore(name, editor.state) && !previousListItemHasSubList) {
347
- return editor.commands.joinItemBackward();
348
- }
349
426
  return editor.chain().liftListItem(name).run();
350
427
  };
351
428
 
@@ -414,8 +491,38 @@ var hasListItemAfter = (typeOrName, state) => {
414
491
  return true;
415
492
  };
416
493
 
494
+ // src/keymap/listHelpers/hasListItemBefore.ts
495
+ var hasListItemBefore = (typeOrName, state) => {
496
+ var _a;
497
+ const { $anchor } = state.selection;
498
+ const $targetPos = state.doc.resolve($anchor.pos - 2);
499
+ if ($targetPos.index() === 0) {
500
+ return false;
501
+ }
502
+ if (((_a = $targetPos.nodeBefore) == null ? void 0 : _a.type.name) !== typeOrName) {
503
+ return false;
504
+ }
505
+ return true;
506
+ };
507
+
508
+ // src/keymap/listHelpers/listItemHasSubList.ts
509
+ import { getNodeType as getNodeType2 } from "@tiptap/core";
510
+ var listItemHasSubList = (typeOrName, state, node) => {
511
+ if (!node) {
512
+ return false;
513
+ }
514
+ const nodeType = getNodeType2(typeOrName, state.schema);
515
+ let hasSubList = false;
516
+ node.descendants((child) => {
517
+ if (child.type === nodeType) {
518
+ hasSubList = true;
519
+ }
520
+ });
521
+ return hasSubList;
522
+ };
523
+
417
524
  // src/keymap/list-keymap.ts
418
- var ListKeymap = Extension.create({
525
+ var ListKeymap = Extension2.create({
419
526
  name: "listKeymap",
420
527
  addOptions() {
421
528
  return {
@@ -486,7 +593,7 @@ var ListKeymap = Extension.create({
486
593
  });
487
594
 
488
595
  // src/kit/index.ts
489
- import { Extension as Extension2 } from "@tiptap/core";
596
+ import { Extension as Extension3 } from "@tiptap/core";
490
597
 
491
598
  // src/ordered-list/ordered-list.ts
492
599
  import { mergeAttributes as mergeAttributes3, Node as Node3, wrappingInputRule as wrappingInputRule2 } from "@tiptap/core";
@@ -888,6 +995,12 @@ var TaskItem = Node4.create({
888
995
  const prefix = `- [${checkedChar}] `;
889
996
  return renderNestedMarkdownContent2(node, h, prefix);
890
997
  },
998
+ addExtensions() {
999
+ if (!this.options.nested) {
1000
+ return [];
1001
+ }
1002
+ return [createBranchingListDeleteKeymap(this.name, [this.options.taskListTypeName])];
1003
+ },
891
1004
  addKeyboardShortcuts() {
892
1005
  const shortcuts = {
893
1006
  Enter: () => this.editor.commands.splitListItem(this.name),
@@ -1141,7 +1254,7 @@ var TaskList = Node5.create({
1141
1254
  });
1142
1255
 
1143
1256
  // src/kit/index.ts
1144
- var ListKit = Extension2.create({
1257
+ var ListKit = Extension3.create({
1145
1258
  name: "listKit",
1146
1259
  addExtensions() {
1147
1260
  const extensions = [];