@portabletext/editor 3.3.3 → 3.3.5

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 (309) hide show
  1. package/lib/_chunks-dts/index.d.ts +21 -1667
  2. package/lib/index.js +511 -9010
  3. package/lib/index.js.map +1 -1
  4. package/package.json +14 -15
  5. package/src/behaviors/_exports/index.ts +0 -1
  6. package/src/behaviors/behavior.abstract.annotation.ts +0 -77
  7. package/src/behaviors/behavior.abstract.decorator.ts +0 -39
  8. package/src/behaviors/behavior.abstract.delete.ts +0 -273
  9. package/src/behaviors/behavior.abstract.deserialize.ts +0 -232
  10. package/src/behaviors/behavior.abstract.insert.ts +0 -525
  11. package/src/behaviors/behavior.abstract.keyboard.ts +0 -189
  12. package/src/behaviors/behavior.abstract.list-item.ts +0 -70
  13. package/src/behaviors/behavior.abstract.move.ts +0 -79
  14. package/src/behaviors/behavior.abstract.select.ts +0 -118
  15. package/src/behaviors/behavior.abstract.serialize.ts +0 -96
  16. package/src/behaviors/behavior.abstract.split.ts +0 -170
  17. package/src/behaviors/behavior.abstract.style.ts +0 -55
  18. package/src/behaviors/behavior.abstract.ts +0 -139
  19. package/src/behaviors/behavior.config.ts +0 -7
  20. package/src/behaviors/behavior.core.annotations.ts +0 -62
  21. package/src/behaviors/behavior.core.block-element.ts +0 -116
  22. package/src/behaviors/behavior.core.block-objects.ts +0 -285
  23. package/src/behaviors/behavior.core.decorators.ts +0 -44
  24. package/src/behaviors/behavior.core.dnd.ts +0 -356
  25. package/src/behaviors/behavior.core.insert-break.ts +0 -266
  26. package/src/behaviors/behavior.core.insert.ts +0 -52
  27. package/src/behaviors/behavior.core.lists.ts +0 -691
  28. package/src/behaviors/behavior.core.ts +0 -44
  29. package/src/behaviors/behavior.perform-event.ts +0 -354
  30. package/src/behaviors/behavior.types.action.ts +0 -102
  31. package/src/behaviors/behavior.types.behavior.ts +0 -83
  32. package/src/behaviors/behavior.types.event.ts +0 -667
  33. package/src/behaviors/behavior.types.guard.ts +0 -11
  34. package/src/behaviors/index.ts +0 -17
  35. package/src/converters/converter.json.ts +0 -53
  36. package/src/converters/converter.portable-text.deserialize.test.ts +0 -680
  37. package/src/converters/converter.portable-text.ts +0 -75
  38. package/src/converters/converter.text-html.deserialize.test.ts +0 -406
  39. package/src/converters/converter.text-html.serialize.test.ts +0 -246
  40. package/src/converters/converter.text-html.ts +0 -87
  41. package/src/converters/converter.text-markdown.ts +0 -67
  42. package/src/converters/converter.text-plain.test.ts +0 -245
  43. package/src/converters/converter.text-plain.ts +0 -126
  44. package/src/converters/converter.types.ts +0 -72
  45. package/src/converters/converters.core.ts +0 -18
  46. package/src/editor/Editable.tsx +0 -1012
  47. package/src/editor/PortableTextEditor.tsx +0 -791
  48. package/src/editor/components/drop-indicator.tsx +0 -17
  49. package/src/editor/components/render-block-object.tsx +0 -121
  50. package/src/editor/components/render-default-object.tsx +0 -21
  51. package/src/editor/components/render-element.tsx +0 -88
  52. package/src/editor/components/render-inline-object.tsx +0 -129
  53. package/src/editor/components/render-leaf.tsx +0 -64
  54. package/src/editor/components/render-span.tsx +0 -303
  55. package/src/editor/components/render-text-block.tsx +0 -265
  56. package/src/editor/components/render-text.tsx +0 -18
  57. package/src/editor/components/use-core-block-element-behaviors.ts +0 -39
  58. package/src/editor/create-editor.ts +0 -323
  59. package/src/editor/create-slate-editor.tsx +0 -64
  60. package/src/editor/editor-actor-context.ts +0 -4
  61. package/src/editor/editor-context.tsx +0 -7
  62. package/src/editor/editor-dom.ts +0 -220
  63. package/src/editor/editor-machine.ts +0 -751
  64. package/src/editor/editor-provider.tsx +0 -111
  65. package/src/editor/editor-schema.ts +0 -6
  66. package/src/editor/editor-selector.ts +0 -89
  67. package/src/editor/editor-snapshot.ts +0 -68
  68. package/src/editor/event-to-change.tsx +0 -49
  69. package/src/editor/hooks/usePortableTextEditor.ts +0 -25
  70. package/src/editor/hooks/usePortableTextEditorSelection.tsx +0 -28
  71. package/src/editor/mutation-machine.ts +0 -322
  72. package/src/editor/plugins/create-with-event-listeners.ts +0 -271
  73. package/src/editor/plugins/createWithEditableAPI.ts +0 -529
  74. package/src/editor/plugins/createWithHotKeys.ts +0 -68
  75. package/src/editor/plugins/createWithObjectKeys.ts +0 -289
  76. package/src/editor/plugins/createWithPatches.ts +0 -272
  77. package/src/editor/plugins/createWithPortableTextMarkModel.ts +0 -559
  78. package/src/editor/plugins/createWithSchemaTypes.ts +0 -121
  79. package/src/editor/plugins/slate-plugin.update-selection.ts +0 -51
  80. package/src/editor/plugins/slate-plugin.update-value.ts +0 -46
  81. package/src/editor/plugins/with-plugins.ts +0 -69
  82. package/src/editor/range-decorations-machine.ts +0 -421
  83. package/src/editor/relay-actor-context.ts +0 -4
  84. package/src/editor/relay-machine.ts +0 -152
  85. package/src/editor/sync-machine.ts +0 -961
  86. package/src/editor/use-editor.ts +0 -27
  87. package/src/editor/validate-selection-machine.test.ts +0 -47
  88. package/src/editor/validate-selection-machine.ts +0 -149
  89. package/src/editor/weakMaps.ts +0 -15
  90. package/src/editor/with-normalizing-node.ts +0 -14
  91. package/src/editor/with-performing-behavior-operation.ts +0 -21
  92. package/src/editor/withChanges.ts +0 -13
  93. package/src/editor/without-normalizing-conditional.ts +0 -13
  94. package/src/editor/withoutPatching.ts +0 -14
  95. package/src/editor.ts +0 -59
  96. package/src/history/behavior.operation.history.redo.ts +0 -67
  97. package/src/history/behavior.operation.history.undo.ts +0 -71
  98. package/src/history/event.history.undo.test.tsx +0 -672
  99. package/src/history/history.preserving-keys.test.tsx +0 -112
  100. package/src/history/remote-patches.ts +0 -20
  101. package/src/history/slate-plugin.history.ts +0 -142
  102. package/src/history/slate-plugin.redoing.ts +0 -21
  103. package/src/history/slate-plugin.undoing.ts +0 -21
  104. package/src/history/slate-plugin.without-history.ts +0 -23
  105. package/src/history/transform-operation.ts +0 -245
  106. package/src/history/undo-redo-collaboration.test.tsx +0 -541
  107. package/src/history/undo-redo.feature +0 -125
  108. package/src/history/undo-redo.test.tsx +0 -195
  109. package/src/history/undo-step.ts +0 -148
  110. package/src/index.ts +0 -107
  111. package/src/internal-utils/__tests__/ranges.test.ts +0 -23
  112. package/src/internal-utils/__tests__/values.test.ts +0 -110
  113. package/src/internal-utils/apply-operation-to-portable-text.test.ts +0 -1861
  114. package/src/internal-utils/apply-operation-to-portable-text.ts +0 -615
  115. package/src/internal-utils/applyPatch.ts +0 -644
  116. package/src/internal-utils/block-keys.ts +0 -9
  117. package/src/internal-utils/build-index-maps.test.ts +0 -464
  118. package/src/internal-utils/build-index-maps.ts +0 -131
  119. package/src/internal-utils/collapse-selection.ts +0 -36
  120. package/src/internal-utils/compound-client-rect.ts +0 -28
  121. package/src/internal-utils/create-placeholder-block.ts +0 -21
  122. package/src/internal-utils/create-test-snapshot.ts +0 -28
  123. package/src/internal-utils/debug.ts +0 -12
  124. package/src/internal-utils/editor-selection.test.ts +0 -44
  125. package/src/internal-utils/editor-selection.ts +0 -56
  126. package/src/internal-utils/event-position.ts +0 -318
  127. package/src/internal-utils/global-scope.ts +0 -27
  128. package/src/internal-utils/globally-scoped-context.ts +0 -39
  129. package/src/internal-utils/is-hotkey.test.ts +0 -114
  130. package/src/internal-utils/is-hotkey.ts +0 -209
  131. package/src/internal-utils/mime-type.ts +0 -1
  132. package/src/internal-utils/move-range-by-operation.ts +0 -19
  133. package/src/internal-utils/operation-to-patches.test.ts +0 -522
  134. package/src/internal-utils/operation-to-patches.ts +0 -571
  135. package/src/internal-utils/portable-text-node.ts +0 -209
  136. package/src/internal-utils/schema.ts +0 -8
  137. package/src/internal-utils/selection-block-keys.ts +0 -20
  138. package/src/internal-utils/selection-focus-text.ts +0 -40
  139. package/src/internal-utils/selection-text.test.ts +0 -32
  140. package/src/internal-utils/selection-text.ts +0 -21
  141. package/src/internal-utils/selection.ts +0 -77
  142. package/src/internal-utils/sibling-utils.ts +0 -55
  143. package/src/internal-utils/slate-utils.test.tsx +0 -121
  144. package/src/internal-utils/slate-utils.ts +0 -417
  145. package/src/internal-utils/split-string.ts +0 -12
  146. package/src/internal-utils/stop-actor.ts +0 -43
  147. package/src/internal-utils/string-overlap.test.ts +0 -14
  148. package/src/internal-utils/string-overlap.ts +0 -28
  149. package/src/internal-utils/string-utils.ts +0 -7
  150. package/src/internal-utils/text-block-key.test.ts +0 -41
  151. package/src/internal-utils/text-block-key.ts +0 -26
  152. package/src/internal-utils/text-marks.test.ts +0 -41
  153. package/src/internal-utils/text-marks.ts +0 -22
  154. package/src/internal-utils/text-selection.test.ts +0 -211
  155. package/src/internal-utils/text-selection.ts +0 -121
  156. package/src/internal-utils/to-slate-range.test.ts +0 -278
  157. package/src/internal-utils/to-slate-range.ts +0 -171
  158. package/src/internal-utils/validateValue.ts +0 -443
  159. package/src/internal-utils/value-annotations.ts +0 -33
  160. package/src/internal-utils/values.test.ts +0 -282
  161. package/src/internal-utils/values.ts +0 -266
  162. package/src/keyboard-shortcuts/default-keyboard-shortcuts.ts +0 -146
  163. package/src/operations/behavior.operation.annotation.add.ts +0 -99
  164. package/src/operations/behavior.operation.annotation.remove.ts +0 -150
  165. package/src/operations/behavior.operation.block.set.ts +0 -104
  166. package/src/operations/behavior.operation.block.unset.ts +0 -54
  167. package/src/operations/behavior.operation.child.set.ts +0 -107
  168. package/src/operations/behavior.operation.child.unset.ts +0 -116
  169. package/src/operations/behavior.operation.decorator.add.ts +0 -131
  170. package/src/operations/behavior.operation.delete.ts +0 -294
  171. package/src/operations/behavior.operation.insert.block.ts +0 -495
  172. package/src/operations/behavior.operation.insert.child.ts +0 -129
  173. package/src/operations/behavior.operation.insert.text.ts +0 -8
  174. package/src/operations/behavior.operation.move.backward.ts +0 -12
  175. package/src/operations/behavior.operation.move.block.ts +0 -44
  176. package/src/operations/behavior.operation.move.forward.ts +0 -11
  177. package/src/operations/behavior.operation.select.ts +0 -27
  178. package/src/operations/behavior.operations.ts +0 -221
  179. package/src/plugins/_exports/index.ts +0 -1
  180. package/src/plugins/index.ts +0 -3
  181. package/src/plugins/plugin.behavior.tsx +0 -24
  182. package/src/plugins/plugin.editor-ref.tsx +0 -17
  183. package/src/plugins/plugin.event-listener.tsx +0 -68
  184. package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +0 -71
  185. package/src/plugins/plugin.internal.auto-close-brackets.ts +0 -62
  186. package/src/plugins/plugin.internal.change-ref.tsx +0 -19
  187. package/src/plugins/plugin.internal.portable-text-editor-ref.tsx +0 -16
  188. package/src/plugins/plugin.internal.slate-editor-ref.tsx +0 -15
  189. package/src/priority/priority.core.ts +0 -3
  190. package/src/priority/priority.sort.test.ts +0 -319
  191. package/src/priority/priority.sort.ts +0 -123
  192. package/src/priority/priority.types.ts +0 -24
  193. package/src/selectors/_exports/index.ts +0 -1
  194. package/src/selectors/drag-selection.test.ts +0 -578
  195. package/src/selectors/drag-selection.ts +0 -118
  196. package/src/selectors/index.ts +0 -54
  197. package/src/selectors/selector.get-active-annotation-marks.ts +0 -12
  198. package/src/selectors/selector.get-active-annotations.ts +0 -36
  199. package/src/selectors/selector.get-active-decorators.ts +0 -29
  200. package/src/selectors/selector.get-active-list-item.ts +0 -38
  201. package/src/selectors/selector.get-active-style.ts +0 -38
  202. package/src/selectors/selector.get-anchor-block.ts +0 -22
  203. package/src/selectors/selector.get-anchor-child.ts +0 -36
  204. package/src/selectors/selector.get-anchor-span.ts +0 -17
  205. package/src/selectors/selector.get-anchor-text-block.ts +0 -18
  206. package/src/selectors/selector.get-block-offsets.ts +0 -34
  207. package/src/selectors/selector.get-caret-word-selection.test.ts +0 -284
  208. package/src/selectors/selector.get-caret-word-selection.ts +0 -134
  209. package/src/selectors/selector.get-first-block.ts +0 -14
  210. package/src/selectors/selector.get-focus-block-object.ts +0 -18
  211. package/src/selectors/selector.get-focus-block.ts +0 -23
  212. package/src/selectors/selector.get-focus-child.ts +0 -36
  213. package/src/selectors/selector.get-focus-inline-object.ts +0 -17
  214. package/src/selectors/selector.get-focus-list-block.ts +0 -18
  215. package/src/selectors/selector.get-focus-span.ts +0 -18
  216. package/src/selectors/selector.get-focus-text-block.ts +0 -18
  217. package/src/selectors/selector.get-last-block.ts +0 -16
  218. package/src/selectors/selector.get-mark-state.test.ts +0 -325
  219. package/src/selectors/selector.get-mark-state.ts +0 -263
  220. package/src/selectors/selector.get-next-block.ts +0 -29
  221. package/src/selectors/selector.get-next-inline-object.ts +0 -53
  222. package/src/selectors/selector.get-next-inline-objects.ts +0 -50
  223. package/src/selectors/selector.get-next-span.ts +0 -56
  224. package/src/selectors/selector.get-previous-block.ts +0 -29
  225. package/src/selectors/selector.get-previous-inline-object.ts +0 -50
  226. package/src/selectors/selector.get-previous-inline-objects.ts +0 -47
  227. package/src/selectors/selector.get-previous-span.ts +0 -53
  228. package/src/selectors/selector.get-selected-blocks.ts +0 -61
  229. package/src/selectors/selector.get-selected-spans.test.ts +0 -347
  230. package/src/selectors/selector.get-selected-spans.ts +0 -155
  231. package/src/selectors/selector.get-selected-text-blocks.ts +0 -73
  232. package/src/selectors/selector.get-selected-value.test.ts +0 -834
  233. package/src/selectors/selector.get-selected-value.ts +0 -66
  234. package/src/selectors/selector.get-selection-end-block.ts +0 -33
  235. package/src/selectors/selector.get-selection-end-child.ts +0 -33
  236. package/src/selectors/selector.get-selection-end-point.ts +0 -17
  237. package/src/selectors/selector.get-selection-start-block.ts +0 -33
  238. package/src/selectors/selector.get-selection-start-child.ts +0 -33
  239. package/src/selectors/selector.get-selection-start-point.ts +0 -17
  240. package/src/selectors/selector.get-selection-text.test.ts +0 -421
  241. package/src/selectors/selector.get-selection-text.ts +0 -27
  242. package/src/selectors/selector.get-selection.ts +0 -9
  243. package/src/selectors/selector.get-text-after.ts +0 -46
  244. package/src/selectors/selector.get-text-before.ts +0 -46
  245. package/src/selectors/selector.get-value.ts +0 -11
  246. package/src/selectors/selector.is-active-annotation.test.ts +0 -320
  247. package/src/selectors/selector.is-active-annotation.ts +0 -52
  248. package/src/selectors/selector.is-active-decorator.test.ts +0 -136
  249. package/src/selectors/selector.is-active-decorator.ts +0 -24
  250. package/src/selectors/selector.is-active-list-item.ts +0 -13
  251. package/src/selectors/selector.is-active-style.ts +0 -13
  252. package/src/selectors/selector.is-at-the-end-of-block.ts +0 -30
  253. package/src/selectors/selector.is-at-the-start-of-block.ts +0 -30
  254. package/src/selectors/selector.is-overlapping-selection.test.ts +0 -304
  255. package/src/selectors/selector.is-overlapping-selection.ts +0 -181
  256. package/src/selectors/selector.is-point-after-selection.ts +0 -97
  257. package/src/selectors/selector.is-point-before-selection.ts +0 -97
  258. package/src/selectors/selector.is-selecting-entire-blocks.ts +0 -43
  259. package/src/selectors/selector.is-selection-collapsed.ts +0 -17
  260. package/src/selectors/selector.is-selection-expanded.test.ts +0 -63
  261. package/src/selectors/selector.is-selection-expanded.ts +0 -9
  262. package/src/test/_exports/index.ts +0 -1
  263. package/src/test/gherkin-parameter-types.ts +0 -112
  264. package/src/test/index.ts +0 -1
  265. package/src/test/vitest/_exports/index.ts +0 -1
  266. package/src/test/vitest/index.ts +0 -3
  267. package/src/test/vitest/step-context.ts +0 -13
  268. package/src/test/vitest/step-definitions.tsx +0 -960
  269. package/src/test/vitest/test-editor.tsx +0 -198
  270. package/src/type-utils.ts +0 -29
  271. package/src/types/block-offset.ts +0 -9
  272. package/src/types/block-with-optional-key.ts +0 -25
  273. package/src/types/editor.ts +0 -509
  274. package/src/types/options.ts +0 -13
  275. package/src/types/paths.ts +0 -35
  276. package/src/types/slate-editor.ts +0 -50
  277. package/src/types/slate.ts +0 -27
  278. package/src/utils/_exports/index.ts +0 -1
  279. package/src/utils/asserters.ts +0 -9
  280. package/src/utils/index.ts +0 -24
  281. package/src/utils/key-generator.ts +0 -33
  282. package/src/utils/parse-blocks.test.ts +0 -836
  283. package/src/utils/parse-blocks.ts +0 -504
  284. package/src/utils/util.at-the-beginning-of-block.ts +0 -32
  285. package/src/utils/util.block-offset-to-block-selection-point.ts +0 -28
  286. package/src/utils/util.block-offset-to-selection-point.ts +0 -33
  287. package/src/utils/util.block-offset.test.ts +0 -375
  288. package/src/utils/util.block-offset.ts +0 -136
  289. package/src/utils/util.block-offsets-to-selection.ts +0 -38
  290. package/src/utils/util.child-selection-point-to-block-offset.ts +0 -51
  291. package/src/utils/util.get-block-end-point.ts +0 -35
  292. package/src/utils/util.get-block-start-point.ts +0 -31
  293. package/src/utils/util.get-selection-end-point.ts +0 -20
  294. package/src/utils/util.get-selection-start-point.ts +0 -20
  295. package/src/utils/util.get-text-block-text.ts +0 -8
  296. package/src/utils/util.is-empty-text-block.ts +0 -21
  297. package/src/utils/util.is-equal-selection-points.ts +0 -13
  298. package/src/utils/util.is-equal-selections.ts +0 -20
  299. package/src/utils/util.is-keyed-segment.ts +0 -8
  300. package/src/utils/util.is-selection-collapsed.ts +0 -16
  301. package/src/utils/util.is-selection-expanded.ts +0 -13
  302. package/src/utils/util.merge-text-blocks.ts +0 -40
  303. package/src/utils/util.reverse-selection.ts +0 -26
  304. package/src/utils/util.selection-point-to-block-offset.ts +0 -30
  305. package/src/utils/util.selection-point.ts +0 -22
  306. package/src/utils/util.slice-blocks.ts +0 -221
  307. package/src/utils/util.slice-text-block.test.ts +0 -190
  308. package/src/utils/util.slice-text-block.ts +0 -89
  309. package/src/utils/util.split-text-block.ts +0 -54
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "3.3.3",
3
+ "version": "3.3.5",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -58,8 +58,7 @@
58
58
  "main": "./lib/index.js",
