@portabletext/editor 1.36.6 → 1.38.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.
- package/lib/_chunks-cjs/behavior.core.cjs +84 -49
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +1 -1
- package/lib/_chunks-cjs/editor-provider.cjs +919 -526
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
- package/lib/_chunks-cjs/{util.block-offsets-to-selection.cjs → parse-blocks.cjs} +36 -21
- package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -0
- 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-active-style.cjs → selector.is-overlapping-selection.cjs} +144 -3
- package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -0
- package/lib/_chunks-cjs/util.slice-blocks.cjs +12 -0
- package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +84 -49
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +1 -1
- package/lib/_chunks-es/editor-provider.js +911 -517
- package/lib/_chunks-es/editor-provider.js.map +1 -1
- package/lib/_chunks-es/{util.block-offsets-to-selection.js → parse-blocks.js} +37 -22
- package/lib/_chunks-es/parse-blocks.js.map +1 -0
- package/lib/_chunks-es/selector.get-text-before.js +1 -2
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/{selector.is-active-style.js → selector.is-overlapping-selection.js} +146 -5
- package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -0
- package/lib/_chunks-es/util.slice-blocks.js +12 -0
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/behaviors/index.d.cts +10535 -4689
- package/lib/behaviors/index.d.ts +10535 -4689
- package/lib/index.cjs +582 -209
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +5297 -1178
- package/lib/index.d.ts +5297 -1178
- package/lib/index.js +591 -213
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.cjs +2 -2
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +5297 -1178
- package/lib/plugins/index.d.ts +5297 -1178
- package/lib/plugins/index.js +2 -2
- package/lib/selectors/index.cjs +21 -103
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +5313 -1178
- package/lib/selectors/index.d.ts +5313 -1178
- package/lib/selectors/index.js +13 -96
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs +4 -4
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +5297 -1178
- package/lib/utils/index.d.ts +5297 -1178
- package/lib/utils/index.js +3 -4
- package/lib/utils/index.js.map +1 -1
- package/package.json +15 -14
- package/src/behavior-actions/behavior.action.blur.ts +8 -0
- package/src/behavior-actions/behavior.action.decorator.add.ts +2 -1
- package/src/behavior-actions/behavior.action.delete.backward.ts +7 -0
- package/src/behavior-actions/behavior.action.delete.block.ts +24 -0
- package/src/behavior-actions/behavior.action.delete.forward.ts +7 -0
- package/src/behavior-actions/behavior.action.delete.text.ts +2 -1
- package/src/behavior-actions/behavior.action.delete.ts +1 -3
- package/src/behavior-actions/behavior.action.deserialization.failure.ts +9 -0
- package/src/behavior-actions/behavior.action.deserialization.success.ts +16 -0
- package/src/behavior-actions/behavior.action.effect.ts +7 -0
- package/src/behavior-actions/behavior.action.focus.ts +8 -0
- package/src/behavior-actions/behavior.action.insert-blocks.ts +118 -74
- package/src/behavior-actions/behavior.action.insert-break.ts +1 -0
- package/src/behavior-actions/{behavior.action.insert-block-object.ts → behavior.action.insert.block-object.ts} +9 -14
- package/src/behavior-actions/behavior.action.insert.block.ts +247 -2
- package/src/behavior-actions/behavior.action.insert.text-block.ts +33 -0
- package/src/behavior-actions/behavior.action.insert.text.ts +7 -0
- package/src/behavior-actions/behavior.action.move.block-down.ts +48 -0
- package/src/behavior-actions/behavior.action.move.block-up.ts +53 -0
- package/src/behavior-actions/behavior.action.move.block.ts +16 -0
- package/src/behavior-actions/behavior.action.noop.ts +5 -0
- package/src/behavior-actions/behavior.action.select.next-block.ts +44 -0
- package/src/behavior-actions/behavior.action.select.previous-block.ts +48 -0
- package/src/behavior-actions/behavior.action.select.ts +15 -0
- package/src/behavior-actions/behavior.action.serialization.failure.ts +9 -0
- package/src/behavior-actions/behavior.action.serialization.success.ts +14 -0
- package/src/behavior-actions/behavior.actions.ts +54 -212
- package/src/behaviors/behavior.core.block-objects.ts +35 -6
- package/src/behaviors/behavior.core.insert-break.ts +1 -0
- package/src/behaviors/behavior.core.ts +2 -0
- package/src/behaviors/behavior.default.ts +241 -33
- package/src/behaviors/behavior.types.ts +138 -20
- package/src/converters/converter.portable-text.ts +5 -2
- package/src/converters/converter.text-html.serialize.test.ts +4 -4
- package/src/converters/converter.text-html.ts +5 -2
- package/src/converters/converter.text-plain.test.ts +6 -6
- package/src/converters/converter.text-plain.ts +5 -2
- package/src/converters/converter.types.ts +3 -3
- package/src/editor/Editable.tsx +403 -48
- package/src/editor/components/Element.tsx +133 -18
- package/src/editor/components/use-draggable.ts +34 -102
- package/src/editor/editor-machine.ts +66 -10
- package/src/editor/editor-selector.ts +2 -0
- package/src/editor/editor-snapshot.ts +17 -0
- package/src/editor/plugins/create-with-event-listeners.ts +6 -40
- package/src/internal-utils/create-test-snapshot.ts +2 -0
- package/src/internal-utils/event-position.ts +210 -0
- package/src/internal-utils/slate-utils.ts +56 -0
- package/src/internal-utils/weakMaps.ts +1 -15
- package/src/selectors/index.ts +2 -0
- package/src/selectors/selector.get-focus-inline-object.ts +21 -0
- package/src/selectors/selector.is-overlapping-selection.test.ts +171 -0
- package/src/selectors/selector.is-overlapping-selection.ts +108 -4
- package/src/selectors/selector.is-point-after-selection.ts +3 -1
- package/src/selectors/selector.is-point-before-selection.ts +3 -1
- package/src/selectors/selector.is-selecting-entire-blocks.ts +34 -0
- package/lib/_chunks-cjs/selector.is-active-style.cjs.map +0 -1
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +0 -1
- package/lib/_chunks-cjs/util.reverse-selection.cjs +0 -14
- package/lib/_chunks-cjs/util.reverse-selection.cjs.map +0 -1
- package/lib/_chunks-es/selector.is-active-style.js.map +0 -1
- package/lib/_chunks-es/util.block-offsets-to-selection.js.map +0 -1
- package/lib/_chunks-es/util.reverse-selection.js +0 -15
- package/lib/_chunks-es/util.reverse-selection.js.map +0 -1
- package/src/behavior-actions/behavior.action-utils.insert-block.ts +0 -61
- package/src/editor/__tests__/handleClick.test.tsx +0 -277
- package/src/editor/components/use-droppable.ts +0 -135
|
@@ -1,50 +1,7 @@
|
|
|
1
1
|
import { isSelectionCollapsed, getCaretWordSelection, isSelectionExpanded, getFocusBlockObject, getNextBlock, getPreviousBlock, getFocusTextBlock, isAtTheEndOfBlock, getFocusSpan, isAtTheStartOfBlock, getFocusListBlock, getSelectedBlocks, createGuards } from "./selector.is-at-the-start-of-block.js";
|
|
2
2
|
import { isPortableTextTextBlock } from "@sanity/types";
|
|
3
3
|
import { isEmptyTextBlock } from "./util.slice-blocks.js";
|
|
4
|
-
|
|
5
|
-
return event.type.startsWith("custom.");
|
|
6
|
-
}
|
|
7
|
-
function raise(event) {
|
|
8
|
-
return {
|
|
9
|
-
type: "raise",
|
|
10
|
-
event
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function defineBehavior(behavior) {
|
|
14
|
-
return behavior;
|
|
15
|
-
}
|
|
16
|
-
const addAnnotationOnCollapsedSelection = {
|
|
17
|
-
on: "annotation.add",
|
|
18
|
-
guard: ({
|
|
19
|
-
snapshot
|
|
20
|
-
}) => {
|
|
21
|
-
if (!isSelectionCollapsed(snapshot))
|
|
22
|
-
return !1;
|
|
23
|
-
const caretWordSelection = getCaretWordSelection(snapshot);
|
|
24
|
-
return !caretWordSelection || !isSelectionExpanded({
|
|
25
|
-
...snapshot,
|
|
26
|
-
context: {
|
|
27
|
-
...snapshot.context,
|
|
28
|
-
selection: caretWordSelection
|
|
29
|
-
}
|
|
30
|
-
}) ? !1 : {
|
|
31
|
-
caretWordSelection
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
actions: [({
|
|
35
|
-
event
|
|
36
|
-
}, {
|
|
37
|
-
caretWordSelection
|
|
38
|
-
}) => [raise({
|
|
39
|
-
type: "select",
|
|
40
|
-
selection: caretWordSelection
|
|
41
|
-
}), raise({
|
|
42
|
-
type: "annotation.add",
|
|
43
|
-
annotation: event.annotation
|
|
44
|
-
})]]
|
|
45
|
-
}, coreAnnotationBehaviors = {
|
|
46
|
-
addAnnotationOnCollapsedSelection
|
|
47
|
-
}, IS_MAC = typeof window < "u" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent), modifiers = {
|
|
4
|
+
const IS_MAC = typeof window < "u" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent), modifiers = {
|
|
48
5
|
alt: "altKey",
|
|
49
6
|
control: "ctrlKey",
|
|
50
7
|
meta: "metaKey",
|
|
@@ -156,7 +113,56 @@ function toKeyName(name) {
|
|
|
156
113
|
const keyName = name.toLowerCase();
|
|
157
114
|
return aliases[keyName] ?? keyName;
|
|
158
115
|
}
|
|
159
|
-
|
|
116
|
+
function isDragBehaviorEvent(event) {
|
|
117
|
+
return event.type.startsWith("drag.");
|
|
118
|
+
}
|
|
119
|
+
function isMouseBehaviorEvent(event) {
|
|
120
|
+
return event.type.startsWith("mouse.");
|
|
121
|
+
}
|
|
122
|
+
function isCustomBehaviorEvent(event) {
|
|
123
|
+
return event.type.startsWith("custom.");
|
|
124
|
+
}
|
|
125
|
+
function raise(event) {
|
|
126
|
+
return {
|
|
127
|
+
type: "raise",
|
|
128
|
+
event
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function defineBehavior(behavior) {
|
|
132
|
+
return behavior;
|
|
133
|
+
}
|
|
134
|
+
const addAnnotationOnCollapsedSelection = {
|
|
135
|
+
on: "annotation.add",
|
|
136
|
+
guard: ({
|
|
137
|
+
snapshot
|
|
138
|
+
}) => {
|
|
139
|
+
if (!isSelectionCollapsed(snapshot))
|
|
140
|
+
return !1;
|
|
141
|
+
const caretWordSelection = getCaretWordSelection(snapshot);
|
|
142
|
+
return !caretWordSelection || !isSelectionExpanded({
|
|
143
|
+
...snapshot,
|
|
144
|
+
context: {
|
|
145
|
+
...snapshot.context,
|
|
146
|
+
selection: caretWordSelection
|
|
147
|
+
}
|
|
148
|
+
}) ? !1 : {
|
|
149
|
+
caretWordSelection
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
actions: [({
|
|
153
|
+
event
|
|
154
|
+
}, {
|
|
155
|
+
caretWordSelection
|
|
156
|
+
}) => [raise({
|
|
157
|
+
type: "select",
|
|
158
|
+
selection: caretWordSelection
|
|
159
|
+
}), raise({
|
|
160
|
+
type: "annotation.add",
|
|
161
|
+
annotation: event.annotation
|
|
162
|
+
})]]
|
|
163
|
+
}, coreAnnotationBehaviors = {
|
|
164
|
+
addAnnotationOnCollapsedSelection
|
|
165
|
+
}, arrowDownOnLonelyBlockObject = {
|
|
160
166
|
on: "key.down",
|
|
161
167
|
guard: ({
|
|
162
168
|
snapshot,
|
|
@@ -181,8 +187,6 @@ const arrowDownOnLonelyBlockObject = {
|
|
|
181
187
|
actions: [() => [raise({
|
|
182
188
|
type: "insert.text block",
|
|
183
189
|
placement: "before"
|
|
184
|
-
}), raise({
|
|
185
|
-
type: "select.previous block"
|
|
186
190
|
})]]
|
|
187
191
|
}, breakingBlockObject = {
|
|
188
192
|
on: "insert.break",
|
|
@@ -196,6 +200,32 @@ const arrowDownOnLonelyBlockObject = {
|
|
|
196
200
|
type: "insert.text block",
|
|
197
201
|
placement: "after"
|
|
198
202
|
})]]
|
|
203
|
+
}, clickingAboveLonelyBlockObject = {
|
|
204
|
+
on: "mouse.click",
|
|
205
|
+
guard: ({
|
|
206
|
+
snapshot,
|
|
207
|
+
event
|
|
208
|
+
}) => {
|
|
209
|
+
const focusBlockObject = getFocusBlockObject(snapshot), previousBlock = getPreviousBlock(snapshot);
|
|
210
|
+
return event.position.isEditor && event.position.block === "start" && focusBlockObject && !previousBlock;
|
|
211
|
+
},
|
|
212
|
+
actions: [() => [raise({
|
|
213
|
+
type: "insert.text block",
|
|
214
|
+
placement: "before"
|
|
215
|
+
})]]
|
|
216
|
+
}, clickingBelowLonelyBlockObject = {
|
|
217
|
+
on: "mouse.click",
|
|
218
|
+
guard: ({
|
|
219
|
+
snapshot,
|
|
220
|
+
event
|
|
221
|
+
}) => {
|
|
222
|
+
const focusBlockObject = getFocusBlockObject(snapshot), nextBlock = getNextBlock(snapshot);
|
|
223
|
+
return event.position.isEditor && event.position.block === "end" && focusBlockObject && !nextBlock;
|
|
224
|
+
},
|
|
225
|
+
actions: [() => [raise({
|
|
226
|
+
type: "insert.text block",
|
|
227
|
+
placement: "after"
|
|
228
|
+
})]]
|
|
199
229
|
}, deletingEmptyTextBlockAfterBlockObject = {
|
|
200
230
|
on: "delete.backward",
|
|
201
231
|
guard: ({
|
|
@@ -260,6 +290,8 @@ const arrowDownOnLonelyBlockObject = {
|
|
|
260
290
|
arrowDownOnLonelyBlockObject,
|
|
261
291
|
arrowUpOnLonelyBlockObject,
|
|
262
292
|
breakingBlockObject,
|
|
293
|
+
clickingAboveLonelyBlockObject,
|
|
294
|
+
clickingBelowLonelyBlockObject,
|
|
263
295
|
deletingEmptyTextBlockAfterBlockObject,
|
|
264
296
|
deletingEmptyTextBlockBeforeBlockObject
|
|
265
297
|
}, coreDecoratorBehaviors = {
|
|
@@ -382,7 +414,8 @@ const arrowDownOnLonelyBlockObject = {
|
|
|
382
414
|
level: focusLevel,
|
|
383
415
|
style: snapshot.context.schema.styles[0]?.value
|
|
384
416
|
},
|
|
385
|
-
placement: "before"
|
|
417
|
+
placement: "before",
|
|
418
|
+
select: "none"
|
|
386
419
|
})]]
|
|
387
420
|
}, coreInsertBreakBehaviors = {
|
|
388
421
|
breakingAtTheEndOfTextBlock,
|
|
@@ -498,12 +531,14 @@ const arrowDownOnLonelyBlockObject = {
|
|
|
498
531
|
clearListOnEnter,
|
|
499
532
|
indentListOnTab,
|
|
500
533
|
unindentListOnShiftTab
|
|
501
|
-
}, coreBehaviors = [coreAnnotationBehaviors.addAnnotationOnCollapsedSelection, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock, coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock];
|
|
534
|
+
}, coreBehaviors = [coreAnnotationBehaviors.addAnnotationOnCollapsedSelection, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreBlockObjectBehaviors.clickingAboveLonelyBlockObject, coreBlockObjectBehaviors.clickingBelowLonelyBlockObject, coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock, coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock];
|
|
502
535
|
export {
|
|
503
536
|
coreBehaviors,
|
|
504
537
|
defineBehavior,
|
|
505
538
|
isCustomBehaviorEvent,
|
|
539
|
+
isDragBehaviorEvent,
|
|
506
540
|
isHotkey,
|
|
541
|
+
isMouseBehaviorEvent,
|
|
507
542
|
raise
|
|
508
543
|
};
|
|
509
544
|
//# sourceMappingURL=behavior.core.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior.core.js","sources":["../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter.types'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'block.set'\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: 'block.unset'\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete'\n selection: NonNullable<EditorSelection>\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'history.redo'\n }\n | {\n type: 'history.undo'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n placement: 'auto' | 'after' | 'before'\n }\n | {\n type: 'insert.block object'\n placement: 'auto' | 'after' | 'before'\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.inline object'\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.break'\n }\n | {\n type: 'insert.soft break'\n }\n | {\n type: 'insert.block'\n block: PortableTextBlock\n placement: 'auto' | 'after' | 'before'\n }\n | {\n type: 'insert.span'\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: 'insert.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'insert.text block'\n placement: 'auto' | 'after' | 'before'\n textBlock?: {\n children?: PortableTextTextBlock['children']\n }\n }\n | {\n type: 'list item.add'\n listItem: string\n }\n | {\n type: 'list item.remove'\n listItem: string\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'move.block'\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: 'move.block down'\n at: [KeyedSegment]\n }\n | {\n type: 'move.block up'\n at: [KeyedSegment]\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'select.previous block'\n }\n | {\n type: 'select.next block'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n | 'deserialization.failure'\n | 'deserialization.success'\n | 'serialization.failure'\n | 'serialization.success'\n > & {dataTransfer: DataTransfer})\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: DataTransfer\n }\n | {\n type: 'deserialize'\n dataTransfer: DataTransfer\n }\n | {\n type: 'key.down'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'key.up'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'paste'\n data: DataTransfer\n }\n | {\n type: 'serialize'\n originEvent: 'copy' | 'cut' | 'drag' | 'unknown'\n dataTransfer: DataTransfer\n }\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends `custom.${TType}` = `custom.${TType}`,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\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 type BehaviorEvent =\n | SyntheticBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n | {type: '*'}\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n> = {\n /**\n * The internal 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 */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [\n () => [\n raise({type: 'insert.text block', placement: 'before'}),\n raise({type: 'select.previous block'}),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n _key: snapshot.context.keyGenerator(),\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["isCustomBehaviorEvent","event","type","startsWith","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","caretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","block","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"behavior.core.js","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter.types'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'block.set'\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: 'block.unset'\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete'\n selection: NonNullable<EditorSelection>\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'history.redo'\n }\n | {\n type: 'history.undo'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: 'insert.block object'\n placement: InsertPlacement\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.inline object'\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.break'\n }\n | {\n type: 'insert.soft break'\n }\n | {\n type: 'insert.block'\n block: PortableTextBlock\n placement: InsertPlacement\n select?: 'start' | 'end' | 'none'\n }\n | {\n type: 'insert.span'\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: 'insert.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'insert.text block'\n placement: InsertPlacement\n textBlock?: {\n children?: PortableTextTextBlock['children']\n }\n }\n | {\n type: 'list item.add'\n listItem: string\n }\n | {\n type: 'list item.remove'\n listItem: string\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'move.block'\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: 'move.block down'\n at: [KeyedSegment]\n }\n | {\n type: 'move.block up'\n at: [KeyedSegment]\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'select.previous block'\n select?: 'start' | 'end'\n }\n | {\n type: 'select.next block'\n select?: 'start' | 'end'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n 'deserialization.failure' | 'deserialization.success'\n > & {\n dataTransfer: DataTransfer\n originEvent: Omit<\n PickFromUnion<NativeBehaviorEvent, 'type', 'drag.drop' | 'paste'>,\n 'dataTransfer'\n >\n })\n | {\n type: 'serialization.success'\n mimeType: MIMEType\n data: string\n dataTransfer: DataTransfer\n originEvent: Omit<\n PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'copy' | 'cut' | 'drag.dragstart'\n >,\n 'dataTransfer'\n >\n }\n | {\n type: 'serialization.failure'\n mimeType: MIMEType\n reason: string\n dataTransfer: DataTransfer\n originEvent: Omit<\n PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'copy' | 'cut' | 'drag.dragstart'\n >,\n 'dataTransfer'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\ntype DragBehaviorEvent =\n | {\n type: 'drag.dragstart'\n dataTransfer: DataTransfer\n position: EventPosition\n }\n | {\n type: 'drag.drag'\n dataTransfer: DataTransfer\n }\n | {\n type: 'drag.dragend'\n dataTransfer: DataTransfer\n }\n | {\n type: 'drag.dragenter'\n dataTransfer: DataTransfer\n position: EventPosition\n }\n | {\n type: 'drag.dragover'\n dataTransfer: DataTransfer\n position: EventPosition\n }\n | {\n type: 'drag.drop'\n dataTransfer: DataTransfer\n position: EventPosition\n }\n | {\n type: 'drag.dragleave'\n dataTransfer: DataTransfer\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\nexport type DataBehaviorEvent =\n | {\n type: 'deserialize'\n dataTransfer: DataTransfer\n originEvent: Omit<\n PickFromUnion<NativeBehaviorEvent, 'type', 'drag.drop' | 'paste'>,\n 'dataTransfer'\n >\n }\n | {\n type: 'serialize'\n dataTransfer: DataTransfer\n originEvent: Omit<\n PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'copy' | 'cut' | 'drag.dragstart'\n >,\n 'dataTransfer'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: 'mouse.click'\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: DataTransfer\n position: EventPosition\n }\n | {\n type: 'cut'\n dataTransfer: DataTransfer\n position: EventPosition\n }\n | {\n type: 'key.down'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'key.up'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | MouseBehaviorEvent\n | {\n type: 'paste'\n data: DataTransfer\n position: EventPosition\n }\n | DragBehaviorEvent\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends `custom.${TType}` = `custom.${TType}`,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | DataBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n | {type: '*'}\n | {type: 'drag.*'}\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends 'drag.*'\n ? DragBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n> = {\n /**\n * The internal 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 */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'before'})]],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'before'})]],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n _key: snapshot.context.keyGenerator(),\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n select: 'none',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isDragBehaviorEvent","type","startsWith","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","caretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","clickingAboveLonelyBlockObject","position","isEditor","block","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":";;;AAkBA,MAAMA,SACJ,OAAOC,SAAW,OAClB,uBAAuBC,KAAKD,OAAOE,UAAUC,SAAS,GAIlDC,YAAkD;AAAA,EACtDC,KAAK;AAAA,EACLC,SAAS;AAAA,EACTC,MAAM;AAAA,EACNC,OAAO;AACT,GAEMC,UAA8C;AAAA,EAClDC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,KAAK;AAAA,EACLC,SAAS;AAAA,EACTC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,KAAKtB,SAAS,SAAS;AAAA,EACvBuB,KAAK;AAAA,EACLC,QAAQ;AAAA,EACRC,QAAQ;AAAA,EACRC,OAAO;AAAA,EACPC,OAAO;AAAA,EACPC,UAAU;AAAA,EACVC,IAAI;AAAA,EACJC,KAAK;AAAA,EACLC,SAAS;AACX,GAEMC,WAA+C;AAAA,EACnD,WAAa;AAAA,EACb,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,EACT,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,UAAY;AAAA,EACZ,QAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAU;AAAA,EACV,UAAY;AAAA,EACZ,KAAO;AAAA,EACP,MAAQ;AAAA,EACR,WAAa;AAAA,EACb,SAAW;AAAA,EACX,YAAc;AAAA,EACd,WAAa;AAAA,EACb,QAAU;AAAA,EACV,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,YAAc;AAAA,EACd,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AACT;AAEgBC,SAAAA,SAASC,QAAgBC,OAAmC;AAC1E,SAAOC,cAAcC,YAAYH,MAAM,GAAGC,KAAK;AACjD;AAEA,SAASE,YAAYH,QAAwB;AAE3C,QAAMI,eAAuB;AAAA,IAC3BC,QAAQ;AAAA,IACRC,SAAS;AAAA,IACTC,SAAS;AAAA,IACTC,UAAU;AAAA,EAAA,GAINC,iBAAiBT,OAAOU,QAAQ,MAAM,MAAM,EAAEC,MAAM,GAAG;AAE7D,aAAWC,oBAAoBH,gBAAgB;AAC7C,UAAMI,WACJD,iBAAiBE,SAAS,GAAG,KAAKF,iBAAiBG,SAAS,GACxDC,gBAAgBH,WAClBD,iBAAiBK,MAAM,GAAG,EAAE,IAC5BL,kBACEM,UAAUC,UAAUH,aAAa,GACjCI,WAAWjD,UAAU+C,OAAO,GAC5BG,QAAQ7C,QAAQwC,aAAa,GAC7BM,OAAOxB,SAASoB,OAAO;AAE7B,QACEF,cAAcD,SAAS,KACvBK,aAAaG,UACbF,UAAUE,UACVD,SAASC;AAET,YAAM,IAAIC,UAAU,sBAAsBR,aAAa,GAAG;AAG5D,KAAIP,eAAeM,WAAW,KAAKK,aAAaG,YAC9CnB,aAAaqB,MAAMP,SACnBd,aAAasB,UAAUC,UAAUX,aAAa,IAG5CI,aAAaG,WACfnB,aAAagB,QAAQ,IAAIP,WAAW,OAAO;AAAA,EAAA;AAIxCT,SAAAA;AACT;AAEA,SAASF,cACPE,cACAH,OACS;AAENG,UAAAA,aAAaC,UAAU,QACpBD,aAAaC,WAAWJ,MAAMI,YAEjCD,aAAaE,WAAW,QACrBF,aAAaE,YAAYL,MAAMK,aAElCF,aAAaG,WAAW,QACrBH,aAAaG,YAAYN,MAAMM,aAElCH,aAAaI,YAAY,QACtBJ,aAAaI,aAAaP,MAAMO,YAOlCJ,aAAasB,YAAYH,UAAatB,MAAMyB,YAAYH,SACtDnB,aAAasB,YAAY,MAAMzB,MAAMyB,YAAY,KAC5C,KAGFtB,aAAasB,YAAYzB,MAAMyB,UAItCtB,aAAasB,YAAYzB,MAAMyB,WAC/BtB,aAAaqB,QAAQxB,MAAMwB,IAAIG,YAbxB,IAAA;AAeX;AAEA,SAASD,UAAUE,MAAsB;AACjCX,QAAAA,UAAUC,UAAUU,IAAI;AAG9B,SAFgB/B,SAASoB,OAAO,KAAKA,QAAQY,YAAY,EAAEC,WAAW,CAAC;AAGzE;AAEA,SAASZ,UAAUU,MAAsB;AACjCX,QAAAA,UAAUW,KAAKD,YAAY;AAE1BpD,SAAAA,QAAQ0C,OAAO,KAAKA;AAC7B;ACuEO,SAASc,oBACd/B,OAC4B;AACrBA,SAAAA,MAAMgC,KAAKC,WAAW,OAAO;AACtC;AA6BO,SAASC,qBACdlC,OAC6B;AACtBA,SAAAA,MAAMgC,KAAKC,WAAW,QAAQ;AACvC;AAiDO,SAASE,sBACdnC,OAC8B;AACvBA,SAAAA,MAAMgC,KAAKC,WAAW,SAAS;AACxC;AA8BO,SAASG,MACdpC,OACgD;AACzC,SAAA;AAAA,IAACgC,MAAM;AAAA,IAAShC;AAAAA,EAAK;AAC9B;AA0GO,SAASqC,eAadC,UACU;AACHA,SAAAA;AACT;AC1gBA,MAAMC,oCAAmD;AAAA,EACvDC,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACjB,QAAA,CAACC,qBAA+BD,QAAQ;AACnC,aAAA;AAGHE,UAAAA,qBAAqBD,sBAAgCD,QAAQ;AAEnE,WACE,CAACE,sBACD,CAACD,oBAA8B;AAAA,MAC7B,GAAGD;AAAAA,MACHG,SAAS;AAAA,QACP,GAAGH,SAASG;AAAAA,QACZC,WAAWF;AAAAA,MAAAA;AAAAA,IAEd,CAAA,IAEM,KAGF;AAAA,MAACA;AAAAA,IAAkB;AAAA,EAC5B;AAAA,EACAG,SAAS,CACP,CAAC;AAAA,IAAC/C;AAAAA,EAAAA,GAAQ;AAAA,IAAC4C;AAAAA,EAAkB,MAAM,CACjCR,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAUc,WAAWF;AAAAA,EAAmB,CAAA,GACrDR,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAkBgB,YAAYhD,MAAMgD;AAAAA,EAAAA,CAAW,CAAC,CAC9D;AAEL,GAEaC,0BAA0B;AAAA,EACrCV;AACF,GC/BMW,+BAA8C;AAAA,EAClDV,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAU1C;AAAAA,EAAAA,MAAW;AAC5B,UAAMmD,cAAcrD,SAAS,aAAaE,MAAMoD,aAAa,GACvDC,mBAAmBV,oBAA8BD,QAAQ,GACzDY,YAAYX,aAAuBD,QAAQ;AAE1CS,WAAAA,eAAeE,oBAAoB,CAACC;AAAAA,EAC7C;AAAA,EACAP,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAqBuB,WAAW;AAAA,EAAA,CAAQ,CAAC,CAAC;AAC1E,GAEMC,6BAA4C;AAAA,EAChDhB,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAU1C;AAAAA,EAAAA,MAAW;AAC5B,UAAMyD,YAAY3D,SAAS,WAAWE,MAAMoD,aAAa,GACnDC,mBAAmBV,oBAA8BD,QAAQ,GACzDgB,gBAAgBf,iBAA2BD,QAAQ;AAElDe,WAAAA,aAAaJ,oBAAoB,CAACK;AAAAA,EAC3C;AAAA,EACAX,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAqBuB,WAAW;AAAA,EAAA,CAAS,CAAC,CAAC;AAC3E,GAEMI,sBAAqC;AAAA,EACzCnB,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACfW,UAAAA,mBAAmBV,oBAA8BD,QAAQ;AAG/D,WAF2BC,qBAA+BD,QAAQ,KAErCW,qBAAqB/B;AAAAA,EACpD;AAAA,EACAyB,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAqBuB,WAAW;AAAA,EAAA,CAAQ,CAAC,CAAC;AAC1E,GAEMK,iCAAgD;AAAA,EACpDpB,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAU1C;AAAAA,EAAAA,MAAW;AACtBqD,UAAAA,mBAAmBV,oBAA8BD,QAAQ,GACzDgB,gBAAgBf,iBAA2BD,QAAQ;AAGvD1C,WAAAA,MAAM6D,SAASC,YACf9D,MAAM6D,SAASE,UAAU,WACzBV,oBACA,CAACK;AAAAA,EAEL;AAAA,EACAX,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAqBuB,WAAW;AAAA,EAAA,CAAS,CAAC,CAAC;AAC3E,GAEMS,iCAAgD;AAAA,EACpDxB,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAU1C;AAAAA,EAAAA,MAAW;AACtBqD,UAAAA,mBAAmBV,oBAA8BD,QAAQ,GACzDY,YAAYX,aAAuBD,QAAQ;AAG/C1C,WAAAA,MAAM6D,SAASC,YACf9D,MAAM6D,SAASE,UAAU,SACzBV,oBACA,CAACC;AAAAA,EAEL;AAAA,EACAP,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,IAACJ,MAAM;AAAA,IAAqBuB,WAAW;AAAA,EAAA,CAAQ,CAAC,CAAC;AAC1E,GAEMU,yCAAwD;AAAA,EAC5DzB,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAMwB,iBAAiBvB,kBAA4BD,QAAQ,GACrDyB,qBAAqBxB,qBAA+BD,QAAQ,GAC5DgB,gBAAgBf,iBAA2BD,QAAQ;AAEzD,WAAI,CAACwB,kBAAkB,CAACC,sBAAsB,CAACT,gBACtC,KAIPU,iBAAiBF,eAAeG,IAAI,KACpC,CAACC,wBAAwBZ,cAAcW,IAAI,IAEpC;AAAA,MAACH;AAAAA,MAAgBR;AAAAA,IAAAA,IAGnB;AAAA,EACT;AAAA,EACAX,SAAS,CACP,CAACwB,GAAG;AAAA,IAACL;AAAAA,IAAgBR;AAAAA,EAAa,MAAM,CACtCtB,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNwC,WAAWN,eAAeO;AAAAA,EAC3B,CAAA,GACDrC,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNc,WAAW;AAAA,MACT4B,QAAQ;AAAA,QAACD,MAAMf,cAAce;AAAAA,QAAME,QAAQ;AAAA,MAAC;AAAA,MAC5CC,OAAO;AAAA,QAACH,MAAMf,cAAce;AAAAA,QAAME,QAAQ;AAAA,MAAA;AAAA,IAAC;AAAA,EAC7C,CACD,CAAC,CACH;AAEL,GAEME,0CAAyD;AAAA,EAC7DrC,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAMwB,iBAAiBvB,kBAA4BD,QAAQ,GACrDyB,qBAAqBxB,qBAA+BD,QAAQ,GAC5DY,YAAYX,aAAuBD,QAAQ;AAEjD,WAAI,CAACwB,kBAAkB,CAACC,sBAAsB,CAACb,YACtC,KAIPc,iBAAiBF,eAAeG,IAAI,KACpC,CAACC,wBAAwBhB,UAAUe,IAAI,IAEhC;AAAA,MAACH;AAAAA,MAAgBZ;AAAAA,IAAAA,IAGnB;AAAA,EACT;AAAA,EACAP,SAAS,CACP,CAACwB,GAAG;AAAA,IAACL;AAAAA,IAAgBZ;AAAAA,EAAS,MAAM,CAClClB,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNwC,WAAWN,eAAeO;AAAAA,EAC3B,CAAA,GACDrC,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNc,WAAW;AAAA,MACT4B,QAAQ;AAAA,QAACD,MAAMnB,UAAUmB;AAAAA,QAAME,QAAQ;AAAA,MAAC;AAAA,MACxCC,OAAO;AAAA,QAACH,MAAMnB,UAAUmB;AAAAA,QAAME,QAAQ;AAAA,MAAA;AAAA,IAAC;AAAA,EACzC,CACD,CAAC,CACH;AAEL,GAEaG,2BAA2B;AAAA,EACtC5B;AAAAA,EACAM;AAAAA,EACAG;AAAAA,EACAC;AAAAA,EACAI;AAAAA,EACAC;AAAAA,EACAY;AACF,GCxJaE,yBAAyB;AAAA,EACpCC,gBAA+B;AAAA,IAC7BxC,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAU1C;AAAAA,IAAAA,MACjBF,SAAS,SAASE,MAAMoD,aAAa,KACrCV,SAASG,QAAQoC,OAAOC,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,QACrC;AAAA,IACFtC,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,MAACJ,MAAM;AAAA,MAAoBoD,WAAW;AAAA,IAAA,CAAS,CAAC,CAAC;AAAA,EAAA;AAAA,EAE1EE,YAA2B;AAAA,IACzB9C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAU1C;AAAAA,IAAAA,MACjBF,SAAS,SAASE,MAAMoD,aAAa,KACrCV,SAASG,QAAQoC,OAAOC,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,IACrC;AAAA,IACFtC,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,MAACJ,MAAM;AAAA,MAAoBoD,WAAW;AAAA,IAAA,CAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAEtEG,mBAAkC;AAAA,IAChC/C,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAU1C;AAAAA,IAAAA,MACjBF,SAAS,SAASE,MAAMoD,aAAa,KACrCV,SAASG,QAAQoC,OAAOC,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,WACrC;AAAA,IACFtC,SAAS,CACP,MAAM,CAACX,MAAM;AAAA,MAACJ,MAAM;AAAA,MAAoBoD,WAAW;AAAA,IAAA,CAAY,CAAC,CAAC;AAAA,EAAA;AAAA,EAGrEI,cAA6B;AAAA,IAC3BhD,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAU1C;AAAAA,IAAAA,MACjBF,SAAS,SAASE,MAAMoD,aAAa,KACrCV,SAASG,QAAQoC,OAAOC,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,MACrC;AAAA,IACFtC,SAAS,CAAC,MAAM,CAACX,MAAM;AAAA,MAACJ,MAAM;AAAA,MAAoBoD,WAAW;AAAA,IAAA,CAAO,CAAC,CAAC;AAAA,EACvE;AACH,GCvCMK,8BAA6C;AAAA,EACjDjD,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACfwB,UAAAA,iBAAiBvB,kBAA4BD,QAAQ,GACrDyB,qBAAqBxB,qBAA+BD,QAAQ;AAElE,QAAI,CAACA,SAASG,QAAQC,aAAa,CAACoB,kBAAkB,CAACC;AAC9C,aAAA;AAGT,UAAMuB,kBACJ/C,kBAA4BuB,cAAc,EAAExB,QAAQ,GAEhDiD,gBAAgBzB,eAAeG,KAAKuB,UACpCC,aAAa3B,eAAeG,KAAKyB;AAEvC,WAAIJ,kBACK;AAAA,MAACC;AAAAA,MAAeE;AAAAA,IAAAA,IAGlB;AAAA,EACT;AAAA,EACA9C,SAAS,CACP,CAAC;AAAA,IAACL;AAAAA,EAAAA,GAAW;AAAA,IAACiD;AAAAA,IAAeE;AAAAA,EAAU,MAAM,CAC3CzD,MAAM;AAAA,IACJJ,MAAM;AAAA,IACN+B,OAAO;AAAA,MACLgC,OAAOrD,SAASG,QAAQoC,OAAOlB,MAAMnC;AAAAA,MACrCoE,MAAMtD,SAASG,QAAQoD,aAAa;AAAA,MACpCC,UAAU,CACR;AAAA,QACEF,MAAMtD,SAASG,QAAQoD,aAAa;AAAA,QACpCF,OAAOrD,SAASG,QAAQoC,OAAOkB,KAAKvE;AAAAA,QACpCwE,MAAM;AAAA,QACNC,OAAO,CAAA;AAAA,MAAA,CACR;AAAA,MAEHC,UAAU,CAAE;AAAA,MACZV,UAAUD;AAAAA,MACVG,OAAOD;AAAAA,MACPU,OAAO7D,SAASG,QAAQoC,OAAOuB,OAAO,CAAC,GAAGnB;AAAAA,IAC5C;AAAA,IACA9B,WAAW;AAAA,EAAA,CACZ,CAAC,CACH;AAEL,GAEMkD,gCAA+C;AAAA,EACnDjE,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACfwB,UAAAA,iBAAiBvB,kBAA4BD,QAAQ,GACrDyB,qBAAqBxB,qBAA+BD,QAAQ;AAElE,QAAI,CAACA,SAASG,QAAQC,aAAa,CAACoB,kBAAkB,CAACC;AAC9C,aAAA;AAGHuC,UAAAA,YAAY/D,aAAuBD,QAAQ,GAE3CiE,kBAAkBD,WAAWrC,KAAKgC,OAAOO,OAC5CC,CAAAA,SACCnE,SAASG,QAAQoC,OAAOC,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAUwB,IACrC,KAAK,CACT,CAAA,GACMC,mBACJJ,WAAWrC,KAAKgC,OAAOO,OACpBC,CACC,SAAA,CAACnE,SAASG,QAAQoC,OAAOC,WAAWC,KACjCC,CAAcA,cAAAA,UAAUC,UAAUwB,IACrC,CACJ,KAAK,CACDlB,GAAAA,gBAAgBzB,eAAeG,KAAKuB,UACpCC,aAAa3B,eAAeG,KAAKyB;AAKvC,WAFEnD,oBAA8BuB,cAAc,EAAExB,QAAQ,IAG/C;AAAA,MAACoE;AAAAA,MAAkBH;AAAAA,MAAiBhB;AAAAA,MAAeE;AAAAA,IAAAA,IAGrD;AAAA,EACT;AAAA,EACA9C,SAAS,CACP,CACE;AAAA,IAACL;AAAAA,EAAAA,GACD;AAAA,IAACoE;AAAAA,IAAkBH;AAAAA,IAAiBhB;AAAAA,IAAeE;AAAAA,EAAU,MAC1D,CACHzD,MAAM;AAAA,IACJJ,MAAM;AAAA,IACN+B,OAAO;AAAA,MACLiC,MAAMtD,SAASG,QAAQoD,aAAa;AAAA,MACpCF,OAAOrD,SAASG,QAAQoC,OAAOlB,MAAMnC;AAAAA,MACrCsE,UAAU,CACR;AAAA,QACEF,MAAMtD,SAASG,QAAQoD,aAAa;AAAA,QACpCF,OAAOrD,SAASG,QAAQoC,OAAOkB,KAAKvE;AAAAA,QACpCyE,OAAOS,iBAAiBhG,WAAW,IAAI6F,kBAAkB,CAAE;AAAA,QAC3DP,MAAM;AAAA,MAAA,CACP;AAAA,MAEHR,UAAUD;AAAAA,MACVG,OAAOD;AAAAA,MACPU,OAAO7D,SAASG,QAAQoC,OAAOuB,OAAO,CAAC,GAAGnB;AAAAA,IAC5C;AAAA,IACA9B,WAAW;AAAA,IACXwD,QAAQ;AAAA,EAAA,CACT,CAAC,CACH;AAEL,GAEaC,2BAA2B;AAAA,EACtCvB;AAAAA,EACAgB;AACF,GClHMQ,iBAAiB,IAEjBC,uBAAsC;AAAA,EAC1C1E,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAMyB,qBAAqBxB,qBAA+BD,QAAQ,GAC5DwB,iBAAiBvB,kBAA4BD,QAAQ,GACrDgE,YAAY/D,aAAuBD,QAAQ;AAE7C,WAAA,CAACyB,sBAAsB,CAACD,kBAAkB,CAACwC,YACtC,KAIPxC,eAAeG,KAAK6B,SAAS,CAAC,EAAEF,SAASU,UAAUrC,KAAK2B,QACxDtD,SAASG,QAAQC,WAAW8B,MAAMD,WAAW,KAElBT,eAAeG,KAAKyB,UAAU,IAClD;AAAA,MAAC5B;AAAAA,IAAAA,IAGH;AAAA,EACT;AAAA,EACAnB,SAAS,CACP,CAACwB,GAAG;AAAA,IAACL;AAAAA,EAAc,MAAM,CACvB9B,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNmF,OAAO,CAAC,YAAY,OAAO;AAAA,IAC3BC,IAAIlD,eAAeO;AAAAA,EAAAA,CACpB,CAAC,CACH;AAEL,GAEM4C,0BAAyC;AAAA,EAC7C7E,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAMyB,qBAAqBxB,qBAA+BD,QAAQ,GAC5DwB,iBAAiBvB,kBAA4BD,QAAQ,GACrDgE,YAAY/D,aAAuBD,QAAQ;AAEjD,WAAI,CAACyB,sBAAsB,CAACD,kBAAkB,CAACwC,YACtC,KAIPxC,eAAeG,KAAK6B,SAAS,CAAC,EAAEF,SAASU,UAAUrC,KAAK2B,QACxDtD,SAASG,QAAQC,WAAW8B,MAAMD,WAAW,KAI7CT,eAAeG,KAAKyB,UAAUxE,UAC9B4C,eAAeG,KAAKyB,QAAQ,IAErB;AAAA,MAAC5B;AAAAA,MAAgB4B,OAAO5B,eAAeG,KAAKyB,QAAQ;AAAA,IAAA,IAGtD;AAAA,EACT;AAAA,EACA/C,SAAS,CACP,CAACwB,GAAG;AAAA,IAACL;AAAAA,IAAgB4B;AAAAA,EAAK,MAAM,CAC9B1D,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNmF,OAAO;AAAA,MAACrB;AAAAA,IAAK;AAAA,IACbsB,IAAIlD,eAAeO;AAAAA,EAAAA,CACpB,CAAC,CACH;AAEL,GAEM6C,mBAAkC;AAAA,EACtC9E,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACfyB,UAAAA,qBAAqBxB,qBAA+BD,QAAQ,GAC5D6E,iBAAiB5E,kBAA4BD,QAAQ;AAGzD,WAAA,CAACyB,sBACD,CAACoD,kBACD,CAACnD,iBAAiBmD,eAAelD,IAAI,IAE9B,KAGF;AAAA,MAACkD;AAAAA,IAAc;AAAA,EACxB;AAAA,EACAxE,SAAS,CACP,CAACwB,GAAG;AAAA,IAACgD;AAAAA,EAAc,MAAM,CACvBnF,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNmF,OAAO,CAAC,YAAY,OAAO;AAAA,IAC3BC,IAAIG,eAAe9C;AAAAA,EAAAA,CACpB,CAAC,CACH;AAEL,GAEM+C,kBAAiC;AAAA,EACrChF,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAU1C;AAAAA,EAAAA,MAAW;AAG5B,QAAI,CAFUF,SAAS,OAAOE,MAAMoD,aAAa;AAGxC,aAAA;AAGT,UAAMqE,iBAAiB9E,kBAA4BD,QAAQ,GACrDgF,SAASC,aAAajF,SAASG,OAAO,GACtC+E,qBAAqBH,eAAeI,QAAS9D,CACjD2D,UAAAA,OAAOI,YAAY/D,MAAMM,IAAI,IACzB,CACE;AAAA,MACEA,MAAMN,MAAMM;AAAAA,MACZI,MAAMV,MAAMU;AAAAA,IACb,CAAA,IAEH,CAAA,CACN;AAEImD,WAAAA,mBAAmB9G,WAAW2G,eAAe3G,SACxC;AAAA,MAAC8G;AAAAA,IAAAA,IAGH;AAAA,EACT;AAAA,EACA7E,SAAS,CACP,CAACwB,GAAG;AAAA,IAACqD;AAAAA,EACHA,MAAAA,mBAAmBG,IAAKC,CAAAA,sBACtB5F,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNmF,OAAO;AAAA,MACLrB,OAAOmC,KAAKC,IACVjB,gBACAgB,KAAKE,IAAI,GAAGH,kBAAkB3D,KAAKyB,QAAQ,CAAC,CAC9C;AAAA,IACF;AAAA,IACAsB,IAAIY,kBAAkBvD;AAAAA,EAAAA,CACvB,CACH,CAAC;AAEP,GAEM2D,yBAAwC;AAAA,EAC5C5F,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAU1C;AAAAA,EAAAA,MAAW;AAG5B,QAAI,CAFeF,SAAS,aAAaE,MAAMoD,aAAa;AAGnD,aAAA;AAGT,UAAMqE,iBAAiB9E,kBAA4BD,QAAQ,GACrDgF,SAASC,aAAajF,SAASG,OAAO,GACtC+E,qBAAqBH,eAAeI,QAAS9D,CACjD2D,UAAAA,OAAOI,YAAY/D,MAAMM,IAAI,IACzB,CACE;AAAA,MACEA,MAAMN,MAAMM;AAAAA,MACZI,MAAMV,MAAMU;AAAAA,IACb,CAAA,IAEH,CAAA,CACN;AAEImD,WAAAA,mBAAmB9G,WAAW2G,eAAe3G,SACxC;AAAA,MAAC8G;AAAAA,IAAAA,IAGH;AAAA,EACT;AAAA,EACA7E,SAAS,CACP,CAACwB,GAAG;AAAA,IAACqD;AAAAA,EACHA,MAAAA,mBAAmBG,IAAKC,CAAAA,sBACtB5F,MAAM;AAAA,IACJJ,MAAM;AAAA,IACNmF,OAAO;AAAA,MACLrB,OAAOmC,KAAKC,IACVjB,gBACAgB,KAAKE,IAAI,GAAGH,kBAAkB3D,KAAKyB,QAAQ,CAAC,CAC9C;AAAA,IACF;AAAA,IACAsB,IAAIY,kBAAkBvD;AAAAA,EAAAA,CACvB,CACH,CAAC;AAEP,GAEa4D,oBAAoB;AAAA,EAC/BnB;AAAAA,EACAG;AAAAA,EACAC;AAAAA,EACAE;AAAAA,EACAY;AACF,GC9LaE,gBAAgB,CAC3BrF,wBAAwBV,mCACxBwC,uBAAuBC,gBACvBD,uBAAuBO,YACvBP,uBAAuBQ,mBACvBR,uBAAuBS,cACvBV,yBAAyBlB,gCACzBkB,yBAAyBd,gCACzBc,yBAAyB5B,8BACzB4B,yBAAyBtB,4BACzBsB,yBAAyBnB,qBACzBmB,yBAAyBb,wCACzBa,yBAAyBD,yCACzBwD,kBAAkBnB,sBAClBmB,kBAAkBhB,yBAClBgB,kBAAkBf,kBAClBe,kBAAkBb,iBAClBa,kBAAkBD,wBAClBpB,yBAAyBvB,6BACzBuB,yBAAyBP,6BAA6B;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isPortableTextTextBlock } from "@sanity/types";
|
|
2
|
-
import { isSelectionCollapsed, getFocusTextBlock, getFocusSpan, getPreviousInlineObject, getFocusBlock } from "./selector.is-at-the-start-of-block.js";
|
|
3
2
|
import { spanSelectionPointToBlockOffset, getTextBlockText } from "./util.slice-blocks.js";
|
|
3
|
+
import { isSelectionCollapsed, getFocusTextBlock, getFocusSpan, getPreviousInlineObject, getFocusBlock } from "./selector.is-at-the-start-of-block.js";
|
|
4
4
|
import { getBlockTextBefore } from "./selector.get-text-before.js";
|
|
5
5
|
import { defineBehavior } from "./behavior.core.js";
|
|
6
6
|
function createMarkdownBehaviors(config) {
|