@portabletext/editor 1.28.0 → 1.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +40 -37
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/parse-blocks.cjs +79 -0
  4. package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -0
  5. package/lib/_chunks-cjs/plugin.event-listener.cjs +55 -97
  6. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.get-selection-start-point.cjs +15 -0
  8. package/lib/_chunks-cjs/selector.get-selection-start-point.cjs.map +1 -0
  9. package/lib/_chunks-es/behavior.core.js +40 -37
  10. package/lib/_chunks-es/behavior.core.js.map +1 -1
  11. package/lib/_chunks-es/parse-blocks.js +80 -0
  12. package/lib/_chunks-es/parse-blocks.js.map +1 -0
  13. package/lib/_chunks-es/plugin.event-listener.js +57 -98
  14. package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
  15. package/lib/_chunks-es/selector.get-selection-start-point.js +16 -0
  16. package/lib/_chunks-es/selector.get-selection-start-point.js.map +1 -0
  17. package/lib/behaviors/index.d.cts +196 -124
  18. package/lib/behaviors/index.d.ts +196 -124
  19. package/lib/index.d.cts +248 -0
  20. package/lib/index.d.ts +248 -0
  21. package/lib/plugins/index.cjs +249 -1
  22. package/lib/plugins/index.cjs.map +1 -1
  23. package/lib/plugins/index.d.cts +246 -1
  24. package/lib/plugins/index.d.ts +246 -1
  25. package/lib/plugins/index.js +257 -3
  26. package/lib/plugins/index.js.map +1 -1
  27. package/lib/selectors/index.cjs +28 -1
  28. package/lib/selectors/index.cjs.map +1 -1
  29. package/lib/selectors/index.d.cts +21 -0
  30. package/lib/selectors/index.d.ts +21 -0
  31. package/lib/selectors/index.js +28 -0
  32. package/lib/selectors/index.js.map +1 -1
  33. package/lib/utils/index.cjs +70 -1
  34. package/lib/utils/index.cjs.map +1 -1
  35. package/lib/utils/index.d.cts +168 -2
  36. package/lib/utils/index.d.ts +168 -2
  37. package/lib/utils/index.js +71 -1
  38. package/lib/utils/index.js.map +1 -1
  39. package/package.json +5 -5
  40. package/src/behavior-actions/behavior.action.delete.ts +18 -0
  41. package/src/behavior-actions/behavior.action.insert-break.ts +3 -8
  42. package/src/behavior-actions/behavior.actions.ts +9 -0
  43. package/src/behaviors/_exports/index.ts +1 -0
  44. package/src/behaviors/behavior.core.deserialize.ts +52 -38
  45. package/src/behaviors/behavior.core.ts +4 -11
  46. package/src/behaviors/behavior.types.ts +4 -0
  47. package/src/editor/PortableTextEditor.tsx +20 -0
  48. package/src/internal-utils/__tests__/patchToOperations.test.ts +19 -21
  49. package/src/internal-utils/applyPatch.ts +11 -3
  50. package/src/plugins/index.ts +2 -0
  51. package/src/plugins/plugin.behavior.tsx +22 -0
  52. package/src/plugins/plugin.one-line.tsx +225 -0
  53. package/src/selectors/index.ts +3 -0
  54. package/src/selectors/selector.get-selection-end-point.ts +17 -0
  55. package/src/selectors/selector.get-selection-start-point.ts +17 -0
  56. package/src/selectors/selector.is-overlapping-selection.ts +46 -0
  57. package/src/utils/index.ts +4 -0
  58. package/src/utils/util.is-span.ts +12 -0
  59. package/src/utils/util.is-text-block.ts +12 -0
  60. package/src/utils/util.merge-text-blocks.ts +36 -0
  61. package/src/utils/util.split-text-block.ts +55 -0
