@portabletext/editor 1.23.0 → 1.25.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 (71) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +249 -62
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/{selector.is-selection-collapsed.cjs → selector.is-active-style.cjs} +158 -3
  4. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -0
  5. package/lib/_chunks-cjs/util.slice-blocks.cjs +23 -9
  6. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  7. package/lib/_chunks-es/behavior.core.js +225 -38
  8. package/lib/_chunks-es/behavior.core.js.map +1 -1
  9. package/lib/_chunks-es/{selector.is-selection-collapsed.js → selector.is-active-style.js} +159 -4
  10. package/lib/_chunks-es/selector.is-active-style.js.map +1 -0
  11. package/lib/_chunks-es/util.slice-blocks.js +23 -9
  12. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  13. package/lib/behaviors/index.cjs +27 -27
  14. package/lib/behaviors/index.cjs.map +1 -1
  15. package/lib/behaviors/index.d.cts +2830 -139
  16. package/lib/behaviors/index.d.ts +2830 -139
  17. package/lib/behaviors/index.js +1 -1
  18. package/lib/index.cjs +695 -526
  19. package/lib/index.cjs.map +1 -1
  20. package/lib/index.d.cts +8950 -246
  21. package/lib/index.d.ts +8950 -246
  22. package/lib/index.js +696 -525
  23. package/lib/index.js.map +1 -1
  24. package/lib/selectors/index.cjs +24 -171
  25. package/lib/selectors/index.cjs.map +1 -1
  26. package/lib/selectors/index.d.cts +73 -0
  27. package/lib/selectors/index.d.ts +73 -0
  28. package/lib/selectors/index.js +3 -151
  29. package/lib/selectors/index.js.map +1 -1
  30. package/package.json +11 -10
  31. package/src/behavior-actions/behavior.action.data-transfer-set.ts +7 -0
  32. package/src/behavior-actions/behavior.action.insert-blocks.ts +61 -0
  33. package/src/behavior-actions/behavior.actions.ts +159 -83
  34. package/src/behaviors/behavior.core.annotations.ts +29 -0
  35. package/src/behaviors/behavior.core.block-objects.ts +13 -13
  36. package/src/behaviors/behavior.core.decorators.ts +19 -0
  37. package/src/behaviors/behavior.core.deserialize.ts +46 -0
  38. package/src/behaviors/behavior.core.lists.ts +57 -23
  39. package/src/behaviors/behavior.core.serialize.ts +44 -0
  40. package/src/behaviors/behavior.core.style.ts +19 -0
  41. package/src/behaviors/behavior.core.ts +19 -0
  42. package/src/behaviors/behavior.types.ts +126 -89
  43. package/src/converters/converter.json.ts +53 -0
  44. package/src/converters/converter.portable-text.deserialize.test.ts +686 -0
  45. package/src/converters/converter.portable-text.ts +59 -0
  46. package/src/converters/converter.text-html.deserialize.test.ts +349 -0
  47. package/src/converters/converter.text-html.serialize.test.ts +233 -0
  48. package/src/converters/converter.text-html.ts +61 -0
  49. package/src/converters/converter.text-plain.test.ts +241 -0
  50. package/src/converters/converter.text-plain.ts +91 -0
  51. package/src/converters/converter.ts +65 -0
  52. package/src/converters/converters.ts +11 -0
  53. package/src/editor/Editable.tsx +3 -13
  54. package/src/editor/create-editor.ts +48 -6
  55. package/src/editor/editor-machine.ts +56 -2
  56. package/src/editor/editor-selector.ts +1 -0
  57. package/src/editor/editor-snapshot.ts +5 -0
  58. package/src/editor/plugins/create-with-event-listeners.ts +82 -106
  59. package/src/internal-utils/asserters.ts +9 -0
  60. package/src/internal-utils/mime-type.ts +1 -0
  61. package/src/internal-utils/parse-blocks.ts +136 -0
  62. package/src/internal-utils/test-key-generator.ts +9 -0
  63. package/src/selectors/selector.get-selected-spans.test.ts +1 -0
  64. package/src/selectors/selector.get-selection-text.test.ts +1 -0
  65. package/src/selectors/selector.is-active-decorator.test.ts +1 -0
  66. package/src/utils/util.slice-blocks.test.ts +87 -0
  67. package/src/utils/util.slice-blocks.ts +27 -10
  68. package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs.map +0 -1
  69. package/lib/_chunks-es/selector.is-selection-collapsed.js.map +0 -1
  70. package/src/editor/plugins/__tests__/createWithInsertData.test.tsx +0 -181
  71. package/src/editor/plugins/createWithInsertData.ts +0 -425
