@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
@@ -0,0 +1,201 @@
1
+ import {createPairRegex} from '../internal-utils/get-text-to-emphasize'
2
+ import * as selectors from '../selectors'
3
+ import type {BlockOffset} from '../types/block-offset'
4
+ import * as utils from '../utils'
5
+ import {defineBehavior} from './behavior.types'
6
+
7
+ export function createDecoratorPairBehavior(config: {
8
+ decorator: ({schema}: {schema: selectors.EditorSchema}) => string | undefined
9
+ pair: {char: string; amount: number}
10
+ onDecorate: (offset: BlockOffset) => void
11
+ }) {
12
+ if (config.pair.amount < 1) {
13
+ console.warn(
14
+ `The amount of characters in the pair should be greater than 0`,
15
+ )
16
+ }
17
+
18
+ const pairRegex = createPairRegex(config.pair.char, config.pair.amount)
19
+ const regEx = new RegExp(`(${pairRegex})$`)
20
+
21
+ return defineBehavior({
22
+ on: 'insert.text',
23
+ guard: ({snapshot, event}) => {
24
+ if (config.pair.amount < 1) {
25
+ return false
26
+ }
27
+
28
+ const decorator = config.decorator({schema: snapshot.context.schema})
29
+
30
+ if (decorator === undefined) {
31
+ return false
32
+ }
33
+
34
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
35
+ const selectionStartPoint = selectors.getSelectionStartPoint(snapshot)
36
+ const selectionStartOffset = selectionStartPoint
37
+ ? utils.spanSelectionPointToBlockOffset({
38
+ value: snapshot.context.value,
39
+ selectionPoint: selectionStartPoint,
40
+ })
41
+ : undefined
42
+
43
+ if (!focusTextBlock || !selectionStartOffset) {
44
+ return false
45
+ }
46
+
47
+ const textBefore = selectors.getBlockTextBefore(snapshot)
48
+ const newText = `${textBefore}${event.text}`
49
+ const textToDecorate = newText.match(regEx)?.at(0)
50
+
51
+ if (textToDecorate === undefined) {
52
+ return false
53
+ }
54
+
55
+ const prefixOffsets = {
56
+ anchor: {
57
+ path: focusTextBlock.path,
58
+ // Example: "foo **bar**".length - "**bar**".length = 4
59
+ offset: newText.length - textToDecorate.length,
60
+ },
61
+ focus: {
62
+ path: focusTextBlock.path,
63
+ // Example: "foo **bar**".length - "**bar**".length + "*".length * 2 = 6
64
+ offset:
65
+ newText.length -
66
+ textToDecorate.length +
67
+ config.pair.char.length * config.pair.amount,
68
+ },
69
+ }
70
+
71
+ const suffixOffsets = {
72
+ anchor: {
73
+ path: focusTextBlock.path,
74
+ // Example: "foo **bar*|" (10) + "*".length - 2 = 9
75
+ offset:
76
+ selectionStartOffset.offset +
77
+ event.text.length -
78
+ config.pair.char.length * config.pair.amount,
79
+ },
80
+ focus: {
81
+ path: focusTextBlock.path,
82
+ // Example: "foo **bar*|" (10) + "*".length = 11
83
+ offset: selectionStartOffset.offset + event.text.length,
84
+ },
85
+ }
86
+
87
+ // If the prefix is more than one character, then we need to check if
88
+ // there is an inline object inside it
89
+ if (prefixOffsets.focus.offset - prefixOffsets.anchor.offset > 1) {
90
+ const prefixSelection = utils.blockOffsetsToSelection({
91
+ value: snapshot.context.value,
92
+ offsets: prefixOffsets,
93
+ })
94
+ const inlineObjectBeforePrefixFocus = selectors.getPreviousInlineObject(
95
+ {
96
+ ...snapshot,
97
+ context: {
98
+ ...snapshot.context,
99
+ selection: prefixSelection
100
+ ? {
101
+ anchor: prefixSelection.focus,
102
+ focus: prefixSelection.focus,
103
+ }
104
+ : null,
105
+ },
106
+ },
107
+ )
108
+ const inlineObjectBeforePrefixFocusOffset =
109
+ inlineObjectBeforePrefixFocus
110
+ ? utils.childSelectionPointToBlockOffset({
111
+ value: snapshot.context.value,
112
+ selectionPoint: {
113
+ path: inlineObjectBeforePrefixFocus.path,
114
+ offset: 0,
115
+ },
116
+ })
117
+ : undefined
118
+
119
+ if (
120
+ inlineObjectBeforePrefixFocusOffset &&
121
+ inlineObjectBeforePrefixFocusOffset.offset >
122
+ prefixOffsets.anchor.offset &&
123
+ inlineObjectBeforePrefixFocusOffset.offset <
124
+ prefixOffsets.focus.offset
125
+ ) {
126
+ return false
127
+ }
128
+ }
129
+
130
+ // If the suffix is more than one character, then we need to check if
131
+ // there is an inline object inside it
132
+ if (suffixOffsets.focus.offset - suffixOffsets.anchor.offset > 1) {
133
+ const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
134
+ const previousInlineObjectOffset = previousInlineObject
135
+ ? utils.childSelectionPointToBlockOffset({
136
+ value: snapshot.context.value,
137
+ selectionPoint: {
138
+ path: previousInlineObject.path,
139
+ offset: 0,
140
+ },
141
+ })
142
+ : undefined
143
+
144
+ if (
145
+ previousInlineObjectOffset &&
146
+ previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&
147
+ previousInlineObjectOffset.offset < suffixOffsets.focus.offset
148
+ ) {
149
+ return false
150
+ }
151
+ }
152
+
153
+ return {
154
+ prefixOffsets,
155
+ suffixOffsets,
156
+ decorator,
157
+ }
158
+ },
159
+ actions: [
160
+ // Insert the text as usual in its own undo step
161
+ ({event}) => [event],
162
+ (_, {prefixOffsets, suffixOffsets, decorator}) => [
163
+ // Decorate the text between the prefix and suffix
164
+ {
165
+ type: 'decorator.add',
166
+ decorator,
167
+ offsets: {
168
+ anchor: prefixOffsets.focus,
169
+ focus: suffixOffsets.anchor,
170
+ },
171
+ },
172
+ // Delete the suffix
173
+ {
174
+ type: 'delete.text',
175
+ ...suffixOffsets,
176
+ },
177
+ // Delete the prefix
178
+ {
179
+ type: 'delete.text',
180
+ ...prefixOffsets,
181
+ },
182
+ // Toggle the decorator off so the next inserted text isn't emphasized
183
+ {
184
+ type: 'decorator.remove',
185
+ decorator,
186
+ },
187
+ {
188
+ type: 'effect',
189
+ effect: () => {
190
+ config.onDecorate({
191
+ ...suffixOffsets.anchor,
192
+ offset:
193
+ suffixOffsets.anchor.offset -
194
+ (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),
195
+ })
196
+ },
197
+ },
198
+ ],
199
+ ],
200
+ })
201
+ }
@@ -3,8 +3,8 @@ import {defineBehavior, raise} from './behavior.types'
3
3
 
