@portabletext/editor 1.43.0 → 1.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/lib/_chunks-cjs/behavior.markdown.cjs +1 -1
  2. package/lib/_chunks-cjs/editor-provider.cjs +445 -623
  3. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  4. package/lib/_chunks-cjs/parse-blocks.cjs +151 -0
  5. package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -0
  6. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs +2 -1
  7. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
  8. package/lib/_chunks-cjs/{selector.is-active-style.cjs → selector.is-selecting-entire-blocks.cjs} +47 -11
  9. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -0
  10. package/lib/_chunks-cjs/util.merge-text-blocks.cjs +3 -3
  11. package/lib/_chunks-cjs/util.merge-text-blocks.cjs.map +1 -1
  12. package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs +0 -149
  13. package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs.map +1 -1
  14. package/lib/_chunks-es/behavior.markdown.js +1 -1
  15. package/lib/_chunks-es/editor-provider.js +434 -611
  16. package/lib/_chunks-es/editor-provider.js.map +1 -1
  17. package/lib/_chunks-es/parse-blocks.js +152 -0
  18. package/lib/_chunks-es/parse-blocks.js.map +1 -0
  19. package/lib/_chunks-es/selector.is-overlapping-selection.js +2 -1
  20. package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
  21. package/lib/_chunks-es/{selector.is-active-style.js → selector.is-selecting-entire-blocks.js} +49 -12
  22. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -0
  23. package/lib/_chunks-es/util.merge-text-blocks.js +1 -1
  24. package/lib/_chunks-es/util.selection-point-to-block-offset.js +0 -149
  25. package/lib/_chunks-es/util.selection-point-to-block-offset.js.map +1 -1
  26. package/lib/behaviors/index.d.cts +1860 -5464
  27. package/lib/behaviors/index.d.ts +1860 -5464
  28. package/lib/index.cjs +4 -4
  29. package/lib/index.cjs.map +1 -1
  30. package/lib/index.d.cts +1529 -5062
  31. package/lib/index.d.ts +1529 -5062
  32. package/lib/index.js +3 -3
  33. package/lib/plugins/index.cjs +1 -1
  34. package/lib/plugins/index.d.cts +1529 -5062
  35. package/lib/plugins/index.d.ts +1529 -5062
  36. package/lib/plugins/index.js +1 -1
  37. package/lib/selectors/index.cjs +12 -11
  38. package/lib/selectors/index.cjs.map +1 -1
  39. package/lib/selectors/index.d.cts +1508 -5064
  40. package/lib/selectors/index.d.ts +1508 -5064
  41. package/lib/selectors/index.js +2 -1
  42. package/lib/utils/index.d.cts +1491 -5057
  43. package/lib/utils/index.d.ts +1491 -5057
  44. package/package.json +1 -1
  45. package/src/behavior-actions/behavior.actions.ts +1 -131
  46. package/src/behaviors/behavior.default.ts +47 -50
  47. package/src/behaviors/behavior.internal.insert.ts +118 -0
  48. package/src/behaviors/behavior.internal.list-item.ts +61 -0
  49. package/src/behaviors/behavior.internal.select.ts +62 -0
  50. package/src/behaviors/behavior.internal.style.ts +54 -0
  51. package/src/behaviors/behavior.perform-event.ts +15 -13
  52. package/src/behaviors/behavior.types.event.ts +143 -100
  53. package/src/editor/create-editor.ts +2 -2
  54. package/src/editor/editor-machine.ts +3 -4
  55. package/src/editor/plugins/createWithEditableAPI.ts +1 -2
  56. package/src/editor/sync-machine.ts +1 -1
  57. package/src/internal-utils/slate-utils.ts +52 -0
  58. package/src/plugins/plugin.internal.editor-actor-ref.tsx +15 -0
  59. package/src/plugins/plugin.internal.slate-editor-ref.tsx +15 -0
  60. package/src/selectors/index.ts +2 -1
  61. package/src/selectors/selector.get-selected-text-blocks.ts +67 -0
  62. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +0 -1
  63. package/lib/_chunks-es/selector.is-active-style.js.map +0 -1
  64. package/src/behavior-actions/behavior.action.data-transfer-set.ts +0 -7
  65. package/src/behavior-actions/behavior.action.deserialization.failure.ts +0 -9
  66. package/src/behavior-actions/behavior.action.deserialization.success.ts +0 -16
  67. package/src/behavior-actions/behavior.action.insert-blocks.ts +0 -140
  68. package/src/behavior-actions/behavior.action.list-item.ts +0 -100
  69. package/src/behavior-actions/behavior.action.select.next-block.ts +0 -44
  70. package/src/behavior-actions/behavior.action.select.previous-block.ts +0 -48
  71. package/src/behavior-actions/behavior.action.serialization.failure.ts +0 -9
  72. package/src/behavior-actions/behavior.action.serialization.success.ts +0 -17
  73. package/src/behavior-actions/behavior.action.style.ts +0 -108
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ function isTypedObject(object) {
3
+ return isRecord(object) && typeof object._type == "string";
4
+ }
5
+ function isRecord(value) {
6
+ return !!value && (typeof value == "object" || typeof value == "function");
7
+ }
8
+ function parseBlocks({
9
+ context,
10
+ blocks,
11
+ options
12
+ }) {
13
+ return Array.isArray(blocks) ? blocks.flatMap((block) => {
14
+ const parsedBlock = parseBlock({
15
+ context,
16
+ block,
17
+ options
18
+ });
19
+ return parsedBlock ? [parsedBlock] : [];
20
+ }) : [];
21
+ }
22
+ function parseBlock({
23
+ context,
24
+ block,
25
+ options
26
+ }) {
27
+ return parseTextBlock({
28
+ block,
29
+ context,
30
+ options
31
+ }) ?? parseBlockObject({
32
+ blockObject: block,
33
+ context,
34
+ options
35
+ });
36
+ }
37
+ function parseBlockObject({
38
+ blockObject,
39
+ context,
40
+ options
41
+ }) {
42
+ if (isTypedObject(blockObject) && !(blockObject._type === context.schema.block.name || blockObject._type === "block" || !context.schema.blockObjects.some(({
43
+ name
44
+ }) => name === blockObject._type)))
45
+ return {
46
+ ...blockObject,
47
+ _key: options.refreshKeys ? context.keyGenerator() : typeof blockObject._key == "string" ? blockObject._key : context.keyGenerator()
48
+ };
49
+ }
50
+ function isTextBlock(schema, block) {
51
+ return parseTextBlock({
52
+ block,
53
+ context: {
54
+ schema,
55
+ keyGenerator: () => ""
56
+ },
57
+ options: {
58
+ refreshKeys: !1
59
+ }
60
+ }) !== void 0;
61
+ }
62
+ function parseTextBlock({
63
+ block,
64
+ context,
65
+ options
66
+ }) {
67
+ if (!isTypedObject(block) || block._type !== context.schema.block.name)
68
+ return;
69
+ const _key = options.refreshKeys ? context.keyGenerator() : typeof block._key == "string" ? block._key : context.keyGenerator(), unparsedMarkDefs = Array.isArray(block.markDefs) ? block.markDefs : [], markDefKeyMap = /* @__PURE__ */ new Map(), markDefs = unparsedMarkDefs.flatMap((markDef) => {
70
+ if (!isTypedObject(markDef))
71
+ return [];
72
+ if (typeof markDef._key != "string")
73
+ return [];
74
+ if (context.schema.annotations.some((annotation) => annotation.name === markDef._type)) {
75
+ const _key2 = options.refreshKeys ? context.keyGenerator() : markDef._key;
76
+ return markDefKeyMap.set(markDef._key, _key2), [{
77
+ ...markDef,
78
+ _key: _key2
79
+ }];
80
+ }
81
+ return [];
82
+ }), children = (Array.isArray(block.children) ? block.children : []).map((child) => parseSpan({
83
+ span: child,
84
+ context,
85
+ markDefKeyMap,
86
+ options
87
+ }) ?? parseInlineObject({
88
+ inlineObject: child,
89
+ context,
90
+ options
91
+ })).filter((child) => child !== void 0), parsedBlock = {
92
+ // Spread the entire block to allow custom properties on it
93
+ ...block,
94
+ _key,
95
+ children: children.length > 0 ? children : [{
96
+ _key: context.keyGenerator(),
97
+ _type: context.schema.span.name,
98
+ text: "",
99
+ marks: []
100
+ }],
101
+ markDefs
102
+ };
103
+ if (typeof parsedBlock.style != "string" || !context.schema.styles.find((style) => style.value === block.style)) {
104
+ const defaultStyle = context.schema.styles.at(0)?.value;
105
+ defaultStyle !== void 0 ? parsedBlock.style = defaultStyle : delete parsedBlock.style;
106
+ }
107
+ return (typeof parsedBlock.listItem != "string" || !context.schema.lists.find((list) => list.value === block.listItem)) && delete parsedBlock.listItem, typeof parsedBlock.level != "number" && delete parsedBlock.level, parsedBlock;
108
+ }
109
+ function parseSpan({
110
+ span,
111
+ context,
112
+ markDefKeyMap,
113
+ options
114
+ }) {
115
+ if (!isTypedObject(span) || span._type !== context.schema.span.name || span._type !== "span")
116
+ return;
117
+ const marks = (Array.isArray(span.marks) ? span.marks : []).flatMap((mark) => {
118
+ if (typeof mark != "string")
119
+ return [];
120
+ const markDefKey = markDefKeyMap.get(mark);
121
+ return markDefKey !== void 0 ? [markDefKey] : context.schema.decorators.some((decorator) => decorator.value === mark) ? [mark] : [];
122
+ });
123
+ return {
124
+ // Spread the entire span to allow custom properties on it
125
+ ...span,
126
+ _type: "span",
127
+ _key: options.refreshKeys ? context.keyGenerator() : typeof span._key == "string" ? span._key : context.keyGenerator(),
128
+ text: typeof span.text == "string" ? span.text : "",
129
+ marks
130
+ };
131
+ }
132
+ function parseInlineObject({
133
+ inlineObject,
134
+ context,
135
+ options
136
+ }) {
137
+ if (isTypedObject(inlineObject) && !(inlineObject._type === context.schema.span.name || inlineObject._type === "span" || // Respect the schema definition and don't parse inline objects that are not defined
138
+ !context.schema.inlineObjects.some(({
139
+ name
140
+ }) => name === inlineObject._type)))
141
+ return {
142
+ // Spread the entire inline object to allow custom properties on it
143
+ ...inlineObject,
144
+ _key: options.refreshKeys ? context.keyGenerator() : typeof inlineObject._key == "string" ? inlineObject._key : context.keyGenerator()
145
+ };
146
+ }
147
+ exports.isTextBlock = isTextBlock;
148
+ exports.isTypedObject = isTypedObject;
149
+ exports.parseBlock = parseBlock;
150
+ exports.parseBlocks = parseBlocks;
151
+ //# sourceMappingURL=parse-blocks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-blocks.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts"],"sourcesContent":["import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n refreshKeys: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n refreshKeys: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n if (\n blockObject._type === context.schema.block.name ||\n blockObject._type === 'block' ||\n !context.schema.blockObjects.some(({name}) => name === blockObject._type)\n ) {\n return undefined\n }\n\n return {\n ...blockObject,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof blockObject._key === 'string'\n ? blockObject._key\n : context.keyGenerator(),\n }\n}\n\nexport function isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n return []\n }\n\n if (\n context.schema.annotations.some(\n (annotation) => annotation.name === markDef._type,\n )\n ) {\n const _key = options.refreshKeys ? context.keyGenerator() : markDef._key\n markDefKeyMap.set(markDef._key, _key)\n\n return [\n {\n ...markDef,\n _key,\n },\n ]\n }\n\n return []\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n // Spread the entire block to allow custom properties on it\n ...block,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.value === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.value\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.value === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function isSpan(\n schema: EditorSchema,\n child: PortableTextSpan | PortableTextObject,\n): child is PortableTextSpan {\n return (\n parseSpan({\n span: child,\n markDefKeyMap: new Map(),\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.value === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n }\n}\n\nfunction parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n if (\n inlineObject._type === context.schema.span.name ||\n inlineObject._type === 'span' ||\n // Respect the schema definition and don't parse inline objects that are not defined\n !context.schema.inlineObjects.some(({name}) => name === inlineObject._type)\n ) {\n return undefined\n }\n\n return {\n // Spread the entire inline object to allow custom properties on it\n ...inlineObject,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof inlineObject._key === 'string'\n ? inlineObject._key\n : context.keyGenerator(),\n }\n}\n"],"names":["isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schema","name","blockObjects","some","_key","refreshKeys","keyGenerator","isTextBlock","undefined","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","annotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","find","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","decorator","inlineObjects"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  var util_sliceBlocks = require("./util.slice-blocks.cjs"), types = require("@sanity/types");
3
+ const isSelectionCollapsed = (snapshot) => snapshot.context.selection ? JSON.stringify(snapshot.context.selection.anchor.path) === JSON.stringify(snapshot.context.selection.focus.path) && snapshot.context.selection?.anchor.offset === snapshot.context.selection?.focus.offset : !1;
3
4
  function createGuards({
4
5
  schema
5
6
  }) {
@@ -170,7 +171,7 @@ const getFocusBlock = (snapshot) => {
170
171
  }
171
172
  if (foundSelectionEndBlock && nextBlock)
172
173
  return nextBlock;
173
- }, isSelectionCollapsed = (snapshot) => snapshot.context.selection ? JSON.stringify(snapshot.context.selection.anchor.path) === JSON.stringify(snapshot.context.selection.focus.path) && snapshot.context.selection?.anchor.offset === snapshot.context.selection?.focus.offset : !1, getSelectionEndPoint = (snapshot) => {
174
+ }, getSelectionEndPoint = (snapshot) => {
174
175
  if (snapshot.context.selection)
175
176
  return snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus;
176
177
  }, getSelectionStartPoint = (snapshot) => {
@@ -1 +1 @@
1
- {"version":3,"file":"selector.is-overlapping-selection.cjs","sources":["../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.is-selection-collapsed.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selection-start-point.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-previous-inline-object.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection-text.ts","../../src/selectors/selector.is-selection-expanded.ts","../../src/selectors/selector.get-caret-word-selection.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"],"sourcesContent":["import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const guards = createGuards(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusBlock = getFocusTextBlock(snapshot)\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[2])\n ? snapshot.context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; 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\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | 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\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\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\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | 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\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | 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 {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n return (\n JSON.stringify(snapshot.context.selection.anchor.path) ===\n JSON.stringify(snapshot.context.selection.focus.path) &&\n snapshot.context.selection?.anchor.offset ===\n snapshot.context.selection?.focus.offset\n )\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 {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionStartPoint: 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.focus\n : snapshot.context.selection.anchor\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 {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getPreviousInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartPointChildKey =\n selectionStartPoint && isKeySegment(selectionStartPoint.path[2])\n ? selectionStartPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionStartPointChildKey) {\n return undefined\n }\n\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 === selectionStartPointChildKey) {\n break\n }\n\n if (!isSpan(snapshot.context, child)) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n }\n }\n\n return inlineObject\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return sliceBlocks({\n blocks: snapshot.context.value,\n selection: snapshot.context.selection,\n })\n}\n","import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSlice} from './selector.get-selected-slice'\n\n/**\n * @public\n */\nexport const getSelectionText: EditorSelector<string> = (snapshot) => {\n const selectedSlice = getSelectedSlice(snapshot)\n\n return selectedSlice.reduce((text, block) => {\n if (!isPortableTextTextBlock(block)) {\n return text\n }\n\n return (\n text +\n block.children.reduce((text, child) => {\n if (isPortableTextSpan(child)) {\n return text + child.text\n }\n\n return text\n }, '')\n )\n }, '')\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = (snapshot) => {\n return !isSelectionCollapsed(snapshot)\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 value: snapshot.context.value,\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(focusTextBlock)\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(focusTextBlock)\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 value: snapshot.context.value,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\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 {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(block)\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(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\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 selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const endBlockKey = isKeySegment(selection.focus.path[0])\n ? selection.focus.path[0]._key\n : undefined\n const endChildKey = isKeySegment(selection.focus.path[2])\n ? selection.focus.path[2]._key\n : undefined\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 (!isPortableTextTextBlock(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 > selection.focus.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 {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\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 selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const startBlockKey = isKeySegment(selection.anchor.path[0])\n ? selection.anchor.path[0]._key\n : undefined\n const startChildKey = isKeySegment(selection.anchor.path[2])\n ? selection.anchor.path[2]._key\n : undefined\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 (!isPortableTextTextBlock(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 < selection.anchor.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"],"names":["createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","snapshot","key","context","selection","isKeySegment","focus","path","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","anchor","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","isSelectionCollapsed","JSON","stringify","offset","getSelectionEndPoint","getSelectionStartPoint","getNextInlineObject","focusTextBlock","selectionEndPoint","selectionEndPointChildKey","endPointChildFound","inlineObject","child","isSpan","getPreviousInlineObject","selectionStartPoint","selectionStartPointChildKey","getSelectedSlice","sliceBlocks","blocks","getSelectionText","reduce","text","isSelectionExpanded","getCaretWordSelection","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","split","at","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isAtTheEndOfBlock","utils","isAtTheStartOfBlock","isPointAfterSelection","point","reverseSelection","pointBlockKey","pointChildKey","endBlockKey","endChildKey","after","isPointBeforeSelection","startBlockKey","startChildKey","before","isOverlappingSelection","originalSelectionStartPoint","originalSelectionEndPoint","startPointBeforeSelection","startPointAfterSelection","endPointBeforeSelection","endPointAfterSelection","originalStartPointBeforeStartPoint","originalStartPointAfterStartPoint","originalEndPointBeforeEndPoint","originalEndPointAfterEndPoint","endPointEqualToOriginalStartPoint","isEqualSelectionPoints","startPointEqualToOriginalEndPoint"],"mappings":";;AAaO,SAASA,aAAa;AAAA,EAACC;AAA8B,GAAG;AAC7D,WAASC,YAAYC,OAAgD;AACnE,WAAOC,MAAAA,wBAAwBD,KAAK,KAAKA,MAAME,UAAUJ,OAAOE,MAAMG;AAAAA,EAAAA;AAGxE,WAASC,YAAYJ,OAAgD;AACnE,WAAOK,MAAAA,wBAAwBL,KAAK,KAAKA,MAAME,UAAUJ,OAAOE,MAAMG;AAAAA,EAAAA;AAGjE,SAAA;AAAA,IAACJ;AAAAA,IAAaK;AAAAA,EAAW;AAClC;ACNO,MAAME,gBAERC,CAAa,aAAA;AAChB,QAAMC,MAAMD,SAASE,QAAQC,aACzBC,MAAAA,aAAaJ,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACnDN,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OAE3CC,QAEEC,OAAOR,MACTD,SAASE,QAAQQ,MAAMC,KAAMlB,CAAAA,UAAUA,MAAMc,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MAAM;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAAKO;AACrD,GAKaI,oBAERZ,CAAa,aAAA;AAChB,QAAMa,SAASvB,aAAaU,SAASE,OAAO,GACtCY,aAAaf,cAAcC,QAAQ;AAEzC,SAAOc,cAAcD,OAAOrB,YAAYsB,WAAWL,IAAI,IACnD;AAAA,IAACA,MAAMK,WAAWL;AAAAA,IAAMH,MAAMQ,WAAWR;AAAAA,EAAAA,IACzCE;AACN,GAKaO,oBAERf,CAAa,aAAA;AACVc,QAAAA,aAAaf,cAAcC,QAAQ;AAEzC,SAAOc,cAAchB,MAAAA,wBAAwBgB,WAAWL,IAAI,IACxD;AAAA,IAACA,MAAMK,WAAWL;AAAAA,IAAMH,MAAMQ,WAAWR;AAAAA,EAAAA,IACzCE;AACN,GAKaQ,sBAERhB,CAAa,aAAA;AACVc,QAAAA,aAAaf,cAAcC,QAAQ;AAEzC,SAAOc,cAAc,CAAChB,MAAAA,wBAAwBgB,WAAWL,IAAI,IACzD;AAAA,IAACA,MAAMK,WAAWL;AAAAA,IAAMH,MAAMQ,WAAWR;AAAAA,EAAAA,IACzCE;AACN,GAKaS,gBAMRjB,CAAa,aAAA;AACVc,QAAAA,aAAaC,kBAAkBf,QAAQ;AAE7C,MAAI,CAACc;AACH;AAGF,QAAMb,MAAMD,SAASE,QAAQC,aACzBC,MAAAA,aAAaJ,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACnDN,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OAE3CC,QAEEC,OAAOR,MACTa,WAAWL,KAAKS,SAASP,KAAMQ,CAAAA,SAASA,KAAKZ,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MACX;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC,GAAGQ,WAAWR,MAAM,YAAY;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IACzDO;AACN,GAKaY,eAGRpB,CAAa,aAAA;AACVqB,QAAAA,aAAaJ,cAAcjB,QAAQ;AAEzC,SAAOqB,cAAcC,MAAAA,mBAAmBD,WAAWZ,IAAI,IACnD;AAAA,IAACA,MAAMY,WAAWZ;AAAAA,IAAMH,MAAMe,WAAWf;AAAAA,EAAAA,IACzCE;AACN,GAKae,gBAERvB,CAAa,aAAA;AAChB,QAAMS,OAAOT,SAASE,QAAQQ,MAAM,CAAC;AAErC,SAAOD,OAAO;AAAA,IAACA;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAME,KAAKF;AAAAA,IAAK,CAAA;AAAA,EAAA,IAAKC;AACpD,GAKagB,eAERxB,CAAa,aAAA;AAChB,QAAMS,OAAOT,SAASE,QAAQQ,MAAMV,SAASE,QAAQQ,MAAMe,SAAS,CAAC,IACjEzB,SAASE,QAAQQ,MAAMV,SAASE,QAAQQ,MAAMe,SAAS,CAAC,IACxDjB;AAEJ,SAAOC,OAAO;AAAA,IAACA;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAME,KAAKF;AAAAA,IAAK,CAAA;AAAA,EAAA,IAAKC;AACpD,GAKakB,oBAER1B,CAAa,aAAA;AACZ,MAAA,CAACA,SAASE,QAAQC;AACpB,WAAO,CAAE;AAGX,QAAMwB,iBACJ,CAAA,GACIC,WAAW5B,SAASE,QAAQC,UAAU0B,WACxCzB,MAAaJ,aAAAA,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACnDN,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OACzCC,SACFJ,MAAAA,aAAaJ,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,CAAC,IACpDN,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,EAAEC,OAC1CC,QACAuB,SAAS/B,SAASE,QAAQC,UAAU0B,WACtCzB,MAAAA,aAAaJ,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,CAAC,IACpDN,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,EAAEC,OAC1CC,SACFJ,mBAAaJ,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACnDN,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OACzCC;AAEF,MAAA,CAACoB,YAAY,CAACG;AACTJ,WAAAA;AAGElC,aAAAA,SAASO,SAASE,QAAQQ,OAAO;AACtCjB,QAAAA,MAAMc,SAASqB,UAAU;AAG3B,UAFAD,eAAeK,KAAK;AAAA,QAACvB,MAAMhB;AAAAA,QAAOa,MAAM,CAAC;AAAA,UAACC,MAAMd,MAAMc;AAAAA,QAAK,CAAA;AAAA,MAAA,CAAE,GAEzDqB,aAAaG;AACf;AAEF;AAAA,IAAA;AAGEtC,QAAAA,MAAMc,SAASwB,QAAQ;AACzBJ,qBAAeK,KAAK;AAAA,QAACvB,MAAMhB;AAAAA,QAAOa,MAAM,CAAC;AAAA,UAACC,MAAMd,MAAMc;AAAAA,QAAK,CAAA;AAAA,MAAA,CAAE;AAC7D;AAAA,IAAA;AAGEoB,mBAAeF,SAAS,KAC1BE,eAAeK,KAAK;AAAA,MAACvB,MAAMhB;AAAAA,MAAOa,MAAM,CAAC;AAAA,QAACC,MAAMd,MAAMc;AAAAA,MAAK,CAAA;AAAA,IAAA,CAAE;AAAA,EAAA;AAI1DoB,SAAAA;AACT,GAKaM,yBAMRjC,CAAa,aAAA;AACZ,MAAA,CAACA,SAASE,QAAQC;AACpB;AAGIF,QAAAA,MAAMD,SAASE,QAAQC,UAAU0B,WACnCzB,MAAaJ,aAAAA,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACnDN,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OACzCC,SACFJ,MAAAA,aAAaJ,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,CAAC,IACpDN,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,EAAEC,OAC1CC,QAEAC,OAAOR,MACTD,SAASE,QAAQQ,MAAMC,KAAMlB,CAAUA,UAAAA,MAAMc,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MAAM;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAAKO;AACrD,GAKa0B,uBAMRlC,CAAa,aAAA;AACZ,MAAA,CAACA,SAASE,QAAQC;AACpB;AAGIF,QAAAA,MAAMD,SAASE,QAAQC,UAAU0B,WACnCzB,MAAaJ,aAAAA,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,CAAC,IACpDN,SAASE,QAAQC,UAAU2B,OAAOxB,KAAK,CAAC,EAAEC,OAC1CC,SACFJ,MAAAA,aAAaJ,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACnDN,SAASE,QAAQC,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OACzCC,QAEAC,OAAOR,MACTD,SAASE,QAAQQ,MAAMC,KAAMlB,CAAUA,UAAAA,MAAMc,SAASN,GAAG,IACzDO;AAEJ,SAAOC,QAAQR,MAAM;AAAA,IAACQ;AAAAA,IAAMH,MAAM,CAAC;AAAA,MAACC,MAAMN;AAAAA,IAAI,CAAA;AAAA,EAAA,IAAKO;AACrD,GAKa2B,mBAERnC,CAAa,aAAA;AACZoC,MAAAA;AACEC,QAAAA,sBAAsBJ,uBAAuBjC,QAAQ;AAE3D,MAAI,CAACqC;AACH;AAGF,MAAIC,2BAA2B;AAEpB7C,aAAAA,SAASO,SAASE,QAAQQ,OAAO;AAC1C,QAAIjB,MAAMc,SAAS8B,oBAAoB5B,KAAKF,MAAM;AACrB,iCAAA;AAC3B;AAAA,IAAA;AAGc,oBAAA;AAAA,MAACE,MAAMhB;AAAAA,MAAOa,MAAM,CAAC;AAAA,QAACC,MAAMd,MAAMc;AAAAA,MAAK,CAAA;AAAA,IAAC;AAAA,EAAA;AAG1D,MAAI+B,4BAA4BF;AACvBA,WAAAA;AAIX,GAKaG,eAERvC,CAAa,aAAA;AACZwC,MAAAA;AACEC,QAAAA,oBAAoBP,qBAAqBlC,QAAQ;AAEvD,MAAI,CAACyC;AACH;AAGF,MAAIC,yBAAyB;AAElBjD,aAAAA,SAASO,SAASE,QAAQQ,OAAO;AAC1C,QAAIjB,MAAMc,SAASkC,kBAAkBhC,KAAKF,MAAM;AACrB,+BAAA;AACzB;AAAA,IAAA;AAGF,QAAImC,wBAAwB;AACd,kBAAA;AAAA,QAACjC,MAAMhB;AAAAA,QAAOa,MAAM,CAAC;AAAA,UAACC,MAAMd,MAAMc;AAAAA,QAAK,CAAA;AAAA,MAAC;AACpD;AAAA,IAAA;AAAA,EACF;AAGF,MAAImC,0BAA0BF;AACrBA,WAAAA;AAIX,GCxTaG,uBAAiD3C,CAAAA,aACvDA,SAASE,QAAQC,YAKpByC,KAAKC,UAAU7C,SAASE,QAAQC,UAAU2B,OAAOxB,IAAI,MACnDsC,KAAKC,UAAU7C,SAASE,QAAQC,UAAUE,MAAMC,IAAI,KACtDN,SAASE,QAAQC,WAAW2B,OAAOgB,WACjC9C,SAASE,QAAQC,WAAWE,MAAMyC,SAP7B,ICDEC,uBAER/C,CAAa,aAAA;AAChB,MAAKA,SAASE,QAAQC;AAIfH,WAAAA,SAASE,QAAQC,UAAU0B,WAC9B7B,SAASE,QAAQC,UAAU2B,SAC3B9B,SAASE,QAAQC,UAAUE;AACjC,GCVa2C,yBAERhD,CAAa,aAAA;AAChB,MAAKA,SAASE,QAAQC;AAIfH,WAAAA,SAASE,QAAQC,UAAU0B,WAC9B7B,SAASE,QAAQC,UAAUE,QAC3BL,SAASE,QAAQC,UAAU2B;AACjC,GCHamB,sBAMRjD,CAAa,aAAA;AACVkD,QAAAA,iBAAiBnC,kBAAkBf,QAAQ,GAC3CmD,oBAAoBJ,qBAAqB/C,QAAQ,GACjDoD,4BACJD,qBAAqB/C,mBAAa+C,kBAAkB7C,KAAK,CAAC,CAAC,IACvD6C,kBAAkB7C,KAAK,CAAC,EAAEC,OAC1BC;AAEF,MAAA,CAAC0C,kBAAkB,CAACE;AACtB;AAGF,MAAIC,qBAAqB,IACrBC;AAOOC,aAAAA,SAASL,eAAezC,KAAKS,UAAU;AAC5CqC,QAAAA,MAAMhD,SAAS6C,2BAA2B;AACvB,2BAAA;AACrB;AAAA,IAAA;AAGF,QAAI,CAACI,iBAAOxD,OAAAA,SAASE,SAASqD,KAAK,KAAKF,oBAAoB;AAC3C,qBAAA;AAAA,QACb5C,MAAM8C;AAAAA,QACNjD,MAAM,CAAC,GAAG4C,eAAe5C,MAAM,YAAY;AAAA,UAACC,MAAMgD,MAAMhD;AAAAA,QAAK,CAAA;AAAA,MAC/D;AACA;AAAA,IAAA;AAAA,EACF;AAGK+C,SAAAA;AACT,GC1CaG,0BAMRzD,CAAa,aAAA;AACVkD,QAAAA,iBAAiBnC,kBAAkBf,QAAQ,GAC3C0D,sBAAsBV,uBAAuBhD,QAAQ,GACrD2D,8BACJD,uBAAuBtD,mBAAasD,oBAAoBpD,KAAK,CAAC,CAAC,IAC3DoD,oBAAoBpD,KAAK,CAAC,EAAEC,OAC5BC;AAEF,MAAA,CAAC0C,kBAAkB,CAACS;AACtB;AAGEL,MAAAA;AAOOC,aAAAA,SAASL,eAAezC,KAAKS,UAAU;AAChD,QAAIqC,MAAMhD,SAASoD;AACjB;AAGGH,qBAAAA,OAAOxD,SAASE,SAASqD,KAAK,MACjCD,eAAe;AAAA,MACb7C,MAAM8C;AAAAA,MACNjD,MAAM,CAAC,GAAG4C,eAAe5C,MAAM,YAAY;AAAA,QAACC,MAAMgD,MAAMhD;AAAAA,MAAK,CAAA;AAAA,IAAA;AAAA,EAC/D;AAIG+C,SAAAA;AACT,GC7CaM,mBACX5D,cAEO6D,6BAAY;AAAA,EACjBC,QAAQ9D,SAASE,QAAQQ;AAAAA,EACzBP,WAAWH,SAASE,QAAQC;AAC9B,CAAC,GCNU4D,mBAA4C/D,CAAAA,aACjC4D,iBAAiB5D,QAAQ,EAE1BgE,OAAO,CAACC,MAAMxE,UAC5BK,MAAAA,wBAAwBL,KAAK,IAKhCwE,OACAxE,MAAMyB,SAAS8C,OAAO,CAACC,OAAMV,UACvBjC,MAAAA,mBAAmBiC,KAAK,IACnBU,QAAOV,MAAMU,OAGfA,OACN,EAAE,IAXEA,MAaR,EAAE,GCnBMC,sBAAgDlE,CAAAA,aACpD,CAAC2C,qBAAqB3C,QAAQ,GCe1BmE,wBACXnE,CACG,aAAA;AAKH,MAJI,CAACA,SAASE,QAAQC,aAIlB,CAACwC,qBAAqB3C,QAAQ;AACzB,WAAA;AAGHkD,QAAAA,iBAAiBnC,kBAAkBf,QAAQ,GAC3C0D,sBAAsBV,uBAAuBhD,QAAQ,GACrDoE,uBAAuBV,sBACzBW,iDAAgC;AAAA,IAC9B3D,OAAOV,SAASE,QAAQQ;AAAAA,IACxB4D,gBAAgBZ;AAAAA,EACjB,CAAA,IACDlD;AAEJ,MAAI,CAAC0C,kBAAkB,CAACQ,uBAAuB,CAACU;AACvC,WAAA;AAGHG,QAAAA,uBAAuBd,wBAAwBzD,QAAQ,GACvDwE,kBAAkBC,iBAAAA,mBAAmBvB,cAAc,GAanDwB,qBAZaX,iBAAiB;AAAA,IAElC7D,SAAS;AAAA,MACP,GAAGF,SAASE;AAAAA,MACZC,WAAW;AAAA,QACT2B,QAAQyC,uBACJ;AAAA,UAACjE,MAAMiE,qBAAqBjE;AAAAA,UAAMwC,QAAQ;AAAA,QAAA,IAC1C0B;AAAAA,QACJnE,OAAOqD;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD,EACqCiB,MAAM,KAAK,EAAEC,GAAG,EAAE,GAElDC,mBAAmB5B,oBAAoBjD,QAAQ,GAC/C8E,gBAAgBC,iBAAAA,iBAAiB7B,cAAc,GAa/C8B,oBAZYjB,iBAAiB;AAAA,IAEjC7D,SAAS;AAAA,MACP,GAAGF,SAASE;AAAAA,MACZC,WAAW;AAAA,QACT2B,QAAQ4B;AAAAA,QACRrD,OAAOwE,mBACH;AAAA,UAACvE,MAAMuE,iBAAiBvE;AAAAA,UAAMwC,QAAQ;AAAA,QAAA,IACtCgC;AAAAA,MAAAA;AAAAA,IACN;AAAA,EAEH,CAAA,EACmCH,MAAM,KAAK,EAAEC,GAAG,CAAC;AAErD,OACGF,uBAAuBlE,UAAakE,uBAAuB,QAC3DM,sBAAsBxE,UAAawE,sBAAsB;AAEnD,WAAA;AAGT,QAAMC,uBAAoCP,qBACtC;AAAA,IACE,GAAGN;AAAAA,IACHtB,QAAQsB,qBAAqBtB,SAAS4B,mBAAmBjD;AAAAA,EAAAA,IAE3D2C,sBACEc,qBAAkCF,oBACpC;AAAA,IACE,GAAGZ;AAAAA,IACHtB,QAAQsB,qBAAqBtB,SAASkC,kBAAkBvD;AAAAA,EAAAA,IAE1D2C,sBAEEe,+BAA+BC,iDAAgC;AAAA,IACnE1E,OAAOV,SAASE,QAAQQ;AAAAA,IACxB2E,aAAaJ;AAAAA,IACbK,WAAW;AAAA,EAAA,CACZ,GACKC,6BAA6BH,iDAAgC;AAAA,IACjE1E,OAAOV,SAASE,QAAQQ;AAAAA,IACxB2E,aAAaH;AAAAA,IACbI,WAAW;AAAA,EAAA,CACZ;AAEG,MAAA,CAACH,gCAAgC,CAACI;AAC7B,WAAA;AAGT,QAAMC,qBAAqB;AAAA,IACzB1D,QAAQqD;AAAAA,IACR9E,OAAOkF;AAAAA,EACT;AAEA,SAAOrB,oBAAoB;AAAA,IAEzBhE,SAAS;AAAA,MACP,GAAGF,SAASE;AAAAA,MACZC,WAAWqF;AAAAA,IAAAA;AAAAA,EACb,CACD,IACGA,qBACA;AACN;ACvHO,SAASC,kBAAkBhG,OAGN;AAC1B,SAAQO,CAAa,aAAA;AACnB,QAAI,CAACA,SAASE,QAAQC,aAAa,CAACwC,qBAAqB3C,QAAQ;AACxD,aAAA;AAGH8E,UAAAA,gBAAgBY,iBAAMX,iBAAiBtF,KAAK;AAElD,WAAOiG,iBAAAA,uBACL1F,SAASE,QAAQC,UAAUE,OAC3ByE,aACF;AAAA,EACF;AACF;AChBO,SAASa,oBAAoBlG,OAGR;AAC1B,SAAQO,CAAa,aAAA;AACnB,QAAI,CAACA,SAASE,QAAQC,aAAa,CAACwC,qBAAqB3C,QAAQ;AACxD,aAAA;AAGHwE,UAAAA,kBAAkBkB,iBAAMjB,mBAAmBhF,KAAK;AAEtD,WAAOiG,iBAAAA,uBACL1F,SAASE,QAAQC,UAAUE,OAC3BmE,eACF;AAAA,EACF;AACF;AChBO,SAASoB,sBACdC,OACyB;AACzB,SAAQ7F,CAAa,aAAA;AACf,QAAA,CAACA,SAASE,QAAQC;AACb,aAAA;AAGT,UAAMA,YAAYH,SAASE,QAAQC,UAAU0B,WACzCiE,iBAAAA,iBAAiB9F,SAASE,QAAQC,SAAS,IAC3CH,SAASE,QAAQC,WAEf4F,gBAAgB3F,MAAAA,aAAayF,MAAMvF,KAAK,CAAC,CAAC,IAC5CuF,MAAMvF,KAAK,CAAC,EAAEC,OACdC,QACEwF,gBAAgB5F,MAAAA,aAAayF,MAAMvF,KAAK,CAAC,CAAC,IAC5CuF,MAAMvF,KAAK,CAAC,EAAEC,OACdC,QAEEyF,cAAc7F,MAAaD,aAAAA,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACpDH,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OACxBC,QACE0F,cAAc9F,MAAAA,aAAaD,UAAUE,MAAMC,KAAK,CAAC,CAAC,IACpDH,UAAUE,MAAMC,KAAK,CAAC,EAAEC,OACxBC;AAEA,QAAA,CAACuF,iBAAiB,CAACE;AACd,aAAA;AAGT,QAAIE,QAAQ;AAED1G,eAAAA,SAASO,SAASE,QAAQQ,OAAO;AACtCjB,UAAAA,MAAMc,SAAS0F,aAAa;AAC1BxG,YAAAA,MAAMc,SAASwF,eAAe;AACxB,kBAAA;AACR;AAAA,QAAA;AASF,YAJI,CAACjG,MAAAA,wBAAwBL,KAAK,KAI9B,CAACuG,iBAAiB,CAACE;AACrB;AAGS3C,mBAAAA,SAAS9D,MAAMyB,UAAU;AAC9BqC,cAAAA,MAAMhD,SAAS2F,aAAa;AAC1B3C,gBAAAA,MAAMhD,SAASyF,eAAe;AACxB,sBAAA;AACR;AAAA,YAAA;AAKMH,oBAAAA,MAAM/C,SAAS3C,UAAUE,MAAMyC;AACvC;AAAA,UAAA;AAGF,cAAIS,MAAMhD,SAASyF;AACjB;AAAA,QAAA;AAAA,MAEJ;AAGF,UAAIvG,MAAMc,SAASwF;AACjB;AAAA,IAAA;AAIGI,WAAAA;AAAAA,EACT;AACF;AC3EO,SAASC,uBACdP,OACyB;AACzB,SAAQ7F,CAAa,aAAA;AACf,QAAA,CAACA,SAASE,QAAQC;AACb,aAAA;AAGT,UAAMA,YAAYH,SAASE,QAAQC,UAAU0B,WACzCiE,iBAAAA,iBAAiB9F,SAASE,QAAQC,SAAS,IAC3CH,SAASE,QAAQC,WAEf4F,gBAAgB3F,MAAAA,aAAayF,MAAMvF,KAAK,CAAC,CAAC,IAC5CuF,MAAMvF,KAAK,CAAC,EAAEC,OACdC,QACEwF,gBAAgB5F,MAAAA,aAAayF,MAAMvF,KAAK,CAAC,CAAC,IAC5CuF,MAAMvF,KAAK,CAAC,EAAEC,OACdC,QAEE6F,gBAAgBjG,MAAaD,aAAAA,UAAU2B,OAAOxB,KAAK,CAAC,CAAC,IACvDH,UAAU2B,OAAOxB,KAAK,CAAC,EAAEC,OACzBC,QACE8F,gBAAgBlG,MAAAA,aAAaD,UAAU2B,OAAOxB,KAAK,CAAC,CAAC,IACvDH,UAAU2B,OAAOxB,KAAK,CAAC,EAAEC,OACzBC;AAEA,QAAA,CAACuF,iBAAiB,CAACM;AACd,aAAA;AAGT,QAAIE,SAAS;AAEF9G,eAAAA,SAASO,SAASE,QAAQQ,OAAO;AACtCjB,UAAAA,MAAMc,SAASwF,eAAe;AAC5BtG,YAAAA,MAAMc,SAAS8F,eAAe;AACvB,mBAAA;AACT;AAAA,QAAA;AASF,YAJI,CAACvG,MAAAA,wBAAwBL,KAAK,KAI9B,CAACuG,iBAAiB,CAACM;AACrB;AAGS/C,mBAAAA,SAAS9D,MAAMyB,UAAU;AAC9BqC,cAAAA,MAAMhD,SAASyF,eAAe;AAC5BzC,gBAAAA,MAAMhD,SAAS+F,eAAe;AACvB,uBAAA;AACT;AAAA,YAAA;AAKOT,qBAAAA,MAAM/C,SAAS3C,UAAU2B,OAAOgB;AACzC;AAAA,UAAA;AAGF,cAAIS,MAAMhD,SAAS+F;AACjB;AAAA,QAAA;AAAA,MAEJ;AAGF,UAAI7G,MAAMc,SAAS8F;AACjB;AAAA,IAAA;AAIGE,WAAAA;AAAAA,EACT;AACF;ACxEO,SAASC,uBACdrG,WACyB;AACzB,SAAQH,CAAa,aAAA;AACnB,QAAI,CAACG,aAAa,CAACH,SAASE,QAAQC;AAC3B,aAAA;AAGT,UAAMuD,sBAAsBV,uBAAuB;AAAA,MAEjD9C,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC;AAAAA,MAAAA;AAAAA,IACF,CACD,GACKgD,oBAAoBJ,qBAAqB;AAAA,MAE7C7C,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC;AAAAA,MAAAA;AAAAA,IACF,CACD,GAEKsG,8BAA8BzD,uBAAuBhD,QAAQ,GAC7D0G,4BAA4B3D,qBAAqB/C,QAAQ;AAE/D,QACE,CAAC0D,uBACD,CAACP,qBACD,CAACsD,+BACD,CAACC;AAEM,aAAA;AAGHC,UAAAA,4BACJP,uBAAuB1C,mBAAmB,EAAE1D,QAAQ,GAChD4G,2BACJhB,sBAAsBlC,mBAAmB,EAAE1D,QAAQ,GAC/C6G,0BACJT,uBAAuBjD,iBAAiB,EAAEnD,QAAQ,GAC9C8G,yBACJlB,sBAAsBzC,iBAAiB,EAAEnD,QAAQ,GAE7C+G,qCAAqCX,uBACzCK,2BACF,EAAE;AAAA,MACA,GAAGzG;AAAAA,MACHE,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC,WAAW;AAAA,UACT2B,QAAQ4B;AAAAA,UACRrD,OAAOqD;AAAAA,QAAAA;AAAAA,MACT;AAAA,IAEH,CAAA,GACKsD,oCAAoCpB,sBACxCa,2BACF,EAAE;AAAA,MACA,GAAGzG;AAAAA,MACHE,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC,WAAW;AAAA,UACT2B,QAAQ4B;AAAAA,UACRrD,OAAOqD;AAAAA,QAAAA;AAAAA,MACT;AAAA,IAEH,CAAA,GAEKuD,iCAAiCb,uBACrCM,yBACF,EAAE;AAAA,MACA,GAAG1G;AAAAA,MACHE,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC,WAAW;AAAA,UACT2B,QAAQqB;AAAAA,UACR9C,OAAO8C;AAAAA,QAAAA;AAAAA,MACT;AAAA,IAEH,CAAA,GACK+D,gCAAgCtB,sBACpCc,yBACF,EAAE;AAAA,MACA,GAAG1G;AAAAA,MACHE,SAAS;AAAA,QACP,GAAGF,SAASE;AAAAA,QACZC,WAAW;AAAA,UACT2B,QAAQqB;AAAAA,UACR9C,OAAO8C;AAAAA,QAAAA;AAAAA,MACT;AAAA,IACF,CACD,GAEKgE,oCAAoCC,iBACxCjE,uBAAAA,mBACAsD,2BACF,GACMY,oCAAoCD,iBAAAA,uBACxC1D,qBACAgD,yBACF;AAMA,WAJIG,2BAA2B,CAACM,qCAI5BP,4BAA4B,CAACS,oCACxB,KAIP,CAACN,sCACDC,qCACA,CAACC,kCACDC,gCAEO,CAACC,oCAIRJ,sCACA,CAACC,qCACDC,kCACA,CAACC,gCAEM,CAACG,oCAIR,CAACT,4BACD,CAACD,6BACD,CAACG,0BACD,CAACD;AAAAA,EAML;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"selector.is-overlapping-selection.cjs","sources":["../../src/selectors/selector.is-selection-collapsed.ts","../../src/behavior-actions/behavior.guards.ts","../../src/selectors/selectors.ts","../../src/selectors/selector.get-selection-end-point.ts","../../src/selectors/selector.get-selection-start-point.ts","../../src/selectors/selector.get-next-inline-object.ts","../../src/selectors/selector.get-previous-inline-object.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection-text.ts","../../src/selectors/selector.is-selection-expanded.ts","../../src/selectors/selector.get-caret-word-selection.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"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const isSelectionCollapsed: EditorSelector<boolean> = (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n return (\n JSON.stringify(snapshot.context.selection.anchor.path) ===\n JSON.stringify(snapshot.context.selection.focus.path) &&\n snapshot.context.selection?.anchor.offset ===\n snapshot.context.selection?.focus.offset\n )\n}\n","import {\n isPortableTextListBlock,\n isPortableTextTextBlock,\n type PortableTextListBlock,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\n\n/**\n * @alpha\n */\nexport type BehaviorGuards = ReturnType<typeof createGuards>\n\nexport function createGuards({schema}: {schema: EditorSchema}) {\n function isListBlock(block: unknown): block is PortableTextListBlock {\n return isPortableTextListBlock(block) && block._type === schema.block.name\n }\n\n function isTextBlock(block: unknown): block is PortableTextTextBlock {\n return isPortableTextTextBlock(block) && block._type === schema.block.name\n }\n\n return {isListBlock, isTextBlock}\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getFocusBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusListBlock: EditorSelector<\n {node: PortableTextListBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const guards = createGuards(snapshot.context)\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && guards.isListBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusBlockObject: EditorSelector<\n {node: PortableTextObject; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const focusBlock = getFocusBlock(snapshot)\n\n return focusBlock && !isPortableTextTextBlock(focusBlock.node)\n ? {node: focusBlock.node, path: focusBlock.path}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusBlock = getFocusTextBlock(snapshot)\n\n if (!focusBlock) {\n return undefined\n }\n\n const key = snapshot.context.selection\n ? isKeySegment(snapshot.context.selection.focus.path[2])\n ? snapshot.context.selection.focus.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? focusBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...focusBlock.path, 'children', {_key: key}]}\n : undefined\n}\n\n/**\n * @public\n */\nexport const getFocusSpan: EditorSelector<\n | {node: PortableTextSpan; 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\n/**\n * @public\n */\nexport const getFirstBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n const node = snapshot.context.value[0]\n\n return node ? {node, path: [{_key: node._key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getLastBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | 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\n/**\n * @public\n */\nexport const getSelectedBlocks: EditorSelector<\n Array<{node: PortableTextBlock; path: [KeyedSegment]}>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks: Array<{node: PortableTextBlock; path: [KeyedSegment]}> =\n []\n const startKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\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\n/**\n * @public\n */\nexport const getSelectionStartBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getSelectionEndBlock: EditorSelector<\n | {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const key = snapshot.context.selection.backward\n ? isKeySegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeySegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n const node = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n\n/**\n * @public\n */\nexport const getPreviousBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | 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\n/**\n * @public\n */\nexport const getNextBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = (snapshot) => {\n let nextBlock: {node: PortableTextBlock; path: [KeyedSegment]} | 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 {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 {EditorSelectionPoint} from '..'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectionStartPoint: 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.focus\n : snapshot.context.selection.anchor\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 {\n isKeySegment,\n type KeyedSegment,\n type PortableTextObject,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isSpan} from '../utils'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getPreviousInlineObject: EditorSelector<\n | {\n node: PortableTextObject\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = (snapshot) => {\n const focusTextBlock = getFocusTextBlock(snapshot)\n const selectionStartPoint = getSelectionStartPoint(snapshot)\n const selectionStartPointChildKey =\n selectionStartPoint && isKeySegment(selectionStartPoint.path[2])\n ? selectionStartPoint.path[2]._key\n : undefined\n\n if (!focusTextBlock || !selectionStartPointChildKey) {\n return undefined\n }\n\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 === selectionStartPointChildKey) {\n break\n }\n\n if (!isSpan(snapshot.context, child)) {\n inlineObject = {\n node: child,\n path: [...focusTextBlock.path, 'children', {_key: child._key}],\n }\n }\n }\n\n return inlineObject\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = (\n snapshot,\n) => {\n return sliceBlocks({\n blocks: snapshot.context.value,\n selection: snapshot.context.selection,\n })\n}\n","import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSlice} from './selector.get-selected-slice'\n\n/**\n * @public\n */\nexport const getSelectionText: EditorSelector<string> = (snapshot) => {\n const selectedSlice = getSelectedSlice(snapshot)\n\n return selectedSlice.reduce((text, block) => {\n if (!isPortableTextTextBlock(block)) {\n return text\n }\n\n return (\n text +\n block.children.reduce((text, child) => {\n if (isPortableTextSpan(child)) {\n return text + child.text\n }\n\n return text\n }, '')\n )\n }, '')\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = (snapshot) => {\n return !isSelectionCollapsed(snapshot)\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 value: snapshot.context.value,\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(focusTextBlock)\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(focusTextBlock)\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 value: snapshot.context.value,\n blockOffset: caretWordStartOffset,\n direction: 'backward',\n })\n const caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({\n value: snapshot.context.value,\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 {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(block)\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(block)\n\n return utils.isEqualSelectionPoints(\n snapshot.context.selection.focus,\n blockStartPoint,\n )\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\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 selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const endBlockKey = isKeySegment(selection.focus.path[0])\n ? selection.focus.path[0]._key\n : undefined\n const endChildKey = isKeySegment(selection.focus.path[2])\n ? selection.focus.path[2]._key\n : undefined\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 (!isPortableTextTextBlock(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 > selection.focus.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 {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\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 selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const startBlockKey = isKeySegment(selection.anchor.path[0])\n ? selection.anchor.path[0]._key\n : undefined\n const startChildKey = isKeySegment(selection.anchor.path[2])\n ? selection.anchor.path[2]._key\n : undefined\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 (!isPortableTextTextBlock(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 < selection.anchor.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"],"names":["isSelectionCollapsed","snapshot","context","selection","JSON","stringify","anchor","path","focus","offset","createGuards","schema","isListBlock","block","isPortableTextListBlock","_type","name","isTextBlock","isPortableTextTextBlock","getFocusBlock","key","isKeySegment","_key","undefined","node","value","find","getFocusListBlock","guards","focusBlock","getFocusTextBlock","getFocusBlockObject","getFocusChild","children","span","getFocusSpan","focusChild","isPortableTextSpan","getFirstBlock","getLastBlock","length","getSelectedBlocks","selectedBlocks","startKey","backward","endKey","push","getSelectionStartBlock","getSelectionEndBlock","getPreviousBlock","previousBlock","selectionStartBlock","foundSelectionStartBlock","getNextBlock","nextBlock","selectionEndBlock","foundSelectionEndBlock","getSelectionEndPoint","getSelectionStartPoint","getNextInlineObject","focusTextBlock","selectionEndPoint","selectionEndPointChildKey","endPointChildFound","inlineObject","child","isSpan","getPreviousInlineObject","selectionStartPoint","selectionStartPointChildKey","getSelectedSlice","sliceBlocks","blocks","getSelectionText","reduce","text","isSelectionExpanded","getCaretWordSelection","selectionStartOffset","spanSelectionPointToBlockOffset","selectionPoint","previousInlineObject","blockStartPoint","getBlockStartPoint","textDirectlyBefore","split","at","nextInlineObject","blockEndPoint","getBlockEndPoint","textDirectlyAfter","caretWordStartOffset","caretWordEndOffset","caretWordStartSelectionPoint","blockOffsetToSpanSelectionPoint","blockOffset","direction","caretWordEndSelectionPoint","caretWordSelection","isAtTheEndOfBlock","utils","isAtTheStartOfBlock","isPointAfterSelection","point","reverseSelection","pointBlockKey","pointChildKey","endBlockKey","endChildKey","after","isPointBeforeSelection","startBlockKey","startChildKey","before","isOverlappingSelection","originalSelectionStartPoint","originalSelectionEndPoint","startPointBeforeSelection","startPointAfterSelection","endPointBeforeSelection","endPointAfterSelection","originalStartPointBeforeStartPoint","originalStartPointAfterStartPoint","originalEndPointBeforeEndPoint","originalEndPointAfterEndPoint","endPointEqualToOriginalStartPoint","isEqualSelectionPoints","startPointEqualToOriginalEndPoint"],"mappings":"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"}
@@ -1,14 +1,6 @@
1
1
  "use strict";
