@portabletext/editor 1.45.3 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +20 -0
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +25 -25
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/editor-provider.cjs +93 -59
  6. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  7. package/lib/_chunks-es/behavior.core.js +20 -0
  8. package/lib/_chunks-es/behavior.core.js.map +1 -1
  9. package/lib/_chunks-es/behavior.markdown.js +26 -26
  10. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  11. package/lib/_chunks-es/editor-provider.js +93 -59
  12. package/lib/_chunks-es/editor-provider.js.map +1 -1
  13. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +1 -1
  14. package/lib/behaviors/index.cjs +37 -53
  15. package/lib/behaviors/index.cjs.map +1 -1
  16. package/lib/behaviors/index.d.cts +52 -37
  17. package/lib/behaviors/index.d.ts +52 -37
  18. package/lib/behaviors/index.js +38 -54
  19. package/lib/behaviors/index.js.map +1 -1
  20. package/lib/index.d.cts +33 -37
  21. package/lib/index.d.ts +33 -37
  22. package/lib/plugins/index.cjs +23 -29
  23. package/lib/plugins/index.cjs.map +1 -1
  24. package/lib/plugins/index.d.cts +33 -37
  25. package/lib/plugins/index.d.ts +33 -37
  26. package/lib/plugins/index.js +24 -30
  27. package/lib/plugins/index.js.map +1 -1
  28. package/lib/selectors/index.d.cts +33 -37
  29. package/lib/selectors/index.d.ts +33 -37
  30. package/lib/utils/index.d.cts +33 -37
  31. package/lib/utils/index.d.ts +33 -37
  32. package/package.json +1 -1
  33. package/src/behaviors/behavior.decorator-pair.ts +16 -19
  34. package/src/behaviors/behavior.emoji-picker.ts +26 -45
  35. package/src/behaviors/behavior.links.ts +5 -4
  36. package/src/behaviors/behavior.markdown.ts +37 -34
  37. package/src/behaviors/behavior.perform-event.ts +67 -18
  38. package/src/behaviors/behavior.types.action.ts +39 -13
  39. package/src/behaviors/behavior.types.guard.ts +1 -6
  40. package/src/behaviors/index.ts +3 -0
  41. package/src/editor/components/Synchronizer.tsx +6 -3
  42. package/src/editor/create-editor.ts +1 -1
  43. package/src/editor/editor-machine.ts +8 -6
  44. package/src/plugins/plugin.decorator-shortcut.ts +6 -8
  45. package/src/plugins/plugin.one-line.tsx +4 -4
@@ -1,11 +1,28 @@
1
1
  "use strict";
2
2
  var selector_isOverlappingSelection = require("./selector.is-overlapping-selection.cjs"), types = require("@sanity/types"), util_sliceBlocks = require("./util.slice-blocks.cjs");
3
+ function execute(event) {
4
+ return {
5
+ type: "execute",
6
+ event
7
+ };
8
+ }
3
9
  function raise(event) {
4
10
  return {
5
11
  type: "raise",
6
12
  event
7
13
  };
8
14
  }
15
+ function effect(effect2) {
16
+ return {
17
+ type: "effect",
18
+ effect: effect2
19
+ };
20
+ }
21
+ function noop() {
22
+ return {
23
+ type: "noop"
24
+ };
25
+ }
9
26
  function defineBehavior(behavior) {
10
27
  return behavior;
11
28
  }
@@ -606,6 +623,9 @@ const arrowDownOnLonelyBlockObject = {
606
623
  }, coreBehaviors = [coreAnnotationBehaviors.addAnnotationOnCollapsedSelection, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, ...coreDndBehaviors, 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];
607
624
  exports.coreBehaviors = coreBehaviors;
608
625
  exports.defineBehavior = defineBehavior;
626
+ exports.effect = effect;
627
+ exports.execute = execute;
609
628
  exports.isHotkey = isHotkey;
629
+ exports.noop = noop;
610
630
  exports.raise = raise;
