@portabletext/editor 3.3.3 → 3.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. package/package.json +11 -12
  2. package/src/behaviors/_exports/index.ts +0 -1
  3. package/src/behaviors/behavior.abstract.annotation.ts +0 -77
  4. package/src/behaviors/behavior.abstract.decorator.ts +0 -39
  5. package/src/behaviors/behavior.abstract.delete.ts +0 -273
  6. package/src/behaviors/behavior.abstract.deserialize.ts +0 -232
  7. package/src/behaviors/behavior.abstract.insert.ts +0 -525
  8. package/src/behaviors/behavior.abstract.keyboard.ts +0 -189
  9. package/src/behaviors/behavior.abstract.list-item.ts +0 -70
  10. package/src/behaviors/behavior.abstract.move.ts +0 -79
  11. package/src/behaviors/behavior.abstract.select.ts +0 -118
  12. package/src/behaviors/behavior.abstract.serialize.ts +0 -96
  13. package/src/behaviors/behavior.abstract.split.ts +0 -170
  14. package/src/behaviors/behavior.abstract.style.ts +0 -55
  15. package/src/behaviors/behavior.abstract.ts +0 -139
  16. package/src/behaviors/behavior.config.ts +0 -7
  17. package/src/behaviors/behavior.core.annotations.ts +0 -62
  18. package/src/behaviors/behavior.core.block-element.ts +0 -116
  19. package/src/behaviors/behavior.core.block-objects.ts +0 -285
  20. package/src/behaviors/behavior.core.decorators.ts +0 -44
  21. package/src/behaviors/behavior.core.dnd.ts +0 -356
  22. package/src/behaviors/behavior.core.insert-break.ts +0 -266
  23. package/src/behaviors/behavior.core.insert.ts +0 -52
  24. package/src/behaviors/behavior.core.lists.ts +0 -691
  25. package/src/behaviors/behavior.core.ts +0 -44
  26. package/src/behaviors/behavior.perform-event.ts +0 -354
  27. package/src/behaviors/behavior.types.action.ts +0 -102
  28. package/src/behaviors/behavior.types.behavior.ts +0 -83
  29. package/src/behaviors/behavior.types.event.ts +0 -667
  30. package/src/behaviors/behavior.types.guard.ts +0 -11
  31. package/src/behaviors/index.ts +0 -17
  32. package/src/converters/converter.json.ts +0 -53
  33. package/src/converters/converter.portable-text.deserialize.test.ts +0 -680
  34. package/src/converters/converter.portable-text.ts +0 -75
  35. package/src/converters/converter.text-html.deserialize.test.ts +0 -406
  36. package/src/converters/converter.text-html.serialize.test.ts +0 -246
  37. package/src/converters/converter.text-html.ts +0 -87
  38. package/src/converters/converter.text-markdown.ts +0 -67
  39. package/src/converters/converter.text-plain.test.ts +0 -245
  40. package/src/converters/converter.text-plain.ts +0 -126
  41. package/src/converters/converter.types.ts +0 -72
  42. package/src/converters/converters.core.ts +0 -18
  43. package/src/editor/Editable.tsx +0 -1012
  44. package/src/editor/PortableTextEditor.tsx +0 -791
  45. package/src/editor/components/drop-indicator.tsx +0 -17
  46. package/src/editor/components/render-block-object.tsx +0 -121
  47. package/src/editor/components/render-default-object.tsx +0 -21
  48. package/src/editor/components/render-element.tsx +0 -88
  49. package/src/editor/components/render-inline-object.tsx +0 -129
  50. package/src/editor/components/render-leaf.tsx +0 -64
  51. package/src/editor/components/render-span.tsx +0 -303
  52. package/src/editor/components/render-text-block.tsx +0 -265
  53. package/src/editor/components/render-text.tsx +0 -18
  54. package/src/editor/components/use-core-block-element-behaviors.ts +0 -39
  55. package/src/editor/create-editor.ts +0 -323
  56. package/src/editor/create-slate-editor.tsx +0 -64
  57. package/src/editor/editor-actor-context.ts +0 -4
  58. package/src/editor/editor-context.tsx +0 -7
  59. package/src/editor/editor-dom.ts +0 -220
  60. package/src/editor/editor-machine.ts +0 -751
  61. package/src/editor/editor-provider.tsx +0 -111
  62. package/src/editor/editor-schema.ts +0 -6
  63. package/src/editor/editor-selector.ts +0 -89
  64. package/src/editor/editor-snapshot.ts +0 -68
  65. package/src/editor/event-to-change.tsx +0 -49
  66. package/src/editor/hooks/usePortableTextEditor.ts +0 -25
  67. package/src/editor/hooks/usePortableTextEditorSelection.tsx +0 -28
  68. package/src/editor/mutation-machine.ts +0 -322
  69. package/src/editor/plugins/create-with-event-listeners.ts +0 -271
  70. package/src/editor/plugins/createWithEditableAPI.ts +0 -529
  71. package/src/editor/plugins/createWithHotKeys.ts +0 -68
  72. package/src/editor/plugins/createWithObjectKeys.ts +0 -289
  73. package/src/editor/plugins/createWithPatches.ts +0 -272
  74. package/src/editor/plugins/createWithPortableTextMarkModel.ts +0 -559
  75. package/src/editor/plugins/createWithSchemaTypes.ts +0 -121
  76. package/src/editor/plugins/slate-plugin.update-selection.ts +0 -51
  77. package/src/editor/plugins/slate-plugin.update-value.ts +0 -46
  78. package/src/editor/plugins/with-plugins.ts +0 -69
  79. package/src/editor/range-decorations-machine.ts +0 -421
  80. package/src/editor/relay-actor-context.ts +0 -4
  81. package/src/editor/relay-machine.ts +0 -152
  82. package/src/editor/sync-machine.ts +0 -961
  83. package/src/editor/use-editor.ts +0 -27
  84. package/src/editor/validate-selection-machine.test.ts +0 -47
  85. package/src/editor/validate-selection-machine.ts +0 -149
  86. package/src/editor/weakMaps.ts +0 -15
  87. package/src/editor/with-normalizing-node.ts +0 -14
  88. package/src/editor/with-performing-behavior-operation.ts +0 -21
  89. package/src/editor/withChanges.ts +0 -13
  90. package/src/editor/without-normalizing-conditional.ts +0 -13
  91. package/src/editor/withoutPatching.ts +0 -14
  92. package/src/editor.ts +0 -59
  93. package/src/history/behavior.operation.history.redo.ts +0 -67
  94. package/src/history/behavior.operation.history.undo.ts +0 -71
  95. package/src/history/event.history.undo.test.tsx +0 -672
  96. package/src/history/history.preserving-keys.test.tsx +0 -112
  97. package/src/history/remote-patches.ts +0 -20
  98. package/src/history/slate-plugin.history.ts +0 -142
  99. package/src/history/slate-plugin.redoing.ts +0 -21
  100. package/src/history/slate-plugin.undoing.ts +0 -21
  101. package/src/history/slate-plugin.without-history.ts +0 -23
  102. package/src/history/transform-operation.ts +0 -245
  103. package/src/history/undo-redo-collaboration.test.tsx +0 -541
  104. package/src/history/undo-redo.feature +0 -125
  105. package/src/history/undo-redo.test.tsx +0 -195
  106. package/src/history/undo-step.ts +0 -148
  107. package/src/index.ts +0 -107
  108. package/src/internal-utils/__tests__/ranges.test.ts +0 -23
  109. package/src/internal-utils/__tests__/values.test.ts +0 -110
  110. package/src/internal-utils/apply-operation-to-portable-text.test.ts +0 -1861
  111. package/src/internal-utils/apply-operation-to-portable-text.ts +0 -615
  112. package/src/internal-utils/applyPatch.ts +0 -644
  113. package/src/internal-utils/block-keys.ts +0 -9
  114. package/src/internal-utils/build-index-maps.test.ts +0 -464
  115. package/src/internal-utils/build-index-maps.ts +0 -131
  116. package/src/internal-utils/collapse-selection.ts +0 -36
  117. package/src/internal-utils/compound-client-rect.ts +0 -28
  118. package/src/internal-utils/create-placeholder-block.ts +0 -21
  119. package/src/internal-utils/create-test-snapshot.ts +0 -28
  120. package/src/internal-utils/debug.ts +0 -12
  121. package/src/internal-utils/editor-selection.test.ts +0 -44
  122. package/src/internal-utils/editor-selection.ts +0 -56
  123. package/src/internal-utils/event-position.ts +0 -318
  124. package/src/internal-utils/global-scope.ts +0 -27
  125. package/src/internal-utils/globally-scoped-context.ts +0 -39
  126. package/src/internal-utils/is-hotkey.test.ts +0 -114
  127. package/src/internal-utils/is-hotkey.ts +0 -209
  128. package/src/internal-utils/mime-type.ts +0 -1
  129. package/src/internal-utils/move-range-by-operation.ts +0 -19
  130. package/src/internal-utils/operation-to-patches.test.ts +0 -522
  131. package/src/internal-utils/operation-to-patches.ts +0 -571
  132. package/src/internal-utils/portable-text-node.ts +0 -209
  133. package/src/internal-utils/schema.ts +0 -8
  134. package/src/internal-utils/selection-block-keys.ts +0 -20
  135. package/src/internal-utils/selection-focus-text.ts +0 -40
  136. package/src/internal-utils/selection-text.test.ts +0 -32
  137. package/src/internal-utils/selection-text.ts +0 -21
  138. package/src/internal-utils/selection.ts +0 -77
  139. package/src/internal-utils/sibling-utils.ts +0 -55
  140. package/src/internal-utils/slate-utils.test.tsx +0 -121
  141. package/src/internal-utils/slate-utils.ts +0 -417
  142. package/src/internal-utils/split-string.ts +0 -12
  143. package/src/internal-utils/stop-actor.ts +0 -43
  144. package/src/internal-utils/string-overlap.test.ts +0 -14
  145. package/src/internal-utils/string-overlap.ts +0 -28
  146. package/src/internal-utils/string-utils.ts +0 -7
  147. package/src/internal-utils/text-block-key.test.ts +0 -41
  148. package/src/internal-utils/text-block-key.ts +0 -26
  149. package/src/internal-utils/text-marks.test.ts +0 -41
  150. package/src/internal-utils/text-marks.ts +0 -22
  151. package/src/internal-utils/text-selection.test.ts +0 -211
  152. package/src/internal-utils/text-selection.ts +0 -121
  153. package/src/internal-utils/to-slate-range.test.ts +0 -278
  154. package/src/internal-utils/to-slate-range.ts +0 -171
  155. package/src/internal-utils/validateValue.ts +0 -443
  156. package/src/internal-utils/value-annotations.ts +0 -33
  157. package/src/internal-utils/values.test.ts +0 -282
  158. package/src/internal-utils/values.ts +0 -266
  159. package/src/keyboard-shortcuts/default-keyboard-shortcuts.ts +0 -146
  160. package/src/operations/behavior.operation.annotation.add.ts +0 -99
  161. package/src/operations/behavior.operation.annotation.remove.ts +0 -150
  162. package/src/operations/behavior.operation.block.set.ts +0 -104
  163. package/src/operations/behavior.operation.block.unset.ts +0 -54
  164. package/src/operations/behavior.operation.child.set.ts +0 -107
  165. package/src/operations/behavior.operation.child.unset.ts +0 -116
  166. package/src/operations/behavior.operation.decorator.add.ts +0 -131
  167. package/src/operations/behavior.operation.delete.ts +0 -294
  168. package/src/operations/behavior.operation.insert.block.ts +0 -495
  169. package/src/operations/behavior.operation.insert.child.ts +0 -129
  170. package/src/operations/behavior.operation.insert.text.ts +0 -8
  171. package/src/operations/behavior.operation.move.backward.ts +0 -12
  172. package/src/operations/behavior.operation.move.block.ts +0 -44
  173. package/src/operations/behavior.operation.move.forward.ts +0 -11
  174. package/src/operations/behavior.operation.select.ts +0 -27
  175. package/src/operations/behavior.operations.ts +0 -221
  176. package/src/plugins/_exports/index.ts +0 -1
  177. package/src/plugins/index.ts +0 -3
  178. package/src/plugins/plugin.behavior.tsx +0 -24
  179. package/src/plugins/plugin.editor-ref.tsx +0 -17
  180. package/src/plugins/plugin.event-listener.tsx +0 -68
  181. package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +0 -71
  182. package/src/plugins/plugin.internal.auto-close-brackets.ts +0 -62
  183. package/src/plugins/plugin.internal.change-ref.tsx +0 -19
  184. package/src/plugins/plugin.internal.portable-text-editor-ref.tsx +0 -16
  185. package/src/plugins/plugin.internal.slate-editor-ref.tsx +0 -15
  186. package/src/priority/priority.core.ts +0 -3
  187. package/src/priority/priority.sort.test.ts +0 -319
  188. package/src/priority/priority.sort.ts +0 -123
  189. package/src/priority/priority.types.ts +0 -24
  190. package/src/selectors/_exports/index.ts +0 -1
  191. package/src/selectors/drag-selection.test.ts +0 -578
  192. package/src/selectors/drag-selection.ts +0 -118
  193. package/src/selectors/index.ts +0 -54
  194. package/src/selectors/selector.get-active-annotation-marks.ts +0 -12
  195. package/src/selectors/selector.get-active-annotations.ts +0 -36
  196. package/src/selectors/selector.get-active-decorators.ts +0 -29
  197. package/src/selectors/selector.get-active-list-item.ts +0 -38
  198. package/src/selectors/selector.get-active-style.ts +0 -38
  199. package/src/selectors/selector.get-anchor-block.ts +0 -22
  200. package/src/selectors/selector.get-anchor-child.ts +0 -36
  201. package/src/selectors/selector.get-anchor-span.ts +0 -17
  202. package/src/selectors/selector.get-anchor-text-block.ts +0 -18
  203. package/src/selectors/selector.get-block-offsets.ts +0 -34
  204. package/src/selectors/selector.get-caret-word-selection.test.ts +0 -284
  205. package/src/selectors/selector.get-caret-word-selection.ts +0 -134
  206. package/src/selectors/selector.get-first-block.ts +0 -14
  207. package/src/selectors/selector.get-focus-block-object.ts +0 -18
  208. package/src/selectors/selector.get-focus-block.ts +0 -23
  209. package/src/selectors/selector.get-focus-child.ts +0 -36
  210. package/src/selectors/selector.get-focus-inline-object.ts +0 -17
  211. package/src/selectors/selector.get-focus-list-block.ts +0 -18
  212. package/src/selectors/selector.get-focus-span.ts +0 -18
  213. package/src/selectors/selector.get-focus-text-block.ts +0 -18
  214. package/src/selectors/selector.get-last-block.ts +0 -16
  215. package/src/selectors/selector.get-mark-state.test.ts +0 -325
  216. package/src/selectors/selector.get-mark-state.ts +0 -263
  217. package/src/selectors/selector.get-next-block.ts +0 -29
  218. package/src/selectors/selector.get-next-inline-object.ts +0 -53
  219. package/src/selectors/selector.get-next-inline-objects.ts +0 -50
  220. package/src/selectors/selector.get-next-span.ts +0 -56
  221. package/src/selectors/selector.get-previous-block.ts +0 -29
  222. package/src/selectors/selector.get-previous-inline-object.ts +0 -50
  223. package/src/selectors/selector.get-previous-inline-objects.ts +0 -47
  224. package/src/selectors/selector.get-previous-span.ts +0 -53
  225. package/src/selectors/selector.get-selected-blocks.ts +0 -61
  226. package/src/selectors/selector.get-selected-spans.test.ts +0 -347
  227. package/src/selectors/selector.get-selected-spans.ts +0 -155
  228. package/src/selectors/selector.get-selected-text-blocks.ts +0 -73
  229. package/src/selectors/selector.get-selected-value.test.ts +0 -834
  230. package/src/selectors/selector.get-selected-value.ts +0 -66
  231. package/src/selectors/selector.get-selection-end-block.ts +0 -33
  232. package/src/selectors/selector.get-selection-end-child.ts +0 -33
  233. package/src/selectors/selector.get-selection-end-point.ts +0 -17
  234. package/src/selectors/selector.get-selection-start-block.ts +0 -33
  235. package/src/selectors/selector.get-selection-start-child.ts +0 -33
  236. package/src/selectors/selector.get-selection-start-point.ts +0 -17
  237. package/src/selectors/selector.get-selection-text.test.ts +0 -421
  238. package/src/selectors/selector.get-selection-text.ts +0 -27
  239. package/src/selectors/selector.get-selection.ts +0 -9
  240. package/src/selectors/selector.get-text-after.ts +0 -46
  241. package/src/selectors/selector.get-text-before.ts +0 -46
  242. package/src/selectors/selector.get-value.ts +0 -11
  243. package/src/selectors/selector.is-active-annotation.test.ts +0 -320
  244. package/src/selectors/selector.is-active-annotation.ts +0 -52
  245. package/src/selectors/selector.is-active-decorator.test.ts +0 -136
  246. package/src/selectors/selector.is-active-decorator.ts +0 -24
  247. package/src/selectors/selector.is-active-list-item.ts +0 -13
  248. package/src/selectors/selector.is-active-style.ts +0 -13
  249. package/src/selectors/selector.is-at-the-end-of-block.ts +0 -30
  250. package/src/selectors/selector.is-at-the-start-of-block.ts +0 -30
  251. package/src/selectors/selector.is-overlapping-selection.test.ts +0 -304
  252. package/src/selectors/selector.is-overlapping-selection.ts +0 -181
  253. package/src/selectors/selector.is-point-after-selection.ts +0 -97
  254. package/src/selectors/selector.is-point-before-selection.ts +0 -97
  255. package/src/selectors/selector.is-selecting-entire-blocks.ts +0 -43
  256. package/src/selectors/selector.is-selection-collapsed.ts +0 -17
  257. package/src/selectors/selector.is-selection-expanded.test.ts +0 -63
  258. package/src/selectors/selector.is-selection-expanded.ts +0 -9
  259. package/src/test/_exports/index.ts +0 -1
  260. package/src/test/gherkin-parameter-types.ts +0 -112
  261. package/src/test/index.ts +0 -1
  262. package/src/test/vitest/_exports/index.ts +0 -1
  263. package/src/test/vitest/index.ts +0 -3
  264. package/src/test/vitest/step-context.ts +0 -13
  265. package/src/test/vitest/step-definitions.tsx +0 -960
  266. package/src/test/vitest/test-editor.tsx +0 -198
  267. package/src/type-utils.ts +0 -29
  268. package/src/types/block-offset.ts +0 -9
  269. package/src/types/block-with-optional-key.ts +0 -25
  270. package/src/types/editor.ts +0 -509
  271. package/src/types/options.ts +0 -13
  272. package/src/types/paths.ts +0 -35
  273. package/src/types/slate-editor.ts +0 -50
  274. package/src/types/slate.ts +0 -27
  275. package/src/utils/_exports/index.ts +0 -1
  276. package/src/utils/asserters.ts +0 -9
  277. package/src/utils/index.ts +0 -24
  278. package/src/utils/key-generator.ts +0 -33
  279. package/src/utils/parse-blocks.test.ts +0 -836
  280. package/src/utils/parse-blocks.ts +0 -504
  281. package/src/utils/util.at-the-beginning-of-block.ts +0 -32
  282. package/src/utils/util.block-offset-to-block-selection-point.ts +0 -28
  283. package/src/utils/util.block-offset-to-selection-point.ts +0 -33
  284. package/src/utils/util.block-offset.test.ts +0 -375
  285. package/src/utils/util.block-offset.ts +0 -136
  286. package/src/utils/util.block-offsets-to-selection.ts +0 -38
  287. package/src/utils/util.child-selection-point-to-block-offset.ts +0 -51
  288. package/src/utils/util.get-block-end-point.ts +0 -35
  289. package/src/utils/util.get-block-start-point.ts +0 -31
  290. package/src/utils/util.get-selection-end-point.ts +0 -20
  291. package/src/utils/util.get-selection-start-point.ts +0 -20
  292. package/src/utils/util.get-text-block-text.ts +0 -8
  293. package/src/utils/util.is-empty-text-block.ts +0 -21
  294. package/src/utils/util.is-equal-selection-points.ts +0 -13
  295. package/src/utils/util.is-equal-selections.ts +0 -20
  296. package/src/utils/util.is-keyed-segment.ts +0 -8
  297. package/src/utils/util.is-selection-collapsed.ts +0 -16
  298. package/src/utils/util.is-selection-expanded.ts +0 -13
  299. package/src/utils/util.merge-text-blocks.ts +0 -40
  300. package/src/utils/util.reverse-selection.ts +0 -26
  301. package/src/utils/util.selection-point-to-block-offset.ts +0 -30
  302. package/src/utils/util.selection-point.ts +0 -22
  303. package/src/utils/util.slice-blocks.ts +0 -221
  304. package/src/utils/util.slice-text-block.test.ts +0 -190
  305. package/src/utils/util.slice-text-block.ts +0 -89
  306. package/src/utils/util.split-text-block.ts +0 -54
