@portabletext/editor 1.34.1 → 1.35.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 (131) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +57 -118
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +27 -67
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/{plugin.event-listener.cjs → editor-provider.cjs} +101 -87
  6. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -0
  7. package/lib/_chunks-cjs/selector.get-text-before.cjs +5 -7
  8. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.is-active-style.cjs +22 -36
  10. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -1
  11. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +68 -153
  12. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  13. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
  14. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  15. package/lib/_chunks-es/behavior.core.js +57 -118
  16. package/lib/_chunks-es/behavior.core.js.map +1 -1
  17. package/lib/_chunks-es/behavior.markdown.js +27 -67
  18. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  19. package/lib/_chunks-es/{plugin.event-listener.js → editor-provider.js} +102 -88
  20. package/lib/_chunks-es/editor-provider.js.map +1 -0
  21. package/lib/_chunks-es/selector.get-text-before.js +5 -7
  22. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  23. package/lib/_chunks-es/selector.is-active-style.js +22 -36
  24. package/lib/_chunks-es/selector.is-active-style.js.map +1 -1
  25. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +68 -153
  26. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  27. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
  28. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  29. package/lib/behaviors/index.cjs +18 -48
  30. package/lib/behaviors/index.cjs.map +1 -1
  31. package/lib/behaviors/index.d.cts +19392 -214
  32. package/lib/behaviors/index.d.ts +19392 -214
  33. package/lib/behaviors/index.js +18 -48
  34. package/lib/behaviors/index.js.map +1 -1
  35. package/lib/index.cjs +81 -51
  36. package/lib/index.cjs.map +1 -1
  37. package/lib/index.d.cts +334 -59
  38. package/lib/index.d.ts +334 -59
  39. package/lib/index.js +35 -4
  40. package/lib/index.js.map +1 -1
  41. package/lib/plugins/index.cjs +200 -189
  42. package/lib/plugins/index.cjs.map +1 -1
  43. package/lib/plugins/index.d.cts +344 -25
  44. package/lib/plugins/index.d.ts +344 -25
  45. package/lib/plugins/index.js +198 -187
  46. package/lib/plugins/index.js.map +1 -1
  47. package/lib/selectors/index.cjs +22 -50
  48. package/lib/selectors/index.cjs.map +1 -1
  49. package/lib/selectors/index.d.cts +19485 -174
  50. package/lib/selectors/index.d.ts +19485 -174
  51. package/lib/selectors/index.js +22 -50
  52. package/lib/selectors/index.js.map +1 -1
  53. package/lib/utils/index.cjs.map +1 -1
  54. package/lib/utils/index.d.cts +19518 -7
  55. package/lib/utils/index.d.ts +19518 -7
  56. package/lib/utils/index.js.map +1 -1
  57. package/package.json +7 -7
  58. package/src/behavior-actions/behavior.action.decorator.add.ts +1 -0
  59. package/src/behavior-actions/behavior.action.delete.text.ts +1 -0
  60. package/src/behaviors/behavior.code-editor.ts +6 -6
  61. package/src/behaviors/behavior.core.annotations.ts +5 -4
  62. package/src/behaviors/behavior.core.block-objects.ts +17 -17
  63. package/src/behaviors/behavior.core.decorators.ts +12 -8
  64. package/src/behaviors/behavior.core.insert-break.ts +27 -29
  65. package/src/behaviors/behavior.core.lists.ts +19 -19
  66. package/src/behaviors/behavior.decorator-pair.ts +201 -0
  67. package/src/behaviors/behavior.default.ts +35 -30
  68. package/src/behaviors/behavior.emoji-picker.ts +12 -12
  69. package/src/behaviors/behavior.links.ts +7 -7
  70. package/src/behaviors/behavior.markdown.ts +41 -42
  71. package/src/behaviors/behavior.types.ts +14 -17
  72. package/src/behaviors/index.ts +0 -1
  73. package/src/converters/converter.json.ts +6 -6
  74. package/src/converters/converter.portable-text.deserialize.test.ts +27 -29
  75. package/src/converters/converter.portable-text.ts +13 -7
  76. package/src/converters/converter.text-html.deserialize.test.ts +16 -18
  77. package/src/converters/converter.text-html.serialize.test.ts +56 -57
  78. package/src/converters/converter.text-html.ts +14 -10
  79. package/src/converters/converter.text-plain.test.ts +17 -17
  80. package/src/converters/converter.text-plain.ts +15 -11
  81. package/src/converters/converter.types.ts +5 -5
  82. package/src/editor/Editable.tsx +26 -0
  83. package/src/editor/editor-machine.ts +170 -142
  84. package/src/editor/editor-selector.ts +3 -0
  85. package/src/editor/editor-snapshot.ts +13 -0
  86. package/src/editor-event-listener.tsx +30 -0
  87. package/src/index.ts +3 -3
  88. package/src/internal-utils/create-test-snapshot.ts +23 -0
  89. package/src/internal-utils/get-text-to-emphasize.ts +29 -7
  90. package/src/plugins/plugin.decorator-shortcut.ts +235 -0
  91. package/src/plugins/plugin.markdown.tsx +56 -8
  92. package/src/plugins/plugin.one-line.tsx +17 -17
  93. package/src/selectors/selector.get-active-annotations.test.ts +4 -13
  94. package/src/selectors/selector.get-active-list-item.ts +4 -4
  95. package/src/selectors/selector.get-active-style.ts +6 -6
  96. package/src/selectors/selector.get-anchor-block.ts +5 -5
  97. package/src/selectors/selector.get-anchor-child.ts +5 -5
  98. package/src/selectors/selector.get-anchor-span.ts +2 -2
  99. package/src/selectors/selector.get-anchor-text-block.ts +2 -2
  100. package/src/selectors/selector.get-block-offsets.ts +8 -7
  101. package/src/selectors/selector.get-caret-word-selection.test.ts +3 -7
  102. package/src/selectors/selector.get-caret-word-selection.ts +19 -16
  103. package/src/selectors/selector.get-next-inline-object.ts +4 -4
  104. package/src/selectors/selector.get-previous-inline-object.ts +4 -4
  105. package/src/selectors/selector.get-selected-slice.ts +7 -4
  106. package/src/selectors/selector.get-selected-spans.test.ts +5 -9
  107. package/src/selectors/selector.get-selected-spans.ts +9 -9
  108. package/src/selectors/selector.get-selection-end-point.ts +5 -5
  109. package/src/selectors/selector.get-selection-start-point.ts +5 -5
  110. package/src/selectors/selector.get-selection-text.test.ts +5 -7
  111. package/src/selectors/selector.get-selection-text.ts +2 -2
  112. package/src/selectors/selector.get-selection.ts +2 -2
  113. package/src/selectors/selector.get-text-before.ts +8 -8
  114. package/src/selectors/selector.get-trimmed-selection.test.ts +3 -5
  115. package/src/selectors/selector.get-trimmed-selection.ts +15 -13
  116. package/src/selectors/selector.get-value.ts +4 -4
  117. package/src/selectors/selector.is-active-decorator.test.ts +5 -9
  118. package/src/selectors/selector.is-at-the-end-of-block.ts +6 -3
  119. package/src/selectors/selector.is-at-the-start-of-block.ts +3 -3
  120. package/src/selectors/selector.is-overlapping-selection.ts +8 -6
  121. package/src/selectors/selector.is-selection-collapsed.ts +6 -5
  122. package/src/selectors/selector.is-selection-expanded.ts +2 -2
  123. package/src/selectors/selectors.ts +59 -59
  124. package/src/types/block-offset.ts +9 -0
  125. package/src/utils/index.ts +0 -1
  126. package/src/utils/util.block-offset.ts +1 -1
  127. package/src/utils/util.block-offsets-to-selection.ts +1 -1
  128. package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
  129. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +0 -1
  130. package/lib/_chunks-es/plugin.event-listener.js.map +0 -1
  131. package/src/behaviors/behavior.markdown-emphasis.ts +0 -437
