@portabletext/editor 1.52.8 → 1.53.1

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 (53) hide show
  1. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  2. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +144 -6
  3. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
  4. package/lib/_chunks-cjs/selector.is-selection-expanded.cjs +6 -140
  5. package/lib/_chunks-cjs/selector.is-selection-expanded.cjs.map +1 -1
  6. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  7. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +148 -10
  8. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
  9. package/lib/_chunks-es/selector.is-selection-expanded.js +6 -140
  10. package/lib/_chunks-es/selector.is-selection-expanded.js.map +1 -1
  11. package/lib/index.cjs +143 -97
  12. package/lib/index.cjs.map +1 -1
  13. package/lib/index.js +123 -77
  14. package/lib/index.js.map +1 -1
  15. package/lib/selectors/index.cjs +10 -10
  16. package/lib/selectors/index.cjs.map +1 -1
  17. package/lib/selectors/index.d.cts +11 -11
  18. package/lib/selectors/index.d.ts +11 -11
  19. package/lib/selectors/index.js +4 -4
  20. package/lib/selectors/index.js.map +1 -1
  21. package/package.json +13 -13
  22. package/src/behaviors/behavior.abstract.keyboard.ts +10 -0
  23. package/src/behaviors/behavior.abstract.split.ts +105 -87
  24. package/src/behaviors/behavior.core.insert-break.ts +14 -0
  25. package/src/behaviors/behavior.core.ts +1 -0
  26. package/src/internal-utils/key-is.ts +1 -0
  27. package/src/selectors/index.ts +13 -1
  28. package/src/selectors/selector.get-active-annotations.ts +2 -1
  29. package/src/selectors/selector.get-active-list-item.ts +1 -1
  30. package/src/selectors/selector.get-active-style.ts +1 -1
  31. package/src/selectors/selector.get-caret-word-selection.ts +1 -1
  32. package/src/selectors/selector.get-first-block.ts +14 -0
  33. package/src/selectors/selector.get-focus-block-object.ts +18 -0
  34. package/src/selectors/selector.get-focus-block.ts +23 -0
  35. package/src/selectors/selector.get-focus-child.ts +39 -0
  36. package/src/selectors/selector.get-focus-inline-object.ts +1 -1
  37. package/src/selectors/selector.get-focus-list-block.ts +18 -0
  38. package/src/selectors/selector.get-focus-span.ts +18 -0
  39. package/src/selectors/selector.get-focus-text-block.ts +18 -0
  40. package/src/selectors/selector.get-last-block.ts +16 -0
  41. package/src/selectors/selector.get-list-state.ts +2 -1
  42. package/src/selectors/selector.get-next-block.ts +38 -0
  43. package/src/selectors/selector.get-next-inline-object.ts +1 -1
  44. package/src/selectors/selector.get-previous-block.ts +35 -0
  45. package/src/selectors/selector.get-previous-inline-object.ts +1 -1
  46. package/src/selectors/selector.get-selected-blocks.ts +50 -0
  47. package/src/selectors/selector.get-selection-end-block.ts +4 -1
  48. package/src/selectors/selector.get-selection-start-block.ts +4 -1
  49. package/src/selectors/selector.get-text-before.ts +1 -1
  50. package/src/selectors/selector.get-trimmed-selection.ts +1 -1
  51. package/src/selectors/selector.is-active-annotation.ts +1 -1
  52. package/src/selectors/selector.is-selecting-entire-blocks.ts +2 -1
  53. package/src/selectors/selectors.ts +0 -299
@@ -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 {getSelectionText} from './selector.get-selection-text'\nimport {getFocusBlock} from './selectors'\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,CAAa,aAAA;AAClE,MAAA,CAACA,SAASC,QAAQC;AACb,WAAA;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;AACI,WAAA;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,CAAa,aAAA;AAClE,MAAA,CAACA,SAASC,QAAQC;AACb,WAAA;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;AACI,WAAA;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,6 +1,40 @@
1
1
  "use strict";
2
2
  var selectionPoint = require("./selection-point.cjs"), selector_isSelectionExpanded = require("./selector.is-selection-expanded.cjs"), util_isEqualSelectionPoints = require("./util.is-equal-selection-points.cjs"), types = require("@sanity/types");
