quoin-editor 1.8.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 (86) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/MIGRATION.md +137 -23
  3. package/README.md +8 -2
  4. package/dist/ai.cjs +34 -34
  5. package/dist/ai.js +3 -3
  6. package/dist/catalogue.cjs +21 -21
  7. package/dist/catalogue.js +12 -12
  8. package/dist/{chunk-VWYPO6SX.js → chunk-2UKI26JA.js} +5 -5
  9. package/dist/chunk-2UKI26JA.js.map +1 -0
  10. package/dist/{chunk-B3OBM6I4.cjs → chunk-4PIJC4FD.cjs} +16 -16
  11. package/dist/{chunk-5OZX2LV4.js → chunk-5X52BAZB.js} +5 -5
  12. package/dist/{chunk-5OZX2LV4.js.map → chunk-5X52BAZB.js.map} +1 -1
  13. package/dist/{chunk-PVFSJXYQ.cjs → chunk-5YAJZSTI.cjs} +18 -18
  14. package/dist/{chunk-53CNYRVQ.cjs → chunk-66OPHDFA.cjs} +50 -50
  15. package/dist/{chunk-EZX37R5D.js → chunk-6BVE46K7.js} +4 -4
  16. package/dist/{chunk-EZX37R5D.js.map → chunk-6BVE46K7.js.map} +1 -1
  17. package/dist/{chunk-MMS4D4MK.cjs → chunk-77CNOLHY.cjs} +3 -3
  18. package/dist/{chunk-DXUDBPG5.js → chunk-B4VCDJSA.js} +5 -5
  19. package/dist/{chunk-DXUDBPG5.js.map → chunk-B4VCDJSA.js.map} +1 -1
  20. package/dist/{chunk-4MCYQHFL.cjs → chunk-BYYCD54G.cjs} +2 -2
  21. package/dist/{chunk-BA5WXBGE.cjs → chunk-CJVJNMOB.cjs} +107 -101
  22. package/dist/{chunk-TQHFGSTT.cjs → chunk-D6CIIWCU.cjs} +30 -30
  23. package/dist/{chunk-NCDMQCZR.js → chunk-EU5IGKMP.js} +3 -3
  24. package/dist/{chunk-NCDMQCZR.js.map → chunk-EU5IGKMP.js.map} +1 -1
  25. package/dist/{chunk-7X3T7VXV.cjs → chunk-HOSDMHK6.cjs} +25 -25
  26. package/dist/{chunk-XKYNINUX.cjs → chunk-IKZSCTRF.cjs} +3 -3
  27. package/dist/{chunk-D4L5FINK.js → chunk-IW4TMECB.js} +3 -3
  28. package/dist/{chunk-D4L5FINK.js.map → chunk-IW4TMECB.js.map} +1 -1
  29. package/dist/{chunk-MRHDPXQ7.js → chunk-J2SVYBTC.js} +6 -6
  30. package/dist/chunk-J2SVYBTC.js.map +1 -0
  31. package/dist/{chunk-PHQMHXNG.js → chunk-KQPZTSW3.js} +4 -4
  32. package/dist/{chunk-PHQMHXNG.js.map → chunk-KQPZTSW3.js.map} +1 -1
  33. package/dist/{chunk-YVPZDTVZ.cjs → chunk-LEICOZYK.cjs} +2 -2
  34. package/dist/{chunk-SP4F5F6V.js → chunk-M77A3EGD.js} +3 -3
  35. package/dist/{chunk-SP4F5F6V.js.map → chunk-M77A3EGD.js.map} +1 -1
  36. package/dist/{chunk-VM567D6O.js → chunk-MAS4AEF4.js} +4 -4
  37. package/dist/{chunk-VM567D6O.js.map → chunk-MAS4AEF4.js.map} +1 -1
  38. package/dist/{chunk-EZWJRBQT.cjs → chunk-NFO3W644.cjs} +19 -19
  39. package/dist/{chunk-MSWA5ZZM.js → chunk-NL5J77VD.js} +202 -202
  40. package/dist/chunk-NL5J77VD.js.map +1 -0
  41. package/dist/{chunk-53FJFYBR.cjs → chunk-V4WQG7FR.cjs} +64 -64
  42. package/dist/{chunk-WOGCD7JN.js → chunk-YABGWOAV.js} +3 -3
  43. package/dist/{chunk-WOGCD7JN.js.map → chunk-YABGWOAV.js.map} +1 -1
  44. package/dist/{chunk-P6HC7RUN.cjs → chunk-Z6LAARPB.cjs} +199 -204
  45. package/dist/{chunk-Y4EJ6UBV.js → chunk-ZN5DHNSL.js} +15 -9
  46. package/dist/chunk-ZN5DHNSL.js.map +1 -0
  47. package/dist/comments.cjs +30 -30
  48. package/dist/comments.js +3 -3
  49. package/dist/diagram.cjs +6 -6
  50. package/dist/diagram.js +3 -3
  51. package/dist/embed.cjs +5 -5
  52. package/dist/embed.js +3 -3
  53. package/dist/emoji.cjs +6 -6
  54. package/dist/emoji.js +3 -3
  55. package/dist/find.cjs +7 -7
  56. package/dist/find.js +3 -3
  57. package/dist/headless.cjs +11 -31
  58. package/dist/headless.d.cts +4 -41
  59. package/dist/headless.d.ts +4 -41
  60. package/dist/headless.js +1 -1
  61. package/dist/highlight.cjs +3 -3
  62. package/dist/highlight.js +2 -2
  63. package/dist/index.cjs +23 -43
  64. package/dist/index.d.cts +1 -1
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.js +2 -2
  67. package/dist/math.cjs +6 -6
  68. package/dist/math.js +4 -4
  69. package/dist/mention.cjs +6 -6
  70. package/dist/mention.js +4 -4
  71. package/dist/presence.cjs +12 -12
  72. package/dist/presence.js +3 -3
  73. package/dist/source.cjs +2 -2
  74. package/dist/source.js +2 -2
  75. package/dist/stats.cjs +6 -6
  76. package/dist/stats.js +3 -3
  77. package/dist/styles.css +2 -2
  78. package/dist/table.cjs +22 -22
  79. package/dist/table.js +3 -3
  80. package/dist/toc.cjs +6 -6
  81. package/dist/toc.js +3 -3
  82. package/package.json +1 -1
  83. package/dist/chunk-MRHDPXQ7.js.map +0 -1
  84. package/dist/chunk-MSWA5ZZM.js.map +0 -1
  85. package/dist/chunk-VWYPO6SX.js.map +0 -1
  86. package/dist/chunk-Y4EJ6UBV.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extensions/focus/focus-decorations.ts","../src/extensions/stats/count-writing.ts","../src/extensions/limit/limit-plugin.ts","../src/extensions/stats/plain-in-code-and-math.ts","../src/extensions/stats/stats-labels.ts","../src/extensions/focus/use-focus-mode.ts","../src/extensions/limit/use-limit-announcement.ts","../src/extensions/stats/use-editor-stats.ts","../src/extensions/stats/StatsFooter.tsx","../src/extensions/stats/StatsOverlay.tsx","../src/extensions/stats/stats-extension.tsx"],"names":["characters","useEffect","jsx"],"mappings":"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","file":"chunk-WOGCD7JN.js"}
