@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
@@ -42145,8 +42145,8 @@ Please report this to https://github.com/markedjs/marked.`, e) {
42145
42145
  const converter = new _SuperConverter2();
42146
42146
  const content2 = customXml.content;
42147
42147
  const contentJson = converter.parseXmlToJson(content2);
42148
- const properties = contentJson.elements.find((el) => el.name === "Properties");
42149
- if (!properties.elements) return null;
42148
+ const properties = contentJson.elements?.find((el) => el.name === "Properties");
42149
+ if (!properties?.elements) return null;
42150
42150
  const property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
42151
42151
  if (!property2) return null;
42152
42152
  return property2.elements[0].elements[0].text;
@@ -42209,7 +42209,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
42209
42209
  static getStoredSuperdocVersion(docx) {
42210
42210
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
42211
42211
  }
42212
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.60") {
42212
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.61") {
42213
42213
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
42214
42214
  }
42215
42215
  /**
@@ -67255,7 +67255,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
67255
67255
  const shouldSkipNodeView = (editor) => {
67256
67256
  return isHeadless(editor);
67257
67257
  };
67258
- const summaryVersion = "1.0.0-beta.60";
67258
+ const summaryVersion = "1.0.0-beta.61";
67259
67259
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
67260
67260
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
67261
67261
  function mapAttributes(attrs) {
@@ -68044,7 +68044,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
68044
68044
  { default: remarkStringify2 },
68045
68045
  { default: remarkGfm2 }
68046
68046
  ] = await Promise.all([
68047
- Promise.resolve().then(() => indexGAzIoyrZ),
68047
+ Promise.resolve().then(() => indexU8dj63PM),
68048
68048
  Promise.resolve().then(() => indexDRCvimau),
68049
68049
  Promise.resolve().then(() => indexC_x_N6Uh),
68050
68050
  Promise.resolve().then(() => indexD_sWOSiG),
@@ -68249,7 +68249,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
68249
68249
  * Process collaboration migrations
68250
68250
  */
68251
68251
  processCollaborationMigrations() {
68252
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.60");
68252
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.61");
68253
68253
  if (!this.options.ydoc) return;
68254
68254
  const metaMap = this.options.ydoc.getMap("meta");
68255
68255
  let docVersion = metaMap.get("version");
@@ -79415,6 +79415,408 @@ ${l}
79415
79415
  const hasPmEnd = fragment.pmEnd != null;
79416
79416
  globalValidationStats.record(hasPmStart, hasPmEnd);
79417
79417
  }
