@portabletext/editor 1.27.0 → 1.30.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 (79) hide show
  1. package/README.md +5 -5
  2. package/lib/_chunks-cjs/behavior.core.cjs +40 -37
  3. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  4. package/lib/_chunks-cjs/parse-blocks.cjs +79 -0
  5. package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -0
  6. package/lib/_chunks-cjs/plugin.event-listener.cjs +357 -140
  7. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
  8. package/lib/_chunks-cjs/selector.get-selection-start-point.cjs +15 -0
  9. package/lib/_chunks-cjs/selector.get-selection-start-point.cjs.map +1 -0
  10. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +88 -88
  11. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  12. package/lib/_chunks-es/behavior.core.js +40 -37
  13. package/lib/_chunks-es/behavior.core.js.map +1 -1
  14. package/lib/_chunks-es/parse-blocks.js +80 -0
  15. package/lib/_chunks-es/parse-blocks.js.map +1 -0
  16. package/lib/_chunks-es/plugin.event-listener.js +359 -141
  17. package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
  18. package/lib/_chunks-es/selector.get-selection-start-point.js +16 -0
  19. package/lib/_chunks-es/selector.get-selection-start-point.js.map +1 -0
  20. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +88 -88
  21. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  22. package/lib/behaviors/index.d.cts +196 -124
  23. package/lib/behaviors/index.d.ts +196 -124
  24. package/lib/index.cjs +22 -21
  25. package/lib/index.cjs.map +1 -1
  26. package/lib/index.d.cts +505 -0
  27. package/lib/index.d.ts +505 -0
  28. package/lib/index.js +22 -21
  29. package/lib/index.js.map +1 -1
  30. package/lib/plugins/index.cjs +249 -1
  31. package/lib/plugins/index.cjs.map +1 -1
  32. package/lib/plugins/index.d.cts +246 -1
  33. package/lib/plugins/index.d.ts +246 -1
  34. package/lib/plugins/index.js +257 -3
  35. package/lib/plugins/index.js.map +1 -1
  36. package/lib/selectors/index.cjs +42 -3
  37. package/lib/selectors/index.cjs.map +1 -1
  38. package/lib/selectors/index.d.cts +39 -0
  39. package/lib/selectors/index.d.ts +39 -0
  40. package/lib/selectors/index.js +45 -4
  41. package/lib/selectors/index.js.map +1 -1
  42. package/lib/utils/index.cjs +70 -1
  43. package/lib/utils/index.cjs.map +1 -1
  44. package/lib/utils/index.d.cts +168 -2
  45. package/lib/utils/index.d.ts +168 -2
  46. package/lib/utils/index.js +71 -1
  47. package/lib/utils/index.js.map +1 -1
  48. package/package.json +4 -4
  49. package/src/behavior-actions/behavior.action.delete.ts +18 -0
  50. package/src/behavior-actions/behavior.action.insert-break.ts +96 -91
  51. package/src/behavior-actions/behavior.actions.ts +9 -0
  52. package/src/behaviors/_exports/index.ts +1 -0
  53. package/src/behaviors/behavior.core.deserialize.ts +52 -38
  54. package/src/behaviors/behavior.core.ts +4 -11
  55. package/src/behaviors/behavior.types.ts +4 -0
  56. package/src/editor/PortableTextEditor.tsx +308 -1
  57. package/src/editor/components/DefaultObject.tsx +21 -0
  58. package/src/editor/components/Element.tsx +5 -5
  59. package/src/editor/components/Leaf.tsx +1 -6
  60. package/src/internal-utils/__tests__/patchToOperations.test.ts +19 -21
  61. package/src/internal-utils/applyPatch.ts +11 -3
  62. package/src/plugins/index.ts +2 -0
  63. package/src/plugins/plugin.behavior.tsx +22 -0
  64. package/src/plugins/plugin.one-line.tsx +225 -0
  65. package/src/selectors/index.ts +7 -2
  66. package/src/selectors/selector.get-active-annotations.test.ts +122 -0
  67. package/src/selectors/selector.get-active-annotations.ts +30 -0
  68. package/src/selectors/selector.get-selection-end-point.ts +17 -0
  69. package/src/selectors/selector.get-selection-start-point.ts +17 -0
  70. package/src/selectors/selector.get-selection.ts +8 -0
  71. package/src/selectors/selector.get-value.ts +11 -0
  72. package/src/selectors/selector.is-overlapping-selection.ts +46 -0
  73. package/src/utils/index.ts +4 -0
  74. package/src/utils/util.is-span.ts +12 -0
  75. package/src/utils/util.is-text-block.ts +12 -0
  76. package/src/utils/util.merge-text-blocks.ts +36 -0
  77. package/src/utils/util.split-text-block.ts +55 -0
  78. package/src/editor/nodes/DefaultAnnotation.tsx +0 -20
  79. package/src/editor/nodes/DefaultObject.tsx +0 -18
