@portabletext/editor 1.48.9 → 1.48.11
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.
- package/lib/_chunks-cjs/editor-provider.cjs +879 -169
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs +2 -2
- package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs +2 -2
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +464 -19
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs +9 -1
- package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-blocks.cjs +2 -2
- package/lib/_chunks-es/editor-provider.js +773 -65
- package/lib/_chunks-es/editor-provider.js.map +1 -1
- package/lib/_chunks-es/selector.get-focus-inline-object.js +1 -1
- package/lib/_chunks-es/selector.get-text-before.js +1 -1
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +448 -3
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
- package/lib/_chunks-es/util.selection-point-to-block-offset.js +9 -1
- package/lib/_chunks-es/util.selection-point-to-block-offset.js.map +1 -1
- package/lib/_chunks-es/util.slice-blocks.js +2 -2
- package/lib/behaviors/index.cjs +27 -377
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +3696 -13915
- package/lib/behaviors/index.d.ts +3696 -13915
- package/lib/behaviors/index.js +22 -377
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +17 -17
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +3008 -394
- package/lib/index.d.ts +3008 -394
- package/lib/index.js +4 -5
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.cjs +347 -30
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +3008 -395
- package/lib/plugins/index.d.ts +3008 -395
- package/lib/plugins/index.js +324 -8
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.cjs +29 -29
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +3007 -387
- package/lib/selectors/index.d.ts +3007 -387
- package/lib/selectors/index.js +2 -3
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs +5 -5
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +3008 -389
- package/lib/utils/index.d.ts +3008 -389
- package/lib/utils/index.js +2 -3
- package/lib/utils/index.js.map +1 -1
- package/package.json +1 -1
- package/src/behaviors/behavior.emoji-picker.ts +0 -6
- package/src/behaviors/behavior.markdown.ts +0 -48
- package/src/behaviors/index.ts +0 -15
- package/src/editor/create-editor.ts +0 -3
- package/src/editor/editor-machine.ts +105 -52
- package/src/editor/sync-machine.ts +10 -4
- package/src/internal-utils/__tests__/operationToPatches.test.ts +0 -2
- package/src/internal-utils/__tests__/patchToOperations.test.ts +0 -2
- package/src/plugins/plugin.core.tsx +1 -1
- package/lib/_chunks-cjs/behavior.core.cjs +0 -700
- package/lib/_chunks-cjs/behavior.core.cjs.map +0 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +0 -321
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +0 -1
- package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs +0 -449
- package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +0 -1
- package/lib/_chunks-cjs/util.get-selection-start-point.cjs +0 -10
- package/lib/_chunks-cjs/util.get-selection-start-point.cjs.map +0 -1
- package/lib/_chunks-es/behavior.core.js +0 -703
- package/lib/_chunks-es/behavior.core.js.map +0 -1
- package/lib/_chunks-es/behavior.markdown.js +0 -325
- package/lib/_chunks-es/behavior.markdown.js.map +0 -1
- package/lib/_chunks-es/selector.is-overlapping-selection.js +0 -451
- package/lib/_chunks-es/selector.is-overlapping-selection.js.map +0 -1
- package/lib/_chunks-es/util.get-selection-start-point.js +0 -11
- package/lib/_chunks-es/util.get-selection-start-point.js.map +0 -1
- package/src/behaviors/behavior.code-editor.ts +0 -77
- package/src/behaviors/behavior.links.ts +0 -84
- package/src/internal-utils/looks-like-url.test.ts +0 -19
- package/src/internal-utils/looks-like-url.ts +0 -15
package/lib/behaviors/index.cjs
CHANGED
|
@@ -1,385 +1,35 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
snapshot,
|
|
9
|
-
event
|
|
10
|
-
}) => {
|
|
11
|
-
const isMoveUpShortcut = behavior_core.isHotkey(config.moveBlockUpShortcut, event.originEvent), firstBlock = selector_isOverlappingSelection.getFirstBlock(snapshot), selectedBlocks = selector_isOverlappingSelection.getSelectedBlocks(snapshot), blocksAbove = firstBlock?.node._key !== selectedBlocks[0]?.node._key;
|
|
12
|
-
return !isMoveUpShortcut || !blocksAbove ? !1 : {
|
|
13
|
-
paths: selectedBlocks.map((block) => block.path)
|
|
14
|
-
};
|
|
15
|
-
},
|
|
16
|
-
actions: [(_, {
|
|
17
|
-
paths
|
|
18
|
-
}) => paths.map((at) => behavior_core.raise({
|
|
19
|
-
type: "move.block up",
|
|
20
|
-
at
|
|
21
|
-
}))]
|
|
22
|
-
}), behavior_core.defineBehavior({
|
|
23
|
-
on: "keyboard.keydown",
|
|
24
|
-
guard: ({
|
|
25
|
-
snapshot,
|
|
26
|
-
event
|
|
27
|
-
}) => {
|
|
28
|
-
const isMoveDownShortcut = behavior_core.isHotkey(config.moveBlockDownShortcut, event.originEvent), lastBlock = selector_isOverlappingSelection.getLastBlock(snapshot), selectedBlocks = selector_isOverlappingSelection.getSelectedBlocks(snapshot), blocksBelow = lastBlock?.node._key !== selectedBlocks[selectedBlocks.length - 1]?.node._key;
|
|
29
|
-
return !isMoveDownShortcut || !blocksBelow ? !1 : {
|
|
30
|
-
paths: selectedBlocks.map((block) => block.path).reverse()
|
|
31
|
-
};
|
|
32
|
-
},
|
|
33
|
-
actions: [(_, {
|
|
34
|
-
paths
|
|
35
|
-
}) => paths.map((at) => behavior_core.raise({
|
|
36
|
-
type: "move.block down",
|
|
37
|
-
at
|
|
38
|
-
}))]
|
|
39
|
-
})];
|
|
3
|
+
function execute(event) {
|
|
4
|
+
return {
|
|
5
|
+
type: "execute",
|
|
6
|
+
event
|
|
7
|
+
};
|
|
40
8
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
matches: state.context.matches
|
|
47
|
-
}), config.onSelectedIndexChanged({
|
|
48
|
-
selectedIndex: state.context.selectedIndex
|
|
49
|
-
});
|
|
50
|
-
}), [behavior_core.defineBehavior({
|
|
51
|
-
on: "insert.text",
|
|
52
|
-
guard: ({
|
|
53
|
-
snapshot,
|
|
54
|
-
event
|
|
55
|
-
}) => {
|
|
56
|
-
if (event.text === ":")
|
|
57
|
-
return !1;
|
|
58
|
-
if (!emojiCharRegEx.test(event.text))
|
|
59
|
-
return {
|
|
60
|
-
emojis: []
|
|
61
|
-
};
|
|
62
|
-
const focusBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), emojiKeyword = `${selector_getTextBefore.getBlockTextBefore(snapshot)}${event.text}`.match(incompleteEmojiRegEx)?.[1];
|
|
63
|
-
return !focusBlock || emojiKeyword === void 0 ? {
|
|
64
|
-
emojis: []
|
|
65
|
-
} : {
|
|
66
|
-
emojis: config.matchEmojis({
|
|
67
|
-
keyword: emojiKeyword
|
|
68
|
-
})
|
|
69
|
-
};
|
|
70
|
-
},
|
|
71
|
-
actions: [({
|
|
72
|
-
event
|
|
73
|
-
}, params) => [{
|
|
74
|
-
type: "effect",
|
|
75
|
-
effect: () => {
|
|
76
|
-
emojiPickerActor.send({
|
|
77
|
-
type: "emojis found",
|
|
78
|
-
matches: params.emojis
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}, behavior_core.forward(event)]]
|
|
82
|
-
}), behavior_core.defineBehavior({
|
|
83
|
-
on: "insert.text",
|
|
84
|
-
guard: ({
|
|
85
|
-
snapshot,
|
|
86
|
-
event
|
|
87
|
-
}) => {
|
|
88
|
-
if (event.text !== ":")
|
|
89
|
-
return !1;
|
|
90
|
-
const matches = emojiPickerActor.getSnapshot().context.matches, selectedIndex = emojiPickerActor.getSnapshot().context.selectedIndex, emoji = matches[selectedIndex] ? config.parseMatch({
|
|
91
|
-
match: matches[selectedIndex]
|
|
92
|
-
}) : void 0, focusBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), textBefore = selector_getTextBefore.getBlockTextBefore(snapshot), emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1];
|
|
93
|
-
if (!focusBlock || emojiKeyword === void 0)
|
|
94
|
-
return !1;
|
|
95
|
-
const emojiStringLength = emojiKeyword.length + 2;
|
|
96
|
-
return emoji ? {
|
|
97
|
-
focusBlock,
|
|
98
|
-
emoji,
|
|
99
|
-
emojiStringLength,
|
|
100
|
-
textBeforeLength: textBefore.length + 1
|
|
101
|
-
} : !1;
|
|
102
|
-
},
|
|
103
|
-
actions: [() => [behavior_core.execute({
|
|
104
|
-
type: "insert.text",
|
|
105
|
-
text: ":"
|
|
106
|
-
})], (_, params) => [behavior_core.effect(() => {
|
|
107
|
-
emojiPickerActor.send({
|
|
108
|
-
type: "select"
|
|
109
|
-
});
|
|
110
|
-
}), behavior_core.execute({
|
|
111
|
-
type: "delete.text",
|
|
112
|
-
at: {
|
|
113
|
-
anchor: {
|
|
114
|
-
path: params.focusBlock.path,
|
|
115
|
-
offset: params.textBeforeLength - params.emojiStringLength
|
|
116
|
-
},
|
|
117
|
-
focus: {
|
|
118
|
-
path: params.focusBlock.path,
|
|
119
|
-
offset: params.textBeforeLength
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}), behavior_core.execute({
|
|
123
|
-
type: "insert.text",
|
|
124
|
-
text: params.emoji
|
|
125
|
-
})]]
|
|
126
|
-
}), behavior_core.defineBehavior({
|
|
127
|
-
on: "keyboard.keydown",
|
|
128
|
-
guard: ({
|
|
129
|
-
snapshot,
|
|
130
|
-
event
|
|
131
|
-
}) => {
|
|
132
|
-
const matches = emojiPickerActor.getSnapshot().context.matches;
|
|
133
|
-
if (matches.length === 0)
|
|
134
|
-
return !1;
|
|
135
|
-
if (behavior_core.isHotkey("Escape", event.originEvent))
|
|
136
|
-
return {
|
|
137
|
-
action: "reset"
|
|
138
|
-
};
|
|
139
|
-
const isEnter = behavior_core.isHotkey("Enter", event.originEvent), isTab = behavior_core.isHotkey("Tab", event.originEvent);
|
|
140
|
-
if (isEnter || isTab) {
|
|
141
|
-
const selectedIndex = emojiPickerActor.getSnapshot().context.selectedIndex, emoji = matches[selectedIndex] ? config.parseMatch({
|
|
142
|
-
match: matches[selectedIndex]
|
|
143
|
-
}) : void 0;
|
|
144
|
-
if (!emoji)
|
|
145
|
-
return !1;
|
|
146
|
-
const focusBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), textBefore = selector_getTextBefore.getBlockTextBefore(snapshot), emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1];
|
|
147
|
-
if (!focusBlock || emojiKeyword === void 0)
|
|
148
|
-
return !1;
|
|
149
|
-
const emojiStringLength = emojiKeyword.length + 1;
|
|
150
|
-
return emoji ? {
|
|
151
|
-
action: "select",
|
|
152
|
-
focusBlock,
|
|
153
|
-
emoji,
|
|
154
|
-
emojiStringLength,
|
|
155
|
-
textBeforeLength: textBefore.length
|
|
156
|
-
} : !1;
|
|
157
|
-
}
|
|
158
|
-
const isArrowDown = behavior_core.isHotkey("ArrowDown", event.originEvent), isArrowUp = behavior_core.isHotkey("ArrowUp", event.originEvent);
|
|
159
|
-
return isArrowDown && matches.length > 0 ? {
|
|
160
|
-
action: "navigate down"
|
|
161
|
-
} : isArrowUp && matches.length > 0 ? {
|
|
162
|
-
action: "navigate up"
|
|
163
|
-
} : !1;
|
|
164
|
-
},
|
|
165
|
-
actions: [(_, params) => params.action === "select" ? [behavior_core.effect(() => {
|
|
166
|
-
emojiPickerActor.send({
|
|
167
|
-
type: "select"
|
|
168
|
-
});
|
|
169
|
-
}), behavior_core.execute({
|
|
170
|
-
type: "delete.text",
|
|
171
|
-
at: {
|
|
172
|
-
anchor: {
|
|
173
|
-
path: params.focusBlock.path,
|
|
174
|
-
offset: params.textBeforeLength - params.emojiStringLength
|
|
175
|
-
},
|
|
176
|
-
focus: {
|
|
177
|
-
path: params.focusBlock.path,
|
|
178
|
-
offset: params.textBeforeLength
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}), behavior_core.execute({
|
|
182
|
-
type: "insert.text",
|
|
183
|
-
text: params.emoji
|
|
184
|
-
})] : params.action === "navigate up" ? [
|
|
185
|
-
// If we are navigating then we want to hijack the key event
|
|
186
|
-
behavior_core.effect(() => {
|
|
187
|
-
emojiPickerActor.send({
|
|
188
|
-
type: "navigate up"
|
|
189
|
-
});
|
|
190
|
-
})
|
|
191
|
-
] : params.action === "navigate down" ? [
|
|
192
|
-
// If we are navigating then we want to hijack the key event
|
|
193
|
-
behavior_core.effect(() => {
|
|
194
|
-
emojiPickerActor.send({
|
|
195
|
-
type: "navigate down"
|
|
196
|
-
});
|
|
197
|
-
})
|
|
198
|
-
] : [behavior_core.effect(() => {
|
|
199
|
-
emojiPickerActor.send({
|
|
200
|
-
type: "reset"
|
|
201
|
-
});
|
|
202
|
-
})]]
|
|
203
|
-
}), behavior_core.defineBehavior({
|
|
204
|
-
on: "delete.backward",
|
|
205
|
-
guard: ({
|
|
206
|
-
snapshot,
|
|
207
|
-
event
|
|
208
|
-
}) => {
|
|
209
|
-
if (event.unit !== "character" || emojiPickerActor.getSnapshot().context.matches.length === 0)
|
|
210
|
-
return !1;
|
|
211
|
-
const focusBlock = selector_isOverlappingSelection.getFocusTextBlock(snapshot), textBefore = selector_getTextBefore.getBlockTextBefore(snapshot), emojiKeyword = textBefore.slice(0, textBefore.length - 1).match(incompleteEmojiRegEx)?.[1];
|
|
212
|
-
return !focusBlock || emojiKeyword === void 0 ? {
|
|
213
|
-
emojis: []
|
|
214
|
-
} : {
|
|
215
|
-
emojis: config.matchEmojis({
|
|
216
|
-
keyword: emojiKeyword
|
|
217
|
-
})
|
|
218
|
-
};
|
|
219
|
-
},
|
|
220
|
-
actions: [({
|
|
221
|
-
event
|
|
222
|
-
}, params) => [{
|
|
223
|
-
type: "effect",
|
|
224
|
-
effect: () => {
|
|
225
|
-
emojiPickerActor.send({
|
|
226
|
-
type: "emojis found",
|
|
227
|
-
matches: params.emojis
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
}, behavior_core.forward(event)]]
|
|
231
|
-
})];
|
|
9
|
+
function forward(event) {
|
|
10
|
+
return {
|
|
11
|
+
type: "forward",
|
|
12
|
+
event
|
|
13
|
+
};
|
|
232
14
|
}
|
|
233
|
-
function
|
|
234
|
-
return
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
},
|
|
239
|
-
actions: {
|
|
240
|
-
"assign matches": xstate.assign({
|
|
241
|
-
matches: ({
|
|
242
|
-
event
|
|
243
|
-
}) => (xstate.assertEvent(event, "emojis found"), event.matches)
|
|
244
|
-
}),
|
|
245
|
-
"reset matches": xstate.assign({
|
|
246
|
-
matches: []
|
|
247
|
-
}),
|
|
248
|
-
"reset selected index": xstate.assign({
|
|
249
|
-
selectedIndex: 0
|
|
250
|
-
}),
|
|
251
|
-
"increment selected index": xstate.assign({
|
|
252
|
-
selectedIndex: ({
|
|
253
|
-
context
|
|
254
|
-
}) => context.selectedIndex === context.matches.length - 1 ? 0 : context.selectedIndex + 1
|
|
255
|
-
}),
|
|
256
|
-
"decrement selected index": xstate.assign({
|
|
257
|
-
selectedIndex: ({
|
|
258
|
-
context
|
|
259
|
-
}) => context.selectedIndex === 0 ? context.matches.length - 1 : context.selectedIndex - 1
|
|
260
|
-
})
|
|
261
|
-
},
|
|
262
|
-
guards: {
|
|
263
|
-
"no matches": ({
|
|
264
|
-
context
|
|
265
|
-
}) => context.matches.length === 0
|
|
266
|
-
}
|
|
267
|
-
}).createMachine({
|
|
268
|
-
id: "emoji picker",
|
|
269
|
-
context: {
|
|
270
|
-
matches: [],
|
|
271
|
-
selectedIndex: 0
|
|
272
|
-
},
|
|
273
|
-
initial: "idle",
|
|
274
|
-
states: {
|
|
275
|
-
idle: {
|
|
276
|
-
on: {
|
|
277
|
-
"emojis found": {
|
|
278
|
-
actions: "assign matches",
|
|
279
|
-
target: "showing matches"
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
},
|
|
283
|
-
"showing matches": {
|
|
284
|
-
always: {
|
|
285
|
-
guard: "no matches",
|
|
286
|
-
target: "idle"
|
|
287
|
-
},
|
|
288
|
-
exit: ["reset selected index"],
|
|
289
|
-
on: {
|
|
290
|
-
"emojis found": {
|
|
291
|
-
actions: "assign matches"
|
|
292
|
-
},
|
|
293
|
-
"navigate down": {
|
|
294
|
-
actions: "increment selected index"
|
|
295
|
-
},
|
|
296
|
-
"navigate up": {
|
|
297
|
-
actions: "decrement selected index"
|
|
298
|
-
},
|
|
299
|
-
reset: {
|
|
300
|
-
target: "idle",
|
|
301
|
-
actions: ["reset selected index", "reset matches"]
|
|
302
|
-
},
|
|
303
|
-
select: {
|
|
304
|
-
target: "idle",
|
|
305
|
-
actions: ["reset selected index", "reset matches"]
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
});
|
|
15
|
+
function raise(event) {
|
|
16
|
+
return {
|
|
17
|
+
type: "raise",
|
|
18
|
+
event
|
|
19
|
+
};
|
|
311
20
|
}
|
|
312
|
-
function
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
return !1;
|
|
318
|
-
looksLikeUrl2 = !0;
|
|
319
|
-
} catch {
|
|
320
|
-
}
|
|
321
|
-
return looksLikeUrl2;
|
|
21
|
+
function effect(effect2) {
|
|
22
|
+
return {
|
|
23
|
+
type: "effect",
|
|
24
|
+
effect: effect2
|
|
25
|
+
};
|
|
322
26
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
const pasteLinkOnSelection = behavior_core.defineBehavior({
|
|
326
|
-
on: "clipboard.paste",
|
|
327
|
-
guard: ({
|
|
328
|
-
snapshot,
|
|
329
|
-
event
|
|
330
|
-
}) => {
|
|
331
|
-
const selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot), text = event.originEvent.dataTransfer.getData("text/plain"), url = looksLikeUrl(text) ? text : void 0, annotation = url !== void 0 ? config.linkAnnotation?.({
|
|
332
|
-
url,
|
|
333
|
-
schema: snapshot.context.schema
|
|
334
|
-
}) : void 0;
|
|
335
|
-
return annotation && !selectionCollapsed ? {
|
|
336
|
-
annotation
|
|
337
|
-
} : !1;
|
|
338
|
-
},
|
|
339
|
-
actions: [(_, {
|
|
340
|
-
annotation
|
|
341
|
-
}) => [behavior_core.execute({
|
|
342
|
-
type: "annotation.add",
|
|
343
|
-
annotation
|
|
344
|
-
})]]
|
|
345
|
-
}), pasteLinkAtCaret = behavior_core.defineBehavior({
|
|
346
|
-
on: "clipboard.paste",
|
|
347
|
-
guard: ({
|
|
348
|
-
snapshot,
|
|
349
|
-
event
|
|
350
|
-
}) => {
|
|
351
|
-
const focusSpan = selector_isOverlappingSelection.getFocusSpan(snapshot), selectionCollapsed = selector_isOverlappingSelection.isSelectionCollapsed(snapshot);
|
|
352
|
-
if (!focusSpan || !selectionCollapsed)
|
|
353
|
-
return !1;
|
|
354
|
-
const text = event.originEvent.dataTransfer.getData("text/plain"), url = looksLikeUrl(text) ? text : void 0, annotation = url !== void 0 ? config.linkAnnotation?.({
|
|
355
|
-
url,
|
|
356
|
-
schema: snapshot.context.schema
|
|
357
|
-
}) : void 0;
|
|
358
|
-
return url && annotation && selectionCollapsed ? {
|
|
359
|
-
focusSpan,
|
|
360
|
-
annotation,
|
|
361
|
-
url
|
|
362
|
-
} : !1;
|
|
363
|
-
},
|
|
364
|
-
actions: [(_, {
|
|
365
|
-
annotation,
|
|
366
|
-
url
|
|
367
|
-
}) => [behavior_core.execute({
|
|
368
|
-
type: "insert.span",
|
|
369
|
-
text: url,
|
|
370
|
-
annotations: [annotation]
|
|
371
|
-
})]]
|
|
372
|
-
});
|
|
373
|
-
return [pasteLinkOnSelection, pasteLinkAtCaret];
|
|
27
|
+
function defineBehavior(behavior) {
|
|
28
|
+
return behavior;
|
|
374
29
|
}
|
|
375
|
-
exports.
|
|
376
|
-
exports.
|
|
377
|
-
exports.
|
|
378
|
-
exports.
|
|
379
|
-
exports.
|
|
380
|
-
exports.raise = behavior_core.raise;
|
|
381
|
-
exports.createMarkdownBehaviors = behavior_markdown.createMarkdownBehaviors;
|
|
382
|
-
exports.createCodeEditorBehaviors = createCodeEditorBehaviors;
|
|
383
|
-
exports.createEmojiPickerBehaviors = createEmojiPickerBehaviors;
|
|
384
|
-
exports.createLinkBehaviors = createLinkBehaviors;
|
|
30
|
+
exports.defineBehavior = defineBehavior;
|
|
31
|
+
exports.effect = effect;
|
|
32
|
+
exports.execute = execute;
|
|
33
|
+
exports.forward = forward;
|
|
34
|
+
exports.raise = raise;
|
|
385
35
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/internal-utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts"],"sourcesContent":["import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.originEvent,\n )\n const firstBlock = selectors.getFirstBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) =>\n raise({\n type: 'move.block up',\n at,\n }),\n ),\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.originEvent,\n )\n const lastBlock = selectors.getLastBlock(snapshot)\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) =>\n raise({\n type: 'move.block down',\n at,\n }),\n ),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {effect, execute, forward} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @beta\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n ({event}, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n forward(event),\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n execute({\n type: 'insert.text',\n text: ':',\n }),\n ],\n (_, params) => [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n }),\n execute({\n type: 'insert.text',\n text: params.emoji,\n }),\n ],\n ],\n }),\n defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.originEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.originEvent)\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (isEnter || isTab) {\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n effect(() => {\n emojiPickerActor.send({type: 'select'})\n }),\n execute({\n type: 'delete.text',\n at: {\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n }),\n execute({\n type: 'insert.text',\n text: params.emoji,\n }),\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event\n effect(() => {\n emojiPickerActor.send({type: 'navigate up'})\n }),\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event\n effect(() => {\n emojiPickerActor.send({type: 'navigate down'})\n }),\n ]\n }\n\n return [\n effect(() => {\n emojiPickerActor.send({type: 'reset'})\n }),\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n ({event}, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n forward(event),\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/editor-schema'\nimport {looksLikeUrl} from '../internal-utils/looks-like-url'\nimport * as selectors from '../selectors'\nimport {execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n execute({\n type: 'annotation.add',\n annotation,\n }),\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const focusSpan = selectors.getFocusSpan(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: snapshot.context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n execute({\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n }),\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","snapshot","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","originEvent","firstBlock","selectors","getFirstBlock","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","raise","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","context","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","forward","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","execute","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","dataTransfer","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/behaviors/behavior.types.action.ts","../../src/behaviors/behavior.types.behavior.ts"],"sourcesContent":["import type {EditorSnapshot} from '../editor/editor-snapshot'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {PortableTextSlateEditor} from '../types/editor'\nimport type {\n AbstractBehaviorEventType,\n CustomBehaviorEvent,\n NativeBehaviorEvent,\n SyntheticBehaviorEvent,\n} from './behavior.types.event'\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | {\n type: 'execute'\n event: SyntheticBehaviorEvent\n }\n | {\n type: 'forward'\n event: NativeBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**\n * @beta\n */\nexport function execute(\n event: SyntheticBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'execute'> {\n return {type: 'execute', event}\n}\n\n/**\n * @beta\n */\nexport function forward(\n event: NativeBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'forward'> {\n return {type: 'forward', event}\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport function effect(\n effect: () => void,\n): PickFromUnion<BehaviorAction, 'type', 'effect'> {\n return {type: 'effect', effect}\n}\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\nexport type InternalBehaviorAction = (\n | OmitFromUnion<SyntheticBehaviorEvent, 'type', AbstractBehaviorEventType>\n | {type: 'effect'; effect: () => void}\n) & {\n editor: PortableTextSlateEditor\n}\n","import type {BehaviorActionSet} from './behavior.types.action'\nimport type {\n BehaviorEvent,\n BehaviorEventTypeNamespace,\n CustomBehaviorEvent,\n ResolveBehaviorEvent,\n} from './behavior.types.event'\nimport type {BehaviorGuard} from './behavior.types.guard'\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n ResolveBehaviorEvent<TBehaviorEventType> = ResolveBehaviorEvent<TBehaviorEventType>,\n> = {\n /**\n * Editor Event that triggers this Behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the Behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of Behavior Action sets.\n * Each set represents a step in the history stack.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, snapshot}) => event.text === 'a',\n * actions: [({event, snapshot}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<\n TBehaviorEventType,\n TPayload\n > = ResolveBehaviorEvent<TBehaviorEventType, TPayload>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n"],"names":["execute","event","type","forward","raise","effect","defineBehavior","behavior"],"mappings":";;AAkCO,SAASA,QACdC,OACkD;AAC3C,SAAA;AAAA,IAACC,MAAM;AAAA,IAAWD;AAAAA,EAAK;AAChC;AAKO,SAASE,QACdF,OACkD;AAC3C,SAAA;AAAA,IAACC,MAAM;AAAA,IAAWD;AAAAA,EAAK;AAChC;AAKO,SAASG,MACdH,OACgD;AACzC,SAAA;AAAA,IAACC,MAAM;AAAA,IAASD;AAAAA,EAAK;AAC9B;AAKO,SAASI,OACdA,SACiD;AAC1C,SAAA;AAAA,IAACH,MAAM;AAAA,IAAUG,QAAAA;AAAAA,EAAM;AAChC;ACIO,SAASC,eAYdC,UACU;AACHA,SAAAA;AACT;;;;;;"}
|