59
59
  "types": "./lib/index.d.ts",
60
60
  "files": [
61
- "lib",
62
- "src"
61
+ "lib"
63
62
  ],
64
63
  "dependencies": {
65
64
  "@portabletext/to-html": "^4.0.1",
@@ -70,12 +69,15 @@
70
69
  "lodash": "^4.17.21",
71
70
  "lodash.startcase": "^4.4.0",
72
71
  "react-compiler-runtime": "^1.0.0",
72
+ "slate": "^0.120.0",
73
+ "slate-dom": "^0.119.0",
74
+ "slate-react": "^0.120.0",
73
75
  "xstate": "^5.24.0",
74
- "@portabletext/block-tools": "^4.1.8",
75
- "@portabletext/keyboard-shortcuts": "^2.1.0",
76
- "@portabletext/markdown": "^1.0.3",
77
- "@portabletext/patches": "^2.0.0",
78
- "@portabletext/schema": "^2.0.0"
76
+ "@portabletext/block-tools": "^4.1.9",
77
+ "@portabletext/keyboard-shortcuts": "^2.1.1",
78
+ "@portabletext/markdown": "^1.0.4",
79
+ "@portabletext/patches": "^2.0.1",
80
+ "@portabletext/schema": "^2.0.1"
79
81
  },