2
- var util_sliceBlocks = require("./util.slice-blocks.cjs"), selector_isOverlappingSelection = require("./selector.is-overlapping-selection.cjs"), types = require("@sanity/types");
3
- const isSelectingEntireBlocks = (snapshot) => {
4
- if (!snapshot.context.selection)
5
- return !1;
6
- 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_isOverlappingSelection.getSelectionStartBlock(snapshot), endBlock = selector_isOverlappingSelection.getSelectionEndBlock(snapshot);
7
- if (!startBlock || !endBlock)
8
- return !1;
9
- const startBlockStartPoint = util_sliceBlocks.getBlockStartPoint(startBlock), endBlockEndPoint = util_sliceBlocks.getBlockEndPoint(endBlock);
10
- return util_sliceBlocks.isEqualSelectionPoints(startBlockStartPoint, startPoint) && util_sliceBlocks.isEqualSelectionPoints(endBlockEndPoint, endPoint);
11
- }, getSelectedSpans = (snapshot) => {
2
+ var types = require("@sanity/types"), selector_isOverlappingSelection = require("./selector.is-overlapping-selection.cjs"), parseBlocks = require("./parse-blocks.cjs"), util_sliceBlocks = require("./util.slice-blocks.cjs");
3
+ const getSelectedSpans = (snapshot) => {
12
4
  if (!snapshot.context.selection)
13
5
  return [];
14
6
  const selectedSpans = [], 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, startBlockKey = types.isKeySegment(startPoint.path[0]) ? startPoint.path[0]._key : void 0, endBlockKey = types.isKeySegment(endPoint.path[0]) ? endPoint.path[0]._key : void 0;
@@ -125,6 +117,40 @@ const isSelectingEntireBlocks = (snapshot) => {
125
117
  const firstStyle = firstTextBlock.style;
126
118
  if (firstStyle && selectedTextBlocks.every((block) => block.style === firstStyle))
127
119
  return firstStyle;
120
+ }, getSelectedTextBlocks = (snapshot) => {
121
+ if (!snapshot.context.selection)
122
+ return [];
123
+ const selectedTextBlocks = [], startKey = snapshot.context.selection.backward ? util_sliceBlocks.isKeyedSegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0 : util_sliceBlocks.isKeyedSegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0, endKey = snapshot.context.selection.backward ? util_sliceBlocks.isKeyedSegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0 : util_sliceBlocks.isKeyedSegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0;
124
+ if (!startKey || !endKey)
125
+ return selectedTextBlocks;
126
+ for (const block of snapshot.context.value) {
127
+ if (block._key === startKey) {
128
+ if (parseBlocks.isTextBlock(snapshot.context.schema, block) && selectedTextBlocks.push({
129
+ node: block,
130
+ path: [{
131
+ _key: block._key
132
+ }]
133
+ }), startKey === endKey)
134
+ break;
135
+ continue;
136
+ }
137
+ if (block._key === endKey) {
138
+ parseBlocks.isTextBlock(snapshot.context.schema, block) && selectedTextBlocks.push({
139
+ node: block,
140
+ path: [{
141
+ _key: block._key
142
+ }]
143
+ });
144
+ break;
145
+ }
146
+ selectedTextBlocks.length > 0 && parseBlocks.isTextBlock(snapshot.context.schema, block) && selectedTextBlocks.push({
147
+ node: block,
148
+ path: [{
149
+ _key: block._key
150
+ }]
151
+ });
152
+ }
153
+ return selectedTextBlocks;
128
154
  }, getTrimmedSelection = (snapshot) => {
129
155
  if (!snapshot.context.selection)
130
156
  return snapshot.context.selection;
@@ -241,14 +267,24 @@ function isActiveListItem(listItem) {
241
267
  function isActiveStyle(style) {
242
268
  return (snapshot) => getActiveStyle(snapshot) === style;
243
269
  }
270
+ const isSelectingEntireBlocks = (snapshot) => {
271
+ if (!snapshot.context.selection)
272
+ return !1;
273
+ 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_isOverlappingSelection.getSelectionStartBlock(snapshot), endBlock = selector_isOverlappingSelection.getSelectionEndBlock(snapshot);
274
+ if (!startBlock || !endBlock)
275
+ return !1;
276
+ const startBlockStartPoint = util_sliceBlocks.getBlockStartPoint(startBlock), endBlockEndPoint = util_sliceBlocks.getBlockEndPoint(endBlock);
277
+ return util_sliceBlocks.isEqualSelectionPoints(startBlockStartPoint, startPoint) && util_sliceBlocks.isEqualSelectionPoints(endBlockEndPoint, endPoint);
278
+ };
244
279
  exports.getActiveAnnotations = getActiveAnnotations;
245
280
  exports.getActiveListItem = getActiveListItem;
246
281
  exports.getActiveStyle = getActiveStyle;
247
282
  exports.getSelectedSpans = getSelectedSpans;
283
+ exports.getSelectedTextBlocks = getSelectedTextBlocks;
248
284
  exports.getTrimmedSelection = getTrimmedSelection;
249
285
  exports.isActiveAnnotation = isActiveAnnotation;
250
286
  exports.isActiveDecorator = isActiveDecorator;
251
287
  exports.isActiveListItem = isActiveListItem;
252
288
  exports.isActiveStyle = isActiveStyle;
253
289
  exports.isSelectingEntireBlocks = isSelectingEntireBlocks;
254
- //# sourceMappingURL=selector.is-active-style.cjs.map
290
+ //# sourceMappingURL=selector.is-selecting-entire-blocks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selector.is-selecting-entire-blocks.cjs","sources":["../../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-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-selecting-entire-blocks.ts"],"sourcesContent":["import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextSpan,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\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 = 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 startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return selectedSpans\n }\n\n const startSpanKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endSpanKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\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 (!isPortableTextTextBlock(block)) {\n continue\n }\n\n if (block._key === startBlockKey) {\n for (const child of block.children) {\n if (!isPortableTextSpan(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 (!isPortableTextSpan(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 (!isPortableTextSpan(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 {isPortableTextTextBlock, type PortableTextObject} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\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 selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isPortableTextTextBlock(block.node) ? (block.node.markDefs ?? []) : [],\n )\n\n return selectionMarkDefs.filter((markDef) =>\n selectedSpans.some((span) => span.node.marks?.includes(markDef._key)),\n )\n}\n","import type {PortableTextListBlock} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\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 guards = createGuards(snapshot.context)\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter(guards.isTextBlock)\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 {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\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 guards = createGuards(snapshot.context)\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter(guards.isTextBlock)\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 type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport {isKeyedSegment} 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 const startKey = snapshot.context.selection.backward\n ? isKeyedSegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n : isKeyedSegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n const endKey = snapshot.context.selection.backward\n ? isKeyedSegment(snapshot.context.selection.anchor.path[0])\n ? snapshot.context.selection.anchor.path[0]._key\n : undefined\n : isKeyedSegment(snapshot.context.selection.focus.path[0])\n ? snapshot.context.selection.focus.path[0]._key\n : undefined\n\n if (!startKey || !endKey) {\n return selectedTextBlocks\n }\n\n for (const block of snapshot.context.value) {\n if (block._key === startKey) {\n if (isTextBlock(snapshot.context.schema, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n\n if (startKey === endKey) {\n break\n }\n continue\n }\n\n if (block._key === endKey) {\n if (isTextBlock(snapshot.context.schema, 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.schema, block)) {\n selectedTextBlocks.push({node: block, path: [{_key: block._key}]})\n }\n }\n }\n\n return selectedTextBlocks\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextSpan,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelection, EditorSelectionPoint} from '../types/editor'\nimport {isEmptyTextBlock, isKeyedSegment} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\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)\n const endPoint = getSelectionEndPoint(snapshot)\n\n if (!startPoint || !endPoint) {\n return snapshot.context.selection\n }\n\n const startBlockKey = isKeyedSegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : null\n const startChildKey = isKeyedSegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : null\n const endBlockKey = isKeyedSegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : null\n const endChildKey = isKeyedSegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : null\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 (isPortableTextTextBlock(block) && isEmptyTextBlock(block)) {\n continue\n }\n }\n\n if (!startBlockFound) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n if (block._key === endBlockKey && isEmptyTextBlock(block)) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (!isPortableTextSpan(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 isPortableTextSpan(child) && block.children.length === 1\n\n if (\n (isPortableTextSpan(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 (!isPortableTextSpan(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 isPortableTextSpan(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 (focusTextBlock && !isEmptyTextBlock(focusTextBlock.node)) {\n return null\n }\n }\n\n return trimmedSelection\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusSpan, getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport function isActiveAnnotation(\n annotation: string,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n const selectedSpans = isSelectionExpanded(snapshot)\n ? getSelectedSpans(snapshot)\n : focusSpan\n ? [focusSpan]\n : []\n\n if (selectedSpans.length === 0) {\n return false\n }\n\n if (\n selectedSpans.some(\n (span) => !span.node.marks || span.node.marks?.length === 0,\n )\n ) {\n return false\n }\n\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isPortableTextTextBlock(block.node) ? (block.node.markDefs ?? []) : [],\n )\n\n return selectedSpans.every((span) => {\n const spanMarkDefs =\n span.node.marks?.flatMap((mark) => {\n const markDef = selectionMarkDefs.find(\n (markDef) => markDef._key === mark,\n )\n\n return markDef ? [markDef._type] : []\n }) ?? []\n\n return spanMarkDefs.includes(annotation)\n })\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.context.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 {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(startBlock)\n const endBlockEndPoint = utils.getBlockEndPoint(endBlock)\n\n return (\n utils.isEqualSelectionPoints(startBlockStartPoint, startPoint) &&\n utils.isEqualSelectionPoints(endBlockEndPoint, endPoint)\n )\n}\n"],"names":["getSelectedSpans","snapshot","context","selection","selectedSpans","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","path","_key","undefined","endBlockKey","startSpanKey","endSpanKey","startBlockFound","block","value","isPortableTextTextBlock","child","children","isPortableTextSpan","offset","text","length","push","node","getActiveAnnotations","selectedBlocks","getSelectedBlocks","focusSpan","getFocusSpan","isSelectionCollapsed","flatMap","markDefs","filter","markDef","some","span","marks","includes","getActiveListItem","guards","createGuards","selectedTextBlocks","map","isTextBlock","firstTextBlock","at","firstListItem","listItem","every","getActiveStyle","firstStyle","style","getSelectedTextBlocks","startKey","isKeyedSegment","endKey","schema","getTrimmedSelection","getSelectionStartPoint","getSelectionEndPoint","startChildKey","endChildKey","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","isEmptyTextBlock","blockKey","lonelySpan","trimmedSelection","focusTextBlock","getFocusTextBlock","isActiveAnnotation","annotation","isSelectionExpanded","selectionMarkDefs","mark","find","_type","isActiveDecorator","decorator","activeDecorators","isActiveListItem","isActiveStyle","isSelectingEntireBlocks","startBlock","getSelectionStartBlock","endBlock","getSelectionEndBlock","startBlockStartPoint","utils","endBlockEndPoint","isEqualSelectionPoints"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
- var util_selectionPointToBlockOffset = require("./util.selection-point-to-block-offset.cjs");
2
+ var parseBlocks = require("./parse-blocks.cjs");
3
3
  function isTextBlock(context, block) {
4
- return util_selectionPointToBlockOffset.isTypedObject(block) && block._type === context.schema.block.name;
4
+ return parseBlocks.isTypedObject(block) && block._type === context.schema.block.name;
5
5
  }
6
6
  function mergeTextBlocks({
7
7
  context,
8
8
  targetBlock,
9
9
  incomingBlock
10
10
  }) {
11
- const parsedIncomingBlock = util_selectionPointToBlockOffset.parseBlock({
11
+ const parsedIncomingBlock = parseBlocks.parseBlock({
12
12
  context,
13
13
  block: incomingBlock,
14
14
  options: {
@@ -1 +1 @@
1
- {"version":3,"file":"util.merge-text-blocks.cjs","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","children","markDefs"],"mappings":";;AAOgBA,SAAAA,YACdC,SACAC,OACgC;AAChC,SAAOC,+CAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,iCAAAA,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHM,UAAU,CAAC,GAAGN,YAAYM,UAAU,GAAGJ,oBAAoBI,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIP,YAAYO,YAAY,CAAA,GAC5B,GAAIL,oBAAoBK,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;;;"}
1
+ {"version":3,"file":"util.merge-text-blocks.cjs","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","children","markDefs"],"mappings":";;AAOgBA,SAAAA,YACdC,SACAC,OACgC;AAChC,SAAOC,0BAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,YAAAA,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHM,UAAU,CAAC,GAAGN,YAAYM,UAAU,GAAGJ,oBAAoBI,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIP,YAAYO,YAAY,CAAA,GAC5B,GAAIL,oBAAoBK,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;;;"}