611
631
  //# sourceMappingURL=behavior.core.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.cjs","sources":["../../src/behaviors/behavior.types.action.ts","../../src/behaviors/behavior.types.behavior.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.dnd.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["import type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {PortableTextSlateEditor} from '../types/editor'\nimport type {\n AbstractBehaviorEvent,\n CustomBehaviorEvent,\n SyntheticBehaviorEvent,\n} from './behavior.types.event'\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event:\n | AbstractBehaviorEvent\n | SyntheticBehaviorEvent\n | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**\n * @beta\n */\nexport function raise(\n event: AbstractBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\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\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n","import type {BehaviorActionSet} from './behavior.types.action'\nimport type {\n BehaviorEvent,\n BehaviorEventTypeNamespace,\n CustomBehaviorEvent,\n ResolveBehaviorEvent,\n} from './behavior.types.event'\nimport type {BehaviorGuard} from './behavior.types.guard'\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n ResolveBehaviorEvent<TBehaviorEventType> = ResolveBehaviorEvent<TBehaviorEventType>,\n> = {\n /**\n * Editor Event that triggers this Behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the Behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of Behavior Action sets.\n * Each set represents a step in the history stack.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, snapshot}) => event.text === 'a',\n * actions: [({event, snapshot}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<\n TBehaviorEventType,\n TPayload\n > = ResolveBehaviorEvent<TBehaviorEventType, TPayload>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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', at: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\n if (!isArrowDown) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return focusBlockObject && !nextBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (!isArrowUp) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return focusBlockObject && !previousBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (snapshot.context.readOnly) {\n return false\n }\n\n if (\n snapshot.context.selection &&\n !selectors.isSelectionCollapsed(snapshot)\n ) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n const previousBlock = selectors.getPreviousBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [\n ({snapshot, event}) => [\n raise({\n type: 'select',\n at: event.position.selection,\n }),\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n select: 'start',\n }),\n ],\n ],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (snapshot.context.readOnly) {\n return false\n }\n\n if (\n snapshot.context.selection &&\n !selectors.isSelectionCollapsed(snapshot)\n ) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n const nextBlock = selectors.getNextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [\n ({snapshot, event}) => [\n raise({\n type: 'select',\n at: event.position.selection,\n }),\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n select: 'start',\n }),\n ],\n ],\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 at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n at: {\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 at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n at: {\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 {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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} from './behavior.types.behavior'\n\nexport const coreDndBehaviors = [\n /**\n * When dragging over the drag origin, we don't want to show the caret in the\n * text.\n */\n defineBehavior({\n on: 'drag.dragover',\n guard: ({snapshot, event}) => {\n const dragOrigin = snapshot.beta.internalDrag?.origin\n const draggingOverDragOrigin = dragOrigin\n ? selectors.isOverlappingSelection(event.position.selection)({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: dragOrigin.selection,\n },\n })\n : false\n\n return draggingOverDragOrigin\n },\n actions: [() => [{type: 'noop'}]],\n }),\n]\n","import * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 children: [\n {\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 _type: snapshot.context.schema.block.name,\n children: [\n {\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 {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 {coreDndBehaviors} from './behavior.core.dnd'\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 ...coreDndBehaviors,\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":["raise","event","type","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","at","annotation","coreAnnotationBehaviors","IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","block","_type","schema","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","getFocusBlockObject","clickingAboveLonelyBlockObject","readOnly","position","isEditor","select","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","coreDndBehaviors","dragOrigin","beta","internalDrag","origin","isOverlappingSelection","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","_key","props","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/behaviors/behavior.types.action.ts","../../src/behaviors/behavior.types.behavior.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.dnd.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["import type {EditorSnapshot} from '../editor/editor-snapshot'\nimport type {PickFromUnion} from '../type-utils'\nimport type {PortableTextSlateEditor} from '../types/editor'\nimport type {\n AbstractBehaviorEvent,\n CustomBehaviorEvent,\n SyntheticBehaviorEvent,\n} from './behavior.types.event'\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | {\n type: 'execute'\n event:\n | AbstractBehaviorEvent\n | SyntheticBehaviorEvent\n | CustomBehaviorEvent\n }\n | {\n type: 'raise'\n event:\n | AbstractBehaviorEvent\n | SyntheticBehaviorEvent\n | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**\n * @beta\n */\nexport function execute(\n event: AbstractBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'execute'> {\n return {type: 'execute', event}\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: AbstractBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport function effect(\n effect: () => void,\n): PickFromUnion<BehaviorAction, 'type', 'effect'> {\n return {type: 'effect', effect}\n}\n\n/**\n * @beta\n */\nexport function noop(): PickFromUnion<BehaviorAction, 'type', 'noop'> {\n return {type: 'noop'}\n}\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\nexport type InternalBehaviorAction = (\n | SyntheticBehaviorEvent\n | {type: 'noop'}\n | {type: 'effect'; effect: () => void}\n) & {\n editor: PortableTextSlateEditor\n}\n","import type {BehaviorActionSet} from './behavior.types.action'\nimport type {\n BehaviorEvent,\n BehaviorEventTypeNamespace,\n CustomBehaviorEvent,\n ResolveBehaviorEvent,\n} from './behavior.types.event'\nimport type {BehaviorGuard} from './behavior.types.guard'\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n ResolveBehaviorEvent<TBehaviorEventType> = ResolveBehaviorEvent<TBehaviorEventType>,\n> = {\n /**\n * Editor Event that triggers this Behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the Behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of Behavior Action sets.\n * Each set represents a step in the history stack.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, snapshot}) => event.text === 'a',\n * actions: [({event, snapshot}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<\n TBehaviorEventType,\n TPayload\n > = ResolveBehaviorEvent<TBehaviorEventType, TPayload>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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', at: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\n if (!isArrowDown) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return focusBlockObject && !nextBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (!isArrowUp) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return focusBlockObject && !previousBlock\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [\n ({snapshot}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (snapshot.context.readOnly) {\n return false\n }\n\n if (\n snapshot.context.selection &&\n !selectors.isSelectionCollapsed(snapshot)\n ) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n const previousBlock = selectors.getPreviousBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [\n ({snapshot, event}) => [\n raise({\n type: 'select',\n at: event.position.selection,\n }),\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'before',\n select: 'start',\n }),\n ],\n ],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (snapshot.context.readOnly) {\n return false\n }\n\n if (\n snapshot.context.selection &&\n !selectors.isSelectionCollapsed(snapshot)\n ) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n const nextBlock = selectors.getNextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: event.position.selection,\n },\n })\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [\n ({snapshot, event}) => [\n raise({\n type: 'select',\n at: event.position.selection,\n }),\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n },\n placement: 'after',\n select: 'start',\n }),\n ],\n ],\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 at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n at: {\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 at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n at: {\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 {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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} from './behavior.types.behavior'\n\nexport const coreDndBehaviors = [\n /**\n * When dragging over the drag origin, we don't want to show the caret in the\n * text.\n */\n defineBehavior({\n on: 'drag.dragover',\n guard: ({snapshot, event}) => {\n const dragOrigin = snapshot.beta.internalDrag?.origin\n const draggingOverDragOrigin = dragOrigin\n ? selectors.isOverlappingSelection(event.position.selection)({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: dragOrigin.selection,\n },\n })\n : false\n\n return draggingOverDragOrigin\n },\n actions: [() => [{type: 'noop'}]],\n }),\n]\n","import * as selectors from '../selectors'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 children: [\n {\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 _type: snapshot.context.schema.block.name,\n children: [\n {\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 {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 {coreDndBehaviors} from './behavior.core.dnd'\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 ...coreDndBehaviors,\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":["execute","event","type","raise","effect","noop","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","at","annotation","coreAnnotationBehaviors","IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","block","_type","schema","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","getFocusBlockObject","clickingAboveLonelyBlockObject","readOnly","position","isEditor","select","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","coreDndBehaviors","dragOrigin","beta","internalDrag","origin","isOverlappingSelection","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","_key","props","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":";;AAsCO,SAASA,QACdC,OACkD;AAC3C,SAAA;AAAA,IAACC,MAAM;AAAA,IAAWD;AAAAA,EAAK;AAChC;AAKO,SAASE,MACdF,OACgD;AACzC,SAAA;AAAA,IAACC,MAAM;AAAA,IAASD;AAAAA,EAAK;AAC9B;AAKO,SAASG,OACdA,SACiD;AAC1C,SAAA;AAAA,IAACF,MAAM;AAAA,IAAUE,QAAAA;AAAAA,EAAM;AAChC;AAKO,SAASC,OAAsD;AAC7D,SAAA;AAAA,IAACH,MAAM;AAAA,EAAM;AACtB;ACEO,SAASI,eAYdC,UACU;AACHA,SAAAA;AACT;AChFA,MAAMC,oCAAmD;AAAA,EACvDC,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACjB,QAAA,CAACC,gCAAUC,qBAAqBF,QAAQ;AACnC,aAAA;AAGHG,UAAAA,qBAAqBF,gCAAUG,sBAAsBJ,QAAQ;AAEnE,WACE,CAACG,sBACD,CAACF,oDAA8B;AAAA,MAE7BI,SAAS;AAAA,QACP,GAAGL,SAASK;AAAAA,QACZC,WAAWH;AAAAA,MAAAA;AAAAA,IAEd,CAAA,IAEM,KAGF;AAAA,MAACA;AAAAA,IAAkB;AAAA,EAC5B;AAAA,EACAI,SAAS,CACP,CAAC;AAAA,IAACjB;AAAAA,EAAAA,GAAQ;AAAA,IAACa;AAAAA,EAAkB,MAAM,CACjCX,MAAM;AAAA,IAACD,MAAM;AAAA,IAAUiB,IAAIL;AAAAA,EAAmB,CAAA,GAC9CX,MAAM;AAAA,IAACD,MAAM;AAAA,IAAkBkB,YAAYnB,MAAMmB;AAAAA,EAAAA,CAAW,CAAC,CAC9D;AAEL,GAEaC,0BAA0B;AAAA,EACrCb;AACF,GCpBMc,SACJ,OAAOC,SAAW,OAClB,uBAAuBC,KAAKD,OAAOE,UAAUC,SAAS,GAIlDC,YAAkD;AAAA,EACtDC,KAAK;AAAA,EACLC,SAAS;AAAA,EACTC,MAAM;AAAA,EACNC,OAAO;AACT,GAEMC,UAA8C;AAAA,EAClDC,KAAK;AAAA,EACLC,OAAO;AAAA,EACPC,KAAK;AAAA,EACLC,SAAS;AAAA,EACTC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,KAAK;AAAA,EACLC,KAAK;AAAA,EACLC,MAAM;AAAA,EACNC,KAAKtB,SAAS,SAAS;AAAA,EACvBuB,KAAK;AAAA,EACLC,QAAQ;AAAA,EACRC,QAAQ;AAAA,EACRC,OAAO;AAAA,EACPC,OAAO;AAAA,EACPC,UAAU;AAAA,EACVC,IAAI;AAAA,EACJC,KAAK;AAAA,EACLC,SAAS;AACX,GAEMC,WAA+C;AAAA,EACnD,WAAa;AAAA,EACb,KAAO;AAAA,EACP,OAAS;AAAA,EACT,OAAS;AAAA,EACT,SAAW;AAAA,EACX,KAAO;AAAA,EACP,OAAS;AAAA,EACT,UAAY;AAAA,EACZ,QAAU;AAAA,EACV,KAAK;AAAA,EACL,QAAU;AAAA,EACV,UAAY;AAAA,EACZ,KAAO;AAAA,EACP,MAAQ;AAAA,EACR,WAAa;AAAA,EACb,SAAW;AAAA,EACX,YAAc;AAAA,EACd,WAAa;AAAA,EACb,QAAU;AAAA,EACV,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,YAAc;AAAA,EACd,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,IAAM;AAAA,EACN,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AAAA,EACP,KAAO;AACT;AAEgBC,SAAAA,SAASC,QAAgBvD,OAAmC;AAC1E,SAAOwD,cAAcC,YAAYF,MAAM,GAAGvD,KAAK;AACjD;AAEA,SAASyD,YAAYF,QAAwB;AAE3C,QAAMG,eAAuB;AAAA,IAC3BC,QAAQ;AAAA,IACRC,SAAS;AAAA,IACTC,SAAS;AAAA,IACTC,UAAU;AAAA,EAAA,GAINC,iBAAiBR,OAAOS,QAAQ,MAAM,MAAM,EAAEC,MAAM,GAAG;AAE7D,aAAWC,oBAAoBH,gBAAgB;AAC7C,UAAMI,WACJD,iBAAiBE,SAAS,GAAG,KAAKF,iBAAiBG,SAAS,GACxDC,gBAAgBH,WAClBD,iBAAiBK,MAAM,GAAG,EAAE,IAC5BL,kBACEM,UAAUC,UAAUH,aAAa,GACjCI,WAAWhD,UAAU8C,OAAO,GAC5BG,QAAQ5C,QAAQuC,aAAa,GAC7BM,OAAOvB,SAASmB,OAAO;AAE7B,QACEF,cAAcD,SAAS,KACvBK,aAAaG,UACbF,UAAUE,UACVD,SAASC;AAET,YAAM,IAAIC,UAAU,sBAAsBR,aAAa,GAAG;AAG5D,KAAIP,eAAeM,WAAW,KAAKK,aAAaG,YAC9CnB,aAAaqB,MAAMP,SACnBd,aAAasB,UAAUC,UAAUX,aAAa,IAG5CI,aAAaG,WACfnB,aAAagB,QAAQ,IAAIP,WAAW,OAAO;AAAA,EAAA;AAIxCT,SAAAA;AACT;AAEA,SAASF,cACPE,cACA1D,OACS;AAEN0D,UAAAA,aAAaC,UAAU,QACpBD,aAAaC,WAAW3D,MAAM2D,YAEjCD,aAAaE,WAAW,QACrBF,aAAaE,YAAY5D,MAAM4D,aAElCF,aAAaG,WAAW,QACrBH,aAAaG,YAAY7D,MAAM6D,aAElCH,aAAaI,YAAY,QACtBJ,aAAaI,aAAa9D,MAAM8D,YAOlCJ,aAAasB,YAAYH,UAAa7E,MAAMgF,YAAYH,SACtDnB,aAAasB,YAAY,MAAMhF,MAAMgF,YAAY,KAC5C,KAGFtB,aAAasB,YAAYhF,MAAMgF,UAItCtB,aAAasB,YAAYhF,MAAMgF,WAC/BtB,aAAaqB,QAAQ/E,MAAM+E,IAAIG,YAbxB,IAAA;AAeX;AAEA,SAASD,UAAUE,MAAsB;AACjCX,QAAAA,UAAUC,UAAUU,IAAI;AAG9B,SAFgB9B,SAASmB,OAAO,KAAKA,QAAQY,YAAY,EAAEC,WAAW,CAAC;AAGzE;AAEA,SAASZ,UAAUU,MAAsB;AACjCX,QAAAA,UAAUW,KAAKD,YAAY;AAE1BnD,SAAAA,QAAQyC,OAAO,KAAKA;AAC7B;ACzMA,MAAMc,+BAA8C;AAAA,EAClD9E,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAUV;AAAAA,EAAAA,MAAW;AAGxB,QAAA,CAFgBsD,SAAS,aAAatD,MAAMuF,WAAW,KAQvD,CAFuB5E,gCAAUC,qBAAqBF,QAAQ;AAGzD,aAAA;AAGH8E,UAAAA,mBAAmB7E,gCAAAA,oBAA8BD,QAAQ,GACzD+E,YAAY9E,6CAAuBD,QAAQ;AAEjD,WAAO8E,oBAAoB,CAACC;AAAAA,EAC9B;AAAA,EACAxE,SAAS,CACP,CAAC;AAAA,IAACP;AAAAA,EAAQ,MAAM,CACdR,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,IACvC;AAAA,IACAU,WAAW;AAAA,EAAA,CACZ,CAAC,CACH;AAEL,GAEMC,6BAA4C;AAAA,EAChDtF,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAUV;AAAAA,EAAAA,MAAW;AAGxB,QAAA,CAFcsD,SAAS,WAAWtD,MAAMuF,WAAW,KAQnD,CAFuB5E,gCAAUC,qBAAqBF,QAAQ;AAGzD,aAAA;AAGH8E,UAAAA,mBAAmB7E,gCAAAA,oBAA8BD,QAAQ,GACzDqF,gBAAgBpF,iDAA2BD,QAAQ;AAEzD,WAAO8E,oBAAoB,CAACO;AAAAA,EAC9B;AAAA,EACA9E,SAAS,CACP,CAAC;AAAA,IAACP;AAAAA,EAAQ,MAAM,CACdR,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,IACvC;AAAA,IACAU,WAAW;AAAA,EAAA,CACZ,CAAC,CACH;AAEL,GAEMG,sBAAqC;AAAA,EACzCxF,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACf8E,UAAAA,mBAAmB7E,gCAAUsF,oBAAoBvF,QAAQ;AAG/D,WAF2BC,qDAA+BD,QAAQ,KAErC8E,qBAAqBX;AAAAA,EACpD;AAAA,EACA5D,SAAS,CACP,CAAC;AAAA,IAACP;AAAAA,EAAQ,MAAM,CACdR,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,IACvC;AAAA,IACAU,WAAW;AAAA,EAAA,CACZ,CAAC,CACH;AAEL,GAEMK,iCAAgD;AAAA,EACpD1F,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAUV;AAAAA,EAAAA,MAAW;AACxBU,QAAAA,SAASK,QAAQoF,YAKnBzF,SAASK,QAAQC,aACjB,CAACL,gCAAUC,qBAAqBF,QAAQ;AAEjC,aAAA;AAGH8E,UAAAA,mBAAmB7E,gCAAAA,oBAA8B;AAAA,MAErDI,SAAS;AAAA,QACP,GAAGL,SAASK;AAAAA,QACZC,WAAWhB,MAAMoG,SAASpF;AAAAA,MAAAA;AAAAA,IAC5B,CACD,GACK+E,gBAAgBpF,iDAA2B;AAAA,MAE/CI,SAAS;AAAA,QACP,GAAGL,SAASK;AAAAA,QACZC,WAAWhB,MAAMoG,SAASpF;AAAAA,MAAAA;AAAAA,IAC5B,CACD;AAGChB,WAAAA,MAAMoG,SAASC,YACfrG,MAAMoG,SAASV,UAAU,WACzBF,oBACA,CAACO;AAAAA,EAEL;AAAA,EACA9E,SAAS,CACP,CAAC;AAAA,IAACP;AAAAA,IAAUV;AAAAA,EAAK,MAAM,CACrBE,MAAM;AAAA,IACJD,MAAM;AAAA,IACNiB,IAAIlB,MAAMoG,SAASpF;AAAAA,EACpB,CAAA,GACDd,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,IACvC;AAAA,IACAU,WAAW;AAAA,IACXS,QAAQ;AAAA,EAAA,CACT,CAAC,CACH;AAEL,GAEMC,iCAAgD;AAAA,EACpD/F,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAUV;AAAAA,EAAAA,MAAW;AACxBU,QAAAA,SAASK,QAAQoF,YAKnBzF,SAASK,QAAQC,aACjB,CAACL,gCAAUC,qBAAqBF,QAAQ;AAEjC,aAAA;AAGH8E,UAAAA,mBAAmB7E,gCAAAA,oBAA8B;AAAA,MAErDI,SAAS;AAAA,QACP,GAAGL,SAASK;AAAAA,QACZC,WAAWhB,MAAMoG,SAASpF;AAAAA,MAAAA;AAAAA,IAC5B,CACD,GACKyE,YAAY9E,6CAAuB;AAAA,MAEvCI,SAAS;AAAA,QACP,GAAGL,SAASK;AAAAA,QACZC,WAAWhB,MAAMoG,SAASpF;AAAAA,MAAAA;AAAAA,IAC5B,CACD;AAGChB,WAAAA,MAAMoG,SAASC,YACfrG,MAAMoG,SAASV,UAAU,SACzBF,oBACA,CAACC;AAAAA,EAEL;AAAA,EACAxE,SAAS,CACP,CAAC;AAAA,IAACP;AAAAA,IAAUV;AAAAA,EAAK,MAAM,CACrBE,MAAM;AAAA,IACJD,MAAM;AAAA,IACNiB,IAAIlB,MAAMoG,SAASpF;AAAAA,EACpB,CAAA,GACDd,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,IACvC;AAAA,IACAU,WAAW;AAAA,IACXS,QAAQ;AAAA,EAAA,CACT,CAAC,CACH;AAEL,GAEME,yCAAwD;AAAA,EAC5DhG,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAM+F,iBAAiB9F,gCAAAA,kBAA4BD,QAAQ,GACrDgG,qBAAqB/F,qDAA+BD,QAAQ,GAC5DqF,gBAAgBpF,iDAA2BD,QAAQ;AAEzD,WAAI,CAAC+F,kBAAkB,CAACC,sBAAsB,CAACX,gBACtC,KAIPY,iBAAAA,iBAAiBF,eAAeG,IAAI,KACpC,CAACC,MAAwBd,wBAAAA,cAAca,IAAI,IAEpC;AAAA,MAACH;AAAAA,MAAgBV;AAAAA,IAAAA,IAGnB;AAAA,EACT;AAAA,EACA9E,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACL;AAAAA,IAAgBV;AAAAA,EAAa,MAAM,CACtC7F,MAAM;AAAA,IACJD,MAAM;AAAA,IACNiB,IAAIuF,eAAeM;AAAAA,EACpB,CAAA,GACD7G,MAAM;AAAA,IACJD,MAAM;AAAA,IACNiB,IAAI;AAAA,MACF8F,QAAQ;AAAA,QAACD,MAAMhB,cAAcgB;AAAAA,QAAME,QAAQ;AAAA,MAAC;AAAA,MAC5CC,OAAO;AAAA,QAACH,MAAMhB,cAAcgB;AAAAA,QAAME,QAAQ;AAAA,MAAA;AAAA,IAAC;AAAA,EAC7C,CACD,CAAC,CACH;AAEL,GAEME,0CAAyD;AAAA,EAC7D3G,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAM+F,iBAAiB9F,gCAAAA,kBAA4BD,QAAQ,GACrDgG,qBAAqB/F,qDAA+BD,QAAQ,GAC5D+E,YAAY9E,6CAAuBD,QAAQ;AAEjD,WAAI,CAAC+F,kBAAkB,CAACC,sBAAsB,CAACjB,YACtC,KAIPkB,iBAAAA,iBAAiBF,eAAeG,IAAI,KACpC,CAACC,MAAwBpB,wBAAAA,UAAUmB,IAAI,IAEhC;AAAA,MAACH;AAAAA,MAAgBhB;AAAAA,IAAAA,IAGnB;AAAA,EACT;AAAA,EACAxE,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACL;AAAAA,IAAgBhB;AAAAA,EAAS,MAAM,CAClCvF,MAAM;AAAA,IACJD,MAAM;AAAA,IACNiB,IAAIuF,eAAeM;AAAAA,EACpB,CAAA,GACD7G,MAAM;AAAA,IACJD,MAAM;AAAA,IACNiB,IAAI;AAAA,MACF8F,QAAQ;AAAA,QAACD,MAAMtB,UAAUsB;AAAAA,QAAME,QAAQ;AAAA,MAAC;AAAA,MACxCC,OAAO;AAAA,QAACH,MAAMtB,UAAUsB;AAAAA,QAAME,QAAQ;AAAA,MAAA;AAAA,IAAC;AAAA,EACzC,CACD,CAAC,CACH;AAEL,GAEaG,2BAA2B;AAAA,EACtC9B;AAAAA,EACAQ;AAAAA,EACAE;AAAAA,EACAE;AAAAA,EACAK;AAAAA,EACAC;AAAAA,EACAW;AACF,GCxRaE,yBAAyB;AAAA,EACpCC,gBAA+B;AAAA,IAC7B9G,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUV;AAAAA,IAAAA,MACjBsD,SAAS,SAAStD,MAAMuF,WAAW,KACnC7E,SAASK,QAAQ6E,OAAO2B,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,QACrC;AAAA,IACFzG,SAAS,CAAC,MAAM,CAACf,MAAM;AAAA,MAACD,MAAM;AAAA,MAAoBwH,WAAW;AAAA,IAAA,CAAS,CAAC,CAAC;AAAA,EAAA;AAAA,EAE1EE,YAA2B;AAAA,IACzBnH,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUV;AAAAA,IAAAA,MACjBsD,SAAS,SAAStD,MAAMuF,WAAW,KACnC7E,SAASK,QAAQ6E,OAAO2B,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,IACrC;AAAA,IACFzG,SAAS,CAAC,MAAM,CAACf,MAAM;AAAA,MAACD,MAAM;AAAA,MAAoBwH,WAAW;AAAA,IAAA,CAAK,CAAC,CAAC;AAAA,EAAA;AAAA,EAEtEG,mBAAkC;AAAA,IAChCpH,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUV;AAAAA,IAAAA,MACjBsD,SAAS,SAAStD,MAAMuF,WAAW,KACnC7E,SAASK,QAAQ6E,OAAO2B,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,WACrC;AAAA,IACFzG,SAAS,CACP,MAAM,CAACf,MAAM;AAAA,MAACD,MAAM;AAAA,MAAoBwH,WAAW;AAAA,IAAA,CAAY,CAAC,CAAC;AAAA,EAAA;AAAA,EAGrEI,cAA6B;AAAA,IAC3BrH,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUV;AAAAA,IAAAA,MACjBsD,SAAS,SAAStD,MAAMuF,WAAW,KACnC7E,SAASK,QAAQ6E,OAAO2B,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU,MACrC;AAAA,IACFzG,SAAS,CAAC,MAAM,CAACf,MAAM;AAAA,MAACD,MAAM;AAAA,MAAoBwH,WAAW;AAAA,IAAA,CAAO,CAAC,CAAC;AAAA,EACvE;AACH,GCxCaK,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf;AAAA,IACbtH,IAAI;AAAA,IACJC,OAAOA,CAAC;AAAA,MAACC;AAAAA,MAAUV;AAAAA,IAAAA,MAAW;AACtB+H,YAAAA,aAAarH,SAASsH,KAAKC,cAAcC;AAW/C,aAV+BH,aAC3BpH,gCAAUwH,uBAAuBnI,MAAMoG,SAASpF,SAAS,EAAE;AAAA,QACzD,GAAGN;AAAAA,QACHK,SAAS;AAAA,UACP,GAAGL,SAASK;AAAAA,UACZC,WAAW+G,WAAW/G;AAAAA,QAAAA;AAAAA,MAEzB,CAAA,IACD;AAAA,IAGN;AAAA,IACAC,SAAS,CAAC,MAAM,CAAC;AAAA,MAAChB,MAAM;AAAA,IAAA,CAAO,CAAC;AAAA,EACjC;AAAC,GCrBEmI,8BAA6C;AAAA,EACjD5H,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACf+F,UAAAA,iBAAiB9F,gCAAAA,kBAA4BD,QAAQ,GACrDgG,qBAAqB/F,qDAA+BD,QAAQ;AAElE,QAAI,CAACA,SAASK,QAAQC,aAAa,CAACyF,kBAAkB,CAACC;AAC9C,aAAA;AAGT,UAAM2B,kBACJ1H,gCAA4B8F,kBAAAA,cAAc,EAAE/F,QAAQ,GAEhD4H,gBAAgB7B,eAAeG,KAAK2B,UACpCC,aAAa/B,eAAeG,KAAK6B;AAEvC,WAAIJ,kBACK;AAAA,MAACC;AAAAA,MAAeE;AAAAA,IAAAA,IAGlB;AAAA,EACT;AAAA,EACAvH,SAAS,CACP,CAAC;AAAA,IAACP;AAAAA,EAAAA,GAAW;AAAA,IAAC4H;AAAAA,IAAeE;AAAAA,EAAU,MAAM,CAC3CtI,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,MACrCuD,UAAU,CACR;AAAA,QACE/C,OAAOjF,SAASK,QAAQ6E,OAAO+C,KAAKxD;AAAAA,QACpCyD,MAAM;AAAA,QACNC,OAAO,CAAA;AAAA,MAAA,CACR;AAAA,MAEHC,UAAU,CAAE;AAAA,MACZP,UAAUD;AAAAA,MACVG,OAAOD;AAAAA,MACPO,OAAOrI,SAASK,QAAQ6E,OAAOoD,OAAO,CAAC,GAAGtB;AAAAA,IAC5C;AAAA,IACA7B,WAAW;AAAA,EAAA,CACZ,CAAC,CACH;AAEL,GAEMoD,gCAA+C;AAAA,EACnDzI,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACf+F,UAAAA,iBAAiB9F,gCAAAA,kBAA4BD,QAAQ,GACrDgG,qBAAqB/F,qDAA+BD,QAAQ;AAElE,QAAI,CAACA,SAASK,QAAQC,aAAa,CAACyF,kBAAkB,CAACC;AAC9C,aAAA;AAGHwC,UAAAA,YAAYvI,gCAAAA,aAAuBD,QAAQ,GAE3CyI,kBAAkBD,WAAWtC,KAAKiC,OAAOO,OAC5CC,CAAAA,SACC3I,SAASK,QAAQ6E,OAAO2B,WAAWC,KAChCC,CAAcA,cAAAA,UAAUC,UAAU2B,IACrC,KAAK,CACT,CAAA,GACMC,mBACJJ,WAAWtC,KAAKiC,OAAOO,OACpBC,CACC,SAAA,CAAC3I,SAASK,QAAQ6E,OAAO2B,WAAWC,KACjCC,CAAcA,cAAAA,UAAUC,UAAU2B,IACrC,CACJ,KAAK,CACDf,GAAAA,gBAAgB7B,eAAeG,KAAK2B,UACpCC,aAAa/B,eAAeG,KAAK6B;AAKvC,WAFE9H,oDAA8B8F,cAAc,EAAE/F,QAAQ,IAG/C;AAAA,MAAC4I;AAAAA,MAAkBH;AAAAA,MAAiBb;AAAAA,MAAeE;AAAAA,IAAAA,IAGrD;AAAA,EACT;AAAA,EACAvH,SAAS,CACP,CACE;AAAA,IAACP;AAAAA,EAAAA,GACD;AAAA,IAAC4I;AAAAA,IAAkBH;AAAAA,IAAiBb;AAAAA,IAAeE;AAAAA,EAAU,MAC1D,CACHtI,MAAM;AAAA,IACJD,MAAM;AAAA,IACNyF,OAAO;AAAA,MACLC,OAAOjF,SAASK,QAAQ6E,OAAOF,MAAMP;AAAAA,MACrCuD,UAAU,CACR;AAAA,QACE/C,OAAOjF,SAASK,QAAQ6E,OAAO+C,KAAKxD;AAAAA,QACpC0D,OAAOS,iBAAiBjF,WAAW,IAAI8E,kBAAkB,CAAE;AAAA,QAC3DP,MAAM;AAAA,MAAA,CACP;AAAA,MAEHL,UAAUD;AAAAA,MACVG,OAAOD;AAAAA,MACPO,OAAOrI,SAASK,QAAQ6E,OAAOoD,OAAO,CAAC,GAAGtB;AAAAA,IAC5C;AAAA,IACA7B,WAAW;AAAA,IACXS,QAAQ;AAAA,EAAA,CACT,CAAC,CACH;AAEL,GAEaiD,2BAA2B;AAAA,EACtCnB;AAAAA,EACAa;AACF,GC9GMO,iBAAiB,IAEjBC,uBAAsC;AAAA,EAC1CjJ,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAMgG,qBAAqB/F,gCAAAA,qBAA+BD,QAAQ,GAC5D+F,iBAAiB9F,kDAA4BD,QAAQ,GACrDwI,YAAYvI,6CAAuBD,QAAQ;AAE7C,WAAA,CAACgG,sBAAsB,CAACD,kBAAkB,CAACyC,YACtC,KAIPzC,eAAeG,KAAK8B,SAAS,CAAC,EAAEgB,SAASR,UAAUtC,KAAK8C,QACxDhJ,SAASK,QAAQC,WAAWkG,MAAMD,WAAW,KAElBR,eAAeG,KAAK6B,UAAU,IAClD;AAAA,MAAChC;AAAAA,IAAAA,IAGH;AAAA,EACT;AAAA,EACAxF,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACL;AAAAA,EAAc,MAAM,CACvBvG,MAAM;AAAA,IACJD,MAAM;AAAA,IACN0J,OAAO,CAAC,YAAY,OAAO;AAAA,IAC3BzI,IAAIuF,eAAeM;AAAAA,EAAAA,CACpB,CAAC,CACH;AAEL,GAEM6C,0BAAyC;AAAA,EAC7CpJ,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACrB,UAAMgG,qBAAqB/F,gCAAAA,qBAA+BD,QAAQ,GAC5D+F,iBAAiB9F,kDAA4BD,QAAQ,GACrDwI,YAAYvI,6CAAuBD,QAAQ;AAEjD,WAAI,CAACgG,sBAAsB,CAACD,kBAAkB,CAACyC,YACtC,KAIPzC,eAAeG,KAAK8B,SAAS,CAAC,EAAEgB,SAASR,UAAUtC,KAAK8C,QACxDhJ,SAASK,QAAQC,WAAWkG,MAAMD,WAAW,KAI7CR,eAAeG,KAAK6B,UAAU5D,UAC9B4B,eAAeG,KAAK6B,QAAQ,IAErB;AAAA,MAAChC;AAAAA,MAAgBgC,OAAOhC,eAAeG,KAAK6B,QAAQ;AAAA,IAAA,IAGtD;AAAA,EACT;AAAA,EACAxH,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACL;AAAAA,IAAgBgC;AAAAA,EAAK,MAAM,CAC9BvI,MAAM;AAAA,IACJD,MAAM;AAAA,IACN0J,OAAO;AAAA,MAAClB;AAAAA,IAAK;AAAA,IACbvH,IAAIuF,eAAeM;AAAAA,EAAAA,CACpB,CAAC,CACH;AAEL,GAEM8C,mBAAkC;AAAA,EACtCrJ,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAc;AACfgG,UAAAA,qBAAqB/F,gCAAAA,qBAA+BD,QAAQ,GAC5DoJ,iBAAiBnJ,kDAA4BD,QAAQ;AAGzD,WAAA,CAACgG,sBACD,CAACoD,kBACD,CAACnD,iBAAiBmD,iBAAAA,eAAelD,IAAI,IAE9B,KAGF;AAAA,MAACkD;AAAAA,IAAc;AAAA,EACxB;AAAA,EACA7I,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACgD;AAAAA,EAAc,MAAM,CACvB5J,MAAM;AAAA,IACJD,MAAM;AAAA,IACN0J,OAAO,CAAC,YAAY,OAAO;AAAA,IAC3BzI,IAAI4I,eAAe/C;AAAAA,EAAAA,CACpB,CAAC,CACH;AAEL,GAEMgD,kBAAiC;AAAA,EACrCvJ,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAUV;AAAAA,EAAAA,MAAW;AAG5B,QAAI,CAFUsD,SAAS,OAAOtD,MAAMuF,WAAW;AAGtC,aAAA;AAGT,UAAMyE,iBAAiBrJ,gCAAAA,kBAA4BD,QAAQ,GACrDuJ,SAASC,6CAAaxJ,SAASK,OAAO,GACtCoJ,qBAAqBH,eAAeI,QAAS1E,CACjDuE,UAAAA,OAAOI,YAAY3E,MAAMkB,IAAI,IACzB,CACE;AAAA,MACEA,MAAMlB,MAAMkB;AAAAA,MACZG,MAAMrB,MAAMqB;AAAAA,IACb,CAAA,IAEH,CAAA,CACN;AAEIoD,WAAAA,mBAAmB9F,WAAW2F,eAAe3F,SACxC;AAAA,MAAC8F;AAAAA,IAAAA,IAGH;AAAA,EACT;AAAA,EACAlJ,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACqD;AAAAA,EACHA,MAAAA,mBAAmBG,IAAKC,CAAAA,sBACtBrK,MAAM;AAAA,IACJD,MAAM;AAAA,IACN0J,OAAO;AAAA,MACLlB,OAAO+B,KAAKC,IACVjB,gBACAgB,KAAKE,IAAI,GAAGH,kBAAkB3D,KAAK6B,QAAQ,CAAC,CAC9C;AAAA,IACF;AAAA,IACAvH,IAAIqJ,kBAAkBxD;AAAAA,EAAAA,CACvB,CACH,CAAC;AAEP,GAEM4D,yBAAwC;AAAA,EAC5CnK,IAAI;AAAA,EACJC,OAAOA,CAAC;AAAA,IAACC;AAAAA,IAAUV;AAAAA,EAAAA,MAAW;AAG5B,QAAI,CAFesD,SAAS,aAAatD,MAAMuF,WAAW;AAGjD,aAAA;AAGT,UAAMyE,iBAAiBrJ,gCAAAA,kBAA4BD,QAAQ,GACrDuJ,SAASC,6CAAaxJ,SAASK,OAAO,GACtCoJ,qBAAqBH,eAAeI,QAAS1E,CACjDuE,UAAAA,OAAOI,YAAY3E,MAAMkB,IAAI,IACzB,CACE;AAAA,MACEA,MAAMlB,MAAMkB;AAAAA,MACZG,MAAMrB,MAAMqB;AAAAA,IACb,CAAA,IAEH,CAAA,CACN;AAEIoD,WAAAA,mBAAmB9F,WAAW2F,eAAe3F,SACxC;AAAA,MAAC8F;AAAAA,IAAAA,IAGH;AAAA,EACT;AAAA,EACAlJ,SAAS,CACP,CAAC6F,GAAG;AAAA,IAACqD;AAAAA,EACHA,MAAAA,mBAAmBG,IAAKC,CAAAA,sBACtBrK,MAAM;AAAA,IACJD,MAAM;AAAA,IACN0J,OAAO;AAAA,MACLlB,OAAO+B,KAAKC,IACVjB,gBACAgB,KAAKE,IAAI,GAAGH,kBAAkB3D,KAAK6B,QAAQ,CAAC,CAC9C;AAAA,IACF;AAAA,IACAvH,IAAIqJ,kBAAkBxD;AAAAA,EAAAA,CACvB,CACH,CAAC;AAEP,GAEa6D,oBAAoB;AAAA,EAC/BnB;AAAAA,EACAG;AAAAA,EACAC;AAAAA,EACAE;AAAAA,EACAY;AACF,GC9LaE,gBAAgB,CAC3BzJ,wBAAwBb,mCACxB8G,uBAAuBC,gBACvBD,uBAAuBM,YACvBN,uBAAuBO,mBACvBP,uBAAuBQ,cACvB,GAAGC,kBACHV,yBAAyBlB,gCACzBkB,yBAAyBb,gCACzBa,yBAAyB9B,8BACzB8B,yBAAyBtB,4BACzBsB,yBAAyBpB,qBACzBoB,yBAAyBZ,wCACzBY,yBAAyBD,yCACzByD,kBAAkBnB,sBAClBmB,kBAAkBhB,yBAClBgB,kBAAkBf,kBAClBe,kBAAkBb,iBAClBa,kBAAkBD,wBAClBpB,yBAAyBnB,6BACzBmB,yBAAyBN,6BAA6B;;;;;;;;"}