80
82
  "devDependencies": {
81
83
  "@sanity/diff-match-patch": "^3.2.0",
@@ -98,20 +100,17 @@
98
100
  "react": "^19.2.1",
99
101
  "react-dom": "^19.2.1",
100
102
  "rxjs": "^7.8.2",
101
- "slate": "^0.120.0",
102
- "slate-dom": "^0.119.0",
103
- "slate-react": "^0.120.0",
104
103
  "typescript": "5.9.3",
105
104
  "typescript-eslint": "^8.48.0",
106
105
  "vite": "^7.1.12",
107
106
  "vitest": "^4.0.14",
108
107
  "vitest-browser-react": "^2.0.2",
109
- "@portabletext/sanity-bridge": "1.2.11",
110
- "@portabletext/test": "^1.0.1",
111
- "racejar": "2.0.0"
108
+ "@portabletext/sanity-bridge": "1.2.12",
109
+ "@portabletext/test": "^1.0.2",
110
+ "racejar": "2.0.1"
112
111
  },
113
112
  "peerDependencies": {
114
- "@portabletext/sanity-bridge": "^1.2.11",
113
+ "@portabletext/sanity-bridge": "^1.2.12",
115
114
  "react": "^18.3 || ^19",
116
115
  "rxjs": "^7.8.2"
117
116
  },
