@portabletext/editor 1.39.0 → 1.40.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 (109) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +16 -5
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/editor-provider.cjs +158 -153
  4. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
  5. package/lib/_chunks-cjs/selector.get-text-before.cjs +0 -1
  6. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +0 -3
  8. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs +0 -4
  10. package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
  11. package/lib/_chunks-cjs/{parse-blocks.cjs → util.selection-point-to-block-offset.cjs} +74 -4
  12. package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs.map +1 -0
  13. package/lib/_chunks-cjs/util.slice-blocks.cjs +2 -2
  14. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  15. package/lib/_chunks-cjs/util.split-text-block.cjs +68 -0
  16. package/lib/_chunks-cjs/util.split-text-block.cjs.map +1 -0
  17. package/lib/_chunks-es/behavior.core.js +17 -6
  18. package/lib/_chunks-es/behavior.core.js.map +1 -1
  19. package/lib/_chunks-es/editor-provider.js +155 -150
  20. package/lib/_chunks-es/editor-provider.js.map +1 -1
  21. package/lib/_chunks-es/selector.get-text-before.js +1 -2
  22. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  23. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +1 -4
  24. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  25. package/lib/_chunks-es/selector.is-overlapping-selection.js +1 -5
  26. package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
  27. package/lib/_chunks-es/{parse-blocks.js → util.selection-point-to-block-offset.js} +76 -5
  28. package/lib/_chunks-es/util.selection-point-to-block-offset.js.map +1 -0
  29. package/lib/_chunks-es/util.slice-blocks.js +2 -2
  30. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  31. package/lib/_chunks-es/util.split-text-block.js +70 -0
  32. package/lib/_chunks-es/util.split-text-block.js.map +1 -0
  33. package/lib/behaviors/index.d.cts +1516 -911
  34. package/lib/behaviors/index.d.ts +1516 -911
  35. package/lib/index.cjs +197 -200
  36. package/lib/index.cjs.map +1 -1
  37. package/lib/index.d.cts +1247 -717
  38. package/lib/index.d.ts +1247 -717
  39. package/lib/index.js +204 -207
  40. package/lib/index.js.map +1 -1
  41. package/lib/plugins/index.cjs +11 -12
  42. package/lib/plugins/index.cjs.map +1 -1
  43. package/lib/plugins/index.d.cts +1238 -721
  44. package/lib/plugins/index.d.ts +1238 -721
  45. package/lib/plugins/index.js +3 -4
  46. package/lib/plugins/index.js.map +1 -1
  47. package/lib/selectors/index.d.cts +1237 -710
  48. package/lib/selectors/index.d.ts +1237 -710
  49. package/lib/utils/index.cjs +15 -87
  50. package/lib/utils/index.cjs.map +1 -1
  51. package/lib/utils/index.d.cts +1290 -713
  52. package/lib/utils/index.d.ts +1290 -713
  53. package/lib/utils/index.js +13 -86
  54. package/lib/utils/index.js.map +1 -1
  55. package/package.json +10 -10
  56. package/src/behavior-actions/behavior.action.decorator.add.ts +13 -2
  57. package/src/behaviors/behavior.core.block-objects.ts +32 -2
  58. package/src/behaviors/behavior.default.ts +59 -16
  59. package/src/behaviors/behavior.types.ts +67 -30
  60. package/src/editor/Editable.tsx +122 -68
  61. package/src/editor/PortableTextEditor.tsx +8 -8
  62. package/src/editor/__tests__/self-solving.test.tsx +1 -1
  63. package/src/editor/components/Element.tsx +1 -3
  64. package/src/editor/create-editor.ts +13 -5
  65. package/src/editor/editor-machine.ts +13 -3
  66. package/src/editor/editor-provider.tsx +11 -7
  67. package/src/editor/editor-selector.ts +4 -3
  68. package/src/editor/editor-snapshot.ts +2 -2
  69. package/src/editor/plugins/create-with-event-listeners.ts +18 -3
  70. package/src/editor/plugins/createWithPortableTextMarkModel.ts +1 -2
  71. package/src/internal-utils/block-keys.ts +9 -0
  72. package/src/internal-utils/collapse-selection.ts +36 -0
  73. package/src/internal-utils/compound-client-rect.ts +28 -0
  74. package/src/internal-utils/drag-selection.test.ts +507 -0
  75. package/src/internal-utils/drag-selection.ts +66 -0
  76. package/src/internal-utils/editor-selection.test.ts +40 -0
  77. package/src/internal-utils/editor-selection.ts +60 -0
  78. package/src/internal-utils/event-position.ts +55 -80
  79. package/src/internal-utils/inline-object-selection.ts +115 -0
  80. package/src/internal-utils/selection-block-keys.ts +20 -0
  81. package/src/internal-utils/selection-elements.ts +61 -0
  82. package/src/internal-utils/selection-focus-text.ts +38 -0
  83. package/src/internal-utils/selection-text.test.ts +23 -0
  84. package/src/internal-utils/selection-text.ts +90 -0
  85. package/src/internal-utils/split-string.ts +12 -0
  86. package/src/internal-utils/string-overlap.test.ts +14 -0
  87. package/src/internal-utils/string-overlap.ts +28 -0
  88. package/src/internal-utils/string-utils.ts +7 -0
  89. package/src/internal-utils/terse-pt.test.ts +60 -0
  90. package/src/internal-utils/terse-pt.ts +36 -0
  91. package/src/internal-utils/text-block-key.test.ts +30 -0
  92. package/src/internal-utils/text-block-key.ts +30 -0
  93. package/src/internal-utils/text-marks.test.ts +33 -0
  94. package/src/internal-utils/text-marks.ts +26 -0
  95. package/src/internal-utils/text-selection.test.ts +175 -0
  96. package/src/internal-utils/text-selection.ts +122 -0
  97. package/src/internal-utils/value-annotations.ts +31 -0
  98. package/src/internal-utils/values.ts +16 -5
  99. package/src/utils/index.ts +5 -0
  100. package/src/utils/util.block-offset-to-block-selection-point.ts +28 -0
  101. package/src/utils/util.block-offset-to-selection-point.ts +33 -0
  102. package/src/utils/util.block-offsets-to-selection.ts +3 -3
  103. package/src/utils/util.is-equal-selections.ts +20 -0
  104. package/src/utils/util.is-selection-collapsed.ts +15 -0
  105. package/src/utils/util.reverse-selection.ts +9 -5
  106. package/src/utils/util.selection-point-to-block-offset.ts +31 -0
  107. package/lib/_chunks-cjs/parse-blocks.cjs.map +0 -1
  108. package/lib/_chunks-es/parse-blocks.js.map +0 -1
  109. package/src/editor/components/use-draggable.ts +0 -123
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-blocks.cjs","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-span.ts","../../src/utils/util.reverse-selection.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import type {KeyedSegment, PathSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: PathSegment): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n value,\n blockOffset,\n direction,\n}: {\n value: Array<PortableTextBlock>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | undefined\n let skippedInlineObject = false\n\n for (const block of value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isPortableTextSpan(child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const spanKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n const lastChild = node.children[node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...path, 'children', {_key: lastChild._key}],\n offset: isPortableTextSpan(lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import {\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n return {\n path: [...path, 'children', {_key: node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(block: PortableTextBlock) {\n if (!isPortableTextTextBlock(block)) {\n return false\n }\n\n const onlyText = block.children.every(isPortableTextSpan)\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function reverseSelection(\n selection: NonNullable<EditorSelection>,\n): NonNullable<EditorSelection> {\n if (selection.backward) {\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: false,\n }\n }\n\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: true,\n }\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '..'\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 if (\n endChildKey &&\n child._key === endChildKey &&\n isPortableTextSpan(child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\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":["isKeyedSegment","segment","blockOffsetToSpanSelectionPoint","value","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","_key","path","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","spanSelectionPointToBlockOffset","blockKey","undefined","spanKey","getBlockEndPoint","node","lastChild","getBlockStartPoint","getTextBlockText","map","join","isEmptyTextBlock","onlyText","every","blockText","isEqualSelectionPoints","a","b","JSON","stringify","isSpan","context","_type","schema","span","name","reverseSelection","selection","backward","anchor","focus","sliceBlocks","blocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","isKeySegment","endBlockKey","startChildKey","endChildKey","push"],"mappings":"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"}
1
+ {"version":3,"file":"util.slice-blocks.cjs","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-span.ts","../../src/utils/util.reverse-selection.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import type {KeyedSegment, PathSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: PathSegment): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n value,\n blockOffset,\n direction,\n}: {\n value: Array<PortableTextBlock>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | undefined\n let skippedInlineObject = false\n\n for (const block of value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isPortableTextSpan(child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const spanKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n const lastChild = node.children[node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...path, 'children', {_key: lastChild._key}],\n offset: isPortableTextSpan(lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import {\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n return {\n path: [...path, 'children', {_key: node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(block: PortableTextBlock) {\n if (!isPortableTextTextBlock(block)) {\n return false\n }\n\n const onlyText = block.children.every(isPortableTextSpan)\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function reverseSelection<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n>(selection: TEditorSelection): TEditorSelection {\n if (!selection) {\n return selection\n }\n\n if (selection.backward) {\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: false,\n } as TEditorSelection\n }\n\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: true,\n } as TEditorSelection\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '..'\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 if (\n endChildKey &&\n child._key === endChildKey &&\n isPortableTextSpan(child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\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":["isKeyedSegment","segment","blockOffsetToSpanSelectionPoint","value","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","_key","path","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","spanSelectionPointToBlockOffset","blockKey","undefined","spanKey","getBlockEndPoint","node","lastChild","getBlockStartPoint","getTextBlockText","map","join","isEmptyTextBlock","onlyText","every","blockText","isEqualSelectionPoints","a","b","JSON","stringify","isSpan","context","_type","schema","span","name","reverseSelection","selection","backward","anchor","focus","sliceBlocks","blocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","isKeySegment","endBlockKey","startChildKey","endChildKey","push"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var util_selectionPointToBlockOffset = require("./util.selection-point-to-block-offset.cjs"), util_sliceBlocks = require("./util.slice-blocks.cjs");
3
+ function isTextBlock(context, block) {
4
+ return block._type === context.schema.block.name;
5
+ }
6
+ function mergeTextBlocks({
7
+ context,
8
+ targetBlock,
9
+ incomingBlock
10
+ }) {
11
+ const parsedIncomingBlock = util_selectionPointToBlockOffset.parseBlock({
12
+ context,
13
+ block: incomingBlock,
14
+ options: {
15
+ refreshKeys: !0
16
+ }
17
+ });
18
+ return !parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock) ? targetBlock : {
19
+ ...targetBlock,
20
+ children: [...targetBlock.children, ...parsedIncomingBlock.children],
21
+ markDefs: [...targetBlock.markDefs ?? [], ...parsedIncomingBlock.markDefs ?? []]
22
+ };
23
+ }
24
+ function splitTextBlock({
25
+ context,
26
+ block,
27
+ point
28
+ }) {
29
+ const firstChild = block.children.at(0), lastChild = block.children.at(block.children.length - 1);
30
+ if (!firstChild || !lastChild)
31
+ return;
32
+ const before = util_sliceBlocks.sliceBlocks({
33
+ blocks: [block],
34
+ selection: {
35
+ anchor: {
36
+ path: [{
37
+ _key: block._key
38
+ }, "children", {
39
+ _key: firstChild._key
40
+ }],
41
+ offset: 0
42
+ },
43
+ focus: point
44
+ }
45
+ }).at(0), after = util_sliceBlocks.sliceBlocks({
46
+ blocks: [block],
47
+ selection: {
48
+ anchor: point,
49
+ focus: {
50
+ path: [{
51
+ _key: block._key
52
+ }, "children", {
53
+ _key: lastChild._key
54
+ }],
55
+ offset: util_sliceBlocks.isSpan(context, lastChild) ? lastChild.text.length : 0
56
+ }
57
+ }
58
+ }).at(0);
59
+ if (!(!before || !after) && !(!isTextBlock(context, before) || !isTextBlock(context, after)))
60
+ return {
61
+ before,
62
+ after
63
+ };
64
+ }
65
+ exports.isTextBlock = isTextBlock;
66
+ exports.mergeTextBlocks = mergeTextBlocks;
67
+ exports.splitTextBlock = splitTextBlock;
68
+ //# sourceMappingURL=util.split-text-block.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.split-text-block.cjs","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n): block is PortableTextTextBlock {\n return block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelectionPoint} from '..'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan} from './util.is-span'\nimport {isTextBlock} from './util.is-text-block'\nimport {sliceBlocks} from './util.slice-blocks'\n\n/**\n * @beta\n */\nexport function splitTextBlock({\n context,\n block,\n point,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: PortableTextTextBlock\n point: EditorSelectionPoint\n}): {before: PortableTextTextBlock; after: PortableTextTextBlock} | undefined {\n const firstChild = block.children.at(0)\n const lastChild = block.children.at(block.children.length - 1)\n\n if (!firstChild || !lastChild) {\n return undefined\n }\n\n const before = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: {\n path: [{_key: block._key}, 'children', {_key: firstChild._key}],\n offset: 0,\n },\n focus: point,\n },\n }).at(0)\n const after = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: point,\n focus: {\n path: [{_key: block._key}, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n },\n },\n }).at(0)\n\n if (!before || !after) {\n return undefined\n }\n\n if (!isTextBlock(context, before) || !isTextBlock(context, after)) {\n return undefined\n }\n\n return {before, after}\n}\n"],"names":["isTextBlock","context","block","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","children","markDefs","splitTextBlock","point","firstChild","at","lastChild","length","before","sliceBlocks","blocks","selection","anchor","path","_key","offset","focus","after","isSpan","text"],"mappings":";;AAMgBA,SAAAA,YACdC,SACAC,OACgC;AAChC,SAAOA,MAAMC,UAAUF,QAAQG,OAAOF,MAAMG;AAC9C;ACHO,SAASC,gBAAgB;AAAA,EAC9BL;AAAAA,EACAM;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,iCAAAA,WAAW;AAAA,IACrCT;AAAAA,IACAC,OAAOM;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACT,YAAYC,SAASQ,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHM,UAAU,CAAC,GAAGN,YAAYM,UAAU,GAAGJ,oBAAoBI,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIP,YAAYO,YAAY,CAAA,GAC5B,GAAIL,oBAAoBK,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;ACzBO,SAASC,eAAe;AAAA,EAC7Bd;AAAAA,EACAC;AAAAA,EACAc;AAKF,GAA8E;AAC5E,QAAMC,aAAaf,MAAMW,SAASK,GAAG,CAAC,GAChCC,YAAYjB,MAAMW,SAASK,GAAGhB,MAAMW,SAASO,SAAS,CAAC;AAEzD,MAAA,CAACH,cAAc,CAACE;AAClB;AAGF,QAAME,SAASC,iBAAAA,YAAY;AAAA,IACzBC,QAAQ,CAACrB,KAAK;AAAA,IACdsB,WAAW;AAAA,MACTC,QAAQ;AAAA,QACNC,MAAM,CAAC;AAAA,UAACC,MAAMzB,MAAMyB;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAMV,WAAWU;AAAAA,QAAAA,CAAK;AAAA,QAC9DC,QAAQ;AAAA,MACV;AAAA,MACAC,OAAOb;AAAAA,IAAAA;AAAAA,EAEV,CAAA,EAAEE,GAAG,CAAC,GACDY,QAAQR,iBAAAA,YAAY;AAAA,IACxBC,QAAQ,CAACrB,KAAK;AAAA,IACdsB,WAAW;AAAA,MACTC,QAAQT;AAAAA,MACRa,OAAO;AAAA,QACLH,MAAM,CAAC;AAAA,UAACC,MAAMzB,MAAMyB;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAMR,UAAUQ;AAAAA,QAAAA,CAAK;AAAA,QAC7DC,QAAQG,iBAAO9B,OAAAA,SAASkB,SAAS,IAAIA,UAAUa,KAAKZ,SAAS;AAAA,MAAA;AAAA,IAC/D;AAAA,EACF,CACD,EAAEF,GAAG,CAAC;AAEP,MAAI,EAACG,CAAAA,UAAU,CAACS,UAIZ,EAAC9B,CAAAA,YAAYC,SAASoB,MAAM,KAAK,CAACrB,YAAYC,SAAS6B,KAAK;AAIzD,WAAA;AAAA,MAACT;AAAAA,MAAQS;AAAAA,IAAK;AACvB;;;;"}
@@ -1,4 +1,4 @@
1
- import { isSelectionCollapsed, getCaretWordSelection, isSelectionExpanded, getFocusBlockObject, getNextBlock, getPreviousBlock, getFocusTextBlock, isAtTheEndOfBlock, getFocusSpan, isAtTheStartOfBlock, getFocusListBlock, getSelectedBlocks, createGuards } from "./selector.is-at-the-start-of-block.js";
1
+ import { isSelectionCollapsed, getCaretWordSelection, isSelectionExpanded, getFocusBlockObject, getPreviousBlock, getNextBlock, getFocusTextBlock, isAtTheEndOfBlock, getFocusSpan, isAtTheStartOfBlock, getFocusListBlock, getSelectedBlocks, createGuards } from "./selector.is-at-the-start-of-block.js";
2
2
  import { isPortableTextTextBlock } from "@sanity/types";
3
3
  import { isEmptyTextBlock } from "./util.slice-blocks.js";
4
4
  const IS_MAC = typeof window < "u" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent), modifiers = {
@@ -119,6 +119,9 @@ function isClipboardBehaviorEvent(event) {
119
119
  function isDragBehaviorEvent(event) {
120
120
  return event.type.startsWith("drag.");
121
121
  }
122
+ function isInputBehaviorEvent(event) {
123
+ return event.type.startsWith("input.");
124
+ }
122
125
  function isKeyboardBehaviorEvent(event) {
123
126
  return event.type.startsWith("keyboard.");
124
127
  }
@@ -146,7 +149,6 @@ const addAnnotationOnCollapsedSelection = {
146
149
  return !1;
147
150
  const caretWordSelection = getCaretWordSelection(snapshot);
148
151
  return !caretWordSelection || !isSelectionExpanded({
149
- ...snapshot,
150
152
  context: {
151
153
  ...snapshot.context,
152
154
  selection: caretWordSelection
@@ -174,8 +176,10 @@ const addAnnotationOnCollapsedSelection = {
174
176
  snapshot,
175
177
  event
176
178
  }) => {
177
- const isArrowDown = isHotkey("ArrowDown", event.originEvent), focusBlockObject = getFocusBlockObject(snapshot), nextBlock = getNextBlock(snapshot);
178
- return isArrowDown && focusBlockObject && !nextBlock;
179
+ if (!isHotkey("ArrowDown", event.originEvent) || !isSelectionCollapsed(snapshot))
180
+ return !1;
181
+ const focusBlockObject = getFocusBlockObject(snapshot), nextBlock = getNextBlock(snapshot);
182
+ return focusBlockObject && !nextBlock;
179
183
  },
180
184
  actions: [() => [raise({
181
185
  type: "insert.text block",
@@ -187,8 +191,10 @@ const addAnnotationOnCollapsedSelection = {
187
191
  snapshot,
188
192
  event
189
193
  }) => {
190
- const isArrowUp = isHotkey("ArrowUp", event.originEvent), focusBlockObject = getFocusBlockObject(snapshot), previousBlock = getPreviousBlock(snapshot);
191
- return isArrowUp && focusBlockObject && !previousBlock;
194
+ if (!isHotkey("ArrowUp", event.originEvent) || !isSelectionCollapsed(snapshot))
195
+ return !1;
196
+ const focusBlockObject = getFocusBlockObject(snapshot), previousBlock = getPreviousBlock(snapshot);
197
+ return focusBlockObject && !previousBlock;
192
198
  },
193
199
  actions: [() => [raise({
194
200
  type: "insert.text block",
@@ -212,6 +218,8 @@ const addAnnotationOnCollapsedSelection = {
212
218
  snapshot,
213
219
  event
214
220
  }) => {
221
+ if (!isSelectionCollapsed(snapshot))
222
+ return !1;
215
223
  const focusBlockObject = getFocusBlockObject(snapshot), previousBlock = getPreviousBlock(snapshot);
216
224
  return event.position.isEditor && event.position.block === "start" && focusBlockObject && !previousBlock;
217
225
  },
@@ -225,6 +233,8 @@ const addAnnotationOnCollapsedSelection = {
225
233
  snapshot,
226
234
  event
227
235
  }) => {
236
+ if (!isSelectionCollapsed(snapshot))
237
+ return !1;
228
238
  const focusBlockObject = getFocusBlockObject(snapshot), nextBlock = getNextBlock(snapshot);
229
239
  return event.position.isEditor && event.position.block === "end" && focusBlockObject && !nextBlock;
230
240
  },
@@ -545,6 +555,7 @@ export {
545
555
  isCustomBehaviorEvent,
546
556
  isDragBehaviorEvent,
547
557
  isHotkey,
558
+ isInputBehaviorEvent,
548
559
  isKeyboardBehaviorEvent,
549
560
  isMouseBehaviorEvent,
550
561
  raise
@@ -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.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter.types'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'block.set'\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: 'block.unset'\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n }\n | {\n type: 'delete'\n selection: NonNullable<EditorSelection>\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'history.redo'\n }\n | {\n type: 'history.undo'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: 'insert.block object'\n placement: InsertPlacement\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: InsertPlacement\n select?: 'start' | 'end' | 'none'\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: InsertPlacement\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 select?: 'start' | 'end'\n }\n | {\n type: 'select.next block'\n select?: 'start' | 'end'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n 'deserialization.failure' | 'deserialization.success'\n > & {\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n })\n | {\n type: 'serialization.success'\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: 'serialization.failure'\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\ntype ClipboardBehaviorEvent =\n | {\n type: 'clipboard.copy'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'clipboard.cut'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'clipboard.paste'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: 'drag.dragstart'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.drag'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: 'drag.dragend'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: 'drag.dragenter'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.dragover'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.drop'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.dragleave'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: 'keyboard.keydown'\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'keyboard.keyup'\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type DataBehaviorEvent =\n | {\n type: 'deserialize'\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n }\n | {\n type: 'serialize'\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: 'mouse.click'\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | ClipboardBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\n | DragBehaviorEvent\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends `custom.${TType}` = `custom.${TType}`,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | DataBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n | {type: '*'}\n | {type: 'clipboard.*'}\n | {type: 'drag.*'}\n | {type: 'keyboard.*'}\n | {type: 'mouse.*'}\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends 'clipboard.*'\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends 'drag.*'\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n> = {\n /**\n * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : TBehaviorEventType extends `clipboard.*`\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : TBehaviorEventType extends `clipboard.*`\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return isArrowDown && focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return isArrowUp && focusBlockObject && !previousBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'before'})]],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'before'})]],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n _key: snapshot.context.keyGenerator(),\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n select: 'none',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","caretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","isArrowDown","originEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","isArrowUp","previousBlock","breakingBlockObject","clickingAboveLonelyBlockObject","position","isEditor","block","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}
1
+ {"version":3,"file":"behavior.core.js","sources":["../../src/internal-utils/is-hotkey.ts","../../src/behaviors/behavior.types.ts","../../src/behaviors/behavior.core.annotations.ts","../../src/behaviors/behavior.core.block-objects.ts","../../src/behaviors/behavior.core.decorators.ts","../../src/behaviors/behavior.core.insert-break.ts","../../src/behaviors/behavior.core.lists.ts","../../src/behaviors/behavior.core.ts"],"sourcesContent":["export interface KeyboardEventLike {\n key: string\n keyCode?: number\n altKey: boolean\n ctrlKey: boolean\n metaKey: boolean\n shiftKey: boolean\n}\n\ninterface HotKey {\n keyCode?: number | undefined\n key?: string | undefined\n altKey: boolean | null\n ctrlKey: boolean | null\n metaKey: boolean | null\n shiftKey: boolean | null\n}\n\nconst IS_MAC =\n typeof window !== 'undefined' &&\n /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)\n\ntype Modifier = 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n\nconst modifiers: Record<string, Modifier | undefined> = {\n alt: 'altKey',\n control: 'ctrlKey',\n meta: 'metaKey',\n shift: 'shiftKey',\n}\n\nconst aliases: Record<string, string | undefined> = {\n add: '+',\n break: 'pause',\n cmd: 'meta',\n command: 'meta',\n ctl: 'control',\n ctrl: 'control',\n del: 'delete',\n down: 'arrowdown',\n esc: 'escape',\n ins: 'insert',\n left: 'arrowleft',\n mod: IS_MAC ? 'meta' : 'control',\n opt: 'alt',\n option: 'alt',\n return: 'enter',\n right: 'arrowright',\n space: ' ',\n spacebar: ' ',\n up: 'arrowup',\n win: 'meta',\n windows: 'meta',\n}\n\nconst keyCodes: Record<string, number | undefined> = {\n 'backspace': 8,\n 'tab': 9,\n 'enter': 13,\n 'shift': 16,\n 'control': 17,\n 'alt': 18,\n 'pause': 19,\n 'capslock': 20,\n 'escape': 27,\n ' ': 32,\n 'pageup': 33,\n 'pagedown': 34,\n 'end': 35,\n 'home': 36,\n 'arrowleft': 37,\n 'arrowup': 38,\n 'arrowright': 39,\n 'arrowdown': 40,\n 'insert': 45,\n 'delete': 46,\n 'meta': 91,\n 'numlock': 144,\n 'scrolllock': 145,\n ';': 186,\n '=': 187,\n ',': 188,\n '-': 189,\n '.': 190,\n '/': 191,\n '`': 192,\n '[': 219,\n '\\\\': 220,\n ']': 221,\n \"'\": 222,\n 'f1': 112,\n 'f2': 113,\n 'f3': 114,\n 'f4': 115,\n 'f5': 116,\n 'f6': 117,\n 'f7': 118,\n 'f8': 119,\n 'f9': 120,\n 'f10': 121,\n 'f11': 122,\n 'f12': 123,\n 'f13': 124,\n 'f14': 125,\n 'f15': 126,\n 'f16': 127,\n 'f17': 128,\n 'f18': 129,\n 'f19': 130,\n 'f20': 131,\n}\n\nexport function isHotkey(hotkey: string, event: KeyboardEventLike): boolean {\n return compareHotkey(parseHotkey(hotkey), event)\n}\n\nfunction parseHotkey(hotkey: string): HotKey {\n // Ensure that all the modifiers are set to false unless the hotkey has them.\n const parsedHotkey: HotKey = {\n altKey: false,\n ctrlKey: false,\n metaKey: false,\n shiftKey: false,\n }\n\n // Special case to handle the `+` key since we use it as a separator.\n const hotkeySegments = hotkey.replace('++', '+add').split('+')\n\n for (const rawHotkeySegment of hotkeySegments) {\n const optional =\n rawHotkeySegment.endsWith('?') && rawHotkeySegment.length > 1\n const hotkeySegment = optional\n ? rawHotkeySegment.slice(0, -1)\n : rawHotkeySegment\n const keyName = toKeyName(hotkeySegment)\n const modifier = modifiers[keyName]\n const alias = aliases[hotkeySegment]\n const code = keyCodes[keyName]\n\n if (\n hotkeySegment.length > 1 &&\n modifier === undefined &&\n alias === undefined &&\n code === undefined\n ) {\n throw new TypeError(`Unknown modifier: \"${hotkeySegment}\"`)\n }\n\n if (hotkeySegments.length === 1 || modifier === undefined) {\n parsedHotkey.key = keyName\n parsedHotkey.keyCode = toKeyCode(hotkeySegment)\n }\n\n if (modifier !== undefined) {\n parsedHotkey[modifier] = optional ? null : true\n }\n }\n\n return parsedHotkey\n}\n\nfunction compareHotkey(\n parsedHotkey: HotKey,\n event: KeyboardEventLike,\n): boolean {\n const matchingModifiers =\n (parsedHotkey.altKey != null\n ? parsedHotkey.altKey === event.altKey\n : true) &&\n (parsedHotkey.ctrlKey != null\n ? parsedHotkey.ctrlKey === event.ctrlKey\n : true) &&\n (parsedHotkey.metaKey != null\n ? parsedHotkey.metaKey === event.metaKey\n : true) &&\n (parsedHotkey.shiftKey != null\n ? parsedHotkey.shiftKey === event.shiftKey\n : true)\n\n if (!matchingModifiers) {\n return false\n }\n\n if (parsedHotkey.keyCode !== undefined && event.keyCode !== undefined) {\n if (parsedHotkey.keyCode === 91 && event.keyCode === 93) {\n return true\n }\n\n return parsedHotkey.keyCode === event.keyCode\n }\n\n return (\n parsedHotkey.keyCode === event.keyCode ||\n parsedHotkey.key === event.key.toLowerCase()\n )\n}\n\nfunction toKeyCode(name: string): number {\n const keyName = toKeyName(name)\n const keyCode = keyCodes[keyName] ?? keyName.toUpperCase().charCodeAt(0)\n\n return keyCode\n}\n\nfunction toKeyName(name: string): string {\n const keyName = name.toLowerCase()\n\n return aliases[keyName] ?? keyName\n}\n","import type {\n KeyedSegment,\n PortableTextBlock,\n PortableTextTextBlock,\n} from '@sanity/types'\nimport type {TextUnit} from 'slate'\nimport type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'\nimport type {ConverterEvent} from '../converters/converter.types'\nimport type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'\nimport type {EventPosition} from '../internal-utils/event-position'\nimport type {MIMEType} from '../internal-utils/mime-type'\nimport type {OmitFromUnion, PickFromUnion} from '../type-utils'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelection, PortableTextSlateEditor} from '../types/editor'\n\n/**\n * @beta\n */\nexport type SyntheticBehaviorEvent =\n | {\n type: 'annotation.add'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'annotation.remove'\n annotation: {\n name: string\n }\n }\n | {\n type: 'annotation.toggle'\n annotation: {\n name: string\n value: {[prop: string]: unknown}\n }\n }\n | {\n type: 'block.set'\n at: [KeyedSegment]\n props: Record<string, unknown>\n }\n | {\n type: 'block.unset'\n at: [KeyedSegment]\n props: Array<string>\n }\n | {\n type: 'blur'\n }\n | {\n type: 'data transfer.set'\n data: string\n dataTransfer: DataTransfer\n mimeType: MIMEType\n }\n | {\n type: 'decorator.add'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'decorator.remove'\n decorator: string\n }\n | {\n type: 'decorator.toggle'\n decorator: string\n offsets?: {anchor: BlockOffset; focus: BlockOffset}\n }\n | {\n type: 'delete'\n selection: NonNullable<EditorSelection>\n }\n | {\n type: 'delete.backward'\n unit: TextUnit\n }\n | {\n type: 'delete.block'\n blockPath: [KeyedSegment]\n }\n | {\n type: 'delete.forward'\n unit: TextUnit\n }\n | {\n type: 'delete.text'\n anchor: BlockOffset\n focus: BlockOffset\n }\n | {\n type: 'focus'\n }\n | {\n type: 'history.redo'\n }\n | {\n type: 'history.undo'\n }\n | {\n type: 'insert.blocks'\n blocks: Array<PortableTextBlock>\n placement: InsertPlacement\n }\n | {\n type: 'insert.block object'\n placement: InsertPlacement\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: InsertPlacement\n select?: 'start' | 'end' | 'none'\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: InsertPlacement\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 select?: 'start' | 'end'\n }\n | {\n type: 'select.next block'\n select?: 'start' | 'end'\n }\n | {\n type: 'style.add'\n style: string\n }\n | {\n type: 'style.remove'\n style: string\n }\n | {\n type: 'style.toggle'\n style: string\n }\n | (PickFromUnion<\n ConverterEvent,\n 'type',\n 'deserialization.failure' | 'deserialization.success'\n > & {\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n })\n | {\n type: 'serialization.success'\n mimeType: MIMEType\n data: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n | {\n type: 'serialization.failure'\n mimeType: MIMEType\n reason: string\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type InsertPlacement = 'auto' | 'after' | 'before'\n\ntype ClipboardBehaviorEvent =\n | {\n type: 'clipboard.copy'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: 'clipboard.cut'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: 'clipboard.paste'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n\nexport function isClipboardBehaviorEvent(\n event: BehaviorEvent,\n): event is ClipboardBehaviorEvent {\n return event.type.startsWith('clipboard.')\n}\n\ntype DragBehaviorEvent =\n | {\n type: 'drag.dragstart'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: Pick<EventPosition, 'selection'>\n }\n | {\n type: 'drag.drag'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: 'drag.dragend'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n | {\n type: 'drag.dragenter'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.dragover'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.drop'\n originEvent: {\n dataTransfer: DataTransfer\n }\n position: EventPosition\n }\n | {\n type: 'drag.dragleave'\n originEvent: {\n dataTransfer: DataTransfer\n }\n }\n\nexport function isDragBehaviorEvent(\n event: BehaviorEvent,\n): event is DragBehaviorEvent {\n return event.type.startsWith('drag.')\n}\n\n/**\n * Used to represent native InputEvents that hold a DataTransfer object.\n *\n * These can either be one of:\n *\n * - insertFromPaste\n * - insertFromPasteAsQuotation\n * - insertFromDrop\n * - insertReplacementText\n * - insertFromYank\n */\nexport type InputBehaviorEvent = {\n type: 'input.*'\n originEvent: {\n dataTransfer: DataTransfer\n }\n}\n\nexport function isInputBehaviorEvent(\n event: BehaviorEvent,\n): event is InputBehaviorEvent {\n return event.type.startsWith('input.')\n}\n\nexport type KeyboardBehaviorEvent =\n | {\n type: 'keyboard.keydown'\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n | {\n type: 'keyboard.keyup'\n originEvent: Pick<\n KeyboardEvent,\n 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'\n >\n }\n\nexport function isKeyboardBehaviorEvent(\n event: BehaviorEvent,\n): event is KeyboardBehaviorEvent {\n return event.type.startsWith('keyboard.')\n}\n\nexport type DataBehaviorEvent =\n | {\n type: 'deserialize'\n originEvent:\n | PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'drag.drop' | 'clipboard.paste'\n >\n | InputBehaviorEvent\n }\n | {\n type: 'serialize'\n originEvent: PickFromUnion<\n NativeBehaviorEvent,\n 'type',\n 'clipboard.copy' | 'clipboard.cut' | 'drag.dragstart'\n >\n }\n\nexport type MouseBehaviorEvent = {\n type: 'mouse.click'\n position: EventPosition\n}\n\nexport function isMouseBehaviorEvent(\n event: BehaviorEvent,\n): event is MouseBehaviorEvent {\n return event.type.startsWith('mouse.')\n}\n\n/**\n * @beta\n */\nexport type NativeBehaviorEvent =\n | ClipboardBehaviorEvent\n | DragBehaviorEvent\n | InputBehaviorEvent\n | KeyboardBehaviorEvent\n | MouseBehaviorEvent\n\n/**\n * @beta\n */\nexport type CustomBehaviorEvent<\n TPayload extends Record<string, unknown> = Record<string, unknown>,\n TType extends string = string,\n TInternalType extends `custom.${TType}` = `custom.${TType}`,\n> = {\n type: TInternalType\n} & TPayload\n\nexport function isCustomBehaviorEvent(\n event: BehaviorEvent,\n): event is CustomBehaviorEvent {\n return event.type.startsWith('custom.')\n}\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | SyntheticBehaviorEvent\n | {\n type: 'raise'\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'noop'\n }\n | {\n type: 'effect'\n effect: () => void\n }\n\nexport type InternalBehaviorAction = OmitFromUnion<\n BehaviorAction,\n 'type',\n 'raise'\n> & {\n editor: PortableTextSlateEditor\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: DataBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport type BehaviorEvent =\n | SyntheticBehaviorEvent\n | DataBehaviorEvent\n | NativeBehaviorEvent\n | CustomBehaviorEvent\n | {type: '*'}\n | {type: 'clipboard.*'}\n | {type: 'drag.*'}\n | {type: 'input.*'}\n | {type: 'keyboard.*'}\n | {type: 'mouse.*'}\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends BehaviorEvent = TBehaviorEventType extends '*'\n ? BehaviorEvent\n : TBehaviorEventType extends 'clipboard.*'\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends 'drag.*'\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'input.*'\n ? InputBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n> = {\n /**\n * The internal editor event that triggers this behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of behavior action sets.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n */\nexport type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n}) => TGuardResponse | false\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n /**\n * @deprecated\n * Use `snapshot` instead\n */\n context: EditorContext\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, context}) => event.text === 'a',\n * actions: [({event, context}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n *\n *\n *\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : TBehaviorEventType extends `clipboard.*`\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'input.*'\n ? InputBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends\n BehaviorEvent = TBehaviorEventType extends `custom.${infer TType}`\n ? CustomBehaviorEvent<TPayload, TType>\n : TBehaviorEventType extends '*'\n ? OmitFromUnion<BehaviorEvent, 'type', '*'>\n : TBehaviorEventType extends `clipboard.*`\n ? ClipboardBehaviorEvent\n : TBehaviorEventType extends `drag.*`\n ? DragBehaviorEvent\n : TBehaviorEventType extends 'input.*'\n ? InputBehaviorEvent\n : TBehaviorEventType extends 'keyboard.*'\n ? KeyboardBehaviorEvent\n : TBehaviorEventType extends 'mouse.*'\n ? MouseBehaviorEvent\n : PickFromUnion<BehaviorEvent, 'type', TBehaviorEventType>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst addAnnotationOnCollapsedSelection = defineBehavior({\n on: 'annotation.add',\n guard: ({snapshot}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const caretWordSelection = selectors.getCaretWordSelection(snapshot)\n\n if (\n !caretWordSelection ||\n !selectors.isSelectionExpanded({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: caretWordSelection,\n },\n })\n ) {\n return false\n }\n\n return {caretWordSelection}\n },\n actions: [\n ({event}, {caretWordSelection}) => [\n raise({type: 'select', selection: caretWordSelection}),\n raise({type: 'annotation.add', annotation: event.annotation}),\n ],\n ],\n})\n\nexport const coreAnnotationBehaviors = {\n addAnnotationOnCollapsedSelection,\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst arrowDownOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowDown = isHotkey('ArrowDown', event.originEvent)\n\n if (!isArrowDown) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return focusBlockObject && !nextBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst arrowUpOnLonelyBlockObject = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isArrowUp = isHotkey('ArrowUp', event.originEvent)\n\n if (!isArrowUp) {\n return false\n }\n\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n if (!collapsedSelection) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return focusBlockObject && !previousBlock\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'before'})]],\n})\n\nconst breakingBlockObject = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const collapsedSelection = selectors.isSelectionCollapsed(snapshot)\n\n return collapsedSelection && focusBlockObject !== undefined\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst clickingAboveLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'start' &&\n focusBlockObject &&\n !previousBlock\n )\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'before'})]],\n})\n\nconst clickingBelowLonelyBlockObject = defineBehavior({\n on: 'mouse.click',\n guard: ({snapshot, event}) => {\n if (!selectors.isSelectionCollapsed(snapshot)) {\n return false\n }\n\n const focusBlockObject = selectors.getFocusBlockObject(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n return (\n event.position.isEditor &&\n event.position.block === 'end' &&\n focusBlockObject &&\n !nextBlock\n )\n },\n actions: [() => [raise({type: 'insert.text block', placement: 'after'})]],\n})\n\nconst deletingEmptyTextBlockAfterBlockObject = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const previousBlock = selectors.getPreviousBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !previousBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(previousBlock.node)\n ) {\n return {focusTextBlock, previousBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, previousBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: previousBlock.path, offset: 0},\n focus: {path: previousBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nconst deletingEmptyTextBlockBeforeBlockObject = defineBehavior({\n on: 'delete.forward',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const nextBlock = selectors.getNextBlock(snapshot)\n\n if (!focusTextBlock || !selectionCollapsed || !nextBlock) {\n return false\n }\n\n if (\n isEmptyTextBlock(focusTextBlock.node) &&\n !isPortableTextTextBlock(nextBlock.node)\n ) {\n return {focusTextBlock, nextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, nextBlock}) => [\n raise({\n type: 'delete.block',\n blockPath: focusTextBlock.path,\n }),\n raise({\n type: 'select',\n selection: {\n anchor: {path: nextBlock.path, offset: 0},\n focus: {path: nextBlock.path, offset: 0},\n },\n }),\n ],\n ],\n})\n\nexport const coreBlockObjectBehaviors = {\n arrowDownOnLonelyBlockObject,\n arrowUpOnLonelyBlockObject,\n breakingBlockObject,\n clickingAboveLonelyBlockObject,\n clickingBelowLonelyBlockObject,\n deletingEmptyTextBlockAfterBlockObject,\n deletingEmptyTextBlockBeforeBlockObject,\n}\n","import {isHotkey} from '../internal-utils/is-hotkey'\nimport {defineBehavior, raise} from './behavior.types'\n\nexport const coreDecoratorBehaviors = {\n strongShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+b', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'strong',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],\n }),\n emShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+i', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'em',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],\n }),\n underlineShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey('mod+u', event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'underline',\n ),\n actions: [\n () => [raise({type: 'decorator.toggle', decorator: 'underline'})],\n ],\n }),\n codeShortcut: defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) =>\n isHotkey(\"mod+'\", event.originEvent) &&\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === 'code',\n ),\n actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],\n }),\n}\n","import * as selectors from '../selectors'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst breakingAtTheEndOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const atTheEndOfBlock =\n selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)\n\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n if (atTheEndOfBlock) {\n return {focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n ({snapshot}, {focusListItem, focusLevel}) => [\n raise({\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n _key: snapshot.context.keyGenerator(),\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs: [],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'after',\n }),\n ],\n ],\n})\n\nconst breakingAtTheStartOfTextBlock = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {\n return false\n }\n\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n const focusDecorators = focusSpan?.node.marks?.filter(\n (mark) =>\n snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ) ?? [],\n )\n const focusAnnotations =\n focusSpan?.node.marks?.filter(\n (mark) =>\n !snapshot.context.schema.decorators.some(\n (decorator) => decorator.value === mark,\n ),\n ) ?? []\n const focusListItem = focusTextBlock.node.listItem\n const focusLevel = focusTextBlock.node.level\n\n const atTheStartOfBlock =\n selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)\n\n if (atTheStartOfBlock) {\n return {focusAnnotations, focusDecorators, focusListItem, focusLevel}\n }\n\n return false\n },\n actions: [\n (\n {snapshot},\n {focusAnnotations, focusDecorators, focusListItem, focusLevel},\n ) => [\n raise({\n type: 'insert.block',\n block: {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.block.name,\n children: [\n {\n _key: snapshot.context.keyGenerator(),\n _type: snapshot.context.schema.span.name,\n marks: focusAnnotations.length === 0 ? focusDecorators : [],\n text: '',\n },\n ],\n listItem: focusListItem,\n level: focusLevel,\n style: snapshot.context.schema.styles[0]?.value,\n },\n placement: 'before',\n select: 'none',\n }),\n ],\n ],\n})\n\nexport const coreInsertBreakBehaviors = {\n breakingAtTheEndOfTextBlock,\n breakingAtTheStartOfTextBlock,\n}\n","import {createGuards} from '../behavior-actions/behavior.guards'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {isEmptyTextBlock} from '../utils/util.is-empty-text-block'\nimport {defineBehavior, raise} from './behavior.types'\n\nconst MAX_LIST_LEVEL = 10\n\nconst clearListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {\n return {focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst unindentListOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n if (\n atTheBeginningOfBLock &&\n focusTextBlock.node.level !== undefined &&\n focusTextBlock.node.level > 1\n ) {\n return {focusTextBlock, level: focusTextBlock.node.level - 1}\n }\n\n return false\n },\n actions: [\n (_, {focusTextBlock, level}) => [\n raise({\n type: 'block.set',\n props: {level},\n at: focusTextBlock.path,\n }),\n ],\n ],\n})\n\nconst clearListOnEnter = defineBehavior({\n on: 'insert.break',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusListBlock = selectors.getFocusListBlock(snapshot)\n\n if (\n !selectionCollapsed ||\n !focusListBlock ||\n !isEmptyTextBlock(focusListBlock.node)\n ) {\n return false\n }\n\n return {focusListBlock}\n },\n actions: [\n (_, {focusListBlock}) => [\n raise({\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusListBlock.path,\n }),\n ],\n ],\n})\n\nconst indentListOnTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isTab = isHotkey('Tab', event.originEvent)\n\n if (!isTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level + 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nconst unindentListOnShiftTab = defineBehavior({\n on: 'keyboard.keydown',\n guard: ({snapshot, event}) => {\n const isShiftTab = isHotkey('Shift+Tab', event.originEvent)\n\n if (!isShiftTab) {\n return false\n }\n\n const selectedBlocks = selectors.getSelectedBlocks(snapshot)\n const guards = createGuards(snapshot.context)\n const selectedListBlocks = selectedBlocks.flatMap((block) =>\n guards.isListBlock(block.node)\n ? [\n {\n node: block.node,\n path: block.path,\n },\n ]\n : [],\n )\n\n if (selectedListBlocks.length === selectedBlocks.length) {\n return {selectedListBlocks}\n }\n\n return false\n },\n actions: [\n (_, {selectedListBlocks}) =>\n selectedListBlocks.map((selectedListBlock) =>\n raise({\n type: 'block.set',\n props: {\n level: Math.min(\n MAX_LIST_LEVEL,\n Math.max(1, selectedListBlock.node.level - 1),\n ),\n },\n at: selectedListBlock.path,\n }),\n ),\n ],\n})\n\nexport const coreListBehaviors = {\n clearListOnBackspace,\n unindentListOnBackspace,\n clearListOnEnter,\n indentListOnTab,\n unindentListOnShiftTab,\n}\n","import {coreAnnotationBehaviors} from './behavior.core.annotations'\nimport {coreBlockObjectBehaviors} from './behavior.core.block-objects'\nimport {coreDecoratorBehaviors} from './behavior.core.decorators'\nimport {coreInsertBreakBehaviors} from './behavior.core.insert-break'\nimport {coreListBehaviors} from './behavior.core.lists'\n\n/**\n * @beta\n */\nexport const coreBehaviors = [\n coreAnnotationBehaviors.addAnnotationOnCollapsedSelection,\n coreDecoratorBehaviors.strongShortcut,\n coreDecoratorBehaviors.emShortcut,\n coreDecoratorBehaviors.underlineShortcut,\n coreDecoratorBehaviors.codeShortcut,\n coreBlockObjectBehaviors.clickingAboveLonelyBlockObject,\n coreBlockObjectBehaviors.clickingBelowLonelyBlockObject,\n coreBlockObjectBehaviors.arrowDownOnLonelyBlockObject,\n coreBlockObjectBehaviors.arrowUpOnLonelyBlockObject,\n coreBlockObjectBehaviors.breakingBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockAfterBlockObject,\n coreBlockObjectBehaviors.deletingEmptyTextBlockBeforeBlockObject,\n coreListBehaviors.clearListOnBackspace,\n coreListBehaviors.unindentListOnBackspace,\n coreListBehaviors.clearListOnEnter,\n coreListBehaviors.indentListOnTab,\n coreListBehaviors.unindentListOnShiftTab,\n coreInsertBreakBehaviors.breakingAtTheEndOfTextBlock,\n coreInsertBreakBehaviors.breakingAtTheStartOfTextBlock,\n]\n"],"names":["IS_MAC","window","test","navigator","userAgent","modifiers","alt","control","meta","shift","aliases","add","break","cmd","command","ctl","ctrl","del","down","esc","ins","left","mod","opt","option","return","right","space","spacebar","up","win","windows","keyCodes","isHotkey","hotkey","event","compareHotkey","parseHotkey","parsedHotkey","altKey","ctrlKey","metaKey","shiftKey","hotkeySegments","replace","split","rawHotkeySegment","optional","endsWith","length","hotkeySegment","slice","keyName","toKeyName","modifier","alias","code","undefined","TypeError","key","keyCode","toKeyCode","toLowerCase","name","toUpperCase","charCodeAt","isClipboardBehaviorEvent","type","startsWith","isDragBehaviorEvent","isInputBehaviorEvent","isKeyboardBehaviorEvent","isMouseBehaviorEvent","isCustomBehaviorEvent","raise","defineBehavior","behavior","addAnnotationOnCollapsedSelection","on","guard","snapshot","selectors","caretWordSelection","context","selection","actions","annotation","coreAnnotationBehaviors","arrowDownOnLonelyBlockObject","originEvent","focusBlockObject","nextBlock","placement","arrowUpOnLonelyBlockObject","previousBlock","breakingBlockObject","clickingAboveLonelyBlockObject","position","isEditor","block","clickingBelowLonelyBlockObject","deletingEmptyTextBlockAfterBlockObject","focusTextBlock","selectionCollapsed","isEmptyTextBlock","node","isPortableTextTextBlock","_","blockPath","path","anchor","offset","focus","deletingEmptyTextBlockBeforeBlockObject","coreBlockObjectBehaviors","coreDecoratorBehaviors","strongShortcut","schema","decorators","some","decorator","value","emShortcut","underlineShortcut","codeShortcut","breakingAtTheEndOfTextBlock","atTheEndOfBlock","focusListItem","listItem","focusLevel","level","_type","_key","keyGenerator","children","span","text","marks","markDefs","style","styles","breakingAtTheStartOfTextBlock","focusSpan","focusDecorators","filter","mark","focusAnnotations","select","coreInsertBreakBehaviors","MAX_LIST_LEVEL","clearListOnBackspace","props","at","unindentListOnBackspace","clearListOnEnter","focusListBlock","indentListOnTab","selectedBlocks","guards","createGuards","selectedListBlocks","flatMap","isListBlock","map","selectedListBlock","Math","min","max","unindentListOnShiftTab","coreListBehaviors","coreBehaviors"],"mappings":"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"}