@@ -1,8 +1,29 @@
1
- import { useEditor } from "../_chunks-es/plugin.event-listener.js";
2
- import { EventListenerPlugin } from "../_chunks-es/plugin.event-listener.js";
3
1
  import { c } from "react-compiler-runtime";
4
2
  import React, { useEffect } from "react";
3
+ import { useEditor } from "../_chunks-es/plugin.event-listener.js";
4
+ import { EventListenerPlugin } from "../_chunks-es/plugin.event-listener.js";
5
5
  import { createMarkdownBehaviors } from "../_chunks-es/behavior.markdown.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { isSelectionExpanded, getFocusTextBlock } from "../_chunks-es/selector.is-at-the-start-of-block.js";
8
+ import { getBlockStartPoint, getBlockEndPoint, isEqualSelectionPoints } from "../_chunks-es/util.is-equal-selection-points.js";
9
+ import { isTextBlock, splitTextBlock, mergeTextBlocks } from "../utils/index.js";
10
+ import { getSelectionStartPoint, getSelectionEndPoint } from "../_chunks-es/selector.get-selection-start-point.js";
11
+ import { defineBehavior, raise } from "../_chunks-es/behavior.core.js";
12
+ function BehaviorPlugin(props) {
13
+ const $ = c(4), editor = useEditor();
14
+ let t0, t1;
15
+ return $[0] !== editor || $[1] !== props.behaviors ? (t0 = () => {
16
+ const unregisterBehaviors = props.behaviors.map((behavior) => editor.registerBehavior({
17
+ behavior
18
+ }));
19
+ return () => {
20
+ unregisterBehaviors.forEach(_temp);
21
+ };
22
+ }, t1 = [editor, props.behaviors], $[0] = editor, $[1] = props.behaviors, $[2] = t0, $[3] = t1) : (t0 = $[2], t1 = $[3]), useEffect(t0, t1), null;
23
+ }
24
+ function _temp(unregister) {
25
+ return unregister();
26
+ }
6
27
  const EditorRefPlugin = React.forwardRef((_, ref) => {
7
28
  const $ = c(2), editor = useEditor(), portableTextEditorRef = React.useRef(editor);
8
29
  let t0, t1;
@@ -21,9 +42,242 @@ function MarkdownPlugin(props) {
21
42
  };
22
43
  }, [editor, props.config]), null;
23
44
  }
