quoin-editor 2.0.2 → 2.0.3

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 +13 -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-NZFGAV3L.cjs → chunk-3B5VEXVQ.cjs} +2 -2
  7. package/dist/{chunk-RWSC47L7.cjs → chunk-4EJJ4ZNC.cjs} +18 -18
  8. package/dist/{chunk-F3BC5ITU.cjs → chunk-55MN4QZU.cjs} +8 -5
  9. package/dist/{chunk-TDXQSNFS.cjs → chunk-5URH2Y2L.cjs} +19 -19
  10. package/dist/{chunk-XLR2O4OK.js → chunk-77THE3KY.js} +5 -5
  11. package/dist/{chunk-XLR2O4OK.js.map → chunk-77THE3KY.js.map} +1 -1
  12. package/dist/{chunk-LBP64GKQ.cjs → chunk-BCCFJINI.cjs} +70 -65
  13. package/dist/{chunk-SE36LU6G.js → chunk-BNTRGV4A.js} +27 -10
  14. package/dist/chunk-BNTRGV4A.js.map +1 -0
  15. package/dist/{chunk-AVD2AI47.js → chunk-C4SRLMQJ.js} +3 -3
  16. package/dist/{chunk-AVD2AI47.js.map → chunk-C4SRLMQJ.js.map} +1 -1
  17. package/dist/{chunk-5VBDRJ5Y.cjs → chunk-DZ5XR4O6.cjs} +139 -117
  18. package/dist/{chunk-QIGZ5JAY.js → chunk-FGVTDIHT.js} +42 -19
  19. package/dist/chunk-FGVTDIHT.js.map +1 -0
  20. package/dist/{chunk-XC4WZTMY.cjs → chunk-H3TRVI44.cjs} +50 -50
  21. package/dist/{chunk-Z3GLEAOI.js → chunk-LCGOFL7S.js} +15 -10
  22. package/dist/{chunk-Z3GLEAOI.js.map → chunk-LCGOFL7S.js.map} +1 -1
  23. package/dist/{chunk-OBOIZ7L3.js → chunk-MDIXI7DM.js} +3 -3
  24. package/dist/{chunk-OBOIZ7L3.js.map → chunk-MDIXI7DM.js.map} +1 -1
  25. package/dist/{chunk-UKUAQJME.cjs → chunk-MGN332NY.cjs} +28 -7
  26. package/dist/{chunk-SHZGRFYY.cjs → chunk-NAMZA4NW.cjs} +14 -14
  27. package/dist/{chunk-ZHLNPNE2.js → chunk-NLRSAOCK.js} +5 -5
  28. package/dist/{chunk-ZHLNPNE2.js.map → chunk-NLRSAOCK.js.map} +1 -1
  29. package/dist/{chunk-RR67AKP6.cjs → chunk-OMUXPNCX.cjs} +27 -26
  30. package/dist/{chunk-DGKIKXB7.js → chunk-QVWNUUMJ.js} +3 -3
  31. package/dist/{chunk-DGKIKXB7.js.map → chunk-QVWNUUMJ.js.map} +1 -1
  32. package/dist/{chunk-4VCCGBXW.js → chunk-RNYETN6X.js} +4 -4
  33. package/dist/{chunk-4VCCGBXW.js.map → chunk-RNYETN6X.js.map} +1 -1
  34. package/dist/{chunk-YETMZ27Q.cjs → chunk-SDFJZNYB.cjs} +3 -3
  35. package/dist/{chunk-YYBPQ4TY.cjs → chunk-SQHEZ3JY.cjs} +2 -2
  36. package/dist/{chunk-JM5TRLEC.cjs → chunk-UWCU6PJY.cjs} +30 -30
  37. package/dist/{chunk-M7L444WV.js → chunk-VQDQBMQY.js} +4 -4
  38. package/dist/{chunk-M7L444WV.js.map → chunk-VQDQBMQY.js.map} +1 -1
  39. package/dist/{chunk-5A2MHCYI.js → chunk-WMM56LIB.js} +8 -5
  40. package/dist/{chunk-5A2MHCYI.js.map → chunk-WMM56LIB.js.map} +1 -1
  41. package/dist/{chunk-DT3ODGZ7.js → chunk-YHAVXOAA.js} +6 -5
  42. package/dist/chunk-YHAVXOAA.js.map +1 -0
  43. package/dist/{chunk-ZDNYIQKM.js → chunk-YWYTLNAO.js} +4 -4
  44. package/dist/{chunk-ZDNYIQKM.js.map → chunk-YWYTLNAO.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.cjs +6 -6
  52. package/dist/emoji.js +3 -3
  53. package/dist/find.cjs +7 -7
  54. package/dist/find.js +3 -3
  55. package/dist/headless.cjs +11 -11
  56. package/dist/headless.js +1 -1
  57. package/dist/highlight.cjs +3 -3
  58. package/dist/highlight.js +2 -2
  59. package/dist/index.cjs +23 -23
  60. package/dist/index.d.cts +1 -1
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.js +2 -2
  63. package/dist/math.cjs +6 -6
  64. package/dist/math.js +4 -4
  65. package/dist/mention.cjs +6 -6
  66. package/dist/mention.js +4 -4
  67. package/dist/presence.cjs +12 -12
  68. package/dist/presence.js +3 -3
  69. package/dist/source.cjs +2 -2
  70. package/dist/source.js +2 -2
  71. package/dist/stats.cjs +6 -6
  72. package/dist/stats.js +3 -3
  73. package/dist/styles.css +1 -1
  74. package/dist/table.cjs +22 -22
  75. package/dist/table.js +3 -3
  76. package/dist/toc.cjs +6 -6
  77. package/dist/toc.js +3 -3
  78. package/package.json +3 -2
  79. package/dist/chunk-DT3ODGZ7.js.map +0 -1
  80. package/dist/chunk-QIGZ5JAY.js.map +0 -1
  81. package/dist/chunk-SE36LU6G.js.map +0 -1
@@ -1,10 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkUKUAQJME_cjs = require('./chunk-UKUAQJME.cjs');
3
+ var chunkMGN332NY_cjs = require('./chunk-MGN332NY.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');
7
7
  var chunkI7X7B3WD_cjs = require('./chunk-I7X7B3WD.cjs');
8
+ var reactDirection = require('@radix-ui/react-direction');
8
9
  var React7 = require('react');
9
10
  var jsxRuntime = require('react/jsx-runtime');
10
11
  var ContextMenuPrimitive = require('@radix-ui/react-context-menu');
@@ -464,7 +465,11 @@ function formatSize(bytes) {
464
465
  }
465
466
 
466
467
  // src/i18n/english-labels.ts
467
- var englishLabels = {
468
+ function frozen(labels) {
469
+ for (const label of Object.values(labels)) if (typeof label === "object") Object.freeze(label);
470
+ return Object.freeze(labels);
471
+ }
472
+ var englishLabels = frozen({
468
473
  document: "Editor",
469
474
  editorHint: "Press Escape, then Tab, to leave the editor.",
470
475
  paragraph: "Paragraph",
@@ -666,7 +671,7 @@ var englishLabels = {
666
671
  emptyFile: "No file chosen",
667
672
  emptyMarkdown: "Empty markdown block",
668
673
  emptyCallout: "Empty callout"
669
- };
674
+ });
670
675
  var QuoinContext = React7__namespace.createContext(null);
671
676
  function QuoinProvider({
672
677
  value,
@@ -820,7 +825,7 @@ function selectNode(controller, blockId) {
820
825
  const { editor } = controller;
821
826
  const { selection } = editor.state;
822
827
  if (selection?.kind === "node" && selection.block === blockId) return;
823
- chunkUKUAQJME_cjs.dispatchSelection(controller, chunkFK7EBZPX_cjs.nodeSelection(blockId));
828
+ chunkMGN332NY_cjs.dispatchSelection(controller, chunkFK7EBZPX_cjs.nodeSelection(blockId));
824
829
  }
825
830
  function focusNode(controller, blockId) {
826
831
  selectNode(controller, blockId);
@@ -1267,7 +1272,6 @@ function closeBlockMenu(store) {
1267
1272
  }
1268
1273
 
1269
1274
  // src/blocks/text/callout-tone.ts
1270
- var CALLOUT_TONES = ["info", "tip", "success", "warning", "danger"];
1271
1275
  var CALLOUT_ICONS = ["\u{1F4A1}", "\u26A0\uFE0F", "\u2705", "\u2757", "\u2139\uFE0F", "\u{1F4CC}"];
1272
1276
  var TONE_ICONS = {
1273
1277
  info: "\u2139\uFE0F",
@@ -1276,9 +1280,6 @@ var TONE_ICONS = {
1276
1280
  warning: "\u26A0\uFE0F",
1277
1281
  danger: "\u2757"
1278
1282
  };
1279
- function calloutTone(value) {
1280
- return CALLOUT_TONES.find((tone) => tone === value) ?? "info";
1281
- }
1282
1283
  function calloutIcon(attrs, tone) {
1283
1284
  return typeof attrs.icon === "string" && attrs.icon !== "" ? attrs.icon : TONE_ICONS[tone];
1284
1285
  }
@@ -1286,7 +1287,7 @@ function MenuIcon({ icon: Icon2 }) {
1286
1287
  return /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "size-4" }) });
1287
1288
  }
1288
1289
  var sharedTone = (blocks) => {
1289
- const tones = new Set(blocks.map((block) => calloutTone(block.attrs.tone)));
1290
+ const tones = new Set(blocks.map((block) => chunkMGN332NY_cjs.calloutTone(block.attrs.tone)));
1290
1291
  return tones.size === 1 ? [...tones][0] : "";
1291
1292
  };
1292
1293
  function CalloutMenus({ kit, controller, blocks }) {
@@ -1299,7 +1300,7 @@ function CalloutMenus({ kit, controller, blocks }) {
1299
1300
  /* @__PURE__ */ jsxRuntime.jsx(MenuIcon, { icon: Droplet }),
1300
1301
  labels.tone
1301
1302
  ] }),
1302
- /* @__PURE__ */ jsxRuntime.jsx(kit.SubContent, { children: /* @__PURE__ */ jsxRuntime.jsx(kit.RadioGroup, { value: sharedTone(blocks), onValueChange: (tone) => apply({ tone }), children: CALLOUT_TONES.map((tone) => /* @__PURE__ */ jsxRuntime.jsx(kit.RadioItem, { value: tone, indicator: /* @__PURE__ */ jsxRuntime.jsx(Check, { className: "size-4" }), children: labels.calloutTones[tone] }, tone)) }) })
1303
+ /* @__PURE__ */ jsxRuntime.jsx(kit.SubContent, { children: /* @__PURE__ */ jsxRuntime.jsx(kit.RadioGroup, { value: sharedTone(blocks), onValueChange: (tone) => apply({ tone }), children: chunkMGN332NY_cjs.CALLOUT_TONES.map((tone) => /* @__PURE__ */ jsxRuntime.jsx(kit.RadioItem, { value: tone, indicator: /* @__PURE__ */ jsxRuntime.jsx(Check, { className: "size-4" }), children: labels.calloutTones[tone] }, tone)) }) })
1303
1304
  ] }),
