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

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-4-HewDUK.cjs → PdfViewer-Dm3bZ_1B.cjs} +1 -1
  2. package/dist/chunks/{PdfViewer-C4HeazGQ.es.js → PdfViewer-rmkhzY1H.es.js} +1 -1
  3. package/dist/chunks/{index-BKfoD32c.es.js → index-5vPj3xiM.es.js} +13 -6
  4. package/dist/chunks/{index-9qSCXVF1.cjs → index-VQNmJYMh.cjs} +13 -6
  5. package/dist/chunks/{index-GAzIoyrZ-C17wg4bM.cjs → index-XOsGE2PW-BL-ekicF.cjs} +1 -1
  6. package/dist/chunks/{index-GAzIoyrZ-zhiF5zMK.es.js → index-XOsGE2PW-hNAnvmsK.es.js} +1 -1
  7. package/dist/chunks/{super-editor.es-CJ3Aw1GR.es.js → super-editor.es-BIEE4joF.es.js} +756 -144
  8. package/dist/chunks/{super-editor.es-DCHFBNql.cjs → super-editor.es-CxtR72x8.cjs} +756 -144
  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-Bo9KIIo_.js} +165 -47
  13. package/dist/super-editor/chunks/{docx-zipper-CZQWEuyi.js → docx-zipper-Cw0Rbwvk.js} +1 -1
  14. package/dist/super-editor/chunks/{editor-CDMuD1Nx.js → editor-v-i8Oo_X.js} +531 -36
  15. package/dist/super-editor/chunks/{index-GAzIoyrZ.js → index-XOsGE2PW.js} +1 -1
  16. package/dist/super-editor/chunks/{toolbar-DL3rTlKm.js → toolbar-CiKH0Ttu.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 +768 -149
  29. package/dist/superdoc.umd.js.map +1 -1
  30. package/package.json +1 -1
@@ -42114,11 +42114,71 @@ const _SuperConverter = class _SuperConverter2 {
42114
42114
  return JSON.parse(xmljs.xml2json(newXml, null, 2));
42115
42115
  }
42116
42116
  /**
42117
- * Generic method to get a stored custom property from docx
42117
+ * Checks if an element name matches the expected local name, with or without namespace prefix.
42118
+ * This helper supports custom namespace prefixes in DOCX files (e.g., 'op:Properties', 'custom:property').
42119
+ *
42120
+ * @private
42121
+ * @static
42122
+ * @param {string|undefined|null} elementName - The element name to check (may include namespace prefix)
42123
+ * @param {string} expectedLocalName - The expected local name without prefix
42124
+ * @returns {boolean} True if the element name matches (with or without prefix)
42125
+ *
42126
+ * @example
42127
+ * // Exact match without prefix
42128
+ * _matchesElementName('Properties', 'Properties') // => true
42129
+ *
42130
+ * @example
42131
+ * // Match with namespace prefix
42132
+ * _matchesElementName('op:Properties', 'Properties') // => true
42133
+ * _matchesElementName('custom:property', 'property') // => true
42134
+ *
42135
+ * @example
42136
+ * // No match
42137
+ * _matchesElementName('SomeOtherElement', 'Properties') // => false
42138
+ * _matchesElementName(':Properties', 'Properties') // => false (empty prefix)
42139
+ */
42140
+ static _matchesElementName(elementName, expectedLocalName) {
42141
+ if (!elementName || typeof elementName !== "string") return false;
42142
+ if (!expectedLocalName) return false;
42143
+ if (elementName === expectedLocalName) return true;
42144
+ if (elementName.endsWith(`:${expectedLocalName}`)) {
42145
+ const prefix2 = elementName.slice(0, -(expectedLocalName.length + 1));
42146
+ return prefix2.length > 0;
42147
+ }
42148
+ return false;
42149
+ }
42150
+ /**
42151
+ * Generic method to get a stored custom property from docx.
42152
+ * Supports both standard and custom namespace prefixes (e.g., 'op:Properties', 'custom:property').
42153
+ *
42118
42154
  * @static
42119
42155
  * @param {Array} docx - Array of docx file objects
42120
42156
  * @param {string} propertyName - Name of the property to retrieve
42121
42157
  * @returns {string|null} The property value or null if not found
42158
+ *
42159
+ * Returns null in the following cases:
42160
+ * - docx array is empty or doesn't contain 'docProps/custom.xml'
42161
+ * - custom.xml cannot be parsed
42162
+ * - Properties element is not found (with or without namespace prefix)
42163
+ * - Property with the specified name is not found
42164
+ * - Property has malformed structure (missing nested elements or text)
42165
+ * - Any error occurs during parsing or retrieval
42166
+ *
42167
+ * @example
42168
+ * // Standard property without namespace prefix
42169
+ * const version = SuperConverter.getStoredCustomProperty(docx, 'SuperdocVersion');
42170
+ * // => '1.2.3'
42171
+ *
42172
+ * @example
42173
+ * // Property with namespace prefix (e.g., from Office 365)
42174
+ * const guid = SuperConverter.getStoredCustomProperty(docx, 'DocumentGuid');
42175
+ * // Works with both 'Properties' and 'op:Properties' elements
42176
+ * // => 'abc-123-def-456'
42177
+ *
42178
+ * @example
42179
+ * // Non-existent property
42180
+ * const missing = SuperConverter.getStoredCustomProperty(docx, 'NonExistent');
42181
+ * // => null
42122
42182
  */
42123
42183
  static getStoredCustomProperty(docx, propertyName) {
42124
42184
  try {
@@ -42127,10 +42187,16 @@ const _SuperConverter = class _SuperConverter2 {
42127
42187
  const converter = new _SuperConverter2();
42128
42188
  const content = customXml.content;
42129
42189
  const contentJson = converter.parseXmlToJson(content);
42130
- const properties = contentJson.elements.find((el) => el.name === "Properties");
42131
- if (!properties.elements) return null;
42132
- const property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
42190
+ const properties = contentJson?.elements?.find((el) => _SuperConverter2._matchesElementName(el.name, "Properties"));
42191
+ if (!properties?.elements) return null;
42192
+ const property2 = properties.elements.find(
42193
+ (el) => _SuperConverter2._matchesElementName(el.name, "property") && el.attributes?.name === propertyName
42194
+ );
42133
42195
  if (!property2) return null;
42196
+ if (!property2.elements?.[0]?.elements?.[0]?.text) {
42197
+ console.warn(`Malformed property structure for "${propertyName}"`);
42198
+ return null;
42199
+ }
42134
42200
  return property2.elements[0].elements[0].text;
42135
42201
  } catch (e) {
42136
42202
  console.warn(`Error getting custom property ${propertyName}:`, e);
@@ -42138,60 +42204,112 @@ const _SuperConverter = class _SuperConverter2 {
42138
42204
  }
42139
42205
  }
42140
42206
  /**
42141
- * Generic method to set a stored custom property in docx
42207
+ * Generic method to set a stored custom property in docx.
42208
+ * Supports both standard and custom namespace prefixes (e.g., 'op:Properties', 'custom:property').
42209
+ *
42142
42210
  * @static
42143
- * @param {Object} docx - The docx object to store the property in
42211
+ * @param {Object} docx - The docx object to store the property in (converted XML structure)
42144
42212
  * @param {string} propertyName - Name of the property
42145
42213
  * @param {string|Function} value - Value or function that returns the value
42146
42214
  * @param {boolean} preserveExisting - If true, won't overwrite existing values
42147
- * @returns {string} The stored value
42215
+ * @returns {string|null} The stored value, or null if Properties element is not found
42216
+ *
42217
+ * @throws {Error} If an error occurs during property setting (logged as warning)
42218
+ *
42219
+ * @example
42220
+ * // Set a new property
42221
+ * const value = SuperConverter.setStoredCustomProperty(docx, 'MyProperty', 'MyValue');
42222
+ * // => 'MyValue'
42223
+ *
42224
+ * @example
42225
+ * // Set a property with a function
42226
+ * const guid = SuperConverter.setStoredCustomProperty(docx, 'DocumentGuid', () => uuidv4());
42227
+ * // => 'abc-123-def-456'
42228
+ *
42229
+ * @example
42230
+ * // Preserve existing value
42231
+ * SuperConverter.setStoredCustomProperty(docx, 'MyProperty', 'NewValue', true);
42232
+ * // => 'MyValue' (original value preserved)
42233
+ *
42234
+ * @example
42235
+ * // Works with namespace prefixes
42236
+ * // If docx has 'op:Properties' and 'op:property' elements, this will handle them correctly
42237
+ * const version = SuperConverter.setStoredCustomProperty(docx, 'Version', '2.0.0');
42238
+ * // => '2.0.0'
42148
42239
  */
42149
42240
  static setStoredCustomProperty(docx, propertyName, value, preserveExisting = false) {
42150
- const customLocation = "docProps/custom.xml";
42151
- if (!docx[customLocation]) docx[customLocation] = generateCustomXml();
42152
- const customXml = docx[customLocation];
42153
- const properties = customXml.elements?.find((el) => el.name === "Properties");
42154
- if (!properties) return null;
42155
- if (!properties.elements) properties.elements = [];
42156
- let property2 = properties.elements.find((el) => el.name === "property" && el.attributes.name === propertyName);
42157
- if (property2 && preserveExisting) {
42158
- return property2.elements[0].elements[0].text;
42159
- }
42160
- const finalValue = typeof value === "function" ? value() : value;
42161
- if (!property2) {
42162
- const existingPids = properties.elements.filter((el) => el.attributes?.pid).map((el) => parseInt(el.attributes.pid, 10)).filter(Number.isInteger);
42163
- const pid = existingPids.length > 0 ? Math.max(...existingPids) + 1 : 2;
42164
- property2 = {
42165
- type: "element",
42166
- name: "property",
42167
- attributes: {
42168
- name: propertyName,
42169
- fmtid: "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",
42170
- pid
42171
- },
42172
- elements: [
42173
- {
42174
- type: "element",
42175
- name: "vt:lpwstr",
42176
- elements: [
42177
- {
42178
- type: "text",
42179
- text: finalValue
42180
- }
42181
- ]
42182
- }
42183
- ]
42184
- };
42185
- properties.elements.push(property2);
42186
- } else {
42187
- property2.elements[0].elements[0].text = finalValue;
42241
+ try {
42242
+ const customLocation = "docProps/custom.xml";
42243
+ if (!docx[customLocation]) docx[customLocation] = generateCustomXml();
42244
+ const customXml = docx[customLocation];
42245
+ const properties = customXml.elements?.find((el) => _SuperConverter2._matchesElementName(el.name, "Properties"));
42246
+ if (!properties) return null;
42247
+ if (!properties.elements) properties.elements = [];
42248
+ let property2 = properties.elements.find(
42249
+ (el) => _SuperConverter2._matchesElementName(el.name, "property") && el.attributes?.name === propertyName
42250
+ );
42251
+ if (property2 && preserveExisting) {
42252
+ if (!property2.elements?.[0]?.elements?.[0]?.text) {
42253
+ console.warn(`Malformed existing property structure for "${propertyName}"`);
42254
+ return null;
42255
+ }
42256
+ return property2.elements[0].elements[0].text;
42257
+ }
42258
+ const finalValue = typeof value === "function" ? value() : value;
42259
+ if (!property2) {
42260
+ const existingPids = properties.elements.filter((el) => el.attributes?.pid).map((el) => parseInt(el.attributes.pid, 10)).filter(Number.isInteger);
42261
+ const pid = existingPids.length > 0 ? Math.max(...existingPids) + 1 : 2;
42262
+ property2 = {
42263
+ type: "element",
42264
+ name: "property",
42265
+ attributes: {
42266
+ name: propertyName,
42267
+ fmtid: "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",
42268
+ pid
42269
+ },
42270
+ elements: [
42271
+ {
42272
+ type: "element",
42273
+ name: "vt:lpwstr",
42274
+ elements: [
42275
+ {
42276
+ type: "text",
42277
+ text: finalValue
42278
+ }
42279
+ ]
42280
+ }
42281
+ ]
42282
+ };
42283
+ properties.elements.push(property2);
42284
+ } else {
42285
+ if (!property2.elements?.[0]?.elements?.[0]) {
42286
+ console.warn(`Malformed property structure for "${propertyName}", recreating structure`);
42287
+ property2.elements = [
42288
+ {
42289
+ type: "element",
42290
+ name: "vt:lpwstr",
42291
+ elements: [
42292
+ {
42293
+ type: "text",
42294
+ text: finalValue
42295
+ }
42296
+ ]
42297
+ }
42298
+ ];
42299
+ } else {
42300
+ property2.elements[0].elements[0].text = finalValue;
42301
+ }
42302
+ }
42303
+ return finalValue;
42304
+ } catch (e) {
42305
+ console.warn(`Error setting custom property ${propertyName}:`, e);
42306
+ return null;
42188
42307
  }
42189
- return finalValue;
42190
42308
  }
42191
42309
  static getStoredSuperdocVersion(docx) {
42192
42310
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
42193
42311
  }
42194
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.60") {
42312
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "1.0.0-beta.62") {
42195
42313
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
42196
42314
  }
42197
42315
  /**
@@ -59380,7 +59498,7 @@ const isHeadless = (editor) => {
59380
59498
  const shouldSkipNodeView = (editor) => {
59381
59499
  return isHeadless(editor);
59382
59500
  };
59383
- const summaryVersion = "1.0.0-beta.60";
59501
+ const summaryVersion = "1.0.0-beta.62";
59384
59502
  const nodeKeys = ["group", "content", "marks", "inline", "atom", "defining", "code", "tableRole", "summary"];
59385
59503
  const markKeys = ["group", "inclusive", "excludes", "spanning", "code"];
59386
59504
  function mapAttributes(attrs) {
@@ -60169,7 +60287,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60169
60287
  { default: remarkStringify },
60170
60288
  { default: remarkGfm }
60171
60289
  ] = await Promise.all([
60172
- import("./index-GAzIoyrZ-zhiF5zMK.es.js"),
60290
+ import("./index-XOsGE2PW-hNAnvmsK.es.js"),
60173
60291
  import("./index-DRCvimau-Cw339678.es.js"),
60174
60292
  import("./index-C_x_N6Uh-DJn8hIEt.es.js"),
60175
60293
  import("./index-D_sWOSiG-DE96TaT5.es.js"),
@@ -60374,7 +60492,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
60374
60492
  * Process collaboration migrations
60375
60493
  */
60376
60494
  processCollaborationMigrations() {
60377
- console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.60");
60495
+ console.debug("[checkVersionMigrations] Current editor version", "1.0.0-beta.62");
60378
60496
  if (!this.options.ydoc) return;
60379
60497
  const metaMap = this.options.ydoc.getMap("meta");
60380
60498
  let docVersion = metaMap.get("version");
@@ -64347,12 +64465,6 @@ const Engines = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
64347
64465
  resolveSpacingIndent: resolveSpacingIndent$1,
64348
64466
  scaleWrapPolygon
64349
64467
  }, Symbol.toStringTag, { value: "Module" }));
64350
- const extractHeaderFooterSpace = (margins) => {
64351
- return {
64352
- headerSpace: margins?.header ?? 0,
64353
- footerSpace: margins?.footer ?? 0
64354
- };
64355
- };
64356
64468
  const hasParagraphStyleContext = (context) => {
64357
64469
  return Boolean(context?.docx);
64358
64470
  };
@@ -71540,6 +71652,408 @@ function assertFragmentPmPositions(fragment, _context) {
71540
71652
  const hasPmEnd = fragment.pmEnd != null;
71541
71653
  globalValidationStats.record(hasPmStart, hasPmEnd);
71542
71654
  }
71655
+ const DEFAULT_PPI = 96;
71656
+ const DEFAULT_RULER_HEIGHT = 25;
71657
+ const TICK_SPACING_PX = DEFAULT_PPI / 8;
71658
+ function generateRulerDefinition(config2) {
71659
+ const ppi = config2.ppi ?? DEFAULT_PPI;
71660
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
71661
+ const { pageSize, pageMargins } = config2;
71662
+ if (!Number.isFinite(ppi) || ppi <= 0) {
71663
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
71664
+ }
71665
+ if (!Number.isFinite(pageSize.width) || pageSize.width <= 0) {
71666
+ throw new Error(`Invalid page width: ${pageSize.width}. Must be a positive finite number.`);
71667
+ }
71668
+ if (!Number.isFinite(pageSize.height) || pageSize.height <= 0) {
71669
+ throw new Error(`Invalid page height: ${pageSize.height}. Must be a positive finite number.`);
71670
+ }
71671
+ if (!Number.isFinite(pageMargins.left) || pageMargins.left < 0) {
71672
+ throw new Error(`Invalid left margin: ${pageMargins.left}. Must be a non-negative finite number.`);
71673
+ }
71674
+ if (!Number.isFinite(pageMargins.right) || pageMargins.right < 0) {
71675
+ throw new Error(`Invalid right margin: ${pageMargins.right}. Must be a non-negative finite number.`);
71676
+ }
71677
+ if (pageMargins.left + pageMargins.right >= pageSize.width) {
71678
+ throw new Error(
71679
+ `Invalid margins: left (${pageMargins.left}) + right (${pageMargins.right}) must be less than page width (${pageSize.width}).`
71680
+ );
71681
+ }
71682
+ const widthPx = pageSize.width * ppi;
71683
+ const ticks = [];
71684
+ let currentX = 0;
71685
+ for (let inch = 0; inch < pageSize.width; inch++) {
71686
+ const remaining = pageSize.width - inch;
71687
+ ticks.push({
71688
+ size: "main",
71689
+ height: "20%",
71690
+ label: inch,
71691
+ x: currentX
71692
+ });
71693
+ currentX += TICK_SPACING_PX;
71694
+ for (let i = 0; i < 3; i++) {
71695
+ ticks.push({
71696
+ size: "eighth",
71697
+ height: "10%",
71698
+ x: currentX
71699
+ });
71700
+ currentX += TICK_SPACING_PX;
71701
+ }
71702
+ ticks.push({
71703
+ size: "half",
71704
+ height: "40%",
71705
+ x: currentX
71706
+ });
71707
+ currentX += TICK_SPACING_PX;
71708
+ if (remaining <= 0.5) break;
71709
+ for (let i = 0; i < 3; i++) {
71710
+ ticks.push({
71711
+ size: "eighth",
71712
+ height: "10%",
71713
+ x: currentX
71714
+ });
71715
+ currentX += TICK_SPACING_PX;
71716
+ }
71717
+ }
71718
+ return {
71719
+ widthPx,
71720
+ heightPx,
71721
+ ticks,
71722
+ leftMarginPx: pageMargins.left * ppi,
71723
+ rightMarginPx: widthPx - pageMargins.right * ppi,
71724
+ pageWidthInches: pageSize.width
71725
+ };
71726
+ }
71727
+ function calculateMarginFromHandle(handleX, side, pageWidthPx, ppi = DEFAULT_PPI) {
71728
+ if (side === "left") {
71729
+ return handleX / ppi;
71730
+ } else {
71731
+ return (pageWidthPx - handleX) / ppi;
71732
+ }
71733
+ }
71734
+ function clampHandlePosition(handleX, side, otherHandleX, pageWidthPx, minContentWidthPx = 200) {
71735
+ if (!Number.isFinite(handleX)) {
71736
+ throw new Error(`Invalid handleX: ${handleX}. Must be a finite number.`);
71737
+ }
71738
+ if (!Number.isFinite(otherHandleX)) {
71739
+ throw new Error(`Invalid otherHandleX: ${otherHandleX}. Must be a finite number.`);
71740
+ }
71741
+ if (!Number.isFinite(pageWidthPx)) {
71742
+ throw new Error(`Invalid pageWidthPx: ${pageWidthPx}. Must be a finite number.`);
71743
+ }
71744
+ if (!Number.isFinite(minContentWidthPx)) {
71745
+ throw new Error(`Invalid minContentWidthPx: ${minContentWidthPx}. Must be a finite number.`);
71746
+ }
71747
+ if (side === "left") {
71748
+ const min2 = 0;
71749
+ const max2 = otherHandleX - minContentWidthPx;
71750
+ return Math.max(min2, Math.min(max2, handleX));
71751
+ } else {
71752
+ const min2 = otherHandleX + minContentWidthPx;
71753
+ const max2 = pageWidthPx;
71754
+ return Math.max(min2, Math.min(max2, handleX));
71755
+ }
71756
+ }
71757
+ function generateRulerDefinitionFromPx(config2) {
71758
+ const ppi = config2.ppi ?? DEFAULT_PPI;
71759
+ const heightPx = config2.heightPx ?? DEFAULT_RULER_HEIGHT;
71760
+ const { pageWidthPx, leftMarginPx, rightMarginPx } = config2;
71761
+ if (!Number.isFinite(ppi) || ppi <= 0) {
71762
+ throw new Error(`Invalid PPI: ${ppi}. Must be a positive finite number.`);
71763
+ }
71764
+ if (!Number.isFinite(pageWidthPx) || pageWidthPx <= 0) {
71765
+ throw new Error(`Invalid page width: ${pageWidthPx}px. Must be a positive finite number.`);
71766
+ }
71767
+ if (!Number.isFinite(config2.pageHeightPx) || config2.pageHeightPx <= 0) {
71768
+ throw new Error(`Invalid page height: ${config2.pageHeightPx}px. Must be a positive finite number.`);
71769
+ }
71770
+ if (!Number.isFinite(leftMarginPx) || leftMarginPx < 0) {
71771
+ throw new Error(`Invalid left margin: ${leftMarginPx}px. Must be a non-negative finite number.`);
71772
+ }
71773
+ if (!Number.isFinite(rightMarginPx) || rightMarginPx < 0) {
71774
+ throw new Error(`Invalid right margin: ${rightMarginPx}px. Must be a non-negative finite number.`);
71775
+ }
71776
+ if (leftMarginPx + rightMarginPx >= pageWidthPx) {
71777
+ throw new Error(
71778
+ `Invalid margins: left (${leftMarginPx}px) + right (${rightMarginPx}px) must be less than page width (${pageWidthPx}px).`
71779
+ );
71780
+ }
71781
+ const pageWidthInches = pageWidthPx / ppi;
71782
+ const ticks = [];
71783
+ let currentX = 0;
71784
+ for (let inch = 0; inch < pageWidthInches; inch++) {
71785
+ const remaining = pageWidthInches - inch;
71786
+ ticks.push({
71787
+ size: "main",
71788
+ height: "20%",
71789
+ label: inch,
71790
+ x: currentX
71791
+ });
71792
+ currentX += TICK_SPACING_PX;
71793
+ for (let i = 0; i < 3; i++) {
71794
+ ticks.push({
71795
+ size: "eighth",
71796
+ height: "10%",
71797
+ x: currentX
71798
+ });
71799
+ currentX += TICK_SPACING_PX;
71800
+ }
71801
+ ticks.push({
71802
+ size: "half",
71803
+ height: "40%",
71804
+ x: currentX
71805
+ });
71806
+ currentX += TICK_SPACING_PX;
71807
+ if (remaining <= 0.5) break;
71808
+ for (let i = 0; i < 3; i++) {
71809
+ ticks.push({
71810
+ size: "eighth",
71811
+ height: "10%",
71812
+ x: currentX
71813
+ });
71814
+ currentX += TICK_SPACING_PX;
71815
+ }
71816
+ }
71817
+ return {
71818
+ widthPx: pageWidthPx,
71819
+ heightPx,
71820
+ ticks,
71821
+ leftMarginPx,
71822
+ rightMarginPx: pageWidthPx - rightMarginPx,
71823
+ pageWidthInches
71824
+ };
71825
+ }
71826
+ const RULER_CLASS_NAMES = {
71827
+ /** Main ruler container */
71828
+ ruler: "superdoc-ruler",
71829
+ /** Tick mark element */
71830
+ tick: "superdoc-ruler-tick",
71831
+ /** Main (inch) tick */
71832
+ tickMain: "superdoc-ruler-tick--main",
71833
+ /** Half-inch tick */
71834
+ tickHalf: "superdoc-ruler-tick--half",
71835
+ /** Eighth-inch tick */
71836
+ tickEighth: "superdoc-ruler-tick--eighth",
71837
+ /** Inch label number */
71838
+ label: "superdoc-ruler-label",
71839
+ /** Margin handle */
71840
+ handle: "superdoc-ruler-handle",
71841
+ /** Left margin handle */
71842
+ handleLeft: "superdoc-ruler-handle--left",
71843
+ /** Right margin handle */
71844
+ handleRight: "superdoc-ruler-handle--right",
71845
+ /** Vertical indicator line during drag */
71846
+ indicator: "superdoc-ruler-indicator"
71847
+ };
71848
+ function createRulerElement(options) {
71849
+ const { definition, doc: doc2, interactive = false } = options;
71850
+ if (!Number.isFinite(definition.widthPx) || definition.widthPx <= 0) {
71851
+ console.warn(`[createRulerElement] Invalid ruler width: ${definition.widthPx}px. Using minimum width of 1px.`);
71852
+ definition.widthPx = Math.max(1, definition.widthPx || 1);
71853
+ }
71854
+ if (!definition.ticks || definition.ticks.length === 0) {
71855
+ console.warn("[createRulerElement] Ruler definition has no ticks. Ruler will be empty.");
71856
+ }
71857
+ const ruler = doc2.createElement("div");
71858
+ ruler.className = RULER_CLASS_NAMES.ruler;
71859
+ ruler.style.cssText = `
71860
+ position: relative;
71861
+ width: ${definition.widthPx}px;
71862
+ height: ${definition.heightPx}px;
71863
+ display: flex;
71864
+ align-items: flex-end;
71865
+ box-sizing: border-box;
71866
+ user-select: none;
71867
+ pointer-events: ${interactive ? "auto" : "none"};
71868
+ `;
71869
+ for (const tick of definition.ticks) {
71870
+ const tickEl = createTickElement(tick, doc2);
71871
+ ruler.appendChild(tickEl);
71872
+ }
71873
+ if (interactive) {
71874
+ const leftHandle = createHandleElement("left", definition.leftMarginPx, doc2, options);
71875
+ const rightHandle = createHandleElement("right", definition.rightMarginPx, doc2, options);
71876
+ ruler.appendChild(leftHandle);
71877
+ ruler.appendChild(rightHandle);
71878
+ }
71879
+ return ruler;
71880
+ }
71881
+ function createTickElement(tick, doc2) {
71882
+ const el = doc2.createElement("div");
71883
+ const sizeClass = tick.size === "main" ? RULER_CLASS_NAMES.tickMain : tick.size === "half" ? RULER_CLASS_NAMES.tickHalf : RULER_CLASS_NAMES.tickEighth;
71884
+ el.className = `${RULER_CLASS_NAMES.tick} ${sizeClass}`;
71885
+ el.style.cssText = `
71886
+ position: absolute;
71887
+ left: ${tick.x}px;
71888
+ bottom: 0;
71889
+ width: 1px;
71890
+ height: ${tick.height};
71891
+ background-color: #666;
71892
+ pointer-events: none;
71893
+ `;
71894
+ if (tick.label !== void 0) {
71895
+ const label = doc2.createElement("span");
71896
+ label.className = RULER_CLASS_NAMES.label;
71897
+ label.textContent = String(tick.label);
71898
+ label.style.cssText = `
71899
+ position: absolute;
71900
+ top: -16px;
71901
+ left: -2px;
71902
+ font-size: 10px;
71903
+ color: #666;
71904
+ pointer-events: none;
71905
+ user-select: none;
71906
+ `;
71907
+ el.appendChild(label);
71908
+ }
71909
+ return el;
71910
+ }
71911
+ function createHandleElement(side, x2, doc2, options) {
71912
+ const handle = doc2.createElement("div");
71913
+ const sideClass = side === "left" ? RULER_CLASS_NAMES.handleLeft : RULER_CLASS_NAMES.handleRight;
71914
+ handle.className = `${RULER_CLASS_NAMES.handle} ${sideClass}`;
71915
+ handle.dataset.side = side;
71916
+ handle.style.cssText = `
71917
+ position: absolute;
71918
+ left: ${x2}px;
71919
+ top: 0;
71920
+ width: 5px;
71921
+ height: 20px;
71922
+ margin-left: -2px;
71923
+ background-color: #ccc;
71924
+ border-radius: 4px 4px 0 0;
71925
+ cursor: grab;
71926
+ transition: background-color 150ms ease;
71927
+ z-index: 10;
71928
+ `;
71929
+ handle.addEventListener("mouseenter", () => {
71930
+ if (!handle.dataset.dragging) {
71931
+ handle.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
71932
+ }
71933
+ });
71934
+ handle.addEventListener("mouseleave", () => {
71935
+ if (!handle.dataset.dragging) {
71936
+ handle.style.backgroundColor = "#ccc";
71937
+ }
71938
+ });
71939
+ if (options.onDragStart || options.onDrag || options.onDragEnd) {
71940
+ setupHandleDrag(handle, side, options);
71941
+ }
71942
+ return handle;
71943
+ }
71944
+ function setupHandleDrag(handle, side, options) {
71945
+ let offsetX = 0;
71946
+ const onPointerDown = (event) => {
71947
+ event.preventDefault();
71948
+ handle.dataset.dragging = "true";
71949
+ handle.style.backgroundColor = "rgba(37, 99, 235, 0.4)";
71950
+ handle.style.cursor = "grabbing";
71951
+ const rect = handle.getBoundingClientRect();
71952
+ offsetX = event.clientX - rect.left - rect.width / 2;
71953
+ handle.setPointerCapture(event.pointerId);
71954
+ options.onDragStart?.(side, event);
71955
+ };
71956
+ const onPointerMove = (event) => {
71957
+ if (handle.dataset.dragging !== "true") return;
71958
+ const ruler = handle.parentElement;
71959
+ if (!ruler) return;
71960
+ const rulerRect = ruler.getBoundingClientRect();
71961
+ const newX = event.clientX - rulerRect.left - offsetX;
71962
+ options.onDrag?.(side, newX, event);
71963
+ };
71964
+ const onPointerUp = (event) => {
71965
+ if (handle.dataset.dragging !== "true") return;
71966
+ handle.dataset.dragging = "";
71967
+ handle.style.backgroundColor = "#ccc";
71968
+ handle.style.cursor = "grab";
71969
+ handle.releasePointerCapture(event.pointerId);
71970
+ const ruler = handle.parentElement;
71971
+ if (!ruler) return;
71972
+ const rulerRect = ruler.getBoundingClientRect();
71973
+ const finalX = event.clientX - rulerRect.left - offsetX;
71974
+ options.onDragEnd?.(side, finalX, event);
71975
+ };
71976
+ handle.addEventListener("pointerdown", onPointerDown);
71977
+ handle.addEventListener("pointermove", onPointerMove);
71978
+ handle.addEventListener("pointerup", onPointerUp);
71979
+ handle.addEventListener("pointercancel", onPointerUp);
71980
+ }
71981
+ const RULER_STYLES = `
71982
+ /* Ruler container */
71983
+ .${RULER_CLASS_NAMES.ruler} {
71984
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
71985
+ background-color: transparent;
71986
+ }
71987
+
71988
+ /* Tick marks base styling */
71989
+ .${RULER_CLASS_NAMES.tick} {
71990
+ flex-shrink: 0;
71991
+ }
71992
+
71993
+ /* Handle hover and active states */
71994
+ .${RULER_CLASS_NAMES.handle}:hover {
71995
+ background-color: rgba(37, 99, 235, 0.4) !important;
71996
+ }
71997
+
71998
+ .${RULER_CLASS_NAMES.handle}:active,
71999
+ .${RULER_CLASS_NAMES.handle}[data-dragging="true"] {
72000
+ background-color: rgba(37, 99, 235, 0.6) !important;
72001
+ cursor: grabbing !important;
72002
+ }
72003
+
72004
+ /* Vertical indicator animation */
72005
+ .${RULER_CLASS_NAMES.indicator} {
72006
+ transition: left 16ms linear;
72007
+ }
72008
+
72009
+ /* Print mode: hide rulers */
72010
+ @media print {
72011
+ .${RULER_CLASS_NAMES.ruler} {
72012
+ display: none !important;
72013
+ }
72014
+ }
72015
+
72016
+ /* High contrast mode support */
72017
+ @media (prefers-contrast: high) {
72018
+ .${RULER_CLASS_NAMES.tick} {
72019
+ background-color: #000 !important;
72020
+ }
72021
+
72022
+ .${RULER_CLASS_NAMES.label} {
72023
+ color: #000 !important;
72024
+ }
72025
+
72026
+ .${RULER_CLASS_NAMES.handle} {
72027
+ background-color: #666 !important;
72028
+ border: 1px solid #000;
72029
+ }
72030
+
72031
+ .${RULER_CLASS_NAMES.handle}:hover,
72032
+ .${RULER_CLASS_NAMES.handle}:active {
72033
+ background-color: #0066cc !important;
72034
+ }
72035
+ }
72036
+
72037
+ /* Reduced motion support */
72038
+ @media (prefers-reduced-motion: reduce) {
72039
+ .${RULER_CLASS_NAMES.handle} {
72040
+ transition: none !important;
72041
+ }
72042
+
72043
+ .${RULER_CLASS_NAMES.indicator} {
72044
+ transition: none !important;
72045
+ }
72046
+ }
72047
+ `;
72048
+ let rulerStylesInjected = false;
72049
+ function ensureRulerStyles(doc2) {
72050
+ if (rulerStylesInjected || !doc2) return;
72051
+ const styleEl = doc2.createElement("style");
72052
+ styleEl.setAttribute("data-superdoc-ruler-styles", "true");
72053
+ styleEl.textContent = RULER_STYLES;
72054
+ doc2.head?.appendChild(styleEl);
72055
+ rulerStylesInjected = true;
72056
+ }
71543
72057
  function isMinimalWordLayout(value) {
71544
72058
  if (typeof value !== "object" || value === null) {
71545
72059
  return false;
@@ -71586,6 +72100,7 @@ function isMinimalWordLayout(value) {
71586
72100
  }
71587
72101
  const LIST_MARKER_GAP$1 = 8;
71588
72102
  const DEFAULT_TAB_INTERVAL_PX$1 = 48;
72103
+ const DEFAULT_PAGE_HEIGHT_PX = 1056;
71589
72104
  const COMMENT_EXTERNAL_COLOR = "#B1124B";
71590
72105
  const COMMENT_INTERNAL_COLOR = "#078383";
71591
72106
  const COMMENT_INACTIVE_ALPHA = "22";
@@ -71828,6 +72343,9 @@ const _DomPainter = class _DomPainter2 {
71828
72343
  ensureFieldAnnotationStyles(doc2);
71829
72344
  ensureSdtContainerStyles(doc2);
71830
72345
  ensureImageSelectionStyles(doc2);
72346
+ if (this.options.ruler?.enabled) {
72347
+ ensureRulerStyles(doc2);
72348
+ }
71831
72349
  mount2.classList.add(CLASS_NAMES$1.container);
71832
72350
  if (this.mount && this.mount !== mount2) {
71833
72351
  this.resetState();
@@ -72085,6 +72603,12 @@ const _DomPainter = class _DomPainter2 {
72085
72603
  const el = this.doc.createElement("div");
72086
72604
  el.classList.add(CLASS_NAMES$1.page);
72087
72605
  applyStyles$2(el, pageStyles(width, height, this.getEffectivePageStyles()));
72606
+ if (this.options.ruler?.enabled) {
72607
+ const rulerEl = this.renderPageRuler(width, page);
72608
+ if (rulerEl) {
72609
+ el.appendChild(rulerEl);
72610
+ }
72611
+ }
72088
72612
  const contextBase = {
72089
72613
  pageNumber: page.number,
72090
72614
  totalPages: this.totalPages,
@@ -72097,6 +72621,70 @@ const _DomPainter = class _DomPainter2 {
72097
72621
  this.renderDecorationsForPage(el, page);
72098
72622
  return el;
72099
72623
  }
72624
+ /**
72625
+ * Render a ruler element for a page.
72626
+ *
72627
+ * Creates a horizontal ruler with tick marks and optional interactive margin handles.
72628
+ * The ruler is positioned at the top of the page and displays inch measurements.
72629
+ *
72630
+ * @param pageWidthPx - Page width in pixels
72631
+ * @param page - Page data containing margins and optional size information
72632
+ * @returns Ruler element, or null if this.doc is unavailable or page margins are missing
72633
+ *
72634
+ * Side effects:
72635
+ * - Creates DOM elements and applies inline styles
72636
+ * - May invoke the onMarginChange callback if interactive mode is enabled
72637
+ *
72638
+ * Fallback behavior:
72639
+ * - Uses DEFAULT_PAGE_HEIGHT_PX (1056px = 11 inches) if page.size.h is not available
72640
+ * - Defaults margins to 0 if not explicitly provided
72641
+ */
72642
+ renderPageRuler(pageWidthPx, page) {
72643
+ if (!this.doc) {
72644
+ console.warn("[renderPageRuler] Cannot render ruler: document is not available.");
72645
+ return null;
72646
+ }
72647
+ if (!page.margins) {
72648
+ console.warn(`[renderPageRuler] Cannot render ruler for page ${page.number}: margins not available.`);
72649
+ return null;
72650
+ }
72651
+ const margins = page.margins;
72652
+ const leftMargin = margins.left ?? 0;
72653
+ const rightMargin = margins.right ?? 0;
72654
+ try {
72655
+ const rulerDefinition = generateRulerDefinitionFromPx({
72656
+ pageWidthPx,
72657
+ pageHeightPx: page.size?.h ?? DEFAULT_PAGE_HEIGHT_PX,
72658
+ leftMarginPx: leftMargin,
72659
+ rightMarginPx: rightMargin
72660
+ });
72661
+ const interactive = this.options.ruler?.interactive ?? false;
72662
+ const onMarginChange = this.options.ruler?.onMarginChange;
72663
+ const rulerEl = createRulerElement({
72664
+ definition: rulerDefinition,
72665
+ doc: this.doc,
72666
+ interactive,
72667
+ onDragEnd: interactive && onMarginChange ? (side, x2) => {
72668
+ try {
72669
+ const ppi = 96;
72670
+ const marginInches = side === "left" ? x2 / ppi : (pageWidthPx - x2) / ppi;
72671
+ onMarginChange(side, marginInches);
72672
+ } catch (error) {
72673
+ console.error("[renderPageRuler] Error in onMarginChange callback:", error);
72674
+ }
72675
+ } : void 0
72676
+ });
72677
+ rulerEl.style.position = "absolute";
72678
+ rulerEl.style.top = "0";
72679
+ rulerEl.style.left = "0";
72680
+ rulerEl.style.zIndex = "20";
72681
+ rulerEl.dataset.pageNumber = String(page.number);
72682
+ return rulerEl;
72683
+ } catch (error) {
72684
+ console.error(`[renderPageRuler] Failed to create ruler for page ${page.number}:`, error);
72685
+ return null;
72686
+ }
72687
+ }
72100
72688
  renderDecorationsForPage(pageEl, page) {
72101
72689
  this.renderDecorationSection(pageEl, page, "header");
72102
72690
  this.renderDecorationSection(pageEl, page, "footer");
@@ -72128,6 +72716,7 @@ const _DomPainter = class _DomPainter2 {
72128
72716
  container.style.height = `${data.height}px`;
72129
72717
  container.style.top = `${Math.max(0, offset2)}px`;
72130
72718
  container.style.zIndex = "1";
72719
+ container.style.overflow = "visible";
72131
72720
  let footerYOffset = 0;
72132
72721
  if (kind === "footer" && data.fragments.length > 0) {
72133
72722
  const contentHeight = typeof data.contentHeight === "number" ? data.contentHeight : data.fragments.reduce((max2, f2) => {
@@ -74897,7 +75486,8 @@ const createDomPainter = (options) => {
74897
75486
  layoutMode: options.layoutMode,
74898
75487
  headerProvider: options.headerProvider,
74899
75488
  footerProvider: options.footerProvider,
74900
- virtualization: options.virtualization
75489
+ virtualization: options.virtualization,
75490
+ ruler: options.ruler
74901
75491
  });
74902
75492
  return {
74903
75493
  paint(layout, mount2) {
@@ -81139,7 +81729,14 @@ async function measureParagraphBlock(block, maxWidth) {
81139
81729
  leftJustifiedMarkerSpace = markerBoxWidth + gutterWidth;
81140
81730
  }
81141
81731
  }
81142
- const initialAvailableWidth = Math.max(1, contentWidth - firstLineOffset - leftJustifiedMarkerSpace);
81732
+ let initialAvailableWidth;
81733
+ const isFirstLineIndentMode = wordLayout?.firstLineIndentMode === true;
81734
+ const textStartPx = wordLayout?.textStartPx;
81735
+ if (isFirstLineIndentMode && typeof textStartPx === "number" && textStartPx > 0) {
81736
+ initialAvailableWidth = Math.max(1, maxWidth - textStartPx - indentRight);
81737
+ } else {
81738
+ initialAvailableWidth = Math.max(1, contentWidth - firstLineOffset - leftJustifiedMarkerSpace);
81739
+ }
81143
81740
  const tabStops = buildTabStopsPx(
81144
81741
  indent,
81145
81742
  block.attrs?.tabs,
@@ -83115,7 +83712,9 @@ class HeaderFooterLayoutAdapter {
83115
83712
  const batch = {};
83116
83713
  let hasBlocks = false;
83117
83714
  descriptors.forEach((descriptor) => {
83118
- if (!descriptor.variant) return;
83715
+ if (!descriptor.variant) {
83716
+ return;
83717
+ }
83119
83718
  const blocks = __privateMethod$1(this, _HeaderFooterLayoutAdapter_instances, getBlocks_fn).call(this, descriptor);
83120
83719
  if (blocks && blocks.length > 0) {
83121
83720
  batch[descriptor.variant] = blocks;
@@ -85425,9 +86024,11 @@ updateLocalAwarenessCursor_fn = function() {
85425
86024
  if (typeof provider.awareness.setLocalStateField !== "function") {
85426
86025
  return;
85427
86026
  }
85428
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
86027
+ const editorState = __privateGet$1(this, _editor3)?.state;
86028
+ if (!editorState) return;
86029
+ const ystate = ySyncPluginKey.getState(editorState);
85429
86030
  if (!ystate?.binding?.mapping) return;
85430
- const { selection } = __privateGet$1(this, _editor3).state;
86031
+ const { selection } = editorState;
85431
86032
  const { anchor, head } = selection;
85432
86033
  try {
85433
86034
  const relAnchor = absolutePositionToRelativePosition(anchor, ystate.type, ystate.binding.mapping);
@@ -85445,7 +86046,9 @@ updateLocalAwarenessCursor_fn = function() {
85445
86046
  normalizeAwarenessStates_fn = function() {
85446
86047
  const provider = __privateGet$1(this, _options).collaborationProvider;
85447
86048
  if (!provider?.awareness) return /* @__PURE__ */ new Map();
85448
- const ystate = ySyncPluginKey.getState(__privateGet$1(this, _editor3).state);
86049
+ const editorState = __privateGet$1(this, _editor3)?.state;
86050
+ if (!editorState) return /* @__PURE__ */ new Map();
86051
+ const ystate = ySyncPluginKey.getState(editorState);
85449
86052
  if (!ystate) return /* @__PURE__ */ new Map();
85450
86053
  const states = provider.awareness?.getStates();
85451
86054
  const normalized = /* @__PURE__ */ new Map();
@@ -86238,7 +86841,8 @@ ensurePainter_fn = function(blocks, measures) {
86238
86841
  virtualization: __privateGet$1(this, _layoutOptions).virtualization,
86239
86842
  pageStyles: __privateGet$1(this, _layoutOptions).pageStyles,
86240
86843
  headerProvider: __privateGet$1(this, _headerDecorationProvider),
86241
- footerProvider: __privateGet$1(this, _footerDecorationProvider)
86844
+ footerProvider: __privateGet$1(this, _footerDecorationProvider),
86845
+ ruler: __privateGet$1(this, _layoutOptions).ruler
86242
86846
  }));
86243
86847
  }
86244
86848
  return __privateGet$1(this, _domPainter);
@@ -86377,14 +86981,20 @@ computeHeaderFooterConstraints_fn = function() {
86377
86981
  const margins = __privateGet$1(this, _layoutOptions).margins ?? DEFAULT_MARGINS;
86378
86982
  const marginLeft = margins.left ?? DEFAULT_MARGINS.left;
86379
86983
  const marginRight = margins.right ?? DEFAULT_MARGINS.right;
86380
- const width = pageSize.w - (marginLeft + marginRight);
86381
- if (!Number.isFinite(width) || width <= 0) {
86984
+ const bodyContentWidth = pageSize.w - (marginLeft + marginRight);
86985
+ if (!Number.isFinite(bodyContentWidth) || bodyContentWidth <= 0) {
86382
86986
  return null;
86383
86987
  }
86384
- const { headerSpace, footerSpace } = extractHeaderFooterSpace(margins);
86385
- const height = Math.max(headerSpace, footerSpace, 1);
86988
+ const measurementWidth = bodyContentWidth;
86989
+ const marginTop = margins.top ?? DEFAULT_MARGINS.top;
86990
+ const marginBottom = margins.bottom ?? DEFAULT_MARGINS.bottom;
86991
+ const headerMargin = margins.header ?? 0;
86992
+ const footerMargin = margins.footer ?? 0;
86993
+ const headerContentSpace = Math.max(marginTop - headerMargin, 0);
86994
+ const footerContentSpace = Math.max(marginBottom - footerMargin, 0);
86995
+ const height = Math.max(headerContentSpace, footerContentSpace, 1);
86386
86996
  return {
86387
- width,
86997
+ width: measurementWidth,
86388
86998
  height,
86389
86999
  // Pass actual page dimensions for page-relative anchor positioning in headers/footers
86390
87000
  pageWidth: pageSize.w,
@@ -120324,6 +120934,7 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
120324
120934
  */
120325
120935
  toggleRuler: () => {
120326
120936
  this.superdoc.toggleRuler();
120937
+ this.updateToolbarState();
120327
120938
  },
120328
120939
  /**
120329
120940
  * Initiates the image upload process
@@ -120749,6 +121360,13 @@ const _SuperToolbar = class _SuperToolbar2 extends EventEmitter2 {
120749
121360
  item.activate();
120750
121361
  }
120751
121362
  }
121363
+ if (item.name.value === "ruler") {
121364
+ if (this.superdoc?.config?.rulers) {
121365
+ item.activate();
121366
+ } else {
121367
+ item.deactivate();
121368
+ }
121369
+ }
120752
121370
  });
120753
121371
  }
120754
121372
  /**
@@ -122209,8 +122827,12 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
122209
122827
  };
122210
122828
  }
122211
122829
  });
122212
- const _hoisted_1$4 = { class: "numbering" };
122830
+ const _hoisted_1$4 = {
122831
+ key: 0,
122832
+ class: "numbering"
122833
+ };
122213
122834
  const MIN_WIDTH = 200;
122835
+ const PPI = 96;
122214
122836
  const alignment = "flex-end";
122215
122837
  const _sfc_main$6 = {
122216
122838
  __name: "Ruler",
@@ -122233,7 +122855,7 @@ const _sfc_main$6 = {
122233
122855
  const emit = __emit;
122234
122856
  const props = __props;
122235
122857
  const ruler = ref$1(null);
122236
- const rulerDefinition = ref$1([]);
122858
+ const rulerDefinition = ref$1(null);
122237
122859
  const rulerHandleOriginalColor = ref$1("#CCCCCC");
122238
122860
  const rulerHandleActiveColor = ref$1("#2563EB66");
122239
122861
  const pageSize = ref$1(null);
@@ -122246,45 +122868,32 @@ const _sfc_main$6 = {
122246
122868
  const initialX = ref$1(0);
122247
122869
  let offsetX = 0;
122248
122870
  const initRuler = () => {
122249
- if (props.editor.options.mode !== "docx") return;
122250
- const rulerItems = [];
122871
+ if (props.editor.options.mode !== "docx") return null;
122251
122872
  const { pageMargins: docMargins, pageSize: docSize } = props.editor.getPageStyles();
122252
122873
  pageSize.value = docSize;
122253
122874
  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;
122875
+ const definition = generateRulerDefinition({
122876
+ pageSize: { width: docSize.width, height: docSize.height },
122877
+ pageMargins: {
122878
+ left: docMargins.left,
122879
+ right: docMargins.right,
122880
+ top: docMargins.top ?? 1,
122881
+ bottom: docMargins.bottom ?? 1
122882
+ }
122277
122883
  });
122884
+ leftHandle.x = definition.leftMarginPx;
122885
+ rightHandle.x = definition.rightMarginPx;
122886
+ return definition;
122278
122887
  };
122279
- const getStyle = computed(() => (unit) => {
122888
+ const getTickStyle = computed(() => (tick) => {
122280
122889
  return {
122890
+ position: "absolute",
122891
+ left: `${tick.x}px`,
122892
+ bottom: "0",
122281
122893
  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
122894
+ height: tick.height,
122895
+ backgroundColor: "#666",
122896
+ pointerEvents: "none"
122288
122897
  };
122289
122898
  });
122290
122899
  const getHandlePosition = computed(() => (side) => {
@@ -122296,7 +122905,8 @@ const _sfc_main$6 = {
122296
122905
  const getVerticalIndicatorStyle = computed(() => {
122297
122906
  if (!ruler.value) return;
122298
122907
  const parentElement = ruler.value.parentElement;
122299
- const editor = parentElement.querySelector(".super-editor");
122908
+ const editor = parentElement?.querySelector(".super-editor") ?? document.querySelector(".super-editor");
122909
+ if (!editor) return { left: `${currentHandle.value.x}px`, minHeight: "100%" };
122300
122910
  const editorBounds = editor.getBoundingClientRect();
122301
122911
  return {
122302
122912
  left: `${currentHandle.value.x}px`,
@@ -122313,22 +122923,11 @@ const _sfc_main$6 = {
122313
122923
  showVerticalIndicator.value = true;
122314
122924
  };
122315
122925
  const handleMouseMove2 = (event) => {
122316
- if (!isDragging.value) return;
122926
+ if (!isDragging.value || !pageSize.value) return;
122317
122927
  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
- }
122928
+ const pageWidthPx = pageSize.value.width * PPI;
122929
+ const otherHandleX = currentHandle.value.side === "left" ? rightHandle.x : leftHandle.x;
122930
+ currentHandle.value.x = clampHandlePosition(newLeft, currentHandle.value.side, otherHandleX, pageWidthPx, MIN_WIDTH);
122332
122931
  };
122333
122932
  const handleMouseUp = () => {
122334
122933
  isDragging.value = false;
@@ -122349,14 +122948,17 @@ const _sfc_main$6 = {
122349
122948
  rulerHandleOriginalColor.value = "#CCC";
122350
122949
  };
122351
122950
  const getNewMarginValue = () => {
122352
- if (currentHandle.value.side === "left") return currentHandle.value.x / 96;
122353
- else return (pageSize.value.width * 96 - currentHandle.value.x) / 96;
122951
+ if (!pageSize.value) return 0;
122952
+ const pageWidthPx = pageSize.value.width * PPI;
122953
+ return calculateMarginFromHandle(currentHandle.value.x, currentHandle.value.side, pageWidthPx, PPI);
122354
122954
  };
122355
122955
  const getStyleVars = computed(() => {
122956
+ const width = rulerDefinition.value?.widthPx ?? pageSize.value?.width * PPI ?? 816;
122356
122957
  return {
122357
122958
  "--alignment": alignment,
122358
122959
  "--ruler-handle-color": rulerHandleOriginalColor.value,
122359
- "--ruler-handle-active-color": rulerHandleActiveColor.value
122960
+ "--ruler-handle-active-color": rulerHandleActiveColor.value,
122961
+ "--ruler-width": `${width}px`
122360
122962
  };
122361
122963
  });
122362
122964
  onMounted(() => {
@@ -122392,32 +122994,20 @@ const _sfc_main$6 = {
122392
122994
  class: "vertical-indicator",
122393
122995
  style: normalizeStyle(getVerticalIndicatorStyle.value)
122394
122996
  }, null, 4)) : createCommentVNode("", true),
122395
- (openBlock(true), createElementBlock(Fragment$1, null, renderList(rulerDefinition.value, (unit) => {
122997
+ rulerDefinition.value ? (openBlock(true), createElementBlock(Fragment$1, { key: 1 }, renderList(rulerDefinition.value.ticks, (tick, index2) => {
122396
122998
  return openBlock(), createElementBlock("div", {
122397
- class: normalizeClass(unit.className),
122398
- style: normalizeStyle(getStyle.value(unit))
122999
+ key: index2,
123000
+ class: normalizeClass(["ruler-tick", `ruler-tick--${tick.size}`]),
123001
+ style: normalizeStyle(getTickStyle.value(tick))
122399
123002
  }, [
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))
123003
+ tick.label !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_1$4, toDisplayString(tick.label), 1)) : createCommentVNode("", true)
122414
123004
  ], 6);
122415
- }), 256))
123005
+ }), 128)) : createCommentVNode("", true)
122416
123006
  ], 4);
122417
123007
  };
122418
123008
  }
122419
123009
  };
122420
- const Ruler = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-79f9a944"]]);
123010
+ const Ruler = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-b9f4f30a"]]);
122421
123011
  const _sfc_main$5 = {
122422
123012
  __name: "GenericPopover",
122423
123013
  props: {
@@ -123598,7 +124188,7 @@ function adjustPaginationBreaks(editorElem, editor) {
123598
124188
  const BlankDOCX = "data:application/octet-stream;base64,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";
123599
124189
  const _hoisted_1$1 = { class: "super-editor-container" };
123600
124190
  const _hoisted_2 = {
123601
- key: 1,
124191
+ key: 2,
123602
124192
  class: "placeholder-editor"
123603
124193
  };
123604
124194
  const _hoisted_3 = { class: "placeholder-title" };
@@ -123643,6 +124233,19 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
123643
124233
  const active = activeEditor.value;
123644
124234
  return active?.options ? Boolean(active.options.disableContextMenu) : Boolean(props.options.disableContextMenu);
123645
124235
  });
124236
+ const rulersVisible = ref$1(Boolean(props.options.rulers));
124237
+ watch(
124238
+ () => props.options,
124239
+ (newOptions) => {
124240
+ const rulers = newOptions?.rulers;
124241
+ if (rulers && typeof rulers === "object" && "value" in rulers) {
124242
+ rulersVisible.value = Boolean(rulers.value);
124243
+ } else {
124244
+ rulersVisible.value = Boolean(rulers);
124245
+ }
124246
+ },
124247
+ { immediate: true, deep: true }
124248
+ );
123646
124249
  const message = useMessage();
123647
124250
  const editorWrapper = ref$1(null);
123648
124251
  const editorElem = ref$1(null);
@@ -124055,8 +124658,17 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124055
124658
  });
124056
124659
  return (_ctx, _cache) => {
124057
124660
  return openBlock(), createElementBlock("div", _hoisted_1$1, [
124058
- __props.options.rulers && !!activeEditor.value ? (openBlock(), createBlock(Ruler, {
124661
+ __props.options.rulerContainer && rulersVisible.value && !!activeEditor.value ? (openBlock(), createBlock(Teleport, {
124059
124662
  key: 0,
124663
+ to: __props.options.rulerContainer
124664
+ }, [
124665
+ createVNode(Ruler, {
124666
+ class: "ruler superdoc-ruler",
124667
+ editor: activeEditor.value,
124668
+ onMarginChange: handleMarginChange
124669
+ }, null, 8, ["editor"])
124670
+ ], 8, ["to"])) : rulersVisible.value && !!activeEditor.value ? (openBlock(), createBlock(Ruler, {
124671
+ key: 1,
124060
124672
  class: "ruler",
124061
124673
  editor: activeEditor.value,
124062
124674
  onMarginChange: handleMarginChange
@@ -124150,7 +124762,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124150
124762
  })
124151
124763
  ])) : createCommentVNode("", true),
124152
124764
  activeEditor.value ? (openBlock(), createBlock(GenericPopover, {
124153
- key: 2,
124765
+ key: 3,
124154
124766
  editor: activeEditor.value,
124155
124767
  visible: popoverControls.visible,
124156
124768
  position: popoverControls.position,
@@ -124165,7 +124777,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
124165
124777
  };
124166
124778
  }
124167
124779
  });
124168
- const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-a935d3e2"]]);
124780
+ const SuperEditor = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-cb3fe66f"]]);
124169
124781
  const _hoisted_1 = ["innerHTML"];
124170
124782
  const _sfc_main = {
124171
124783
  __name: "SuperInput",