quoin-editor 2.0.0 → 2.0.2

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 (81) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/ai.cjs +34 -34
  3. package/dist/ai.js +3 -3
  4. package/dist/catalogue.cjs +21 -21
  5. package/dist/catalogue.js +12 -12
  6. package/dist/{chunk-6BVE46K7.js → chunk-4VCCGBXW.js} +7 -5
  7. package/dist/{chunk-6BVE46K7.js.map → chunk-4VCCGBXW.js.map} +1 -1
  8. package/dist/{chunk-M77A3EGD.js → chunk-5A2MHCYI.js} +3 -3
  9. package/dist/{chunk-M77A3EGD.js.map → chunk-5A2MHCYI.js.map} +1 -1
  10. package/dist/{chunk-CJVJNMOB.cjs → chunk-5VBDRJ5Y.cjs} +133 -121
  11. package/dist/{chunk-IW4TMECB.js → chunk-AVD2AI47.js} +3 -3
  12. package/dist/{chunk-IW4TMECB.js.map → chunk-AVD2AI47.js.map} +1 -1
  13. package/dist/{chunk-YABGWOAV.js → chunk-DGKIKXB7.js} +3 -3
  14. package/dist/{chunk-YABGWOAV.js.map → chunk-DGKIKXB7.js.map} +1 -1
  15. package/dist/{chunk-MAS4AEF4.js → chunk-DT3ODGZ7.js} +4 -4
  16. package/dist/{chunk-MAS4AEF4.js.map → chunk-DT3ODGZ7.js.map} +1 -1
  17. package/dist/{chunk-IKZSCTRF.cjs → chunk-F3BC5ITU.cjs} +3 -3
  18. package/dist/{chunk-D6CIIWCU.cjs → chunk-JM5TRLEC.cjs} +30 -30
  19. package/dist/{chunk-V4WQG7FR.cjs → chunk-LBP64GKQ.cjs} +63 -63
  20. package/dist/{chunk-KQPZTSW3.js → chunk-M7L444WV.js} +4 -4
  21. package/dist/{chunk-KQPZTSW3.js.map → chunk-M7L444WV.js.map} +1 -1
  22. package/dist/{chunk-BYYCD54G.cjs → chunk-NZFGAV3L.cjs} +2 -2
  23. package/dist/{chunk-EU5IGKMP.js → chunk-OBOIZ7L3.js} +3 -3
  24. package/dist/{chunk-EU5IGKMP.js.map → chunk-OBOIZ7L3.js.map} +1 -1
  25. package/dist/{chunk-ZN5DHNSL.js → chunk-QIGZ5JAY.js} +41 -29
  26. package/dist/chunk-QIGZ5JAY.js.map +1 -0
  27. package/dist/{chunk-HOSDMHK6.cjs → chunk-RR67AKP6.cjs} +25 -25
  28. package/dist/{chunk-5YAJZSTI.cjs → chunk-RWSC47L7.cjs} +18 -18
  29. package/dist/{chunk-NL5J77VD.js → chunk-SE36LU6G.js} +19 -5
  30. package/dist/chunk-SE36LU6G.js.map +1 -0
  31. package/dist/{chunk-4PIJC4FD.cjs → chunk-SHZGRFYY.cjs} +14 -14
  32. package/dist/{chunk-NFO3W644.cjs → chunk-TDXQSNFS.cjs} +22 -20
  33. package/dist/{chunk-Z6LAARPB.cjs → chunk-UKUAQJME.cjs} +17 -3
  34. package/dist/{chunk-66OPHDFA.cjs → chunk-XC4WZTMY.cjs} +50 -50
  35. package/dist/{chunk-B4VCDJSA.js → chunk-XLR2O4OK.js} +5 -5
  36. package/dist/{chunk-B4VCDJSA.js.map → chunk-XLR2O4OK.js.map} +1 -1
  37. package/dist/{chunk-77CNOLHY.cjs → chunk-YETMZ27Q.cjs} +3 -3
  38. package/dist/{chunk-LEICOZYK.cjs → chunk-YYBPQ4TY.cjs} +2 -2
  39. package/dist/{chunk-2UKI26JA.js → chunk-Z3GLEAOI.js} +4 -4
  40. package/dist/{chunk-2UKI26JA.js.map → chunk-Z3GLEAOI.js.map} +1 -1
  41. package/dist/{chunk-J2SVYBTC.js → chunk-ZDNYIQKM.js} +4 -4
  42. package/dist/{chunk-J2SVYBTC.js.map → chunk-ZDNYIQKM.js.map} +1 -1
  43. package/dist/{chunk-5X52BAZB.js → chunk-ZHLNPNE2.js} +5 -5
  44. package/dist/{chunk-5X52BAZB.js.map → chunk-ZHLNPNE2.js.map} +1 -1
  45. package/dist/comments.cjs +30 -30
  46. package/dist/comments.js +3 -3
  47. package/dist/diagram.cjs +6 -6
  48. package/dist/diagram.js +3 -3
  49. package/dist/embed.cjs +5 -5
  50. package/dist/embed.js +3 -3
  51. package/dist/emoji-data.cjs +4 -3
  52. package/dist/emoji-data.js +4 -3
  53. package/dist/emoji-data.js.map +1 -1
  54. package/dist/emoji.cjs +6 -6
  55. package/dist/emoji.js +3 -3
  56. package/dist/find.cjs +7 -7
  57. package/dist/find.js +3 -3
  58. package/dist/headless.cjs +11 -11
  59. package/dist/headless.js +1 -1
  60. package/dist/highlight.cjs +3 -3
  61. package/dist/highlight.js +2 -2
  62. package/dist/index.cjs +23 -23
  63. package/dist/index.js +2 -2
  64. package/dist/math.cjs +6 -6
  65. package/dist/math.js +4 -4
  66. package/dist/mention.cjs +6 -6
  67. package/dist/mention.js +4 -4
  68. package/dist/presence.cjs +12 -12
  69. package/dist/presence.js +3 -3
  70. package/dist/source.cjs +2 -2
  71. package/dist/source.js +2 -2
  72. package/dist/stats.cjs +6 -6
  73. package/dist/stats.js +3 -3
  74. package/dist/styles.css +1 -1
  75. package/dist/table.cjs +22 -22
  76. package/dist/table.js +3 -3
  77. package/dist/toc.cjs +6 -6
  78. package/dist/toc.js +3 -3
  79. package/package.json +1 -1
  80. package/dist/chunk-NL5J77VD.js.map +0 -1
  81. package/dist/chunk-ZN5DHNSL.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkZ6LAARPB_cjs = require('./chunk-Z6LAARPB.cjs');
3
+ var chunkUKUAQJME_cjs = require('./chunk-UKUAQJME.cjs');
4
4
  var chunkZWTIRGY5_cjs = require('./chunk-ZWTIRGY5.cjs');
5
5
  var chunkA6PGQVTR_cjs = require('./chunk-A6PGQVTR.cjs');
6
6
  var chunkFK7EBZPX_cjs = require('./chunk-FK7EBZPX.cjs');
@@ -820,7 +820,7 @@ function selectNode(controller, blockId) {
820
820
  const { editor } = controller;
821
821
  const { selection } = editor.state;
822
822
  if (selection?.kind === "node" && selection.block === blockId) return;
823
- chunkZ6LAARPB_cjs.dispatchSelection(controller, chunkFK7EBZPX_cjs.nodeSelection(blockId));
823
+ chunkUKUAQJME_cjs.dispatchSelection(controller, chunkFK7EBZPX_cjs.nodeSelection(blockId));
824
824
  }
825
825
  function focusNode(controller, blockId) {
826
826
  selectNode(controller, blockId);
@@ -1526,7 +1526,7 @@ function codeToParagraph(blockId) {
1526
1526
  };
1527
1527
  }