79418
+ const DEFAULT_PPI = 96;
79419
+ const DEFAULT_RULER_HEIGHT = 25;
79420
+ const TICK_SPACING_PX = DEFAULT_PPI / 8;
79421
+ function generateRulerDefinition(config2) {
79422
+ const ppi = config2.ppi ?? DEFAULT_PPI;
79423
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
79424
+ const { pageSize, pageMargins } = config2;
79425
+ if (!Number.isFinite(ppi) || ppi <= 0) {
79426
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
79427
+ }
79428
+ if (!Number.isFinite(pageSize.width) || pageSize.width <= 0) {
79429
+ throw new Error(`Invalid page width: ${pageSize.width}. Must be a positive finite number.`);
79430
+ }
79431
+ if (!Number.isFinite(pageSize.height) || pageSize.height <= 0) {
79432
+ throw new Error(`Invalid page height: ${pageSize.height}. Must be a positive finite number.`);
79433
+ }
79434
+ if (!Number.isFinite(pageMargins.left) || pageMargins.left < 0) {
79435
+ throw new Error(`Invalid left margin: ${pageMargins.left}. Must be a non-negative finite number.`);
79436
+ }
79437
+ if (!Number.isFinite(pageMargins.right) || pageMargins.right < 0) {
79438
+ throw new Error(`Invalid right margin: ${pageMargins.right}. Must be a non-negative finite number.`);
79439
+ }
79440
+ if (pageMargins.left + pageMargins.right >= pageSize.width) {
79441
+ throw new Error(
79442
+ `Invalid margins: left (${pageMargins.left}) + right (${pageMargins.right}) must be less than page width (${pageSize.width}).`
79443
+ );
79444
+ }
79445
+ const widthPx = pageSize.width * ppi;
79446
+ const ticks = [];
79447
+ let currentX = 0;
79448
+ for (let inch = 0; inch < pageSize.width; inch++) {
79449
+ const remaining = pageSize.width - inch;
79450
+ ticks.push({
79451
+ size: "main",
79452
+ height: "20%",
79453
+ label: inch,
79454
+ x: currentX
79455
+ });
79456
+ currentX += TICK_SPACING_PX;
79457
+ for (let i2 = 0; i2 < 3; i2++) {
79458
+ ticks.push({
79459
+ size: "eighth",
79460
+ height: "10%",
79461
+ x: currentX
79462
+ });
79463
+ currentX += TICK_SPACING_PX;
79464
+ }
79465
+ ticks.push({
79466
+ size: "half",
79467
+ height: "40%",
79468
+ x: currentX
79469
+ });
79470
+ currentX += TICK_SPACING_PX;
79471
+ if (remaining <= 0.5) break;
79472
+ for (let i2 = 0; i2 < 3; i2++) {
79473
+ ticks.push({
79474
+ size: "eighth",
79475
+ height: "10%",
79476
+ x: currentX
79477
+ });
79478
+ currentX += TICK_SPACING_PX;
79479
+ }
79480
+ }
79481
+ return {
79482
+ widthPx,
79483
+ heightPx,
79484
+ ticks,
79485
+ leftMarginPx: pageMargins.left * ppi,
79486
+ rightMarginPx: widthPx - pageMargins.right * ppi,
79487
+ pageWidthInches: pageSize.width
79488
+ };
79489
+ }
79490
+ function calculateMarginFromHandle(handleX, side, pageWidthPx, ppi = DEFAULT_PPI) {
79491
+ if (side === "left") {
79492
+ return handleX / ppi;
79493
+ } else {
79494
+ return (pageWidthPx - handleX) / ppi;
79495
+ }
79496
+ }
79497
+ function clampHandlePosition(handleX, side, otherHandleX, pageWidthPx, minContentWidthPx = 200) {
79498
+ if (!Number.isFinite(handleX)) {
79499
+ throw new Error(`Invalid handleX: ${handleX}. Must be a finite number.`);
79500
+ }
79501
+ if (!Number.isFinite(otherHandleX)) {
79502
+ throw new Error(`Invalid otherHandleX: ${otherHandleX}. Must be a finite number.`);
79503
+ }
79504
+ if (!Number.isFinite(pageWidthPx)) {
79505
+ throw new Error(`Invalid pageWidthPx: ${pageWidthPx}. Must be a finite number.`);
79506
+ }
79507
+ if (!Number.isFinite(minContentWidthPx)) {
79508
+ throw new Error(`Invalid minContentWidthPx: ${minContentWidthPx}. Must be a finite number.`);
79509
+ }
79510
+ if (side === "left") {
79511
+ const min2 = 0;
79512
+ const max2 = otherHandleX - minContentWidthPx;
79513
+ return Math.max(min2, Math.min(max2, handleX));
79514
+ } else {
79515
+ const min2 = otherHandleX + minContentWidthPx;
79516
+ const max2 = pageWidthPx;
79517
+ return Math.max(min2, Math.min(max2, handleX));
79518
+ }
79519
+ }
79520
+ function generateRulerDefinitionFromPx(config2) {
79521
+ const ppi = config2.ppi ?? DEFAULT_PPI;
79522
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
79523
+ const { pageWidthPx, leftMarginPx, rightMarginPx } = config2;
79524
+ if (!Number.isFinite(ppi) || ppi <= 0) {
79525
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
79526
+ }
79527
+ if (!Number.isFinite(pageWidthPx) || pageWidthPx <= 0) {
79528
+ throw new Error(`Invalid page width: ${pageWidthPx}px. Must be a positive finite number.`);
79529
+ }
79530
+ if (!Number.isFinite(config2.pageHeightPx) || config2.pageHeightPx <= 0) {
79531
+ throw new Error(`Invalid page height: ${config2.pageHeightPx}px. Must be a positive finite number.`);
79532
+ }
79533
+ if (!Number.isFinite(leftMarginPx) || leftMarginPx < 0) {
79534
+ throw new Error(`Invalid left margin: ${leftMarginPx}px. Must be a non-negative finite number.`);
79535
+ }
79536
+ if (!Number.isFinite(rightMarginPx) || rightMarginPx < 0) {
79537
+ throw new Error(`Invalid right margin: ${rightMarginPx}px. Must be a non-negative finite number.`);
79538
+ }
79539
+ if (leftMarginPx + rightMarginPx >= pageWidthPx) {
79540
+ throw new Error(
79541
+ `Invalid margins: left (${leftMarginPx}px) + right (${rightMarginPx}px) must be less than page width (${pageWidthPx}px).`
79542
+ );
79543
+ }
79544
+ const pageWidthInches = pageWidthPx / ppi;
79545
+ const ticks = [];
79546
+ let currentX = 0;
79547
+ for (let inch = 0; inch < pageWidthInches; inch++) {
79548
+ const remaining = pageWidthInches - inch;
79549
+ ticks.push({
79550
+ size: "main",
79551
+ height: "20%",
79552
+ label: inch,
79553
+ x: currentX
79554
+ });
79555
+ currentX += TICK_SPACING_PX;
79556
+ for (let i2 = 0; i2 < 3; i2++) {
79557
+ ticks.push({
79558
+ size: "eighth",
79559
+ height: "10%",
79560
+ x: currentX
79561
+ });
79562
+ currentX += TICK_SPACING_PX;
79563
+ }
79564
+ ticks.push({
79565
+ size: "half",
79566
+ height: "40%",
79567
+ x: currentX
79568
+ });
79569
+ currentX += TICK_SPACING_PX;
79570
+ if (remaining <= 0.5) break;
79571
+ for (let i2 = 0; i2 < 3; i2++) {
79572
+ ticks.push({
79573
+ size: "eighth",
79574
+ height: "10%",
79575
+ x: currentX
79576
+ });
79577
+ currentX += TICK_SPACING_PX;
79578
+ }
79579
+ }
79580
+ return {
79581
+ widthPx: pageWidthPx,
79582
+ heightPx,
79583
+ ticks,
79584
+ leftMarginPx,
79585
+ rightMarginPx: pageWidthPx - rightMarginPx,
79586
+ pageWidthInches
79587
+ };
79588
+ }
79589
+ const RULER_CLASS_NAMES = {
79590
+ /** Main ruler container */
79591
+ ruler: "superdoc-ruler",
79592
+ /** Tick mark element */
79593
+ tick: "superdoc-ruler-tick",
79594
+ /** Main (inch) tick */
79595
+ tickMain: "superdoc-ruler-tick--main",
79596
+ /** Half-inch tick */
79597
+ tickHalf: "superdoc-ruler-tick--half",
79598
+ /** Eighth-inch tick */
79599
+ tickEighth: "superdoc-ruler-tick--eighth",
79600
+ /** Inch label number */
79601
+ label: "superdoc-ruler-label",
79602
+ /** Margin handle */
79603
+ handle: "superdoc-ruler-handle",
79604
+ /** Left margin handle */
79605
+ handleLeft: "superdoc-ruler-handle--left",
79606
+ /** Right margin handle */
79607
+ handleRight: "superdoc-ruler-handle--right",
79608
+ /** Vertical indicator line during drag */
79609
+ indicator: "superdoc-ruler-indicator"
79610
+ };
79611
+ function createRulerElement(options) {
79612
+ const { definition: definition2, doc: doc2, interactive = false } = options;
79613
+ if (!Number.isFinite(definition2.widthPx) || definition2.widthPx <= 0) {
79614
+ console.warn(`[createRulerElement] Invalid ruler width: ${definition2.widthPx}px. Using minimum width of 1px.`);
79615
+ definition2.widthPx = Math.max(1, definition2.widthPx || 1);
79616
+ }
79617
+ if (!definition2.ticks || definition2.ticks.length === 0) {
79618
+ console.warn("[createRulerElement] Ruler definition has no ticks. Ruler will be empty.");
79619
+ }
79620
+ const ruler = doc2.createElement("div");
79621
+ ruler.className = RULER_CLASS_NAMES.ruler;
79622
+ ruler.style.cssText = `
79623
+ position: relative;
79624
+ width: ${definition2.widthPx}px;
79625
+ height: ${definition2.heightPx}px;
79626
+ display: flex;
79627
+ align-items: flex-end;
79628
+ box-sizing: border-box;
79629
+ user-select: none;
79630
+ pointer-events: ${interactive ? "auto" : "none"};
79631
+ `;
79632
+ for (const tick of definition2.ticks) {
79633
+ const tickEl = createTickElement(tick, doc2);
79634
+ ruler.appendChild(tickEl);
79635
+ }
79636
+ if (interactive) {
79637
+ const leftHandle = createHandleElement("left", definition2.leftMarginPx, doc2, options);
79638
+ const rightHandle = createHandleElement("right", definition2.rightMarginPx, doc2, options);
79639
+ ruler.appendChild(leftHandle);
79640
+ ruler.appendChild(rightHandle);
79641
+ }
79642
+ return ruler;
79643
+ }
79644
+ function createTickElement(tick, doc2) {
79645
+ const el = doc2.createElement("div");
79646
+ const sizeClass = tick.size === "main" ? RULER_CLASS_NAMES.tickMain : tick.size === "half" ? RULER_CLASS_NAMES.tickHalf : RULER_CLASS_NAMES.tickEighth;
79647
+ el.className = `${RULER_CLASS_NAMES.tick} ${sizeClass}`;
79648
+ el.style.cssText = `
79649
+ position: absolute;
79650
+ left: ${tick.x}px;
79651
+ bottom: 0;
79652
+ width: 1px;
79653
+ height: ${tick.height};
79654
+ background-color: #666;
79655
+ pointer-events: none;
79656
+ `;
79657
+ if (tick.label !== void 0) {
79658
+ const label = doc2.createElement("span");
79659
+ label.className = RULER_CLASS_NAMES.label;
79660
+ label.textContent = String(tick.label);
79661
+ label.style.cssText = `
79662
+ position: absolute;
79663
+ top: -16px;
79664
+ left: -2px;
79665
+ font-size: 10px;
79666
+ color: #666;
79667
+ pointer-events: none;
79668
+ user-select: none;
79669
+ `;
79670
+ el.appendChild(label);
79671
+ }
79672
+ return el;
79673
+ }
79674
+ function createHandleElement(side, x2, doc2, options) {
79675
+ const handle2 = doc2.createElement("div");
79676
+ const sideClass = side === "left" ? RULER_CLASS_NAMES.handleLeft : RULER_CLASS_NAMES.handleRight;
79677
+ handle2.className = `${RULER_CLASS_NAMES.handle} ${sideClass}`;
79678
+ handle2.dataset.side = side;
79679
+ handle2.style.cssText = `
79680
+ position: absolute;
79681
+ left: ${x2}px;
79682
+ top: 0;
79683
+ width: 5px;
79684
+ height: 20px;
79685
+ margin-left: -2px;
79686
+ background-color: #ccc;
79687
+ border-radius: 4px 4px 0 0;
79688
+ cursor: grab;
79689
+ transition: background-color 150ms ease;
79690
+ z-index: 10;
79691
+ `;
79692
+ handle2.addEventListener("mouseenter", () => {
79693
+ if (!handle2.dataset.dragging) {
79694
+ handle2.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
79695
+ }
79696
+ });
79697
+ handle2.addEventListener("mouseleave", () => {
79698
+ if (!handle2.dataset.dragging) {
79699
+ handle2.style.backgroundColor = "#ccc";
79700
+ }
79701
+ });
79702
+ if (options.onDragStart || options.onDrag || options.onDragEnd) {
79703
+ setupHandleDrag(handle2, side, options);
79704
+ }
79705
+ return handle2;
79706
+ }
79707
+ function setupHandleDrag(handle2, side, options) {
79708
+ let offsetX = 0;
79709
+ const onPointerDown = (event) => {
79710
+ event.preventDefault();
79711
+ handle2.dataset.dragging = "true";
79712
+ handle2.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
79713
+ handle2.style.cursor = "grabbing";
79714
+ const rect = handle2.getBoundingClientRect();
79715
+ offsetX = event.clientX - rect.left - rect.width / 2;
79716
+ handle2.setPointerCapture(event.pointerId);
79717
+ options.onDragStart?.(side, event);
79718
+ };
79719
+ const onPointerMove = (event) => {
79720
+ if (handle2.dataset.dragging !== "true") return;
79721
+ const ruler = handle2.parentElement;
79722
+ if (!ruler) return;
79723
+ const rulerRect = ruler.getBoundingClientRect();
79724
+ const newX = event.clientX - rulerRect.left - offsetX;
79725
+ options.onDrag?.(side, newX, event);
79726
+ };
79727
+ const onPointerUp = (event) => {
79728
+ if (handle2.dataset.dragging !== "true") return;
79729
+ handle2.dataset.dragging = "";
79730
+ handle2.style.backgroundColor = "#ccc";
79731
+ handle2.style.cursor = "grab";
79732
+ handle2.releasePointerCapture(event.pointerId);
79733
+ const ruler = handle2.parentElement;
79734
+ if (!ruler) return;
79735
+ const rulerRect = ruler.getBoundingClientRect();
79736
+ const finalX = event.clientX - rulerRect.left - offsetX;
79737
+ options.onDragEnd?.(side, finalX, event);
79738
+ };
79739
+ handle2.addEventListener("pointerdown", onPointerDown);
79740
+ handle2.addEventListener("pointermove", onPointerMove);
79741
+ handle2.addEventListener("pointerup", onPointerUp);
79742
+ handle2.addEventListener("pointercancel", onPointerUp);
79743
+ }
79744
+ const RULER_STYLES = `
79745
+ /* Ruler container */
79746
+ .${RULER_CLASS_NAMES.ruler} {
79747
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
79748
+ background-color: transparent;
79749
+ }
79750
+
79751
+ /* Tick marks base styling */
79752
+ .${RULER_CLASS_NAMES.tick} {
79753
+ flex-shrink: 0;
79754
+ }
79755
+
79756
+ /* Handle hover and active states */
79757
+ .${RULER_CLASS_NAMES.handle}:hover {
79758
+ background-color: rgba(37, 99, 235, 0.4) !important;
79759
+ }
79760
+
79761
+ .${RULER_CLASS_NAMES.handle}:active,
79762
+ .${RULER_CLASS_NAMES.handle}[data-dragging="true"] {
79763
+ background-color: rgba(37, 99, 235, 0.6) !important;
79764
+ cursor: grabbing !important;
79765
+ }
79766
+
79767
+ /* Vertical indicator animation */
79768
+ .${RULER_CLASS_NAMES.indicator} {
79769
+ transition: left 16ms linear;
79770
+ }
79771
+
79772
+ /* Print mode: hide rulers */
79773
+ @media print {
79774
+ .${RULER_CLASS_NAMES.ruler} {
79775
+ display: none !important;
79776
+ }
79777
+ }
79778
+
79779
+ /* High contrast mode support */
79780
+ @media (prefers-contrast: high) {
79781
+ .${RULER_CLASS_NAMES.tick} {
79782
+ background-color: #000 !important;
79783
+ }
79784
+
79785
+ .${RULER_CLASS_NAMES.label} {
79786
+ color: #000 !important;
79787
+ }
79788
+
79789
+ .${RULER_CLASS_NAMES.handle} {
79790
+ background-color: #666 !important;
79791
+ border: 1px solid #000;
79792
+ }
79793
+
79794
+ .${RULER_CLASS_NAMES.handle}:hover,
79795
+ .${RULER_CLASS_NAMES.handle}:active {
79796
+ background-color: #0066cc !important;
79797
+ }
79798
+ }
79799
+
79800
+ /* Reduced motion support */
79801
+ @media (prefers-reduced-motion: reduce) {
79802
+ .${RULER_CLASS_NAMES.handle} {
79803
+ transition: none !important;
79804
+ }
79805
+
79806
+ .${RULER_CLASS_NAMES.indicator} {
79807
+ transition: none !important;
79808
+ }
79809
+ }
79810
+ `;
79811
+ let rulerStylesInjected = false;
79812
+ function ensureRulerStyles(doc2) {
79813
+ if (rulerStylesInjected || !doc2) return;
79814
+ const styleEl = doc2.createElement("style");
79815
+ styleEl.setAttribute("data-superdoc-ruler-styles", "true");
79816
+ styleEl.textContent = RULER_STYLES;
79817
+ doc2.head?.appendChild(styleEl);
79818
+ rulerStylesInjected = true;
79819
+ }
79418
79820
  function isMinimalWordLayout(value) {
79419
79821
  if (typeof value !== "object" || value === null) {
79420
79822
  return false;
@@ -79461,6 +79863,7 @@ ${l}
79461
79863
  }
79462
79864
  const LIST_MARKER_GAP$1 = 8;
79463
79865
  const DEFAULT_TAB_INTERVAL_PX$1 = 48;
79866
+ const DEFAULT_PAGE_HEIGHT_PX = 1056;
79464
79867
  const COMMENT_EXTERNAL_COLOR = "#B1124B";
79465
79868
  const COMMENT_INTERNAL_COLOR = "#078383";
79466
79869
  const COMMENT_INACTIVE_ALPHA = "22";
@@ -79703,6 +80106,9 @@ ${l}
79703
80106
  ensureFieldAnnotationStyles(doc2);
79704
80107
  ensureSdtContainerStyles(doc2);
79705
80108
  ensureImageSelectionStyles(doc2);
80109
+ if (this.options.ruler?.enabled) {
80110
+ ensureRulerStyles(doc2);
80111
+ }
79706
80112
  mount2.classList.add(CLASS_NAMES$1.container);
79707
80113
  if (this.mount && this.mount !== mount2) {
79708
80114
  this.resetState();
@@ -79960,6 +80366,12 @@ ${l}
79960
80366
  const el = this.doc.createElement("div");
79961
80367
  el.classList.add(CLASS_NAMES$1.page);
79962
80368
  applyStyles$2(el, pageStyles(width, height, this.getEffectivePageStyles()));
80369
+ if (this.options.ruler?.enabled) {
80370
+ const rulerEl = this.renderPageRuler(width, page);
80371
+ if (rulerEl) {
80372
+ el.appendChild(rulerEl);
80373
+ }
80374
+ }
79963
80375
  const contextBase = {
79964
80376
  pageNumber: page.number,
79965
80377
  totalPages: this.totalPages,
@@ -79972,6 +80384,70 @@ ${l}
79972
80384
  this.renderDecorationsForPage(el, page);
79973
80385
  return el;
79974
80386
  }
80387
+ /**
80388
+ * Render a ruler element for a page.
80389
+ *
80390
+ * Creates a horizontal ruler with tick marks and optional interactive margin handles.
80391
+ * The ruler is positioned at the top of the page and displays inch measurements.
80392
+ *
80393
+ * @param pageWidthPx - Page width in pixels
80394
+ * @param page - Page data containing margins and optional size information
80395
+ * @returns Ruler element, or null if this.doc is unavailable or page margins are missing
80396
+ *
80397
+ * Side effects:
80398
+ * - Creates DOM elements and applies inline styles
80399
+ * - May invoke the onMarginChange callback if interactive mode is enabled
80400
+ *
80401
+ * Fallback behavior:
80402
+ * - Uses DEFAULT_PAGE_HEIGHT_PX (1056px = 11 inches) if page.size.h is not available
80403
+ * - Defaults margins to 0 if not explicitly provided
80404
+ */
80405
+ renderPageRuler(pageWidthPx, page) {
80406
+ if (!this.doc) {
80407
+ console.warn("[renderPageRuler] Cannot render ruler: document is not available.");
80408
+ return null;
80409
+ }
80410
+ if (!page.margins) {
80411
+ console.warn(`[renderPageRuler] Cannot render ruler for page ${page.number}: margins not available.`);
80412
+ return null;
80413
+ }
80414
+ const margins = page.margins;
80415
+ const leftMargin = margins.left ?? 0;
80416
+ const rightMargin = margins.right ?? 0;
80417
+ try {
80418
+ const rulerDefinition = generateRulerDefinitionFromPx({
80419
+ pageWidthPx,
80420
+ pageHeightPx: page.size?.h ?? DEFAULT_PAGE_HEIGHT_PX,
80421
+ leftMarginPx: leftMargin,
80422
+ rightMarginPx: rightMargin
80423
+ });
80424
+ const interactive = this.options.ruler?.interactive ?? false;
80425
+ const onMarginChange = this.options.ruler?.onMarginChange;
80426
+ const rulerEl = createRulerElement({
80427
+ definition: rulerDefinition,
80428
+ doc: this.doc,
80429
+ interactive,
80430
+ onDragEnd: interactive && onMarginChange ? (side, x2) => {
80431
+ try {
80432
+ const ppi = 96;
80433
+ const marginInches = side === "left" ? x2 / ppi : (pageWidthPx - x2) / ppi;
80434
+ onMarginChange(side, marginInches);
80435
+ } catch (error) {
80436
+ console.error("[renderPageRuler] Error in onMarginChange callback:", error);
80437
+ }
80438
+ } : void 0
80439
+ });
80440
+ rulerEl.style.position = "absolute";
80441
+ rulerEl.style.top = "0";
80442
+ rulerEl.style.left = "0";
80443
+ rulerEl.style.zIndex = "20";
80444
+ rulerEl.dataset.pageNumber = String(page.number);
80445
+ return rulerEl;
80446
+ } catch (error) {
80447
+ console.error(`[renderPageRuler] Failed to create ruler for page ${page.number}:`, error);
80448
+ return null;
80449
+ }
80450
+ }
79975
80451
  renderDecorationsForPage(pageEl, page) {
79976
80452
  this.renderDecorationSection(pageEl, page, "header");
79977
80453
  this.renderDecorationSection(pageEl, page, "footer");
@@ -82772,7 +83248,8 @@ ${l}
82772
83248
  layoutMode: options.layoutMode,
82773
83249
  headerProvider: options.headerProvider,
82774
83250
  footerProvider: options.footerProvider,
82775
- virtualization: options.virtualization
83251
+ virtualization: options.virtualization,
83252
+ ruler: options.ruler
82776
83253
  });
82777
83254
  return {
82778
83255
  paint(layout, mount2) {
@@ -93300,9 +93777,11 @@ ${l}
93300
93777
  if (typeof provider2.awareness.setLocalStateField !== "function") {
93301
93778
  return;
93302
93779
  }
93303
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
93780
+ const editorState = __privateGet$1(this, _editor3)?.state;
93781
+ if (!editorState) return;
93782
+ const ystate = ySyncPluginKey.getState(editorState);
93304
93783
  if (!ystate?.binding?.mapping) return;
93305
- const { selection } = __privateGet$1(this, _editor3).state;
93784
+ const { selection } = editorState;
93306
93785
  const { anchor, head } = selection;
93307
93786
  try {
93308
93787
  const relAnchor = absolutePositionToRelativePosition(anchor, ystate.type, ystate.binding.mapping);
@@ -93320,7 +93799,9 @@ ${l}
93320
93799
  normalizeAwarenessStates_fn = function() {
93321
93800
  const provider2 = __privateGet$1(this, _options).collaborationProvider;
93322
93801
  if (!provider2?.awareness) return /* @__PURE__ */ new Map();
93323
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
93802
+ const editorState = __privateGet$1(this, _editor3)?.state;
93803
+ if (!editorState) return /* @__PURE__ */ new Map();
93804
+ const ystate = ySyncPluginKey.getState(editorState);
93324
93805
  if (!ystate) return /* @__PURE__ */ new Map();
93325
93806
  const states = provider2.awareness?.getStates();
93326
93807
  const normalized = /* @__PURE__ */ new Map();
@@ -94113,7 +94594,8 @@ ${l}
94113
94594
  virtualization: __privateGet$1(this, _layoutOptions).virtualization,
94114
94595
  pageStyles: __privateGet$1(this, _layoutOptions).pageStyles,
94115
94596
  headerProvider: __privateGet$1(this, _headerDecorationProvider),
94116
- footerProvider: __privateGet$1(this, _footerDecorationProvider)
94597
+ footerProvider: __privateGet$1(this, _footerDecorationProvider),
94598
+ ruler: __privateGet$1(this, _layoutOptions).ruler
94117
94599
  }));
94118
94600
  }
94119
94601
  return __privateGet$1(this, _domPainter);
@@ -128199,6 +128681,7 @@ ${style2}
128199
128681
  */
128200
128682
  toggleRuler: () => {
128201
128683
  this.superdoc.toggleRuler();
128684
+ this.updateToolbarState();
128202
128685
  },
128203
128686
  /**
128204
128687
  * Initiates the image upload process
@@ -128624,6 +129107,13 @@ ${style2}
128624
129107
  item.activate();
128625
129108
  }
128626
129109
  }
129110
+ if (item.name.value === "ruler") {
129111
+ if (this.superdoc?.config?.rulers) {
129112
+ item.activate();
129113
+ } else {
129114
+ item.deactivate();
129115
+ }
129116
+ }
128627
129117
  });
128628
129118
  }
128629
129119
  /**
@@ -130057,8 +130547,12 @@ ${style2}
130057
130547
  };
130058
130548
  }
130059
130549
  };
130060
- const _hoisted_1$4$1 = { class: "numbering" };
130550
+ const _hoisted_1$4$1 = {
130551
+ key: 0,
130552
+ class: "numbering"
130553
+ };
130061
130554
  const MIN_WIDTH = 200;
130555
+ const PPI = 96;
130062
130556
  const alignment = "flex-end";
130063
130557
  const _sfc_main$6$1 = {
130064
130558
  __name: "Ruler",
@@ -130081,7 +130575,7 @@ ${style2}
130081
130575
  const emit2 = __emit;
130082
130576
  const props = __props;
130083
130577
  const ruler = ref(null);
130084
- const rulerDefinition = ref([]);
130578
+ const rulerDefinition = ref(null);
130085
130579
  const rulerHandleOriginalColor = ref("#CCCCCC");
130086
130580
  const rulerHandleActiveColor = ref("#2563EB66");
130087
130581
  const pageSize = ref(null);
@@ -130094,45 +130588,32 @@ ${style2}
130094
130588
  const initialX = ref(0);
130095
130589
  let offsetX = 0;
130096
130590
  const initRuler = () => {
130097
- if (props.editor.options.mode !== "docx") return;
130098
- const rulerItems = [];
130591
+ if (props.editor.options.mode !== "docx") return null;
130099
130592
  const { pageMargins: docMargins, pageSize: docSize } = props.editor.getPageStyles();
130100
130593
  pageSize.value = docSize;
130101
130594
  pageMargins.value = docMargins;
130102
- rightHandle.x = docSize.width * 96 - docMargins.right * 96;
130103
- leftHandle.x = docMargins.left * 96;
130104
- for (let i2 = 0; i2 < docSize.width; i2++) {
130105
- const marginNum = 0.0625 * 96 - 0.5;
130106
- const margin = `${marginNum}px`;
130107
- const diff = docSize.width - i2;
130108
- rulerItems.push(...generateSection(1, "main", "20%", margin, i2));
130109
- rulerItems.push(...generateSection(3, "eighth", "10%", margin));
130110
- rulerItems.push(...generateSection(1, "half", "40%", margin));
130111
- if (diff <= 0.5) break;
130112
- rulerItems.push(...generateSection(3, "eighth", "10%", margin));
130113
- }
130114
- return rulerItems;
130115
- };
130116
- const generateSection = (qty, size2, height, margin, index2) => {
130117
- return Array.from({ length: qty }, (_2, i2) => {
130118
- const item = {
130119
- className: `${size2}-unit ruler-section`,
130120
- height,
130121
- margin
130122
- };
130123
- if (index2 !== void 0) item.numbering = index2;
130124
- return item;
130595
+ const definition2 = generateRulerDefinition({
130596
+ pageSize: { width: docSize.width, height: docSize.height },
130597
+ pageMargins: {
130598
+ left: docMargins.left,
130599
+ right: docMargins.right,
130600
+ top: docMargins.top ?? 1,
130601
+ bottom: docMargins.bottom ?? 1
130602
+ }
130125
130603
  });
130604
+ leftHandle.x = definition2.leftMarginPx;
130605
+ rightHandle.x = definition2.rightMarginPx;
130606
+ return definition2;
130126
130607
  };
130127
- const getStyle = computed(() => (unit) => {
130608
+ const getTickStyle = computed(() => (tick) => {
130128
130609
  return {
130610
+ position: "absolute",
130611
+ left: `${tick.x}px`,
130612
+ bottom: "0",
130129
130613
  width: "1px",
130130
- minWidth: "1px",
130131
- maxWidth: "1px",
130132
- height: unit.height,
130133
- backgroundColor: unit.color || "#666",
130134
- marginLeft: unit.numbering === 0 ? null : unit.margin,
130135
- marginRight: unit.margin
130614
+ height: tick.height,
130615
+ backgroundColor: "#666",
130616
+ pointerEvents: "none"
130136
130617
  };
130137
130618
  });
130138
130619
  const getHandlePosition = computed(() => (side) => {
@@ -130144,7 +130625,8 @@ ${style2}
130144
130625
  const getVerticalIndicatorStyle = computed(() => {
130145
130626
  if (!ruler.value) return;
130146
130627
  const parentElement = ruler.value.parentElement;
130147
- const editor = parentElement.querySelector(".super-editor");
130628
+ const editor = parentElement?.querySelector(".super-editor") ?? document.querySelector(".super-editor");
130629
+ if (!editor) return { left: `${currentHandle.value.x}px`, minHeight: "100%" };
130148
130630
  const editorBounds = editor.getBoundingClientRect();
130149
130631
  return {
130150
130632
  left: `${currentHandle.value.x}px`,
@@ -130161,22 +130643,11 @@ ${style2}
130161
130643
  showVerticalIndicator.value = true;
130162
130644
  };
130163
130645
  const handleMouseMove2 = (event) => {
130164
- if (!isDragging.value) return;
130646
+ if (!isDragging.value || !pageSize.value) return;
130165
130647
  const newLeft = event.clientX - offsetX;
130166
- currentHandle.value.x = newLeft;
130167
- if (currentHandle.value.side === "left") {
130168
- if (newLeft <= 0) {
130169
- currentHandle.value.x = 0;
130170
- } else if (newLeft >= rightHandle.x - MIN_WIDTH) {
130171
- currentHandle.value.x = rightHandle.x - MIN_WIDTH;
130172
- }
130173
- } else {
130174
- if (newLeft >= pageSize.value.width * 96) {
130175
- currentHandle.value.x = pageSize.value.width * 96;
130176
- } else if (newLeft <= leftHandle.x + MIN_WIDTH) {
130177
- currentHandle.value.x = leftHandle.x + MIN_WIDTH;
130178
- }
130179
- }
130648
+ const pageWidthPx = pageSize.value.width * PPI;
130649
+ const otherHandleX = currentHandle.value.side === "left" ? rightHandle.x : leftHandle.x;
130650
+ currentHandle.value.x = clampHandlePosition(newLeft, currentHandle.value.side, otherHandleX, pageWidthPx, MIN_WIDTH);
130180
130651
  };
130181
130652
  const handleMouseUp = () => {
130182
130653
  isDragging.value = false;
@@ -130197,14 +130668,17 @@ ${style2}
130197
130668
  rulerHandleOriginalColor.value = "#CCC";
130198
130669
  };
130199
130670
  const getNewMarginValue = () => {
130200
- if (currentHandle.value.side === "left") return currentHandle.value.x / 96;
130201
- else return (pageSize.value.width * 96 - currentHandle.value.x) / 96;
130671
+ if (!pageSize.value) return 0;
130672
+ const pageWidthPx = pageSize.value.width * PPI;
130673
+ return calculateMarginFromHandle(currentHandle.value.x, currentHandle.value.side, pageWidthPx, PPI);
130202
130674
  };
130203
130675
  const getStyleVars = computed(() => {
130676
+ const width = rulerDefinition.value?.widthPx ?? pageSize.value?.width * PPI ?? 816;
130204
130677
  return {
130205
130678
  "--alignment": alignment,
130206
130679
  "--ruler-handle-color": rulerHandleOriginalColor.value,
130207
- "--ruler-handle-active-color": rulerHandleActiveColor.value
130680
+ "--ruler-handle-active-color": rulerHandleActiveColor.value,
130681
+ "--ruler-width": `${width}px`
130208
130682
  };
130209
130683
  });
130210
130684
  onMounted(() => {
@@ -130240,32 +130714,20 @@ ${style2}
130240
130714
  class: "vertical-indicator",
130241
130715
  style: normalizeStyle(getVerticalIndicatorStyle.value)
130242
130716
  }, null, 4)) : createCommentVNode("", true),
130243
- (openBlock(true), createElementBlock(Fragment, null, renderList(rulerDefinition.value, (unit) => {
130717
+ rulerDefinition.value ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(rulerDefinition.value.ticks, (tick, index2) => {
130244
130718
  return openBlock(), createElementBlock("div", {
130245
- class: normalizeClass(unit.className),
130246
- style: normalizeStyle(getStyle.value(unit))
130719
+ key: index2,
130720
+ class: normalizeClass(["ruler-tick", `ruler-tick--${tick.size}`]),
130721
+ style: normalizeStyle(getTickStyle.value(tick))
130247
130722
  }, [
130248
- createBaseVNode("div", _hoisted_1$4$1, toDisplayString(unit.numbering), 1),
130249
- (openBlock(true), createElementBlock(Fragment, null, renderList(unit.elements, (half) => {
130250
- return openBlock(), createElementBlock("div", {
130251
- class: normalizeClass(half.className),
130252
- style: normalizeStyle(getStyle.value(half))
130253
- }, [
130254
- (openBlock(true), createElementBlock(Fragment, null, renderList(half.elements, (quarter) => {
130255
- return openBlock(), createElementBlock("div", {
130256
- class: normalizeClass(quarter.className),
130257
- style: normalizeStyle(getStyle.value(quarter))
130258
- }, null, 6);
130259
- }), 256))
130260
- ], 6);
130261
- }), 256))
130723
+ tick.label !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_1$4$1, toDisplayString(tick.label), 1)) : createCommentVNode("", true)
130262
130724
  ], 6);
130263
- }), 256))
130725
+ }), 128)) : createCommentVNode("", true)
130264
130726
  ], 4);
130265
130727
  };
130266
130728
  }
130267
130729
  };
130268
- const Ruler = /* @__PURE__ */ _export_sfc$1(_sfc_main$6$1, [["__scopeId", "data-v-79f9a944"]]);
130730
+ const Ruler = /* @__PURE__ */ _export_sfc$1(_sfc_main$6$1, [["__scopeId", "data-v-b9f4f30a"]]);
130269
130731
  const _sfc_main$5$1 = {
130270
130732
  __name: "GenericPopover",
130271
130733
  props: {
@@ -131446,7 +131908,7 @@ ${style2}
131446
131908
  const BlankDOCX$1 = "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==";
131447
131909
  const _hoisted_1$1$1 = { class: "super-editor-container" };
131448
131910
  const _hoisted_2$a = {
131449
- key: 1,
131911
+ key: 2,
131450
131912
  class: "placeholder-editor"
131451
131913
  };
131452
131914
  const _hoisted_3$8 = { class: "placeholder-title" };
@@ -131491,6 +131953,19 @@ ${style2}
131491
131953
  const active = activeEditor.value;
131492
131954
  return active?.options ? Boolean(active.options.disableContextMenu) : Boolean(props.options.disableContextMenu);
131493
131955
  });
131956
+ const rulersVisible = ref(Boolean(props.options.rulers));
131957
+ watch(
131958
+ () => props.options,
131959
+ (newOptions) => {
131960
+ const rulers = newOptions?.rulers;
131961
+ if (rulers && typeof rulers === "object" && "value" in rulers) {
131962
+ rulersVisible.value = Boolean(rulers.value);
131963
+ } else {
131964
+ rulersVisible.value = Boolean(rulers);
131965
+ }
131966
+ },
131967
+ { immediate: true, deep: true }
131968
+ );
131494
131969
  const message = useMessage();
131495
131970
  const editorWrapper = ref(null);
131496
131971
  const editorElem = ref(null);
@@ -131903,8 +132378,17 @@ ${style2}
131903
132378
  });
