quoin-editor 1.7.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/MIGRATION.md +137 -23
  3. package/README.md +32 -11
  4. package/dist/ai-labels-BXX32H9a.d.cts +53 -0
  5. package/dist/ai-labels-BXX32H9a.d.ts +53 -0
  6. package/dist/ai.cjs +84 -86
  7. package/dist/ai.d.cts +4 -53
  8. package/dist/ai.d.ts +4 -53
  9. package/dist/ai.js +8 -10
  10. package/dist/ai.js.map +1 -1
  11. package/dist/catalogue.cjs +27 -26
  12. package/dist/catalogue.d.cts +10 -1
  13. package/dist/catalogue.d.ts +10 -1
  14. package/dist/catalogue.js +18 -17
  15. package/dist/catalogue.js.map +1 -1
  16. package/dist/{chunk-MNA7MBCH.js → chunk-2UKI26JA.js} +9 -11
  17. package/dist/chunk-2UKI26JA.js.map +1 -0
  18. package/dist/{chunk-MZXW2HXP.cjs → chunk-4PIJC4FD.cjs} +27 -29
  19. package/dist/{chunk-OS2O6IKX.js → chunk-5RBMZGKV.js} +4 -4
  20. package/dist/{chunk-OS2O6IKX.js.map → chunk-5RBMZGKV.js.map} +1 -1
  21. package/dist/{chunk-OJ4O6HWC.js → chunk-5X52BAZB.js} +10 -12
  22. package/dist/chunk-5X52BAZB.js.map +1 -0
  23. package/dist/{chunk-JY5VUHKN.cjs → chunk-5YAJZSTI.cjs} +28 -30
  24. package/dist/{chunk-YEFPH27F.cjs → chunk-66OPHDFA.cjs} +92 -94
  25. package/dist/{chunk-PWUFFHAQ.js → chunk-6BVE46K7.js} +8 -10
  26. package/dist/chunk-6BVE46K7.js.map +1 -0
  27. package/dist/{chunk-LKZJ2TDU.cjs → chunk-77CNOLHY.cjs} +10 -13
  28. package/dist/{chunk-4T4TJ2QS.cjs → chunk-7E43TURF.cjs} +7 -7
  29. package/dist/{chunk-BJTOLCRR.js → chunk-7Y4B7NHO.js} +2 -2
  30. package/dist/chunk-7Y4B7NHO.js.map +1 -0
  31. package/dist/{chunk-7GU25Z6L.js → chunk-B4VCDJSA.js} +9 -11
  32. package/dist/chunk-B4VCDJSA.js.map +1 -0
  33. package/dist/{chunk-QR2NIDUK.cjs → chunk-BYYCD54G.cjs} +2 -2
  34. package/dist/{chunk-6T5YGCZ5.cjs → chunk-CJVJNMOB.cjs} +302 -299
  35. package/dist/{chunk-CSKKSXCE.js → chunk-CSPCDVCT.js} +3 -3
  36. package/dist/{chunk-CSKKSXCE.js.map → chunk-CSPCDVCT.js.map} +1 -1
  37. package/dist/{chunk-BF7733XS.cjs → chunk-D6CIIWCU.cjs} +57 -59
  38. package/dist/{chunk-GHNQKJMD.js → chunk-DBOZFNWU.js} +3 -3
  39. package/dist/{chunk-GHNQKJMD.js.map → chunk-DBOZFNWU.js.map} +1 -1
  40. package/dist/{chunk-BM2GRZNM.cjs → chunk-DJU25PFC.cjs} +11 -11
  41. package/dist/chunk-DLQCTGC3.js +10 -0
  42. package/dist/chunk-DLQCTGC3.js.map +1 -0
  43. package/dist/{chunk-RQXJKJ5S.js → chunk-EU5IGKMP.js} +7 -10
  44. package/dist/chunk-EU5IGKMP.js.map +1 -0
  45. package/dist/{chunk-VZZPCYA3.cjs → chunk-FK7EBZPX.cjs} +226 -226
  46. package/dist/{chunk-BXSWZEA5.js → chunk-GPTJYWGS.js} +3 -3
  47. package/dist/{chunk-BXSWZEA5.js.map → chunk-GPTJYWGS.js.map} +1 -1
  48. package/dist/{chunk-I722LBD3.cjs → chunk-HOSDMHK6.cjs} +32 -34
  49. package/dist/{chunk-AZF7B2AE.cjs → chunk-IKZSCTRF.cjs} +11 -11
  50. package/dist/{chunk-R7MYG522.js → chunk-IW4TMECB.js} +3 -3
  51. package/dist/{chunk-R7MYG522.js.map → chunk-IW4TMECB.js.map} +1 -1
  52. package/dist/{chunk-PLUMKN4B.js → chunk-J2SVYBTC.js} +10 -12
  53. package/dist/chunk-J2SVYBTC.js.map +1 -0
  54. package/dist/{chunk-UZS3TW75.js → chunk-KQPZTSW3.js} +9 -11
  55. package/dist/chunk-KQPZTSW3.js.map +1 -0
  56. package/dist/{chunk-STKGRXSA.cjs → chunk-LEICOZYK.cjs} +15 -17
  57. package/dist/{chunk-H3C3MJW5.cjs → chunk-LM3DHROX.cjs} +2 -2
  58. package/dist/{chunk-AD3NY7NA.js → chunk-LSI4RMTY.js} +3 -3
  59. package/dist/{chunk-AD3NY7NA.js.map → chunk-LSI4RMTY.js.map} +1 -1
  60. package/dist/{chunk-QOIVLYMW.js → chunk-M77A3EGD.js} +5 -5
  61. package/dist/{chunk-QOIVLYMW.js.map → chunk-M77A3EGD.js.map} +1 -1
  62. package/dist/{chunk-5JEQZIRI.js → chunk-MAS4AEF4.js} +8 -10
  63. package/dist/chunk-MAS4AEF4.js.map +1 -0
  64. package/dist/{chunk-KDK2ATMB.cjs → chunk-NFO3W644.cjs} +51 -53
  65. package/dist/{chunk-XFEDJEJF.js → chunk-NL5J77VD.js} +204 -204
  66. package/dist/chunk-NL5J77VD.js.map +1 -0
  67. package/dist/{chunk-WN7BZDNH.cjs → chunk-PURYVDC3.cjs} +13 -13
  68. package/dist/{chunk-G25FMFEZ.js → chunk-UDBLZILE.js} +4 -4
  69. package/dist/{chunk-G25FMFEZ.js.map → chunk-UDBLZILE.js.map} +1 -1
  70. package/dist/{chunk-FNJOPGMN.cjs → chunk-V4WQG7FR.cjs} +116 -118
  71. package/dist/{chunk-IJKGF6SC.js → chunk-YABGWOAV.js} +8 -10
  72. package/dist/chunk-YABGWOAV.js.map +1 -0
  73. package/dist/{chunk-XZ4NC3Q7.cjs → chunk-YEDPBYO5.cjs} +4 -4
  74. package/dist/{chunk-QJ34MOFV.cjs → chunk-Z6LAARPB.cjs} +315 -320
  75. package/dist/{chunk-HSLOPJVT.js → chunk-ZN5DHNSL.js} +19 -16
  76. package/dist/chunk-ZN5DHNSL.js.map +1 -0
  77. package/dist/chunk-ZWTIRGY5.cjs +10 -0
  78. package/dist/comments-labels-DWqsSz8G.d.cts +30 -0
  79. package/dist/comments-labels-DWqsSz8G.d.ts +30 -0
  80. package/dist/comments.cjs +63 -65
  81. package/dist/comments.d.cts +4 -30
  82. package/dist/comments.d.ts +4 -30
  83. package/dist/comments.js +9 -11
  84. package/dist/comments.js.map +1 -1
  85. package/dist/{diagram-extension-Da7hp-tv.d.ts → diagram-extension-22x_njXB.d.ts} +4 -12
  86. package/dist/{diagram-extension-D573COJv.d.cts → diagram-extension-C_FSkoj9.d.cts} +4 -12
  87. package/dist/diagram-labels-Bi_jEZ8_.d.cts +11 -0
  88. package/dist/diagram-labels-Bi_jEZ8_.d.ts +11 -0
  89. package/dist/diagram.cjs +10 -9
  90. package/dist/diagram.d.cts +3 -2
  91. package/dist/diagram.d.ts +3 -2
  92. package/dist/diagram.js +7 -6
  93. package/dist/diff-labels-DWwg7N0n.d.cts +27 -0
  94. package/dist/diff-labels-DWwg7N0n.d.ts +27 -0
  95. package/dist/diff.cjs +27 -29
  96. package/dist/diff.d.cts +4 -27
  97. package/dist/diff.d.ts +4 -27
  98. package/dist/diff.js +5 -7
  99. package/dist/diff.js.map +1 -1
  100. package/dist/docx.cjs +30 -30
  101. package/dist/docx.js +3 -3
  102. package/dist/embed-labels-BiVa9HYl.d.cts +23 -0
  103. package/dist/embed-labels-BiVa9HYl.d.ts +23 -0
  104. package/dist/embed.cjs +10 -9
  105. package/dist/embed.d.cts +4 -23
  106. package/dist/embed.d.ts +4 -23
  107. package/dist/embed.js +8 -7
  108. package/dist/emoji-extension-C832oGeT.d.ts +16 -0
  109. package/dist/emoji-extension-Dk5IQLZf.d.cts +16 -0
  110. package/dist/{emoji-extension-gRKnbW8G.d.ts → emoji-labels-YwOms7ZJ.d.cts} +2 -15
  111. package/dist/{emoji-extension-C3o_Y5uC.d.cts → emoji-labels-YwOms7ZJ.d.ts} +2 -15
  112. package/dist/emoji.cjs +10 -9
  113. package/dist/emoji.d.cts +4 -3
  114. package/dist/emoji.d.ts +4 -3
  115. package/dist/emoji.js +7 -6
  116. package/dist/engine.cjs +58 -58
  117. package/dist/engine.d.cts +8 -7
  118. package/dist/engine.d.ts +8 -7
  119. package/dist/engine.js +3 -3
  120. package/dist/find-extension-BfruAPLi.d.cts +15 -0
  121. package/dist/find-extension-DmK9_N81.d.ts +15 -0
  122. package/dist/{find-extension-B_Ctrs6T.d.ts → find-labels-C4vs8Qe9.d.cts} +2 -14
  123. package/dist/{find-extension-BGGsJMu4.d.cts → find-labels-C4vs8Qe9.d.ts} +2 -14
  124. package/dist/find.cjs +11 -10
  125. package/dist/find.d.cts +2 -1
  126. package/dist/find.d.ts +2 -1
  127. package/dist/find.js +7 -6
  128. package/dist/headless.cjs +69 -89
  129. package/dist/headless.d.cts +21 -28
  130. package/dist/headless.d.ts +21 -28
  131. package/dist/headless.js +4 -4
  132. package/dist/highlight.cjs +7 -6
  133. package/dist/highlight.js +6 -5
  134. package/dist/highlight.js.map +1 -1
  135. package/dist/{index-CsG7OQoq.d.cts → index-3fYvwqUZ.d.cts} +1 -1
  136. package/dist/{index-h1llgZM-.d.ts → index-CgxnzCO5.d.ts} +1 -1
  137. package/dist/index.cjs +82 -101
  138. package/dist/index.d.cts +18 -185
  139. package/dist/index.d.ts +18 -185
  140. package/dist/index.js +6 -5
  141. package/dist/labels-BhRJYo46.d.ts +176 -0
  142. package/dist/labels-CiCxj2jP.d.cts +176 -0
  143. package/dist/locale-ar.cjs +565 -0
  144. package/dist/locale-ar.d.cts +63 -0
  145. package/dist/locale-ar.d.ts +63 -0
  146. package/dist/locale-ar.js +551 -0
  147. package/dist/locale-ar.js.map +1 -0
  148. package/dist/locale-de.cjs +510 -0
  149. package/dist/locale-de.d.cts +63 -0
  150. package/dist/locale-de.d.ts +63 -0
  151. package/dist/locale-de.js +496 -0
  152. package/dist/locale-de.js.map +1 -0
  153. package/dist/locale-es.cjs +510 -0
  154. package/dist/locale-es.d.cts +63 -0
  155. package/dist/locale-es.d.ts +63 -0
  156. package/dist/locale-es.js +496 -0
  157. package/dist/locale-es.js.map +1 -0
  158. package/dist/locale-fr.cjs +510 -0
  159. package/dist/locale-fr.d.cts +63 -0
  160. package/dist/locale-fr.d.ts +63 -0
  161. package/dist/locale-fr.js +496 -0
  162. package/dist/locale-fr.js.map +1 -0
  163. package/dist/locale-ja.cjs +505 -0
  164. package/dist/locale-ja.d.cts +63 -0
  165. package/dist/locale-ja.d.ts +63 -0
  166. package/dist/locale-ja.js +491 -0
  167. package/dist/locale-ja.js.map +1 -0
  168. package/dist/locale-pt.cjs +511 -0
  169. package/dist/locale-pt.d.cts +63 -0
  170. package/dist/locale-pt.d.ts +63 -0
  171. package/dist/locale-pt.js +497 -0
  172. package/dist/locale-pt.js.map +1 -0
  173. package/dist/locale-zh.cjs +505 -0
  174. package/dist/locale-zh.d.cts +63 -0
  175. package/dist/locale-zh.d.ts +63 -0
  176. package/dist/locale-zh.js +491 -0
  177. package/dist/locale-zh.js.map +1 -0
  178. package/dist/math-labels-DOf5KFxp.d.cts +24 -0
  179. package/dist/math-labels-DOf5KFxp.d.ts +24 -0
  180. package/dist/math.cjs +11 -10
  181. package/dist/math.d.cts +4 -24
  182. package/dist/math.d.ts +4 -24
  183. package/dist/math.js +9 -8
  184. package/dist/mention-labels-DIQy8LRT.d.cts +15 -0
  185. package/dist/mention-labels-DIQy8LRT.d.ts +15 -0
  186. package/dist/mention.cjs +11 -10
  187. package/dist/mention.d.cts +4 -15
  188. package/dist/mention.d.ts +4 -15
  189. package/dist/mention.js +9 -8
  190. package/dist/{view-controller-p-2x3J7Y.d.ts → node-reveal-BnFcnHhz.d.ts} +14 -14
  191. package/dist/{view-controller-BfVSNZYZ.d.cts → node-reveal-DY6bimv3.d.cts} +14 -14
  192. package/dist/palette-BrX-hEd-.d.cts +4 -0
  193. package/dist/palette-BrX-hEd-.d.ts +4 -0
  194. package/dist/presence-labels-DXVJLifl.d.cts +15 -0
  195. package/dist/presence-labels-DXVJLifl.d.ts +15 -0
  196. package/dist/presence.cjs +40 -42
  197. package/dist/presence.d.cts +4 -15
  198. package/dist/presence.d.ts +4 -15
  199. package/dist/presence.js +9 -11
  200. package/dist/presence.js.map +1 -1
  201. package/dist/source-labels-CeQDXsYZ.d.cts +9 -0
  202. package/dist/source-labels-CeQDXsYZ.d.ts +9 -0
  203. package/dist/source.cjs +11 -14
  204. package/dist/source.d.cts +5 -10
  205. package/dist/source.d.ts +5 -10
  206. package/dist/source.js +7 -10
  207. package/dist/source.js.map +1 -1
  208. package/dist/{stats-extension-oD6D1cYy.d.ts → stats-extension-D5HySF0a.d.cts} +4 -16
  209. package/dist/{stats-extension-XqOTvRaq.d.cts → stats-extension-Dmw0Ujxe.d.ts} +4 -16
  210. package/dist/stats-labels-W8gep51s.d.cts +15 -0
  211. package/dist/stats-labels-W8gep51s.d.ts +15 -0
  212. package/dist/stats.cjs +11 -10
  213. package/dist/stats.d.cts +3 -2
  214. package/dist/stats.d.ts +3 -2
  215. package/dist/stats.js +8 -7
  216. package/dist/styles.css +2 -2
  217. package/dist/table-extension-7LkLNK6Q.d.cts +15 -0
  218. package/dist/table-extension-DEpV0DnP.d.ts +15 -0
  219. package/dist/{table-extension-v6VB59bF.d.ts → table-labels-Dc-MzU3j.d.cts} +2 -14
  220. package/dist/{table-extension-BP47hHoz.d.cts → table-labels-Dc-MzU3j.d.ts} +2 -14
  221. package/dist/table.cjs +26 -25
  222. package/dist/table.d.cts +2 -1
  223. package/dist/table.d.ts +2 -1
  224. package/dist/table.js +7 -6
  225. package/dist/{to-html-1oD-CDle.d.cts → to-html-C19PbIzh.d.cts} +1 -0
  226. package/dist/{to-html-CLRBCX0I.d.ts → to-html-CogwrQer.d.ts} +1 -0
  227. package/dist/{to-markdown-CFPMbbiX.d.cts → to-markdown-C2w7Dzg8.d.cts} +1 -0
  228. package/dist/{to-markdown-BVOzhgVM.d.ts → to-markdown-DC1EUye5.d.ts} +1 -0
  229. package/dist/toc-extension-Dvh37bWQ.d.cts +15 -0
  230. package/dist/toc-extension-SVckrFmb.d.ts +15 -0
  231. package/dist/toc-labels-B2apPfXG.d.cts +14 -0
  232. package/dist/toc-labels-B2apPfXG.d.ts +14 -0
  233. package/dist/toc.cjs +10 -9
  234. package/dist/toc.d.cts +3 -2
  235. package/dist/toc.d.ts +3 -2
  236. package/dist/toc.js +7 -6
  237. package/dist/{types-DXF9p4qV.d.cts → types-Bzhq5AXj.d.cts} +1 -0
  238. package/dist/{types-BjLcmV00.d.ts → types-DMuuDBVh.d.ts} +1 -0
  239. package/dist/view.cjs +4 -4
  240. package/dist/view.js +2 -2
  241. package/dist/yjs.cjs +121 -121
  242. package/dist/yjs.d.cts +2 -2
  243. package/dist/yjs.d.ts +2 -2
  244. package/dist/yjs.js +5 -5
  245. package/package.json +71 -1
  246. package/dist/chunk-5JEQZIRI.js.map +0 -1
  247. package/dist/chunk-7GU25Z6L.js.map +0 -1
  248. package/dist/chunk-BJTOLCRR.js.map +0 -1
  249. package/dist/chunk-HSLOPJVT.js.map +0 -1
  250. package/dist/chunk-IJKGF6SC.js.map +0 -1
  251. package/dist/chunk-MNA7MBCH.js.map +0 -1
  252. package/dist/chunk-OJ4O6HWC.js.map +0 -1
  253. package/dist/chunk-PLUMKN4B.js.map +0 -1
  254. package/dist/chunk-PWUFFHAQ.js.map +0 -1
  255. package/dist/chunk-RQXJKJ5S.js.map +0 -1
  256. package/dist/chunk-UZS3TW75.js.map +0 -1
  257. package/dist/chunk-XFEDJEJF.js.map +0 -1
  258. package/dist/toc-extension-CI6jNOYl.d.cts +0 -26
  259. package/dist/toc-extension-CTHWjNJC.d.ts +0 -26
  260. /package/dist/{chunk-WZA5S5EJ.cjs → chunk-I7X7B3WD.cjs} +0 -0