@@ -1,10 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var plugin_eventListener = require("../_chunks-cjs/plugin.event-listener.cjs"), reactCompilerRuntime = require("react-compiler-runtime"), React = require("react"), behavior_markdown = require("../_chunks-cjs/behavior.markdown.cjs");
3
+ var reactCompilerRuntime = require("react-compiler-runtime"), React = require("react"), plugin_eventListener = require("../_chunks-cjs/plugin.event-listener.cjs"), behavior_markdown = require("../_chunks-cjs/behavior.markdown.cjs"), jsxRuntime = require("react/jsx-runtime"), selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.cjs"), util_isEqualSelectionPoints = require("../_chunks-cjs/util.is-equal-selection-points.cjs"), utils_index = require("../utils/index.cjs"), selector_getSelectionStartPoint = require("../_chunks-cjs/selector.get-selection-start-point.cjs"), behavior_core = require("../_chunks-cjs/behavior.core.cjs");
4
4
  function _interopDefaultCompat(e) {
5
5
  return e && typeof e == "object" && "default" in e ? e : { default: e };
6
6
  }
7
7
  var React__default = /* @__PURE__ */ _interopDefaultCompat(React);
8
+ function BehaviorPlugin(props) {
9
+ const $ = reactCompilerRuntime.c(4), editor = plugin_eventListener.useEditor();
10
+ let t0, t1;
11
+ return $[0] !== editor || $[1] !== props.behaviors ? (t0 = () => {
12
+ const unregisterBehaviors = props.behaviors.map((behavior) => editor.registerBehavior({
13
+ behavior
14
+ }));
15
+ return () => {
16
+ unregisterBehaviors.forEach(_temp);
17
+ };
18
+ }, t1 = [editor, props.behaviors], $[0] = editor, $[1] = props.behaviors, $[2] = t0, $[3] = t1) : (t0 = $[2], t1 = $[3]), React.useEffect(t0, t1), null;
19
+ }
20
+ function _temp(unregister) {
21
+ return unregister();
22
+ }
8
23
  const EditorRefPlugin = React__default.default.forwardRef((_, ref) => {
9
24
  const $ = reactCompilerRuntime.c(2), editor = plugin_eventListener.useEditor(), portableTextEditorRef = React__default.default.useRef(editor);
10
25
  let t0, t1;
@@ -23,7 +38,240 @@ function MarkdownPlugin(props) {
23
38
  };
24
39
  }, [editor, props.config]), null;
25
40
  }