1304
1305
  /* @__PURE__ */ jsxRuntime.jsxs(kit.Sub, { children: [
1305
1306
  /* @__PURE__ */ jsxRuntime.jsxs(kit.SubTrigger, { children: [
@@ -1526,7 +1527,7 @@ function codeToParagraph(blockId) {
1526
1527
  };
1527
1528
  }
1528
1529
  function leaveCode(controller, blockId, direction, addsLine = false) {
1529
- const moved = chunkUKUAQJME_cjs.moveToNeighbour(controller, blockId, direction);
1530
+ const moved = chunkMGN332NY_cjs.moveToNeighbour(controller, blockId, direction);
1530
1531
  if (!moved && !(addsLine && controller.run(insertBlocks([{ type: "MARKDOWN" }], "text", blockId)))) return false;
1531
1532
  controller.focus();
1532
1533
  return true;
@@ -1651,7 +1652,7 @@ function travel({ controller, blockId, area }, command) {
1651
1652
  const before = area.value;
1652
1653
  controller.run(command);
1653
1654
  const { selection } = controller.editor.state;
1654
- const edit2 = chunkUKUAQJME_cjs.textDiff(before, area.value);
1655
+ const edit2 = chunkMGN332NY_cjs.textDiff(before, area.value);
1655
1656
  if (selection?.kind !== "node" || selection.block !== blockId) controller.focus();
1656
1657
  else if (edit2 !== null) area.setSelectionRange(edit2.from + edit2.insert.length, edit2.from + edit2.insert.length);
1657
1658
  return true;
@@ -1736,11 +1737,11 @@ function CodeEditor({ block, controller, field, focusControls }) {
1736
1737
  useTypeIntoCode(controller, blockId, field, edit2);
1737
1738
  const onKeyDown = (event) => {
1738
1739
  const area = event.currentTarget;
1739
- if (chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
1740
+ if (chunkMGN332NY_cjs.isComposingKey(controller, event.nativeEvent)) return;
1740
1741
  const action = codeKeyAction(event, fieldOf(area), controller.isMac);
1741
1742
  if (action !== null && runCodeAction(action, { controller, blockId, area, edit: edit2, focusControls })) event.preventDefault();
1742
1743
  };
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
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ...{ [chunkMGN332NY_cjs.NATIVE_INTERACTION]: "" }, dir: "ltr", className: "quoin-code-scroll", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-code-lines", children: [
1744
1745
  /* @__PURE__ */ jsxRuntime.jsx(
1745
1746
  HighlightOverlay,
1746
1747
  {
@@ -1810,7 +1811,7 @@ var Button = React7__namespace.forwardRef(function Button2({ className, variant
1810
1811
  var COPIED_FOR_MS = 1500;
1811
1812
  function CopyCodeButton({ code, controller }) {
1812
1813
  const labels = useLabels();
1813
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
1814
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
1814
1815
  const [copied, setCopied] = React7.useState(false);
1815
1816
  React7.useEffect(() => {
1816
1817
  if (!copied) return;
@@ -1893,7 +1894,7 @@ var preventDefault = (event) => event.preventDefault();
1893
1894
 
1894
1895
  // src/blocks/text/set-block-attrs.ts
1895
1896
  function setBlockAttrs(controller, blockId, patch) {
1896
- if (!controller.readOnly) controller.run(chunkUKUAQJME_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch)));
1897
+ if (!controller.readOnly) controller.run(chunkMGN332NY_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch)));
1897
1898
  }
1898
1899
  var FIELD = `quoin-code-language quoin-code-control ${FOCUS_RING}`;
1899
1900
  var CONTENT = `${MENU_CONTENT} flex max-h-64 w-48 flex-col overflow-y-hidden`;
@@ -1909,7 +1910,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
1909
1910
  const options = draft === null ? [] : languageOptions(draft === shown ? "" : draft, labels.plainText);
1910
1911
  const open = options.length > 0;
1911
1912
  const optionId = (index) => `${listboxId}-${index}`;
1912
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
1913
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
1913
1914
  list2.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
1914
1915
  }, [active]);
1915
1916
  const close = () => {
@@ -1935,7 +1936,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
1935
1936
  onDone();
1936
1937
  };
1937
1938
  const onKeyDown = (event) => {
1938
- if (chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
1939
+ if (chunkMGN332NY_cjs.isComposingKey(controller, event.nativeEvent)) return;
1939
1940
  if (event.key === "ArrowDown" || event.key === "ArrowUp") {
1940
1941
  event.preventDefault();
1941
1942
  const step = event.key === "ArrowDown" ? 1 : -1;
@@ -2009,7 +2010,7 @@ function LanguageCombobox({ blockId, controller, language: language2, field, onD
2009
2010
  }
2010
2011
  var CodeBlock = ({ block, controller }) => {
2011
2012
  const labels = useLabels();
2012
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2013
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
2013
2014
  const languageField = React7.useRef(null);
2014
2015
  const codeField = React7.useRef(null);
2015
2016
  const code = chunkI7X7B3WD_cjs.str(block.attrs.code);
@@ -2111,7 +2112,7 @@ function selectHandlers(controller, blockId, root, onSelect) {
2111
2112
  return {
2112
2113
  onKeyDown(event) {
2113
2114
  const key = event.nativeEvent;
2114
- if (chunkUKUAQJME_cjs.isComposingKey(controller, key)) return;
2115
+ if (chunkMGN332NY_cjs.isComposingKey(controller, key)) return;
2115
2116
  if (event.key === "Escape") select();
2116
2117
  else if (!(event.metaKey || event.ctrlKey) || event.target.matches("input:not([type=file])") || !controller.edit(() => controller.editor.handleKey(key)))
2117
2118
  return;
@@ -2333,7 +2334,7 @@ var uploadFile = (controller, blockId, file, host) => uploadInto(
2333
2334
  var anyFile = () => true;
2334
2335
  var FileBlock = ({ block, controller }) => {
2335
2336
  const labels = useLabels();
2336
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2337
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
2337
2338
  const root = React7.useRef(null);
2338
2339
  const filled = hasFile(block.attrs);
2339
2340
  useNodeKeys(controller, block.id, !readOnly, !filled, root);
@@ -2485,7 +2486,7 @@ function useRovingFocus() {
2485
2486
  },
2486
2487
  [syncTabStop]
2487
2488
  );
2488
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(syncTabStop);
2489
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(syncTabStop);
2489
2490
  const onFocus = (event) => {
2490
2491
  if (!owns(event.target)) return;
2491
2492
  current.current = event.target;
@@ -2494,9 +2495,10 @@ function useRovingFocus() {
2494
2495
  const onKeyDown = (event) => {
2495
2496
  const all = items();
2496
2497
  const index = all.indexOf(event.target);
2497
- if (index === -1 || !Object.hasOwn(MOVES, event.key)) return;
2498
+ const key = row.current === null ? event.key : chunkMGN332NY_cjs.arrowAsWritten(event.key, chunkMGN332NY_cjs.inlineDirection(row.current));
2499
+ if (index === -1 || !Object.hasOwn(MOVES, key)) return;
2498
2500
  event.preventDefault();
2499
- all[MOVES[event.key](index, all.length)].focus();
2501
+ all[MOVES[key](index, all.length)].focus();
2500
2502
  };
2501
2503
  return { ref, owns, focusCurrent, onFocus, onKeyDown };
2502
2504
  }
@@ -2504,7 +2506,7 @@ function useRovingFocus() {
2504
2506
  // src/menus/floating/use-focus-key.ts
2505
2507
  var isFocusKey = (event) => event.key === "F10" && event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey;
2506
2508
  function useFocusKey(controller, focus) {
2507
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
2509
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
2508
2510
  const intercept = (event) => {
2509
2511
  if (!isFocusKey(event)) return false;
2510
2512
  event.preventDefault();
@@ -2516,11 +2518,11 @@ function useFocusKey(controller, focus) {
2516
2518
  }
2517
2519
  function NodeToolbar(props) {
2518
2520
  const { blockId, controller, label, anchor, items, next, buttonRefs, children, popover } = props;
2519
- const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
2521
+ const state = chunkMGN332NY_cjs.useEditorState(controller, chunkMGN332NY_cjs.wholeState);
2520
2522
  const roving = useRovingFocus();
2521
2523
  useFocusKey(controller, roving.focusCurrent);
2522
2524
  const onKeyDown = (event) => {
2523
- if (!roving.owns(event.target) || chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
2525
+ if (!roving.owns(event.target) || chunkMGN332NY_cjs.isComposingKey(controller, event.nativeEvent)) return;
2524
2526
  const tab = event.key === "Tab" && !event.altKey && !event.ctrlKey && !event.metaKey;
2525
2527
  const ahead = tab && !event.shiftKey && next !== void 0 ? blockPart(controller, blockId, next) : void 0;
2526
2528
  if (ahead !== void 0) ahead.focus();
@@ -2602,8 +2604,8 @@ var selectedBlock = (type, filled) => ({ doc, selection }) => {
2602
2604
  return block?.type === type && filled(block.attrs) ? block.id : null;
2603
2605
  };
2604
2606
  function useToolbarBlock(controller, selected, keptFor = null) {
2605
- const blockId = chunkUKUAQJME_cjs.useEditorState(controller, selected);
2606
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2607
+ const blockId = chunkMGN332NY_cjs.useEditorState(controller, selected);
2608
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
2607
2609
  const settled = useSelectionSettled(controller);
2608
2610
  return blockId !== null && !readOnly && (settled || keptFor === blockId) ? blockId : null;
2609
2611
  }
@@ -2682,7 +2684,7 @@ function ResizeHandles({ blockId, controller, frame, percent, centred, onPreview
2682
2684
  const value = percent ?? drawn;
2683
2685
  const write = (widthPercent) => setBlockAttrs(controller, blockId, { widthPercent });
2684
2686
  const onKeyDown = (event) => {
2685
- if (chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
2687
+ if (chunkMGN332NY_cjs.isComposingKey(controller, event.nativeEvent)) return;
2686
2688
  const next = keyedWidth(event.key, value);
2687
2689
  if (event.key === "Escape") controller.focus();
2688
2690
  else if (next === null) return;
@@ -2724,7 +2726,7 @@ function ResizeHandles({ blockId, controller, frame, percent, centred, onPreview
2724
2726
  "aria-valuetext": labels.widthValue(value),
2725
2727
  "data-side": side,
2726
2728
  className: "quoin-image-handle",
2727
- ...{ [chunkUKUAQJME_cjs.NATIVE_INTERACTION]: "" },
2729
+ ...{ [chunkMGN332NY_cjs.NATIVE_INTERACTION]: "" },
2728
2730
  ...bubblePart(controller),
2729
2731
  onKeyDown,
2730
2732
  onPointerDown: onPointerDown(side),
@@ -2797,7 +2799,7 @@ function ImageFigure({ block, controller, readOnly }) {
2797
2799
  )
2798
2800
  ] }),
2799
2801
  (!readOnly || (regions.caption?.length ?? 0) > 0) && /* @__PURE__ */ jsxRuntime.jsx(
2800
- chunkUKUAQJME_cjs.EditableRegion,
2802
+ chunkMGN332NY_cjs.EditableRegion,
2801
2803
  {
2802
2804
  block: id,
2803
2805
  region: "caption",
@@ -2965,7 +2967,7 @@ function useImageKeys(controller, blockId, picture, editable, root) {
2965
2967
  }
2966
2968
  var ImageBlock = ({ block, controller }) => {
2967
2969
  const labels = useLabels();
2968
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
2970
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
2969
2971
  const root = React7.useRef(null);
2970
2972
  const picture = hasPicture(block.attrs);
2971
2973
  useImageKeys(controller, block.id, picture, !readOnly, root);
@@ -2978,17 +2980,17 @@ var ImageBlock = ({ block, controller }) => {
2978
2980
  "aria-label": labels.blockNames.image,
2979
2981
  contentEditable: false,
2980
2982
  className: "quoin-image",
2981
- ...picture ? { [chunkUKUAQJME_cjs.NODE_ENTRY]: "" } : void 0,
2983
+ ...picture ? { [chunkMGN332NY_cjs.NODE_ENTRY]: "" } : void 0,
2982
2984
  children: picture ? /* @__PURE__ */ jsxRuntime.jsx(ImageFigure, { block, controller, readOnly }) : empty
2983
2985
  }
2984
2986
  );
2985
2987
  };
2986
2988
  function useOutsidePress(element, ownerDocument, onPress) {
2987
2989
  const latest = React7.useRef(onPress);
2988
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
2990
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
2989
2991
  latest.current = onPress;
2990
2992
  });
2991
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
2993
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
2992
2994
  const doc = ownerDocument();
2993
2995
  const inside = (target) => element.current?.contains(target) === true;
2994
2996
  let touched = null;
@@ -3003,7 +3005,7 @@ function useOutsidePress(element, ownerDocument, onPress) {
3003
3005
  if (touched !== null && !inside(event.target)) latest.current(touched);
3004
3006
  touched = null;
3005
3007
  };
3006
- return chunkUKUAQJME_cjs.listen(doc, { pointerdown: down, click }, true);
3008
+ return chunkMGN332NY_cjs.listen(doc, { pointerdown: down, click }, true);
3007
3009
  }, [element, ownerDocument]);
3008
3010
  }
3009
3011
  function storeAlt(controller, blockId, opened, patch) {
@@ -3011,7 +3013,7 @@ function storeAlt(controller, blockId, opened, patch) {
3011
3013
  const attrs = chunkI7X7B3WD_cjs.blockById(editor.state.doc, blockId)?.attrs ?? {};
3012
3014
  const changed = chunkI7X7B3WD_cjs.str(attrs.alt) !== opened.alt || attrs.decorative === true !== opened.decorative;
3013
3015
  if (controller.readOnly || controller.root === null || changed) return;
3014
- chunkUKUAQJME_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch))(editor.state, (tr) => editor.dispatch(tr));
3016
+ chunkMGN332NY_cjs.onBlock(blockId, chunkFK7EBZPX_cjs.setAttrs(patch))(editor.state, (tr) => editor.dispatch(tr));
3015
3017
  }
3016
3018
  function AltTextPopover({ blockId, controller, anchor, opener, alt, decorative, onClose }) {
3017
3019
  const labels = useLabels();
@@ -3053,7 +3055,7 @@ function AltTextPopover({ blockId, controller, anchor, opener, alt, decorative,
3053
3055
  close(true);
3054
3056
  };
3055
3057
  const onKeyDown = (event) => {
3056
- if (event.key !== "Tab" || chunkUKUAQJME_cjs.isComposingKey(controller, event.nativeEvent)) return;
3058
+ if (event.key !== "Tab" || chunkMGN332NY_cjs.isComposingKey(controller, event.nativeEvent)) return;
3057
3059
  const controls = [...event.currentTarget.elements];
3058
3060
  const next = controls[controls.indexOf(event.target) + (event.shiftKey ? -1 : 1)];
3059
3061
  event.preventDefault();
@@ -3081,7 +3083,7 @@ function AltTextPopover({ blockId, controller, anchor, opener, alt, decorative,
3081
3083
  onCloseAutoFocus: preventDefault,
3082
3084
  onEscapeKeyDown: (event) => {
3083
3085
  event.preventDefault();
3084
- if (!chunkUKUAQJME_cjs.isComposingKey(controller, event)) close(false);
3086
+ if (!chunkMGN332NY_cjs.isComposingKey(controller, event)) close(false);
3085
3087
  },
3086
3088
  ...bubblePart(controller),
3087
3089
  children: /* @__PURE__ */ jsxRuntime.jsxs("form", { noValidate: true, className: "quoin-image-alt", onSubmit: save, onKeyDown, children: [
@@ -3177,7 +3179,7 @@ function ImageToolbarOverlay({ controller }) {
3177
3179
  }
3178
3180
  function ImageToolbar({ blockId, controller, editingAlt, onEditAlt }) {
3179
3181
  const { labels, resolveAssetUrl } = useQuoin();
3180
- const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
3182
+ const state = chunkMGN332NY_cjs.useEditorState(controller, chunkMGN332NY_cjs.wholeState);
3181
3183
  const picker = useReplacePicker(controller, blockId, uploadImage, "image/*");
3182
3184
  const altButton = React7.useRef(null);
3183
3185
  const anchor = usePartAnchor(controller, blockId, ".quoin-image-frame");
@@ -3402,20 +3404,20 @@ function CalloutToneMenu({ blockId, controller, tone }) {
3402
3404
  {
3403
3405
  value: tone,
3404
3406
  onValueChange: (value) => setBlockAttrs(controller, blockId, { tone: value }),
3405
- children: CALLOUT_TONES.map((option) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: option, children: labels.calloutTones[option] }, option))
3407
+ children: chunkMGN332NY_cjs.CALLOUT_TONES.map((option) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuRadioItem, { value: option, children: labels.calloutTones[option] }, option))
3406
3408
  }
3407
3409
  ) })
3408
3410
  ] });
3409
3411
  }
3410
3412
  var CalloutBlock = ({ block, controller }) => {
3411
3413
  const labels = useLabels();
3412
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
3413
- const tone = calloutTone(block.attrs.tone);
3414
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
3415
+ const tone = chunkMGN332NY_cjs.calloutTone(block.attrs.tone);
3414
3416
  const icon = calloutIcon(block.attrs, tone);
3415
3417
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("quoin-callout group/callout flex items-start gap-2", TONE[tone]), "data-tone": tone, children: [
3416
3418
  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 }),
3417
3419
  /* @__PURE__ */ jsxRuntime.jsx(
3418
- chunkUKUAQJME_cjs.EditableRegion,
3420
+ chunkMGN332NY_cjs.EditableRegion,
3419
3421
  {
3420
3422
  block: block.id,
3421
3423
  region: "body",
@@ -3484,22 +3486,22 @@ var headingStyles = (level) => `quoin-heading mb-1 font-semibold leading-tight i
3484
3486
  function Heading({ block }) {
3485
3487
  const labels = useLabels();
3486
3488
  const level = chunkI7X7B3WD_cjs.headingLevel(block.attrs.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) }) });
3489
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "heading", "aria-level": level, className: headingStyles(level), children: /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.heading(level) }) });
3488
3490
  }
3489
3491
  function NumberedItem({ block, controller }) {
3490
3492
  const labels = useLabels();
3491
- const number = chunkUKUAQJME_cjs.useOrderedNumber(controller, block.id);
3493
+ const number = chunkMGN332NY_cjs.useOrderedNumber(controller, block.id);
3492
3494
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-list-item", "data-list": "ordered", children: [
3493
3495
  /* @__PURE__ */ jsxRuntime.jsx(ListMarker, { list: "ordered", number, depth: block.indent }),
3494
- /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.numberedItem(number) })
3496
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.numberedItem(number) })
3495
3497
  ] });
3496
3498
  }
3497
3499
  function TaskItem({ block, controller }) {
3498
3500
  const labels = useLabels();
3499
- const hostId = chunkUKUAQJME_cjs.useRegionDomId(block.id, REGION);
3501
+ const hostId = chunkMGN332NY_cjs.useRegionDomId(block.id, REGION);
3500
3502
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-task", "data-checked": block.attrs.checked === true, children: [
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 })
3503
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.TaskCheckbox, { block, controller, label: labels.task, labelledBy: hostId }),
3504
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { id: hostId, block: block.id, region: REGION, label: labels.task })
3503
3505
  ] });
3504
3506
  }
3505
3507
  var MarkdownBlock = (props) => {
@@ -3511,16 +3513,16 @@ var MarkdownBlock = (props) => {
3511
3513
  case "bullet":
3512
3514
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-list-item", "data-list": "bullet", children: [
3513
3515
  /* @__PURE__ */ jsxRuntime.jsx(ListMarker, { list: "bullet", depth: block.indent }),
3514
- /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.bulletItem })
3516
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.bulletItem })
3515
3517
  ] });
3516
3518
  case "ordered":
3517
3519
  return /* @__PURE__ */ jsxRuntime.jsx(NumberedItem, { ...props });
3518
3520
  case "task":
3519
3521
  return /* @__PURE__ */ jsxRuntime.jsx(TaskItem, { ...props });
3520
3522
  case "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 }) });
3523
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "quoin-quote", children: /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.quote }) });
3522
3524
  default:
3523
- return /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.paragraph });
3525
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { block: block.id, region: REGION, label: labels.paragraph });
3524
3526
  }
3525
3527
  };
3526
3528
 
@@ -3531,16 +3533,16 @@ function nestedBlockIds({ doc }, blockId) {
3531
3533
  return doc.blocks.slice(index + 1, chunkFK7EBZPX_cjs.descendantsEnd(doc, index)).map((block) => block.id);
3532
3534
  }
3533
3535
  function useNestedBlocks(controller, blockId) {
3534
- return chunkUKUAQJME_cjs.useEditorState(controller, (state) => nestedBlockIds(state, blockId), chunkI7X7B3WD_cjs.sameItems);
3536
+ return chunkMGN332NY_cjs.useEditorState(controller, (state) => nestedBlockIds(state, blockId), chunkI7X7B3WD_cjs.sameItems);
3535
3537
  }
3536
3538
  var ToggleBlock = ({ block, controller }) => {
3537
3539
  const labels = useLabels();
3538
- const domId = chunkUKUAQJME_cjs.useBlockDomId();
3540
+ const domId = chunkMGN332NY_cjs.useBlockDomId();
3539
3541
  const nested = useNestedBlocks(controller, block.id);
3540
- const open = chunkUKUAQJME_cjs.useToggleOpen(controller, block);
3542
+ const open = chunkMGN332NY_cjs.useToggleOpen(controller, block);
3541
3543
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "quoin-toggle", "data-open": open, children: [
3542
3544
  /* @__PURE__ */ jsxRuntime.jsx(
3543
- chunkUKUAQJME_cjs.ToggleChevron,
3545
+ chunkMGN332NY_cjs.ToggleChevron,
3544
3546
  {
3545
3547
  block,
3546
3548
  controller,
@@ -3548,7 +3550,7 @@ var ToggleBlock = ({ block, controller }) => {
3548
3550
  controls: nested.length === 0 ? void 0 : nested.map(domId).join(" ")
3549
3551
  }
3550
3552
  ),
3551
- /* @__PURE__ */ jsxRuntime.jsx(chunkUKUAQJME_cjs.EditableRegion, { block: block.id, region: "text", label: labels.toggle })
3553
+ /* @__PURE__ */ jsxRuntime.jsx(chunkMGN332NY_cjs.EditableRegion, { block: block.id, region: "text", label: labels.toggle })
3552
3554
  ] });
3553
3555
  };
3554
3556
 
@@ -3645,7 +3647,7 @@ function ActionItem({ kit, controller, action, blockIds }) {
3645
3647
  );
3646
3648
  }
3647
3649
  function BlockMenuItems({ kit, controller, blocks, styled, title, actions }) {
3648
- const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
3650
+ const state = chunkMGN332NY_cjs.useEditorState(controller, chunkMGN332NY_cjs.wholeState);
3649
3651
  const blockIds = blocks.map((block) => block.id);
3650
3652
  const shown = actions.filter((action) => action.available?.(state, blockIds) ?? true);
3651
3653
  const anyText = styled.some((block) => chunkFK7EBZPX_cjs.isTextFlow(state.schema, block));
@@ -3690,7 +3692,7 @@ var CONTEXT_KIT = {
3690
3692
  SubTrigger: ContextMenuSubTrigger
3691
3693
  };
3692
3694
  var GUTTER_BLOCK = "data-quoin-gutter-block";
3693
- var OWN_MENU = `[${chunkUKUAQJME_cjs.NATIVE_INTERACTION}], input, textarea, select`;
3695
+ var OWN_MENU = `[${chunkMGN332NY_cjs.NATIVE_INTERACTION}], input, textarea, select`;
3694
3696
  function contextBlock(controller, target) {
3695
3697
  const { state } = controller.editor;
3696
3698
  const gutter = target.closest(`[${GUTTER_BLOCK}]`)?.getAttribute(GUTTER_BLOCK);
@@ -3719,7 +3721,7 @@ function useContextMenuOpener(controller, store, trigger) {
3719
3721
  openBlockMenuAt(store, controller.editor.state, block, clientX, clientY);
3720
3722
  hidden.dispatchEvent(new MouseEvent("contextmenu", { bubbles: true, cancelable: true, clientX, clientY }));
3721
3723
  };
3722
- return chunkUKUAQJME_cjs.listen(root, { mousedown: onMouseDown, contextmenu: onContextMenu });
3724
+ return chunkMGN332NY_cjs.listen(root, { mousedown: onMouseDown, contextmenu: onContextMenu });
3723
3725
  }, [controller, store, trigger]);
3724
3726
  }
3725
3727
 
@@ -3755,7 +3757,7 @@ function useLiveBlocks(controller, blockIds) {
3755
3757
  (state) => blockIds.flatMap((id) => chunkI7X7B3WD_cjs.blockById(state.doc, id) ?? []),
3756
3758
  [blockIds]
3757
3759
  );
3758
- return chunkUKUAQJME_cjs.useEditorState(controller, select, chunkI7X7B3WD_cjs.sameItems);
3760
+ return chunkMGN332NY_cjs.useEditorState(controller, select, chunkI7X7B3WD_cjs.sameItems);
3759
3761
  }
3760
3762
  function useMenuBlocks(controller, store, menu) {
3761
3763
  const labels = useLabels();
@@ -3882,7 +3884,7 @@ var DragOverlay = React7.forwardRef(function DragOverlay2(_props, ref) {
3882
3884
  var DELETION_STEPS = /* @__PURE__ */ new Set(["removeBlocks", "setIndent"]);
3883
3885
  function drawnPosition(doc, blockId) {
3884
3886
  const index = doc.index.get(blockId) ?? 0;
3885
- return [chunkUKUAQJME_cjs.drawnBlockCount(doc, 0, index) + 1, chunkUKUAQJME_cjs.drawnBlockCount(doc)];
3887
+ return [chunkMGN332NY_cjs.drawnBlockCount(doc, 0, index) + 1, chunkMGN332NY_cjs.drawnBlockCount(doc)];
3886
3888
  }
3887
3889
  function blockMovedMessage(doc, blockId, labels) {
3888
3890
  return labels.blockMoved(...drawnPosition(doc, blockId));
@@ -3898,7 +3900,7 @@ function deletedCount(tr) {
3898
3900
  return tr.steps.reduce((deleted, step, i) => {
3899
3901
  const { index, count } = step.toJSON();
3900
3902
  if (step.stepType !== "removeBlocks" || typeof index !== "number" || typeof count !== "number") return deleted;
3901
- return deleted + chunkUKUAQJME_cjs.drawnBlockCount(tr.docs[i], index, index + count);
3903
+ return deleted + chunkMGN332NY_cjs.drawnBlockCount(tr.docs[i], index, index + count);
3902
3904
  }, 0);
3903
3905
  }
3904
3906
  function insertedBlock(tr) {
@@ -3919,9 +3921,6 @@ function structureAnnouncement(tr, labels, undoKeys) {
3919
3921
  return inserted === null ? null : labels.blockInserted(...drawnPosition(tr.doc, inserted));
3920
3922
  }
3921
3923
 
3922
- // src/ui/direction.ts
3923
- var inlineDirection = (element) => getComputedStyle(element).direction === "rtl" ? "rtl" : "ltr";
3924
-
3925
3924
  // src/drag/drag-layout.ts
3926
3925
  var INDENT_STEP_REM = 1.5;
3927
3926
  function rootOrigin(root) {
@@ -3940,7 +3939,7 @@ function inlineEdges(shell, box, rtl) {
3940
3939
  function measure(controller, root, moved, rtl) {
3941
3940
  const { doc } = controller.editor.state;
3942
3941
  const origin = rootOrigin(root);
3943
- return chunkUKUAQJME_cjs.visibleBlockIndexes(doc).flatMap((index) => {
3942
+ return chunkMGN332NY_cjs.visibleBlockIndexes(doc).flatMap((index) => {
3944
3943
  const { id, indent: indent3 } = doc.blocks[index];
3945
3944
  const shell = controller.blockElement(id);
3946
3945
  if (shell === void 0) return [];
@@ -3953,7 +3952,7 @@ function measure(controller, root, moved, rtl) {
3953
3952
  var furthestEnd = (blocks, rtl) => blocks.reduce((end, block) => rtl ? Math.min(end, block.end) : Math.max(end, block.end), blocks[0].end);
3954
3953
  function measureDrag(controller, root, ids) {
3955
3954
  const { doc } = controller.editor.state;
3956
- const direction = inlineDirection(root);
3955
+ const direction = chunkMGN332NY_cjs.inlineDirection(root);
3957
3956
  const rtl = direction === "rtl";
3958
3957
  const moved = new Set(chunkFK7EBZPX_cjs.movedBlockIds(doc, ids));
3959
3958
  const blocks = measure(controller, root, moved, rtl);
@@ -4015,7 +4014,7 @@ function draggedBlocks(controller, blockId) {
4015
4014
  function followPress(press, root, view) {
4016
4015
  const { controller, store, overlay, handle: handle2, pointerId } = press;
4017
4016
  const doc = view.document;
4018
- const scroll = chunkUKUAQJME_cjs.createAutoScroll(root, follow, SCROLL_EDGE);
4017
+ const scroll = chunkMGN332NY_cjs.createAutoScroll(root, follow, SCROLL_EDGE);
4019
4018
  let pointer = { x: press.x, y: press.y };
4020
4019
  let active = null;
4021
4020
  let unsubscribe = () => {
@@ -4090,9 +4089,9 @@ function followPress(press, root, view) {
4090
4089
  event.stopPropagation();
4091
4090
  finish();
4092
4091
  }
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);
4092
+ const unlistenDocument = chunkMGN332NY_cjs.listen(doc, { pointermove: onPointerMove, pointerup: onPointerUp, pointercancel: finish });
4093
+ const unlistenBlur = chunkMGN332NY_cjs.listen(view, { blur: finish });
4094
+ const unlistenKeys = chunkMGN332NY_cjs.listen(view, { keydown: onKeyDown }, true);
4096
4095
  return finish;
4097
4096
  }
4098
4097
  function pressDragHandle(press) {
@@ -4221,13 +4220,13 @@ function place2(controller, root, gutter, block) {
4221
4220
  const line = firstLine(shell);
4222
4221
  const top = line.top + (line.height - gutter.offsetHeight) / 2 - rootBox.top - root.clientTop + root.scrollTop;
4223
4222
  const shellBox = shell.getBoundingClientRect();
4224
- const beside = inlineDirection(root) === "rtl" ? shellBox.right + GAP : shellBox.left - gutter.offsetWidth - GAP;
4223
+ const beside = chunkMGN332NY_cjs.inlineDirection(root) === "rtl" ? shellBox.right + GAP : shellBox.left - gutter.offsetWidth - GAP;
4225
4224
  const left = beside - rootBox.left - root.clientLeft + root.scrollLeft;
4226
4225
  gutter.style.transform = `translate(${left}px, ${top}px)`;
4227
4226
  gutter.style.visibility = "";
4228
4227
  }
4229
4228
  function useGutterPosition(controller, gutter, block) {
4230
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
4229
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
4231
4230
  const element = gutter.current;
4232
4231
  const root = controller.root;
4233
4232
  const view = root?.ownerDocument.defaultView;
@@ -4259,7 +4258,7 @@ function blockAcross(controller, root, y) {
4259
4258
  }
4260
4259
  function useGutterTarget(controller, store, gutter) {
4261
4260
  const hovered = useCanvasUi(store, (state) => state.hoveredBlock);
4262
- const head = chunkUKUAQJME_cjs.useEditorState(controller, headOf);
4261
+ const head = chunkMGN332NY_cjs.useEditorState(controller, headOf);
4263
4262
  const [focusWithin, setFocusWithin] = React7.useState(false);
4264
4263
  React7.useEffect(() => {
4265
4264
  const root = controller.root;
@@ -4277,7 +4276,7 @@ function useGutterTarget(controller, store, gutter) {
4277
4276
  const onFocusIn = () => setFocusWithin(true);
4278
4277
  const onFocusOut = (event) => setFocusWithin(root.contains(event.relatedTarget));
4279
4278
  setFocusWithin(root.contains(root.ownerDocument.activeElement));
4280
- return chunkUKUAQJME_cjs.listen(root, { pointermove: onPointerMove, pointerleave: onPointerLeave, focusin: onFocusIn, focusout: onFocusOut });
4279
+ return chunkMGN332NY_cjs.listen(root, { pointermove: onPointerMove, pointerleave: onPointerLeave, focusin: onFocusIn, focusout: onFocusOut });
4281
4280
  }, [controller, store, gutter]);
4282
4281
  const fallback = focusWithin ? head : null;
4283
4282
  const target = hovered ?? fallback;
@@ -4355,7 +4354,15 @@ function Gutter({ controller, store, actions }) {
4355
4354
  }
4356
4355
 
4357
4356
  // src/i18n/resolve-labels.ts
4358
- var resolveLabels = (overrides) => chunkZWTIRGY5_cjs.mergeLabels(englishLabels, overrides);
4357
+ var isRecord = (value) => typeof value === "object" && value !== null;
4358
+ function ontoRecords(overrides) {
4359
+ const taken = Object.entries(overrides).map(([key, value]) => {
4360
+ const fallback = englishLabels[key];
4361
+ return [key, isRecord(value) && isRecord(fallback) ? { ...fallback, ...value } : value];
4362
+ });
4363
+ return Object.fromEntries(taken);
4364
+ }
4365
+ var resolveLabels = (overrides) => chunkZWTIRGY5_cjs.mergeLabels(englishLabels, overrides && ontoRecords(overrides));
4359
4366
 
4360
4367
  // src/menus/floating/range-rect.ts
4361
4368
  var TEXT_NODE = 3;
@@ -4370,7 +4377,7 @@ function pointInHost(host, { node, offset }) {
4370
4377
  return host.contains(node) ? { node, offset: Math.min(offset, nodeLength(node)) } : null;
4371
4378
  }
4372
4379
  function textRect(host, { from, to }) {
4373
- const map = chunkUKUAQJME_cjs.domMapOf(host);
4380
+ const map = chunkMGN332NY_cjs.domMapOf(host);
4374
4381
  const range = host.ownerDocument.createRange();
4375
4382
  if (map === void 0 || typeof range.getBoundingClientRect !== "function") return null;
4376
4383
  const start = pointInHost(host, map.toDom(from, 1));
@@ -4383,7 +4390,7 @@ function textRect(host, { from, to }) {
4383
4390
  }
4384
4391
  function rangeRect(controller, range) {
4385
4392
  const host = controller.registry.get(range.block, range.region);
4386
- if (host === void 0 || !host.isConnected || controller.composingKey === chunkUKUAQJME_cjs.hostKey(range.block, range.region)) {
4393
+ if (host === void 0 || !host.isConnected || controller.composingKey === chunkMGN332NY_cjs.hostKey(range.block, range.region)) {
4387
4394
  return null;
4388
4395
  }
4389
4396
  const rect = textRect(host, range);
@@ -4424,7 +4431,7 @@ function useSelectionAnchor(controller, state) {
4424
4431
  [controller, state]
4425
4432
  );
4426
4433
  const [side, setSide] = React7.useState("top");
4427
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
4434
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
4428
4435
  const rect = selectionRect(controller);
4429
4436
  if (rect) setSide(rect.top < ROOM_ABOVE ? "bottom" : "top");
4430
4437
  }, [controller, state]);
@@ -4506,7 +4513,7 @@ function TurnIntoDropdown({ controller, state }) {
4506
4513
  }
4507
4514
  var DIVIDER = "mx-0.5 h-5 w-px shrink-0 bg-border";
4508
4515
  function BubbleToolbar({ controller, labels, store, extraItems }) {
4509
- const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
4516
+ const state = chunkMGN332NY_cjs.useEditorState(controller, chunkMGN332NY_cjs.wholeState);
4510
4517
  const { anchor, side } = useSelectionAnchor(controller, state);
4511
4518
  const roving = useRovingFocus();
4512
4519
  const items = React7.useMemo(() => bubbleItems(labels, () => store.set({ linkPopover: { open: true } })), [labels, store]);
@@ -4570,8 +4577,8 @@ var useFinePointer = () => useMediaQuery("(pointer: fine)", true);
4570
4577
  // src/menus/bubble/use-bubble-visibility.ts
4571
4578
  var hasTextRange = (state) => state.selection?.kind === "text" && !chunkFK7EBZPX_cjs.isCollapsed(state.selection) && chunkFK7EBZPX_cjs.markRanges(state).length > 0;
4572
4579
  function useBubbleVisibility(controller) {
4573
- const range = chunkUKUAQJME_cjs.useEditorState(controller, hasTextRange);
4574
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
4580
+ const range = chunkMGN332NY_cjs.useEditorState(controller, hasTextRange);
4581
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
4575
4582
  const fine = useFinePointer();
4576
4583
  const settled = useSelectionSettled(controller);
4577
4584
  return range && !readOnly && fine && settled;
@@ -4594,7 +4601,7 @@ function bubbleExtension() {
4594
4601
  // src/menus/link/link-at-selection.ts
4595
4602
  function linkAround(state, from, to = from) {
4596
4603
  if (from.block !== to.block || from.region !== to.region) return null;
4597
- const inline = chunkUKUAQJME_cjs.regionInline(state, from.block, from.region) ?? [];
4604
+ const inline = chunkMGN332NY_cjs.regionInline(state, from.block, from.region) ?? [];
4598
4605
  const extent = chunkFK7EBZPX_cjs.markExtent(inline, from.offset, "link");
4599
4606
  if (extent === null || to.offset > extent.to) return null;
4600
4607
  const attrs = chunkI7X7B3WD_cjs.sliceInline(inline, extent.from, extent.to)[0]?.marks.find((mark) => mark.type === "link")?.attrs;
@@ -4617,7 +4624,7 @@ function linkElementAt(controller, target) {
4617
4624
  }
4618
4625
  function linkAtElement(controller, state, element) {
4619
4626
  const host = controller.registry.locate(element);
4620
- const offset = host === null ? null : chunkUKUAQJME_cjs.domMapOf(host.element)?.fromDom(element, 0) ?? null;
4627
+ const offset = host === null ? null : chunkMGN332NY_cjs.domMapOf(host.element)?.fromDom(element, 0) ?? null;
4621
4628
  if (host === null || offset === null) return null;
4622
4629
  return linkAround(state, { block: host.block, region: host.region, offset });
4623
4630
  }
@@ -4670,7 +4677,7 @@ function caretLinkKey(state) {
4670
4677
  return link && [link.range.block, link.range.region, link.range.from, link.href].join("\0");
4671
4678
  }
4672
4679
  function useCaretInLink(controller, delay) {
4673
- const key = chunkUKUAQJME_cjs.useEditorState(controller, caretLinkKey);
4680
+ const key = chunkMGN332NY_cjs.useEditorState(controller, caretLinkKey);
4674
4681
  const settled = useSelectionSettled(controller);
4675
4682
  return useRestedValue(settled ? key : null, delay) !== null;
4676
4683
  }
@@ -4704,7 +4711,7 @@ var URL_LENGTH = 48;
4704
4711
  var CARD = "flex w-auto items-center gap-0.5 py-1 ps-3 pe-1 shadow-md";
4705
4712
  var ADDRESS = "me-1 whitespace-nowrap text-sm text-muted-foreground";
4706
4713
  function LinkCard({ controller, labels, store, cardRef, element, onUnlinked }) {
4707
- const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
4714
+ const state = chunkMGN332NY_cjs.useEditorState(controller, chunkMGN332NY_cjs.wholeState);
4708
4715
  const link = React7.useMemo(
4709
4716
  () => element === null ? linkAtSelection(state) : linkAtElement(controller, state, element),
4710
4717
  [controller, state, element]
@@ -4722,7 +4729,7 @@ function LinkCard({ controller, labels, store, cardRef, element, onUnlinked }) {
4722
4729
  const edit2 = () => {
4723
4730
  if (element !== null) {
4724
4731
  const selection = chunkFK7EBZPX_cjs.textSelection({ block, region, offset: from }, { block, region, offset: to });
4725
- chunkUKUAQJME_cjs.dispatchSelection(controller, selection);
4732
+ chunkMGN332NY_cjs.dispatchSelection(controller, selection);
4726
4733
  }
4727
4734
  store.set({ linkPopover: { open: true } });
4728
4735
  };
@@ -4889,7 +4896,7 @@ function LinkOverlay({ controller }) {
4889
4896
  const labels = useLabels();
4890
4897
  const store = useCanvasUiStore();
4891
4898
  const popoverOpen = useCanvasUi(store, isPopoverOpen);
4892
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
4899
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
4893
4900
  useLinkClicks(controller);
4894
4901
  React7.useEffect(() => {
4895
4902
  if (readOnly && store.get().linkPopover.open) store.set({ linkPopover: { open: false } });
@@ -5069,10 +5076,10 @@ function useRangeAnchor(controller, range) {
5069
5076
  const [side, setSide] = React7.useState("bottom");
5070
5077
  const latest = React7.useRef(range);
5071
5078
  const start = range === null ? null : `${range.block} ${range.region} ${range.from}`;
5072
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5079
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5073
5080
  latest.current = range;
5074
5081
  });
5075
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5082
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5076
5083
  const rect = latest.current && rangeRect(controller, latest.current);
5077
5084
  const height = controller.root?.ownerDocument.defaultView?.innerHeight;
5078
5085
  if (rect && height !== void 0) setSide(sideFor(rect, height));
@@ -5099,11 +5106,11 @@ function openCombobox(host, listboxId) {
5099
5106
  }
5100
5107
  function useComboboxHost(controller, block, region, listboxId, activeOptionId) {
5101
5108
  const host = React7.useRef(null);
5102
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5109
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5103
5110
  host.current = block === null || region === null ? null : controller.registry.get(block, region) ?? null;
5104
5111
  return host.current === null ? void 0 : openCombobox(host.current, listboxId);
5105
5112
  }, [controller, block, region, listboxId]);
5106
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5113
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5107
5114
  if (host.current !== null) restore(host.current, "aria-activedescendant", activeOptionId);
5108
5115
  }, [block, region, activeOptionId]);
5109
5116
  }
@@ -5149,10 +5156,10 @@ function handle(event, menu) {
5149
5156
  }
5150
5157
  function useSuggestionKeys(controller, open, menu) {
5151
5158
  const latest = React7.useRef(menu);
5152
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5159
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5153
5160
  latest.current = menu;
5154
5161
  });
5155
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5162
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5156
5163
  if (!open) return;
5157
5164
  const intercept = (event) => {
5158
5165
  const handled = handle(event, latest.current);
@@ -5173,10 +5180,10 @@ var isPromise = (value) => typeof value?.then === "function";
5173
5180
  function useSuggestionResults(source, query, onError) {
5174
5181
  const [answer, setAnswer] = React7.useState(FORGOTTEN);
5175
5182
  const report = React7.useRef(onError);
5176
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5183
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5177
5184
  report.current = onError;
5178
5185
  });
5179
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5186
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5180
5187
  if (query === null) {
5181
5188
  setAnswer(FORGOTTEN);
5182
5189
  return;
@@ -5220,9 +5227,9 @@ function useSuggestion({
5220
5227
  emptyLabel
5221
5228
  }) {
5222
5229
  const { labels, onError } = useQuoin();
5223
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
5230
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
5224
5231
  const selectTrigger = React7.useCallback((state) => chunkFK7EBZPX_cjs.getPluginState(state, pluginKey).active, [pluginKey]);
5225
- const active = chunkUKUAQJME_cjs.useEditorState(controller, selectTrigger);
5232
+ const active = chunkMGN332NY_cjs.useEditorState(controller, selectTrigger);
5226
5233
  const trigger = readOnly ? null : active;
5227
5234
  const results = useSuggestionResults(source, trigger?.query ?? null, onError);
5228
5235
  const sections = React7.useMemo(() => groupItems(results.items, groupOf2), [results.items, groupOf2]);
@@ -5292,7 +5299,7 @@ function SuggestionMenu(props) {
5292
5299
  const { trigger, sections, activeIndex, listboxId } = suggestion;
5293
5300
  const { anchor, side } = useRangeAnchor(controller, trigger);
5294
5301
  const listbox = React7.useRef(null);
5295
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
5302
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5296
5303
  listbox.current?.querySelector('[aria-selected="true"]')?.scrollIntoView?.({ block: "nearest" });
5297
5304
  }, [activeIndex, sections]);
5298
5305
  if (trigger === null) return null;
@@ -5371,7 +5378,7 @@ var TEXT_STEPS = /* @__PURE__ */ new Set(["replaceInline", "addMark", "removeMar
5371
5378
  var WHITESPACE3 = /\s/;
5372
5379
  var changesBlocks = (tr) => tr !== null && tr.steps.some((step) => !TEXT_STEPS.has(step.stepType));
5373
5380
  function withSpaceBefore(state, range) {
5374
- const inline = chunkUKUAQJME_cjs.regionInline(state, range.block, range.region);
5381
+ const inline = chunkMGN332NY_cjs.regionInline(state, range.block, range.region);
5375
5382
  if (inline === void 0 || range.from === 0) return null;
5376
5383
  const text2 = chunkI7X7B3WD_cjs.inlineText(inline);
5377
5384
  const after = text2.charAt(range.to);
@@ -5559,7 +5566,7 @@ function placement(viewport) {
5559
5566
  function EditingTools({ controller }) {
5560
5567
  const labels = useLabels();
5561
5568
  const store = useCanvasUiStore();
5562
- const state = chunkUKUAQJME_cjs.useEditorState(controller, chunkUKUAQJME_cjs.wholeState);
5569
+ const state = chunkMGN332NY_cjs.useEditorState(controller, chunkMGN332NY_cjs.wholeState);
5563
5570
  const viewport = useVisualViewport();
5564
5571
  const roving = useRovingFocus();
5565
5572
  const items = React7.useMemo(() => mobileItems(labels, () => store.set({ linkPopover: { open: true } })), [labels, store]);
@@ -5822,6 +5829,14 @@ function shortcutsExtension(store) {
5822
5829
  ui: { overlays: [ShortcutsOverlay] }
5823
5830
  });
5824
5831
  }
5832
+ function useRootDirection(controller) {
5833
+ const [direction, setDirection] = React7.useState("ltr");
5834
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
5835
+ const root = controller.root;
5836
+ if (root !== null) setDirection(chunkMGN332NY_cjs.inlineDirection(root));
5837
+ }, [controller]);
5838
+ return direction;
5839
+ }
5825
5840
 
5826
5841
  // src/canvas/block-link.ts
5827
5842
  var FRAGMENT = "#block-";
@@ -5883,7 +5898,7 @@ function runHistoryKey(controller, event) {
5883
5898
  }
5884
5899
  function useBlockIndex(controller, blockId) {
5885
5900
  const select = React7.useCallback((state) => state.doc.index.get(blockId) ?? -1, [blockId]);
5886
- return chunkUKUAQJME_cjs.useEditorState(controller, select);
5901
+ return chunkMGN332NY_cjs.useEditorState(controller, select);
5887
5902
  }
5888
5903
  var FOCUSABLE = [
5889
5904
  "input:not([disabled])",
@@ -5910,8 +5925,8 @@ function useEditingFocus(root, editing, stop) {
5910
5925
  const leaveUnlessInside = (event) => {
5911
5926
  if (!inside.current.has(event)) stop();
5912
5927
  };
5913
- const unlistenCapture = chunkUKUAQJME_cjs.listen(doc, { pointerdown: leaveForCanvas }, true);
5914
- const unlisten = chunkUKUAQJME_cjs.listen(doc, { pointerdown: leaveUnlessInside, focusin: leaveUnlessInside });
5928
+ const unlistenCapture = chunkMGN332NY_cjs.listen(doc, { pointerdown: leaveForCanvas }, true);
5929
+ const unlisten = chunkMGN332NY_cjs.listen(doc, { pointerdown: leaveUnlessInside, focusin: leaveUnlessInside });
5915
5930
  return () => {
5916
5931
  unlistenCapture();
5917
5932
  unlisten();
@@ -5940,8 +5955,8 @@ function VoidEditor({ Editor, controller, ...props }) {
5940
5955
  }
5941
5956
  function VoidBlock({ block, controller, definition }) {
5942
5957
  const { blockTypes, labels } = useQuoin();
5943
- const { report } = React7.useContext(chunkUKUAQJME_cjs.BlockErrorContext);
5944
- const readOnly = chunkUKUAQJME_cjs.useReadOnly(controller);
5958
+ const { report } = React7.useContext(chunkMGN332NY_cjs.BlockErrorContext);
5959
+ const readOnly = chunkMGN332NY_cjs.useReadOnly(controller);
5945
5960
  const { editor: Editor, alwaysEditing = false } = definition;
5946
5961
  const name = blockTypeLabel(labels, block, blockTypes);
5947
5962
  const blockId = block.id;
@@ -6005,7 +6020,7 @@ function VoidBlock({ block, controller, definition }) {
6005
6020
  role: "group",
6006
6021
  "aria-label": name,
6007
6022
  tabIndex: editorShown ? -1 : void 0,
6008
- ...{ [chunkUKUAQJME_cjs.NATIVE_INTERACTION]: editorShown ? "" : void 0 },
6023
+ ...{ [chunkMGN332NY_cjs.NATIVE_INTERACTION]: editorShown ? "" : void 0 },
6009
6024
  onKeyDown,
6010
6025
  ...focusHandlers,
6011
6026
  onClick,
@@ -6226,7 +6241,7 @@ function deletions(codec, tr) {
6226
6241
  }
6227
6242
  function useDeleteReporter(controller, onDelete) {
6228
6243
  const latest = React7.useRef(onDelete);
6229
- chunkUKUAQJME_cjs.useIsomorphicLayoutEffect(() => {
6244
+ chunkMGN332NY_cjs.useIsomorphicLayoutEffect(() => {
6230
6245
  latest.current = onDelete;
6231
6246
  });
6232
6247
  React7.useEffect(() => {
@@ -6303,7 +6318,7 @@ var BlockCanvas = React7.forwardRef(function BlockCanvas2({
6303
6318
  );
6304
6319
  useDefinitionWarnings(blockTypes, readOnly);
6305
6320
  const [focusOnMount] = React7.useState(autoFocus);
6306
- const controller = chunkUKUAQJME_cjs.useQuoinEditor({
6321
+ const controller = chunkMGN332NY_cjs.useQuoinEditor({
6307
6322
  blocks,
6308
6323
  onChange,
6309
6324
  readOnly,
@@ -6339,6 +6354,7 @@ var BlockCanvas = React7.forwardRef(function BlockCanvas2({
6339
6354
  const placeholderLabels = placeholder === void 0 ? labels : { ...labels, placeholderEmpty: placeholder };
6340
6355
  return (state, block) => placeholderFor(state, block, placeholderLabels);
6341
6356
  }, [labels, placeholder]);
6357
+ const direction = useRootDirection(controller);
6342
6358
  React7.useImperativeHandle(
6343
6359
  ref,
6344
6360
  () => ({
@@ -6349,8 +6365,8 @@ var BlockCanvas = React7.forwardRef(function BlockCanvas2({
6349
6365
  }),
6350
6366
  [controller, resolveAssetUrl]
6351
6367
  );
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(
6353
- chunkUKUAQJME_cjs.EditorView,
6368
+ return /* @__PURE__ */ jsxRuntime.jsx(reactDirection.DirectionProvider, { dir: direction, children: /* @__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(
6369
+ chunkMGN332NY_cjs.EditorView,
6354
6370
  {
6355
6371
  controller,
6356
6372
  renderers: ui.renderers,
@@ -6376,7 +6392,7 @@ var BlockCanvas = React7.forwardRef(function BlockCanvas2({
6376
6392
  ui.overlays.map((Overlay2, index) => /* @__PURE__ */ jsxRuntime.jsx(Overlay2, { controller }, index))
6377
6393
  ]
6378
6394
  }
6379
- ) }) }) }) }) });
6395
+ ) }) }) }) }) }) });
6380
6396
  });
6381
6397
  function progressText(state, labels) {
6382
6398
  if (state.phase === "busy") return labels.uploading;
@@ -6440,8 +6456,15 @@ async function attemptSave(run) {
6440
6456
  return { error };
6441
6457
  }
6442
6458
  }
6459
+ function retryable(error, isRetryable) {
6460
+ try {
6461
+ return isRetryable(error);
6462
+ } catch {
6463
+ return false;
6464
+ }
6465
+ }
6443
6466
  function nextRetryDelay(error, retriesSoFar, { debounceMs, maxBackoffMs, maxRetries, isRetryable }) {
6444
- if (retriesSoFar >= maxRetries || !isRetryable(error)) return null;
6467
+ if (retriesSoFar >= maxRetries || !retryable(error, isRetryable)) return null;
6445
6468
  return Math.min(debounceMs * 2 ** (retriesSoFar + 1), maxBackoffMs);
6446
6469
  }
6447
6470
 
@@ -6634,7 +6657,6 @@ exports.dismissSuggestion = dismissSuggestion;
6634
6657
  exports.englishLabels = englishLabels;
6635
6658
  exports.focusNode = focusNode;
6636
6659
  exports.formatShortcut = formatShortcut;
6637
- exports.inlineDirection = inlineDirection;
6638
6660
  exports.insertBlockToWrite = insertBlockToWrite;
6639
6661
  exports.insertBlocks = insertBlocks;
6640
6662
  exports.interceptKeys = interceptKeys;