@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
@@ -42127,8 +42127,8 @@ const _SuperConverter = class _SuperConverter2 {
42127
42127
  const converter = new _SuperConverter2();
42128
42128
  const content = customXml.content;
42129
42129
  const contentJson = converter.parseXmlToJson(content);
42130
- const properties = contentJson.elements.find((el) => el.name === "Properties");
42131
- if (!properties.elements) return null;
42130
+ const properties = contentJson.elements?.find((el) => el.name === "Properties");
42131
+ if (!properties?.elements) return null;
42132
42132
  const property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
42133
42133
  if (!property2) return null;
42134
42134
  return property2.elements[0].elements[0].text;
@@ -42191,7 +42191,7 @@ const _SuperConverter = class _SuperConverter2 {
42191
42191
  static getStoredSuperdocVersion(docx) {
42192
42192
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
42193
42193
  }
42194
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.60") {
42194
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.61") {
42195
42195
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
42196
42196
  }
42197
42197
  /**
@@ -59380,7 +59380,7 @@ const isHeadless = (editor) => {
59380
59380
  const shouldSkipNodeView = (editor) => {
59381
59381
  return isHeadless(editor);
59382
59382
  };
59383
- const summaryVersion = "1.0.0-beta.60";
59383
+ const summaryVersion = "1.0.0-beta.61";
59384
59384
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
59385
59385
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
59386
59386
  function mapAttributes(attrs) {
@@ -60169,7 +60169,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60169
60169
  { default: remarkStringify },
60170
60170
  { default: remarkGfm }
60171
60171
  ] = await Promise.all([
60172
- import("./index-GAzIoyrZ-zhiF5zMK.es.js"),
60172
+ import("./index-u8dj63PM-Bfomc8Z6.es.js"),
60173
60173
  import("./index-DRCvimau-Cw339678.es.js"),
60174
60174
  import("./index-C_x_N6Uh-DJn8hIEt.es.js"),
60175
60175
  import("./index-D_sWOSiG-DE96TaT5.es.js"),
@@ -60374,7 +60374,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60374
60374
  * Process collaboration migrations
60375
60375
  */
60376
60376
  processCollaborationMigrations() {
60377
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.60");
60377
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.61");
60378
60378
  if (!this.options.ydoc) return;
60379
60379
  const metaMap = this.options.ydoc.getMap("meta");
60380
60380
  let docVersion = metaMap.get("version");
@@ -71540,6 +71540,408 @@ function assertFragmentPmPositions(fragment, _context) {
71540
71540
  const hasPmEnd = fragment.pmEnd != null;
71541
71541
  globalValidationStats.record(hasPmStart, hasPmEnd);
71542
71542
  }
71543
+ const DEFAULT_PPI = 96;
71544
+ const DEFAULT_RULER_HEIGHT = 25;
71545
+ const TICK_SPACING_PX = DEFAULT_PPI / 8;
71546
+ function generateRulerDefinition(config2) {
71547
+ const ppi = config2.ppi ?? DEFAULT_PPI;
71548
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
71549
+ const { pageSize, pageMargins } = config2;
71550
+ if (!Number.isFinite(ppi) || ppi <= 0) {
71551
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
71552
+ }
71553
+ if (!Number.isFinite(pageSize.width) || pageSize.width <= 0) {
71554
+ throw new Error(`Invalid page width: ${pageSize.width}. Must be a positive finite number.`);
71555
+ }
71556
+ if (!Number.isFinite(pageSize.height) || pageSize.height <= 0) {
71557
+ throw new Error(`Invalid page height: ${pageSize.height}. Must be a positive finite number.`);
71558
+ }
71559
+ if (!Number.isFinite(pageMargins.left) || pageMargins.left < 0) {
71560
+ throw new Error(`Invalid left margin: ${pageMargins.left}. Must be a non-negative finite number.`);
71561
+ }
71562
+ if (!Number.isFinite(pageMargins.right) || pageMargins.right < 0) {
71563
+ throw new Error(`Invalid right margin: ${pageMargins.right}. Must be a non-negative finite number.`);
71564
+ }
71565
+ if (pageMargins.left + pageMargins.right >= pageSize.width) {
71566
+ throw new Error(
71567
+ `Invalid margins: left (${pageMargins.left}) + right (${pageMargins.right}) must be less than page width (${pageSize.width}).`
71568
+ );
71569
+ }
71570
+ const widthPx = pageSize.width * ppi;
71571
+ const ticks = [];
71572
+ let currentX = 0;
71573
+ for (let inch = 0; inch < pageSize.width; inch++) {
71574
+ const remaining = pageSize.width - inch;
71575
+ ticks.push({
71576
+ size: "main",
71577
+ height: "20%",
71578
+ label: inch,
71579
+ x: currentX
71580
+ });
71581
+ currentX += TICK_SPACING_PX;
71582
+ for (let i = 0; i < 3; i++) {
71583
+ ticks.push({
71584
+ size: "eighth",
71585
+ height: "10%",
71586
+ x: currentX
71587
+ });
71588
+ currentX += TICK_SPACING_PX;
71589
+ }
71590
+ ticks.push({
71591
+ size: "half",
71592
+ height: "40%",
71593
+ x: currentX
71594
+ });
71595
+ currentX += TICK_SPACING_PX;
71596
+ if (remaining <= 0.5) break;
71597
+ for (let i = 0; i < 3; i++) {
71598
+ ticks.push({
71599
+ size: "eighth",
71600
+ height: "10%",
71601
+ x: currentX
71602
+ });
71603
+ currentX += TICK_SPACING_PX;
71604
+ }
71605
+ }
71606
+ return {
71607
+ widthPx,
71608
+ heightPx,
71609
+ ticks,
71610
+ leftMarginPx: pageMargins.left * ppi,
71611
+ rightMarginPx: widthPx - pageMargins.right * ppi,
71612
+ pageWidthInches: pageSize.width
71613
+ };
71614
+ }
71615
+ function calculateMarginFromHandle(handleX, side, pageWidthPx, ppi = DEFAULT_PPI) {
71616
+ if (side === "left") {
71617
+ return handleX / ppi;
71618
+ } else {
71619
+ return (pageWidthPx - handleX) / ppi;
71620
+ }
71621
+ }
71622
+ function clampHandlePosition(handleX, side, otherHandleX, pageWidthPx, minContentWidthPx = 200) {
71623
+ if (!Number.isFinite(handleX)) {
71624
+ throw new Error(`Invalid handleX: ${handleX}. Must be a finite number.`);
71625
+ }
71626
+ if (!Number.isFinite(otherHandleX)) {
71627
+ throw new Error(`Invalid otherHandleX: ${otherHandleX}. Must be a finite number.`);
71628
+ }
71629
+ if (!Number.isFinite(pageWidthPx)) {
71630
+ throw new Error(`Invalid pageWidthPx: ${pageWidthPx}. Must be a finite number.`);
71631
+ }
71632
+ if (!Number.isFinite(minContentWidthPx)) {
71633
+ throw new Error(`Invalid minContentWidthPx: ${minContentWidthPx}. Must be a finite number.`);
71634
+ }
71635
+ if (side === "left") {
71636
+ const min2 = 0;
71637
+ const max2 = otherHandleX - minContentWidthPx;
71638
+ return Math.max(min2, Math.min(max2, handleX));
71639
+ } else {
71640
+ const min2 = otherHandleX + minContentWidthPx;
71641
+ const max2 = pageWidthPx;
71642
+ return Math.max(min2, Math.min(max2, handleX));
71643
+ }
71644
+ }
71645
+ function generateRulerDefinitionFromPx(config2) {
71646
+ const ppi = config2.ppi ?? DEFAULT_PPI;
71647
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
71648
+ const { pageWidthPx, leftMarginPx, rightMarginPx } = config2;
71649
+ if (!Number.isFinite(ppi) || ppi <= 0) {
71650
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
71651
+ }
71652
+ if (!Number.isFinite(pageWidthPx) || pageWidthPx <= 0) {
71653
+ throw new Error(`Invalid page width: ${pageWidthPx}px. Must be a positive finite number.`);
71654
+ }
71655
+ if (!Number.isFinite(config2.pageHeightPx) || config2.pageHeightPx <= 0) {
71656
+ throw new Error(`Invalid page height: ${config2.pageHeightPx}px. Must be a positive finite number.`);
71657
+ }
71658
+ if (!Number.isFinite(leftMarginPx) || leftMarginPx < 0) {
71659
+ throw new Error(`Invalid left margin: ${leftMarginPx}px. Must be a non-negative finite number.`);
71660
+ }
71661
+ if (!Number.isFinite(rightMarginPx) || rightMarginPx < 0) {
71662
+ throw new Error(`Invalid right margin: ${rightMarginPx}px. Must be a non-negative finite number.`);
71663
+ }
71664
+ if (leftMarginPx + rightMarginPx >= pageWidthPx) {
71665
+ throw new Error(
71666
+ `Invalid margins: left (${leftMarginPx}px) + right (${rightMarginPx}px) must be less than page width (${pageWidthPx}px).`
71667
+ );
71668
+ }
71669
+ const pageWidthInches = pageWidthPx / ppi;
71670
+ const ticks = [];
71671
+ let currentX = 0;
71672
+ for (let inch = 0; inch < pageWidthInches; inch++) {
71673
+ const remaining = pageWidthInches - inch;
71674
+ ticks.push({
71675
+ size: "main",
71676
+ height: "20%",
71677
+ label: inch,
71678
+ x: currentX
71679
+ });
71680
+ currentX += TICK_SPACING_PX;
71681
+ for (let i = 0; i < 3; i++) {
71682
+ ticks.push({
71683
+ size: "eighth",
71684
+ height: "10%",
71685
+ x: currentX
71686
+ });
71687
+ currentX += TICK_SPACING_PX;
71688
+ }
71689
+ ticks.push({
71690
+ size: "half",
71691
+ height: "40%",
71692
+ x: currentX
71693
+ });
71694
+ currentX += TICK_SPACING_PX;
71695
+ if (remaining <= 0.5) break;
71696
+ for (let i = 0; i < 3; i++) {
71697
+ ticks.push({
71698
+ size: "eighth",
71699
+ height: "10%",
71700
+ x: currentX
71701
+ });
71702
+ currentX += TICK_SPACING_PX;
71703
+ }
71704
+ }
71705
+ return {
71706
+ widthPx: pageWidthPx,
71707
+ heightPx,
71708
+ ticks,
71709
+ leftMarginPx,
71710
+ rightMarginPx: pageWidthPx - rightMarginPx,
71711
+ pageWidthInches
71712
+ };
71713
+ }
71714
+ const RULER_CLASS_NAMES = {
71715
+ /** Main ruler container */
71716
+ ruler: "superdoc-ruler",
71717
+ /** Tick mark element */
71718
+ tick: "superdoc-ruler-tick",
71719
+ /** Main (inch) tick */
71720
+ tickMain: "superdoc-ruler-tick--main",
71721
+ /** Half-inch tick */
71722
+ tickHalf: "superdoc-ruler-tick--half",
71723
+ /** Eighth-inch tick */
71724
+ tickEighth: "superdoc-ruler-tick--eighth",
71725
+ /** Inch label number */
71726
+ label: "superdoc-ruler-label",
71727
+ /** Margin handle */
71728
+ handle: "superdoc-ruler-handle",
71729
+ /** Left margin handle */
71730
+ handleLeft: "superdoc-ruler-handle--left",
71731
+ /** Right margin handle */
71732
+ handleRight: "superdoc-ruler-handle--right",
71733
+ /** Vertical indicator line during drag */
71734
+ indicator: "superdoc-ruler-indicator"
71735
+ };
71736
+ function createRulerElement(options) {
71737
+ const { definition, doc: doc2, interactive = false } = options;
71738
+ if (!Number.isFinite(definition.widthPx) || definition.widthPx <= 0) {
71739
+ console.warn(`[createRulerElement] Invalid ruler width: ${definition.widthPx}px. Using minimum width of 1px.`);
71740
+ definition.widthPx = Math.max(1, definition.widthPx || 1);
71741
+ }
71742
+ if (!definition.ticks || definition.ticks.length === 0) {
71743
+ console.warn("[createRulerElement] Ruler definition has no ticks. Ruler will be empty.");
71744
+ }
71745
+ const ruler = doc2.createElement("div");
71746
+ ruler.className = RULER_CLASS_NAMES.ruler;
71747
+ ruler.style.cssText = `
71748
+ position: relative;
71749
+ width: ${definition.widthPx}px;
71750
+ height: ${definition.heightPx}px;
71751
+ display: flex;
71752
+ align-items: flex-end;
71753
+ box-sizing: border-box;
71754
+ user-select: none;
71755
+ pointer-events: ${interactive ? "auto" : "none"};
71756
+ `;
71757
+ for (const tick of definition.ticks) {
71758
+ const tickEl = createTickElement(tick, doc2);
71759
+ ruler.appendChild(tickEl);
71760
+ }
71761
+ if (interactive) {
71762
+ const leftHandle = createHandleElement("left", definition.leftMarginPx, doc2, options);
71763
+ const rightHandle = createHandleElement("right", definition.rightMarginPx, doc2, options);
71764
+ ruler.appendChild(leftHandle);
71765
+ ruler.appendChild(rightHandle);
71766
+ }
71767
+ return ruler;
71768
+ }
71769
+ function createTickElement(tick, doc2) {
71770
+ const el = doc2.createElement("div");
71771
+ const sizeClass = tick.size === "main" ? RULER_CLASS_NAMES.tickMain : tick.size === "half" ? RULER_CLASS_NAMES.tickHalf : RULER_CLASS_NAMES.tickEighth;
71772
+ el.className = `${RULER_CLASS_NAMES.tick} ${sizeClass}`;
71773
+ el.style.cssText = `
71774
+ position: absolute;
71775
+ left: ${tick.x}px;
71776
+ bottom: 0;
71777
+ width: 1px;
71778
+ height: ${tick.height};
71779
+ background-color: #666;
71780
+ pointer-events: none;
71781
+ `;
71782
+ if (tick.label !== void 0) {
71783
+ const label = doc2.createElement("span");
71784
+ label.className = RULER_CLASS_NAMES.label;
71785
+ label.textContent = String(tick.label);
71786
+ label.style.cssText = `
71787
+ position: absolute;
71788
+ top: -16px;
71789
+ left: -2px;
71790
+ font-size: 10px;
71791
+ color: #666;
71792
+ pointer-events: none;
71793
+ user-select: none;
71794
+ `;
71795
+ el.appendChild(label);
71796
+ }
71797
+ return el;
71798
+ }
71799
+ function createHandleElement(side, x2, doc2, options) {
71800
+ const handle = doc2.createElement("div");
71801
+ const sideClass = side === "left" ? RULER_CLASS_NAMES.handleLeft : RULER_CLASS_NAMES.handleRight;
71802
+ handle.className = `${RULER_CLASS_NAMES.handle} ${sideClass}`;
71803
+ handle.dataset.side = side;
71804
+ handle.style.cssText = `
71805
+ position: absolute;
71806
+ left: ${x2}px;
71807
+ top: 0;
71808
+ width: 5px;
71809
+ height: 20px;
71810
+ margin-left: -2px;
71811
+ background-color: #ccc;
71812
+ border-radius: 4px 4px 0 0;
71813
+ cursor: grab;
71814
+ transition: background-color 150ms ease;
71815
+ z-index: 10;
71816
+ `;
71817
+ handle.addEventListener("mouseenter", () => {
71818
+ if (!handle.dataset.dragging) {
71819
+ handle.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
71820
+ }
71821
+ });
71822
+ handle.addEventListener("mouseleave", () => {
71823
+ if (!handle.dataset.dragging) {
71824
+ handle.style.backgroundColor = "#ccc";
71825
+ }
71826
+ });
71827
+ if (options.onDragStart || options.onDrag || options.onDragEnd) {
71828
+ setupHandleDrag(handle, side, options);
71829
+ }
71830
+ return handle;
71831
+ }
71832
+ function setupHandleDrag(handle, side, options) {
71833
+ let offsetX = 0;
71834
+ const onPointerDown = (event) => {
71835
+ event.preventDefault();
71836
+ handle.dataset.dragging = "true";
71837
+ handle.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
71838
+ handle.style.cursor = "grabbing";
71839
+ const rect = handle.getBoundingClientRect();
71840
+ offsetX = event.clientX - rect.left - rect.width / 2;
71841
+ handle.setPointerCapture(event.pointerId);
71842
+ options.onDragStart?.(side, event);
71843
+ };
71844
+ const onPointerMove = (event) => {
71845
+ if (handle.dataset.dragging !== "true") return;
71846
+ const ruler = handle.parentElement;
71847
+ if (!ruler) return;
71848
+ const rulerRect = ruler.getBoundingClientRect();
71849
+ const newX = event.clientX - rulerRect.left - offsetX;
71850
+ options.onDrag?.(side, newX, event);
71851
+ };
71852
+ const onPointerUp = (event) => {
71853
+ if (handle.dataset.dragging !== "true") return;
71854
+ handle.dataset.dragging = "";
71855
+ handle.style.backgroundColor = "#ccc";
71856
+ handle.style.cursor = "grab";
71857
+ handle.releasePointerCapture(event.pointerId);
71858
+ const ruler = handle.parentElement;
71859
+ if (!ruler) return;
71860
+ const rulerRect = ruler.getBoundingClientRect();
71861
+ const finalX = event.clientX - rulerRect.left - offsetX;
71862
+ options.onDragEnd?.(side, finalX, event);
71863
+ };
71864
+ handle.addEventListener("pointerdown", onPointerDown);
71865
+ handle.addEventListener("pointermove", onPointerMove);
71866
+ handle.addEventListener("pointerup", onPointerUp);
71867
+ handle.addEventListener("pointercancel", onPointerUp);
71868
+ }
71869
+ const RULER_STYLES = `
71870
+ /* Ruler container */
71871
+ .${RULER_CLASS_NAMES.ruler} {
71872
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
71873
+ background-color: transparent;
71874
+ }
71875
+
71876
+ /* Tick marks base styling */
71877
+ .${RULER_CLASS_NAMES.tick} {
71878
+ flex-shrink: 0;
71879
+ }
71880
+
71881
+ /* Handle hover and active states */
71882
+ .${RULER_CLASS_NAMES.handle}:hover {
71883
+ background-color: rgba(37, 99, 235, 0.4) !important;
71884
+ }
71885
+
71886
+ .${RULER_CLASS_NAMES.handle}:active,
71887
+ .${RULER_CLASS_NAMES.handle}[data-dragging="true"] {
71888
+ background-color: rgba(37, 99, 235, 0.6) !important;
71889
+ cursor: grabbing !important;
71890
+ }
71891
+
71892
+ /* Vertical indicator animation */
71893
+ .${RULER_CLASS_NAMES.indicator} {
71894
+ transition: left 16ms linear;
71895
+ }
71896
+
71897
+ /* Print mode: hide rulers */
71898
+ @media print {
71899
+ .${RULER_CLASS_NAMES.ruler} {
71900
+ display: none !important;
71901
+ }
71902
+ }
71903
+
71904
+ /* High contrast mode support */
71905
+ @media (prefers-contrast: high) {
71906
+ .${RULER_CLASS_NAMES.tick} {
71907
+ background-color: #000 !important;
71908
+ }
71909
+
71910
+ .${RULER_CLASS_NAMES.label} {
71911
+ color: #000 !important;
71912
+ }
71913
+
71914
+ .${RULER_CLASS_NAMES.handle} {
71915
+ background-color: #666 !important;
71916
+ border: 1px solid #000;
71917
+ }
71918
+
71919
+ .${RULER_CLASS_NAMES.handle}:hover,
71920
+ .${RULER_CLASS_NAMES.handle}:active {
71921
+ background-color: #0066cc !important;
71922
+ }
71923
+ }
71924
+
71925
+ /* Reduced motion support */
71926
+ @media (prefers-reduced-motion: reduce) {
71927
+ .${RULER_CLASS_NAMES.handle} {
71928
+ transition: none !important;
71929
+ }
71930
+
71931
+ .${RULER_CLASS_NAMES.indicator} {
71932
+ transition: none !important;
71933
+ }
71934
+ }
71935
+ `;
71936
+ let rulerStylesInjected = false;
71937
+ function ensureRulerStyles(doc2) {
71938
+ if (rulerStylesInjected || !doc2) return;
71939
+ const styleEl = doc2.createElement("style");
71940
+ styleEl.setAttribute("data-superdoc-ruler-styles", "true");
71941
+ styleEl.textContent = RULER_STYLES;
71942
+ doc2.head?.appendChild(styleEl);
71943
+ rulerStylesInjected = true;
71944
+ }
71543
71945
  function isMinimalWordLayout(value) {
71544
71946
  if (typeof value !== "object" || value === null) {
71545
71947
  return false;
@@ -71586,6 +71988,7 @@ function isMinimalWordLayout(value) {
71586
71988
  }
71587
71989
  const LIST_MARKER_GAP$1 = 8;
71588
71990
  const DEFAULT_TAB_INTERVAL_PX$1 = 48;
71991
+ const DEFAULT_PAGE_HEIGHT_PX = 1056;
71589
71992
  const COMMENT_EXTERNAL_COLOR = "#B1124B";
71590
71993
  const COMMENT_INTERNAL_COLOR = "#078383";
71591
71994
  const COMMENT_INACTIVE_ALPHA = "22";
@@ -71828,6 +72231,9 @@ const _DomPainter = class _DomPainter2 {
71828
72231
  ensureFieldAnnotationStyles(doc2);
71829
72232
  ensureSdtContainerStyles(doc2);
71830
72233
  ensureImageSelectionStyles(doc2);
72234
+ if (this.options.ruler?.enabled) {
72235
+ ensureRulerStyles(doc2);
72236
+ }
71831
72237
  mount2.classList.add(CLASS_NAMES$1.container);
71832
72238
  if (this.mount && this.mount !== mount2) {
71833
72239
  this.resetState();
@@ -72085,6 +72491,12 @@ const _DomPainter = class _DomPainter2 {
72085
72491
  const el = this.doc.createElement("div");
72086
72492
  el.classList.add(CLASS_NAMES$1.page);
72087
72493
  applyStyles$2(el, pageStyles(width, height, this.getEffectivePageStyles()));
72494
+ if (this.options.ruler?.enabled) {
72495
+ const rulerEl = this.renderPageRuler(width, page);
72496
+ if (rulerEl) {
72497
+ el.appendChild(rulerEl);
72498
+ }
72499
+ }
72088
72500
  const contextBase = {
72089
72501
  pageNumber: page.number,
72090
72502
  totalPages: this.totalPages,
@@ -72097,6 +72509,70 @@ const _DomPainter = class _DomPainter2 {
72097
72509
  this.renderDecorationsForPage(el, page);
72098
72510
  return el;
72099
72511
  }
72512
+ /**
72513
+ * Render a ruler element for a page.
72514
+ *
72515
+ * Creates a horizontal ruler with tick marks and optional interactive margin handles.
72516
+ * The ruler is positioned at the top of the page and displays inch measurements.
72517
+ *
72518
+ * @param pageWidthPx - Page width in pixels
72519
+ * @param page - Page data containing margins and optional size information
72520
+ * @returns Ruler element, or null if this.doc is unavailable or page margins are missing
72521
+ *
72522
+ * Side effects:
72523
+ * - Creates DOM elements and applies inline styles
72524
+ * - May invoke the onMarginChange callback if interactive mode is enabled
72525
+ *
72526
+ * Fallback behavior:
72527
+ * - Uses DEFAULT_PAGE_HEIGHT_PX (1056px = 11 inches) if page.size.h is not available
72528
+ * - Defaults margins to 0 if not explicitly provided
72529
+ */
72530
+ renderPageRuler(pageWidthPx, page) {
72531
+ if (!this.doc) {
72532
+ console.warn("[renderPageRuler] Cannot render ruler: document is not available.");
72533
+ return null;
72534
+ }
72535
+ if (!page.margins) {
72536
+ console.warn(`[renderPageRuler] Cannot render ruler for page ${page.number}: margins not available.`);
72537
+ return null;
72538
+ }
72539
+ const margins = page.margins;
72540
+ const leftMargin = margins.left ?? 0;
72541
+ const rightMargin = margins.right ?? 0;
72542
+ try {
72543
+ const rulerDefinition = generateRulerDefinitionFromPx({
72544
+ pageWidthPx,
72545
+ pageHeightPx: page.size?.h ?? DEFAULT_PAGE_HEIGHT_PX,
72546
+ leftMarginPx: leftMargin,
72547
+ rightMarginPx: rightMargin
72548
+ });
72549
+ const interactive = this.options.ruler?.interactive ?? false;
72550
+ const onMarginChange = this.options.ruler?.onMarginChange;
72551
+ const rulerEl = createRulerElement({
72552
+ definition: rulerDefinition,
72553
+ doc: this.doc,
72554
+ interactive,
72555
+ onDragEnd: interactive && onMarginChange ? (side, x2) => {
72556
+ try {
72557
+ const ppi = 96;
72558
+ const marginInches = side === "left" ? x2 / ppi : (pageWidthPx - x2) / ppi;
72559
+ onMarginChange(side, marginInches);
72560
+ } catch (error) {
72561
+ console.error("[renderPageRuler] Error in onMarginChange callback:", error);
72562
+ }
72563
+ } : void 0
72564
+ });
72565
+ rulerEl.style.position = "absolute";
72566
+ rulerEl.style.top = "0";
72567
+ rulerEl.style.left = "0";
72568
+ rulerEl.style.zIndex = "20";
72569
+ rulerEl.dataset.pageNumber = String(page.number);
72570
+ return rulerEl;
72571
+ } catch (error) {
72572
+ console.error(`[renderPageRuler] Failed to create ruler for page ${page.number}:`, error);
72573
+ return null;
72574
+ }
72575
+ }
72100
72576
  renderDecorationsForPage(pageEl, page) {
72101
72577
  this.renderDecorationSection(pageEl, page, "header");
72102
72578
  this.renderDecorationSection(pageEl, page, "footer");
@@ -74897,7 +75373,8 @@ const createDomPainter = (options) => {
74897
75373
  layoutMode: options.layoutMode,
74898
75374
  headerProvider: options.headerProvider,
74899
75375
  footerProvider: options.footerProvider,
74900
- virtualization: options.virtualization
75376
+ virtualization: options.virtualization,
75377
+ ruler: options.ruler
74901
75378
  });
74902
75379
  return {
74903
75380
  paint(layout, mount2) {
@@ -85425,9 +85902,11 @@ updateLocalAwarenessCursor_fn = function() {
85425
85902
  if (typeof provider.awareness.setLocalStateField !== "function") {
85426
85903
  return;
85427
85904
  }
85428
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
85905
+ const editorState = __privateGet$1(this, _editor3)?.state;
85906
+ if (!editorState) return;
85907
+ const ystate = ySyncPluginKey.getState(editorState);
85429
85908
  if (!ystate?.binding?.mapping) return;
85430
- const { selection } = __privateGet$1(this, _editor3).state;
85909
+ const { selection } = editorState;
85431
85910
  const { anchor, head } = selection;
85432
85911
  try {
85433
85912
  const relAnchor = absolutePositionToRelativePosition(anchor, ystate.type, ystate.binding.mapping);
@@ -85445,7 +85924,9 @@ updateLocalAwarenessCursor_fn = function() {
85445
85924
  normalizeAwarenessStates_fn = function() {
85446
85925
  const provider = __privateGet$1(this, _options).collaborationProvider;
85447
85926
  if (!provider?.awareness) return /* @__PURE__ */ new Map();
85448
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
85927
+ const editorState = __privateGet$1(this, _editor3)?.state;
85928
+ if (!editorState) return /* @__PURE__ */ new Map();
85929
+ const ystate = ySyncPluginKey.getState(editorState);
85449
85930
  if (!ystate) return /* @__PURE__ */ new Map();
85450
85931
  const states = provider.awareness?.getStates();
85451
85932
  const normalized = /* @__PURE__ */ new Map();
@@ -86238,7 +86719,8 @@ ensurePainter_fn = function(blocks, measures) {
86238
86719
  virtualization: __privateGet$1(this, _layoutOptions).virtualization,
86239
86720
  pageStyles: __privateGet$1(this, _layoutOptions).pageStyles,
86240
86721
  headerProvider: __privateGet$1(this, _headerDecorationProvider),
86241
- footerProvider: __privateGet$1(this, _footerDecorationProvider)
86722
+ footerProvider: __privateGet$1(this, _footerDecorationProvider),
86723
+ ruler: __privateGet$1(this, _layoutOptions).ruler
86242
86724
  }));
86243
86725
  }
86244
86726
  return __privateGet$1(this, _domPainter);
@@ -120324,6 +120806,7 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
120324
120806
  */
120325
120807
  toggleRuler: () => {
120326
120808
  this.superdoc.toggleRuler();
120809
+ this.updateToolbarState();
120327
120810
  },
120328
120811
  /**
120329
120812
  * Initiates the image upload process
@@ -120749,6 +121232,13 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
120749
121232
  item.activate();
120750
121233
  }
120751
121234
  }
121235
+ if (item.name.value === "ruler") {
121236
+ if (this.superdoc?.config?.rulers) {
121237
+ item.activate();
121238
+ } else {
121239
+ item.deactivate();
121240
+ }
121241
+ }
120752
121242
  });
120753
121243
  }
120754
121244
  /**
@@ -122209,8 +122699,12 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
122209
122699
  };
122210
122700
  }
122211
122701
  });
122212
- const _hoisted_1$4 = { class: "numbering" };
122702
+ const _hoisted_1$4 = {
122703
+ key: 0,
122704
+ class: "numbering"
122705
+ };
122213
122706
  const MIN_WIDTH = 200;
122707
+ const PPI = 96;
122214
122708
  const alignment = "flex-end";
122215
122709
  const _sfc_main$6 = {
122216
122710
  __name: "Ruler",
@@ -122233,7 +122727,7 @@ const _sfc_main$6 = {
122233
122727
  const emit = __emit;
122234
122728
  const props = __props;
122235
122729
  const ruler = ref$1(null);
122236
- const rulerDefinition = ref$1([]);
122730
+ const rulerDefinition = ref$1(null);
122237
122731
  const rulerHandleOriginalColor = ref$1("#CCCCCC");
122238
122732
  const rulerHandleActiveColor = ref$1("#2563EB66");
122239
122733
  const pageSize = ref$1(null);
@@ -122246,45 +122740,32 @@ const _sfc_main$6 = {
122246
122740
  const initialX = ref$1(0);
122247
122741
  let offsetX = 0;
122248
122742
  const initRuler = () => {
122249
- if (props.editor.options.mode !== "docx") return;
122250
- const rulerItems = [];
122743
+ if (props.editor.options.mode !== "docx") return null;
122251
122744
  const { pageMargins: docMargins, pageSize: docSize } = props.editor.getPageStyles();
122252
122745
  pageSize.value = docSize;
122253
122746
  pageMargins.value = docMargins;
122254
- rightHandle.x = docSize.width * 96 - docMargins.right * 96;
122255
- leftHandle.x = docMargins.left * 96;
122256
- for (let i2 = 0; i2 < docSize.width; i2++) {
122257
- const marginNum = 0.0625 * 96 - 0.5;
122258
- const margin = `${marginNum}px`;
122259
- const diff = docSize.width - i2;
122260
- rulerItems.push(...generateSection(1, "main", "20%", margin, i2));
122261
- rulerItems.push(...generateSection(3, "eighth", "10%", margin));
122262
- rulerItems.push(...generateSection(1, "half", "40%", margin));
122263
- if (diff <= 0.5) break;
122264
- rulerItems.push(...generateSection(3, "eighth", "10%", margin));
122265
- }
122266
- return rulerItems;
122267
- };
122268
- const generateSection = (qty, size2, height, margin, index2) => {
122269
- return Array.from({ length: qty }, (_2, i2) => {
122270
- const item = {
122271
- className: `${size2}-unit ruler-section`,
122272
- height,
122273
- margin
122274
- };
122275
- if (index2 !== void 0) item.numbering = index2;
122276
- return item;
122747
+ const definition = generateRulerDefinition({
122748
+ pageSize: { width: docSize.width, height: docSize.height },
122749
+ pageMargins: {
122750
+ left: docMargins.left,
122751
+ right: docMargins.right,
122752
+ top: docMargins.top ?? 1,
122753
+ bottom: docMargins.bottom ?? 1
122754
+ }
122277
122755
  });
122756
+ leftHandle.x = definition.leftMarginPx;
122757
+ rightHandle.x = definition.rightMarginPx;
122758
+ return definition;
122278
122759
  };
122279
- const getStyle = computed(() => (unit) => {
122760
+ const getTickStyle = computed(() => (tick) => {
122280
122761
  return {
122762
+ position: "absolute",
122763
+ left: `${tick.x}px`,
122764
+ bottom: "0",
122281
122765
  width: "1px",
122282
- minWidth: "1px",
122283
- maxWidth: "1px",
122284
- height: unit.height,
122285
- backgroundColor: unit.color || "#666",
122286
- marginLeft: unit.numbering === 0 ? null : unit.margin,
122287
- marginRight: unit.margin
122766
+ height: tick.height,
122767
+ backgroundColor: "#666",
122768
+ pointerEvents: "none"
122288
122769
  };
122289
122770
  });
122290
122771
  const getHandlePosition = computed(() => (side) => {
@@ -122296,7 +122777,8 @@ const _sfc_main$6 = {
122296
122777
  const getVerticalIndicatorStyle = computed(() => {
122297
122778
  if (!ruler.value) return;
122298
122779
  const parentElement = ruler.value.parentElement;
122299
- const editor = parentElement.querySelector(".super-editor");
122780
+ const editor = parentElement?.querySelector(".super-editor") ?? document.querySelector(".super-editor");
122781
+ if (!editor) return { left: `${currentHandle.value.x}px`, minHeight: "100%" };
122300
122782
  const editorBounds = editor.getBoundingClientRect();
122301
122783
  return {
122302
122784
  left: `${currentHandle.value.x}px`,
@@ -122313,22 +122795,11 @@ const _sfc_main$6 = {
122313
122795
  showVerticalIndicator.value = true;
122314
122796
  };
122315
122797
  const handleMouseMove2 = (event) => {
122316
- if (!isDragging.value) return;
122798
+ if (!isDragging.value || !pageSize.value) return;
122317
122799
  const newLeft = event.clientX - offsetX;
122318
- currentHandle.value.x = newLeft;
122319
- if (currentHandle.value.side === "left") {
122320
- if (newLeft <= 0) {
122321
- currentHandle.value.x = 0;
122322
- } else if (newLeft >= rightHandle.x - MIN_WIDTH) {
122323
- currentHandle.value.x = rightHandle.x - MIN_WIDTH;
122324
- }
122325
- } else {
122326
- if (newLeft >= pageSize.value.width * 96) {
122327
- currentHandle.value.x = pageSize.value.width * 96;
122328
- } else if (newLeft <= leftHandle.x + MIN_WIDTH) {
122329
- currentHandle.value.x = leftHandle.x + MIN_WIDTH;
122330
- }
122331
- }
122800
+ const pageWidthPx = pageSize.value.width * PPI;
122801
+ const otherHandleX = currentHandle.value.side === "left" ? rightHandle.x : leftHandle.x;
122802
+ currentHandle.value.x = clampHandlePosition(newLeft, currentHandle.value.side, otherHandleX, pageWidthPx, MIN_WIDTH);
122332
122803
  };
122333
122804
  const handleMouseUp = () => {
122334
122805
  isDragging.value = false;
@@ -122349,14 +122820,17 @@ const _sfc_main$6 = {
122349
122820
  rulerHandleOriginalColor.value = "#CCC";
122350
122821
  };
122351
122822
  const getNewMarginValue = () => {
122352
- if (currentHandle.value.side === "left") return currentHandle.value.x / 96;
122353
- else return (pageSize.value.width * 96 - currentHandle.value.x) / 96;
122823
+ if (!pageSize.value) return 0;
122824
+ const pageWidthPx = pageSize.value.width * PPI;
122825
+ return calculateMarginFromHandle(currentHandle.value.x, currentHandle.value.side, pageWidthPx, PPI);
122354
122826
  };
122355
122827
  const getStyleVars = computed(() => {
122828
+ const width = rulerDefinition.value?.widthPx ?? pageSize.value?.width * PPI ?? 816;
122356
122829
  return {
122357
122830
  "--alignment": alignment,
122358
122831
  "--ruler-handle-color": rulerHandleOriginalColor.value,
122359
- "--ruler-handle-active-color": rulerHandleActiveColor.value
122832
+ "--ruler-handle-active-color": rulerHandleActiveColor.value,
122833
+ "--ruler-width": `${width}px`
122360
122834
  };
122361
122835
  });
122362
122836
  onMounted(() => {
@@ -122392,32 +122866,20 @@ const _sfc_main$6 = {
122392
122866
  class: "vertical-indicator",
122393
122867
  style: normalizeStyle(getVerticalIndicatorStyle.value)
122394
122868
  }, null, 4)) : createCommentVNode("", true),
122395
- (openBlock(true), createElementBlock(Fragment$1, null, renderList(rulerDefinition.value, (unit) => {
122869
+ rulerDefinition.value ? (openBlock(true), createElementBlock(Fragment$1, { key: 1 }, renderList(rulerDefinition.value.ticks, (tick, index2) => {
122396
122870
  return openBlock(), createElementBlock("div", {
122397
- class: normalizeClass(unit.className),
122398
- style: normalizeStyle(getStyle.value(unit))
122871
+ key: index2,
122872
+ class: normalizeClass(["ruler-tick", `ruler-tick--${tick.size}`]),
122873
+ style: normalizeStyle(getTickStyle.value(tick))
122399
122874
  }, [
122400
- createBaseVNode("div", _hoisted_1$4, toDisplayString(unit.numbering), 1),
122401
- (openBlock(true), createElementBlock(Fragment$1, null, renderList(unit.elements, (half) => {
122402
- return openBlock(), createElementBlock("div", {
122403
- class: normalizeClass(half.className),
122404
- style: normalizeStyle(getStyle.value(half))
122405
- }, [
122406
- (openBlock(true), createElementBlock(Fragment$1, null, renderList(half.elements, (quarter) => {
122407
- return openBlock(), createElementBlock("div", {
122408
- class: normalizeClass(quarter.className),
122409
- style: normalizeStyle(getStyle.value(quarter))
122410
- }, null, 6);
122411
- }), 256))
122412
- ], 6);
122413
- }), 256))
122875
+ tick.label !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_1$4, toDisplayString(tick.label), 1)) : createCommentVNode("", true)
122414
122876
  ], 6);
122415
- }), 256))
122877
+ }), 128)) : createCommentVNode("", true)
122416
122878
  ], 4);
122417
122879
  };
122418
122880
  }
122419
122881
  };
122420
- const Ruler = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-79f9a944"]]);
122882
+ const Ruler = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-b9f4f30a"]]);
122421
122883
  const _sfc_main$5 = {
122422
122884
  __name: "GenericPopover",
122423
122885
  props: {
@@ -123598,7 +124060,7 @@ function adjustPaginationBreaks(editorElem, editor) {
123598
124060
  const BlankDOCX = "data:application/octet-stream;base64,UEsDBBQAAAAIAAAAIQAykW9XXgEAAKUFAAATABwAW0NvbnRlbnRfVHlwZXNdLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAAC1lMtqwzAQRfeF/oPRNthKuiilxMmij2UbaPoBijRORPVCmrz+vuM4NaWkMeSxMcgz994zQsxwvLEmW0FM2ruSDYo+y8BJr7Sbl+xz+po/sCyhcEoY76BkW0hsPLq9GU63AVJGapdKtkAMj5wnuQArUuEDOKpUPlqBdIxzHoT8EnPgd/3+PZfeITjMsfZgo+EzVGJpMHvZ0O+GJIJJLHtqGuuskokQjJYCqc5XTv1JyfcJBSl3PWmhQ+pRA+MHE+rK/wF73TtdTdQKsomI+CYsdfG1j4orL5eWlMVxmwOcvqq0hFZfu4XoJaREd25N0Vas0K7XxeGWdgaRlJcHaa07IRJuDaTLEzS+3fGASIJrAOydOxHWMPu4GsUv806QinKnYmbg8hitdScE0hqA5js4m2NncyySOifRh0RrJZ4w9s/eqNU5DRwgoj7+6tpEsj57PqhXkgJ1IJvvluzoG1BLAwQKAAAAAACTZE1bAAAAAAAAAAAAAAAACQAcAGRvY1Byb3BzL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAAAAhACEYr1llAQAAxQIAABAAHABkb2NQcm9wcy9hcHAueG1sVVQJAAMw0M4SMNDOEnV4CwABBPUBAAAEFAAAAJ1STU/DMAy9I/Efqt63dBwmNHlBaAhx4GPSCpyjxG0j0iRKson9e5wVSoEbOdnP9st7TuDqvTfFAUPUzq7LxbwqC7TSKW3bdflc384uyyImYZUwzuK6PGIsr/j5GWyD8xiSxlgQhY3rskvJrxiLssNexDmVLVUaF3qRKA0tc02jJd44ue/RJnZRVUuG7wmtQjXzI2E5MK4O6b+kysmsL77UR098HGrsvREJ+WOeNHPlUg9sRKF2SZha98grgscEtqLFyBfAhgBeXVAx9wwBbDoRhEy0vwxOMrj23mgpEu2VP2gZXHRNKp5OYos8DWzaAmRgh3IfdDpmqmkK99ri6YIhIFVBtEH47gROMthJYXBD1nkjTERg3wBsXO+FJTo2RsT3Fp997W7yFj5HfoITi686dTsvJP4yO8FhRygqUj8KGAG4o8cIJrPTrG1RffX8LeT1vQy/ki+W84rOaV9fGLkevwv/AFBLAwQUAAAACAAAACEACvOn+GYBAADtAgAAEQAcAGRvY1Byb3BzL2NvcmUueG1sVVQJAAMw0M4SMNDOEnV4CwABBPUBAAAEFAAAAJ2SXU+DMBSG7038D6T3UGBqDAGWTLMrZ0yc0XhX27Otjn6k7cb27y0wmMRdeXc+nvP29G3z6UFUwR6M5UoWKIliFICkinG5LtDbch7eo8A6IhmplIQCHcGiaXl9lVOdUWXgxSgNxnGwgVeSNqO6QBvndIaxpRsQxEaekL65UkYQ51OzxprQLVkDTuP4DgtwhBFHcCMY6kERnSQZHST1zlStAKMYKhAgncVJlOAz68AIe3Gg7fwiBXdHDRfRvjnQB8sHsK7rqJ60qN8/wR+Lp9f2qiGXjVcUUJkzmjnuKihzfA59ZHdf30BdVx4SH1MDxClTPnO6DWZgJKlapq83jm/hWCvDrJ8eZR5jYKnh2vl37LRHBU9XxLqFf9gVBzY7jo/5224mDOx58y/KtCWGND+Z3K0GLPDmZJ2Vfed98vC4nKMyjdObMEnD5G6Zpll8m8XxZ7PdaP4sKE4L/FuxF+gMGn/Q8gdQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAYAHABfcmVscy9VVAkAA4Yc7WiHHO1odXgLAAEE9QEAAAQUAAAAUEsDBBQAAAAIAAAAIQAekRq36QAAAE4CAAALABwAX3JlbHMvLnJlbHNVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAArZLBasMwDEDvg/2D0b1R2sEYo04vY9DbGNkHCFtJTBPb2GrX/v082NgCXelhR8vS05PQenOcRnXglF3wGpZVDYq9Cdb5XsNb+7x4AJWFvKUxeNZw4gyb5vZm/cojSSnKg4tZFYrPGgaR+IiYzcAT5SpE9uWnC2kiKc/UYySzo55xVdf3mH4zoJkx1dZqSFt7B6o9Rb6GHbrOGX4KZj+xlzMtkI/C3rJdxFTqk7gyjWop9SwabDAvJZyRYqwKGvC80ep6o7+nxYmFLAmhCYkv+3xmXBJa/ueK5hk/Nu8hWbRf4W8bnF1B8wFQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAUAHAB3b3JkL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAoWRNW+xw0GIQAgAAtAcAABIAHAB3b3JkL2ZvbnRUYWJsZS54bWxVVAkAA54c7WieHO1odXgLAAEE9QEAAAQUAAAAvZPBbqMwEIbvlfoOlu8NhpA0RSFV222kvexh1T6AY0ywFtvI44Tk7dcYiBSyuy3tqiCEGf75mPnHLO8PskR7bkBoleJwQjDiiulMqG2KX1/WNwuMwFKV0VIrnuIjB3y/ur5a1kmulQXk8hUkkqW4sLZKggBYwSWFia64ci9zbSS17tFsA0nNr111w7SsqBUbUQp7DCJC5vj6CrmjZZn3oHSeC8a/abaTXFkPCQwvHVYrKEQFZ8j6Pcham6wymnEA170sW6ikQp2zwviCJgUzGnRuJ663rjbPc4yQ+JUsB5TZOEr0Z8qc8cM40KIDBS7zAiaycbD5CSayIexjZQ0p2W4UJ5r2FTW3Jn0IhMxmxThmP8GgyaWWFhSKCywf1+/sxDxKNwgkWfJ9q7Shm9KR3CZDbosgD0btZJobaieO+j6Qdwiv2mK6nxLViaLSUV6E5IB+8Br91JKqXtZJK6o08NCp97RMMWkanZMpmZHYXZFbxTg4T2EFNcDtKYUMBTmVojz2743/6kBSCcuKXrGnRjQdD0Ugtk6ygw1J8TMhJHper3EbCVP85CK3i9ljF4maSvxx10WmpwhpIsxz/GPYcpjnnDT915dB6+Bf/HzSOyO4aRx908tb59+d97TxMv60l1Jn3PzbzFwcePYRJ+PpVzv54MZevunho9uPsfewPT/rIdQC4P/sx4evdrFfwuo3UEsDBBQAAAAIAAAAIQCWFrgr1QIAAIgLAAARABwAd29yZC9kb2N1bWVudC54bWxVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAApZZbb9sgFMffJ+07WH5v8S1OYjWttGab+jCpWrcPQIDEqAYsILd9+h3s+LJ5qxz3CXPg/PjDORxz93AShXdg2nAlV354G/gek0RRLncr/+ePLzcL3zMWS4oLJdnKPzPjP9x//HB3zKgie8Gk9QAhTXYsycrPrS0zhAzJmcDmVnCilVFbe0uUQGq75YSho9IURUEYVF+lVoQZA+s9YnnAxr/gyGkcjWp8BGcHTBDJsbbs1DHCqyEztESLISiaAIIdRuEQFV+NSpFTNQAlk0CgakCaTSP9Y3PpNFI0JM2nkeIhaTGNNEgnMUxwVTIJg1ulBbbQ1TsksH7dlzcALrHlG15wewZmkDYYzOXrBEXg1RJETK8mzJFQlBUxbShq5e+1zC7+N62/k57V/pem9WDFuGVhuSViJ1sY2/jqMWdXu68vhaU6NaRZAeeopMl52VYHMZUGg3kDObx1AAdR+G1lC0detf+VtnUdhg44Rv4ldqKolb9NDIMR0XSI1mOMhD/XbJQIyOBu4UlH0zvccGTxaQDRAJASNvJn0TAWFwYi3e12HD7yWjWctOVw2uNME9MD0P1ViChudLjGufdYhlqaX4drYoScL7Y4xybvE9l1G5y1uLPonXe5e9+l+qrVvuxo/H20p668HuV1GwzSvyNYmveJeclxCVVXkOxpJ5XGmwIUwVXz4LZ4VQS8Ol1d49U3wGti7VUJ5Lmq5d/DO22j6Nm1JQwkWYk1foI0T8JlmqTz0K+s8Jezzhoks+VivpyBNYM3If0OJkiveD3/1JqetTPGYZA8fm6Na7bF+8IOpz/3JiMnwzBin/VYfiV89/ILBqFihVGUBG4iJHQ4W8A3qid8w45oFRTWMKmnaL7LbdfdKGuV6PoF2/ZGc4Ypg3XnUdXdKmV73d3eVt3LckQVBqymxITVcyozvIe/aheSrOCSPXNLQGWcVqOo2Xf1WUcEdU/o+99QSwMEFAAAAAgAAAAhAMrnZYorBAAAvgwAABEAHAB3b3JkL3NldHRpbmdzLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAAC1V22PmzgQ/n7S/QfE58uG1ySLmq3yervV5lqVre6zAZNYa2Nkm03T0/33GwwO9BZVSav9hJln5pnxeGYM795/ZdR6wUISXsxt98axLVykPCPFfm5/edqOZrYlFSoyRHmB5/YJS/v93e+/vTtGEisFatICikJGLJ3bB6XKaDyW6QEzJG94iQsAcy4YUvAq9mOGxHNVjlLOSqRIQihRp7HnOBO7peFzuxJF1FKMGEkFlzxXtUnE85ykuH0YC3GJ38ZkzdOK4UJpj2OBKcTAC3kgpTRs7GfZADwYkpcfbeKFUaN3dJ0LtnvkIjtbXBJebVAKnmIp4YAYNQGSonMcvCI6+74B3+0WNRWYu45e9SMPryPwXhFMUvz1Oo5ZyzEGyz4Pya7jmZx5SNbj+blgegRZdRWF55s46kdt3uOSmcoO19GZMxrXtkihA5KHPiO+boPhme7EunxLekkFNtAjSQQSp375sTR62BdcoIRCOFCGFlSSpaOzmqOsH1ZTHZbJg6WTa9/B1PnGObOOUYlFCq0HI8tz7HENQMHzPFZIAVEkS0ypnmEpxQj8HqO9QAymj5FomwznqKLqCSWx4iUovSDY3tRQpgckUKqwiEuUAtuKF0pwavQy/hdXK5hkAhqttdBzrVvFzYwEiwIx2PB3c2/HM1xHVgly+cnYxrsb9l3+3xGHmS5Ihp/qRMfqRPEWgo/JN7wosg+VVAQY9fT7hQh+FAAuas8foTSeTiXeYqQqSNMbOdMnsaWk3BEhuHgoMqiNN3NG8hwLcECg1nZQPkTwo87zPUYZXKVv5LeS+G9Qhs70n6Asn5dcKc7uT+UBcv1rJ6nrfdwvX/ggyKRZfOZcnVVhbPnr6bKJtEYvQXzXCVabQWTibN1hm0XgO/4gsnLXbjCMhLPlaggJboOJuxhCJqG3CcIhZLH0Zv5sCFku3Wk4iKxW/srfDiIbZz28n83Km04HY9vees7tpj2d9kxYVH9qfBJmVTe2xRqLFWKJIMja1R8j41ojEc9LUhg8wTClcR+Jq8SAo1EDSIYo3UKJGcBp5BmR5Rrnek13SOw73lZDDEphyn44c9VTG4s/Ba/KBj0KVDYNa1TcIGgtSaEeCTNyWSWxsSrgXulBVZF9fBE6T116jpGCBtCD7xHpRtK6uBh9idtGoyKumwTvUFk2vZbs3blNyf6g3Lo9FLxl8M2qX5K912KexrwG0y8orXcG2u2ik3lG1tPzjczvZIGRBZ0sNLKwk02MbFLLDjBdBVx1z9D2ZlnLc04pP+LsvsNficwlmBI48fjEku5uu2kwSiTMoRKuQcWFwf7QmBtEGU8f6vs6aOT+YhGuF860gUN9fSo9qiC1n3G+RBJnLWZMw8b0n8nEmbjuajYKZpvb0WYaBKOZu7wdTafO1PW3rufPnH/bPjA/Hnf/AVBLAwQUAAAACAAAACEA24Vsw30EAACXHQAAEgAcAHdvcmQvbnVtYmVyaW5nLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAADNmc1u4zYQx+8F+g6CgB4Tifq2sM4iySZFFttF0U3RMy3RlhB+CBRlx9d9mT5CH2tfoaRkyXLkxJIctz4pJjk/zQxnyL+dDx+fCdaWiOcpo1MdXJq6hmjE4pQupvqfj/cXga7lAtIYYkbRVF+jXP949fNPH1YhLcgMcblQkwyah6ssmuqJEFloGHmUIALzS5JGnOVsLi4jRgw2n6cRMlaMx4ZlArP8K+MsQnkuObeQLmGub3DRcz9azOFKGiugY0QJ5AI9bxlgMMQ1JkbQBVkjQDJCC3RR9mCUZyivOiBnFEh61SG540h7gvPGkawuyR9HsrukYBypU06kW+AsQ1ROzhknUMiPfGEQyJ+K7EKCMyjSWYpTsZZM06sxMKVPIzySVg2B2PFggm8QFiNsxzWFTfWC03Bjf9HYK9fDyn7zaCwQ7vda+bqJgZ4FzkVty/vkrjL/xKKCICrKrBkcYZlHRvMkzZrTgYylycmkhizfSsCSYL052UDPVnvtaPtUbcMW2Mf9zd4RXHn+NhGYPXZTIRqLPi7svrP2hMgK3r54VGpayQU9D58aYHUAXoR6XhY1I9gwjGjb3YqT9myrmuM1nDRuccY50wLExSCEZdd+qIcyb7HyWMTJMFy9R4ayhQImME/aRDQsQLfBrUkr39niuKb6lbMi29LS42gP2+N1RYcFaHovdzDLj3PmWwIzeeqSKHxYUMbhDEuPZKtpslu0cge0qlzVQ6s6QKv3WisLSFOnln4lhRqc5YLDSHwtiLbz6UFWuxR8khlyJFUeV4OVprueC8RvOIJPaomi0Fy9LVxCeQUAD1jejenrhpohBRbpF7RE+HGdoXpNsp7xNP5NzWE1V60VJMP1Chfc3Tp3ZlDN4KWaSOWjcioUGZb3remYE9M0QelD6WPjRGUnZeg9aQZnBcZINMRHeQfVUz++/9OMf47qUYzmm+XZ71w9UqrCVMNT3bdKTxJIF6Ugtj1TrTWaxXzzuGdU5Cq5eZTKOvy2JjOGS9NrmbedgZRKcIzmUGZmAyspRunYy0yATibsckTeZ/JSXCK14ujMsKF5AY4zLjG3rOAp4tpXtGpl58VolHcXDsua1cma+/5Z+/H976F5s4A3Lm9/ydXqO1neytru2LAE2Xsa7AQJGtxwVhD83x3nnGXHyTycdce5Z9pxjj3yCH/vjvPOtONcc+RR/n4d559lx7n+yLP6P+q44Ew7znNGHuHHd5yxo24PSl8wRvq6gW8C++b6OOl7d+c5wL91+kjf+57bGKMoJRDv3cdfwOU7a9+echVMRhYlZivEvyAh92J/RNbgiA6p1p5aEtwcE9IfjEC6PyJ7X0Q8XSQDBCUIeoTUVX/3I0N6s+acwTt0SP71VGynKzp3cEiHhFtPOXWyovOGF11HU/Uquq4AOknR+YN36JAC6ilaTld0wfCQDmiXnoriZEU3GV50HVnxStF1NQAt737auvPVD2dhXJQ/q5WDMlTHn3jWy5/LHpprv34X3cO09jGdwHWB7wDwOhO0mUbrH6pX/wJQSwMEFAAAAAgAAAAhAL5+dmJWAQAA0AMAABQAHAB3b3JkL3dlYlNldHRpbmdzLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAACd01FvwiAQAOD3JfsPhHelumlMYzVZFpe9LEu2/QAKV0sGXAO46n79aLWuiy92T0DLfbnjYLneG02+wHmFNqOTcUIJWIFS2W1GP943owUlPnAruUYLGT2Ap+vV7c2yTmvI3yCEuNOTqFifGpHRMoQqZcyLEgz3Y6zAxp8FOsNDXLotM9x97qqRQFPxoHKlVTiwaZLM6Ylx1yhYFErAI4qdARvaeOZARxGtL1XlO62+RqvRycqhAO9jPUYfPcOVPTOT+wvIKOHQYxHGsZhTRi0VwydJOzP6F5gNA6YXwFzAfpixOBksRvYdJYc587OjZM/5XzI9QO4GEdO7Lo9maMJ7lpdBlsO4rkesieWBl9yXfRGGFTg7cwfTnLcR6fPWouO5jlK8QSReAtLC5NiFZiDHxpKuBNKeC13FJ4ZVUEZ9wwbdg8Pag2PNZ6411q8vT3HB/rzD1Q9QSwMEFAAAAAgAAAAhAD+v4WZfDwAADaYAAA8AHAB3b3JkL3N0eWxlcy54bWxVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAA3Z1tc9s2Esff38x9B45e9V6ksp5lT92O7STnzCWpWzvX1xAJWaj5oCOpOO6nPwB8EKUlKC64UdRMZlqL4v4I4L+7xIIU+dMvXwLf+czjREThZW/w41nP4aEbeSJ8vOx9enj7at5zkpSFHvOjkF/2XnjS++Xnf/7jp+eLJH3xeeJIQJhcBO5lb5Wm64t+P3FXPGDJj9Gah/LLZRQHLJUf48d+wOKnzfqVGwVrloqF8EX60h+enU17OSZuQ4mWS+Hy15G7CXiYavt+zH1JjMJkJdZJQXtuQ3uOYm8dRy5PEtnpwM94ARNhiRmMASgQbhwl0TL9UXYmb5FGSfPBmf4r8LeACQ4wBICpy7/gGPOc0ZeWVY7wcJxpyRFehWPXmArA26AQw1HRDvU/ZV5hJV7qrXC4QqO+smUpW7FkVSVyXAcnJe4lUOMduBfvHsMoZgtfkqQHOdIJHA12MhXU/5xMWKfogqPHpfezjC4vcl/zJdv4aaI+xndx/jH/pP/3NgrTxHm+YIkrxGXvKhZMDvHzBWdJepUI9iBbLg8fCNmS26swEerLlfqjsrObXPYeRCBD+SN/dn6PAhY6P1xH3otzc/+vXl8d6InHodzzM/Mve8NsU/JXuWFcbLlJ9rf5LHwstvHw1af7ausqmxbCk01i8av7K204GF/44pGlm1g2S33ShCwRxd6N7Db/km5k++XO/Xw8+vujtC4/ZXvtDalMGDJ93GdZTH7Ll+8j94l796n84rJ31ss2fnp3F4solpnqsnd+nm+854G4FZ7Hw8qO4Up4/I8VDz8l3Ntu/+2tzjb5BjfahPLv0WyqZfYT780Xl69V7pLfhkzp9VEZaG02Yntwbf6/AjbIB7jOfsWZSuDOYB9xjkYMlUVS6W09c7PX9wH6QKNjHWh8rANNjnWg6bEONDvWgebHOtD51z6QCD2Z3wf1hwHUQxxDNKI5hmBDcwyxhOYYQgXNMUQCmmNwdDTH4MdojsFNEZw0ck1eWHH2kcHbm7mHzxF23MOnBDvu4TOAHfdwwrfjHs7vdtzD6dyOezh723EPJ2s8N5tqOe9kmIVp5yhbRlEaRil31PS0M42FkqWrWhqeOunxmKSTBJgss+Un4s40l+nPhz1k0u18nqqCzomWzlI8quKkc8N5+Jn70Zo7zPMkjxAYc1k+GUbExqdjvuQxD11O6dh0UF+E3Ak3wYLAN9fskYzFQ494+AoiSVIoHZpt0pUKEkHg1AFz44hgzsLI8sN7kXQfKwVxrje+z4lYH2lcTLO61wYa07000JjulYHGdC8MKppRDVFOIxqpnEY0YDmNaNwy/6Qat5xGNG45jWjcclr3cXsQqc/3Zx2D9mt3N36UUCS8e/EY6vXTzqR8zdS5YzF7jNl65ahl54MzLfRx9JLzA8U5rSRRzeu1i6hVZxFuug/oDo0quEoeUXiVPKIAK3ndQ+yDnCarCdotTT1zv1mktUHbviq4Z/4mm9B2jzaWdvewbQC8FXFCFgb1WAIP/qims7dEU71tK7s3bMvqHlb7WYm0eTmSoJV+5D7RpOHblzWPZVn21Jn0NvL96Jl7dMT7NI4yX6uG/HDYOuTfBOsVS0QCEO1P9cUdDM4Htu7coTufiZBGtzevAiZ8h24Gcfvw4b3zEK1VmakGhgZ4HaVpFJAx85XAH/7gi3/RNPBKFsHhC1Fvr4iWhzTsRhCcZDJS5BGR5DRThILkHKp5/+Evi4jFHg3tLubZTUMpJyLes2DtU8WWzIvPMv8QzIY0778sFmpdiCqoHkhglWXDZLP4k7vdU93HyCFZGfp1k+r1Rz3V7X61dwfXfZqwg+s+RdBqytOD8l+Czu7gund2B0fV2RufJYkwXkK15lF1t+BR97d78ZfzIj+KlxufbgALINkIFkCyIYz8TRAmlD3WPMIOax51fwldRvMIluQ079+x8MjE0DAqJTSMSgYNo9JAw0gF6H6HTgXW/TadCqz7vToZjGgKUIFR+Rnp6Z/oKk8FRuVnGkblZxpG5WcaRuVno9cOXy7lJJjuFFNBUvlcBUl3oglTHqyjmMUvRMg3Pn9kBAukGe0ujpbq1yRRmN3ETTGd3SxSysl2hqMS+Q++IGuaYlG2i2BFlPl+FBGtrW1PONpy9961Q2b65xydm3DnM5evIt/jsaFPjfXy/Zq5Ai6dtr9Y8l48rlLnflWu9lcx07ODlkXBvmN2+IB1Yz4dNl5m8sQmKBoKf0wxHbU3HgLj8WHj7Uxix3LS0hIec3rYcjtL3rGctbSEx5y3tBwBy6Z4eM3ip1pHmDX5T1njGZxv1nhhvjCuPWyTI5WWdS44a/KinVBxrlxXXS2A6rSLGbN9u+Ax22OiyEzBhJOZ0jquzIimAPudfxZJ7Rr1gevf5d0TIO+PW2fO3zZRCi5TD9v/qOudnDiFCXdqOaP2F652sox5HFunGzOidd4xI1onIDOiVSYymqNSkpnSOjeZEa2TlBmBzlbwjIDLVtAel62gvU22ghSbbNVhFmBGtJ4OmBHoQIUIdKB2mCmYEahABeZWgQop6ECFCHSgQgQ6UOEEDBeo0B4XqNDeJlAhxSZQIQUdqBCBDlSIQAcqRKADFSLQgWo5tzeaWwUqpKADFSLQgQoR6EAddwxUaI8LVGhvE6iQYhOokIIOVIhABypEoAMVItCBChHoQIUIVKACc6tAhRR0oEIEOlAhAh2ok46BCu1xgQrtbQIVUmwCFVLQgQoR6ECFCHSgQgQ6UCECHagQgQpUYG4VqJCCDlSIQAcqRKADddoxUKE9LlChvU2gQopNoEIKOlAhAh2oEIEOVIhABypEoAMVIlCBCsytAhVS0IEKEehAhYgm/8wvUZpusx/gVz2Nd+wjfueTNer36k+5d9ZQ26OKVplZ7X+LcB1FT07tDw9Ho/YQsfBFpJeoDZfVq9wZ+sLnrzfNv/Bp8RiPtl3Jfwuhr5kC+LitJVhTGTe5fNUSFHnjJk+vWoJZ57gp+1YtwWlw3JR0dVwWN6XI0xEwbkozFeOBwbwpW1fM4RA35eiKIRzhpsxcMYQD3JSPK4YTRyXnfetJy3GalveXAkKTO1YIMzOhyS2hVsa1/daimQlt1TMT2spoJqD0NGLwwppRaIXNKDupYZhhpbYPVDMBKzUkWEkNMPZSQ5S11BBlJzVMjFipIQErtX1yNhOspAYYe6khylpqiLKTGp7KsFJDAlZqSMBK3fGEbMTYSw1R1lJDlJ3UcHKHlRoSsFJDAlZqSLCSGmDspYYoa6khyk5qUCWjpYYErNSQgJUaEqykBhh7qSHKWmqIapJar6LYV0sVc9wkrGKIOyFXDHHJuWJoUS1VrC2rpQrBslqCWtlVS1XR7Kqlqnp21VJVRrtqCehpVy3VCmtXLdUqbFctmaXGVUt1UtsHql21VCc1rloySo2rlhqlxlVLjVLjqiWz1LhqqU5qXLVUJ7V9crarloxS46qlRqlx1VKj1LhqySw1rlqqkxpXLdVJjauW6qTueEK2q5YapcZVS41S46ols9S4aqlOaly1VCc1rlqqkxpXLRmlxlVLjVLjqqVGqXHVkllqXLVUJzWuWqqTGlct1UmNq5aMUuOqpUapcdVSo9S4aumDNBEEj4C6D1icOnTPi7tlySpl3R9O+CmMeRL5n7nn0Hb1PaqX/eed118ptn6dn9w/lWOmnoBe+bmSlz0BNgfqHd955WuqlLFqiZO/5yvfrBucX67NjqgNDxyqhOfXigcAv325lT7Cgsle/RrWHTxUD0as2a4cotheHOZmxeLs262rFvuc7/fl+SJO1Avcsq/Pzoaj0evZdbbXOns12xPn64/y+P3ig9SHJ/pTkv2AVpov1DPF5AiMpvq3V2yZ8viyN8+jNsqe2vT+s18eKZcuP0btW+CKV76xPyuvfNt/H5z68k2+TX2vXwlXa+kmaWXztfBE1jhXRXnZrrfj2VT7ht5ZZ4DLHtPxv92sbkpR9xm8zQjbF8gVF5urL5AbF30tXu1m4zxDo/MMKZ1n2MJ5tmGZ7bcTlF/ZvQYt3WvwfbrXaAjdK9vW0b1GRvcaUbrX6Dtxr2Gzex1yomO4ynAOXSXb1tFVxkZXGVO6yvjEXWVe9ZSx0VNGX8dTRPbfm4TEbzp6xMToERNKj5h8Hx4xPs3c0dEHpkYfmFL6wPTEfcAs++ToiWByrv7tO4F609LWBR6EeoPv1ZTAA2ZGD5hResDsb+sB0yME/pE1nxs1n1NqPj8pzaGys6PH9nCm/rXR+TXFnO/cqPM5pc7nJ67z/AgRTK+sKweVufkD1Q3rX/mLkcon++jXIu1rbnh7kkGvQTu9zO1O1SpsQ5v1Km3jwl3+sHaTQ7X2qHThZ1LLP96FyqGe83fYZy31vrBeseMN9/0PLNs7Wpt39fkyzb4dnM1rvl9kr4Qw2sf62oER0N9tTL/shHm8s5dE5j9qMa6T6keGweHOHiXWcaRb+rC7SeTQ6OXe/fbtrIHut/K2WG51tnlmL3HVxoEpXQ0OpCpz8vle1qO6LHciJR02SjokknSIO/t8/wp3WXFEKjxqVHhEpPDoayn8d1/0Q6o1blRrTKTW+NTUOvbCG1KVSaMqEyJVJqemysnpMG3UYUqkw/TUdDjqahRSklmjJDMiSWanJslpiTBvFGFOJML81EQ46koOUpLzRknOiSQ5PzVJvslyWvZgi/2xzrZSrKNpUtMi2iAv2FBrZNtF7r0L4656fcWXdMP8/En6jctjxyyBtk3W3XpV9PuJx+XgbifLZXqcwunzhDgRbiWqdYOu4VbxJbP6p1m2Hl+z+iAtX6K9L1D5BUWoFrDGaB1YRGu4CbI/hA/vhyq/BDE9mB64Je+bTECAVwwm36Lm3RHL5BZdQ3fXvczecOJzxq8sWX3MZq8B2Fcm20oRrZrUFKpDmztrD92ANige3venW3BUEcvj2khtmGSOz9S/NhpS18PbgasVp2vMVBQ2a3IwYI46cvUOrC6fbN+rsT9We6/dOOTRcChGYwv3FPpSl7pQpZ6R12LO19Jdyk7nD44rn2a3323wuDuco9R4BOqEetg7jnifVT4W9Ylu920oFAmverimvDeyKSjW117lAqneL5GelL9X+y91j5yTZUeuJ61OPuyW6+PlpdSvfKT+tmeHfhgxKjJ7NcbmU90afWU3+0SS/L/peijwo0bX7Xo62AmSAx57cnHfmCO3z9Y0DeB2j65Zsrjmh8qSi+yo+WglMqn4N2xNM3ZgSjmpH9Hir+Tn/wNQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAsAHAB3b3JkL3RoZW1lL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAAAAhAGeA/LSbBgAAzSAAABUAHAB3b3JkL3RoZW1lL3RoZW1lMS54bWxVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAA7VlPb9s2FL8P2HcgdHf1x5IsBXUL/23XJm3RpB16ZGRaYkyJAkknMYoCQ3vaZcCAbthlwG47DMMKrMCKXfZhCrTYug8xSnZs0abatE23AksMxCL5e48/vvf4+ExdvHycEnCIGMc0axv2BcsAKIvoCGdx27izN2wEBuACZiNIaIbaxgxx4/KlTz+5CLdEglIEpHzGt2DbSITIt0yTR7Ib8gs0R5kcG1OWQiGbLDZHDB5JvSkxHcvyzRTizAAZTKXam+MxjhDYK1Qal06UD4j8lwledESE7UbljFWJEjua2MUXn/EeYeAQkrYh5xnRoz10LAxAIBdyoG1Y5Z9hXrpoLoWIqJGtyA3Lv4XcQmA0cUo5Fu8vBa2BE7j2Ur8z17+JGwTFZ6mvBMAokiu1N7C251uBs8BWQPNHje6wZTdVfEV/c1N/6HcdV8E3V3h3c43DcND3FLy7wnsb+I7ldMOmgvdWeH8D7w46LWeg4EtQQnA22UT7rSDwF+glZEzJVS089H2r1V/AVyizEl1z+UzUxVoKDygbSkDpXChwBsQsR2MYSVwnF5SDPuY5gTMD5DCjXHZbjm3LwHMtZ/kpLQ63EKxIz7sivtFV8AE8YjgXbeOa1GpUIC+ePXv+8Onzh789f/To+cNfwDaOE6GRuwqzuCr36sev//7+C/DXrz+8evyNHs+r+Jc/f/ny9z9ep14otL598vLpkxffffXnT4818A6D+1X4Hk4RBzfQEbhNU7lAzQRon72dxF4CcVWik8UcZrCQ0aAHIlHQN2aQQA2ui1Q73mUyXeiAV6YHCuHdhE0F1gCvJ6kC3KGUdCnTrul6MVfVCtMs1k/OplXcbQgPdXP31rw8mOYy7rFOZS9BCs1bRLocxihDAhRjdIKQRuwexopdd3DEKKdjAe5h0IVYa5I9vC/0QldxKv0y0xGU/lZss3MXdCnRqe+jQxUp9wYkOpWIKGa8AqcCplrGMCVV5DYUiY7k7oxFisG5kJ6OEaFgMEKc62RusplC9zqUeUvr9h0yS1UkE3iiQ25DSqvIPp30EpjmWs44S6rYz/hEhigEt6jQkqDqDina0g8wq3X3XYzE2+3tOzIN6QOkGJky3ZZAVN2PMzKGSKe8w1IlxXYY1kZHdxorob2NEIFHcIQQuPOZDk9zqid9LZFZ5SrS2eYaVGO1aGeIy1qpKG40jsVcCdldFNMaPjuztcQzg1kKWZ3mGxM1ZAb7TG5GXbySaKKkUsyKTasncZOn8FRabyVQCauizfXxOmPZ2+4xKXPwDjLorWVkYj+1bfYgQfqA2YMYbOvSrRSZ6kWK7VSKTbVyY3XTrtxgrhU9Kc7eUAH9N5XPB6t5zr7aqUso6zVOHW69sulRNsIff2HTh9PsFpJnyXldc17X/B/rmrr9fF7NnFcz59XMv1bNrAoYs3rZU2pJa29+xpiQXTEjaJuXpQ+Xe380lJ1loxRaXjTliXxcTKfgYgbLZ8Co+ByLZDeBuZzGLmeI+UJ1zEFOuSyfjFrdZfE1TXfoaHGPZ5/cbUoBKFb9lrfsl6WamPf6rdVF6FJ92Yp5lYBXKj09icpkKommhkSreToStnVWLEINi8B+HQuz4hV5OAFYXIt77pyRDDcZ0qPCT3P5E++euafrjKku29EsL3TPzNMKiUq4qSQqYZjIw2O9+4x9HYZ6VztaGq3gQ/ja3MwNJFNb4EjuuaYn1UQwbxtj+bNJPqa51MeLTAVJnLWNSCwM/S6ZJWdc9CFP5rByaL7+FAvEAMGpjPWqG0i24mY7LevjJRdaH5/lzHUno/EYRaKmZ9WUY3Ml2tH3BBcNOpWkd5PREdgnU3YbSkN5Lbsw4AhzsbTmCLNKcK+suJauFltReQO02qKQ5AlcnCjVZD6Hl89LOpV1lEzXV2XqTLgfD8/i1H2z0FrSrDlAWrVZ7MMd8hVWTT0rT5vrwsB6/Snx/gdChVqgp9bUU6s7O86wIKhM59fYzan15nueButRa1bqyrK18XKb7h/IyO/LanVKBJ9fkB3L8rt38lpyngnK3pPscizAlOG2cd/yOm7P8XoNK/AGDbfpWo3A6zQbHc9r2gPPtvpd54E0ikhS25vPPZQ/9sls8e6+7N94f5+elNoXIpqatKyDzVK4fH9vO/Xv7wGWlrnvO8OwGXb9RtjsDBtuvxs0wp7fbfT9Xqs/7Pe8IBw+MMBhCXY7zZ7rD4KGb/d6Dde3CvpB2Gi5jtNxW51g4HYeLGwtV37yfWLektelfwBQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAsAHAB3b3JkL19yZWxzL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAAAAhALO+ix3+AAAAtgMAABwAHAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzVVQJAAMw0M4SiBztaHV4CwABBPUBAAAEFAAAAK2TzWrDMBCE74W+g9h7LTttQwmRcymBXFv3AWR7/UP1Y6RNWr99RUoShwbTg44zYme+hdV6860VO6DzvTUCsiQFhqaydW9aAR/F9uEFmCdpaqmsQQEjetjk93frN1SSwpDv+sGzkGK8gI5oWHHuqw619Ikd0ISXxjotKUjX8kFWn7JFvkjTJXfTDMivMtmuFuB29SOwYhzwP9m2afoKX22112joRgX3SBQ28yFTuhZJwMlJQhbw2wiLqAg0KpwCHPVcfRaz3ux1iS5sfCE4W3MQy5gQFGbxAnCUv2Y2x/Ack6GxhgpZqgnH2ZqDeIoJ8YXl+5+TnJgnEH712/IfUEsBAh4DFAAAAAgAAAAhADKRb1deAQAApQUAABMAGAAAAAAAAQAAAKSBAAAAAFtDb250ZW50X1R5cGVzXS54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMKAAAAAACTZE1bAAAAAAAAAAAAAAAACQAYAAAAAAAAABAA7UGrAQAAZG9jUHJvcHMvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAAAAhACEYr1llAQAAxQIAABAAGAAAAAAAAQAAAKSB7gEAAGRvY1Byb3BzL2FwcC54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACAAAACEACvOn+GYBAADtAgAAEQAYAAAAAAABAAAApIGdAwAAZG9jUHJvcHMvY29yZS54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMKAAAAAACTZE1bAAAAAAAAAAAAAAAABgAYAAAAAAAAABAA7UFOBQAAX3JlbHMvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAAAAhAB6RGrfpAAAATgIAAAsAGAAAAAAAAQAAAKSBjgUAAF9yZWxzLy5yZWxzVVQFAAMw0M4SdXgLAAEE9QEAAAQUAAAAUEsBAh4DCgAAAAAAk2RNWwAAAAAAAAAAAAAAAAUAGAAAAAAAAAAQAO1BvAYAAHdvcmQvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAoWRNW+xw0GIQAgAAtAcAABIAGAAAAAAAAQAAAKSB+wYAAHdvcmQvZm9udFRhYmxlLnhtbFVUBQADnhztaHV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQCWFrgr1QIAAIgLAAARABgAAAAAAAEAAACkgVcJAAB3b3JkL2RvY3VtZW50LnhtbFVUBQADMNDOEnV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQDK52WKKwQAAL4MAAARABgAAAAAAAEAAACkgXcMAAB3b3JkL3NldHRpbmdzLnhtbFVUBQADMNDOEnV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQDbhWzDfQQAAJcdAAASABgAAAAAAAEAAACkge0QAAB3b3JkL251bWJlcmluZy54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACAAAACEAvn52YlYBAADQAwAAFAAYAAAAAAABAAAApIG2FQAAd29yZC93ZWJTZXR0aW5ncy54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACAAAACEAP6/hZl8PAAANpgAADwAYAAAAAAABAAAApIFaFwAAd29yZC9zdHlsZXMueG1sVVQFAAMw0M4SdXgLAAEE9QEAAAQUAAAAUEsBAh4DCgAAAAAAk2RNWwAAAAAAAAAAAAAAAAsAGAAAAAAAAAAQAO1BAicAAHdvcmQvdGhlbWUvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAAAAhAGeA/LSbBgAAzSAAABUAGAAAAAAAAQAAAKSBRycAAHdvcmQvdGhlbWUvdGhlbWUxLnhtbFVUBQADMNDOEnV4CwABBPUBAAAEFAAAAFBLAQIeAwoAAAAAAJNkTVsAAAAAAAAAAAAAAAALABgAAAAAAAAAEADtQTEuAAB3b3JkL19yZWxzL1VUBQADhhztaHV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQCzvosd/gAAALYDAAAcABgAAAAAAAEAAACkgXYuAAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzVVQFAAMw0M4SdXgLAAEE9QEAAAQUAAAAUEsFBgAAAAARABEAqQUAAMovAAAAAA==";
123599
124061
  const _hoisted_1$1 = { class: "super-editor-container" };
123600
124062
  const _hoisted_2 = {
123601
- key: 1,
124063
+ key: 2,
123602
124064
  class: "placeholder-editor"
123603
124065
  };
123604
124066
  const _hoisted_3 = { class: "placeholder-title" };
@@ -123643,6 +124105,19 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
123643
124105
  const active = activeEditor.value;
123644
124106
  return active?.options ? Boolean(active.options.disableContextMenu) : Boolean(props.options.disableContextMenu);
123645
124107
  });
124108
+ const rulersVisible = ref$1(Boolean(props.options.rulers));
124109
+ watch(
124110
+ () => props.options,
124111
+ (newOptions) => {
124112
+ const rulers = newOptions?.rulers;
124113
+ if (rulers && typeof rulers === "object" && "value" in rulers) {
124114
+ rulersVisible.value = Boolean(rulers.value);
124115
+ } else {
124116
+ rulersVisible.value = Boolean(rulers);
124117
+ }
124118
+ },
124119
+ { immediate: true, deep: true }
124120
+ );
123646
124121
  const message = useMessage();
123647
124122
  const editorWrapper = ref$1(null);
123648
124123
  const editorElem = ref$1(null);
@@ -124055,8 +124530,17 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124055
124530
  });
124056
124531
  return (_ctx, _cache) => {
124057
124532
  return openBlock(), createElementBlock("div", _hoisted_1$1, [
124058
- __props.options.rulers && !!activeEditor.value ? (openBlock(), createBlock(Ruler, {
124533
+ __props.options.rulerContainer && rulersVisible.value && !!activeEditor.value ? (openBlock(), createBlock(Teleport, {
124059
124534
  key: 0,
124535
+ to: __props.options.rulerContainer
124536
+ }, [
124537
+ createVNode(Ruler, {
124538
+ class: "ruler superdoc-ruler",
124539
+ editor: activeEditor.value,
124540
+ onMarginChange: handleMarginChange
124541
+ }, null, 8, ["editor"])
124542
+ ], 8, ["to"])) : rulersVisible.value && !!activeEditor.value ? (openBlock(), createBlock(Ruler, {
124543
+ key: 1,
124060
124544
  class: "ruler",
124061
124545
  editor: activeEditor.value,
124062
124546
  onMarginChange: handleMarginChange
@@ -124150,7 +124634,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124150
124634
  })
124151
124635
  ])) : createCommentVNode("", true),
124152
124636
  activeEditor.value ? (openBlock(), createBlock(GenericPopover, {
124153
- key: 2,
124637
+ key: 3,
124154
124638
  editor: activeEditor.value,
124155
124639
  visible: popoverControls.visible,
124156
124640
  position: popoverControls.position,
@@ -124165,7 +124649,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124165
124649
  };
124166
124650
  }
124167
124651
  });
124168
- const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-a935d3e2"]]);
124652
+ const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-cb3fe66f"]]);
124169
124653
  const _hoisted_1 = ["innerHTML"];
124170
124654
  const _sfc_main = {
124171
124655
  __name: "SuperInput",