@portabletext/editor 1.54.4 → 1.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/lib/_chunks-cjs/selector.get-text-before.cjs +2 -0
  2. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  3. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +93 -104
  4. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
  5. package/lib/_chunks-cjs/selector.is-selection-expanded.cjs +18 -6
  6. package/lib/_chunks-cjs/selector.is-selection-expanded.cjs.map +1 -1
  7. package/lib/_chunks-es/selector.get-text-before.js +2 -0
  8. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  9. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +93 -104
  10. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
  11. package/lib/_chunks-es/selector.is-selection-expanded.js +19 -7
  12. package/lib/_chunks-es/selector.is-selection-expanded.js.map +1 -1
  13. package/lib/behaviors/index.d.cts +1 -0
  14. package/lib/behaviors/index.d.ts +1 -0
  15. package/lib/index.cjs +129 -57
  16. package/lib/index.cjs.map +1 -1
  17. package/lib/index.d.cts +3 -0
  18. package/lib/index.d.ts +3 -0
  19. package/lib/index.js +131 -59
  20. package/lib/index.js.map +1 -1
  21. package/lib/plugins/index.cjs +1 -0
  22. package/lib/plugins/index.cjs.map +1 -1
  23. package/lib/plugins/index.d.cts +1 -0
  24. package/lib/plugins/index.d.ts +1 -0
  25. package/lib/plugins/index.js +1 -0
  26. package/lib/plugins/index.js.map +1 -1
  27. package/lib/selectors/index.cjs +15 -57
  28. package/lib/selectors/index.cjs.map +1 -1
  29. package/lib/selectors/index.d.cts +8 -0
  30. package/lib/selectors/index.d.ts +8 -0
  31. package/lib/selectors/index.js +18 -60
  32. package/lib/selectors/index.js.map +1 -1
  33. package/lib/utils/index.d.cts +1 -0
  34. package/lib/utils/index.d.ts +1 -0
  35. package/package.json +5 -5
  36. package/src/behaviors/behavior.abstract.delete.ts +2 -8
  37. package/src/behaviors/behavior.abstract.split.ts +4 -3
  38. package/src/converters/converter.portable-text.ts +2 -8
  39. package/src/converters/converter.text-html.ts +2 -8
  40. package/src/converters/converter.text-plain.ts +2 -8
  41. package/src/editor/components/render-text-block.tsx +9 -0
  42. package/src/editor/create-slate-editor.tsx +14 -3
  43. package/src/editor/editor-selector.ts +1 -0
  44. package/src/editor/editor-snapshot.ts +2 -0
  45. package/src/editor/plugins/slate-plugin.update-value.ts +5 -0
  46. package/src/internal-utils/build-index-maps.test.ts +232 -0
  47. package/src/internal-utils/build-index-maps.ts +97 -0
  48. package/src/internal-utils/create-test-snapshot.ts +17 -9
  49. package/src/internal-utils/mark-state.ts +1 -0
  50. package/src/operations/behavior.operation.decorator.add.ts +1 -0
  51. package/src/selectors/index.ts +1 -0
  52. package/src/selectors/selector.get-anchor-block.ts +3 -4
  53. package/src/selectors/selector.get-focus-block.ts +3 -3
  54. package/src/selectors/selector.get-list-state.ts +34 -96
  55. package/src/selectors/selector.get-next-block.ts +7 -16
  56. package/src/selectors/selector.get-previous-block.ts +7 -13
  57. package/src/selectors/selector.get-selected-blocks.ts +13 -1
  58. package/src/selectors/selector.get-selected-slice.ts +3 -5
  59. package/src/selectors/selector.get-selected-spans.ts +14 -3
  60. package/src/selectors/selector.get-selected-text-blocks.ts +13 -1
  61. package/src/selectors/selector.get-selected-value.ts +47 -0
  62. package/src/selectors/selector.get-selection-text.ts +3 -3
  63. package/src/selectors/selector.get-trimmed-selection.ts +13 -1
  64. package/src/selectors/selector.is-point-after-selection.ts +58 -38
  65. package/src/selectors/selector.is-point-before-selection.ts +58 -38
  66. package/src/types/editor.ts +2 -0
