@portabletext/editor 1.34.1 → 1.35.1

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 (131) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +57 -118
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +27 -67
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/{plugin.event-listener.cjs → editor-provider.cjs} +101 -87
  6. package/lib/_chunks-cjs/editor-provider.cjs.map +1 -0
  7. package/lib/_chunks-cjs/selector.get-text-before.cjs +5 -7
  8. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.is-active-style.cjs +22 -36
  10. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -1
  11. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +68 -153
  12. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  13. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
  14. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  15. package/lib/_chunks-es/behavior.core.js +57 -118
  16. package/lib/_chunks-es/behavior.core.js.map +1 -1
  17. package/lib/_chunks-es/behavior.markdown.js +27 -67
  18. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  19. package/lib/_chunks-es/{plugin.event-listener.js → editor-provider.js} +102 -88
  20. package/lib/_chunks-es/editor-provider.js.map +1 -0
  21. package/lib/_chunks-es/selector.get-text-before.js +5 -7
  22. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  23. package/lib/_chunks-es/selector.is-active-style.js +22 -36
  24. package/lib/_chunks-es/selector.is-active-style.js.map +1 -1
  25. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +68 -153
  26. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  27. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
  28. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  29. package/lib/behaviors/index.cjs +18 -48
  30. package/lib/behaviors/index.cjs.map +1 -1
  31. package/lib/behaviors/index.d.cts +19392 -214
  32. package/lib/behaviors/index.d.ts +19392 -214
  33. package/lib/behaviors/index.js +18 -48
  34. package/lib/behaviors/index.js.map +1 -1
  35. package/lib/index.cjs +81 -51
  36. package/lib/index.cjs.map +1 -1
  37. package/lib/index.d.cts +334 -59
  38. package/lib/index.d.ts +334 -59
  39. package/lib/index.js +35 -4
  40. package/lib/index.js.map +1 -1
  41. package/lib/plugins/index.cjs +200 -189
  42. package/lib/plugins/index.cjs.map +1 -1
  43. package/lib/plugins/index.d.cts +344 -25
  44. package/lib/plugins/index.d.ts +344 -25
  45. package/lib/plugins/index.js +198 -187
  46. package/lib/plugins/index.js.map +1 -1
  47. package/lib/selectors/index.cjs +22 -50
  48. package/lib/selectors/index.cjs.map +1 -1
  49. package/lib/selectors/index.d.cts +19485 -174
  50. package/lib/selectors/index.d.ts +19485 -174
  51. package/lib/selectors/index.js +22 -50
  52. package/lib/selectors/index.js.map +1 -1
  53. package/lib/utils/index.cjs.map +1 -1
  54. package/lib/utils/index.d.cts +19518 -7
  55. package/lib/utils/index.d.ts +19518 -7
  56. package/lib/utils/index.js.map +1 -1
  57. package/package.json +7 -7
  58. package/src/behavior-actions/behavior.action.decorator.add.ts +1 -0
  59. package/src/behavior-actions/behavior.action.delete.text.ts +1 -0
  60. package/src/behaviors/behavior.code-editor.ts +6 -6
  61. package/src/behaviors/behavior.core.annotations.ts +5 -4
  62. package/src/behaviors/behavior.core.block-objects.ts +17 -17
  63. package/src/behaviors/behavior.core.decorators.ts +12 -8
  64. package/src/behaviors/behavior.core.insert-break.ts +27 -29
  65. package/src/behaviors/behavior.core.lists.ts +19 -19
  66. package/src/behaviors/behavior.decorator-pair.ts +201 -0
  67. package/src/behaviors/behavior.default.ts +35 -30
  68. package/src/behaviors/behavior.emoji-picker.ts +12 -12
  69. package/src/behaviors/behavior.links.ts +7 -7
  70. package/src/behaviors/behavior.markdown.ts +41 -42
  71. package/src/behaviors/behavior.types.ts +14 -17
  72. package/src/behaviors/index.ts +0 -1
  73. package/src/converters/converter.json.ts +6 -6
  74. package/src/converters/converter.portable-text.deserialize.test.ts +27 -29
  75. package/src/converters/converter.portable-text.ts +13 -7
  76. package/src/converters/converter.text-html.deserialize.test.ts +16 -18
  77. package/src/converters/converter.text-html.serialize.test.ts +56 -57
  78. package/src/converters/converter.text-html.ts +14 -10
  79. package/src/converters/converter.text-plain.test.ts +17 -17
  80. package/src/converters/converter.text-plain.ts +15 -11
  81. package/src/converters/converter.types.ts +5 -5
  82. package/src/editor/Editable.tsx +26 -0
  83. package/src/editor/editor-machine.ts +170 -142
  84. package/src/editor/editor-selector.ts +3 -0
  85. package/src/editor/editor-snapshot.ts +13 -0
  86. package/src/editor-event-listener.tsx +30 -0
  87. package/src/index.ts +3 -3
  88. package/src/internal-utils/create-test-snapshot.ts +23 -0
  89. package/src/internal-utils/get-text-to-emphasize.ts +29 -7
  90. package/src/plugins/plugin.decorator-shortcut.ts +235 -0
  91. package/src/plugins/plugin.markdown.tsx +56 -8
  92. package/src/plugins/plugin.one-line.tsx +17 -17
  93. package/src/selectors/selector.get-active-annotations.test.ts +4 -13
  94. package/src/selectors/selector.get-active-list-item.ts +4 -4
  95. package/src/selectors/selector.get-active-style.ts +6 -6
  96. package/src/selectors/selector.get-anchor-block.ts +5 -5
  97. package/src/selectors/selector.get-anchor-child.ts +5 -5
  98. package/src/selectors/selector.get-anchor-span.ts +2 -2
  99. package/src/selectors/selector.get-anchor-text-block.ts +2 -2
  100. package/src/selectors/selector.get-block-offsets.ts +8 -7
  101. package/src/selectors/selector.get-caret-word-selection.test.ts +3 -7
  102. package/src/selectors/selector.get-caret-word-selection.ts +19 -16
  103. package/src/selectors/selector.get-next-inline-object.ts +4 -4
  104. package/src/selectors/selector.get-previous-inline-object.ts +4 -4
  105. package/src/selectors/selector.get-selected-slice.ts +7 -4
  106. package/src/selectors/selector.get-selected-spans.test.ts +5 -9
  107. package/src/selectors/selector.get-selected-spans.ts +9 -9
  108. package/src/selectors/selector.get-selection-end-point.ts +5 -5
  109. package/src/selectors/selector.get-selection-start-point.ts +5 -5
  110. package/src/selectors/selector.get-selection-text.test.ts +5 -7
  111. package/src/selectors/selector.get-selection-text.ts +2 -2
  112. package/src/selectors/selector.get-selection.ts +2 -2
  113. package/src/selectors/selector.get-text-before.ts +8 -8
  114. package/src/selectors/selector.get-trimmed-selection.test.ts +3 -5
  115. package/src/selectors/selector.get-trimmed-selection.ts +15 -13
  116. package/src/selectors/selector.get-value.ts +4 -4
  117. package/src/selectors/selector.is-active-decorator.test.ts +5 -9
  118. package/src/selectors/selector.is-at-the-end-of-block.ts +6 -3
  119. package/src/selectors/selector.is-at-the-start-of-block.ts +3 -3
  120. package/src/selectors/selector.is-overlapping-selection.ts +8 -6
  121. package/src/selectors/selector.is-selection-collapsed.ts +6 -5
  122. package/src/selectors/selector.is-selection-expanded.ts +2 -2
  123. package/src/selectors/selectors.ts +59 -59
  124. package/src/types/block-offset.ts +9 -0
  125. package/src/utils/index.ts +0 -1
  126. package/src/utils/util.block-offset.ts +1 -1
  127. package/src/utils/util.block-offsets-to-selection.ts +1 -1
  128. package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
  129. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +0 -1
  130. package/lib/_chunks-es/plugin.event-listener.js.map +0 -1
  131. package/src/behaviors/behavior.markdown-emphasis.ts +0 -437
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/utils/util.child-selection-point-to-block-offset.ts","../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../behaviors/behavior.types'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function childSelectionPointToBlockOffset({\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 childKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !childKey) {\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 (child._key === childKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n if (isPortableTextSpan(child)) {\n offset += child.text.length\n }\n }\n }\n}\n","import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\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 {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\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 {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\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":["childSelectionPointToBlockOffset","value","selectionPoint","offset","blockKey","isKeyedSegment","path","_key","undefined","childKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","isTextBlock","context","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","markDefs","splitTextBlock","point","firstChild","at","lastChild","before","sliceBlocks","blocks","selection","anchor","focus","after","isSpan"],"mappings":";;;;;;AAYO,SAASA,iCAAiC;AAAA,EAC/CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,MAAIC,SAAS;AAEPC,QAAAA,WAAWC,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC,QACEC,WAAWJ,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC;AAEA,MAAA,EAAA,CAACJ,YAAY,CAACK;AAIlB,eAAWC,SAAST;AAClB,UAAIS,MAAMH,SAASH,YAIdO,wBAAwBD,KAAK;AAIvBE,mBAAAA,SAASF,MAAMG,UAAU;AAClC,cAAID,MAAML,SAASE;AACV,mBAAA;AAAA,cACLH,MAAM,CAAC;AAAA,gBAACC,MAAMG,MAAMH;AAAAA,cAAAA,CAAK;AAAA,cACzBJ,QAAQA,SAASD,eAAeC;AAAAA,YAClC;AAGEW,6BAAmBF,KAAK,MAC1BT,UAAUS,MAAMG,KAAKC;AAAAA,QAAAA;AAAAA;AAI7B;AChDgBC,SAAAA,YACdC,SACAR,OACgC;AAChC,SAAOA,MAAMS,UAAUD,QAAQE,OAAOV,MAAMW;AAC9C;ACHO,SAASC,gBAAgB;AAAA,EAC9BJ;AAAAA,EACAK;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCR;AAAAA,IACAR,OAAOc;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACR,YAAYC,SAASO,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHV,UAAU,CAAC,GAAGU,YAAYV,UAAU,GAAGY,oBAAoBZ,QAAQ;AAAA,IACnEgB,UAAU,CACR,GAAIN,YAAYM,YAAY,CAAA,GAC5B,GAAIJ,oBAAoBI,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;AC3BO,SAASC,eAAe;AAAA,EAC7BZ;AAAAA,EACAR;AAAAA,EACAqB;AAKF,GAA8E;AAC5E,QAAMC,aAAatB,MAAMG,SAASoB,GAAG,CAAC,GAChCC,YAAYxB,MAAMG,SAASoB,GAAGvB,MAAMG,SAASG,SAAS,CAAC;AAEzD,MAAA,CAACgB,cAAc,CAACE;AAClB;AAGF,QAAMC,SAASC,YAAY;AAAA,IACzBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQ;AAAA,QACNjC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAMyB,WAAWzB;AAAAA,QAAAA,CAAK;AAAA,QAC9DJ,QAAQ;AAAA,MACV;AAAA,MACAqC,OAAOT;AAAAA,IAAAA;AAAAA,EAEV,CAAA,EAAEE,GAAG,CAAC,GACDQ,QAAQL,YAAY;AAAA,IACxBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQR;AAAAA,MACRS,OAAO;AAAA,QACLlC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAM2B,UAAU3B;AAAAA,QAAAA,CAAK;AAAA,QAC7DJ,QAAQuC,OAAOxB,SAASgB,SAAS,IAAIA,UAAUnB,KAAKC,SAAS;AAAA,MAAA;AAAA,IAC/D;AAAA,EACF,CACD,EAAEiB,GAAG,CAAC;AAEP,MAAI,EAACE,CAAAA,UAAU,CAACM,UAIZ,EAACxB,CAAAA,YAAYC,SAASiB,MAAM,KAAK,CAAClB,YAAYC,SAASuB,KAAK;AAIzD,WAAA;AAAA,MAACN;AAAAA,MAAQM;AAAAA,IAAK;AACvB;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/utils/util.child-selection-point-to-block-offset.ts","../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\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 childSelectionPointToBlockOffset({\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 childKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !childKey) {\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 (child._key === childKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n if (isPortableTextSpan(child)) {\n offset += child.text.length\n }\n }\n }\n}\n","import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\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 {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\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 {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\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":["childSelectionPointToBlockOffset","value","selectionPoint","offset","blockKey","isKeyedSegment","path","_key","undefined","childKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","isTextBlock","context","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","markDefs","splitTextBlock","point","firstChild","at","lastChild","before","sliceBlocks","blocks","selection","anchor","focus","after","isSpan"],"mappings":";;;;;;AAYO,SAASA,iCAAiC;AAAA,EAC/CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,MAAIC,SAAS;AAEPC,QAAAA,WAAWC,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC,QACEC,WAAWJ,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC;AAEA,MAAA,EAAA,CAACJ,YAAY,CAACK;AAIlB,eAAWC,SAAST;AAClB,UAAIS,MAAMH,SAASH,YAIdO,wBAAwBD,KAAK;AAIvBE,mBAAAA,SAASF,MAAMG,UAAU;AAClC,cAAID,MAAML,SAASE;AACV,mBAAA;AAAA,cACLH,MAAM,CAAC;AAAA,gBAACC,MAAMG,MAAMH;AAAAA,cAAAA,CAAK;AAAA,cACzBJ,QAAQA,SAASD,eAAeC;AAAAA,YAClC;AAGEW,6BAAmBF,KAAK,MAC1BT,UAAUS,MAAMG,KAAKC;AAAAA,QAAAA;AAAAA;AAI7B;AChDgBC,SAAAA,YACdC,SACAR,OACgC;AAChC,SAAOA,MAAMS,UAAUD,QAAQE,OAAOV,MAAMW;AAC9C;ACHO,SAASC,gBAAgB;AAAA,EAC9BJ;AAAAA,EACAK;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCR;AAAAA,IACAR,OAAOc;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACR,YAAYC,SAASO,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHV,UAAU,CAAC,GAAGU,YAAYV,UAAU,GAAGY,oBAAoBZ,QAAQ;AAAA,IACnEgB,UAAU,CACR,GAAIN,YAAYM,YAAY,CAAA,GAC5B,GAAIJ,oBAAoBI,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;AC3BO,SAASC,eAAe;AAAA,EAC7BZ;AAAAA,EACAR;AAAAA,EACAqB;AAKF,GAA8E;AAC5E,QAAMC,aAAatB,MAAMG,SAASoB,GAAG,CAAC,GAChCC,YAAYxB,MAAMG,SAASoB,GAAGvB,MAAMG,SAASG,SAAS,CAAC;AAEzD,MAAA,CAACgB,cAAc,CAACE;AAClB;AAGF,QAAMC,SAASC,YAAY;AAAA,IACzBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQ;AAAA,QACNjC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAMyB,WAAWzB;AAAAA,QAAAA,CAAK;AAAA,QAC9DJ,QAAQ;AAAA,MACV;AAAA,MACAqC,OAAOT;AAAAA,IAAAA;AAAAA,EAEV,CAAA,EAAEE,GAAG,CAAC,GACDQ,QAAQL,YAAY;AAAA,IACxBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQR;AAAAA,MACRS,OAAO;AAAA,QACLlC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAM2B,UAAU3B;AAAAA,QAAAA,CAAK;AAAA,QAC7DJ,QAAQuC,OAAOxB,SAASgB,SAAS,IAAIA,UAAUnB,KAAKC,SAAS;AAAA,MAAA;AAAA,IAC/D;AAAA,EACF,CACD,EAAEiB,GAAG,CAAC;AAEP,MAAI,EAACE,CAAAA,UAAU,CAACM,UAIZ,EAACxB,CAAAA,YAAYC,SAASiB,MAAM,KAAK,CAAClB,YAAYC,SAASuB,KAAK;AAIzD,WAAA;AAAA,MAACN;AAAAA,MAAQM;AAAAA,IAAK;AACvB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "1.34.1",
3
+ "version": "1.35.1",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -79,15 +79,15 @@
79
79
  "slate-react": "0.112.1",
