@portabletext/editor 1.22.0 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +65 -2
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/util.slice-blocks.cjs +26 -12
  4. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  5. package/lib/_chunks-es/behavior.core.js +65 -2
  6. package/lib/_chunks-es/behavior.core.js.map +1 -1
  7. package/lib/_chunks-es/util.slice-blocks.js +26 -12
  8. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  9. package/lib/behaviors/index.d.cts +1111 -44
  10. package/lib/behaviors/index.d.ts +1111 -44
  11. package/lib/index.cjs +542 -333
  12. package/lib/index.cjs.map +1 -1
  13. package/lib/index.d.cts +446 -1
  14. package/lib/index.d.ts +446 -1
  15. package/lib/index.js +546 -335
  16. package/lib/index.js.map +1 -1
  17. package/lib/selectors/index.d.cts +73 -0
  18. package/lib/selectors/index.d.ts +73 -0
  19. package/package.json +23 -18
  20. package/src/behavior-actions/behavior.action.data-transfer-set.ts +7 -0
  21. package/src/behavior-actions/behavior.action.insert-blocks.ts +61 -0
  22. package/src/behavior-actions/behavior.actions.ts +75 -0
  23. package/src/behaviors/behavior.core.deserialize.ts +46 -0
  24. package/src/behaviors/behavior.core.serialize.ts +44 -0
  25. package/src/behaviors/behavior.core.ts +7 -0
  26. package/src/behaviors/behavior.types.ts +39 -2
  27. package/src/converters/converter.json.ts +53 -0
  28. package/src/converters/converter.portable-text.deserialize.test.ts +686 -0
  29. package/src/converters/converter.portable-text.ts +59 -0
  30. package/src/converters/converter.text-html.deserialize.test.ts +349 -0
  31. package/src/converters/converter.text-html.serialize.test.ts +233 -0
  32. package/src/converters/converter.text-html.ts +61 -0
  33. package/src/converters/converter.text-plain.test.ts +241 -0
  34. package/src/converters/converter.text-plain.ts +91 -0
  35. package/src/converters/converter.ts +65 -0
  36. package/src/converters/converters.ts +11 -0
  37. package/src/editor/Editable.tsx +3 -13
  38. package/src/editor/create-editor.ts +3 -0
  39. package/src/editor/editor-machine.ts +25 -1
  40. package/src/editor/editor-selector.ts +1 -0
  41. package/src/editor/editor-snapshot.ts +5 -0
  42. package/src/editor/plugins/create-with-event-listeners.ts +44 -0
  43. package/src/internal-utils/asserters.ts +9 -0
  44. package/src/internal-utils/mime-type.ts +1 -0
  45. package/src/internal-utils/parse-blocks.ts +136 -0
  46. package/src/internal-utils/test-key-generator.ts +9 -0
  47. package/src/selectors/selector.get-selected-spans.test.ts +1 -0
  48. package/src/selectors/selector.get-selection-text.test.ts +1 -0
  49. package/src/selectors/selector.is-active-decorator.test.ts +1 -0
  50. package/src/utils/util.slice-blocks.test.ts +216 -35
  51. package/src/utils/util.slice-blocks.ts +37 -10
  52. package/src/editor/plugins/__tests__/createWithInsertData.test.tsx +0 -181
  53. package/src/editor/plugins/createWithInsertData.ts +0 -425
