@portabletext/editor 1.19.0 → 1.21.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 (132) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +8 -68
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/selector.get-text-before.cjs +11 -39
  4. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  5. package/lib/_chunks-cjs/selector.is-selection-collapsed.cjs.map +1 -1
  6. package/lib/_chunks-cjs/util.get-block-start-point.cjs +30 -0
  7. package/lib/_chunks-cjs/util.get-block-start-point.cjs.map +1 -0
  8. package/lib/_chunks-cjs/util.is-empty-text-block.cjs +71 -0
  9. package/lib/_chunks-cjs/util.is-empty-text-block.cjs.map +1 -0
  10. package/lib/_chunks-cjs/util.is-keyed-segment.cjs +6 -0
  11. package/lib/_chunks-cjs/util.is-keyed-segment.cjs.map +1 -0
  12. package/lib/_chunks-es/behavior.core.js +7 -66
  13. package/lib/_chunks-es/behavior.core.js.map +1 -1
  14. package/lib/_chunks-es/selector.get-text-before.js +5 -31
  15. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  16. package/lib/_chunks-es/selector.is-selection-collapsed.js.map +1 -1
  17. package/lib/_chunks-es/util.get-block-start-point.js +31 -0
  18. package/lib/_chunks-es/util.get-block-start-point.js.map +1 -0
  19. package/lib/_chunks-es/util.is-empty-text-block.js +73 -0
  20. package/lib/_chunks-es/util.is-empty-text-block.js.map +1 -0
  21. package/lib/_chunks-es/util.is-keyed-segment.js +7 -0
  22. package/lib/_chunks-es/util.is-keyed-segment.js.map +1 -0
  23. package/lib/behaviors/index.cjs +7 -7
  24. package/lib/behaviors/index.cjs.map +1 -1
  25. package/lib/behaviors/index.d.cts +179 -119
  26. package/lib/behaviors/index.d.ts +179 -119
  27. package/lib/behaviors/index.js +3 -2
  28. package/lib/behaviors/index.js.map +1 -1
  29. package/lib/index.cjs +72 -177
  30. package/lib/index.cjs.map +1 -1
  31. package/lib/index.d.cts +1061 -140
  32. package/lib/index.d.ts +1061 -140
  33. package/lib/index.js +72 -177
  34. package/lib/index.js.map +1 -1
  35. package/lib/selectors/index.cjs +73 -1
  36. package/lib/selectors/index.cjs.map +1 -1
  37. package/lib/selectors/index.d.cts +14 -0
  38. package/lib/selectors/index.d.ts +14 -0
  39. package/lib/selectors/index.js +73 -0
  40. package/lib/selectors/index.js.map +1 -1
  41. package/lib/utils/index.cjs +11 -0
  42. package/lib/utils/index.cjs.map +1 -0
  43. package/lib/utils/index.d.cts +87 -0
  44. package/lib/utils/index.d.ts +87 -0
  45. package/lib/utils/index.js +13 -0
  46. package/lib/utils/index.js.map +1 -0
  47. package/package.json +18 -14
  48. package/src/behavior-actions/behavior.action-utils.insert-block.ts +1 -1
  49. package/src/behavior-actions/behavior.action.insert-block-object.ts +1 -1
  50. package/src/behavior-actions/behavior.action.insert-inline-object.ts +1 -1
  51. package/src/behavior-actions/behavior.action.text-block.set.ts +1 -1
  52. package/src/behavior-actions/behavior.action.text-block.unset.ts +1 -1
  53. package/src/behavior-actions/behavior.actions.ts +5 -5
  54. package/src/behaviors/behavior.code-editor.ts +1 -1
  55. package/src/behaviors/behavior.core.block-objects.ts +2 -2
  56. package/src/behaviors/behavior.core.decorators.ts +1 -1
  57. package/src/behaviors/behavior.core.lists.ts +2 -2
  58. package/src/behaviors/behavior.emoji-picker.ts +1 -1
  59. package/src/behaviors/behavior.links.ts +1 -1
  60. package/src/behaviors/behavior.markdown.ts +2 -2
  61. package/src/behaviors/behavior.types.ts +52 -19
  62. package/src/behaviors/index.ts +1 -0
  63. package/src/editor/Editable.tsx +12 -12
  64. package/src/editor/PortableTextEditor.tsx +2 -2
  65. package/src/editor/components/DraggableBlock.tsx +2 -2
  66. package/src/editor/components/Element.tsx +20 -26
  67. package/src/editor/components/Leaf.tsx +1 -1
  68. package/src/editor/components/Synchronizer.tsx +1 -1
  69. package/src/editor/create-editor.ts +39 -20
  70. package/src/editor/create-slate-editor.tsx +5 -2
  71. package/src/editor/editor-machine.ts +72 -18
  72. package/src/editor/get-value.ts +2 -2
  73. package/src/editor/hooks/usePortableTextEditorSelection.tsx +1 -1
  74. package/src/editor/mutation-machine.ts +2 -2
  75. package/src/editor/nodes/DefaultObject.tsx +2 -2
  76. package/src/editor/plugins/create-with-event-listeners.ts +11 -3
  77. package/src/editor/plugins/createWithEditableAPI.ts +7 -7
  78. package/src/editor/plugins/createWithHotKeys.ts +2 -2
  79. package/src/editor/plugins/createWithInsertData.ts +7 -7
  80. package/src/editor/plugins/createWithMaxBlocks.ts +2 -2
  81. package/src/editor/plugins/createWithObjectKeys.ts +2 -2
  82. package/src/editor/plugins/createWithPatches.ts +10 -10
  83. package/src/editor/plugins/createWithPlaceholderBlock.ts +3 -3
  84. package/src/editor/plugins/createWithPortableTextBlockStyle.ts +1 -1
  85. package/src/editor/plugins/createWithPortableTextMarkModel.ts +4 -4
  86. package/src/editor/plugins/createWithPortableTextSelections.ts +6 -6
  87. package/src/editor/plugins/createWithSchemaTypes.ts +1 -1
  88. package/src/editor/plugins/createWithUndoRedo.ts +5 -5
  89. package/src/editor/plugins/createWithUtils.ts +2 -2
  90. package/src/editor/plugins/with-plugins.ts +1 -1
  91. package/src/editor/sync-machine.ts +8 -5
  92. package/src/index.ts +5 -1
  93. package/src/selectors/index.ts +2 -0
  94. package/src/selectors/selector.get-selection-text.test.ts +75 -0
  95. package/src/selectors/selector.get-selection-text.ts +3 -3
  96. package/src/selectors/selector.get-text-before.ts +7 -4
  97. package/src/selectors/selector.is-point-after-selection.ts +82 -0
  98. package/src/selectors/selector.is-point-before-selection.ts +82 -0
  99. package/src/utils/_exports/index.ts +1 -0
  100. package/src/utils/index.ts +11 -0
  101. package/src/{editor/utils/utils.block-offset.test.ts → utils/util.block-offset.test.ts} +1 -1
  102. package/src/{editor/utils/utils.block-offset.ts → utils/util.block-offset.ts} +23 -7
  103. package/src/{editor/utils/utils.get-start-point.ts → utils/util.get-block-start-point.ts} +5 -2
  104. package/src/utils/util.get-text-block-text.ts +8 -0
  105. package/src/{editor/utils/utils.ts → utils/util.is-empty-text-block.ts} +4 -5
  106. package/src/{editor/utils/utils.is-keyed-segment.ts → utils/util.is-keyed-segment.ts} +3 -0
  107. package/src/{editor/utils/utils.reverse-selection.ts → utils/util.reverse-selection.ts} +4 -1
  108. package/src/editor/nodes/index.ts +0 -189
  109. /package/src/{utils → internal-utils}/__tests__/dmpToOperations.test.ts +0 -0
  110. /package/src/{utils → internal-utils}/__tests__/operationToPatches.test.ts +0 -0
  111. /package/src/{utils → internal-utils}/__tests__/patchToOperations.test.ts +0 -0
  112. /package/src/{utils → internal-utils}/__tests__/ranges.test.ts +0 -0
  113. /package/src/{utils → internal-utils}/__tests__/valueNormalization.test.tsx +0 -0
  114. /package/src/{utils → internal-utils}/__tests__/values.test.ts +0 -0
  115. /package/src/{utils → internal-utils}/applyPatch.ts +0 -0
  116. /package/src/{utils → internal-utils}/debug.ts +0 -0
  117. /package/src/{utils → internal-utils}/is-hotkey.test.ts +0 -0
  118. /package/src/{utils → internal-utils}/is-hotkey.ts +0 -0
  119. /package/src/{utils → internal-utils}/looks-like-url.test.ts +0 -0
  120. /package/src/{utils → internal-utils}/looks-like-url.ts +0 -0
  121. /package/src/{utils → internal-utils}/operationToPatches.ts +0 -0
  122. /package/src/{utils → internal-utils}/paths.ts +0 -0
  123. /package/src/{utils → internal-utils}/ranges.ts +0 -0
  124. /package/src/{utils → internal-utils}/schema.ts +0 -0
  125. /package/src/{utils → internal-utils}/selection.ts +0 -0
  126. /package/src/{utils → internal-utils}/sibling-utils.ts +0 -0
  127. /package/src/{utils → internal-utils}/validateValue.ts +0 -0
  128. /package/src/{utils → internal-utils}/values.ts +0 -0
  129. /package/src/{utils → internal-utils}/weakMaps.ts +0 -0
  130. /package/src/{utils → internal-utils}/withChanges.ts +0 -0
  131. /package/src/{utils → internal-utils}/withUndoRedo.ts +0 -0
  132. /package/src/{utils → internal-utils}/withoutPatching.ts +0 -0