80
80
  "use-effect-event": "^1.0.2",
81
81
  "xstate": "^5.19.2",
82
- "@portabletext/patches": "1.1.3",
83
- "@portabletext/block-tools": "1.1.8"
82
+ "@portabletext/block-tools": "1.1.9",
83
+ "@portabletext/patches": "1.1.3"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@portabletext/toolkit": "^2.0.17",
87
87
  "@sanity/diff-match-patch": "^3.2.0",
88
88
  "@sanity/pkg-utils": "^7.0.4",
89
- "@sanity/schema": "^3.75.1",
90
- "@sanity/types": "^3.75.1",
89
+ "@sanity/schema": "^3.76.3",
90
+ "@sanity/types": "^3.76.3",
91
91
  "@testing-library/jest-dom": "^6.6.3",
92
92
  "@testing-library/react": "^16.2.0",
93
93
  "@types/debug": "^4.1.12",
@@ -115,8 +115,8 @@
115
115
  "racejar": "1.2.0"
116
116
  },
117
117
  "peerDependencies": {
118
- "@sanity/schema": "^3.75.1",
119
- "@sanity/types": "^3.75.1",
118
+ "@sanity/schema": "^3.76.3",
119
+ "@sanity/types": "^3.76.3",
120
120
  "react": "^16.9 || ^17 || ^18 || ^19",
121
121
  "rxjs": "^7.8.1"
122
122
  },