@@ -1,691 +0,0 @@
1
- import {isTextBlock} from '@portabletext/schema'
2
- import {defaultKeyboardShortcuts} from '../keyboard-shortcuts/default-keyboard-shortcuts'
3
- import {getFocusListBlock} from '../selectors/selector.get-focus-list-block'
4
- import {getFocusSpan} from '../selectors/selector.get-focus-span'
5
- import {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'
6
- import {getNextBlock} from '../selectors/selector.get-next-block'
7
- import {getPreviousBlock} from '../selectors/selector.get-previous-block'
8
- import {getSelectedBlocks} from '../selectors/selector.get-selected-blocks'
9
- import {getSelectionEndPoint} from '../selectors/selector.get-selection-end-point'
10
- import {getSelectionStartPoint} from '../selectors/selector.get-selection-start-point'
11
- import {isSelectionCollapsed} from '../selectors/selector.is-selection-collapsed'
12
- import {isListBlock} from '../utils/parse-blocks'
13
- import {isAtTheBeginningOfBlock} from '../utils/util.at-the-beginning-of-block'
14
- import {getBlockEndPoint} from '../utils/util.get-block-end-point'
15
- import {getBlockStartPoint} from '../utils/util.get-block-start-point'
16
- import {isEmptyTextBlock} from '../utils/util.is-empty-text-block'
17
- import {isEqualSelectionPoints} from '../utils/util.is-equal-selection-points'
18
- import {sliceTextBlock} from '../utils/util.slice-text-block'
19
- import {raise} from './behavior.types.action'
20
- import {defineBehavior} from './behavior.types.behavior'
21
-
22
- const MAX_LIST_LEVEL = 10
23
-
24
- const clearListOnBackspace = defineBehavior({
25
- on: 'delete.backward',
26
- guard: ({snapshot}) => {
27
- const focusTextBlock = getFocusTextBlock(snapshot)
28
-
29
- if (!focusTextBlock) {
30
- return false
31
- }
32
-
33
- if (focusTextBlock.node.level !== 1) {
34
- return false
35
- }
36
-
37
- if (
38
- !isAtTheBeginningOfBlock({
39
- context: snapshot.context,
40
- block: focusTextBlock.node,
41
- })
42
- ) {
43
- return false
44
- }
45
-
46
- return {focusTextBlock}
47
- },
48
- actions: [
49
- (_, {focusTextBlock}) => [
50
- raise({
51
- type: 'block.unset',
52
- props: ['listItem', 'level'],
53
- at: focusTextBlock.path,
54
- }),
55
- ],
56
- ],
57
- })
58
-
59
- const unindentListOnBackspace = defineBehavior({
60
- on: 'delete.backward',
61
- guard: ({snapshot}) => {
62
- const selectionCollapsed = isSelectionCollapsed(snapshot)
63
- const focusTextBlock = getFocusTextBlock(snapshot)
64
- const focusSpan = getFocusSpan(snapshot)
65
-
66
- if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
67
- return false
68
- }
69
-
70
- const atTheBeginningOfBLock =
71
- focusTextBlock.node.children[0]._key === focusSpan.node._key &&
72
- snapshot.context.selection?.focus.offset === 0
73
-
74
- if (
75
- atTheBeginningOfBLock &&
76
- focusTextBlock.node.level !== undefined &&
77
- focusTextBlock.node.level > 1
78
- ) {
79
- return {focusTextBlock, level: focusTextBlock.node.level - 1}
80
- }
81
-
82
- return false
83
- },
84
- actions: [
85
- (_, {focusTextBlock, level}) => [
86
- raise({
87
- type: 'block.set',
88
- props: {level},
89
- at: focusTextBlock.path,
90
- }),
91
- ],
92
- ],
93
- })
94
-
95
- /**
96
- * Hitting Delete in an empty list item would delete it by default. Instead,
97
- * then text block below should be merged into it, preserving the list
98
- * properties.
99
- */
100
- const mergeTextIntoListOnDelete = defineBehavior({
101
- on: 'delete.forward',
102
- guard: ({snapshot}) => {
103
- const focusListBlock = getFocusListBlock(snapshot)
104
- const nextBlock = getNextBlock(snapshot)
105
-
106
- if (!focusListBlock || !nextBlock) {
107
- return false
108
- }
109
-
110
- if (!isTextBlock(snapshot.context, nextBlock.node)) {
111
- return false
112
- }
113
-
114
- if (!isEmptyTextBlock(snapshot.context, focusListBlock.node)) {
115
- return false
116
- }
117
-
118
- return {focusListBlock, nextBlock}
119
- },
120
- actions: [
121
- (_, {nextBlock}) => [
122
- raise({
123
- type: 'insert.block',
124
- block: nextBlock.node,
125
- placement: 'auto',
126
- select: 'start',
127
- }),
128
- raise({
129
- type: 'delete.block',
130
- at: nextBlock.path,
131
- }),
132
- ],
133
- ],
134
- })
135
-
136
- /**
137
- * Hitting Backspace before an empty list item would delete it by default.
138
- * Instead, the text block below should be merged into it, preserving the list
139
- * properties.
140
- */
141
- const mergeTextIntoListOnBackspace = defineBehavior({
142
- on: 'delete.backward',
143
- guard: ({snapshot}) => {
144
- const focusTextBlock = getFocusTextBlock(snapshot)
145
- const previousBlock = getPreviousBlock(snapshot)
146
-
147
- if (!focusTextBlock || !previousBlock) {
148
- return false
149
- }
150
-
151
- if (
152
- !isAtTheBeginningOfBlock({
153
- context: snapshot.context,
154
- block: focusTextBlock.node,
155
- })
156
- ) {
157
- return false
158
- }
159
-
160
- if (!isListBlock(snapshot.context, previousBlock.node)) {
161
- return false
162
- }
163
-
164
- if (!isEmptyTextBlock(snapshot.context, previousBlock.node)) {
165
- return false
166
- }
167
-
168
- const previousBlockEndPoint = getBlockEndPoint({
169
- context: snapshot.context,
170
- block: previousBlock,
171
- })
172
-
173
- return {focusTextBlock, previousBlockEndPoint}
174
- },
175
- actions: [
176
- (_, {focusTextBlock, previousBlockEndPoint}) => [
177
- raise({
178
- type: 'select',
179
- at: {
180
- anchor: previousBlockEndPoint,
181
- focus: previousBlockEndPoint,
182
- },
183
- }),
184
- raise({
185
- type: 'insert.block',
186
- block: focusTextBlock.node,
187
- placement: 'auto',
188
- select: 'start',
189
- }),
190
- raise({
191
- type: 'delete.block',
192
- at: focusTextBlock.path,
193
- }),
194
- ],
195
- ],
196
- })
197
-
198
- /**
199
- * When performing a delete operation where the start point of the operation is
200
- * at the start of a list item and the end point of the operation is in another
201
- * list item, we make sure the preserve the first list item. Otherwise, the
202
- * default behavior would be to preserve the last item.
203
- */
204
- const deletingListFromStart = defineBehavior({
205
- on: 'delete',
206
- guard: ({snapshot, event}) => {
207
- const at = event.at ?? snapshot.context.selection
208
-
209
- if (!at) {
210
- return false
211
- }
212
-
213
- const blocksToDelete = getSelectedBlocks({
214
- ...snapshot,
215
- context: {
216
- ...snapshot.context,
217
- selection: at,
218
- },
219
- })
220
-
221
- if (blocksToDelete.length < 2) {
222
- return false
223
- }
224
-
225
- const startBlock = blocksToDelete.at(0)?.node
226
- const middleBlocks = blocksToDelete.slice(1, -1)
227
- const endBlock = blocksToDelete.at(-1)?.node
228
-
229
- if (
230
- !isListBlock(snapshot.context, startBlock) ||
231
- !isListBlock(snapshot.context, endBlock)
232
- ) {
233
- // It's that any block in between isn't a list item, but the first and
234
- // last blocks have to be list items for this Behavior to take effect.
235
- return false
236
- }
237
-
238
- const deleteStartPoint = getSelectionStartPoint({
239
- ...snapshot,
240
- context: {
241
- ...snapshot.context,
242
- selection: at,
243
- },
244
- })
245
- const deleteEndPoint = getSelectionEndPoint({
246
- ...snapshot,
247
- context: {
248
- ...snapshot.context,
249
- selection: at,
250
- },
251
- })
252
-
253
- if (!deleteStartPoint || !deleteEndPoint) {
254
- return false
255
- }
256
-
257
- const startBlockStartPoint = getBlockStartPoint({
258
- context: snapshot.context,
259
- block: {
260
- node: startBlock,
261
- path: [{_key: startBlock._key}],
262
- },
263
- })
264
-
265
- if (!isEqualSelectionPoints(deleteStartPoint, startBlockStartPoint)) {
266
- // If we aren't deleting from the beginning of the first list item, then
267
- // there is no need to proceed. The default delete Behavior will suffice.
268
- return false
269
- }
270
-
271
- const startBlockEndPoint = getBlockEndPoint({
272
- context: snapshot.context,
273
- block: {
274
- node: startBlock,
275
- path: [{_key: startBlock._key}],
276
- },
277
- })
278
- const endBlockEndPoint = getBlockEndPoint({
279
- context: snapshot.context,
280
- block: {
281
- node: endBlock,
282
- path: [{_key: endBlock._key}],
283
- },
284
- })
285
- const slicedEndBlock = sliceTextBlock({
286
- context: {
287
- schema: snapshot.context.schema,
288
- selection: {
289
- anchor: deleteEndPoint,
290
- focus: endBlockEndPoint,
291
- },
292
- },
293
- block: endBlock,
294
- })
295
-
296
- return {
297
- startBlockStartPoint,
298
- startBlockEndPoint,
299
- middleBlocks,
300
- endBlock,
301
- slicedEndBlock,
302
- }
303
- },
304
- actions: [
305
- (
306
- _,
307
- {
308
- startBlockStartPoint,
309
- startBlockEndPoint,
310
- middleBlocks,
311
- endBlock,
312
- slicedEndBlock,
313
- },
314
- ) => [
315
- // All block in between can safely be deleted.
316
- ...middleBlocks.map((block) =>
317
- raise({type: 'delete.block', at: block.path}),
318
- ),
319
- // The last block is deleted as well.
320
- raise({type: 'delete.block', at: [{_key: endBlock._key}]}),
321
- // But in case the delete operation didn't reach all the way to the end
322
- // of it, we first place the caret at the end of the start block...
323
- raise({
324
- type: 'select',
325
- at: {
326
- anchor: startBlockEndPoint,
327
- focus: startBlockEndPoint,
328
- },
329
- }),
330
- // ...and insert the rest of the end block at the end of it.
331
- raise({
332
- type: 'insert.block',
333
- block: slicedEndBlock,
334
- placement: 'auto',
335
- select: 'none',
336
- }),
337
- // And finally, we delete the original text of the start block.
338
- raise({
339
- type: 'delete',
340
- at: {anchor: startBlockStartPoint, focus: startBlockEndPoint},
341
- }),
342
- ],
343
- ],
344
- })
345
-
346
- /**
347
- * Hitting Enter in an empty list item would create a new list item below by
348
- * default. Instead, the list properties should be cleared.
349
- */
350
- const clearListOnEnter = defineBehavior({
351
- on: 'insert.break',
352
- guard: ({snapshot}) => {
353
- const selectionCollapsed = isSelectionCollapsed(snapshot)
354
- const focusListBlock = getFocusListBlock(snapshot)
355
-
356
- if (
357
- !selectionCollapsed ||
358
- !focusListBlock ||
359
- !isEmptyTextBlock(snapshot.context, focusListBlock.node)
360
- ) {
361
- return false
362
- }
363
-
364
- return {focusListBlock}
365
- },
366
- actions: [
367
- (_, {focusListBlock}) => [
368
- raise({
369
- type: 'block.unset',
370
- props: ['listItem', 'level'],
371
- at: focusListBlock.path,
372
- }),
373
- ],
374
- ],
375
- })
376
-
377
- /**
378
- * Hitting Tab should indent the list item.
379
- */
380
- const indentListOnTab = defineBehavior({
381
- on: 'keyboard.keydown',
382
- guard: ({snapshot, event}) => {
383
- const isTab = defaultKeyboardShortcuts.tab.guard(event.originEvent)
384
-
385
- if (!isTab) {
386
- return false
387
- }
388
-
389
- const selectedBlocks = getSelectedBlocks(snapshot)
390
- const selectedListBlocks = selectedBlocks.flatMap((block) =>
391
- isListBlock(snapshot.context, block.node)
392
- ? [
393
- {
394
- node: block.node,
395
- path: block.path,
396
- },
397
- ]
398
- : [],
399
- )
400
-
401
- if (selectedListBlocks.length === selectedBlocks.length) {
402
- return {selectedListBlocks}
403
- }
404
-
405
- return false
406
- },
407
- actions: [
408
- (_, {selectedListBlocks}) =>
409
- selectedListBlocks.map((selectedListBlock) =>
410
- raise({
411
- type: 'block.set',
412
- props: {
413
- level: Math.min(
414
- MAX_LIST_LEVEL,
415
- Math.max(1, selectedListBlock.node.level + 1),
416
- ),
417
- },
418
- at: selectedListBlock.path,
419
- }),
420
- ),
421
- ],
422
- })
423
-
424
- /**
425
- * Hitting Shift+Tab should unindent the list item.
426
- */
427
- const unindentListOnShiftTab = defineBehavior({
428
- on: 'keyboard.keydown',
429
- guard: ({snapshot, event}) => {
430
- const isShiftTab = defaultKeyboardShortcuts.shiftTab.guard(
431
- event.originEvent,
432
- )
433
-
434
- if (!isShiftTab) {
435
- return false
436
- }
437
-
438
- const selectedBlocks = getSelectedBlocks(snapshot)
439
- const selectedListBlocks = selectedBlocks.flatMap((block) =>
440
- isListBlock(snapshot.context, block.node)
441
- ? [
442
- {
443
- node: block.node,
444
- path: block.path,
445
- },
446
- ]
447
- : [],
448
- )
449
-
450
- if (selectedListBlocks.length === selectedBlocks.length) {
451
- return {selectedListBlocks}
452
- }
453
-
454
- return false
455
- },
456
- actions: [
457
- (_, {selectedListBlocks}) =>
458
- selectedListBlocks.map((selectedListBlock) =>
459
- raise({
460
- type: 'block.set',
461
- props: {
462
- level: Math.min(
463
- MAX_LIST_LEVEL,
464
- Math.max(1, selectedListBlock.node.level - 1),
465
- ),
466
- },
467
- at: selectedListBlock.path,
468
- }),
469
- ),
470
- ],
471
- })
472
-
473
- /**
474
- * An inserted list inherits the `level` from the list item where it's
475
- * inserted. The entire list tree is adjusted to match the new level.
476
- */
477
- const inheritListLevel = defineBehavior({
478
- on: 'insert.blocks',
479
- guard: ({snapshot, event}) => {
480
- const focusListBlock = getFocusListBlock(snapshot)
481
-
482
- if (!focusListBlock) {
483
- return false
484
- }
485
-
486
- const firstInsertedBlock = event.blocks.at(0)
487
- const secondInsertedBlock = event.blocks.at(1)
488
- const insertedListBlock = isListBlock(snapshot.context, firstInsertedBlock)
489
- ? firstInsertedBlock
490
- : isListBlock(snapshot.context, secondInsertedBlock)
491
- ? secondInsertedBlock
492
- : undefined
493
-
494
- if (!insertedListBlock) {
495
- return false
496
- }
497
-
498
- const levelDifference = focusListBlock.node.level - insertedListBlock.level
499
-
500
- if (levelDifference === 0) {
501
- return false
502
- }
503
-
504
- return {levelDifference, insertedListBlock}
505
- },
506
- actions: [
507
- ({snapshot, event}, {levelDifference, insertedListBlock}) => {
508
- let adjustLevel = true
509
- let listStartBlockFound = false
510
-
511
- return [
512
- raise({
513
- ...event,
514
- blocks: event.blocks.map((block) => {
515
- if (block._key === insertedListBlock._key) {
516
- listStartBlockFound = true
517
- }
518
-
519
- if (!adjustLevel) {
520
- return block
521
- }
522
-
523
- if (
524
- listStartBlockFound &&
525
- adjustLevel &&
526
- isListBlock(snapshot.context, block)
527
- ) {
528
- return {
529
- ...block,
530
- level: Math.min(
531
- MAX_LIST_LEVEL,
532
- Math.max(1, block.level + levelDifference),
533
- ),
534
- }
535
- }
536
-
537
- if (listStartBlockFound) {
538
- adjustLevel = false
539
- }
540
-
541
- return block
542
- }),
543
- }),
544
- ]
545
- },
546
- ],
547
- })
548
-
549
- /**
550
- * An inserted list inherits the `listItem` from the list item at the level
551
- * it's inserted.
552
- */
553
- const inheritListItem = defineBehavior({
554
- on: 'insert.blocks',
555
- guard: ({snapshot, event}) => {
556
- const focusListBlock = getFocusListBlock(snapshot)
557
-
558
- if (!focusListBlock) {
559
- return false
560
- }
561
-
562
- if (isEmptyTextBlock(snapshot.context, focusListBlock.node)) {
563
- return false
564
- }
565
-
566
- const firstInsertedBlock = event.blocks.at(0)
567
- const secondInsertedBlock = event.blocks.at(1)
568
- const insertedListBlock = isListBlock(snapshot.context, firstInsertedBlock)
569
- ? firstInsertedBlock
570
- : isListBlock(snapshot.context, secondInsertedBlock)
571
- ? secondInsertedBlock
572
- : undefined
573
-
574
- if (!insertedListBlock) {
575
- return false
576
- }
577
-
578
- if (focusListBlock.node.level !== insertedListBlock.level) {
579
- return false
580
- }
581
-
582
- if (focusListBlock.node.listItem === insertedListBlock.listItem) {
583
- return false
584
- }
585
-
586
- return {listItem: focusListBlock.node.listItem, insertedListBlock}
587
- },
588
- actions: [
589
- ({snapshot, event}, {listItem, insertedListBlock}) => {
590
- let adjustListItem = true
591
- let listStartBlockFound = false
592
-
593
- return [
594
- raise({
595
- ...event,
596
- blocks: event.blocks.map((block) => {
597
- if (block._key === insertedListBlock._key) {
598
- listStartBlockFound = true
599
- }
600
-
601
- if (!adjustListItem) {
602
- return block
603
- }
604
-
605
- if (
606
- listStartBlockFound &&
607
- adjustListItem &&
608
- isListBlock(snapshot.context, block)
609
- ) {
610
- return {
611
- ...block,
612
- listItem:
613
- block.level === insertedListBlock.level
614
- ? listItem
615
- : block.listItem,
616
- }
617
- }
618
-
619
- if (listStartBlockFound) {
620
- adjustListItem = false
621
- }
622
-
623
- return block
624
- }),
625
- }),
626
- ]
627
- },
628
- ],
629
- })
630
-
631
- /**
632
- * An inserted text block inherits the `listItem` and `level` from the list
633
- * item where it's inserted.
634
- */
635
- const inheritListProperties = defineBehavior({
636
- on: 'insert.block',
637
- guard: ({snapshot, event}) => {
638
- if (event.placement !== 'auto') {
639
- return false
640
- }
641
-
642
- if (event.block._type !== snapshot.context.schema.block.name) {
643
- return false
644
- }
645
-
646
- if (event.block.listItem !== undefined) {
647
- return false
648
- }
649
-
650
- const focusListBlock = getFocusListBlock(snapshot)
651
-
652
- if (!focusListBlock) {
653
- return false
654
- }
655
-
656
- if (!isEmptyTextBlock(snapshot.context, focusListBlock.node)) {
657
- return false
658
- }
659
-
660
- return {
661
- level: focusListBlock.node.level,
662
- listItem: focusListBlock.node.listItem,
663
- }
664
- },
665
- actions: [
666
- ({event}, {level, listItem}) => [
667
- raise({
668
- ...event,
669
- block: {
670
- ...event.block,
671
- level,
672
- listItem,
673
- },
674
- }),
675
- ],
676
- ],
677
- })
678
-
679
- export const coreListBehaviors = {
680
- clearListOnBackspace,
681
- unindentListOnBackspace,
682
- mergeTextIntoListOnDelete,
683
- mergeTextIntoListOnBackspace,
684
- deletingListFromStart,
685
- clearListOnEnter,
686
- indentListOnTab,
687
- unindentListOnShiftTab,
688
- inheritListLevel,
689
- inheritListItem,
690
- inheritListProperties,
691
- }