1
+ {"version":3,"sources":["../src/extensions/focus/focus-decorations.ts","../src/extensions/stats/count-writing.ts","../src/extensions/limit/limit-plugin.ts","../src/extensions/stats/plain-in-code-and-math.ts","../src/extensions/stats/stats-labels.ts","../src/extensions/focus/use-focus-mode.ts","../src/extensions/limit/use-limit-announcement.ts","../src/extensions/stats/use-editor-stats.ts","../src/extensions/stats/StatsFooter.tsx","../src/extensions/stats/StatsOverlay.tsx","../src/extensions/stats/stats-extension.tsx"],"names":["characters","useEffect","jsx"],"mappings":"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","file":"chunk-YABGWOAV.js"}
@@ -25,25 +25,6 @@ function useEditorState(controller, selector, isEqual = Object.is) {
25
25
  return react.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
26
26
  }
27
27
 
28
- // src/view/selection/selection-decorations.ts
29
- var SELECTED = { class: "quoin-selected" };
30
- function isCrossSelection(selection) {
31
- if (selection?.kind !== "text") return false;
32
- const { anchor, head } = selection;
33
- return anchor.block !== head.block || anchor.region !== head.region;
34
- }
35
- function selectionDecorations(state, mode) {
36
- if (mode !== "decorations" || !isCrossSelection(state.selection)) return [];
37
- return chunkFK7EBZPX_cjs.markRanges(state).map(({ block, region, from, to }) => ({
38
- kind: "inline",
39
- block,
40
- region,
41
- from,
42
- to,
43
- attrs: SELECTED
44
- }));
45
- }
46
-
47
28
  // src/view/dom/attributes.ts
48
29
  var sortedEntries = (attrs) => chunkI7X7B3WD_cjs.dataAttributes(attrs, "");
