@portabletext/editor 1.30.1 → 1.30.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.
- package/lib/_chunks-cjs/behavior.core.cjs +1 -11
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/plugin.event-listener.cjs +145 -78
- package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +1 -11
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/plugin.event-listener.js +147 -80
- package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
- package/lib/behaviors/index.cjs +0 -1
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +0 -3016
- package/lib/behaviors/index.d.ts +0 -3016
- package/lib/behaviors/index.js +1 -2
- package/lib/index.d.cts +111 -1
- package/lib/index.d.ts +111 -1
- package/lib/plugins/index.d.cts +111 -1
- package/lib/plugins/index.d.ts +111 -1
- package/package.json +11 -11
- package/src/behaviors/behavior.core.ts +0 -14
- package/src/behaviors/behavior.foundational.ts +15 -0
- package/src/behaviors/index.ts +1 -1
- package/src/editor/PortableTextEditor.tsx +0 -1
- package/src/editor/editor-machine.ts +6 -2
- package/src/editor/plugins/create-with-event-listeners.ts +8 -2
- package/src/editor/sync-machine.ts +67 -8
- package/src/internal-utils/key-is.ts +10 -0
|
@@ -712,17 +712,7 @@ const arrowDownOnLonelyBlockObject = {
|
|
|
712
712
|
}, coreStyleBehaviors = {
|
|
713
713
|
toggleStyleOff,
|
|
714
714
|
toggleStyleOn
|
|
715
|
-
}, coreBehaviors = [coreAnnotationBehaviors.toggleAnnotationOff, coreAnnotationBehaviors.toggleAnnotationOn, coreDecoratorBehaviors.toggleDecoratorOff, coreDecoratorBehaviors.toggleDecoratorOn, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreDeserializeBehaviors.deserialize, coreDeserializeBehaviors["deserialization.success"], coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.toggleListItemOff, coreListBehaviors.toggleListItemOn, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreInsertBreakBehaviors.atTheEndOfTextBlock, coreInsertBreakBehaviors.atTheStartOfTextBlock, coreSerializeBehaviors.serialize, coreSerializeBehaviors["serialization.success"], coreStyleBehaviors.toggleStyleOff, coreStyleBehaviors.toggleStyleOn]
|
|
716
|
-
annotation: coreAnnotationBehaviors,
|
|
717
|
-
decorators: coreDecoratorBehaviors,
|
|
718
|
-
deserialize: coreDeserializeBehaviors,
|
|
719
|
-
blockObjects: coreBlockObjectBehaviors,
|
|
720
|
-
insertBreak: coreInsertBreakBehaviors,
|
|
721
|
-
lists: coreListBehaviors,
|
|
722
|
-
...coreSerializeBehaviors,
|
|
723
|
-
style: coreSerializeBehaviors
|
|
724
|
-
};
|
|
725
|
-
exports.coreBehavior = coreBehavior;
|
|
715
|
+
}, coreBehaviors = [coreAnnotationBehaviors.toggleAnnotationOff, coreAnnotationBehaviors.toggleAnnotationOn, coreDecoratorBehaviors.toggleDecoratorOff, coreDecoratorBehaviors.toggleDecoratorOn, coreDecoratorBehaviors.strongShortcut, coreDecoratorBehaviors.emShortcut, coreDecoratorBehaviors.underlineShortcut, coreDecoratorBehaviors.codeShortcut, coreDeserializeBehaviors.deserialize, coreDeserializeBehaviors["deserialization.success"], coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject, coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject, coreBlockObjectBehaviors.breakingBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject, coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject, coreListBehaviors.toggleListItemOff, coreListBehaviors.toggleListItemOn, coreListBehaviors.clearListOnBackspace, coreListBehaviors.unindentListOnBackspace, coreListBehaviors.clearListOnEnter, coreListBehaviors.indentListOnTab, coreListBehaviors.unindentListOnShiftTab, coreInsertBreakBehaviors.atTheEndOfTextBlock, coreInsertBreakBehaviors.atTheStartOfTextBlock, coreSerializeBehaviors.serialize, coreSerializeBehaviors["serialization.success"], coreStyleBehaviors.toggleStyleOff, coreStyleBehaviors.toggleStyleOn];
|
|
726
716
|
exports.coreBehaviors = coreBehaviors;
|
|
727
717
|
exports.defineBehavior = defineBehavior;
|
|
728
718
|
exports.isCustomBehaviorEvent = isCustomBehaviorEvent;
|
|
@@ -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.deserialize.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.serialize.ts","../../src/behaviors/behavior.core.style.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} from '../editor/editor-snapshot'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\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: 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 }\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: '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 | {\n type: 'text block.set'\n at: [KeyedSegment]\n level?: number\n listItem?: string\n style?: string\n }\n | {\n type: 'text block.unset'\n at: [KeyedSegment]\n props: Array<'level' | 'listItem' | 'style'>\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' | '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\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = PickFromUnion<\n BehaviorEvent,\n 'type',\n TBehaviorEventType\n >,\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> = ({\n context,\n event,\n}: {\n context: EditorContext\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse> = (\n {\n context,\n event,\n }: {\n context: EditorContext\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 : 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 : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n\n/**\n * @beta\n */\nexport type BlockOffset = {\n path: [KeyedSegment]\n offset: number\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst toggleAnnotationOff = defineBehavior({\n on: 'annotation.toggle',\n guard: ({context, event}) =>\n selectors.isActiveAnnotation(event.annotation.name)({context}),\n actions: [\n ({event}) => [\n raise({type: 'annotation.remove', annotation: event.annotation}),\n ],\n ],\n})\n\nconst toggleAnnotationOn = defineBehavior({\n on: 'annotation.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveAnnotation(event.annotation.name)({context}),\n actions: [\n ({event}) => [\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n toggleAnnotationOff,\n toggleAnnotationOn,\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: ({context, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const nextBlock = selectors.getNextBlock({context})\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: ({context, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const previousBlock = selectors.getPreviousBlock({context})\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: ({context}) => {\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const collapsedSelection = selectors.isSelectionCollapsed({context})\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: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const previousBlock = selectors.getPreviousBlock({context})\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: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const nextBlock = selectors.getNextBlock({context})\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 * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n toggleDecoratorOff: defineBehavior({\n on: 'decorator.toggle',\n guard: ({context, event}) =>\n selectors.isActiveDecorator(event.decorator)({context}),\n actions: [\n ({event}) => [\n raise({type: 'decorator.remove', decorator: event.decorator}),\n ],\n ],\n }),\n toggleDecoratorOn: defineBehavior({\n on: 'decorator.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveDecorator(event.decorator)({context}),\n actions: [\n ({event}) => [raise({type: 'decorator.add', decorator: event.decorator})],\n ],\n }),\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n 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: ({context, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'em'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n 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: ({context, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'code'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import {defineBehavior, raise} from './behavior.types'\n\nexport const coreDeserializeBehaviors = {\n 'deserialize': defineBehavior({\n on: 'deserialize',\n guard: ({context, event}) => {\n const deserializeEvents = context.converters.flatMap((converter) => {\n const data = event.dataTransfer.getData(converter.mimeType)\n\n if (!data) {\n return []\n }\n\n return [\n converter.deserialize({context, event: {type: 'deserialize', data}}),\n ]\n })\n\n const firstSuccess = deserializeEvents.find(\n (deserializeEvent) =>\n deserializeEvent.type === 'deserialization.success',\n )\n\n if (!firstSuccess) {\n return {\n type: 'deserialization.failure',\n mimeType: '*/*',\n reason: deserializeEvents\n .map((deserializeEvent) =>\n deserializeEvent.type === 'deserialization.failure'\n ? deserializeEvent.reason\n : '',\n )\n .join(', '),\n } as const\n }\n\n return firstSuccess\n },\n actions: [\n ({event}, deserializeEvent) => [\n raise({\n ...deserializeEvent,\n dataTransfer: event.dataTransfer,\n }),\n ],\n ],\n }),\n 'deserialization.success': defineBehavior({\n on: 'deserialization.success',\n actions: [\n ({event}) => [\n raise({\n type: 'insert.blocks',\n blocks: event.data,\n }),\n ],\n ],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst atTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock = selectors.isAtTheEndOfBlock(focusTextBlock)({\n context,\n })\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 ({context}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: context.schema.block.name,\n _key: context.keyGenerator(),\n children: [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst atTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan({context})\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !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 = selectors.isAtTheStartOfBlock(focusTextBlock)({\n context,\n })\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {context},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: context.schema.styles[0]?.value,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n atTheEndOfTextBlock,\n atTheStartOfTextBlock,\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 toggleListItemOff = defineBehavior({\n on: 'list item.toggle',\n guard: ({context, event}) =>\n selectors.isActiveListItem(event.listItem)({context}),\n actions: [\n ({event}) => [\n raise({\n type: 'list item.remove',\n listItem: event.listItem,\n }),\n ],\n ],\n})\n\nconst toggleListItemOn = defineBehavior({\n on: 'list item.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveListItem(event.listItem)({context}),\n actions: [\n ({event}) => [\n raise({\n type: 'list item.add',\n listItem: event.listItem,\n }),\n ],\n ],\n})\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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: 'text block.set',\n level,\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusListBlock = selectors.getFocusListBlock({context})\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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n toggleListItemOff,\n toggleListItemOn,\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {defineBehavior, raise} from './behavior.types'\n\nexport const coreSerializeBehaviors = {\n 'serialize': defineBehavior({\n on: 'serialize',\n guard: ({context, event}) => {\n if (context.converters.length === 0) {\n return false\n }\n\n const serializeEvents = context.converters.map((converter) =>\n converter.serialize({context, event}),\n )\n\n if (serializeEvents.length === 0) {\n return false\n }\n\n return serializeEvents\n },\n actions: [\n ({event}, serializeEvents) =>\n serializeEvents.map((serializeEvent) =>\n raise({\n ...serializeEvent,\n dataTransfer: event.dataTransfer,\n }),\n ),\n ],\n }),\n 'serialization.success': defineBehavior({\n on: 'serialization.success',\n actions: [\n ({event}) => [\n raise({\n type: 'data transfer.set',\n data: event.data,\n dataTransfer: event.dataTransfer,\n mimeType: event.mimeType,\n }),\n ],\n ],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst toggleStyleOff = defineBehavior({\n on: 'style.toggle',\n guard: ({context, event}) => selectors.isActiveStyle(event.style)({context}),\n actions: [({event}) => [raise({type: 'style.remove', style: event.style})]],\n})\n\nconst toggleStyleOn = defineBehavior({\n on: 'style.toggle',\n guard: ({context, event}) => !selectors.isActiveStyle(event.style)({context}),\n actions: [({event}) => [raise({type: 'style.add', style: event.style})]],\n})\n\nexport const coreStyleBehaviors = {\n toggleStyleOff,\n toggleStyleOn,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreDeserializeBehaviors} from './behavior.core.deserialize'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\nimport {coreSerializeBehaviors} from './behavior.core.serialize'\nimport {coreStyleBehaviors} from './behavior.core.style'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.toggleAnnotationOff,\n coreAnnotationBehaviors.toggleAnnotationOn,\n coreDecoratorBehaviors.toggleDecoratorOff,\n coreDecoratorBehaviors.toggleDecoratorOn,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreDeserializeBehaviors.deserialize,\n coreDeserializeBehaviors['deserialization.success'],\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.toggleListItemOff,\n coreListBehaviors.toggleListItemOn,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.atTheEndOfTextBlock,\n coreInsertBreakBehaviors.atTheStartOfTextBlock,\n coreSerializeBehaviors.serialize,\n coreSerializeBehaviors['serialization.success'],\n coreStyleBehaviors.toggleStyleOff,\n coreStyleBehaviors.toggleStyleOn,\n]\n\n/**\n * @beta\n */\nexport const coreBehavior = {\n annotation: coreAnnotationBehaviors,\n decorators: coreDecoratorBehaviors,\n deserialize: coreDeserializeBehaviors,\n blockObjects: coreBlockObjectBehaviors,\n insertBreak: coreInsertBreakBehaviors,\n lists: coreListBehaviors,\n ...coreSerializeBehaviors,\n style: coreSerializeBehaviors,\n}\n"],"names":["isCustomBehaviorEvent","event","type","startsWith","raise","defineBehavior","behavior","toggleAnnotationOff","on","guard","context","selectors","annotation","name","actions","toggleAnnotationOn","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","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","selection","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","toggleDecoratorOff","decorator","toggleDecoratorOn","strongShortcut","schema","decorators","some","value","emShortcut","underlineShortcut","codeShortcut","coreDeserializeBehaviors","deserializeEvents","converters","flatMap","converter","data","dataTransfer","getData","mimeType","deserialize","find","deserializeEvent","reason","map","join","blocks","atTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","block","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","atTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","toggleListItemOff","toggleListItemOn","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","isListBlock","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreSerializeBehaviors","serializeEvents","serialize","serializeEvent","toggleStyleOff","toggleStyleOn","coreStyleBehaviors","coreBehaviors","coreBehavior","blockObjects","insertBreak","lists"],"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.deserialize.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.serialize.ts","../../src/behaviors/behavior.core.style.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} from '../editor/editor-snapshot'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\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: 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 }\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: '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 | {\n type: 'text block.set'\n at: [KeyedSegment]\n level?: number\n listItem?: string\n style?: string\n }\n | {\n type: 'text block.unset'\n at: [KeyedSegment]\n props: Array<'level' | 'listItem' | 'style'>\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' | '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\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = PickFromUnion<\n BehaviorEvent,\n 'type',\n TBehaviorEventType\n >,\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> = ({\n context,\n event,\n}: {\n context: EditorContext\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse> = (\n {\n context,\n event,\n }: {\n context: EditorContext\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 : 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 : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n\n/**\n * @beta\n */\nexport type BlockOffset = {\n path: [KeyedSegment]\n offset: number\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst toggleAnnotationOff = defineBehavior({\n on: 'annotation.toggle',\n guard: ({context, event}) =>\n selectors.isActiveAnnotation(event.annotation.name)({context}),\n actions: [\n ({event}) => [\n raise({type: 'annotation.remove', annotation: event.annotation}),\n ],\n ],\n})\n\nconst toggleAnnotationOn = defineBehavior({\n on: 'annotation.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveAnnotation(event.annotation.name)({context}),\n actions: [\n ({event}) => [\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n toggleAnnotationOff,\n toggleAnnotationOn,\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: ({context, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const nextBlock = selectors.getNextBlock({context})\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: ({context, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const previousBlock = selectors.getPreviousBlock({context})\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: ({context}) => {\n const focusBlockObject = selectors.getFocusBlockObject({context})\n const collapsedSelection = selectors.isSelectionCollapsed({context})\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: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const previousBlock = selectors.getPreviousBlock({context})\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: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const nextBlock = selectors.getNextBlock({context})\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 * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n toggleDecoratorOff: defineBehavior({\n on: 'decorator.toggle',\n guard: ({context, event}) =>\n selectors.isActiveDecorator(event.decorator)({context}),\n actions: [\n ({event}) => [\n raise({type: 'decorator.remove', decorator: event.decorator}),\n ],\n ],\n }),\n toggleDecoratorOn: defineBehavior({\n on: 'decorator.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveDecorator(event.decorator)({context}),\n actions: [\n ({event}) => [raise({type: 'decorator.add', decorator: event.decorator})],\n ],\n }),\n strongShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+b', event.keyboardEvent) &&\n 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: ({context, event}) =>\n isHotkey('mod+i', event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'em'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'key.down',\n guard: ({context, event}) =>\n isHotkey('mod+u', event.keyboardEvent) &&\n 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: ({context, event}) =>\n isHotkey(\"mod+'\", event.keyboardEvent) &&\n context.schema.decorators.some((decorator) => decorator.value === 'code'),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import {defineBehavior, raise} from './behavior.types'\n\nexport const coreDeserializeBehaviors = {\n 'deserialize': defineBehavior({\n on: 'deserialize',\n guard: ({context, event}) => {\n const deserializeEvents = context.converters.flatMap((converter) => {\n const data = event.dataTransfer.getData(converter.mimeType)\n\n if (!data) {\n return []\n }\n\n return [\n converter.deserialize({context, event: {type: 'deserialize', data}}),\n ]\n })\n\n const firstSuccess = deserializeEvents.find(\n (deserializeEvent) =>\n deserializeEvent.type === 'deserialization.success',\n )\n\n if (!firstSuccess) {\n return {\n type: 'deserialization.failure',\n mimeType: '*/*',\n reason: deserializeEvents\n .map((deserializeEvent) =>\n deserializeEvent.type === 'deserialization.failure'\n ? deserializeEvent.reason\n : '',\n )\n .join(', '),\n } as const\n }\n\n return firstSuccess\n },\n actions: [\n ({event}, deserializeEvent) => [\n raise({\n ...deserializeEvent,\n dataTransfer: event.dataTransfer,\n }),\n ],\n ],\n }),\n 'deserialization.success': defineBehavior({\n on: 'deserialization.success',\n actions: [\n ({event}) => [\n raise({\n type: 'insert.blocks',\n blocks: event.data,\n }),\n ],\n ],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst atTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock = selectors.isAtTheEndOfBlock(focusTextBlock)({\n context,\n })\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 ({context}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: context.schema.block.name,\n _key: context.keyGenerator(),\n children: [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst atTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan({context})\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !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 = selectors.isAtTheStartOfBlock(focusTextBlock)({\n context,\n })\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {context},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: context.schema.styles[0]?.value,\n },\n placement: 'before',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n atTheEndOfTextBlock,\n atTheStartOfTextBlock,\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 toggleListItemOff = defineBehavior({\n on: 'list item.toggle',\n guard: ({context, event}) =>\n selectors.isActiveListItem(event.listItem)({context}),\n actions: [\n ({event}) => [\n raise({\n type: 'list item.remove',\n listItem: event.listItem,\n }),\n ],\n ],\n})\n\nconst toggleListItemOn = defineBehavior({\n on: 'list item.toggle',\n guard: ({context, event}) =>\n !selectors.isActiveListItem(event.listItem)({context}),\n actions: [\n ({event}) => [\n raise({\n type: 'list item.add',\n listItem: event.listItem,\n }),\n ],\n ],\n})\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n 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: 'text block.set',\n level,\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusListBlock = selectors.getFocusListBlock({context})\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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const guards = createGuards(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: 'text block.set',\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n toggleListItemOff,\n toggleListItemOn,\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {defineBehavior, raise} from './behavior.types'\n\nexport const coreSerializeBehaviors = {\n 'serialize': defineBehavior({\n on: 'serialize',\n guard: ({context, event}) => {\n if (context.converters.length === 0) {\n return false\n }\n\n const serializeEvents = context.converters.map((converter) =>\n converter.serialize({context, event}),\n )\n\n if (serializeEvents.length === 0) {\n return false\n }\n\n return serializeEvents\n },\n actions: [\n ({event}, serializeEvents) =>\n serializeEvents.map((serializeEvent) =>\n raise({\n ...serializeEvent,\n dataTransfer: event.dataTransfer,\n }),\n ),\n ],\n }),\n 'serialization.success': defineBehavior({\n on: 'serialization.success',\n actions: [\n ({event}) => [\n raise({\n type: 'data transfer.set',\n data: event.data,\n dataTransfer: event.dataTransfer,\n mimeType: event.mimeType,\n }),\n ],\n ],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst toggleStyleOff = defineBehavior({\n on: 'style.toggle',\n guard: ({context, event}) => selectors.isActiveStyle(event.style)({context}),\n actions: [({event}) => [raise({type: 'style.remove', style: event.style})]],\n})\n\nconst toggleStyleOn = defineBehavior({\n on: 'style.toggle',\n guard: ({context, event}) => !selectors.isActiveStyle(event.style)({context}),\n actions: [({event}) => [raise({type: 'style.add', style: event.style})]],\n})\n\nexport const coreStyleBehaviors = {\n toggleStyleOff,\n toggleStyleOn,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreDeserializeBehaviors} from './behavior.core.deserialize'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\nimport {coreSerializeBehaviors} from './behavior.core.serialize'\nimport {coreStyleBehaviors} from './behavior.core.style'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.toggleAnnotationOff,\n coreAnnotationBehaviors.toggleAnnotationOn,\n coreDecoratorBehaviors.toggleDecoratorOff,\n coreDecoratorBehaviors.toggleDecoratorOn,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreDeserializeBehaviors.deserialize,\n coreDeserializeBehaviors['deserialization.success'],\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.toggleListItemOff,\n coreListBehaviors.toggleListItemOn,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.atTheEndOfTextBlock,\n coreInsertBreakBehaviors.atTheStartOfTextBlock,\n coreSerializeBehaviors.serialize,\n coreSerializeBehaviors['serialization.success'],\n coreStyleBehaviors.toggleStyleOff,\n coreStyleBehaviors.toggleStyleOn,\n]\n"],"names":["isCustomBehaviorEvent","event","type","startsWith","raise","defineBehavior","behavior","toggleAnnotationOff","on","guard","context","selectors","annotation","name","actions","toggleAnnotationOn","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","toUpperCase","charCodeAt","arrowDownOnLonelyBlockObject","isArrowDown","keyboardEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","selection","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","toggleDecoratorOff","decorator","toggleDecoratorOn","strongShortcut","schema","decorators","some","value","emShortcut","underlineShortcut","codeShortcut","coreDeserializeBehaviors","deserializeEvents","converters","flatMap","converter","data","dataTransfer","getData","mimeType","deserialize","find","deserializeEvent","reason","map","join","blocks","atTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","block","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","atTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","coreInsertBreakBehaviors","MAX_LIST_LEVEL","toggleListItemOff","toggleListItemOn","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","isListBlock","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreSerializeBehaviors","serializeEvents","serialize","serializeEvent","toggleStyleOff","toggleStyleOn","coreStyleBehaviors","coreBehaviors"],"mappings":"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"}
|
|
@@ -1655,7 +1655,7 @@ function findOperationTargetBlock(editor, operation) {
|
|
|
1655
1655
|
let block;
|
|
1656
1656
|
return operation.type === "set_selection" && editor.selection ? block = editor.children[editor.selection.focus.path[0]] : "path" in operation && (block = editor.children[operation.path[0]]), block;
|
|
1657
1657
|
}
|
|
1658
|
-
const syncValueCallback = ({
|
|
1658
|
+
const debug$d = debugWithName("sync machine"), syncValueCallback = ({
|
|
1659
1659
|
sendBack,
|
|
1660
1660
|
input
|
|
1661
1661
|
}) => {
|
|
@@ -1705,7 +1705,15 @@ const syncValueCallback = ({
|
|
|
1705
1705
|
}) => context.initialValueSynced,
|
|
1706
1706
|
"is busy": ({
|
|
1707
1707
|
context
|
|
1708
|
-
}) =>
|
|
1708
|
+
}) => {
|
|
1709
|
+
const editable = !context.readOnly, isProcessingLocalChanges = context.isProcessingLocalChanges, isChanging = isChangingRemotely(context.slateEditor) ?? !1, isBusy = editable && (isProcessingLocalChanges || isChanging);
|
|
1710
|
+
return debug$d("isBusy", {
|
|
1711
|
+
isBusy,
|
|
1712
|
+
editable,
|
|
1713
|
+
isProcessingLocalChanges,
|
|
1714
|
+
isChanging
|
|
1715
|
+
}), isBusy;
|
|
1716
|
+
},
|
|
1709
1717
|
"value changed while syncing": ({
|
|
1710
1718
|
context,
|
|
1711
1719
|
event
|
|
@@ -1752,13 +1760,24 @@ const syncValueCallback = ({
|
|
|
1752
1760
|
initial: "syncing initial value",
|
|
1753
1761
|
states: {
|
|
1754
1762
|
"syncing initial value": {
|
|
1763
|
+
entry: [() => {
|
|
1764
|
+
debug$d("entry: syncing initial value");
|
|
1765
|
+
}],
|
|
1766
|
+
exit: [() => {
|
|
1767
|
+
debug$d("exit: syncing initial value");
|
|
1768
|
+
}],
|
|
1755
1769
|
always: {
|
|
1756
1770
|
guard: "initial value synced",
|
|
1757
1771
|
target: "done syncing initial value"
|
|
1758
1772
|
}
|
|
1759
1773
|
},
|
|
1760
1774
|
"done syncing initial value": {
|
|
1761
|
-
entry: ["emit done syncing initial value"
|
|
1775
|
+
entry: ["emit done syncing initial value", () => {
|
|
1776
|
+
debug$d("entry: done syncing initial value");
|
|
1777
|
+
}],
|
|
1778
|
+
exit: [() => {
|
|
1779
|
+
debug$d("exit: done syncing initial value");
|
|
1780
|
+
}],
|
|
1762
1781
|
type: "final"
|
|
1763
1782
|
}
|
|
1764
1783
|
}
|
|
@@ -1767,6 +1786,12 @@ const syncValueCallback = ({
|
|
|
1767
1786
|
initial: "idle",
|
|
1768
1787
|
states: {
|
|
1769
1788
|
idle: {
|
|
1789
|
+
entry: [() => {
|
|
1790
|
+
debug$d("entry: syncing->idle");
|
|
1791
|
+
}],
|
|
1792
|
+
exit: [() => {
|
|
1793
|
+
debug$d("exit: syncing->idle");
|
|
1794
|
+
}],
|
|
1770
1795
|
on: {
|
|
1771
1796
|
"update value": [{
|
|
1772
1797
|
guard: "is busy",
|
|
@@ -1779,10 +1804,20 @@ const syncValueCallback = ({
|
|
|
1779
1804
|
}
|
|
1780
1805
|
},
|
|
1781
1806
|
busy: {
|
|
1807
|
+
entry: [() => {
|
|
1808
|
+
debug$d("entry: syncing->busy");
|
|
1809
|
+
}],
|
|
1810
|
+
exit: [() => {
|
|
1811
|
+
debug$d("exit: syncing->busy");
|
|
1812
|
+
}],
|
|
1782
1813
|
after: {
|
|
1783
1814
|
1e3: [{
|
|
1784
1815
|
guard: "is busy",
|
|
1785
|
-
|
|
1816
|
+
target: ".",
|
|
1817
|
+
reenter: !0,
|
|
1818
|
+
actions: [() => {
|
|
1819
|
+
debug$d("reenter: syncing->busy");
|
|
1820
|
+
}]
|
|
1786
1821
|
}, {
|
|
1787
1822
|
target: "syncing"
|
|
1788
1823
|
}]
|
|
@@ -1794,6 +1829,12 @@ const syncValueCallback = ({
|
|
|
1794
1829
|
}
|
|
1795
1830
|
},
|
|
1796
1831
|
syncing: {
|
|
1832
|
+
entry: [() => {
|
|
1833
|
+
debug$d("entry: syncing->syncing");
|
|
1834
|
+
}],
|
|
1835
|
+
exit: [() => {
|
|
1836
|
+
debug$d("exit: syncing->syncing");
|
|
1837
|
+
}],
|
|
1797
1838
|
always: {
|
|
1798
1839
|
guard: "pending value equals previous value",
|
|
1799
1840
|
target: "idle",
|
|
@@ -1848,7 +1889,7 @@ const syncValueCallback = ({
|
|
|
1848
1889
|
}
|
|
1849
1890
|
}
|
|
1850
1891
|
}
|
|
1851
|
-
})
|
|
1892
|
+
});
|
|
1852
1893
|
async function updateValue({
|
|
1853
1894
|
context,
|
|
1854
1895
|
sendBack,
|
|
@@ -2585,7 +2626,74 @@ function createOperationToPatches(types2) {
|
|
|
2585
2626
|
splitNodePatch
|
|
2586
2627
|
};
|
|
2587
2628
|
}
|
|
2588
|
-
const
|
|
2629
|
+
const insertBreakActionImplementation = ({
|
|
2630
|
+
context,
|
|
2631
|
+
action
|
|
2632
|
+
}) => {
|
|
2633
|
+
const keyGenerator = context.keyGenerator, schema2 = context.schema, editor = action.editor;
|
|
2634
|
+
if (!editor.selection)
|
|
2635
|
+
return;
|
|
2636
|
+
const anchorBlockPath = editor.selection.anchor.path.slice(0, 1), focusBlockPath = editor.selection.focus.path.slice(0, 1), focusBlock = slate.Node.descendant(editor, focusBlockPath);
|
|
2637
|
+
if (editor.isTextBlock(focusBlock) && anchorBlockPath[0] === focusBlockPath[0]) {
|
|
2638
|
+
slate.Transforms.splitNodes(editor, {
|
|
2639
|
+
at: editor.selection
|
|
2640
|
+
});
|
|
2641
|
+
const [nextBlock, nextBlockPath] = slate.Editor.node(editor, slate.Path.next(focusBlockPath), {
|
|
2642
|
+
depth: 1
|
|
2643
|
+
}), nextChild = slate.Node.child(nextBlock, 0);
|
|
2644
|
+
if (!editor.isTextSpan(nextChild) && slate.Transforms.insertNodes(editor, {
|
|
2645
|
+
_key: context.keyGenerator(),
|
|
2646
|
+
_type: "span",
|
|
2647
|
+
text: "",
|
|
2648
|
+
marks: []
|
|
2649
|
+
}, {
|
|
2650
|
+
at: [nextBlockPath[0], 0]
|
|
2651
|
+
}), slate.Transforms.setSelection(editor, {
|
|
2652
|
+
anchor: {
|
|
2653
|
+
path: [...nextBlockPath, 0],
|
|
2654
|
+
offset: 0
|
|
2655
|
+
},
|
|
2656
|
+
focus: {
|
|
2657
|
+
path: [...nextBlockPath, 0],
|
|
2658
|
+
offset: 0
|
|
2659
|
+
}
|
|
2660
|
+
}), editor.isTextBlock(nextBlock) && nextBlock.markDefs && nextBlock.markDefs.length > 0) {
|
|
2661
|
+
const newMarkDefKeys = /* @__PURE__ */ new Map(), prevNodeSpans = Array.from(slate.Node.children(editor, focusBlockPath)).map((entry) => entry[0]).filter((node) => editor.isTextSpan(node)), children = slate.Node.children(editor, nextBlockPath);
|
|
2662
|
+
for (const [child, childPath] of children) {
|
|
2663
|
+
if (!editor.isTextSpan(child))
|
|
2664
|
+
continue;
|
|
2665
|
+
const marks = child.marks ?? [];
|
|
2666
|
+
for (const mark of marks)
|
|
2667
|
+
schema2.decorators.some((decorator) => decorator.value === mark) || prevNodeSpans.some((prevNodeSpan) => prevNodeSpan.marks?.includes(mark)) && !newMarkDefKeys.has(mark) && newMarkDefKeys.set(mark, keyGenerator());
|
|
2668
|
+
const newMarks = marks.map((mark) => newMarkDefKeys.get(mark) ?? mark);
|
|
2669
|
+
isEqual__default.default(marks, newMarks) || slate.Transforms.setNodes(editor, {
|
|
2670
|
+
marks: newMarks
|
|
2671
|
+
}, {
|
|
2672
|
+
at: childPath
|
|
2673
|
+
});
|
|
2674
|
+
}
|
|
2675
|
+
const newMarkDefs = nextBlock.markDefs.map((markDef) => ({
|
|
2676
|
+
...markDef,
|
|
2677
|
+
_key: newMarkDefKeys.get(markDef._key) ?? markDef._key
|
|
2678
|
+
}));
|
|
2679
|
+
isEqual__default.default(nextBlock.markDefs, newMarkDefs) || slate.Transforms.setNodes(editor, {
|
|
2680
|
+
markDefs: newMarkDefs
|
|
2681
|
+
}, {
|
|
2682
|
+
at: nextBlockPath,
|
|
2683
|
+
match: (node) => editor.isTextBlock(node)
|
|
2684
|
+
});
|
|
2685
|
+
}
|
|
2686
|
+
return;
|
|
2687
|
+
}
|
|
2688
|
+
slate.Transforms.splitNodes(editor, {
|
|
2689
|
+
always: !0
|
|
2690
|
+
});
|
|
2691
|
+
}, insertSoftBreakActionImplementation = ({
|
|
2692
|
+
action
|
|
2693
|
+
}) => {
|
|
2694
|
+
slate.insertText(action.editor, `
|
|
2695
|
+
`);
|
|
2696
|
+
}, IS_APPLYING_BEHAVIOR_ACTIONS = /* @__PURE__ */ new WeakMap();
|
|
2589
2697
|
function withApplyingBehaviorActions(editor, fn) {
|
|
2590
2698
|
const prev = isApplyingBehaviorActions(editor);
|
|
2591
2699
|
IS_APPLYING_BEHAVIOR_ACTIONS.set(editor, !0), fn(), IS_APPLYING_BEHAVIOR_ACTIONS.set(editor, prev);
|
|
@@ -2642,7 +2750,6 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2642
2750
|
deleteForward,
|
|
2643
2751
|
insertBreak,
|
|
2644
2752
|
insertData,
|
|
2645
|
-
insertSoftBreak,
|
|
2646
2753
|
insertText,
|
|
2647
2754
|
select,
|
|
2648
2755
|
setFragmentData
|
|
@@ -2700,7 +2807,16 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2700
2807
|
});
|
|
2701
2808
|
}, editor.insertSoftBreak = () => {
|
|
2702
2809
|
if (isApplyingBehaviorActions(editor)) {
|
|
2703
|
-
|
|
2810
|
+
insertSoftBreakActionImplementation({
|
|
2811
|
+
context: {
|
|
2812
|
+
keyGenerator: editorActor.getSnapshot().context.keyGenerator,
|
|
2813
|
+
schema: editorActor.getSnapshot().context.schema
|
|
2814
|
+
},
|
|
2815
|
+
action: {
|
|
2816
|
+
type: "insert.soft break",
|
|
2817
|
+
editor
|
|
2818
|
+
}
|
|
2819
|
+
});
|
|
2704
2820
|
return;
|
|
2705
2821
|
}
|
|
2706
2822
|
editorActor.send({
|
|
@@ -4775,73 +4891,6 @@ const blockSetBehaviorActionImplementation = ({
|
|
|
4775
4891
|
}), action.editor.insertFragment(fragment), slate.Transforms.removeNodes(action.editor, {
|
|
4776
4892
|
at: [0]
|
|
4777
4893
|
})) : action.editor.insertFragment(fragment);
|
|
4778
|
-
}, insertBreakActionImplementation = ({
|
|
4779
|
-
context,
|
|
4780
|
-
action
|
|
4781
|
-
}) => {
|
|
4782
|
-
const keyGenerator = context.keyGenerator, schema2 = context.schema, editor = action.editor;
|
|
4783
|
-
if (!editor.selection)
|
|
4784
|
-
return;
|
|
4785
|
-
const anchorBlockPath = editor.selection.anchor.path.slice(0, 1), focusBlockPath = editor.selection.focus.path.slice(0, 1), focusBlock = slate.Node.descendant(editor, focusBlockPath);
|
|
4786
|
-
if (editor.isTextBlock(focusBlock) && anchorBlockPath[0] === focusBlockPath[0]) {
|
|
4787
|
-
slate.Transforms.splitNodes(editor, {
|
|
4788
|
-
at: editor.selection
|
|
4789
|
-
});
|
|
4790
|
-
const [nextBlock, nextBlockPath] = slate.Editor.node(editor, slate.Path.next(focusBlockPath), {
|
|
4791
|
-
depth: 1
|
|
4792
|
-
}), nextChild = slate.Node.child(nextBlock, 0);
|
|
4793
|
-
if (!editor.isTextSpan(nextChild) && slate.Transforms.insertNodes(editor, {
|
|
4794
|
-
_key: context.keyGenerator(),
|
|
4795
|
-
_type: "span",
|
|
4796
|
-
text: "",
|
|
4797
|
-
marks: []
|
|
4798
|
-
}, {
|
|
4799
|
-
at: [nextBlockPath[0], 0]
|
|
4800
|
-
}), slate.Transforms.setSelection(editor, {
|
|
4801
|
-
anchor: {
|
|
4802
|
-
path: [...nextBlockPath, 0],
|
|
4803
|
-
offset: 0
|
|
4804
|
-
},
|
|
4805
|
-
focus: {
|
|
4806
|
-
path: [...nextBlockPath, 0],
|
|
4807
|
-
offset: 0
|
|
4808
|
-
}
|
|
4809
|
-
}), editor.isTextBlock(nextBlock) && nextBlock.markDefs && nextBlock.markDefs.length > 0) {
|
|
4810
|
-
const newMarkDefKeys = /* @__PURE__ */ new Map(), prevNodeSpans = Array.from(slate.Node.children(editor, focusBlockPath)).map((entry) => entry[0]).filter((node) => editor.isTextSpan(node)), children = slate.Node.children(editor, nextBlockPath);
|
|
4811
|
-
for (const [child, childPath] of children) {
|
|
4812
|
-
if (!editor.isTextSpan(child))
|
|
4813
|
-
continue;
|
|
4814
|
-
const marks = child.marks ?? [];
|
|
4815
|
-
for (const mark of marks)
|
|
4816
|
-
schema2.decorators.some((decorator) => decorator.value === mark) || prevNodeSpans.some((prevNodeSpan) => prevNodeSpan.marks?.includes(mark)) && !newMarkDefKeys.has(mark) && newMarkDefKeys.set(mark, keyGenerator());
|
|
4817
|
-
const newMarks = marks.map((mark) => newMarkDefKeys.get(mark) ?? mark);
|
|
4818
|
-
isEqual__default.default(marks, newMarks) || slate.Transforms.setNodes(editor, {
|
|
4819
|
-
marks: newMarks
|
|
4820
|
-
}, {
|
|
4821
|
-
at: childPath
|
|
4822
|
-
});
|
|
4823
|
-
}
|
|
4824
|
-
const newMarkDefs = nextBlock.markDefs.map((markDef) => ({
|
|
4825
|
-
...markDef,
|
|
4826
|
-
_key: newMarkDefKeys.get(markDef._key) ?? markDef._key
|
|
4827
|
-
}));
|
|
4828
|
-
isEqual__default.default(nextBlock.markDefs, newMarkDefs) || slate.Transforms.setNodes(editor, {
|
|
4829
|
-
markDefs: newMarkDefs
|
|
4830
|
-
}, {
|
|
4831
|
-
at: nextBlockPath,
|
|
4832
|
-
match: (node) => editor.isTextBlock(node)
|
|
4833
|
-
});
|
|
4834
|
-
}
|
|
4835
|
-
return;
|
|
4836
|
-
}
|
|
4837
|
-
slate.Transforms.splitNodes(editor, {
|
|
4838
|
-
always: !0
|
|
4839
|
-
});
|
|
4840
|
-
}, insertSoftBreakActionImplementation = ({
|
|
4841
|
-
action
|
|
4842
|
-
}) => {
|
|
4843
|
-
slate.insertText(action.editor, `
|
|
4844
|
-
`);
|
|
4845
4894
|
}, insertInlineObjectActionImplementation = ({
|
|
4846
4895
|
context,
|
|
4847
4896
|
action
|
|
@@ -5533,6 +5582,24 @@ function performDefaultAction({
|
|
|
5533
5582
|
});
|
|
5534
5583
|
}
|
|
5535
5584
|
}
|
|
5585
|
+
const keyIs = {
|
|
5586
|
+
lineBreak: (event) => event.key === "Enter" && event.shiftKey
|
|
5587
|
+
}, foundationalBehaviors = [
|
|
5588
|
+
/**
|
|
5589
|
+
* On WebKit, Shift+Enter results in an `insertParagraph` input event rather
|
|
5590
|
+
* than an `insertLineBreak` input event. This Behavior makes sure we catch
|
|
5591
|
+
* that `key.down` event beforehand and raise an `insert.soft break` manually.
|
|
5592
|
+
*/
|
|
5593
|
+
behavior_core.defineBehavior({
|
|
5594
|
+
on: "key.down",
|
|
5595
|
+
guard: ({
|
|
5596
|
+
event
|
|
5597
|
+
}) => keyIs.lineBreak(event.keyboardEvent),
|
|
5598
|
+
actions: [() => [behavior_core.raise({
|
|
5599
|
+
type: "insert.soft break"
|
|
5600
|
+
})]]
|
|
5601
|
+
})
|
|
5602
|
+
];
|
|
5536
5603
|
function getActiveDecorators({
|
|
5537
5604
|
schema: schema2,
|
|
5538
5605
|
slateEditorInstance
|
|
@@ -5586,7 +5653,7 @@ const editorMachine = xstate.setup({
|
|
|
5586
5653
|
"assign behaviors": xstate.assign({
|
|
5587
5654
|
behaviors: ({
|
|
5588
5655
|
event
|
|
5589
|
-
}) => (xstate.assertEvent(event, "update behaviors"), new Set(event.behaviors))
|
|
5656
|
+
}) => (xstate.assertEvent(event, "update behaviors"), /* @__PURE__ */ new Set([...foundationalBehaviors, ...event.behaviors]))
|
|
5590
5657
|
}),
|
|
5591
5658
|
"assign schema": xstate.assign({
|
|
5592
5659
|
schema: ({
|
|
@@ -5753,7 +5820,7 @@ const editorMachine = xstate.setup({
|
|
|
5753
5820
|
context: ({
|
|
5754
5821
|
input
|
|
5755
5822
|
}) => ({
|
|
5756
|
-
behaviors: new Set(input.behaviors ?? behavior_core.coreBehaviors),
|
|
5823
|
+
behaviors: /* @__PURE__ */ new Set([...foundationalBehaviors, ...input.behaviors ?? behavior_core.coreBehaviors]),
|
|
5757
5824
|
converters: new Set(input.converters ?? []),
|
|
5758
5825
|
keyGenerator: input.keyGenerator,
|
|
5759
5826
|
pendingEvents: [],
|
|
@@ -6594,7 +6661,7 @@ class PortableTextEditor extends React.Component {
|
|
|
6594
6661
|
* const selectedSlice = useEditorSelector(editor, selectors.getSelectedSlice)
|
|
6595
6662
|
* ```
|
|
6596
6663
|
*/
|
|
6597
|
-
static getFragment = (editor) =>
|
|
6664
|
+
static getFragment = (editor) => editor.editable?.getFragment();
|
|
6598
6665
|
static undo = (editor) => {
|
|
6599
6666
|
debug("Host undoing"), editor.editable?.undo();
|
|
6600
6667
|
};
|