131904
132379
  return (_ctx, _cache) => {
131905
132380
  return openBlock(), createElementBlock("div", _hoisted_1$1$1, [
131906
- __props.options.rulers && !!activeEditor.value ? (openBlock(), createBlock(Ruler, {
132381
+ __props.options.rulerContainer && rulersVisible.value && !!activeEditor.value ? (openBlock(), createBlock(Teleport, {
131907
132382
  key: 0,
132383
+ to: __props.options.rulerContainer
132384
+ }, [
132385
+ createVNode(Ruler, {
132386
+ class: "ruler superdoc-ruler",
132387
+ editor: activeEditor.value,
132388
+ onMarginChange: handleMarginChange
132389
+ }, null, 8, ["editor"])
132390
+ ], 8, ["to"])) : rulersVisible.value && !!activeEditor.value ? (openBlock(), createBlock(Ruler, {
132391
+ key: 1,
131908
132392
  class: "ruler",
131909
132393
  editor: activeEditor.value,
131910
132394
  onMarginChange: handleMarginChange
@@ -131998,7 +132482,7 @@ ${style2}
131998
132482
  })
131999
132483
  ])) : createCommentVNode("", true),
132000
132484
  activeEditor.value ? (openBlock(), createBlock(GenericPopover, {
132001
- key: 2,
132485
+ key: 3,
132002
132486
  editor: activeEditor.value,
132003
132487
  visible: popoverControls.visible,
132004
132488
  position: popoverControls.position,
@@ -132013,7 +132497,7 @@ ${style2}
132013
132497
  };
132014
132498
  }
132015
132499
  });
132016
- const SuperEditor = /* @__PURE__ */ _export_sfc$1(_sfc_main$1$1, [["__scopeId", "data-v-a935d3e2"]]);
132500
+ const SuperEditor = /* @__PURE__ */ _export_sfc$1(_sfc_main$1$1, [["__scopeId", "data-v-cb3fe66f"]]);
132017
132501
  const _hoisted_1$h = ["innerHTML"];
132018
132502
  const _sfc_main$i = {
132019
132503
  __name: "SuperInput",
@@ -148624,6 +149108,7 @@ ${style2}
148624
149108
  markdown: doc2.markdown,
148625
149109
  documentMode: proxy.$superdoc.config.documentMode,
148626
149110
  rulers: doc2.rulers,
149111
+ rulerContainer: proxy.$superdoc.config.rulerContainer,
148627
149112
  isInternal: proxy.$superdoc.config.isInternal,
148628
149113
  annotations: proxy.$superdoc.config.annotations,
148629
149114
  isCommentsEnabled: Boolean(commentsModuleConfig.value),
@@ -148999,7 +149484,7 @@ ${style2}
148999
149484
  "file-source": doc2.data,
149000
149485
  state: doc2.state,
149001
149486
  "document-id": doc2.id,
149002
- options: editorOptions(doc2),
149487
+ options: { ...editorOptions(doc2), rulers: doc2.rulers },
149003
149488
  onEditorReady,
149004
149489
  onPageMarginsChange: ($event) => handleSuperEditorPageMarginsChange(doc2, $event)
149005
149490
  }, null, 8, ["file-source", "state", "document-id", "options", "onPageMarginsChange"])) : createCommentVNode("", true)
@@ -149052,7 +149537,7 @@ ${style2}
149052
149537
  };
