@portabletext/editor 1.36.3 → 1.36.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.cjs","sources":["../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter.types'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'block.set'\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: 'block.unset'\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete'\n selection: NonNullable<EditorSelection>\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'history.redo'\n }\n | {\n type: 'history.undo'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n }\n | {\n type: 'insert.block object'\n placement: 'auto' | 'after' | 'before'\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.inline object'\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.break'\n }\n | {\n type: 'insert.soft break'\n }\n | {\n type: 'insert.block'\n block: PortableTextBlock\n placement: 'auto' | 'after' | 'before'\n }\n | {\n type: 'insert.span'\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: 'insert.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'insert.text block'\n placement: 'auto' | 'after' | 'before'\n textBlock?: {\n children?: PortableTextTextBlock['children']\n }\n }\n | {\n type: 'list item.add'\n listItem: string\n }\n | {\n type: 'list item.remove'\n listItem: string\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'move.block'\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: 'move.block down'\n at: [KeyedSegment]\n }\n | {\n type: 'move.block up'\n at: [KeyedSegment]\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'select.previous block'\n }\n | {\n type: 'select.next block'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n | 'deserialization.failure'\n | 'deserialization.success'\n | 'serialization.failure'\n | 'serialization.success'\n > & {dataTransfer: DataTransfer})\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: DataTransfer\n }\n | {\n type: 'deserialize'\n dataTransfer: DataTransfer\n }\n | {\n type: 'key.down'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'key.up'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'paste'\n data: DataTransfer\n }\n | {\n type: 'serialize'\n originEvent: 'copy' | 'cut' | 'drag' | 'unknown'\n dataTransfer: DataTransfer\n }\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends `custom.${TType}` = `custom.${TType}`,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorActionIntend =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\n/**\n * @beta\n */\nexport type BehaviorAction = OmitFromUnion<\n BehaviorActionIntend,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorActionIntend, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n | {type: '*'}\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n> = {\n /**\n * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionIntendSet<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 BehaviorActionIntendSet<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<BehaviorActionIntend>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [\n () => [\n raise({type: 'insert.text block', placement: 'before'}),\n raise({type: 'select.previous block'}),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n _key: snapshot.context.keyGenerator(),\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["isCustomBehaviorEvent","event","type","startsWith","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","getFocusBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","block","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}
1
+ {"version":3,"file":"behavior.core.cjs","sources":["../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter.types'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'block.set'\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: 'block.unset'\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete'\n selection: NonNullable<EditorSelection>\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'history.redo'\n }\n | {\n type: 'history.undo'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n }\n | {\n type: 'insert.block object'\n placement: 'auto' | 'after' | 'before'\n blockObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.inline object'\n inlineObject: {\n name: string\n value?: {[prop: string]: unknown}\n }\n }\n | {\n type: 'insert.break'\n }\n | {\n type: 'insert.soft break'\n }\n | {\n type: 'insert.block'\n block: PortableTextBlock\n placement: 'auto' | 'after' | 'before'\n }\n | {\n type: 'insert.span'\n text: string\n annotations?: Array<{\n name: string\n value: {[prop: string]: unknown}\n }>\n decorators?: Array<string>\n }\n | {\n type: 'insert.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'insert.text block'\n placement: 'auto' | 'after' | 'before'\n textBlock?: {\n children?: PortableTextTextBlock['children']\n }\n }\n | {\n type: 'list item.add'\n listItem: string\n }\n | {\n type: 'list item.remove'\n listItem: string\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'move.block'\n at: [KeyedSegment]\n to: [KeyedSegment]\n }\n | {\n type: 'move.block down'\n at: [KeyedSegment]\n }\n | {\n type: 'move.block up'\n at: [KeyedSegment]\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'select.previous block'\n }\n | {\n type: 'select.next block'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n | 'deserialization.failure'\n | 'deserialization.success'\n | 'serialization.failure'\n | 'serialization.success'\n > & {dataTransfer: DataTransfer})\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: DataTransfer\n }\n | {\n type: 'deserialize'\n dataTransfer: DataTransfer\n }\n | {\n type: 'key.down'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'key.up'\n keyboardEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'paste'\n data: DataTransfer\n }\n | {\n type: 'serialize'\n originEvent: 'copy' | 'cut' | 'drag' | 'unknown'\n dataTransfer: DataTransfer\n }\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends `custom.${TType}` = `custom.${TType}`,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n | {type: '*'}\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n> = {\n /**\n * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [\n () => [\n raise({type: 'insert.text block', placement: 'before'}),\n raise({type: 'select.previous block'}),\n ],\n ],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n _key: snapshot.context.keyGenerator(),\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["isCustomBehaviorEvent","event","type","startsWith","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","isSelectionCollapsed","caretWordSelection","getCaretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","getFocusBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","block","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}
@@ -1511,15 +1511,15 @@ function getCurrentActionId(editor) {
1511
1511
  function isApplyingBehaviorActions(editor) {
1512
1512
  return getCurrentActionId(editor) !== void 0;
1513
1513
  }
1514
- const CURRENT_BEHAVIOR_ACTION_INTEND_SET = /* @__PURE__ */ new WeakMap();
1515
- function withApplyingBehaviorActionIntendSet(editor, fn) {
1516
- const current = CURRENT_BEHAVIOR_ACTION_INTEND_SET.get(editor);
1517
- CURRENT_BEHAVIOR_ACTION_INTEND_SET.set(editor, {
1514
+ const CURRENT_BEHAVIOR_ACTION_SET = /* @__PURE__ */ new WeakMap();
1515
+ function withApplyingBehaviorActionSet(editor, fn) {
1516
+ const current = CURRENT_BEHAVIOR_ACTION_SET.get(editor);
1517
+ CURRENT_BEHAVIOR_ACTION_SET.set(editor, {
1518
1518
  actionSetId: defaultKeyGenerator()
1519
- }), withApplyingBehaviorActions(editor, fn), CURRENT_BEHAVIOR_ACTION_INTEND_SET.set(editor, current);
1519
+ }), withApplyingBehaviorActions(editor, fn), CURRENT_BEHAVIOR_ACTION_SET.set(editor, current);
1520
1520
  }
1521
1521
  function getCurrentBehaviorActionSetId(editor) {
1522
- return CURRENT_BEHAVIOR_ACTION_INTEND_SET.get(editor)?.actionSetId;
1522
+ return CURRENT_BEHAVIOR_ACTION_SET.get(editor)?.actionSetId;
1523
1523
  }
1524
1524
  const debug$d = debugWithName("plugin:withUndoRedo"), SAVING = /* @__PURE__ */ new WeakMap(), REMOTE_PATCHES = /* @__PURE__ */ new WeakMap(), UNDO_STEP_LIMIT = 1e3, isSaving = (editor) => {
1525
1525
  const state = SAVING.get(editor);
@@ -1533,7 +1533,7 @@ function createWithUndoRedo(options) {
1533
1533
  return (editor) => {
1534
1534
  let previousSnapshot = fromSlateValue(editor.children, blockSchemaType.name);
1535
1535
  const remotePatches = getRemotePatches(editor);
1536
- let previousBehaviorActionIntendSetId = getCurrentBehaviorActionSetId(editor);
1536
+ let previousBehaviorActionSetId = getCurrentBehaviorActionSetId(editor);
1537
1537
  options.subscriptions.push(() => {
1538
1538
  debug$d("Subscribing to patches");
1539
1539
  const sub = editorActor.on("patches", ({
@@ -1589,10 +1589,10 @@ function createWithUndoRedo(options) {
1589
1589
  history
1590
1590
  } = editor, {
1591
1591
  undos
1592
- } = history, step = undos[undos.length - 1], lastOp = step && step.operations && step.operations[step.operations.length - 1], overwrite = shouldOverwrite(op, lastOp), save = isSaving(editor), currentBehaviorActionIntendSetId = getCurrentBehaviorActionSetId(editor);
1593
- let merge = currentBehaviorActionIntendSetId !== void 0 && previousBehaviorActionIntendSetId === void 0 ? !1 : currentBehaviorActionIntendSetId !== void 0 && previousBehaviorActionIntendSetId !== void 0 ? currentBehaviorActionIntendSetId === previousBehaviorActionIntendSetId : !0;
1592
+ } = history, step = undos[undos.length - 1], lastOp = step && step.operations && step.operations[step.operations.length - 1], overwrite = shouldOverwrite(op, lastOp), save = isSaving(editor), currentBehaviorActionSetId = getCurrentBehaviorActionSetId(editor);
1593
+ let merge = currentBehaviorActionSetId !== void 0 && previousBehaviorActionSetId === void 0 ? !1 : currentBehaviorActionSetId !== void 0 && previousBehaviorActionSetId !== void 0 ? currentBehaviorActionSetId === previousBehaviorActionSetId : !0;
1594
1594
  if (save) {
1595
- if (step ? operations.length === 0 && (merge = currentBehaviorActionIntendSetId === void 0 && previousBehaviorActionIntendSetId === void 0 ? shouldMerge(op, lastOp) || overwrite : merge) : merge = !1, step && merge)
1595
+ if (step ? operations.length === 0 && (merge = currentBehaviorActionSetId === void 0 && previousBehaviorActionSetId === void 0 ? shouldMerge(op, lastOp) || overwrite : merge) : merge = !1, step && merge)
1596
1596
  step.operations.push(op);
1597
1597
  else {
1598
1598
  const newStep = {
@@ -1605,7 +1605,7 @@ function createWithUndoRedo(options) {
1605
1605
  undos.shift();
1606
1606
  shouldClear(op) && (history.redos = []);
1607
1607
  }
1608
- previousBehaviorActionIntendSetId = currentBehaviorActionIntendSetId, apply2(op);
1608
+ previousBehaviorActionSetId = currentBehaviorActionSetId, apply2(op);
1609
1609
  }, editor;
1610
1610
  };
1611
1611
  }
@@ -6164,37 +6164,37 @@ const editorMachine = xstate.setup({
6164
6164
  });
6165
6165
  if (!shouldRun)
6166
6166
  continue;
6167
- const actionIntendSets = eventBehavior.actions.map((actionSet) => actionSet({
6167
+ const actionSets = eventBehavior.actions.map((actionSet) => actionSet({
6168
6168
  context: editorSnapshot.context,
6169
6169
  snapshot: editorSnapshot,
6170
6170
  event: event.behaviorEvent
6171
6171
  }, shouldRun));
6172
- for (const actionIntends of actionIntendSets)
6173
- behaviorOverwritten = behaviorOverwritten || actionIntends.length > 0 && actionIntends.some((actionIntend) => actionIntend.type !== "effect"), withApplyingBehaviorActionIntendSet(event.editor, () => {
6174
- for (const actionIntend of actionIntends) {
6175
- if (actionIntend.type === "raise") {
6176
- behavior_core.isCustomBehaviorEvent(actionIntend.event) ? enqueue.raise({
6172
+ for (const actionSet of actionSets)
6173
+ behaviorOverwritten = behaviorOverwritten || actionSet.length > 0 && actionSet.some((action) => action.type !== "effect"), withApplyingBehaviorActionSet(event.editor, () => {
6174
+ for (const action of actionSet) {
6175
+ if (action.type === "raise") {
6176
+ behavior_core.isCustomBehaviorEvent(action.event) ? enqueue.raise({
6177
6177
  type: "custom behavior event",
6178
- behaviorEvent: actionIntend.event,
6178
+ behaviorEvent: action.event,
6179
6179
  editor: event.editor
6180
6180
  }) : enqueue.raise({
6181
6181
  type: "behavior event",
6182
- behaviorEvent: actionIntend.event,
6182
+ behaviorEvent: action.event,
6183
6183
  editor: event.editor
6184
6184
  });
6185
6185
  continue;
6186
6186
  }
6187
- const action = {
6188
- ...actionIntend,
6187
+ const internalAction = {
6188
+ ...action,
6189
6189
  editor: event.editor
6190
6190
  };
6191
6191
  try {
6192
6192
  performAction({
6193
6193
  context,
6194
- action
6194
+ action: internalAction
6195
6195
  });
6196
6196
  } catch (error) {
6197
- console.error(new Error(`Performing action "${action.type}" as a result of "${event.behaviorEvent.type}" failed due to: ${error.message}`));
6197
+ console.error(new Error(`Performing action "${internalAction.type}" as a result of "${event.behaviorEvent.type}" failed due to: ${error.message}`));
6198
6198
  break;
6199
6199
  }
6200
6200
  }