4
4
  const toggleAnnotationOff = defineBehavior({
5
5
  on: 'annotation.toggle',
6
- guard: ({context, event}) =>
7
- selectors.isActiveAnnotation(event.annotation.name)({context}),
6
+ guard: ({snapshot, event}) =>
7
+ selectors.isActiveAnnotation(event.annotation.name)(snapshot),
8
8
  actions: [
9
9
  ({event}) => [
10
10
  raise({type: 'annotation.remove', annotation: event.annotation}),
@@ -14,8 +14,8 @@ const toggleAnnotationOff = defineBehavior({
14
14
 
15
15
  const toggleAnnotationOn = defineBehavior({
16
16
  on: 'annotation.toggle',
17
- guard: ({context, event}) =>
18
- !selectors.isActiveAnnotation(event.annotation.name)({context}),
17
+ guard: ({snapshot, event}) =>
18
+ !selectors.isActiveAnnotation(event.annotation.name)(snapshot),
19
19
  actions: [
20
20
  ({event}) => [
21
21
  raise({type: 'annotation.add', annotation: event.annotation}),
@@ -25,8 +25,8 @@ const toggleAnnotationOn = defineBehavior({
25
25
 
26
26
  const toggleDecoratorOff = defineBehavior({
27
27
  on: 'decorator.toggle',
28
- guard: ({context, event}) =>
29
- selectors.isActiveDecorator(event.decorator)({context}),
28
+ guard: ({snapshot, event}) =>
29
+ selectors.isActiveDecorator(event.decorator)(snapshot),
30
30
  actions: [
31
31
  ({event}) => [
32
32
  raise({type: 'decorator.remove', decorator: event.decorator}),
@@ -36,8 +36,8 @@ const toggleDecoratorOff = defineBehavior({
36
36
 
37
37
  const toggleDecoratorOn = defineBehavior({
38
38
  on: 'decorator.toggle',
39
- guard: ({context, event}) =>
40
- !selectors.isActiveDecorator(event.decorator)({context}),
39
+ guard: ({snapshot, event}) =>
40
+ !selectors.isActiveDecorator(event.decorator)(snapshot),
41
41
  actions: [
42
42
  ({event}) => [raise({type: 'decorator.add', decorator: event.decorator})],
43
43
  ],
@@ -45,8 +45,8 @@ const toggleDecoratorOn = defineBehavior({
45
45
 
46
46
  const toggleListItemOff = defineBehavior({
47
47
  on: 'list item.toggle',
48
- guard: ({context, event}) =>
49
- selectors.isActiveListItem(event.listItem)({context}),
48
+ guard: ({snapshot, event}) =>
49
+ selectors.isActiveListItem(event.listItem)(snapshot),
50
50
  actions: [
51
51
  ({event}) => [
52
52
  raise({
@@ -59,8 +59,8 @@ const toggleListItemOff = defineBehavior({
59
59
 
60
60
  const toggleListItemOn = defineBehavior({
61
61
  on: 'list item.toggle',
62
- guard: ({context, event}) =>
63
- !selectors.isActiveListItem(event.listItem)({context}),
62
+ guard: ({snapshot, event}) =>
63
+ !selectors.isActiveListItem(event.listItem)(snapshot),
64
64
  actions: [
65
65
  ({event}) => [
66
66
  raise({
@@ -73,30 +73,35 @@ const toggleListItemOn = defineBehavior({
73
73
 
74
74
  const toggleStyleOff = defineBehavior({
75
75
  on: 'style.toggle',
76
- guard: ({context, event}) => selectors.isActiveStyle(event.style)({context}),
76
+ guard: ({snapshot, event}) => selectors.isActiveStyle(event.style)(snapshot),
77
77
  actions: [({event}) => [raise({type: 'style.remove', style: event.style})]],
78
78
  })
79
79
 
80
80
  const toggleStyleOn = defineBehavior({
81
81
  on: 'style.toggle',
82
- guard: ({context, event}) => !selectors.isActiveStyle(event.style)({context}),
82
+ guard: ({snapshot, event}) => !selectors.isActiveStyle(event.style)(snapshot),
83
83
  actions: [({event}) => [raise({type: 'style.add', style: event.style})]],
84
84
  })
85
85
 
86
86
  const raiseDeserializationSuccessOrFailure = defineBehavior({
87
87
  on: 'deserialize',
88
- guard: ({context, event}) => {
89
- const deserializeEvents = context.converters.flatMap((converter) => {
90
- const data = event.dataTransfer.getData(converter.mimeType)
91
-
92
- if (!data) {
93
- return []
94
- }
95
-
96
- return [
97
- converter.deserialize({context, event: {type: 'deserialize', data}}),
98
- ]
99
- })
88
+ guard: ({snapshot, event}) => {
89
+ const deserializeEvents = snapshot.context.converters.flatMap(
90
+ (converter) => {
91
+ const data = event.dataTransfer.getData(converter.mimeType)
92
+
93
+ if (!data) {
94
+ return []
95
+ }
96
+
97
+ return [
98
+ converter.deserialize({
99
+ snapshot,
100
+ event: {type: 'deserialize', data},
101
+ }),
102
+ ]
103
+ },
104
+ )
100
105
 
101
106
  const firstSuccess = deserializeEvents.find(
102
107
  (deserializeEvent) => deserializeEvent.type === 'deserialization.success',
@@ -142,13 +147,13 @@ const raiseInsertBlocks = defineBehavior({
142
147
 
143
148
  const raiseSerializationSuccessOrFailure = defineBehavior({
144
149
  on: 'serialize',
145
- guard: ({context, event}) => {
146
- if (context.converters.length === 0) {
150
+ guard: ({snapshot, event}) => {
151
+ if (snapshot.context.converters.length === 0) {
147
152
  return false
148
153
  }
149
154
 
150
- const serializeEvents = context.converters.map((converter) =>
151
- converter.serialize({context, event}),
155
+ const serializeEvents = snapshot.context.converters.map((converter) =>
156
+ converter.serialize({snapshot, event}),
152
157
  )
153
158
 
154
159
  if (serializeEvents.length === 0) {
@@ -39,7 +39,7 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
39
39
  return [
40
40
  defineBehavior({
41
41
  on: 'insert.text',
42
- guard: ({context, event}) => {
42
+ guard: ({snapshot, event}) => {
43
43
  if (event.text === ':') {
44
44
  return false
45
45
  }
@@ -50,8 +50,8 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
50
50
  return {emojis: []}
51
51
  }
52
52
 
53
- const focusBlock = selectors.getFocusTextBlock({context})
54
- const textBefore = selectors.getBlockTextBefore({context})
53
+ const focusBlock = selectors.getFocusTextBlock(snapshot)
54
+ const textBefore = selectors.getBlockTextBefore(snapshot)
55
55
  const emojiKeyword = `${textBefore}${event.text}`.match(
56
56
  incompleteEmojiRegEx,
57
57
  )?.[1]
@@ -80,7 +80,7 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
80
80
  }),
81
81
  defineBehavior({
82
82
  on: 'insert.text',
83
- guard: ({context, event}) => {
83
+ guard: ({snapshot, event}) => {
84
84
  const isColon = event.text === ':'
85
85
 
86
86
  if (!isColon) {
@@ -94,8 +94,8 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
94
94
  ? config.parseMatch({match: matches[selectedIndex]})
95
95
  : undefined
96
96
 
97
- const focusBlock = selectors.getFocusTextBlock({context})
98
- const textBefore = selectors.getBlockTextBefore({context})
97
+ const focusBlock = selectors.getFocusTextBlock(snapshot)
98
+ const textBefore = selectors.getBlockTextBefore(snapshot)
99
99
  const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]
100
100
 
101
101
  if (!focusBlock || emojiKeyword === undefined) {
@@ -149,7 +149,7 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
149
149
  }),
150
150
  defineBehavior({
151
151
  on: 'key.down',
152
- guard: ({context, event}) => {
152
+ guard: ({snapshot, event}) => {
153
153
  const matches = emojiPickerActor.getSnapshot().context.matches
154
154
 
155
155
  if (matches.length === 0) {
@@ -177,8 +177,8 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
177
177
  return false
178
178
  }
179
179
 
180
- const focusBlock = selectors.getFocusTextBlock({context})
181
- const textBefore = selectors.getBlockTextBefore({context})
180
+ const focusBlock = selectors.getFocusTextBlock(snapshot)
181
+ const textBefore = selectors.getBlockTextBefore(snapshot)
182
182
  const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]
183
183
 
184
184
  if (!focusBlock || emojiKeyword === undefined) {
@@ -286,7 +286,7 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
286
286
  }),
287
287
  defineBehavior({
288
288
  on: 'delete.backward',
289
- guard: ({context, event}) => {
289
+ guard: ({snapshot, event}) => {
290
290
  if (event.unit !== 'character') {
291
291
  return false
292
292
  }
@@ -297,8 +297,8 @@ export function createEmojiPickerBehaviors<TEmojiMatch>(
297
297
  return false
298
298
  }
299
299
 
300
- const focusBlock = selectors.getFocusTextBlock({context})
301
- const textBefore = selectors.getBlockTextBefore({context})
300
+ const focusBlock = selectors.getFocusTextBlock(snapshot)
301
+ const textBefore = selectors.getBlockTextBefore(snapshot)
302
302
  const emojiKeyword = textBefore
303
303
  .slice(0, textBefore.length - 1)
304
304
  .match(incompleteEmojiRegEx)?.[1]
@@ -19,13 +19,13 @@ export type LinkBehaviorsConfig = {
19
19
  export function createLinkBehaviors(config: LinkBehaviorsConfig) {
20
20
  const pasteLinkOnSelection = defineBehavior({
21
21
  on: 'paste',
22
- guard: ({context, event}) => {
23
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
22
+ guard: ({snapshot, event}) => {
23
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
24
24
  const text = event.data.getData('text/plain')
25
25
  const url = looksLikeUrl(text) ? text : undefined
26
26
  const annotation =
27
27
  url !== undefined
28
- ? config.linkAnnotation?.({url, schema: context.schema})
28
+ ? config.linkAnnotation?.({url, schema: snapshot.context.schema})
29
29
  : undefined
30
30
 
31
31
  if (annotation && !selectionCollapsed) {
@@ -45,9 +45,9 @@ export function createLinkBehaviors(config: LinkBehaviorsConfig) {
45
45
  })
46
46
  const pasteLinkAtCaret = defineBehavior({
47
47
  on: 'paste',
48
- guard: ({context, event}) => {
49
- const focusSpan = selectors.getFocusSpan({context})
50
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
48
+ guard: ({snapshot, event}) => {
49
+ const focusSpan = selectors.getFocusSpan(snapshot)
50
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
51
51
 
52
52
  if (!focusSpan || !selectionCollapsed) {
53
53
  return false
@@ -57,7 +57,7 @@ export function createLinkBehaviors(config: LinkBehaviorsConfig) {
57
57
  const url = looksLikeUrl(text) ? text : undefined
58
58
  const annotation =
59
59
  url !== undefined
60
- ? config.linkAnnotation?.({url, schema: context.schema})
60
+ ? config.linkAnnotation?.({url, schema: snapshot.context.schema})
61
61
  : undefined
62
62
 
63
63
  if (url && annotation && selectionCollapsed) {