@@ -31,23 +31,23 @@ function createMarkdownBehaviors(config) {
31
31
  style: blockquoteStyle
32
32
  } : !1;
33
33
  },
34
- actions: [() => [{
34
+ actions: [() => [behavior_core.execute({
35
35
  type: "insert.text",
36
36
  text: " "
37
- }], (_, {
37
+ })], (_, {
38
38
  focusTextBlock,
39
39
  style
40
- }) => [{
40
+ }) => [behavior_core.execute({
41
41
  type: "block.unset",
42
42
  props: ["listItem", "level"],
43
43
  at: focusTextBlock.path
44
- }, {
44
+ }), behavior_core.execute({
45
45
  type: "block.set",
46
46
  props: {
47
47
  style
48
48
  },
49
49
  at: focusTextBlock.path
50
- }, behavior_core.raise({
50
+ }), behavior_core.execute({
51
51
  type: "delete.text",
52
52
  at: {
53
53
  anchor: {
@@ -91,20 +91,20 @@ function createMarkdownBehaviors(config) {
91
91
  },
92
92
  actions: [(_, {
93
93
  hrCharacter
94
- }) => [{
94
+ }) => [behavior_core.execute({
95
95
  type: "insert.text",
96
96
  text: hrCharacter
97
- }], (_, {
97
+ })], (_, {
98
98
  hrObject,
99
99
  hrBlockOffsets
100
- }) => [{
100
+ }) => [behavior_core.execute({
101
101
  type: "insert.block",
102
102
  placement: "before",
103
103
  block: {
104
104
  _type: hrObject.name,
105
105
  ...hrObject.value ?? {}
106
106
  }
107
- }, behavior_core.raise({
107
+ }), behavior_core.execute({
108
108
  type: "delete.text",
109
109
  at: hrBlockOffsets
110
110
  })]]
@@ -123,39 +123,39 @@ function createMarkdownBehaviors(config) {
123
123
  },
124
124
  actions: [(_, {
125
125
  hrCharacters
126
- }) => [{
126
+ }) => [behavior_core.execute({
127
127
  type: "insert.text",
128
128
  text: hrCharacters
129
- }], ({
129
+ })], ({
130
130
  snapshot
131
131
  }, {
132
132
  hrObject,
133
133
  focusBlock
134
- }) => types.isPortableTextTextBlock(focusBlock.node) ? [{
134
+ }) => types.isPortableTextTextBlock(focusBlock.node) ? [behavior_core.execute({
135
135
  type: "insert.block",
136
136
  block: {
137
137
  _type: snapshot.context.schema.block.name,
138
138
  children: focusBlock.node.children
139
139
  },
140
140
  placement: "after"
141
- }, {
141
+ }), behavior_core.execute({
142
142
  type: "insert.block",
143
143
  block: {
144
144
  _type: hrObject.name,
145
145
  ...hrObject.value ?? {}
146
146
  },
147
147
  placement: "after"
148
- }, {
148
+ }), behavior_core.execute({
149
149
  type: "delete.block",
150
150
  at: focusBlock.path
151
- }] : [{
151
+ })] : [behavior_core.execute({
152
152
  type: "insert.block",
153
153
  block: {
154
154
  _type: hrObject.name,
155
155
  ...hrObject.value ?? {}
156
156
  },
157
157
  placement: "after"
158
- }]]
158
+ })]]
159
159
  }), automaticHeadingOnSpace = behavior_core.defineBehavior({
160
160
  on: "insert.text",
161
161
  guard: ({
@@ -195,21 +195,21 @@ function createMarkdownBehaviors(config) {
195
195
  },
196
196
  actions: [({
197
197
  event
198
- }) => [event], (_, {
198
+ }) => [behavior_core.execute(event)], (_, {
199
199
  focusTextBlock,
200
200
  style,
201
201
  level
202
- }) => [{
202
+ }) => [behavior_core.execute({
203
203
  type: "block.unset",
204
204
  props: ["listItem", "level"],
205
205
  at: focusTextBlock.path
206
- }, {
206
+ }), behavior_core.execute({
207
207
  type: "block.set",
208
208
  props: {
209
209
  style
210
210
  },
211
211
  at: focusTextBlock.path
212
- }, behavior_core.raise({
212
+ }), behavior_core.execute({
213
213
  type: "delete.text",
214
214
  at: {
215
215
  anchor: {
@@ -239,13 +239,13 @@ function createMarkdownBehaviors(config) {
239
239
  actions: [(_, {
240
240
  defaultStyle,
241
241
  focusTextBlock
242
- }) => [{
242
+ }) => [behavior_core.execute({
243
243
  type: "block.set",
244
244
  props: {
245
245
  style: defaultStyle
246
246
  },
247
247
  at: focusTextBlock.path
248
- }]]
248
+ })]]
249
249
  }), automaticListOnSpace = behavior_core.defineBehavior({
250
250
  on: "insert.text",
251
251
  guard: ({
@@ -288,12 +288,12 @@ function createMarkdownBehaviors(config) {
288
288
  },
289
289
  actions: [({
290
290
  event
291
- }) => [event], (_, {
291
+ }) => [behavior_core.execute(event)], (_, {
292
292
  focusTextBlock,
293
293
  style,
294
294
  listItem,
295
295
  listItemLength
296
- }) => [{
296
+ }) => [behavior_core.execute({
297
297
  type: "block.set",
298
298
  props: {
299
299
  listItem,
@@ -301,7 +301,7 @@ function createMarkdownBehaviors(config) {
301
301
  style
302
302
  },
303
303
  at: focusTextBlock.path
304
- }, behavior_core.raise({
304
+ }), behavior_core.execute({
305
305
  type: "delete.text",
306
306
  at: {
307
307
  anchor: {
@@ -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 {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 raise({\n type: 'delete.text',\n at: {\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 })\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',\n placement: 'before',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n },\n raise({\n type: 'delete.text',\n at: 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 = /^(---)$|(___)$|(\\*\\*\\*)$/\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 ({snapshot}, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusBlock.node.children,\n },\n placement: 'after',\n },\n {\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n },\n {type: 'delete.block', at: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\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 raise({\n type: 'delete.text',\n at: {\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 })\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 raise({\n type: 'delete.text',\n at: {\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\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","raise","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","block","_type","name","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","schema","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","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 {execute} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\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 execute({\n type: 'insert.text',\n text: ' ',\n }),\n ],\n (_, {focusTextBlock, style}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\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 })\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 execute({\n type: 'insert.text',\n text: hrCharacter,\n }),\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n execute({\n type: 'insert.block',\n placement: 'before',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n }),\n execute({\n type: 'delete.text',\n at: 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 = /^(---)$|(___)$|(\\*\\*\\*)$/\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 execute({\n type: 'insert.text',\n text: hrCharacters,\n }),\n ],\n ({snapshot}, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n execute({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusBlock.node.children,\n },\n placement: 'after',\n }),\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n }),\n execute({\n type: 'delete.block',\n at: focusBlock.path,\n }),\n ]\n : [\n execute({\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\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}) => [execute(event)],\n (_, {focusTextBlock, style, level}) => [\n execute({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n execute({\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\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 })\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 execute({\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}) => [execute(event)],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n execute({\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n }),\n execute({\n type: 'delete.text',\n at: {\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\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","execute","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","block","_type","name","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","schema","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}