45
+ const oneLineBehaviors = [
46
+ /**
47
+ * Hitting Enter on an expanded selection should just delete that selection
48
+ * without causing a line break.
49
+ */
50
+ defineBehavior({
51
+ on: "insert.break",
52
+ guard: ({
53
+ context
54
+ }) => context.selection && isSelectionExpanded({
55
+ context
56
+ }) ? {
57
+ selection: context.selection
58
+ } : !1,
59
+ actions: [(_, {
60
+ selection
61
+ }) => [{
62
+ type: "delete",
63
+ selection
64
+ }]]
65
+ }),
66
+ /**
67
+ * All other cases of `insert.break` should be aborted.
68
+ */
69
+ defineBehavior({
70
+ on: "insert.break",
71
+ actions: [() => [{
72
+ type: "noop"
73
+ }]]
74
+ }),
75
+ /**
76
+ * `insert.block` `before` or `after` is not allowed in a one-line editor.
77
+ */
78
+ defineBehavior({
79
+ on: "insert.block",
80
+ guard: ({
81
+ event
82
+ }) => event.placement === "before" || event.placement === "after",
83
+ actions: [() => [{
84
+ type: "noop"
85
+ }]]
86
+ }),
87
+ /**
88
+ * Other cases of `insert.block` are allowed.
89
+ *
90
+ * If a text block is inserted and the focus block is fully selected, then
91
+ * the focus block can be replaced with the inserted block.
92
+ */
93
+ defineBehavior({
94
+ on: "insert.block",
95
+ guard: ({
96
+ context,
97
+ event
98
+ }) => {
99
+ const focusTextBlock = getFocusTextBlock({
100
+ context
101
+ }), selectionStartPoint = getSelectionStartPoint({
102
+ context
103
+ }), selectionEndPoint = getSelectionEndPoint({
104
+ context
105
+ });
106
+ if (!focusTextBlock || !isTextBlock(context, event.block) || !selectionStartPoint || !selectionEndPoint)
107
+ return !1;
108
+ const blockStartPoint = getBlockStartPoint(focusTextBlock), blockEndPoint = getBlockEndPoint(focusTextBlock), newFocus = getBlockEndPoint({
109
+ node: event.block,
110
+ path: [{
111
+ _key: event.block._key
112
+ }]
113
+ });
114
+ return isEqualSelectionPoints(blockStartPoint, selectionStartPoint) && isEqualSelectionPoints(blockEndPoint, selectionEndPoint) ? {
115
+ focusTextBlock,
116
+ newFocus
117
+ } : !1;
118
+ },
119
+ actions: [({
120
+ event
121
+ }, {
122
+ focusTextBlock,
123
+ newFocus
124
+ }) => [{
125
+ type: "delete.block",
126
+ blockPath: focusTextBlock.path
127
+ }, {
128
+ type: "insert.block",
129
+ block: event.block,
130
+ placement: "auto"
131
+ }, {
132
+ type: "select",
133
+ selection: {
134
+ anchor: newFocus,
135
+ focus: newFocus
136
+ }
137
+ }]]
138
+ }),
139
+ /**
140
+ * An ordinary `insert.block` is acceptable if it's a text block. In that
141
+ * case it will get merged into the existing text block.
142
+ */
143
+ defineBehavior({
144
+ on: "insert.block",
145
+ guard: ({
146
+ context,
147
+ event
148
+ }) => {
149
+ const focusTextBlock = getFocusTextBlock({
150
+ context
151
+ }), selectionStartPoint = getSelectionStartPoint({
152
+ context
153
+ }), selectionEndPoint = getSelectionEndPoint({
154
+ context
155
+ });
156
+ if (!focusTextBlock || !isTextBlock(context, event.block) || !selectionStartPoint || !selectionEndPoint)
157
+ return !1;
158
+ const blockBeforeStartPoint = splitTextBlock({
159
+ context,
160
+ block: focusTextBlock.node,
161
+ point: selectionStartPoint
162
+ })?.before, blockAfterEndPoint = splitTextBlock({
163
+ context,
164
+ block: focusTextBlock.node,
165
+ point: selectionEndPoint
166
+ })?.after;
167
+ if (!blockBeforeStartPoint || !blockAfterEndPoint)
168
+ return !1;
169
+ const targetBlock = mergeTextBlocks({
170
+ context,
171
+ targetBlock: blockBeforeStartPoint,
172
+ incomingBlock: event.block
173
+ }), newFocus = getBlockEndPoint({
174
+ node: targetBlock,
175
+ path: [{
176
+ _key: targetBlock._key
177
+ }]
178
+ }), mergedBlock = mergeTextBlocks({
179
+ context,
180
+ targetBlock,
181
+ incomingBlock: blockAfterEndPoint
182
+ });
183
+ return {
184
+ focusTextBlock,
185
+ mergedBlock,
186
+ newFocus
187
+ };
188
+ },
189
+ actions: [(_, {
190
+ focusTextBlock,
191
+ mergedBlock,
192
+ newFocus
193
+ }) => [{
194
+ type: "delete.block",
195
+ blockPath: focusTextBlock.path
196
+ }, {
197
+ type: "insert.block",
198
+ block: mergedBlock,
199
+ placement: "auto"
200
+ }, {
201
+ type: "select",
202
+ selection: {
203
+ anchor: newFocus,
204
+ focus: newFocus
205
+ }
206
+ }]]
207
+ }),
208
+ /**
209
+ * Fallback Behavior to avoid `insert.block` in case the Behaviors above all
210
+ * end up with a falsy guard.
211
+ */
212
+ defineBehavior({
213
+ on: "insert.block",
214
+ actions: [() => [{
215
+ type: "noop"
216
+ }]]
217
+ }),
218
+ /**
219
+ * If multiple blocks are inserted, then the non-text blocks are filtered out
220
+ * and the text blocks are merged into one block
221
+ */
222
+ defineBehavior({
223
+ on: "insert.blocks",
224
+ guard: ({
225
+ context,
226
+ event
227
+ }) => event.blocks.filter((block) => isTextBlock(context, block)).reduce((targetBlock, incomingBlock) => mergeTextBlocks({
228
+ context,
229
+ targetBlock,
230
+ incomingBlock
231
+ })),
232
+ actions: [
233
+ // `insert.block` is raised so the Behavior above can handle the
234
+ // insertion
235
+ (_, block) => [raise({
236
+ type: "insert.block",
237
+ block,
238
+ placement: "auto"
239
+ })]
240
+ ]
241
+ }),
242
+ /**
243
+ * Block objects do not fit in a one-line editor
244
+ */
245
+ defineBehavior({
246
+ on: "insert.block object",
247
+ actions: [() => [{
248
+ type: "noop"
249
+ }]]
250
+ }),
251
+ /**
252
+ * `insert.text block` is raised as an `insert.block` so it can be handled
253
+ * by the Behaviors above.
254
+ */
255
+ defineBehavior({
256
+ on: "insert.text block",
257
+ actions: [({
258
+ context,
259
+ event
260
+ }) => [raise({
261
+ type: "insert.block",
262
+ block: {
263
+ _key: context.keyGenerator(),
264
+ _type: context.schema.block.name,
265
+ children: event.textBlock?.children ?? []
266
+ },
267
+ placement: event.placement
268
+ })]]
269
+ })
270
+ ];
271
+ function OneLinePlugin() {
272
+ const $ = c(1);
273
+ let t0;
274
+ return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = /* @__PURE__ */ jsx(BehaviorPlugin, { behaviors: oneLineBehaviors }), $[0] = t0) : t0 = $[0], t0;
275
+ }
24
276
  export {
277
+ BehaviorPlugin,
25
278
  EditorRefPlugin,
26
279
  EventListenerPlugin,
27
- MarkdownPlugin
280
+ MarkdownPlugin,
281
+ OneLinePlugin
28
282
  };
