@superdoc-dev/cli 0.5.0-next.43 → 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 +1477 -1144
  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-DIxjKbQ9.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;
@@ -195811,6 +196081,21 @@ function collectTrackInsertRefsInRange(editor, from$1, to) {
195811
196081
  entityId: id2
195812
196082
  }));
195813
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
+ }
195814
196099
  function resolveCreateInsertPosition(editor, at) {
195815
196100
  const location$1 = at ?? { kind: "documentEnd" };
195816
196101
  if (location$1.kind === "documentStart")
@@ -195838,7 +196123,7 @@ function resolveCreatedBlock(editor, nodeType, blockId) {
195838
196123
  return fallback;
195839
196124
  throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Created ${nodeType} could not be resolved after insertion.`, { [`${nodeType}Id`]: blockId });
195840
196125
  }
195841
- function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story) {
196126
+ function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story, ref$1) {
195842
196127
  return {
195843
196128
  success: true,
195844
196129
  paragraph: {
@@ -195856,10 +196141,11 @@ function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story)
195856
196141
  },
195857
196142
  ...story && { story }
195858
196143
  },
195859
- trackedChangeRefs
196144
+ trackedChangeRefs,
196145
+ ...ref$1 ? { ref: ref$1 } : {}
195860
196146
  };
195861
196147
  }
195862
- function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story) {
196148
+ function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story, ref$1) {
195863
196149
  return {
195864
196150
  success: true,
195865
196151
  heading: {
@@ -195877,7 +196163,8 @@ function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story) {
195877
196163
  },
195878
196164
  ...story && { story }
195879
196165
  },
195880
- trackedChangeRefs
196166
+ trackedChangeRefs,
196167
+ ...ref$1 ? { ref: ref$1 } : {}
195881
196168
  };
195882
196169
  }
195883
196170
  function createParagraphWrapper(editor, input2, options) {
@@ -195953,7 +196240,9 @@ function createParagraphWrapper(editor, input2, options) {
195953
196240
  if (runtime.commit)
195954
196241
  runtime.commit(editor);
195955
196242
  const nonBodyStory = runtime.kind !== "body" ? runtime.locator : undefined;
195956
- 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);
195957
196246
  } finally {
195958
196247
  disposeEphemeralWriteRuntime(runtime);
195959
196248
  }
@@ -196033,7 +196322,9 @@ function createHeadingWrapper(editor, input2, options) {
196033
196322
  if (runtime.commit)
196034
196323
  runtime.commit(editor);
196035
196324
  const nonBodyStory = runtime.kind !== "body" ? runtime.locator : undefined;
196036
- 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);
196037
196328
  } finally {
196038
196329
  disposeEphemeralWriteRuntime(runtime);
196039
196330
  }
@@ -196052,6 +196343,8 @@ function extractBlockFormatting(node3) {
196052
196343
  let fontFamily;
196053
196344
  let fontSize;
196054
196345
  let bold2;
196346
+ let underline;
196347
+ let color2;
196055
196348
  node3.descendants((child) => {
196056
196349
  if (fontFamily !== undefined)
196057
196350
  return false;
@@ -196059,19 +196352,28 @@ function extractBlockFormatting(node3) {
196059
196352
  if (!child.isText || marks.length === 0)
196060
196353
  return;
196061
196354
  for (const mark2 of marks) {
196355
+ const markName = mark2.type.name;
196062
196356
  const attrs = mark2.attrs;
196063
- if (typeof attrs.fontFamily === "string" && attrs.fontFamily)
196064
- fontFamily = attrs.fontFamily;
196065
- if (attrs.fontSize != null) {
196066
- const raw = typeof attrs.fontSize === "string" ? parseFloat(attrs.fontSize) : attrs.fontSize;
196067
- if (typeof raw === "number" && Number.isFinite(raw))
196068
- 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;
196069
196367
  }
196070
- if (attrs.bold === true)
196368
+ if (markName === "bold" && attrs.value === true)
196071
196369
  bold2 = true;
196370
+ if (markName === "underline")
196371
+ underline = true;
196072
196372
  }
196073
196373
  return false;
196074
196374
  });
196375
+ if (color2 === "auto")
196376
+ color2 = undefined;
196075
196377
  let headingLevel;
196076
196378
  if (typeof styleId === "string") {
196077
196379
  const m$1 = HEADING_PATTERN.exec(styleId);
@@ -196083,6 +196385,8 @@ function extractBlockFormatting(node3) {
196083
196385
  ...fontFamily ? { fontFamily } : {},
196084
196386
  ...fontSize !== undefined ? { fontSize } : {},
196085
196387
  ...bold2 ? { bold: bold2 } : {},
196388
+ ...underline ? { underline } : {},
196389
+ ...color2 ? { color: color2 } : {},
196086
196390
  ...pProps?.justification ? { alignment: pProps.justification } : {},
196087
196391
  ...headingLevel ? { headingLevel } : {}
196088
196392
  };
@@ -196149,17 +196453,36 @@ function blocksListWrapper(editor, input2) {
196149
196453
  const total = filtered.length;
196150
196454
  const offset$1 = input2?.offset ?? 0;
196151
196455
  const limit = input2?.limit ?? total;
196456
+ const paged = filtered.slice(offset$1, offset$1 + limit);
196457
+ const rev = getRevision(editor);
196152
196458
  return {
196153
196459
  total,
196154
- blocks: filtered.slice(offset$1, offset$1 + limit).map((candidate, i4) => ({
196155
- ordinal: offset$1 + i4,
196156
- nodeId: candidate.nodeId,
196157
- nodeType: candidate.nodeType,
196158
- textPreview: extractTextPreview(candidate.node),
196159
- isEmpty: candidate.node.textContent.length === 0,
196160
- ...extractBlockFormatting(candidate.node)
196161
- })),
196162
- 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
196163
196486
  };
196164
196487
  }
196165
196488
  function blocksDeleteWrapper(editor, input2, options) {
@@ -211906,6 +212229,502 @@ function resolveAnnotationDisplayLabel(annotation, contentEl) {
211906
212229
  value: derivedLabel
211907
212230
  };
211908
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
+ }
212445
+ function isSuppressed(issue, normalizedIgnored) {
212446
+ if (normalizedIgnored.size === 0)
212447
+ return false;
212448
+ const raw = issue.word ?? issue.message;
212449
+ if (!raw)
212450
+ return false;
212451
+ const normalized = raw.normalize("NFC").toLowerCase();
212452
+ return normalizedIgnored.has(normalized);
212453
+ }
212454
+ function resolveSegmentLanguage(paraNode, defaultLanguage) {
212455
+ const runLanguage = findFirstRunLanguage(paraNode);
212456
+ if (runLanguage)
212457
+ return runLanguage;
212458
+ const paraLang = extractParagraphLanguage(paraNode);
212459
+ if (paraLang)
212460
+ return paraLang;
212461
+ return defaultLanguage;
212462
+ }
212463
+ function findFirstRunLanguage(paraNode) {
212464
+ let lang = null;
212465
+ paraNode.descendants((node3) => {
212466
+ if (lang)
212467
+ return false;
212468
+ if (node3.type.name === "run") {
212469
+ const runProps = node3.attrs.runProperties;
212470
+ if (runProps?.lang?.val) {
212471
+ lang = runProps.lang.val;
212472
+ return false;
212473
+ }
212474
+ }
212475
+ return true;
212476
+ });
212477
+ return lang;
212478
+ }
212479
+ function extractParagraphLanguage(paraNode) {
212480
+ return paraNode.attrs.paragraphProperties?.lang?.val ?? null;
212481
+ }
212482
+ function extractSegmentsWithMaps(doc$12, defaultLanguage, pageResolver) {
212483
+ const segments = [];
212484
+ const offsetMaps = /* @__PURE__ */ new Map;
212485
+ const segmentPositions = /* @__PURE__ */ new Map;
212486
+ walkParagraphs(doc$12, (paraNode, paraPos, surface) => {
212487
+ const { text: text5, slices } = extractParagraphText(paraNode, paraPos);
212488
+ if (text5.length === 0)
212489
+ return;
212490
+ const segmentId = buildSegmentId(paraNode, paraPos);
212491
+ const language = resolveSegmentLanguage(paraNode, defaultLanguage ?? null);
212492
+ const pageIndex = pageResolver?.(paraPos);
212493
+ segments.push({
212494
+ id: segmentId,
212495
+ text: text5,
212496
+ language,
212497
+ metadata: {
212498
+ blockId: paraNode.attrs.sdBlockId,
212499
+ pageIndex,
212500
+ surface
212501
+ }
212502
+ });
212503
+ offsetMaps.set(segmentId, {
212504
+ segmentId,
212505
+ slices
212506
+ });
212507
+ segmentPositions.set(segmentId, paraPos);
212508
+ });
212509
+ return {
212510
+ segments,
212511
+ offsetMaps,
212512
+ segmentPositions
212513
+ };
212514
+ }
212515
+ function walkParagraphs(doc$12, visitor) {
212516
+ doc$12.descendants((node3, pos) => {
212517
+ const typeName = node3.type.name;
212518
+ if (typeName === "header" || typeName === "footer")
212519
+ return false;
212520
+ if (typeName === "paragraph") {
212521
+ visitor(node3, pos, isInsideTableCell(doc$12, pos) ? "table-cell" : "body");
212522
+ return false;
212523
+ }
212524
+ return true;
212525
+ });
212526
+ }
212527
+ function isInsideTableCell(doc$12, pos) {
212528
+ const resolved = doc$12.resolve(pos);
212529
+ for (let depth = resolved.depth;depth > 0; depth--) {
212530
+ const ancestor = resolved.node(depth);
212531
+ if (ancestor.type.name === "tableCell" || ancestor.type.name === "tableHeader")
212532
+ return true;
212533
+ }
212534
+ return false;
212535
+ }
212536
+ function extractParagraphText(paraNode, paraPos) {
212537
+ const parts = [];
212538
+ const slices = [];
212539
+ let textOffset = 0;
212540
+ const contentStart = paraPos + 1;
212541
+ paraNode.forEach((child, offset$1) => {
212542
+ processNode(child, contentStart + offset$1);
212543
+ });
212544
+ return {
212545
+ text: parts.join(""),
212546
+ slices
212547
+ };
212548
+ function processNode(node3, pos) {
212549
+ const typeName = node3.type.name;
212550
+ if (typeName === "run") {
212551
+ const runProps = node3.attrs.runProperties;
212552
+ if (runProps?.vanish === true) {
212553
+ emitBoundary();
212554
+ return;
212555
+ }
212556
+ if (runProps?.noProof === true) {
212557
+ emitBoundary();
212558
+ return;
212559
+ }
212560
+ const runContentStart = pos + 1;
212561
+ node3.forEach((child, childOff) => {
212562
+ processNode(child, runContentStart + childOff);
212563
+ });
212564
+ return;
212565
+ }
212566
+ if (node3.isText && node3.text) {
212567
+ if (hasTrackDeleteMark(node3))
212568
+ return;
212569
+ const text5 = node3.text;
212570
+ const pmFrom = pos;
212571
+ const pmTo = pos + text5.length;
212572
+ slices.push({
212573
+ textStart: textOffset,
212574
+ textEnd: textOffset + text5.length,
212575
+ pmFrom,
212576
+ pmTo
212577
+ });
212578
+ parts.push(text5);
212579
+ textOffset += text5.length;
212580
+ return;
212581
+ }
212582
+ if (isNonTextInlineNode(typeName)) {
212583
+ emitBoundary();
212584
+ return;
212585
+ }
212586
+ if (node3.childCount > 0) {
212587
+ const contentStart$1 = pos + 1;
212588
+ node3.forEach((child, childOff) => {
212589
+ processNode(child, contentStart$1 + childOff);
212590
+ });
212591
+ }
212592
+ }
212593
+ function emitBoundary() {
212594
+ if (parts.length > 0 && !parts[parts.length - 1].endsWith(" ")) {
212595
+ parts.push(" ");
212596
+ textOffset += 1;
212597
+ }
212598
+ }
212599
+ }
212600
+ function hasTrackDeleteMark(node3) {
212601
+ return node3.marks?.some((m$1) => m$1.type.name === "trackDelete") ?? false;
212602
+ }
212603
+ function isNonTextInlineNode(typeName) {
212604
+ return NON_TEXT_INLINE_NODES.has(typeName);
212605
+ }
212606
+ function buildSegmentId(paraNode, paraPos) {
212607
+ const blockId = paraNode.attrs.sdBlockId;
212608
+ return blockId ? `blk-${blockId}` : `pos-${paraPos}`;
212609
+ }
212610
+ function resolveIssuePmRangeFromSlices(issue, slices) {
212611
+ const pmFrom = textOffsetToPmPos(issue.start, slices);
212612
+ const pmTo = textOffsetToPmPos(issue.end, slices);
212613
+ if (pmFrom === null || pmTo === null || pmFrom >= pmTo)
212614
+ return null;
212615
+ return {
212616
+ ...issue,
212617
+ pmFrom,
212618
+ pmTo
212619
+ };
212620
+ }
212621
+ function textOffsetToPmPos(textOffset, slices) {
212622
+ for (const slice2 of slices)
212623
+ if (textOffset >= slice2.textStart && textOffset <= slice2.textEnd) {
212624
+ const delta = textOffset - slice2.textStart;
212625
+ return slice2.pmFrom + delta;
212626
+ }
212627
+ for (const slice2 of slices)
212628
+ if (slice2.textStart >= textOffset)
212629
+ return slice2.pmFrom;
212630
+ if (slices.length > 0) {
212631
+ const last2 = slices[slices.length - 1];
212632
+ if (textOffset >= last2.textEnd)
212633
+ return last2.pmTo;
212634
+ }
212635
+ return null;
212636
+ }
212637
+ function computeDirtySegmentIds(segments, segmentPositions, changedRanges) {
212638
+ if (changedRanges.length === 0)
212639
+ return /* @__PURE__ */ new Set;
212640
+ const dirty = /* @__PURE__ */ new Set;
212641
+ const sorted = segments.map((seg) => ({
212642
+ id: seg.id,
212643
+ pos: segmentPositions.get(seg.id) ?? -1
212644
+ })).filter((s2) => s2.pos >= 0).sort((a2, b$1) => a2.pos - b$1.pos);
212645
+ for (const range of changedRanges)
212646
+ for (let i4 = 0;i4 < sorted.length; i4++) {
212647
+ const seg = sorted[i4];
212648
+ const segEnd = sorted[i4 + 1]?.pos ?? Infinity;
212649
+ if (seg.pos < range.to && segEnd > range.from)
212650
+ dirty.add(seg.id);
212651
+ if (seg.pos <= range.from && segEnd >= range.from && i4 > 0)
212652
+ dirty.add(sorted[i4 - 1].id);
212653
+ }
212654
+ return dirty;
212655
+ }
212656
+ function hashSegmentText(text5) {
212657
+ let hash$3 = 2166136261;
212658
+ for (let i4 = 0;i4 < text5.length; i4++) {
212659
+ hash$3 ^= text5.charCodeAt(i4);
212660
+ hash$3 = Math.imul(hash$3, 16777619);
212661
+ }
212662
+ return (hash$3 >>> 0).toString(16);
212663
+ }
212664
+ function prioritizeByVisibility(segments, visibilitySource) {
212665
+ const visiblePages = visibilitySource.getVisiblePageIndices();
212666
+ if (!visiblePages || visiblePages.length === 0)
212667
+ return segments;
212668
+ const visibleSet = new Set(visiblePages);
212669
+ const visible = [];
212670
+ const rest = [];
212671
+ for (const seg of segments) {
212672
+ const pageIndex = seg.metadata.pageIndex;
212673
+ if (pageIndex !== undefined && visibleSet.has(pageIndex))
212674
+ visible.push(seg);
212675
+ else
212676
+ rest.push(seg);
212677
+ }
212678
+ return [...visible, ...rest];
212679
+ }
212680
+ function buildPaintSlices(issues) {
212681
+ const spellingIssues = issues.filter((i4) => i4.kind === "spelling");
212682
+ if (spellingIssues.length === 0)
212683
+ return [];
212684
+ const sorted = [...spellingIssues].sort((a2, b$1) => a2.pmFrom - b$1.pmFrom || a2.pmTo - b$1.pmTo);
212685
+ const slices = [];
212686
+ let current = null;
212687
+ for (const issue of sorted) {
212688
+ if (!current) {
212689
+ current = {
212690
+ pmFrom: issue.pmFrom,
212691
+ pmTo: issue.pmTo,
212692
+ kind: "spelling",
212693
+ issue
212694
+ };
212695
+ continue;
212696
+ }
212697
+ if (issue.pmFrom <= current.pmTo)
212698
+ current.pmTo = Math.max(current.pmTo, issue.pmTo);
212699
+ else {
212700
+ slices.push(current);
212701
+ current = {
212702
+ pmFrom: issue.pmFrom,
212703
+ pmTo: issue.pmTo,
212704
+ kind: "spelling",
212705
+ issue
212706
+ };
212707
+ }
212708
+ }
212709
+ if (current)
212710
+ slices.push(current);
212711
+ return slices;
212712
+ }
212713
+ function findSliceAtPosition(slices, pmPos) {
212714
+ let lo = 0;
212715
+ let hi = slices.length - 1;
212716
+ while (lo <= hi) {
212717
+ const mid = lo + hi >>> 1;
212718
+ const slice2 = slices[mid];
212719
+ if (pmPos < slice2.pmFrom)
212720
+ hi = mid - 1;
212721
+ else if (pmPos >= slice2.pmTo)
212722
+ lo = mid + 1;
212723
+ else
212724
+ return slice2;
212725
+ }
212726
+ return null;
212727
+ }
211909
212728
  function mapWordFamilyFallback(wordFamily) {
211910
212729
  if (!wordFamily)
211911
212730
  return DEFAULT_GENERIC_FALLBACK2;
@@ -214117,217 +214936,6 @@ function sanitizeUrl(href) {
214117
214936
  return null;
214118
214937
  return sanitizeHref(href)?.href ?? null;
214119
214938
  }
214120
- function cssClassForKind(kind) {
214121
- switch (kind) {
214122
- case "spelling":
214123
- return PROOFING_CSS.SPELLING;
214124
- case "grammar":
214125
- return PROOFING_CSS.GRAMMAR;
214126
- case "style":
214127
- return PROOFING_CSS.STYLE;
214128
- }
214129
- }
214130
- function computeSplitSegments(spanPmStart, spanPmEnd, spanText, annotations) {
214131
- const boundaries = /* @__PURE__ */ new Set;
214132
- boundaries.add(spanPmStart);
214133
- boundaries.add(spanPmEnd);
214134
- for (const ann of annotations) {
214135
- const clampedFrom = Math.max(ann.pmFrom, spanPmStart);
214136
- const clampedTo = Math.min(ann.pmTo, spanPmEnd);
214137
- if (clampedFrom > spanPmStart)
214138
- boundaries.add(clampedFrom);
214139
- if (clampedTo < spanPmEnd)
214140
- boundaries.add(clampedTo);
214141
- }
214142
- const sorted = Array.from(boundaries).sort((a2, b$1) => a2 - b$1);
214143
- const segments = [];
214144
- for (let i4 = 0;i4 < sorted.length - 1; i4++) {
214145
- const segPmStart = sorted[i4];
214146
- const segPmEnd = sorted[i4 + 1];
214147
- const textStart = segPmStart - spanPmStart;
214148
- const textEnd = segPmEnd - spanPmStart;
214149
- if (textEnd <= textStart || textStart >= spanText.length)
214150
- continue;
214151
- const clampedTextEnd = Math.min(textEnd, spanText.length);
214152
- let proofingClass = null;
214153
- for (const ann of annotations)
214154
- if (ann.pmFrom <= segPmStart && ann.pmTo >= segPmEnd) {
214155
- proofingClass = cssClassForKind(ann.kind);
214156
- break;
214157
- }
214158
- segments.push({
214159
- textStart,
214160
- textEnd: clampedTextEnd,
214161
- pmStart: segPmStart,
214162
- pmEnd: segPmEnd,
214163
- proofingClass
214164
- });
214165
- }
214166
- return segments;
214167
- }
214168
- function replaceSpanWithSiblings(originalSpan, segments, spanText) {
214169
- const parent = originalSpan.parentNode;
214170
- if (!parent)
214171
- return [];
214172
- const doc$12 = originalSpan.ownerDocument;
214173
- const siblings = [];
214174
- for (const seg of segments) {
214175
- const text5 = spanText.slice(seg.textStart, seg.textEnd);
214176
- if (text5.length === 0)
214177
- continue;
214178
- const span = doc$12.createElement("span");
214179
- for (let i4 = 0;i4 < originalSpan.attributes.length; i4++) {
214180
- const attr = originalSpan.attributes[i4];
214181
- span.setAttribute(attr.name, attr.value);
214182
- }
214183
- span.setAttribute("data-pm-start", String(seg.pmStart));
214184
- span.setAttribute("data-pm-end", String(seg.pmEnd));
214185
- if (seg.proofingClass) {
214186
- span.classList.add(seg.proofingClass);
214187
- span.setAttribute("aria-invalid", "spelling");
214188
- }
214189
- span.setAttribute(PROOFING_CSS.SPLIT_ATTR, "");
214190
- span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
214191
- span.textContent = "";
214192
- span.appendChild(doc$12.createTextNode(text5));
214193
- splitOriginMap.set(span, originalSpan);
214194
- siblings.push(span);
214195
- }
214196
- originalSpan.style.display = "none";
214197
- originalSpan.setAttribute(PROOFING_CSS.DATA_ATTR, "original");
214198
- const origPmStart = originalSpan.getAttribute("data-pm-start");
214199
- const origPmEnd = originalSpan.getAttribute("data-pm-end");
214200
- if (origPmStart)
214201
- originalSpan.setAttribute("data-sd-orig-pm-start", origPmStart);
214202
- if (origPmEnd)
214203
- originalSpan.setAttribute("data-sd-orig-pm-end", origPmEnd);
214204
- originalSpan.removeAttribute("data-pm-start");
214205
- originalSpan.removeAttribute("data-pm-end");
214206
- for (const sib of siblings)
214207
- parent.insertBefore(sib, originalSpan);
214208
- return siblings;
214209
- }
214210
- function restoreSplitSpans(container) {
214211
- const splitSpans = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
214212
- if (splitSpans.length === 0)
214213
- return false;
214214
- const groupsByOriginal = /* @__PURE__ */ new Map;
214215
- for (const span of splitSpans) {
214216
- const original = splitOriginMap.get(span);
214217
- if (!original)
214218
- continue;
214219
- const group = groupsByOriginal.get(original);
214220
- if (group)
214221
- group.push(span);
214222
- else
214223
- groupsByOriginal.set(original, [span]);
214224
- }
214225
- for (const [original, siblings] of groupsByOriginal) {
214226
- const parent = original.parentNode;
214227
- if (!parent)
214228
- continue;
214229
- unhideOriginalSpan(original);
214230
- for (const sib of siblings)
214231
- parent.removeChild(sib);
214232
- }
214233
- const remaining = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
214234
- for (const span of remaining)
214235
- span.parentNode?.removeChild(span);
214236
- const hiddenOriginals = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}="original"]`));
214237
- for (const el of hiddenOriginals)
214238
- unhideOriginalSpan(el);
214239
- return true;
214240
- }
214241
- function unhideOriginalSpan(el) {
214242
- el.style.display = "";
214243
- if (!el.style.cssText)
214244
- el.removeAttribute("style");
214245
- el.removeAttribute(PROOFING_CSS.DATA_ATTR);
214246
- const savedStart = el.getAttribute("data-sd-orig-pm-start");
214247
- const savedEnd = el.getAttribute("data-sd-orig-pm-end");
214248
- if (savedStart) {
214249
- el.setAttribute("data-pm-start", savedStart);
214250
- el.removeAttribute("data-sd-orig-pm-start");
214251
- }
214252
- if (savedEnd) {
214253
- el.setAttribute("data-pm-end", savedEnd);
214254
- el.removeAttribute("data-sd-orig-pm-end");
214255
- }
214256
- }
214257
- function applyProofingDecorations(container, annotations) {
214258
- const hadPrevious = clearProofingDecorations(container);
214259
- if (annotations.length === 0)
214260
- return hadPrevious;
214261
- const sorted = [...annotations].sort((a2, b$1) => a2.pmFrom - b$1.pmFrom);
214262
- const spans = Array.from(container.querySelectorAll("[data-pm-start][data-pm-end]"));
214263
- let mutated = false;
214264
- for (const span of spans) {
214265
- const pmStart = parseInt(span.getAttribute("data-pm-start"), 10);
214266
- const pmEnd = parseInt(span.getAttribute("data-pm-end"), 10);
214267
- if (isNaN(pmStart) || isNaN(pmEnd) || pmEnd <= pmStart)
214268
- continue;
214269
- if (!isLeafTextSpan(span))
214270
- continue;
214271
- const overlapping = findOverlapping(sorted, pmStart, pmEnd);
214272
- if (overlapping.length === 0)
214273
- continue;
214274
- const text5 = span.textContent ?? "";
214275
- if (text5.length === 0)
214276
- continue;
214277
- if (isCoveredBySingleAnnotation(pmStart, pmEnd, overlapping)) {
214278
- span.classList.add(cssClassForKind(overlapping[0].kind));
214279
- span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
214280
- span.setAttribute("aria-invalid", "spelling");
214281
- mutated = true;
214282
- } else {
214283
- const segments = computeSplitSegments(pmStart, pmEnd, text5, overlapping);
214284
- if (segments.length > 1) {
214285
- replaceSpanWithSiblings(span, segments, text5);
214286
- mutated = true;
214287
- } else if (segments.length === 1 && segments[0].proofingClass) {
214288
- span.classList.add(segments[0].proofingClass);
214289
- span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
214290
- span.setAttribute("aria-invalid", "spelling");
214291
- mutated = true;
214292
- }
214293
- }
214294
- }
214295
- return mutated || hadPrevious;
214296
- }
214297
- function clearProofingDecorations(container) {
214298
- let cleared = false;
214299
- const splitRestored = restoreSplitSpans(container);
214300
- const decorated = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}]`));
214301
- for (const el of decorated) {
214302
- el.classList.remove(PROOFING_CSS.SPELLING, PROOFING_CSS.GRAMMAR, PROOFING_CSS.STYLE);
214303
- el.removeAttribute(PROOFING_CSS.DATA_ATTR);
214304
- el.removeAttribute("aria-invalid");
214305
- cleared = true;
214306
- }
214307
- return cleared || splitRestored;
214308
- }
214309
- function isLeafTextSpan(el) {
214310
- const children = el.childNodes;
214311
- if (children.length === 0)
214312
- return false;
214313
- for (let i4 = 0;i4 < children.length; i4++)
214314
- if (children[i4].nodeType === Node.ELEMENT_NODE)
214315
- return false;
214316
- return true;
214317
- }
214318
- function findOverlapping(sorted, pmStart, pmEnd) {
214319
- const result = [];
214320
- for (const ann of sorted) {
214321
- if (ann.pmFrom >= pmEnd)
214322
- break;
214323
- if (ann.pmTo > pmStart)
214324
- result.push(ann);
214325
- }
214326
- return result;
214327
- }
214328
- function isCoveredBySingleAnnotation(pmStart, pmEnd, annotations) {
214329
- return annotations.some((ann) => ann.pmFrom <= pmStart && ann.pmTo >= pmEnd);
214330
- }
214331
214939
  function assertRequiredBlockMeasurePair(label, blocks2, measures) {
214332
214940
  if (blocks2.length !== measures.length)
214333
214941
  throw new Error(`${label} blocks and measures must have the same length.`);
@@ -214368,289 +214976,6 @@ function buildLegacyPaintInput(layout, legacyState, flowMode, pageGap) {
214368
214976
  footerMeasures: legacyState.footerMeasures
214369
214977
  };
214370
214978
  }
214371
- function isSuppressed(issue, normalizedIgnored) {
214372
- if (normalizedIgnored.size === 0)
214373
- return false;
214374
- const raw = issue.word ?? issue.message;
214375
- if (!raw)
214376
- return false;
214377
- const normalized = raw.normalize("NFC").toLowerCase();
214378
- return normalizedIgnored.has(normalized);
214379
- }
214380
- function resolveSegmentLanguage(paraNode, defaultLanguage) {
214381
- const runLanguage = findFirstRunLanguage(paraNode);
214382
- if (runLanguage)
214383
- return runLanguage;
214384
- const paraLang = extractParagraphLanguage(paraNode);
214385
- if (paraLang)
214386
- return paraLang;
214387
- return defaultLanguage;
214388
- }
214389
- function findFirstRunLanguage(paraNode) {
214390
- let lang = null;
214391
- paraNode.descendants((node3) => {
214392
- if (lang)
214393
- return false;
214394
- if (node3.type.name === "run") {
214395
- const runProps = node3.attrs.runProperties;
214396
- if (runProps?.lang?.val) {
214397
- lang = runProps.lang.val;
214398
- return false;
214399
- }
214400
- }
214401
- return true;
214402
- });
214403
- return lang;
214404
- }
214405
- function extractParagraphLanguage(paraNode) {
214406
- return paraNode.attrs.paragraphProperties?.lang?.val ?? null;
214407
- }
214408
- function extractSegmentsWithMaps(doc$12, defaultLanguage, pageResolver) {
214409
- const segments = [];
214410
- const offsetMaps = /* @__PURE__ */ new Map;
214411
- const segmentPositions = /* @__PURE__ */ new Map;
214412
- walkParagraphs(doc$12, (paraNode, paraPos, surface) => {
214413
- const { text: text5, slices } = extractParagraphText(paraNode, paraPos);
214414
- if (text5.length === 0)
214415
- return;
214416
- const segmentId = buildSegmentId(paraNode, paraPos);
214417
- const language = resolveSegmentLanguage(paraNode, defaultLanguage ?? null);
214418
- const pageIndex = pageResolver?.(paraPos);
214419
- segments.push({
214420
- id: segmentId,
214421
- text: text5,
214422
- language,
214423
- metadata: {
214424
- blockId: paraNode.attrs.sdBlockId,
214425
- pageIndex,
214426
- surface
214427
- }
214428
- });
214429
- offsetMaps.set(segmentId, {
214430
- segmentId,
214431
- slices
214432
- });
214433
- segmentPositions.set(segmentId, paraPos);
214434
- });
214435
- return {
214436
- segments,
214437
- offsetMaps,
214438
- segmentPositions
214439
- };
214440
- }
214441
- function walkParagraphs(doc$12, visitor) {
214442
- doc$12.descendants((node3, pos) => {
214443
- const typeName = node3.type.name;
214444
- if (typeName === "header" || typeName === "footer")
214445
- return false;
214446
- if (typeName === "paragraph") {
214447
- visitor(node3, pos, isInsideTableCell(doc$12, pos) ? "table-cell" : "body");
214448
- return false;
214449
- }
214450
- return true;
214451
- });
214452
- }
214453
- function isInsideTableCell(doc$12, pos) {
214454
- const resolved = doc$12.resolve(pos);
214455
- for (let depth = resolved.depth;depth > 0; depth--) {
214456
- const ancestor = resolved.node(depth);
214457
- if (ancestor.type.name === "tableCell" || ancestor.type.name === "tableHeader")
214458
- return true;
214459
- }
214460
- return false;
214461
- }
214462
- function extractParagraphText(paraNode, paraPos) {
214463
- const parts = [];
214464
- const slices = [];
214465
- let textOffset = 0;
214466
- const contentStart = paraPos + 1;
214467
- paraNode.forEach((child, offset$1) => {
214468
- processNode(child, contentStart + offset$1);
214469
- });
214470
- return {
214471
- text: parts.join(""),
214472
- slices
214473
- };
214474
- function processNode(node3, pos) {
214475
- const typeName = node3.type.name;
214476
- if (typeName === "run") {
214477
- const runProps = node3.attrs.runProperties;
214478
- if (runProps?.vanish === true) {
214479
- emitBoundary();
214480
- return;
214481
- }
214482
- if (runProps?.noProof === true) {
214483
- emitBoundary();
214484
- return;
214485
- }
214486
- const runContentStart = pos + 1;
214487
- node3.forEach((child, childOff) => {
214488
- processNode(child, runContentStart + childOff);
214489
- });
214490
- return;
214491
- }
214492
- if (node3.isText && node3.text) {
214493
- if (hasTrackDeleteMark(node3))
214494
- return;
214495
- const text5 = node3.text;
214496
- const pmFrom = pos;
214497
- const pmTo = pos + text5.length;
214498
- slices.push({
214499
- textStart: textOffset,
214500
- textEnd: textOffset + text5.length,
214501
- pmFrom,
214502
- pmTo
214503
- });
214504
- parts.push(text5);
214505
- textOffset += text5.length;
214506
- return;
214507
- }
214508
- if (isNonTextInlineNode(typeName)) {
214509
- emitBoundary();
214510
- return;
214511
- }
214512
- if (node3.childCount > 0) {
214513
- const contentStart$1 = pos + 1;
214514
- node3.forEach((child, childOff) => {
214515
- processNode(child, contentStart$1 + childOff);
214516
- });
214517
- }
214518
- }
214519
- function emitBoundary() {
214520
- if (parts.length > 0 && !parts[parts.length - 1].endsWith(" ")) {
214521
- parts.push(" ");
214522
- textOffset += 1;
214523
- }
214524
- }
214525
- }
214526
- function hasTrackDeleteMark(node3) {
214527
- return node3.marks?.some((m$1) => m$1.type.name === "trackDelete") ?? false;
214528
- }
214529
- function isNonTextInlineNode(typeName) {
214530
- return NON_TEXT_INLINE_NODES.has(typeName);
214531
- }
214532
- function buildSegmentId(paraNode, paraPos) {
214533
- const blockId = paraNode.attrs.sdBlockId;
214534
- return blockId ? `blk-${blockId}` : `pos-${paraPos}`;
214535
- }
214536
- function resolveIssuePmRangeFromSlices(issue, slices) {
214537
- const pmFrom = textOffsetToPmPos(issue.start, slices);
214538
- const pmTo = textOffsetToPmPos(issue.end, slices);
214539
- if (pmFrom === null || pmTo === null || pmFrom >= pmTo)
214540
- return null;
214541
- return {
214542
- ...issue,
214543
- pmFrom,
214544
- pmTo
214545
- };
214546
- }
214547
- function textOffsetToPmPos(textOffset, slices) {
214548
- for (const slice2 of slices)
214549
- if (textOffset >= slice2.textStart && textOffset <= slice2.textEnd) {
214550
- const delta = textOffset - slice2.textStart;
214551
- return slice2.pmFrom + delta;
214552
- }
214553
- for (const slice2 of slices)
214554
- if (slice2.textStart >= textOffset)
214555
- return slice2.pmFrom;
214556
- if (slices.length > 0) {
214557
- const last2 = slices[slices.length - 1];
214558
- if (textOffset >= last2.textEnd)
214559
- return last2.pmTo;
214560
- }
214561
- return null;
214562
- }
214563
- function computeDirtySegmentIds(segments, segmentPositions, changedRanges) {
214564
- if (changedRanges.length === 0)
214565
- return /* @__PURE__ */ new Set;
214566
- const dirty = /* @__PURE__ */ new Set;
214567
- const sorted = segments.map((seg) => ({
214568
- id: seg.id,
214569
- pos: segmentPositions.get(seg.id) ?? -1
214570
- })).filter((s2) => s2.pos >= 0).sort((a2, b$1) => a2.pos - b$1.pos);
214571
- for (const range of changedRanges)
214572
- for (let i4 = 0;i4 < sorted.length; i4++) {
214573
- const seg = sorted[i4];
214574
- const segEnd = sorted[i4 + 1]?.pos ?? Infinity;
214575
- if (seg.pos < range.to && segEnd > range.from)
214576
- dirty.add(seg.id);
214577
- if (seg.pos <= range.from && segEnd >= range.from && i4 > 0)
214578
- dirty.add(sorted[i4 - 1].id);
214579
- }
214580
- return dirty;
214581
- }
214582
- function hashSegmentText(text5) {
214583
- let hash$3 = 2166136261;
214584
- for (let i4 = 0;i4 < text5.length; i4++) {
214585
- hash$3 ^= text5.charCodeAt(i4);
214586
- hash$3 = Math.imul(hash$3, 16777619);
214587
- }
214588
- return (hash$3 >>> 0).toString(16);
214589
- }
214590
- function prioritizeByVisibility(segments, visibilitySource) {
214591
- const visiblePages = visibilitySource.getVisiblePageIndices();
214592
- if (!visiblePages || visiblePages.length === 0)
214593
- return segments;
214594
- const visibleSet = new Set(visiblePages);
214595
- const visible = [];
214596
- const rest = [];
214597
- for (const seg of segments) {
214598
- const pageIndex = seg.metadata.pageIndex;
214599
- if (pageIndex !== undefined && visibleSet.has(pageIndex))
214600
- visible.push(seg);
214601
- else
214602
- rest.push(seg);
214603
- }
214604
- return [...visible, ...rest];
214605
- }
214606
- function buildPaintSlices(issues) {
214607
- const spellingIssues = issues.filter((i4) => i4.kind === "spelling");
214608
- if (spellingIssues.length === 0)
214609
- return [];
214610
- const sorted = [...spellingIssues].sort((a2, b$1) => a2.pmFrom - b$1.pmFrom || a2.pmTo - b$1.pmTo);
214611
- const slices = [];
214612
- let current = null;
214613
- for (const issue of sorted) {
214614
- if (!current) {
214615
- current = {
214616
- pmFrom: issue.pmFrom,
214617
- pmTo: issue.pmTo,
214618
- kind: "spelling",
214619
- issue
214620
- };
214621
- continue;
214622
- }
214623
- if (issue.pmFrom <= current.pmTo)
214624
- current.pmTo = Math.max(current.pmTo, issue.pmTo);
214625
- else {
214626
- slices.push(current);
214627
- current = {
214628
- pmFrom: issue.pmFrom,
214629
- pmTo: issue.pmTo,
214630
- kind: "spelling",
214631
- issue
214632
- };
214633
- }
214634
- }
214635
- if (current)
214636
- slices.push(current);
214637
- return slices;
214638
- }
214639
- function findSliceAtPosition(slices, pmPos) {
214640
- let lo = 0;
214641
- let hi = slices.length - 1;
214642
- while (lo <= hi) {
214643
- const mid = lo + hi >>> 1;
214644
- const slice2 = slices[mid];
214645
- if (pmPos < slice2.pmFrom)
214646
- hi = mid - 1;
214647
- else if (pmPos >= slice2.pmTo)
214648
- lo = mid + 1;
214649
- else
214650
- return slice2;
214651
- }
214652
- return null;
214653
- }
214654
214979
  function appendToArrayMap(map$12, key$1, value) {
214655
214980
  const existing = map$12.get(key$1);
214656
214981
  if (existing) {
@@ -233209,7 +233534,13 @@ var Node$13 = class Node$14 {
233209
233534
  const attrs = {
233210
233535
  ...sdBlockId ? { sdBlockId } : undefined,
233211
233536
  ...paraId ? { paraId } : undefined,
233212
- paragraphProperties: { styleId: `Heading${level}` }
233537
+ paragraphProperties: {
233538
+ styleId: `Heading${level}`,
233539
+ numberingProperties: {
233540
+ numId: "0",
233541
+ ilvl: "0"
233542
+ }
233543
+ }
233213
233544
  };
233214
233545
  const normalizedText = typeof text5 === "string" ? text5 : "";
233215
233546
  const textNode = normalizedText.length > 0 ? state.schema.text(normalizedText) : null;
@@ -233684,24 +234015,25 @@ var Node$13 = class Node$14 {
233684
234015
  if (paragraphsInSelection.length > 0) {
233685
234016
  const firstPara = paragraphsInSelection[0];
233686
234017
  const lastPara = paragraphsInSelection[paragraphsInSelection.length - 1];
233687
- const mappedFirstPos = tr.mapping.map(firstPara.pos);
233688
- const mappedLastPos = tr.mapping.map(lastPara.pos);
233689
- const $firstPos = tr.doc.resolve(mappedFirstPos);
233690
- const $lastPos = tr.doc.resolve(mappedLastPos);
233691
- const firstNode = $firstPos.nodeAfter;
233692
- const lastNode = $lastPos.nodeAfter;
233693
- if (firstNode && lastNode) {
233694
- let selFrom = mappedFirstPos + 1;
233695
- let selTo = mappedLastPos + lastNode.nodeSize - 1;
233696
- if (firstNode.firstChild && firstNode.firstChild.type.name === "run")
233697
- selFrom = mappedFirstPos + 2;
233698
- if (lastNode.lastChild && lastNode.lastChild.type.name === "run")
233699
- selTo = mappedLastPos + lastNode.nodeSize - 2;
233700
- if (selFrom >= 0 && selTo <= tr.doc.content.size && selFrom <= selTo)
233701
- try {
233702
- tr.setSelection(TextSelection2.create(tr.doc, selFrom, selTo));
233703
- } catch {}
233704
- }
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 {}
233705
234037
  }
233706
234038
  dispatch(tr);
233707
234039
  return true;
@@ -243317,7 +243649,7 @@ var Node$13 = class Node$14 {
243317
243649
  domAvailabilityCache = false;
243318
243650
  return false;
243319
243651
  }
243320
- }, summaryVersion = "1.23.0", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
243652
+ }, summaryVersion = "1.23.1", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
243321
243653
  const container = document.createElement("div");
243322
243654
  container.innerHTML = html3;
243323
243655
  const result = [];
@@ -243642,7 +243974,7 @@ var Node$13 = class Node$14 {
243642
243974
  console.warn("Failed to initialize developer tools:", error3);
243643
243975
  }
243644
243976
  }
243645
- }, 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 = `UEsDBBQAAAAIAAAAIQAykW9XXgEAAKUFAAATABwAW0NvbnRlbnRfVHlwZXNdLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAAC1lMtqwzAQRfeF/oPRNthKuiilxMmij2UbaPoBijRORPVCmrz+vuM4NaWkMeSxMcgz994zQsxwvLEmW0FM2ruSDYo+y8BJr7Sbl+xz+po/sCyhcEoY76BkW0hsPLq9GU63AVJGapdKtkAMj5wnuQArUuEDOKpUPlqBdIxzHoT8EnPgd/3+PZfeITjMsfZgo+EzVGJpMHvZ0O+GJIJJLHtqGuuskokQjJYCqc5XTv1JyfcJBSl3PWmhQ+pRA+MHE+rK/wF73TtdTdQKsomI+CYsdfG1j4orL5eWlMVxmwOcvqq0hFZfu4XoJaREd25N0Vas0K7XxeGWdgaRlJcHaa07IRJuDaTLEzS+3fGASIJrAOydOxHWMPu4GsUv806QinKnYmbg8hitdScE0hqA5js4m2NncyySOifRh0RrJZ4w9s/eqNU5DRwgoj7+6tpEsj57PqhXkgJ1IJvvluzoG1BLAwQKAAAAAACTZE1bAAAAAAAAAAAAAAAACQAcAGRvY1Byb3BzL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAAAAhACEYr1llAQAAxQIAABAAHABkb2NQcm9wcy9hcHAueG1sVVQJAAMw0M4SMNDOEnV4CwABBPUBAAAEFAAAAJ1STU/DMAy9I/Efqt63dBwmNHlBaAhx4GPSCpyjxG0j0iRKson9e5wVSoEbOdnP9st7TuDqvTfFAUPUzq7LxbwqC7TSKW3bdflc384uyyImYZUwzuK6PGIsr/j5GWyD8xiSxlgQhY3rskvJrxiLssNexDmVLVUaF3qRKA0tc02jJd44ue/RJnZRVUuG7wmtQjXzI2E5MK4O6b+kysmsL77UR098HGrsvREJ+WOeNHPlUg9sRKF2SZha98grgscEtqLFyBfAhgBeXVAx9wwBbDoRhEy0vwxOMrj23mgpEu2VP2gZXHRNKp5OYos8DWzaAmRgh3IfdDpmqmkK99ri6YIhIFVBtEH47gROMthJYXBD1nkjTERg3wBsXO+FJTo2RsT3Fp997W7yFj5HfoITi686dTsvJP4yO8FhRygqUj8KGAG4o8cIJrPTrG1RffX8LeT1vQy/ki+W84rOaV9fGLkevwv/AFBLAwQUAAAACAAAACEACvOn+GYBAADtAgAAEQAcAGRvY1Byb3BzL2NvcmUueG1sVVQJAAMw0M4SMNDOEnV4CwABBPUBAAAEFAAAAJ2SXU+DMBSG7038D6T3UGBqDAGWTLMrZ0yc0XhX27Otjn6k7cb27y0wmMRdeXc+nvP29G3z6UFUwR6M5UoWKIliFICkinG5LtDbch7eo8A6IhmplIQCHcGiaXl9lVOdUWXgxSgNxnGwgVeSNqO6QBvndIaxpRsQxEaekL65UkYQ51OzxprQLVkDTuP4DgtwhBFHcCMY6kERnSQZHST1zlStAKMYKhAgncVJlOAz68AIe3Gg7fwiBXdHDRfRvjnQB8sHsK7rqJ60qN8/wR+Lp9f2qiGXjVcUUJkzmjnuKihzfA59ZHdf30BdVx4SH1MDxClTPnO6DWZgJKlapq83jm/hWCvDrJ8eZR5jYKnh2vl37LRHBU9XxLqFf9gVBzY7jo/5224mDOx58y/KtCWGND+Z3K0GLPDmZJ2Vfed98vC4nKMyjdObMEnD5G6Zpll8m8XxZ7PdaP4sKE4L/FuxF+gMGn/Q8gdQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAYAHABfcmVscy9VVAkAA4Yc7WiHHO1odXgLAAEE9QEAAAQUAAAAUEsDBBQAAAAIAAAAIQAekRq36QAAAE4CAAALABwAX3JlbHMvLnJlbHNVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAArZLBasMwDEDvg/2D0b1R2sEYo04vY9DbGNkHCFtJTBPb2GrX/v082NgCXelhR8vS05PQenOcRnXglF3wGpZVDYq9Cdb5XsNb+7x4AJWFvKUxeNZw4gyb5vZm/cojSSnKg4tZFYrPGgaR+IiYzcAT5SpE9uWnC2kiKc/UYySzo55xVdf3mH4zoJkx1dZqSFt7B6o9Rb6GHbrOGX4KZj+xlzMtkI/C3rJdxFTqk7gyjWop9SwabDAvJZyRYqwKGvC80ep6o7+nxYmFLAmhCYkv+3xmXBJa/ueK5hk/Nu8hWbRf4W8bnF1B8wFQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAUAHAB3b3JkL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAoWRNW+xw0GIQAgAAtAcAABIAHAB3b3JkL2ZvbnRUYWJsZS54bWxVVAkAA54c7WieHO1odXgLAAEE9QEAAAQUAAAAvZPBbqMwEIbvlfoOlu8NhpA0RSFV222kvexh1T6AY0ywFtvI44Tk7dcYiBSyuy3tqiCEGf75mPnHLO8PskR7bkBoleJwQjDiiulMqG2KX1/WNwuMwFKV0VIrnuIjB3y/ur5a1kmulQXk8hUkkqW4sLZKggBYwSWFia64ci9zbSS17tFsA0nNr111w7SsqBUbUQp7DCJC5vj6CrmjZZn3oHSeC8a/abaTXFkPCQwvHVYrKEQFZ8j6Pcham6wymnEA170sW6ikQp2zwviCJgUzGnRuJ663rjbPc4yQ+JUsB5TZOEr0Z8qc8cM40KIDBS7zAiaycbD5CSayIexjZQ0p2W4UJ5r2FTW3Jn0IhMxmxThmP8GgyaWWFhSKCywf1+/sxDxKNwgkWfJ9q7Shm9KR3CZDbosgD0btZJobaieO+j6Qdwiv2mK6nxLViaLSUV6E5IB+8Br91JKqXtZJK6o08NCp97RMMWkanZMpmZHYXZFbxTg4T2EFNcDtKYUMBTmVojz2743/6kBSCcuKXrGnRjQdD0Ugtk6ygw1J8TMhJHper3EbCVP85CK3i9ljF4maSvxx10WmpwhpIsxz/GPYcpjnnDT915dB6+Bf/HzSOyO4aRx908tb59+d97TxMv60l1Jn3PzbzFwcePYRJ+PpVzv54MZevunho9uPsfewPT/rIdQC4P/sx4evdrFfwuo3UEsDBBQAAAAIAAAAIQCWFrgr1QIAAIgLAAARABwAd29yZC9kb2N1bWVudC54bWxVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAApZZbb9sgFMffJ+07WH5v8S1OYjWttGab+jCpWrcPQIDEqAYsILd9+h3s+LJ5qxz3CXPg/PjDORxz93AShXdg2nAlV354G/gek0RRLncr/+ePLzcL3zMWS4oLJdnKPzPjP9x//HB3zKgie8Gk9QAhTXYsycrPrS0zhAzJmcDmVnCilVFbe0uUQGq75YSho9IURUEYVF+lVoQZA+s9YnnAxr/gyGkcjWp8BGcHTBDJsbbs1DHCqyEztESLISiaAIIdRuEQFV+NSpFTNQAlk0CgakCaTSP9Y3PpNFI0JM2nkeIhaTGNNEgnMUxwVTIJg1ulBbbQ1TsksH7dlzcALrHlG15wewZmkDYYzOXrBEXg1RJETK8mzJFQlBUxbShq5e+1zC7+N62/k57V/pem9WDFuGVhuSViJ1sY2/jqMWdXu68vhaU6NaRZAeeopMl52VYHMZUGg3kDObx1AAdR+G1lC0detf+VtnUdhg44Rv4ldqKolb9NDIMR0XSI1mOMhD/XbJQIyOBu4UlH0zvccGTxaQDRAJASNvJn0TAWFwYi3e12HD7yWjWctOVw2uNME9MD0P1ViChudLjGufdYhlqaX4drYoScL7Y4xybvE9l1G5y1uLPonXe5e9+l+qrVvuxo/H20p668HuV1GwzSvyNYmveJeclxCVVXkOxpJ5XGmwIUwVXz4LZ4VQS8Ol1d49U3wGti7VUJ5Lmq5d/DO22j6Nm1JQwkWYk1foI0T8JlmqTz0K+s8Jezzhoks+VivpyBNYM3If0OJkiveD3/1JqetTPGYZA8fm6Na7bF+8IOpz/3JiMnwzBin/VYfiV89/ILBqFihVGUBG4iJHQ4W8A3qid8w45oFRTWMKmnaL7LbdfdKGuV6PoF2/ZGc4Ypg3XnUdXdKmV73d3eVt3LckQVBqymxITVcyozvIe/aheSrOCSPXNLQGWcVqOo2Xf1WUcEdU/o+99QSwMEFAAAAAgAAAAhAMrnZYorBAAAvgwAABEAHAB3b3JkL3NldHRpbmdzLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAAC1V22PmzgQ/n7S/QfE58uG1ySLmq3yervV5lqVre6zAZNYa2Nkm03T0/33GwwO9BZVSav9hJln5pnxeGYM795/ZdR6wUISXsxt98axLVykPCPFfm5/edqOZrYlFSoyRHmB5/YJS/v93e+/vTtGEisFatICikJGLJ3bB6XKaDyW6QEzJG94iQsAcy4YUvAq9mOGxHNVjlLOSqRIQihRp7HnOBO7peFzuxJF1FKMGEkFlzxXtUnE85ykuH0YC3GJ38ZkzdOK4UJpj2OBKcTAC3kgpTRs7GfZADwYkpcfbeKFUaN3dJ0LtnvkIjtbXBJebVAKnmIp4YAYNQGSonMcvCI6+74B3+0WNRWYu45e9SMPryPwXhFMUvz1Oo5ZyzEGyz4Pya7jmZx5SNbj+blgegRZdRWF55s46kdt3uOSmcoO19GZMxrXtkihA5KHPiO+boPhme7EunxLekkFNtAjSQQSp375sTR62BdcoIRCOFCGFlSSpaOzmqOsH1ZTHZbJg6WTa9/B1PnGObOOUYlFCq0HI8tz7HENQMHzPFZIAVEkS0ypnmEpxQj8HqO9QAymj5FomwznqKLqCSWx4iUovSDY3tRQpgckUKqwiEuUAtuKF0pwavQy/hdXK5hkAhqttdBzrVvFzYwEiwIx2PB3c2/HM1xHVgly+cnYxrsb9l3+3xGHmS5Ihp/qRMfqRPEWgo/JN7wosg+VVAQY9fT7hQh+FAAuas8foTSeTiXeYqQqSNMbOdMnsaWk3BEhuHgoMqiNN3NG8hwLcECg1nZQPkTwo87zPUYZXKVv5LeS+G9Qhs70n6Asn5dcKc7uT+UBcv1rJ6nrfdwvX/ggyKRZfOZcnVVhbPnr6bKJtEYvQXzXCVabQWTibN1hm0XgO/4gsnLXbjCMhLPlaggJboOJuxhCJqG3CcIhZLH0Zv5sCFku3Wk4iKxW/srfDiIbZz28n83Km04HY9vees7tpj2d9kxYVH9qfBJmVTe2xRqLFWKJIMja1R8j41ojEc9LUhg8wTClcR+Jq8SAo1EDSIYo3UKJGcBp5BmR5Rrnek13SOw73lZDDEphyn44c9VTG4s/Ba/KBj0KVDYNa1TcIGgtSaEeCTNyWSWxsSrgXulBVZF9fBE6T116jpGCBtCD7xHpRtK6uBh9idtGoyKumwTvUFk2vZbs3blNyf6g3Lo9FLxl8M2qX5K912KexrwG0y8orXcG2u2ik3lG1tPzjczvZIGRBZ0sNLKwk02MbFLLDjBdBVx1z9D2ZlnLc04pP+LsvsNficwlmBI48fjEku5uu2kwSiTMoRKuQcWFwf7QmBtEGU8f6vs6aOT+YhGuF860gUN9fSo9qiC1n3G+RBJnLWZMw8b0n8nEmbjuajYKZpvb0WYaBKOZu7wdTafO1PW3rufPnH/bPjA/Hnf/AVBLAwQUAAAACAAAACEA24Vsw30EAACXHQAAEgAcAHdvcmQvbnVtYmVyaW5nLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAADNmc1u4zYQx+8F+g6CgB4Tifq2sM4iySZFFttF0U3RMy3RlhB+CBRlx9d9mT5CH2tfoaRkyXLkxJIctz4pJjk/zQxnyL+dDx+fCdaWiOcpo1MdXJq6hmjE4pQupvqfj/cXga7lAtIYYkbRVF+jXP949fNPH1YhLcgMcblQkwyah6ssmuqJEFloGHmUIALzS5JGnOVsLi4jRgw2n6cRMlaMx4ZlArP8K+MsQnkuObeQLmGub3DRcz9azOFKGiugY0QJ5AI9bxlgMMQ1JkbQBVkjQDJCC3RR9mCUZyivOiBnFEh61SG540h7gvPGkawuyR9HsrukYBypU06kW+AsQ1ROzhknUMiPfGEQyJ+K7EKCMyjSWYpTsZZM06sxMKVPIzySVg2B2PFggm8QFiNsxzWFTfWC03Bjf9HYK9fDyn7zaCwQ7vda+bqJgZ4FzkVty/vkrjL/xKKCICrKrBkcYZlHRvMkzZrTgYylycmkhizfSsCSYL052UDPVnvtaPtUbcMW2Mf9zd4RXHn+NhGYPXZTIRqLPi7svrP2hMgK3r54VGpayQU9D58aYHUAXoR6XhY1I9gwjGjb3YqT9myrmuM1nDRuccY50wLExSCEZdd+qIcyb7HyWMTJMFy9R4ayhQImME/aRDQsQLfBrUkr39niuKb6lbMi29LS42gP2+N1RYcFaHovdzDLj3PmWwIzeeqSKHxYUMbhDEuPZKtpslu0cge0qlzVQ6s6QKv3WisLSFOnln4lhRqc5YLDSHwtiLbz6UFWuxR8khlyJFUeV4OVprueC8RvOIJPaomi0Fy9LVxCeQUAD1jejenrhpohBRbpF7RE+HGdoXpNsp7xNP5NzWE1V60VJMP1Chfc3Tp3ZlDN4KWaSOWjcioUGZb3remYE9M0QelD6WPjRGUnZeg9aQZnBcZINMRHeQfVUz++/9OMf47qUYzmm+XZ71w9UqrCVMNT3bdKTxJIF6Ugtj1TrTWaxXzzuGdU5Cq5eZTKOvy2JjOGS9NrmbedgZRKcIzmUGZmAyspRunYy0yATibsckTeZ/JSXCK14ujMsKF5AY4zLjG3rOAp4tpXtGpl58VolHcXDsua1cma+/5Z+/H976F5s4A3Lm9/ydXqO1neytru2LAE2Xsa7AQJGtxwVhD83x3nnGXHyTycdce5Z9pxjj3yCH/vjvPOtONcc+RR/n4d559lx7n+yLP6P+q44Ew7znNGHuHHd5yxo24PSl8wRvq6gW8C++b6OOl7d+c5wL91+kjf+57bGKMoJRDv3cdfwOU7a9+echVMRhYlZivEvyAh92J/RNbgiA6p1p5aEtwcE9IfjEC6PyJ7X0Q8XSQDBCUIeoTUVX/3I0N6s+acwTt0SP71VGynKzp3cEiHhFtPOXWyovOGF11HU/Uquq4AOknR+YN36JAC6ilaTld0wfCQDmiXnoriZEU3GV50HVnxStF1NQAt737auvPVD2dhXJQ/q5WDMlTHn3jWy5/LHpprv34X3cO09jGdwHWB7wDwOhO0mUbrH6pX/wJQSwMEFAAAAAgAAAAhAL5+dmJWAQAA0AMAABQAHAB3b3JkL3dlYlNldHRpbmdzLnhtbFVUCQADMNDOEjDQzhJ1eAsAAQT1AQAABBQAAACd01FvwiAQAOD3JfsPhHelumlMYzVZFpe9LEu2/QAKV0sGXAO46n79aLWuiy92T0DLfbnjYLneG02+wHmFNqOTcUIJWIFS2W1GP943owUlPnAruUYLGT2Ap+vV7c2yTmvI3yCEuNOTqFifGpHRMoQqZcyLEgz3Y6zAxp8FOsNDXLotM9x97qqRQFPxoHKlVTiwaZLM6Ylx1yhYFErAI4qdARvaeOZARxGtL1XlO62+RqvRycqhAO9jPUYfPcOVPTOT+wvIKOHQYxHGsZhTRi0VwydJOzP6F5gNA6YXwFzAfpixOBksRvYdJYc587OjZM/5XzI9QO4GEdO7Lo9maMJ7lpdBlsO4rkesieWBl9yXfRGGFTg7cwfTnLcR6fPWouO5jlK8QSReAtLC5NiFZiDHxpKuBNKeC13FJ4ZVUEZ9wwbdg8Pag2PNZ6411q8vT3HB/rzD1Q9QSwMEFAAAAAgAAAAhAD+v4WZfDwAADaYAAA8AHAB3b3JkL3N0eWxlcy54bWxVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAA3Z1tc9s2Esff38x9B45e9V6ksp5lT92O7STnzCWpWzvX1xAJWaj5oCOpOO6nPwB8EKUlKC64UdRMZlqL4v4I4L+7xIIU+dMvXwLf+czjREThZW/w41nP4aEbeSJ8vOx9enj7at5zkpSFHvOjkF/2XnjS++Xnf/7jp+eLJH3xeeJIQJhcBO5lb5Wm64t+P3FXPGDJj9Gah/LLZRQHLJUf48d+wOKnzfqVGwVrloqF8EX60h+enU17OSZuQ4mWS+Hy15G7CXiYavt+zH1JjMJkJdZJQXtuQ3uOYm8dRy5PEtnpwM94ARNhiRmMASgQbhwl0TL9UXYmb5FGSfPBmf4r8LeACQ4wBICpy7/gGPOc0ZeWVY7wcJxpyRFehWPXmArA26AQw1HRDvU/ZV5hJV7qrXC4QqO+smUpW7FkVSVyXAcnJe4lUOMduBfvHsMoZgtfkqQHOdIJHA12MhXU/5xMWKfogqPHpfezjC4vcl/zJdv4aaI+xndx/jH/pP/3NgrTxHm+YIkrxGXvKhZMDvHzBWdJepUI9iBbLg8fCNmS26swEerLlfqjsrObXPYeRCBD+SN/dn6PAhY6P1xH3otzc/+vXl8d6InHodzzM/Mve8NsU/JXuWFcbLlJ9rf5LHwstvHw1af7ausqmxbCk01i8av7K204GF/44pGlm1g2S33ShCwRxd6N7Db/km5k++XO/Xw8+vujtC4/ZXvtDalMGDJ93GdZTH7Ll+8j94l796n84rJ31ss2fnp3F4solpnqsnd+nm+854G4FZ7Hw8qO4Up4/I8VDz8l3Ntu/+2tzjb5BjfahPLv0WyqZfYT780Xl69V7pLfhkzp9VEZaG02Yntwbf6/AjbIB7jOfsWZSuDOYB9xjkYMlUVS6W09c7PX9wH6QKNjHWh8rANNjnWg6bEONDvWgebHOtD51z6QCD2Z3wf1hwHUQxxDNKI5hmBDcwyxhOYYQgXNMUQCmmNwdDTH4MdojsFNEZw0ck1eWHH2kcHbm7mHzxF23MOnBDvu4TOAHfdwwrfjHs7vdtzD6dyOezh723EPJ2s8N5tqOe9kmIVp5yhbRlEaRil31PS0M42FkqWrWhqeOunxmKSTBJgss+Un4s40l+nPhz1k0u18nqqCzomWzlI8quKkc8N5+Jn70Zo7zPMkjxAYc1k+GUbExqdjvuQxD11O6dh0UF+E3Ak3wYLAN9fskYzFQ494+AoiSVIoHZpt0pUKEkHg1AFz44hgzsLI8sN7kXQfKwVxrje+z4lYH2lcTLO61wYa07000JjulYHGdC8MKppRDVFOIxqpnEY0YDmNaNwy/6Qat5xGNG45jWjcclr3cXsQqc/3Zx2D9mt3N36UUCS8e/EY6vXTzqR8zdS5YzF7jNl65ahl54MzLfRx9JLzA8U5rSRRzeu1i6hVZxFuug/oDo0quEoeUXiVPKIAK3ndQ+yDnCarCdotTT1zv1mktUHbviq4Z/4mm9B2jzaWdvewbQC8FXFCFgb1WAIP/qims7dEU71tK7s3bMvqHlb7WYm0eTmSoJV+5D7RpOHblzWPZVn21Jn0NvL96Jl7dMT7NI4yX6uG/HDYOuTfBOsVS0QCEO1P9cUdDM4Htu7coTufiZBGtzevAiZ8h24Gcfvw4b3zEK1VmakGhgZ4HaVpFJAx85XAH/7gi3/RNPBKFsHhC1Fvr4iWhzTsRhCcZDJS5BGR5DRThILkHKp5/+Evi4jFHg3tLubZTUMpJyLes2DtU8WWzIvPMv8QzIY0778sFmpdiCqoHkhglWXDZLP4k7vdU93HyCFZGfp1k+r1Rz3V7X61dwfXfZqwg+s+RdBqytOD8l+Czu7gund2B0fV2RufJYkwXkK15lF1t+BR97d78ZfzIj+KlxufbgALINkIFkCyIYz8TRAmlD3WPMIOax51fwldRvMIluQ079+x8MjE0DAqJTSMSgYNo9JAw0gF6H6HTgXW/TadCqz7vToZjGgKUIFR+Rnp6Z/oKk8FRuVnGkblZxpG5WcaRuVno9cOXy7lJJjuFFNBUvlcBUl3oglTHqyjmMUvRMg3Pn9kBAukGe0ujpbq1yRRmN3ETTGd3SxSysl2hqMS+Q++IGuaYlG2i2BFlPl+FBGtrW1PONpy9961Q2b65xydm3DnM5evIt/jsaFPjfXy/Zq5Ai6dtr9Y8l48rlLnflWu9lcx07ODlkXBvmN2+IB1Yz4dNl5m8sQmKBoKf0wxHbU3HgLj8WHj7Uxix3LS0hIec3rYcjtL3rGctbSEx5y3tBwBy6Z4eM3ip1pHmDX5T1njGZxv1nhhvjCuPWyTI5WWdS44a/KinVBxrlxXXS2A6rSLGbN9u+Ax22OiyEzBhJOZ0jquzIimAPudfxZJ7Rr1gevf5d0TIO+PW2fO3zZRCi5TD9v/qOudnDiFCXdqOaP2F652sox5HFunGzOidd4xI1onIDOiVSYymqNSkpnSOjeZEa2TlBmBzlbwjIDLVtAel62gvU22ghSbbNVhFmBGtJ4OmBHoQIUIdKB2mCmYEahABeZWgQop6ECFCHSgQgQ6UOEEDBeo0B4XqNDeJlAhxSZQIQUdqBCBDlSIQAcqRKADFSLQgWo5tzeaWwUqpKADFSLQgQoR6EAddwxUaI8LVGhvE6iQYhOokIIOVIhABypEoAMVItCBChHoQIUIVKACc6tAhRR0oEIEOlAhAh2ok46BCu1xgQrtbQIVUmwCFVLQgQoR6ECFCHSgQgQ6UCECHagQgQpUYG4VqJCCDlSIQAcqRKADddoxUKE9LlChvU2gQopNoEIKOlAhAh2oEIEOVIhABypEoAMVIlCBCsytAhVS0IEKEehAhYgm/8wvUZpusx/gVz2Nd+wjfueTNer36k+5d9ZQ26OKVplZ7X+LcB1FT07tDw9Ho/YQsfBFpJeoDZfVq9wZ+sLnrzfNv/Bp8RiPtl3Jfwuhr5kC+LitJVhTGTe5fNUSFHnjJk+vWoJZ57gp+1YtwWlw3JR0dVwWN6XI0xEwbkozFeOBwbwpW1fM4RA35eiKIRzhpsxcMYQD3JSPK4YTRyXnfetJy3GalveXAkKTO1YIMzOhyS2hVsa1/daimQlt1TMT2spoJqD0NGLwwppRaIXNKDupYZhhpbYPVDMBKzUkWEkNMPZSQ5S11BBlJzVMjFipIQErtX1yNhOspAYYe6khylpqiLKTGp7KsFJDAlZqSMBK3fGEbMTYSw1R1lJDlJ3UcHKHlRoSsFJDAlZqSLCSGmDspYYoa6khyk5qUCWjpYYErNSQgJUaEqykBhh7qSHKWmqIapJar6LYV0sVc9wkrGKIOyFXDHHJuWJoUS1VrC2rpQrBslqCWtlVS1XR7Kqlqnp21VJVRrtqCehpVy3VCmtXLdUqbFctmaXGVUt1UtsHql21VCc1rloySo2rlhqlxlVLjVLjqiWz1LhqqU5qXLVUJ7V9crarloxS46qlRqlx1VKj1LhqySw1rlqqkxpXLdVJjauW6qTueEK2q5YapcZVS41S46ols9S4aqlOaly1VCc1rlqqkxpXLRmlxlVLjVLjqqVGqXHVkllqXLVUJzWuWqqTGlct1UmNq5aMUuOqpUapcdVSo9S4aumDNBEEj4C6D1icOnTPi7tlySpl3R9O+CmMeRL5n7nn0Hb1PaqX/eed118ptn6dn9w/lWOmnoBe+bmSlz0BNgfqHd955WuqlLFqiZO/5yvfrBucX67NjqgNDxyqhOfXigcAv325lT7Cgsle/RrWHTxUD0as2a4cotheHOZmxeLs262rFvuc7/fl+SJO1Avcsq/Pzoaj0evZdbbXOns12xPn64/y+P3ig9SHJ/pTkv2AVpov1DPF5AiMpvq3V2yZ8viyN8+jNsqe2vT+s18eKZcuP0btW+CKV76xPyuvfNt/H5z68k2+TX2vXwlXa+kmaWXztfBE1jhXRXnZrrfj2VT7ht5ZZ4DLHtPxv92sbkpR9xm8zQjbF8gVF5urL5AbF30tXu1m4zxDo/MMKZ1n2MJ5tmGZ7bcTlF/ZvQYt3WvwfbrXaAjdK9vW0b1GRvcaUbrX6Dtxr2Gzex1yomO4ynAOXSXb1tFVxkZXGVO6yvjEXWVe9ZSx0VNGX8dTRPbfm4TEbzp6xMToERNKj5h8Hx4xPs3c0dEHpkYfmFL6wPTEfcAs++ToiWByrv7tO4F609LWBR6EeoPv1ZTAA2ZGD5hResDsb+sB0yME/pE1nxs1n1NqPj8pzaGys6PH9nCm/rXR+TXFnO/cqPM5pc7nJ67z/AgRTK+sKweVufkD1Q3rX/mLkcon++jXIu1rbnh7kkGvQTu9zO1O1SpsQ5v1Km3jwl3+sHaTQ7X2qHThZ1LLP96FyqGe83fYZy31vrBeseMN9/0PLNs7Wpt39fkyzb4dnM1rvl9kr4Qw2sf62oER0N9tTL/shHm8s5dE5j9qMa6T6keGweHOHiXWcaRb+rC7SeTQ6OXe/fbtrIHut/K2WG51tnlmL3HVxoEpXQ0OpCpz8vle1qO6LHciJR02SjokknSIO/t8/wp3WXFEKjxqVHhEpPDoayn8d1/0Q6o1blRrTKTW+NTUOvbCG1KVSaMqEyJVJqemysnpMG3UYUqkw/TUdDjqahRSklmjJDMiSWanJslpiTBvFGFOJML81EQ46koOUpLzRknOiSQ5PzVJvslyWvZgi/2xzrZSrKNpUtMi2iAv2FBrZNtF7r0L4656fcWXdMP8/En6jctjxyyBtk3W3XpV9PuJx+XgbifLZXqcwunzhDgRbiWqdYOu4VbxJbP6p1m2Hl+z+iAtX6K9L1D5BUWoFrDGaB1YRGu4CbI/hA/vhyq/BDE9mB64Je+bTECAVwwm36Lm3RHL5BZdQ3fXvczecOJzxq8sWX3MZq8B2Fcm20oRrZrUFKpDmztrD92ANige3venW3BUEcvj2khtmGSOz9S/NhpS18PbgasVp2vMVBQ2a3IwYI46cvUOrC6fbN+rsT9We6/dOOTRcChGYwv3FPpSl7pQpZ6R12LO19Jdyk7nD44rn2a3323wuDuco9R4BOqEetg7jnifVT4W9Ylu920oFAmverimvDeyKSjW117lAqneL5GelL9X+y91j5yTZUeuJ61OPuyW6+PlpdSvfKT+tmeHfhgxKjJ7NcbmU90afWU3+0SS/L/peijwo0bX7Xo62AmSAx57cnHfmCO3z9Y0DeB2j65Zsrjmh8qSi+yo+WglMqn4N2xNM3ZgSjmpH9Hir+Tn/wNQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAsAHAB3b3JkL3RoZW1lL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAAAAhAGeA/LSbBgAAzSAAABUAHAB3b3JkL3RoZW1lL3RoZW1lMS54bWxVVAkAAzDQzhIw0M4SdXgLAAEE9QEAAAQUAAAA7VlPb9s2FL8P2HcgdHf1x5IsBXUL/23XJm3RpB16ZGRaYkyJAkknMYoCQ3vaZcCAbthlwG47DMMKrMCKXfZhCrTYug8xSnZs0abatE23AksMxCL5e48/vvf4+ExdvHycEnCIGMc0axv2BcsAKIvoCGdx27izN2wEBuACZiNIaIbaxgxx4/KlTz+5CLdEglIEpHzGt2DbSITIt0yTR7Ib8gs0R5kcG1OWQiGbLDZHDB5JvSkxHcvyzRTizAAZTKXam+MxjhDYK1Qal06UD4j8lwledESE7UbljFWJEjua2MUXn/EeYeAQkrYh5xnRoz10LAxAIBdyoG1Y5Z9hXrpoLoWIqJGtyA3Lv4XcQmA0cUo5Fu8vBa2BE7j2Ur8z17+JGwTFZ6mvBMAokiu1N7C251uBs8BWQPNHje6wZTdVfEV/c1N/6HcdV8E3V3h3c43DcND3FLy7wnsb+I7ldMOmgvdWeH8D7w46LWeg4EtQQnA22UT7rSDwF+glZEzJVS089H2r1V/AVyizEl1z+UzUxVoKDygbSkDpXChwBsQsR2MYSVwnF5SDPuY5gTMD5DCjXHZbjm3LwHMtZ/kpLQ63EKxIz7sivtFV8AE8YjgXbeOa1GpUIC+ePXv+8Onzh789f/To+cNfwDaOE6GRuwqzuCr36sev//7+C/DXrz+8evyNHs+r+Jc/f/ny9z9ep14otL598vLpkxffffXnT4818A6D+1X4Hk4RBzfQEbhNU7lAzQRon72dxF4CcVWik8UcZrCQ0aAHIlHQN2aQQA2ui1Q73mUyXeiAV6YHCuHdhE0F1gCvJ6kC3KGUdCnTrul6MVfVCtMs1k/OplXcbQgPdXP31rw8mOYy7rFOZS9BCs1bRLocxihDAhRjdIKQRuwexopdd3DEKKdjAe5h0IVYa5I9vC/0QldxKv0y0xGU/lZss3MXdCnRqe+jQxUp9wYkOpWIKGa8AqcCplrGMCVV5DYUiY7k7oxFisG5kJ6OEaFgMEKc62RusplC9zqUeUvr9h0yS1UkE3iiQ25DSqvIPp30EpjmWs44S6rYz/hEhigEt6jQkqDqDina0g8wq3X3XYzE2+3tOzIN6QOkGJky3ZZAVN2PMzKGSKe8w1IlxXYY1kZHdxorob2NEIFHcIQQuPOZDk9zqid9LZFZ5SrS2eYaVGO1aGeIy1qpKG40jsVcCdldFNMaPjuztcQzg1kKWZ3mGxM1ZAb7TG5GXbySaKKkUsyKTasncZOn8FRabyVQCauizfXxOmPZ2+4xKXPwDjLorWVkYj+1bfYgQfqA2YMYbOvSrRSZ6kWK7VSKTbVyY3XTrtxgrhU9Kc7eUAH9N5XPB6t5zr7aqUso6zVOHW69sulRNsIff2HTh9PsFpJnyXldc17X/B/rmrr9fF7NnFcz59XMv1bNrAoYs3rZU2pJa29+xpiQXTEjaJuXpQ+Xe380lJ1loxRaXjTliXxcTKfgYgbLZ8Co+ByLZDeBuZzGLmeI+UJ1zEFOuSyfjFrdZfE1TXfoaHGPZ5/cbUoBKFb9lrfsl6WamPf6rdVF6FJ92Yp5lYBXKj09icpkKommhkSreToStnVWLEINi8B+HQuz4hV5OAFYXIt77pyRDDcZ0qPCT3P5E++euafrjKku29EsL3TPzNMKiUq4qSQqYZjIw2O9+4x9HYZ6VztaGq3gQ/ja3MwNJFNb4EjuuaYn1UQwbxtj+bNJPqa51MeLTAVJnLWNSCwM/S6ZJWdc9CFP5rByaL7+FAvEAMGpjPWqG0i24mY7LevjJRdaH5/lzHUno/EYRaKmZ9WUY3Ml2tH3BBcNOpWkd5PREdgnU3YbSkN5Lbsw4AhzsbTmCLNKcK+suJauFltReQO02qKQ5AlcnCjVZD6Hl89LOpV1lEzXV2XqTLgfD8/i1H2z0FrSrDlAWrVZ7MMd8hVWTT0rT5vrwsB6/Snx/gdChVqgp9bUU6s7O86wIKhM59fYzan15nueButRa1bqyrK18XKb7h/IyO/LanVKBJ9fkB3L8rt38lpyngnK3pPscizAlOG2cd/yOm7P8XoNK/AGDbfpWo3A6zQbHc9r2gPPtvpd54E0ikhS25vPPZQ/9sls8e6+7N94f5+elNoXIpqatKyDzVK4fH9vO/Xv7wGWlrnvO8OwGXb9RtjsDBtuvxs0wp7fbfT9Xqs/7Pe8IBw+MMBhCXY7zZ7rD4KGb/d6Dde3CvpB2Gi5jtNxW51g4HYeLGwtV37yfWLektelfwBQSwMECgAAAAAAk2RNWwAAAAAAAAAAAAAAAAsAHAB3b3JkL19yZWxzL1VUCQADhhztaIcc7Wh1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAAAAhALO+ix3+AAAAtgMAABwAHAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzVVQJAAMw0M4SiBztaHV4CwABBPUBAAAEFAAAAK2TzWrDMBCE74W+g9h7LTttQwmRcymBXFv3AWR7/UP1Y6RNWr99RUoShwbTg44zYme+hdV6860VO6DzvTUCsiQFhqaydW9aAR/F9uEFmCdpaqmsQQEjetjk93frN1SSwpDv+sGzkGK8gI5oWHHuqw619Ikd0ISXxjotKUjX8kFWn7JFvkjTJXfTDMivMtmuFuB29SOwYhzwP9m2afoKX22112joRgX3SBQ28yFTuhZJwMlJQhbw2wiLqAg0KpwCHPVcfRaz3ux1iS5sfCE4W3MQy5gQFGbxAnCUv2Y2x/Ack6GxhgpZqgnH2ZqDeIoJ8YXl+5+TnJgnEH712/IfUEsBAh4DFAAAAAgAAAAhADKRb1deAQAApQUAABMAGAAAAAAAAQAAAKSBAAAAAFtDb250ZW50X1R5cGVzXS54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMKAAAAAACTZE1bAAAAAAAAAAAAAAAACQAYAAAAAAAAABAA7UGrAQAAZG9jUHJvcHMvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAAAAhACEYr1llAQAAxQIAABAAGAAAAAAAAQAAAKSB7gEAAGRvY1Byb3BzL2FwcC54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACAAAACEACvOn+GYBAADtAgAAEQAYAAAAAAABAAAApIGdAwAAZG9jUHJvcHMvY29yZS54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMKAAAAAACTZE1bAAAAAAAAAAAAAAAABgAYAAAAAAAAABAA7UFOBQAAX3JlbHMvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAAAAhAB6RGrfpAAAATgIAAAsAGAAAAAAAAQAAAKSBjgUAAF9yZWxzLy5yZWxzVVQFAAMw0M4SdXgLAAEE9QEAAAQUAAAAUEsBAh4DCgAAAAAAk2RNWwAAAAAAAAAAAAAAAAUAGAAAAAAAAAAQAO1BvAYAAHdvcmQvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAoWRNW+xw0GIQAgAAtAcAABIAGAAAAAAAAQAAAKSB+wYAAHdvcmQvZm9udFRhYmxlLnhtbFVUBQADnhztaHV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQCWFrgr1QIAAIgLAAARABgAAAAAAAEAAACkgVcJAAB3b3JkL2RvY3VtZW50LnhtbFVUBQADMNDOEnV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQDK52WKKwQAAL4MAAARABgAAAAAAAEAAACkgXcMAAB3b3JkL3NldHRpbmdzLnhtbFVUBQADMNDOEnV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQDbhWzDfQQAAJcdAAASABgAAAAAAAEAAACkge0QAAB3b3JkL251bWJlcmluZy54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACAAAACEAvn52YlYBAADQAwAAFAAYAAAAAAABAAAApIG2FQAAd29yZC93ZWJTZXR0aW5ncy54bWxVVAUAAzDQzhJ1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACAAAACEAP6/hZl8PAAANpgAADwAYAAAAAAABAAAApIFaFwAAd29yZC9zdHlsZXMueG1sVVQFAAMw0M4SdXgLAAEE9QEAAAQUAAAAUEsBAh4DCgAAAAAAk2RNWwAAAAAAAAAAAAAAAAsAGAAAAAAAAAAQAO1BAicAAHdvcmQvdGhlbWUvVVQFAAOGHO1odXgLAAEE9QEAAAQUAAAAUEsBAh4DFAAAAAgAAAAhAGeA/LSbBgAAzSAAABUAGAAAAAAAAQAAAKSBRycAAHdvcmQvdGhlbWUvdGhlbWUxLnhtbFVUBQADMNDOEnV4CwABBPUBAAAEFAAAAFBLAQIeAwoAAAAAAJNkTVsAAAAAAAAAAAAAAAALABgAAAAAAAAAEADtQTEuAAB3b3JkL19yZWxzL1VUBQADhhztaHV4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAAAAIQCzvosd/gAAALYDAAAcABgAAAAAAAEAAACkgXYuAAB3b3JkL19yZWxzL2RvY3VtZW50LnhtbC5yZWxzVVQFAAMw0M4SdXgLAAEE9QEAAAQUAAAAUEsFBgAAAAARABEAqQUAAMovAAAAAA==`, 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) => {
243646
243978
  const extensionLike = extension2;