package/lib/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Schema } from "@sanity/schema";
2
2
  import { defineType, defineField, isKeySegment, isPortableTextTextBlock, isPortableTextSpan as isPortableTextSpan$1, isPortableTextListBlock } from "@sanity/types";
3
3
  import startCase from "lodash.startcase";
4
- import { jsx, Fragment, jsxs } from "react/jsx-runtime";
4
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
5
5
  import { useSelector, useActorRef } from "@xstate/react";
6
6
  import isEqual from "lodash/isEqual.js";
7
7
  import noop from "lodash/noop.js";
@@ -10,7 +10,6 @@ import { Editor, Element as Element$1, Range, Point, Text, Path, Transforms, Ope
10
10
  import { useSlateStatic, ReactEditor, useSelected, withReact, Slate, useSlate, Editable } from "slate-react";
11
11
  import debug$k from "debug";
12
12
  import { c } from "react-compiler-runtime";
13
- import { styled } from "styled-components";
14
13
  import uniq from "lodash/uniq.js";
15
14
  import { Subject } from "rxjs";
16
15
  import { useEffectEvent } from "use-effect-event";
@@ -22,7 +21,8 @@ import get from "lodash/get.js";
22
21
  import isUndefined from "lodash/isUndefined.js";
23
22
  import omitBy from "lodash/omitBy.js";
24
23
  import { createGuards } from "./_chunks-es/selector.is-selection-collapsed.js";
25
- import { blockOffsetToSpanSelectionPoint, coreBehaviors, isHotkey } from "./_chunks-es/behavior.core.js";
24
+ import { blockOffsetToSpanSelectionPoint } from "./_chunks-es/util.is-empty-text-block.js";
25
+ import { coreBehaviors, isCustomBehaviorEvent, isHotkey } from "./_chunks-es/behavior.core.js";
26
26
  import getRandomValues from "get-random-values-esm";
27
27
  import { htmlToBlocks, normalizeBlock } from "@sanity/block-tools";
28
28
  function createEditorSchema(portableTextType) {
@@ -377,171 +377,19 @@ function isEqualToEmptyEditor(children, schemaTypes) {
377
377
  const IS_PROCESSING_REMOTE_CHANGES = /* @__PURE__ */ new WeakMap(), IS_DRAGGING = /* @__PURE__ */ new WeakMap(), IS_DRAGGING_BLOCK_ELEMENT = /* @__PURE__ */ new WeakMap(), IS_DRAGGING_ELEMENT_TARGET = /* @__PURE__ */ new WeakMap(), IS_DRAGGING_BLOCK_TARGET_POSITION = /* @__PURE__ */ new WeakMap(), KEY_TO_SLATE_ELEMENT = /* @__PURE__ */ new WeakMap(), KEY_TO_VALUE_ELEMENT = /* @__PURE__ */ new WeakMap(), SLATE_TO_PORTABLE_TEXT_RANGE = /* @__PURE__ */ new WeakMap(), DefaultObject = (props) => {
378
378
  const $ = c(4);
379
379
  let t0;
380
- $[0] !== props.value ? (t0 = JSON.stringify(props.value, null, 2), $[0] = props.value, $[1] = t0) : t0 = $[1];
380
+ $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = {
381
+ userSelect: "none"
382
+ }, $[0] = t0) : t0 = $[0];
381
383
  let t1;
382
- return $[2] !== t0 ? (t1 = /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("pre", { children: t0 }) }), $[2] = t0, $[3] = t1) : t1 = $[3], t1;
384
+ return $[1] !== props.value._key || $[2] !== props.value._type ? (t1 = /* @__PURE__ */ jsxs("div", { style: t0, children: [
385
+ "[",
386
+ props.value._type,
387
+ ": ",
388
+ props.value._key,
389
+ "]"
390
+ ] }), $[1] = props.value._key, $[2] = props.value._type, $[3] = t1) : t1 = $[3], t1;
383
391
  };
