@superdoc-dev/cli 0.5.0-next.42 → 0.5.0-next.44

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 (2) hide show
  1. package/dist/index.js +1311 -543
  2. package/package.json +8 -8
package/dist/index.js CHANGED
@@ -1217,9 +1217,168 @@ function formatInlineAliasExpectedResult(key) {
1217
1217
  function projectFromDefinitions(fn) {
1218
1218
  return Object.fromEntries(OPERATION_IDS.map((id) => [id, fn(id, OPERATION_DEFINITIONS[id])]));
1219
1219
  }
1220
- var NONE_FAILURES, NONE_THROWS, T_NOT_FOUND, T_NOT_FOUND_CAPABLE, T_PLAN_ENGINE, T_NOT_FOUND_COMMAND, T_IMAGE_COMMAND, T_CC_READ, T_CC_MUTATION, T_CC_TYPED, T_CC_TYPED_READ, T_CC_RAW, T_QUERY_MATCH, T_SECTION_CREATE, T_SECTION_READ, T_PARAGRAPH_MUTATION, T_SECTION_MUTATION, T_SECTION_SETTINGS_MUTATION, T_HEADER_FOOTER_MUTATION, T_STORY, T_REF_READ_LIST, T_REF_MUTATION, T_REF_MUTATION_REMOVE, T_REF_INSERT, T_PROTECTION_READ, T_PROTECTION_MUTATION, T_PERM_RANGE_READ, T_PERM_RANGE_MUTATION, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS, OPERATION_DEFINITIONS, OPERATION_IDS, SINGLETON_OPERATION_IDS, NAMESPACED_OPERATION_IDS;
1220
+ var INTENT_GROUP_META, NONE_FAILURES, NONE_THROWS, T_NOT_FOUND, T_NOT_FOUND_CAPABLE, T_PLAN_ENGINE, T_NOT_FOUND_COMMAND, T_IMAGE_COMMAND, T_CC_READ, T_CC_MUTATION, T_CC_TYPED, T_CC_TYPED_READ, T_CC_RAW, T_QUERY_MATCH, T_SECTION_CREATE, T_SECTION_READ, T_PARAGRAPH_MUTATION, T_SECTION_MUTATION, T_SECTION_SETTINGS_MUTATION, T_HEADER_FOOTER_MUTATION, T_STORY, T_REF_READ_LIST, T_REF_MUTATION, T_REF_MUTATION_REMOVE, T_REF_INSERT, T_PROTECTION_READ, T_PROTECTION_MUTATION, T_PERM_RANGE_READ, T_PERM_RANGE_MUTATION, FORMAT_INLINE_ALIAS_OPERATION_DEFINITIONS, OPERATION_DEFINITIONS, OPERATION_IDS, SINGLETON_OPERATION_IDS, NAMESPACED_OPERATION_IDS;
1221
1221
  var init_operation_definitions = __esm(() => {
1222
1222
  init_inline_run_patch();
1223
+ INTENT_GROUP_META = {
1224
+ search: {
1225
+ toolName: "superdoc_search",
1226
+ description: "Refs expire after any mutation; always re-search before the next edit. " + "Find text patterns or nodes in the document and get ref handles for targeting edits and formatting. " + "Use this to locate content before calling superdoc_edit or superdoc_format. " + "Text search returns handle.ref covering only the matched substring. Node search finds blocks by type (paragraph, heading, table, listItem, etc.). " + 'The "require" parameter controls match cardinality: "first" returns one match, "all" returns every match, "exactlyOne" fails if not exactly one match. ' + 'Supports scoping via "within" to search inside a single block. ' + "Do NOT use regex or markdown formatting markers (#, **, etc.) in search patterns; patterns are plain text only. " + "Do NOT use this tool when you already have a ref from superdoc_get_content blocks or superdoc_create; use that ref directly.",
1227
+ inputExamples: [
1228
+ { select: { type: "text", pattern: "Introduction" }, require: "first" },
1229
+ { select: { type: "text", pattern: "total amount" }, require: "all" },
1230
+ { select: { type: "node", nodeType: "heading" }, require: "all" },
1231
+ {
1232
+ select: { type: "text", pattern: "contract" },
1233
+ within: { kind: "block", nodeType: "paragraph", nodeId: "abc123" },
1234
+ require: "first"
1235
+ }
1236
+ ]
1237
+ },
1238
+ get_content: {
1239
+ toolName: "superdoc_get_content",
1240
+ description: "Read document content in various formats. Call this first in any workflow to understand document structure before making edits. " + 'Action "blocks" returns structured block data with nodeId, nodeType, textPreview, formatting properties (fontFamily, fontSize, color, bold, underline, alignment), and ref handles for immediate use with superdoc_edit or superdoc_format. ' + 'Action "text" and "markdown" return the full document as plain text or Markdown. Action "html" returns HTML. ' + 'Action "info" returns document metadata: word count, paragraph count, page count, outline, available styles, and capability flags. ' + 'The "blocks" action supports pagination via "offset" and "limit", and filtering via "nodeTypes". Other actions ignore these parameters. ' + "This tool never modifies the document. " + "Do NOT call superdoc_edit or superdoc_format without first reading blocks to get valid refs and formatting reference values.",
1241
+ inputExamples: [
1242
+ { action: "blocks" },
1243
+ { action: "blocks", offset: 0, limit: 20, nodeTypes: ["heading", "paragraph"] },
1244
+ { action: "text" },
1245
+ { action: "info" }
1246
+ ]
1247
+ },
1248
+ edit: {
1249
+ toolName: "superdoc_edit",
1250
+ description: "Refs expire after any mutation; always re-search before the next edit. " + "Modify document text: insert new content, replace existing text, delete a range, or undo/redo. " + "Use this for single text modifications. For 2+ edits that must succeed or fail atomically, use superdoc_mutations instead. " + 'For replace and delete, pass a "ref" from superdoc_search or superdoc_get_content blocks. A search ref covers only the matched substring; a block ref covers the entire block text, so use block refs when rewriting or shortening whole paragraphs. ' + 'Insert supports plain text (default), markdown, or html via the "type" parameter. Use "placement" (before, after, insideStart, insideEnd) to control position relative to the target. ' + 'Supports "dryRun" to preview changes and "changeMode: tracked" to record edits as tracked changes. ' + 'Do NOT build "target" objects manually when a ref is available; prefer "ref" for simpler, more reliable targeting.',
1251
+ inputExamples: [
1252
+ { action: "replace", ref: "<handle.ref>", text: "new text here" },
1253
+ { action: "insert", value: "Appended paragraph.", placement: "insideEnd" },
1254
+ { action: "insert", ref: "<block.ref>", value: "Inserted before.", placement: "before" },
1255
+ { action: "delete", ref: "<handle.ref>" },
1256
+ { action: "undo" }
1257
+ ]
1258
+ },
1259
+ create: {
1260
+ toolName: "superdoc_create",
1261
+ description: "You MUST call superdoc_format after this tool to match document styling. " + "Create a single paragraph, heading, or table in the document. Returns a nodeId for chaining subsequent creates and for use as a block target in superdoc_format. " + 'When the user asks for a "heading", use action "heading" with a level (default 1). Use action "paragraph" only when the user asks for regular body text. ' + 'Before creating, call superdoc_get_content blocks to read formatting from regular body text paragraphs (non-empty, non-title blocks with alignment "justify" or "left"). ' + 'After creating, re-fetch blocks with superdoc_get_content to get a fresh ref for the new block, then apply TWO format calls: (1) superdoc_format action "inline" for character styling, AND (2) superdoc_format action "set_alignment" with the block target for paragraph alignment. Both calls are REQUIRED. ' + 'For body paragraphs: inline {bold:false, underline:false, fontFamily, fontSize, color from body blocks}, alignment "justify". Ignore underline:true from blocks data for body text; it is a style artifact. For headings: inline {bold:true, underline:true, fontSize scaled up, fontFamily, color}, alignment "center". ' + 'Position with "at": {kind:"documentEnd"} (default), {kind:"documentStart"}, or {kind:"after"/"before", target:{kind:"block", nodeType, nodeId}} for relative placement. ' + 'When creating multiple items in sequence, use the previous response nodeId as the next "at" target to maintain correct ordering. ' + 'Do NOT use newlines in "text" to create multiple paragraphs; call this tool separately for each one.',
1262
+ inputExamples: [
1263
+ { action: "paragraph", text: "New paragraph content.", at: { kind: "documentEnd" } },
1264
+ {
1265
+ action: "heading",
1266
+ text: "Section Title",
1267
+ level: 2,
1268
+ at: { kind: "after", target: { kind: "block", nodeType: "paragraph", nodeId: "<nodeId>" } }
1269
+ },
1270
+ {
1271
+ action: "paragraph",
1272
+ text: "Chained item.",
1273
+ at: { kind: "after", target: { kind: "block", nodeType: "paragraph", nodeId: "<previousNodeId>" } }
1274
+ },
1275
+ { action: "table", rows: 3, columns: 4, at: { kind: "documentEnd" } }
1276
+ ]
1277
+ },
1278
+ format: {
1279
+ toolName: "superdoc_format",
1280
+ description: "Change text and paragraph formatting. Use this after superdoc_create to style new content, or with a search ref to restyle existing text. " + 'Action "inline" applies character formatting (bold, italic, underline, color, fontSize, fontFamily, highlight, strike, vertAlign) to a text range via "ref". ' + 'Action "set_style" applies a named paragraph style by styleId (get available styles from superdoc_get_content info). ' + 'Actions "set_alignment", "set_indentation", "set_spacing", "set_direction", and "set_flow_options" change paragraph-level properties and require a block target: {kind:"block", nodeType:"paragraph", nodeId:"<nodeId>"}, NOT a ref. ' + 'Use "set_flow_options" with pageBreakBefore:true to start a paragraph on a new page. ' + 'Supports "dryRun" and "changeMode: tracked" for inline formatting. Paragraph-level actions do NOT support tracked changes. ' + "Do NOT use a search ref for paragraph-level actions; they require a block target with nodeId. " + 'Do NOT use {kind:"block", start:{kind:"nodeEdge",...}} or selection-like structures for paragraph actions. ONLY {kind:"block", nodeType, nodeId} is accepted. ' + "Do NOT issue multiple superdoc_format calls in parallel; each call invalidates refs for subsequent calls. Format one block at a time. " + "Do NOT hardcode formatting values; always read them from superdoc_get_content blocks and replicate.",
1281
+ inputExamples: [
1282
+ { action: "inline", ref: "<handle.ref>", inline: { bold: true } },
1283
+ {
1284
+ action: "inline",
1285
+ ref: "<create.ref>",
1286
+ inline: { fontFamily: "Calibri", fontSize: 11, color: "#000000", bold: false }
1287
+ },
1288
+ {
1289
+ action: "set_alignment",
1290
+ target: { kind: "block", nodeType: "paragraph", nodeId: "<nodeId>" },
1291
+ alignment: "center"
1292
+ },
1293
+ {
1294
+ action: "set_flow_options",
1295
+ target: { kind: "block", nodeType: "paragraph", nodeId: "<nodeId>" },
1296
+ pageBreakBefore: true
1297
+ },
1298
+ {
1299
+ action: "set_spacing",
1300
+ target: { kind: "block", nodeType: "paragraph", nodeId: "<nodeId>" },
1301
+ lineSpacing: { rule: "auto", value: 1.5 }
1302
+ }
1303
+ ]
1304
+ },
1305
+ table: { toolName: "superdoc_table", description: "Table structure and cell operations" },
1306
+ list: {
1307
+ toolName: "superdoc_list",
1308
+ description: "Create and manipulate bullet and numbered lists. " + 'To create a list: first create all paragraphs at the SAME location using superdoc_create (chain each using the previous nodeId as the "at" target). ' + 'Then call action "create" with mode:"fromParagraphs", a preset ("disc" for bullet, "decimal" for numbered), and a range target: {from:{kind:"block", nodeType:"paragraph", nodeId:"<first>"}, to:{kind:"block", nodeType:"paragraph", nodeId:"<last>"}}. ' + "The range converts ALL paragraphs between from and to into list items. Make sure no other content exists between them. " + 'Action "set_type" converts between bullet and ordered (target any item in the list, kind:"ordered" or "bullet"). ' + 'Action "insert" adds a new item before/after a target list item. ' + 'Actions "indent" and "outdent" change nesting level; "set_level" jumps to a specific level (0-8). ' + 'Action "detach" converts a list item back to a plain paragraph. ' + "Do NOT target paragraphs with indent/outdent/set_type; these actions require a listItem target.",
1309
+ inputExamples: [
1310
+ {
1311
+ action: "create",
1312
+ mode: "fromParagraphs",
1313
+ preset: "disc",
1314
+ target: {
1315
+ from: { kind: "block", nodeType: "paragraph", nodeId: "<firstId>" },
1316
+ to: { kind: "block", nodeType: "paragraph", nodeId: "<lastId>" }
1317
+ }
1318
+ },
1319
+ { action: "set_type", target: { kind: "block", nodeType: "listItem", nodeId: "<itemId>" }, kind: "ordered" },
1320
+ {
1321
+ action: "insert",
1322
+ target: { kind: "block", nodeType: "listItem", nodeId: "<itemId>" },
1323
+ position: "after",
1324
+ text: "New list item"
1325
+ },
1326
+ { action: "indent", target: { kind: "block", nodeType: "listItem", nodeId: "<itemId>" } }
1327
+ ]
1328
+ },
1329
+ comment: {
1330
+ toolName: "superdoc_comment",
1331
+ description: "Manage document comment threads: create, read, update, and delete. " + 'To create a comment, first use superdoc_search to find the target text, then pass action "create" with the comment text and a target: {kind:"text", blockId:"<blockId>", range:{start:<N>, end:<N>}} using the blockId and highlightRange from the search result. ' + 'For threaded replies, pass "parentId" with the parent comment ID. ' + 'Action "list" returns all comments with optional pagination (limit, offset) and filtering (includeResolved:true to include resolved). ' + 'Action "get" retrieves a single comment by ID. Action "update" changes status to "resolved" or marks as internal. Action "delete" removes a comment or reply by ID. ' + 'Do NOT pass "ref", "id", or "parentId" when creating a new top-level comment; only "action", "text", and "target" are needed.',
1332
+ inputExamples: [
1333
+ {
1334
+ action: "create",
1335
+ text: "Please review this section.",
1336
+ target: { kind: "text", blockId: "<blockId>", range: { start: 5, end: 25 } }
1337
+ },
1338
+ { action: "list", limit: 20, offset: 0 },
1339
+ { action: "update", id: "<commentId>", status: "resolved" },
1340
+ { action: "delete", id: "<commentId>" }
1341
+ ]
1342
+ },
1343
+ track_changes: {
1344
+ toolName: "superdoc_track_changes",
1345
+ description: "Review and resolve tracked changes (insertions, deletions, format changes) in the document. " + 'Action "list" returns all tracked changes with optional filtering by type (insert, delete, format) and pagination (limit, offset). Each change includes an ID, type, author, timestamp, and content preview. ' + 'Action "decide" accepts or rejects changes. Pass decision:"accept" to apply the change permanently, or decision:"reject" to discard it. ' + 'Target a single change with {id:"<changeId>"} or all changes at once with {scope:"all"}. ' + "Do NOT use this tool unless the document has tracked changes. Use superdoc_get_content info to check the tracked change count first.",
1346
+ inputExamples: [
1347
+ { action: "list" },
1348
+ { action: "list", type: "insert", limit: 10 },
1349
+ { action: "decide", decision: "accept", target: { id: "<changeId>" } },
1350
+ { action: "decide", decision: "reject", target: { scope: "all" } }
1351
+ ]
1352
+ },
1353
+ link: { toolName: "superdoc_link", description: "Manage hyperlinks" },
1354
+ image: { toolName: "superdoc_image", description: "Image placement and properties" },
1355
+ section: { toolName: "superdoc_section", description: "Page layout, margins, columns" },
1356
+ mutations: {
1357
+ toolName: "superdoc_mutations",
1358
+ description: "All steps succeed or all fail; no partial application. " + "Execute multiple text edits atomically in a single batch. Use this INSTEAD OF multiple sequential superdoc_edit calls when you need 2+ text changes that should succeed or fail together. " + 'Each step has an id (e.g. "s1"), an op (text.rewrite, text.insert, text.delete, format.apply, assert), a "where" clause for targeting ({by:"select", select:{...}, require:"first"|"exactlyOne"|"all"} or {by:"ref", ref:"..."}), and "args" with operation-specific parameters. ' + 'Action "preview" dry-runs the plan without modifying the document. Action "apply" executes it. ' + "CRITICAL: split mutations by phase. Text mutations (text.rewrite, text.insert, text.delete) go in one call. Formatting (format.apply) goes in a separate call with fresh refs from a new superdoc_search. " + "Do NOT create two steps that target overlapping text in the same block; combine them into a single text.rewrite step. Overlapping steps fail with PLAN_CONFLICT_OVERLAP. " + "Do NOT use this for single edits; use superdoc_edit instead. " + "Do NOT mix text mutations and formatting in the same call.",
1359
+ inputExamples: [
1360
+ {
1361
+ action: "apply",
1362
+ atomic: true,
1363
+ changeMode: "direct",
1364
+ steps: [
1365
+ {
1366
+ id: "s1",
1367
+ op: "text.rewrite",
1368
+ where: { by: "select", select: { type: "text", pattern: "old term" }, require: "all" },
1369
+ args: { replacement: { text: "new term" } }
1370
+ },
1371
+ {
1372
+ id: "s2",
1373
+ op: "text.delete",
1374
+ where: { by: "select", select: { type: "text", pattern: " (deprecated)" }, require: "all" },
1375
+ args: {}
1376
+ }
1377
+ ]
1378
+ }
1379
+ ]
1380
+ }
1381
+ };
1223
1382
  NONE_FAILURES = [];
1224
1383
  NONE_THROWS = [];
1225
1384
  T_NOT_FOUND = ["TARGET_NOT_FOUND"];
@@ -2151,7 +2310,9 @@ var init_operation_definitions = __esm(() => {
2151
2310
  throws: T_PARAGRAPH_MUTATION
2152
2311
  }),
2153
2312
  referenceDocPath: "format/paragraph/set-flow-options.mdx",
2154
- referenceGroup: "format.paragraph"
2313
+ referenceGroup: "format.paragraph",
2314
+ intentGroup: "format",
2315
+ intentAction: "set_flow_options"
2155
2316
  },
2156
2317
  "format.paragraph.setTabStop": {
2157
2318
  memberPath: "format.paragraph.setTabStop",
@@ -3055,7 +3216,9 @@ var init_operation_definitions = __esm(() => {
3055
3216
  throws: [...T_NOT_FOUND_COMMAND, "INVALID_TARGET", "AMBIGUOUS_TARGET"]
3056
3217
  }),
3057
3218
  referenceDocPath: "create/table.mdx",
3058
- referenceGroup: "create"
3219
+ referenceGroup: "create",
3220
+ intentGroup: "create",
3221
+ intentAction: "table"
3059
3222
  },
3060
3223
  "tables.convertFromText": {
3061
3224
  memberPath: "tables.convertFromText",
@@ -7469,7 +7632,7 @@ function optionalTargetLocatorWithPayload(payloadProperties, payloadRequired = [
7469
7632
  objectSchema({
7470
7633
  ref: {
7471
7634
  type: "string",
7472
- description: "Handle ref string returned by a prior search/query result."
7635
+ description: "Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object."
7473
7636
  },
7474
7637
  ...payloadProperties
7475
7638
  }, ["ref", ...payloadRequired]),
@@ -8386,13 +8549,21 @@ var init_schemas = __esm(() => {
8386
8549
  success: { const: true },
8387
8550
  paragraph: paragraphAddressSchema,
8388
8551
  insertionPoint: textAddressSchema,
8389
- trackedChangeRefs: arraySchema(trackChangeRefSchema)
8552
+ trackedChangeRefs: arraySchema(trackChangeRefSchema),
8553
+ ref: {
8554
+ type: "string",
8555
+ description: "Ref handle for the created block. Pass directly to superdoc_format or superdoc_edit ref param without searching."
8556
+ }
8390
8557
  }, ["success", "paragraph", "insertionPoint"]);
8391
8558
  createHeadingSuccessSchema = objectSchema({
8392
8559
  success: { const: true },
8393
8560
  heading: headingAddressSchema,
8394
8561
  insertionPoint: textAddressSchema,
8395
- trackedChangeRefs: arraySchema(trackChangeRefSchema)
8562
+ trackedChangeRefs: arraySchema(trackChangeRefSchema),
8563
+ ref: {
8564
+ type: "string",
8565
+ description: "Ref handle for the created block. Pass directly to superdoc_format or superdoc_edit ref param without searching."
8566
+ }
8396
8567
  }, ["success", "heading", "insertionPoint"]);
8397
8568
  headingLevelSchema = { type: "integer", minimum: 1, maximum: 6 };
8398
8569
  listsInsertSuccessSchema = objectSchema({
@@ -9492,8 +9663,13 @@ var init_schemas = __esm(() => {
9492
9663
  fontFamily: { type: "string", description: "Font family from first text run." },
9493
9664
  fontSize: { type: "number", description: "Font size from first text run." },
9494
9665
  bold: { type: "boolean", description: "True if text is bold." },
9666
+ color: { type: "string", description: "Text color when explicitly set (e.g. '#000000')." },
9495
9667
  alignment: { type: "string", description: "Paragraph alignment." },
9496
- headingLevel: { type: "number", description: "Heading level (1-6)." }
9668
+ headingLevel: { type: "number", description: "Heading level (1-6)." },
9669
+ ref: {
9670
+ type: "string",
9671
+ description: "Ref handle for this block. Pass directly to superdoc_format or superdoc_edit ref param. Only present for non-empty blocks."
9672
+ }
9497
9673
  }, ["ordinal", "nodeId", "nodeType"])
9498
9674
  },
9499
9675
  revision: { type: "string" }
@@ -15031,6 +15207,23 @@ var init_create = __esm(() => {
15031
15207
  });
15032
15208
 
15033
15209
  // ../../packages/document-api/src/blocks/blocks.ts
15210
+ function normalizeBlocksListInput(input) {
15211
+ if (!input)
15212
+ return input;
15213
+ if (input.limit != null && input.limit === 0) {
15214
+ const { limit: _, ...rest } = input;
15215
+ input = Object.keys(rest).length > 0 ? rest : undefined;
15216
+ if (!input)
15217
+ return input;
15218
+ }
15219
+ if (Array.isArray(input.nodeTypes) && input.nodeTypes.length === 0) {
15220
+ const { nodeTypes: _, ...rest } = input;
15221
+ input = Object.keys(rest).length > 0 ? rest : undefined;
15222
+ if (!input)
15223
+ return input;
15224
+ }
15225
+ return input;
15226
+ }
15034
15227
  function validateBlocksListInput(input) {
15035
15228
  if (!input)
15036
15229
  return;
@@ -15125,8 +15318,9 @@ function validateBlocksDeleteRangeInput(input) {
15125
15318
  validateBlockNodeAddress(input.end, "end");
15126
15319
  }
15127
15320
  function executeBlocksList(adapter, input) {
15128
- validateBlocksListInput(input);
15129
- return adapter.list(input);
15321
+ const normalized = normalizeBlocksListInput(input);
15322
+ validateBlocksListInput(normalized);
15323
+ return adapter.list(normalized);
15130
15324
  }
15131
15325
  function executeBlocksDelete(adapter, input, options) {
15132
15326
  validateBlocksDeleteInput(input);
@@ -65039,7 +65233,7 @@ var init_remark_gfm_BUJjZJLy_es = __esm(() => {
65039
65233
  emptyOptions2 = {};
65040
65234
  });
65041
65235
 
65042
- // ../../packages/superdoc/dist/chunks/SuperConverter-C6rVgqDZ.es.js
65236
+ // ../../packages/superdoc/dist/chunks/SuperConverter-DerEPM5g.es.js
65043
65237
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
65044
65238
  const fieldValue = extension$1.config[field];
65045
65239
  if (typeof fieldValue === "function")
@@ -66850,7 +67044,7 @@ function optionalTargetLocatorWithPayload2(payloadProperties, payloadRequired =
66850
67044
  objectSchema2({
66851
67045
  ref: {
66852
67046
  type: "string",
66853
- description: "Handle ref string returned by a prior search/query result."
67047
+ description: "Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object."
66854
67048
  },
66855
67049
  ...payloadProperties
66856
67050
  }, ["ref", ...payloadRequired]),
@@ -69277,6 +69471,23 @@ function executeCreateTableOfContents2(adapter, input, options) {
69277
69471
  };
69278
69472
  return adapter.tableOfContents(normalized, normalizeMutationOptions2(options));
69279
69473
  }
69474
+ function normalizeBlocksListInput2(input) {
69475
+ if (!input)
69476
+ return input;
69477
+ if (input.limit != null && input.limit === 0) {
69478
+ const { limit: _, ...rest } = input;
69479
+ input = Object.keys(rest).length > 0 ? rest : undefined;
69480
+ if (!input)
69481
+ return input;
69482
+ }
69483
+ if (Array.isArray(input.nodeTypes) && input.nodeTypes.length === 0) {
69484
+ const { nodeTypes: _, ...rest } = input;
69485
+ input = Object.keys(rest).length > 0 ? rest : undefined;
69486
+ if (!input)
69487
+ return input;
69488
+ }
69489
+ return input;
69490
+ }
69280
69491
  function validateBlocksListInput2(input) {
69281
69492
  if (!input)
69282
69493
  return;
@@ -69334,8 +69545,9 @@ function validateBlocksDeleteRangeInput2(input) {
69334
69545
  validateBlockNodeAddress2(input.end, "end");
69335
69546
  }
69336
69547
  function executeBlocksList2(adapter, input) {
69337
- validateBlocksListInput2(input);
69338
- return adapter.list(input);
69548
+ const normalized = normalizeBlocksListInput2(input);
69549
+ validateBlocksListInput2(normalized);
69550
+ return adapter.list(normalized);
69339
69551
  }
69340
69552
  function executeBlocksDelete2(adapter, input, options) {
69341
69553
  validateBlocksDeleteInput2(input);
@@ -85929,18 +86141,21 @@ function sanitizeHtml(html2, forbiddenTags = [
85929
86141
  }
85930
86142
  const container = resolvedDocument.createElement("div");
85931
86143
  container.innerHTML = html2;
86144
+ const domNode = resolvedDocument.defaultView?.Node ?? globalThis.Node;
86145
+ const COMMENT_NODE = domNode?.COMMENT_NODE ?? 8;
86146
+ const ELEMENT_NODE = domNode?.ELEMENT_NODE ?? 1;
85932
86147
  const stripWordListConditionalPrefixes = (root2) => {
85933
86148
  const stripFromNode = (node3) => {
85934
86149
  if (!node3?.childNodes)
85935
86150
  return;
85936
86151
  for (let i$1 = 0;i$1 < node3.childNodes.length; i$1 += 1) {
85937
86152
  const current = node3.childNodes[i$1];
85938
- if (current?.nodeType === Node.COMMENT_NODE && current.nodeValue?.includes("[if !supportLists]")) {
86153
+ if (current?.nodeType === COMMENT_NODE && current.nodeValue?.includes("[if !supportLists]")) {
85939
86154
  const nodesToStrip = [];
85940
86155
  let endifComment = null;
85941
86156
  for (let j = i$1 + 1;j < node3.childNodes.length; j += 1) {
85942
86157
  const next = node3.childNodes[j];
85943
- if (next?.nodeType === Node.COMMENT_NODE && next.nodeValue?.includes("[endif]")) {
86158
+ if (next?.nodeType === COMMENT_NODE && next.nodeValue?.includes("[endif]")) {
85944
86159
  endifComment = next;
85945
86160
  break;
85946
86161
  }
@@ -85958,7 +86173,7 @@ function sanitizeHtml(html2, forbiddenTags = [
85958
86173
  i$1 -= 1;
85959
86174
  continue;
85960
86175
  }
85961
- if (current?.nodeType === Node.ELEMENT_NODE)
86176
+ if (current?.nodeType === ELEMENT_NODE)
85962
86177
  stripFromNode(current);
85963
86178
  }
85964
86179
  };
@@ -86293,16 +86508,18 @@ function hasPreservableContent(element, knownTags) {
86293
86508
  function createDocFromHTML(content$2, editor, options = {}) {
86294
86509
  const { isImport = false } = options;
86295
86510
  let parsedContent;
86511
+ let domDocument = options.document ?? editor?.options?.document ?? editor?.options?.mockDocument ?? (typeof document !== "undefined" ? document : null);
86296
86512
  if (typeof content$2 === "string") {
86297
- const domDocument = options.document ?? editor?.options?.document ?? editor?.options?.mockDocument ?? (typeof document !== "undefined" ? document : null);
86298
86513
  const tempDiv = htmlHandler(stripHtmlStyles(content$2, domDocument), editor, domDocument);
86299
86514
  if (isImport)
86300
86515
  tempDiv.dataset.superdocImport = "true";
86301
86516
  parsedContent = tempDiv;
86302
86517
  } else
86303
86518
  parsedContent = content$2;
86304
- if ((options.onUnsupportedContent || options.warnOnUnsupportedContent) && parsedContent instanceof globalThis.Element) {
86305
- const unsupported = detectUnsupportedContent(parsedContent, editor.schema);
86519
+ const domElement = parsedContent?.ownerDocument?.defaultView?.Element ?? domDocument?.defaultView?.Element ?? globalThis.Element;
86520
+ const parsedElement = (options.onUnsupportedContent || options.warnOnUnsupportedContent) && domElement && parsedContent instanceof domElement ? parsedContent : null;
86521
+ if (parsedElement) {
86522
+ const unsupported = detectUnsupportedContent(parsedElement, editor.schema);
86306
86523
  if (unsupported.length > 0)
86307
86524
  if (options.onUnsupportedContent)
86308
86525
  options.onUnsupportedContent(unsupported);
@@ -116546,7 +116763,7 @@ var isRegExp = (value) => {
116546
116763
  if (id2)
116547
116764
  return trackedChanges.filter(({ mark }) => mark.attrs.id === id2);
116548
116765
  return trackedChanges;
116549
- }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", VALID_CONTROL_TYPES, VALID_LOCK_MODES2, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.23.0", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
116766
+ }, DERIVED_ID_LENGTH = 24, groupedCache, SDT_NODE_NAMES, SDT_BLOCK_NAME = "structuredContentBlock", VALID_CONTROL_TYPES, VALID_LOCK_MODES2, VALID_APPEARANCES, FIELD_LIKE_SDT_TYPES, liveDocumentCountsCache, BIBLIOGRAPHY_NAMESPACE_URI = "http://schemas.openxmlformats.org/officeDocument/2006/bibliography", CUSTOM_XML_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml", CUSTOM_XML_PROPS_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps", DEFAULT_SELECTED_STYLE = "/APA.XSL", DEFAULT_STYLE_NAME = "APA", DEFAULT_VERSION = "6", API_TO_OOXML_SOURCE_TYPE, OOXML_TO_API_SOURCE_TYPE, SIMPLE_FIELD_TO_XML_TAG, XML_TAG_TO_SIMPLE_FIELD, import_lib2, FONT_FAMILY_FALLBACKS, DEFAULT_GENERIC_FALLBACK = "sans-serif", DEFAULT_FONT_SIZE_PT = 10, CURRENT_APP_VERSION = "1.23.1", collectRunDefaultProperties = (runProps, { allowOverrideTypeface = true, allowOverrideSize = true, themeResolver, state }) => {
116550
116767
  if (!runProps?.elements?.length || !state)
116551
116768
  return;
116552
116769
  const fontsNode = runProps.elements.find((el) => el.name === "w:rFonts");
@@ -116580,7 +116797,7 @@ var isRegExp = (value) => {
116580
116797
  state.kern = kernNode.attributes["w:val"];
116581
116798
  }
116582
116799
  }, SuperConverter;
116583
- var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
116800
+ var init_SuperConverter_DerEPM5g_es = __esm(() => {
116584
116801
  init_rolldown_runtime_B2q5OVn9_es();
116585
116802
  init_jszip_ChlR43oI_es();
116586
116803
  init_xml_js_40FWvL78_es();
@@ -120525,7 +120742,9 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
120525
120742
  throws: T_PARAGRAPH_MUTATION2
120526
120743
  }),
120527
120744
  referenceDocPath: "format/paragraph/set-flow-options.mdx",
120528
- referenceGroup: "format.paragraph"
120745
+ referenceGroup: "format.paragraph",
120746
+ intentGroup: "format",
120747
+ intentAction: "set_flow_options"
120529
120748
  },
120530
120749
  "format.paragraph.setTabStop": {
120531
120750
  memberPath: "format.paragraph.setTabStop",
@@ -121622,7 +121841,9 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
121622
121841
  ]
121623
121842
  }),
121624
121843
  referenceDocPath: "create/table.mdx",
121625
- referenceGroup: "create"
121844
+ referenceGroup: "create",
121845
+ intentGroup: "create",
121846
+ intentAction: "table"
121626
121847
  },
121627
121848
  "tables.convertFromText": {
121628
121849
  memberPath: "tables.convertFromText",
@@ -126141,7 +126362,11 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
126141
126362
  success: { const: true },
126142
126363
  paragraph: paragraphAddressSchema2,
126143
126364
  insertionPoint: textAddressSchema2,
126144
- trackedChangeRefs: arraySchema2(trackChangeRefSchema2)
126365
+ trackedChangeRefs: arraySchema2(trackChangeRefSchema2),
126366
+ ref: {
126367
+ type: "string",
126368
+ description: "Ref handle for the created block. Pass directly to superdoc_format or superdoc_edit ref param without searching."
126369
+ }
126145
126370
  }, [
126146
126371
  "success",
126147
126372
  "paragraph",
@@ -126151,7 +126376,11 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
126151
126376
  success: { const: true },
126152
126377
  heading: headingAddressSchema2,
126153
126378
  insertionPoint: textAddressSchema2,
126154
- trackedChangeRefs: arraySchema2(trackChangeRefSchema2)
126379
+ trackedChangeRefs: arraySchema2(trackChangeRefSchema2),
126380
+ ref: {
126381
+ type: "string",
126382
+ description: "Ref handle for the created block. Pass directly to superdoc_format or superdoc_edit ref param without searching."
126383
+ }
126155
126384
  }, [
126156
126385
  "success",
126157
126386
  "heading",
@@ -127664,6 +127893,10 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
127664
127893
  type: "boolean",
127665
127894
  description: "True if text is bold."
127666
127895
  },
127896
+ color: {
127897
+ type: "string",
127898
+ description: "Text color when explicitly set (e.g. '#000000')."
127899
+ },
127667
127900
  alignment: {
127668
127901
  type: "string",
127669
127902
  description: "Paragraph alignment."
@@ -127671,6 +127904,10 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
127671
127904
  headingLevel: {
127672
127905
  type: "number",
127673
127906
  description: "Heading level (1-6)."
127907
+ },
127908
+ ref: {
127909
+ type: "string",
127910
+ description: "Ref handle for this block. Pass directly to superdoc_format or superdoc_edit ref param. Only present for non-empty blocks."
127674
127911
  }
127675
127912
  }, [
127676
127913
  "ordinal",
@@ -173461,7 +173698,7 @@ var init_remark_gfm_DCND_V_3_es = __esm(() => {
173461
173698
  init_remark_gfm_BUJjZJLy_es();
173462
173699
  });
173463
173700
 
173464
- // ../../packages/superdoc/dist/chunks/src-fbRRkK8t.es.js
173701
+ // ../../packages/superdoc/dist/chunks/src-sJ2EXqLW.es.js
173465
173702
  function deleteProps(obj, propOrProps) {
173466
173703
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
173467
173704
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -174098,7 +174335,7 @@ function prosemirrorToYXmlFragment(doc$12, xmlFragment) {
174098
174335
  }
174099
174336
  function getSuperdocVersion() {
174100
174337
  try {
174101
- return "1.23.0";
174338
+ return "1.23.1";
174102
174339
  } catch {
174103
174340
  return "unknown";
174104
174341
  }
@@ -176153,6 +176390,39 @@ function tableSeparatorNeeds$1(doc$12, pos) {
176153
176390
  after: !nodeAfter || nodeAfter.type.name === "table"
176154
176391
  };
176155
176392
  }
176393
+ function computeParagraphContentBounds(paragraphPos, paragraphNode) {
176394
+ if (!Number.isFinite(paragraphPos) || !paragraphNode || !Number.isFinite(paragraphNode.nodeSize))
176395
+ return null;
176396
+ let from$1 = paragraphPos + 1;
176397
+ let to = paragraphPos + paragraphNode.nodeSize - 1;
176398
+ if (paragraphNode.firstChild?.type?.name === "run")
176399
+ from$1 = paragraphPos + 2;
176400
+ if (paragraphNode.lastChild?.type?.name === "run")
176401
+ to = paragraphPos + paragraphNode.nodeSize - 2;
176402
+ if (to < from$1)
176403
+ to = from$1;
176404
+ return {
176405
+ from: from$1,
176406
+ to
176407
+ };
176408
+ }
176409
+ function computeToggleListSelectionRange({ selectionWasCollapsed, affectedParagraphCount, firstParagraphPos, lastParagraphPos, firstNode, lastNode }) {
176410
+ if (affectedParagraphCount <= 0)
176411
+ return null;
176412
+ const firstBounds = computeParagraphContentBounds(firstParagraphPos, firstNode);
176413
+ const lastBounds = computeParagraphContentBounds(lastParagraphPos, lastNode);
176414
+ if (!firstBounds || !lastBounds)
176415
+ return null;
176416
+ if (selectionWasCollapsed && affectedParagraphCount === 1)
176417
+ return {
176418
+ from: lastBounds.to,
176419
+ to: lastBounds.to
176420
+ };
176421
+ return {
176422
+ from: firstBounds.from,
176423
+ to: lastBounds.to
176424
+ };
176425
+ }
176156
176426
  function numFmtIsBullet(numFmt) {
176157
176427
  if (numFmt == null)
176158
176428
  return false;
@@ -182066,10 +182336,11 @@ function replaceCommand(wrap5, moveForward) {
182066
182336
  return true;
182067
182337
  };
182068
182338
  }
182069
- function buildInlineImagePmSelector(pmStart) {
182070
- const v = String(pmStart);
182071
- const attr = DATA_ATTRS.PM_START;
182072
- return [`.${DOM_CLASS_NAMES.INLINE_IMAGE_CLIP_WRAPPER}[${attr}="${v}"]`, `.${DOM_CLASS_NAMES.INLINE_IMAGE}[${attr}="${v}"]`].join(", ");
182339
+ function buildSdtBlockSelector(escapedSdtId) {
182340
+ return `.${DOM_CLASS_NAMES.BLOCK_SDT}[${DATA_ATTRS.SDT_ID}="${escapedSdtId}"]`;
182341
+ }
182342
+ function buildAnnotationSelector() {
182343
+ return `.${DOM_CLASS_NAMES.ANNOTATION}[${DATA_ATTRS.PM_START}]`;
182073
182344
  }
182074
182345
  function isPresenting(editor) {
182075
182346
  const presentationCtx = editor?.presentationEditor;
@@ -195810,6 +196081,21 @@ function collectTrackInsertRefsInRange(editor, from$1, to) {
195810
196081
  entityId: id2
195811
196082
  }));
195812
196083
  }
196084
+ function mintBlockRef(editor, storyKey, nodeId, textLength) {
196085
+ return encodeV4Ref({
196086
+ v: 4,
196087
+ rev: getRevision(editor),
196088
+ storyKey,
196089
+ scope: "block",
196090
+ matchId: `create:${nodeId}`,
196091
+ segments: [{
196092
+ blockId: nodeId,
196093
+ start: 0,
196094
+ end: textLength
196095
+ }],
196096
+ blockIndex: 0
196097
+ });
196098
+ }
195813
196099
  function resolveCreateInsertPosition(editor, at) {
195814
196100
  const location$1 = at ?? { kind: "documentEnd" };
195815
196101
  if (location$1.kind === "documentStart")
@@ -195837,7 +196123,7 @@ function resolveCreatedBlock(editor, nodeType, blockId) {
195837
196123
  return fallback;
195838
196124
  throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Created ${nodeType} could not be resolved after insertion.`, { [`${nodeType}Id`]: blockId });
195839
196125
  }
195840
- function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story) {
196126
+ function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story, ref$1) {
195841
196127
  return {
195842
196128
  success: true,
195843
196129
  paragraph: {
@@ -195855,10 +196141,11 @@ function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story)
195855
196141
  },
195856
196142
  ...story && { story }
195857
196143
  },
195858
- trackedChangeRefs
196144
+ trackedChangeRefs,
196145
+ ...ref$1 ? { ref: ref$1 } : {}
195859
196146
  };
195860
196147
  }
195861
- function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story) {
196148
+ function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story, ref$1) {
195862
196149
  return {
195863
196150
  success: true,
195864
196151
  heading: {
@@ -195876,7 +196163,8 @@ function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story) {
195876
196163
  },
195877
196164
  ...story && { story }
195878
196165
  },
195879
- trackedChangeRefs
196166
+ trackedChangeRefs,
196167
+ ...ref$1 ? { ref: ref$1 } : {}
195880
196168
  };
195881
196169
  }
195882
196170
  function createParagraphWrapper(editor, input2, options) {
@@ -195952,7 +196240,9 @@ function createParagraphWrapper(editor, input2, options) {
195952
196240
  if (runtime.commit)
195953
196241
  runtime.commit(editor);
195954
196242
  const nonBodyStory = runtime.kind !== "body" ? runtime.locator : undefined;
195955
- return buildParagraphCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory);
196243
+ const textLen = input2.text?.length ?? 0;
196244
+ const ref$1 = textLen > 0 ? mintBlockRef(storyEditor, runtime.storyKey, canonicalId, textLen) : undefined;
196245
+ return buildParagraphCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory, ref$1);
195956
196246
  } finally {
195957
196247
  disposeEphemeralWriteRuntime(runtime);
195958
196248
  }
@@ -196032,7 +196322,9 @@ function createHeadingWrapper(editor, input2, options) {
196032
196322
  if (runtime.commit)
196033
196323
  runtime.commit(editor);
196034
196324
  const nonBodyStory = runtime.kind !== "body" ? runtime.locator : undefined;
196035
- return buildHeadingCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory);
196325
+ const textLen = input2.text?.length ?? 0;
196326
+ const ref$1 = textLen > 0 ? mintBlockRef(storyEditor, runtime.storyKey, canonicalId, textLen) : undefined;
196327
+ return buildHeadingCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory, ref$1);
196036
196328
  } finally {
196037
196329
  disposeEphemeralWriteRuntime(runtime);
196038
196330
  }
@@ -196051,6 +196343,8 @@ function extractBlockFormatting(node3) {
196051
196343
  let fontFamily;
196052
196344
  let fontSize;
196053
196345
  let bold2;
196346
+ let underline;
196347
+ let color2;
196054
196348
  node3.descendants((child) => {
196055
196349
  if (fontFamily !== undefined)
196056
196350
  return false;
@@ -196058,19 +196352,28 @@ function extractBlockFormatting(node3) {
196058
196352
  if (!child.isText || marks.length === 0)
196059
196353
  return;
196060
196354
  for (const mark2 of marks) {
196355
+ const markName = mark2.type.name;
196061
196356
  const attrs = mark2.attrs;
196062
- if (typeof attrs.fontFamily === "string" && attrs.fontFamily)
196063
- fontFamily = attrs.fontFamily;
196064
- if (attrs.fontSize != null) {
196065
- const raw = typeof attrs.fontSize === "string" ? parseFloat(attrs.fontSize) : attrs.fontSize;
196066
- if (typeof raw === "number" && Number.isFinite(raw))
196067
- fontSize = raw;
196357
+ if (markName === "textStyle") {
196358
+ if (typeof attrs.fontFamily === "string" && attrs.fontFamily)
196359
+ fontFamily = attrs.fontFamily;
196360
+ if (attrs.fontSize != null) {
196361
+ const raw = typeof attrs.fontSize === "string" ? parseFloat(attrs.fontSize) : attrs.fontSize;
196362
+ if (typeof raw === "number" && Number.isFinite(raw))
196363
+ fontSize = raw;
196364
+ }
196365
+ if (typeof attrs.color === "string" && attrs.color)
196366
+ color2 = attrs.color;
196068
196367
  }
196069
- if (attrs.bold === true)
196368
+ if (markName === "bold" && attrs.value === true)
196070
196369
  bold2 = true;
196370
+ if (markName === "underline")
196371
+ underline = true;
196071
196372
  }
196072
196373
  return false;
196073
196374
  });
196375
+ if (color2 === "auto")
196376
+ color2 = undefined;
196074
196377
  let headingLevel;
196075
196378
  if (typeof styleId === "string") {
196076
196379
  const m$1 = HEADING_PATTERN.exec(styleId);
@@ -196082,6 +196385,8 @@ function extractBlockFormatting(node3) {
196082
196385
  ...fontFamily ? { fontFamily } : {},
196083
196386
  ...fontSize !== undefined ? { fontSize } : {},
196084
196387
  ...bold2 ? { bold: bold2 } : {},
196388
+ ...underline ? { underline } : {},
196389
+ ...color2 ? { color: color2 } : {},
196085
196390
  ...pProps?.justification ? { alignment: pProps.justification } : {},
196086
196391
  ...headingLevel ? { headingLevel } : {}
196087
196392
  };
@@ -196148,17 +196453,36 @@ function blocksListWrapper(editor, input2) {
196148
196453
  const total = filtered.length;
196149
196454
  const offset$1 = input2?.offset ?? 0;
196150
196455
  const limit = input2?.limit ?? total;
196456
+ const paged = filtered.slice(offset$1, offset$1 + limit);
196457
+ const rev = getRevision(editor);
196151
196458
  return {
196152
196459
  total,
196153
- blocks: filtered.slice(offset$1, offset$1 + limit).map((candidate, i4) => ({
196154
- ordinal: offset$1 + i4,
196155
- nodeId: candidate.nodeId,
196156
- nodeType: candidate.nodeType,
196157
- textPreview: extractTextPreview(candidate.node),
196158
- isEmpty: candidate.node.textContent.length === 0,
196159
- ...extractBlockFormatting(candidate.node)
196160
- })),
196161
- revision: getRevision(editor)
196460
+ blocks: paged.map((candidate, i4) => {
196461
+ const textLength = computeTextContentLength(candidate.node);
196462
+ const ref$1 = textLength > 0 ? encodeV4Ref({
196463
+ v: 4,
196464
+ rev,
196465
+ storyKey: "body",
196466
+ scope: "block",
196467
+ matchId: candidate.nodeId,
196468
+ segments: [{
196469
+ blockId: candidate.nodeId,
196470
+ start: 0,
196471
+ end: textLength
196472
+ }],
196473
+ blockIndex: offset$1 + i4
196474
+ }) : undefined;
196475
+ return {
196476
+ ordinal: offset$1 + i4,
196477
+ nodeId: candidate.nodeId,
196478
+ nodeType: candidate.nodeType,
196479
+ textPreview: extractTextPreview(candidate.node),
196480
+ isEmpty: textLength === 0,
196481
+ ...extractBlockFormatting(candidate.node),
196482
+ ...ref$1 ? { ref: ref$1 } : {}
196483
+ };
196484
+ }),
196485
+ revision: rev
196162
196486
  };
196163
196487
  }
196164
196488
  function blocksDeleteWrapper(editor, input2, options) {
@@ -211889,6 +212213,235 @@ function preferFullRestoredWhenPartial(current, previousRanges, doc$12, docSize)
211889
212213
  return current;
211890
212214
  return currentSpan.from >= restoredSpan.from && currentSpan.to <= restoredSpan.to && restoredSpan.to - restoredSpan.from > currentSpan.to - currentSpan.from ? restored : current;
211891
212215
  }
212216
+ function resolveAnnotationDisplayLabel(annotation, contentEl) {
212217
+ const existingLabel = annotation.dataset[DATASET_KEYS.DISPLAY_LABEL];
212218
+ const existingLabelSource = annotation.dataset[DISPLAY_LABEL_SOURCE_KEY];
212219
+ if (existingLabel !== undefined && existingLabelSource !== DISPLAY_LABEL_SOURCE.DERIVED)
212220
+ return {
212221
+ source: DISPLAY_LABEL_SOURCE.CANONICAL,
212222
+ value: existingLabel
212223
+ };
212224
+ const derivedLabel = contentEl?.textContent?.trim() ?? "";
212225
+ if (derivedLabel.length === 0)
212226
+ return null;
212227
+ return {
212228
+ source: DISPLAY_LABEL_SOURCE.DERIVED,
212229
+ value: derivedLabel
212230
+ };
212231
+ }
212232
+ function cssClassForKind(kind) {
212233
+ switch (kind) {
212234
+ case "spelling":
212235
+ return PROOFING_CSS.SPELLING;
212236
+ case "grammar":
212237
+ return PROOFING_CSS.GRAMMAR;
212238
+ case "style":
212239
+ return PROOFING_CSS.STYLE;
212240
+ }
212241
+ }
212242
+ function computeSplitSegments(spanPmStart, spanPmEnd, spanText, annotations) {
212243
+ const boundaries = /* @__PURE__ */ new Set;
212244
+ boundaries.add(spanPmStart);
212245
+ boundaries.add(spanPmEnd);
212246
+ for (const annotation of annotations) {
212247
+ const clampedFrom = Math.max(annotation.pmFrom, spanPmStart);
212248
+ const clampedTo = Math.min(annotation.pmTo, spanPmEnd);
212249
+ if (clampedFrom > spanPmStart)
212250
+ boundaries.add(clampedFrom);
212251
+ if (clampedTo < spanPmEnd)
212252
+ boundaries.add(clampedTo);
212253
+ }
212254
+ const sortedBoundaries = Array.from(boundaries).sort((a2, b$1) => a2 - b$1);
212255
+ const segments = [];
212256
+ for (let index2 = 0;index2 < sortedBoundaries.length - 1; index2 += 1) {
212257
+ const segmentPmStart = sortedBoundaries[index2];
212258
+ const segmentPmEnd = sortedBoundaries[index2 + 1];
212259
+ const textStart = segmentPmStart - spanPmStart;
212260
+ const textEnd = segmentPmEnd - spanPmStart;
212261
+ if (textEnd <= textStart || textStart >= spanText.length)
212262
+ continue;
212263
+ const clampedTextEnd = Math.min(textEnd, spanText.length);
212264
+ let proofingClass = null;
212265
+ for (const annotation of annotations)
212266
+ if (annotation.pmFrom <= segmentPmStart && annotation.pmTo >= segmentPmEnd) {
212267
+ proofingClass = cssClassForKind(annotation.kind);
212268
+ break;
212269
+ }
212270
+ segments.push({
212271
+ textStart,
212272
+ textEnd: clampedTextEnd,
212273
+ pmStart: segmentPmStart,
212274
+ pmEnd: segmentPmEnd,
212275
+ proofingClass
212276
+ });
212277
+ }
212278
+ return segments;
212279
+ }
212280
+ function replaceSpanWithSiblings(originalSpan, segments, spanText) {
212281
+ const parent = originalSpan.parentNode;
212282
+ if (!parent)
212283
+ return [];
212284
+ const doc$12 = originalSpan.ownerDocument;
212285
+ const siblings = [];
212286
+ for (const segment of segments) {
212287
+ const text5 = spanText.slice(segment.textStart, segment.textEnd);
212288
+ if (text5.length === 0)
212289
+ continue;
212290
+ const span = doc$12.createElement("span");
212291
+ for (let index2 = 0;index2 < originalSpan.attributes.length; index2 += 1) {
212292
+ const attr = originalSpan.attributes[index2];
212293
+ span.setAttribute(attr.name, attr.value);
212294
+ }
212295
+ span.setAttribute("data-pm-start", String(segment.pmStart));
212296
+ span.setAttribute("data-pm-end", String(segment.pmEnd));
212297
+ if (segment.proofingClass) {
212298
+ span.classList.add(segment.proofingClass);
212299
+ span.setAttribute("aria-invalid", "spelling");
212300
+ }
212301
+ span.setAttribute(PROOFING_CSS.SPLIT_ATTR, "");
212302
+ span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
212303
+ span.textContent = "";
212304
+ span.appendChild(doc$12.createTextNode(text5));
212305
+ splitOriginMap.set(span, originalSpan);
212306
+ siblings.push(span);
212307
+ }
212308
+ originalSpan.style.display = "none";
212309
+ originalSpan.setAttribute(PROOFING_CSS.DATA_ATTR, "original");
212310
+ const originalPmStart = originalSpan.getAttribute("data-pm-start");
212311
+ const originalPmEnd = originalSpan.getAttribute("data-pm-end");
212312
+ if (originalPmStart)
212313
+ originalSpan.setAttribute("data-sd-orig-pm-start", originalPmStart);
212314
+ if (originalPmEnd)
212315
+ originalSpan.setAttribute("data-sd-orig-pm-end", originalPmEnd);
212316
+ originalSpan.removeAttribute("data-pm-start");
212317
+ originalSpan.removeAttribute("data-pm-end");
212318
+ for (const sibling of siblings)
212319
+ parent.insertBefore(sibling, originalSpan);
212320
+ return siblings;
212321
+ }
212322
+ function restoreSplitSpans(container) {
212323
+ const splitSpans = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
212324
+ if (splitSpans.length === 0)
212325
+ return false;
212326
+ const groupsByOriginal = /* @__PURE__ */ new Map;
212327
+ for (const span of splitSpans) {
212328
+ const original = splitOriginMap.get(span);
212329
+ if (!original)
212330
+ continue;
212331
+ const group = groupsByOriginal.get(original);
212332
+ if (group)
212333
+ group.push(span);
212334
+ else
212335
+ groupsByOriginal.set(original, [span]);
212336
+ }
212337
+ for (const [original, siblings] of groupsByOriginal) {
212338
+ const parent = original.parentNode;
212339
+ if (!parent)
212340
+ continue;
212341
+ unhideOriginalSpan(original);
212342
+ for (const sibling of siblings)
212343
+ parent.removeChild(sibling);
212344
+ }
212345
+ const remainingSplitSpans = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
212346
+ for (const span of remainingSplitSpans)
212347
+ span.parentNode?.removeChild(span);
212348
+ const hiddenOriginals = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}="original"]`));
212349
+ for (const element3 of hiddenOriginals)
212350
+ unhideOriginalSpan(element3);
212351
+ return true;
212352
+ }
212353
+ function unhideOriginalSpan(element3) {
212354
+ element3.style.display = "";
212355
+ if (!element3.style.cssText)
212356
+ element3.removeAttribute("style");
212357
+ element3.removeAttribute(PROOFING_CSS.DATA_ATTR);
212358
+ const savedStart = element3.getAttribute("data-sd-orig-pm-start");
212359
+ const savedEnd = element3.getAttribute("data-sd-orig-pm-end");
212360
+ if (savedStart) {
212361
+ element3.setAttribute("data-pm-start", savedStart);
212362
+ element3.removeAttribute("data-sd-orig-pm-start");
212363
+ }
212364
+ if (savedEnd) {
212365
+ element3.setAttribute("data-pm-end", savedEnd);
212366
+ element3.removeAttribute("data-sd-orig-pm-end");
212367
+ }
212368
+ }
212369
+ function applyProofingDecorations(container, annotations) {
212370
+ const hadPrevious = clearProofingDecorations(container);
212371
+ if (annotations.length === 0)
212372
+ return hadPrevious;
212373
+ const sortedAnnotations = [...annotations].sort((left$1, right$1) => left$1.pmFrom - right$1.pmFrom);
212374
+ const spans = Array.from(container.querySelectorAll("[data-pm-start][data-pm-end]"));
212375
+ let mutated = false;
212376
+ for (const span of spans) {
212377
+ const pmStart = Number.parseInt(span.getAttribute("data-pm-start") ?? "", 10);
212378
+ const pmEnd = Number.parseInt(span.getAttribute("data-pm-end") ?? "", 10);
212379
+ if (Number.isNaN(pmStart) || Number.isNaN(pmEnd) || pmEnd <= pmStart)
212380
+ continue;
212381
+ if (!isLeafTextSpan(span))
212382
+ continue;
212383
+ const overlappingAnnotations = findOverlappingAnnotations(sortedAnnotations, pmStart, pmEnd);
212384
+ if (overlappingAnnotations.length === 0)
212385
+ continue;
212386
+ const text5 = span.textContent ?? "";
212387
+ if (text5.length === 0)
212388
+ continue;
212389
+ if (isCoveredBySingleAnnotation(pmStart, pmEnd, overlappingAnnotations)) {
212390
+ span.classList.add(cssClassForKind(overlappingAnnotations[0].kind));
212391
+ span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
212392
+ span.setAttribute("aria-invalid", "spelling");
212393
+ mutated = true;
212394
+ continue;
212395
+ }
212396
+ const segments = computeSplitSegments(pmStart, pmEnd, text5, overlappingAnnotations);
212397
+ if (segments.length > 1) {
212398
+ replaceSpanWithSiblings(span, segments, text5);
212399
+ mutated = true;
212400
+ continue;
212401
+ }
212402
+ if (segments.length === 1 && segments[0].proofingClass) {
212403
+ span.classList.add(segments[0].proofingClass);
212404
+ span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
212405
+ span.setAttribute("aria-invalid", "spelling");
212406
+ mutated = true;
212407
+ }
212408
+ }
212409
+ return mutated || hadPrevious;
212410
+ }
212411
+ function clearProofingDecorations(container) {
212412
+ let cleared = false;
212413
+ const restoredSplits = restoreSplitSpans(container);
212414
+ const decoratedElements = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}]`));
212415
+ for (const element3 of decoratedElements) {
212416
+ element3.classList.remove(PROOFING_CSS.SPELLING, PROOFING_CSS.GRAMMAR, PROOFING_CSS.STYLE);
212417
+ element3.removeAttribute(PROOFING_CSS.DATA_ATTR);
212418
+ element3.removeAttribute("aria-invalid");
212419
+ cleared = true;
212420
+ }
212421
+ return cleared || restoredSplits;
212422
+ }
212423
+ function isLeafTextSpan(element3) {
212424
+ const children = element3.childNodes;
212425
+ if (children.length === 0)
212426
+ return false;
212427
+ for (let index2 = 0;index2 < children.length; index2 += 1)
212428
+ if (children[index2].nodeType === Node.ELEMENT_NODE)
212429
+ return false;
212430
+ return true;
212431
+ }
212432
+ function findOverlappingAnnotations(sortedAnnotations, pmStart, pmEnd) {
212433
+ const overlapping = [];
212434
+ for (const annotation of sortedAnnotations) {
212435
+ if (annotation.pmFrom >= pmEnd)
212436
+ break;
212437
+ if (annotation.pmTo > pmStart)
212438
+ overlapping.push(annotation);
212439
+ }
212440
+ return overlapping;
212441
+ }
212442
+ function isCoveredBySingleAnnotation(pmStart, pmEnd, annotations) {
212443
+ return annotations.some((annotation) => annotation.pmFrom <= pmStart && annotation.pmTo >= pmEnd);
212444
+ }
211892
212445
  function isSuppressed(issue, normalizedIgnored) {
211893
212446
  if (normalizedIgnored.size === 0)
211894
212447
  return false;
@@ -214075,9 +214628,6 @@ function applyParagraphBordersAndShading(paraWrapper, block) {
214075
214628
  if (shadingFill)
214076
214629
  paraWrapper.style.backgroundColor = shadingFill;
214077
214630
  }
214078
- function sdtElementsById(root3, sdtId) {
214079
- return root3.querySelectorAll(`.${DOM_CLASS_NAMES.BLOCK_SDT}[data-sdt-id="${sdtId}"]`);
214080
- }
214081
214631
  function classifyMathText(text5) {
214082
214632
  if (/^\d*\.?\d+$/.test(text5))
214083
214633
  return "mn";
@@ -214182,6 +214732,26 @@ function readSnapshotStyleValue(styleValue2) {
214182
214732
  return null;
214183
214733
  return styleValue2;
214184
214734
  }
214735
+ function createEmptyPaintSnapshotEntities() {
214736
+ return {
214737
+ annotations: [],
214738
+ structuredContentBlocks: [],
214739
+ structuredContentInlines: [],
214740
+ images: []
214741
+ };
214742
+ }
214743
+ function readSnapshotDatasetNumber(value) {
214744
+ if (typeof value !== "string" || value.length === 0)
214745
+ return null;
214746
+ const parsed = Number(value);
214747
+ return Number.isFinite(parsed) ? parsed : null;
214748
+ }
214749
+ function resolveSnapshotPageIndex(element3) {
214750
+ const pageEl = element3.closest(`.${DOM_CLASS_NAMES.PAGE}`);
214751
+ if (!pageEl)
214752
+ return null;
214753
+ return readSnapshotDatasetNumber(pageEl.dataset.pageIndex);
214754
+ }
214185
214755
  function compactSnapshotObject(input2) {
214186
214756
  const out = {};
214187
214757
  for (const [key$1, value] of Object.entries(input2)) {
@@ -214193,6 +214763,89 @@ function compactSnapshotObject(input2) {
214193
214763
  }
214194
214764
  return out;
214195
214765
  }
214766
+ function shouldIncludeInlineImageSnapshotElement(element3) {
214767
+ if (element3.classList.contains(DOM_CLASS_NAMES.INLINE_IMAGE_CLIP_WRAPPER))
214768
+ return true;
214769
+ if (!element3.classList.contains(DOM_CLASS_NAMES.INLINE_IMAGE))
214770
+ return false;
214771
+ return !element3.closest(`.${DOM_CLASS_NAMES.INLINE_IMAGE_CLIP_WRAPPER}`);
214772
+ }
214773
+ function collectPaintSnapshotEntitiesFromDomRoot(rootEl) {
214774
+ const entities = createEmptyPaintSnapshotEntities();
214775
+ const annotationElements = Array.from(rootEl.querySelectorAll(`.${DOM_CLASS_NAMES.ANNOTATION}[data-pm-start]`));
214776
+ for (const element3 of annotationElements) {
214777
+ const pageIndex = resolveSnapshotPageIndex(element3);
214778
+ if (pageIndex == null)
214779
+ continue;
214780
+ entities.annotations.push(compactSnapshotObject({
214781
+ element: element3,
214782
+ pageIndex,
214783
+ pmStart: readSnapshotDatasetNumber(element3.dataset.pmStart),
214784
+ pmEnd: readSnapshotDatasetNumber(element3.dataset.pmEnd),
214785
+ fieldId: element3.dataset.fieldId || null,
214786
+ fieldType: element3.dataset.fieldType || null,
214787
+ type: element3.dataset.type || null
214788
+ }));
214789
+ }
214790
+ const blockSdtElements = Array.from(rootEl.querySelectorAll(`.${DOM_CLASS_NAMES.BLOCK_SDT}[data-sdt-id]`));
214791
+ for (const element3 of blockSdtElements) {
214792
+ const pageIndex = resolveSnapshotPageIndex(element3);
214793
+ const sdtId = element3.dataset.sdtId;
214794
+ if (pageIndex == null || !sdtId)
214795
+ continue;
214796
+ entities.structuredContentBlocks.push(compactSnapshotObject({
214797
+ element: element3,
214798
+ pageIndex,
214799
+ sdtId,
214800
+ pmStart: readSnapshotDatasetNumber(element3.dataset.pmStart),
214801
+ pmEnd: readSnapshotDatasetNumber(element3.dataset.pmEnd)
214802
+ }));
214803
+ }
214804
+ const inlineSdtElements = Array.from(rootEl.querySelectorAll(`.${DOM_CLASS_NAMES.INLINE_SDT_WRAPPER}[data-sdt-id]`));
214805
+ for (const element3 of inlineSdtElements) {
214806
+ const pageIndex = resolveSnapshotPageIndex(element3);
214807
+ const sdtId = element3.dataset.sdtId;
214808
+ if (pageIndex == null || !sdtId)
214809
+ continue;
214810
+ entities.structuredContentInlines.push(compactSnapshotObject({
214811
+ element: element3,
214812
+ pageIndex,
214813
+ sdtId,
214814
+ pmStart: readSnapshotDatasetNumber(element3.dataset.pmStart),
214815
+ pmEnd: readSnapshotDatasetNumber(element3.dataset.pmEnd)
214816
+ }));
214817
+ }
214818
+ const inlineImageElements = Array.from(rootEl.querySelectorAll(`.${DOM_CLASS_NAMES.INLINE_IMAGE_CLIP_WRAPPER}[data-pm-start], .${DOM_CLASS_NAMES.INLINE_IMAGE}[data-pm-start]`));
214819
+ for (const element3 of inlineImageElements) {
214820
+ if (!shouldIncludeInlineImageSnapshotElement(element3))
214821
+ continue;
214822
+ const pageIndex = resolveSnapshotPageIndex(element3);
214823
+ if (pageIndex == null)
214824
+ continue;
214825
+ entities.images.push(compactSnapshotObject({
214826
+ element: element3,
214827
+ pageIndex,
214828
+ kind: "inline",
214829
+ pmStart: readSnapshotDatasetNumber(element3.dataset.pmStart),
214830
+ pmEnd: readSnapshotDatasetNumber(element3.dataset.pmEnd)
214831
+ }));
214832
+ }
214833
+ const fragmentImageElements = Array.from(rootEl.querySelectorAll(`.${DOM_CLASS_NAMES.IMAGE_FRAGMENT}[data-pm-start]`));
214834
+ for (const element3 of fragmentImageElements) {
214835
+ const pageIndex = resolveSnapshotPageIndex(element3);
214836
+ if (pageIndex == null)
214837
+ continue;
214838
+ entities.images.push(compactSnapshotObject({
214839
+ element: element3,
214840
+ pageIndex,
214841
+ kind: "fragment",
214842
+ pmStart: readSnapshotDatasetNumber(element3.dataset.pmStart),
214843
+ pmEnd: readSnapshotDatasetNumber(element3.dataset.pmEnd),
214844
+ blockId: element3.getAttribute("data-sd-block-id")
214845
+ }));
214846
+ }
214847
+ return entities;
214848
+ }
214196
214849
  function snapshotLineStyleFromElement(lineEl) {
214197
214850
  const style2 = lineEl?.style;
214198
214851
  if (!style2)
@@ -214283,217 +214936,6 @@ function sanitizeUrl(href) {
214283
214936
  return null;
214284
214937
  return sanitizeHref(href)?.href ?? null;
214285
214938
  }
214286
- function cssClassForKind(kind) {
214287
- switch (kind) {
214288
- case "spelling":
214289
- return PROOFING_CSS.SPELLING;
214290
- case "grammar":
214291
- return PROOFING_CSS.GRAMMAR;
214292
- case "style":
214293
- return PROOFING_CSS.STYLE;
214294
- }
214295
- }
214296
- function computeSplitSegments(spanPmStart, spanPmEnd, spanText, annotations) {
214297
- const boundaries = /* @__PURE__ */ new Set;
214298
- boundaries.add(spanPmStart);
214299
- boundaries.add(spanPmEnd);
214300
- for (const ann of annotations) {
214301
- const clampedFrom = Math.max(ann.pmFrom, spanPmStart);
214302
- const clampedTo = Math.min(ann.pmTo, spanPmEnd);
214303
- if (clampedFrom > spanPmStart)
214304
- boundaries.add(clampedFrom);
214305
- if (clampedTo < spanPmEnd)
214306
- boundaries.add(clampedTo);
214307
- }
214308
- const sorted = Array.from(boundaries).sort((a2, b$1) => a2 - b$1);
214309
- const segments = [];
214310
- for (let i4 = 0;i4 < sorted.length - 1; i4++) {
214311
- const segPmStart = sorted[i4];
214312
- const segPmEnd = sorted[i4 + 1];
214313
- const textStart = segPmStart - spanPmStart;
214314
- const textEnd = segPmEnd - spanPmStart;
214315
- if (textEnd <= textStart || textStart >= spanText.length)
214316
- continue;
214317
- const clampedTextEnd = Math.min(textEnd, spanText.length);
214318
- let proofingClass = null;
214319
- for (const ann of annotations)
214320
- if (ann.pmFrom <= segPmStart && ann.pmTo >= segPmEnd) {
214321
- proofingClass = cssClassForKind(ann.kind);
214322
- break;
214323
- }
214324
- segments.push({
214325
- textStart,
214326
- textEnd: clampedTextEnd,
214327
- pmStart: segPmStart,
214328
- pmEnd: segPmEnd,
214329
- proofingClass
214330
- });
214331
- }
214332
- return segments;
214333
- }
214334
- function replaceSpanWithSiblings(originalSpan, segments, spanText) {
214335
- const parent = originalSpan.parentNode;
214336
- if (!parent)
214337
- return [];
214338
- const doc$12 = originalSpan.ownerDocument;
214339
- const siblings = [];
214340
- for (const seg of segments) {
214341
- const text5 = spanText.slice(seg.textStart, seg.textEnd);
214342
- if (text5.length === 0)
214343
- continue;
214344
- const span = doc$12.createElement("span");
214345
- for (let i4 = 0;i4 < originalSpan.attributes.length; i4++) {
214346
- const attr = originalSpan.attributes[i4];
214347
- span.setAttribute(attr.name, attr.value);
214348
- }
214349
- span.setAttribute("data-pm-start", String(seg.pmStart));
214350
- span.setAttribute("data-pm-end", String(seg.pmEnd));
214351
- if (seg.proofingClass) {
214352
- span.classList.add(seg.proofingClass);
214353
- span.setAttribute("aria-invalid", "spelling");
214354
- }
214355
- span.setAttribute(PROOFING_CSS.SPLIT_ATTR, "");
214356
- span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
214357
- span.textContent = "";
214358
- span.appendChild(doc$12.createTextNode(text5));
214359
- splitOriginMap.set(span, originalSpan);
214360
- siblings.push(span);
214361
- }
214362
- originalSpan.style.display = "none";
214363
- originalSpan.setAttribute(PROOFING_CSS.DATA_ATTR, "original");
214364
- const origPmStart = originalSpan.getAttribute("data-pm-start");
214365
- const origPmEnd = originalSpan.getAttribute("data-pm-end");
214366
- if (origPmStart)
214367
- originalSpan.setAttribute("data-sd-orig-pm-start", origPmStart);
214368
- if (origPmEnd)
214369
- originalSpan.setAttribute("data-sd-orig-pm-end", origPmEnd);
214370
- originalSpan.removeAttribute("data-pm-start");
214371
- originalSpan.removeAttribute("data-pm-end");
214372
- for (const sib of siblings)
214373
- parent.insertBefore(sib, originalSpan);
214374
- return siblings;
214375
- }
214376
- function restoreSplitSpans(container) {
214377
- const splitSpans = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
214378
- if (splitSpans.length === 0)
214379
- return false;
214380
- const groupsByOriginal = /* @__PURE__ */ new Map;
214381
- for (const span of splitSpans) {
214382
- const original = splitOriginMap.get(span);
214383
- if (!original)
214384
- continue;
214385
- const group = groupsByOriginal.get(original);
214386
- if (group)
214387
- group.push(span);
214388
- else
214389
- groupsByOriginal.set(original, [span]);
214390
- }
214391
- for (const [original, siblings] of groupsByOriginal) {
214392
- const parent = original.parentNode;
214393
- if (!parent)
214394
- continue;
214395
- unhideOriginalSpan(original);
214396
- for (const sib of siblings)
214397
- parent.removeChild(sib);
214398
- }
214399
- const remaining = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
214400
- for (const span of remaining)
214401
- span.parentNode?.removeChild(span);
214402
- const hiddenOriginals = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}="original"]`));
214403
- for (const el of hiddenOriginals)
214404
- unhideOriginalSpan(el);
214405
- return true;
214406
- }
214407
- function unhideOriginalSpan(el) {
214408
- el.style.display = "";
214409
- if (!el.style.cssText)
214410
- el.removeAttribute("style");
214411
- el.removeAttribute(PROOFING_CSS.DATA_ATTR);
214412
- const savedStart = el.getAttribute("data-sd-orig-pm-start");
214413
- const savedEnd = el.getAttribute("data-sd-orig-pm-end");
214414
- if (savedStart) {
214415
- el.setAttribute("data-pm-start", savedStart);
214416
- el.removeAttribute("data-sd-orig-pm-start");
214417
- }
214418
- if (savedEnd) {
214419
- el.setAttribute("data-pm-end", savedEnd);
214420
- el.removeAttribute("data-sd-orig-pm-end");
214421
- }
214422
- }
214423
- function applyProofingDecorations(container, annotations) {
214424
- const hadPrevious = clearProofingDecorations(container);
214425
- if (annotations.length === 0)
214426
- return hadPrevious;
214427
- const sorted = [...annotations].sort((a2, b$1) => a2.pmFrom - b$1.pmFrom);
214428
- const spans = Array.from(container.querySelectorAll("[data-pm-start][data-pm-end]"));
214429
- let mutated = false;
214430
- for (const span of spans) {
214431
- const pmStart = parseInt(span.getAttribute("data-pm-start"), 10);
214432
- const pmEnd = parseInt(span.getAttribute("data-pm-end"), 10);
214433
- if (isNaN(pmStart) || isNaN(pmEnd) || pmEnd <= pmStart)
214434
- continue;
214435
- if (!isLeafTextSpan(span))
214436
- continue;
214437
- const overlapping = findOverlapping(sorted, pmStart, pmEnd);
214438
- if (overlapping.length === 0)
214439
- continue;
214440
- const text5 = span.textContent ?? "";
214441
- if (text5.length === 0)
214442
- continue;
214443
- if (isCoveredBySingleAnnotation(pmStart, pmEnd, overlapping)) {
214444
- span.classList.add(cssClassForKind(overlapping[0].kind));
214445
- span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
214446
- span.setAttribute("aria-invalid", "spelling");
214447
- mutated = true;
214448
- } else {
214449
- const segments = computeSplitSegments(pmStart, pmEnd, text5, overlapping);
214450
- if (segments.length > 1) {
214451
- replaceSpanWithSiblings(span, segments, text5);
214452
- mutated = true;
214453
- } else if (segments.length === 1 && segments[0].proofingClass) {
214454
- span.classList.add(segments[0].proofingClass);
214455
- span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
214456
- span.setAttribute("aria-invalid", "spelling");
214457
- mutated = true;
214458
- }
214459
- }
214460
- }
214461
- return mutated || hadPrevious;
214462
- }
214463
- function clearProofingDecorations(container) {
214464
- let cleared = false;
214465
- const splitRestored = restoreSplitSpans(container);
214466
- const decorated = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}]`));
214467
- for (const el of decorated) {
214468
- el.classList.remove(PROOFING_CSS.SPELLING, PROOFING_CSS.GRAMMAR, PROOFING_CSS.STYLE);
214469
- el.removeAttribute(PROOFING_CSS.DATA_ATTR);
214470
- el.removeAttribute("aria-invalid");
214471
- cleared = true;
214472
- }
214473
- return cleared || splitRestored;
214474
- }
214475
- function isLeafTextSpan(el) {
214476
- const children = el.childNodes;
214477
- if (children.length === 0)
214478
- return false;
214479
- for (let i4 = 0;i4 < children.length; i4++)
214480
- if (children[i4].nodeType === Node.ELEMENT_NODE)
214481
- return false;
214482
- return true;
214483
- }
214484
- function findOverlapping(sorted, pmStart, pmEnd) {
214485
- const result = [];
214486
- for (const ann of sorted) {
214487
- if (ann.pmFrom >= pmEnd)
214488
- break;
214489
- if (ann.pmTo > pmStart)
214490
- result.push(ann);
214491
- }
214492
- return result;
214493
- }
214494
- function isCoveredBySingleAnnotation(pmStart, pmEnd, annotations) {
214495
- return annotations.some((ann) => ann.pmFrom <= pmStart && ann.pmTo >= pmEnd);
214496
- }
214497
214939
  function assertRequiredBlockMeasurePair(label, blocks2, measures) {
214498
214940
  if (blocks2.length !== measures.length)
214499
214941
  throw new Error(`${label} blocks and measures must have the same length.`);
@@ -214534,6 +214976,40 @@ function buildLegacyPaintInput(layout, legacyState, flowMode, pageGap) {
214534
214976
  footerMeasures: legacyState.footerMeasures
214535
214977
  };
214536
214978
  }
214979
+ function appendToArrayMap(map$12, key$1, value) {
214980
+ const existing = map$12.get(key$1);
214981
+ if (existing) {
214982
+ existing.push(value);
214983
+ return;
214984
+ }
214985
+ map$12.set(key$1, [value]);
214986
+ }
214987
+ function isMountedElement(element3) {
214988
+ return element3 instanceof HTMLElement && element3.isConnected;
214989
+ }
214990
+ function isInlineImageWrapperElement(element3) {
214991
+ return element3.classList.contains(DOM_CLASS_NAMES.INLINE_IMAGE_CLIP_WRAPPER);
214992
+ }
214993
+ function shouldReplaceInlineImageEntity(existing, candidate) {
214994
+ if (!existing)
214995
+ return true;
214996
+ const existingIsWrapper = isInlineImageWrapperElement(existing.element);
214997
+ const candidateIsWrapper = isInlineImageWrapperElement(candidate.element);
214998
+ if (existingIsWrapper && !candidateIsWrapper)
214999
+ return false;
215000
+ return true;
215001
+ }
215002
+ function normalizePinnedPageIndices(pageIndices) {
215003
+ return Array.from(new Set((pageIndices ?? []).filter((pageIndex) => Number.isInteger(pageIndex)))).sort((a2, b$1) => a2 - b$1);
215004
+ }
215005
+ function areNumberListsEqual(left$1, right$1) {
215006
+ if (left$1.length !== right$1.length)
215007
+ return false;
215008
+ for (let index2 = 0;index2 < left$1.length; index2 += 1)
215009
+ if (left$1[index2] !== right$1[index2])
215010
+ return false;
215011
+ return true;
215012
+ }
214537
215013
  function resolveMarkerTextWidth(markerTextWidthPx, marker) {
214538
215014
  const val = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0 ? v : undefined;
214539
215015
  return val(markerTextWidthPx) ?? val(marker.glyphWidthPx) ?? val(marker.markerBoxWidthPx) ?? 0;
@@ -229438,6 +229914,24 @@ function splitRunsAtDecorationBoundaries(blocks2, ranges) {
229438
229914
  const boundaries = getBoundaries(ranges);
229439
229915
  return blocks2.map((block) => splitRunsInBlock(block, boundaries));
229440
229916
  }
229917
+ function ensureEditorNativeSelectionStyles(doc$12) {
229918
+ if (nativeSelectionStylesInjected || !doc$12)
229919
+ return;
229920
+ const styleEl = doc$12.createElement("style");
229921
+ styleEl.setAttribute("data-superdoc-editor-native-selection-styles", "true");
229922
+ styleEl.textContent = NATIVE_SELECTION_STYLES;
229923
+ doc$12.head?.appendChild(styleEl);
229924
+ nativeSelectionStylesInjected = true;
229925
+ }
229926
+ function ensureEditorFieldAnnotationInteractionStyles(doc$12) {
229927
+ if (fieldAnnotationInteractionStylesInjected || !doc$12)
229928
+ return;
229929
+ const styleEl = doc$12.createElement("style");
229930
+ styleEl.setAttribute("data-superdoc-editor-field-annotation-interaction-styles", "true");
229931
+ styleEl.textContent = FIELD_ANNOTATION_INTERACTION_STYLES;
229932
+ doc$12.head?.appendChild(styleEl);
229933
+ fieldAnnotationInteractionStylesInjected = true;
229934
+ }
229441
229935
  var Node$13 = class Node$14 {
229442
229936
  constructor(config2) {
229443
229937
  this.type = "node";
@@ -233040,7 +233534,13 @@ var Node$13 = class Node$14 {
233040
233534
  const attrs = {
233041
233535
  ...sdBlockId ? { sdBlockId } : undefined,
233042
233536
  ...paraId ? { paraId } : undefined,
233043
- paragraphProperties: { styleId: `Heading${level}` }
233537
+ paragraphProperties: {
233538
+ styleId: `Heading${level}`,
233539
+ numberingProperties: {
233540
+ numId: "0",
233541
+ ilvl: "0"
233542
+ }
233543
+ }
233044
233544
  };
233045
233545
  const normalizedText = typeof text5 === "string" ? text5 : "";
233046
233546
  const textNode = normalizedText.length > 0 ? state.schema.text(normalizedText) : null;
@@ -233515,24 +234015,25 @@ var Node$13 = class Node$14 {
233515
234015
  if (paragraphsInSelection.length > 0) {
233516
234016
  const firstPara = paragraphsInSelection[0];
233517
234017
  const lastPara = paragraphsInSelection[paragraphsInSelection.length - 1];
233518
- const mappedFirstPos = tr.mapping.map(firstPara.pos);
233519
- const mappedLastPos = tr.mapping.map(lastPara.pos);
233520
- const $firstPos = tr.doc.resolve(mappedFirstPos);
233521
- const $lastPos = tr.doc.resolve(mappedLastPos);
233522
- const firstNode = $firstPos.nodeAfter;
233523
- const lastNode = $lastPos.nodeAfter;
233524
- if (firstNode && lastNode) {
233525
- let selFrom = mappedFirstPos + 1;
233526
- let selTo = mappedLastPos + lastNode.nodeSize - 1;
233527
- if (firstNode.firstChild && firstNode.firstChild.type.name === "run")
233528
- selFrom = mappedFirstPos + 2;
233529
- if (lastNode.lastChild && lastNode.lastChild.type.name === "run")
233530
- selTo = mappedLastPos + lastNode.nodeSize - 2;
233531
- if (selFrom >= 0 && selTo <= tr.doc.content.size && selFrom <= selTo)
233532
- try {
233533
- tr.setSelection(TextSelection2.create(tr.doc, selFrom, selTo));
233534
- } catch {}
233535
- }
234018
+ const firstParagraphPos = firstPara.pos;
234019
+ const lastParagraphPos = lastPara.pos;
234020
+ const firstNode = tr.doc.nodeAt(firstParagraphPos);
234021
+ const lastNode = tr.doc.nodeAt(lastParagraphPos);
234022
+ const restoredSelectionRange = computeToggleListSelectionRange({
234023
+ selectionWasCollapsed: selection.empty,
234024
+ affectedParagraphCount: paragraphsInSelection.length,
234025
+ firstParagraphPos,
234026
+ lastParagraphPos,
234027
+ firstNode,
234028
+ lastNode
234029
+ });
234030
+ if (restoredSelectionRange && restoredSelectionRange.from >= 0 && restoredSelectionRange.to <= tr.doc.content.size && restoredSelectionRange.from <= restoredSelectionRange.to)
234031
+ try {
234032
+ if (selection.empty && paragraphsInSelection.length === 1)
234033
+ tr.setSelection(Selection.near(tr.doc.resolve(restoredSelectionRange.to), -1));
234034
+ else
234035
+ tr.setSelection(TextSelection2.create(tr.doc, restoredSelectionRange.from, restoredSelectionRange.to));
234036
+ } catch {}
233536
234037
  }
233537
234038
  dispatch(tr);
233538
234039
  return true;
@@ -240837,7 +241338,7 @@ var Node$13 = class Node$14 {
240837
241338
  if (!allowedRanges?.length)
240838
241339
  return false;
240839
241340
  return allowedRanges.some((allowed) => range.from >= allowed.from && range.to <= allowed.to);
240840
- }, PermissionRanges, Protection, DOM_CLASS_NAMES, DATA_ATTRS, VerticalNavigationPluginKey, createDefaultState = () => ({ goalX: null }), VerticalNavigation, createPermissionBlockMarkerNode = ({ name, attributes }) => Node$13.create({
241341
+ }, PermissionRanges, Protection, DOM_CLASS_NAMES, DATA_ATTRS, DATASET_KEYS, DRAGGABLE_SELECTOR, VerticalNavigationPluginKey, createDefaultState = () => ({ goalX: null }), VerticalNavigation, createPermissionBlockMarkerNode = ({ name, attributes }) => Node$13.create({
240841
241342
  name,
240842
241343
  group: "block",
240843
241344
  inline: false,
@@ -243148,7 +243649,7 @@ var Node$13 = class Node$14 {
243148
243649
  domAvailabilityCache = false;
243149
243650
  return false;
243150
243651
  }
243151
- }, summaryVersion = "1.23.0", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
243652
+ }, summaryVersion = "1.23.1", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
243152
243653
  const container = document.createElement("div");
243153
243654
  container.innerHTML = html3;
243154
243655
  const result = [];
@@ -243473,7 +243974,7 @@ var Node$13 = class Node$14 {
243473
243974
  console.warn("Failed to initialize developer tools:", error3);
243474
243975
  }
243475
243976
  }
243476
- }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART$1 = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, V2_COVERAGE, SNAPSHOT_VERSION_V2 = "sd-diff-snapshot/v2", PAYLOAD_VERSION_V1 = "sd-diff-payload/v1", PAYLOAD_VERSION_V2 = "sd-diff-payload/v2", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SETTINGS_PART, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension2) => {
243977
+ }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART$1 = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, V2_COVERAGE, SNAPSHOT_VERSION_V2 = "sd-diff-snapshot/v2", PAYLOAD_VERSION_V1 = "sd-diff-payload/v1", PAYLOAD_VERSION_V2 = "sd-diff-payload/v2", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SETTINGS_PART, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.1", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension2) => {
243477
243978
  const extensionLike = extension2;
243478
243979
  const config2 = extensionLike?.config;
243479
243980
  const ExtensionCtor = extensionLike?.constructor;
@@ -244052,6 +244553,156 @@ var Node$13 = class Node$14 {
244052
244553
  }
244053
244554
  this.#applied.delete(el);
244054
244555
  }
244556
+ }, INTERACTION_EPOCH_KEY = "interactionEpoch", DISPLAY_LABEL_SOURCE_KEY = "displayLabelSource", DISPLAY_LABEL_SOURCE, FieldAnnotationInteractionLayer = class {
244557
+ #container = null;
244558
+ setContainer(container) {
244559
+ this.#container = container;
244560
+ }
244561
+ apply(layoutEpoch) {
244562
+ if (!this.#container)
244563
+ return;
244564
+ const epochStr = String(layoutEpoch);
244565
+ const annotations = this.#container.querySelectorAll(buildAnnotationSelector());
244566
+ for (let index2 = 0;index2 < annotations.length; index2 += 1) {
244567
+ const annotation = annotations[index2];
244568
+ if (annotation.dataset[INTERACTION_EPOCH_KEY] === epochStr)
244569
+ continue;
244570
+ annotation.dataset[INTERACTION_EPOCH_KEY] = epochStr;
244571
+ annotation.draggable = true;
244572
+ annotation.dataset[DATASET_KEYS.DRAGGABLE] = "true";
244573
+ const displayLabel = resolveAnnotationDisplayLabel(annotation, annotation.querySelector(`.${DOM_CLASS_NAMES.ANNOTATION_CONTENT}`));
244574
+ if (displayLabel !== null) {
244575
+ annotation.dataset[DATASET_KEYS.DISPLAY_LABEL] = displayLabel.value;
244576
+ annotation.dataset[DISPLAY_LABEL_SOURCE_KEY] = displayLabel.source;
244577
+ }
244578
+ const variantType = annotation.dataset[DATASET_KEYS.TYPE];
244579
+ if (variantType)
244580
+ annotation.dataset[DATASET_KEYS.VARIANT] = variantType;
244581
+ this.#ensureCaretAnchor(annotation);
244582
+ }
244583
+ }
244584
+ clear() {
244585
+ if (!this.#container)
244586
+ return;
244587
+ const annotations = this.#container.querySelectorAll(buildAnnotationSelector());
244588
+ for (let index2 = 0;index2 < annotations.length; index2 += 1) {
244589
+ const annotation = annotations[index2];
244590
+ annotation.removeAttribute("draggable");
244591
+ delete annotation.dataset[DATASET_KEYS.DRAGGABLE];
244592
+ delete annotation.dataset[DATASET_KEYS.DISPLAY_LABEL];
244593
+ delete annotation.dataset[DATASET_KEYS.VARIANT];
244594
+ delete annotation.dataset[INTERACTION_EPOCH_KEY];
244595
+ delete annotation.dataset[DISPLAY_LABEL_SOURCE_KEY];
244596
+ annotation.querySelector(`.${DOM_CLASS_NAMES.ANNOTATION_CARET_ANCHOR}`)?.remove();
244597
+ }
244598
+ }
244599
+ #ensureCaretAnchor(annotation) {
244600
+ if (annotation.querySelector(`.${DOM_CLASS_NAMES.ANNOTATION_CARET_ANCHOR}`))
244601
+ return;
244602
+ const pmEnd = annotation.dataset[DATASET_KEYS.PM_END];
244603
+ const layoutEpoch = annotation.dataset[DATASET_KEYS.LAYOUT_EPOCH];
244604
+ if (pmEnd == null)
244605
+ return;
244606
+ const doc$12 = this.#container?.ownerDocument;
244607
+ if (!doc$12)
244608
+ return;
244609
+ const caretAnchor = doc$12.createElement("span");
244610
+ caretAnchor.dataset[DATASET_KEYS.PM_START] = pmEnd;
244611
+ caretAnchor.dataset[DATASET_KEYS.PM_END] = pmEnd;
244612
+ caretAnchor.dataset[DATASET_KEYS.LAYOUT_EPOCH] = layoutEpoch ?? "";
244613
+ caretAnchor.classList.add(DOM_CLASS_NAMES.ANNOTATION_CARET_ANCHOR);
244614
+ caretAnchor.style.position = "absolute";
244615
+ caretAnchor.style.left = "100%";
244616
+ caretAnchor.style.top = "0";
244617
+ caretAnchor.style.width = "0";
244618
+ caretAnchor.style.height = "1em";
244619
+ caretAnchor.style.overflow = "hidden";
244620
+ caretAnchor.style.pointerEvents = "none";
244621
+ caretAnchor.style.userSelect = "none";
244622
+ caretAnchor.style.opacity = "0";
244623
+ caretAnchor.textContent = "​";
244624
+ if (!annotation.style.position)
244625
+ annotation.style.position = "relative";
244626
+ annotation.appendChild(caretAnchor);
244627
+ }
244628
+ }, PROOFING_CSS, splitOriginMap, PresentationProofingDecorator = class {
244629
+ #container = null;
244630
+ setContainer(container) {
244631
+ this.#container = container;
244632
+ }
244633
+ applyAnnotations(annotations) {
244634
+ const container = this.#container;
244635
+ if (!container)
244636
+ return false;
244637
+ if (!annotations || annotations.length === 0)
244638
+ return clearProofingDecorations(container);
244639
+ return applyProofingDecorations(container, annotations);
244640
+ }
244641
+ clear() {
244642
+ const container = this.#container;
244643
+ if (!container)
244644
+ return false;
244645
+ return clearProofingDecorations(container);
244646
+ }
244647
+ }, PresentationPostPaintPipeline = class {
244648
+ #fieldAnnotationLayer;
244649
+ #commentHighlightDecorator;
244650
+ #decorationBridge;
244651
+ #proofingDecorator;
244652
+ constructor(deps = {}) {
244653
+ this.#fieldAnnotationLayer = deps.fieldAnnotationLayer ?? new FieldAnnotationInteractionLayer;
244654
+ this.#commentHighlightDecorator = deps.commentHighlightDecorator ?? new CommentHighlightDecorator;
244655
+ this.#decorationBridge = deps.decorationBridge ?? new DecorationBridge;
244656
+ this.#proofingDecorator = deps.proofingDecorator ?? new PresentationProofingDecorator;
244657
+ }
244658
+ setContainer(container) {
244659
+ this.#fieldAnnotationLayer.setContainer(container);
244660
+ this.#commentHighlightDecorator.setContainer(container);
244661
+ this.#proofingDecorator.setContainer(container);
244662
+ }
244663
+ setActiveComment(commentId) {
244664
+ return this.#commentHighlightDecorator.setActiveComment(commentId);
244665
+ }
244666
+ recordDecorationTransaction(transaction) {
244667
+ this.#decorationBridge.recordTransaction(transaction);
244668
+ }
244669
+ hasDecorationChanges(editorState) {
244670
+ return this.#decorationBridge.hasChanges(editorState);
244671
+ }
244672
+ collectDecorationRanges(editorState) {
244673
+ return this.#decorationBridge.collectDecorationRanges(editorState);
244674
+ }
244675
+ syncDecorations(editorState, domPositionIndex, options) {
244676
+ if (!editorState)
244677
+ return false;
244678
+ return this.#decorationBridge.sync(editorState, domPositionIndex, options);
244679
+ }
244680
+ applyCommentHighlights() {
244681
+ this.#commentHighlightDecorator.apply();
244682
+ }
244683
+ syncInlineStyleLayers(editorState, domPositionIndex) {
244684
+ this.applyCommentHighlights();
244685
+ return this.syncDecorations(editorState, domPositionIndex);
244686
+ }
244687
+ applyProofingAnnotations(annotations, rebuildDomPositionIndex) {
244688
+ const mutated = this.#proofingDecorator.applyAnnotations(annotations);
244689
+ if (mutated)
244690
+ rebuildDomPositionIndex();
244691
+ return mutated;
244692
+ }
244693
+ refreshAfterPaint(options) {
244694
+ this.#fieldAnnotationLayer.apply(options.layoutEpoch);
244695
+ options.rebuildDomPositionIndex();
244696
+ this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
244697
+ this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
244698
+ options.reapplyStructuredContentHover?.();
244699
+ }
244700
+ destroy() {
244701
+ this.#proofingDecorator.clear();
244702
+ this.#fieldAnnotationLayer.clear();
244703
+ this.#commentHighlightDecorator.destroy();
244704
+ this.#decorationBridge.destroy();
244705
+ }
244055
244706
  }, ProofingStore = class {
244056
244707
  #issuesBySegment = /* @__PURE__ */ new Map;
244057
244708
  addIssue(issue) {
@@ -244983,9 +245634,8 @@ var Node$13 = class Node$14 {
244983
245634
  border-color: transparent;
244984
245635
  }
244985
245636
 
244986
- /* Group hover (JavaScript-coordinated) */
244987
- .superdoc-structured-content-block.sdt-group-hover:not(.ProseMirror-selectednode),
244988
- .superdoc-structured-content-block.sdt-hover:not(.ProseMirror-selectednode) {
245637
+ /* Group hover (JavaScript-coordinated via PresentationEditor) */
245638
+ .superdoc-structured-content-block.sdt-group-hover:not(.ProseMirror-selectednode) {
244989
245639
  background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
244990
245640
  border-color: transparent;
244991
245641
  }
@@ -245029,7 +245679,7 @@ var Node$13 = class Node$14 {
245029
245679
  }
245030
245680
 
245031
245681
  .superdoc-structured-content-block.ProseMirror-selectednode .superdoc-structured-content__label,
245032
- .superdoc-structured-content-block.sdt-hover:not(.ProseMirror-selectednode) .superdoc-structured-content__label {
245682
+ .superdoc-structured-content-block.sdt-group-hover:not(.ProseMirror-selectednode) .superdoc-structured-content__label {
245033
245683
  display: inline-flex;
245034
245684
  }
245035
245685
 
@@ -245117,10 +245767,10 @@ var Node$13 = class Node$14 {
245117
245767
 
245118
245768
  /* Hover highlight for SDT containers.
245119
245769
  * Hover adds background highlight and z-index boost.
245120
- * Block SDTs use .sdt-hover class (event delegation for multi-fragment coordination).
245770
+ * Block SDTs use .sdt-group-hover class (event delegation for multi-fragment coordination).
245121
245771
  * Inline SDTs use :hover (single element, no coordination needed).
245122
245772
  * Hover is suppressed when the node is selected (SD-1584). */
245123
- .superdoc-structured-content-block[data-lock-mode].sdt-hover:not(.ProseMirror-selectednode),
245773
+ .superdoc-structured-content-block[data-lock-mode].sdt-group-hover:not(.ProseMirror-selectednode),
245124
245774
  .superdoc-structured-content-inline[data-lock-mode]:hover:not(.ProseMirror-selectednode) {
245125
245775
  background-color: var(--sd-content-controls-lock-hover-bg, rgba(98, 155, 231, 0.08));
245126
245776
  z-index: 9999999;
@@ -245140,8 +245790,7 @@ var Node$13 = class Node$14 {
245140
245790
  }
245141
245791
 
245142
245792
  .presentation-editor--viewing .superdoc-structured-content-block.sdt-group-hover,
245143
- .presentation-editor--viewing .superdoc-structured-content-block.sdt-hover,
245144
- .presentation-editor--viewing .superdoc-structured-content-block[data-lock-mode].sdt-hover {
245793
+ .presentation-editor--viewing .superdoc-structured-content-block[data-lock-mode].sdt-group-hover {
245145
245794
  background: none;
245146
245795
  border: none;
245147
245796
  }
@@ -245178,11 +245827,8 @@ var Node$13 = class Node$14 {
245178
245827
  }
245179
245828
  }
245180
245829
  `, FIELD_ANNOTATION_STYLES = `
245181
- /* Field annotation draggable styles */
245182
- .superdoc-layout .annotation[data-draggable="true"] {
245183
- user-select: text;
245184
- }
245185
-
245830
+ /* Field annotation visual styles — suppress native selection artifacts.
245831
+ * Annotations are atomic inline nodes; native selection and caret look broken. */
245186
245832
  .superdoc-layout .annotation::selection,
245187
245833
  .superdoc-layout .annotation *::selection {
245188
245834
  background: transparent;
@@ -245197,41 +245843,7 @@ var Node$13 = class Node$14 {
245197
245843
  .superdoc-layout .annotation * {
245198
245844
  caret-color: transparent;
245199
245845
  }
245200
-
245201
- .superdoc-layout .annotation[data-draggable="true"]:hover {
245202
- opacity: 0.9;
245203
- }
245204
-
245205
- .superdoc-layout .annotation[data-draggable="true"]:active {
245206
- cursor: grabbing;
245207
- }
245208
-
245209
- /* Drag over indicator for drop targets */
245210
- .superdoc-layout.drag-over {
245211
- outline: 2px dashed #b015b3;
245212
- outline-offset: -2px;
245213
- }
245214
-
245215
- /* Drop zone indicator */
245216
- .superdoc-layout .superdoc-drop-indicator {
245217
- position: absolute;
245218
- width: 2px;
245219
- background-color: #b015b3;
245220
- pointer-events: none;
245221
- z-index: 1000;
245222
- }
245223
- `, IMAGE_SELECTION_STYLES, NATIVE_SELECTION_STYLES = `
245224
- /* Hide native browser selection on layout engine content.
245225
- * We render our own selection overlay via PresentationEditor's #localSelectionLayer
245226
- * for precise control over selection geometry across pages and zoom levels. */
245227
- .superdoc-layout *::selection {
245228
- background: transparent;
245229
- }
245230
-
245231
- .superdoc-layout *::-moz-selection {
245232
- background: transparent;
245233
- }
245234
- `, printStylesInjected = false, linkStylesInjected = false, trackChangeStylesInjected = false, sdtContainerStylesInjected = false, fieldAnnotationStylesInjected = false, imageSelectionStylesInjected = false, nativeSelectionStylesInjected = false, ensurePrintStyles = (doc$12) => {
245846
+ `, IMAGE_SELECTION_STYLES, printStylesInjected = false, linkStylesInjected = false, trackChangeStylesInjected = false, sdtContainerStylesInjected = false, fieldAnnotationStylesInjected = false, imageSelectionStylesInjected = false, ensurePrintStyles = (doc$12) => {
245235
245847
  if (printStylesInjected || !doc$12)
245236
245848
  return;
245237
245849
  const styleEl = doc$12.createElement("style");
@@ -245279,14 +245891,6 @@ var Node$13 = class Node$14 {
245279
245891
  styleEl.textContent = IMAGE_SELECTION_STYLES;
245280
245892
  doc$12.head?.appendChild(styleEl);
245281
245893
  imageSelectionStylesInjected = true;
245282
- }, ensureNativeSelectionStyles = (doc$12) => {
245283
- if (nativeSelectionStylesInjected || !doc$12)
245284
- return;
245285
- const styleEl = doc$12.createElement("style");
245286
- styleEl.setAttribute("data-superdoc-native-selection-styles", "true");
245287
- styleEl.textContent = NATIVE_SELECTION_STYLES;
245288
- doc$12.head?.appendChild(styleEl);
245289
- nativeSelectionStylesInjected = true;
245290
245894
  }, gradientIdCounter = 0, getFragmentParagraphBorders = (fragment2, blockLookup) => {
245291
245895
  const lookup3 = blockLookup.get(fragment2.blockId);
245292
245896
  if (!lookup3)
@@ -246673,57 +247277,6 @@ var Node$13 = class Node$14 {
246673
247277
  y$1 += actualRowHeight + cellSpacingPx;
246674
247278
  }
246675
247279
  return container;
246676
- }, SDT_BLOCK_SELECTOR, HOVER_CLASS, SdtGroupedHover = class {
246677
- constructor() {
246678
- this.hoveredSdtId = null;
246679
- this.mount = null;
246680
- this.onMouseOver = null;
246681
- this.onMouseLeave = null;
246682
- }
246683
- bind(mount) {
246684
- this.destroy();
246685
- this.mount = mount;
246686
- this.onMouseOver = (e) => {
246687
- const sdtId = e.target.closest?.(SDT_BLOCK_SELECTOR)?.dataset.sdtId ?? null;
246688
- if (sdtId === this.hoveredSdtId)
246689
- return;
246690
- if (this.hoveredSdtId)
246691
- sdtElementsById(mount, this.hoveredSdtId).forEach((el) => el.classList.remove(HOVER_CLASS));
246692
- this.hoveredSdtId = sdtId;
246693
- if (sdtId)
246694
- sdtElementsById(mount, sdtId).forEach((el) => {
246695
- if (!el.classList.contains("ProseMirror-selectednode"))
246696
- el.classList.add(HOVER_CLASS);
246697
- });
246698
- };
246699
- this.onMouseLeave = () => {
246700
- if (this.hoveredSdtId) {
246701
- sdtElementsById(mount, this.hoveredSdtId).forEach((el) => el.classList.remove(HOVER_CLASS));
246702
- this.hoveredSdtId = null;
246703
- }
246704
- };
246705
- mount.addEventListener("mouseover", this.onMouseOver);
246706
- mount.addEventListener("mouseleave", this.onMouseLeave);
246707
- }
246708
- reapply() {
246709
- if (this.hoveredSdtId && this.mount)
246710
- sdtElementsById(this.mount, this.hoveredSdtId).forEach((el) => {
246711
- if (!el.classList.contains("ProseMirror-selectednode"))
246712
- el.classList.add(HOVER_CLASS);
246713
- });
246714
- }
246715
- destroy() {
246716
- if (this.mount) {
246717
- if (this.onMouseOver)
246718
- this.mount.removeEventListener("mouseover", this.onMouseOver);
246719
- if (this.onMouseLeave)
246720
- this.mount.removeEventListener("mouseleave", this.onMouseLeave);
246721
- }
246722
- this.mount = null;
246723
- this.onMouseOver = null;
246724
- this.onMouseLeave = null;
246725
- this.hoveredSdtId = null;
246726
- }
246727
247280
  }, isRtlParagraph = (attrs) => attrs?.direction === "rtl" || attrs?.rtl === true, resolveTextAlign = (alignment$1, isRtl) => {
246728
247281
  switch (alignment$1) {
246729
247282
  case "center":
@@ -247553,7 +248106,7 @@ var Node$13 = class Node$14 {
247553
248106
  if (runToken === "totalPageCount")
247554
248107
  return context.totalPages ? String(context.totalPages) : run2.text ?? "";
247555
248108
  return run2.text ?? "";
247556
- }, PROOFING_CSS, splitOriginMap, createDomPainter = (options) => {
248109
+ }, createDomPainter = (options) => {
247557
248110
  if ((options.blocks ?? []).length !== (options.measures ?? []).length)
247558
248111
  throw new Error("DomPainter requires the same number of blocks and measures");
247559
248112
  const painter = new DomPainter({
@@ -247597,6 +248150,9 @@ var Node$13 = class Node$14 {
247597
248150
  setVirtualizationPins(pageIndices) {
247598
248151
  painter.setVirtualizationPins(pageIndices);
247599
248152
  },
248153
+ getMountedPageIndices() {
248154
+ return painter.getMountedPageIndices();
248155
+ },
247600
248156
  onScroll() {
247601
248157
  painter.onScroll();
247602
248158
  },
@@ -247607,46 +248163,184 @@ var Node$13 = class Node$14 {
247607
248163
  painter.setScrollContainer(el);
247608
248164
  }
247609
248165
  };
248166
+ }, PresentationPaintIndex = class {
248167
+ #snapshot = null;
248168
+ #annotationsByPmStart = /* @__PURE__ */ new Map;
248169
+ #annotationsByType = /* @__PURE__ */ new Map;
248170
+ #structuredContentBlocksById = /* @__PURE__ */ new Map;
248171
+ #structuredContentInlinesById = /* @__PURE__ */ new Map;
248172
+ #inlineImagesByPmStart = /* @__PURE__ */ new Map;
248173
+ #imageFragmentsByPmStart = /* @__PURE__ */ new Map;
248174
+ reset() {
248175
+ this.#snapshot = null;
248176
+ this.#annotationsByPmStart.clear();
248177
+ this.#annotationsByType.clear();
248178
+ this.#structuredContentBlocksById.clear();
248179
+ this.#structuredContentInlinesById.clear();
248180
+ this.#inlineImagesByPmStart.clear();
248181
+ this.#imageFragmentsByPmStart.clear();
248182
+ }
248183
+ update(snapshot2) {
248184
+ this.reset();
248185
+ this.#snapshot = snapshot2;
248186
+ if (!snapshot2?.entities)
248187
+ return;
248188
+ for (const annotation of snapshot2.entities.annotations) {
248189
+ if (!isMountedElement(annotation.element))
248190
+ continue;
248191
+ if (annotation.pmStart != null)
248192
+ this.#annotationsByPmStart.set(annotation.pmStart, annotation);
248193
+ if (annotation.type)
248194
+ appendToArrayMap(this.#annotationsByType, annotation.type, annotation);
248195
+ }
248196
+ for (const block of snapshot2.entities.structuredContentBlocks) {
248197
+ if (!isMountedElement(block.element))
248198
+ continue;
248199
+ appendToArrayMap(this.#structuredContentBlocksById, block.sdtId, block);
248200
+ }
248201
+ for (const inline of snapshot2.entities.structuredContentInlines) {
248202
+ if (!isMountedElement(inline.element))
248203
+ continue;
248204
+ appendToArrayMap(this.#structuredContentInlinesById, inline.sdtId, inline);
248205
+ }
248206
+ for (const image2 of snapshot2.entities.images) {
248207
+ if (!isMountedElement(image2.element) || image2.pmStart == null)
248208
+ continue;
248209
+ if (image2.kind === "inline") {
248210
+ if (shouldReplaceInlineImageEntity(this.#inlineImagesByPmStart.get(image2.pmStart), image2))
248211
+ this.#inlineImagesByPmStart.set(image2.pmStart, image2);
248212
+ continue;
248213
+ }
248214
+ this.#imageFragmentsByPmStart.set(image2.pmStart, image2);
248215
+ }
248216
+ }
248217
+ get snapshot() {
248218
+ return this.#snapshot;
248219
+ }
248220
+ getAnnotationElementByPmStart(pmStart) {
248221
+ return this.#annotationsByPmStart.get(pmStart)?.element ?? null;
248222
+ }
248223
+ getAnnotationEntitiesByType(type) {
248224
+ return [...this.#annotationsByType.get(type) ?? []];
248225
+ }
248226
+ getStructuredContentBlockElementsById(id2) {
248227
+ return (this.#structuredContentBlocksById.get(id2) ?? []).map((entity) => entity.element);
248228
+ }
248229
+ getStructuredContentInlineElementsById(id2) {
248230
+ return (this.#structuredContentInlinesById.get(id2) ?? []).map((entity) => entity.element);
248231
+ }
248232
+ getInlineImageElementByPmStart(pmStart) {
248233
+ return this.#inlineImagesByPmStart.get(pmStart)?.element ?? null;
248234
+ }
248235
+ getImageFragmentElementByPmStart(pmStart) {
248236
+ return this.#imageFragmentsByPmStart.get(pmStart)?.element ?? null;
248237
+ }
247610
248238
  }, PresentationPainterAdapter = class {
247611
248239
  #painter = null;
247612
248240
  #lastPaintSnapshot = null;
248241
+ #paintIndex = new PresentationPaintIndex;
248242
+ #headerProvider;
248243
+ #footerProvider;
248244
+ #zoom = 1;
248245
+ #scrollContainer = null;
248246
+ #virtualizationPins = [];
247613
248247
  get hasPainter() {
247614
248248
  return this.#painter !== null;
247615
248249
  }
247616
248250
  ensurePainter(options) {
247617
- if (!this.#painter)
248251
+ if (!this.#painter) {
247618
248252
  this.#painter = createDomPainter({
247619
248253
  ...options,
247620
248254
  onPaintSnapshot: (snapshot2) => {
247621
248255
  this.#lastPaintSnapshot = snapshot2;
248256
+ this.#paintIndex.update(snapshot2);
247622
248257
  }
247623
248258
  });
248259
+ this.#applyPainterSurfaceState();
248260
+ }
247624
248261
  }
247625
248262
  reset() {
247626
248263
  this.#painter = null;
247627
248264
  this.#lastPaintSnapshot = null;
248265
+ this.#paintIndex.reset();
247628
248266
  }
247629
248267
  paint(input2, mount, mapping) {
247630
248268
  this.#painter?.paint(input2, mount, mapping);
247631
248269
  }
247632
248270
  setProviders(header, footer) {
247633
- this.#painter?.setProviders(header, footer);
248271
+ if (this.#headerProvider === header && this.#footerProvider === footer)
248272
+ return;
248273
+ this.#headerProvider = header;
248274
+ this.#footerProvider = footer;
248275
+ this.#applyProviders();
247634
248276
  }
247635
248277
  setZoom(zoom) {
247636
- this.#painter?.setZoom(zoom);
248278
+ if (this.#zoom === zoom)
248279
+ return;
248280
+ this.#zoom = zoom;
248281
+ this.#applyZoom();
247637
248282
  }
247638
248283
  setScrollContainer(el) {
247639
- this.#painter?.setScrollContainer(el);
248284
+ if (this.#scrollContainer === el)
248285
+ return;
248286
+ this.#scrollContainer = el;
248287
+ this.#applyScrollContainer();
247640
248288
  }
247641
248289
  onScroll() {
247642
248290
  this.#painter?.onScroll();
247643
248291
  }
247644
248292
  setVirtualizationPins(pageIndices) {
247645
- this.#painter?.setVirtualizationPins(pageIndices);
248293
+ const normalizedPins = normalizePinnedPageIndices(pageIndices);
248294
+ if (areNumberListsEqual(this.#virtualizationPins, normalizedPins))
248295
+ return;
248296
+ this.#virtualizationPins = normalizedPins;
248297
+ this.#applyVirtualizationPins();
247646
248298
  }
247647
248299
  getPaintSnapshot() {
247648
248300
  return this.#lastPaintSnapshot;
247649
248301
  }
248302
+ getMountedPageIndices() {
248303
+ const mountedPageIndices = this.#painter?.getMountedPageIndices();
248304
+ if (mountedPageIndices)
248305
+ return [...mountedPageIndices];
248306
+ return this.#lastPaintSnapshot?.pages.map((page) => page.index) ?? [];
248307
+ }
248308
+ getAnnotationElementByPmStart(pmStart) {
248309
+ return this.#paintIndex.getAnnotationElementByPmStart(pmStart);
248310
+ }
248311
+ getAnnotationEntitiesByType(type) {
248312
+ return this.#paintIndex.getAnnotationEntitiesByType(type);
248313
+ }
248314
+ getStructuredContentBlockElementsById(id2) {
248315
+ return this.#paintIndex.getStructuredContentBlockElementsById(id2);
248316
+ }
248317
+ getStructuredContentInlineElementsById(id2) {
248318
+ return this.#paintIndex.getStructuredContentInlineElementsById(id2);
248319
+ }
248320
+ getInlineImageElementByPmStart(pmStart) {
248321
+ return this.#paintIndex.getInlineImageElementByPmStart(pmStart);
248322
+ }
248323
+ getImageFragmentElementByPmStart(pmStart) {
248324
+ return this.#paintIndex.getImageFragmentElementByPmStart(pmStart);
248325
+ }
248326
+ #applyPainterSurfaceState() {
248327
+ this.#applyProviders();
248328
+ this.#applyZoom();
248329
+ this.#applyScrollContainer();
248330
+ this.#applyVirtualizationPins();
248331
+ }
248332
+ #applyProviders() {
248333
+ this.#painter?.setProviders(this.#headerProvider, this.#footerProvider);
248334
+ }
248335
+ #applyZoom() {
248336
+ this.#painter?.setZoom(this.#zoom);
248337
+ }
248338
+ #applyScrollContainer() {
248339
+ this.#painter?.setScrollContainer(this.#scrollContainer);
248340
+ }
248341
+ #applyVirtualizationPins() {
248342
+ this.#painter?.setVirtualizationPins(this.#virtualizationPins);
248343
+ }
247650
248344
  }, SINGLE_COLUMN_DEFAULT, isTextRun$5 = (run2) => {
247651
248345
  const runWithKind = run2;
247652
248346
  return !runWithKind.kind || runWithKind.kind === "text";
@@ -253465,8 +254159,8 @@ var Node$13 = class Node$14 {
253465
254159
  this.#handleLinkClick(event, linkEl);
253466
254160
  return;
253467
254161
  }
253468
- const annotationEl = target?.closest?.(".annotation[data-pm-start]");
253469
- const isDraggableAnnotation = target?.closest?.('[data-draggable="true"]') != null;
254162
+ const annotationEl = target?.closest?.(buildAnnotationSelector());
254163
+ const isDraggableAnnotation = target?.closest?.(DRAGGABLE_SELECTOR) != null;
253470
254164
  this.#suppressFocusInFromDraggable = isDraggableAnnotation;
253471
254165
  if (annotationEl) {
253472
254166
  this.#handleAnnotationClick(event, annotationEl);
@@ -253735,7 +254429,7 @@ var Node$13 = class Node$14 {
253735
254429
  if (event.button !== 0)
253736
254430
  return;
253737
254431
  const target = event.target;
253738
- const annotationEl = target?.closest?.(".annotation[data-pm-start]");
254432
+ const annotationEl = target?.closest?.(buildAnnotationSelector());
253739
254433
  if (annotationEl) {
253740
254434
  event.preventDefault();
253741
254435
  event.stopPropagation();
@@ -254039,7 +254733,7 @@ var Node$13 = class Node$14 {
254039
254733
  try {
254040
254734
  const tr = editor.state.tr.setSelection(NodeSelection.create(doc$12, clampedImgPos));
254041
254735
  editor.view?.dispatch(tr);
254042
- const targetElement = this.#deps?.getViewportHost()?.querySelector(buildInlineImagePmSelector(imgPmStart));
254736
+ const targetElement = this.#callbacks.resolveInlineImageElementByPmStart?.(imgPmStart) ?? null;
254043
254737
  const elementForHighlight = wrapper ?? targetElement ?? targetImg;
254044
254738
  this.#callbacks.emit?.("imageSelected", {
254045
254739
  element: elementForHighlight,
@@ -254066,7 +254760,7 @@ var Node$13 = class Node$14 {
254066
254760
  if (this.#lastSelectedImageBlockId && this.#lastSelectedImageBlockId !== fragmentHit.fragment.blockId)
254067
254761
  this.#callbacks.emit?.("imageDeselected", { blockId: this.#lastSelectedImageBlockId });
254068
254762
  if (fragmentHit.fragment.kind === "image") {
254069
- const targetElement = this.#deps?.getViewportHost()?.querySelector(`.${DOM_CLASS_NAMES.IMAGE_FRAGMENT}[data-pm-start="${fragmentHit.fragment.pmStart}"]`);
254763
+ const targetElement = fragmentHit.fragment.pmStart != null ? this.#callbacks.resolveImageFragmentElementByPmStart?.(fragmentHit.fragment.pmStart) ?? null : null;
254070
254764
  if (targetElement) {
254071
254765
  this.#callbacks.emit?.("imageSelected", {
254072
254766
  element: targetElement,
@@ -254722,7 +255416,7 @@ var Node$13 = class Node$14 {
254722
255416
  }
254723
255417
  #handleDragStart(event) {
254724
255418
  const target = event.target;
254725
- if (!target?.dataset?.draggable || target.dataset.draggable !== "true")
255419
+ if (!target?.dataset?.[DATASET_KEYS.DRAGGABLE] || target.dataset[DATASET_KEYS.DRAGGABLE] !== "true")
254726
255420
  return;
254727
255421
  const data = extractFieldAnnotationData(target);
254728
255422
  if (event.dataTransfer) {
@@ -256668,14 +257362,55 @@ var Node$13 = class Node$14 {
256668
257362
  this.#hoverRegion = null;
256669
257363
  this.#overlayManager = null;
256670
257364
  }
256671
- }, DEFAULT_SEMANTIC_FOOTNOTE_HEADING_STYLE, DOCUMENT_RELS_PART_ID = "word/_rels/document.xml.rels", DEFAULT_PAGE_SIZE, DEFAULT_MARGINS, DEFAULT_PAGE_GAP = 24, DEFAULT_HORIZONTAL_PAGE_GAP = 20, layoutDebugEnabled, perfLog = (...args$1) => {
257365
+ }, DEFAULT_SEMANTIC_FOOTNOTE_HEADING_STYLE, NATIVE_SELECTION_STYLES = `
257366
+ /* Hide native browser selection on layout engine content.
257367
+ * We render our own selection overlay via PresentationEditor's #localSelectionLayer
257368
+ * for precise control over selection geometry across pages and zoom levels. */
257369
+ .superdoc-layout *::selection {
257370
+ background: transparent;
257371
+ }
257372
+
257373
+ .superdoc-layout *::-moz-selection {
257374
+ background: transparent;
257375
+ }
257376
+ `, nativeSelectionStylesInjected = false, FIELD_ANNOTATION_INTERACTION_STYLES = `
257377
+ /* Editing affordance: allow text selection on draggable annotations */
257378
+ .superdoc-layout .annotation[data-draggable="true"] {
257379
+ user-select: text;
257380
+ }
257381
+
257382
+ /* Editing affordance: hover feedback */
257383
+ .superdoc-layout .annotation[data-draggable="true"]:hover {
257384
+ opacity: 0.9;
257385
+ }
257386
+
257387
+ /* Editing affordance: active/grab cursor */
257388
+ .superdoc-layout .annotation[data-draggable="true"]:active {
257389
+ cursor: grabbing;
257390
+ }
257391
+
257392
+ /* Editing affordance: drag over indicator for drop targets */
257393
+ .superdoc-layout.drag-over {
257394
+ outline: 2px dashed #b015b3;
257395
+ outline-offset: -2px;
257396
+ }
257397
+
257398
+ /* Editing affordance: drop zone indicator */
257399
+ .superdoc-layout .superdoc-drop-indicator {
257400
+ position: absolute;
257401
+ width: 2px;
257402
+ background-color: #b015b3;
257403
+ pointer-events: none;
257404
+ z-index: 1000;
257405
+ }
257406
+ `, fieldAnnotationInteractionStylesInjected = false, DOCUMENT_RELS_PART_ID = "word/_rels/document.xml.rels", DEFAULT_PAGE_SIZE, DEFAULT_MARGINS, DEFAULT_PAGE_GAP = 24, DEFAULT_HORIZONTAL_PAGE_GAP = 20, layoutDebugEnabled, perfLog = (...args$1) => {
256672
257407
  if (!layoutDebugEnabled)
256673
257408
  return;
256674
257409
  console.log(...args$1);
256675
257410
  }, HEADER_FOOTER_INIT_BUDGET_MS = 200, MAX_ZOOM_WARNING_THRESHOLD = 10, MAX_SELECTION_RECTS_PER_USER = 100, SEMANTIC_RESIZE_DEBOUNCE_MS = 120, MIN_SEMANTIC_CONTENT_WIDTH_PX = 1, GLOBAL_PERFORMANCE, PresentationEditor, ICONS, TEXTS, tableActionsOptions;
256676
- var init_src_fbRRkK8t_es = __esm(() => {
257411
+ var init_src_sJ2EXqLW_es = __esm(() => {
256677
257412
  init_rolldown_runtime_B2q5OVn9_es();
256678
- init_SuperConverter_C6rVgqDZ_es();
257413
+ init_SuperConverter_DerEPM5g_es();
256679
257414
  init_jszip_ChlR43oI_es();
256680
257415
  init_uuid_qzgm05fK_es();
256681
257416
  init_constants_CIF8yzNk_es();
@@ -274765,17 +275500,44 @@ function print() { __p += __j.call(arguments, '') }
274765
275500
  BLOCK_SDT: "superdoc-structured-content-block",
274766
275501
  TABLE_FRAGMENT: "superdoc-table-fragment",
274767
275502
  DOCUMENT_SECTION: "superdoc-document-section",
274768
- SDT_HOVER: "sdt-hover",
275503
+ SDT_GROUP_HOVER: "sdt-group-hover",
274769
275504
  IMAGE_FRAGMENT: "superdoc-image-fragment",
274770
275505
  INLINE_IMAGE: "superdoc-inline-image",
274771
- INLINE_IMAGE_CLIP_WRAPPER: "superdoc-inline-image-clip-wrapper"
275506
+ INLINE_IMAGE_CLIP_WRAPPER: "superdoc-inline-image-clip-wrapper",
275507
+ ANNOTATION: "annotation",
275508
+ ANNOTATION_CONTENT: "annotation-content",
275509
+ ANNOTATION_CARET_ANCHOR: "annotation-caret-anchor"
274772
275510
  };
274773
275511
  DATA_ATTRS = {
274774
275512
  PM_START: "data-pm-start",
274775
275513
  PM_END: "data-pm-end",
274776
275514
  LAYOUT_EPOCH: "data-layout-epoch",
274777
- TABLE_BOUNDARIES: "data-table-boundaries"
274778
- };
275515
+ TABLE_BOUNDARIES: "data-table-boundaries",
275516
+ SDT_ID: "data-sdt-id",
275517
+ SDT_TYPE: "data-sdt-type",
275518
+ FIELD_ID: "data-field-id",
275519
+ FIELD_TYPE: "data-field-type",
275520
+ DRAGGABLE: "data-draggable",
275521
+ DISPLAY_LABEL: "data-display-label",
275522
+ VARIANT: "data-variant",
275523
+ TYPE: "data-type"
275524
+ };
275525
+ DATASET_KEYS = {
275526
+ PM_START: "pmStart",
275527
+ PM_END: "pmEnd",
275528
+ LAYOUT_EPOCH: "layoutEpoch",
275529
+ TABLE_BOUNDARIES: "tableBoundaries",
275530
+ SDT_ID: "sdtId",
275531
+ SDT_TYPE: "sdtType",
275532
+ FIELD_ID: "fieldId",
275533
+ FIELD_TYPE: "fieldType",
275534
+ DRAGGABLE: "draggable",
275535
+ DISPLAY_LABEL: "displayLabel",
275536
+ VARIANT: "variant",
275537
+ TYPE: "type"
275538
+ };
275539
+ `${DOM_CLASS_NAMES.BLOCK_SDT}${DATA_ATTRS.SDT_ID}`;
275540
+ DRAGGABLE_SELECTOR = `[${DATA_ATTRS.DRAGGABLE}="true"]`;
274779
275541
  VerticalNavigationPluginKey = new PluginKey("verticalNavigation");
274780
275542
  VerticalNavigation = Extension.create({
274781
275543
  name: "verticalNavigation",
@@ -282130,6 +282892,18 @@ function print() { __p += __j.call(arguments, '') }
282130
282892
  "search",
282131
282893
  "yjs-cursor"
282132
282894
  ];
282895
+ DISPLAY_LABEL_SOURCE = {
282896
+ CANONICAL: "canonical",
282897
+ DERIVED: "derived"
282898
+ };
282899
+ PROOFING_CSS = {
282900
+ SPELLING: "sd-proofing-spelling",
282901
+ GRAMMAR: "sd-proofing-grammar",
282902
+ STYLE: "sd-proofing-style",
282903
+ DATA_ATTR: "data-sd-proofing",
282904
+ SPLIT_ATTR: "data-sd-proofing-split"
282905
+ };
282906
+ splitOriginMap = /* @__PURE__ */ new WeakMap;
282133
282907
  NON_TEXT_INLINE_NODES = new Set([
282134
282908
  "fieldAnnotation",
282135
282909
  "image",
@@ -282346,8 +283120,6 @@ function print() { __p += __j.call(arguments, '') }
282346
283120
  "wave",
282347
283121
  "doubleWave"
282348
283122
  ]);
282349
- SDT_BLOCK_SELECTOR = `.${DOM_CLASS_NAMES.BLOCK_SDT}[data-sdt-id]`;
282350
- HOVER_CLASS = DOM_CLASS_NAMES.SDT_HOVER;
282351
283123
  OPERATOR_CHARS = new Set([
282352
283124
  "+",
282353
283125
  "-",
@@ -282543,10 +283315,10 @@ function print() { __p += __j.call(arguments, '') }
282543
283315
  this.zoomFactor = 1;
282544
283316
  this.scrollContainer = null;
282545
283317
  this.scrollContainerMountOffset = null;
282546
- this.sdtHover = new SdtGroupedHover;
282547
283318
  this.paintSnapshotBuilder = null;
282548
283319
  this.lastPaintSnapshot = null;
282549
283320
  this.onPaintSnapshotCallback = null;
283321
+ this.mountedPageIndices = [];
282550
283322
  this.resolvedLayout = null;
282551
283323
  this.options = options;
282552
283324
  this.layoutMode = options.layoutMode ?? "vertical";
@@ -282609,6 +283381,15 @@ function print() { __p += __j.call(arguments, '') }
282609
283381
  getPaintSnapshot() {
282610
283382
  return this.lastPaintSnapshot;
282611
283383
  }
283384
+ getMountedPageIndices() {
283385
+ return [...this.mountedPageIndices];
283386
+ }
283387
+ createAllPageIndices(pageCount) {
283388
+ return Array.from({ length: pageCount }, (_$1, pageIndex) => pageIndex);
283389
+ }
283390
+ setMountedPageIndices(pageIndices) {
283391
+ this.mountedPageIndices = [...pageIndices];
283392
+ }
282612
283393
  emitPaintSnapshot(snapshot2) {
282613
283394
  this.lastPaintSnapshot = snapshot2;
282614
283395
  this.onPaintSnapshotCallback?.(snapshot2);
@@ -282627,7 +283408,7 @@ function print() { __p += __j.call(arguments, '') }
282627
283408
  }))
282628
283409
  };
282629
283410
  }
282630
- finalizePaintSnapshotFromBuilder() {
283411
+ finalizePaintSnapshotFromBuilder(rootEl) {
282631
283412
  const builder = this.paintSnapshotBuilder;
282632
283413
  if (!builder) {
282633
283414
  this.lastPaintSnapshot = null;
@@ -282645,7 +283426,8 @@ function print() { __p += __j.call(arguments, '') }
282645
283426
  lineCount: builder.lineCount,
282646
283427
  markerCount: builder.markerCount,
282647
283428
  tabCount: builder.tabCount,
282648
- pages
283429
+ pages,
283430
+ entities: rootEl ? collectPaintSnapshotEntitiesFromDomRoot(rootEl) : createEmptyPaintSnapshotEntities()
282649
283431
  });
282650
283432
  this.paintSnapshotBuilder = null;
282651
283433
  }
@@ -282724,7 +283506,8 @@ function print() { __p += __j.call(arguments, '') }
282724
283506
  lineCount,
282725
283507
  markerCount,
282726
283508
  tabCount,
282727
- pages
283509
+ pages,
283510
+ entities: collectPaintSnapshotEntitiesFromDomRoot(rootEl)
282728
283511
  };
282729
283512
  }
282730
283513
  normalizeOptionalBlockMeasurePair(label, blocks2, measures) {
@@ -282784,7 +283567,6 @@ function print() { __p += __j.call(arguments, '') }
282784
283567
  ensureFieldAnnotationStyles(doc$12);
282785
283568
  ensureSdtContainerStyles(doc$12);
282786
283569
  ensureImageSelectionStyles(doc$12);
282787
- ensureNativeSelectionStyles(doc$12);
282788
283570
  if (!this.isSemanticFlow && this.options.ruler?.enabled)
282789
283571
  ensureRulerStyles(doc$12);
282790
283572
  mount.classList.add(CLASS_NAMES$1.container);
@@ -282803,6 +283585,7 @@ function print() { __p += __j.call(arguments, '') }
282803
283585
  this.fullRender(layout);
282804
283586
  else
282805
283587
  this.patchLayout(layout);
283588
+ this.setMountedPageIndices(this.createAllPageIndices(layout.pages.length));
282806
283589
  this.currentLayout = layout;
282807
283590
  this.changedBlocks.clear();
282808
283591
  this.currentMapping = null;
@@ -282814,7 +283597,8 @@ function print() { __p += __j.call(arguments, '') }
282814
283597
  applyStyles(mount, containerStylesHorizontal);
282815
283598
  mount.style.gap = `${this.pageGap}px`;
282816
283599
  this.renderHorizontal(layout, mount);
282817
- this.finalizePaintSnapshotFromBuilder();
283600
+ this.finalizePaintSnapshotFromBuilder(mount);
283601
+ this.setMountedPageIndices(this.createAllPageIndices(layout.pages.length));
282818
283602
  this.currentLayout = layout;
282819
283603
  this.pageStates = [];
282820
283604
  this.changedBlocks.clear();
@@ -282824,7 +283608,8 @@ function print() { __p += __j.call(arguments, '') }
282824
283608
  if (mode === "book") {
282825
283609
  applyStyles(mount, containerStyles);
282826
283610
  this.renderBookMode(layout, mount);
282827
- this.finalizePaintSnapshotFromBuilder();
283611
+ this.finalizePaintSnapshotFromBuilder(mount);
283612
+ this.setMountedPageIndices(this.createAllPageIndices(layout.pages.length));
282828
283613
  this.currentLayout = layout;
282829
283614
  this.pageStates = [];
282830
283615
  this.changedBlocks.clear();
@@ -282847,12 +283632,13 @@ function print() { __p += __j.call(arguments, '') }
282847
283632
  this.patchLayout(layout);
282848
283633
  useDomSnapshotFallback = true;
282849
283634
  }
283635
+ this.setMountedPageIndices(this.createAllPageIndices(layout.pages.length));
282850
283636
  }
282851
283637
  if (useDomSnapshotFallback) {
282852
283638
  this.emitPaintSnapshot(this.collectPaintSnapshotFromDomRoot(mount));
282853
283639
  this.paintSnapshotBuilder = null;
282854
283640
  } else
282855
- this.finalizePaintSnapshotFromBuilder();
283641
+ this.finalizePaintSnapshotFromBuilder(mount);
282856
283642
  this.currentLayout = layout;
282857
283643
  this.changedBlocks.clear();
282858
283644
  this.currentMapping = null;
@@ -282920,7 +283706,6 @@ function print() { __p += __j.call(arguments, '') }
282920
283706
  };
282921
283707
  win.addEventListener("resize", this.onResizeHandler);
282922
283708
  }
282923
- this.sdtHover.bind(mount);
282924
283709
  }
282925
283710
  computeVirtualMetrics() {
282926
283711
  if (!this.currentLayout)
@@ -282971,6 +283756,7 @@ function print() { __p += __j.call(arguments, '') }
282971
283756
  const N = layout.pages.length;
282972
283757
  if (N === 0) {
282973
283758
  this.mount.innerHTML = "";
283759
+ this.setMountedPageIndices([]);
282974
283760
  this.processedLayoutVersion = this.layoutVersion;
282975
283761
  return;
282976
283762
  }
@@ -283028,6 +283814,7 @@ function print() { __p += __j.call(arguments, '') }
283028
283814
  this.virtualMountedKey = mountedKey;
283029
283815
  this.virtualStart = start$1;
283030
283816
  this.virtualEnd = end$1;
283817
+ this.setMountedPageIndices(mounted);
283031
283818
  this.updateSpacersForMountedPages(mounted);
283032
283819
  this.clearGapSpacers();
283033
283820
  this.sdtLabelsRendered.clear();
@@ -283081,7 +283868,6 @@ function print() { __p += __j.call(arguments, '') }
283081
283868
  }
283082
283869
  this.changedBlocks.clear();
283083
283870
  this.processedLayoutVersion = this.layoutVersion;
283084
- this.sdtHover.reapply();
283085
283871
  }
283086
283872
  updateSpacers(start$1, end$1) {
283087
283873
  if (!this.topSpacerEl || !this.bottomSpacerEl)
@@ -283403,11 +284189,11 @@ function print() { __p += __j.call(arguments, '') }
283403
284189
  this.onWindowScrollHandler = null;
283404
284190
  this.onResizeHandler = null;
283405
284191
  this.scrollContainerMountOffset = null;
283406
- this.sdtHover.destroy();
283407
284192
  this.layoutVersion = 0;
283408
284193
  this.processedLayoutVersion = -1;
283409
284194
  this.paintSnapshotBuilder = null;
283410
284195
  this.lastPaintSnapshot = null;
284196
+ this.mountedPageIndices = [];
283411
284197
  }
283412
284198
  fullRender(layout) {
283413
284199
  if (!this.mount || !this.doc)
@@ -285195,7 +285981,7 @@ function print() { __p += __j.call(arguments, '') }
285195
285981
  const defaultBorderColor = "#b015b3";
285196
285982
  const defaultFieldColor = "#980043";
285197
285983
  const annotation = this.doc.createElement("span");
285198
- annotation.classList.add("annotation");
285984
+ annotation.classList.add(DOM_CLASS_NAMES.ANNOTATION);
285199
285985
  annotation.setAttribute("aria-label", "Field annotation");
285200
285986
  if (run2.highlighted !== false) {
285201
285987
  const borderColor = run2.borderColor || defaultBorderColor;
@@ -285241,7 +286027,7 @@ function print() { __p += __j.call(arguments, '') }
285241
286027
  annotation.style.textDecoration = "underline";
285242
286028
  annotation.style.zIndex = "1";
285243
286029
  const content3 = this.doc.createElement("span");
285244
- content3.classList.add("annotation-content");
286030
+ content3.classList.add(DOM_CLASS_NAMES.ANNOTATION_CONTENT);
285245
286031
  content3.style.pointerEvents = "none";
285246
286032
  content3.setAttribute("contenteditable", "false");
285247
286033
  switch (run2.variant) {
@@ -285315,48 +286101,20 @@ function print() { __p += __j.call(arguments, '') }
285315
286101
  }
285316
286102
  annotation.appendChild(content3);
285317
286103
  annotation.dataset.type = run2.variant;
286104
+ annotation.dataset.displayLabel = run2.displayLabel;
285318
286105
  if (run2.fieldId)
285319
286106
  annotation.dataset.fieldId = run2.fieldId;
285320
286107
  if (run2.fieldType)
285321
286108
  annotation.dataset.fieldType = run2.fieldType;
285322
- annotation.draggable = true;
285323
- annotation.dataset.draggable = "true";
285324
- if (run2.displayLabel)
285325
- annotation.dataset.displayLabel = run2.displayLabel;
285326
- if (run2.variant)
285327
- annotation.dataset.variant = run2.variant;
285328
286109
  assertPmPositions(run2, "field annotation run");
285329
286110
  if (run2.pmStart != null)
285330
286111
  annotation.dataset.pmStart = String(run2.pmStart);
285331
286112
  if (run2.pmEnd != null)
285332
286113
  annotation.dataset.pmEnd = String(run2.pmEnd);
285333
286114
  annotation.dataset.layoutEpoch = String(this.layoutEpoch);
285334
- this.appendAnnotationCaretAnchor(annotation, run2);
285335
286115
  this.applySdtDataset(annotation, run2.sdt);
285336
286116
  return annotation;
285337
286117
  }
285338
- appendAnnotationCaretAnchor(annotation, run2) {
285339
- if (!this.doc || run2.pmEnd == null)
285340
- return;
285341
- const caretAnchor = this.doc.createElement("span");
285342
- caretAnchor.dataset.pmStart = String(run2.pmEnd);
285343
- caretAnchor.dataset.pmEnd = String(run2.pmEnd);
285344
- caretAnchor.dataset.layoutEpoch = String(this.layoutEpoch);
285345
- caretAnchor.classList.add("annotation-caret-anchor");
285346
- caretAnchor.style.position = "absolute";
285347
- caretAnchor.style.left = "100%";
285348
- caretAnchor.style.top = "0";
285349
- caretAnchor.style.width = "0";
285350
- caretAnchor.style.height = "1em";
285351
- caretAnchor.style.overflow = "hidden";
285352
- caretAnchor.style.pointerEvents = "none";
285353
- caretAnchor.style.userSelect = "none";
285354
- caretAnchor.style.opacity = "0";
285355
- caretAnchor.textContent = "​";
285356
- if (!annotation.style.position)
285357
- annotation.style.position = "relative";
285358
- annotation.appendChild(caretAnchor);
285359
- }
285360
286118
  renderLine(block, line, context, availableWidthOverride, lineIndex, skipJustify, resolvedListTextStartPx, indentOffsetOverride) {
285361
286119
  if (!this.doc)
285362
286120
  throw new Error("DomPainter: document is not available");
@@ -286111,14 +286869,6 @@ function print() { __p += __j.call(arguments, '') }
286111
286869
  "path(",
286112
286870
  "rect("
286113
286871
  ];
286114
- PROOFING_CSS = {
286115
- SPELLING: "sd-proofing-spelling",
286116
- GRAMMAR: "sd-proofing-grammar",
286117
- STYLE: "sd-proofing-style",
286118
- DATA_ATTR: "data-sd-proofing",
286119
- SPLIT_ATTR: "data-sd-proofing-split"
286120
- };
286121
- splitOriginMap = /* @__PURE__ */ new WeakMap;
286122
286872
  SINGLE_COLUMN_DEFAULT = {
286123
286873
  count: 1,
286124
286874
  gap: 0
@@ -287256,8 +288006,7 @@ function print() { __p += __j.call(arguments, '') }
287256
288006
  #htmlAnnotationMeasureAttempts = 0;
287257
288007
  #domPositionIndex = new DomPositionIndex;
287258
288008
  #domIndexObserverManager = null;
287259
- #decorationBridge = new DecorationBridge;
287260
- #commentHighlightDecorator = new CommentHighlightDecorator;
288009
+ #postPaintPipeline = new PresentationPostPaintPipeline;
287261
288010
  #proofingManager = null;
287262
288011
  #decorationSyncRafHandle = null;
287263
288012
  #rafHandle = null;
@@ -287348,15 +288097,16 @@ function print() { __p += __j.call(arguments, '') }
287348
288097
  this.#painterHost.className = "presentation-editor__pages";
287349
288098
  this.#painterHost.style.transformOrigin = "top left";
287350
288099
  this.#viewportHost.appendChild(this.#painterHost);
287351
- this.#commentHighlightDecorator.setContainer(this.#painterHost);
288100
+ this.#postPaintPipeline.setContainer(this.#painterHost);
288101
+ ensureEditorNativeSelectionStyles(doc$12);
288102
+ ensureEditorFieldAnnotationInteractionStyles(doc$12);
287352
288103
  this.#painterHost.addEventListener("mouseover", this.#handleStructuredContentBlockMouseEnter);
287353
288104
  this.#painterHost.addEventListener("mouseout", this.#handleStructuredContentBlockMouseLeave);
287354
288105
  this.#domIndexObserverManager = new DomPositionIndexObserverManager({
287355
288106
  windowRoot: this.#visibleHost?.ownerDocument?.defaultView ?? window,
287356
288107
  getPainterHost: () => this.#painterHost,
287357
288108
  onRebuild: () => {
287358
- this.#rebuildDomPositionIndex();
287359
- this.#syncInlineStyleLayers();
288109
+ this.#refreshEditorDomAugmentations();
287360
288110
  this.#selectionSync.requestRender({ immediate: true });
287361
288111
  }
287362
288112
  });
@@ -288624,8 +289374,7 @@ function print() { __p += __j.call(arguments, '') }
288624
289374
  (this.#visibleHost?.ownerDocument?.defaultView ?? window).cancelAnimationFrame(this.#decorationSyncRafHandle);
288625
289375
  this.#decorationSyncRafHandle = null;
288626
289376
  }, "Decoration sync RAF");
288627
- this.#decorationBridge.destroy();
288628
- this.#commentHighlightDecorator.destroy();
289377
+ this.#postPaintPipeline.destroy();
288629
289378
  this.#proofingManager?.dispose();
288630
289379
  this.#proofingManager = null;
288631
289380
  if (this.#cursorUpdateTimer !== null) {
@@ -288744,18 +289493,8 @@ function print() { __p += __j.call(arguments, '') }
288744
289493
  mgr.setDocumentId(this.#options.documentId ?? null);
288745
289494
  mgr.onResultsChanged = () => this.#applyProofingPass();
288746
289495
  mgr.setVisibilitySource({ getVisiblePageIndices: () => {
288747
- if (!this.#painterHost)
288748
- return null;
288749
- const pageEls = this.#painterHost.querySelectorAll("[data-page-index]");
288750
- if (pageEls.length === 0)
288751
- return null;
288752
- const indices = [];
288753
- for (let i4 = 0;i4 < pageEls.length; i4++) {
288754
- const idx = parseInt(pageEls[i4].getAttribute("data-page-index"), 10);
288755
- if (!isNaN(idx))
288756
- indices.push(idx);
288757
- }
288758
- return indices.length > 0 ? indices : null;
289496
+ const mountedPageIndices = this.#painterAdapter.getMountedPageIndices();
289497
+ return mountedPageIndices.length > 0 ? mountedPageIndices : null;
288759
289498
  } });
288760
289499
  mgr.setPageResolver(this.#buildPageResolver());
288761
289500
  const editorDom = this.#editor?.view?.dom;
@@ -288764,25 +289503,21 @@ function print() { __p += __j.call(arguments, '') }
288764
289503
  editorDom.addEventListener("compositionend", () => mgr.setComposing(false));
288765
289504
  }
288766
289505
  }
288767
- #applyProofingPass() {
288768
- if (!this.#painterHost)
288769
- return;
288770
- if (!this.#proofingManager?.isEnabled) {
288771
- if (clearProofingDecorations(this.#painterHost))
288772
- this.#rebuildDomPositionIndex();
288773
- return;
288774
- }
289506
+ #buildProofingAnnotations() {
289507
+ if (!this.#proofingManager?.isEnabled)
289508
+ return null;
288775
289509
  const editorState = this.#editor?.state;
288776
289510
  let activeWordRange = null;
288777
289511
  if (editorState?.selection.empty)
288778
289512
  activeWordRange = computeWordSelectionRangeAt(editorState, editorState.selection.head);
288779
- const annotations = this.#proofingManager.getPaintSlices(activeWordRange).map((s2) => ({
289513
+ return this.#proofingManager.getPaintSlices(activeWordRange).map((s2) => ({
288780
289514
  pmFrom: s2.pmFrom,
288781
289515
  pmTo: s2.pmTo,
288782
289516
  kind: s2.kind
288783
289517
  }));
288784
- if (applyProofingDecorations(this.#painterHost, annotations))
288785
- this.#rebuildDomPositionIndex();
289518
+ }
289519
+ #applyProofingPass() {
289520
+ this.#postPaintPipeline.applyProofingAnnotations(this.#buildProofingAnnotations(), () => this.#rebuildDomPositionIndex());
288786
289521
  }
288787
289522
  #notifyProofingOfDocChange(transaction) {
288788
289523
  if (!this.#proofingManager?.isEnabled)
@@ -288804,18 +289539,26 @@ function print() { __p += __j.call(arguments, '') }
288804
289539
  this.#proofingManager.onDocumentChanged(doc$12, changedRanges, transaction.mapping);
288805
289540
  }
288806
289541
  #syncCommentHighlights() {
288807
- this.#commentHighlightDecorator.apply();
289542
+ this.#postPaintPipeline.applyCommentHighlights();
288808
289543
  }
288809
289544
  #syncInlineStyleLayers() {
288810
- this.#syncCommentHighlights();
288811
- this.#syncDecorations();
289545
+ const state = this.#editor?.view?.state;
289546
+ if (!state) {
289547
+ this.#syncCommentHighlights();
289548
+ return;
289549
+ }
289550
+ try {
289551
+ this.#postPaintPipeline.syncInlineStyleLayers(state, this.#domPositionIndex);
289552
+ } catch (error3) {
289553
+ console.warn("[PresentationEditor] Inline style layer sync failed:", error3);
289554
+ }
288812
289555
  }
288813
289556
  #syncDecorations() {
288814
289557
  const state = this.#editor?.view?.state;
288815
289558
  if (!state)
288816
289559
  return;
288817
289560
  try {
288818
- this.#decorationBridge.sync(state, this.#domPositionIndex);
289561
+ this.#postPaintPipeline.syncDecorations(state, this.#domPositionIndex);
288819
289562
  } catch (error3) {
288820
289563
  console.warn("[PresentationEditor] Decoration sync failed:", error3);
288821
289564
  }
@@ -288824,7 +289567,7 @@ function print() { __p += __j.call(arguments, '') }
288824
289567
  if (this.#renderScheduled || this.#isRerendering)
288825
289568
  return;
288826
289569
  const state = this.#editor?.view?.state;
288827
- if (!state || !this.#decorationBridge.hasChanges(state))
289570
+ if (!state || !this.#postPaintPipeline.hasDecorationChanges(state))
288828
289571
  return;
288829
289572
  if (this.#decorationSyncRafHandle != null)
288830
289573
  return;
@@ -288872,12 +289615,12 @@ function print() { __p += __j.call(arguments, '') }
288872
289615
  };
288873
289616
  const handleTransaction = (event) => {
288874
289617
  const tr = event?.transaction;
288875
- this.#decorationBridge.recordTransaction(tr);
289618
+ this.#postPaintPipeline.recordDecorationTransaction(tr);
288876
289619
  const state = this.#editor?.view?.state;
288877
- const decorationChanged = state && this.#decorationBridge.hasChanges(state);
289620
+ const decorationChanged = state && this.#postPaintPipeline.hasDecorationChanges(state);
288878
289621
  if (decorationChanged) {
288879
289622
  const restoreEmpty = tr ? tr.docChanged === true : false;
288880
- this.#decorationBridge.sync(state, this.#domPositionIndex, { restoreEmptyDecorations: restoreEmpty });
289623
+ this.#postPaintPipeline.syncDecorations(state, this.#domPositionIndex, { restoreEmptyDecorations: restoreEmpty });
288881
289624
  } else
288882
289625
  this.#scheduleDecorationSync();
288883
289626
  if (decorationChanged) {
@@ -288965,7 +289708,7 @@ function print() { __p += __j.call(arguments, '') }
288965
289708
  const handleCommentsUpdate = (payload) => {
288966
289709
  if ("activeCommentId" in payload) {
288967
289710
  const activeId = payload.activeCommentId ?? null;
288968
- if (this.#commentHighlightDecorator.setActiveComment(activeId))
289711
+ if (this.#postPaintPipeline.setActiveComment(activeId))
288969
289712
  this.#syncInlineStyleLayers();
288970
289713
  }
288971
289714
  };
@@ -289056,6 +289799,8 @@ function print() { __p += __j.call(arguments, '') }
289056
289799
  clearHoverRegion: () => this.#clearHoverRegion(),
289057
289800
  renderHoverRegion: (region) => this.#renderHoverRegion(region),
289058
289801
  focusEditorAfterImageSelection: () => this.#focusEditorAfterImageSelection(),
289802
+ resolveInlineImageElementByPmStart: (pmStart) => this.#painterAdapter.getInlineImageElementByPmStart(pmStart),
289803
+ resolveImageFragmentElementByPmStart: (pmStart) => this.#painterAdapter.getImageFragmentElementByPmStart(pmStart),
289059
289804
  resolveFieldAnnotationSelectionFromElement: (el) => this.#resolveFieldAnnotationSelectionFromElement(el),
289060
289805
  computePendingMarginClick: (pointerId, x, y$1) => this.#computePendingMarginClick(pointerId, x, y$1),
289061
289806
  selectWordAt: (pos) => this.#selectWordAt(pos),
@@ -289483,7 +290228,7 @@ function print() { __p += __j.call(arguments, '') }
289483
290228
  return;
289484
290229
  }
289485
290230
  const state = this.#editor?.view?.state;
289486
- const decorationRanges = state ? this.#decorationBridge.collectDecorationRanges(state) : [];
290231
+ const decorationRanges = state ? this.#postPaintPipeline.collectDecorationRanges(state) : [];
289487
290232
  if (decorationRanges.length > 0)
289488
290233
  blocks2 = splitRunsAtDecorationBoundaries(blocks2, decorationRanges.map((r$1) => ({
289489
290234
  from: r$1.from,
@@ -289639,9 +290384,7 @@ function print() { __p += __j.call(arguments, '') }
289639
290384
  this.#painterAdapter.paint(paintInput, this.#painterHost, mapping ?? undefined);
289640
290385
  perfLog(`[Perf] painter.paint: ${(perfNow() - painterPaintStart).toFixed(2)}ms`);
289641
290386
  const painterPostStart = perfNow();
289642
- this.#rebuildDomPositionIndex();
289643
- this.#syncInlineStyleLayers();
289644
- this.#applyProofingPass();
290387
+ this.#refreshEditorDomAugmentations();
289645
290388
  this.#domIndexObserverManager?.resume();
289646
290389
  perfLog(`[Perf] painter.postPaint: ${(perfNow() - painterPostStart).toFixed(2)}ms`);
289647
290390
  this.#layoutEpoch = layoutEpoch;
@@ -289734,19 +290477,16 @@ function print() { __p += __j.call(arguments, '') }
289734
290477
  }
289735
290478
  #updateHtmlAnnotationMeasurements(layoutEpoch) {
289736
290479
  const nextHeights = new Map(this.#htmlAnnotationHeights);
289737
- const annotations = this.#painterHost.querySelectorAll('.annotation[data-type="html"]');
289738
290480
  const threshold = 1;
289739
290481
  let changed = false;
289740
- annotations.forEach((annotation) => {
289741
- const element3 = annotation;
289742
- const pmStart = element3.dataset.pmStart;
289743
- const pmEnd = element3.dataset.pmEnd;
289744
- if (!pmStart || !pmEnd)
290482
+ this.#painterAdapter.getAnnotationEntitiesByType("html").forEach((annotation) => {
290483
+ const element3 = annotation.element;
290484
+ if (annotation.pmStart == null || annotation.pmEnd == null)
289745
290485
  return;
289746
290486
  const height = element3.offsetHeight;
289747
290487
  if (height <= 0)
289748
290488
  return;
289749
- const key$1 = `${pmStart}-${pmEnd}`;
290489
+ const key$1 = `${annotation.pmStart}-${annotation.pmEnd}`;
289750
290490
  const prev = nextHeights.get(key$1);
289751
290491
  if (prev != null && Math.abs(prev - height) <= threshold)
289752
290492
  return;
@@ -289799,8 +290539,7 @@ function print() { __p += __j.call(arguments, '') }
289799
290539
  const pmStart = selection.from;
289800
290540
  if (this.#lastSelectedFieldAnnotation?.pmStart === pmStart && this.#lastSelectedFieldAnnotation.element)
289801
290541
  return;
289802
- const selector = `.annotation[data-pm-start="${pmStart}"]`;
289803
- const element3 = this.#painterHost.querySelector(selector);
290542
+ const element3 = this.#painterAdapter.getAnnotationElementByPmStart(pmStart);
289804
290543
  if (!element3) {
289805
290544
  this.#clearSelectedFieldAnnotationClass();
289806
290545
  return;
@@ -289863,12 +290602,10 @@ function print() { __p += __j.call(arguments, '') }
289863
290602
  const rawId = node3.attrs?.id;
289864
290603
  id2 = rawId != null ? String(rawId) : null;
289865
290604
  let elements = [];
289866
- if (id2) {
289867
- const escapedId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(id2) : id2.replace(/"/g, "\\\"");
289868
- elements = Array.from(this.#painterHost.querySelectorAll(`.superdoc-structured-content-block[data-sdt-id="${escapedId}"]`));
289869
- }
290605
+ if (id2)
290606
+ elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
289870
290607
  if (elements.length === 0) {
289871
- const container = this.getElementAtPos(selection.from, { fallbackToCoords: true })?.closest?.(".superdoc-structured-content-block");
290608
+ const container = this.getElementAtPos(selection.from, { fallbackToCoords: true })?.closest?.(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
289872
290609
  if (container)
289873
290610
  elements = [container];
289874
290611
  }
@@ -289879,7 +290616,7 @@ function print() { __p += __j.call(arguments, '') }
289879
290616
  this.#setSelectedStructuredContentBlockClass(elements, id2);
289880
290617
  }
289881
290618
  #handleStructuredContentBlockMouseEnter = (event) => {
289882
- const block = event.target.closest(".superdoc-structured-content-block");
290619
+ const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
289883
290620
  if (!block || !(block instanceof HTMLElement))
289884
290621
  return;
289885
290622
  if (block.classList.contains("ProseMirror-selectednode"))
@@ -289890,19 +290627,22 @@ function print() { __p += __j.call(arguments, '') }
289890
290627
  this.#setHoveredStructuredContentBlockClass(rawId);
289891
290628
  };
289892
290629
  #handleStructuredContentBlockMouseLeave = (event) => {
289893
- const block = event.target.closest(".superdoc-structured-content-block");
290630
+ const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
289894
290631
  if (!block)
289895
290632
  return;
289896
290633
  const relatedTarget = event.relatedTarget;
289897
- if (relatedTarget && block.dataset.sdtId && relatedTarget.closest(`.superdoc-structured-content-block[data-sdt-id="${block.dataset.sdtId}"]`))
289898
- return;
290634
+ if (relatedTarget && block.dataset.sdtId) {
290635
+ const escapedCheckId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(block.dataset.sdtId) : block.dataset.sdtId.replace(/"/g, "\\\"");
290636
+ if (relatedTarget.closest(buildSdtBlockSelector(escapedCheckId)))
290637
+ return;
290638
+ }
289899
290639
  this.#clearHoveredStructuredContentBlockClass();
289900
290640
  };
289901
290641
  #clearHoveredStructuredContentBlockClass() {
289902
290642
  if (!this.#lastHoveredStructuredContentBlock)
289903
290643
  return;
289904
290644
  this.#lastHoveredStructuredContentBlock.elements.forEach((element3) => {
289905
- element3.classList.remove("sdt-group-hover");
290645
+ element3.classList.remove(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
289906
290646
  });
289907
290647
  this.#lastHoveredStructuredContentBlock = null;
289908
290648
  }
@@ -289912,19 +290652,48 @@ function print() { __p += __j.call(arguments, '') }
289912
290652
  this.#clearHoveredStructuredContentBlockClass();
289913
290653
  if (!this.#painterHost)
289914
290654
  return;
289915
- const escapedId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(id2) : id2.replace(/"/g, "\\\"");
289916
- const elements = Array.from(this.#painterHost.querySelectorAll(`.superdoc-structured-content-block[data-sdt-id="${escapedId}"]`));
290655
+ const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
289917
290656
  if (elements.length === 0)
289918
290657
  return;
289919
290658
  elements.forEach((element3) => {
289920
290659
  if (!element3.classList.contains("ProseMirror-selectednode"))
289921
- element3.classList.add("sdt-group-hover");
290660
+ element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
289922
290661
  });
289923
290662
  this.#lastHoveredStructuredContentBlock = {
289924
290663
  id: id2,
289925
290664
  elements
289926
290665
  };
289927
290666
  }
290667
+ #reapplySdtGroupHover() {
290668
+ if (!this.#lastHoveredStructuredContentBlock || !this.#painterHost)
290669
+ return;
290670
+ const { id: id2 } = this.#lastHoveredStructuredContentBlock;
290671
+ if (!id2)
290672
+ return;
290673
+ const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
290674
+ if (elements.length === 0) {
290675
+ this.#lastHoveredStructuredContentBlock = null;
290676
+ return;
290677
+ }
290678
+ elements.forEach((element3) => {
290679
+ if (!element3.classList.contains("ProseMirror-selectednode"))
290680
+ element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
290681
+ });
290682
+ this.#lastHoveredStructuredContentBlock = {
290683
+ id: id2,
290684
+ elements
290685
+ };
290686
+ }
290687
+ #refreshEditorDomAugmentations() {
290688
+ this.#postPaintPipeline.refreshAfterPaint({
290689
+ layoutEpoch: this.#layoutEpoch,
290690
+ editorState: this.#editor?.view?.state,
290691
+ domPositionIndex: this.#domPositionIndex,
290692
+ proofingAnnotations: this.#buildProofingAnnotations(),
290693
+ rebuildDomPositionIndex: () => this.#rebuildDomPositionIndex(),
290694
+ reapplyStructuredContentHover: () => this.#reapplySdtGroupHover()
290695
+ });
290696
+ }
289928
290697
  #clearSelectedStructuredContentInlineClass() {
289929
290698
  if (!this.#lastSelectedStructuredContentInline)
289930
290699
  return;
@@ -289988,12 +290757,10 @@ function print() { __p += __j.call(arguments, '') }
289988
290757
  const rawId = node3.attrs?.id;
289989
290758
  id2 = rawId != null ? String(rawId) : null;
289990
290759
  let elements = [];
289991
- if (id2) {
289992
- const escapedId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(id2) : id2.replace(/"/g, "\\\"");
289993
- elements = Array.from(this.#painterHost.querySelectorAll(`.superdoc-structured-content-inline[data-sdt-id="${escapedId}"]`));
289994
- }
290760
+ if (id2)
290761
+ elements = this.#painterAdapter.getStructuredContentInlineElementsById(id2);
289995
290762
  if (elements.length === 0) {
289996
- const container = this.getElementAtPos(pos, { fallbackToCoords: true })?.closest?.(".superdoc-structured-content-inline");
290763
+ const container = this.getElementAtPos(pos, { fallbackToCoords: true })?.closest?.(`.${DOM_CLASS_NAMES.INLINE_SDT_WRAPPER}`);
289997
290764
  if (container)
289998
290765
  elements = [container];
289999
290766
  }
@@ -291206,8 +291973,8 @@ var init_zipper_YmNpPIyc_es = __esm(() => {
291206
291973
 
291207
291974
  // ../../packages/superdoc/dist/super-editor.es.js
291208
291975
  var init_super_editor_es = __esm(() => {
291209
- init_src_fbRRkK8t_es();
291210
- init_SuperConverter_C6rVgqDZ_es();
291976
+ init_src_sJ2EXqLW_es();
291977
+ init_SuperConverter_DerEPM5g_es();
291211
291978
  init_jszip_ChlR43oI_es();
291212
291979
  init_xml_js_40FWvL78_es();
291213
291980
  init_constants_CIF8yzNk_es();
@@ -342604,16 +343371,17 @@ var init_operation_params = __esm(() => {
342604
343371
  }
342605
343372
  ],
342606
343373
  "doc.insert": [
342607
- ...TEXT_TARGET_FLAT_PARAMS,
343374
+ ...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN,
342608
343375
  {
342609
343376
  name: "offset",
342610
343377
  kind: "flag",
342611
343378
  type: "number",
342612
- description: "Character offset for insertion (alias for --start/--end with same value)."
343379
+ description: "Character offset for insertion (alias for --start/--end with same value).",
343380
+ agentVisible: false
342613
343381
  }
342614
343382
  ],
342615
- "doc.replace": [...TEXT_TARGET_FLAT_PARAMS],
342616
- "doc.delete": [...TEXT_TARGET_FLAT_PARAMS],
343383
+ "doc.replace": [...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN],
343384
+ "doc.delete": [...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN],
342617
343385
  "doc.styles.apply": [
342618
343386
  {
342619
343387
  name: "target",