@@ -1,7 +1,8 @@
1
1
  import { c } from "react-compiler-runtime";
2
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";
3
+ import { useEditor } from "../_chunks-es/editor-provider.js";
4
+ import { useEffectEvent } from "use-effect-event";
5
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
5
6
  import { createMarkdownBehaviors } from "../_chunks-es/behavior.markdown.js";
6
7
  import { useActorRef } from "@xstate/react";
7
8
  import isEqual from "lodash/isEqual.js";
@@ -12,7 +13,6 @@ import { blockOffsetsToSelection } from "../_chunks-es/util.block-offsets-to-sel
12
13
  import { childSelectionPointToBlockOffset, isTextBlock, splitTextBlock, mergeTextBlocks } from "../utils/index.js";
13
14
  import { getBlockTextBefore } from "../_chunks-es/selector.get-text-before.js";
14
15
  import { defineBehavior, raise } from "../_chunks-es/behavior.core.js";
15
- import { jsx } from "react/jsx-runtime";
16
16
  function BehaviorPlugin(props) {
17
17
  const $ = c(4), editor = useEditor();
18
18
  let t0, t1;
@@ -28,120 +28,91 @@ function BehaviorPlugin(props) {
28
28
  function _temp(unregister) {
29
29
  return unregister();
30
30
  }
31
+ function EventListenerPlugin(props) {
32
+ const $ = c(5), editor = useEditor(), on = useEffectEvent(props.on);
33
+ let t0;
34
+ $[0] !== editor || $[1] !== on ? (t0 = () => {
35
+ const subscription = editor.on("*", on);
36
+ return () => {
37
+ subscription.unsubscribe();
38
+ };
39
+ }, $[0] = editor, $[1] = on, $[2] = t0) : t0 = $[2];
40
+ let t1;
41
+ return $[3] !== editor ? (t1 = [editor], $[3] = editor, $[4] = t1) : t1 = $[4], useEffect(t0, t1), null;
42
+ }
31
43
  const EditorRefPlugin = React.forwardRef((_, ref) => {
32
44
  const $ = c(2), editor = useEditor(), portableTextEditorRef = React.useRef(editor);
33
45
  let t0, t1;
34
46
  return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = () => portableTextEditorRef.current, t1 = [], $[0] = t0, $[1] = t1) : (t0 = $[0], t1 = $[1]), React.useImperativeHandle(ref, t0, t1), null;
35
47
  });
36
48
  EditorRefPlugin.displayName = "EditorRefPlugin";
37
- const asteriskPairRegex = "(?<!\\*)\\*(?!\\s)([^*\\n]+?)(?<!\\s)\\*(?!\\*)", underscorePairRegex = "(?<!_)_(?!\\s)([^_\\n]+?)(?<!\\s)_(?!_)", italicRegex = new RegExp(`(${asteriskPairRegex}|${underscorePairRegex})$`), doubleAsteriskPairRegex = "(?<!\\*)\\*\\*(?!\\s)([^*\\n]+?)(?<!\\s)\\*\\*(?!\\*)", doubleUnderscorePairRegex = "(?<!_)__(?!\\s)([^_\\n]+?)(?<!\\s)__(?!_)", boldRegex = new RegExp(`(${doubleAsteriskPairRegex}|${doubleUnderscorePairRegex})$`);
38
- function getTextToItalic(text) {
39
- return text.match(italicRegex)?.at(0);
40
- }
41
- function getTextToBold(text) {
42
- return text.match(boldRegex)?.at(0);
43
- }
44
- function useMarkdownEmphasisBehaviors(props) {
45
- const $ = c(10), editor = useEditor();
46
- let t0;
47
- $[0] !== editor || $[1] !== props.config ? (t0 = props.config.boldDecorator?.({
48
- schema: editor.getSnapshot().context.schema
49
- }), $[0] = editor, $[1] = props.config, $[2] = t0) : t0 = $[2];
50
- let t1;
51
- $[3] !== editor || $[4] !== props.config ? (t1 = props.config.italicDecorator?.({
52
- schema: editor.getSnapshot().context.schema
53
- }), $[3] = editor, $[4] = props.config, $[5] = t1) : t1 = $[5];
54
- let t2;
55
- $[6] !== editor || $[7] !== t0 || $[8] !== t1 ? (t2 = {
56
- input: {
57
- editor,
58
- boldDecorator: t0,
59
- italicDecorator: t1
60
- }
61
- }, $[6] = editor, $[7] = t0, $[8] = t1, $[9] = t2) : t2 = $[9], useActorRef(emphasisMachine, t2);
49
+ function createPairRegex(char, amount) {
50
+ const prePrefix = `(?<!\\${char})`, prefix = `\\${char}`.repeat(Math.max(amount, 1)), postPrefix = "(?!\\s)", content = `([^${char}\\n]+?)`, preSuffix = "(?<!\\s)", suffix = `\\${char}`.repeat(Math.max(amount, 1)), postSuffix = `(?!\\${char})`;
51
+ return `${prePrefix}${prefix}${postPrefix}${content}${preSuffix}${suffix}${postSuffix}`;
62
52
  }
63
- const emphasisListener = ({
64
- sendBack,
65
- input
66
- }) => input.editor.registerBehavior({
67
- behavior: defineBehavior({
53
+ function createDecoratorPairBehavior(config) {
54
+ config.pair.amount < 1 && console.warn("The amount of characters in the pair should be greater than 0");
55
+ const pairRegex = createPairRegex(config.pair.char, config.pair.amount), regEx = new RegExp(`(${pairRegex})$`);
56
+ return defineBehavior({
68
57
  on: "insert.text",
69
58
  guard: ({
70
- context,
59
+ snapshot,
71
60
  event
72
61
  }) => {
73
- const boldDecorator = input.boldDecorator, italicDecorator = input.italicDecorator;
74
- if (boldDecorator === void 0 && italicDecorator === void 0)
62
+ if (config.pair.amount < 1)
63
+ return !1;
64
+ const decorator = config.decorator({
65
+ schema: snapshot.context.schema
66
+ });
67
+ if (decorator === void 0)
75
68
  return !1;
76
- const focusTextBlock = getFocusTextBlock({
77
- context
78
- }), selectionStartPoint = getSelectionStartPoint({
79
- context
80
- }), selectionStartOffset = selectionStartPoint ? spanSelectionPointToBlockOffset({
81
- value: context.value,
69
+ const focusTextBlock = getFocusTextBlock(snapshot), selectionStartPoint = getSelectionStartPoint(snapshot), selectionStartOffset = selectionStartPoint ? spanSelectionPointToBlockOffset({
70
+ value: snapshot.context.value,
82
71
  selectionPoint: selectionStartPoint
83
72
  }) : void 0;
84
73
  if (!focusTextBlock || !selectionStartOffset)
85
74
  return !1;
86
- const textBefore = getBlockTextBefore({
87
- context
88
- }), textToItalic = getTextToItalic(`${textBefore}${event.text}`);
89
- if (textToItalic !== void 0 && italicDecorator !== void 0) {
90
- const prefixOffsets = {
91
- anchor: {
92
- path: focusTextBlock.path,
93
- // Example: "foo *bar*".length - "*bar*".length = 4
94
- offset: `${textBefore}${event.text}`.length - textToItalic.length
95
- },
96
- focus: {
97
- path: focusTextBlock.path,
98
- // Example: "foo *bar*".length - "*bar*".length + 1 = 5
99
- offset: `${textBefore}${event.text}`.length - textToItalic.length + 1
100
- }
101
- }, suffixOffsets = {
102
- anchor: {
103
- path: focusTextBlock.path,
104
- // Example: "foo *bar|" (8) + "*".length - 1 = 8
105
- offset: selectionStartOffset.offset + event.text.length - 1
106
- },
107
- focus: {
108
- path: focusTextBlock.path,
109
- // Example: "foo *bar|" (8) + "*".length = 9
110
- offset: selectionStartOffset.offset + event.text.length
111
- }
112
- };
113
- return {
114
- prefixOffsets,
115
- suffixOffsets,
116
- decorator: italicDecorator
117
- };
118
- }
119
- const textToBold = getTextToBold(`${textBefore}${event.text}`);
120
- if (textToBold !== void 0 && boldDecorator !== void 0) {
121
- const prefixOffsets = {
122
- anchor: {
123
- path: focusTextBlock.path,
124
- // Example: "foo **bar**".length - "**bar**".length = 4
125
- offset: `${textBefore}${event.text}`.length - textToBold.length
126
- },
127
- focus: {
128
- path: focusTextBlock.path,
129
- // Example: "foo **bar**".length - "**bar**".length + 2 = 6
130
- offset: `${textBefore}${event.text}`.length - textToBold.length + 2
131
- }
132
- }, prefixSelection = blockOffsetsToSelection({
133
- value: context.value,
75
+ const newText = `${getBlockTextBefore(snapshot)}${event.text}`, textToDecorate = newText.match(regEx)?.at(0);
76
+ if (textToDecorate === void 0)
77
+ return !1;
78
+ const prefixOffsets = {
79
+ anchor: {
80
+ path: focusTextBlock.path,
81
+ // Example: "foo **bar**".length - "**bar**".length = 4
82
+ offset: newText.length - textToDecorate.length
83
+ },
84
+ focus: {
85
+ path: focusTextBlock.path,
86
+ // Example: "foo **bar**".length - "**bar**".length + "*".length * 2 = 6
87
+ offset: newText.length - textToDecorate.length + config.pair.char.length * config.pair.amount
88
+ }
89
+ }, suffixOffsets = {
90
+ anchor: {
91
+ path: focusTextBlock.path,
92
+ // Example: "foo **bar*|" (10) + "*".length - 2 = 9
93
+ offset: selectionStartOffset.offset + event.text.length - config.pair.char.length * config.pair.amount
94
+ },
95
+ focus: {
96
+ path: focusTextBlock.path,
97
+ // Example: "foo **bar*|" (10) + "*".length = 11
98
+ offset: selectionStartOffset.offset + event.text.length
99
+ }
100
+ };
101
+ if (prefixOffsets.focus.offset - prefixOffsets.anchor.offset > 1) {
102
+ const prefixSelection = blockOffsetsToSelection({
103
+ value: snapshot.context.value,
134
104
  offsets: prefixOffsets
135
105
  }), inlineObjectBeforePrefixFocus = getPreviousInlineObject({
106
+ ...snapshot,
136
107
  context: {
137
- ...context,
108
+ ...snapshot.context,
138
109
  selection: prefixSelection ? {
139
110
  anchor: prefixSelection.focus,
140
111
  focus: prefixSelection.focus
141
112
  } : null
142
113
  }
143
114
  }), inlineObjectBeforePrefixFocusOffset = inlineObjectBeforePrefixFocus ? childSelectionPointToBlockOffset({
144
- value: context.value,
115
+ value: snapshot.context.value,
145
116
  selectionPoint: {
146
117
  path: inlineObjectBeforePrefixFocus.path,
147
118
  offset: 0
@@ -149,68 +120,95 @@ const emphasisListener = ({
149
120
  }) : void 0;
150
121
  if (inlineObjectBeforePrefixFocusOffset && inlineObjectBeforePrefixFocusOffset.offset > prefixOffsets.anchor.offset && inlineObjectBeforePrefixFocusOffset.offset < prefixOffsets.focus.offset)
151
122
  return !1;
152
- const suffixOffsets = {
153
- anchor: {
154
- path: focusTextBlock.path,
155
- // Example: "foo **bar*|" (10) + "*".length - 2 = 9
156
- offset: selectionStartOffset.offset + event.text.length - 2
157
- },
158
- focus: {
159
- path: focusTextBlock.path,
160
- // Example: "foo **bar*|" (10) + "*".length = 11
161
- offset: selectionStartOffset.offset + event.text.length
162
- }
163
- }, previousInlineObject = getPreviousInlineObject({
164
- context
165
- }), previousInlineObjectOffset = previousInlineObject ? childSelectionPointToBlockOffset({
166
- value: context.value,
123
+ }
124
+ if (suffixOffsets.focus.offset - suffixOffsets.anchor.offset > 1) {
125
+ const previousInlineObject = getPreviousInlineObject(snapshot), previousInlineObjectOffset = previousInlineObject ? childSelectionPointToBlockOffset({
126
+ value: snapshot.context.value,
167
127
  selectionPoint: {
168
128
  path: previousInlineObject.path,
169
129
  offset: 0
170
130
  }
171
131
  }) : void 0;
172
- return previousInlineObjectOffset && previousInlineObjectOffset.offset > suffixOffsets.anchor.offset && previousInlineObjectOffset.offset < suffixOffsets.focus.offset ? !1 : {
173
- prefixOffsets,
174
- suffixOffsets,
175
- decorator: boldDecorator
176
- };
132
+ if (previousInlineObjectOffset && previousInlineObjectOffset.offset > suffixOffsets.anchor.offset && previousInlineObjectOffset.offset < suffixOffsets.focus.offset)
133
+ return !1;
177
134
  }
178
- return !1;
135
+ return {
136
+ prefixOffsets,
137
+ suffixOffsets,
138
+ decorator
139
+ };
179
140
  },
180
- actions: [({
181
- event
182
- }) => [event], (_, {
183
- prefixOffsets,
184
- suffixOffsets,
185
- decorator
186
- }) => [{
187
- type: "decorator.add",
188
- decorator,
189
- offsets: {
190
- anchor: prefixOffsets.focus,
191
- focus: suffixOffsets.anchor
192
- }
193
- }, {
194
- type: "delete.text",
195
- ...suffixOffsets
196
- }, {
197
- type: "delete.text",
198
- ...prefixOffsets
199
- }, {
200
- type: "decorator.remove",
201
- decorator
202
- }, {
203
- type: "effect",
204
- effect: () => {
205
- sendBack({
206
- type: "emphasis.add",
207
- blockOffset: {
208
- ...suffixOffsets.anchor,
209
- offset: suffixOffsets.anchor.offset - (prefixOffsets.focus.offset - prefixOffsets.anchor.offset)
141
+ actions: [
142
+ // Insert the text as usual in its own undo step
143
+ ({
144
+ event
145
+ }) => [event],
146
+ (_, {
147
+ prefixOffsets,
148
+ suffixOffsets,
149
+ decorator
150
+ }) => [
151
+ // Decorate the text between the prefix and suffix
152
+ {
153
+ type: "decorator.add",
154
+ decorator,
155
+ offsets: {
156
+ anchor: prefixOffsets.focus,
157
+ focus: suffixOffsets.anchor
210
158
  }
211
- });
212
- }
213
- }]]
159
+ },
160
+ // Delete the suffix
161
+ {
162
+ type: "delete.text",
163
+ ...suffixOffsets
164
+ },
165
+ // Delete the prefix
166
+ {
167
+ type: "delete.text",
168
+ ...prefixOffsets
169
+ },
170
+ // Toggle the decorator off so the next inserted text isn't emphasized
171
+ {
172
+ type: "decorator.remove",
173
+ decorator
174
+ },
175
+ {
176
+ type: "effect",
177
+ effect: () => {
178
+ config.onDecorate({
179
+ ...suffixOffsets.anchor,
180
+ offset: suffixOffsets.anchor.offset - (prefixOffsets.focus.offset - prefixOffsets.anchor.offset)
181
+ });
182
+ }
183
+ }
184
+ ]
185
+ ]
186
+ });
187
+ }
188
+ function DecoratorShortcutPlugin(config) {
189
+ const $ = c(4), editor = useEditor();
190
+ let t0;
191
+ return $[0] !== config.decorator || $[1] !== config.pair || $[2] !== editor ? (t0 = {
192
+ input: {
193
+ editor,
194
+ decorator: config.decorator,
195
+ pair: config.pair
196
+ }
197
+ }, $[0] = config.decorator, $[1] = config.pair, $[2] = editor, $[3] = t0) : t0 = $[3], useActorRef(decoratorPairMachine, t0), null;
198
+ }
199
+ const emphasisListener = ({
200
+ sendBack,
201
+ input
202
+ }) => input.editor.registerBehavior({
203
+ behavior: createDecoratorPairBehavior({
204
+ decorator: input.decorator,
205
+ pair: input.pair,
206
+ onDecorate: (offset) => {
207
+ sendBack({
208
+ type: "emphasis.add",
209
+ blockOffset: offset
210
+ });
211
+ }
214
212
  })
215
213
  }), selectionListenerCallback = ({
216
214
  sendBack,
@@ -219,7 +217,7 @@ const emphasisListener = ({
219
217
  behavior: defineBehavior({
220
218
  on: "select",
221
219
  guard: ({
222
- context,
220
+ snapshot,
223
221
  event
224
222
  }) => {
225
223
  if (!event.selection)
@@ -227,10 +225,10 @@ const emphasisListener = ({
227
225
  blockOffsets: void 0
228
226
  };
229
227
  const anchor = spanSelectionPointToBlockOffset({
230
- value: context.value,
228
+ value: snapshot.context.value,
231
229
  selectionPoint: event.selection.anchor
232
230
  }), focus = spanSelectionPointToBlockOffset({
233
- value: context.value,
231
+ value: snapshot.context.value,
234
232
  selectionPoint: event.selection.focus
235
233
  });
236
234
  return !anchor || !focus ? {
@@ -271,7 +269,7 @@ const emphasisListener = ({
271
269
  }
272
270
  }]]
273
271
  })
274
- }), emphasisMachine = setup({
272
+ }), decoratorPairMachine = setup({
275
273
  types: {
276
274
  context: {},
277
275
  input: {},
@@ -283,13 +281,13 @@ const emphasisListener = ({
283
281
  "selection listener": fromCallback(selectionListenerCallback)
284
282
  }
285
283
  }).createMachine({
286
- id: "emphasis",
284
+ id: "decorator pair",
287
285
  context: ({
288
286
  input
289
287
  }) => ({
290
- boldDecorator: input.boldDecorator,
291
- italicDecorator: input.italicDecorator,
292
- editor: input.editor
288
+ decorator: input.decorator,
289
+ editor: input.editor,
290
+ pair: input.pair
293
291
  }),
294
292
  initial: "idle",
295
293
  states: {
@@ -299,9 +297,9 @@ const emphasisListener = ({
299
297
  input: ({
300
298
  context
301
299
  }) => ({
300
+ decorator: context.decorator,
302
301
  editor: context.editor,
303
- boldDecorator: context.boldDecorator,
304
- italicDecorator: context.italicDecorator
302
+ pair: context.pair
305
303
  })
306
304
  }],
307
305
  on: {
@@ -354,9 +352,7 @@ const emphasisListener = ({
354
352
  });
355
353
  function MarkdownPlugin(props) {
356
354
  const editor = useEditor();
357
- return useMarkdownEmphasisBehaviors({
358
- config: props.config
359
- }), useEffect(() => {
355
+ return useEffect(() => {
360
356
  const unregisterBehaviors = createMarkdownBehaviors(props.config).map((behavior) => editor.registerBehavior({
361
357
  behavior
362
358
  }));
@@ -364,7 +360,36 @@ function MarkdownPlugin(props) {
364
360
  for (const unregisterBehavior of unregisterBehaviors)
365
361
  unregisterBehavior();
366
362
  };
367
- }, [editor, props.config]), null;
363
+ }, [editor, props.config]), /* @__PURE__ */ jsxs(Fragment, { children: [
364
+ props.config.boldDecorator ? /* @__PURE__ */ jsxs(Fragment, { children: [
365
+ /* @__PURE__ */ jsx(DecoratorShortcutPlugin, { decorator: props.config.boldDecorator, pair: {
366
+ char: "*",
367
+ amount: 2
368
+ } }),
369
+ /* @__PURE__ */ jsx(DecoratorShortcutPlugin, { decorator: props.config.boldDecorator, pair: {
370
+ char: "_",
371
+ amount: 2
372
+ } })
373
+ ] }) : null,
374
+ props.config.codeDecorator ? /* @__PURE__ */ jsx(DecoratorShortcutPlugin, { decorator: props.config.codeDecorator, pair: {
375
+ char: "`",
376
+ amount: 1
377
+ } }) : null,
378
+ props.config.italicDecorator ? /* @__PURE__ */ jsxs(Fragment, { children: [
379
+ /* @__PURE__ */ jsx(DecoratorShortcutPlugin, { decorator: props.config.italicDecorator, pair: {
380
+ char: "*",
381
+ amount: 1
382
+ } }),
383
+ /* @__PURE__ */ jsx(DecoratorShortcutPlugin, { decorator: props.config.italicDecorator, pair: {
384
+ char: "_",
385
+ amount: 1
386
+ } })
387
+ ] }) : null,
388
+ props.config.strikeThroughDecorator ? /* @__PURE__ */ jsx(DecoratorShortcutPlugin, { decorator: props.config.strikeThroughDecorator, pair: {
389
+ char: "~",
390
+ amount: 2
391
+ } }) : null
392
+ ] });
368
393
  }
369
394
  const oneLineBehaviors = [
370
395
  /**
@@ -374,11 +399,9 @@ const oneLineBehaviors = [
374
399
  defineBehavior({
375
400
  on: "insert.break",
376
401
  guard: ({
377
- context
378
- }) => context.selection && isSelectionExpanded({
379
- context
380
- }) ? {
381
- selection: context.selection
402
+ snapshot
403
+ }) => snapshot.context.selection && isSelectionExpanded(snapshot) ? {
404
+ selection: snapshot.context.selection
382
405
  } : !1,
383
406
  actions: [(_, {
384
407
  selection
@@ -417,17 +440,11 @@ const oneLineBehaviors = [
417
440
  defineBehavior({
418
441
  on: "insert.block",
419
442
  guard: ({
420
- context,
443
+ snapshot,
421
444
  event
422
445
  }) => {
423
- const focusTextBlock = getFocusTextBlock({
424
- context
425
- }), selectionStartPoint = getSelectionStartPoint({
426
- context
427
- }), selectionEndPoint = getSelectionEndPoint({
428
- context
429
- });
430
- if (!focusTextBlock || !isTextBlock(context, event.block) || !selectionStartPoint || !selectionEndPoint)
446
+ const focusTextBlock = getFocusTextBlock(snapshot), selectionStartPoint = getSelectionStartPoint(snapshot), selectionEndPoint = getSelectionEndPoint(snapshot);
447
+ if (!focusTextBlock || !isTextBlock(snapshot.context, event.block) || !selectionStartPoint || !selectionEndPoint)
431
448
  return !1;
432
449
  const blockStartPoint = getBlockStartPoint(focusTextBlock), blockEndPoint = getBlockEndPoint(focusTextBlock), newFocus = getBlockEndPoint({
433
450
  node: event.block,
@@ -467,31 +484,25 @@ const oneLineBehaviors = [
467
484
  defineBehavior({
468
485
  on: "insert.block",
469
486
  guard: ({
470
- context,
487
+ snapshot,
471
488
  event
472
489
  }) => {
473
- const focusTextBlock = getFocusTextBlock({
474
- context
475
- }), selectionStartPoint = getSelectionStartPoint({
476
- context
477
- }), selectionEndPoint = getSelectionEndPoint({
478
- context
479
- });
480
- if (!focusTextBlock || !isTextBlock(context, event.block) || !selectionStartPoint || !selectionEndPoint)
490
+ const focusTextBlock = getFocusTextBlock(snapshot), selectionStartPoint = getSelectionStartPoint(snapshot), selectionEndPoint = getSelectionEndPoint(snapshot);
491
+ if (!focusTextBlock || !isTextBlock(snapshot.context, event.block) || !selectionStartPoint || !selectionEndPoint)
481
492
  return !1;
482
493
  const blockBeforeStartPoint = splitTextBlock({
483
- context,
494
+ context: snapshot.context,
484
495
  block: focusTextBlock.node,
485
496
  point: selectionStartPoint
486
497
  })?.before, blockAfterEndPoint = splitTextBlock({
487
- context,
498
+ context: snapshot.context,
488
499
  block: focusTextBlock.node,
489
500
  point: selectionEndPoint
490
501
  })?.after;
491
502
  if (!blockBeforeStartPoint || !blockAfterEndPoint)
492
503
  return !1;
493
504
  const targetBlock = mergeTextBlocks({
494
- context,
505
+ context: snapshot.context,
495
506
  targetBlock: blockBeforeStartPoint,
496
507
  incomingBlock: event.block
497
508
  }), newFocus = getBlockEndPoint({
@@ -500,7 +511,7 @@ const oneLineBehaviors = [
500
511
  _key: targetBlock._key
501
512
  }]
502
513
  }), mergedBlock = mergeTextBlocks({
503
- context,
514
+ context: snapshot.context,
504
515
  targetBlock,
505
516
  incomingBlock: blockAfterEndPoint
506
517
  });