@portabletext/editor 1.38.1 → 1.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +28 -17
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +2 -2
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/editor-provider.cjs +51 -71
  6. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.get-text-before.cjs +0 -1
  8. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +0 -3
  10. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  11. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs +0 -4
  12. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
  13. package/lib/_chunks-es/behavior.core.js +29 -18
  14. package/lib/_chunks-es/behavior.core.js.map +1 -1
  15. package/lib/_chunks-es/behavior.markdown.js +2 -2
  16. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  17. package/lib/_chunks-es/editor-provider.js +55 -75
  18. package/lib/_chunks-es/editor-provider.js.map +1 -1
  19. package/lib/_chunks-es/selector.get-text-before.js +1 -2
  20. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  21. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +1 -4
  22. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  23. package/lib/_chunks-es/selector.is-overlapping-selection.js +1 -5
  24. package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
  25. package/lib/behaviors/index.cjs +12 -12
  26. package/lib/behaviors/index.cjs.map +1 -1
  27. package/lib/behaviors/index.d.cts +2028 -2508
  28. package/lib/behaviors/index.d.ts +2028 -2508
  29. package/lib/behaviors/index.js +12 -12
  30. package/lib/behaviors/index.js.map +1 -1
  31. package/lib/index.cjs +41 -25
  32. package/lib/index.cjs.map +1 -1
  33. package/lib/index.d.cts +1489 -2141
  34. package/lib/index.d.ts +1489 -2141
  35. package/lib/index.js +41 -25
  36. package/lib/index.js.map +1 -1
  37. package/lib/plugins/index.cjs +0 -1
  38. package/lib/plugins/index.cjs.map +1 -1
  39. package/lib/plugins/index.d.cts +1489 -2141
  40. package/lib/plugins/index.d.ts +1489 -2141
  41. package/lib/plugins/index.js +1 -2
  42. package/lib/plugins/index.js.map +1 -1
  43. package/lib/selectors/index.d.cts +1488 -2140
  44. package/lib/selectors/index.d.ts +1488 -2140
  45. package/lib/utils/index.d.cts +1488 -2140
  46. package/lib/utils/index.d.ts +1488 -2140
  47. package/package.json +5 -5
  48. package/src/behavior-actions/behavior.action.serialization.success.ts +4 -1
  49. package/src/behaviors/behavior.code-editor.ts +4 -4
  50. package/src/behaviors/behavior.core.block-objects.ts +4 -4
  51. package/src/behaviors/behavior.core.decorators.ts +8 -8
  52. package/src/behaviors/behavior.core.lists.ts +4 -4
  53. package/src/behaviors/behavior.default.raise-soft-break.ts +3 -3
  54. package/src/behaviors/behavior.default.ts +33 -20
  55. package/src/behaviors/behavior.emoji-picker.ts +6 -6
  56. package/src/behaviors/behavior.links.ts +4 -4
  57. package/src/behaviors/behavior.markdown.ts +2 -2
  58. package/src/behaviors/behavior.types.ts +163 -80
  59. package/src/converters/converter.text-html.serialize.test.ts +4 -4
  60. package/src/converters/converter.text-plain.test.ts +6 -6
  61. package/src/converters/converter.types.ts +3 -3
  62. package/src/editor/Editable.tsx +41 -19
  63. package/src/editor/editor-machine.ts +33 -7
  64. package/src/editor/plugins/create-with-event-listeners.ts +18 -3
@@ -112,9 +112,18 @@ function toKeyName(name) {
112
112
  const keyName = name.toLowerCase();
113
113
  return aliases[keyName] ?? keyName;
114
114
  }
115
+ function isClipboardBehaviorEvent(event) {
116
+ return event.type.startsWith("clipboard.");
117
+ }
115
118
  function isDragBehaviorEvent(event) {
116
119
  return event.type.startsWith("drag.");
117
120
  }
