@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.
- package/dist/chunks/{PdfViewer-4-HewDUK.cjs → PdfViewer-Dm3bZ_1B.cjs} +1 -1
- package/dist/chunks/{PdfViewer-C4HeazGQ.es.js → PdfViewer-rmkhzY1H.es.js} +1 -1
- package/dist/chunks/{index-BKfoD32c.es.js → index-5vPj3xiM.es.js} +13 -6
- package/dist/chunks/{index-9qSCXVF1.cjs → index-VQNmJYMh.cjs} +13 -6
- package/dist/chunks/{index-GAzIoyrZ-C17wg4bM.cjs → index-XOsGE2PW-BL-ekicF.cjs} +1 -1
- package/dist/chunks/{index-GAzIoyrZ-zhiF5zMK.es.js → index-XOsGE2PW-hNAnvmsK.es.js} +1 -1
- package/dist/chunks/{super-editor.es-CJ3Aw1GR.es.js → super-editor.es-BIEE4joF.es.js} +756 -144
- package/dist/chunks/{super-editor.es-DCHFBNql.cjs → super-editor.es-CxtR72x8.cjs} +756 -144
- package/dist/packages/superdoc/src/core/SuperDoc.d.ts.map +1 -1
- package/dist/style.css +44 -56
- package/dist/super-editor/ai-writer.es.js +2 -2
- package/dist/super-editor/chunks/{converter-DZ7Tkh7u.js → converter-Bo9KIIo_.js} +165 -47
- package/dist/super-editor/chunks/{docx-zipper-CZQWEuyi.js → docx-zipper-Cw0Rbwvk.js} +1 -1
- package/dist/super-editor/chunks/{editor-CDMuD1Nx.js → editor-v-i8Oo_X.js} +531 -36
- package/dist/super-editor/chunks/{index-GAzIoyrZ.js → index-XOsGE2PW.js} +1 -1
- package/dist/super-editor/chunks/{toolbar-DL3rTlKm.js → toolbar-CiKH0Ttu.js} +2 -2
- package/dist/super-editor/converter.es.js +1 -1
- package/dist/super-editor/docx-zipper.es.js +2 -2
- package/dist/super-editor/editor.es.js +3 -3
- package/dist/super-editor/file-zipper.es.js +1 -1
- package/dist/super-editor/style.css +17 -29
- package/dist/super-editor/super-editor.es.js +96 -94
- package/dist/super-editor/toolbar.es.js +2 -2
- package/dist/super-editor.cjs +1 -1
- package/dist/super-editor.es.js +1 -1
- package/dist/superdoc.cjs +2 -2
- package/dist/superdoc.es.js +2 -2
- package/dist/superdoc.umd.js +768 -149
- package/dist/superdoc.umd.js.map +1 -1
- 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
|
-
*
|
|
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
|
|
42131
|
-
if (!properties
|
|
42132
|
-
const property2 = properties.elements.find(
|
|
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
|
-
|
|
42151
|
-
|
|
42152
|
-
|
|
42153
|
-
|
|
42154
|
-
|
|
42155
|
-
|
|
42156
|
-
|
|
42157
|
-
|
|
42158
|
-
|
|
42159
|
-
|
|
42160
|
-
|
|
42161
|
-
|
|
42162
|
-
|
|
42163
|
-
|
|
42164
|
-
|
|
42165
|
-
|
|
42166
|
-
|
|
42167
|
-
|
|
42168
|
-
|
|
42169
|
-
|
|
42170
|
-
|
|
42171
|
-
|
|
42172
|
-
|
|
42173
|
-
|
|
42174
|
-
|
|
42175
|
-
name:
|
|
42176
|
-
|
|
42177
|
-
|
|
42178
|
-
|
|
42179
|
-
|
|
42180
|
-
|
|
42181
|
-
|
|
42182
|
-
|
|
42183
|
-
|
|
42184
|
-
|
|
42185
|
-
|
|
42186
|
-
|
|
42187
|
-
|
|
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.
|
|
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.
|
|
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-
|
|
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.
|
|
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
|
-
|
|
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)
|
|
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
|
|
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 } =
|
|
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
|
|
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
|
|
86381
|
-
if (!Number.isFinite(
|
|
86984
|
+
const bodyContentWidth = pageSize.w - (marginLeft + marginRight);
|
|
86985
|
+
if (!Number.isFinite(bodyContentWidth) || bodyContentWidth <= 0) {
|
|
86382
86986
|
return null;
|
|
86383
86987
|
}
|
|
86384
|
-
const
|
|
86385
|
-
const
|
|
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 = {
|
|
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
|
-
|
|
122255
|
-
|
|
122256
|
-
|
|
122257
|
-
|
|
122258
|
-
|
|
122259
|
-
|
|
122260
|
-
|
|
122261
|
-
|
|
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
|
|
122888
|
+
const getTickStyle = computed(() => (tick) => {
|
|
122280
122889
|
return {
|
|
122890
|
+
position: "absolute",
|
|
122891
|
+
left: `${tick.x}px`,
|
|
122892
|
+
bottom: "0",
|
|
122281
122893
|
width: "1px",
|
|
122282
|
-
|
|
122283
|
-
|
|
122284
|
-
|
|
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
|
-
|
|
122319
|
-
|
|
122320
|
-
|
|
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 (
|
|
122353
|
-
|
|
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,
|
|
122997
|
+
rulerDefinition.value ? (openBlock(true), createElementBlock(Fragment$1, { key: 1 }, renderList(rulerDefinition.value.ticks, (tick, index2) => {
|
|
122396
122998
|
return openBlock(), createElementBlock("div", {
|
|
122397
|
-
|
|
122398
|
-
|
|
122999
|
+
key: index2,
|
|
123000
|
+
class: normalizeClass(["ruler-tick", `ruler-tick--${tick.size}`]),
|
|
123001
|
+
style: normalizeStyle(getTickStyle.value(tick))
|
|
122399
123002
|
}, [
|
|
122400
|
-
|
|
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
|
-
}),
|
|
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-
|
|
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:
|
|
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.
|
|
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:
|
|
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-
|
|
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",
|