384
392
  DefaultObject.displayName = "DefaultObject";
385
- const DefaultBlockObject = styled.div`
386
- user-select: none;
387
- border: ${(props) => props.selected ? "1px solid blue" : "1px solid transparent"};
388
- `;
389
- styled.span`
390
- background: #999;
391
- border: ${(props) => props.selected ? "1px solid blue" : "1px solid transparent"};
392
- `;
393
- const DefaultListItem = styled.div`
394
- &.pt-list-item {
395
- width: fit-content;
396
- position: relative;
397
- display: block;
398
-
399
- /* Important 'transform' in order to force refresh the ::before and ::after rules
400
- in Webkit: https://stackoverflow.com/a/21947628/831480
401
- */
402
- transform: translateZ(0);
403
- margin-left: ${(props) => getLeftPositionForListLevel(props.listLevel)};
404
- }
405
- &.pt-list-item > .pt-list-item-inner {
406
- display: flex;
407
- margin: 0;
408
- padding: 0;
409
- &:before {
410
- justify-content: flex-start;
411
- vertical-align: top;
412
- }
413
- }
414
- &.pt-list-item-bullet > .pt-list-item-inner:before {
415
- content: '${(props) => getContentForListLevelAndStyle(props.listLevel, props.listStyle)}';
416
- font-size: 0.4375rem; /* 7px */
417
- line-height: 1.5rem; /* Same as body text */
418
- /* Optical alignment */
419
- position: relative;
420
- }
421
- }
422
- &.pt-list-item-bullet > .pt-list-item-inner {
423
- &:before {
424
- min-width: 1.5rem; /* Make sure space between bullet and text never shrinks */
425
- }
426
- }
427
- &.pt-list-item-number {
428
- counter-increment: ${(props) => getCounterIncrementForListLevel(props.listLevel)};
429
- counter-reset: ${(props) => getCounterResetForListLevel(props.listLevel)};
430
- }
431
- & + :not(.pt-list-item-number) {
432
- counter-reset: listItemNumber;
433
- }
434
- &.pt-list-item-number > .pt-list-item-inner:before {
435
- content: ${(props) => getCounterContentForListLevel(props.listLevel)};
436
- min-width: 1.5rem; /* Make sure space between number and text never shrinks */
437
- /* Optical alignment */
438
- position: relative;
439
- top: 1px;
440
- }
441
- `, DefaultListItemInner = styled.div``;
442
- function getLeftPositionForListLevel(level) {
443
- switch (Number(level)) {
444
- case 1:
445
- return "1.5em";
446
- case 2:
447
- return "3em";
448
- case 3:
449
- return "4.5em";
450
- case 4:
451
- return "6em";
452
- case 5:
453
- return "7.5em";
454
- case 6:
455
- return "9em";
456
- case 7:
457
- return "10.5em";
458
- case 8:
459
- return "12em";
460
- case 9:
461
- return "13.5em";
462
- case 10:
463
- return "15em";
464
- default:
465
- return "0em";
466
- }
467
- }
468
- const bullets = ["\u25CF", "\u25CB", "\u25A0"];
469
- function getContentForListLevelAndStyle(level, style) {
470
- const normalizedLevel = (level - 1) % 3;
471
- return style === "bullet" ? bullets[normalizedLevel] : "*";
472
- }
473
- function getCounterIncrementForListLevel(level) {
474
- switch (level) {
475
- case 1:
476
- return "listItemNumber";
477
- case 2:
478
- return "listItemAlpha";
479
- case 3:
480
- return "listItemRoman";
481
- case 4:
482
- return "listItemNumberNext";
483
- case 5:
484
- return "listItemLetterNext";
485
- case 6:
486
- return "listItemRomanNext";
487
- case 7:
488
- return "listItemNumberNextNext";
489
- case 8:
490
- return "listItemAlphaNextNext";
491
- case 9:
492
- return "listItemRomanNextNext";
493
- default:
494
- return "listItemNumberNextNextNext";
495
- }
496
- }
497
- function getCounterResetForListLevel(level) {
498
- switch (level) {
499
- case 1:
500
- return "listItemAlpha";
501
- case 2:
502
- return "listItemRoman";
503
- case 3:
504
- return "listItemNumberNext";
505
- case 4:
506
- return "listItemLetterNext";
507
- case 5:
508
- return "listItemRomanNext";
509
- case 6:
510
- return "listItemNumberNextNext";
511
- case 7:
512
- return "listItemAlphaNextNext";
513
- case 8:
514
- return "listItemRomanNextNext";
515
- case 9:
516
- return "listItemNumberNextNextNext";
517
- default:
518
- return "listItemNumberNextNextNext";
519
- }
520
- }
521
- function getCounterContentForListLevel(level) {
522
- switch (level) {
523
- case 1:
524
- return "counter(listItemNumber) '. '";
525
- case 2:
526
- return "counter(listItemAlpha, lower-alpha) '. '";
527
- case 3:
528
- return "counter(listItemRoman, lower-roman) '. '";
529
- case 4:
530
- return "counter(listItemNumberNext) '. '";
531
- case 5:
532
- return "counter(listItemLetterNext, lower-alpha) '. '";
533
- case 6:
534
- return "counter(listItemRomanNext, lower-roman) '. '";
535
- case 7:
536
- return "counter(listItemNumberNextNext) '. '";
537
- case 8:
538
- return "counter(listItemAlphaNextNext, lower-alpha) '. '";
539
- case 9:
540
- return "counter(listItemRomanNextNext, lower-roman) '. '";
541
- default:
542
- return "counter(listItemNumberNextNextNext) '. '";
543
- }
544
- }
545
393
  const debug$j = debugWithName("components:DraggableBlock"), DraggableBlock = (t0) => {
546
394
  const $ = c(51), {
547
395
  children,
@@ -747,7 +595,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
747
595
  let level;
748
596
  if (isListItem && (typeof element.level == "number" && (level = element.level), className += ` pt-list-item pt-list-item-${element.listItem} pt-list-item-level-${level || 1}`), editor.isListBlock(value) && isListItem && element.listItem) {
749
597
  const listType = schemaTypes.lists.find((item_0) => item_0.value === element.listItem);
750
- renderListItem && listType ? renderedBlock = renderListItem({
598
+ renderListItem && listType && (renderedBlock = renderListItem({
751
599
  block: value,
752
600
  children: renderedBlock,
753
601
  focused,
@@ -757,7 +605,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
757
605
  schemaType: listType,
758
606
  level: value.level || 1,
759
607
  editorElementRef: blockRef
760
- }) : renderedBlock = /* @__PURE__ */ jsx(DefaultListItem, { listStyle: value.listItem || schemaTypes.lists[0].value, listLevel: value.level || 1, children: /* @__PURE__ */ jsx(DefaultListItemInner, { children: renderedBlock }) });
608
+ }));
761
609
  }
762
610
  const renderProps = Object.defineProperty({
763
611
  children: renderedBlock,
@@ -803,10 +651,7 @@ const EMPTY_ANNOTATIONS = [], inlineBlockStyle = {
803
651
  }
804
652
  return /* @__PURE__ */ jsxs("div", { ...attributes, className, children: [
805
653
  children,
806
- /* @__PURE__ */ jsxs(DraggableBlock, { element, readOnly, blockRef, children: [
807
- renderedBlockFromProps && /* @__PURE__ */ jsx("div", { ref: blockRef, contentEditable: !1, children: renderedBlockFromProps }),
808
- !renderedBlockFromProps && /* @__PURE__ */ jsx(DefaultBlockObject, { selected, children: /* @__PURE__ */ jsx(DefaultObject, { value }) })
809
- ] })
654
+ /* @__PURE__ */ jsx(DraggableBlock, { element, readOnly, blockRef, children: /* @__PURE__ */ jsx("div", { ref: blockRef, contentEditable: !1, children: renderedBlockFromProps || /* @__PURE__ */ jsx(DefaultObject, { value }) }) })
810
655
  ] }, element._key);
811
656
  };
812
657
  Element.displayName = "Element";
@@ -2944,6 +2789,14 @@ function createWithEventListeners(editorActor, subscriptions) {
2944
2789
  });
2945
2790
  break;
2946
2791
  }
2792
+ case "custom.*": {
2793
+ editorActor.send({
2794
+ type: "custom behavior event",
2795
+ behaviorEvent: event.event,
2796
+ editor
2797
+ });
2798
+ break;
2799
+ }
2947
2800
  case "decorator.toggle": {
2948
2801
  editorActor.send({
2949
2802
  type: "behavior event",
@@ -5704,10 +5557,22 @@ const editorMachine = setup({
5704
5557
  input: {}
5705
5558
  },
5706
5559
  actions: {
5560
+ "add behavior to context": assign({
5561
+ behaviors: ({
5562
+ context,
5563
+ event
5564
+ }) => (assertEvent(event, "add behavior"), /* @__PURE__ */ new Set([...context.behaviors, event.behavior]))
5565
+ }),
5566
+ "remove behavior from context": assign({
5567
+ behaviors: ({
5568
+ context,
5569
+ event
5570
+ }) => (assertEvent(event, "remove behavior"), context.behaviors.delete(event.behavior), /* @__PURE__ */ new Set([...context.behaviors]))
5571
+ }),
5707
5572
  "assign behaviors": assign({
5708
5573
  behaviors: ({
5709
5574
  event
5710
- }) => (assertEvent(event, "update behaviors"), event.behaviors)
5575
+ }) => (assertEvent(event, "update behaviors"), new Set(event.behaviors))
5711
5576
  }),
5712
5577
  "assign schema": assign({
5713
5578
  schema: ({
@@ -5750,11 +5615,11 @@ const editorMachine = setup({
5750
5615
  event,
5751
5616
  enqueue
5752
5617
  }) => {
5753
- assertEvent(event, ["behavior event"]);
5754
- const defaultAction = event.behaviorEvent.type === "copy" || event.behaviorEvent.type === "key.down" || event.behaviorEvent.type === "key.up" || event.behaviorEvent.type === "paste" ? void 0 : {
5618
+ assertEvent(event, ["behavior event", "custom behavior event"]);
5619
+ const defaultAction = event.type === "custom behavior event" || event.behaviorEvent.type === "copy" || event.behaviorEvent.type === "key.down" || event.behaviorEvent.type === "key.up" || event.behaviorEvent.type === "paste" ? void 0 : {
5755
5620
  ...event.behaviorEvent,
5756
5621
  editor: event.editor
5757
- }, eventBehaviors = context.behaviors.filter((behavior) => behavior.on === event.behaviorEvent.type);
5622
+ }, eventBehaviors = [...context.behaviors.values()].filter((behavior) => behavior.on === event.behaviorEvent.type);
5758
5623
  if (eventBehaviors.length === 0) {
5759
5624
  if (!defaultAction)
5760
5625
  return;
@@ -5795,7 +5660,11 @@ const editorMachine = setup({
5795
5660
  Editor.withoutNormalizing(event.editor, () => {
5796
5661
  for (const actionIntend of actionIntends) {
5797
5662
  if (actionIntend.type === "raise") {
5798
- enqueue.raise({
5663
+ isCustomBehaviorEvent(actionIntend.event) ? enqueue.raise({
5664
+ type: "custom behavior event",
5665
+ behaviorEvent: actionIntend.event,
5666
+ editor: event.editor
5667
+ }) : enqueue.raise({
5799
5668
  type: "behavior event",
5800
5669
  behaviorEvent: actionIntend.event,
5801
5670
  editor: event.editor
@@ -5837,7 +5706,7 @@ const editorMachine = setup({
5837
5706
  context: ({
5838
5707
  input
5839
5708
  }) => ({
5840
- behaviors: input.behaviors ?? coreBehaviors,
5709
+ behaviors: new Set(input.behaviors ?? coreBehaviors),
5841
5710
  keyGenerator: input.keyGenerator,
5842
5711
  pendingEvents: [],
5843
5712
  schema: input.schema,
@@ -5847,6 +5716,12 @@ const editorMachine = setup({
5847
5716
  value: input.value
5848
5717
  }),
5849
5718
  on: {
5719
+ "add behavior": {
5720
+ actions: "add behavior to context"
5721
+ },
5722
+ "remove behavior": {
5723
+ actions: "remove behavior from context"
5724
+ },
5850
5725
  unset: {
5851
5726
  actions: emit(({
5852
5727
  event
@@ -5967,6 +5842,9 @@ const editorMachine = setup({
5967
5842
  "behavior event": {
5968
5843
  actions: "handle behavior event"
5969
5844
  },
5845
+ "custom behavior event": {
5846
+ actions: "handle behavior event"
5847
+ },
5970
5848
  "annotation.*": {
5971
5849
  actions: emit(({
5972
5850
  event
@@ -5977,6 +5855,14 @@ const editorMachine = setup({
5977
5855
  event
5978
5856
  }) => event)
5979
5857
  },
5858
+ "custom.*": {
5859
+ actions: emit(({
5860
+ event
5861
+ }) => ({
5862
+ type: "custom.*",
5863
+ event
5864
+ }))
5865
+ },
5980
5866
  "decorator.*": {
5981
5867
  actions: emit(({
5982
5868
  event
@@ -6172,6 +6058,15 @@ function createEditorFromActor(editorActor) {
6172
6058
  editorActorSnapshot: editorActor.getSnapshot(),
6173
6059
  slateEditorInstance: slateEditor.instance
6174
6060
  }),
6061
+ registerBehavior: (config) => (editorActor.send({
6062
+ type: "add behavior",
6063
+ behavior: config.behavior
6064
+ }), () => {
6065
+ editorActor.send({
6066
+ type: "remove behavior",
6067
+ behavior: config.behavior
6068
+ });
6069
+ }),
6175
6070
  send: (event) => {
6176
6071
  editorActor.send(event);
6177
6072
  },