@portabletext/editor 2.1.11 → 2.3.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.
@@ -12,8 +12,8 @@ function mergeTextBlocks({
12
12
  context,
13
13
  block: incomingBlock,
14
14
  options: {
15
- refreshKeys: !0,
16
- validateFields: !0
15
+ refreshKeys: !1,
16
+ validateFields: !1
17
17
  }
18
18
  });
19
19
  return !parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock) ? targetBlock : {
@@ -1 +1 @@
1
- {"version":3,"file":"util.merge-text-blocks.cjs","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true, validateFields: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","validateFields","children","markDefs"],"mappings":";;AAOO,SAASA,YACdC,SACAC,OACgC;AAChC,SAAOC,iBAAAA,cAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,iBAAAA,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,MAAMC,gBAAgB;AAAA,IAAA;AAAA,EAAI,CAClD;AAED,SAAI,CAACJ,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHO,UAAU,CAAC,GAAGP,YAAYO,UAAU,GAAGL,oBAAoBK,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIR,YAAYQ,YAAY,CAAA,GAC5B,GAAIN,oBAAoBM,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;;;"}
1
+ {"version":3,"file":"util.merge-text-blocks.cjs","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: false, validateFields: false},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","validateFields","children","markDefs"],"mappings":";;AAOO,SAASA,YACdC,SACAC,OACgC;AAChC,SAAOC,iBAAAA,cAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,iBAAAA,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,MAAOC,gBAAgB;AAAA,IAAA;AAAA,EAAK,CACpD;AAED,SAAI,CAACJ,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHO,UAAU,CAAC,GAAGP,YAAYO,UAAU,GAAGL,oBAAoBK,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIR,YAAYQ,YAAY,CAAA,GAC5B,GAAIN,oBAAoBM,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;;;"}
@@ -4,7 +4,7 @@ import { ArrayDefinition, ArraySchemaType, BlockDecoratorDefinition, BlockListDe
4
4
  import * as xstate227 from "xstate";
5
5
  import { ActorRef, ActorRefFrom, EventObject, Snapshot } from "xstate";
6
6
  import { BaseRange, Descendant, Operation } from "slate";
7
- import * as react22 from "react";
7
+ import * as react20 from "react";
8
8
  import React$1, { BaseSyntheticEvent, ClipboardEvent, Component, FocusEvent, JSX, KeyboardEvent as KeyboardEvent$1, MutableRefObject, PropsWithChildren, ReactElement, RefObject, TextareaHTMLAttributes } from "react";
9
9
  import * as xstate_guards12 from "xstate/guards";
10
10
  import { Observable, Subject } from "rxjs";
@@ -352,7 +352,7 @@ declare class PortableTextEditor extends Component<PortableTextEditorProps<Inter
352
352
  componentDidUpdate(prevProps: PortableTextEditorProps): void;
353
353
  componentWillUnmount(): void;
354
354
  setEditable: (editable: EditableAPI) => void;
355
- render(): react22.JSX.Element;
355
+ render(): react20.JSX.Element;
356
356
  /**
357
357
  * @deprecated
358
358
  * Use built-in selectors or write your own: https://www.portabletext.org/reference/selectors/
@@ -747,7 +747,7 @@ type PortableTextEditableProps = Omit<TextareaHTMLAttributes<HTMLDivElement>, 'o
747
747
  * ```
748
748
  * @group Components
749
749
  */
750
- declare const PortableTextEditable: react22.ForwardRefExoticComponent<Omit<PortableTextEditableProps, "ref"> & react22.RefAttributes<Omit<HTMLDivElement, "as" | "onPaste" | "onBeforeInput">>>;
750
+ declare const PortableTextEditable: react20.ForwardRefExoticComponent<Omit<PortableTextEditableProps, "ref"> & react20.RefAttributes<Omit<HTMLDivElement, "as" | "onPaste" | "onBeforeInput">>>;
751
751
  type DecoratedRange = BaseRange & {
752
752
  rangeDecoration: RangeDecoration;
753
753
  };
@@ -1476,7 +1476,7 @@ declare const editorMachine: xstate227.StateMachine<{
1476
1476
  initialValue?: Array<PortableTextBlock>;
1477
1477
  }, xstate227.NonReducibleUnknown, InternalPatchEvent | MutationEvent | PatchesEvent | {
1478
1478
  type: "blurred";
1479
- event: react22.FocusEvent<HTMLDivElement, Element>;
1479
+ event: react20.FocusEvent<HTMLDivElement, Element>;
1480
1480
  } | {
1481
1481
  type: "done loading";
1482
1482
  } | {
@@ -1488,7 +1488,7 @@ declare const editorMachine: xstate227.StateMachine<{
1488
1488
  data: unknown;
1489
1489
  } | {
1490
1490
  type: "focused";
1491
- event: react22.FocusEvent<HTMLDivElement, Element>;
1491
+ event: react20.FocusEvent<HTMLDivElement, Element>;
1492
1492
  } | {
1493
1493
  type: "invalid value";
1494
1494
  resolution: InvalidValueResolution | null;
@@ -2135,7 +2135,7 @@ declare const editorMachine: xstate227.StateMachine<{
2135
2135
  type: "drop";
2136
2136
  }, undefined, never, never, never, never, InternalPatchEvent | MutationEvent | PatchesEvent | {
2137
2137
  type: "blurred";
2138
- event: react22.FocusEvent<HTMLDivElement, Element>;
2138
+ event: react20.FocusEvent<HTMLDivElement, Element>;
2139
2139
  } | {
2140
2140
  type: "done loading";
2141
2141
  } | {
@@ -2147,7 +2147,7 @@ declare const editorMachine: xstate227.StateMachine<{
2147
2147
  data: unknown;
2148
2148
  } | {
2149
2149
  type: "focused";
2150
- event: react22.FocusEvent<HTMLDivElement, Element>;
2150
+ event: react20.FocusEvent<HTMLDivElement, Element>;
2151
2151
  } | {
2152
2152
  type: "invalid value";
2153
2153
  resolution: InvalidValueResolution | null;
@@ -3018,7 +3018,7 @@ declare const editorMachine: xstate227.StateMachine<{
3018
3018
  type: "drop";
3019
3019
  }, undefined, never, never, never, never, InternalPatchEvent | MutationEvent | PatchesEvent | {
3020
3020
  type: "blurred";
3021
- event: react22.FocusEvent<HTMLDivElement, Element>;
3021
+ event: react20.FocusEvent<HTMLDivElement, Element>;
3022
3022
  } | {
3023
3023
  type: "done loading";
3024
3024
  } | {
@@ -3030,7 +3030,7 @@ declare const editorMachine: xstate227.StateMachine<{
3030
3030
  data: unknown;
3031
3031
  } | {
3032
3032
  type: "focused";
3033
- event: react22.FocusEvent<HTMLDivElement, Element>;
3033
+ event: react20.FocusEvent<HTMLDivElement, Element>;
3034
3034
  } | {
3035
3035
  type: "invalid value";
3036
3036
  resolution: InvalidValueResolution | null;
@@ -1,4 +1,4 @@
1
- import { getBlockKeyFromSelectionPoint, isTextBlock, getChildKeyFromSelectionPoint, isSpan, isSpan$1, getSelectionStartPoint as getSelectionStartPoint$1, getSelectionEndPoint, sliceBlocks } from "./util.slice-blocks.js";
1
+ import { getBlockKeyFromSelectionPoint, isTextBlock, getChildKeyFromSelectionPoint, isSpan, isSpan$1, sliceBlocks, getSelectionStartPoint as getSelectionStartPoint$1, getSelectionEndPoint } from "./util.slice-blocks.js";
2
2
  import { isKeySegment } from "@sanity/types";
3
3
  const getFocusBlock = (snapshot) => {
4
4
  if (!snapshot.context.selection)
@@ -11,8 +11,8 @@ function mergeTextBlocks({
11
11
  context,
12
12
  block: incomingBlock,
13
13
  options: {
14
- refreshKeys: !0,
15
- validateFields: !0
14
+ refreshKeys: !1,
15
+ validateFields: !1
16
16
  }
17
17
  });
18
18
  return !parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock) ? targetBlock : {
@@ -1 +1 @@
1
- {"version":3,"file":"util.merge-text-blocks.js","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true, validateFields: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","validateFields","children","markDefs"],"mappings":";AAOO,SAASA,YACdC,SACAC,OACgC;AAChC,SAAOC,cAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,MAAMC,gBAAgB;AAAA,IAAA;AAAA,EAAI,CAClD;AAED,SAAI,CAACJ,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHO,UAAU,CAAC,GAAGP,YAAYO,UAAU,GAAGL,oBAAoBK,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIR,YAAYQ,YAAY,CAAA,GAC5B,GAAIN,oBAAoBM,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;"}
1
+ {"version":3,"file":"util.merge-text-blocks.js","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: false, validateFields: false},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","validateFields","children","markDefs"],"mappings":";AAOO,SAASA,YACdC,SACAC,OACgC;AAChC,SAAOC,cAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,MAAOC,gBAAgB;AAAA,IAAA;AAAA,EAAK,CACpD;AAED,SAAI,CAACJ,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHO,UAAU,CAAC,GAAGP,YAAYO,UAAU,GAAGL,oBAAoBK,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIR,YAAYQ,YAAY,CAAA,GAC5B,GAAIN,oBAAoBM,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;"}
package/lib/index.cjs CHANGED
@@ -1136,7 +1136,7 @@ const converterJson = {
1136
1136
  context: snapshot.context,
1137
1137
  block,
1138
1138
  options: {
1139
- refreshKeys: !0,
1139
+ refreshKeys: !1,
1140
1140
  validateFields: !1
1141
1141
  }
1142
1142
  });
@@ -1200,7 +1200,7 @@ function createConverterTextHtml(legacySchema) {
1200
1200
  block,
1201
1201
  options: {
1202
1202
  refreshKeys: !1,
1203
- validateFields: !0
1203
+ validateFields: !1
1204
1204
  }
1205
1205
  });
1206
1206
  return parsedBlock ? [parsedBlock] : [];
@@ -1248,7 +1248,7 @@ function createConverterTextPlain(legacySchema) {
1248
1248
  block,
1249
1249
  options: {
1250
1250
  refreshKeys: !1,
1251
- validateFields: !0
1251
+ validateFields: !1
1252
1252
  }
1253
1253
  });
1254
1254
  return parsedBlock ? [parsedBlock] : [];
@@ -3276,9 +3276,17 @@ const addAnnotationOperationImplementation = ({
3276
3276
  context,
3277
3277
  operation
3278
3278
  }) => {
3279
- const anchorBlockKey = util_sliceBlocks.getBlockKeyFromSelectionPoint(operation.at.anchor), focusBlockKey = util_sliceBlocks.getBlockKeyFromSelectionPoint(operation.at.focus), endBlockKey = operation.at.backward ? anchorBlockKey : focusBlockKey, endOffset = operation.at.backward ? operation.at.focus.offset : operation.at.anchor.offset;
3279
+ const anchorBlockKey = util_sliceBlocks.getBlockKeyFromSelectionPoint(operation.at.anchor), focusBlockKey = util_sliceBlocks.getBlockKeyFromSelectionPoint(operation.at.focus), startBlockKey = operation.at.backward ? focusBlockKey : anchorBlockKey, endBlockKey = operation.at.backward ? anchorBlockKey : focusBlockKey, endOffset = operation.at.backward ? operation.at.focus.offset : operation.at.anchor.offset;
3280
+ if (!startBlockKey)
3281
+ throw new Error("Failed to get start block key");
3280
3282
  if (!endBlockKey)
3281
3283
  throw new Error("Failed to get end block key");
3284
+ const startBlockIndex = operation.editor.blockIndexMap.get(startBlockKey);
3285
+ if (startBlockIndex === void 0)
3286
+ throw new Error("Failed to get start block index");
3287
+ const startBlock = operation.editor.value.at(startBlockIndex);
3288
+ if (!startBlock)
3289
+ throw new Error("Failed to get start block");
3282
3290
  const endBlockIndex = operation.editor.blockIndexMap.get(endBlockKey);
3283
3291
  if (endBlockIndex === void 0)
3284
3292
  throw new Error("Failed to get end block index");
@@ -3309,11 +3317,14 @@ const addAnnotationOperationImplementation = ({
3309
3317
  if (!range)
3310
3318
  throw new Error(`Failed to get Slate Range for selection ${JSON.stringify(operation.at)}`);
3311
3319
  const hanging = util_sliceBlocks.isTextBlock(context, endBlock) && endOffset === 0;
3312
- operation.editor.delete({
3320
+ slate.deleteText(operation.editor, {
3313
3321
  at: range,
3314
3322
  reverse: operation.direction === "backward",
3315
3323
  unit: operation.unit,
3316
3324
  hanging
3325
+ }), operation.editor.selection && util_sliceBlocks.isTextBlock(context, startBlock) && util_sliceBlocks.isTextBlock(context, endBlock) && slate.setSelection(operation.editor, {
3326
+ anchor: operation.editor.selection.focus,
3327
+ focus: operation.editor.selection.focus
3317
3328
  });
3318
3329
  }, insertInlineObjectOperationImplementation = ({
3319
3330
  context,
@@ -3405,19 +3416,19 @@ const addAnnotationOperationImplementation = ({
3405
3416
  if (!fragment)
3406
3417
  throw new Error(`Failed to convert block to Slate fragment ${JSON.stringify(parsedBlock)}`);
3407
3418
  insertBlock({
3419
+ context,
3408
3420
  block: fragment,
3409
3421
  placement: operation.placement,
3410
3422
  select: operation.select ?? "start",
3411
- editor: operation.editor,
3412
- schema: context.schema
3423
+ editor: operation.editor
3413
3424
  });
3414
3425
  };
3415
3426
  function insertBlock({
3427
+ context,
3416
3428
  block,
3417
3429
  placement,
3418
3430
  select,
3419
- editor,
3420
- schema: schema2
3431
+ editor
3421
3432
  }) {
3422
3433
  const [startBlock, startBlockPath] = getSelectionStartBlock({
3423
3434
  editor
@@ -3439,7 +3450,7 @@ function insertBlock({
3439
3450
  at: nextPath
3440
3451
  }), select === "start" ? slate.Transforms.select(editor, slate.Editor.start(editor, nextPath)) : select === "end" && slate.Transforms.select(editor, slate.Editor.end(editor, nextPath));
3441
3452
  } else {
3442
- if (lastBlock && isEqualToEmptyEditor([lastBlock], schema2)) {
3453
+ if (lastBlock && isEqualToEmptyEditor([lastBlock], context.schema)) {
3443
3454
  slate.Transforms.removeNodes(editor, {
3444
3455
  at: lastBlockPath
3445
3456
  }), slate.Transforms.insertNodes(editor, [block], {
@@ -3490,14 +3501,14 @@ function insertBlock({
3490
3501
  node: block,
3491
3502
  path: [newSelection.anchor.path[0]]
3492
3503
  }) : newSelection;
3493
- select === "none" && adjustedSelection && slate.Transforms.select(editor, adjustedSelection), focusBlock && isEqualToEmptyEditor([focusBlock], schema2) && slate.Transforms.removeNodes(editor, {
3504
+ select === "none" && adjustedSelection && slate.Transforms.select(editor, adjustedSelection), focusBlock && isEqualToEmptyEditor([focusBlock], context.schema) && slate.Transforms.removeNodes(editor, {
3494
3505
  at: focusBlockPath
3495
3506
  });
3496
3507
  return;
3497
3508
  }
3498
3509
  if (editor.isTextBlock(endBlock) && editor.isTextBlock(block)) {
3499
3510
  const selectionStartPoint = slate.Range.start(currentSelection);
3500
- if (isEqualToEmptyEditor([endBlock], schema2)) {
3511
+ if (isEqualToEmptyEditor([endBlock], context.schema)) {
3501
3512
  const currentSelection2 = editor.selection;
3502
3513
  slate.Transforms.insertNodes(editor, [block], {
3503
3514
  at: endBlockPath,
@@ -3507,17 +3518,46 @@ function insertBlock({
3507
3518
  }), select === "start" ? slate.Transforms.select(editor, selectionStartPoint) : select === "end" ? slate.Transforms.select(editor, slate.Editor.end(editor, endBlockPath)) : slate.Transforms.select(editor, currentSelection2);
3508
3519
  return;
3509
3520
  }
3510
- if (slate.Transforms.setNodes(editor, {
3511
- markDefs: [...endBlock.markDefs ?? [], ...block.markDefs ?? []]
3521
+ const endBlockChildKeys = endBlock.children.map((child) => child._key), endBlockMarkDefsKeys = endBlock.markDefs?.map((markDef) => markDef._key) ?? [], markDefKeyMap = /* @__PURE__ */ new Map(), adjustedMarkDefs = block.markDefs?.map((markDef) => {
3522
+ if (endBlockMarkDefsKeys.includes(markDef._key)) {
3523
+ const newKey = context.keyGenerator();
3524
+ return markDefKeyMap.set(markDef._key, newKey), {
3525
+ ...markDef,
3526
+ _key: newKey
3527
+ };
3528
+ }
3529
+ return markDef;
3530
+ }), adjustedChildren = block.children.map((child) => {
3531
+ if (util_sliceBlocks.isSpan(context, child)) {
3532
+ const marks = child.marks?.map((mark) => markDefKeyMap.get(mark) || mark) ?? [];
3533
+ if (!isEqual__default.default(child.marks, marks))
3534
+ return {
3535
+ ...child,
3536
+ _key: endBlockChildKeys.includes(child._key) ? context.keyGenerator() : child._key,
3537
+ marks
3538
+ };
3539
+ }
3540
+ return endBlockChildKeys.includes(child._key) ? {
3541
+ ...child,
3542
+ _key: context.keyGenerator()
3543
+ } : child;
3544
+ });
3545
+ slate.Transforms.setNodes(editor, {
3546
+ markDefs: [...endBlock.markDefs ?? [], ...adjustedMarkDefs ?? []]
3512
3547
  }, {
3513
3548
  at: endBlockPath
3514
- }), select === "end") {
3515
- slate.Transforms.insertFragment(editor, [block], {
3549
+ });
3550
+ const adjustedBlock = isEqual__default.default(block.children, adjustedChildren) ? block : {
3551
+ ...block,
3552
+ children: adjustedChildren
3553
+ };
3554
+ if (select === "end") {
3555
+ slate.Transforms.insertFragment(editor, [adjustedBlock], {
3516
3556
  voids: !0
3517
3557
  });
3518
3558
  return;
3519
3559
  }
3520
- slate.Transforms.insertFragment(editor, [block], {
3560
+ slate.Transforms.insertFragment(editor, [adjustedBlock], {
3521
3561
  at: currentSelection,
3522
3562
  voids: !0
3523
3563
  }), select === "start" ? slate.Transforms.select(editor, selectionStartPoint) : slate.Point.equals(selectionStartPoint, endBlockEndPoint) || slate.Transforms.select(editor, selectionStartPoint);
@@ -3527,9 +3567,7 @@ function insertBlock({
3527
3567
  slate.Transforms.insertNodes(editor, [block], {
3528
3568
  at: endBlockPath,
3529
3569
  select: !1
3530
- }), (select === "start" || select === "end") && slate.Transforms.select(editor, slate.Editor.start(editor, endBlockPath)), util_isSelectionCollapsed.isEmptyTextBlock({
3531
- schema: schema2
3532
- }, endBlock) && slate.Transforms.removeNodes(editor, {
3570
+ }), (select === "start" || select === "end") && slate.Transforms.select(editor, slate.Editor.start(editor, endBlockPath)), util_isSelectionCollapsed.isEmptyTextBlock(context, endBlock) && slate.Transforms.removeNodes(editor, {
3533
3571
  at: slate.Path.next(endBlockPath)
3534
3572
  });
3535
3573
  else if (slate.Range.isCollapsed(currentSelection) && slate.Point.equals(selectionEndPoint, endBlockEndPoint2)) {
@@ -4065,6 +4103,58 @@ function createWithObjectKeys(editorActor) {
4065
4103
  });
4066
4104
  return;
4067
4105
  }
4106
+ if (operation.type === "merge_node") {
4107
+ const index = operation.path[operation.path.length - 1], prevPath = slate.Path.previous(operation.path), prevIndex = prevPath[prevPath.length - 1];
4108
+ if (operation.path.length !== 1 || prevPath.length !== 1) {
4109
+ apply2(operation);
4110
+ return;
4111
+ }
4112
+ const block = editor.value.at(index), previousBlock = editor.value.at(prevIndex);
4113
+ if (!block || !previousBlock) {
4114
+ apply2(operation);
4115
+ return;
4116
+ }
4117
+ if (!util_sliceBlocks.isTextBlock(editorActor.getSnapshot().context, block) || !util_sliceBlocks.isTextBlock(editorActor.getSnapshot().context, previousBlock)) {
4118
+ apply2(operation);
4119
+ return;
4120
+ }
4121
+ const previousBlockChildKeys = previousBlock.children.map((child) => child._key), previousBlockMarkDefKeys = previousBlock.markDefs?.map((markDef) => markDef._key) ?? [], markDefKeyMap = /* @__PURE__ */ new Map(), adjustedMarkDefs = block.markDefs?.map((markDef) => {
4122
+ if (previousBlockMarkDefKeys.includes(markDef._key)) {
4123
+ const newKey = editorActor.getSnapshot().context.keyGenerator();
4124
+ return markDefKeyMap.set(markDef._key, newKey), {
4125
+ ...markDef,
4126
+ _key: newKey
4127
+ };
4128
+ }
4129
+ return markDef;
4130
+ });
4131
+ let childIndex = 0;
4132
+ for (const child of block.children) {
4133
+ if (util_sliceBlocks.isSpan(editorActor.getSnapshot().context, child)) {
4134
+ const marks = child.marks?.map((mark) => markDefKeyMap.get(mark) || mark) ?? [];
4135
+ isEqual__default.default(child.marks, marks) || slate.Transforms.setNodes(editor, {
4136
+ marks
4137
+ }, {
4138
+ at: [index, childIndex]
4139
+ });
4140
+ }
4141
+ previousBlockChildKeys.includes(child._key) && slate.Transforms.setNodes(editor, {
4142
+ _key: editorActor.getSnapshot().context.keyGenerator()
4143
+ }, {
4144
+ at: [index, childIndex]
4145
+ }), childIndex++;
4146
+ }
4147
+ apply2({
4148
+ ...operation,
4149
+ properties: {
4150
+ ...operation.properties,
4151
+ // Make sure the adjusted markDefs are carried along for the merge
4152
+ // operation
4153
+ markDefs: adjustedMarkDefs
4154
+ }
4155
+ });
4156
+ return;
4157
+ }
4068
4158
  apply2(operation);
4069
4159
  }, editor.normalizeNode = (entry) => {
4070
4160
  const [node, path] = entry;
@@ -6468,6 +6558,44 @@ const MAX_LIST_LEVEL = 10, clearListOnBackspace = behaviors_index.defineBehavior
6468
6558
  unit: event.unit,
6469
6559
  at: selection
6470
6560
  })]]
6561
+ }), behaviors_index.defineBehavior({
6562
+ on: "delete",
6563
+ guard: ({
6564
+ snapshot,
6565
+ event
6566
+ }) => {
6567
+ if (event.direction !== "backward")
6568
+ return !1;
6569
+ const previousBlock = selector_isSelectingEntireBlocks.getPreviousBlock(snapshot), focusTextBlock = selector_isSelectionExpanded.getFocusTextBlock(snapshot);
6570
+ if (!previousBlock || !focusTextBlock || !selector_isSelectingEntireBlocks.isAtTheStartOfBlock(focusTextBlock)(snapshot))
6571
+ return !1;
6572
+ const previousBlockEndPoint = util_isSelectionCollapsed.getBlockEndPoint({
6573
+ context: snapshot.context,
6574
+ block: previousBlock
6575
+ });
6576
+ return util_sliceBlocks.isTextBlock(snapshot.context, previousBlock.node) ? {
6577
+ previousBlockEndPoint,
6578
+ focusTextBlock
6579
+ } : !1;
6580
+ },
6581
+ actions: [(_, {
6582
+ previousBlockEndPoint,
6583
+ focusTextBlock
6584
+ }) => [behaviors_index.raise({
6585
+ type: "delete.block",
6586
+ at: focusTextBlock.path
6587
+ }), behaviors_index.raise({
6588
+ type: "select",
6589
+ at: {
6590
+ anchor: previousBlockEndPoint,
6591
+ focus: previousBlockEndPoint
6592
+ }
6593
+ }), behaviors_index.raise({
6594
+ type: "insert.block",
6595
+ block: focusTextBlock.node,
6596
+ placement: "auto",
6597
+ select: "start"
6598
+ })]]
6471
6599
  }), behaviors_index.defineBehavior({
6472
6600
  on: "delete.forward",
6473
6601
  guard: ({
@@ -6485,6 +6613,30 @@ const MAX_LIST_LEVEL = 10, clearListOnBackspace = behaviors_index.defineBehavior
6485
6613
  unit: event.unit,
6486
6614
  at: selection
6487
6615
  })]]
6616
+ }), behaviors_index.defineBehavior({
6617
+ on: "delete",
6618
+ guard: ({
6619
+ snapshot,
6620
+ event
6621
+ }) => {
6622
+ if (event.direction !== "forward")
6623
+ return !1;
6624
+ const nextBlock = selector_isSelectingEntireBlocks.getNextBlock(snapshot), focusTextBlock = selector_isSelectionExpanded.getFocusTextBlock(snapshot);
6625
+ return !nextBlock || !focusTextBlock || !selector_isSelectingEntireBlocks.isAtTheEndOfBlock(focusTextBlock)(snapshot) || !util_sliceBlocks.isTextBlock(snapshot.context, nextBlock.node) ? !1 : {
6626
+ nextBlock
6627
+ };
6628
+ },
6629
+ actions: [(_, {
6630
+ nextBlock
6631
+ }) => [behaviors_index.raise({
6632
+ type: "delete.block",
6633
+ at: nextBlock.path
6634
+ }), behaviors_index.raise({
6635
+ type: "insert.block",
6636
+ block: nextBlock.node,
6637
+ placement: "auto",
6638
+ select: "none"
6639
+ })]]
6488
6640
  }), behaviors_index.defineBehavior({
6489
6641
  on: "delete.block",
6490
6642
  actions: [({
@@ -6967,6 +7119,57 @@ const MAX_LIST_LEVEL = 10, clearListOnBackspace = behaviors_index.defineBehavior
6967
7119
  at: selection
6968
7120
  })]]
6969
7121
  }),
7122
+ behaviors_index.defineBehavior({
7123
+ on: "split",
7124
+ guard: ({
7125
+ snapshot
7126
+ }) => {
7127
+ const selection = snapshot.context.selection;
7128
+ if (!selection || util_isSelectionCollapsed.isSelectionCollapsed(selection))
7129
+ return !1;
7130
+ const selectionStartBlock = selector_isSelectingEntireBlocks.getSelectionStartBlock(snapshot), selectionEndBlock = selector_isSelectingEntireBlocks.getSelectionEndBlock(snapshot);
7131
+ if (!selectionStartBlock || !selectionEndBlock || selectionStartBlock.node._key === selectionEndBlock.node._key)
7132
+ return !1;
7133
+ const startPoint = util_sliceBlocks.getSelectionStartPoint(selection), startBlockEndPoint = util_isSelectionCollapsed.getBlockEndPoint({
7134
+ context: snapshot.context,
7135
+ block: selectionStartBlock
7136
+ }), endPoint = util_sliceBlocks.getSelectionEndPoint(selection), endBlockStartPoint = util_sliceBlocks.getBlockStartPoint({
7137
+ context: snapshot.context,
7138
+ block: selectionEndBlock
7139
+ }), blocksInBetween = selector_isSelectionExpanded.getSelectedValue(snapshot).filter((block) => block._key !== selectionStartBlock.node._key && block._key !== selectionEndBlock.node._key);
7140
+ return {
7141
+ startPoint,
7142
+ startBlockEndPoint,
7143
+ endPoint,
7144
+ endBlockStartPoint,
7145
+ blocksInBetween
7146
+ };
7147
+ },
7148
+ actions: [(_, {
7149
+ startPoint,
7150
+ startBlockEndPoint,
7151
+ endPoint,
7152
+ endBlockStartPoint,
7153
+ blocksInBetween
7154
+ }) => [behaviors_index.raise({
7155
+ type: "delete",
7156
+ at: {
7157
+ anchor: startPoint,
7158
+ focus: startBlockEndPoint
7159
+ }
7160
+ }), ...blocksInBetween.map((block) => behaviors_index.raise({
7161
+ type: "delete.block",
7162
+ at: [{
7163
+ _key: block._key
7164
+ }]
7165
+ })), behaviors_index.raise({
7166
+ type: "delete",
7167
+ at: {
7168
+ anchor: endBlockStartPoint,
7169
+ focus: endPoint
7170
+ }
7171
+ })]]
7172
+ }),
6970
7173
  behaviors_index.defineBehavior({
6971
7174
  on: "split",
6972
7175
  guard: ({
@@ -7013,8 +7216,8 @@ const MAX_LIST_LEVEL = 10, clearListOnBackspace = behaviors_index.defineBehavior
7013
7216
  }),
7014
7217
  context: snapshot.context,
7015
7218
  options: {
7016
- refreshKeys: !0,
7017
- validateFields: !0
7219
+ refreshKeys: !1,
7220
+ validateFields: !1
7018
7221
  }
7019
7222
  });
7020
7223
  return newTextBlock ? {
@@ -11341,8 +11544,8 @@ const debug = debugWithName("component:Editable"), PortableTextEditable = React.
11341
11544
  },
11342
11545
  blocks: result_1.insert,
11343
11546
  options: {
11344
- refreshKeys: !0,
11345
- validateFields: !0
11547
+ refreshKeys: !1,
11548
+ validateFields: !1
11346
11549
  }
11347
11550
  }),
11348
11551
  placement: "auto"