@portabletext/editor 1.41.1 → 1.41.3

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 (35) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  2. package/lib/_chunks-cjs/editor-provider.cjs +19 -5
  3. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  4. package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs +11 -0
  5. package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs.map +1 -0
  6. package/lib/_chunks-es/behavior.core.js.map +1 -1
  7. package/lib/_chunks-es/editor-provider.js +19 -5
  8. package/lib/_chunks-es/editor-provider.js.map +1 -1
  9. package/lib/_chunks-es/selector.get-focus-inline-object.js +13 -0
  10. package/lib/_chunks-es/selector.get-focus-inline-object.js.map +1 -0
  11. package/lib/behaviors/index.d.cts +3093 -3071
  12. package/lib/behaviors/index.d.ts +3093 -3071
  13. package/lib/index.cjs +14 -7
  14. package/lib/index.cjs.map +1 -1
  15. package/lib/index.d.cts +2795 -2772
  16. package/lib/index.d.ts +2795 -2772
  17. package/lib/index.js +14 -6
  18. package/lib/index.js.map +1 -1
  19. package/lib/plugins/index.d.cts +2795 -2772
  20. package/lib/plugins/index.d.ts +2795 -2772
  21. package/lib/selectors/index.cjs +2 -8
  22. package/lib/selectors/index.cjs.map +1 -1
  23. package/lib/selectors/index.d.cts +2782 -2759
  24. package/lib/selectors/index.d.ts +2782 -2759
  25. package/lib/selectors/index.js +3 -8
  26. package/lib/selectors/index.js.map +1 -1
  27. package/lib/utils/index.d.cts +2782 -2759
  28. package/lib/utils/index.d.ts +2782 -2759
  29. package/package.json +1 -1
  30. package/src/behaviors/behavior.types.ts +151 -108
  31. package/src/editor/create-editor.ts +2 -2
  32. package/src/editor/editor-machine.ts +16 -6
  33. package/src/internal-utils/drag-selection.test.ts +1 -1
  34. package/src/internal-utils/drag-selection.ts +23 -6
  35. package/src/internal-utils/slate-utils.ts +7 -3
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.cjs","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {BlockWithOptionalKey} from '../types/block-with-optional-key'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\nexport type BehaviorEventTypeNamespace =\n | 'annotation'\n | 'block'\n | 'blur'\n | 'clipboard'\n | 'custom'\n | 'data transfer'\n | 'decorator'\n | 'delete'\n | 'deserialization'\n | 'deserialize'\n | 'drag'\n | 'focus'\n | 'history'\n | 'input'\n | 'insert'\n | 'keyboard'\n | 'list item'\n | 'mouse'\n | 'move'\n | 'select'\n | 'serialization'\n | 'serialize'\n | 'style'\n\nexport type BehaviorEventType<\n TNamespace extends BehaviorEventTypeNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\nexport type NamespacedBehaviorEventType<\n TNamespace extends BehaviorEventTypeNamespace | '',\n> = TNamespace extends ''\n ? BehaviorEvent['type']\n : Extract<BehaviorEvent['type'], TNamespace | `${TNamespace}.${string}`>\n\n/**\n * @beta\n */\nexport type ExternalBehaviorEvent = {\n type: BehaviorEventType<'insert', 'block object'>\n placement: InsertPlacement\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n}\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: BehaviorEventType<'annotation', 'add'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: BehaviorEventType<'annotation', 'remove'>\n annotation: {\n name: string\n }\n }\n | {\n type: BehaviorEventType<'annotation', 'toggle'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: BehaviorEventType<'block', 'set'>\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: BehaviorEventType<'block', 'unset'>\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: BehaviorEventType<'blur'>\n }\n | {\n type: BehaviorEventType<'data transfer', 'set'>\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: BehaviorEventType<'decorator', 'add'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: BehaviorEventType<'decorator', 'remove'>\n decorator: string\n }\n | {\n type: BehaviorEventType<'decorator', 'toggle'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: BehaviorEventType<'delete'>\n selection: NonNullable<EditorSelection>\n }\n | {\n type: BehaviorEventType<'delete', 'backward'>\n unit: TextUnit\n }\n | {\n type: BehaviorEventType<'delete', 'block'>\n at: [KeyedSegment]\n }\n | {\n type: BehaviorEventType<'delete', 'forward'>\n unit: TextUnit\n }\n | {\n type: BehaviorEventType<'delete', 'text'>\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: BehaviorEventType<'focus'>\n }\n | {\n type: BehaviorEventType<'history', 'redo'>\n }\n | {\n type: BehaviorEventType<'history', 'undo'>\n }\n | {\n type: BehaviorEventType<'insert', 'blocks'>\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: BehaviorEventType<'insert', 'inline object'>\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: BehaviorEventType<'insert', 'break'>\n }\n | {\n type: BehaviorEventType<'insert', 'soft break'>\n }\n | {\n type: BehaviorEventType<'insert', 'block'>\n block: BlockWithOptionalKey\n placement: InsertPlacement\n select?: 'start' | 'end' | 'none'\n }\n | {\n type: BehaviorEventType<'insert', 'span'>\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: BehaviorEventType<'insert', 'text'>\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: BehaviorEventType<'list item', 'add'>\n listItem: string\n }\n | {\n type: BehaviorEventType<'list item', 'remove'>\n listItem: string\n }\n | {\n type: BehaviorEventType<'list item', 'toggle'>\n listItem: string\n }\n | {\n type: BehaviorEventType<'move', 'block'>\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: BehaviorEventType<'move', 'block down'>\n at: [KeyedSegment]\n }\n | {\n type: BehaviorEventType<'move', 'block up'>\n at: [KeyedSegment]\n }\n | {\n type: BehaviorEventType<'select'>\n selection: EditorSelection\n }\n | {\n type: BehaviorEventType<'select', 'previous block'>\n select?: 'start' | 'end'\n }\n | {\n type: BehaviorEventType<'select', 'next block'>\n select?: 'start' | 'end'\n }\n | {\n type: BehaviorEventType<'style', 'add'>\n style: string\n }\n | {\n type: BehaviorEventType<'style', 'remove'>\n style: string\n }\n | {\n type: BehaviorEventType<'style', 'toggle'>\n style: string\n }\n | {\n type: BehaviorEventType<'deserialization', 'success'>\n mimeType: MIMEType\n data: Array<PortableTextBlock>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: BehaviorEventType<'deserialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: BehaviorEventType<'serialization', 'success'>\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: BehaviorEventType<'serialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\ntype ClipboardBehaviorEvent =\n | {\n type: BehaviorEventType<'clipboard', 'copy'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: BehaviorEventType<'clipboard', 'cut'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: BehaviorEventType<'clipboard', 'paste'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: BehaviorEventType<'drag', 'dragstart'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: BehaviorEventType<'drag', 'drag'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: BehaviorEventType<'drag', 'dragend'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: BehaviorEventType<'drag', 'dragenter'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: BehaviorEventType<'drag', 'dragover'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: BehaviorEventType<'drag', 'drop'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: BehaviorEventType<'drag', 'dragleave'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\n/**\n * Used to represent native InputEvents that hold a DataTransfer object.\n *\n * These can either be one of:\n *\n * - insertFromPaste\n * - insertFromPasteAsQuotation\n * - insertFromDrop\n * - insertReplacementText\n * - insertFromYank\n */\nexport type InputBehaviorEvent = {\n type: BehaviorEventType<'input', '*'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n}\n\nexport function isInputBehaviorEvent(\n event: BehaviorEvent,\n): event is InputBehaviorEvent {\n return event.type.startsWith('input.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: BehaviorEventType<'keyboard', 'keydown'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: BehaviorEventType<'keyboard', 'keyup'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type DataBehaviorEvent =\n | {\n type: BehaviorEventType<'deserialize'>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: BehaviorEventType<'serialize'>\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: BehaviorEventType<'mouse', 'click'>\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | ClipboardBehaviorEvent\n | DragBehaviorEvent\n | InputBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends BehaviorEventType<'custom', TType> = BehaviorEventType<\n 'custom',\n TType\n >,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | DataBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n\ntype ResolveBehaviorEvent<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n> = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends `${infer TNamespace}.*`\n ? TNamespace extends BehaviorEventTypeNamespace\n ? PickFromUnion<\n BehaviorEvent,\n 'type',\n NamespacedBehaviorEventType<TNamespace>\n >\n : never\n : TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends BehaviorEvent['type']\n ? PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n : never\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 * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\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 {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\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 (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [\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 clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [\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 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 selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n 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 {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isInputBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","block","_type","schema","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","getFocusBlockObject","clickingAboveLonelyBlockObject","position","isEditor","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","at","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","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/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {BlockWithOptionalKey} from '../types/block-with-optional-key'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | InternalBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n\ntype BehaviorEventTypeNamespace =\n | SyntheticBehaviorEventNamespace\n | InternalBehaviorEventNamespace\n | NativeBehaviorEventNamespace\n | CustomBehaviorEventNamespace\n\ntype SyntheticBehaviorEventType<\n TNamespace extends SyntheticBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype InternalBehaviorEventType<\n TNamespace extends InternalBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype NativeBehaviorEventType<\n TNamespace extends NativeBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\ntype CustomBehaviorEventType<\n TNamespace extends CustomBehaviorEventNamespace,\n TType extends string = '',\n> = TType extends '' ? `${TNamespace}` : `${TNamespace}.${TType}`\n\nexport type NamespacedBehaviorEventType<\n TNamespace extends BehaviorEventTypeNamespace | '',\n> = TNamespace extends ''\n ? BehaviorEvent['type']\n : Extract<BehaviorEvent['type'], TNamespace | `${TNamespace}.${string}`>\n\n/**\n * @beta\n */\nexport type ExternalSyntheticBehaviorEvent = {\n type: SyntheticBehaviorEventType<'insert', 'block object'>\n placement: InsertPlacement\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n}\n\n/**************************************\n * Synthetic events\n **************************************/\n\ntype SyntheticBehaviorEventNamespace =\n | 'annotation'\n | 'block'\n | 'blur'\n | 'data transfer'\n | 'decorator'\n | 'delete'\n | 'deserialization'\n | 'focus'\n | 'history'\n | 'insert'\n | 'list item'\n | 'move'\n | 'select'\n | 'serialization'\n | 'style'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: SyntheticBehaviorEventType<'annotation', 'add'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'annotation', 'remove'>\n annotation: {\n name: string\n }\n }\n | {\n type: SyntheticBehaviorEventType<'annotation', 'toggle'>\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'block', 'set'>\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: SyntheticBehaviorEventType<'block', 'unset'>\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: SyntheticBehaviorEventType<'blur'>\n }\n | {\n type: SyntheticBehaviorEventType<'data transfer', 'set'>\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'add'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'remove'>\n decorator: string\n }\n | {\n type: SyntheticBehaviorEventType<'decorator', 'toggle'>\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: SyntheticBehaviorEventType<'delete'>\n selection: NonNullable<EditorSelection>\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'backward'>\n unit: TextUnit\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'block'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'forward'>\n unit: TextUnit\n }\n | {\n type: SyntheticBehaviorEventType<'delete', 'text'>\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: SyntheticBehaviorEventType<'focus'>\n }\n | {\n type: SyntheticBehaviorEventType<'history', 'redo'>\n }\n | {\n type: SyntheticBehaviorEventType<'history', 'undo'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'blocks'>\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'inline object'>\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'break'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'soft break'>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'block'>\n block: BlockWithOptionalKey\n placement: InsertPlacement\n select?: 'start' | 'end' | 'none'\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'span'>\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: SyntheticBehaviorEventType<'insert', 'text'>\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'add'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'remove'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'list item', 'toggle'>\n listItem: string\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block'>\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block down'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'move', 'block up'>\n at: [KeyedSegment]\n }\n | {\n type: SyntheticBehaviorEventType<'select'>\n selection: EditorSelection\n }\n | {\n type: SyntheticBehaviorEventType<'select', 'previous block'>\n select?: 'start' | 'end'\n }\n | {\n type: SyntheticBehaviorEventType<'select', 'next block'>\n select?: 'start' | 'end'\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'add'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'remove'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'style', 'toggle'>\n style: string\n }\n | {\n type: SyntheticBehaviorEventType<'deserialization', 'success'>\n mimeType: MIMEType\n data: Array<PortableTextBlock>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: SyntheticBehaviorEventType<'deserialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: SyntheticBehaviorEventType<'serialization', 'success'>\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: SyntheticBehaviorEventType<'serialization', 'failure'>\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\n/**************************************\n * Native events\n **************************************/\n\ntype NativeBehaviorEventNamespace =\n | 'clipboard'\n | 'drag'\n | 'input'\n | 'keyboard'\n | 'mouse'\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | ClipboardBehaviorEvent\n | DragBehaviorEvent\n | InputBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\n\ntype ClipboardBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'clipboard', 'copy'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'clipboard', 'cut'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'clipboard', 'paste'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'drag', 'dragstart'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: NativeBehaviorEventType<'drag', 'drag'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragend'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragenter'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragover'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'drop'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: NativeBehaviorEventType<'drag', 'dragleave'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\n/**\n * Used to represent native InputEvents that hold a DataTransfer object.\n *\n * These can either be one of:\n *\n * - insertFromPaste\n * - insertFromPasteAsQuotation\n * - insertFromDrop\n * - insertReplacementText\n * - insertFromYank\n */\nexport type InputBehaviorEvent = {\n type: NativeBehaviorEventType<'input', '*'>\n originEvent: {\n dataTransfer: DataTransfer\n }\n}\n\nexport function isInputBehaviorEvent(\n event: BehaviorEvent,\n): event is InputBehaviorEvent {\n return event.type.startsWith('input.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: NativeBehaviorEventType<'keyboard', 'keydown'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: NativeBehaviorEventType<'keyboard', 'keyup'>\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type InternalBehaviorEvent =\n | {\n type: InternalBehaviorEventType<'deserialize'>\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: InternalBehaviorEventType<'serialize'>\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: NativeBehaviorEventType<'mouse', 'click'>\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**************************************\n * Custom events\n **************************************/\n\ntype CustomBehaviorEventNamespace = 'custom'\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends CustomBehaviorEventType<\n 'custom',\n TType\n > = CustomBehaviorEventType<'custom', TType>,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event:\n | InternalBehaviorEvent\n | SyntheticBehaviorEvent\n | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**************************************\n * Internal events\n **************************************/\n\ntype InternalBehaviorEventNamespace = 'deserialize' | 'serialize'\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: InternalBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\ntype ResolveBehaviorEvent<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n> = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends `${infer TNamespace}.*`\n ? TNamespace extends BehaviorEventTypeNamespace\n ? PickFromUnion<\n BehaviorEvent,\n 'type',\n NamespacedBehaviorEventType<TNamespace>\n >\n : never\n : TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends BehaviorEvent['type']\n ? PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n : never\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 * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\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 {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\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 (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [\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 clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [\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 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 selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n at: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n 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 {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isInputBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","block","_type","schema","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","getFocusBlockObject","clickingAboveLonelyBlockObject","position","isEditor","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","at","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","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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"}
@@ -350,7 +350,10 @@ function getNodeBlock({
350
350
  }) {
351
351
  if (slate.Editor.isEditor(node))
352
352
  return;
353
- if (isBlockElement(schema2, node))
353
+ if (isBlockElement({
354
+ editor,
355
+ schema: schema2
356
+ }, node))
354
357
  return elementToBlock({
355
358
  schema: schema2,
356
359
  element: node
@@ -358,7 +361,10 @@ function getNodeBlock({
358
361
  const parent = Array.from(slate.Editor.nodes(editor, {
359
362
  mode: "highest",
360
363
  at: [],
361
- match: (n) => isBlockElement(schema2, n) && n.children.some((child) => child._key === node._key)
364
+ match: (n) => isBlockElement({
365
+ editor,
366
+ schema: schema2
367
+ }, n) && n.children.some((child) => child._key === node._key)
362
368
  })).at(0)?.at(0);
363
369
  return slate.Element.isElement(parent) ? elementToBlock({
364
370
  schema: schema2,
@@ -371,8 +377,11 @@ function elementToBlock({
371
377
  }) {
372
378
  return fromSlateValue([element], schema2.block.name)?.at(0);
373
379
  }
374
- function isBlockElement(schema2, node) {
375
- return slate.Element.isElement(node) && (schema2.block.name === node._type || schema2.blockObjects.some((blockObject) => blockObject.name === node._type));
380
+ function isBlockElement({
381
+ editor,
382
+ schema: schema2
383
+ }, node) {
384
+ return slate.Element.isElement(node) && !editor.isInline(node) && (schema2.block.name === node._type || schema2.blockObjects.some((blockObject) => blockObject.name === node._type));
376
385
  }
377
386
  const IS_PROCESSING_REMOTE_CHANGES = /* @__PURE__ */ new WeakMap(), KEY_TO_SLATE_ELEMENT = /* @__PURE__ */ new WeakMap(), KEY_TO_VALUE_ELEMENT = /* @__PURE__ */ new WeakMap(), SLATE_TO_PORTABLE_TEXT_RANGE = /* @__PURE__ */ new WeakMap(), EditorActorContext = React.createContext({}), PortableTextEditorContext = React.createContext(null), usePortableTextEditor = () => {
378
387
  const editor = React.useContext(PortableTextEditorContext);
@@ -6924,7 +6933,12 @@ const editorMachine = xstate.setup({
6924
6933
  exit: [({
6925
6934
  context
6926
6935
  }) => {
6927
- context.internalDrag?.ghost && document.body.removeChild(context.internalDrag.ghost);
6936
+ if (context.internalDrag?.ghost)
6937
+ try {
6938
+ context.internalDrag.ghost.parentNode?.removeChild(context.internalDrag.ghost);
6939
+ } catch (error) {
6940
+ console.error(new Error(`Removing the internal drag ghost failed due to: ${error.message}`));
6941
+ }
6928
6942
  }, xstate.assign({
6929
6943
  internalDrag: void 0
6930
6944
  })],