@harbour-enterprises/superdoc 1.0.0-beta.60 → 1.0.0-beta.61

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 (30) hide show
  1. package/dist/chunks/{PdfViewer-C4HeazGQ.es.js → PdfViewer-BHLsVrSe.es.js} +1 -1
  2. package/dist/chunks/{PdfViewer-4-HewDUK.cjs → PdfViewer-CuTlpPQO.cjs} +1 -1
  3. package/dist/chunks/{index-BKfoD32c.es.js → index-DeFp1DEO.es.js} +13 -6
  4. package/dist/chunks/{index-9qSCXVF1.cjs → index-E5x6cBKw.cjs} +13 -6
  5. package/dist/chunks/{index-GAzIoyrZ-zhiF5zMK.es.js → index-u8dj63PM-Bfomc8Z6.es.js} +1 -1
  6. package/dist/chunks/{index-GAzIoyrZ-C17wg4bM.cjs → index-u8dj63PM-VgHx1nNP.cjs} +1 -1
  7. package/dist/chunks/{super-editor.es-CJ3Aw1GR.es.js → super-editor.es-CI3WoKIG.es.js} +571 -87
  8. package/dist/chunks/{super-editor.es-DCHFBNql.cjs → super-editor.es-nY9_xN6Z.cjs} +571 -87
  9. package/dist/packages/superdoc/src/core/SuperDoc.d.ts.map +1 -1
  10. package/dist/style.css +44 -56
  11. package/dist/super-editor/ai-writer.es.js +2 -2
  12. package/dist/super-editor/chunks/{converter-DZ7Tkh7u.js → converter-DaSkPzA9.js} +3 -3
  13. package/dist/super-editor/chunks/{docx-zipper-CZQWEuyi.js → docx-zipper-Cx1zgQ8B.js} +1 -1
  14. package/dist/super-editor/chunks/{editor-CDMuD1Nx.js → editor-45pxcsTR.js} +508 -23
  15. package/dist/super-editor/chunks/{index-GAzIoyrZ.js → index-u8dj63PM.js} +1 -1
  16. package/dist/super-editor/chunks/{toolbar-DL3rTlKm.js → toolbar-C4OC-AnI.js} +2 -2
  17. package/dist/super-editor/converter.es.js +1 -1
  18. package/dist/super-editor/docx-zipper.es.js +2 -2
  19. package/dist/super-editor/editor.es.js +3 -3
  20. package/dist/super-editor/file-zipper.es.js +1 -1
  21. package/dist/super-editor/style.css +17 -29
  22. package/dist/super-editor/super-editor.es.js +96 -94
  23. package/dist/super-editor/toolbar.es.js +2 -2
  24. package/dist/super-editor.cjs +1 -1
  25. package/dist/super-editor.es.js +1 -1
  26. package/dist/superdoc.cjs +2 -2
  27. package/dist/superdoc.es.js +2 -2
  28. package/dist/superdoc.umd.js +583 -92
  29. package/dist/superdoc.umd.js.map +1 -1
  30. package/package.json +1 -1