@@ -4,6 +4,7 @@ const getBlockTextBefore = (snapshot) => {
4
4
  if (!snapshot.context.selection)
5
5
  return "";
6
6
  const startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), block = selector_isSelectionExpanded.getFocusBlock({
7
+ ...snapshot,
7
8
  context: {
8
9
  ...snapshot.context,
9
10
  selection: {
@@ -19,6 +20,7 @@ const getBlockTextBefore = (snapshot) => {
19
20
  block
20
21
  });
21
22
  return selector_isSelectionExpanded.getSelectionText({
23
+ ...snapshot,
22
24
  context: {
23
25
  ...snapshot.context,
24
26
  selection: {
@@ -1 +1 @@
1
- {"version":3,"file":"selector.get-text-before.cjs","sources":["../../src/selectors/selector.get-text-before.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectionStartPoint} from '../utils'\nimport {getBlockStartPoint} from '../utils/util.get-block-start-point'\nimport {getFocusBlock} from './selector.get-focus-block'\nimport {getSelectionText} from './selector.get-selection-text'\n\n/**\n * @public\n */\nexport const getBlockTextBefore: EditorSelector<string> = (snapshot) => {\n if (!snapshot.context.selection) {\n return ''\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const block = getFocusBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startPoint,\n focus: startPoint,\n },\n },\n })\n\n if (!block) {\n return ''\n }\n\n const startOfBlock = getBlockStartPoint({\n context: snapshot.context,\n block,\n })\n\n return getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startOfBlock,\n focus: startPoint,\n },\n },\n })\n}\n"],"names":["getBlockTextBefore","snapshot","context","selection","startPoint","getSelectionStartPoint","block","getFocusBlock","anchor","focus","startOfBlock","getBlockStartPoint","getSelectionText"],"mappings":";;AASO,MAAMA,qBAA8CC,CAAAA,aAAa;AACtE,MAAI,CAACA,SAASC,QAAQC;AACpB,WAAO;AAGT,QAAMC,aAAaC,eAAAA,uBAAuBJ,SAASC,QAAQC,SAAS,GAC9DG,QAAQC,2CAAc;AAAA,IAE1BL,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTK,QAAQJ;AAAAA,QACRK,OAAOL;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AAED,MAAI,CAACE;AACH,WAAO;AAGT,QAAMI,eAAeC,eAAAA,mBAAmB;AAAA,IACtCT,SAASD,SAASC;AAAAA,IAClBI;AAAAA,EAAAA,CACD;AAED,SAAOM,8CAAiB;AAAA,IAEtBV,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTK,QAAQE;AAAAA,QACRD,OAAOL;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AACH;;"}
1
+ {"version":3,"file":"selector.get-text-before.cjs","sources":["../../src/selectors/selector.get-text-before.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectionStartPoint} from '../utils'\nimport {getBlockStartPoint} from '../utils/util.get-block-start-point'\nimport {getFocusBlock} from './selector.get-focus-block'\nimport {getSelectionText} from './selector.get-selection-text'\n\n/**\n * @public\n */\nexport const getBlockTextBefore: EditorSelector<string> = (snapshot) => {\n if (!snapshot.context.selection) {\n return ''\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const block = getFocusBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startPoint,\n focus: startPoint,\n },\n },\n })\n\n if (!block) {\n return ''\n }\n\n const startOfBlock = getBlockStartPoint({\n context: snapshot.context,\n block,\n })\n\n return getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startOfBlock,\n focus: startPoint,\n },\n },\n })\n}\n"],"names":["getBlockTextBefore","snapshot","context","selection","startPoint","getSelectionStartPoint","block","getFocusBlock","anchor","focus","startOfBlock","getBlockStartPoint","getSelectionText"],"mappings":";;AASO,MAAMA,qBAA8CC,CAAAA,aAAa;AACtE,MAAI,CAACA,SAASC,QAAQC;AACpB,WAAO;AAGT,QAAMC,aAAaC,eAAAA,uBAAuBJ,SAASC,QAAQC,SAAS,GAC9DG,QAAQC,2CAAc;AAAA,IAC1B,GAAGN;AAAAA,IACHC,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTK,QAAQJ;AAAAA,QACRK,OAAOL;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AAED,MAAI,CAACE;AACH,WAAO;AAGT,QAAMI,eAAeC,eAAAA,mBAAmB;AAAA,IACtCT,SAASD,SAASC;AAAAA,IAClBI;AAAAA,EAAAA,CACD;AAED,SAAOM,8CAAiB;AAAA,IACtB,GAAGX;AAAAA,IACHC,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTK,QAAQE;AAAAA,QACRD,OAAOL;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AACH;;"}
@@ -6,7 +6,11 @@ const getSelectedBlocks = (snapshot) => {
6
6
  const selectedBlocks = [], startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection), startKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), endKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint);
7
7
  if (!startKey || !endKey)
8
8
  return selectedBlocks;
9
- for (const block of snapshot.context.value) {
9
+ const startBlockIndex = snapshot.blockIndexMap.get(startKey), endBlockIndex = snapshot.blockIndexMap.get(endKey);
10
+ if (startBlockIndex === void 0 || endBlockIndex === void 0)
11
+ return selectedBlocks;
12
+ const slicedValue = snapshot.context.value.slice(startBlockIndex, endBlockIndex + 1);
13
+ for (const block of slicedValue) {
10
14
  if (block._key === startKey) {
11
15
  if (selectedBlocks.push({
12
16
  node: block,
@@ -43,12 +47,15 @@ const getSelectedBlocks = (snapshot) => {
43
47
  const selectedSpans = [], startPoint = selector_isSelectionExpanded.getSelectionStartPoint(snapshot), endPoint = getSelectionEndPoint(snapshot);
44
48
  if (!startPoint || !endPoint)
45
49
  return selectedSpans;
46
- const startBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), endBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint);
50
+ const startBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), endBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint), startSpanKey = selectionPoint.getChildKeyFromSelectionPoint(startPoint), endSpanKey = selectionPoint.getChildKeyFromSelectionPoint(endPoint);
47
51
  if (!startBlockKey || !endBlockKey)
48
52
  return selectedSpans;
49
- const startSpanKey = selectionPoint.getChildKeyFromSelectionPoint(startPoint), endSpanKey = selectionPoint.getChildKeyFromSelectionPoint(endPoint);
53
+ const startBlockIndex = snapshot.blockIndexMap.get(startBlockKey), endBlockIndex = snapshot.blockIndexMap.get(endBlockKey);
54
+ if (startBlockIndex === void 0 || endBlockIndex === void 0)
55
+ return selectedSpans;
56
+ const slicedValue = snapshot.context.value.slice(startBlockIndex, endBlockIndex + 1);
50
57
  let startBlockFound = !1;
51
- for (const block of snapshot.context.value)
58
+ for (const block of slicedValue)
52
59
  if (block._key === startBlockKey && (startBlockFound = !0), !!selectionPoint.isTextBlock(snapshot.context, block)) {
53
60
  if (block._key === startBlockKey) {
54
61
  for (const child of block.children)
@@ -192,6 +199,7 @@ const getSelectedBlocks = (snapshot) => {
192
199
  context: snapshot.context,
193
200
  block: focusTextBlock
194
201
  }), textDirectlyBefore = selector_isSelectionExpanded.getSelectionText({
202
+ ...snapshot,
195
203
  context: {
196
204
  ...snapshot.context,
197
205
  selection: {
@@ -206,6 +214,7 @@ const getSelectedBlocks = (snapshot) => {
206
214
  context: snapshot.context,
207
215
  block: focusTextBlock
208
216
  }), textDirectlyAfter = selector_isSelectionExpanded.getSelectionText({
217
+ ...snapshot,
209
218
  context: {
210
219
  ...snapshot.context,
211
220
  selection: {
@@ -280,10 +289,38 @@ const getSelectedBlocks = (snapshot) => {
280
289
  _key: node._key
281
290
  }]
282
291
  } : void 0;
292
+ }, getSelectionEndBlock = (snapshot) => {
293
+ const endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection);
294
+ if (endPoint)
295
+ return selector_isSelectionExpanded.getFocusBlock({
296
+ ...snapshot,
297
+ context: {
298
+ ...snapshot.context,
299
+ selection: {
300
+ anchor: endPoint,
301
+ focus: endPoint
302
+ }
303
+ }
304
+ });
305
+ }, getNextBlock = (snapshot) => {
306
+ const selectionEndBlock = getSelectionEndBlock(snapshot);
307
+ if (!selectionEndBlock)
308
+ return;
309
+ const index = snapshot.blockIndexMap.get(selectionEndBlock.node._key);
310
+ if (index === void 0 || index === snapshot.context.value.length - 1)
311
+ return;
312
+ const nextBlock = snapshot.context.value.at(index + 1);
313
+ return nextBlock ? {
314
+ node: nextBlock,
315
+ path: [{
316
+ _key: nextBlock._key
317
+ }]
318
+ } : void 0;
283
319
  }, getSelectionStartBlock = (snapshot) => {
284
320
  const startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection);
285
321
  if (startPoint)
286
322
  return selector_isSelectionExpanded.getFocusBlock({
323
+ ...snapshot,
287
324
  context: {
288
325
  ...snapshot.context,
289
326
  selection: {
@@ -293,67 +330,30 @@ const getSelectedBlocks = (snapshot) => {
293
330
  }
294
331
  });
295
332
  }, getPreviousBlock = (snapshot) => {
296
- let previousBlock;
297
333
  const selectionStartBlock = getSelectionStartBlock(snapshot);
298
334
  if (!selectionStartBlock)
299
335
  return;
300
- let foundSelectionStartBlock = !1;
301
- for (const block of snapshot.context.value) {
302
- if (block._key === selectionStartBlock.node._key) {
303
- foundSelectionStartBlock = !0;
304
- break;
305
- }
306
- previousBlock = {
307
- node: block,
308
- path: [{
309
- _key: block._key
310
- }]
311
- };
312
- }
313
- if (foundSelectionStartBlock && previousBlock)
314
- return previousBlock;
315
- }, getSelectionEndBlock = (snapshot) => {
316
- const endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection);
317
- if (endPoint)
318
- return selector_isSelectionExpanded.getFocusBlock({
319
- context: {
320
- ...snapshot.context,
321
- selection: {
322
- anchor: endPoint,
323
- focus: endPoint
324
- }
325
- }
326
- });
327
- }, getNextBlock = (snapshot) => {
328
- let nextBlock;
329
- const selectionEndBlock = getSelectionEndBlock(snapshot);
330
- if (!selectionEndBlock)
336
+ const index = snapshot.blockIndexMap.get(selectionStartBlock.node._key);
337
+ if (index === void 0 || index === 0)
331
338
  return;
332
- let foundSelectionEndBlock = !1;
333
- for (const block of snapshot.context.value) {
334
- if (block._key === selectionEndBlock.node._key) {
335
- foundSelectionEndBlock = !0;
336
- continue;
337
- }
338
- if (foundSelectionEndBlock) {
339
- nextBlock = {
340
- node: block,
341
- path: [{
342
- _key: block._key
343
- }]
344
- };
345
- break;
346
- }
347
- }
348
- if (foundSelectionEndBlock && nextBlock)
349
- return nextBlock;
339
+ const previousBlock = snapshot.context.value.at(index - 1);
340
+ return previousBlock ? {
341
+ node: previousBlock,
342
+ path: [{
343
+ _key: previousBlock._key
344
+ }]
345
+ } : void 0;
350
346
  }, getSelectedTextBlocks = (snapshot) => {
351
347
  if (!snapshot.context.selection)
352
348
  return [];
353
349
  const selectedTextBlocks = [], startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection), startBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), endBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint);
354
350
  if (!startBlockKey || !endBlockKey)
355
351
  return selectedTextBlocks;
356
- for (const block of snapshot.context.value) {
352
+ const startBlockIndex = snapshot.blockIndexMap.get(startBlockKey), endBlockIndex = snapshot.blockIndexMap.get(endBlockKey);
353
+ if (startBlockIndex === void 0 || endBlockIndex === void 0)
354
+ return selectedTextBlocks;
355
+ const slicedValue = snapshot.context.value.slice(startBlockIndex, endBlockIndex + 1);
356
+ for (const block of slicedValue) {
357
357
  if (block._key === startBlockKey) {
358
358
  if (selectionPoint.isTextBlock(snapshot.context, block) && selectedTextBlocks.push({
359
359
  node: block,
@@ -387,8 +387,12 @@ const getSelectedBlocks = (snapshot) => {
387
387
  const startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection), startBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), startChildKey = selectionPoint.getChildKeyFromSelectionPoint(startPoint), endBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint), endChildKey = selectionPoint.getChildKeyFromSelectionPoint(endPoint);
388
388
  if (!startBlockKey || !endBlockKey)
389
389
  return snapshot.context.selection;
390
+ const startBlockIndex = snapshot.blockIndexMap.get(startBlockKey), endBlockIndex = snapshot.blockIndexMap.get(endBlockKey);
391
+ if (startBlockIndex === void 0 || endBlockIndex === void 0)
392
+ return snapshot.context.selection;
393
+ const slicedValue = snapshot.context.value.slice(startBlockIndex, endBlockIndex + 1);
390
394
  let startBlockFound = !1, adjustedStartPoint, trimStartPoint = !1, adjustedEndPoint, trimEndPoint = !1, previousPotentialEndpoint;
391
- for (const block of snapshot.context.value)
395
+ for (const block of slicedValue)
392
396
  if (!(block._key === startBlockKey && (startBlockFound = !0, selectionPoint.isTextBlock(snapshot.context, block) && util_isEqualSelectionPoints.isEmptyTextBlock(snapshot.context, block))) && startBlockFound && selectionPoint.isTextBlock(snapshot.context, block)) {
393
397
  if (block._key === endBlockKey && util_isEqualSelectionPoints.isEmptyTextBlock(snapshot.context, block))
394
398
  break;
@@ -455,6 +459,7 @@ const getSelectedBlocks = (snapshot) => {
455
459
  }
456
460
  })) {
457
461
  const focusTextBlock = selector_isSelectionExpanded.getFocusTextBlock({
462
+ ...snapshot,
458
463
  context: {
459
464
  ...snapshot.context,
460
465
  selection: trimmedSelection
@@ -512,32 +517,24 @@ function isPointAfterSelection(point) {
512
517
  const endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection), endBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint), endChildKey = selectionPoint.getChildKeyFromSelectionPoint(endPoint), pointBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(point), pointChildKey = selectionPoint.getChildKeyFromSelectionPoint(point);
513
518
  if (!pointBlockKey || !endBlockKey)
514
519
  return !1;
515
- let after = !1;
516
- for (const block of snapshot.context.value) {
517
- if (block._key === endBlockKey) {
518
- if (block._key !== pointBlockKey) {
519
- after = !0;
520
- break;
521
- }
522
- if (!selectionPoint.isTextBlock(snapshot.context, block) || !pointChildKey || !endChildKey)
523
- break;
524
- for (const child of block.children) {
525
- if (child._key === endChildKey) {
526
- if (child._key !== pointChildKey) {
527
- after = !0;
528
- break;
529
- }
530
- after = point.offset > endPoint.offset;
531
- break;
532
- }
533
- if (child._key === pointChildKey)
534
- break;
535
- }
536
- }
537
- if (block._key === pointBlockKey)
520
+ const pointBlockIndex = snapshot.blockIndexMap.get(pointBlockKey), endBlockIndex = snapshot.blockIndexMap.get(endBlockKey);
521
+ if (pointBlockIndex === void 0 || endBlockIndex === void 0)
522
+ return !1;
523
+ if (pointBlockIndex > endBlockIndex)
524
+ return !0;
525
+ if (pointBlockIndex < endBlockIndex)
526
+ return !1;
527
+ const pointBlock = snapshot.context.value.at(pointBlockIndex);
528
+ if (!pointBlock || !selectionPoint.isTextBlock(snapshot.context, pointBlock))
529
+ return !1;
530
+ let pointChildIndex, endChildIndex, childIndex = -1;
531
+ for (const child of pointBlock.children) {
532
+ if (childIndex++, child._key === pointChildKey && child._key === endChildKey)
533
+ return point.offset > endPoint.offset;
534
+ if (child._key === pointChildKey && (pointChildIndex = childIndex), child._key === endChildKey && (endChildIndex = childIndex), pointChildIndex !== void 0 && endChildIndex !== void 0)
538
535
  break;
539
536
  }
540
- return after;
537
+ return pointChildIndex === void 0 || endChildIndex === void 0 ? !1 : pointChildIndex > endChildIndex;
541
538
  };
542
539
  }
543
540
  function isPointBeforeSelection(point) {
@@ -547,32 +544,24 @@ function isPointBeforeSelection(point) {
547
544
  const startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), startBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), startChildKey = selectionPoint.getChildKeyFromSelectionPoint(startPoint), pointBlockKey = selectionPoint.getBlockKeyFromSelectionPoint(point), pointChildKey = selectionPoint.getChildKeyFromSelectionPoint(point);
548
545
  if (!pointBlockKey || !startBlockKey)
549
546
  return !1;
550
- let before = !1;
551
- for (const block of snapshot.context.value) {
552
- if (block._key === pointBlockKey) {
553
- if (block._key !== startBlockKey) {
554
- before = !0;
555
- break;
556
- }
557
- if (!selectionPoint.isTextBlock(snapshot.context, block) || !pointChildKey || !startChildKey)
558
- break;
559
- for (const child of block.children) {
560
- if (child._key === pointChildKey) {
561
- if (child._key !== startChildKey) {
562
- before = !0;
563
- break;
564
- }
565
- before = point.offset < startPoint.offset;
566
- break;
567
- }
568
- if (child._key === startChildKey)
569
- break;
570
- }
571
- }
572
- if (block._key === startBlockKey)
547
+ const startBlockIndex = snapshot.blockIndexMap.get(startBlockKey), pointBlockIndex = snapshot.blockIndexMap.get(pointBlockKey);
548
+ if (startBlockIndex === void 0 || pointBlockIndex === void 0)
549
+ return !1;
550
+ if (pointBlockIndex < startBlockIndex)
551
+ return !0;
552
+ if (pointBlockIndex > startBlockIndex)
553
+ return !1;
554
+ const pointBlock = snapshot.context.value.at(pointBlockIndex);
555
+ if (!pointBlock || !selectionPoint.isTextBlock(snapshot.context, pointBlock))
556
+ return !1;
557
+ let pointChildIndex, startChildIndex, childIndex = -1;
558
+ for (const child of pointBlock.children) {
559
+ if (childIndex++, child._key === pointChildKey && child._key === startChildKey)
560
+ return point.offset < startPoint.offset;
561
+ if (child._key === pointChildKey && (pointChildIndex = childIndex), child._key === startChildKey && (startChildIndex = childIndex), pointChildIndex !== void 0 && startChildIndex !== void 0)
573
562
  break;
574
563
  }
575
- return before;
564
+ return pointChildIndex === void 0 || startChildIndex === void 0 ? !1 : pointChildIndex < startChildIndex;
576
565
  };
577
566
  }
578
567
  function isOverlappingSelection(selection) {