@@ -88,6 +88,7 @@ export const decoratorAddActionImplementation: BehaviorActionImplementation<
88
88
  })
89
89
 
90
90
  const trimmedSelection = selectors.getTrimmedSelection({
91
+ beta: {hasTag: () => false},
91
92
  context: {
92
93
  activeDecorators: [],
93
94
  converters: [],
@@ -28,6 +28,7 @@ export const deleteTextActionImplementation: BehaviorActionImplementation<
28
28
  }
29
29
 
30
30
  const trimmedSelection = selectors.getTrimmedSelection({
31
+ beta: {hasTag: () => false},
31
32
  context: {
32
33
  converters: [],
33
34
  schema: context.schema,
@@ -17,13 +17,13 @@ export function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {
17
17
  return [
18
18
  defineBehavior({
19
19
  on: 'key.down',
20
- guard: ({context, event}) => {
20
+ guard: ({snapshot, event}) => {
21
21
  const isMoveUpShortcut = isHotkey(
22
22
  config.moveBlockUpShortcut,
23
23
  event.keyboardEvent,
24
24
  )
25
- const firstBlock = selectors.getFirstBlock({context})
26
- const selectedBlocks = selectors.getSelectedBlocks({context})
25
+ const firstBlock = selectors.getFirstBlock(snapshot)
26
+ const selectedBlocks = selectors.getSelectedBlocks(snapshot)
27
27
  const blocksAbove =
28
28
  firstBlock?.node._key !== selectedBlocks[0]?.node._key
29
29
 
@@ -43,13 +43,13 @@ export function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {
43
43
  }),
44
44
  defineBehavior({
45
45
  on: 'key.down',
46
- guard: ({context, event}) => {
46
+ guard: ({snapshot, event}) => {
47
47
  const isMoveDownShortcut = isHotkey(
48
48
  config.moveBlockDownShortcut,
49
49
  event.keyboardEvent,
50
50
  )
51
- const lastBlock = selectors.getLastBlock({context})
52
- const selectedBlocks = selectors.getSelectedBlocks({context})
51
+ const lastBlock = selectors.getLastBlock(snapshot)
52
+ const selectedBlocks = selectors.getSelectedBlocks(snapshot)
53
53
  const blocksBelow =
54
54
  lastBlock?.node._key !==
55
55
  selectedBlocks[selectedBlocks.length - 1]?.node._key
@@ -3,18 +3,19 @@ import {defineBehavior, raise} from './behavior.types'
3
3
 
4
4
  const addAnnotationOnCollapsedSelection = defineBehavior({
5
5
  on: 'annotation.add',
6
- guard: ({context}) => {
7
- if (!selectors.isSelectionCollapsed({context})) {
6
+ guard: ({snapshot}) => {
7
+ if (!selectors.isSelectionCollapsed(snapshot)) {
8
8
  return false
9
9
  }
10
10
 
11
- const caretWordSelection = selectors.getCaretWordSelection({context})
11
+ const caretWordSelection = selectors.getCaretWordSelection(snapshot)
12
12
 
13
13
  if (
14
14
  !caretWordSelection ||
15
15
  !selectors.isSelectionExpanded({
16
+ ...snapshot,
16
17
  context: {
17
- ...context,
18
+ ...snapshot.context,
18
19
  selection: caretWordSelection,
19
20
  },
20
21
  })
@@ -6,10 +6,10 @@ import {defineBehavior, raise} from './behavior.types'
6
6
 
7
7
  const arrowDownOnLonelyBlockObject = defineBehavior({
8
8
  on: 'key.down',
9
- guard: ({context, event}) => {
9
+ guard: ({snapshot, event}) => {
10
10
  const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)
11
- const focusBlockObject = selectors.getFocusBlockObject({context})
12
- const nextBlock = selectors.getNextBlock({context})
11
+ const focusBlockObject = selectors.getFocusBlockObject(snapshot)
12
+ const nextBlock = selectors.getNextBlock(snapshot)
13
13
 
14
14
  return isArrowDown && focusBlockObject && !nextBlock
15
15
  },
@@ -18,10 +18,10 @@ const arrowDownOnLonelyBlockObject = defineBehavior({
18
18
 
19
19
  const arrowUpOnLonelyBlockObject = defineBehavior({
20
20
  on: 'key.down',
21
- guard: ({context, event}) => {
21
+ guard: ({snapshot, event}) => {
22
22
  const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)
23
- const focusBlockObject = selectors.getFocusBlockObject({context})
24
- const previousBlock = selectors.getPreviousBlock({context})
23
+ const focusBlockObject = selectors.getFocusBlockObject(snapshot)
24
+ const previousBlock = selectors.getPreviousBlock(snapshot)
25
25
 
26
26
  return isArrowUp && focusBlockObject && !previousBlock
27
27
  },
@@ -35,9 +35,9 @@ const arrowUpOnLonelyBlockObject = defineBehavior({
35
35
 
36
36
  const breakingBlockObject = defineBehavior({
37
37
  on: 'insert.break',
38
- guard: ({context}) => {
39
- const focusBlockObject = selectors.getFocusBlockObject({context})
40
- const collapsedSelection = selectors.isSelectionCollapsed({context})
38
+ guard: ({snapshot}) => {
39
+ const focusBlockObject = selectors.getFocusBlockObject(snapshot)
40
+ const collapsedSelection = selectors.isSelectionCollapsed(snapshot)
41
41
 
42
42
  return collapsedSelection && focusBlockObject !== undefined
43
43
  },
@@ -46,10 +46,10 @@ const breakingBlockObject = defineBehavior({
46
46
 
47
47
  const deletingEmptyTextBlockAfterBlockObject = defineBehavior({
48
48
  on: 'delete.backward',
49
- guard: ({context}) => {
50
- const focusTextBlock = selectors.getFocusTextBlock({context})
51
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
52
- const previousBlock = selectors.getPreviousBlock({context})
49
+ guard: ({snapshot}) => {
50
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
51
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
52
+ const previousBlock = selectors.getPreviousBlock(snapshot)
53
53
 
54
54
  if (!focusTextBlock || !selectionCollapsed || !previousBlock) {
55
55
  return false
@@ -83,10 +83,10 @@ const deletingEmptyTextBlockAfterBlockObject = defineBehavior({
83
83
 
84
84
  const deletingEmptyTextBlockBeforeBlockObject = defineBehavior({
85
85
  on: 'delete.forward',
86
- guard: ({context}) => {
87
- const focusTextBlock = selectors.getFocusTextBlock({context})
88
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
89
- const nextBlock = selectors.getNextBlock({context})
86
+ guard: ({snapshot}) => {
87
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
88
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
89
+ const nextBlock = selectors.getNextBlock(snapshot)
90
90
 
91
91
  if (!focusTextBlock || !selectionCollapsed || !nextBlock) {
92
92
  return false
@@ -4,25 +4,27 @@ import {defineBehavior, raise} from './behavior.types'
4
4
  export const coreDecoratorBehaviors = {
5
5
  strongShortcut: defineBehavior({
6
6
  on: 'key.down',
7
- guard: ({context, event}) =>
7
+ guard: ({snapshot, event}) =>
8
8
  isHotkey('mod+b', event.keyboardEvent) &&
9
- context.schema.decorators.some(
9
+ snapshot.context.schema.decorators.some(
10
10
  (decorator) => decorator.value === 'strong',
11
11
  ),
12
12
  actions: [() => [raise({type: 'decorator.toggle', decorator: 'strong'})]],
13
13
  }),
14
14
  emShortcut: defineBehavior({
15
15
  on: 'key.down',
16
- guard: ({context, event}) =>
16
+ guard: ({snapshot, event}) =>
17
17
  isHotkey('mod+i', event.keyboardEvent) &&
18
- context.schema.decorators.some((decorator) => decorator.value === 'em'),
18
+ snapshot.context.schema.decorators.some(
19
+ (decorator) => decorator.value === 'em',
20
+ ),
19
21
  actions: [() => [raise({type: 'decorator.toggle', decorator: 'em'})]],
20
22
  }),
21
23
  underlineShortcut: defineBehavior({
22
24
  on: 'key.down',
23
- guard: ({context, event}) =>
25
+ guard: ({snapshot, event}) =>
24
26
  isHotkey('mod+u', event.keyboardEvent) &&
25
- context.schema.decorators.some(
27
+ snapshot.context.schema.decorators.some(
26
28
  (decorator) => decorator.value === 'underline',
27
29
  ),
28
30
  actions: [
@@ -31,9 +33,11 @@ export const coreDecoratorBehaviors = {
31
33
  }),
32
34
  codeShortcut: defineBehavior({
33
35
  on: 'key.down',
34
- guard: ({context, event}) =>
36
+ guard: ({snapshot, event}) =>
35
37
  isHotkey("mod+'", event.keyboardEvent) &&
36
- context.schema.decorators.some((decorator) => decorator.value === 'code'),
38
+ snapshot.context.schema.decorators.some(
39
+ (decorator) => decorator.value === 'code',
40
+ ),
37
41
  actions: [() => [raise({type: 'decorator.toggle', decorator: 'code'})]],
38
42
  }),
39
43
  }
@@ -3,17 +3,16 @@ import {defineBehavior, raise} from './behavior.types'
3
3
 
4
4
  const breakingAtTheEndOfTextBlock = defineBehavior({
5
5
  on: 'insert.break',
6
- guard: ({context}) => {
7
- const focusTextBlock = selectors.getFocusTextBlock({context})
8
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
6
+ guard: ({snapshot}) => {
7
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
8
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
9
9
 
10
- if (!context.selection || !focusTextBlock || !selectionCollapsed) {
10
+ if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {
11
11
  return false
12
12
  }
13
13
 
14
- const atTheEndOfBlock = selectors.isAtTheEndOfBlock(focusTextBlock)({
15
- context,
16
- })
14
+ const atTheEndOfBlock =
15
+ selectors.isAtTheEndOfBlock(focusTextBlock)(snapshot)
17
16
 
18
17
  const focusListItem = focusTextBlock.node.listItem
19
18
  const focusLevel = focusTextBlock.node.level
@@ -25,16 +24,16 @@ const breakingAtTheEndOfTextBlock = defineBehavior({
25
24
  return false
26
25
  },
27
26
  actions: [
28
- ({context}, {focusListItem, focusLevel}) => [
27
+ ({snapshot}, {focusListItem, focusLevel}) => [
29
28
  raise({
30
29
  type: 'insert.block',
31
30
  block: {
32
- _type: context.schema.block.name,
33
- _key: context.keyGenerator(),
31
+ _type: snapshot.context.schema.block.name,
32
+ _key: snapshot.context.keyGenerator(),
34
33
  children: [
35
34
  {
36
- _key: context.keyGenerator(),
37
- _type: context.schema.span.name,
35
+ _key: snapshot.context.keyGenerator(),
36
+ _type: snapshot.context.schema.span.name,
38
37
  text: '',
39
38
  marks: [],
40
39
  },
@@ -42,7 +41,7 @@ const breakingAtTheEndOfTextBlock = defineBehavior({
42
41
  markDefs: [],
43
42
  listItem: focusListItem,
44
43
  level: focusLevel,
45
- style: context.schema.styles[0]?.value,
44
+ style: snapshot.context.schema.styles[0]?.value,
46
45
  },
47
46
  placement: 'after',
48
47
  }),
@@ -52,35 +51,34 @@ const breakingAtTheEndOfTextBlock = defineBehavior({
52
51
 
53
52
  const breakingAtTheStartOfTextBlock = defineBehavior({
54
53
  on: 'insert.break',
55
- guard: ({context}) => {
56
- const focusTextBlock = selectors.getFocusTextBlock({context})
57
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
54
+ guard: ({snapshot}) => {
55
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
56
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
58
57
 
59
- if (!context.selection || !focusTextBlock || !selectionCollapsed) {
58
+ if (!snapshot.context.selection || !focusTextBlock || !selectionCollapsed) {
60
59
  return false
61
60
  }
62
61
 
63
- const focusSpan = selectors.getFocusSpan({context})
62
+ const focusSpan = selectors.getFocusSpan(snapshot)
64
63
 
65
64
  const focusDecorators = focusSpan?.node.marks?.filter(
66
65
  (mark) =>
67
- context.schema.decorators.some(
66
+ snapshot.context.schema.decorators.some(
68
67
  (decorator) => decorator.value === mark,
69
68
  ) ?? [],
70
69
  )
71
70
  const focusAnnotations =
72
71
  focusSpan?.node.marks?.filter(
73
72
  (mark) =>
74
- !context.schema.decorators.some(
73
+ !snapshot.context.schema.decorators.some(
75
74
  (decorator) => decorator.value === mark,
76
75
  ),
77
76
  ) ?? []
78
77
  const focusListItem = focusTextBlock.node.listItem
79
78
  const focusLevel = focusTextBlock.node.level
80
79
 
81
- const atTheStartOfBlock = selectors.isAtTheStartOfBlock(focusTextBlock)({
82
- context,
83
- })
80
+ const atTheStartOfBlock =
81
+ selectors.isAtTheStartOfBlock(focusTextBlock)(snapshot)
84
82
 
85
83
  if (atTheStartOfBlock) {
86
84
  return {focusAnnotations, focusDecorators, focusListItem, focusLevel}
@@ -90,25 +88,25 @@ const breakingAtTheStartOfTextBlock = defineBehavior({
90
88
  },
91
89
  actions: [
92
90
  (
93
- {context},
91
+ {snapshot},
94
92
  {focusAnnotations, focusDecorators, focusListItem, focusLevel},
95
93
  ) => [
96
94
  raise({
97
95
  type: 'insert.block',
98
96
  block: {
99
- _key: context.keyGenerator(),
100
- _type: context.schema.block.name,
97
+ _key: snapshot.context.keyGenerator(),
98
+ _type: snapshot.context.schema.block.name,
101
99
  children: [
102
100
  {
103
- _key: context.keyGenerator(),
104
- _type: context.schema.span.name,
101
+ _key: snapshot.context.keyGenerator(),
102
+ _type: snapshot.context.schema.span.name,
105
103
  marks: focusAnnotations.length === 0 ? focusDecorators : [],
106
104
  text: '',
107
105
  },
108
106
  ],
109
107
  listItem: focusListItem,
110
108
  level: focusLevel,
111
- style: context.schema.styles[0]?.value,
109
+ style: snapshot.context.schema.styles[0]?.value,
112
110
  },
113
111
  placement: 'before',
114
112
  }),
@@ -8,10 +8,10 @@ const MAX_LIST_LEVEL = 10
8
8
 
9
9
  const clearListOnBackspace = defineBehavior({
10
10
  on: 'delete.backward',
11
- guard: ({context}) => {
12
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
13
- const focusTextBlock = selectors.getFocusTextBlock({context})
14
- const focusSpan = selectors.getFocusSpan({context})
11
+ guard: ({snapshot}) => {
12
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
13
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
14
+ const focusSpan = selectors.getFocusSpan(snapshot)
15
15
 
16
16
  if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
17
17
  return false
@@ -19,7 +19,7 @@ const clearListOnBackspace = defineBehavior({
19
19
 
20
20
  const atTheBeginningOfBLock =
21
21
  focusTextBlock.node.children[0]._key === focusSpan.node._key &&
22
- context.selection?.focus.offset === 0
22
+ snapshot.context.selection?.focus.offset === 0
23
23
 
24
24
  if (atTheBeginningOfBLock && focusTextBlock.node.level === 1) {
25
25
  return {focusTextBlock}
@@ -40,10 +40,10 @@ const clearListOnBackspace = defineBehavior({
40
40
 
41
41
  const unindentListOnBackspace = defineBehavior({
42
42
  on: 'delete.backward',
43
- guard: ({context}) => {
44
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
45
- const focusTextBlock = selectors.getFocusTextBlock({context})
46
- const focusSpan = selectors.getFocusSpan({context})
43
+ guard: ({snapshot}) => {
44
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
45
+ const focusTextBlock = selectors.getFocusTextBlock(snapshot)
46
+ const focusSpan = selectors.getFocusSpan(snapshot)
47
47
 
48
48
  if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
49
49
  return false
@@ -51,7 +51,7 @@ const unindentListOnBackspace = defineBehavior({
51
51
 
52
52
  const atTheBeginningOfBLock =
53
53
  focusTextBlock.node.children[0]._key === focusSpan.node._key &&
54
- context.selection?.focus.offset === 0
54
+ snapshot.context.selection?.focus.offset === 0
55
55
 
56
56
  if (
57
57
  atTheBeginningOfBLock &&
@@ -76,9 +76,9 @@ const unindentListOnBackspace = defineBehavior({
76
76
 
77
77
  const clearListOnEnter = defineBehavior({
78
78
  on: 'insert.break',
79
- guard: ({context}) => {
80
- const selectionCollapsed = selectors.isSelectionCollapsed({context})
81
- const focusListBlock = selectors.getFocusListBlock({context})
79
+ guard: ({snapshot}) => {
80
+ const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
81
+ const focusListBlock = selectors.getFocusListBlock(snapshot)
82
82
 
83
83
  if (
84
84
  !selectionCollapsed ||
@@ -103,15 +103,15 @@ const clearListOnEnter = defineBehavior({
103
103
 
104
104
  const indentListOnTab = defineBehavior({
105
105
  on: 'key.down',
106
- guard: ({context, event}) => {
106
+ guard: ({snapshot, event}) => {
107
107
  const isTab = isHotkey('Tab', event.keyboardEvent)
108
108
 
109
109
  if (!isTab) {
110
110
  return false
111
111
  }
112
112
 
113
- const selectedBlocks = selectors.getSelectedBlocks({context})
114
- const guards = createGuards(context)
113
+ const selectedBlocks = selectors.getSelectedBlocks(snapshot)
114
+ const guards = createGuards(snapshot.context)
115
115
  const selectedListBlocks = selectedBlocks.flatMap((block) =>
116
116
  guards.isListBlock(block.node)
117
117
  ? [
@@ -148,15 +148,15 @@ const indentListOnTab = defineBehavior({
148
148
 
149
149
  const unindentListOnShiftTab = defineBehavior({
150
150
  on: 'key.down',
151
- guard: ({context, event}) => {
151
+ guard: ({snapshot, event}) => {
152
152
  const isShiftTab = isHotkey('Shift+Tab', event.keyboardEvent)
153
153
 
154
154
  if (!isShiftTab) {
155
155
  return false
156
156
  }
157
157
 
158
- const selectedBlocks = selectors.getSelectedBlocks({context})
159
- const guards = createGuards(context)
158
+ const selectedBlocks = selectors.getSelectedBlocks(snapshot)
159
+ const guards = createGuards(snapshot.context)
160
160
  const selectedListBlocks = selectedBlocks.flatMap((block) =>
161
161
  guards.isListBlock(block.node)
162
162
  ? [