121
+ function isInputBehaviorEvent(event) {
122
+ return event.type.startsWith("input.");
123
+ }
124
+ function isKeyboardBehaviorEvent(event) {
125
+ return event.type.startsWith("keyboard.");
126
+ }
118
127
  function isMouseBehaviorEvent(event) {
119
128
  return event.type.startsWith("mouse.");
120
129
  }
@@ -139,7 +148,6 @@ const addAnnotationOnCollapsedSelection = {
139
148
  return !1;
140
149
  const caretWordSelection = selector_isAtTheStartOfBlock.getCaretWordSelection(snapshot);
141
150
  return !caretWordSelection || !selector_isAtTheStartOfBlock.isSelectionExpanded({
142
- ...snapshot,
143
151
  context: {
144
152
  ...snapshot.context,
145
153
  selection: caretWordSelection
@@ -162,12 +170,12 @@ const addAnnotationOnCollapsedSelection = {
162
170
  }, coreAnnotationBehaviors = {
163
171
  addAnnotationOnCollapsedSelection
164
172
  }, arrowDownOnLonelyBlockObject = {
165
- on: "key.down",
173
+ on: "keyboard.keydown",
166
174
  guard: ({
167
175
  snapshot,
168
176
  event
169
177
  }) => {
170
- const isArrowDown = isHotkey("ArrowDown", event.keyboardEvent), focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), nextBlock = selector_isAtTheStartOfBlock.getNextBlock(snapshot);
178
+ const isArrowDown = isHotkey("ArrowDown", event.originEvent), focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), nextBlock = selector_isAtTheStartOfBlock.getNextBlock(snapshot);
171
179
  return isArrowDown && focusBlockObject && !nextBlock;
172
180
  },
173
181
  actions: [() => [raise({
@@ -175,12 +183,12 @@ const addAnnotationOnCollapsedSelection = {
175
183
  placement: "after"
176
184
  })]]
177
185
  }, arrowUpOnLonelyBlockObject = {
178
- on: "key.down",
186
+ on: "keyboard.keydown",
179
187
  guard: ({
180
188
  snapshot,
181
189
  event
182
190
  }) => {
183
- const isArrowUp = isHotkey("ArrowUp", event.keyboardEvent), focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), previousBlock = selector_isAtTheStartOfBlock.getPreviousBlock(snapshot);
191
+ const isArrowUp = isHotkey("ArrowUp", event.originEvent), focusBlockObject = selector_isAtTheStartOfBlock.getFocusBlockObject(snapshot), previousBlock = selector_isAtTheStartOfBlock.getPreviousBlock(snapshot);
184
192
  return isArrowUp && focusBlockObject && !previousBlock;
185
193
  },
186
194
  actions: [() => [raise({
@@ -295,44 +303,44 @@ const addAnnotationOnCollapsedSelection = {
295
303
  deletingEmptyTextBlockBeforeBlockObject
296
304
  }, coreDecoratorBehaviors = {
297
305
  strongShortcut: {
298
- on: "key.down",
306
+ on: "keyboard.keydown",
299
307
  guard: ({
300
308
  snapshot,
301
309
  event
302
- }) => isHotkey("mod+b", event.keyboardEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "strong"),
310
+ }) => isHotkey("mod+b", event.originEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "strong"),
303
311
  actions: [() => [raise({
304
312
  type: "decorator.toggle",
305
313
  decorator: "strong"
306
314
  })]]
307
315
  },
308
316
  emShortcut: {
309
- on: "key.down",
317
+ on: "keyboard.keydown",
310
318
  guard: ({
311
319
  snapshot,
312
320
  event
313
- }) => isHotkey("mod+i", event.keyboardEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "em"),
321
+ }) => isHotkey("mod+i", event.originEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "em"),
314
322
  actions: [() => [raise({
315
323
  type: "decorator.toggle",
316
324
  decorator: "em"
317
325
  })]]
318
326
  },
319
327
  underlineShortcut: {
320
- on: "key.down",
328
+ on: "keyboard.keydown",
321
329
  guard: ({
322
330
  snapshot,
323
331
  event
324
- }) => isHotkey("mod+u", event.keyboardEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "underline"),
332
+ }) => isHotkey("mod+u", event.originEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "underline"),
325
333
  actions: [() => [raise({
326
334
  type: "decorator.toggle",
327
335
  decorator: "underline"
328
336
  })]]
329
337
  },
330
338
  codeShortcut: {
331
- on: "key.down",
339
+ on: "keyboard.keydown",
332
340
  guard: ({
333
341
  snapshot,
334
342
  event
335
- }) => isHotkey("mod+'", event.keyboardEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "code"),
343
+ }) => isHotkey("mod+'", event.originEvent) && snapshot.context.schema.decorators.some((decorator) => decorator.value === "code"),
336
344
  actions: [() => [raise({
337
345
  type: "decorator.toggle",
338
346
  decorator: "code"
@@ -475,12 +483,12 @@ const addAnnotationOnCollapsedSelection = {
475
483
  at: focusListBlock.path
476
484
  })]]
477
485
  }, indentListOnTab = {
478
- on: "key.down",
486
+ on: "keyboard.keydown",
479
487
  guard: ({
480
488
  snapshot,
481
489
  event
482
490
  }) => {
483
- if (!isHotkey("Tab", event.keyboardEvent))
491
+ if (!isHotkey("Tab", event.originEvent))
484
492
  return !1;
485
493
  const selectedBlocks = selector_isAtTheStartOfBlock.getSelectedBlocks(snapshot), guards = selector_isAtTheStartOfBlock.createGuards(snapshot.context), selectedListBlocks = selectedBlocks.flatMap((block) => guards.isListBlock(block.node) ? [{
486
494
  node: block.node,
@@ -500,12 +508,12 @@ const addAnnotationOnCollapsedSelection = {
500
508
  at: selectedListBlock.path
501
509
  }))]
502
510
  }, unindentListOnShiftTab = {
503
- on: "key.down",
511
+ on: "keyboard.keydown",
504
512
  guard: ({
505
513
  snapshot,
506
514
  event
507
515
  }) => {
508
- if (!isHotkey("Shift+Tab", event.keyboardEvent))
516
+ if (!isHotkey("Shift+Tab", event.originEvent))
509
517
  return !1;
510
518
  const selectedBlocks = selector_isAtTheStartOfBlock.getSelectedBlocks(snapshot), guards = selector_isAtTheStartOfBlock.createGuards(snapshot.context), selectedListBlocks = selectedBlocks.flatMap((block) => guards.isListBlock(block.node) ? [{
511
519
  node: block.node,
@@ -533,9 +541,12 @@ const addAnnotationOnCollapsedSelection = {
533
541
  }, 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];
534
542
  exports.coreBehaviors = coreBehaviors;
535
543
  exports.defineBehavior = defineBehavior;
544
+ exports.isClipboardBehaviorEvent = isClipboardBehaviorEvent;
536
545
  exports.isCustomBehaviorEvent = isCustomBehaviorEvent;
537
546
  exports.isDragBehaviorEvent = isDragBehaviorEvent;
538
547
  exports.isHotkey = isHotkey;
548
+ exports.isInputBehaviorEvent = isInputBehaviorEvent;
549
+ exports.isKeyboardBehaviorEvent = isKeyboardBehaviorEvent;
539
550
  exports.isMouseBehaviorEvent = isMouseBehaviorEvent;
540
551
  exports.raise = raise;
541
552
  //# sourceMappingURL=behavior.core.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.cjs","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","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","getFocusBlockObject","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":"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"}
1
+ {"version":3,"file":"behavior.core.cjs","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 originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n })\n | {\n type: 'serialization.success'\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: 'serialization.failure'\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\ntype ClipboardBehaviorEvent =\n | {\n type: 'clipboard.copy'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'clipboard.cut'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'clipboard.paste'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: 'drag.dragstart'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.drag'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: 'drag.dragend'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: 'drag.dragenter'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.dragover'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.drop'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.dragleave'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\n/**\n * Used to represent native InputEvents that hold a DataTransfer object.\n *\n * These can either be one of:\n *\n * - insertFromPaste\n * - insertFromPasteAsQuotation\n * - insertFromDrop\n * - insertReplacementText\n * - insertFromYank\n */\nexport type InputBehaviorEvent = {\n type: 'input.*'\n originEvent: {\n dataTransfer: DataTransfer\n }\n}\n\nexport function isInputBehaviorEvent(\n event: BehaviorEvent,\n): event is InputBehaviorEvent {\n return event.type.startsWith('input.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: 'keyboard.keydown'\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'keyboard.keyup'\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type DataBehaviorEvent =\n | {\n type: 'deserialize'\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: 'serialize'\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\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 | ClipboardBehaviorEvent\n | DragBehaviorEvent\n | InputBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\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: 'clipboard.*'}\n | {type: 'drag.*'}\n | {type: 'input.*'}\n | {type: 'keyboard.*'}\n | {type: 'mouse.*'}\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 'clipboard.*'\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends 'drag.*'\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'input.*'\n ? InputBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\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 `clipboard.*`\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'input.*'\n ? InputBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\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 `clipboard.*`\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'input.*'\n ? InputBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\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: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\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: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\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: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\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: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\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: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\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: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\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: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\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: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\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","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isInputBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","isArrowDown","originEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","getFocusBlockObject","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":"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"}
@@ -104,12 +104,12 @@ function createMarkdownBehaviors(config) {
104
104
  ...hrBlockOffsets
105
105
  }]]
106
106
  }), automaticHrOnPaste = behavior_core.defineBehavior({
107
- on: "paste",
107
+ on: "clipboard.paste",
108
108
  guard: ({
109
109
  snapshot,
110
110
  event
111
111
  }) => {
112
- const text = event.data.getData("text/plain"), hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.(snapshot.context), focusBlock = selector_isAtTheStartOfBlock.getFocusBlock(snapshot);
112
+ const text = event.originEvent.dataTransfer.getData("text/plain"), hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm, hrCharacters = text.match(hrRegExp)?.[0], hrObject = config.horizontalRuleObject?.(snapshot.context), focusBlock = selector_isAtTheStartOfBlock.getFocusBlock(snapshot);
113
113
  return !hrCharacters || !hrObject || !focusBlock ? !1 : {
114
114
  hrCharacters,
115
115
  hrObject,
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.markdown.cjs","sources":["../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n * Create markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {createMarkdownBehaviors, coreBehaviors} from '@portabletext/editor/behaviors'\n *\n * function App() {\n * return (\n * <EditorProvider\n * initialConfig={{\n * behaviors: [\n * ...coreBehaviors,\n * ...createMarkdownBehaviors({\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }),\n * ]\n * }}\n * >\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\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 previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({snapshot, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\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 blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n ],\n ],\n })\n const clearStyleOnBackspace = 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 const defaultStyle = config.defaultStyle?.(snapshot.context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\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 previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(snapshot.context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","focusTextBlock","focusSpan","previousInlineObject","getPreviousInlineObject","blockOffset","spanSelectionPointToBlockOffset","value","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","undefined","style","actions","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","data","getData","hrRegExp","hrCharacters","match","getFocusBlock","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","schema","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
1
+ {"version":3,"file":"behavior.markdown.cjs","sources":["../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n * Create markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {createMarkdownBehaviors, coreBehaviors} from '@portabletext/editor/behaviors'\n *\n * function App() {\n * return (\n * <EditorProvider\n * initialConfig={{\n * behaviors: [\n * ...coreBehaviors,\n * ...createMarkdownBehaviors({\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }),\n * ]\n * }}\n * >\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\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 previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\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 blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n ],\n ],\n })\n const clearStyleOnBackspace = 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 const defaultStyle = config.defaultStyle?.(snapshot.context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\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 previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(snapshot.context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","focusTextBlock","focusSpan","previousInlineObject","getPreviousInlineObject","blockOffset","spanSelectionPointToBlockOffset","value","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","undefined","style","actions","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","schema","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}