@@ -1,5 +1,5 @@
1
- import { toggleMark, hidingToggle, isTextFlow, markRanges, toggleTask, setAttrs, runCommands, setSelection, blockRangeSelection, primaryRegion, isClosedToggle, commonPrefix, commonSuffix, deleteSelection, detectMac, sameSelection, createEditor, endOf, startOf, nodeSelection, mapSelection, textSelection, foreignOrigins, rangeContent, headBlockId, isCollapsed, redo, undo, insertHardBreak, undoInputRule, insertText, nextGraphemeOffset, prevGraphemeOffset, Transaction, replaceInlineStep, selectionRange, regionLength, deleteBackward, deleteToLineEnd, deleteToLineStart, deleteWordForward, deleteWordBackward, deleteForward } from './chunk-OS2O6IKX.js';
2
- import { alignOrUndefined, paletteOrUndefined, optionalString, headingLevel, sameItems, inlineLength, firstNamed, sameAttrs, blockById, orderedStart, nodeLength, inlineText, inlinePlainText, dataAttributes, writtenAttrs, markElement, sanitizeHref, sliceInline, requireBlockIndex } from './chunk-BJTOLCRR.js';
1
+ import { toggleMark, hidingToggle, isTextFlow, markRanges, toggleTask, setAttrs, runCommands, setSelection, blockRangeSelection, primaryRegion, isClosedToggle, commonPrefix, commonSuffix, deleteSelection, detectMac, sameSelection, createEditor, endOf, startOf, nodeSelection, mapSelection, textSelection, foreignOrigins, rangeContent, headBlockId, isCollapsed, redo, undo, insertHardBreak, undoInputRule, insertText, nextGraphemeOffset, prevGraphemeOffset, Transaction, replaceInlineStep, selectionRange, regionLength, deleteBackward, deleteToLineEnd, deleteToLineStart, deleteWordForward, deleteWordBackward, deleteForward } from './chunk-5RBMZGKV.js';
2
+ import { alignOrUndefined, paletteOrUndefined, optionalString, headingLevel, sameItems, inlineLength, firstNamed, sameAttrs, blockById, orderedStart, nodeLength, inlineText, inlinePlainText, dataAttributes, writtenAttrs, markElement, sanitizeHref, sliceInline, requireBlockIndex } from './chunk-7Y4B7NHO.js';
3
3
  import { createContext, memo, useRef, useContext, useCallback, useSyncExternalStore, useEffect, useLayoutEffect, Component, useState, useId, useMemo } from 'react';