49
30
  function setAttributes(element, attrs, prefix = "") {
@@ -839,6 +820,25 @@ function caretPosAt(controller, host, x, y) {
839
820
  // src/view/selection/native-interaction.ts
840
821
  var NATIVE_INTERACTION = "data-quoin-native";
841
822
 
823
+ // src/view/selection/selection-decorations.ts
824
+ var SELECTED = { class: "quoin-selected" };
825
+ function isCrossSelection(selection) {
826
+ if (selection?.kind !== "text") return false;
827
+ const { anchor, head } = selection;
828
+ return anchor.block !== head.block || anchor.region !== head.region;
829
+ }
830
+ function selectionDecorations(state, mode) {
831
+ if (mode !== "decorations" || !isCrossSelection(state.selection)) return [];
832
+ return chunkFK7EBZPX_cjs.markRanges(state).map(({ block, region, from, to }) => ({
833
+ kind: "inline",
834
+ block,
835
+ region,
836
+ from,
837
+ to,
838
+ attrs: SELECTED
839
+ }));
840
+ }
841
+
842
842
  // src/view/selection/cross-block-pointer.ts
843
843
  var DRAGGING = "data-quoin-dragging";
844
844
  var DRAG_DISTANCE = 4;
@@ -1035,7 +1035,7 @@ function inPlace(element, change) {
1035
1035
  change();
1036
1036
  for (const { at, left, top } of before) {
1037
1037
  const now = scrollOf(at);
1038
- if (now.left !== left || now.top !== top) at.scrollTo({ left, top, behavior: "instant" });
1038
+ if (now.left !== left || now.top !== top) at.scrollTo?.({ left, top, behavior: "instant" });
1039
1039
  }
1040
1040
  }
1041
1041
 
@@ -1156,7 +1156,7 @@ function createNodeReveal(element) {
1156
1156
  show(selection, local) {
1157
1157
  const block = nodeOf(selection);
1158
1158
  if (block !== null && block !== pressed && (block !== shown || local && block === owed)) {
1159
- element(block)?.scrollIntoView({ block: "nearest" });
1159
+ element(block)?.scrollIntoView?.({ block: "nearest" });
1160
1160
  }
1161
1161
  if (local) owed = null;
1162
1162
  shown = block;
@@ -2158,7 +2158,7 @@ function lineInView(host, last) {
2158
2158
  const line = lineEdgeRect(host, last);
2159
2159
  const view = host.ownerDocument.defaultView;
2160
2160
  if (!line || !view || line.top >= 0 && line.bottom <= view.innerHeight) return line;
2161
- host.scrollIntoView({ block: "nearest" });
2161
+ host.scrollIntoView?.({ block: "nearest" });
2162
2162
  return lineEdgeRect(host, last);
2163
2163
  }
2164
2164
  function caretAtGoal(controller, host, at, y) {
@@ -2781,49 +2781,17 @@ function useQuoinEditor(options) {
2781
2781
  react.useEffect(() => () => controller.destroy(), [controller]);
2782
2782
  return controller;
2783
2783
  }
2784
- function useReadOnly(controller) {
2785
- const subscribe = react.useCallback((notify) => controller.subscribeReadOnly(notify), [controller]);
2786
- const read = react.useCallback(() => controller.readOnly, [controller]);
2787
- return react.useSyncExternalStore(subscribe, read, read);
2788
- }
2789
- function SelectionSink({ label = "Selected content", blockLabel }) {
2790
- const controller = useViewController();
2791
- const ref = react.useRef(null);
2792
- const readOnly = useReadOnly(controller);
2793
- const name = useEditorState(
2794
- controller,
2795
- react.useCallback((state) => selectedBlockName(state, blockLabel), [blockLabel])
2796
- );
2797
- useIsomorphicLayoutEffect(() => {
2798
- const sink = ref.current;
2799
- return sink ? controller.registerSink(sink) : void 0;
2800
- }, [controller]);
2801
- return /* @__PURE__ */ jsxRuntime.jsx(
2802
- "div",
2803
- {
2804
- ref,
2805
- contentEditable: !readOnly,
2806
- suppressContentEditableWarning: true,
2807
- role: "textbox",
2808
- "aria-label": name || label,
2809
- inputMode: name === null ? void 0 : "none",
2810
- "aria-multiline": name === null ? "true" : void 0,
2811
- "aria-readonly": readOnly ? "true" : void 0,
2812
- tabIndex: -1,
2813
- spellCheck: false,
2814
- "data-quoin-sink": "",
2815
- onFocus: () => {
2816
- if (heldBySink(controller.editor.state.selection)) focusSink(controller);
2817
- }
2818
- }
2819
- );
2820
- }
2821
2784
  var headingPlaceholder = (_state, { type, attrs }) => type === "MARKDOWN" && attrs.kind === "heading" ? `Heading ${chunkI7X7B3WD_cjs.headingLevel(attrs.level)}` : void 0;
2822
2785
  var BlockPlaceholderContext = react.createContext(headingPlaceholder);
2823
2786
  function regionPlaceholder(state, blockId, region, placeholderOf) {
2824
2787
  const block = chunkI7X7B3WD_cjs.blockById(state.doc, blockId);
2825
2788
  return block !== void 0 && chunkFK7EBZPX_cjs.primaryRegion(state.schema, block) === region ? placeholderOf(state, block) : void 0;
2826
2789
  }
2790
+ function useReadOnly(controller) {
2791
+ const subscribe = react.useCallback((notify) => controller.subscribeReadOnly(notify), [controller]);
2792
+ const read = react.useCallback(() => controller.readOnly, [controller]);
2793
+ return react.useSyncExternalStore(subscribe, read, read);
2794
+ }
2827
2795
  var samePainted = (a, b) => a.inline === b.inline && a.placeholder === b.placeholder && sameDecorations(a.decorations, b.decorations);
2828
2796
  function EditableRegion({ block, region, label, id, placeholder, className }) {
2829
2797
  const controller = useViewController();
@@ -2870,6 +2838,178 @@ function EditableRegion({ block, region, label, id, placeholder, className }) {
2870
2838
  }
2871
2839
  );
2872
2840
  }
2841
+ var BLOCK_ERROR = "Block could not be drawn";
2842
+ var BlockErrorContext = react.createContext({ label: BLOCK_ERROR });
2843
+ var BlockDomIdScope = react.createContext("quoin");
2844
+ function useBlockDomId() {
2845
+ const scope = react.useContext(BlockDomIdScope);
2846
+ return react.useCallback((block) => `${scope}-${encodeURIComponent(block)}`, [scope]);
2847
+ }
2848
+ function useRegionDomId(block, region) {
2849
+ return `${useBlockDomId()(block)}/${encodeURIComponent(region)}`;
2850
+ }
2851
+ function EmptyDocumentHost({ placeholder, label = "Paragraph" }) {
2852
+ const controller = useViewController();
2853
+ const ref = react.useRef(null);
2854
+ const readOnly = useReadOnly(controller);
2855
+ useIsomorphicLayoutEffect(() => {
2856
+ const host = ref.current;
2857
+ if (host === null) return void 0;
2858
+ renderInline(host, [], []);
2859
+ return controller.registerEmptyHost(host);
2860
+ }, [controller]);
2861
+ return /* @__PURE__ */ jsxRuntime.jsx(
2862
+ "div",
2863
+ {
2864
+ ref,
2865
+ contentEditable: !readOnly,
2866
+ suppressContentEditableWarning: true,
2867
+ role: "textbox",
2868
+ "aria-multiline": "true",
2869
+ "aria-readonly": readOnly ? "true" : void 0,
2870
+ "aria-label": label,
2871
+ "data-quoin-host": "",
2872
+ "data-quoin-empty": "",
2873
+ "data-placeholder": readOnly ? void 0 : placeholder,
2874
+ "aria-placeholder": readOnly ? void 0 : placeholder,
2875
+ spellCheck: true,
2876
+ onClick: () => ref.current?.focus()
2877
+ }
2878
+ );
2879
+ }
2880
+
2881
+ // src/view/react/focus-owners.ts
2882
+ var focusOwners = /* @__PURE__ */ new WeakMap();
2883
+
2884
+ // src/view/selection/selection-announcement.ts
2885
+ var SILENCE = { key: "", message: "" };
2886
+ function selectionAnnouncement({ doc, selection }, blocksSelected) {
2887
+ if (selection === null || selection.kind === "text" && !isCrossSelection(selection)) return SILENCE;
2888
+ if (selection.kind === "node") return { key: `node:${selection.block}`, message: blocksSelected(1) };
2889
+ const anchor = selection.kind === "blocks" ? selection.anchor : selection.anchor.block;
2890
+ const head = selection.kind === "blocks" ? selection.head : selection.head.block;
2891
+ const first = doc.index.get(anchor);
2892
+ const last = doc.index.get(head);
2893
+ if (first === void 0 || last === void 0) return SILENCE;
2894
+ const count = drawnBlockCount(doc, Math.min(first, last), Math.max(first, last) + 1);
2895
+ return { key: `${selection.kind}:${anchor}:${head}`, message: blocksSelected(count) };
2896
+ }
2897
+ function heardNow({ editor, announcer, engagement }, blocksSelected) {
2898
+ const spoken = announcer.current();
2899
+ if (spoken !== null) return { key: `said:${spoken.serial}`, message: spoken.message };
2900
+ return engagement.engaged ? selectionAnnouncement(editor.state, blocksSelected) : SILENCE;
2901
+ }
2902
+ function LiveRegion({ blocksSelected }) {
2903
+ const controller = useViewController();
2904
+ const subscribe = react.useCallback(
2905
+ (notify) => {
2906
+ const stopState = controller.editor.subscribe(() => notify());
2907
+ const stopSpoken = controller.announcer.subscribe(notify);
2908
+ const stopEngaged = controller.engagement.subscribe(notify);
2909
+ return () => {
2910
+ stopState();
2911
+ stopSpoken();
2912
+ stopEngaged();
2913
+ };
2914
+ },
2915
+ [controller]
2916
+ );
2917
+ const read = react.useMemo(() => {
2918
+ let last = SILENCE;
2919
+ return () => {
2920
+ const next = heardNow(controller, blocksSelected);
2921
+ if (next.key !== last.key || next.message !== last.message) last = next;
2922
+ return last;
2923
+ };
2924
+ }, [controller, blocksSelected]);
2925
+ const { key, message } = react.useSyncExternalStore(subscribe, read, read);
2926
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-visually-hidden", role: "status", "aria-live": "polite", "aria-atomic": "true", children: message !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { children: message }, key) });
2927
+ }
2928
+ function SelectionSink({ label = "Selected content", blockLabel }) {
2929
+ const controller = useViewController();
2930
+ const ref = react.useRef(null);
2931
+ const readOnly = useReadOnly(controller);
2932
+ const name = useEditorState(
2933
+ controller,
2934
+ react.useCallback((state) => selectedBlockName(state, blockLabel), [blockLabel])
2935
+ );
2936
+ useIsomorphicLayoutEffect(() => {
2937
+ const sink = ref.current;
2938
+ return sink ? controller.registerSink(sink) : void 0;
2939
+ }, [controller]);
2940
+ return /* @__PURE__ */ jsxRuntime.jsx(
2941
+ "div",
2942
+ {
2943
+ ref,
2944
+ contentEditable: !readOnly,
2945
+ suppressContentEditableWarning: true,
2946
+ role: "textbox",
2947
+ "aria-label": name || label,
2948
+ inputMode: name === null ? void 0 : "none",
2949
+ "aria-multiline": name === null ? "true" : void 0,
2950
+ "aria-readonly": readOnly ? "true" : void 0,
2951
+ tabIndex: -1,
2952
+ spellCheck: false,
2953
+ "data-quoin-sink": "",
2954
+ onFocus: () => {
2955
+ if (heldBySink(controller.editor.state.selection)) focusSink(controller);
2956
+ }
2957
+ }
2958
+ );
2959
+ }
2960
+
2961
+ // src/view/react/SelectionWriter.tsx
2962
+ function SelectionWriter() {
2963
+ const controller = useViewController();
2964
+ const state = useEditorState(controller, wholeState);
2965
+ useIsomorphicLayoutEffect(() => controller.afterRender(), [controller, state]);
2966
+ return null;
2967
+ }
2968
+ var UNSUPPORTED_BLOCK = "Unsupported block";
2969
+ var UnsupportedBlockLabel = react.createContext(UNSUPPORTED_BLOCK);
2970
+ var Boundary = class extends react.Component {
2971
+ state = { block: this.props.block, renderer: this.props.renderer, failed: false };
2972
+ static getDerivedStateFromError() {
2973
+ return { failed: true };
2974
+ }
2975
+ static getDerivedStateFromProps(props, state) {
2976
+ const same = props.block === state.block && props.renderer === state.renderer;
2977
+ return same ? null : { block: props.block, renderer: props.renderer, failed: false };
2978
+ }
2979
+ componentDidCatch(error) {
2980
+ this.props.report?.(error instanceof Error ? error : new Error(String(error)));
2981
+ }
2982
+ render() {
2983
+ if (!this.state.failed) return this.props.children;
2984
+ const { label } = this.props;
2985
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-void", contentEditable: false, role: "group", "aria-label": label, children: label });
2986
+ }
2987
+ };
2988
+ function BlockErrorBoundary({ block, renderer, children }) {
2989
+ const { label, report } = react.useContext(BlockErrorContext);
2990
+ return /* @__PURE__ */ jsxRuntime.jsx(Boundary, { block, renderer, label, report, children });
2991
+ }
2992
+
2993
+ // src/view/react/block-status.ts
2994
+ function within(state, index, ends) {
2995
+ const [anchor, head] = ends.map((id) => state.doc.index.get(id));
2996
+ if (anchor === void 0 || head === void 0) return false;
2997
+ return index >= Math.min(anchor, head) && index <= Math.max(anchor, head);
2998
+ }
2999
+ function covers(state, id, index) {
3000
+ const { doc, schema, selection } = state;
3001
+ if (selection === null) return false;
3002
+ if (selection.kind === "node") return selection.block === id;
3003
+ if (selection.kind === "blocks") return within(state, index, [selection.anchor, selection.head]);
3004
+ if (!isCrossSelection(selection) || chunkFK7EBZPX_cjs.isTextFlow(schema, doc.blocks[index])) return false;
3005
+ return within(state, index, [selection.anchor.block, selection.head.block]);
3006
+ }
3007
+ function blockStatus(state, id, choices = NO_CHOICES) {
3008
+ const index = state.doc.index.get(id);
3009
+ if (index === void 0) return "plain";
3010
+ if (isHiddenAt(state.doc, index, choices)) return "hidden";
3011
+ return covers(state, id, index) ? "selected" : "plain";
3012
+ }
2873
3013
  var CalloutBlock = ({ block }) => {
2874
3014
  const tone = typeof block.attrs.tone === "string" && block.attrs.tone !== "" ? block.attrs.tone : "info";
2875
3015
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-callout", "data-tone": tone, children: /* @__PURE__ */ jsxRuntime.jsx(EditableRegion, { block: block.id, region: "body", label: `Callout, ${tone}` }) });
@@ -3025,8 +3165,6 @@ var ToggleBlock = ({ block, controller }) => {
3025
3165
  /* @__PURE__ */ jsxRuntime.jsx(EditableRegion, { block: block.id, region: "text", label: "Toggle" })
3026
3166
  ] });
3027
3167
  };
3028
- var UNSUPPORTED_BLOCK = "Unsupported block";
3029
- var UnsupportedBlockLabel = react.createContext(UNSUPPORTED_BLOCK);
3030
3168
  var defaultRenderers = {
3031
3169
  MARKDOWN: MarkdownBlock,
3032
3170
  CALLOUT: CalloutBlock,
@@ -3037,59 +3175,6 @@ var VoidBlockFallback = ({ block }) => {
3037
3175
  if (block.type === "DIVIDER") return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-void", contentEditable: false, role: "separator" });
3038
3176
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-void", contentEditable: false, role: "group", "aria-label": label, children: label });
3039
3177
  };
3040
- var BLOCK_ERROR = "Block could not be drawn";
3041
- var BlockErrorContext = react.createContext({ label: BLOCK_ERROR });
3042
- var Boundary = class extends react.Component {
3043
- state = { block: this.props.block, renderer: this.props.renderer, failed: false };
3044
- static getDerivedStateFromError() {
3045
- return { failed: true };
3046
- }
3047
- static getDerivedStateFromProps(props, state) {
3048
- const same = props.block === state.block && props.renderer === state.renderer;
3049
- return same ? null : { block: props.block, renderer: props.renderer, failed: false };
3050
- }
3051
- componentDidCatch(error) {
3052
- this.props.report?.(error instanceof Error ? error : new Error(String(error)));
3053
- }
3054
- render() {
3055
- if (!this.state.failed) return this.props.children;
3056
- const { label } = this.props;
3057
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-void", contentEditable: false, role: "group", "aria-label": label, children: label });
3058
- }
3059
- };
3060
- function BlockErrorBoundary({ block, renderer, children }) {
3061
- const { label, report } = react.useContext(BlockErrorContext);
3062
- return /* @__PURE__ */ jsxRuntime.jsx(Boundary, { block, renderer, label, report, children });
3063
- }
3064
- var BlockDomIdScope = react.createContext("quoin");
3065
- function useBlockDomId() {
3066
- const scope = react.useContext(BlockDomIdScope);
3067
- return react.useCallback((block) => `${scope}-${encodeURIComponent(block)}`, [scope]);
3068
- }
3069
- function useRegionDomId(block, region) {
3070
- return `${useBlockDomId()(block)}/${encodeURIComponent(region)}`;
3071
- }
3072
-
3073
- // src/view/react/block-status.ts
3074
- function within(state, index, ends) {
3075
- const [anchor, head] = ends.map((id) => state.doc.index.get(id));
3076
- if (anchor === void 0 || head === void 0) return false;
3077
- return index >= Math.min(anchor, head) && index <= Math.max(anchor, head);
3078
- }
3079
- function covers(state, id, index) {
3080
- const { doc, schema, selection } = state;
3081
- if (selection === null) return false;
3082
- if (selection.kind === "node") return selection.block === id;
3083
- if (selection.kind === "blocks") return within(state, index, [selection.anchor, selection.head]);
3084
- if (!isCrossSelection(selection) || chunkFK7EBZPX_cjs.isTextFlow(schema, doc.blocks[index])) return false;
3085
- return within(state, index, [selection.anchor.block, selection.head.block]);
3086
- }
3087
- function blockStatus(state, id, choices = NO_CHOICES) {
3088
- const index = state.doc.index.get(id);
3089
- if (index === void 0) return "plain";
3090
- if (isHiddenAt(state.doc, index, choices)) return "hidden";
3091
- return covers(state, id, index) ? "selected" : "plain";
3092
- }
3093
3178
  var unwatched = () => () => {
3094
3179
  };
3095
3180
  function useEngaged(controller, watching) {
@@ -3143,91 +3228,6 @@ var BlockShell = react.memo(function BlockShell2({ block, renderers }) {
3143
3228
  }
3144
3229
  );
3145
3230
  });
3146
- function EmptyDocumentHost({ placeholder, label = "Paragraph" }) {
3147
- const controller = useViewController();
3148
- const ref = react.useRef(null);
3149
- const readOnly = useReadOnly(controller);
3150
- useIsomorphicLayoutEffect(() => {
3151
- const host = ref.current;
3152
- if (host === null) return void 0;
3153
- renderInline(host, [], []);
3154
- return controller.registerEmptyHost(host);
3155
- }, [controller]);
3156
- return /* @__PURE__ */ jsxRuntime.jsx(
3157
- "div",
3158
- {
3159
- ref,
3160
- contentEditable: !readOnly,
3161
- suppressContentEditableWarning: true,
3162
- role: "textbox",
3163
- "aria-multiline": "true",
3164
- "aria-readonly": readOnly ? "true" : void 0,
3165
- "aria-label": label,
3166
- "data-quoin-host": "",
3167
- "data-quoin-empty": "",
3168
- "data-placeholder": readOnly ? void 0 : placeholder,
3169
- "aria-placeholder": readOnly ? void 0 : placeholder,
3170
- spellCheck: true,
3171
- onClick: () => ref.current?.focus()
3172
- }
3173
- );
3174
- }
3175
-
3176
- // src/view/react/focus-owners.ts
3177
- var focusOwners = /* @__PURE__ */ new WeakMap();
3178
-
3179
- // src/view/selection/selection-announcement.ts
3180
- var SILENCE = { key: "", message: "" };
3181
- function selectionAnnouncement({ doc, selection }, blocksSelected) {
3182
- if (selection === null || selection.kind === "text" && !isCrossSelection(selection)) return SILENCE;
3183
- if (selection.kind === "node") return { key: `node:${selection.block}`, message: blocksSelected(1) };
3184
- const anchor = selection.kind === "blocks" ? selection.anchor : selection.anchor.block;
3185
- const head = selection.kind === "blocks" ? selection.head : selection.head.block;
3186
- const first = doc.index.get(anchor);
3187
- const last = doc.index.get(head);
3188
- if (first === void 0 || last === void 0) return SILENCE;
3189
- const count = drawnBlockCount(doc, Math.min(first, last), Math.max(first, last) + 1);
3190
- return { key: `${selection.kind}:${anchor}:${head}`, message: blocksSelected(count) };
3191
- }
3192
- function heardNow({ editor, announcer, engagement }, blocksSelected) {
3193
- const spoken = announcer.current();
3194
- if (spoken !== null) return { key: `said:${spoken.serial}`, message: spoken.message };
3195
- return engagement.engaged ? selectionAnnouncement(editor.state, blocksSelected) : SILENCE;
3196
- }
3197
- function LiveRegion({ blocksSelected }) {
3198
- const controller = useViewController();
3199
- const subscribe = react.useCallback(
3200
- (notify) => {
3201
- const stopState = controller.editor.subscribe(() => notify());
3202
- const stopSpoken = controller.announcer.subscribe(notify);
3203
- const stopEngaged = controller.engagement.subscribe(notify);
3204
- return () => {
3205
- stopState();
3206
- stopSpoken();
3207
- stopEngaged();
3208
- };
3209
- },
3210
- [controller]
3211
- );
3212
- const read = react.useMemo(() => {
3213
- let last = SILENCE;
3214
- return () => {
3215
- const next = heardNow(controller, blocksSelected);
3216
- if (next.key !== last.key || next.message !== last.message) last = next;
3217
- return last;
3218
- };
3219
- }, [controller, blocksSelected]);
3220
- const { key, message } = react.useSyncExternalStore(subscribe, read, read);
3221
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-visually-hidden", role: "status", "aria-live": "polite", "aria-atomic": "true", children: message !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { children: message }, key) });
3222
- }
3223
-
3224
- // src/view/react/SelectionWriter.tsx
3225
- function SelectionWriter() {
3226
- const controller = useViewController();
3227
- const state = useEditorState(controller, wholeState);
3228
- useIsomorphicLayoutEffect(() => controller.afterRender(), [controller, state]);
3229
- return null;
3230
- }
3231
3231
  function useBlockElements(blocks, renderers) {
3232
3232
  const [made] = react.useState(() => /* @__PURE__ */ new WeakMap());
3233
3233
  return blocks.map((block) => {
@@ -3292,20 +3292,16 @@ function EditorView({
3292
3292
  }
3293
3293
 
3294
3294
  exports.BlockErrorContext = BlockErrorContext;
3295
- exports.BlockShell = BlockShell;
3296
3295
  exports.EditableRegion = EditableRegion;
3297
3296
  exports.EditorView = EditorView;
3298
3297
  exports.NATIVE_INTERACTION = NATIVE_INTERACTION;
3299
3298
  exports.NODE_ENTRY = NODE_ENTRY;
3300
- exports.SelectionSink = SelectionSink;
3301
3299
  exports.TaskCheckbox = TaskCheckbox;
3302
3300
  exports.ToggleChevron = ToggleChevron;
3303
3301
  exports.ViewController = ViewController;
3304
- exports.VoidBlockFallback = VoidBlockFallback;
3305
3302
  exports.caretClientRect = caretClientRect;
3306
3303
  exports.caretFromPoint = caretFromPoint;
3307
3304
  exports.createAutoScroll = createAutoScroll;
3308
- exports.defaultRenderers = defaultRenderers;
3309
3305
  exports.dispatchSelection = dispatchSelection;
3310
3306
  exports.domMapOf = domMapOf;
3311
3307
  exports.domToPos = domToPos;
@@ -3314,7 +3310,6 @@ exports.focusOwners = focusOwners;
3314
3310
  exports.handleCopy = handleCopy;
3315
3311
  exports.hostKey = hostKey;
3316
3312
  exports.isComposingKey = isComposingKey;
3317
- exports.isCrossSelection = isCrossSelection;
3318
3313
  exports.isOnFirstLine = isOnFirstLine;
3319
3314
  exports.isOnLastLine = isOnLastLine;
3320
3315
  exports.lineEdgeRect = lineEdgeRect;
@@ -1,4 +1,4 @@
1
- import { useQuoinEditor, EditorView, useIsomorphicLayoutEffect, useReadOnly, useEditorState, listen, wholeState, NODE_ENTRY, useBlockDomId, useToggleOpen, ToggleChevron, EditableRegion, drawnBlockCount, isComposingKey, NATIVE_INTERACTION, useRegionDomId, TaskCheckbox, useOrderedNumber, createAutoScroll, domMapOf, dispatchSelection, regionInline, onBlock, hostKey, BlockErrorContext, textDiff, moveToNeighbour, visibleBlockIndexes } from './chunk-MSWA5ZZM.js';
1
+ import { useQuoinEditor, EditorView, useIsomorphicLayoutEffect, useReadOnly, useEditorState, listen, wholeState, NODE_ENTRY, useBlockDomId, useToggleOpen, ToggleChevron, EditableRegion, drawnBlockCount, isComposingKey, NATIVE_INTERACTION, useRegionDomId, TaskCheckbox, useOrderedNumber, createAutoScroll, domMapOf, dispatchSelection, regionInline, onBlock, hostKey, BlockErrorContext, textDiff, moveToNeighbour, visibleBlockIndexes } from './chunk-NL5J77VD.js';
2
2
  import { mergeLabels } from './chunk-DLQCTGC3.js';
3
3
  import { defineBlock, devWarn, highlightedLines, blockByType, paletteBlocks, tokenColour, seedData, parsedData } from './chunk-HDJ653LM.js';
4
4
  import { createPluginKey, coreExtensions, defineExtension, duplicateBlocks, primaryRegion, regionLength, headBlockId, sameSelection, Transaction, insertBlocksStep, startOf, replaceBlockStep, descendantsEnd, LINE_JOIN, detectMac, selectedBlockIds, blockRangeSelection, runCommands, setSelection, selectedBlockRange, toMarkdown, isCollapsed, createBlock, isParagraph, nodeSelection, setAttrsStep, LINE_SPLIT, validateSelection, endOf, insertBlockAfter, insertText, isTextFlow, markRanges, setTextAlign, orderedRange, unsetLink, textSelection, toggleMark, isActive, setBlockType, getPluginState, rangeContent, unsetMark, setMark, markExtent, setLink, deleteBlocks, setAttrs, HISTORY_GROUP, setBlockColor, removeMarkStep, caretMarks, replaceInlineStep, keyName, normalizeKey, movedBlockIds, moveBlocksUp, moveBlocksDown, selectAll, redo, undo, moveBlocksTo, indent, outdent } from './chunk-5RBMZGKV.js';
@@ -1613,7 +1613,7 @@ function revealCaret(area, drawn, mark) {
1613
1613
  const left = atLineStart ? null : caretLeft(drawn, caret);
1614
1614
  mark.style.top = `${(parseFloat(style.paddingTop) || 0) + line * (parseFloat(style.lineHeight) || 0)}px`;
1615
1615
  mark.style.left = `${left ?? 0}px`;
1616
- mark.scrollIntoView({ block: "nearest", inline: "nearest" });
1616
+ mark.scrollIntoView?.({ block: "nearest", inline: "nearest" });
1617
1617
  }
1618
1618
 
1619
1619
  // src/blocks/code/run-code-action.ts
@@ -1885,7 +1885,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
1885
1885
  const open = options.length > 0;
1886
1886
  const optionId = (index) => `${listboxId}-${index}`;
1887
1887
  useIsomorphicLayoutEffect(() => {
1888
- list.current?.querySelector('[aria-selected="true"]')?.scrollIntoView({ block: "nearest" });
1888
+ list.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
1889
1889
  }, [active]);
1890
1890
  const close = () => {
1891
1891
  setDraft(null);
@@ -3548,6 +3548,7 @@ function drawnInPlace(definitions, type) {
3548
3548
  }
3549
3549
  var drawsType = (definitions, type) => !Object.hasOwn(inPlaceRenderers, type) || blockByType(definitions, type) !== void 0;
3550
3550
  var opensEditor = (definitions, type) => drawnInPlace(definitions, type) || !drawnAsText(definitions, type, false) && blockByType(definitions, type)?.editor !== void 0;
3551
+ var definedWithoutEditor = (definitions) => Object.keys(inPlaceRenderers).filter((type) => hostDefines(definitions, type) && !opensEditor(definitions, type));
3551
3552
 
3552
3553
  // src/gutter/turn-into-targets.ts
3553
3554
  var HEADING_ICONS = [Heading1, Heading2, Heading3];
@@ -5260,7 +5261,7 @@ function SuggestionMenu(props) {
5260
5261
  const { anchor, side } = useRangeAnchor(controller, trigger);
5261
5262
  const listbox = useRef(null);
5262
5263
  useIsomorphicLayoutEffect(() => {
5263
- listbox.current?.querySelector('[aria-selected="true"]')?.scrollIntoView({ block: "nearest" });
5264
+ listbox.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
5264
5265
  }, [activeIndex, sections]);
5265
5266
  if (trigger === null) return null;
5266
5267
  const inEditor = (node) => node instanceof Node && controller.root?.contains(node) === true;
@@ -6154,7 +6155,7 @@ function revealLinkedBlock(controller, hash) {
6154
6155
  const { editor } = controller;
6155
6156
  const { doc, schema } = editor.state;
6156
6157
  editor.dispatch(editor.createTransaction().setSelection(startOf(doc, schema, id)));
6157
- shell.scrollIntoView({ block: "center" });
6158
+ shell.scrollIntoView?.({ block: "center" });
6158
6159
  return true;
6159
6160
  }
6160
6161
  function useBlockLinkTarget(controller, focusOnMount) {
@@ -6212,7 +6213,7 @@ function useStructureAnnouncements(controller, labels) {
6212
6213
  });
6213
6214
  }, [controller, labels]);
6214
6215
  }
6215
- function useTypedInPlaceWarning(definitions, readOnly) {
6216
+ function useDefinitionWarnings(definitions, readOnly) {
6216
6217
  useEffect(() => {
6217
6218
  if (readOnly) return;
6218
6219
  for (const type of definedTypedInPlace(definitions)) {
@@ -6220,6 +6221,11 @@ function useTypedInPlaceWarning(definitions, readOnly) {
6220
6221
  `the block type "${type}" has a definition of its own, which only a read-only canvas draws. An editable canvas keeps drawing ${type} blocks itself, since they are typed into in place.`
6221
6222
  );
6222
6223
  }
6224
+ for (const type of definedWithoutEditor(definitions)) {
6225
+ devWarn(
6226
+ `the block type "${type}" has a definition of its own whose preview replaces the one that edits it, so an editable canvas draws ${type} blocks nobody can write in. Quoin edits ${type} in its preview rather than in an editor: give your definition an editor of its own, or keep Quoin's and draw yours only where the canvas is read-only.`
6227
+ );
6228
+ }
6223
6229
  }, [definitions, readOnly]);
6224
6230
  }
6225
6231
  var GUTTER_ROOM = "ps-12";
@@ -6261,7 +6267,7 @@ var BlockCanvas = forwardRef(function BlockCanvas2({
6261
6267
  () => collectUi(allExtensions, blockTypes, readOnly, () => latestOnError.current),
6262
6268
  [allExtensions, blockTypes, readOnly]
6263
6269
  );
6264
- useTypedInPlaceWarning(blockTypes, readOnly);
6270
+ useDefinitionWarnings(blockTypes, readOnly);
6265
6271
  const [focusOnMount] = useState(autoFocus);
6266
6272
  const controller = useQuoinEditor({
6267
6273
  blocks,
@@ -6527,5 +6533,5 @@ function useAutosave({
6527
6533
  }
6528
6534
 
6529
6535
  export { AlignCenter, AlignLeft, AlignRight, AppWindow, ArrowDown, ArrowDownToLine, ArrowLeft, ArrowLeftToLine, ArrowRight, ArrowRightToLine, ArrowUp, ArrowUpToLine, BlockCanvas, Bookmark, Button, CODE_LANGUAGES, CaseSensitive, ChevronDown, ChevronUp, CodeBlock, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, FLOATING_TOOLBAR, FOCUS_RING, FilePickerButton, GripHorizontal, GripVertical, Input, MENU_ITEM, MenuIcon, MessageSquare, MessageSquarePlus, PenLine, Plus, Popover, PopoverAnchor, PopoverContent, QuoinProvider, Radical, Regex, SendHorizontal, Sigma, SmilePlus, Sparkles, SuggestionMenu, Table, TableOfContents, Trash, UploadField, WholeWord, X, blockFragment, bubblePart, cn, coreBlocks, dismissSuggestion, englishLabels, focusNode, formatShortcut, inlineDirection, insertBlockToWrite, insertBlocks, interceptKeys, keepFocus, linkAddress, linkedBlockId, noChange, preventDefault, rangeRect, replaceTrigger, resolveLabels, returnFocusToText, runOnBlocks, selectHandlers, selectNode, styleTargets, suggestionPlugin, toError, useAutosave, useFocusKey, useLabels, useNodeKeys, useOutsidePress, usePartAnchor, useQuoin, useRangeAnchor, useRovingFocus, virtualAnchor };
6530
- //# sourceMappingURL=chunk-Y4EJ6UBV.js.map
6531
- //# sourceMappingURL=chunk-Y4EJ6UBV.js.map
6536
+ //# sourceMappingURL=chunk-ZN5DHNSL.js.map
6537
+ //# sourceMappingURL=chunk-ZN5DHNSL.js.map