@@ -1 +1 @@
1
- {"version":3,"file":"behavior.core.js","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {KeyedSegment, PortableTextTextBlock} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {EditorContext} from '../editor/editor-snapshot'\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: 'blur'\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'focus'\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.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'select'\n selection: EditorSelection\n }\n | {\n type: 'style.toggle'\n style: string\n }\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | {\n type: 'copy'\n data: 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/**\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: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'decorator.add'\n decorator: string\n }\n | {\n type: 'decorator.remove'\n decorator: string\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 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: '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: 'noop'\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'effect'\n effect: () => void\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: '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\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 = BehaviorEvent,\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 {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} 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: [() => [{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 {type: 'insert.text block', placement: 'before'},\n {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: [() => [{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 {\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n },\n {\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 {\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n },\n {\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: ({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 {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} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\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 {\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 {\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 {\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 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\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 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\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreListBehaviors} from './behavior.core.lists'\nimport {defineBehavior} from './behavior.types'\n\nconst softReturn = defineBehavior({\n on: 'insert.soft break',\n actions: [() => [{type: 'insert.text', text: '\\n'}]],\n})\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n softReturn,\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]\n\n/**\n * @beta\n */\nexport const coreBehavior = {\n softReturn,\n decorators: coreDecoratorBehaviors,\n blockObjects: coreBlockObjectBehaviors,\n lists: coreListBehaviors,\n}\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isCustomBehaviorEvent","type","startsWith","raise","defineBehavior","behavior","arrowDownOnLonelyBlockObject","on","guard","context","isArrowDown","keyboardEvent","focusBlockObject","selectors","nextBlock","actions","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","selection","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","MAX_LIST_LEVEL","clearListOnBackspace","focusSpan","children","_key","level","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","block","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","softReturn","text","coreBehaviors","coreBehavior","blockObjects","lists"],"mappings":"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"}
1
+ {"version":3,"file":"behavior.core.js","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.deserialize.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.serialize.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter'\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: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\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.text'\n text: string\n options?: TextInsertTextOptions\n }\n | {\n type: 'list item.toggle'\n listItem: string\n }\n | {\n type: 'select'\n selection: EditorSelection\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' | '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: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'decorator.add'\n decorator: string\n }\n | {\n type: 'decorator.remove'\n decorator: string\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 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: '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: 'noop'\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'effect'\n effect: () => void\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: '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\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 {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} 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: [() => [{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 {type: 'insert.text block', placement: 'before'},\n {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: [() => [{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 {\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n },\n {\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 {\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n },\n {\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: ({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 coreDeserializeBehavior = 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) => 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","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} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\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 {\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 {\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 {\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 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\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 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\nexport const coreListBehaviors = {\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 {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreDeserializeBehavior} from './behavior.core.deserialize'\nimport {coreListBehaviors} from './behavior.core.lists'\nimport {coreSerializeBehaviors} from './behavior.core.serialize'\nimport {defineBehavior} from './behavior.types'\n\nconst softReturn = defineBehavior({\n on: 'insert.soft break',\n actions: [() => [{type: 'insert.text', text: '\\n'}]],\n})\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n softReturn,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreDeserializeBehavior,\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 coreSerializeBehaviors.serialize,\n coreSerializeBehaviors['serialization.success'],\n]\n\n/**\n * @beta\n */\nexport const coreBehavior = {\n softReturn,\n decorators: coreDecoratorBehaviors,\n deserialize: coreDeserializeBehavior,\n blockObjects: coreBlockObjectBehaviors,\n lists: coreListBehaviors,\n ...coreSerializeBehaviors,\n}\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isCustomBehaviorEvent","type","startsWith","raise","defineBehavior","behavior","arrowDownOnLonelyBlockObject","on","guard","context","isArrowDown","keyboardEvent","focusBlockObject","selectors","nextBlock","actions","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","selection","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","coreDeserializeBehavior","deserializeEvents","converters","flatMap","converter","data","dataTransfer","getData","mimeType","deserialize","find","deserializeEvent","reason","map","join","MAX_LIST_LEVEL","clearListOnBackspace","focusSpan","children","_key","level","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","block","isListBlock","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreSerializeBehaviors","serializeEvents","serialize","serializeEvent","softReturn","text","coreBehaviors","coreBehavior","blockObjects","lists"],"mappings":"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"}
@@ -13,8 +13,16 @@ function sliceBlocks({
13
13
  if (!startBlockKey || !endBlockKey)
14
14
  return slice;
15
15
  for (const block of blocks) {
16
+ if (!isPortableTextTextBlock(block) && block._key === startBlockKey && block._key === endBlockKey) {
17
+ startBlock = block;
18
+ break;
19
+ }
16
20
  if (block._key === startBlockKey) {
17
- if (isPortableTextTextBlock(block) && startChildKey) {
21
+ if (!isPortableTextTextBlock(block)) {
22
+ startBlock = block;
23
+ continue;
24
+ }
25
+ if (startChildKey) {
18
26
  for (const child of block.children) {
19
27
  if (child._key === startChildKey) {
20
28
  if (isPortableTextSpan(child)) {
@@ -26,13 +34,14 @@ function sliceBlocks({
26
34
  text
27
35
  }]
28
36
  };
37
+ } else
38
+ startBlock = {
39
+ ...block,
40
+ children: [child]
41
+ };
42
+ if (startChildKey === endChildKey)
29
43
  break;
30
- }
31
- startBlock = {
32
- ...block,
33
- children: [child]
34
- };
35
- break;
44
+ continue;
36
45
  }
37
46
  if (startBlock && isPortableTextTextBlock(startBlock) && (startBlock.children.push(child), block._key === endBlockKey && endChildKey && child._key === endChildKey))
38
47
  break;
@@ -41,10 +50,15 @@ function sliceBlocks({
41
50
  break;
42
51
  continue;
43
52
  }
44
- startBlock = block;
53
+ if (startBlock = block, startBlockKey === endBlockKey)
54
+ break;
45
55
  }
46
56
  if (block._key === endBlockKey) {
47
- if (isPortableTextTextBlock(block) && endBlockKey) {
57
+ if (!isPortableTextTextBlock(block)) {
58
+ endBlock = block;
59
+ break;
60
+ }
61
+ if (endChildKey) {
48
62
  endBlock = {
49
63
  ...block,
50
64
  children: []
@@ -54,19 +68,19 @@ function sliceBlocks({
54
68
  if (child._key === endChildKey && isPortableTextSpan(child)) {
55
69
  endBlock.children.push({
56
70
  ...child,
57
- text: child.text.slice(endPoint.offset)
71
+ text: child.text.slice(0, endPoint.offset)
58
72
  });
59
73
  break;
60
74
  }
61
75
  if (endBlock.children.push(child), endChildKey && child._key === endChildKey)
62
76
  break;
63
77
  }
64
- continue;
78
+ break;
65
79
  }
66
80
  endBlock = block;
67
81
  break;
68
82
  }
69
- middleBlocks.push(block);
83
+ startBlock && middleBlocks.push(block);
70
84
  }
71
85
  return [...startBlock ? [startBlock] : [], ...middleBlocks, ...endBlock ? [endBlock] : []];
72
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '../selectors'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n blocks,\n selection,\n}: {\n blocks: Array<PortableTextBlock>\n selection: EditorSelection\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = selection.backward ? selection.focus : selection.anchor\n const endPoint = selection.backward ? selection.anchor : selection.focus\n\n const startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n const startChildKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endChildKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (block._key === startBlockKey) {\n if (isPortableTextTextBlock(block) && startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isPortableTextSpan(child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n break\n }\n\n startBlock = {\n ...block,\n children: [child],\n }\n break\n }\n\n if (startBlock && isPortableTextTextBlock(startBlock)) {\n startBlock.children.push(child)\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n }\n\n if (block._key === endBlockKey) {\n if (isPortableTextTextBlock(block) && endBlockKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isPortableTextTextBlock(endBlock)) {\n if (child._key === endChildKey && isPortableTextSpan(child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(endPoint.offset),\n })\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n continue\n }\n\n endBlock = block\n\n break\n }\n\n middleBlocks.push(block)\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["sliceBlocks","blocks","selection","slice","startBlock","middleBlocks","endBlock","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","path","_key","undefined","endBlockKey","startChildKey","endChildKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","offset","push"],"mappings":";AAWO,SAASA,YAAY;AAAA,EAC1BC;AAAAA,EACAC;AAIF,GAA6B;AAC3B,QAAMC,QAAkC,CAAE;AAE1C,MAAI,CAACD;AACIC,WAAAA;AAGLC,MAAAA;AACJ,QAAMC,eAAoC,CAAE;AACxCC,MAAAA;AAEJ,QAAMC,aAAaL,UAAUM,WAAWN,UAAUO,QAAQP,UAAUQ,QAC9DC,WAAWT,UAAUM,WAAWN,UAAUQ,SAASR,UAAUO,OAE7DG,gBAAgBC,aAAaN,WAAWO,KAAK,CAAC,CAAC,IACjDP,WAAWO,KAAK,CAAC,EAAEC,OACnBC,QACEC,cAAcJ,aAAaF,SAASG,KAAK,CAAC,CAAC,IAC7CH,SAASG,KAAK,CAAC,EAAEC,OACjBC,QACEE,gBAAgBL,aAAaN,WAAWO,KAAK,CAAC,CAAC,IACjDP,WAAWO,KAAK,CAAC,EAAEC,OACnBC,QACEG,cAAcN,aAAaF,SAASG,KAAK,CAAC,CAAC,IAC7CH,SAASG,KAAK,CAAC,EAAEC,OACjBC;AAEA,MAAA,CAACJ,iBAAiB,CAACK;AACdd,WAAAA;AAGT,aAAWiB,SAASnB,QAAQ;AACtBmB,QAAAA,MAAML,SAASH,eAAe;AAC5BS,UAAAA,wBAAwBD,KAAK,KAAKF,eAAe;AACxCI,mBAAAA,SAASF,MAAMG,UAAU;AAC9BD,cAAAA,MAAMP,SAASG,eAAe;AAC5BM,gBAAAA,mBAAmBF,KAAK,GAAG;AAC7B,oBAAMG,OACJH,MAAMP,SAASI,cACXG,MAAMG,KAAKtB,MAAMI,WAAWmB,QAAQf,SAASe,MAAM,IACnDJ,MAAMG,KAAKtB,MAAMI,WAAWmB,MAAM;AAE3B,2BAAA;AAAA,gBACX,GAAGN;AAAAA,gBACHG,UAAU,CACR;AAAA,kBACE,GAAGD;AAAAA,kBACHG;AAAAA,gBACD,CAAA;AAAA,cAEL;AACA;AAAA,YAAA;AAGW,yBAAA;AAAA,cACX,GAAGL;AAAAA,cACHG,UAAU,CAACD,KAAK;AAAA,YAClB;AACA;AAAA,UAAA;AAGF,cAAIlB,cAAciB,wBAAwBjB,UAAU,MAClDA,WAAWmB,SAASI,KAAKL,KAAK,GAG5BF,MAAML,SAASE,eACfE,eACAG,MAAMP,SAASI;AAEf;AAAA,QAAA;AAKN,YAAIP,kBAAkBK;AACpB;AAGF;AAAA,MAAA;AAGWG,mBAAAA;AAAAA,IAAAA;AAGXA,QAAAA,MAAML,SAASE,aAAa;AAC1BI,UAAAA,wBAAwBD,KAAK,KAAKH,aAAa;AACtC,mBAAA;AAAA,UACT,GAAGG;AAAAA,UACHG,UAAU,CAAA;AAAA,QACZ;AAEA,mBAAWD,SAASF,MAAMG;AACpBjB,cAAAA,YAAYe,wBAAwBf,QAAQ,GAAG;AACjD,gBAAIgB,MAAMP,SAASI,eAAeK,mBAAmBF,KAAK,GAAG;AAC3DhB,uBAASiB,SAASI,KAAK;AAAA,gBACrB,GAAGL;AAAAA,gBACHG,MAAMH,MAAMG,KAAKtB,MAAMQ,SAASe,MAAM;AAAA,cAAA,CACvC;AACD;AAAA,YAAA;AAKF,gBAFApB,SAASiB,SAASI,KAAKL,KAAK,GAExBH,eAAeG,MAAMP,SAASI;AAChC;AAAA,UAAA;AAKN;AAAA,MAAA;AAGSC,iBAAAA;AAEX;AAAA,IAAA;AAGFf,iBAAasB,KAAKP,KAAK;AAAA,EAAA;AAGzB,SAAO,CACL,GAAIhB,aAAa,CAACA,UAAU,IAAI,CAAA,GAChC,GAAGC,cACH,GAAIC,WAAW,CAACA,QAAQ,IAAI,CAAA,CAAG;AAEnC;"}
1
+ {"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '../selectors'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n blocks,\n selection,\n}: {\n blocks: Array<PortableTextBlock>\n selection: EditorSelection\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = selection.backward ? selection.focus : selection.anchor\n const endPoint = selection.backward ? selection.anchor : selection.focus\n\n const startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n const startChildKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endChildKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isPortableTextTextBlock(block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isPortableTextSpan(child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isPortableTextTextBlock(startBlock)) {\n startBlock.children.push(child)\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isPortableTextTextBlock(endBlock)) {\n if (child._key === endChildKey && isPortableTextSpan(child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["sliceBlocks","blocks","selection","slice","startBlock","middleBlocks","endBlock","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","path","_key","undefined","endBlockKey","startChildKey","endChildKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","offset","push"],"mappings":"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"}