4
4
  import { flushSync } from 'react-dom';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -23,25 +23,6 @@ function useEditorState(controller, selector, isEqual = Object.is) {
23
23
  return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
24
24
  }
25
25
 
26
- // src/view/selection/selection-decorations.ts
27
- var SELECTED = { class: "quoin-selected" };
28
- function isCrossSelection(selection) {
29
- if (selection?.kind !== "text") return false;
30
- const { anchor, head } = selection;
31
- return anchor.block !== head.block || anchor.region !== head.region;
32
- }
33
- function selectionDecorations(state, mode) {
34
- if (mode !== "decorations" || !isCrossSelection(state.selection)) return [];
35
- return markRanges(state).map(({ block, region, from, to }) => ({
36
- kind: "inline",
37
- block,
38
- region,
39
- from,
40
- to,
41
- attrs: SELECTED
42
- }));
43
- }
44
-
45
26
  // src/view/dom/attributes.ts
46
27
  var sortedEntries = (attrs) => dataAttributes(attrs, "");
47
28
  function setAttributes(element, attrs, prefix = "") {
@@ -837,6 +818,25 @@ function caretPosAt(controller, host, x, y) {
837
818
  // src/view/selection/native-interaction.ts
838
819
  var NATIVE_INTERACTION = "data-quoin-native";
839
820
 
821
+ // src/view/selection/selection-decorations.ts
822
+ var SELECTED = { class: "quoin-selected" };
823
+ function isCrossSelection(selection) {
824
+ if (selection?.kind !== "text") return false;
825
+ const { anchor, head } = selection;
826
+ return anchor.block !== head.block || anchor.region !== head.region;
827
+ }
828
+ function selectionDecorations(state, mode) {
829
+ if (mode !== "decorations" || !isCrossSelection(state.selection)) return [];
830
+ return markRanges(state).map(({ block, region, from, to }) => ({
831
+ kind: "inline",
832
+ block,
833
+ region,
834
+ from,
835
+ to,
836
+ attrs: SELECTED
837
+ }));
838
+ }
839
+
840
840
  // src/view/selection/cross-block-pointer.ts
841
841
  var DRAGGING = "data-quoin-dragging";
842
842
  var DRAG_DISTANCE = 4;
@@ -1033,7 +1033,7 @@ function inPlace(element, change) {
1033
1033
  change();
1034
1034
  for (const { at, left, top } of before) {
1035
1035
  const now = scrollOf(at);
1036
- if (now.left !== left || now.top !== top) at.scrollTo({ left, top, behavior: "instant" });
1036
+ if (now.left !== left || now.top !== top) at.scrollTo?.({ left, top, behavior: "instant" });
1037
1037
  }
1038
1038
  }
1039
1039
 
@@ -1154,7 +1154,7 @@ function createNodeReveal(element) {
1154
1154
  show(selection, local) {
1155
1155
  const block = nodeOf(selection);
1156
1156
  if (block !== null && block !== pressed && (block !== shown || local && block === owed)) {
1157
- element(block)?.scrollIntoView({ block: "nearest" });
1157
+ element(block)?.scrollIntoView?.({ block: "nearest" });
1158
1158
  }
1159
1159
  if (local) owed = null;
1160
1160
  shown = block;
@@ -2156,7 +2156,7 @@ function lineInView(host, last) {
2156
2156
  const line = lineEdgeRect(host, last);
2157
2157
  const view = host.ownerDocument.defaultView;
2158
2158
  if (!line || !view || line.top >= 0 && line.bottom <= view.innerHeight) return line;
2159
- host.scrollIntoView({ block: "nearest" });
2159
+ host.scrollIntoView?.({ block: "nearest" });
2160
2160
  return lineEdgeRect(host, last);
2161
2161
  }
2162
2162
  function caretAtGoal(controller, host, at, y) {
@@ -2779,49 +2779,17 @@ function useQuoinEditor(options) {
2779
2779
  useEffect(() => () => controller.destroy(), [controller]);
2780
2780
  return controller;
2781
2781
  }
2782
- function useReadOnly(controller) {
2783
- const subscribe = useCallback((notify) => controller.subscribeReadOnly(notify), [controller]);
2784
- const read = useCallback(() => controller.readOnly, [controller]);
2785
- return useSyncExternalStore(subscribe, read, read);
2786
- }
2787
- function SelectionSink({ label = "Selected content", blockLabel }) {
2788
- const controller = useViewController();
2789
- const ref = useRef(null);
2790
- const readOnly = useReadOnly(controller);
2791
- const name = useEditorState(
2792
- controller,
2793
- useCallback((state) => selectedBlockName(state, blockLabel), [blockLabel])
2794
- );
2795
- useIsomorphicLayoutEffect(() => {
2796
- const sink = ref.current;
2797
- return sink ? controller.registerSink(sink) : void 0;
2798
- }, [controller]);
2799
- return /* @__PURE__ */ jsx(
2800
- "div",
2801
- {
2802
- ref,
2803
- contentEditable: !readOnly,
2804
- suppressContentEditableWarning: true,
2805
- role: "textbox",
2806
- "aria-label": name || label,
2807
- inputMode: name === null ? void 0 : "none",
2808
- "aria-multiline": name === null ? "true" : void 0,
2809
- "aria-readonly": readOnly ? "true" : void 0,
2810
- tabIndex: -1,
2811
- spellCheck: false,
2812
- "data-quoin-sink": "",
2813
- onFocus: () => {
2814
- if (heldBySink(controller.editor.state.selection)) focusSink(controller);
2815
- }
2816
- }
2817
- );
2818
- }
2819
2782
  var headingPlaceholder = (_state, { type, attrs }) => type === "MARKDOWN" && attrs.kind === "heading" ? `Heading ${headingLevel(attrs.level)}` : void 0;
2820
2783
  var BlockPlaceholderContext = createContext(headingPlaceholder);
2821
2784
  function regionPlaceholder(state, blockId, region, placeholderOf) {
2822
2785
  const block = blockById(state.doc, blockId);
2823
2786
  return block !== void 0 && primaryRegion(state.schema, block) === region ? placeholderOf(state, block) : void 0;
2824
2787
  }
2788
+ function useReadOnly(controller) {
2789
+ const subscribe = useCallback((notify) => controller.subscribeReadOnly(notify), [controller]);
2790
+ const read = useCallback(() => controller.readOnly, [controller]);
2791
+ return useSyncExternalStore(subscribe, read, read);
2792
+ }
2825
2793
  var samePainted = (a, b) => a.inline === b.inline && a.placeholder === b.placeholder && sameDecorations(a.decorations, b.decorations);
2826
2794
  function EditableRegion({ block, region, label, id, placeholder, className }) {
2827
2795
  const controller = useViewController();
@@ -2868,6 +2836,178 @@ function EditableRegion({ block, region, label, id, placeholder, className }) {
2868
2836
  }
2869
2837
  );
2870
2838
  }
2839
+ var BLOCK_ERROR = "Block could not be drawn";
2840
+ var BlockErrorContext = createContext({ label: BLOCK_ERROR });
2841
+ var BlockDomIdScope = createContext("quoin");
2842
+ function useBlockDomId() {
2843
+ const scope = useContext(BlockDomIdScope);
2844
+ return useCallback((block) => `${scope}-${encodeURIComponent(block)}`, [scope]);
2845
+ }
2846
+ function useRegionDomId(block, region) {
2847
+ return `${useBlockDomId()(block)}/${encodeURIComponent(region)}`;
2848
+ }
2849
+ function EmptyDocumentHost({ placeholder, label = "Paragraph" }) {
2850
+ const controller = useViewController();
2851
+ const ref = useRef(null);
2852
+ const readOnly = useReadOnly(controller);
2853
+ useIsomorphicLayoutEffect(() => {
2854
+ const host = ref.current;
2855
+ if (host === null) return void 0;
2856
+ renderInline(host, [], []);
2857
+ return controller.registerEmptyHost(host);
2858
+ }, [controller]);
2859
+ return /* @__PURE__ */ jsx(
2860
+ "div",
2861
+ {
2862
+ ref,
2863
+ contentEditable: !readOnly,
2864
+ suppressContentEditableWarning: true,
2865
+ role: "textbox",
2866
+ "aria-multiline": "true",
2867
+ "aria-readonly": readOnly ? "true" : void 0,
2868
+ "aria-label": label,
2869
+ "data-quoin-host": "",
2870
+ "data-quoin-empty": "",
2871
+ "data-placeholder": readOnly ? void 0 : placeholder,
2872
+ "aria-placeholder": readOnly ? void 0 : placeholder,
2873
+ spellCheck: true,
2874
+ onClick: () => ref.current?.focus()
2875
+ }
2876
+ );
2877
+ }
2878
+
2879
+ // src/view/react/focus-owners.ts
2880
+ var focusOwners = /* @__PURE__ */ new WeakMap();
2881
+
2882
+ // src/view/selection/selection-announcement.ts
2883
+ var SILENCE = { key: "", message: "" };
2884
+ function selectionAnnouncement({ doc, selection }, blocksSelected) {
2885
+ if (selection === null || selection.kind === "text" && !isCrossSelection(selection)) return SILENCE;
2886
+ if (selection.kind === "node") return { key: `node:${selection.block}`, message: blocksSelected(1) };
2887
+ const anchor = selection.kind === "blocks" ? selection.anchor : selection.anchor.block;
2888
+ const head = selection.kind === "blocks" ? selection.head : selection.head.block;
2889
+ const first = doc.index.get(anchor);
2890
+ const last = doc.index.get(head);
2891
+ if (first === void 0 || last === void 0) return SILENCE;
2892
+ const count = drawnBlockCount(doc, Math.min(first, last), Math.max(first, last) + 1);
2893
+ return { key: `${selection.kind}:${anchor}:${head}`, message: blocksSelected(count) };
2894
+ }
2895
+ function heardNow({ editor, announcer, engagement }, blocksSelected) {
2896
+ const spoken = announcer.current();
2897
+ if (spoken !== null) return { key: `said:${spoken.serial}`, message: spoken.message };
2898
+ return engagement.engaged ? selectionAnnouncement(editor.state, blocksSelected) : SILENCE;
2899
+ }
2900
+ function LiveRegion({ blocksSelected }) {
2901
+ const controller = useViewController();
2902
+ const subscribe = useCallback(
2903
+ (notify) => {
2904
+ const stopState = controller.editor.subscribe(() => notify());
2905
+ const stopSpoken = controller.announcer.subscribe(notify);
2906
+ const stopEngaged = controller.engagement.subscribe(notify);
2907
+ return () => {
2908
+ stopState();
2909
+ stopSpoken();
2910
+ stopEngaged();
2911
+ };
2912
+ },
2913
+ [controller]
2914
+ );
2915
+ const read = useMemo(() => {
2916
+ let last = SILENCE;
2917
+ return () => {
2918
+ const next = heardNow(controller, blocksSelected);
2919
+ if (next.key !== last.key || next.message !== last.message) last = next;
2920
+ return last;
2921
+ };
2922
+ }, [controller, blocksSelected]);
2923
+ const { key, message } = useSyncExternalStore(subscribe, read, read);
2924
+ return /* @__PURE__ */ jsx("div", { className: "quoin-visually-hidden", role: "status", "aria-live": "polite", "aria-atomic": "true", children: message !== "" && /* @__PURE__ */ jsx("span", { children: message }, key) });
2925
+ }
2926
+ function SelectionSink({ label = "Selected content", blockLabel }) {
2927
+ const controller = useViewController();
2928
+ const ref = useRef(null);
2929
+ const readOnly = useReadOnly(controller);
2930
+ const name = useEditorState(
2931
+ controller,
2932
+ useCallback((state) => selectedBlockName(state, blockLabel), [blockLabel])
2933
+ );
2934
+ useIsomorphicLayoutEffect(() => {
2935
+ const sink = ref.current;
2936
+ return sink ? controller.registerSink(sink) : void 0;
2937
+ }, [controller]);
2938
+ return /* @__PURE__ */ jsx(
2939
+ "div",
2940
+ {
2941
+ ref,
2942
+ contentEditable: !readOnly,
2943
+ suppressContentEditableWarning: true,
2944
+ role: "textbox",
2945
+ "aria-label": name || label,
2946
+ inputMode: name === null ? void 0 : "none",
2947
+ "aria-multiline": name === null ? "true" : void 0,
2948
+ "aria-readonly": readOnly ? "true" : void 0,
2949
+ tabIndex: -1,
2950
+ spellCheck: false,
2951
+ "data-quoin-sink": "",
2952
+ onFocus: () => {
2953
+ if (heldBySink(controller.editor.state.selection)) focusSink(controller);
2954
+ }
2955
+ }
2956
+ );
2957
+ }
2958
+
2959
+ // src/view/react/SelectionWriter.tsx
2960
+ function SelectionWriter() {
2961
+ const controller = useViewController();
2962
+ const state = useEditorState(controller, wholeState);
2963
+ useIsomorphicLayoutEffect(() => controller.afterRender(), [controller, state]);
2964
+ return null;
2965
+ }
2966
+ var UNSUPPORTED_BLOCK = "Unsupported block";
2967
+ var UnsupportedBlockLabel = createContext(UNSUPPORTED_BLOCK);
2968
+ var Boundary = class extends Component {
2969
+ state = { block: this.props.block, renderer: this.props.renderer, failed: false };
2970
+ static getDerivedStateFromError() {
2971
+ return { failed: true };
2972
+ }
2973
+ static getDerivedStateFromProps(props, state) {
2974
+ const same = props.block === state.block && props.renderer === state.renderer;
2975
+ return same ? null : { block: props.block, renderer: props.renderer, failed: false };
2976
+ }
2977
+ componentDidCatch(error) {
2978
+ this.props.report?.(error instanceof Error ? error : new Error(String(error)));
2979
+ }
2980
+ render() {
2981
+ if (!this.state.failed) return this.props.children;
2982
+ const { label } = this.props;
2983
+ return /* @__PURE__ */ jsx("div", { className: "quoin-void", contentEditable: false, role: "group", "aria-label": label, children: label });
2984
+ }
2985
+ };
2986
+ function BlockErrorBoundary({ block, renderer, children }) {
2987
+ const { label, report } = useContext(BlockErrorContext);
2988
+ return /* @__PURE__ */ jsx(Boundary, { block, renderer, label, report, children });
2989
+ }
2990
+
2991
+ // src/view/react/block-status.ts
2992
+ function within(state, index, ends) {
2993
+ const [anchor, head] = ends.map((id) => state.doc.index.get(id));
2994
+ if (anchor === void 0 || head === void 0) return false;
2995
+ return index >= Math.min(anchor, head) && index <= Math.max(anchor, head);
2996
+ }
2997
+ function covers(state, id, index) {
2998
+ const { doc, schema, selection } = state;
2999
+ if (selection === null) return false;
3000
+ if (selection.kind === "node") return selection.block === id;
3001
+ if (selection.kind === "blocks") return within(state, index, [selection.anchor, selection.head]);
3002
+ if (!isCrossSelection(selection) || isTextFlow(schema, doc.blocks[index])) return false;
3003
+ return within(state, index, [selection.anchor.block, selection.head.block]);
3004
+ }
3005
+ function blockStatus(state, id, choices = NO_CHOICES) {
3006
+ const index = state.doc.index.get(id);
3007
+ if (index === void 0) return "plain";
3008
+ if (isHiddenAt(state.doc, index, choices)) return "hidden";
3009
+ return covers(state, id, index) ? "selected" : "plain";
3010
+ }
2871
3011
  var CalloutBlock = ({ block }) => {
2872
3012
  const tone = typeof block.attrs.tone === "string" && block.attrs.tone !== "" ? block.attrs.tone : "info";
2873
3013
  return /* @__PURE__ */ jsx("div", { className: "quoin-callout", "data-tone": tone, children: /* @__PURE__ */ jsx(EditableRegion, { block: block.id, region: "body", label: `Callout, ${tone}` }) });
@@ -3023,8 +3163,6 @@ var ToggleBlock = ({ block, controller }) => {
3023
3163
  /* @__PURE__ */ jsx(EditableRegion, { block: block.id, region: "text", label: "Toggle" })
3024
3164
  ] });
3025
3165
  };
3026
- var UNSUPPORTED_BLOCK = "Unsupported block";
3027
- var UnsupportedBlockLabel = createContext(UNSUPPORTED_BLOCK);
3028
3166
  var defaultRenderers = {
3029
3167
  MARKDOWN: MarkdownBlock,
3030
3168
  CALLOUT: CalloutBlock,
@@ -3035,59 +3173,6 @@ var VoidBlockFallback = ({ block }) => {
3035
3173
  if (block.type === "DIVIDER") return /* @__PURE__ */ jsx("div", { className: "quoin-void", contentEditable: false, role: "separator" });
3036
3174
  return /* @__PURE__ */ jsx("div", { className: "quoin-void", contentEditable: false, role: "group", "aria-label": label, children: label });
3037
3175
  };
3038
- var BLOCK_ERROR = "Block could not be drawn";
3039
- var BlockErrorContext = createContext({ label: BLOCK_ERROR });
3040
- var Boundary = class extends Component {
3041
- state = { block: this.props.block, renderer: this.props.renderer, failed: false };
3042
- static getDerivedStateFromError() {
3043
- return { failed: true };
3044
- }
3045
- static getDerivedStateFromProps(props, state) {
3046
- const same = props.block === state.block && props.renderer === state.renderer;
3047
- return same ? null : { block: props.block, renderer: props.renderer, failed: false };
3048
- }
3049
- componentDidCatch(error) {
3050
- this.props.report?.(error instanceof Error ? error : new Error(String(error)));
3051
- }
3052
- render() {
3053
- if (!this.state.failed) return this.props.children;
3054
- const { label } = this.props;
3055
- return /* @__PURE__ */ jsx("div", { className: "quoin-void", contentEditable: false, role: "group", "aria-label": label, children: label });
3056
- }
3057
- };
3058
- function BlockErrorBoundary({ block, renderer, children }) {
3059
- const { label, report } = useContext(BlockErrorContext);
3060
- return /* @__PURE__ */ jsx(Boundary, { block, renderer, label, report, children });
3061
- }
3062
- var BlockDomIdScope = createContext("quoin");
3063
- function useBlockDomId() {
3064
- const scope = useContext(BlockDomIdScope);
3065
- return useCallback((block) => `${scope}-${encodeURIComponent(block)}`, [scope]);
3066
- }
3067
- function useRegionDomId(block, region) {
3068
- return `${useBlockDomId()(block)}/${encodeURIComponent(region)}`;
3069
- }
3070
-
3071
- // src/view/react/block-status.ts
3072
- function within(state, index, ends) {
3073
- const [anchor, head] = ends.map((id) => state.doc.index.get(id));
3074
- if (anchor === void 0 || head === void 0) return false;
3075
- return index >= Math.min(anchor, head) && index <= Math.max(anchor, head);
3076
- }
3077
- function covers(state, id, index) {
3078
- const { doc, schema, selection } = state;
3079
- if (selection === null) return false;
3080
- if (selection.kind === "node") return selection.block === id;
3081
- if (selection.kind === "blocks") return within(state, index, [selection.anchor, selection.head]);
3082
- if (!isCrossSelection(selection) || isTextFlow(schema, doc.blocks[index])) return false;
3083
- return within(state, index, [selection.anchor.block, selection.head.block]);
3084
- }
3085
- function blockStatus(state, id, choices = NO_CHOICES) {
3086
- const index = state.doc.index.get(id);
3087
- if (index === void 0) return "plain";
3088
- if (isHiddenAt(state.doc, index, choices)) return "hidden";
3089
- return covers(state, id, index) ? "selected" : "plain";
3090
- }
3091
3176
  var unwatched = () => () => {
3092
3177
  };
3093
3178
  function useEngaged(controller, watching) {
@@ -3141,91 +3226,6 @@ var BlockShell = memo(function BlockShell2({ block, renderers }) {
3141
3226
  }
3142
3227
  );
3143
3228
  });
3144
- function EmptyDocumentHost({ placeholder, label = "Paragraph" }) {
3145
- const controller = useViewController();
3146
- const ref = useRef(null);
3147
- const readOnly = useReadOnly(controller);
3148
- useIsomorphicLayoutEffect(() => {
3149
- const host = ref.current;
3150
- if (host === null) return void 0;
3151
- renderInline(host, [], []);
3152
- return controller.registerEmptyHost(host);
3153
- }, [controller]);
3154
- return /* @__PURE__ */ jsx(
3155
- "div",
3156
- {
3157
- ref,
3158
- contentEditable: !readOnly,
3159
- suppressContentEditableWarning: true,
3160
- role: "textbox",
3161
- "aria-multiline": "true",
3162
- "aria-readonly": readOnly ? "true" : void 0,
3163
- "aria-label": label,
3164
- "data-quoin-host": "",
3165
- "data-quoin-empty": "",
3166
- "data-placeholder": readOnly ? void 0 : placeholder,
3167
- "aria-placeholder": readOnly ? void 0 : placeholder,
3168
- spellCheck: true,
3169
- onClick: () => ref.current?.focus()
3170
- }
3171
- );
3172
- }
3173
-
3174
- // src/view/react/focus-owners.ts
3175
- var focusOwners = /* @__PURE__ */ new WeakMap();
3176
-
3177
- // src/view/selection/selection-announcement.ts
3178
- var SILENCE = { key: "", message: "" };
3179
- function selectionAnnouncement({ doc, selection }, blocksSelected) {
3180
- if (selection === null || selection.kind === "text" && !isCrossSelection(selection)) return SILENCE;
3181
- if (selection.kind === "node") return { key: `node:${selection.block}`, message: blocksSelected(1) };
3182
- const anchor = selection.kind === "blocks" ? selection.anchor : selection.anchor.block;
3183
- const head = selection.kind === "blocks" ? selection.head : selection.head.block;
3184
- const first = doc.index.get(anchor);
3185
- const last = doc.index.get(head);
3186
- if (first === void 0 || last === void 0) return SILENCE;
3187
- const count = drawnBlockCount(doc, Math.min(first, last), Math.max(first, last) + 1);
3188
- return { key: `${selection.kind}:${anchor}:${head}`, message: blocksSelected(count) };
3189
- }
3190
- function heardNow({ editor, announcer, engagement }, blocksSelected) {
3191
- const spoken = announcer.current();
3192
- if (spoken !== null) return { key: `said:${spoken.serial}`, message: spoken.message };
3193
- return engagement.engaged ? selectionAnnouncement(editor.state, blocksSelected) : SILENCE;
3194
- }
3195
- function LiveRegion({ blocksSelected }) {
3196
- const controller = useViewController();
3197
- const subscribe = useCallback(
3198
- (notify) => {
3199
- const stopState = controller.editor.subscribe(() => notify());
3200
- const stopSpoken = controller.announcer.subscribe(notify);
3201
- const stopEngaged = controller.engagement.subscribe(notify);
3202
- return () => {
3203
- stopState();
3204
- stopSpoken();
3205
- stopEngaged();
3206
- };
3207
- },
3208
- [controller]
3209
- );
3210
- const read = useMemo(() => {
3211
- let last = SILENCE;
3212
- return () => {
3213
- const next = heardNow(controller, blocksSelected);
3214
- if (next.key !== last.key || next.message !== last.message) last = next;
3215
- return last;
3216
- };
3217
- }, [controller, blocksSelected]);
3218
- const { key, message } = useSyncExternalStore(subscribe, read, read);
3219
- return /* @__PURE__ */ jsx("div", { className: "quoin-visually-hidden", role: "status", "aria-live": "polite", "aria-atomic": "true", children: message !== "" && /* @__PURE__ */ jsx("span", { children: message }, key) });
3220
- }
3221
-
3222
- // src/view/react/SelectionWriter.tsx
3223
- function SelectionWriter() {
3224
- const controller = useViewController();
3225
- const state = useEditorState(controller, wholeState);
3226
- useIsomorphicLayoutEffect(() => controller.afterRender(), [controller, state]);
3227
- return null;
3228
- }
3229
3229
  function useBlockElements(blocks, renderers) {
3230
3230
  const [made] = useState(() => /* @__PURE__ */ new WeakMap());
3231
3231
  return blocks.map((block) => {
@@ -3289,6 +3289,6 @@ function EditorView({
3289
3289
  ) });
3290
3290
  }
3291
3291
 
3292
- export { BlockErrorContext, BlockShell, EditableRegion, EditorView, NATIVE_INTERACTION, NODE_ENTRY, SelectionSink, TaskCheckbox, ToggleChevron, ViewController, VoidBlockFallback, caretClientRect, caretFromPoint, createAutoScroll, defaultRenderers, dispatchSelection, domMapOf, domToPos, drawnBlockCount, focusOwners, handleCopy, hostKey, isComposingKey, isCrossSelection, isOnFirstLine, isOnLastLine, lineEdgeRect, listen, moveToNeighbour, neighbourBlock, onBlock, posToDom, regionInline, renderInline, textDiff, useBlockDomId, useEditorState, useIsomorphicLayoutEffect, useOrderedNumber, useQuoinEditor, useReadOnly, useRegionDomId, useToggleOpen, useViewController, visibleBlockIndexes, wholeState };
3293
- //# sourceMappingURL=chunk-XFEDJEJF.js.map
3294
- //# sourceMappingURL=chunk-XFEDJEJF.js.map
3292
+ export { BlockErrorContext, EditableRegion, EditorView, NATIVE_INTERACTION, NODE_ENTRY, TaskCheckbox, ToggleChevron, ViewController, caretClientRect, caretFromPoint, createAutoScroll, dispatchSelection, domMapOf, domToPos, drawnBlockCount, focusOwners, handleCopy, hostKey, isComposingKey, isOnFirstLine, isOnLastLine, lineEdgeRect, listen, moveToNeighbour, neighbourBlock, onBlock, posToDom, regionInline, renderInline, textDiff, useBlockDomId, useEditorState, useIsomorphicLayoutEffect, useOrderedNumber, useQuoinEditor, useReadOnly, useRegionDomId, useToggleOpen, useViewController, visibleBlockIndexes, wholeState };
3293
+ //# sourceMappingURL=chunk-NL5J77VD.js.map
3294
+ //# sourceMappingURL=chunk-NL5J77VD.js.map