@@ -1 +0,0 @@
1
- export * from '../index'
@@ -1,77 +0,0 @@
1
- import {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'
2
- import {isActiveAnnotation} from '../selectors/selector.is-active-annotation'
3
- import {raise} from './behavior.types.action'
4
- import {defineBehavior} from './behavior.types.behavior'
5
-
6
- export const abstractAnnotationBehaviors = [
7
- defineBehavior({
8
- on: 'annotation.set',
9
- guard: ({snapshot, event}) => {
10
- const blockKey = event.at[0]._key
11
- const markDefKey = event.at[2]._key
12
-
13
- const block = getFocusTextBlock({
14
- ...snapshot,
15
- context: {
16
- ...snapshot.context,
17
- selection: {
18
- anchor: {
19
- path: [{_key: blockKey}],
20
- offset: 0,
21
- },
22
- focus: {
23
- path: [{_key: blockKey}],
24
- offset: 0,
25
- },
26
- },
27
- },
28
- })
29
-
30
- if (!block) {
31
- return false
32
- }
33
-
34
- const updatedMarkDefs = block.node.markDefs?.map((markDef) => {
35
- if (markDef._key === markDefKey) {
36
- return {
37
- ...markDef,
38
- ...event.props,
39
- }
40
- }
41
-
42
- return markDef
43
- })
44
-
45
- return {blockKey, updatedMarkDefs}
46
- },
47
- actions: [
48
- (_, {blockKey, updatedMarkDefs}) => [
49
- raise({
50
- type: 'block.set',
51
- at: [{_key: blockKey}],
52
- props: {markDefs: updatedMarkDefs},
53
- }),
54
- ],
55
- ],
56
- }),
57
- defineBehavior({
58
- on: 'annotation.toggle',
59
- guard: ({snapshot, event}) =>
60
- isActiveAnnotation(event.annotation.name)(snapshot),
61
- actions: [
62
- ({event}) => [
63
- raise({type: 'annotation.remove', annotation: event.annotation}),
64
- ],
65
- ],
66
- }),
67
- defineBehavior({
68
- on: 'annotation.toggle',
69
- guard: ({snapshot, event}) =>
70
- !isActiveAnnotation(event.annotation.name)(snapshot),
71
- actions: [
72
- ({event}) => [
73
- raise({type: 'annotation.add', annotation: event.annotation}),
74
- ],
75
- ],
76
- }),
77
- ]
@@ -1,39 +0,0 @@
1
- import {isActiveDecorator} from '../selectors/selector.is-active-decorator'
2
- import {raise} from './behavior.types.action'
3
- import {defineBehavior} from './behavior.types.behavior'
4
-
5
- export const abstractDecoratorBehaviors = [
6
- defineBehavior({
7
- on: 'decorator.toggle',
8
- guard: ({snapshot, event}) => isActiveDecorator(event.decorator)(snapshot),
9
- actions: [
10
- ({event}) => [
11
- raise({type: 'decorator.remove', decorator: event.decorator}),
12
- ],
13
- ],
14
- }),
15
- defineBehavior({
16
- on: 'decorator.toggle',
17
- guard: ({snapshot, event}) => {
18
- if (event.at) {
19
- return !isActiveDecorator(event.decorator)({
20
- ...snapshot,
21
- context: {
22
- ...snapshot.context,
23
- selection: event.at,
24
- },
25
- })
26
- }
27
-
28
- return !isActiveDecorator(event.decorator)(snapshot)
29
- },
30
- actions: [
31
- ({event}) => [
32
- raise({
33
- ...event,
34
- type: 'decorator.add',
35
- }),
36
- ],
37
- ],
38
- }),
39
- ]
@@ -1,273 +0,0 @@
1
- import {isSpan, isTextBlock} from '@portabletext/schema'
2
- import {getFocusChild} from '../selectors/selector.get-focus-child'
3
- import {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'
4
- import {getNextBlock} from '../selectors/selector.get-next-block'
5
- import {getPreviousBlock} from '../selectors/selector.get-previous-block'
6
- import {isAtTheEndOfBlock} from '../selectors/selector.is-at-the-end-of-block'
7
- import {isAtTheStartOfBlock} from '../selectors/selector.is-at-the-start-of-block'
8
- import {getBlockEndPoint} from '../utils/util.get-block-end-point'
9
- import {getBlockStartPoint} from '../utils/util.get-block-start-point'
10
- import {isEmptyTextBlock} from '../utils/util.is-empty-text-block'
11
- import {raise} from './behavior.types.action'
12
- import {defineBehavior} from './behavior.types.behavior'
13
-
14
- export const abstractDeleteBehaviors = [
15
- defineBehavior({
16
- on: 'delete.backward',
17
- guard: ({snapshot}) => {
18
- return snapshot.context.selection
19
- },
20
- actions: [
21
- ({event}) => [
22
- raise({
23
- type: 'delete',
24
- direction: 'backward',
25
- unit: event.unit,
26
- }),
27
- ],
28
- ],
29
- }),
30
- defineBehavior({
31
- on: 'delete',
32
- guard: ({snapshot, event}) => {
33
- if (event.direction !== 'backward') {
34
- return false
35
- }
36
-
37
- const previousBlock = getPreviousBlock(snapshot)
38
- const focusTextBlock = getFocusTextBlock(snapshot)
39
-
40
- if (!previousBlock || !focusTextBlock) {
41
- return false
42
- }
43
-
44
- if (!isAtTheStartOfBlock(focusTextBlock)(snapshot)) {
45
- return false
46
- }
47
-
48
- const previousBlockEndPoint = getBlockEndPoint({
49
- context: snapshot.context,
50
- block: previousBlock,
51
- })
52
-
53
- if (!isTextBlock(snapshot.context, previousBlock.node)) {
54
- return false
55
- }
56
-
57
- return {previousBlockEndPoint, focusTextBlock}
58
- },
59
- actions: [
60
- (_, {previousBlockEndPoint, focusTextBlock}) => [
61
- raise({
62
- type: 'delete.block',
63
- at: focusTextBlock.path,
64
- }),
65
- raise({
66
- type: 'select',
67
- at: {
68
- anchor: previousBlockEndPoint,
69
- focus: previousBlockEndPoint,
70
- },
71
- }),
72
- raise({
73
- type: 'insert.block',
74
- block: focusTextBlock.node,
75
- placement: 'auto',
76
- select: 'start',
77
- }),
78
- ],
79
- ],
80
- }),
81
- defineBehavior({
82
- on: 'delete.forward',
83
- guard: ({snapshot}) => {
84
- return snapshot.context.selection
85
- },
86
- actions: [
87
- ({event}) => [
88
- raise({
89
- type: 'delete',
90
- direction: 'forward',
91
- unit: event.unit,
92
- }),
93
- ],
94
- ],
95
- }),
96
- defineBehavior({
97
- on: 'delete',
98
- guard: ({snapshot, event}) => {
99
- if (event.direction !== 'forward') {
100
- return false
101
- }
102
-
103
- const at = event.at ?? snapshot.context.selection
104
-
105
- if (!at) {
106
- return false
107
- }
108
-
109
- const nextBlock = getNextBlock({
110
- ...snapshot,
111
- context: {
112
- ...snapshot.context,
113
- selection: at,
114
- },
115
- })
116
- const focusTextBlock = getFocusTextBlock({
117
- ...snapshot,
118
- context: {
119
- ...snapshot.context,
120
- selection: at,
121
- },
122
- })
123
-
124
- if (!nextBlock || !focusTextBlock) {
125
- return false
126
- }
127
-
128
- if (!isEmptyTextBlock(snapshot.context, focusTextBlock.node)) {
129
- return false
130
- }
131
-
132
- const nextBlockStartPoint = getBlockStartPoint({
133
- context: snapshot.context,
134
- block: nextBlock,
135
- })
136
-
137
- return {focusTextBlock, nextBlockStartPoint}
138
- },
139
- actions: [
140
- (_, {focusTextBlock, nextBlockStartPoint}) => [
141
- raise({
142
- type: 'delete.block',
143
- at: focusTextBlock.path,
144
- }),
145
- raise({
146
- type: 'select',
147
- at: {
148
- anchor: nextBlockStartPoint,
149
- focus: nextBlockStartPoint,
150
- },
151
- }),
152
- ],
153
- ],
154
- }),
155
- defineBehavior({
156
- on: 'delete',
157
- guard: ({snapshot, event}) => {
158
- if (event.direction !== 'forward') {
159
- return false
160
- }
161
-
162
- const nextBlock = getNextBlock(snapshot)
163
- const focusTextBlock = getFocusTextBlock(snapshot)
164
-
165
- if (!nextBlock || !focusTextBlock) {
166
- return false
167
- }
168
-
169
- if (!isAtTheEndOfBlock(focusTextBlock)(snapshot)) {
170
- return false
171
- }
172
-
173
- if (!isTextBlock(snapshot.context, nextBlock.node)) {
174
- return false
175
- }
176
-
177
- return {nextBlock}
178
- },
179
- actions: [
180
- (_, {nextBlock}) => [
181
- raise({
182
- type: 'delete.block',
183
- at: nextBlock.path,
184
- }),
185
- raise({
186
- type: 'insert.block',
187
- block: nextBlock.node,
188
- placement: 'auto',
189
- select: 'none',
190
- }),
191
- ],
192
- ],
193
- }),
194
- defineBehavior({
195
- on: 'delete.block',
196
- actions: [
197
- ({event}) => [
198
- raise({
199
- type: 'delete',
200
- at: {
201
- anchor: {
202
- path: event.at,
203
- offset: 0,
204
- },
205
- focus: {
206
- path: event.at,
207
- offset: 0,
208
- },
209
- },
210
- unit: 'block',
211
- }),
212
- ],
213
- ],
214
- }),
215
- defineBehavior({
216
- on: 'delete.child',
217
- guard: ({snapshot, event}) => {
218
- const focusChild = getFocusChild({
219
- ...snapshot,
220
- context: {
221
- ...snapshot.context,
222
- selection: {
223
- anchor: {
224
- path: event.at,
225
- offset: 0,
226
- },
227
- focus: {
228
- path: event.at,
229
- offset: 0,
230
- },
231
- },
232
- },
233
- })
234
-
235
- if (!focusChild) {
236
- return false
237
- }
238
-
239
- if (isSpan(snapshot.context, focusChild.node)) {
240
- return {
241
- selection: {
242
- anchor: {
243
- path: event.at,
244
- offset: 0,
245
- },
246
- focus: {
247
- path: event.at,
248
- offset: focusChild.node.text.length,
249
- },
250
- },
251
- }
252
- }
253
-
254
- return {
255
- selection: {
256
- anchor: {
257
- path: event.at,
258
- offset: 0,
259
- },
260
- focus: {
261
- path: event.at,
262
- offset: 0,
263
- },
264
- },
265
- }
266
- },
267
- actions: [(_, {selection}) => [raise({type: 'delete', at: selection})]],
268
- }),
269
- defineBehavior({
270
- on: 'delete.text',
271
- actions: [({event}) => [raise({...event, type: 'delete'})]],
272
- }),
273
- ]
@@ -1,232 +0,0 @@
1
- import {isTextBlock} from '@portabletext/schema'
2
- import type {MIMEType} from '../internal-utils/mime-type'
3
- import {getActiveAnnotations} from '../selectors/selector.get-active-annotations'
4
- import {getActiveDecorators} from '../selectors/selector.get-active-decorators'
5
- import {getFocusTextBlock} from '../selectors/selector.get-focus-text-block'
6
- import {getTextBlockText} from '../utils/util.get-text-block-text'
7
- import {raise} from './behavior.types.action'
8
- import {defineBehavior} from './behavior.types.behavior'
9
-
10
- const mimeTypePriority: Array<MIMEType> = [
11
- 'application/x-portable-text',
12
- 'application/json',
13
- 'text/markdown',
14
- 'text/html',
15
- 'text/plain',
16
- ]
17
-
18
- /**
19
- * Finds the first available data from the dataTransfer based on priority.
20
- * Optionally starts from a specific mime type in the priority list.
21
- */
22
- function getFirstAvailableData({
23
- dataTransfer,
24
- startAfter,
25
- }: {
26
- dataTransfer: DataTransfer
27
- startAfter?: MIMEType
28
- }): {mimeType: MIMEType; data: string} | undefined {
29
- const startIndex = startAfter ? mimeTypePriority.indexOf(startAfter) + 1 : 0
30
-
31
- for (let index = startIndex; index < mimeTypePriority.length; index++) {
32
- const mimeType = mimeTypePriority.at(index)
33
-
34
- if (!mimeType) {
35
- continue
36
- }
37
-
38
- const data = dataTransfer.getData(mimeType)
39
-
40
- if (!data) {
41
- continue
42
- }
43
-
44
- return {
45
- mimeType,
46
- data,
47
- }
48
- }
49
-
50
- return undefined
51
- }
52
-
53
- export const abstractDeserializeBehaviors = [
54
- defineBehavior({
55
- on: 'deserialize',
56
- guard: ({event}) => {
57
- const availableData = getFirstAvailableData({
58
- dataTransfer: event.originEvent.originEvent.dataTransfer,
59
- })
60
-
61
- if (!availableData) {
62
- return false
63
- }
64
-
65
- return {
66
- type: 'deserialize.data' as const,
67
- mimeType: availableData.mimeType,
68
- data: availableData.data,
69
- originEvent: event.originEvent,
70
- }
71
- },
72
- actions: [(_, deserializeEvent) => [raise(deserializeEvent)]],
73
- }),
74
- defineBehavior({
75
- on: 'deserialize',
76
- actions: [
77
- ({event}) => [
78
- raise({
79
- type: 'deserialization.failure',
80
- mimeType: '*/*',
81
- reason: 'No Behavior was able to handle the incoming data',
82
- originEvent: event.originEvent,
83
- }),
84
- ],
85
- ],
86
- }),
87
- defineBehavior({
88
- on: 'deserialize.data',
89
- guard: ({snapshot, event}) => {
90
- const converter = snapshot.context.converters.find(
91
- (converter) => converter.mimeType === event.mimeType,
92
- )
93
-
94
- if (!converter) {
95
- return false
96
- }
97
-
98
- return converter.deserialize({
99
- snapshot,
100
- event: {
101
- type: 'deserialize',
102
- data: event.data,
103
- },
104
- })
105
- },
106
- actions: [
107
- ({event}, deserializeEvent) => [
108
- raise({
109
- ...deserializeEvent,
110
- originEvent: event.originEvent,
111
- }),
112
- ],
113
- ],
114
- }),
115
- /**
116
- * If we are pasting text/plain into a text block then we can probably
117
- * assume that the intended behavior is that the pasted text inherits
118
- * formatting from the text it's pasted into.
119
- */
120
- defineBehavior({
121
- on: 'deserialization.success',
122
- guard: ({snapshot, event}) => {
123
- const focusTextBlock = getFocusTextBlock(snapshot)
124
-
125
- if (
126
- focusTextBlock &&
127
- event.mimeType === 'text/plain' &&
128
- event.originEvent.type === 'clipboard.paste'
129
- ) {
130
- const activeDecorators = getActiveDecorators(snapshot)
131
- const activeAnnotations = getActiveAnnotations(snapshot)
132
-
133
- return {
134
- activeAnnotations,
135
- activeDecorators,
136
- textRuns: event.data.flatMap((block) =>
137
- isTextBlock(snapshot.context, block)
138
- ? [getTextBlockText(block)]
139
- : [],
140
- ),
141
- }
142
- }
143
-
144
- return false
145
- },
146
- actions: [
147
- (_, {activeAnnotations, activeDecorators, textRuns}) =>
148
- textRuns.flatMap((textRun, index) =>
149
- index !== textRuns.length - 1
150
- ? [
151
- raise({
152
- type: 'insert.span',
153
- text: textRun,
154
- decorators: activeDecorators,
155
- annotations: activeAnnotations.map(
156
- ({_key, _type, ...value}) => ({
157
- name: _type,
158
- value,
159
- }),
160
- ),
161
- }),
162
- raise({type: 'insert.break'}),
163
- ]
164
- : [
165
- raise({
166
- type: 'insert.span',
167
- text: textRun,
168
- decorators: activeDecorators,
169
- annotations: activeAnnotations.map(
170
- ({_key, _type, ...value}) => ({
171
- name: _type,
172
- value,
173
- }),
174
- ),
175
- }),
176
- ],
177
- ),
178
- ],
179
- }),
180
- defineBehavior({
181
- on: 'deserialization.success',
182
- actions: [
183
- ({event}) => [
184
- raise({
185
- type: 'insert.blocks',
186
- blocks: event.data,
187
- placement: 'auto',
188
- }),
189
- ],
190
- ],
191
- }),
192
- defineBehavior({
193
- on: 'deserialization.failure',
194
- guard: ({event}) => {
195
- if (event.mimeType === '*/*') {
196
- return false
197
- }
198
-
199
- const availableData = getFirstAvailableData({
200
- dataTransfer: event.originEvent.originEvent.dataTransfer,
201
- startAfter: event.mimeType,
202
- })
203
-
204
- if (!availableData) {
205
- return false
206
- }
207
-
208
- return {
209
- type: 'deserialize.data' as const,
210
- mimeType: availableData.mimeType,
211
- data: availableData.data,
212
- originEvent: event.originEvent,
213
- }
214
- },
215
- actions: [(_, deserializeDataEvent) => [raise(deserializeDataEvent)]],
216
- }),
217
- defineBehavior({
218
- on: 'deserialization.failure',
219
- actions: [
220
- ({event}) => [
221
- {
222
- type: 'effect',
223
- effect: () => {
224
- console.warn(
225
- `Deserialization of ${event.mimeType} failed with reason "${event.reason}"`,
226
- )
227
- },
228
- },
229
- ],
230
- ],
231
- }),
232
- ]