41
+ const oneLineBehaviors = [
42
+ /**
43
+ * Hitting Enter on an expanded selection should just delete that selection
44
+ * without causing a line break.
45
+ */
46
+ behavior_core.defineBehavior({
47
+ on: "insert.break",
48
+ guard: ({
49
+ context
50
+ }) => context.selection && selector_isAtTheStartOfBlock.isSelectionExpanded({
51
+ context
52
+ }) ? {
53
+ selection: context.selection
54
+ } : !1,
55
+ actions: [(_, {
56
+ selection
57
+ }) => [{
58
+ type: "delete",
59
+ selection
60
+ }]]
61
+ }),
62
+ /**
63
+ * All other cases of `insert.break` should be aborted.
64
+ */
65
+ behavior_core.defineBehavior({
66
+ on: "insert.break",
67
+ actions: [() => [{
68
+ type: "noop"
69
+ }]]
70
+ }),
71
+ /**
72
+ * `insert.block` `before` or `after` is not allowed in a one-line editor.
73
+ */
74
+ behavior_core.defineBehavior({
75
+ on: "insert.block",
76
+ guard: ({
77
+ event
78
+ }) => event.placement === "before" || event.placement === "after",
79
+ actions: [() => [{
80
+ type: "noop"
81
+ }]]
82
+ }),
83
+ /**
84
+ * Other cases of `insert.block` are allowed.
85
+ *
86
+ * If a text block is inserted and the focus block is fully selected, then
87
+ * the focus block can be replaced with the inserted block.
88
+ */
89
+ behavior_core.defineBehavior({
90
+ on: "insert.block",
91
+ guard: ({
92
+ context,
93
+ event
94
+ }) => {
95
+ const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock({
96
+ context
97
+ }), selectionStartPoint = selector_getSelectionStartPoint.getSelectionStartPoint({
98
+ context
99
+ }), selectionEndPoint = selector_getSelectionStartPoint.getSelectionEndPoint({
100
+ context
101
+ });
102
+ if (!focusTextBlock || !utils_index.isTextBlock(context, event.block) || !selectionStartPoint || !selectionEndPoint)
103
+ return !1;
104
+ const blockStartPoint = util_isEqualSelectionPoints.getBlockStartPoint(focusTextBlock), blockEndPoint = util_isEqualSelectionPoints.getBlockEndPoint(focusTextBlock), newFocus = util_isEqualSelectionPoints.getBlockEndPoint({
105
+ node: event.block,
106
+ path: [{
107
+ _key: event.block._key
108
+ }]
109
+ });
110
+ return util_isEqualSelectionPoints.isEqualSelectionPoints(blockStartPoint, selectionStartPoint) && util_isEqualSelectionPoints.isEqualSelectionPoints(blockEndPoint, selectionEndPoint) ? {
111
+ focusTextBlock,
112
+ newFocus
113
+ } : !1;
114
+ },
115
+ actions: [({
116
+ event
117
+ }, {
118
+ focusTextBlock,
119
+ newFocus
120
+ }) => [{
121
+ type: "delete.block",
122
+ blockPath: focusTextBlock.path
123
+ }, {
124
+ type: "insert.block",
125
+ block: event.block,
126
+ placement: "auto"
127
+ }, {
128
+ type: "select",
129
+ selection: {
130
+ anchor: newFocus,
131
+ focus: newFocus
132
+ }
133
+ }]]
134
+ }),
135
+ /**
136
+ * An ordinary `insert.block` is acceptable if it's a text block. In that
137
+ * case it will get merged into the existing text block.
138
+ */
139
+ behavior_core.defineBehavior({
140
+ on: "insert.block",
141
+ guard: ({
142
+ context,
143
+ event
144
+ }) => {
145
+ const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock({
146
+ context
147
+ }), selectionStartPoint = selector_getSelectionStartPoint.getSelectionStartPoint({
148
+ context
149
+ }), selectionEndPoint = selector_getSelectionStartPoint.getSelectionEndPoint({
150
+ context
151
+ });
152
+ if (!focusTextBlock || !utils_index.isTextBlock(context, event.block) || !selectionStartPoint || !selectionEndPoint)
153
+ return !1;
154
+ const blockBeforeStartPoint = utils_index.splitTextBlock({
155
+ context,
156
+ block: focusTextBlock.node,
157
+ point: selectionStartPoint
158
+ })?.before, blockAfterEndPoint = utils_index.splitTextBlock({
159
+ context,
160
+ block: focusTextBlock.node,
161
+ point: selectionEndPoint
162
+ })?.after;
163
+ if (!blockBeforeStartPoint || !blockAfterEndPoint)
164
+ return !1;
165
+ const targetBlock = utils_index.mergeTextBlocks({
166
+ context,
167
+ targetBlock: blockBeforeStartPoint,
168
+ incomingBlock: event.block
169
+ }), newFocus = util_isEqualSelectionPoints.getBlockEndPoint({
170
+ node: targetBlock,
171
+ path: [{
172
+ _key: targetBlock._key
173
+ }]
174
+ }), mergedBlock = utils_index.mergeTextBlocks({
175
+ context,
176
+ targetBlock,
177
+ incomingBlock: blockAfterEndPoint
178
+ });
179
+ return {
180
+ focusTextBlock,
181
+ mergedBlock,
182
+ newFocus
183
+ };
184
+ },
185
+ actions: [(_, {
186
+ focusTextBlock,
187
+ mergedBlock,
188
+ newFocus
189
+ }) => [{
190
+ type: "delete.block",
191
+ blockPath: focusTextBlock.path
192
+ }, {
193
+ type: "insert.block",
194
+ block: mergedBlock,
195
+ placement: "auto"
196
+ }, {
197
+ type: "select",
198
+ selection: {
199
+ anchor: newFocus,
200
+ focus: newFocus
201
+ }
202
+ }]]
203
+ }),
204
+ /**
205
+ * Fallback Behavior to avoid `insert.block` in case the Behaviors above all
206
+ * end up with a falsy guard.
207
+ */
208
+ behavior_core.defineBehavior({
209
+ on: "insert.block",
210
+ actions: [() => [{
211
+ type: "noop"
212
+ }]]
213
+ }),
214
+ /**
215
+ * If multiple blocks are inserted, then the non-text blocks are filtered out
216
+ * and the text blocks are merged into one block
217
+ */
218
+ behavior_core.defineBehavior({
219
+ on: "insert.blocks",
220
+ guard: ({
221
+ context,
222
+ event
223
+ }) => event.blocks.filter((block) => utils_index.isTextBlock(context, block)).reduce((targetBlock, incomingBlock) => utils_index.mergeTextBlocks({
224
+ context,
225
+ targetBlock,
226
+ incomingBlock
227
+ })),
228
+ actions: [
229
+ // `insert.block` is raised so the Behavior above can handle the
230
+ // insertion
231
+ (_, block) => [behavior_core.raise({
232
+ type: "insert.block",
233
+ block,
234
+ placement: "auto"
235
+ })]
236
+ ]
237
+ }),
238
+ /**
239
+ * Block objects do not fit in a one-line editor
240
+ */
241
+ behavior_core.defineBehavior({
242
+ on: "insert.block object",
243
+ actions: [() => [{
244
+ type: "noop"
245
+ }]]
246
+ }),
247
+ /**
248
+ * `insert.text block` is raised as an `insert.block` so it can be handled
249
+ * by the Behaviors above.
250
+ */
251
+ behavior_core.defineBehavior({
252
+ on: "insert.text block",
253
+ actions: [({
254
+ context,
255
+ event
256
+ }) => [behavior_core.raise({
257
+ type: "insert.block",
258
+ block: {
259
+ _key: context.keyGenerator(),
260
+ _type: context.schema.block.name,
261
+ children: event.textBlock?.children ?? []
262
+ },
263
+ placement: event.placement
264
+ })]]
265
+ })
266
+ ];
267
+ function OneLinePlugin() {
268
+ const $ = reactCompilerRuntime.c(1);
269
+ let t0;
270
+ return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = /* @__PURE__ */ jsxRuntime.jsx(BehaviorPlugin, { behaviors: oneLineBehaviors }), $[0] = t0) : t0 = $[0], t0;
271
+ }
26
272
  exports.EventListenerPlugin = plugin_eventListener.EventListenerPlugin;
273
+ exports.BehaviorPlugin = BehaviorPlugin;
27
274
  exports.EditorRefPlugin = EditorRefPlugin;
28
275
  exports.MarkdownPlugin = MarkdownPlugin;
276
+ exports.OneLinePlugin = OneLinePlugin;
29
277
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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,eAAAA,QAAMC,WAA0B,CAAAC,GAAAC,QAAA;AAAAC,QAAAA,IAAAC,qBAAAA,EAAA,CAAA,GAC7DC,SAAeC,+BAEfC,GAAAA,wBAA8BR,eAAAA,QAAAS,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,eAAAe,QAAAA,oBAA0BZ,KAAKO,IAAqCC,EAAE,GAAC;AAAA,CAGxE;AACDZ,gBAAgBiB,cAAc;ACmCvB,SAASC,eAAeC,OAAuC;AACpE,QAAMZ,SAASC,qBAAAA,UAAU;AAEzBY,SAAAA,MAAAA,UAAU,MAAM;AAGRC,UAAAA,sBAFYC,0CAAwBH,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.cjs","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","jsx"],"mappings":"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"}