149053
149538
  }
149054
149539
  };
149055
- const App = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-5b2a75a6"]]);
149540
+ const App = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-e229774d"]]);
149056
149541
  const createSuperdocVueApp = () => {
149057
149542
  const app = createApp(App);
149058
149543
  const pinia = createPinia();
@@ -149232,7 +149717,7 @@ ${style2}
149232
149717
  this.config.colors = shuffleArray(this.config.colors);
149233
149718
  this.userColorMap = /* @__PURE__ */ new Map();
149234
149719
  this.colorIndex = 0;
149235
- this.version = "1.0.0-beta.60";
149720
+ this.version = "1.0.0-beta.61";
149236
149721
  this.#log("🦋 [superdoc] Using SuperDoc version:", this.version);
149237
149722
  this.superdocId = config2.superdocId || v4();
149238
149723
  this.colors = this.config.colors;
@@ -149573,6 +150058,10 @@ ${style2}
149573
150058
  const moduleConfig = this.config.modules?.toolbar || {};
149574
150059
  this.toolbarElement = this.config.modules?.toolbar?.selector || this.config.toolbar;
149575
150060
  this.toolbar = null;
150061
+ const excludeItems = [...moduleConfig.excludeItems || []];
150062
+ if (!this.config.rulers) {
150063
+ excludeItems.push("ruler");
150064
+ }
149576
150065
  const config2 = {
149577
150066
  selector: this.toolbarElement || null,
149578
150067
  isDev: this.isDev || false,
@@ -149587,7 +150076,9 @@ ${style2}
149587
150076
  superdoc: this,
149588
150077
  aiApiKey: this.config.modules?.ai?.apiKey,
149589
150078
  aiEndpoint: this.config.modules?.ai?.endpoint,
149590
- ...moduleConfig
150079
+ ...moduleConfig,
150080
+ excludeItems
150081
+ // Override moduleConfig.excludeItems with our computed list
149591
150082
  };
149592
150083
  this.toolbar = new SuperToolbar(config2);
149593
150084
  this.toolbar.on("superdoc-command", this.onToolbarCommand.bind(this));
@@ -151698,7 +152189,7 @@ ${style2}
151698
152189
  value && typeof value === "object" && "byteLength" in value && "byteOffset" in value
151699
152190
  );
151700
152191
  }
151701
- const indexGAzIoyrZ = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
152192
+ const indexU8dj63PM = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
151702
152193
  __proto__: null,
151703
152194
  unified
151704
152195
  }, Symbol.toStringTag, { value: "Module" }));