@@ -42144,8 +42144,8 @@ const _SuperConverter = class _SuperConverter2 {
42144
42144
  const converter = new _SuperConverter2();
42145
42145
  const content = customXml.content;
42146
42146
  const contentJson = converter.parseXmlToJson(content);
42147
- const properties = contentJson.elements.find((el) => el.name === "Properties");
42148
- if (!properties.elements) return null;
42147
+ const properties = contentJson.elements?.find((el) => el.name === "Properties");
42148
+ if (!properties?.elements) return null;
42149
42149
  const property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
42150
42150
  if (!property2) return null;
42151
42151
  return property2.elements[0].elements[0].text;
@@ -42208,7 +42208,7 @@ const _SuperConverter = class _SuperConverter2 {
42208
42208
  static getStoredSuperdocVersion(docx) {
42209
42209
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
42210
42210
  }
42211
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.60") {
42211
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.61") {
42212
42212
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
42213
42213
  }
42214
42214
  /**
@@ -59397,7 +59397,7 @@ const isHeadless = (editor) => {
59397
59397
  const shouldSkipNodeView = (editor) => {
59398
59398
  return isHeadless(editor);
59399
59399
  };
59400
- const summaryVersion = "1.0.0-beta.60";
59400
+ const summaryVersion = "1.0.0-beta.61";
59401
59401
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
59402
59402
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
59403
59403
  function mapAttributes(attrs) {
@@ -60186,7 +60186,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60186
60186
  { default: remarkStringify },
60187
60187
  { default: remarkGfm }
60188
60188
  ] = await Promise.all([
60189
- Promise.resolve().then(() => require("./index-GAzIoyrZ-C17wg4bM.cjs")),
60189
+ Promise.resolve().then(() => require("./index-u8dj63PM-VgHx1nNP.cjs")),
60190
60190
  Promise.resolve().then(() => require("./index-DRCvimau-H4Ck3S9a.cjs")),
60191
60191
  Promise.resolve().then(() => require("./index-C_x_N6Uh-Db3CUJMX.cjs")),
60192
60192
  Promise.resolve().then(() => require("./index-D_sWOSiG-BtDZzJ6I.cjs")),
@@ -60391,7 +60391,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60391
60391
  * Process collaboration migrations
60392
60392
  */
60393
60393
  processCollaborationMigrations() {
60394
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.60");
60394
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.61");
60395
60395
  if (!this.options.ydoc) return;
60396
60396
  const metaMap = this.options.ydoc.getMap("meta");
60397
60397
  let docVersion = metaMap.get("version");
@@ -71557,6 +71557,408 @@ function assertFragmentPmPositions(fragment, _context) {
71557
71557
  const hasPmEnd = fragment.pmEnd != null;
71558
71558
  globalValidationStats.record(hasPmStart, hasPmEnd);
71559
71559
  }
71560
+ const DEFAULT_PPI = 96;
71561
+ const DEFAULT_RULER_HEIGHT = 25;
71562
+ const TICK_SPACING_PX = DEFAULT_PPI / 8;
71563
+ function generateRulerDefinition(config2) {
71564
+ const ppi = config2.ppi ?? DEFAULT_PPI;
71565
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
71566
+ const { pageSize, pageMargins } = config2;
71567
+ if (!Number.isFinite(ppi) || ppi <= 0) {
71568
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
71569
+ }
71570
+ if (!Number.isFinite(pageSize.width) || pageSize.width <= 0) {
71571
+ throw new Error(`Invalid page width: ${pageSize.width}. Must be a positive finite number.`);
71572
+ }
71573
+ if (!Number.isFinite(pageSize.height) || pageSize.height <= 0) {
71574
+ throw new Error(`Invalid page height: ${pageSize.height}. Must be a positive finite number.`);
71575
+ }
71576
+ if (!Number.isFinite(pageMargins.left) || pageMargins.left < 0) {
71577
+ throw new Error(`Invalid left margin: ${pageMargins.left}. Must be a non-negative finite number.`);
71578
+ }
71579
+ if (!Number.isFinite(pageMargins.right) || pageMargins.right < 0) {
71580
+ throw new Error(`Invalid right margin: ${pageMargins.right}. Must be a non-negative finite number.`);
71581
+ }
71582
+ if (pageMargins.left + pageMargins.right >= pageSize.width) {
71583
+ throw new Error(
71584
+ `Invalid margins: left (${pageMargins.left}) + right (${pageMargins.right}) must be less than page width (${pageSize.width}).`
71585
+ );
71586
+ }
71587
+ const widthPx = pageSize.width * ppi;
71588
+ const ticks = [];
71589
+ let currentX = 0;
71590
+ for (let inch = 0; inch < pageSize.width; inch++) {
71591
+ const remaining = pageSize.width - inch;
71592
+ ticks.push({
71593
+ size: "main",
71594
+ height: "20%",
71595
+ label: inch,
71596
+ x: currentX
71597
+ });
71598
+ currentX += TICK_SPACING_PX;
71599
+ for (let i = 0; i < 3; i++) {
71600
+ ticks.push({
71601
+ size: "eighth",
71602
+ height: "10%",
71603
+ x: currentX
71604
+ });
71605
+ currentX += TICK_SPACING_PX;
71606
+ }
71607
+ ticks.push({
71608
+ size: "half",
71609
+ height: "40%",
71610
+ x: currentX
71611
+ });
71612
+ currentX += TICK_SPACING_PX;
71613
+ if (remaining <= 0.5) break;
71614
+ for (let i = 0; i < 3; i++) {
71615
+ ticks.push({
71616
+ size: "eighth",
71617
+ height: "10%",
71618
+ x: currentX
71619
+ });
71620
+ currentX += TICK_SPACING_PX;
71621
+ }
71622
+ }
71623
+ return {
71624
+ widthPx,
71625
+ heightPx,
71626
+ ticks,
71627
+ leftMarginPx: pageMargins.left * ppi,
71628
+ rightMarginPx: widthPx - pageMargins.right * ppi,
71629
+ pageWidthInches: pageSize.width
71630
+ };
71631
+ }
71632
+ function calculateMarginFromHandle(handleX, side, pageWidthPx, ppi = DEFAULT_PPI) {
71633
+ if (side === "left") {
71634
+ return handleX / ppi;
71635
+ } else {
71636
+ return (pageWidthPx - handleX) / ppi;
71637
+ }
71638
+ }
71639
+ function clampHandlePosition(handleX, side, otherHandleX, pageWidthPx, minContentWidthPx = 200) {
71640
+ if (!Number.isFinite(handleX)) {
71641
+ throw new Error(`Invalid handleX: ${handleX}. Must be a finite number.`);
71642
+ }
71643
+ if (!Number.isFinite(otherHandleX)) {
71644
+ throw new Error(`Invalid otherHandleX: ${otherHandleX}. Must be a finite number.`);
71645
+ }
71646
+ if (!Number.isFinite(pageWidthPx)) {
71647
+ throw new Error(`Invalid pageWidthPx: ${pageWidthPx}. Must be a finite number.`);
71648
+ }
71649
+ if (!Number.isFinite(minContentWidthPx)) {
71650
+ throw new Error(`Invalid minContentWidthPx: ${minContentWidthPx}. Must be a finite number.`);
71651
+ }
71652
+ if (side === "left") {
71653
+ const min2 = 0;
71654
+ const max2 = otherHandleX - minContentWidthPx;
71655
+ return Math.max(min2, Math.min(max2, handleX));
71656
+ } else {
71657
+ const min2 = otherHandleX + minContentWidthPx;
71658
+ const max2 = pageWidthPx;
71659
+ return Math.max(min2, Math.min(max2, handleX));
71660
+ }
71661
+ }
71662
+ function generateRulerDefinitionFromPx(config2) {
71663
+ const ppi = config2.ppi ?? DEFAULT_PPI;
71664
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
71665
+ const { pageWidthPx, leftMarginPx, rightMarginPx } = config2;
71666
+ if (!Number.isFinite(ppi) || ppi <= 0) {
71667
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
71668
+ }
71669
+ if (!Number.isFinite(pageWidthPx) || pageWidthPx <= 0) {
71670
+ throw new Error(`Invalid page width: ${pageWidthPx}px. Must be a positive finite number.`);
71671
+ }
71672
+ if (!Number.isFinite(config2.pageHeightPx) || config2.pageHeightPx <= 0) {
71673
+ throw new Error(`Invalid page height: ${config2.pageHeightPx}px. Must be a positive finite number.`);
71674
+ }
71675
+ if (!Number.isFinite(leftMarginPx) || leftMarginPx < 0) {
71676
+ throw new Error(`Invalid left margin: ${leftMarginPx}px. Must be a non-negative finite number.`);
71677
+ }
71678
+ if (!Number.isFinite(rightMarginPx) || rightMarginPx < 0) {
71679
+ throw new Error(`Invalid right margin: ${rightMarginPx}px. Must be a non-negative finite number.`);
71680
+ }
71681
+ if (leftMarginPx + rightMarginPx >= pageWidthPx) {
71682
+ throw new Error(
71683
+ `Invalid margins: left (${leftMarginPx}px) + right (${rightMarginPx}px) must be less than page width (${pageWidthPx}px).`
71684
+ );
71685
+ }
71686
+ const pageWidthInches = pageWidthPx / ppi;
71687
+ const ticks = [];
71688
+ let currentX = 0;
71689
+ for (let inch = 0; inch < pageWidthInches; inch++) {
71690
+ const remaining = pageWidthInches - inch;
71691
+ ticks.push({
71692
+ size: "main",
71693
+ height: "20%",
71694
+ label: inch,
71695
+ x: currentX
71696
+ });
71697
+ currentX += TICK_SPACING_PX;
71698
+ for (let i = 0; i < 3; i++) {
71699
+ ticks.push({
71700
+ size: "eighth",
71701
+ height: "10%",
71702
+ x: currentX
71703
+ });
71704
+ currentX += TICK_SPACING_PX;
71705
+ }
71706
+ ticks.push({
71707
+ size: "half",
71708
+ height: "40%",
71709
+ x: currentX
71710
+ });
71711
+ currentX += TICK_SPACING_PX;
71712
+ if (remaining <= 0.5) break;
71713
+ for (let i = 0; i < 3; i++) {
71714
+ ticks.push({
71715
+ size: "eighth",
71716
+ height: "10%",
71717
+ x: currentX
71718
+ });
71719
+ currentX += TICK_SPACING_PX;
71720
+ }
71721
+ }
71722
+ return {
71723
+ widthPx: pageWidthPx,
71724
+ heightPx,
71725
+ ticks,
71726
+ leftMarginPx,
71727
+ rightMarginPx: pageWidthPx - rightMarginPx,
71728
+ pageWidthInches
71729
+ };
71730
+ }
71731
+ const RULER_CLASS_NAMES = {
71732
+ /** Main ruler container */
71733
+ ruler: "superdoc-ruler",
71734
+ /** Tick mark element */
71735
+ tick: "superdoc-ruler-tick",
71736
+ /** Main (inch) tick */
71737
+ tickMain: "superdoc-ruler-tick--main",
71738
+ /** Half-inch tick */
71739
+ tickHalf: "superdoc-ruler-tick--half",
71740
+ /** Eighth-inch tick */
71741
+ tickEighth: "superdoc-ruler-tick--eighth",
71742
+ /** Inch label number */
71743
+ label: "superdoc-ruler-label",
71744
+ /** Margin handle */
71745
+ handle: "superdoc-ruler-handle",
71746
+ /** Left margin handle */
71747
+ handleLeft: "superdoc-ruler-handle--left",
71748
+ /** Right margin handle */
71749
+ handleRight: "superdoc-ruler-handle--right",
71750
+ /** Vertical indicator line during drag */
71751
+ indicator: "superdoc-ruler-indicator"
71752
+ };
71753
+ function createRulerElement(options) {
71754
+ const { definition, doc: doc2, interactive = false } = options;
71755
+ if (!Number.isFinite(definition.widthPx) || definition.widthPx <= 0) {
71756
+ console.warn(`[createRulerElement] Invalid ruler width: ${definition.widthPx}px. Using minimum width of 1px.`);
71757
+ definition.widthPx = Math.max(1, definition.widthPx || 1);
71758
+ }
71759
+ if (!definition.ticks || definition.ticks.length === 0) {
71760
+ console.warn("[createRulerElement] Ruler definition has no ticks. Ruler will be empty.");
71761
+ }
71762
+ const ruler = doc2.createElement("div");
71763
+ ruler.className = RULER_CLASS_NAMES.ruler;
71764
+ ruler.style.cssText = `
71765
+ position: relative;
71766
+ width: ${definition.widthPx}px;
71767
+ height: ${definition.heightPx}px;
71768
+ display: flex;
71769
+ align-items: flex-end;
71770
+ box-sizing: border-box;
71771
+ user-select: none;
71772
+ pointer-events: ${interactive ? "auto" : "none"};
71773
+ `;
71774
+ for (const tick of definition.ticks) {
71775
+ const tickEl = createTickElement(tick, doc2);
71776
+ ruler.appendChild(tickEl);
71777
+ }
71778
+ if (interactive) {
71779
+ const leftHandle = createHandleElement("left", definition.leftMarginPx, doc2, options);
71780
+ const rightHandle = createHandleElement("right", definition.rightMarginPx, doc2, options);
71781
+ ruler.appendChild(leftHandle);
71782
+ ruler.appendChild(rightHandle);
71783
+ }
71784
+ return ruler;
71785
+ }
71786
+ function createTickElement(tick, doc2) {
71787
+ const el = doc2.createElement("div");
71788
+ const sizeClass = tick.size === "main" ? RULER_CLASS_NAMES.tickMain : tick.size === "half" ? RULER_CLASS_NAMES.tickHalf : RULER_CLASS_NAMES.tickEighth;
71789
+ el.className = `${RULER_CLASS_NAMES.tick} ${sizeClass}`;
71790
+ el.style.cssText = `
71791
+ position: absolute;
71792
+ left: ${tick.x}px;
71793
+ bottom: 0;
71794
+ width: 1px;
71795
+ height: ${tick.height};
71796
+ background-color: #666;
71797
+ pointer-events: none;
71798
+ `;
71799
+ if (tick.label !== void 0) {
71800
+ const label = doc2.createElement("span");
71801
+ label.className = RULER_CLASS_NAMES.label;
71802
+ label.textContent = String(tick.label);
71803
+ label.style.cssText = `
71804
+ position: absolute;
71805
+ top: -16px;
71806
+ left: -2px;
71807
+ font-size: 10px;
71808
+ color: #666;
71809
+ pointer-events: none;
71810
+ user-select: none;
71811
+ `;
71812
+ el.appendChild(label);
71813
+ }
71814
+ return el;
71815
+ }
71816
+ function createHandleElement(side, x2, doc2, options) {
71817
+ const handle = doc2.createElement("div");
71818
+ const sideClass = side === "left" ? RULER_CLASS_NAMES.handleLeft : RULER_CLASS_NAMES.handleRight;
71819
+ handle.className = `${RULER_CLASS_NAMES.handle} ${sideClass}`;
71820
+ handle.dataset.side = side;
71821
+ handle.style.cssText = `
71822
+ position: absolute;
71823
+ left: ${x2}px;
71824
+ top: 0;
71825
+ width: 5px;
71826
+ height: 20px;
71827
+ margin-left: -2px;
71828
+ background-color: #ccc;
71829
+ border-radius: 4px 4px 0 0;
71830
+ cursor: grab;
71831
+ transition: background-color 150ms ease;
71832
+ z-index: 10;
71833
+ `;
71834
+ handle.addEventListener("mouseenter", () => {
71835
+ if (!handle.dataset.dragging) {
71836
+ handle.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
71837
+ }
71838
+ });
71839
+ handle.addEventListener("mouseleave", () => {
71840
+ if (!handle.dataset.dragging) {
71841
+ handle.style.backgroundColor = "#ccc";
71842
+ }
71843
+ });
71844
+ if (options.onDragStart || options.onDrag || options.onDragEnd) {
71845
+ setupHandleDrag(handle, side, options);
71846
+ }
71847
+ return handle;
71848
+ }
71849
+ function setupHandleDrag(handle, side, options) {
71850
+ let offsetX = 0;
71851
+ const onPointerDown = (event) => {
71852
+ event.preventDefault();
71853
+ handle.dataset.dragging = "true";
71854
+ handle.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
71855
+ handle.style.cursor = "grabbing";
71856
+ const rect = handle.getBoundingClientRect();
71857
+ offsetX = event.clientX - rect.left - rect.width / 2;
71858
+ handle.setPointerCapture(event.pointerId);
71859
+ options.onDragStart?.(side, event);
71860
+ };
71861
+ const onPointerMove = (event) => {
71862
+ if (handle.dataset.dragging !== "true") return;
71863
+ const ruler = handle.parentElement;
71864
+ if (!ruler) return;
71865
+ const rulerRect = ruler.getBoundingClientRect();
71866
+ const newX = event.clientX - rulerRect.left - offsetX;
71867
+ options.onDrag?.(side, newX, event);
71868
+ };
71869
+ const onPointerUp = (event) => {
71870
+ if (handle.dataset.dragging !== "true") return;
71871
+ handle.dataset.dragging = "";
71872
+ handle.style.backgroundColor = "#ccc";
71873
+ handle.style.cursor = "grab";
71874
+ handle.releasePointerCapture(event.pointerId);
71875
+ const ruler = handle.parentElement;
71876
+ if (!ruler) return;
71877
+ const rulerRect = ruler.getBoundingClientRect();
71878
+ const finalX = event.clientX - rulerRect.left - offsetX;
71879
+ options.onDragEnd?.(side, finalX, event);
71880
+ };
71881
+ handle.addEventListener("pointerdown", onPointerDown);
71882
+ handle.addEventListener("pointermove", onPointerMove);
71883
+ handle.addEventListener("pointerup", onPointerUp);
71884
+ handle.addEventListener("pointercancel", onPointerUp);
71885
+ }
71886
+ const RULER_STYLES = `
71887
+ /* Ruler container */
71888
+ .${RULER_CLASS_NAMES.ruler} {
71889
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
71890
+ background-color: transparent;
71891
+ }
71892
+
71893
+ /* Tick marks base styling */
71894
+ .${RULER_CLASS_NAMES.tick} {
71895
+ flex-shrink: 0;
71896
+ }
71897
+
71898
+ /* Handle hover and active states */
71899
+ .${RULER_CLASS_NAMES.handle}:hover {
71900
+ background-color: rgba(37, 99, 235, 0.4) !important;
71901
+ }
71902
+
71903
+ .${RULER_CLASS_NAMES.handle}:active,
71904
+ .${RULER_CLASS_NAMES.handle}[data-dragging="true"] {
71905
+ background-color: rgba(37, 99, 235, 0.6) !important;
71906
+ cursor: grabbing !important;
71907
+ }
71908
+
71909
+ /* Vertical indicator animation */
71910
+ .${RULER_CLASS_NAMES.indicator} {
71911
+ transition: left 16ms linear;
71912
+ }
71913
+
71914
+ /* Print mode: hide rulers */
71915
+ @media print {
71916
+ .${RULER_CLASS_NAMES.ruler} {
71917
+ display: none !important;
71918
+ }
71919
+ }
71920
+
71921
+ /* High contrast mode support */
71922
+ @media (prefers-contrast: high) {
71923
+ .${RULER_CLASS_NAMES.tick} {
71924
+ background-color: #000 !important;
71925
+ }
71926
+
71927
+ .${RULER_CLASS_NAMES.label} {
71928
+ color: #000 !important;
71929
+ }
71930
+
71931
+ .${RULER_CLASS_NAMES.handle} {
71932
+ background-color: #666 !important;
71933
+ border: 1px solid #000;
71934
+ }
71935
+
71936
+ .${RULER_CLASS_NAMES.handle}:hover,
71937
+ .${RULER_CLASS_NAMES.handle}:active {
71938
+ background-color: #0066cc !important;
71939
+ }
71940
+ }
71941
+
71942
+ /* Reduced motion support */
71943
+ @media (prefers-reduced-motion: reduce) {
71944
+ .${RULER_CLASS_NAMES.handle} {
71945
+ transition: none !important;
71946
+ }
71947
+
71948
+ .${RULER_CLASS_NAMES.indicator} {
71949
+ transition: none !important;
71950
+ }
71951
+ }
71952
+ `;
71953
+ let rulerStylesInjected = false;
71954
+ function ensureRulerStyles(doc2) {
71955
+ if (rulerStylesInjected || !doc2) return;
71956
+ const styleEl = doc2.createElement("style");
71957
+ styleEl.setAttribute("data-superdoc-ruler-styles", "true");
71958
+ styleEl.textContent = RULER_STYLES;
71959
+ doc2.head?.appendChild(styleEl);
71960
+ rulerStylesInjected = true;
71961
+ }
71560
71962
  function isMinimalWordLayout(value) {
71561
71963
  if (typeof value !== "object" || value === null) {
71562
71964
  return false;
@@ -71603,6 +72005,7 @@ function isMinimalWordLayout(value) {
71603
72005
  }
71604
72006
  const LIST_MARKER_GAP$1 = 8;
71605
72007
  const DEFAULT_TAB_INTERVAL_PX$1 = 48;
72008
+ const DEFAULT_PAGE_HEIGHT_PX = 1056;
71606
72009
  const COMMENT_EXTERNAL_COLOR = "#B1124B";
71607
72010
  const COMMENT_INTERNAL_COLOR = "#078383";
71608
72011
  const COMMENT_INACTIVE_ALPHA = "22";
@@ -71845,6 +72248,9 @@ const _DomPainter = class _DomPainter2 {
71845
72248
  ensureFieldAnnotationStyles(doc2);
71846
72249
  ensureSdtContainerStyles(doc2);
71847
72250
  ensureImageSelectionStyles(doc2);
72251
+ if (this.options.ruler?.enabled) {
72252
+ ensureRulerStyles(doc2);
72253
+ }
71848
72254
  mount2.classList.add(CLASS_NAMES$1.container);
71849
72255
  if (this.mount && this.mount !== mount2) {
71850
72256
  this.resetState();
@@ -72102,6 +72508,12 @@ const _DomPainter = class _DomPainter2 {
72102
72508
  const el = this.doc.createElement("div");
72103
72509
  el.classList.add(CLASS_NAMES$1.page);
72104
72510
  applyStyles$2(el, pageStyles(width, height, this.getEffectivePageStyles()));
72511
+ if (this.options.ruler?.enabled) {
72512
+ const rulerEl = this.renderPageRuler(width, page);
72513
+ if (rulerEl) {
72514
+ el.appendChild(rulerEl);
72515
+ }
72516
+ }
72105
72517
  const contextBase = {
72106
72518
  pageNumber: page.number,
72107
72519
  totalPages: this.totalPages,
@@ -72114,6 +72526,70 @@ const _DomPainter = class _DomPainter2 {
72114
72526
  this.renderDecorationsForPage(el, page);
72115
72527
  return el;
72116
72528
  }
72529
+ /**
72530
+ * Render a ruler element for a page.
72531
+ *
72532
+ * Creates a horizontal ruler with tick marks and optional interactive margin handles.
72533
+ * The ruler is positioned at the top of the page and displays inch measurements.
72534
+ *
72535
+ * @param pageWidthPx - Page width in pixels
72536
+ * @param page - Page data containing margins and optional size information
72537
+ * @returns Ruler element, or null if this.doc is unavailable or page margins are missing
72538
+ *
72539
+ * Side effects:
72540
+ * - Creates DOM elements and applies inline styles
72541
+ * - May invoke the onMarginChange callback if interactive mode is enabled
72542
+ *
72543
+ * Fallback behavior:
72544
+ * - Uses DEFAULT_PAGE_HEIGHT_PX (1056px = 11 inches) if page.size.h is not available
72545
+ * - Defaults margins to 0 if not explicitly provided
72546
+ */
72547
+ renderPageRuler(pageWidthPx, page) {
72548
+ if (!this.doc) {
72549
+ console.warn("[renderPageRuler] Cannot render ruler: document is not available.");
72550
+ return null;
72551
+ }
72552
+ if (!page.margins) {
72553
+ console.warn(`[renderPageRuler] Cannot render ruler for page ${page.number}: margins not available.`);
72554
+ return null;
72555
+ }
72556
+ const margins = page.margins;
72557
+ const leftMargin = margins.left ?? 0;
72558
+ const rightMargin = margins.right ?? 0;
72559
+ try {
72560
+ const rulerDefinition = generateRulerDefinitionFromPx({
72561
+ pageWidthPx,
72562
+ pageHeightPx: page.size?.h ?? DEFAULT_PAGE_HEIGHT_PX,
72563
+ leftMarginPx: leftMargin,
72564
+ rightMarginPx: rightMargin
72565
+ });
72566
+ const interactive = this.options.ruler?.interactive ?? false;
72567
+ const onMarginChange = this.options.ruler?.onMarginChange;
72568
+ const rulerEl = createRulerElement({
72569
+ definition: rulerDefinition,
72570
+ doc: this.doc,
72571
+ interactive,
72572
+ onDragEnd: interactive && onMarginChange ? (side, x2) => {
72573
+ try {
72574
+ const ppi = 96;
72575
+ const marginInches = side === "left" ? x2 / ppi : (pageWidthPx - x2) / ppi;
72576
+ onMarginChange(side, marginInches);
72577
+ } catch (error) {
72578
+ console.error("[renderPageRuler] Error in onMarginChange callback:", error);
72579
+ }
72580
+ } : void 0
72581
+ });
72582
+ rulerEl.style.position = "absolute";
72583
+ rulerEl.style.top = "0";
72584
+ rulerEl.style.left = "0";
72585
+ rulerEl.style.zIndex = "20";
72586
+ rulerEl.dataset.pageNumber = String(page.number);
72587
+ return rulerEl;
72588
+ } catch (error) {
72589
+ console.error(`[renderPageRuler] Failed to create ruler for page ${page.number}:`, error);
72590
+ return null;
72591
+ }
72592
+ }
72117
72593
  renderDecorationsForPage(pageEl, page) {
72118
72594
  this.renderDecorationSection(pageEl, page, "header");
72119
72595
  this.renderDecorationSection(pageEl, page, "footer");
@@ -74914,7 +75390,8 @@ const createDomPainter = (options) => {
74914
75390
  layoutMode: options.layoutMode,
74915
75391
  headerProvider: options.headerProvider,
74916
75392
  footerProvider: options.footerProvider,
74917
- virtualization: options.virtualization
75393
+ virtualization: options.virtualization,
75394
+ ruler: options.ruler
74918
75395
  });
74919
75396
  return {
74920
75397
  paint(layout, mount2) {
@@ -85442,9 +85919,11 @@ updateLocalAwarenessCursor_fn = function() {
85442
85919
  if (typeof provider.awareness.setLocalStateField !== "function") {
85443
85920
  return;
85444
85921
  }
85445
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
85922
+ const editorState = __privateGet$1(this, _editor3)?.state;
85923
+ if (!editorState) return;
85924
+ const ystate = ySyncPluginKey.getState(editorState);
85446
85925
  if (!ystate?.binding?.mapping) return;
85447
- const { selection } = __privateGet$1(this, _editor3).state;
85926
+ const { selection } = editorState;
85448
85927
  const { anchor, head } = selection;
85449
85928
  try {
85450
85929
  const relAnchor = absolutePositionToRelativePosition(anchor, ystate.type, ystate.binding.mapping);
@@ -85462,7 +85941,9 @@ updateLocalAwarenessCursor_fn = function() {
85462
85941
  normalizeAwarenessStates_fn = function() {
85463
85942
  const provider = __privateGet$1(this, _options).collaborationProvider;
85464
85943
  if (!provider?.awareness) return /* @__PURE__ */ new Map();
85465
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
85944
+ const editorState = __privateGet$1(this, _editor3)?.state;
85945
+ if (!editorState) return /* @__PURE__ */ new Map();
85946
+ const ystate = ySyncPluginKey.getState(editorState);
85466
85947
  if (!ystate) return /* @__PURE__ */ new Map();
85467
85948
  const states = provider.awareness?.getStates();
85468
85949
  const normalized = /* @__PURE__ */ new Map();
@@ -86255,7 +86736,8 @@ ensurePainter_fn = function(blocks, measures) {
86255
86736
  virtualization: __privateGet$1(this, _layoutOptions).virtualization,
86256
86737
  pageStyles: __privateGet$1(this, _layoutOptions).pageStyles,
86257
86738
  headerProvider: __privateGet$1(this, _headerDecorationProvider),
86258
- footerProvider: __privateGet$1(this, _footerDecorationProvider)
86739
+ footerProvider: __privateGet$1(this, _footerDecorationProvider),
86740
+ ruler: __privateGet$1(this, _layoutOptions).ruler
86259
86741
  }));
86260
86742
  }
86261
86743
  return __privateGet$1(this, _domPainter);
@@ -120341,6 +120823,7 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
120341
120823
  */
120342
120824
  toggleRuler: () => {
120343
120825
  this.superdoc.toggleRuler();
120826
+ this.updateToolbarState();
120344
120827
  },
120345
120828
  /**
120346
120829
  * Initiates the image upload process
@@ -120766,6 +121249,13 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
120766
121249
  item.activate();
120767
121250
  }
120768
121251
  }
121252
+ if (item.name.value === "ruler") {
121253
+ if (this.superdoc?.config?.rulers) {
121254
+ item.activate();
121255
+ } else {
121256
+ item.deactivate();
121257
+ }
121258
+ }
120769
121259
  });
120770
121260
  }
120771
121261
  /**
@@ -122226,8 +122716,12 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
122226
122716
  };
122227
122717
  }
122228
122718
  });
122229
- const _hoisted_1$4 = { class: "numbering" };
122719
+ const _hoisted_1$4 = {
122720
+ key: 0,
122721
+ class: "numbering"
122722
+ };
122230
122723
  const MIN_WIDTH = 200;
122724
+ const PPI = 96;
122231
122725
  const alignment = "flex-end";
122232
122726
  const _sfc_main$6 = {
122233
122727
  __name: "Ruler",
@@ -122250,7 +122744,7 @@ const _sfc_main$6 = {
122250
122744
  const emit = __emit;
122251
122745
  const props = __props;
122252
122746
  const ruler = vue.ref(null);
122253
- const rulerDefinition = vue.ref([]);
122747
+ const rulerDefinition = vue.ref(null);
122254
122748
  const rulerHandleOriginalColor = vue.ref("#CCCCCC");
122255
122749
  const rulerHandleActiveColor = vue.ref("#2563EB66");
122256
122750
  const pageSize = vue.ref(null);
@@ -122263,45 +122757,32 @@ const _sfc_main$6 = {
122263
122757
  const initialX = vue.ref(0);
122264
122758
  let offsetX = 0;
122265
122759
  const initRuler = () => {
122266
- if (props.editor.options.mode !== "docx") return;
122267
- const rulerItems = [];
122760
+ if (props.editor.options.mode !== "docx") return null;
122268
122761
  const { pageMargins: docMargins, pageSize: docSize } = props.editor.getPageStyles();
122269
122762
  pageSize.value = docSize;
122270
122763
  pageMargins.value = docMargins;
122271
- rightHandle.x = docSize.width * 96 - docMargins.right * 96;
122272
- leftHandle.x = docMargins.left * 96;
122273
- for (let i2 = 0; i2 < docSize.width; i2++) {
122274
- const marginNum = 0.0625 * 96 - 0.5;
122275
- const margin = `${marginNum}px`;
122276
- const diff = docSize.width - i2;
122277
- rulerItems.push(...generateSection(1, "main", "20%", margin, i2));
122278
- rulerItems.push(...generateSection(3, "eighth", "10%", margin));
122279
- rulerItems.push(...generateSection(1, "half", "40%", margin));
122280
- if (diff <= 0.5) break;
122281
- rulerItems.push(...generateSection(3, "eighth", "10%", margin));
122282
- }
122283
- return rulerItems;
122284
- };
122285
- const generateSection = (qty, size2, height, margin, index2) => {
122286
- return Array.from({ length: qty }, (_2, i2) => {
122287
- const item = {
122288
- className: `${size2}-unit ruler-section`,
122289
- height,
122290
- margin
122291
- };
122292
- if (index2 !== void 0) item.numbering = index2;
122293
- return item;
122764
+ const definition = generateRulerDefinition({
122765
+ pageSize: { width: docSize.width, height: docSize.height },
122766
+ pageMargins: {
122767
+ left: docMargins.left,
122768
+ right: docMargins.right,
122769
+ top: docMargins.top ?? 1,
122770
+ bottom: docMargins.bottom ?? 1
122771
+ }
122294
122772
  });
122773
+ leftHandle.x = definition.leftMarginPx;
122774
+ rightHandle.x = definition.rightMarginPx;
122775
+ return definition;
122295
122776
  };
122296
- const getStyle = vue.computed(() => (unit) => {
122777
+ const getTickStyle = vue.computed(() => (tick) => {
122297
122778
  return {
122779
+ position: "absolute",
122780
+ left: `${tick.x}px`,
122781
+ bottom: "0",
122298
122782
  width: "1px",
122299
- minWidth: "1px",
122300
- maxWidth: "1px",
122301
- height: unit.height,
122302
- backgroundColor: unit.color || "#666",
122303
- marginLeft: unit.numbering === 0 ? null : unit.margin,
122304
- marginRight: unit.margin
122783
+ height: tick.height,
122784
+ backgroundColor: "#666",
122785
+ pointerEvents: "none"
122305
122786
  };
122306
122787
  });
122307
122788
  const getHandlePosition = vue.computed(() => (side) => {
@@ -122313,7 +122794,8 @@ const _sfc_main$6 = {
122313
122794
  const getVerticalIndicatorStyle = vue.computed(() => {
122314
122795
  if (!ruler.value) return;
122315
122796
  const parentElement = ruler.value.parentElement;
122316
- const editor = parentElement.querySelector(".super-editor");
122797
+ const editor = parentElement?.querySelector(".super-editor") ?? document.querySelector(".super-editor");
122798
+ if (!editor) return { left: `${currentHandle.value.x}px`, minHeight: "100%" };
122317
122799
  const editorBounds = editor.getBoundingClientRect();
122318
122800
  return {
122319
122801
  left: `${currentHandle.value.x}px`,
@@ -122330,22 +122812,11 @@ const _sfc_main$6 = {
122330
122812
  showVerticalIndicator.value = true;
122331
122813
  };
122332
122814
  const handleMouseMove2 = (event) => {
122333
- if (!isDragging.value) return;
122815
+ if (!isDragging.value || !pageSize.value) return;
122334
122816
  const newLeft = event.clientX - offsetX;
122335
- currentHandle.value.x = newLeft;
122336
- if (currentHandle.value.side === "left") {
122337
- if (newLeft <= 0) {
122338
- currentHandle.value.x = 0;
122339
- } else if (newLeft >= rightHandle.x - MIN_WIDTH) {
122340
- currentHandle.value.x = rightHandle.x - MIN_WIDTH;
122341
- }
122342
- } else {
122343
- if (newLeft >= pageSize.value.width * 96) {
122344
- currentHandle.value.x = pageSize.value.width * 96;
122345
- } else if (newLeft <= leftHandle.x + MIN_WIDTH) {
122346
- currentHandle.value.x = leftHandle.x + MIN_WIDTH;
122347
- }
122348
- }
122817
+ const pageWidthPx = pageSize.value.width * PPI;
122818
+ const otherHandleX = currentHandle.value.side === "left" ? rightHandle.x : leftHandle.x;
122819
+ currentHandle.value.x = clampHandlePosition(newLeft, currentHandle.value.side, otherHandleX, pageWidthPx, MIN_WIDTH);
122349
122820
  };
122350
122821
  const handleMouseUp = () => {
122351
122822
  isDragging.value = false;
@@ -122366,14 +122837,17 @@ const _sfc_main$6 = {
122366
122837
  rulerHandleOriginalColor.value = "#CCC";
122367
122838
  };
122368
122839
  const getNewMarginValue = () => {
122369
- if (currentHandle.value.side === "left") return currentHandle.value.x / 96;
122370
- else return (pageSize.value.width * 96 - currentHandle.value.x) / 96;
122840
+ if (!pageSize.value) return 0;
122841
+ const pageWidthPx = pageSize.value.width * PPI;
122842
+ return calculateMarginFromHandle(currentHandle.value.x, currentHandle.value.side, pageWidthPx, PPI);
122371
122843
  };
122372
122844
  const getStyleVars = vue.computed(() => {
122845
+ const width = rulerDefinition.value?.widthPx ?? pageSize.value?.width * PPI ?? 816;
122373
122846
  return {
122374
122847
  "--alignment": alignment,
122375
122848
  "--ruler-handle-color": rulerHandleOriginalColor.value,
122376
- "--ruler-handle-active-color": rulerHandleActiveColor.value
122849
+ "--ruler-handle-active-color": rulerHandleActiveColor.value,
122850
+ "--ruler-width": `${width}px`
122377
122851
  };
122378
122852
  });
122379
122853
  vue.onMounted(() => {
@@ -122409,32 +122883,20 @@ const _sfc_main$6 = {
122409
122883
  class: "vertical-indicator",
122410
122884
  style: vue.normalizeStyle(getVerticalIndicatorStyle.value)
122411
122885
  }, null, 4)) : vue.createCommentVNode("", true),
122412
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(rulerDefinition.value, (unit) => {
122886
+ rulerDefinition.value ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, { key: 1 }, vue.renderList(rulerDefinition.value.ticks, (tick, index2) => {
122413
122887
  return vue.openBlock(), vue.createElementBlock("div", {
122414
- class: vue.normalizeClass(unit.className),
122415
- style: vue.normalizeStyle(getStyle.value(unit))
122888
+ key: index2,
122889
+ class: vue.normalizeClass(["ruler-tick", `ruler-tick--${tick.size}`]),
122890
+ style: vue.normalizeStyle(getTickStyle.value(tick))
122416
122891
  }, [
122417
- vue.createBaseVNode("div", _hoisted_1$4, vue.toDisplayString(unit.numbering), 1),
122418
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(unit.elements, (half) => {
122419
- return vue.openBlock(), vue.createElementBlock("div", {
122420
- class: vue.normalizeClass(half.className),
122421
- style: vue.normalizeStyle(getStyle.value(half))
122422
- }, [
122423
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(half.elements, (quarter) => {
122424
- return vue.openBlock(), vue.createElementBlock("div", {
122425
- class: vue.normalizeClass(quarter.className),
122426
- style: vue.normalizeStyle(getStyle.value(quarter))
122427
- }, null, 6);
122428
- }), 256))
122429
- ], 6);
122430
- }), 256))
122892
+ tick.label !== void 0 ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$4, vue.toDisplayString(tick.label), 1)) : vue.createCommentVNode("", true)
122431
122893
  ], 6);
122432
- }), 256))
122894
+ }), 128)) : vue.createCommentVNode("", true)
122433
122895
  ], 4);
122434
122896
  };
122435
122897
  }
122436
122898
  };
122437
- const Ruler = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-79f9a944"]]);
122899
+ const Ruler = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-b9f4f30a"]]);
122438
122900
  const _sfc_main$5 = {
122439
122901
  __name: "GenericPopover",
122440
122902
  props: {
@@ -123615,7 +124077,7 @@ function adjustPaginationBreaks(editorElem, editor) {
123615
124077
  const BlankDOCX = "data:application/octet-stream;base64,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";
123616
124078
  const _hoisted_1$1 = { class: "super-editor-container" };
123617
124079
  const _hoisted_2 = {
123618
- key: 1,
124080
+ key: 2,
123619
124081
  class: "placeholder-editor"
123620
124082
  };
123621
124083
  const _hoisted_3 = { class: "placeholder-title" };
@@ -123660,6 +124122,19 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
123660
124122
  const active = activeEditor.value;
123661
124123
  return active?.options ? Boolean(active.options.disableContextMenu) : Boolean(props.options.disableContextMenu);
123662
124124
  });
124125
+ const rulersVisible = vue.ref(Boolean(props.options.rulers));
124126
+ vue.watch(
124127
+ () => props.options,
124128
+ (newOptions) => {
124129
+ const rulers = newOptions?.rulers;
124130
+ if (rulers && typeof rulers === "object" && "value" in rulers) {
124131
+ rulersVisible.value = Boolean(rulers.value);
124132
+ } else {
124133
+ rulersVisible.value = Boolean(rulers);
124134
+ }
124135
+ },
124136
+ { immediate: true, deep: true }
124137
+ );
123663
124138
  const message = useMessage();
123664
124139
  const editorWrapper = vue.ref(null);
123665
124140
  const editorElem = vue.ref(null);
@@ -124072,8 +124547,17 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
124072
124547
  });
124073
124548
  return (_ctx, _cache) => {
124074
124549
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
124075
- __props.options.rulers && !!activeEditor.value ? (vue.openBlock(), vue.createBlock(Ruler, {
124550
+ __props.options.rulerContainer && rulersVisible.value && !!activeEditor.value ? (vue.openBlock(), vue.createBlock(vue.Teleport, {
124076
124551
  key: 0,
124552
+ to: __props.options.rulerContainer
124553
+ }, [
124554
+ vue.createVNode(Ruler, {
124555
+ class: "ruler superdoc-ruler",
124556
+ editor: activeEditor.value,
124557
+ onMarginChange: handleMarginChange
124558
+ }, null, 8, ["editor"])
124559
+ ], 8, ["to"])) : rulersVisible.value && !!activeEditor.value ? (vue.openBlock(), vue.createBlock(Ruler, {
124560
+ key: 1,
124077
124561
  class: "ruler",
124078
124562
  editor: activeEditor.value,
124079
124563
  onMarginChange: handleMarginChange
@@ -124167,7 +124651,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
124167
124651
  })
124168
124652
  ])) : vue.createCommentVNode("", true),
124169
124653
  activeEditor.value ? (vue.openBlock(), vue.createBlock(GenericPopover, {
124170
- key: 2,
124654
+ key: 3,
124171
124655
  editor: activeEditor.value,
124172
124656
  visible: popoverControls.visible,
124173
124657
  position: popoverControls.position,
@@ -124182,7 +124666,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
124182
124666
  };
124183
124667
  }
124184
124668
  });
124185
- const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-a935d3e2"]]);
124669
+ const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-cb3fe66f"]]);
124186
124670
  const _hoisted_1 = ["innerHTML"];
124187
124671
  const _sfc_main = {
124188
124672
  __name: "SuperInput",