1528
1528
  function leaveCode(controller, blockId, direction, addsLine = false) {
1529
- const moved = chunkZ6LAARPB_cjs.moveToNeighbour(controller, blockId, direction);
1529
+ const moved = chunkUKUAQJME_cjs.moveToNeighbour(controller, blockId, direction);
1530
1530
  if (!moved && !(addsLine && controller.run(insertBlocks([{ type: "MARKDOWN" }], "text", blockId)))) return false;
1531
1531
  controller.focus();
1532
1532
  return true;
@@ -1651,7 +1651,7 @@ function travel({ controller, blockId, area }, command) {
1651
1651
  const before = area.value;
1652
1652
  controller.run(command);
1653
1653
  const { selection } = controller.editor.state;
1654
- const edit2 = chunkZ6LAARPB_cjs.textDiff(before, area.value);
1654
+ const edit2 = chunkUKUAQJME_cjs.textDiff(before, area.value);
1655
1655
  if (selection?.kind !== "node" || selection.block !== blockId) controller.focus();
1656
1656
  else if (edit2 !== null) area.setSelectionRange(edit2.from + edit2.insert.length, edit2.from + edit2.insert.length);
1657
1657
  return true;
@@ -1736,11 +1736,11 @@ function CodeEditor({ block, controller, field, focusControls }) {
1736
1736
  useTypeIntoCode(controller, blockId, field, edit2);
1737
1737
  const onKeyDown = (event) => {
1738
1738
  const area = event.currentTarget;
1739
- if (chunkZ6LAARPB_cjs.isComposingKey(controller, event.nativeEvent)) return;
1739
+ if (chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
1740
1740
  const action = codeKeyAction(event, fieldOf(area), controller.isMac);
1741
1741
  if (action !== null && runCodeAction(action, { controller, blockId, area, edit: edit2, focusControls })) event.preventDefault();
1742
1742
  };
1743
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ...{ [chunkZ6LAARPB_cjs.NATIVE_INTERACTION]: "" }, dir: "ltr", className: "quoin-code-scroll", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-code-lines", children: [
1743
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ...{ [chunkUKUAQJME_cjs.NATIVE_INTERACTION]: "" }, dir: "ltr", className: "quoin-code-scroll", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-code-lines", children: [
1744
1744
  /* @__PURE__ */ jsxRuntime.jsx(
1745
1745
  HighlightOverlay,
1746
1746
  {
@@ -1810,7 +1810,7 @@ var Button = React7__namespace.forwardRef(function Button2({ className, variant
1810
1810
  var COPIED_FOR_MS = 1500;
1811
1811
  function CopyCodeButton({ code, controller }) {
1812
1812
  const labels = useLabels();
1813
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
1813
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
1814
1814
  const [copied, setCopied] = React7.useState(false);
1815
1815
  React7.useEffect(() => {
1816
1816
  if (!copied) return;
@@ -1893,14 +1893,14 @@ var preventDefault = (event) => event.preventDefault();
1893
1893
 
1894
1894
  // src/blocks/text/set-block-attrs.ts
1895
1895
  function setBlockAttrs(controller, blockId, patch) {
1896
- if (!controller.readOnly) controller.run(chunkZ6LAARPB_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch)));
1896
+ if (!controller.readOnly) controller.run(chunkUKUAQJME_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch)));
1897
1897
  }
1898
1898
  var FIELD = `quoin-code-language quoin-code-control ${FOCUS_RING}`;
1899
1899
  var CONTENT = `${MENU_CONTENT} flex max-h-64 w-48 flex-col overflow-y-hidden`;
1900
1900
  function LanguageCombobox({ blockId, controller, language: language2, field, onDone }) {
1901
1901
  const labels = useLabels();
1902
1902
  const listboxId = React7.useId();
1903
- const list = React7.useRef(null);
1903
+ const list2 = React7.useRef(null);
1904
1904
  const settled = React7.useRef(false);
1905
1905
  const focusedByPress = React7.useRef(false);
1906
1906
  const shown = languageName(language2) ?? language2;
@@ -1909,8 +1909,8 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
1909
1909
  const options = draft === null ? [] : languageOptions(draft === shown ? "" : draft, labels.plainText);
1910
1910
  const open = options.length > 0;
1911
1911
  const optionId = (index) => `${listboxId}-${index}`;
1912
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
1913
- list.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
1912
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
1913
+ list2.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
1914
1914
  }, [active]);
1915
1915
  const close = () => {
1916
1916
  setDraft(null);
@@ -1935,7 +1935,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
1935
1935
  onDone();
1936
1936
  };
1937
1937
  const onKeyDown = (event) => {
1938
- if (chunkZ6LAARPB_cjs.isComposingKey(controller, event.nativeEvent)) return;
1938
+ if (chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
1939
1939
  if (event.key === "ArrowDown" || event.key === "ArrowUp") {
1940
1940
  event.preventDefault();
1941
1941
  const step = event.key === "ArrowDown" ? 1 : -1;
@@ -1992,7 +1992,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
1992
1992
  className: CONTENT,
1993
1993
  onOpenAutoFocus: preventDefault,
1994
1994
  onCloseAutoFocus: preventDefault,
1995
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: list, role: "listbox", id: listboxId, "aria-label": labels.codeLanguage, className: "min-h-0 overflow-y-auto", children: options.map((option, index) => /* @__PURE__ */ jsxRuntime.jsx(
1995
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: list2, role: "listbox", id: listboxId, "aria-label": labels.codeLanguage, className: "min-h-0 overflow-y-auto", children: options.map((option, index) => /* @__PURE__ */ jsxRuntime.jsx(
1996
1996
  SuggestionOption,
1997
1997
  {
1998
1998
  id: optionId(index),
@@ -2009,7 +2009,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
2009
2009
  }
2010
2010
  var CodeBlock = ({ block, controller }) => {
2011
2011
  const labels = useLabels();
2012
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
2012
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2013
2013
  const languageField = React7.useRef(null);
2014
2014
  const codeField = React7.useRef(null);
2015
2015
  const code = chunkI7X7B3WD_cjs.str(block.attrs.code);
@@ -2111,7 +2111,7 @@ function selectHandlers(controller, blockId, root, onSelect) {
2111
2111
  return {
2112
2112
  onKeyDown(event) {
2113
2113
  const key = event.nativeEvent;
2114
- if (chunkZ6LAARPB_cjs.isComposingKey(controller, key)) return;
2114
+ if (chunkUKUAQJME_cjs.isComposingKey(controller, key)) return;
2115
2115
  if (event.key === "Escape") select();
2116
2116
  else if (!(event.metaKey || event.ctrlKey) || event.target.matches("input:not([type=file])") || !controller.edit(() => controller.editor.handleKey(key)))
2117
2117
  return;
@@ -2235,7 +2235,7 @@ function isBubblePart(element, controller) {
2235
2235
  return element?.closest(`[${BUBBLE_PART}]`)?.getAttribute(BUBBLE_PART) === partId(controller);
2236
2236
  }
2237
2237
  function focusInEditor(controller) {
2238
- const active = document.activeElement;
2238
+ const active = controller.root?.ownerDocument.activeElement ?? null;
2239
2239
  return active !== null && (controller.isEditorElement(active) || isBubblePart(active, controller));
2240
2240
  }
2241
2241
 
@@ -2248,7 +2248,7 @@ var KINDS = [
2248
2248
  [FileText, /^(text\/|(txt|md|csv|pdf|rtf|docx?)$)/]
2249
2249
  ];
2250
2250
  var kindOf = (value) => KINDS.find(([, pattern]) => pattern.test(value))?.[0];
2251
- var fileIcon = (mime, filename) => kindOf(mime) ?? kindOf(/\.([^.]+)$/.exec(filename)?.[1].toLowerCase() ?? "") ?? FileIcon;
2251
+ var fileIcon = (mime, filename) => kindOf(mime.toLowerCase()) ?? kindOf(/\.([^.]+)$/.exec(filename)?.[1].toLowerCase() ?? "") ?? FileIcon;
2252
2252
 
2253
2253
  // src/blocks/file/file-source.ts
2254
2254
  var fileName = (attrs) => chunkI7X7B3WD_cjs.str(attrs.filename) || chunkI7X7B3WD_cjs.str(attrs.storageKey);
@@ -2333,7 +2333,7 @@ var uploadFile = (controller, blockId, file, host) => uploadInto(
2333
2333
  var anyFile = () => true;
2334
2334
  var FileBlock = ({ block, controller }) => {
2335
2335
  const labels = useLabels();
2336
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
2336
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2337
2337
  const root = React7.useRef(null);
2338
2338
  const filled = hasFile(block.attrs);
2339
2339
  useNodeKeys(controller, block.id, !readOnly, !filled, root);
@@ -2485,7 +2485,7 @@ function useRovingFocus() {
2485
2485
  },
2486
2486
  [syncTabStop]
2487
2487
  );
2488
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(syncTabStop);
2488
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(syncTabStop);
2489
2489
  const onFocus = (event) => {
2490
2490
  if (!owns(event.target)) return;
2491
2491
  current.current = event.target;
@@ -2504,7 +2504,7 @@ function useRovingFocus() {
2504
2504
  // src/menus/floating/use-focus-key.ts
2505
2505
  var isFocusKey = (event) => event.key === "F10" && event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey;
2506
2506
  function useFocusKey(controller, focus) {
2507
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
2507
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
2508
2508
  const intercept = (event) => {
2509
2509
  if (!isFocusKey(event)) return false;
2510
2510
  event.preventDefault();
@@ -2516,11 +2516,11 @@ function useFocusKey(controller, focus) {
2516
2516
  }
2517
2517
  function NodeToolbar(props) {
2518
2518
  const { blockId, controller, label, anchor, items, next, buttonRefs, children, popover } = props;
2519
- const state = chunkZ6LAARPB_cjs.useEditorState(controller, chunkZ6LAARPB_cjs.wholeState);
2519
+ const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
2520
2520
  const roving = useRovingFocus();
2521
2521
  useFocusKey(controller, roving.focusCurrent);
2522
2522
  const onKeyDown = (event) => {
2523
- if (!roving.owns(event.target) || chunkZ6LAARPB_cjs.isComposingKey(controller, event.nativeEvent)) return;
2523
+ if (!roving.owns(event.target) || chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
2524
2524
  const tab = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey;
2525
2525
  const ahead = tab && !event.shiftKey && next !== void 0 ? blockPart(controller, blockId, next) : void 0;
2526
2526
  if (ahead !== void 0) ahead.focus();
@@ -2573,13 +2573,14 @@ function createSettled(controller) {
2573
2573
  return {
2574
2574
  read: () => focusInEditor(controller) && !pressed && !composing && !viewComposing(),
2575
2575
  subscribe(notify) {
2576
+ const doc = controller.root?.ownerDocument ?? document;
2576
2577
  const listeners2 = Object.entries(handlers).map(([type, handle2]) => {
2577
2578
  const listener = (event) => {
2578
2579
  handle2(event);
2579
2580
  notify();
2580
2581
  };
2581
- document.addEventListener(type, listener, true);
2582
- return () => document.removeEventListener(type, listener, true);
2582
+ doc.addEventListener(type, listener, true);
2583
+ return () => doc.removeEventListener(type, listener, true);
2583
2584
  });
2584
2585
  const stopState = controller.editor.subscribe(() => notify());
2585
2586
  return () => {
@@ -2601,8 +2602,8 @@ var selectedBlock = (type, filled) => ({ doc, selection }) => {
2601
2602
  return block?.type === type && filled(block.attrs) ? block.id : null;
2602
2603
  };
2603
2604
  function useToolbarBlock(controller, selected, keptFor = null) {
2604
- const blockId = chunkZ6LAARPB_cjs.useEditorState(controller, selected);
2605
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
2605
+ const blockId = chunkUKUAQJME_cjs.useEditorState(controller, selected);
2606
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2606
2607
  const settled = useSelectionSettled(controller);
2607
2608
  return blockId !== null && !readOnly && (settled || keptFor === blockId) ? blockId : null;
2608
2609
  }
@@ -2681,7 +2682,7 @@ function ResizeHandles({ blockId, controller, frame, percent, centred, onPreview
2681
2682
  const value = percent ?? drawn;
2682
2683
  const write = (widthPercent) => setBlockAttrs(controller, blockId, { widthPercent });
2683
2684
  const onKeyDown = (event) => {
2684
- if (chunkZ6LAARPB_cjs.isComposingKey(controller, event.nativeEvent)) return;
2685
+ if (chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
2685
2686
  const next = keyedWidth(event.key, value);
2686
2687
  if (event.key === "Escape") controller.focus();
2687
2688
  else if (next === null) return;
@@ -2723,7 +2724,7 @@ function ResizeHandles({ blockId, controller, frame, percent, centred, onPreview
2723
2724
  "aria-valuetext": labels.widthValue(value),
2724
2725
  "data-side": side,
2725
2726
  className: "quoin-image-handle",
2726
- ...{ [chunkZ6LAARPB_cjs.NATIVE_INTERACTION]: "" },
2727
+ ...{ [chunkUKUAQJME_cjs.NATIVE_INTERACTION]: "" },
2727
2728
  ...bubblePart(controller),
2728
2729
  onKeyDown,
2729
2730
  onPointerDown: onPointerDown(side),
@@ -2796,7 +2797,7 @@ function ImageFigure({ block, controller, readOnly }) {
2796
2797
  )
2797
2798
  ] }),
2798
2799
  (!readOnly || (regions.caption?.length ?? 0) > 0) && /* @__PURE__ */ jsxRuntime.jsx(
2799
- chunkZ6LAARPB_cjs.EditableRegion,
2800
+ chunkUKUAQJME_cjs.EditableRegion,
2800
2801
  {
2801
2802
  block: id,
2802
2803
  region: "caption",
@@ -2810,11 +2811,16 @@ function ImageFigure({ block, controller, readOnly }) {
2810
2811
 
2811
2812
  // src/menus/link/link-address.ts
2812
2813
  var BARE_DOMAIN = /^[^\s/#?.]\S*\.\S*$/;
2814
+ var EMAIL = /^[^\s@/]+@[^\s@/]+\.[^\s@/]+$/;
2813
2815
  var WHITESPACE = /\s/;
2816
+ function scheme(address) {
2817
+ if (EMAIL.test(address)) return `mailto:${address}`;
2818
+ return BARE_DOMAIN.test(address) ? `https://${address}` : address;
2819
+ }
2814
2820
  function linkAddress(typed2) {
2815
2821
  const address = typed2.trim();
2816
2822
  if (WHITESPACE.test(address)) return null;
2817
- const completed = !chunkI7X7B3WD_cjs.SCHEME.test(address) && BARE_DOMAIN.test(address) ? `https://${address}` : address;
2823
+ const completed = chunkI7X7B3WD_cjs.SCHEME.test(address) ? address : scheme(address);
2818
2824
  const href = chunkI7X7B3WD_cjs.sanitizeHref(completed);
2819
2825
  return href || null;
2820
2826
  }
@@ -2959,7 +2965,7 @@ function useImageKeys(controller, blockId, picture, editable, root) {
2959
2965
  }
2960
2966
  var ImageBlock = ({ block, controller }) => {
2961
2967
  const labels = useLabels();
2962
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
2968
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2963
2969
  const root = React7.useRef(null);
2964
2970
  const picture = hasPicture(block.attrs);
2965
2971
  useImageKeys(controller, block.id, picture, !readOnly, root);
@@ -2972,17 +2978,17 @@ var ImageBlock = ({ block, controller }) => {
2972
2978
  "aria-label": labels.blockNames.image,
2973
2979
  contentEditable: false,
2974
2980
  className: "quoin-image",
2975
- ...picture ? { [chunkZ6LAARPB_cjs.NODE_ENTRY]: "" } : void 0,
2981
+ ...picture ? { [chunkUKUAQJME_cjs.NODE_ENTRY]: "" } : void 0,
2976
2982
  children: picture ? /* @__PURE__ */ jsxRuntime.jsx(ImageFigure, { block, controller, readOnly }) : empty
2977
2983
  }
2978
2984
  );
2979
2985
  };
2980
2986
  function useOutsidePress(element, ownerDocument, onPress) {
2981
2987
  const latest = React7.useRef(onPress);
2982
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
2988
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
2983
2989
  latest.current = onPress;
2984
2990
  });
2985
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
2991
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
2986
2992
  const doc = ownerDocument();
2987
2993
  const inside = (target) => element.current?.contains(target) === true;
2988
2994
  let touched = null;
@@ -2997,7 +3003,7 @@ function useOutsidePress(element, ownerDocument, onPress) {
2997
3003
  if (touched !== null && !inside(event.target)) latest.current(touched);
2998
3004
  touched = null;
2999
3005
  };
3000
- return chunkZ6LAARPB_cjs.listen(doc, { pointerdown: down, click }, true);
3006
+ return chunkUKUAQJME_cjs.listen(doc, { pointerdown: down, click }, true);
3001
3007
  }, [element, ownerDocument]);
3002
3008
  }
3003
3009
  function storeAlt(controller, blockId, opened, patch) {
@@ -3005,7 +3011,7 @@ function storeAlt(controller, blockId, opened, patch) {
3005
3011
  const attrs = chunkI7X7B3WD_cjs.blockById(editor.state.doc, blockId)?.attrs ?? {};
3006
3012
  const changed = chunkI7X7B3WD_cjs.str(attrs.alt) !== opened.alt || attrs.decorative === true !== opened.decorative;
3007
3013
  if (controller.readOnly || controller.root === null || changed) return;
3008
- chunkZ6LAARPB_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch))(editor.state, (tr) => editor.dispatch(tr));
3014
+ chunkUKUAQJME_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch))(editor.state, (tr) => editor.dispatch(tr));
3009
3015
  }
3010
3016
  function AltTextPopover({ blockId, controller, anchor, opener, alt, decorative, onClose }) {
3011
3017
  const labels = useLabels();
@@ -3047,7 +3053,7 @@ function AltTextPopover({ blockId, controller, anchor, opener, alt, decorative,
3047
3053
  close(true);
3048
3054
  };
3049
3055
  const onKeyDown = (event) => {
3050
- if (event.key !== "Tab" || chunkZ6LAARPB_cjs.isComposingKey(controller, event.nativeEvent)) return;
3056
+ if (event.key !== "Tab" || chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
3051
3057
  const controls = [...event.currentTarget.elements];
3052
3058
  const next = controls[controls.indexOf(event.target) + (event.shiftKey ? -1 : 1)];
3053
3059
  event.preventDefault();
@@ -3075,7 +3081,7 @@ function AltTextPopover({ blockId, controller, anchor, opener, alt, decorative,
3075
3081
  onCloseAutoFocus: preventDefault,
3076
3082
  onEscapeKeyDown: (event) => {
3077
3083
  event.preventDefault();
3078
- if (!chunkZ6LAARPB_cjs.isComposingKey(controller, event)) close(false);
3084
+ if (!chunkUKUAQJME_cjs.isComposingKey(controller, event)) close(false);
3079
3085
  },
3080
3086
  ...bubblePart(controller),
3081
3087
  children: /* @__PURE__ */ jsxRuntime.jsxs("form", { noValidate: true, className: "quoin-image-alt", onSubmit: save, onKeyDown, children: [
@@ -3171,7 +3177,7 @@ function ImageToolbarOverlay({ controller }) {
3171
3177
  }
3172
3178
  function ImageToolbar({ blockId, controller, editingAlt, onEditAlt }) {
3173
3179
  const { labels, resolveAssetUrl } = useQuoin();
3174
- const state = chunkZ6LAARPB_cjs.useEditorState(controller, chunkZ6LAARPB_cjs.wholeState);
3180
+ const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
3175
3181
  const picker = useReplacePicker(controller, blockId, uploadImage, "image/*");
3176
3182
  const altButton = React7.useRef(null);
3177
3183
  const anchor = usePartAnchor(controller, blockId, ".quoin-image-frame");
@@ -3403,13 +3409,13 @@ function CalloutToneMenu({ blockId, controller, tone }) {
3403
3409
  }
3404
3410
  var CalloutBlock = ({ block, controller }) => {
3405
3411
  const labels = useLabels();
3406
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
3412
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
3407
3413
  const tone = calloutTone(block.attrs.tone);
3408
3414
  const icon = calloutIcon(block.attrs, tone);
3409
3415
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("quoin-callout group/callout flex items-start gap-2", TONE[tone]), "data-tone": tone, children: [
3410
3416
  readOnly ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "flex size-6 items-center justify-center text-base", children: icon }) : /* @__PURE__ */ jsxRuntime.jsx(CalloutIconMenu, { blockId: block.id, controller, icon }),
3411
3417
  /* @__PURE__ */ jsxRuntime.jsx(
3412
- chunkZ6LAARPB_cjs.EditableRegion,
3418
+ chunkUKUAQJME_cjs.EditableRegion,
3413
3419
  {
3414
3420
  block: block.id,
3415
3421
  region: "body",
@@ -3478,22 +3484,22 @@ var headingStyles = (level) => `quoin-heading mb-1 font-semibold leading-tight i
3478
3484
  function Heading({ block }) {
3479
3485
  const labels = useLabels();
3480
3486
  const level = chunkI7X7B3WD_cjs.headingLevel(block.attrs.level);
3481
- return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "heading", "aria-level": level, className: headingStyles(level), children: /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.heading(level) }) });
3487
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "heading", "aria-level": level, className: headingStyles(level), children: /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.heading(level) }) });
3482
3488
  }
3483
3489
  function NumberedItem({ block, controller }) {
3484
3490
  const labels = useLabels();
3485
- const number = chunkZ6LAARPB_cjs.useOrderedNumber(controller, block.id);
3491
+ const number = chunkUKUAQJME_cjs.useOrderedNumber(controller, block.id);
3486
3492
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-list-item", "data-list": "ordered", children: [
3487
3493
  /* @__PURE__ */ jsxRuntime.jsx(ListMarker, { list: "ordered", number, depth: block.indent }),
3488
- /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.numberedItem(number) })
3494
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.numberedItem(number) })
3489
3495
  ] });
3490
3496
  }
3491
3497
  function TaskItem({ block, controller }) {
3492
3498
  const labels = useLabels();
3493
- const hostId = chunkZ6LAARPB_cjs.useRegionDomId(block.id, REGION);
3499
+ const hostId = chunkUKUAQJME_cjs.useRegionDomId(block.id, REGION);
3494
3500
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-task", "data-checked": block.attrs.checked === true, children: [
3495
- /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.TaskCheckbox, { block, controller, label: labels.task, labelledBy: hostId }),
3496
- /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { id: hostId, block: block.id, region: REGION, label: labels.task })
3501
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.TaskCheckbox, { block, controller, label: labels.task, labelledBy: hostId }),
3502
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { id: hostId, block: block.id, region: REGION, label: labels.task })
3497
3503
  ] });
3498
3504
  }
3499
3505
  var MarkdownBlock = (props) => {
@@ -3505,16 +3511,16 @@ var MarkdownBlock = (props) => {
3505
3511
  case "bullet":
3506
3512
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-list-item", "data-list": "bullet", children: [
3507
3513
  /* @__PURE__ */ jsxRuntime.jsx(ListMarker, { list: "bullet", depth: block.indent }),
3508
- /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.bulletItem })
3514
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.bulletItem })
3509
3515
  ] });
3510
3516
  case "ordered":
3511
3517
  return /* @__PURE__ */ jsxRuntime.jsx(NumberedItem, { ...props });
3512
3518
  case "task":
3513
3519
  return /* @__PURE__ */ jsxRuntime.jsx(TaskItem, { ...props });
3514
3520
  case "quote":
3515
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-quote", children: /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.quote }) });
3521
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-quote", children: /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.quote }) });
3516
3522
  default:
3517
- return /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.paragraph });
3523
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.paragraph });
3518
3524
  }
3519
3525
  };
3520
3526
 
@@ -3525,16 +3531,16 @@ function nestedBlockIds({ doc }, blockId) {
3525
3531
  return doc.blocks.slice(index + 1, chunkFK7EBZPX_cjs.descendantsEnd(doc, index)).map((block) => block.id);
3526
3532
  }
3527
3533
  function useNestedBlocks(controller, blockId) {
3528
- return chunkZ6LAARPB_cjs.useEditorState(controller, (state) => nestedBlockIds(state, blockId), chunkI7X7B3WD_cjs.sameItems);
3534
+ return chunkUKUAQJME_cjs.useEditorState(controller, (state) => nestedBlockIds(state, blockId), chunkI7X7B3WD_cjs.sameItems);
3529
3535
  }
3530
3536
  var ToggleBlock = ({ block, controller }) => {
3531
3537
  const labels = useLabels();
3532
- const domId = chunkZ6LAARPB_cjs.useBlockDomId();
3538
+ const domId = chunkUKUAQJME_cjs.useBlockDomId();
3533
3539
  const nested = useNestedBlocks(controller, block.id);
3534
- const open = chunkZ6LAARPB_cjs.useToggleOpen(controller, block);
3540
+ const open = chunkUKUAQJME_cjs.useToggleOpen(controller, block);
3535
3541
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-toggle", "data-open": open, children: [
3536
3542
  /* @__PURE__ */ jsxRuntime.jsx(
3537
- chunkZ6LAARPB_cjs.ToggleChevron,
3543
+ chunkUKUAQJME_cjs.ToggleChevron,
3538
3544
  {
3539
3545
  block,
3540
3546
  controller,
@@ -3542,7 +3548,7 @@ var ToggleBlock = ({ block, controller }) => {
3542
3548
  controls: nested.length === 0 ? void 0 : nested.map(domId).join(" ")
3543
3549
  }
3544
3550
  ),
3545
- /* @__PURE__ */ jsxRuntime.jsx(chunkZ6LAARPB_cjs.EditableRegion, { block: block.id, region: "text", label: labels.toggle })
3551
+ /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: "text", label: labels.toggle })
3546
3552
  ] });
3547
3553
  };
3548
3554
 
@@ -3639,7 +3645,7 @@ function ActionItem({ kit, controller, action, blockIds }) {
3639
3645
  );
3640
3646
  }
3641
3647
  function BlockMenuItems({ kit, controller, blocks, styled, title, actions }) {
3642
- const state = chunkZ6LAARPB_cjs.useEditorState(controller, chunkZ6LAARPB_cjs.wholeState);
3648
+ const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
3643
3649
  const blockIds = blocks.map((block) => block.id);
3644
3650
  const shown = actions.filter((action) => action.available?.(state, blockIds) ?? true);
3645
3651
  const anyText = styled.some((block) => chunkFK7EBZPX_cjs.isTextFlow(state.schema, block));
@@ -3684,7 +3690,7 @@ var CONTEXT_KIT = {
3684
3690
  SubTrigger: ContextMenuSubTrigger
3685
3691
  };
3686
3692
  var GUTTER_BLOCK = "data-quoin-gutter-block";
3687
- var OWN_MENU = `[${chunkZ6LAARPB_cjs.NATIVE_INTERACTION}], input, textarea, select`;
3693
+ var OWN_MENU = `[${chunkUKUAQJME_cjs.NATIVE_INTERACTION}], input, textarea, select`;
3688
3694
  function contextBlock(controller, target) {
3689
3695
  const { state } = controller.editor;
3690
3696
  const gutter = target.closest(`[${GUTTER_BLOCK}]`)?.getAttribute(GUTTER_BLOCK);
@@ -3713,7 +3719,7 @@ function useContextMenuOpener(controller, store, trigger) {
3713
3719
  openBlockMenuAt(store, controller.editor.state, block, clientX, clientY);
3714
3720
  hidden.dispatchEvent(new MouseEvent("contextmenu", { bubbles: true, cancelable: true, clientX, clientY }));
3715
3721
  };
3716
- return chunkZ6LAARPB_cjs.listen(root, { mousedown: onMouseDown, contextmenu: onContextMenu });
3722
+ return chunkUKUAQJME_cjs.listen(root, { mousedown: onMouseDown, contextmenu: onContextMenu });
3717
3723
  }, [controller, store, trigger]);
3718
3724
  }
3719
3725
 
@@ -3749,7 +3755,7 @@ function useLiveBlocks(controller, blockIds) {
3749
3755
  (state) => blockIds.flatMap((id) => chunkI7X7B3WD_cjs.blockById(state.doc, id) ?? []),
3750
3756
  [blockIds]
3751
3757
  );
3752
- return chunkZ6LAARPB_cjs.useEditorState(controller, select, chunkI7X7B3WD_cjs.sameItems);
3758
+ return chunkUKUAQJME_cjs.useEditorState(controller, select, chunkI7X7B3WD_cjs.sameItems);
3753
3759
  }
3754
3760
  function useMenuBlocks(controller, store, menu) {
3755
3761
  const labels = useLabels();
@@ -3876,7 +3882,7 @@ var DragOverlay = React7.forwardRef(function DragOverlay2(_props, ref) {
3876
3882
  var DELETION_STEPS = /* @__PURE__ */ new Set(["removeBlocks", "setIndent"]);
3877
3883
  function drawnPosition(doc, blockId) {
3878
3884
  const index = doc.index.get(blockId) ?? 0;
3879
- return [chunkZ6LAARPB_cjs.drawnBlockCount(doc, 0, index) + 1, chunkZ6LAARPB_cjs.drawnBlockCount(doc)];
3885
+ return [chunkUKUAQJME_cjs.drawnBlockCount(doc, 0, index) + 1, chunkUKUAQJME_cjs.drawnBlockCount(doc)];
3880
3886
  }
3881
3887
  function blockMovedMessage(doc, blockId, labels) {
3882
3888
  return labels.blockMoved(...drawnPosition(doc, blockId));
@@ -3892,7 +3898,7 @@ function deletedCount(tr) {
3892
3898
  return tr.steps.reduce((deleted, step, i) => {
3893
3899
  const { index, count } = step.toJSON();
3894
3900
  if (step.stepType !== "removeBlocks" || typeof index !== "number" || typeof count !== "number") return deleted;
3895
- return deleted + chunkZ6LAARPB_cjs.drawnBlockCount(tr.docs[i], index, index + count);
3901
+ return deleted + chunkUKUAQJME_cjs.drawnBlockCount(tr.docs[i], index, index + count);
3896
3902
  }, 0);
3897
3903
  }
3898
3904
  function insertedBlock(tr) {
@@ -3934,7 +3940,7 @@ function inlineEdges(shell, box, rtl) {
3934
3940
  function measure(controller, root, moved, rtl) {
3935
3941
  const { doc } = controller.editor.state;
3936
3942
  const origin = rootOrigin(root);
3937
- return chunkZ6LAARPB_cjs.visibleBlockIndexes(doc).flatMap((index) => {
3943
+ return chunkUKUAQJME_cjs.visibleBlockIndexes(doc).flatMap((index) => {
3938
3944
  const { id, indent: indent3 } = doc.blocks[index];
3939
3945
  const shell = controller.blockElement(id);
3940
3946
  if (shell === void 0) return [];
@@ -4009,7 +4015,7 @@ function draggedBlocks(controller, blockId) {
4009
4015
  function followPress(press, root, view) {
4010
4016
  const { controller, store, overlay, handle: handle2, pointerId } = press;
4011
4017
  const doc = view.document;
4012
- const scroll = chunkZ6LAARPB_cjs.createAutoScroll(root, follow, SCROLL_EDGE);
4018
+ const scroll = chunkUKUAQJME_cjs.createAutoScroll(root, follow, SCROLL_EDGE);
4013
4019
  let pointer = { x: press.x, y: press.y };
4014
4020
  let active = null;
4015
4021
  let unsubscribe = () => {
@@ -4039,7 +4045,7 @@ function followPress(press, root, view) {
4039
4045
  overlay.follow(dx, pointer.y - press.y);
4040
4046
  overlay.mark({ top: target.lineTop, ...spanBetween(target.lineStart, layout.end) });
4041
4047
  if (!sameTarget(active.target, target)) {
4042
- store.set({ drag: { blockIds: ids, targetIndex: target.index, targetIndent: target.indent } });
4048
+ store.set({ drag: { blockIds: ids, targetIndent: target.indent } });
4043
4049
  }
4044
4050
  active.target = target;
4045
4051
  }
@@ -4084,9 +4090,9 @@ function followPress(press, root, view) {
4084
4090
  event.stopPropagation();
4085
4091
  finish();
4086
4092
  }
4087
- const unlistenDocument = chunkZ6LAARPB_cjs.listen(doc, { pointermove: onPointerMove, pointerup: onPointerUp, pointercancel: finish });
4088
- const unlistenBlur = chunkZ6LAARPB_cjs.listen(view, { blur: finish });
4089
- const unlistenKeys = chunkZ6LAARPB_cjs.listen(view, { keydown: onKeyDown }, true);
4093
+ const unlistenDocument = chunkUKUAQJME_cjs.listen(doc, { pointermove: onPointerMove, pointerup: onPointerUp, pointercancel: finish });
4094
+ const unlistenBlur = chunkUKUAQJME_cjs.listen(view, { blur: finish });
4095
+ const unlistenKeys = chunkUKUAQJME_cjs.listen(view, { keydown: onKeyDown }, true);
4090
4096
  return finish;
4091
4097
  }
4092
4098
  function pressDragHandle(press) {
@@ -4221,7 +4227,7 @@ function place2(controller, root, gutter, block) {
4221
4227
  gutter.style.visibility = "";
4222
4228
  }
4223
4229
  function useGutterPosition(controller, gutter, block) {
4224
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
4230
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
4225
4231
  const element = gutter.current;
4226
4232
  const root = controller.root;
4227
4233
  const view = root?.ownerDocument.defaultView;
@@ -4253,7 +4259,7 @@ function blockAcross(controller, root, y) {
4253
4259
  }
4254
4260
  function useGutterTarget(controller, store, gutter) {
4255
4261
  const hovered = useCanvasUi(store, (state) => state.hoveredBlock);
4256
- const head = chunkZ6LAARPB_cjs.useEditorState(controller, headOf);
4262
+ const head = chunkUKUAQJME_cjs.useEditorState(controller, headOf);
4257
4263
  const [focusWithin, setFocusWithin] = React7.useState(false);
4258
4264
  React7.useEffect(() => {
4259
4265
  const root = controller.root;
@@ -4271,7 +4277,7 @@ function useGutterTarget(controller, store, gutter) {
4271
4277
  const onFocusIn = () => setFocusWithin(true);
4272
4278
  const onFocusOut = (event) => setFocusWithin(root.contains(event.relatedTarget));
4273
4279
  setFocusWithin(root.contains(root.ownerDocument.activeElement));
4274
- return chunkZ6LAARPB_cjs.listen(root, { pointermove: onPointerMove, pointerleave: onPointerLeave, focusin: onFocusIn, focusout: onFocusOut });
4280
+ return chunkUKUAQJME_cjs.listen(root, { pointermove: onPointerMove, pointerleave: onPointerLeave, focusin: onFocusIn, focusout: onFocusOut });
4275
4281
  }, [controller, store, gutter]);
4276
4282
  const fallback = focusWithin ? head : null;
4277
4283
  const target = hovered ?? fallback;
@@ -4364,7 +4370,7 @@ function pointInHost(host, { node, offset }) {
4364
4370
  return host.contains(node) ? { node, offset: Math.min(offset, nodeLength(node)) } : null;
4365
4371
  }
4366
4372
  function textRect(host, { from, to }) {
4367
- const map = chunkZ6LAARPB_cjs.domMapOf(host);
4373
+ const map = chunkUKUAQJME_cjs.domMapOf(host);
4368
4374
  const range = host.ownerDocument.createRange();
4369
4375
  if (map === void 0 || typeof range.getBoundingClientRect !== "function") return null;
4370
4376
  const start = pointInHost(host, map.toDom(from, 1));
@@ -4377,7 +4383,7 @@ function textRect(host, { from, to }) {
4377
4383
  }
4378
4384
  function rangeRect(controller, range) {
4379
4385
  const host = controller.registry.get(range.block, range.region);
4380
- if (host === void 0 || !host.isConnected || controller.composingKey === chunkZ6LAARPB_cjs.hostKey(range.block, range.region)) {
4386
+ if (host === void 0 || !host.isConnected || controller.composingKey === chunkUKUAQJME_cjs.hostKey(range.block, range.region)) {
4381
4387
  return null;
4382
4388
  }
4383
4389
  const rect = textRect(host, range);
@@ -4418,7 +4424,7 @@ function useSelectionAnchor(controller, state) {
4418
4424
  [controller, state]
4419
4425
  );
4420
4426
  const [side, setSide] = React7.useState("top");
4421
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
4427
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
4422
4428
  const rect = selectionRect(controller);
4423
4429
  if (rect) setSide(rect.top < ROOM_ABOVE ? "bottom" : "top");
4424
4430
  }, [controller, state]);
@@ -4500,7 +4506,7 @@ function TurnIntoDropdown({ controller, state }) {
4500
4506
  }
4501
4507
  var DIVIDER = "mx-0.5 h-5 w-px shrink-0 bg-border";
4502
4508
  function BubbleToolbar({ controller, labels, store, extraItems }) {
4503
- const state = chunkZ6LAARPB_cjs.useEditorState(controller, chunkZ6LAARPB_cjs.wholeState);
4509
+ const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
4504
4510
  const { anchor, side } = useSelectionAnchor(controller, state);
4505
4511
  const roving = useRovingFocus();
4506
4512
  const items = React7.useMemo(() => bubbleItems(labels, () => store.set({ linkPopover: { open: true } })), [labels, store]);
@@ -4548,9 +4554,9 @@ var readOnServer = () => false;
4548
4554
  function useMediaQuery(query, unsupported) {
4549
4555
  const subscribe3 = React7.useCallback(
4550
4556
  (notify) => {
4551
- const list = listOf(query);
4552
- list?.addEventListener("change", notify);
4553
- return () => list?.removeEventListener("change", notify);
4557
+ const list2 = listOf(query);
4558
+ list2?.addEventListener("change", notify);
4559
+ return () => list2?.removeEventListener("change", notify);
4554
4560
  },
4555
4561
  [query]
4556
4562
  );
@@ -4564,8 +4570,8 @@ var useFinePointer = () => useMediaQuery("(pointer: fine)", true);
4564
4570
  // src/menus/bubble/use-bubble-visibility.ts
4565
4571
  var hasTextRange = (state) => state.selection?.kind === "text" && !chunkFK7EBZPX_cjs.isCollapsed(state.selection) && chunkFK7EBZPX_cjs.markRanges(state).length > 0;
4566
4572
  function useBubbleVisibility(controller) {
4567
- const range = chunkZ6LAARPB_cjs.useEditorState(controller, hasTextRange);
4568
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
4573
+ const range = chunkUKUAQJME_cjs.useEditorState(controller, hasTextRange);
4574
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
4569
4575
  const fine = useFinePointer();
4570
4576
  const settled = useSelectionSettled(controller);
4571
4577
  return range && !readOnly && fine && settled;
@@ -4588,7 +4594,7 @@ function bubbleExtension() {
4588
4594
  // src/menus/link/link-at-selection.ts
4589
4595
  function linkAround(state, from, to = from) {
4590
4596
  if (from.block !== to.block || from.region !== to.region) return null;
4591
- const inline = chunkZ6LAARPB_cjs.regionInline(state, from.block, from.region) ?? [];
4597
+ const inline = chunkUKUAQJME_cjs.regionInline(state, from.block, from.region) ?? [];
4592
4598
  const extent = chunkFK7EBZPX_cjs.markExtent(inline, from.offset, "link");
4593
4599
  if (extent === null || to.offset > extent.to) return null;
4594
4600
  const attrs = chunkI7X7B3WD_cjs.sliceInline(inline, extent.from, extent.to)[0]?.marks.find((mark) => mark.type === "link")?.attrs;
@@ -4611,7 +4617,7 @@ function linkElementAt(controller, target) {
4611
4617
  }
4612
4618
  function linkAtElement(controller, state, element) {
4613
4619
  const host = controller.registry.locate(element);
4614
- const offset = host === null ? null : chunkZ6LAARPB_cjs.domMapOf(host.element)?.fromDom(element, 0) ?? null;
4620
+ const offset = host === null ? null : chunkUKUAQJME_cjs.domMapOf(host.element)?.fromDom(element, 0) ?? null;
4615
4621
  if (host === null || offset === null) return null;
4616
4622
  return linkAround(state, { block: host.block, region: host.region, offset });
4617
4623
  }
@@ -4664,7 +4670,7 @@ function caretLinkKey(state) {
4664
4670
  return link && [link.range.block, link.range.region, link.range.from, link.href].join("\0");
4665
4671
  }
4666
4672
  function useCaretInLink(controller, delay) {
4667
- const key = chunkZ6LAARPB_cjs.useEditorState(controller, caretLinkKey);
4673
+ const key = chunkUKUAQJME_cjs.useEditorState(controller, caretLinkKey);
4668
4674
  const settled = useSelectionSettled(controller);
4669
4675
  return useRestedValue(settled ? key : null, delay) !== null;
4670
4676
  }
@@ -4698,7 +4704,7 @@ var URL_LENGTH = 48;
4698
4704
  var CARD = "flex w-auto items-center gap-0.5 py-1 ps-3 pe-1 shadow-md";
4699
4705
  var ADDRESS = "me-1 whitespace-nowrap text-sm text-muted-foreground";
4700
4706
  function LinkCard({ controller, labels, store, cardRef, element, onUnlinked }) {
4701
- const state = chunkZ6LAARPB_cjs.useEditorState(controller, chunkZ6LAARPB_cjs.wholeState);
4707
+ const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
4702
4708
  const link = React7.useMemo(
4703
4709
  () => element === null ? linkAtSelection(state) : linkAtElement(controller, state, element),
4704
4710
  [controller, state, element]
@@ -4716,7 +4722,7 @@ function LinkCard({ controller, labels, store, cardRef, element, onUnlinked }) {
4716
4722
  const edit2 = () => {
4717
4723
  if (element !== null) {
4718
4724
  const selection = chunkFK7EBZPX_cjs.textSelection({ block, region, offset: from }, { block, region, offset: to });
4719
- chunkZ6LAARPB_cjs.dispatchSelection(controller, selection);
4725
+ chunkUKUAQJME_cjs.dispatchSelection(controller, selection);
4720
4726
  }
4721
4727
  store.set({ linkPopover: { open: true } });
4722
4728
  };
@@ -4883,7 +4889,7 @@ function LinkOverlay({ controller }) {
4883
4889
  const labels = useLabels();
4884
4890
  const store = useCanvasUiStore();
4885
4891
  const popoverOpen = useCanvasUi(store, isPopoverOpen);
4886
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
4892
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
4887
4893
  useLinkClicks(controller);
4888
4894
  React7.useEffect(() => {
4889
4895
  if (readOnly && store.get().linkPopover.open) store.set({ linkPopover: { open: false } });
@@ -5063,12 +5069,13 @@ function useRangeAnchor(controller, range) {
5063
5069
  const [side, setSide] = React7.useState("bottom");
5064
5070
  const latest = React7.useRef(range);
5065
5071
  const start = range === null ? null : `${range.block} ${range.region} ${range.from}`;
5066
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5072
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5067
5073
  latest.current = range;
5068
5074
  });
5069
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5075
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5070
5076
  const rect = latest.current && rangeRect(controller, latest.current);
5071
- if (rect) setSide(sideFor(rect, window.innerHeight));
5077
+ const height = controller.root?.ownerDocument.defaultView?.innerHeight;
5078
+ if (rect && height !== void 0) setSide(sideFor(rect, height));
5072
5079
  }, [controller, start]);
5073
5080
  return { anchor, side };
5074
5081
  }
@@ -5092,11 +5099,11 @@ function openCombobox(host, listboxId) {
5092
5099
  }
5093
5100
  function useComboboxHost(controller, block, region, listboxId, activeOptionId) {
5094
5101
  const host = React7.useRef(null);
5095
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5102
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5096
5103
  host.current = block === null || region === null ? null : controller.registry.get(block, region) ?? null;
5097
5104
  return host.current === null ? void 0 : openCombobox(host.current, listboxId);
5098
5105
  }, [controller, block, region, listboxId]);
5099
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5106
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5100
5107
  if (host.current !== null) restore(host.current, "aria-activedescendant", activeOptionId);
5101
5108
  }, [block, region, activeOptionId]);
5102
5109
  }
@@ -5142,10 +5149,10 @@ function handle(event, menu) {
5142
5149
  }
5143
5150
  function useSuggestionKeys(controller, open, menu) {
5144
5151
  const latest = React7.useRef(menu);
5145
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5152
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5146
5153
  latest.current = menu;
5147
5154
  });
5148
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5155
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5149
5156
  if (!open) return;
5150
5157
  const intercept = (event) => {
5151
5158
  const handled = handle(event, latest.current);
@@ -5166,10 +5173,10 @@ var isPromise = (value) => typeof value?.then === "function";
5166
5173
  function useSuggestionResults(source, query, onError) {
5167
5174
  const [answer, setAnswer] = React7.useState(FORGOTTEN);
5168
5175
  const report = React7.useRef(onError);
5169
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5176
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5170
5177
  report.current = onError;
5171
5178
  });
5172
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5179
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5173
5180
  if (query === null) {
5174
5181
  setAnswer(FORGOTTEN);
5175
5182
  return;
@@ -5213,9 +5220,9 @@ function useSuggestion({
5213
5220
  emptyLabel
5214
5221
  }) {
5215
5222
  const { labels, onError } = useQuoin();
5216
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
5223
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
5217
5224
  const selectTrigger = React7.useCallback((state) => chunkFK7EBZPX_cjs.getPluginState(state, pluginKey).active, [pluginKey]);
5218
- const active = chunkZ6LAARPB_cjs.useEditorState(controller, selectTrigger);
5225
+ const active = chunkUKUAQJME_cjs.useEditorState(controller, selectTrigger);
5219
5226
  const trigger = readOnly ? null : active;
5220
5227
  const results = useSuggestionResults(source, trigger?.query ?? null, onError);
5221
5228
  const sections = React7.useMemo(() => groupItems(results.items, groupOf2), [results.items, groupOf2]);
@@ -5285,7 +5292,7 @@ function SuggestionMenu(props) {
5285
5292
  const { trigger, sections, activeIndex, listboxId } = suggestion;
5286
5293
  const { anchor, side } = useRangeAnchor(controller, trigger);
5287
5294
  const listbox = React7.useRef(null);
5288
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
5295
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5289
5296
  listbox.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
5290
5297
  }, [activeIndex, sections]);
5291
5298
  if (trigger === null) return null;
@@ -5364,7 +5371,7 @@ var TEXT_STEPS = /* @__PURE__ */ new Set(["replaceInline", "addMark", "removeMar
5364
5371
  var WHITESPACE3 = /\s/;
5365
5372
  var changesBlocks = (tr) => tr !== null && tr.steps.some((step) => !TEXT_STEPS.has(step.stepType));
5366
5373
  function withSpaceBefore(state, range) {
5367
- const inline = chunkZ6LAARPB_cjs.regionInline(state, range.block, range.region);
5374
+ const inline = chunkUKUAQJME_cjs.regionInline(state, range.block, range.region);
5368
5375
  if (inline === void 0 || range.from === 0) return null;
5369
5376
  const text2 = chunkI7X7B3WD_cjs.inlineText(inline);
5370
5377
  const after = text2.charAt(range.to);
@@ -5552,7 +5559,7 @@ function placement(viewport) {
5552
5559
  function EditingTools({ controller }) {
5553
5560
  const labels = useLabels();
5554
5561
  const store = useCanvasUiStore();
5555
- const state = chunkZ6LAARPB_cjs.useEditorState(controller, chunkZ6LAARPB_cjs.wholeState);
5562
+ const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
5556
5563
  const viewport = useVisualViewport();
5557
5564
  const roving = useRovingFocus();
5558
5565
  const items = React7.useMemo(() => mobileItems(labels, () => store.set({ linkPopover: { open: true } })), [labels, store]);
@@ -5876,7 +5883,7 @@ function runHistoryKey(controller, event) {
5876
5883
  }
5877
5884
  function useBlockIndex(controller, blockId) {
5878
5885
  const select = React7.useCallback((state) => state.doc.index.get(blockId) ?? -1, [blockId]);
5879
- return chunkZ6LAARPB_cjs.useEditorState(controller, select);
5886
+ return chunkUKUAQJME_cjs.useEditorState(controller, select);
5880
5887
  }
5881
5888
  var FOCUSABLE = [
5882
5889
  "input:not([disabled])",
@@ -5903,8 +5910,8 @@ function useEditingFocus(root, editing, stop) {
5903
5910
  const leaveUnlessInside = (event) => {
5904
5911
  if (!inside.current.has(event)) stop();
5905
5912
  };
5906
- const unlistenCapture = chunkZ6LAARPB_cjs.listen(doc, { pointerdown: leaveForCanvas }, true);
5907
- const unlisten = chunkZ6LAARPB_cjs.listen(doc, { pointerdown: leaveUnlessInside, focusin: leaveUnlessInside });
5913
+ const unlistenCapture = chunkUKUAQJME_cjs.listen(doc, { pointerdown: leaveForCanvas }, true);
5914
+ const unlisten = chunkUKUAQJME_cjs.listen(doc, { pointerdown: leaveUnlessInside, focusin: leaveUnlessInside });
5908
5915
  return () => {
5909
5916
  unlistenCapture();
5910
5917
  unlisten();
@@ -5933,8 +5940,8 @@ function VoidEditor({ Editor, controller, ...props }) {
5933
5940
  }
5934
5941
  function VoidBlock({ block, controller, definition }) {
5935
5942
  const { blockTypes, labels } = useQuoin();
5936
- const { report } = React7.useContext(chunkZ6LAARPB_cjs.BlockErrorContext);
5937
- const readOnly = chunkZ6LAARPB_cjs.useReadOnly(controller);
5943
+ const { report } = React7.useContext(chunkUKUAQJME_cjs.BlockErrorContext);
5944
+ const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
5938
5945
  const { editor: Editor, alwaysEditing = false } = definition;
5939
5946
  const name = blockTypeLabel(labels, block, blockTypes);
5940
5947
  const blockId = block.id;
@@ -5998,7 +6005,7 @@ function VoidBlock({ block, controller, definition }) {
5998
6005
  role: "group",
5999
6006
  "aria-label": name,
6000
6007
  tabIndex: editorShown ? -1 : void 0,
6001
- ...{ [chunkZ6LAARPB_cjs.NATIVE_INTERACTION]: editorShown ? "" : void 0 },
6008
+ ...{ [chunkUKUAQJME_cjs.NATIVE_INTERACTION]: editorShown ? "" : void 0 },
6002
6009
  onKeyDown,
6003
6010
  ...focusHandlers,
6004
6011
  onClick,
@@ -6067,6 +6074,8 @@ function extensionUi(extension) {
6067
6074
  const { ui } = extension;
6068
6075
  return typeof ui === "object" && ui !== null ? ui : {};
6069
6076
  }
6077
+ var list = (value) => Array.isArray(value) ? value : [];
6078
+ var record = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
6070
6079
  function mergeRender(uis) {
6071
6080
  const given = uis.flatMap(({ render }) => render === void 0 ? [] : [render]);
6072
6081
  if (given.length === 0) return void 0;
@@ -6079,14 +6088,14 @@ function mergeRender(uis) {
6079
6088
  function collectUi(extensions, definitions, readOnly = false, onError) {
6080
6089
  const uis = extensions.map(extensionUi);
6081
6090
  return {
6082
- slashItems: [...uis.flatMap((ui) => ui.slashItems ?? []), ...blockTypeSlashItems(definitions, onError)],
6083
- bubbleItems: uis.flatMap((ui) => ui.bubbleItems ?? []),
6084
- blockMenuItems: uis.flatMap((ui) => ui.blockMenuItems ?? []),
6085
- renderers: Object.assign({}, canvasRenderers(definitions, readOnly), ...uis.map((ui) => ui.renderers)),
6086
- blockNames: Object.assign({}, ...uis.map((ui) => ui.blockNames)),
6091
+ slashItems: [...uis.flatMap((ui) => list(ui.slashItems)), ...blockTypeSlashItems(definitions, onError)],
6092
+ bubbleItems: uis.flatMap((ui) => list(ui.bubbleItems)),
6093
+ blockMenuItems: uis.flatMap((ui) => list(ui.blockMenuItems)),
6094
+ renderers: Object.assign({}, canvasRenderers(definitions, readOnly), ...uis.map((ui) => record(ui.renderers))),
6095
+ blockNames: Object.assign({}, ...uis.map((ui) => record(ui.blockNames))),
6087
6096
  render: mergeRender(uis),
6088
6097
  overlays: [
6089
- ...uis.flatMap((ui) => ui.overlays ?? []),
6098
+ ...uis.flatMap((ui) => list(ui.overlays)),
6090
6099
  ...Object.entries(inPlaceOverlays).flatMap(([type, overlay]) => drawnInPlace(definitions, type) ? [overlay] : [])
6091
6100
  ]
6092
6101
  };
@@ -6217,7 +6226,7 @@ function deletions(codec, tr) {
6217
6226
  }
6218
6227
  function useDeleteReporter(controller, onDelete) {
6219
6228
  const latest = React7.useRef(onDelete);
6220
- chunkZ6LAARPB_cjs.useIsomorphicLayoutEffect(() => {
6229
+ chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
6221
6230
  latest.current = onDelete;
6222
6231
  });
6223
6232
  React7.useEffect(() => {
@@ -6294,19 +6303,22 @@ var BlockCanvas = React7.forwardRef(function BlockCanvas2({
6294
6303
  );
6295
6304
  useDefinitionWarnings(blockTypes, readOnly);
6296
6305
  const [focusOnMount] = React7.useState(autoFocus);
6297
- const controller = chunkZ6LAARPB_cjs.useQuoinEditor({
6306
+ const controller = chunkUKUAQJME_cjs.useQuoinEditor({
6298
6307
  blocks,
6299
6308
  onChange,
6300
6309
  readOnly,
6301
6310
  extensions: allExtensions,
6302
6311
  render: ui.render,
6303
- onFiles: (files, at) => void insertUploads(controller, files, at, {
6304
- upload,
6305
- resolveAssetUrl: resolveAssetUrl ?? String,
6306
- onError: onError ?? console.error,
6307
- unavailable: labels.uploadsUnavailable,
6308
- failed: labels.uploadFailed
6309
- })
6312
+ onFiles(files, at) {
6313
+ const report = onError ?? console.error;
6314
+ void insertUploads(controller, files, at, {
6315
+ upload,
6316
+ resolveAssetUrl: resolveAssetUrl ?? String,
6317
+ onError: report,
6318
+ unavailable: labels.uploadsUnavailable,
6319
+ failed: labels.uploadFailed
6320
+ }).catch((reason) => report(toError(reason)));
6321
+ }
6310
6322
  });
6311
6323
  useDeleteReporter(controller, onDelete);
6312
6324
  useBlockLinkTarget(controller, focusOnMount);
@@ -6338,7 +6350,7 @@ var BlockCanvas = React7.forwardRef(function BlockCanvas2({
6338
6350
  [controller, resolveAssetUrl]
6339
6351
  );
6340
6352
  return /* @__PURE__ */ jsxRuntime.jsx(QuoinProvider, { value: { blockTypes, upload, resolveAssetUrl, onError, highlight, controller, labels }, children: /* @__PURE__ */ jsxRuntime.jsx(VoidEditingContext.Provider, { value: voidEditing, children: /* @__PURE__ */ jsxRuntime.jsx(SlashItemsProvider, { value: slashItems, children: /* @__PURE__ */ jsxRuntime.jsx(BubbleItemsProvider, { value: ui.bubbleItems, children: /* @__PURE__ */ jsxRuntime.jsx(CanvasUiProvider, { value: uiStore, children: /* @__PURE__ */ jsxRuntime.jsxs(
6341
- chunkZ6LAARPB_cjs.EditorView,
6353
+ chunkUKUAQJME_cjs.EditorView,
6342
6354
  {
6343
6355
  controller,
6344
6356
  renderers: ui.renderers,