243647
243979
  const config2 = extensionLike?.config;
243648
243980
  const ExtensionCtor = extensionLike?.constructor;
@@ -244293,6 +244625,559 @@ var Node$13 = class Node$14 {
244293
244625
  annotation.style.position = "relative";
244294
244626
  annotation.appendChild(caretAnchor);
244295
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
+ }
244706
+ }, ProofingStore = class {
244707
+ #issuesBySegment = /* @__PURE__ */ new Map;
244708
+ addIssue(issue) {
244709
+ const list5 = this.#issuesBySegment.get(issue.segmentId);
244710
+ if (list5)
244711
+ list5.push(issue);
244712
+ else
244713
+ this.#issuesBySegment.set(issue.segmentId, [issue]);
244714
+ }
244715
+ remapIssues(segmentIds, mapping, recheckId) {
244716
+ for (const id2 of segmentIds) {
244717
+ const list5 = this.#issuesBySegment.get(id2);
244718
+ if (!list5)
244719
+ continue;
244720
+ const surviving = [];
244721
+ for (const issue of list5) {
244722
+ const fromResult = mapping.mapResult(issue.pmFrom, -1);
244723
+ const toResult2 = mapping.mapResult(issue.pmTo, 1);
244724
+ if (fromResult.deleted || toResult2.deleted)
244725
+ continue;
244726
+ if (fromResult.pos >= toResult2.pos)
244727
+ continue;
244728
+ issue.pmFrom = fromResult.pos;
244729
+ issue.pmTo = toResult2.pos;
244730
+ issue.state = "mapped";
244731
+ issue.recheckId = recheckId;
244732
+ surviving.push(issue);
244733
+ }
244734
+ if (surviving.length > 0)
244735
+ this.#issuesBySegment.set(id2, surviving);
244736
+ else
244737
+ this.#issuesBySegment.delete(id2);
244738
+ }
244739
+ }
244740
+ replaceBatchResults(recheckIds, coveredSegmentIds, freshIssues) {
244741
+ for (const segId of coveredSegmentIds) {
244742
+ const list5 = this.#issuesBySegment.get(segId);
244743
+ if (!list5)
244744
+ continue;
244745
+ const filtered = list5.filter((issue) => issue.recheckId === null || !recheckIds.has(issue.recheckId));
244746
+ if (filtered.length > 0)
244747
+ this.#issuesBySegment.set(segId, filtered);
244748
+ else
244749
+ this.#issuesBySegment.delete(segId);
244750
+ }
244751
+ for (const issue of freshIssues)
244752
+ this.addIssue(issue);
244753
+ }
244754
+ removeBySegmentIds(ids) {
244755
+ for (const id2 of ids)
244756
+ this.#issuesBySegment.delete(id2);
244757
+ }
244758
+ removeOrphanedSegments(currentSegmentIds) {
244759
+ for (const segId of this.#issuesBySegment.keys())
244760
+ if (!currentSegmentIds.has(segId))
244761
+ this.#issuesBySegment.delete(segId);
244762
+ }
244763
+ clear() {
244764
+ this.#issuesBySegment.clear();
244765
+ }
244766
+ getAllIssues() {
244767
+ const result = [];
244768
+ for (const list5 of this.#issuesBySegment.values())
244769
+ result.push(...list5);
244770
+ return result;
244771
+ }
244772
+ getDisplayIssues(ignoredWords) {
244773
+ const normalizedIgnored = new Set(ignoredWords.map((w) => w.normalize("NFC").toLowerCase()));
244774
+ const result = [];
244775
+ for (const list5 of this.#issuesBySegment.values())
244776
+ for (const issue of list5) {
244777
+ if (issue.kind !== "spelling")
244778
+ continue;
244779
+ if (isSuppressed(issue, normalizedIgnored))
244780
+ continue;
244781
+ result.push(issue);
244782
+ }
244783
+ return result;
244784
+ }
244785
+ getActiveRecheckIds() {
244786
+ const ids = /* @__PURE__ */ new Set;
244787
+ for (const list5 of this.#issuesBySegment.values())
244788
+ for (const issue of list5)
244789
+ if (issue.state === "mapped" && issue.recheckId !== null)
244790
+ ids.add(issue.recheckId);
244791
+ return ids;
244792
+ }
244793
+ get isEmpty() {
244794
+ return this.#issuesBySegment.size === 0;
244795
+ }
244796
+ get size() {
244797
+ let count2 = 0;
244798
+ for (const list5 of this.#issuesBySegment.values())
244799
+ count2 += list5.length;
244800
+ return count2;
244801
+ }
244802
+ }, NON_TEXT_INLINE_NODES, DEFAULT_DEBOUNCE_MS = 500, DEFAULT_MAX_WAIT_MS = 2000, DEFAULT_TIMEOUT_MS = 1e4, DEFAULT_MAX_CONCURRENT = 2, DEFAULT_MAX_SEGMENTS_PER_BATCH = 20, DEFAULT_MAX_SUGGESTIONS = 5, ProofingSessionManager = class {
244803
+ #config;
244804
+ #provider = null;
244805
+ #capabilities = null;
244806
+ #status = "disabled";
244807
+ #store = new ProofingStore;
244808
+ #offsetMaps = /* @__PURE__ */ new Map;
244809
+ #segmentHashes = /* @__PURE__ */ new Map;
244810
+ #debounceTimer = null;
244811
+ #pendingAbortControllers = /* @__PURE__ */ new Set;
244812
+ #inFlightCount = 0;
244813
+ #documentEpoch = 0;
244814
+ #disposed = false;
244815
+ #pendingSegments = [];
244816
+ #nextRecheckId = 0;
244817
+ #isComposing = false;
244818
+ #lastCheckFiredAt = 0;
244819
+ #visibilitySource = null;
244820
+ #documentId = null;
244821
+ #pageResolver = null;
244822
+ #lastDoc = null;
244823
+ #lastSegments = [];
244824
+ constructor(config2 = {}) {
244825
+ this.onResultsChanged = null;
244826
+ this.#config = {
244827
+ enabled: config2.enabled ?? false,
244828
+ debounceMs: config2.debounceMs ?? DEFAULT_DEBOUNCE_MS,
244829
+ maxSuggestions: config2.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS,
244830
+ visibleFirst: config2.visibleFirst ?? true,
244831
+ allowIgnoreWord: config2.allowIgnoreWord ?? true,
244832
+ defaultLanguage: config2.defaultLanguage ?? null,
244833
+ ignoredWords: config2.ignoredWords ?? [],
244834
+ timeoutMs: config2.timeoutMs ?? DEFAULT_TIMEOUT_MS,
244835
+ maxConcurrentRequests: config2.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT,
244836
+ maxSegmentsPerBatch: config2.maxSegmentsPerBatch ?? DEFAULT_MAX_SEGMENTS_PER_BATCH,
244837
+ onProofingError: config2.onProofingError ?? null,
244838
+ onStatusChange: config2.onStatusChange ?? null
244839
+ };
244840
+ if (config2.provider)
244841
+ this.#provider = config2.provider;
244842
+ if (this.#config.enabled && this.#provider)
244843
+ this.#setStatus("idle");
244844
+ }
244845
+ get status() {
244846
+ return this.#status;
244847
+ }
244848
+ get isEnabled() {
244849
+ return this.#config.enabled && this.#provider !== null;
244850
+ }
244851
+ get config() {
244852
+ return this.#config;
244853
+ }
244854
+ setVisibilitySource(source) {
244855
+ this.#visibilitySource = source;
244856
+ }
244857
+ setDocumentId(id2) {
244858
+ this.#documentId = id2;
244859
+ }
244860
+ setPageResolver(resolver2) {
244861
+ this.#pageResolver = resolver2;
244862
+ }
244863
+ setComposing(composing) {
244864
+ this.#isComposing = composing;
244865
+ if (!composing && this.#lastSegments.length > 0 && this.isEnabled)
244866
+ this.#scheduleDebouncedCheck(this.#lastSegments);
244867
+ }
244868
+ getPaintSlices(activeWordRange) {
244869
+ if (!this.isEnabled)
244870
+ return [];
244871
+ const slices = buildPaintSlices(this.#store.getDisplayIssues(this.#config.ignoredWords));
244872
+ if (!activeWordRange)
244873
+ return slices;
244874
+ return slices.filter((s2) => s2.pmTo <= activeWordRange.from || s2.pmFrom >= activeWordRange.to);
244875
+ }
244876
+ getIssueAtPosition(pmPos, activeWordRange) {
244877
+ return findSliceAtPosition(this.getPaintSlices(activeWordRange), pmPos)?.issue ?? null;
244878
+ }
244879
+ updateConfig(patch3, doc$12) {
244880
+ const prevEnabled = this.#config.enabled;
244881
+ const prevProvider = this.#provider;
244882
+ const needsRecheck = patch3.provider !== undefined || patch3.defaultLanguage !== undefined;
244883
+ if (patch3.debounceMs !== undefined)
244884
+ this.#config.debounceMs = patch3.debounceMs;
244885
+ if (patch3.maxSuggestions !== undefined)
244886
+ this.#config.maxSuggestions = patch3.maxSuggestions;
244887
+ if (patch3.visibleFirst !== undefined)
244888
+ this.#config.visibleFirst = patch3.visibleFirst;
244889
+ if (patch3.allowIgnoreWord !== undefined)
244890
+ this.#config.allowIgnoreWord = patch3.allowIgnoreWord;
244891
+ if (patch3.timeoutMs !== undefined)
244892
+ this.#config.timeoutMs = patch3.timeoutMs;
244893
+ if (patch3.maxConcurrentRequests !== undefined)
244894
+ this.#config.maxConcurrentRequests = patch3.maxConcurrentRequests;
244895
+ if (patch3.maxSegmentsPerBatch !== undefined)
244896
+ this.#config.maxSegmentsPerBatch = patch3.maxSegmentsPerBatch;
244897
+ if (patch3.onProofingError !== undefined)
244898
+ this.#config.onProofingError = patch3.onProofingError ?? null;
244899
+ if (patch3.onStatusChange !== undefined)
244900
+ this.#config.onStatusChange = patch3.onStatusChange ?? null;
244901
+ if (patch3.defaultLanguage !== undefined)
244902
+ this.#config.defaultLanguage = patch3.defaultLanguage ?? null;
244903
+ if (patch3.ignoredWords !== undefined) {
244904
+ this.#config.ignoredWords = patch3.ignoredWords ?? [];
244905
+ this.onResultsChanged?.();
244906
+ }
244907
+ if (patch3.provider !== undefined) {
244908
+ if (prevProvider && prevProvider !== patch3.provider)
244909
+ prevProvider.dispose?.();
244910
+ this.#provider = patch3.provider ?? null;
244911
+ this.#capabilities = null;
244912
+ }
244913
+ if (patch3.enabled !== undefined) {
244914
+ this.#config.enabled = patch3.enabled;
244915
+ if (!patch3.enabled) {
244916
+ this.#cancelAll();
244917
+ this.#store.clear();
244918
+ this.#segmentHashes.clear();
244919
+ this.#offsetMaps.clear();
244920
+ this.#setStatus("disabled");
244921
+ this.onResultsChanged?.();
244922
+ return;
244923
+ }
244924
+ if (patch3.enabled && !prevEnabled && doc$12) {
244925
+ this.#setStatus("idle");
244926
+ this.#scheduleFullCheck(doc$12);
244927
+ return;
244928
+ }
244929
+ }
244930
+ if (needsRecheck && this.isEnabled && doc$12) {
244931
+ this.#cancelAll();
244932
+ this.#documentEpoch++;
244933
+ this.#store.clear();
244934
+ this.#segmentHashes.clear();
244935
+ this.onResultsChanged?.();
244936
+ this.#scheduleFullCheck(doc$12);
244937
+ }
244938
+ }
244939
+ onDocumentChanged(doc$12, changedRanges, mapping) {
244940
+ if (!this.isEnabled)
244941
+ return;
244942
+ this.#documentEpoch++;
244943
+ this.#lastDoc = doc$12;
244944
+ const { segments, offsetMaps, segmentPositions } = extractSegmentsWithMaps(doc$12, this.#config.defaultLanguage, this.#pageResolver ?? undefined);
244945
+ this.#lastSegments = segments;
244946
+ this.#offsetMaps = offsetMaps;
244947
+ const dirtyIds = computeDirtySegmentIds(segments, segmentPositions, changedRanges);
244948
+ for (const id2 of dirtyIds)
244949
+ this.#segmentHashes.delete(id2);
244950
+ if (dirtyIds.size > 0) {
244951
+ const recheckId = this.#nextRecheckId++;
244952
+ this.#store.remapIssues(dirtyIds, mapping, recheckId);
244953
+ this.#store.removeOrphanedSegments(new Set(segments.map((s2) => s2.id)));
244954
+ }
244955
+ this.#scheduleDebouncedCheck(segments);
244956
+ }
244957
+ runInitialCheck(doc$12) {
244958
+ if (!this.isEnabled)
244959
+ return;
244960
+ this.#scheduleFullCheck(doc$12);
244961
+ }
244962
+ ignoreWord(word$1) {
244963
+ const normalized = word$1.normalize("NFC").toLowerCase();
244964
+ if (!this.#config.ignoredWords.includes(normalized)) {
244965
+ this.#config.ignoredWords = [...this.#config.ignoredWords, normalized];
244966
+ this.onResultsChanged?.();
244967
+ }
244968
+ }
244969
+ removeIgnoredWord(word$1) {
244970
+ const normalized = word$1.normalize("NFC").toLowerCase();
244971
+ this.#config.ignoredWords = this.#config.ignoredWords.filter((w) => w !== normalized);
244972
+ this.onResultsChanged?.();
244973
+ }
244974
+ dispose() {
244975
+ this.#disposed = true;
244976
+ this.#cancelAll();
244977
+ this.#store.clear();
244978
+ this.#offsetMaps.clear();
244979
+ this.#segmentHashes.clear();
244980
+ this.#lastDoc = null;
244981
+ this.#lastSegments = [];
244982
+ this.#pendingSegments = [];
244983
+ this.#provider?.dispose?.();
244984
+ this.#provider = null;
244985
+ this.#setStatus("disabled");
244986
+ }
244987
+ #scheduleFullCheck(doc$12) {
244988
+ this.#lastDoc = doc$12;
244989
+ const { segments, offsetMaps } = extractSegmentsWithMaps(doc$12, this.#config.defaultLanguage, this.#pageResolver ?? undefined);
244990
+ this.#lastSegments = segments;
244991
+ this.#offsetMaps = offsetMaps;
244992
+ this.#segmentHashes.clear();
244993
+ this.#store.clear();
244994
+ this.#scheduleDebouncedCheck(segments);
244995
+ }
244996
+ #scheduleDebouncedCheck(segments) {
244997
+ if (this.#isComposing)
244998
+ return;
244999
+ if (this.#debounceTimer !== null)
245000
+ clearTimeout(this.#debounceTimer);
245001
+ const msSinceLastCheck = Date.now() - this.#lastCheckFiredAt;
245002
+ if (this.#lastCheckFiredAt > 0 && msSinceLastCheck >= DEFAULT_MAX_WAIT_MS)
245003
+ this.#fireCheck(segments);
245004
+ else
245005
+ this.#debounceTimer = setTimeout(() => {
245006
+ this.#debounceTimer = null;
245007
+ this.#fireCheck(segments);
245008
+ }, this.#config.debounceMs);
245009
+ }
245010
+ #fireCheck(segments) {
245011
+ this.#lastCheckFiredAt = Date.now();
245012
+ this.#runCheck(segments);
245013
+ }
245014
+ async#runCheck(segments) {
245015
+ if (this.#disposed || !this.#provider)
245016
+ return;
245017
+ if (!this.#capabilities && this.#provider.getCapabilities)
245018
+ try {
245019
+ this.#capabilities = await this.#provider.getCapabilities();
245020
+ } catch {}
245021
+ const unchecked = segments.filter((seg) => {
245022
+ const hash$3 = hashSegmentText(seg.text);
245023
+ return this.#segmentHashes.get(seg.id) !== hash$3;
245024
+ });
245025
+ if (unchecked.length === 0) {
245026
+ this.#setStatus("idle");
245027
+ return;
245028
+ }
245029
+ const activeRecheckIds = this.#store.getActiveRecheckIds();
245030
+ const ordered = this.#config.visibleFirst && this.#visibilitySource ? prioritizeByVisibility(unchecked, this.#visibilitySource) : unchecked;
245031
+ const batches = this.#batchSegments(ordered);
245032
+ const epoch = this.#documentEpoch;
245033
+ this.#pendingSegments = [];
245034
+ for (let i4 = 0;i4 < batches.length; i4++) {
245035
+ if (this.#disposed || epoch !== this.#documentEpoch)
245036
+ return;
245037
+ if (this.#inFlightCount >= this.#config.maxConcurrentRequests) {
245038
+ for (let j = i4;j < batches.length; j++)
245039
+ this.#pendingSegments.push(...batches[j]);
245040
+ break;
245041
+ }
245042
+ this.#sendBatch(batches[i4], epoch, activeRecheckIds);
245043
+ }
245044
+ }
245045
+ async#sendBatch(segments, epoch, recheckIds) {
245046
+ if (!this.#provider || this.#disposed)
245047
+ return;
245048
+ const controller = new AbortController;
245049
+ this.#pendingAbortControllers.add(controller);
245050
+ this.#inFlightCount++;
245051
+ this.#setStatus("checking");
245052
+ const timeoutId = setTimeout(() => controller.abort(), this.#config.timeoutMs);
245053
+ const request = {
245054
+ documentId: this.#documentId,
245055
+ defaultLanguage: this.#config.defaultLanguage,
245056
+ maxSuggestions: this.#config.maxSuggestions,
245057
+ segments,
245058
+ signal: controller.signal
245059
+ };
245060
+ try {
245061
+ const result = await this.#provider.check(request);
245062
+ clearTimeout(timeoutId);
245063
+ if (!this.#pendingAbortControllers.delete(controller))
245064
+ return;
245065
+ this.#inFlightCount--;
245066
+ if (epoch !== this.#documentEpoch || this.#disposed) {
245067
+ this.#drainPendingSegments();
245068
+ return;
245069
+ }
245070
+ const validSegmentIds = new Set(segments.map((s2) => s2.id));
245071
+ const segmentTextMap = new Map(segments.map((s2) => [s2.id, s2]));
245072
+ const freshIssues = [];
245073
+ for (const issue of result.issues) {
245074
+ if (!this.#validateIssue(issue, validSegmentIds, segmentTextMap))
245075
+ continue;
245076
+ const offsetMap = this.#offsetMaps.get(issue.segmentId);
245077
+ if (!offsetMap)
245078
+ continue;
245079
+ const resolved = resolveIssuePmRangeFromSlices(issue, offsetMap.slices);
245080
+ if (!resolved)
245081
+ continue;
245082
+ const segment = segmentTextMap.get(issue.segmentId);
245083
+ const storedIssue = {
245084
+ ...resolved,
245085
+ state: "confirmed",
245086
+ recheckId: null
245087
+ };
245088
+ if (segment)
245089
+ storedIssue.word = segment.text.slice(issue.start, issue.end);
245090
+ freshIssues.push(storedIssue);
245091
+ }
245092
+ this.#store.replaceBatchResults(recheckIds, validSegmentIds, freshIssues);
245093
+ for (const seg of segments)
245094
+ this.#segmentHashes.set(seg.id, hashSegmentText(seg.text));
245095
+ this.#setStatus(this.#inFlightCount > 0 ? "checking" : "idle");
245096
+ this.onResultsChanged?.();
245097
+ this.#schedulePendingSegments(epoch, recheckIds);
245098
+ } catch (err) {
245099
+ clearTimeout(timeoutId);
245100
+ if (!this.#pendingAbortControllers.delete(controller))
245101
+ return;
245102
+ this.#inFlightCount--;
245103
+ if (this.#disposed)
245104
+ return;
245105
+ if (epoch !== this.#documentEpoch) {
245106
+ this.#drainPendingSegments();
245107
+ return;
245108
+ }
245109
+ const isTimeout = controller.signal.aborted;
245110
+ const proofingError = {
245111
+ kind: isTimeout ? "timeout" : "provider-error",
245112
+ message: isTimeout ? "Provider request timed out" : String(err),
245113
+ segmentIds: segments.map((s2) => s2.id),
245114
+ cause: err
245115
+ };
245116
+ this.#config.onProofingError?.(proofingError);
245117
+ this.#setStatus(this.#inFlightCount > 0 ? "checking" : "degraded");
245118
+ this.#schedulePendingSegments(epoch, recheckIds);
245119
+ }
245120
+ }
245121
+ #schedulePendingSegments(epoch, recheckIds) {
245122
+ if (this.#disposed || epoch !== this.#documentEpoch)
245123
+ return;
245124
+ if (this.#pendingSegments.length === 0)
245125
+ return;
245126
+ if (this.#inFlightCount >= this.#config.maxConcurrentRequests)
245127
+ return;
245128
+ const nextBatch = this.#pendingSegments.splice(0, this.#config.maxSegmentsPerBatch);
245129
+ if (nextBatch.length > 0)
245130
+ this.#sendBatch(nextBatch, epoch, recheckIds);
245131
+ }
245132
+ #drainPendingSegments() {
245133
+ if (this.#disposed || this.#pendingSegments.length === 0)
245134
+ return;
245135
+ this.#schedulePendingSegments(this.#documentEpoch, this.#store.getActiveRecheckIds());
245136
+ }
245137
+ #validateIssue(issue, validSegmentIds, segmentTextMap) {
245138
+ if (!validSegmentIds.has(issue.segmentId)) {
245139
+ this.#reportValidationError(`Unknown segmentId: ${issue.segmentId}`, [issue.segmentId]);
245140
+ return false;
245141
+ }
245142
+ const segment = segmentTextMap.get(issue.segmentId);
245143
+ if (!segment)
245144
+ return false;
245145
+ if (issue.start < 0 || issue.end <= issue.start || issue.end > segment.text.length) {
245146
+ this.#reportValidationError(`Invalid offsets [${issue.start}, ${issue.end}) for segment "${issue.segmentId}" (length ${segment.text.length})`, [issue.segmentId]);
245147
+ return false;
245148
+ }
245149
+ return true;
245150
+ }
245151
+ #reportValidationError(message, segmentIds) {
245152
+ this.#config.onProofingError?.({
245153
+ kind: "validation-error",
245154
+ message,
245155
+ segmentIds
245156
+ });
245157
+ }
245158
+ #batchSegments(segments) {
245159
+ const batches = [];
245160
+ for (let i4 = 0;i4 < segments.length; i4 += this.#config.maxSegmentsPerBatch)
245161
+ batches.push(segments.slice(i4, i4 + this.#config.maxSegmentsPerBatch));
245162
+ return batches;
245163
+ }
245164
+ #cancelAll() {
245165
+ if (this.#debounceTimer !== null) {
245166
+ clearTimeout(this.#debounceTimer);
245167
+ this.#debounceTimer = null;
245168
+ }
245169
+ for (const controller of this.#pendingAbortControllers)
245170
+ controller.abort();
245171
+ this.#pendingAbortControllers.clear();
245172
+ this.#inFlightCount = 0;
245173
+ this.#pendingSegments = [];
245174
+ }
245175
+ #setStatus(status) {
245176
+ if (this.#status !== status) {
245177
+ this.#status = status;
245178
+ this.#config.onStatusChange?.(status);
245179
+ }
245180
+ }
244296
245181
  }, FONT_FAMILY_FALLBACKS2, DEFAULT_GENERIC_FALLBACK2 = "sans-serif", normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
244297
245182
  if (!str.includes('"') && !str.includes("'"))
244298
245183
  return str.split(delimiter).map((p$12) => p$12.trim()).filter(Boolean);
@@ -247221,7 +248106,7 @@ var Node$13 = class Node$14 {
247221
248106
  if (runToken === "totalPageCount")
247222
248107
  return context.totalPages ? String(context.totalPages) : run2.text ?? "";
247223
248108
  return run2.text ?? "";
247224
- }, PROOFING_CSS, splitOriginMap, createDomPainter = (options) => {
248109
+ }, createDomPainter = (options) => {
247225
248110
  if ((options.blocks ?? []).length !== (options.measures ?? []).length)
247226
248111
  throw new Error("DomPainter requires the same number of blocks and measures");
247227
248112
  const painter = new DomPainter({
@@ -247278,559 +248163,6 @@ var Node$13 = class Node$14 {
247278
248163
  painter.setScrollContainer(el);
247279
248164
  }
247280
248165
  };
247281
- }, PresentationProofingDecorator = class {
247282
- #container = null;
247283
- setContainer(container) {
247284
- this.#container = container;
247285
- }
247286
- applyAnnotations(annotations) {
247287
- const container = this.#container;
247288
- if (!container)
247289
- return false;
247290
- if (!annotations || annotations.length === 0)
247291
- return clearProofingDecorations(container);
247292
- return applyProofingDecorations(container, annotations);
247293
- }
247294
- clear() {
247295
- const container = this.#container;
247296
- if (!container)
247297
- return false;
247298
- return clearProofingDecorations(container);
247299
- }
247300
- }, PresentationPostPaintPipeline = class {
247301
- #fieldAnnotationLayer;
247302
- #commentHighlightDecorator;
247303
- #decorationBridge;
247304
- #proofingDecorator;
247305
- constructor(deps = {}) {
247306
- this.#fieldAnnotationLayer = deps.fieldAnnotationLayer ?? new FieldAnnotationInteractionLayer;
247307
- this.#commentHighlightDecorator = deps.commentHighlightDecorator ?? new CommentHighlightDecorator;
247308
- this.#decorationBridge = deps.decorationBridge ?? new DecorationBridge;
247309
- this.#proofingDecorator = deps.proofingDecorator ?? new PresentationProofingDecorator;
247310
- }
247311
- setContainer(container) {
247312
- this.#fieldAnnotationLayer.setContainer(container);
247313
- this.#commentHighlightDecorator.setContainer(container);
247314
- this.#proofingDecorator.setContainer(container);
247315
- }
247316
- setActiveComment(commentId) {
247317
- return this.#commentHighlightDecorator.setActiveComment(commentId);
247318
- }
247319
- recordDecorationTransaction(transaction) {
247320
- this.#decorationBridge.recordTransaction(transaction);
247321
- }
247322
- hasDecorationChanges(editorState) {
247323
- return this.#decorationBridge.hasChanges(editorState);
247324
- }
247325
- collectDecorationRanges(editorState) {
247326
- return this.#decorationBridge.collectDecorationRanges(editorState);
247327
- }
247328
- syncDecorations(editorState, domPositionIndex, options) {
247329
- if (!editorState)
247330
- return false;
247331
- return this.#decorationBridge.sync(editorState, domPositionIndex, options);
247332
- }
247333
- applyCommentHighlights() {
247334
- this.#commentHighlightDecorator.apply();
247335
- }
247336
- syncInlineStyleLayers(editorState, domPositionIndex) {
247337
- this.applyCommentHighlights();
247338
- return this.syncDecorations(editorState, domPositionIndex);
247339
- }
247340
- applyProofingAnnotations(annotations, rebuildDomPositionIndex) {
247341
- const mutated = this.#proofingDecorator.applyAnnotations(annotations);
247342
- if (mutated)
247343
- rebuildDomPositionIndex();
247344
- return mutated;
247345
- }
247346
- refreshAfterPaint(options) {
247347
- this.#fieldAnnotationLayer.apply(options.layoutEpoch);
247348
- options.rebuildDomPositionIndex();
247349
- this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
247350
- this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
247351
- options.reapplyStructuredContentHover?.();
247352
- }
247353
- destroy() {
247354
- this.#proofingDecorator.clear();
247355
- this.#fieldAnnotationLayer.clear();
247356
- this.#commentHighlightDecorator.destroy();
247357
- this.#decorationBridge.destroy();
247358
- }
247359
- }, ProofingStore = class {
247360
- #issuesBySegment = /* @__PURE__ */ new Map;
247361
- addIssue(issue) {
247362
- const list5 = this.#issuesBySegment.get(issue.segmentId);
247363
- if (list5)
247364
- list5.push(issue);
247365
- else
247366
- this.#issuesBySegment.set(issue.segmentId, [issue]);
247367
- }
247368
- remapIssues(segmentIds, mapping, recheckId) {
247369
- for (const id2 of segmentIds) {
247370
- const list5 = this.#issuesBySegment.get(id2);
247371
- if (!list5)
247372
- continue;
247373
- const surviving = [];
247374
- for (const issue of list5) {
247375
- const fromResult = mapping.mapResult(issue.pmFrom, -1);
247376
- const toResult2 = mapping.mapResult(issue.pmTo, 1);
247377
- if (fromResult.deleted || toResult2.deleted)
247378
- continue;
247379
- if (fromResult.pos >= toResult2.pos)
247380
- continue;
247381
- issue.pmFrom = fromResult.pos;
247382
- issue.pmTo = toResult2.pos;
247383
- issue.state = "mapped";
247384
- issue.recheckId = recheckId;
247385
- surviving.push(issue);
247386
- }
247387
- if (surviving.length > 0)
247388
- this.#issuesBySegment.set(id2, surviving);
247389
- else
247390
- this.#issuesBySegment.delete(id2);
247391
- }
247392
- }
247393
- replaceBatchResults(recheckIds, coveredSegmentIds, freshIssues) {
247394
- for (const segId of coveredSegmentIds) {
247395
- const list5 = this.#issuesBySegment.get(segId);
247396
- if (!list5)
247397
- continue;
247398
- const filtered = list5.filter((issue) => issue.recheckId === null || !recheckIds.has(issue.recheckId));
247399
- if (filtered.length > 0)
247400
- this.#issuesBySegment.set(segId, filtered);
247401
- else
247402
- this.#issuesBySegment.delete(segId);
247403
- }
247404
- for (const issue of freshIssues)
247405
- this.addIssue(issue);
247406
- }
247407
- removeBySegmentIds(ids) {
247408
- for (const id2 of ids)
247409
- this.#issuesBySegment.delete(id2);
247410
- }
247411
- removeOrphanedSegments(currentSegmentIds) {
247412
- for (const segId of this.#issuesBySegment.keys())
247413
- if (!currentSegmentIds.has(segId))
247414
- this.#issuesBySegment.delete(segId);
247415
- }
247416
- clear() {
247417
- this.#issuesBySegment.clear();
247418
- }
247419
- getAllIssues() {
247420
- const result = [];
247421
- for (const list5 of this.#issuesBySegment.values())
247422
- result.push(...list5);
247423
- return result;
247424
- }
247425
- getDisplayIssues(ignoredWords) {
247426
- const normalizedIgnored = new Set(ignoredWords.map((w) => w.normalize("NFC").toLowerCase()));
247427
- const result = [];
247428
- for (const list5 of this.#issuesBySegment.values())
247429
- for (const issue of list5) {
247430
- if (issue.kind !== "spelling")
247431
- continue;
247432
- if (isSuppressed(issue, normalizedIgnored))
247433
- continue;
247434
- result.push(issue);
247435
- }
247436
- return result;
247437
- }
247438
- getActiveRecheckIds() {
247439
- const ids = /* @__PURE__ */ new Set;
247440
- for (const list5 of this.#issuesBySegment.values())
247441
- for (const issue of list5)
247442
- if (issue.state === "mapped" && issue.recheckId !== null)
247443
- ids.add(issue.recheckId);
247444
- return ids;
247445
- }
247446
- get isEmpty() {
247447
- return this.#issuesBySegment.size === 0;
247448
- }
247449
- get size() {
247450
- let count2 = 0;
247451
- for (const list5 of this.#issuesBySegment.values())
247452
- count2 += list5.length;
247453
- return count2;
247454
- }
247455
- }, NON_TEXT_INLINE_NODES, DEFAULT_DEBOUNCE_MS = 500, DEFAULT_MAX_WAIT_MS = 2000, DEFAULT_TIMEOUT_MS = 1e4, DEFAULT_MAX_CONCURRENT = 2, DEFAULT_MAX_SEGMENTS_PER_BATCH = 20, DEFAULT_MAX_SUGGESTIONS = 5, ProofingSessionManager = class {
247456
- #config;
247457
- #provider = null;
247458
- #capabilities = null;
247459
- #status = "disabled";
247460
- #store = new ProofingStore;
247461
- #offsetMaps = /* @__PURE__ */ new Map;
247462
- #segmentHashes = /* @__PURE__ */ new Map;
247463
- #debounceTimer = null;
247464
- #pendingAbortControllers = /* @__PURE__ */ new Set;
247465
- #inFlightCount = 0;
247466
- #documentEpoch = 0;
247467
- #disposed = false;
247468
- #pendingSegments = [];
247469
- #nextRecheckId = 0;
247470
- #isComposing = false;
247471
- #lastCheckFiredAt = 0;
247472
- #visibilitySource = null;
247473
- #documentId = null;
247474
- #pageResolver = null;
247475
- #lastDoc = null;
247476
- #lastSegments = [];
247477
- constructor(config2 = {}) {
247478
- this.onResultsChanged = null;
247479
- this.#config = {
247480
- enabled: config2.enabled ?? false,
247481
- debounceMs: config2.debounceMs ?? DEFAULT_DEBOUNCE_MS,
247482
- maxSuggestions: config2.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS,
247483
- visibleFirst: config2.visibleFirst ?? true,
247484
- allowIgnoreWord: config2.allowIgnoreWord ?? true,
247485
- defaultLanguage: config2.defaultLanguage ?? null,
247486
- ignoredWords: config2.ignoredWords ?? [],
247487
- timeoutMs: config2.timeoutMs ?? DEFAULT_TIMEOUT_MS,
247488
- maxConcurrentRequests: config2.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT,
247489
- maxSegmentsPerBatch: config2.maxSegmentsPerBatch ?? DEFAULT_MAX_SEGMENTS_PER_BATCH,
247490
- onProofingError: config2.onProofingError ?? null,
247491
- onStatusChange: config2.onStatusChange ?? null
247492
- };
247493
- if (config2.provider)
247494
- this.#provider = config2.provider;
247495
- if (this.#config.enabled && this.#provider)
247496
- this.#setStatus("idle");
247497
- }
247498
- get status() {
247499
- return this.#status;
247500
- }
247501
- get isEnabled() {
247502
- return this.#config.enabled && this.#provider !== null;
247503
- }
247504
- get config() {
247505
- return this.#config;
247506
- }
247507
- setVisibilitySource(source) {
247508
- this.#visibilitySource = source;
247509
- }
247510
- setDocumentId(id2) {
247511
- this.#documentId = id2;
247512
- }
247513
- setPageResolver(resolver2) {
247514
- this.#pageResolver = resolver2;
247515
- }
247516
- setComposing(composing) {
247517
- this.#isComposing = composing;
247518
- if (!composing && this.#lastSegments.length > 0 && this.isEnabled)
247519
- this.#scheduleDebouncedCheck(this.#lastSegments);
247520
- }
247521
- getPaintSlices(activeWordRange) {
247522
- if (!this.isEnabled)
247523
- return [];
247524
- const slices = buildPaintSlices(this.#store.getDisplayIssues(this.#config.ignoredWords));
247525
- if (!activeWordRange)
247526
- return slices;
247527
- return slices.filter((s2) => s2.pmTo <= activeWordRange.from || s2.pmFrom >= activeWordRange.to);
247528
- }
247529
- getIssueAtPosition(pmPos, activeWordRange) {
247530
- return findSliceAtPosition(this.getPaintSlices(activeWordRange), pmPos)?.issue ?? null;
247531
- }
247532
- updateConfig(patch3, doc$12) {
247533
- const prevEnabled = this.#config.enabled;
247534
- const prevProvider = this.#provider;
247535
- const needsRecheck = patch3.provider !== undefined || patch3.defaultLanguage !== undefined;
247536
- if (patch3.debounceMs !== undefined)
247537
- this.#config.debounceMs = patch3.debounceMs;
247538
- if (patch3.maxSuggestions !== undefined)
247539
- this.#config.maxSuggestions = patch3.maxSuggestions;
247540
- if (patch3.visibleFirst !== undefined)
247541
- this.#config.visibleFirst = patch3.visibleFirst;
247542
- if (patch3.allowIgnoreWord !== undefined)
247543
- this.#config.allowIgnoreWord = patch3.allowIgnoreWord;
247544
- if (patch3.timeoutMs !== undefined)
247545
- this.#config.timeoutMs = patch3.timeoutMs;
247546
- if (patch3.maxConcurrentRequests !== undefined)
247547
- this.#config.maxConcurrentRequests = patch3.maxConcurrentRequests;
247548
- if (patch3.maxSegmentsPerBatch !== undefined)
247549
- this.#config.maxSegmentsPerBatch = patch3.maxSegmentsPerBatch;
247550
- if (patch3.onProofingError !== undefined)
247551
- this.#config.onProofingError = patch3.onProofingError ?? null;
247552
- if (patch3.onStatusChange !== undefined)
247553
- this.#config.onStatusChange = patch3.onStatusChange ?? null;
247554
- if (patch3.defaultLanguage !== undefined)
247555
- this.#config.defaultLanguage = patch3.defaultLanguage ?? null;
247556
- if (patch3.ignoredWords !== undefined) {
247557
- this.#config.ignoredWords = patch3.ignoredWords ?? [];
247558
- this.onResultsChanged?.();
247559
- }
247560
- if (patch3.provider !== undefined) {
247561
- if (prevProvider && prevProvider !== patch3.provider)
247562
- prevProvider.dispose?.();
247563
- this.#provider = patch3.provider ?? null;
247564
- this.#capabilities = null;
247565
- }
247566
- if (patch3.enabled !== undefined) {
247567
- this.#config.enabled = patch3.enabled;
247568
- if (!patch3.enabled) {
247569
- this.#cancelAll();
247570
- this.#store.clear();
247571
- this.#segmentHashes.clear();
247572
- this.#offsetMaps.clear();
247573
- this.#setStatus("disabled");
247574
- this.onResultsChanged?.();
247575
- return;
247576
- }
247577
- if (patch3.enabled && !prevEnabled && doc$12) {
247578
- this.#setStatus("idle");
247579
- this.#scheduleFullCheck(doc$12);
247580
- return;
247581
- }
247582
- }
247583
- if (needsRecheck && this.isEnabled && doc$12) {
247584
- this.#cancelAll();
247585
- this.#documentEpoch++;
247586
- this.#store.clear();
247587
- this.#segmentHashes.clear();
247588
- this.onResultsChanged?.();
247589
- this.#scheduleFullCheck(doc$12);
247590
- }
247591
- }
247592
- onDocumentChanged(doc$12, changedRanges, mapping) {
247593
- if (!this.isEnabled)
247594
- return;
247595
- this.#documentEpoch++;
247596
- this.#lastDoc = doc$12;
247597
- const { segments, offsetMaps, segmentPositions } = extractSegmentsWithMaps(doc$12, this.#config.defaultLanguage, this.#pageResolver ?? undefined);
247598
- this.#lastSegments = segments;
247599
- this.#offsetMaps = offsetMaps;
247600
- const dirtyIds = computeDirtySegmentIds(segments, segmentPositions, changedRanges);
247601
- for (const id2 of dirtyIds)
247602
- this.#segmentHashes.delete(id2);
247603
- if (dirtyIds.size > 0) {
247604
- const recheckId = this.#nextRecheckId++;
247605
- this.#store.remapIssues(dirtyIds, mapping, recheckId);
247606
- this.#store.removeOrphanedSegments(new Set(segments.map((s2) => s2.id)));
247607
- }
247608
- this.#scheduleDebouncedCheck(segments);
247609
- }
247610
- runInitialCheck(doc$12) {
247611
- if (!this.isEnabled)
247612
- return;
247613
- this.#scheduleFullCheck(doc$12);
247614
- }
247615
- ignoreWord(word$1) {
247616
- const normalized = word$1.normalize("NFC").toLowerCase();
247617
- if (!this.#config.ignoredWords.includes(normalized)) {
247618
- this.#config.ignoredWords = [...this.#config.ignoredWords, normalized];
247619
- this.onResultsChanged?.();
247620
- }
247621
- }
247622
- removeIgnoredWord(word$1) {
247623
- const normalized = word$1.normalize("NFC").toLowerCase();
247624
- this.#config.ignoredWords = this.#config.ignoredWords.filter((w) => w !== normalized);
247625
- this.onResultsChanged?.();
247626
- }
247627
- dispose() {
247628
- this.#disposed = true;
247629
- this.#cancelAll();
247630
- this.#store.clear();
247631
- this.#offsetMaps.clear();
247632
- this.#segmentHashes.clear();
247633
- this.#lastDoc = null;
247634
- this.#lastSegments = [];
247635
- this.#pendingSegments = [];
247636
- this.#provider?.dispose?.();
247637
- this.#provider = null;
247638
- this.#setStatus("disabled");
247639
- }
247640
- #scheduleFullCheck(doc$12) {
247641
- this.#lastDoc = doc$12;
247642
- const { segments, offsetMaps } = extractSegmentsWithMaps(doc$12, this.#config.defaultLanguage, this.#pageResolver ?? undefined);
247643
- this.#lastSegments = segments;
247644
- this.#offsetMaps = offsetMaps;
247645
- this.#segmentHashes.clear();
247646
- this.#store.clear();
247647
- this.#scheduleDebouncedCheck(segments);
247648
- }
247649
- #scheduleDebouncedCheck(segments) {
247650
- if (this.#isComposing)
247651
- return;
247652
- if (this.#debounceTimer !== null)
247653
- clearTimeout(this.#debounceTimer);
247654
- const msSinceLastCheck = Date.now() - this.#lastCheckFiredAt;
247655
- if (this.#lastCheckFiredAt > 0 && msSinceLastCheck >= DEFAULT_MAX_WAIT_MS)
247656
- this.#fireCheck(segments);
247657
- else
247658
- this.#debounceTimer = setTimeout(() => {
247659
- this.#debounceTimer = null;
247660
- this.#fireCheck(segments);
247661
- }, this.#config.debounceMs);
247662
- }
247663
- #fireCheck(segments) {
247664
- this.#lastCheckFiredAt = Date.now();
247665
- this.#runCheck(segments);
247666
- }
247667
- async#runCheck(segments) {
247668
- if (this.#disposed || !this.#provider)
247669
- return;
247670
- if (!this.#capabilities && this.#provider.getCapabilities)
247671
- try {
247672
- this.#capabilities = await this.#provider.getCapabilities();
247673
- } catch {}
247674
- const unchecked = segments.filter((seg) => {
247675
- const hash$3 = hashSegmentText(seg.text);
247676
- return this.#segmentHashes.get(seg.id) !== hash$3;
247677
- });
247678
- if (unchecked.length === 0) {
247679
- this.#setStatus("idle");
247680
- return;
247681
- }
247682
- const activeRecheckIds = this.#store.getActiveRecheckIds();
247683
- const ordered = this.#config.visibleFirst && this.#visibilitySource ? prioritizeByVisibility(unchecked, this.#visibilitySource) : unchecked;
247684
- const batches = this.#batchSegments(ordered);
247685
- const epoch = this.#documentEpoch;
247686
- this.#pendingSegments = [];
247687
- for (let i4 = 0;i4 < batches.length; i4++) {
247688
- if (this.#disposed || epoch !== this.#documentEpoch)
247689
- return;
247690
- if (this.#inFlightCount >= this.#config.maxConcurrentRequests) {
247691
- for (let j = i4;j < batches.length; j++)
247692
- this.#pendingSegments.push(...batches[j]);
247693
- break;
247694
- }
247695
- this.#sendBatch(batches[i4], epoch, activeRecheckIds);
247696
- }
247697
- }
247698
- async#sendBatch(segments, epoch, recheckIds) {
247699
- if (!this.#provider || this.#disposed)
247700
- return;
247701
- const controller = new AbortController;
247702
- this.#pendingAbortControllers.add(controller);
247703
- this.#inFlightCount++;
247704
- this.#setStatus("checking");
247705
- const timeoutId = setTimeout(() => controller.abort(), this.#config.timeoutMs);
247706
- const request = {
247707
- documentId: this.#documentId,
247708
- defaultLanguage: this.#config.defaultLanguage,
247709
- maxSuggestions: this.#config.maxSuggestions,
247710
- segments,
247711
- signal: controller.signal
247712
- };
247713
- try {
247714
- const result = await this.#provider.check(request);
247715
- clearTimeout(timeoutId);
247716
- if (!this.#pendingAbortControllers.delete(controller))
247717
- return;
247718
- this.#inFlightCount--;
247719
- if (epoch !== this.#documentEpoch || this.#disposed) {
247720
- this.#drainPendingSegments();
247721
- return;
247722
- }
247723
- const validSegmentIds = new Set(segments.map((s2) => s2.id));
247724
- const segmentTextMap = new Map(segments.map((s2) => [s2.id, s2]));
247725
- const freshIssues = [];
247726
- for (const issue of result.issues) {
247727
- if (!this.#validateIssue(issue, validSegmentIds, segmentTextMap))
247728
- continue;
247729
- const offsetMap = this.#offsetMaps.get(issue.segmentId);
247730
- if (!offsetMap)
247731
- continue;
247732
- const resolved = resolveIssuePmRangeFromSlices(issue, offsetMap.slices);
247733
- if (!resolved)
247734
- continue;
247735
- const segment = segmentTextMap.get(issue.segmentId);
247736
- const storedIssue = {
247737
- ...resolved,
247738
- state: "confirmed",
247739
- recheckId: null
247740
- };
247741
- if (segment)
247742
- storedIssue.word = segment.text.slice(issue.start, issue.end);
247743
- freshIssues.push(storedIssue);
247744
- }
247745
- this.#store.replaceBatchResults(recheckIds, validSegmentIds, freshIssues);
247746
- for (const seg of segments)
247747
- this.#segmentHashes.set(seg.id, hashSegmentText(seg.text));
247748
- this.#setStatus(this.#inFlightCount > 0 ? "checking" : "idle");
247749
- this.onResultsChanged?.();
247750
- this.#schedulePendingSegments(epoch, recheckIds);
247751
- } catch (err) {
247752
- clearTimeout(timeoutId);
247753
- if (!this.#pendingAbortControllers.delete(controller))
247754
- return;
247755
- this.#inFlightCount--;
247756
- if (this.#disposed)
247757
- return;
247758
- if (epoch !== this.#documentEpoch) {
247759
- this.#drainPendingSegments();
247760
- return;
247761
- }
247762
- const isTimeout = controller.signal.aborted;
247763
- const proofingError = {
247764
- kind: isTimeout ? "timeout" : "provider-error",
247765
- message: isTimeout ? "Provider request timed out" : String(err),
247766
- segmentIds: segments.map((s2) => s2.id),
247767
- cause: err
247768
- };
247769
- this.#config.onProofingError?.(proofingError);
247770
- this.#setStatus(this.#inFlightCount > 0 ? "checking" : "degraded");
247771
- this.#schedulePendingSegments(epoch, recheckIds);
247772
- }
247773
- }
247774
- #schedulePendingSegments(epoch, recheckIds) {
247775
- if (this.#disposed || epoch !== this.#documentEpoch)
247776
- return;
247777
- if (this.#pendingSegments.length === 0)
247778
- return;
247779
- if (this.#inFlightCount >= this.#config.maxConcurrentRequests)
247780
- return;
247781
- const nextBatch = this.#pendingSegments.splice(0, this.#config.maxSegmentsPerBatch);
247782
- if (nextBatch.length > 0)
247783
- this.#sendBatch(nextBatch, epoch, recheckIds);
247784
- }
247785
- #drainPendingSegments() {
247786
- if (this.#disposed || this.#pendingSegments.length === 0)
247787
- return;
247788
- this.#schedulePendingSegments(this.#documentEpoch, this.#store.getActiveRecheckIds());
247789
- }
247790
- #validateIssue(issue, validSegmentIds, segmentTextMap) {
247791
- if (!validSegmentIds.has(issue.segmentId)) {
247792
- this.#reportValidationError(`Unknown segmentId: ${issue.segmentId}`, [issue.segmentId]);
247793
- return false;
247794
- }
247795
- const segment = segmentTextMap.get(issue.segmentId);
247796
- if (!segment)
247797
- return false;
247798
- if (issue.start < 0 || issue.end <= issue.start || issue.end > segment.text.length) {
247799
- this.#reportValidationError(`Invalid offsets [${issue.start}, ${issue.end}) for segment "${issue.segmentId}" (length ${segment.text.length})`, [issue.segmentId]);
247800
- return false;
247801
- }
247802
- return true;
247803
- }
247804
- #reportValidationError(message, segmentIds) {
247805
- this.#config.onProofingError?.({
247806
- kind: "validation-error",
247807
- message,
247808
- segmentIds
247809
- });
247810
- }
247811
- #batchSegments(segments) {
247812
- const batches = [];
247813
- for (let i4 = 0;i4 < segments.length; i4 += this.#config.maxSegmentsPerBatch)
247814
- batches.push(segments.slice(i4, i4 + this.#config.maxSegmentsPerBatch));
247815
- return batches;
247816
- }
247817
- #cancelAll() {
247818
- if (this.#debounceTimer !== null) {
247819
- clearTimeout(this.#debounceTimer);
247820
- this.#debounceTimer = null;
247821
- }
247822
- for (const controller of this.#pendingAbortControllers)
247823
- controller.abort();
247824
- this.#pendingAbortControllers.clear();
247825
- this.#inFlightCount = 0;
247826
- this.#pendingSegments = [];
247827
- }
247828
- #setStatus(status) {
247829
- if (this.#status !== status) {
247830
- this.#status = status;
247831
- this.#config.onStatusChange?.(status);
247832
- }
247833
- }
247834
248166
  }, PresentationPaintIndex = class {
247835
248167
  #snapshot = null;
247836
248168
  #annotationsByPmStart = /* @__PURE__ */ new Map;
@@ -257076,9 +257408,9 @@ var Node$13 = class Node$14 {
257076
257408
  return;
257077
257409
  console.log(...args$1);
257078
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;
257079
- var init_src_DIxjKbQ9_es = __esm(() => {
257411
+ var init_src_sJ2EXqLW_es = __esm(() => {
257080
257412
  init_rolldown_runtime_B2q5OVn9_es();
257081
- init_SuperConverter_C6rVgqDZ_es();
257413
+ init_SuperConverter_DerEPM5g_es();
257082
257414
  init_jszip_ChlR43oI_es();
257083
257415
  init_uuid_qzgm05fK_es();
257084
257416
  init_constants_CIF8yzNk_es();
@@ -282564,6 +282896,24 @@ function print() { __p += __j.call(arguments, '') }
282564
282896
  CANONICAL: "canonical",
282565
282897
  DERIVED: "derived"
282566
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;
282907
+ NON_TEXT_INLINE_NODES = new Set([
282908
+ "fieldAnnotation",
282909
+ "image",
282910
+ "equation",
282911
+ "hardBreak",
282912
+ "lineBreak",
282913
+ "tab",
282914
+ "footnoteReference",
282915
+ "symbol"
282916
+ ]);
282567
282917
  FONT_FAMILY_FALLBACKS2 = Object.freeze({
282568
282918
  swiss: "Arial, sans-serif",
282569
282919
  roman: "Times New Roman, serif",
@@ -286519,24 +286869,6 @@ function print() { __p += __j.call(arguments, '') }
286519
286869
  "path(",
286520
286870
  "rect("
286521
286871
  ];
286522
- PROOFING_CSS = {
286523
- SPELLING: "sd-proofing-spelling",
286524
- GRAMMAR: "sd-proofing-grammar",
286525
- STYLE: "sd-proofing-style",
286526
- DATA_ATTR: "data-sd-proofing",
286527
- SPLIT_ATTR: "data-sd-proofing-split"
286528
- };
286529
- splitOriginMap = /* @__PURE__ */ new WeakMap;
286530
- NON_TEXT_INLINE_NODES = new Set([
286531
- "fieldAnnotation",
286532
- "image",
286533
- "equation",
286534
- "hardBreak",
286535
- "lineBreak",
286536
- "tab",
286537
- "footnoteReference",
286538
- "symbol"
286539
- ]);
286540
286872
  SINGLE_COLUMN_DEFAULT = {
286541
286873
  count: 1,
286542
286874
  gap: 0
@@ -291641,8 +291973,8 @@ var init_zipper_YmNpPIyc_es = __esm(() => {
291641
291973
 
291642
291974
  // ../../packages/superdoc/dist/super-editor.es.js
291643
291975
  var init_super_editor_es = __esm(() => {
291644
- init_src_DIxjKbQ9_es();
291645
- init_SuperConverter_C6rVgqDZ_es();
291976
+ init_src_sJ2EXqLW_es();
291977
+ init_SuperConverter_DerEPM5g_es();
291646
291978
  init_jszip_ChlR43oI_es();
291647
291979
  init_xml_js_40FWvL78_es();
291648
291980
  init_constants_CIF8yzNk_es();
@@ -343039,16 +343371,17 @@ var init_operation_params = __esm(() => {
343039
343371
  }
343040
343372
  ],
343041
343373
  "doc.insert": [
343042
- ...TEXT_TARGET_FLAT_PARAMS,
343374
+ ...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN,
343043
343375
  {
343044
343376
  name: "offset",
343045
343377
  kind: "flag",
343046
343378
  type: "number",
343047
- 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
343048
343381
  }
343049
343382
  ],
343050
- "doc.replace": [...TEXT_TARGET_FLAT_PARAMS],
343051
- "doc.delete": [...TEXT_TARGET_FLAT_PARAMS],
343383
+ "doc.replace": [...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN],
343384
+ "doc.delete": [...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN],
343052
343385
  "doc.styles.apply": [
343053
343386
  {
343054
343387
  name: "target",