29
283
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/plugins/plugin.editor-ref.tsx","../../src/plugins/plugin.markdown.tsx"],"sourcesContent":["import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return null\n}\n"],"names":["EditorRefPlugin","React","forwardRef","_","ref","$","_c","editor","useEditor","portableTextEditorRef","useRef","t0","t1","Symbol","for","current","useImperativeHandle","displayName","MarkdownPlugin","props","useEffect","unregisterBehaviors","createMarkdownBehaviors","config","map","behavior","registerBehavior","unregisterBehavior"],"mappings":";;;;;AAOO,MAAMA,kBAAkBC,MAAMC,WAA0B,CAAAC,GAAAC,QAAA;AAAAC,QAAAA,IAAAC,EAAA,CAAA,GAC7DC,SAAeC,UAEfC,GAAAA,wBAA8BR,MAAAS,OAAaH,MAAM;AAAC,MAAAI,IAAAC;AAAA,SAAAP,EAAA,CAAA,MAAAQ,OAAAC,IAAA,2BAAA,KAEnBH,KAAAA,MAAMF,sBAAqBM,SAAUH,KAAA,CAAA,GAAEP,OAAAM,IAAAN,OAAAO,OAAAD,KAAAN,EAAA,CAAA,GAAAO,KAAAP,EAAA,CAAA,IAAtEJ,MAAAe,oBAA0BZ,KAAKO,IAAqCC,EAAE,GAAC;AAAA,CAGxE;AACDZ,gBAAgBiB,cAAc;ACmCvB,SAASC,eAAeC,OAAuC;AACpE,QAAMZ,SAASC,UAAU;AAEzBY,SAAAA,UAAU,MAAM;AAGRC,UAAAA,sBAFYC,wBAAwBH,MAAMI,MAAM,EAEhBC,IAAKC,CAAAA,aACzClB,OAAOmB,iBAAiB;AAAA,MAACD;AAAAA,IAAAA,CAAS,CACpC;AAEA,WAAO,MAAM;AACX,iBAAWE,sBAAsBN;AACZ,2BAAA;AAAA,IAEvB;AAAA,KACC,CAACd,QAAQY,MAAMI,MAAM,CAAC,GAElB;AACT;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.editor-ref.tsx","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig\n\n/**\n * @beta\n * Add markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }}\n * />\n * {...}\n * </EditorProvider>\n * )\n * }\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return null\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({context}) =>\n context.selection && selectors.isSelectionExpanded({context})\n ? {selection: context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * Other cases of `insert.block` are allowed.\n *\n * If a text block is inserted and the focus block is fully selected, then\n * the focus block can be replaced with the inserted block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(focusTextBlock)\n const blockEndPoint = utils.getBlockEndPoint(focusTextBlock)\n const newFocus = utils.getBlockEndPoint({\n node: event.block,\n path: [{_key: event.block._key}],\n })\n\n if (\n utils.isEqualSelectionPoints(blockStartPoint, selectionStartPoint) &&\n utils.isEqualSelectionPoints(blockEndPoint, selectionEndPoint)\n ) {\n return {focusTextBlock, newFocus}\n }\n\n return false\n },\n actions: [\n ({event}, {focusTextBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: event.block, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockBeforeStartPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionStartPoint,\n })?.before\n const blockAfterEndPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionEndPoint,\n })?.after\n\n if (!blockBeforeStartPoint || !blockAfterEndPoint) {\n return false\n }\n\n const targetBlock = utils.mergeTextBlocks({\n context,\n targetBlock: blockBeforeStartPoint,\n incomingBlock: event.block,\n })\n\n const newFocus = utils.getBlockEndPoint({\n node: targetBlock,\n path: [{_key: targetBlock._key}],\n })\n\n const mergedBlock = utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock: blockAfterEndPoint,\n })\n\n return {focusTextBlock, mergedBlock, newFocus}\n },\n actions: [\n (_, {focusTextBlock, mergedBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: mergedBlock, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({context, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Block objects do not fit in a one-line editor\n */\n defineBehavior({\n on: 'insert.block object',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.text block` is raised as an `insert.block` so it can be handled\n * by the Behaviors above.\n */\n defineBehavior({\n on: 'insert.text block',\n actions: [\n ({context, event}) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: event.textBlock?.children ?? [],\n },\n placement: event.placement,\n }),\n ],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","EditorRefPlugin","React","forwardRef","_","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","MarkdownPlugin","createMarkdownBehaviors","config","unregisterBehavior","oneLineBehaviors","defineBehavior","on","guard","context","selection","selectors","actions","type","event","placement","focusTextBlock","selectionStartPoint","selectionEndPoint","utils","block","blockStartPoint","blockEndPoint","newFocus","node","path","_key","blockPath","anchor","focus","blockBeforeStartPoint","point","before","blockAfterEndPoint","after","targetBlock","incomingBlock","mergedBlock","blocks","filter","reduce","raise","keyGenerator","_type","schema","name","children","textBlock","OneLinePlugin"],"mappings":"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"}
@@ -1,12 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.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 = ({
3
+ var types = require("@sanity/types"), selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), selector_getSelectionStartPoint = require("../_chunks-cjs/selector.get-selection-start-point.cjs"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs");
4
+ const getActiveAnnotations = (snapshot) => {
5
+ if (!snapshot.context.selection)
6
+ return [];
7
+ const selectedBlocks = selector_isAtTheStartOfBlock.getSelectedBlocks(snapshot), selectedSpans = selector_isAtTheStartOfBlock.getSelectedSpans(snapshot);
8
+ return selectedSpans.length === 0 ? [] : selectedBlocks.flatMap((block) => types.isPortableTextTextBlock(block.node) ? block.node.markDefs ?? [] : []).filter((markDef) => selectedSpans.some((span) => span.node.marks?.includes(markDef._key)));
9
+ }, getSelectedSlice = ({
5
10
  context
6
11
  }) => util_sliceBlocks.sliceBlocks({
7
12
  blocks: context.value,
8
13
  selection: context.selection
9
- });
14
+ }), getSelection = ({
15
+ context
16
+ }) => context.selection, getValue = ({
17
+ context
18
+ }) => context.value;
10
19
  function isPointAfterSelection(point) {
11
20
  return (snapshot) => {
12
21
  if (!snapshot.context.selection)
@@ -77,6 +86,30 @@ function isPointBeforeSelection(point) {
77
86
  return before;
78
87
  };
79
88
  }
89
+ function isOverlappingSelection(selection) {
90
+ return ({
91
+ context
92
+ }) => {
93
+ if (!selection || !context.selection)
94
+ return !1;
95
+ const selectionStartPoint = selector_getSelectionStartPoint.getSelectionStartPoint({
96
+ context: {
97
+ ...context,
98
+ selection
99
+ }
100
+ }), selectionEndPoint = selector_getSelectionStartPoint.getSelectionEndPoint({
101
+ context: {
102
+ ...context,
103
+ selection
104
+ }
105
+ });
106
+ return !(!selectionStartPoint || !selectionEndPoint || !isPointAfterSelection(selectionStartPoint)({
107
+ context
108
+ }) || !isPointBeforeSelection(selectionEndPoint)({
109
+ context
110
+ }));
111
+ };
112
+ }
80
113
  exports.getActiveListItem = selector_isAtTheStartOfBlock.getActiveListItem;
81
114
  exports.getActiveStyle = selector_isAtTheStartOfBlock.getActiveStyle;
82
115
  exports.getFirstBlock = selector_isAtTheStartOfBlock.getFirstBlock;
@@ -101,9 +134,15 @@ exports.isAtTheEndOfBlock = selector_isAtTheStartOfBlock.isAtTheEndOfBlock;
101
134
  exports.isAtTheStartOfBlock = selector_isAtTheStartOfBlock.isAtTheStartOfBlock;
102
135
  exports.isSelectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed;
103
136
  exports.isSelectionExpanded = selector_isAtTheStartOfBlock.isSelectionExpanded;
137
+ exports.getSelectionEndPoint = selector_getSelectionStartPoint.getSelectionEndPoint;
138
+ exports.getSelectionStartPoint = selector_getSelectionStartPoint.getSelectionStartPoint;
104
139
  exports.getBlockTextBefore = selector_getTextBefore.getBlockTextBefore;
105
140
  exports.getSelectionText = selector_getTextBefore.getSelectionText;
141
+ exports.getActiveAnnotations = getActiveAnnotations;
106
142
  exports.getSelectedSlice = getSelectedSlice;
143
+ exports.getSelection = getSelection;
144
+ exports.getValue = getValue;
145
+ exports.isOverlappingSelection = isOverlappingSelection;
107
146
  exports.isPointAfterSelection = isPointAfterSelection;
108
147
  exports.isPointBeforeSelection = isPointBeforeSelection;
109
148
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-active-annotations.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.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 {isPortableTextTextBlock, type PortableTextObject} 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 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\n if (selectedSpans.length === 0) {\n return []\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 {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 type {EditorSelection, EditorSelector} from './_exports'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = ({context}) => {\n return context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from './_exports'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = ({\n context,\n}) => {\n return context.value\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","import type {EditorSelection} from '../types/editor'\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 ({context}) => {\n if (!selection || !context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n context: {\n ...context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n context: {\n ...context,\n selection,\n },\n })\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return false\n }\n\n if (!isPointAfterSelection(selectionStartPoint)({context})) {\n return false\n }\n\n if (!isPointBeforeSelection(selectionEndPoint)({context})) {\n return false\n }\n\n return true\n }\n}\n"],"names":["getActiveAnnotations","snapshot","context","selection","selectedBlocks","getSelectedBlocks","selectedSpans","getSelectedSpans","length","flatMap","block","isPortableTextTextBlock","node","markDefs","filter","markDef","some","span","marks","includes","_key","getSelectedSlice","sliceBlocks","blocks","value","getSelection","getValue","isPointAfterSelection","point","reverseSelection","pointBlockKey","isKeySegment","path","undefined","pointChildKey","endBlockKey","focus","endChildKey","after","child","children","offset","isPointBeforeSelection","startBlockKey","anchor","startChildKey","before","isOverlappingSelection","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint"],"mappings":"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"}
@@ -108,6 +108,13 @@ export declare type EditorSnapshot = {
108
108
  context: EditorContext
109
109
  }
110
110
 
111
+ /**
112
+ * @public
113
+ */
114
+ export declare const getActiveAnnotations: EditorSelector<
115
+ Array<PortableTextObject>
116
+ >
117
+
111
118
  /**
112
119
  * @public
113
120
  */
@@ -262,6 +269,12 @@ export declare const getSelectedSpans: EditorSelector<
262
269
  }>
263
270
  >
264
271
 
272
+ /**
273
+ * @public
274
+ */
275
+ declare const getSelection_2: EditorSelector<EditorSelection>
276
+ export {getSelection_2 as getSelection}
277
+
265
278
  /**
266
279
  * @public
267
280
  */
@@ -273,6 +286,13 @@ export declare const getSelectionEndBlock: EditorSelector<
273
286
  | undefined
274
287
  >
275
288
 
289
+ /**
290
+ * @public
291
+ */
292
+ export declare const getSelectionEndPoint: EditorSelector<
293
+ EditorSelectionPoint | undefined
294
+ >
295
+
276
296
  /**
277
297
  * @public
278
298
  */
@@ -284,11 +304,23 @@ export declare const getSelectionStartBlock: EditorSelector<
284
304
  | undefined
285
305
  >
286
306
 
307
+ /**
308
+ * @public
309
+ */
310
+ export declare const getSelectionStartPoint: EditorSelector<
311
+ EditorSelectionPoint | undefined
312
+ >
313
+
287
314
  /**
288
315
  * @public
289
316
  */
290
317
  export declare const getSelectionText: EditorSelector<string>
291
318
 
319
+ /**
320
+ * @public
321
+ */
322
+ export declare const getValue: EditorSelector<Array<PortableTextBlock>>
323
+
292
324
  /**
293
325
  * @public
294
326
  */
@@ -331,6 +363,13 @@ export declare function isAtTheStartOfBlock(block: {
331
363
  path: [KeyedSegment]
332
364
  }): EditorSelector<boolean>
333
365
 
366
+ /**
367
+ * @public
368
+ */
369
+ export declare function isOverlappingSelection(
370
+ selection: EditorSelection,
371
+ ): EditorSelector<boolean>
372
+
334
373
  /**
335
374
  * @public
336
375
  */
@@ -108,6 +108,13 @@ export declare type EditorSnapshot = {
108
108
  context: EditorContext
109
109
  }
110
110
 
111
+ /**
112
+ * @public
113
+ */
114
+ export declare const getActiveAnnotations: EditorSelector<
115
+ Array<PortableTextObject>
116
+ >
117
+
111
118
  /**
112
119
  * @public
113
120
  */
@@ -262,6 +269,12 @@ export declare const getSelectedSpans: EditorSelector<
262
269
  }>
263
270
  >
264
271
 
272
+ /**
273
+ * @public
274
+ */
275
+ declare const getSelection_2: EditorSelector<EditorSelection>
276
+ export {getSelection_2 as getSelection}
277
+
265
278
  /**
266
279
  * @public
267
280
  */
@@ -273,6 +286,13 @@ export declare const getSelectionEndBlock: EditorSelector<
273
286
  | undefined
274
287
  >
275
288
 
289
+ /**
290
+ * @public
291
+ */
292
+ export declare const getSelectionEndPoint: EditorSelector<
293
+ EditorSelectionPoint | undefined
294
+ >
295
+
276
296
  /**
277
297
  * @public
278
298
  */
@@ -284,11 +304,23 @@ export declare const getSelectionStartBlock: EditorSelector<
284
304
  | undefined
285
305
  >
286
306
 
307
+ /**
308
+ * @public
309
+ */
310
+ export declare const getSelectionStartPoint: EditorSelector<
311
+ EditorSelectionPoint | undefined
312
+ >
313
+
287
314
  /**
288
315
  * @public
289
316
  */
290
317
  export declare const getSelectionText: EditorSelector<string>
291
318
 
319
+ /**
320
+ * @public
321
+ */
322
+ export declare const getValue: EditorSelector<Array<PortableTextBlock>>
323
+
292
324
  /**
293
325
  * @public
294
326
  */
@@ -331,6 +363,13 @@ export declare function isAtTheStartOfBlock(block: {
331
363
  path: [KeyedSegment]
332
364
  }): EditorSelector<boolean>
333
365
 
366
+ /**
367
+ * @public
368
+ */
369
+ export declare function isOverlappingSelection(
370
+ selection: EditorSelection,
371
+ ): EditorSelector<boolean>
372
+
334
373
  /**
335
374
  * @public
336
375
  */