@@ -1,159 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var selector_isSelectionCollapsed = require("../_chunks-cjs/selector.is-selection-collapsed.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), types = require("@sanity/types"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs");
4
- const getActiveListItem = ({
5
- context
6
- }) => {
7
- if (!context.selection)
8
- return;
9
- const guards = selector_isSelectionCollapsed.createGuards(context), selectedTextBlocks = selector_isSelectionCollapsed.getSelectedBlocks({
10
- context
11
- }).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
12
- if (!firstTextBlock)
13
- return;
14
- const firstListItem = firstTextBlock.listItem;
15
- if (firstListItem && selectedTextBlocks.every((block) => block.listItem === firstListItem))
16
- return firstListItem;
17
- }, getActiveStyle = ({
18
- context
19
- }) => {
20
- if (!context.selection)
21
- return;
22
- const guards = selector_isSelectionCollapsed.createGuards(context), selectedTextBlocks = selector_isSelectionCollapsed.getSelectedBlocks({
23
- context
24
- }).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
25
- if (!firstTextBlock)
26
- return;
27
- const firstStyle = firstTextBlock.style;
28
- if (firstStyle && selectedTextBlocks.every((block) => block.style === firstStyle))
29
- return firstStyle;
30
- }, getSelectedSlice = ({
3
+ var selector_isActiveStyle = require("../_chunks-cjs/selector.is-active-style.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs"), types = require("@sanity/types"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs");
4
+ const getSelectedSlice = ({
31
5
  context
32
6
  }) => util_sliceBlocks.sliceBlocks({
33
7
  blocks: context.value,
34
8
  selection: context.selection
35
- }), getSelectedSpans = ({
36
- context
37
- }) => {
38
- if (!context.selection)
39
- return [];
40
- const selectedSpans = [], startPoint = context.selection.backward ? context.selection.focus : context.selection.anchor, endPoint = context.selection.backward ? context.selection.anchor : 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;
41
- if (!startBlockKey || !endBlockKey)
42
- return selectedSpans;
43
- const startSpanKey = types.isKeySegment(startPoint.path[2]) ? startPoint.path[2]._key : void 0, endSpanKey = types.isKeySegment(endPoint.path[2]) ? endPoint.path[2]._key : void 0;
44
- for (const block of context.value)
45
- if (types.isPortableTextTextBlock(block)) {
46
- if (block._key === startBlockKey) {
47
- for (const child of block.children)
48
- if (types.isPortableTextSpan(child)) {
49
- if (startSpanKey && child._key === startSpanKey) {
50
- if (selectedSpans.push({
51
- node: child,
52
- path: [{
53
- _key: block._key
54
- }, "children", {
55
- _key: child._key
56
- }]
57
- }), startSpanKey === endSpanKey)
58
- break;
59
- continue;
60
- }
61
- if (endSpanKey && child._key === endSpanKey) {
62
- selectedSpans.push({
63
- node: child,
64
- path: [{
65
- _key: block._key
66
- }, "children", {
67
- _key: child._key
68
- }]
69
- });
70
- break;
71
- }
72
- selectedSpans.length > 0 && selectedSpans.push({
73
- node: child,
74
- path: [{
75
- _key: block._key
76
- }, "children", {
77
- _key: child._key
78
- }]
79
- });
80
- }
81
- if (startBlockKey === endBlockKey)
82
- break;
83
- continue;
84
- }
85
- if (block._key === endBlockKey) {
86
- for (const child of block.children)
87
- if (types.isPortableTextSpan(child)) {
88
- if (endSpanKey && child._key === endSpanKey) {
89
- selectedSpans.push({
90
- node: child,
91
- path: [{
92
- _key: block._key
93
- }, "children", {
94
- _key: child._key
95
- }]
96
- });
97
- break;
98
- }
99
- selectedSpans.push({
100
- node: child,
101
- path: [{
102
- _key: block._key
103
- }, "children", {
104
- _key: child._key
105
- }]
106
- });
107
- }
108
- break;
109
- }
110
- if (selectedSpans.length > 0)
111
- for (const child of block.children)
112
- types.isPortableTextSpan(child) && selectedSpans.push({
113
- node: child,
114
- path: [{
115
- _key: block._key
116
- }, "children", {
117
- _key: child._key
118
- }]
119
- });
120
- }
121
- return selectedSpans;
122
- };
123
- function isActiveAnnotation(annotation) {
124
- return (snapshot) => {
125
- if (!snapshot.context.selection)
126
- return !1;
127
- const selectedBlocks = selector_isSelectionCollapsed.getSelectedBlocks(snapshot), selectedSpans = getSelectedSpans(snapshot);
128
- if (selectedSpans.length === 0 || selectedSpans.some((span) => !span.node.marks || span.node.marks?.length === 0))
129
- return !1;
130
- const selectionMarkDefs = selectedBlocks.flatMap((block) => types.isPortableTextTextBlock(block.node) ? block.node.markDefs ?? [] : []);
131
- return selectedSpans.every((span) => (span.node.marks?.flatMap((mark) => {
132
- const markDef = selectionMarkDefs.find((markDef2) => markDef2._key === mark);
133
- return markDef ? [markDef._type] : [];
134
- }) ?? []).includes(annotation));
135
- };
136
- }
137
- const isSelectionExpanded = ({
138
- context
139
- }) => !selector_isSelectionCollapsed.isSelectionCollapsed({
140
- context
141
9
  });
142
- function isActiveDecorator(decorator) {
143
- return (snapshot) => {
144
- if (isSelectionExpanded(snapshot)) {
145
- const selectedSpans = getSelectedSpans(snapshot);
146
- return selectedSpans.length > 0 && selectedSpans.every((span) => span.node.marks?.includes(decorator));
147
- }
148
- return snapshot.context.activeDecorators.includes(decorator);
149
- };
150
- }
151
- function isActiveListItem(listItem) {
152
- return (snapshot) => getActiveListItem(snapshot) === listItem;
153
- }
154
- function isActiveStyle(style) {
155
- return (snapshot) => getActiveStyle(snapshot) === style;
156
- }
157
10
  function isPointAfterSelection(point) {
158
11
  return (snapshot) => {
159
12
  if (!snapshot.context.selection)
@@ -224,31 +77,31 @@ function isPointBeforeSelection(point) {
224
77
  return before;
225
78
  };
226
79
  }
227
- exports.getFirstBlock = selector_isSelectionCollapsed.getFirstBlock;
228
- exports.getFocusBlock = selector_isSelectionCollapsed.getFocusBlock;
229
- exports.getFocusBlockObject = selector_isSelectionCollapsed.getFocusBlockObject;
230
- exports.getFocusChild = selector_isSelectionCollapsed.getFocusChild;
231
- exports.getFocusListBlock = selector_isSelectionCollapsed.getFocusListBlock;
232
- exports.getFocusSpan = selector_isSelectionCollapsed.getFocusSpan;
233
- exports.getFocusTextBlock = selector_isSelectionCollapsed.getFocusTextBlock;
234
- exports.getLastBlock = selector_isSelectionCollapsed.getLastBlock;
235
- exports.getNextBlock = selector_isSelectionCollapsed.getNextBlock;
236
- exports.getPreviousBlock = selector_isSelectionCollapsed.getPreviousBlock;
237
- exports.getSelectedBlocks = selector_isSelectionCollapsed.getSelectedBlocks;
238
- exports.getSelectionEndBlock = selector_isSelectionCollapsed.getSelectionEndBlock;
239
- exports.getSelectionStartBlock = selector_isSelectionCollapsed.getSelectionStartBlock;
240
- exports.isSelectionCollapsed = selector_isSelectionCollapsed.isSelectionCollapsed;
80
+ exports.getActiveListItem = selector_isActiveStyle.getActiveListItem;
81
+ exports.getActiveStyle = selector_isActiveStyle.getActiveStyle;
82
+ exports.getFirstBlock = selector_isActiveStyle.getFirstBlock;
83
+ exports.getFocusBlock = selector_isActiveStyle.getFocusBlock;
84
+ exports.getFocusBlockObject = selector_isActiveStyle.getFocusBlockObject;
85
+ exports.getFocusChild = selector_isActiveStyle.getFocusChild;
86
+ exports.getFocusListBlock = selector_isActiveStyle.getFocusListBlock;
87
+ exports.getFocusSpan = selector_isActiveStyle.getFocusSpan;
88
+ exports.getFocusTextBlock = selector_isActiveStyle.getFocusTextBlock;
89
+ exports.getLastBlock = selector_isActiveStyle.getLastBlock;
90
+ exports.getNextBlock = selector_isActiveStyle.getNextBlock;
91
+ exports.getPreviousBlock = selector_isActiveStyle.getPreviousBlock;
92
+ exports.getSelectedBlocks = selector_isActiveStyle.getSelectedBlocks;
93
+ exports.getSelectedSpans = selector_isActiveStyle.getSelectedSpans;
94
+ exports.getSelectionEndBlock = selector_isActiveStyle.getSelectionEndBlock;
95
+ exports.getSelectionStartBlock = selector_isActiveStyle.getSelectionStartBlock;
96
+ exports.isActiveAnnotation = selector_isActiveStyle.isActiveAnnotation;
97
+ exports.isActiveDecorator = selector_isActiveStyle.isActiveDecorator;
98
+ exports.isActiveListItem = selector_isActiveStyle.isActiveListItem;
99
+ exports.isActiveStyle = selector_isActiveStyle.isActiveStyle;
100
+ exports.isSelectionCollapsed = selector_isActiveStyle.isSelectionCollapsed;
101
+ exports.isSelectionExpanded = selector_isActiveStyle.isSelectionExpanded;
241
102
  exports.getBlockTextBefore = selector_getTextBefore.getBlockTextBefore;
242
103
  exports.getSelectionText = selector_getTextBefore.getSelectionText;
243
- exports.getActiveListItem = getActiveListItem;
244
- exports.getActiveStyle = getActiveStyle;
245
104
  exports.getSelectedSlice = getSelectedSlice;
246
- exports.getSelectedSpans = getSelectedSpans;
247
- exports.isActiveAnnotation = isActiveAnnotation;
248
- exports.isActiveDecorator = isActiveDecorator;
249
- exports.isActiveListItem = isActiveListItem;
250
- exports.isActiveStyle = isActiveStyle;
251
105
  exports.isPointAfterSelection = isPointAfterSelection;
252
106
  exports.isPointBeforeSelection = isPointBeforeSelection;
253
- exports.isSelectionExpanded = isSelectionExpanded;
254
107
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-active-list-item.ts","../../src/selectors/selector.get-active-style.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selected-spans.ts","../../src/selectors/selector.is-active-annotation.ts","../../src/selectors/selector.is-selection-expanded.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-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts"],"sourcesContent":["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> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const guards = createGuards(context)\n const selectedBlocks = getSelectedBlocks({context}).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 context,\n}) => {\n if (!context.selection) {\n return undefined\n }\n\n const guards = createGuards(context)\n const selectedBlocks = getSelectedBlocks({context}).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 {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 context,\n}) => {\n return sliceBlocks({blocks: context.value, selection: context.selection})\n}\n","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> = ({context}) => {\n if (!context.selection) {\n return []\n }\n\n const selectedSpans: Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }> = []\n\n const startPoint = context.selection.backward\n ? context.selection.focus\n : context.selection.anchor\n const endPoint = context.selection.backward\n ? context.selection.anchor\n : 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 for (const block of context.value) {\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 selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n\n if (startSpanKey === endSpanKey) {\n break\n }\n\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\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 selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\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 (selectedSpans.length > 0) {\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} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {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 selectedSpans = getSelectedSpans(snapshot)\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 {isSelectionCollapsed} from './selector.is-selection-collapsed'\n\n/**\n * @public\n */\nexport const isSelectionExpanded: EditorSelector<boolean> = ({context}) => {\n return !isSelectionCollapsed({context})\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 {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 = reverseSelection(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 = reverseSelection(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"],"names":["getActiveListItem","context","selection","guards","createGuards","selectedTextBlocks","getSelectedBlocks","map","block","node","filter","isTextBlock","firstTextBlock","at","firstListItem","listItem","every","getActiveStyle","firstStyle","style","getSelectedSlice","sliceBlocks","blocks","value","getSelectedSpans","selectedSpans","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","path","_key","undefined","endBlockKey","startSpanKey","endSpanKey","isPortableTextTextBlock","child","children","isPortableTextSpan","push","length","isActiveAnnotation","annotation","snapshot","selectedBlocks","some","span","marks","selectionMarkDefs","flatMap","markDefs","mark","markDef","find","_type","includes","isSelectionExpanded","isSelectionCollapsed","isActiveDecorator","decorator","activeDecorators","isActiveListItem","isActiveStyle","isPointAfterSelection","point","reverseSelection","pointBlockKey","pointChildKey","endChildKey","after","offset","isPointBeforeSelection","startChildKey","before"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts"],"sourcesContent":["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 context,\n}) => {\n return sliceBlocks({blocks: context.value, selection: context.selection})\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 = reverseSelection(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 = reverseSelection(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"],"names":["getSelectedSlice","context","sliceBlocks","blocks","value","selection","isPointAfterSelection","point","snapshot","reverseSelection","pointBlockKey","isKeySegment","path","_key","undefined","pointChildKey","endBlockKey","focus","endChildKey","after","block","isPortableTextTextBlock","child","children","offset","isPointBeforeSelection","startBlockKey","anchor","startChildKey","before"],"mappings":"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"}
@@ -15,11 +15,61 @@ import {
15
15
  PortableTextTextBlock,
16
16
  } from '@sanity/types'
17
17
 
18
+ declare type Converter<TMIMEType extends MIMEType = MIMEType> = {
19
+ mimeType: TMIMEType
20
+ serialize: Serializer<TMIMEType>
21
+ deserialize: Deserializer<TMIMEType>
22
+ }
23
+
24
+ declare type ConverterEvent<TMIMEType extends MIMEType = MIMEType> =
25
+ | {
26
+ type: 'serialize'
27
+ originEvent: 'copy' | 'cut' | 'unknown'
28
+ }
29
+ | {
30
+ type: 'serialization.failure'
31
+ mimeType: TMIMEType
32
+ reason: string
33
+ }
34
+ | {
35
+ type: 'serialization.success'
36
+ data: string
37
+ mimeType: TMIMEType
38
+ originEvent: 'copy' | 'cut' | 'unknown'
39
+ }
40
+ | {
41
+ type: 'deserialize'
42
+ data: string
43
+ }
44
+ | {
45
+ type: 'deserialization.failure'
46
+ mimeType: TMIMEType
47
+ reason: string
48
+ }
49
+ | {
50
+ type: 'deserialization.success'
51
+ data: Array<PortableTextBlock>
52
+ mimeType: TMIMEType
53
+ }
54
+
55
+ declare type Deserializer<TMIMEType extends MIMEType> = ({
56
+ context,
57
+ event,
58
+ }: {
59
+ context: EditorContext
60
+ event: PickFromUnion<ConverterEvent<TMIMEType>, 'type', 'deserialize'>
61
+ }) => PickFromUnion<
62
+ ConverterEvent<TMIMEType>,
63
+ 'type',
64
+ 'deserialization.success' | 'deserialization.failure'
65
+ >
66
+
18
67
  /**
19
68
  * @public
20
69
  */
21
70
  export declare type EditorContext = {
22
71
  activeDecorators: Array<string>
72
+ converters: Array<Converter>
23
73
  keyGenerator: () => string
24
74
  schema: EditorSchema
25
75
  selection: EditorSelection
@@ -289,6 +339,17 @@ export declare const isSelectionCollapsed: EditorSelector<boolean>
289
339
  */
290
340
  export declare const isSelectionExpanded: EditorSelector<boolean>
291
341
 
342
+ declare type MIMEType = `${string}/${string}`
343
+
344
+ /**
345
+ * @alpha
346
+ */
347
+ declare type PickFromUnion<
348
+ TUnion,
349
+ TTagKey extends keyof TUnion,
350
+ TPickedTags extends TUnion[TTagKey],
351
+ > = TUnion extends Record<TTagKey, TPickedTags> ? TUnion : never
352
+
292
353
  /** @internal */
293
354
  export declare type PortableTextMemberSchemaTypes = {
294
355
  annotations: (ObjectSchemaType & {
@@ -304,4 +365,16 @@ export declare type PortableTextMemberSchemaTypes = {
304
365
  lists: BlockListDefinition[]
305
366
  }
306
367
 
368
+ declare type Serializer<TMIMEType extends MIMEType> = ({
369
+ context,
370
+ event,
371
+ }: {
372
+ context: EditorContext
373
+ event: PickFromUnion<ConverterEvent<TMIMEType>, 'type', 'serialize'>
374
+ }) => PickFromUnion<
375
+ ConverterEvent<TMIMEType>,
376
+ 'type',
377
+ 'serialization.success' | 'serialization.failure'
378
+ >
379
+
307
380
  export {}
@@ -15,11 +15,61 @@ import {
15
15
  PortableTextTextBlock,
16
16
  } from '@sanity/types'
17
17
 
18
+ declare type Converter<TMIMEType extends MIMEType = MIMEType> = {
19
+ mimeType: TMIMEType
20
+ serialize: Serializer<TMIMEType>
21
+ deserialize: Deserializer<TMIMEType>
22
+ }
23
+
24
+ declare type ConverterEvent<TMIMEType extends MIMEType = MIMEType> =
25
+ | {
26
+ type: 'serialize'
27
+ originEvent: 'copy' | 'cut' | 'unknown'
28
+ }
29
+ | {
30
+ type: 'serialization.failure'
31
+ mimeType: TMIMEType
32
+ reason: string
33
+ }
34
+ | {
35
+ type: 'serialization.success'
36
+ data: string
37
+ mimeType: TMIMEType
38
+ originEvent: 'copy' | 'cut' | 'unknown'
39
+ }
40
+ | {
41
+ type: 'deserialize'
42
+ data: string
43
+ }
44
+ | {
45
+ type: 'deserialization.failure'
46
+ mimeType: TMIMEType
47
+ reason: string
48
+ }
49
+ | {
50
+ type: 'deserialization.success'
51
+ data: Array<PortableTextBlock>
52
+ mimeType: TMIMEType
53
+ }
54
+
55
+ declare type Deserializer<TMIMEType extends MIMEType> = ({
56
+ context,
57
+ event,
58
+ }: {
59
+ context: EditorContext
60
+ event: PickFromUnion<ConverterEvent<TMIMEType>, 'type', 'deserialize'>
61
+ }) => PickFromUnion<
62
+ ConverterEvent<TMIMEType>,
63
+ 'type',
64
+ 'deserialization.success' | 'deserialization.failure'
65
+ >
66
+
18
67
  /**
19
68
  * @public
20
69
  */
21
70
  export declare type EditorContext = {
22
71
  activeDecorators: Array<string>
72
+ converters: Array<Converter>
23
73
  keyGenerator: () => string
24
74
  schema: EditorSchema
25
75
  selection: EditorSelection
@@ -289,6 +339,17 @@ export declare const isSelectionCollapsed: EditorSelector<boolean>
289
339
  */
290
340
  export declare const isSelectionExpanded: EditorSelector<boolean>
291
341
 
342
+ declare type MIMEType = `${string}/${string}`
343
+
344
+ /**
345
+ * @alpha
346
+ */
347
+ declare type PickFromUnion<
348
+ TUnion,
349
+ TTagKey extends keyof TUnion,
350
+ TPickedTags extends TUnion[TTagKey],
351
+ > = TUnion extends Record<TTagKey, TPickedTags> ? TUnion : never
352
+
292
353
  /** @internal */
293
354
  export declare type PortableTextMemberSchemaTypes = {
294
355
  annotations: (ObjectSchemaType & {
@@ -304,4 +365,16 @@ export declare type PortableTextMemberSchemaTypes = {
304
365
  lists: BlockListDefinition[]
305
366
  }
306
367
 
368
+ declare type Serializer<TMIMEType extends MIMEType> = ({
369
+ context,
370
+ event,
371
+ }: {
372
+ context: EditorContext
373
+ event: PickFromUnion<ConverterEvent<TMIMEType>, 'type', 'serialize'>
374
+ }) => PickFromUnion<
375
+ ConverterEvent<TMIMEType>,
376
+ 'type',
377
+ 'serialization.success' | 'serialization.failure'
378
+ >
379
+
307
380
  export {}
@@ -1,162 +1,14 @@
1
- import { getSelectedBlocks, createGuards, isSelectionCollapsed } from "../_chunks-es/selector.is-selection-collapsed.js";
2
- import { getFirstBlock, getFocusBlock, getFocusBlockObject, getFocusChild, getFocusListBlock, getFocusSpan, getFocusTextBlock, getLastBlock, getNextBlock, getPreviousBlock, getSelectionEndBlock, getSelectionStartBlock } from "../_chunks-es/selector.is-selection-collapsed.js";
1
+ import { getActiveListItem, getActiveStyle, getFirstBlock, getFocusBlock, getFocusBlockObject, getFocusChild, getFocusListBlock, getFocusSpan, getFocusTextBlock, getLastBlock, getNextBlock, getPreviousBlock, getSelectedBlocks, getSelectedSpans, getSelectionEndBlock, getSelectionStartBlock, isActiveAnnotation, isActiveDecorator, isActiveListItem, isActiveStyle, isSelectionCollapsed, isSelectionExpanded } from "../_chunks-es/selector.is-active-style.js";
3
2
  import { sliceBlocks } from "../_chunks-es/util.slice-blocks.js";
4
- import { isKeySegment, isPortableTextTextBlock, isPortableTextSpan } from "@sanity/types";
5
3
  import { getBlockTextBefore, getSelectionText } from "../_chunks-es/selector.get-text-before.js";
4
+ import { isKeySegment, isPortableTextTextBlock } from "@sanity/types";
6
5
  import { reverseSelection } from "../_chunks-es/util.reverse-selection.js";
7
- const getActiveListItem = ({
8
- context
9
- }) => {
10
- if (!context.selection)
11
- return;
12
- const guards = createGuards(context), selectedTextBlocks = getSelectedBlocks({
13
- context
14
- }).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
15
- if (!firstTextBlock)
16
- return;
17
- const firstListItem = firstTextBlock.listItem;
18
- if (firstListItem && selectedTextBlocks.every((block) => block.listItem === firstListItem))
19
- return firstListItem;
20
- }, getActiveStyle = ({
21
- context
22
- }) => {
23
- if (!context.selection)
24
- return;
25
- const guards = createGuards(context), selectedTextBlocks = getSelectedBlocks({
26
- context
27
- }).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
28
- if (!firstTextBlock)
29
- return;
30
- const firstStyle = firstTextBlock.style;
31
- if (firstStyle && selectedTextBlocks.every((block) => block.style === firstStyle))
32
- return firstStyle;
33
- }, getSelectedSlice = ({
6
+ const getSelectedSlice = ({
34
7
  context
35
8
  }) => sliceBlocks({
36
9
  blocks: context.value,
37
10
  selection: context.selection
38
- }), getSelectedSpans = ({
39
- context
40
- }) => {
41
- if (!context.selection)
42
- return [];
43
- const selectedSpans = [], startPoint = context.selection.backward ? context.selection.focus : context.selection.anchor, endPoint = context.selection.backward ? context.selection.anchor : context.selection.focus, startBlockKey = isKeySegment(startPoint.path[0]) ? startPoint.path[0]._key : void 0, endBlockKey = isKeySegment(endPoint.path[0]) ? endPoint.path[0]._key : void 0;
44
- if (!startBlockKey || !endBlockKey)
45
- return selectedSpans;
46
- const startSpanKey = isKeySegment(startPoint.path[2]) ? startPoint.path[2]._key : void 0, endSpanKey = isKeySegment(endPoint.path[2]) ? endPoint.path[2]._key : void 0;
47
- for (const block of context.value)
48
- if (isPortableTextTextBlock(block)) {
49
- if (block._key === startBlockKey) {
50
- for (const child of block.children)
51
- if (isPortableTextSpan(child)) {
52
- if (startSpanKey && child._key === startSpanKey) {
53
- if (selectedSpans.push({
54
- node: child,
55
- path: [{
56
- _key: block._key
57
- }, "children", {
58
- _key: child._key
59
- }]
60
- }), startSpanKey === endSpanKey)
61
- break;
62
- continue;
63
- }
64
- if (endSpanKey && child._key === endSpanKey) {
65
- selectedSpans.push({
66
- node: child,
67
- path: [{
68
- _key: block._key
69
- }, "children", {
70
- _key: child._key
71
- }]
72
- });
73
- break;
74
- }
75
- selectedSpans.length > 0 && selectedSpans.push({
76
- node: child,
77
- path: [{
78
- _key: block._key
79
- }, "children", {
80
- _key: child._key
81
- }]
82
- });
83
- }
84
- if (startBlockKey === endBlockKey)
85
- break;
86
- continue;
87
- }
88
- if (block._key === endBlockKey) {
89
- for (const child of block.children)
90
- if (isPortableTextSpan(child)) {
91
- if (endSpanKey && child._key === endSpanKey) {
92
- selectedSpans.push({
93
- node: child,
94
- path: [{
95
- _key: block._key
96
- }, "children", {
97
- _key: child._key
98
- }]
99
- });
100
- break;
101
- }
102
- selectedSpans.push({
103
- node: child,
104
- path: [{
105
- _key: block._key
106
- }, "children", {
107
- _key: child._key
108
- }]
109
- });
110
- }
111
- break;
112
- }
113
- if (selectedSpans.length > 0)
114
- for (const child of block.children)
115
- isPortableTextSpan(child) && selectedSpans.push({
116
- node: child,
117
- path: [{
118
- _key: block._key
119
- }, "children", {
120
- _key: child._key
121
- }]
122
- });
123
- }
124
- return selectedSpans;
125
- };
126
- function isActiveAnnotation(annotation) {
127
- return (snapshot) => {
128
- if (!snapshot.context.selection)
129
- return !1;
130
- const selectedBlocks = getSelectedBlocks(snapshot), selectedSpans = getSelectedSpans(snapshot);
131
- if (selectedSpans.length === 0 || selectedSpans.some((span) => !span.node.marks || span.node.marks?.length === 0))
132
- return !1;
133
- const selectionMarkDefs = selectedBlocks.flatMap((block) => isPortableTextTextBlock(block.node) ? block.node.markDefs ?? [] : []);
134
- return selectedSpans.every((span) => (span.node.marks?.flatMap((mark) => {
135
- const markDef = selectionMarkDefs.find((markDef2) => markDef2._key === mark);
136
- return markDef ? [markDef._type] : [];
137
- }) ?? []).includes(annotation));
138
- };
139
- }
140
- const isSelectionExpanded = ({
141
- context
142
- }) => !isSelectionCollapsed({
143
- context
144
11
  });
145
- function isActiveDecorator(decorator) {
146
- return (snapshot) => {
147
- if (isSelectionExpanded(snapshot)) {
148
- const selectedSpans = getSelectedSpans(snapshot);
149
- return selectedSpans.length > 0 && selectedSpans.every((span) => span.node.marks?.includes(decorator));
150
- }
151
- return snapshot.context.activeDecorators.includes(decorator);
152
- };
153
- }
154
- function isActiveListItem(listItem) {
155
- return (snapshot) => getActiveListItem(snapshot) === listItem;
156
- }
157
- function isActiveStyle(style) {
158
- return (snapshot) => getActiveStyle(snapshot) === style;
159
- }
160
12
  function isPointAfterSelection(point) {
161
13
  return (snapshot) => {
162
14
  if (!snapshot.context.selection)