3
- const getSelectionEndPoint = (snapshot) => {
3
+ const getSelectedBlocks = (snapshot) => {
4
+ if (!snapshot.context.selection)
5
+ return [];
6
+ const selectedBlocks = [], startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection), startKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), endKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint);
7
+ if (!startKey || !endKey)
8
+ return selectedBlocks;
9
+ for (const block of snapshot.context.value) {
10
+ if (block._key === startKey) {
11
+ if (selectedBlocks.push({
12
+ node: block,
13
+ path: [{
14
+ _key: block._key
15
+ }]
16
+ }), startKey === endKey)
17
+ break;
18
+ continue;
19
+ }
20
+ if (block._key === endKey) {
21
+ selectedBlocks.push({
22
+ node: block,
23
+ path: [{
24
+ _key: block._key
25
+ }]
26
+ });
27
+ break;
28
+ }
29
+ selectedBlocks.length > 0 && selectedBlocks.push({
30
+ node: block,
31
+ path: [{
32
+ _key: block._key
33
+ }]
34
+ });
35
+ }
36
+ return selectedBlocks;
37
+ }, getSelectionEndPoint = (snapshot) => {
4
38
  if (snapshot.context.selection)
5
39
  return snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus;
6
40
  }, getSelectedSpans = (snapshot) => {
@@ -95,7 +129,7 @@ const getSelectionEndPoint = (snapshot) => {
95
129
  }, getActiveAnnotations = (snapshot) => {
96
130
  if (!snapshot.context.selection)
97
131
  return [];
98
- const selectedBlocks = selector_isSelectionExpanded.getSelectedBlocks(snapshot), selectedSpans = getSelectedSpans(snapshot), focusSpan = selector_isSelectionExpanded.getFocusSpan(snapshot);
132
+ const selectedBlocks = getSelectedBlocks(snapshot), selectedSpans = getSelectedSpans(snapshot), focusSpan = selector_isSelectionExpanded.getFocusSpan(snapshot);
99
133
  if (selectedSpans.length === 0 || !focusSpan)
100
134
  return [];
101
135
  if (selectedSpans.length === 1 && selector_isSelectionExpanded.isSelectionCollapsed(snapshot)) {
@@ -109,7 +143,7 @@ const getSelectionEndPoint = (snapshot) => {
109
143
  }, getActiveListItem = (snapshot) => {
110
144
  if (!snapshot.context.selection)
111
145
  return;
112
- const selectedTextBlocks = selector_isSelectionExpanded.getSelectedBlocks(snapshot).map((block) => block.node).filter((block) => selectionPoint.isTextBlock(snapshot.context, block)), firstTextBlock = selectedTextBlocks.at(0);
146
+ const selectedTextBlocks = getSelectedBlocks(snapshot).map((block) => block.node).filter((block) => selectionPoint.isTextBlock(snapshot.context, block)), firstTextBlock = selectedTextBlocks.at(0);
113
147
  if (!firstTextBlock)
114
148
  return;
115
149
  const firstListItem = firstTextBlock.listItem;
@@ -118,7 +152,7 @@ const getSelectionEndPoint = (snapshot) => {
118
152
  }, getActiveStyle = (snapshot) => {
119
153
  if (!snapshot.context.selection)
120
154
  return;
121
- const selectedTextBlocks = selector_isSelectionExpanded.getSelectedBlocks(snapshot).map((block) => block.node).filter((block) => selectionPoint.isTextBlock(snapshot.context, block)), firstTextBlock = selectedTextBlocks.at(0);
155
+ const selectedTextBlocks = getSelectedBlocks(snapshot).map((block) => block.node).filter((block) => selectionPoint.isTextBlock(snapshot.context, block)), firstTextBlock = selectedTextBlocks.at(0);
122
156
  if (!firstTextBlock)
123
157
  return;
124
158
  const firstStyle = firstTextBlock.style;
@@ -212,12 +246,107 @@ const getSelectionEndPoint = (snapshot) => {
212
246
  selection: caretWordSelection
213
247
  }
214
248
  }) ? caretWordSelection : null;
249
+ }, getFirstBlock = (snapshot) => {
250
+ const node = snapshot.context.value[0];
251
+ return node ? {
252
+ node,
253
+ path: [{
254
+ _key: node._key
255
+ }]
256
+ } : void 0;
257
+ }, getFocusBlockObject = (snapshot) => {
258
+ const focusBlock = selector_isSelectionExpanded.getFocusBlock(snapshot);
259
+ return focusBlock && !selectionPoint.isTextBlock(snapshot.context, focusBlock.node) ? {
260
+ node: focusBlock.node,
261
+ path: focusBlock.path
262
+ } : void 0;
215
263
  }, getFocusInlineObject = (snapshot) => {
216
264
  const focusChild = selector_isSelectionExpanded.getFocusChild(snapshot);
217
265
  return focusChild && !types.isPortableTextSpan(focusChild.node) ? {
218
266
  node: focusChild.node,
219
267
  path: focusChild.path
220
268
  } : void 0;
269
+ }, getFocusListBlock = (snapshot) => {
270
+ const focusTextBlock = selector_isSelectionExpanded.getFocusTextBlock(snapshot);
271
+ return focusTextBlock && selectionPoint.isListBlock(snapshot.context, focusTextBlock.node) ? {
272
+ node: focusTextBlock.node,
273
+ path: focusTextBlock.path
274
+ } : void 0;
275
+ }, getLastBlock = (snapshot) => {
276
+ const node = snapshot.context.value[snapshot.context.value.length - 1] ? snapshot.context.value[snapshot.context.value.length - 1] : void 0;
277
+ return node ? {
278
+ node,
279
+ path: [{
280
+ _key: node._key
281
+ }]
282
+ } : void 0;
283
+ }, getSelectionStartBlock = (snapshot) => {
284
+ const startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection);
285
+ if (startPoint)
286
+ return selector_isSelectionExpanded.getFocusBlock({
287
+ context: {
288
+ ...snapshot.context,
289
+ selection: {
290
+ anchor: startPoint,
291
+ focus: startPoint
292
+ }
293
+ }
294
+ });
295
+ }, getPreviousBlock = (snapshot) => {
296
+ let previousBlock;
297
+ const selectionStartBlock = getSelectionStartBlock(snapshot);
298
+ if (!selectionStartBlock)
299
+ 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)
331
+ 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;
221
350
  }, getSelectedTextBlocks = (snapshot) => {
222
351
  if (!snapshot.context.selection)
223
352
  return [];
@@ -337,7 +466,7 @@ const getSelectionEndPoint = (snapshot) => {
337
466
  return trimmedSelection;
338
467
  };
339
468
  function isActiveAnnotation(annotation) {
340
- return (snapshot) => selector_isSelectionExpanded.getSelectedBlocks(snapshot).flatMap((block) => selectionPoint.isTextBlock(snapshot.context, block.node) ? block.node.markDefs ?? [] : []).filter((markDef) => markDef._type === annotation && snapshot.beta.activeAnnotations.includes(markDef._key)).length > 0;
469
+ return (snapshot) => getSelectedBlocks(snapshot).flatMap((block) => selectionPoint.isTextBlock(snapshot.context, block.node) ? block.node.markDefs ?? [] : []).filter((markDef) => markDef._type === annotation && snapshot.beta.activeAnnotations.includes(markDef._key)).length > 0;
341
470
  }
342
471
  function isActiveDecorator(decorator) {
343
472
  return (snapshot) => {
@@ -506,7 +635,7 @@ function isOverlappingSelection(selection) {
506
635
  const isSelectingEntireBlocks = (snapshot) => {
507
636
  if (!snapshot.context.selection)
508
637
  return !1;
509
- const startPoint = snapshot.context.selection.backward ? snapshot.context.selection.focus : snapshot.context.selection.anchor, endPoint = snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus, startBlock = selector_isSelectionExpanded.getSelectionStartBlock(snapshot), endBlock = selector_isSelectionExpanded.getSelectionEndBlock(snapshot);
638
+ const startPoint = snapshot.context.selection.backward ? snapshot.context.selection.focus : snapshot.context.selection.anchor, endPoint = snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus, startBlock = getSelectionStartBlock(snapshot), endBlock = getSelectionEndBlock(snapshot);
510
639
  if (!startBlock || !endBlock)
511
640
  return !1;
512
641
  const startBlockStartPoint = selectionPoint.getBlockStartPoint({
@@ -522,11 +651,20 @@ exports.getActiveAnnotations = getActiveAnnotations;
522
651
  exports.getActiveListItem = getActiveListItem;
523
652
  exports.getActiveStyle = getActiveStyle;
524
653
  exports.getCaretWordSelection = getCaretWordSelection;
654
+ exports.getFirstBlock = getFirstBlock;
655
+ exports.getFocusBlockObject = getFocusBlockObject;
525
656
  exports.getFocusInlineObject = getFocusInlineObject;
657
+ exports.getFocusListBlock = getFocusListBlock;
658
+ exports.getLastBlock = getLastBlock;
659
+ exports.getNextBlock = getNextBlock;
526
660
  exports.getNextInlineObject = getNextInlineObject;
661
+ exports.getPreviousBlock = getPreviousBlock;
662
+ exports.getSelectedBlocks = getSelectedBlocks;
527
663
  exports.getSelectedSpans = getSelectedSpans;
528
664
  exports.getSelectedTextBlocks = getSelectedTextBlocks;
665
+ exports.getSelectionEndBlock = getSelectionEndBlock;
529
666
  exports.getSelectionEndPoint = getSelectionEndPoint;
667
+ exports.getSelectionStartBlock = getSelectionStartBlock;
530
668
  exports.getTrimmedSelection = getTrimmedSelection;
531
669
  exports.isActiveAnnotation = isActiveAnnotation;
532
670
  exports.isActiveDecorator = isActiveDecorator;
@@ -1 +1 @@
1
- {"version":3,"file":"selector.is-selecting-entire-blocks.cjs","sources":["../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selected-spans.ts","../../src/selectors/selector.get-active-annotations.ts","../../src/selectors/selector.get-active-list-item.ts","../../src/selectors/selector.get-active-style.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-caret-word-selection.ts","../../src/selectors/selector.get-focus-inline-object.ts","../../src/selectors/selector.get-selected-text-blocks.ts","../../src/selectors/selector.get-trimmed-selection.ts","../../src/selectors/selector.is-active-annotation.ts","../../src/selectors/selector.is-active-decorator.ts","../../src/selectors/selector.is-active-list-item.ts","../../src/selectors/selector.is-active-style.ts","../../src/selectors/selector.is-at-the-end-of-block.ts","../../src/selectors/selector.is-at-the-start-of-block.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts","../../src/selectors/selector.is-overlapping-selection.ts","../../src/selectors/selector.is-selecting-entire-blocks.ts"],"sourcesContent":["import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionEndPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n}\n","import type {KeyedSegment, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getSelectedSpans: EditorSelector<\n Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedSpans: Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }> = []\n\n const startPoint = getSelectionStartPoint(snapshot)\n const endPoint = getSelectionEndPoint(snapshot)\n\n if (!startPoint || !endPoint) {\n return selectedSpans\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return selectedSpans\n }\n\n const startSpanKey = getChildKeyFromSelectionPoint(startPoint)\n const endSpanKey = getChildKeyFromSelectionPoint(endPoint)\n\n let startBlockFound = false\n\n for (const block of snapshot.context.value) {\n if (block._key === startBlockKey) {\n startBlockFound = true\n }\n\n if (!isTextBlock(snapshot.context, block)) {\n continue\n }\n\n if (block._key === startBlockKey) {\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n if (startSpanKey && child._key === startSpanKey) {\n if (startPoint.offset < child.text.length) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n if (startSpanKey === endSpanKey) {\n break\n }\n\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n if (selectedSpans.length > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n if (block._key === endBlockKey) {\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n break\n }\n\n if (startBlockFound) {\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n }\n\n return selectedSpans\n}\n","import type {PortableTextObject} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {getFocusSpan, getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveAnnotations: EditorSelector<Array<PortableTextObject>> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const selectedSpans = getSelectedSpans(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (selectedSpans.length === 0 || !focusSpan) {\n return []\n }\n\n if (selectedSpans.length === 1 && isSelectionCollapsed(snapshot)) {\n if (snapshot.context.selection.focus.offset === 0) {\n return []\n }\n if (\n snapshot.context.selection.focus.offset === focusSpan.node.text.length\n ) {\n return []\n }\n }\n\n const activeAnnotations = snapshot.beta.activeAnnotations\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isTextBlock(snapshot.context, block.node)\n ? (block.node.markDefs ?? [])\n : [],\n )\n\n return selectionMarkDefs.filter((markDef) =>\n activeAnnotations.includes(markDef._key),\n )\n}\n","import type {PortableTextListBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveListItem: EditorSelector<\n PortableTextListBlock['listItem'] | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter((block) =>\n isTextBlock(snapshot.context, block),\n )\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstListItem = firstTextBlock.listItem\n\n if (!firstListItem) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.listItem === firstListItem)) {\n return firstListItem\n }\n\n return undefined\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveStyle: EditorSelector<PortableTextTextBlock['style']> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter((block) =>\n isTextBlock(snapshot.context, block),\n )\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstStyle = firstTextBlock.style\n\n if (!firstStyle) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.style === firstStyle)) {\n return firstStyle\n }\n\n return undefined\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getNextInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n const selectionEndPointChildKey =\n selectionEndPoint && isKeySegment(selectionEndPoint.path[2])\n ? selectionEndPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionEndPointChildKey) {\n return undefined\n }\n\n let endPointChildFound = false\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionEndPointChildKey) {\n endPointChildFound = true\n continue\n }\n\n if (!isSpan(snapshot.context, child) && endPointChildFound) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n break\n }\n }\n\n return inlineObject\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection} from '../types/editor'\nimport {\n blockOffsetToSpanSelectionPoint,\n getBlockEndPoint,\n getBlockStartPoint,\n spanSelectionPointToBlockOffset,\n} from '../utils'\nimport {getNextInlineObject} from './selector.get-next-inline-object'\nimport {getPreviousInlineObject} from './selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getSelectionText} from './selector.get-selection-text'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n * Returns the selection of the of the word the caret is placed in.\n * Note: Only returns a word selection if the current selection is collapsed\n */\nexport const getCaretWordSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return null\n }\n\n if (!isSelectionCollapsed(snapshot)) {\n return null\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset) {\n return null\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockStartPoint = getBlockStartPoint({\n context: snapshot.context,\n block: focusTextBlock,\n })\n const textBefore = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: previousInlineObject\n ? {path: previousInlineObject.path, offset: 0}\n : blockStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const textDirectlyBefore = textBefore.split(/\\s+/).at(-1)\n\n const nextInlineObject = getNextInlineObject(snapshot)\n const blockEndPoint = getBlockEndPoint({\n context: snapshot.context,\n block: focusTextBlock,\n })\n const textAfter = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: nextInlineObject\n ? {path: nextInlineObject.path, offset: 0}\n : blockEndPoint,\n },\n },\n })\n const textDirectlyAfter = textAfter.split(/\\s+/).at(0)\n\n if (\n (textDirectlyBefore === undefined || textDirectlyBefore === '') &&\n (textDirectlyAfter === undefined || textDirectlyAfter === '')\n ) {\n return null\n }\n\n const caretWordStartOffset: BlockOffset = textDirectlyBefore\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset - textDirectlyBefore.length,\n }\n : selectionStartOffset\n const caretWordEndOffset: BlockOffset = textDirectlyAfter\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset + textDirectlyAfter.length,\n }\n : selectionStartOffset\n\n const caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({\n context: snapshot.context,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n context: snapshot.context,\n blockOffset: caretWordEndOffset,\n direction: 'forward',\n })\n\n if (!caretWordStartSelectionPoint || !caretWordEndSelectionPoint) {\n return null\n }\n\n const caretWordSelection = {\n anchor: caretWordStartSelectionPoint,\n focus: caretWordEndSelectionPoint,\n }\n\n return isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ? caretWordSelection\n : null\n}\n","import {\n isPortableTextSpan,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getFocusChild} from './selectors'\n\n/**\n * @public\n */\nexport const getFocusInlineObject: EditorSelector<\n | {node: PortableTextObject; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const focusChild = getFocusChild(snapshot)\n\n return focusChild && !isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport {getSelectionEndPoint, getSelectionStartPoint} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedTextBlocks: EditorSelector<\n Array<{node: PortableTextTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedTextBlocks: Array<{\n node: PortableTextTextBlock\n path: [KeyedSegment]\n }> = []\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return selectedTextBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startBlockKey) {\n if (isTextBlock(snapshot.context, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n continue\n }\n\n if (block._key === endBlockKey) {\n if (isTextBlock(snapshot.context, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n\n break\n }\n\n if (selectedTextBlocks.length > 0) {\n if (isTextBlock(snapshot.context, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n }\n\n return selectedTextBlocks\n}\n","import type {PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {EditorSelection, EditorSelectionPoint} from '../types/editor'\nimport {\n getSelectionEndPoint,\n getSelectionStartPoint,\n isEmptyTextBlock,\n} from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getTrimmedSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return snapshot.context.selection\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return snapshot.context.selection\n }\n\n let startBlockFound = false\n let adjustedStartPoint: EditorSelectionPoint | undefined\n let trimStartPoint = false\n let adjustedEndPoint: EditorSelectionPoint | undefined\n let trimEndPoint = false\n let previousPotentialEndpoint:\n | {blockKey: string; span: PortableTextSpan}\n | undefined\n\n for (const block of snapshot.context.value) {\n if (block._key === startBlockKey) {\n startBlockFound = true\n\n if (\n isTextBlock(snapshot.context, block) &&\n isEmptyTextBlock(snapshot.context, block)\n ) {\n continue\n }\n }\n\n if (!startBlockFound) {\n continue\n }\n\n if (!isTextBlock(snapshot.context, block)) {\n continue\n }\n\n if (\n block._key === endBlockKey &&\n isEmptyTextBlock(snapshot.context, block)\n ) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (!isSpan(snapshot.context, child) || endPoint.offset === 0) {\n adjustedEndPoint = previousPotentialEndpoint\n ? {\n path: [\n {_key: previousPotentialEndpoint.blockKey},\n 'children',\n {_key: previousPotentialEndpoint.span._key},\n ],\n offset: previousPotentialEndpoint.span.text.length,\n }\n : undefined\n\n trimEndPoint = true\n break\n }\n }\n\n if (trimStartPoint) {\n const lonelySpan =\n isSpan(snapshot.context, child) && block.children.length === 1\n\n if (\n (isSpan(snapshot.context, child) && child.text.length > 0) ||\n lonelySpan\n ) {\n adjustedStartPoint = {\n path: [{_key: block._key}, 'children', {_key: child._key}],\n offset: 0,\n }\n previousPotentialEndpoint = {blockKey: block._key, span: child}\n trimStartPoint = false\n }\n\n continue\n }\n\n if (child._key === startChildKey) {\n if (!isSpan(snapshot.context, child)) {\n trimStartPoint = true\n continue\n }\n\n if (startPoint.offset === child.text.length) {\n trimStartPoint = true\n previousPotentialEndpoint =\n child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n continue\n }\n }\n\n previousPotentialEndpoint =\n isSpan(snapshot.context, child) && child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n }\n\n if (block._key === endBlockKey) {\n break\n }\n }\n\n const trimmedSelection = snapshot.context.selection.backward\n ? {\n anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n focus: adjustedStartPoint ?? startPoint,\n backward: true,\n }\n : {\n anchor: adjustedStartPoint ?? startPoint,\n focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n }\n\n if (\n isSelectionCollapsed({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: trimmedSelection,\n },\n })\n ) {\n const focusTextBlock = getFocusTextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: trimmedSelection,\n },\n })\n\n if (\n focusTextBlock &&\n !isEmptyTextBlock(snapshot.context, focusTextBlock.node)\n ) {\n return null\n }\n }\n\n return trimmedSelection\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport function isActiveAnnotation(\n annotation: string,\n): EditorSelector<boolean> {\n return (snapshot) => {\n const selectedBlocks = getSelectedBlocks(snapshot)\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isTextBlock(snapshot.context, block.node)\n ? (block.node.markDefs ?? [])\n : [],\n )\n const activeMarkDefs = selectionMarkDefs.filter(\n (markDef) =>\n markDef._type === annotation &&\n snapshot.beta.activeAnnotations.includes(markDef._key),\n )\n\n return activeMarkDefs.length > 0\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\n\n/**\n * @public\n */\nexport function isActiveDecorator(decorator: string): EditorSelector<boolean> {\n return (snapshot) => {\n if (isSelectionExpanded(snapshot)) {\n const selectedSpans = getSelectedSpans(snapshot)\n\n return (\n selectedSpans.length > 0 &&\n selectedSpans.every((span) => span.node.marks?.includes(decorator))\n )\n }\n\n return snapshot.beta.activeDecorators.includes(decorator)\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveListItem} from './selector.get-active-list-item'\n\n/**\n * @public\n */\nexport function isActiveListItem(listItem: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeListItem = getActiveListItem(snapshot)\n\n return activeListItem === listItem\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveStyle} from './selector.get-active-style'\n\n/**\n * @public\n */\nexport function isActiveStyle(style: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeStyle = getActiveStyle(snapshot)\n\n return activeStyle === style\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheEndOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockEndPoint = utils.getBlockEndPoint({\n context: snapshot.context,\n block,\n })\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockEndPoint,\n )\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheStartOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint({\n context: snapshot.context,\n block,\n })\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {getSelectionEndPoint} from '../utils'\n\n/**\n * @public\n */\nexport function isPointAfterSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n const pointBlockKey = getBlockKeyFromSelectionPoint(point)\n const pointChildKey = getChildKeyFromSelectionPoint(point)\n\n if (!pointBlockKey || !endBlockKey) {\n return false\n }\n\n let after = false\n\n for (const block of snapshot.context.value) {\n if (block._key === endBlockKey) {\n if (block._key !== pointBlockKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this block\n\n if (!isTextBlock(snapshot.context, block)) {\n break\n }\n\n if (!pointChildKey || !endChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (child._key !== pointChildKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this child\n\n after = point.offset > endPoint.offset\n break\n }\n\n if (child._key === pointChildKey) {\n break\n }\n }\n }\n\n if (block._key === pointBlockKey) {\n break\n }\n }\n\n return after\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {getSelectionStartPoint} from '../utils'\n\n/**\n * @public\n */\nexport function isPointBeforeSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n\n const pointBlockKey = getBlockKeyFromSelectionPoint(point)\n const pointChildKey = getChildKeyFromSelectionPoint(point)\n\n if (!pointBlockKey || !startBlockKey) {\n return false\n }\n\n let before = false\n\n for (const block of snapshot.context.value) {\n if (block._key === pointBlockKey) {\n if (block._key !== startBlockKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this block\n\n if (!isTextBlock(snapshot.context, block)) {\n break\n }\n\n if (!pointChildKey || !startChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === pointChildKey) {\n if (child._key !== startChildKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this child\n\n before = point.offset < startPoint.offset\n break\n }\n\n if (child._key === startChildKey) {\n break\n }\n }\n }\n\n if (block._key === startBlockKey) {\n break\n }\n }\n\n return before\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport {isEqualSelectionPoints} from '../utils'\nimport type {EditorSelector} from './../editor/editor-selector'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isPointAfterSelection} from './selector.is-point-after-selection'\nimport {isPointBeforeSelection} from './selector.is-point-before-selection'\n\n/**\n * @public\n */\nexport function isOverlappingSelection(\n selection: EditorSelection,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!selection || !snapshot.context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n const originalSelectionStartPoint = getSelectionStartPoint(snapshot)\n const originalSelectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (\n !selectionStartPoint ||\n !selectionEndPoint ||\n !originalSelectionStartPoint ||\n !originalSelectionEndPoint\n ) {\n return false\n }\n\n const startPointBeforeSelection =\n isPointBeforeSelection(selectionStartPoint)(snapshot)\n const startPointAfterSelection =\n isPointAfterSelection(selectionStartPoint)(snapshot)\n const endPointBeforeSelection =\n isPointBeforeSelection(selectionEndPoint)(snapshot)\n const endPointAfterSelection =\n isPointAfterSelection(selectionEndPoint)(snapshot)\n\n const originalStartPointBeforeStartPoint = isPointBeforeSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const originalStartPointAfterStartPoint = isPointAfterSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n\n const originalEndPointBeforeEndPoint = isPointBeforeSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n const originalEndPointAfterEndPoint = isPointAfterSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n\n const endPointEqualToOriginalStartPoint = isEqualSelectionPoints(\n selectionEndPoint,\n originalSelectionStartPoint,\n )\n const startPointEqualToOriginalEndPoint = isEqualSelectionPoints(\n selectionStartPoint,\n originalSelectionEndPoint,\n )\n\n if (endPointBeforeSelection && !endPointEqualToOriginalStartPoint) {\n return false\n }\n\n if (startPointAfterSelection && !startPointEqualToOriginalEndPoint) {\n return false\n }\n\n if (\n !originalStartPointBeforeStartPoint &&\n originalStartPointAfterStartPoint &&\n !originalEndPointBeforeEndPoint &&\n originalEndPointAfterEndPoint\n ) {\n return !endPointEqualToOriginalStartPoint\n }\n\n if (\n originalStartPointBeforeStartPoint &&\n !originalStartPointAfterStartPoint &&\n originalEndPointBeforeEndPoint &&\n !originalEndPointAfterEndPoint\n ) {\n return !startPointEqualToOriginalEndPoint\n }\n\n if (\n !startPointAfterSelection ||\n !startPointBeforeSelection ||\n !endPointAfterSelection ||\n !endPointBeforeSelection\n ) {\n return true\n }\n\n return false\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {getSelectionEndBlock, getSelectionStartBlock} from './selectors'\n\n/**\n * @public\n */\nexport const isSelectingEntireBlocks: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const startPoint = snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n const endPoint = snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n\n const startBlock = getSelectionStartBlock(snapshot)\n const endBlock = getSelectionEndBlock(snapshot)\n\n if (!startBlock || !endBlock) {\n return false\n }\n\n const startBlockStartPoint = utils.getBlockStartPoint({\n context: snapshot.context,\n block: startBlock,\n })\n const endBlockEndPoint = utils.getBlockEndPoint({\n context: snapshot.context,\n block: endBlock,\n })\n\n return (\n utils.isEqualSelectionPoints(startBlockStartPoint, startPoint) &&\n utils.isEqualSelectionPoints(endBlockEndPoint, endPoint)\n )\n}\n"],"names":["getSelectionEndPoint","snapshot","context","selection","backward","anchor","focus","getSelectedSpans","selectedSpans","startPoint","getSelectionStartPoint","endPoint","startBlockKey","getBlockKeyFromSelectionPoint","endBlockKey","startSpanKey","getChildKeyFromSelectionPoint","endSpanKey","startBlockFound","block","value","_key","isTextBlock","child","children","isSpan","offset","text","length","push","node","path","getActiveAnnotations","selectedBlocks","getSelectedBlocks","focusSpan","getFocusSpan","isSelectionCollapsed","activeAnnotations","beta","flatMap","markDefs","filter","markDef","includes","getActiveListItem","selectedTextBlocks","map","firstTextBlock","at","firstListItem","listItem","every","getActiveStyle","firstStyle","style","getNextInlineObject","focusTextBlock","getFocusTextBlock","selectionEndPoint","selectionEndPointChildKey","isKeySegment","undefined","endPointChildFound","inlineObject","getCaretWordSelection","selectionStartPoint","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","getPreviousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","getSelectionText","split","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isSelectionExpanded","getFocusInlineObject","focusChild","getFocusChild","isPortableTextSpan","getSelectedTextBlocks","getTrimmedSelection","startChildKey","endChildKey","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","isEmptyTextBlock","blockKey","span","lonelySpan","trimmedSelection","isActiveAnnotation","annotation","_type","isActiveDecorator","decorator","marks","activeDecorators","isActiveListItem","isActiveStyle","isAtTheEndOfBlock","utils","isAtTheStartOfBlock","isPointAfterSelection","point","pointBlockKey","pointChildKey","after","isPointBeforeSelection","before","isOverlappingSelection","originalSelectionStartPoint","originalSelectionEndPoint","startPointBeforeSelection","startPointAfterSelection","endPointBeforeSelection","endPointAfterSelection","originalStartPointBeforeStartPoint","originalStartPointAfterStartPoint","originalEndPointBeforeEndPoint","originalEndPointAfterEndPoint","endPointEqualToOriginalStartPoint","isEqualSelectionPoints","startPointEqualToOriginalEndPoint","isSelectingEntireBlocks","startBlock","getSelectionStartBlock","endBlock","getSelectionEndBlock","startBlockStartPoint","endBlockEndPoint"],"mappings":"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"}
1
+ {"version":3,"file":"selector.is-selecting-entire-blocks.cjs","sources":["../../src/selectors/selector.get-selected-blocks.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selected-spans.ts","../../src/selectors/selector.get-active-annotations.ts","../../src/selectors/selector.get-active-list-item.ts","../../src/selectors/selector.get-active-style.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-caret-word-selection.ts","../../src/selectors/selector.get-first-block.ts","../../src/selectors/selector.get-focus-block-object.ts","../../src/selectors/selector.get-focus-inline-object.ts","../../src/selectors/selector.get-focus-list-block.ts","../../src/selectors/selector.get-last-block.ts","../../src/selectors/selector.get-selection-start-block.ts","../../src/selectors/selector.get-previous-block.ts","../../src/selectors/selector.get-selection-end-block.ts","../../src/selectors/selector.get-next-block.ts","../../src/selectors/selector.get-selected-text-blocks.ts","../../src/selectors/selector.get-trimmed-selection.ts","../../src/selectors/selector.is-active-annotation.ts","../../src/selectors/selector.is-active-decorator.ts","../../src/selectors/selector.is-active-list-item.ts","../../src/selectors/selector.is-active-style.ts","../../src/selectors/selector.is-at-the-end-of-block.ts","../../src/selectors/selector.is-at-the-start-of-block.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts","../../src/selectors/selector.is-overlapping-selection.ts","../../src/selectors/selector.is-selecting-entire-blocks.ts"],"sourcesContent":["import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport type {BlockPath} from '../types/paths'\nimport {getSelectionEndPoint} from '../utils/util.get-selection-end-point'\nimport {getSelectionStartPoint} from '../utils/util.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: BlockPath}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n const startKey = getBlockKeyFromSelectionPoint(startPoint)\n const endKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (!startKey || !endKey) {\n return selectedBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n break\n }\n\n if (selectedBlocks.length > 0) {\n selectedBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n\n return selectedBlocks\n}\n","import type {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionEndPoint: EditorSelector<\n EditorSelectionPoint | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n return snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n}\n","import type {KeyedSegment, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getSelectedSpans: EditorSelector<\n Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedSpans: Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }> = []\n\n const startPoint = getSelectionStartPoint(snapshot)\n const endPoint = getSelectionEndPoint(snapshot)\n\n if (!startPoint || !endPoint) {\n return selectedSpans\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return selectedSpans\n }\n\n const startSpanKey = getChildKeyFromSelectionPoint(startPoint)\n const endSpanKey = getChildKeyFromSelectionPoint(endPoint)\n\n let startBlockFound = false\n\n for (const block of snapshot.context.value) {\n if (block._key === startBlockKey) {\n startBlockFound = true\n }\n\n if (!isTextBlock(snapshot.context, block)) {\n continue\n }\n\n if (block._key === startBlockKey) {\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n if (startSpanKey && child._key === startSpanKey) {\n if (startPoint.offset < child.text.length) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n if (startSpanKey === endSpanKey) {\n break\n }\n\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n if (selectedSpans.length > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n if (block._key === endBlockKey) {\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n break\n }\n\n if (startBlockFound) {\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n }\n\n return selectedSpans\n}\n","import type {PortableTextObject} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getFocusSpan} from './selector.get-focus-span'\nimport {getSelectedBlocks} from './selector.get-selected-blocks'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const getActiveAnnotations: EditorSelector<Array<PortableTextObject>> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const selectedSpans = getSelectedSpans(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n if (selectedSpans.length === 0 || !focusSpan) {\n return []\n }\n\n if (selectedSpans.length === 1 && isSelectionCollapsed(snapshot)) {\n if (snapshot.context.selection.focus.offset === 0) {\n return []\n }\n if (\n snapshot.context.selection.focus.offset === focusSpan.node.text.length\n ) {\n return []\n }\n }\n\n const activeAnnotations = snapshot.beta.activeAnnotations\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isTextBlock(snapshot.context, block.node)\n ? (block.node.markDefs ?? [])\n : [],\n )\n\n return selectionMarkDefs.filter((markDef) =>\n activeAnnotations.includes(markDef._key),\n )\n}\n","import type {PortableTextListBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedBlocks} from './selector.get-selected-blocks'\n\n/**\n * @public\n */\nexport const getActiveListItem: EditorSelector<\n PortableTextListBlock['listItem'] | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter((block) =>\n isTextBlock(snapshot.context, block),\n )\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstListItem = firstTextBlock.listItem\n\n if (!firstListItem) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.listItem === firstListItem)) {\n return firstListItem\n }\n\n return undefined\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedBlocks} from './selector.get-selected-blocks'\n\n/**\n * @public\n */\nexport const getActiveStyle: EditorSelector<PortableTextTextBlock['style']> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter((block) =>\n isTextBlock(snapshot.context, block),\n )\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstStyle = firstTextBlock.style\n\n if (!firstStyle) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.style === firstStyle)) {\n return firstStyle\n }\n\n return undefined\n}\n","import {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getFocusTextBlock} from './selector.get-focus-text-block'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\n\n/**\n * @public\n */\nexport const getNextInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionEndPoint = getSelectionEndPoint(snapshot)\n const selectionEndPointChildKey =\n selectionEndPoint && isKeySegment(selectionEndPoint.path[2])\n ? selectionEndPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionEndPointChildKey) {\n return undefined\n }\n\n let endPointChildFound = false\n let inlineObject:\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n\n for (const child of focusTextBlock.node.children) {\n if (child._key === selectionEndPointChildKey) {\n endPointChildFound = true\n continue\n }\n\n if (!isSpan(snapshot.context, child) && endPointChildFound) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n break\n }\n }\n\n return inlineObject\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection} from '../types/editor'\nimport {\n blockOffsetToSpanSelectionPoint,\n getBlockEndPoint,\n getBlockStartPoint,\n spanSelectionPointToBlockOffset,\n} from '../utils'\nimport {getFocusTextBlock} from './selector.get-focus-text-block'\nimport {getNextInlineObject} from './selector.get-next-inline-object'\nimport {getPreviousInlineObject} from './selector.get-previous-inline-object'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getSelectionText} from './selector.get-selection-text'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\n\n/**\n * @public\n * Returns the selection of the of the word the caret is placed in.\n * Note: Only returns a word selection if the current selection is collapsed\n */\nexport const getCaretWordSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return null\n }\n\n if (!isSelectionCollapsed(snapshot)) {\n return null\n }\n\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartOffset = selectionStartPoint\n ? spanSelectionPointToBlockOffset({\n context: snapshot.context,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset) {\n return null\n }\n\n const previousInlineObject = getPreviousInlineObject(snapshot)\n const blockStartPoint = getBlockStartPoint({\n context: snapshot.context,\n block: focusTextBlock,\n })\n const textBefore = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: previousInlineObject\n ? {path: previousInlineObject.path, offset: 0}\n : blockStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const textDirectlyBefore = textBefore.split(/\\s+/).at(-1)\n\n const nextInlineObject = getNextInlineObject(snapshot)\n const blockEndPoint = getBlockEndPoint({\n context: snapshot.context,\n block: focusTextBlock,\n })\n const textAfter = getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: nextInlineObject\n ? {path: nextInlineObject.path, offset: 0}\n : blockEndPoint,\n },\n },\n })\n const textDirectlyAfter = textAfter.split(/\\s+/).at(0)\n\n if (\n (textDirectlyBefore === undefined || textDirectlyBefore === '') &&\n (textDirectlyAfter === undefined || textDirectlyAfter === '')\n ) {\n return null\n }\n\n const caretWordStartOffset: BlockOffset = textDirectlyBefore\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset - textDirectlyBefore.length,\n }\n : selectionStartOffset\n const caretWordEndOffset: BlockOffset = textDirectlyAfter\n ? {\n ...selectionStartOffset,\n offset: selectionStartOffset.offset + textDirectlyAfter.length,\n }\n : selectionStartOffset\n\n const caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({\n context: snapshot.context,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n context: snapshot.context,\n blockOffset: caretWordEndOffset,\n direction: 'forward',\n })\n\n if (!caretWordStartSelectionPoint || !caretWordEndSelectionPoint) {\n return null\n }\n\n const caretWordSelection = {\n anchor: caretWordStartSelectionPoint,\n focus: caretWordEndSelectionPoint,\n }\n\n return isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ? caretWordSelection\n : null\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: BlockPath} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n","import type {PortableTextObject} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport type {BlockPath} from '../types/paths'\nimport {getFocusBlock} from './selector.get-focus-block'\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: BlockPath} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isTextBlock(snapshot.context, focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n","import {\n isPortableTextSpan,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getFocusChild} from './selector.get-focus-child'\n\n/**\n * @public\n */\nexport const getFocusInlineObject: EditorSelector<\n | {node: PortableTextObject; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = (snapshot) => {\n const focusChild = getFocusChild(snapshot)\n\n return focusChild && !isPortableTextSpan(focusChild.node)\n ? {node: focusChild.node, path: focusChild.path}\n : undefined\n}\n","import type {PortableTextListBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isListBlock} from '../internal-utils/parse-blocks'\nimport type {BlockPath} from '../types/paths'\nimport {getFocusTextBlock} from './selector.get-focus-text-block'\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: BlockPath} | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n\n return focusTextBlock && isListBlock(snapshot.context, focusTextBlock.node)\n ? {node: focusTextBlock.node, path: focusTextBlock.path}\n : undefined\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: BlockPath} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[snapshot.context.value.length - 1]\n ? snapshot.context.value[snapshot.context.value.length - 1]\n : undefined\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockPath} from '../types/paths'\nimport {getSelectionStartPoint} from '../utils/util.get-selection-start-point'\nimport {getFocusBlock} from './selector.get-focus-block'\n\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: BlockPath\n }\n | undefined\n> = (snapshot) => {\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n\n if (!startPoint) {\n return undefined\n }\n\n return getFocusBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startPoint,\n focus: startPoint,\n },\n },\n })\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockPath} from '../types/paths'\nimport {getSelectionStartBlock} from './selector.get-selection-start-block'\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: BlockPath} | undefined\n> = (snapshot) => {\n let previousBlock: {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n const selectionStartBlock = getSelectionStartBlock(snapshot)\n\n if (!selectionStartBlock) {\n return undefined\n }\n\n let foundSelectionStartBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionStartBlock.node._key) {\n foundSelectionStartBlock = true\n break\n }\n\n previousBlock = {node: block, path: [{_key: block._key}]}\n }\n\n if (foundSelectionStartBlock && previousBlock) {\n return previousBlock\n }\n\n return undefined\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockPath} from '../types/paths'\nimport {getSelectionEndPoint} from '../utils/util.get-selection-end-point'\nimport {getFocusBlock} from './selector.get-focus-block'\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: BlockPath\n }\n | undefined\n> = (snapshot) => {\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n\n if (!endPoint) {\n return undefined\n }\n\n return getFocusBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: endPoint,\n focus: endPoint,\n },\n },\n })\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {BlockPath} from '../types/paths'\nimport {getSelectionEndBlock} from './selector.get-selection-end-block'\n\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: BlockPath} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: BlockPath} | undefined\n const selectionEndBlock = getSelectionEndBlock(snapshot)\n\n if (!selectionEndBlock) {\n return undefined\n }\n\n let foundSelectionEndBlock = false\n\n for (const block of snapshot.context.value) {\n if (block._key === selectionEndBlock.node._key) {\n foundSelectionEndBlock = true\n continue\n }\n\n if (foundSelectionEndBlock) {\n nextBlock = {node: block, path: [{_key: block._key}]}\n break\n }\n }\n\n if (foundSelectionEndBlock && nextBlock) {\n return nextBlock\n }\n\n return undefined\n}\n","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport {getSelectionEndPoint, getSelectionStartPoint} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedTextBlocks: EditorSelector<\n Array<{node: PortableTextTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedTextBlocks: Array<{\n node: PortableTextTextBlock\n path: [KeyedSegment]\n }> = []\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return selectedTextBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startBlockKey) {\n if (isTextBlock(snapshot.context, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n continue\n }\n\n if (block._key === endBlockKey) {\n if (isTextBlock(snapshot.context, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n\n break\n }\n\n if (selectedTextBlocks.length > 0) {\n if (isTextBlock(snapshot.context, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n }\n\n return selectedTextBlocks\n}\n","import type {PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {EditorSelection, EditorSelectionPoint} from '../types/editor'\nimport {\n getSelectionEndPoint,\n getSelectionStartPoint,\n isEmptyTextBlock,\n} from '../utils'\nimport {getFocusTextBlock} from './selector.get-focus-text-block'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const getTrimmedSelection: EditorSelector<EditorSelection> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return snapshot.context.selection\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return snapshot.context.selection\n }\n\n let startBlockFound = false\n let adjustedStartPoint: EditorSelectionPoint | undefined\n let trimStartPoint = false\n let adjustedEndPoint: EditorSelectionPoint | undefined\n let trimEndPoint = false\n let previousPotentialEndpoint:\n | {blockKey: string; span: PortableTextSpan}\n | undefined\n\n for (const block of snapshot.context.value) {\n if (block._key === startBlockKey) {\n startBlockFound = true\n\n if (\n isTextBlock(snapshot.context, block) &&\n isEmptyTextBlock(snapshot.context, block)\n ) {\n continue\n }\n }\n\n if (!startBlockFound) {\n continue\n }\n\n if (!isTextBlock(snapshot.context, block)) {\n continue\n }\n\n if (\n block._key === endBlockKey &&\n isEmptyTextBlock(snapshot.context, block)\n ) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (!isSpan(snapshot.context, child) || endPoint.offset === 0) {\n adjustedEndPoint = previousPotentialEndpoint\n ? {\n path: [\n {_key: previousPotentialEndpoint.blockKey},\n 'children',\n {_key: previousPotentialEndpoint.span._key},\n ],\n offset: previousPotentialEndpoint.span.text.length,\n }\n : undefined\n\n trimEndPoint = true\n break\n }\n }\n\n if (trimStartPoint) {\n const lonelySpan =\n isSpan(snapshot.context, child) && block.children.length === 1\n\n if (\n (isSpan(snapshot.context, child) && child.text.length > 0) ||\n lonelySpan\n ) {\n adjustedStartPoint = {\n path: [{_key: block._key}, 'children', {_key: child._key}],\n offset: 0,\n }\n previousPotentialEndpoint = {blockKey: block._key, span: child}\n trimStartPoint = false\n }\n\n continue\n }\n\n if (child._key === startChildKey) {\n if (!isSpan(snapshot.context, child)) {\n trimStartPoint = true\n continue\n }\n\n if (startPoint.offset === child.text.length) {\n trimStartPoint = true\n previousPotentialEndpoint =\n child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n continue\n }\n }\n\n previousPotentialEndpoint =\n isSpan(snapshot.context, child) && child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n }\n\n if (block._key === endBlockKey) {\n break\n }\n }\n\n const trimmedSelection = snapshot.context.selection.backward\n ? {\n anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n focus: adjustedStartPoint ?? startPoint,\n backward: true,\n }\n : {\n anchor: adjustedStartPoint ?? startPoint,\n focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n }\n\n if (\n isSelectionCollapsed({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: trimmedSelection,\n },\n })\n ) {\n const focusTextBlock = getFocusTextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: trimmedSelection,\n },\n })\n\n if (\n focusTextBlock &&\n !isEmptyTextBlock(snapshot.context, focusTextBlock.node)\n ) {\n return null\n }\n }\n\n return trimmedSelection\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {getSelectedBlocks} from './selector.get-selected-blocks'\n\n/**\n * @public\n */\nexport function isActiveAnnotation(\n annotation: string,\n): EditorSelector<boolean> {\n return (snapshot) => {\n const selectedBlocks = getSelectedBlocks(snapshot)\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isTextBlock(snapshot.context, block.node)\n ? (block.node.markDefs ?? [])\n : [],\n )\n const activeMarkDefs = selectionMarkDefs.filter(\n (markDef) =>\n markDef._type === annotation &&\n snapshot.beta.activeAnnotations.includes(markDef._key),\n )\n\n return activeMarkDefs.length > 0\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\n\n/**\n * @public\n */\nexport function isActiveDecorator(decorator: string): EditorSelector<boolean> {\n return (snapshot) => {\n if (isSelectionExpanded(snapshot)) {\n const selectedSpans = getSelectedSpans(snapshot)\n\n return (\n selectedSpans.length > 0 &&\n selectedSpans.every((span) => span.node.marks?.includes(decorator))\n )\n }\n\n return snapshot.beta.activeDecorators.includes(decorator)\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveListItem} from './selector.get-active-list-item'\n\n/**\n * @public\n */\nexport function isActiveListItem(listItem: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeListItem = getActiveListItem(snapshot)\n\n return activeListItem === listItem\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveStyle} from './selector.get-active-style'\n\n/**\n * @public\n */\nexport function isActiveStyle(style: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeStyle = getActiveStyle(snapshot)\n\n return activeStyle === style\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheEndOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockEndPoint = utils.getBlockEndPoint({\n context: snapshot.context,\n block,\n })\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockEndPoint,\n )\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport function isAtTheStartOfBlock(block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection || !isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint({\n context: snapshot.context,\n block,\n })\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {getSelectionEndPoint} from '../utils'\n\n/**\n * @public\n */\nexport function isPointAfterSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const endPoint = getSelectionEndPoint(snapshot.context.selection)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n const pointBlockKey = getBlockKeyFromSelectionPoint(point)\n const pointChildKey = getChildKeyFromSelectionPoint(point)\n\n if (!pointBlockKey || !endBlockKey) {\n return false\n }\n\n let after = false\n\n for (const block of snapshot.context.value) {\n if (block._key === endBlockKey) {\n if (block._key !== pointBlockKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this block\n\n if (!isTextBlock(snapshot.context, block)) {\n break\n }\n\n if (!pointChildKey || !endChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (child._key !== pointChildKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this child\n\n after = point.offset > endPoint.offset\n break\n }\n\n if (child._key === pointChildKey) {\n break\n }\n }\n }\n\n if (block._key === pointBlockKey) {\n break\n }\n }\n\n return after\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {getSelectionStartPoint} from '../utils'\n\n/**\n * @public\n */\nexport function isPointBeforeSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n\n const pointBlockKey = getBlockKeyFromSelectionPoint(point)\n const pointChildKey = getChildKeyFromSelectionPoint(point)\n\n if (!pointBlockKey || !startBlockKey) {\n return false\n }\n\n let before = false\n\n for (const block of snapshot.context.value) {\n if (block._key === pointBlockKey) {\n if (block._key !== startBlockKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this block\n\n if (!isTextBlock(snapshot.context, block)) {\n break\n }\n\n if (!pointChildKey || !startChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === pointChildKey) {\n if (child._key !== startChildKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this child\n\n before = point.offset < startPoint.offset\n break\n }\n\n if (child._key === startChildKey) {\n break\n }\n }\n }\n\n if (block._key === startBlockKey) {\n break\n }\n }\n\n return before\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport {isEqualSelectionPoints} from '../utils'\nimport type {EditorSelector} from './../editor/editor-selector'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isPointAfterSelection} from './selector.is-point-after-selection'\nimport {isPointBeforeSelection} from './selector.is-point-before-selection'\n\n/**\n * @public\n */\nexport function isOverlappingSelection(\n selection: EditorSelection,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!selection || !snapshot.context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection,\n },\n })\n\n const originalSelectionStartPoint = getSelectionStartPoint(snapshot)\n const originalSelectionEndPoint = getSelectionEndPoint(snapshot)\n\n if (\n !selectionStartPoint ||\n !selectionEndPoint ||\n !originalSelectionStartPoint ||\n !originalSelectionEndPoint\n ) {\n return false\n }\n\n const startPointBeforeSelection =\n isPointBeforeSelection(selectionStartPoint)(snapshot)\n const startPointAfterSelection =\n isPointAfterSelection(selectionStartPoint)(snapshot)\n const endPointBeforeSelection =\n isPointBeforeSelection(selectionEndPoint)(snapshot)\n const endPointAfterSelection =\n isPointAfterSelection(selectionEndPoint)(snapshot)\n\n const originalStartPointBeforeStartPoint = isPointBeforeSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n const originalStartPointAfterStartPoint = isPointAfterSelection(\n originalSelectionStartPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionStartPoint,\n focus: selectionStartPoint,\n },\n },\n })\n\n const originalEndPointBeforeEndPoint = isPointBeforeSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n const originalEndPointAfterEndPoint = isPointAfterSelection(\n originalSelectionEndPoint,\n )({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: selectionEndPoint,\n focus: selectionEndPoint,\n },\n },\n })\n\n const endPointEqualToOriginalStartPoint = isEqualSelectionPoints(\n selectionEndPoint,\n originalSelectionStartPoint,\n )\n const startPointEqualToOriginalEndPoint = isEqualSelectionPoints(\n selectionStartPoint,\n originalSelectionEndPoint,\n )\n\n if (endPointBeforeSelection && !endPointEqualToOriginalStartPoint) {\n return false\n }\n\n if (startPointAfterSelection && !startPointEqualToOriginalEndPoint) {\n return false\n }\n\n if (\n !originalStartPointBeforeStartPoint &&\n originalStartPointAfterStartPoint &&\n !originalEndPointBeforeEndPoint &&\n originalEndPointAfterEndPoint\n ) {\n return !endPointEqualToOriginalStartPoint\n }\n\n if (\n originalStartPointBeforeStartPoint &&\n !originalStartPointAfterStartPoint &&\n originalEndPointBeforeEndPoint &&\n !originalEndPointAfterEndPoint\n ) {\n return !startPointEqualToOriginalEndPoint\n }\n\n if (\n !startPointAfterSelection ||\n !startPointBeforeSelection ||\n !endPointAfterSelection ||\n !endPointBeforeSelection\n ) {\n return true\n }\n\n return false\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {getSelectionEndBlock} from './selector.get-selection-end-block'\nimport {getSelectionStartBlock} from './selector.get-selection-start-block'\n\n/**\n * @public\n */\nexport const isSelectingEntireBlocks: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const startPoint = snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n const endPoint = snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n\n const startBlock = getSelectionStartBlock(snapshot)\n const endBlock = getSelectionEndBlock(snapshot)\n\n if (!startBlock || !endBlock) {\n return false\n }\n\n const startBlockStartPoint = utils.getBlockStartPoint({\n context: snapshot.context,\n block: startBlock,\n })\n const endBlockEndPoint = utils.getBlockEndPoint({\n context: snapshot.context,\n block: endBlock,\n })\n\n return (\n utils.isEqualSelectionPoints(startBlockStartPoint, startPoint) &&\n utils.isEqualSelectionPoints(endBlockEndPoint, endPoint)\n )\n}\n"],"names":["getSelectedBlocks","snapshot","context","selection","selectedBlocks","startPoint","getSelectionStartPoint","endPoint","getSelectionEndPoint","startKey","getBlockKeyFromSelectionPoint","endKey","block","value","_key","push","node","path","length","backward","anchor","focus","getSelectedSpans","selectedSpans","startBlockKey","endBlockKey","startSpanKey","getChildKeyFromSelectionPoint","endSpanKey","startBlockFound","isTextBlock","child","children","isSpan","offset","text","getActiveAnnotations","focusSpan","getFocusSpan","isSelectionCollapsed","activeAnnotations","beta","flatMap","markDefs","filter","markDef","includes","getActiveListItem","selectedTextBlocks","map","firstTextBlock","at","firstListItem","listItem","every","getActiveStyle","firstStyle","style","getNextInlineObject","focusTextBlock","getFocusTextBlock","selectionEndPoint","selectionEndPointChildKey","isKeySegment","undefined","endPointChildFound","inlineObject","getCaretWordSelection","selectionStartPoint","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","getPreviousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","getSelectionText","split","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isSelectionExpanded","getFirstBlock","getFocusBlockObject","focusBlock","getFocusBlock","getFocusInlineObject","focusChild","getFocusChild","isPortableTextSpan","getFocusListBlock","isListBlock","getLastBlock","getSelectionStartBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getSelectionEndBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","getSelectedTextBlocks","getTrimmedSelection","startChildKey","endChildKey","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","isEmptyTextBlock","blockKey","span","lonelySpan","trimmedSelection","isActiveAnnotation","annotation","_type","isActiveDecorator","decorator","marks","activeDecorators","isActiveListItem","isActiveStyle","isAtTheEndOfBlock","utils","isAtTheStartOfBlock","isPointAfterSelection","point","pointBlockKey","pointChildKey","after","isPointBeforeSelection","before","isOverlappingSelection","originalSelectionStartPoint","originalSelectionEndPoint","startPointBeforeSelection","startPointAfterSelection","endPointBeforeSelection","endPointAfterSelection","originalStartPointBeforeStartPoint","originalStartPointAfterStartPoint","originalEndPointBeforeEndPoint","originalEndPointAfterEndPoint","endPointEqualToOriginalStartPoint","isEqualSelectionPoints","startPointEqualToOriginalEndPoint","isSelectingEntireBlocks","startBlock","endBlock","startBlockStartPoint","endBlockEndPoint"],"mappings":"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"}