@superdoc-dev/cli 0.5.0-next.43 → 0.5.0-next.45

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 +1922 -1332
  2. package/package.json +7 -7
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);
@@ -37821,7 +38015,7 @@ var init_dist3 = __esm(() => {
37821
38015
  detectDupes(PKG_NAME3, PKG_VERSION3, PKG_FORMAT3);
37822
38016
  });
37823
38017
 
37824
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/constants.js
38018
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/constants.js
37825
38019
  var require_constants = __commonJS((exports, module) => {
37826
38020
  var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"];
37827
38021
  var hasBlob = typeof Blob !== "undefined";
@@ -37841,7 +38035,7 @@ var require_constants = __commonJS((exports, module) => {
37841
38035
  };
37842
38036
  });
37843
38037
 
37844
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/buffer-util.js
38038
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/buffer-util.js
37845
38039
  var require_buffer_util = __commonJS((exports, module) => {
37846
38040
  var { EMPTY_BUFFER } = require_constants();
37847
38041
  var FastBuffer = Buffer[Symbol.species];
@@ -37919,7 +38113,7 @@ var require_buffer_util = __commonJS((exports, module) => {
37919
38113
  }
37920
38114
  });
37921
38115
 
37922
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/limiter.js
38116
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/limiter.js
37923
38117
  var require_limiter = __commonJS((exports, module) => {
37924
38118
  var kDone = Symbol("kDone");
37925
38119
  var kRun = Symbol("kRun");
@@ -37951,7 +38145,7 @@ var require_limiter = __commonJS((exports, module) => {
37951
38145
  module.exports = Limiter;
37952
38146
  });
37953
38147
 
37954
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/permessage-deflate.js
38148
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/permessage-deflate.js
37955
38149
  var require_permessage_deflate = __commonJS((exports, module) => {
37956
38150
  var zlib = __require("zlib");
37957
38151
  var bufferUtil = require_buffer_util();
@@ -37967,11 +38161,11 @@ var require_permessage_deflate = __commonJS((exports, module) => {
37967
38161
  var zlibLimiter;
37968
38162
 
37969
38163
  class PerMessageDeflate {
37970
- constructor(options, isServer, maxPayload) {
37971
- this._maxPayload = maxPayload | 0;
38164
+ constructor(options) {
37972
38165
  this._options = options || {};
37973
38166
  this._threshold = this._options.threshold !== undefined ? this._options.threshold : 1024;
37974
- this._isServer = !!isServer;
38167
+ this._maxPayload = this._options.maxPayload | 0;
38168
+ this._isServer = !!this._options.isServer;
37975
38169
  this._deflate = null;
37976
38170
  this._inflate = null;
37977
38171
  this.params = null;
@@ -38215,7 +38409,7 @@ var require_permessage_deflate = __commonJS((exports, module) => {
38215
38409
  }
38216
38410
  });
38217
38411
 
38218
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/validation.js
38412
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/validation.js
38219
38413
  var require_validation = __commonJS((exports, module) => {
38220
38414
  var { isUtf8 } = __require("buffer");
38221
38415
  var { hasBlob } = require_constants();
@@ -38402,7 +38596,7 @@ var require_validation = __commonJS((exports, module) => {
38402
38596
  }
38403
38597
  });
38404
38598
 
38405
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js
38599
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/receiver.js
38406
38600
  var require_receiver = __commonJS((exports, module) => {
38407
38601
  var { Writable } = __require("stream");
38408
38602
  var PerMessageDeflate = require_permessage_deflate();
@@ -38783,7 +38977,7 @@ var require_receiver = __commonJS((exports, module) => {
38783
38977
  module.exports = Receiver;
38784
38978
  });
38785
38979
 
38786
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/sender.js
38980
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/sender.js
38787
38981
  var require_sender = __commonJS((exports, module) => {
38788
38982
  var { Duplex } = __require("stream");
38789
38983
  var { randomFillSync } = __require("crypto");
@@ -39137,7 +39331,7 @@ var require_sender = __commonJS((exports, module) => {
39137
39331
  }
39138
39332
  });
39139
39333
 
39140
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/event-target.js
39334
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/event-target.js
39141
39335
  var require_event_target = __commonJS((exports, module) => {
39142
39336
  var { kForOnEventAttribute, kListener } = require_constants();
39143
39337
  var kCode = Symbol("kCode");
@@ -39288,7 +39482,7 @@ var require_event_target = __commonJS((exports, module) => {
39288
39482
  }
39289
39483
  });
39290
39484
 
39291
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/extension.js
39485
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/extension.js
39292
39486
  var require_extension = __commonJS((exports, module) => {
39293
39487
  var { tokenChars } = require_validation();
39294
39488
  function push(dest, name, elem) {
@@ -39453,7 +39647,7 @@ var require_extension = __commonJS((exports, module) => {
39453
39647
  module.exports = { format, parse };
39454
39648
  });
39455
39649
 
39456
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js
39650
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/websocket.js
39457
39651
  var require_websocket = __commonJS((exports, module) => {
39458
39652
  var EventEmitter2 = __require("events");
39459
39653
  var https = __require("https");
@@ -39842,7 +40036,7 @@ var require_websocket = __commonJS((exports, module) => {
39842
40036
  } else {
39843
40037
  try {
39844
40038
  parsedUrl = new URL2(address2);
39845
- } catch (e) {
40039
+ } catch {
39846
40040
  throw new SyntaxError(`Invalid URL: ${address2}`);
39847
40041
  }
39848
40042
  }
@@ -39890,7 +40084,11 @@ var require_websocket = __commonJS((exports, module) => {
39890
40084
  opts.path = parsedUrl.pathname + parsedUrl.search;
39891
40085
  opts.timeout = opts.handshakeTimeout;
39892
40086
  if (opts.perMessageDeflate) {
39893
- perMessageDeflate = new PerMessageDeflate(opts.perMessageDeflate !== true ? opts.perMessageDeflate : {}, false, opts.maxPayload);
40087
+ perMessageDeflate = new PerMessageDeflate({
40088
+ ...opts.perMessageDeflate,
40089
+ isServer: false,
40090
+ maxPayload: opts.maxPayload
40091
+ });
39894
40092
  opts.headers["Sec-WebSocket-Extensions"] = format({
39895
40093
  [PerMessageDeflate.extensionName]: perMessageDeflate.offer()
39896
40094
  });
@@ -40215,7 +40413,7 @@ var require_websocket = __commonJS((exports, module) => {
40215
40413
  }
40216
40414
  });
40217
40415
 
40218
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/stream.js
40416
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/stream.js
40219
40417
  var require_stream = __commonJS((exports, module) => {
40220
40418
  var WebSocket2 = require_websocket();
40221
40419
  var { Duplex } = __require("stream");
@@ -40318,7 +40516,7 @@ var require_stream = __commonJS((exports, module) => {
40318
40516
  module.exports = createWebSocketStream;
40319
40517
  });
40320
40518
 
40321
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/subprotocol.js
40519
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/subprotocol.js
40322
40520
  var require_subprotocol = __commonJS((exports, module) => {
40323
40521
  var { tokenChars } = require_validation();
40324
40522
  function parse(header) {
@@ -40363,7 +40561,7 @@ var require_subprotocol = __commonJS((exports, module) => {
40363
40561
  module.exports = { parse };
40364
40562
  });
40365
40563
 
40366
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket-server.js
40564
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/lib/websocket-server.js
40367
40565
  var require_websocket_server = __commonJS((exports, module) => {
40368
40566
  var EventEmitter2 = __require("events");
40369
40567
  var http = __require("http");
@@ -40536,7 +40734,11 @@ var require_websocket_server = __commonJS((exports, module) => {
40536
40734
  const secWebSocketExtensions = req.headers["sec-websocket-extensions"];
40537
40735
  const extensions = {};
40538
40736
  if (this.options.perMessageDeflate && secWebSocketExtensions !== undefined) {
40539
- const perMessageDeflate = new PerMessageDeflate(this.options.perMessageDeflate, true, this.options.maxPayload);
40737
+ const perMessageDeflate = new PerMessageDeflate({
40738
+ ...this.options.perMessageDeflate,
40739
+ isServer: true,
40740
+ maxPayload: this.options.maxPayload
40741
+ });
40540
40742
  try {
40541
40743
  const offers = extension.parse(secWebSocketExtensions);
40542
40744
  if (offers[PerMessageDeflate.extensionName]) {
@@ -40665,12 +40867,15 @@ var require_websocket_server = __commonJS((exports, module) => {
40665
40867
  }
40666
40868
  });
40667
40869
 
40668
- // ../../node_modules/.pnpm/ws@8.19.0/node_modules/ws/wrapper.mjs
40669
- var import_stream, import_receiver, import_sender, import_websocket, import_websocket_server, wrapper_default;
40870
+ // ../../node_modules/.pnpm/ws@8.20.0/node_modules/ws/wrapper.mjs
40871
+ var import_stream, import_extension, import_permessage_deflate, import_receiver, import_sender, import_subprotocol, import_websocket, import_websocket_server, wrapper_default;
40670
40872
  var init_wrapper = __esm(() => {
40671
40873
  import_stream = __toESM(require_stream(), 1);
40874
+ import_extension = __toESM(require_extension(), 1);
40875
+ import_permessage_deflate = __toESM(require_permessage_deflate(), 1);
40672
40876
  import_receiver = __toESM(require_receiver(), 1);
40673
40877
  import_sender = __toESM(require_sender(), 1);
40878
+ import_subprotocol = __toESM(require_subprotocol(), 1);
40674
40879
  import_websocket = __toESM(require_websocket(), 1);
40675
40880
  import_websocket_server = __toESM(require_websocket_server(), 1);
40676
40881
  wrapper_default = import_websocket.default;
@@ -62876,11 +63081,11 @@ function combineExtensions(extensions) {
62876
63081
  syntaxExtension(all3, extensions[index2]);
62877
63082
  return all3;
62878
63083
  }
62879
- function syntaxExtension(all3, extension) {
63084
+ function syntaxExtension(all3, extension2) {
62880
63085
  let hook;
62881
- for (hook in extension) {
63086
+ for (hook in extension2) {
62882
63087
  const left = (hasOwnProperty.call(all3, hook) ? all3[hook] : undefined) || (all3[hook] = {});
62883
- const right = extension[hook];
63088
+ const right = extension2[hook];
62884
63089
  let code$1;
62885
63090
  if (right)
62886
63091
  for (code$1 in right) {
@@ -65039,7 +65244,7 @@ var init_remark_gfm_BUJjZJLy_es = __esm(() => {
65039
65244
  emptyOptions2 = {};
65040
65245
  });
65041
65246
 
65042
- // ../../packages/superdoc/dist/chunks/SuperConverter-C6rVgqDZ.es.js
65247
+ // ../../packages/superdoc/dist/chunks/SuperConverter-Dyz8lKjn.es.js
65043
65248
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
65044
65249
  const fieldValue = extension$1.config[field];
65045
65250
  if (typeof fieldValue === "function")
@@ -66850,7 +67055,7 @@ function optionalTargetLocatorWithPayload2(payloadProperties, payloadRequired =
66850
67055
  objectSchema2({
66851
67056
  ref: {
66852
67057
  type: "string",
66853
- description: "Handle ref string returned by a prior search/query result."
67058
+ description: "Handle ref from superdoc_search result (pass handle.ref value directly). Preferred over building a target object."
66854
67059
  },
66855
67060
  ...payloadProperties
66856
67061
  }, ["ref", ...payloadRequired]),
@@ -69277,6 +69482,23 @@ function executeCreateTableOfContents2(adapter, input, options) {
69277
69482
  };
69278
69483
  return adapter.tableOfContents(normalized, normalizeMutationOptions2(options));
69279
69484
  }
69485
+ function normalizeBlocksListInput2(input) {
69486
+ if (!input)
69487
+ return input;
69488
+ if (input.limit != null && input.limit === 0) {
69489
+ const { limit: _, ...rest } = input;
69490
+ input = Object.keys(rest).length > 0 ? rest : undefined;
69491
+ if (!input)
69492
+ return input;
69493
+ }
69494
+ if (Array.isArray(input.nodeTypes) && input.nodeTypes.length === 0) {
69495
+ const { nodeTypes: _, ...rest } = input;
69496
+ input = Object.keys(rest).length > 0 ? rest : undefined;
69497
+ if (!input)
69498
+ return input;
69499
+ }
69500
+ return input;
69501
+ }
69280
69502
  function validateBlocksListInput2(input) {
69281
69503
  if (!input)
69282
69504
  return;
@@ -69334,8 +69556,9 @@ function validateBlocksDeleteRangeInput2(input) {
69334
69556
  validateBlockNodeAddress2(input.end, "end");
69335
69557
  }
69336
69558
  function executeBlocksList2(adapter, input) {
69337
- validateBlocksListInput2(input);
69338
- return adapter.list(input);
69559
+ const normalized = normalizeBlocksListInput2(input);
69560
+ validateBlocksListInput2(normalized);
69561
+ return adapter.list(normalized);
69339
69562
  }
69340
69563
  function executeBlocksDelete2(adapter, input, options) {
69341
69564
  validateBlocksDeleteInput2(input);
@@ -85929,18 +86152,21 @@ function sanitizeHtml(html2, forbiddenTags = [
85929
86152
  }
85930
86153
  const container = resolvedDocument.createElement("div");
85931
86154
  container.innerHTML = html2;
86155
+ const domNode = resolvedDocument.defaultView?.Node ?? globalThis.Node;
86156
+ const COMMENT_NODE = domNode?.COMMENT_NODE ?? 8;
86157
+ const ELEMENT_NODE = domNode?.ELEMENT_NODE ?? 1;
85932
86158
  const stripWordListConditionalPrefixes = (root2) => {
85933
86159
  const stripFromNode = (node3) => {
85934
86160
  if (!node3?.childNodes)
85935
86161
  return;
85936
86162
  for (let i$1 = 0;i$1 < node3.childNodes.length; i$1 += 1) {
85937
86163
  const current = node3.childNodes[i$1];
85938
- if (current?.nodeType === Node.COMMENT_NODE && current.nodeValue?.includes("[if !supportLists]")) {
86164
+ if (current?.nodeType === COMMENT_NODE && current.nodeValue?.includes("[if !supportLists]")) {
85939
86165
  const nodesToStrip = [];
85940
86166
  let endifComment = null;
85941
86167
  for (let j = i$1 + 1;j < node3.childNodes.length; j += 1) {
85942
86168
  const next = node3.childNodes[j];
85943
- if (next?.nodeType === Node.COMMENT_NODE && next.nodeValue?.includes("[endif]")) {
86169
+ if (next?.nodeType === COMMENT_NODE && next.nodeValue?.includes("[endif]")) {
85944
86170
  endifComment = next;
85945
86171
  break;
85946
86172
  }
@@ -85958,7 +86184,7 @@ function sanitizeHtml(html2, forbiddenTags = [
85958
86184
  i$1 -= 1;
85959
86185
  continue;
85960
86186
  }
85961
- if (current?.nodeType === Node.ELEMENT_NODE)
86187
+ if (current?.nodeType === ELEMENT_NODE)
85962
86188
  stripFromNode(current);
85963
86189
  }
85964
86190
  };
@@ -86293,16 +86519,18 @@ function hasPreservableContent(element, knownTags) {
86293
86519
  function createDocFromHTML(content$2, editor, options = {}) {
86294
86520
  const { isImport = false } = options;
86295
86521
  let parsedContent;
86522
+ let domDocument = options.document ?? editor?.options?.document ?? editor?.options?.mockDocument ?? (typeof document !== "undefined" ? document : null);
86296
86523
  if (typeof content$2 === "string") {
86297
- const domDocument = options.document ?? editor?.options?.document ?? editor?.options?.mockDocument ?? (typeof document !== "undefined" ? document : null);
86298
86524
  const tempDiv = htmlHandler(stripHtmlStyles(content$2, domDocument), editor, domDocument);
86299
86525
  if (isImport)
86300
86526
  tempDiv.dataset.superdocImport = "true";
86301
86527
  parsedContent = tempDiv;
86302
86528
  } else
86303
86529
  parsedContent = content$2;
86304
- if ((options.onUnsupportedContent || options.warnOnUnsupportedContent) && parsedContent instanceof globalThis.Element) {
86305
- const unsupported = detectUnsupportedContent(parsedContent, editor.schema);
86530
+ const domElement = parsedContent?.ownerDocument?.defaultView?.Element ?? domDocument?.defaultView?.Element ?? globalThis.Element;
86531
+ const parsedElement = (options.onUnsupportedContent || options.warnOnUnsupportedContent) && domElement && parsedContent instanceof domElement ? parsedContent : null;
86532
+ if (parsedElement) {
86533
+ const unsupported = detectUnsupportedContent(parsedElement, editor.schema);
86306
86534
  if (unsupported.length > 0)
86307
86535
  if (options.onUnsupportedContent)
86308
86536
  options.onUnsupportedContent(unsupported);
@@ -89437,7 +89665,7 @@ function preprocess() {
89437
89665
  }
89438
89666
  }
89439
89667
  function fromMarkdown(value, encoding, options) {
89440
- if (typeof encoding !== "string") {
89668
+ if (encoding && typeof encoding === "object") {
89441
89669
  options = encoding;
89442
89670
  encoding = undefined;
89443
89671
  }
@@ -90071,10 +90299,10 @@ function configure(combined, extensions) {
90071
90299
  if (Array.isArray(value))
90072
90300
  configure(combined, value);
90073
90301
  else
90074
- extension(combined, value);
90302
+ extension2(combined, value);
90075
90303
  }
90076
90304
  }
90077
- function extension(combined, extension$1) {
90305
+ function extension2(combined, extension$1) {
90078
90306
  let key;
90079
90307
  for (key in extension$1)
90080
90308
  if (own3.call(extension$1, key))
@@ -109930,7 +110158,19 @@ var isRegExp = (value) => {
109930
110158
  typeOver = true;
109931
110159
  }
109932
110160
  }
109933
- if (gecko && added.length) {
110161
+ if (added.some((n) => n.nodeName == "BR") && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
110162
+ for (let node3 of added)
110163
+ if (node3.nodeName == "BR" && node3.parentNode) {
110164
+ let after2 = node3.nextSibling;
110165
+ while (after2 && after2.nodeType == 1) {
110166
+ if (after2.contentEditable == "false") {
110167
+ node3.parentNode.removeChild(node3);
110168
+ break;
110169
+ }
110170
+ after2 = after2.firstChild;
110171
+ }
110172
+ }
110173
+ } else if (gecko && added.length) {
109934
110174
  let brs = added.filter((n) => n.nodeName == "BR");
109935
110175
  if (brs.length == 2) {
109936
110176
  let [a, b] = brs;
@@ -109946,13 +110186,6 @@ var isRegExp = (value) => {
109946
110186
  br.remove();
109947
110187
  }
109948
110188
  }
109949
- } else if ((chrome || safari) && added.some((n) => n.nodeName == "BR") && (view.input.lastKeyCode == 8 || view.input.lastKeyCode == 46)) {
109950
- for (let node3 of added)
109951
- if (node3.nodeName == "BR" && node3.parentNode) {
109952
- let after2 = node3.nextSibling;
109953
- if (after2 && after2.nodeType == 1 && after2.contentEditable == "false")
109954
- node3.parentNode.removeChild(node3);
109955
- }
109956
110189
  }
109957
110190
  let readSel = null;
109958
110191
  if (from4 < 0 && newSel && view.input.lastFocus > Date.now() - 200 && Math.max(view.input.lastTouch, view.input.lastClick.time) < Date.now() - 300 && selectionCollapsed(sel) && (readSel = selectionFromDOM(view)) && readSel.eq(Selection.near(view.state.doc.resolve(0), 1))) {
@@ -110201,11 +110434,11 @@ var isRegExp = (value) => {
110201
110434
  }
110202
110435
  updateDraggedNode(dragging, prev) {
110203
110436
  let sel = dragging.node, found$1 = -1;
110204
- if (this.state.doc.nodeAt(sel.from) == sel.node)
110437
+ if (sel.from < this.state.doc.content.size && this.state.doc.nodeAt(sel.from) == sel.node)
110205
110438
  found$1 = sel.from;
110206
110439
  else {
110207
110440
  let movedPos = sel.from + (this.state.doc.content.size - prev.doc.content.size);
110208
- if ((movedPos > 0 && this.state.doc.nodeAt(movedPos)) == sel.node)
110441
+ if ((movedPos > 0 && movedPos < this.state.doc.content.size && this.state.doc.nodeAt(movedPos)) == sel.node)
110209
110442
  found$1 = movedPos;
110210
110443
  }
110211
110444
  this.dragging = new Dragging(dragging.slice, dragging.move, found$1 < 0 ? undefined : NodeSelection.create(this.state.doc, found$1));
@@ -116546,7 +116779,7 @@ var isRegExp = (value) => {
116546
116779
  if (id2)
116547
116780
  return trackedChanges.filter(({ mark }) => mark.attrs.id === id2);
116548
116781
  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 }) => {
116782
+ }, 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
116783
  if (!runProps?.elements?.length || !state)
116551
116784
  return;
116552
116785
  const fontsNode = runProps.elements.find((el) => el.name === "w:rFonts");
@@ -116580,7 +116813,7 @@ var isRegExp = (value) => {
116580
116813
  state.kern = kernNode.attributes["w:val"];
116581
116814
  }
116582
116815
  }, SuperConverter;
116583
- var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
116816
+ var init_SuperConverter_Dyz8lKjn_es = __esm(() => {
116584
116817
  init_rolldown_runtime_B2q5OVn9_es();
116585
116818
  init_jszip_ChlR43oI_es();
116586
116819
  init_xml_js_40FWvL78_es();
@@ -120525,7 +120758,9 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
120525
120758
  throws: T_PARAGRAPH_MUTATION2
120526
120759
  }),
120527
120760
  referenceDocPath: "format/paragraph/set-flow-options.mdx",
120528
- referenceGroup: "format.paragraph"
120761
+ referenceGroup: "format.paragraph",
120762
+ intentGroup: "format",
120763
+ intentAction: "set_flow_options"
120529
120764
  },
120530
120765
  "format.paragraph.setTabStop": {
120531
120766
  memberPath: "format.paragraph.setTabStop",
@@ -121622,7 +121857,9 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
121622
121857
  ]
121623
121858
  }),
121624
121859
  referenceDocPath: "create/table.mdx",
121625
- referenceGroup: "create"
121860
+ referenceGroup: "create",
121861
+ intentGroup: "create",
121862
+ intentAction: "table"
121626
121863
  },
121627
121864
  "tables.convertFromText": {
121628
121865
  memberPath: "tables.convertFromText",
@@ -126141,7 +126378,11 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
126141
126378
  success: { const: true },
126142
126379
  paragraph: paragraphAddressSchema2,
126143
126380
  insertionPoint: textAddressSchema2,
126144
- trackedChangeRefs: arraySchema2(trackChangeRefSchema2)
126381
+ trackedChangeRefs: arraySchema2(trackChangeRefSchema2),
126382
+ ref: {
126383
+ type: "string",
126384
+ description: "Ref handle for the created block. Pass directly to superdoc_format or superdoc_edit ref param without searching."
126385
+ }
126145
126386
  }, [
126146
126387
  "success",
126147
126388
  "paragraph",
@@ -126151,7 +126392,11 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
126151
126392
  success: { const: true },
126152
126393
  heading: headingAddressSchema2,
126153
126394
  insertionPoint: textAddressSchema2,
126154
- trackedChangeRefs: arraySchema2(trackChangeRefSchema2)
126395
+ trackedChangeRefs: arraySchema2(trackChangeRefSchema2),
126396
+ ref: {
126397
+ type: "string",
126398
+ description: "Ref handle for the created block. Pass directly to superdoc_format or superdoc_edit ref param without searching."
126399
+ }
126155
126400
  }, [
126156
126401
  "success",
126157
126402
  "heading",
@@ -127664,6 +127909,10 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
127664
127909
  type: "boolean",
127665
127910
  description: "True if text is bold."
127666
127911
  },
127912
+ color: {
127913
+ type: "string",
127914
+ description: "Text color when explicitly set (e.g. '#000000')."
127915
+ },
127667
127916
  alignment: {
127668
127917
  type: "string",
127669
127918
  description: "Paragraph alignment."
@@ -127671,6 +127920,10 @@ var init_SuperConverter_C6rVgqDZ_es = __esm(() => {
127671
127920
  headingLevel: {
127672
127921
  type: "number",
127673
127922
  description: "Heading level (1-6)."
127923
+ },
127924
+ ref: {
127925
+ type: "string",
127926
+ description: "Ref handle for this block. Pass directly to superdoc_format or superdoc_edit ref param. Only present for non-empty blocks."
127674
127927
  }
127675
127928
  }, [
127676
127929
  "ordinal",
@@ -153649,28 +153902,28 @@ function zwitch(key, options) {
153649
153902
  one2.unknown = settings.unknown;
153650
153903
  return one2;
153651
153904
  }
153652
- function configure2(base3, extension2) {
153905
+ function configure2(base3, extension3) {
153653
153906
  let index2 = -1;
153654
153907
  let key;
153655
- if (extension2.extensions)
153656
- while (++index2 < extension2.extensions.length)
153657
- configure2(base3, extension2.extensions[index2]);
153658
- for (key in extension2)
153659
- if (own4.call(extension2, key))
153908
+ if (extension3.extensions)
153909
+ while (++index2 < extension3.extensions.length)
153910
+ configure2(base3, extension3.extensions[index2]);
153911
+ for (key in extension3)
153912
+ if (own4.call(extension3, key))
153660
153913
  switch (key) {
153661
153914
  case "extensions":
153662
153915
  break;
153663
153916
  case "unsafe":
153664
- list3(base3[key], extension2[key]);
153917
+ list3(base3[key], extension3[key]);
153665
153918
  break;
153666
153919
  case "join":
153667
- list3(base3[key], extension2[key]);
153920
+ list3(base3[key], extension3[key]);
153668
153921
  break;
153669
153922
  case "handlers":
153670
- map5(base3[key], extension2[key]);
153923
+ map5(base3[key], extension3[key]);
153671
153924
  break;
153672
153925
  default:
153673
- base3.options[key] = extension2[key];
153926
+ base3.options[key] = extension3[key];
153674
153927
  }
153675
153928
  return base3;
153676
153929
  }
@@ -155274,15 +155527,15 @@ var DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.docum
155274
155527
  this.mediaFiles[name] = fileBase64;
155275
155528
  } else {
155276
155529
  const fileBase64 = await zipEntry.async("base64");
155277
- let extension2 = this.getFileExtension(name)?.toLowerCase();
155530
+ let extension3 = this.getFileExtension(name)?.toLowerCase();
155278
155531
  let detectedType = null;
155279
- if (!IMAGE_EXTS.has(extension2) || extension2 === "tmp") {
155532
+ if (!IMAGE_EXTS.has(extension3) || extension3 === "tmp") {
155280
155533
  detectedType = detectImageType(fileBase64);
155281
155534
  if (detectedType)
155282
- extension2 = detectedType;
155535
+ extension3 = detectedType;
155283
155536
  }
155284
- if (IMAGE_EXTS.has(extension2)) {
155285
- const mimeSubtype = MIME_TYPE_FOR_EXT[extension2] || extension2;
155537
+ if (IMAGE_EXTS.has(extension3)) {
155538
+ const mimeSubtype = MIME_TYPE_FOR_EXT[extension3] || extension3;
155286
155539
  this.mediaFiles[name] = `data:image/${mimeSubtype};base64,${fileBase64}`;
155287
155540
  const blob = await zipEntry.async("blob");
155288
155541
  const fileObj = new File([blob], name, { type: blob.type });
@@ -173461,7 +173714,7 @@ var init_remark_gfm_DCND_V_3_es = __esm(() => {
173461
173714
  init_remark_gfm_BUJjZJLy_es();
173462
173715
  });
173463
173716
 
173464
- // ../../packages/superdoc/dist/chunks/src-DIxjKbQ9.es.js
173717
+ // ../../packages/superdoc/dist/chunks/src-wLlfPuEU.es.js
173465
173718
  function deleteProps(obj, propOrProps) {
173466
173719
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
173467
173720
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -174098,7 +174351,7 @@ function prosemirrorToYXmlFragment(doc$12, xmlFragment) {
174098
174351
  }
174099
174352
  function getSuperdocVersion() {
174100
174353
  try {
174101
- return "1.23.0";
174354
+ return "1.23.1";
174102
174355
  } catch {
174103
174356
  return "unknown";
174104
174357
  }
@@ -176153,6 +176406,39 @@ function tableSeparatorNeeds$1(doc$12, pos) {
176153
176406
  after: !nodeAfter || nodeAfter.type.name === "table"
176154
176407
  };
176155
176408
  }
176409
+ function computeParagraphContentBounds(paragraphPos, paragraphNode) {
176410
+ if (!Number.isFinite(paragraphPos) || !paragraphNode || !Number.isFinite(paragraphNode.nodeSize))
176411
+ return null;
176412
+ let from$1 = paragraphPos + 1;
176413
+ let to = paragraphPos + paragraphNode.nodeSize - 1;
176414
+ if (paragraphNode.firstChild?.type?.name === "run")
176415
+ from$1 = paragraphPos + 2;
176416
+ if (paragraphNode.lastChild?.type?.name === "run")
176417
+ to = paragraphPos + paragraphNode.nodeSize - 2;
176418
+ if (to < from$1)
176419
+ to = from$1;
176420
+ return {
176421
+ from: from$1,
176422
+ to
176423
+ };
176424
+ }
176425
+ function computeToggleListSelectionRange({ selectionWasCollapsed, affectedParagraphCount, firstParagraphPos, lastParagraphPos, firstNode, lastNode }) {
176426
+ if (affectedParagraphCount <= 0)
176427
+ return null;
176428
+ const firstBounds = computeParagraphContentBounds(firstParagraphPos, firstNode);
176429
+ const lastBounds = computeParagraphContentBounds(lastParagraphPos, lastNode);
176430
+ if (!firstBounds || !lastBounds)
176431
+ return null;
176432
+ if (selectionWasCollapsed && affectedParagraphCount === 1)
176433
+ return {
176434
+ from: lastBounds.to,
176435
+ to: lastBounds.to
176436
+ };
176437
+ return {
176438
+ from: firstBounds.from,
176439
+ to: lastBounds.to
176440
+ };
176441
+ }
176156
176442
  function numFmtIsBullet(numFmt) {
176157
176443
  if (numFmt == null)
176158
176444
  return false;
@@ -185381,10 +185667,10 @@ function Item$1(fun, array) {
185381
185667
  this.array = array;
185382
185668
  }
185383
185669
  function noop2() {}
185384
- function isExtensionRulesEnabled(extension2, enabled) {
185670
+ function isExtensionRulesEnabled(extension3, enabled) {
185385
185671
  if (Array.isArray(enabled))
185386
185672
  return enabled.some((enabledExtension) => {
185387
- return (typeof enabledExtension === "string" ? enabledExtension : enabledExtension.name) === extension2.name;
185673
+ return (typeof enabledExtension === "string" ? enabledExtension : enabledExtension.name) === extension3.name;
185388
185674
  });
185389
185675
  return enabled;
185390
185676
  }
@@ -195811,6 +196097,21 @@ function collectTrackInsertRefsInRange(editor, from$1, to) {
195811
196097
  entityId: id2
195812
196098
  }));
195813
196099
  }
196100
+ function mintBlockRef(editor, storyKey, nodeId, textLength) {
196101
+ return encodeV4Ref({
196102
+ v: 4,
196103
+ rev: getRevision(editor),
196104
+ storyKey,
196105
+ scope: "block",
196106
+ matchId: `create:${nodeId}`,
196107
+ segments: [{
196108
+ blockId: nodeId,
196109
+ start: 0,
196110
+ end: textLength
196111
+ }],
196112
+ blockIndex: 0
196113
+ });
196114
+ }
195814
196115
  function resolveCreateInsertPosition(editor, at) {
195815
196116
  const location$1 = at ?? { kind: "documentEnd" };
195816
196117
  if (location$1.kind === "documentStart")
@@ -195838,7 +196139,7 @@ function resolveCreatedBlock(editor, nodeType, blockId) {
195838
196139
  return fallback;
195839
196140
  throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Created ${nodeType} could not be resolved after insertion.`, { [`${nodeType}Id`]: blockId });
195840
196141
  }
195841
- function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story) {
196142
+ function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story, ref$1) {
195842
196143
  return {
195843
196144
  success: true,
195844
196145
  paragraph: {
@@ -195856,10 +196157,11 @@ function buildParagraphCreateSuccess(paragraphNodeId, trackedChangeRefs, story)
195856
196157
  },
195857
196158
  ...story && { story }
195858
196159
  },
195859
- trackedChangeRefs
196160
+ trackedChangeRefs,
196161
+ ...ref$1 ? { ref: ref$1 } : {}
195860
196162
  };
195861
196163
  }
195862
- function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story) {
196164
+ function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story, ref$1) {
195863
196165
  return {
195864
196166
  success: true,
195865
196167
  heading: {
@@ -195877,7 +196179,8 @@ function buildHeadingCreateSuccess(headingNodeId, trackedChangeRefs, story) {
195877
196179
  },
195878
196180
  ...story && { story }
195879
196181
  },
195880
- trackedChangeRefs
196182
+ trackedChangeRefs,
196183
+ ...ref$1 ? { ref: ref$1 } : {}
195881
196184
  };
195882
196185
  }
195883
196186
  function createParagraphWrapper(editor, input2, options) {
@@ -195953,7 +196256,9 @@ function createParagraphWrapper(editor, input2, options) {
195953
196256
  if (runtime.commit)
195954
196257
  runtime.commit(editor);
195955
196258
  const nonBodyStory = runtime.kind !== "body" ? runtime.locator : undefined;
195956
- return buildParagraphCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory);
196259
+ const textLen = input2.text?.length ?? 0;
196260
+ const ref$1 = textLen > 0 ? mintBlockRef(storyEditor, runtime.storyKey, canonicalId, textLen) : undefined;
196261
+ return buildParagraphCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory, ref$1);
195957
196262
  } finally {
195958
196263
  disposeEphemeralWriteRuntime(runtime);
195959
196264
  }
@@ -196033,7 +196338,9 @@ function createHeadingWrapper(editor, input2, options) {
196033
196338
  if (runtime.commit)
196034
196339
  runtime.commit(editor);
196035
196340
  const nonBodyStory = runtime.kind !== "body" ? runtime.locator : undefined;
196036
- return buildHeadingCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory);
196341
+ const textLen = input2.text?.length ?? 0;
196342
+ const ref$1 = textLen > 0 ? mintBlockRef(storyEditor, runtime.storyKey, canonicalId, textLen) : undefined;
196343
+ return buildHeadingCreateSuccess(canonicalId, trackedChangeRefs, nonBodyStory, ref$1);
196037
196344
  } finally {
196038
196345
  disposeEphemeralWriteRuntime(runtime);
196039
196346
  }
@@ -196052,6 +196359,8 @@ function extractBlockFormatting(node3) {
196052
196359
  let fontFamily;
196053
196360
  let fontSize;
196054
196361
  let bold2;
196362
+ let underline;
196363
+ let color2;
196055
196364
  node3.descendants((child) => {
196056
196365
  if (fontFamily !== undefined)
196057
196366
  return false;
@@ -196059,19 +196368,28 @@ function extractBlockFormatting(node3) {
196059
196368
  if (!child.isText || marks.length === 0)
196060
196369
  return;
196061
196370
  for (const mark2 of marks) {
196371
+ const markName = mark2.type.name;
196062
196372
  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;
196373
+ if (markName === "textStyle") {
196374
+ if (typeof attrs.fontFamily === "string" && attrs.fontFamily)
196375
+ fontFamily = attrs.fontFamily;
196376
+ if (attrs.fontSize != null) {
196377
+ const raw = typeof attrs.fontSize === "string" ? parseFloat(attrs.fontSize) : attrs.fontSize;
196378
+ if (typeof raw === "number" && Number.isFinite(raw))
196379
+ fontSize = raw;
196380
+ }
196381
+ if (typeof attrs.color === "string" && attrs.color)
196382
+ color2 = attrs.color;
196069
196383
  }
196070
- if (attrs.bold === true)
196384
+ if (markName === "bold" && attrs.value === true)
196071
196385
  bold2 = true;
196386
+ if (markName === "underline")
196387
+ underline = true;
196072
196388
  }
196073
196389
  return false;
196074
196390
  });
196391
+ if (color2 === "auto")
196392
+ color2 = undefined;
196075
196393
  let headingLevel;
196076
196394
  if (typeof styleId === "string") {
196077
196395
  const m$1 = HEADING_PATTERN.exec(styleId);
@@ -196083,6 +196401,8 @@ function extractBlockFormatting(node3) {
196083
196401
  ...fontFamily ? { fontFamily } : {},
196084
196402
  ...fontSize !== undefined ? { fontSize } : {},
196085
196403
  ...bold2 ? { bold: bold2 } : {},
196404
+ ...underline ? { underline } : {},
196405
+ ...color2 ? { color: color2 } : {},
196086
196406
  ...pProps?.justification ? { alignment: pProps.justification } : {},
196087
196407
  ...headingLevel ? { headingLevel } : {}
196088
196408
  };
@@ -196149,17 +196469,36 @@ function blocksListWrapper(editor, input2) {
196149
196469
  const total = filtered.length;
196150
196470
  const offset$1 = input2?.offset ?? 0;
196151
196471
  const limit = input2?.limit ?? total;
196472
+ const paged = filtered.slice(offset$1, offset$1 + limit);
196473
+ const rev = getRevision(editor);
196152
196474
  return {
196153
196475
  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)
196476
+ blocks: paged.map((candidate, i4) => {
196477
+ const textLength = computeTextContentLength(candidate.node);
196478
+ const ref$1 = textLength > 0 ? encodeV4Ref({
196479
+ v: 4,
196480
+ rev,
196481
+ storyKey: "body",
196482
+ scope: "block",
196483
+ matchId: candidate.nodeId,
196484
+ segments: [{
196485
+ blockId: candidate.nodeId,
196486
+ start: 0,
196487
+ end: textLength
196488
+ }],
196489
+ blockIndex: offset$1 + i4
196490
+ }) : undefined;
196491
+ return {
196492
+ ordinal: offset$1 + i4,
196493
+ nodeId: candidate.nodeId,
196494
+ nodeType: candidate.nodeType,
196495
+ textPreview: extractTextPreview(candidate.node),
196496
+ isEmpty: textLength === 0,
196497
+ ...extractBlockFormatting(candidate.node),
196498
+ ...ref$1 ? { ref: ref$1 } : {}
196499
+ };
196500
+ }),
196501
+ revision: rev
196163
196502
  };
196164
196503
  }
196165
196504
  function blocksDeleteWrapper(editor, input2, options) {
@@ -211906,6 +212245,502 @@ function resolveAnnotationDisplayLabel(annotation, contentEl) {
211906
212245
  value: derivedLabel
211907
212246
  };
211908
212247
  }
212248
+ function cssClassForKind(kind) {
212249
+ switch (kind) {
212250
+ case "spelling":
212251
+ return PROOFING_CSS.SPELLING;
212252
+ case "grammar":
212253
+ return PROOFING_CSS.GRAMMAR;
212254
+ case "style":
212255
+ return PROOFING_CSS.STYLE;
212256
+ }
212257
+ }
212258
+ function computeSplitSegments(spanPmStart, spanPmEnd, spanText, annotations) {
212259
+ const boundaries = /* @__PURE__ */ new Set;
212260
+ boundaries.add(spanPmStart);
212261
+ boundaries.add(spanPmEnd);
212262
+ for (const annotation of annotations) {
212263
+ const clampedFrom = Math.max(annotation.pmFrom, spanPmStart);
212264
+ const clampedTo = Math.min(annotation.pmTo, spanPmEnd);
212265
+ if (clampedFrom > spanPmStart)
212266
+ boundaries.add(clampedFrom);
212267
+ if (clampedTo < spanPmEnd)
212268
+ boundaries.add(clampedTo);
212269
+ }
212270
+ const sortedBoundaries = Array.from(boundaries).sort((a2, b$1) => a2 - b$1);
212271
+ const segments = [];
212272
+ for (let index2 = 0;index2 < sortedBoundaries.length - 1; index2 += 1) {
212273
+ const segmentPmStart = sortedBoundaries[index2];
212274
+ const segmentPmEnd = sortedBoundaries[index2 + 1];
212275
+ const textStart = segmentPmStart - spanPmStart;
212276
+ const textEnd = segmentPmEnd - spanPmStart;
212277
+ if (textEnd <= textStart || textStart >= spanText.length)
212278
+ continue;
212279
+ const clampedTextEnd = Math.min(textEnd, spanText.length);
212280
+ let proofingClass = null;
212281
+ for (const annotation of annotations)
212282
+ if (annotation.pmFrom <= segmentPmStart && annotation.pmTo >= segmentPmEnd) {
212283
+ proofingClass = cssClassForKind(annotation.kind);
212284
+ break;
212285
+ }
212286
+ segments.push({
212287
+ textStart,
212288
+ textEnd: clampedTextEnd,
212289
+ pmStart: segmentPmStart,
212290
+ pmEnd: segmentPmEnd,
212291
+ proofingClass
212292
+ });
212293
+ }
212294
+ return segments;
212295
+ }
212296
+ function replaceSpanWithSiblings(originalSpan, segments, spanText) {
212297
+ const parent = originalSpan.parentNode;
212298
+ if (!parent)
212299
+ return [];
212300
+ const doc$12 = originalSpan.ownerDocument;
212301
+ const siblings = [];
212302
+ for (const segment of segments) {
212303
+ const text5 = spanText.slice(segment.textStart, segment.textEnd);
212304
+ if (text5.length === 0)
212305
+ continue;
212306
+ const span = doc$12.createElement("span");
212307
+ for (let index2 = 0;index2 < originalSpan.attributes.length; index2 += 1) {
212308
+ const attr = originalSpan.attributes[index2];
212309
+ span.setAttribute(attr.name, attr.value);
212310
+ }
212311
+ span.setAttribute("data-pm-start", String(segment.pmStart));
212312
+ span.setAttribute("data-pm-end", String(segment.pmEnd));
212313
+ if (segment.proofingClass) {
212314
+ span.classList.add(segment.proofingClass);
212315
+ span.setAttribute("aria-invalid", "spelling");
212316
+ }
212317
+ span.setAttribute(PROOFING_CSS.SPLIT_ATTR, "");
212318
+ span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
212319
+ span.textContent = "";
212320
+ span.appendChild(doc$12.createTextNode(text5));
212321
+ splitOriginMap.set(span, originalSpan);
212322
+ siblings.push(span);
212323
+ }
212324
+ originalSpan.style.display = "none";
212325
+ originalSpan.setAttribute(PROOFING_CSS.DATA_ATTR, "original");
212326
+ const originalPmStart = originalSpan.getAttribute("data-pm-start");
212327
+ const originalPmEnd = originalSpan.getAttribute("data-pm-end");
212328
+ if (originalPmStart)
212329
+ originalSpan.setAttribute("data-sd-orig-pm-start", originalPmStart);
212330
+ if (originalPmEnd)
212331
+ originalSpan.setAttribute("data-sd-orig-pm-end", originalPmEnd);
212332
+ originalSpan.removeAttribute("data-pm-start");
212333
+ originalSpan.removeAttribute("data-pm-end");
212334
+ for (const sibling of siblings)
212335
+ parent.insertBefore(sibling, originalSpan);
212336
+ return siblings;
212337
+ }
212338
+ function restoreSplitSpans(container) {
212339
+ const splitSpans = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
212340
+ if (splitSpans.length === 0)
212341
+ return false;
212342
+ const groupsByOriginal = /* @__PURE__ */ new Map;
212343
+ for (const span of splitSpans) {
212344
+ const original = splitOriginMap.get(span);
212345
+ if (!original)
212346
+ continue;
212347
+ const group = groupsByOriginal.get(original);
212348
+ if (group)
212349
+ group.push(span);
212350
+ else
212351
+ groupsByOriginal.set(original, [span]);
212352
+ }
212353
+ for (const [original, siblings] of groupsByOriginal) {
212354
+ const parent = original.parentNode;
212355
+ if (!parent)
212356
+ continue;
212357
+ unhideOriginalSpan(original);
212358
+ for (const sibling of siblings)
212359
+ parent.removeChild(sibling);
212360
+ }
212361
+ const remainingSplitSpans = Array.from(container.querySelectorAll(`[${PROOFING_CSS.SPLIT_ATTR}]`));
212362
+ for (const span of remainingSplitSpans)
212363
+ span.parentNode?.removeChild(span);
212364
+ const hiddenOriginals = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}="original"]`));
212365
+ for (const element3 of hiddenOriginals)
212366
+ unhideOriginalSpan(element3);
212367
+ return true;
212368
+ }
212369
+ function unhideOriginalSpan(element3) {
212370
+ element3.style.display = "";
212371
+ if (!element3.style.cssText)
212372
+ element3.removeAttribute("style");
212373
+ element3.removeAttribute(PROOFING_CSS.DATA_ATTR);
212374
+ const savedStart = element3.getAttribute("data-sd-orig-pm-start");
212375
+ const savedEnd = element3.getAttribute("data-sd-orig-pm-end");
212376
+ if (savedStart) {
212377
+ element3.setAttribute("data-pm-start", savedStart);
212378
+ element3.removeAttribute("data-sd-orig-pm-start");
212379
+ }
212380
+ if (savedEnd) {
212381
+ element3.setAttribute("data-pm-end", savedEnd);
212382
+ element3.removeAttribute("data-sd-orig-pm-end");
212383
+ }
212384
+ }
212385
+ function applyProofingDecorations(container, annotations) {
212386
+ const hadPrevious = clearProofingDecorations(container);
212387
+ if (annotations.length === 0)
212388
+ return hadPrevious;
212389
+ const sortedAnnotations = [...annotations].sort((left$1, right$1) => left$1.pmFrom - right$1.pmFrom);
212390
+ const spans = Array.from(container.querySelectorAll("[data-pm-start][data-pm-end]"));
212391
+ let mutated = false;
212392
+ for (const span of spans) {
212393
+ const pmStart = Number.parseInt(span.getAttribute("data-pm-start") ?? "", 10);
212394
+ const pmEnd = Number.parseInt(span.getAttribute("data-pm-end") ?? "", 10);
212395
+ if (Number.isNaN(pmStart) || Number.isNaN(pmEnd) || pmEnd <= pmStart)
212396
+ continue;
212397
+ if (!isLeafTextSpan(span))
212398
+ continue;
212399
+ const overlappingAnnotations = findOverlappingAnnotations(sortedAnnotations, pmStart, pmEnd);
212400
+ if (overlappingAnnotations.length === 0)
212401
+ continue;
212402
+ const text5 = span.textContent ?? "";
212403
+ if (text5.length === 0)
212404
+ continue;
212405
+ if (isCoveredBySingleAnnotation(pmStart, pmEnd, overlappingAnnotations)) {
212406
+ span.classList.add(cssClassForKind(overlappingAnnotations[0].kind));
212407
+ span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
212408
+ span.setAttribute("aria-invalid", "spelling");
212409
+ mutated = true;
212410
+ continue;
212411
+ }
212412
+ const segments = computeSplitSegments(pmStart, pmEnd, text5, overlappingAnnotations);
212413
+ if (segments.length > 1) {
212414
+ replaceSpanWithSiblings(span, segments, text5);
212415
+ mutated = true;
212416
+ continue;
212417
+ }
212418
+ if (segments.length === 1 && segments[0].proofingClass) {
212419
+ span.classList.add(segments[0].proofingClass);
212420
+ span.setAttribute(PROOFING_CSS.DATA_ATTR, "");
212421
+ span.setAttribute("aria-invalid", "spelling");
212422
+ mutated = true;
212423
+ }
212424
+ }
212425
+ return mutated || hadPrevious;
212426
+ }
212427
+ function clearProofingDecorations(container) {
212428
+ let cleared = false;
212429
+ const restoredSplits = restoreSplitSpans(container);
212430
+ const decoratedElements = Array.from(container.querySelectorAll(`[${PROOFING_CSS.DATA_ATTR}]`));
212431
+ for (const element3 of decoratedElements) {
212432
+ element3.classList.remove(PROOFING_CSS.SPELLING, PROOFING_CSS.GRAMMAR, PROOFING_CSS.STYLE);
212433
+ element3.removeAttribute(PROOFING_CSS.DATA_ATTR);
212434
+ element3.removeAttribute("aria-invalid");
212435
+ cleared = true;
212436
+ }
212437
+ return cleared || restoredSplits;
212438
+ }
212439
+ function isLeafTextSpan(element3) {
212440
+ const children = element3.childNodes;
212441
+ if (children.length === 0)
212442
+ return false;
212443
+ for (let index2 = 0;index2 < children.length; index2 += 1)
212444
+ if (children[index2].nodeType === Node.ELEMENT_NODE)
212445
+ return false;
212446
+ return true;
212447
+ }
212448
+ function findOverlappingAnnotations(sortedAnnotations, pmStart, pmEnd) {
212449
+ const overlapping = [];
212450
+ for (const annotation of sortedAnnotations) {
212451
+ if (annotation.pmFrom >= pmEnd)
212452
+ break;
212453
+ if (annotation.pmTo > pmStart)
212454
+ overlapping.push(annotation);
212455
+ }
212456
+ return overlapping;
212457
+ }
212458
+ function isCoveredBySingleAnnotation(pmStart, pmEnd, annotations) {
212459
+ return annotations.some((annotation) => annotation.pmFrom <= pmStart && annotation.pmTo >= pmEnd);
212460
+ }
212461
+ function isSuppressed(issue, normalizedIgnored) {
212462
+ if (normalizedIgnored.size === 0)
212463
+ return false;
212464
+ const raw = issue.word ?? issue.message;
212465
+ if (!raw)
212466
+ return false;
212467
+ const normalized = raw.normalize("NFC").toLowerCase();
212468
+ return normalizedIgnored.has(normalized);
212469
+ }
212470
+ function resolveSegmentLanguage(paraNode, defaultLanguage) {
212471
+ const runLanguage = findFirstRunLanguage(paraNode);
212472
+ if (runLanguage)
212473
+ return runLanguage;
212474
+ const paraLang = extractParagraphLanguage(paraNode);
212475
+ if (paraLang)
212476
+ return paraLang;
212477
+ return defaultLanguage;
212478
+ }
212479
+ function findFirstRunLanguage(paraNode) {
212480
+ let lang = null;
212481
+ paraNode.descendants((node3) => {
212482
+ if (lang)
212483
+ return false;
212484
+ if (node3.type.name === "run") {
212485
+ const runProps = node3.attrs.runProperties;
212486
+ if (runProps?.lang?.val) {
212487
+ lang = runProps.lang.val;
212488
+ return false;
212489
+ }
212490
+ }
212491
+ return true;
212492
+ });
212493
+ return lang;
212494
+ }
212495
+ function extractParagraphLanguage(paraNode) {
212496
+ return paraNode.attrs.paragraphProperties?.lang?.val ?? null;
212497
+ }
212498
+ function extractSegmentsWithMaps(doc$12, defaultLanguage, pageResolver) {
212499
+ const segments = [];
212500
+ const offsetMaps = /* @__PURE__ */ new Map;
212501
+ const segmentPositions = /* @__PURE__ */ new Map;
212502
+ walkParagraphs(doc$12, (paraNode, paraPos, surface) => {
212503
+ const { text: text5, slices } = extractParagraphText(paraNode, paraPos);
212504
+ if (text5.length === 0)
212505
+ return;
212506
+ const segmentId = buildSegmentId(paraNode, paraPos);
212507
+ const language = resolveSegmentLanguage(paraNode, defaultLanguage ?? null);
212508
+ const pageIndex = pageResolver?.(paraPos);
212509
+ segments.push({
212510
+ id: segmentId,
212511
+ text: text5,
212512
+ language,
212513
+ metadata: {
212514
+ blockId: paraNode.attrs.sdBlockId,
212515
+ pageIndex,
212516
+ surface
212517
+ }
212518
+ });
212519
+ offsetMaps.set(segmentId, {
212520
+ segmentId,
212521
+ slices
212522
+ });
212523
+ segmentPositions.set(segmentId, paraPos);
212524
+ });
212525
+ return {
212526
+ segments,
212527
+ offsetMaps,
212528
+ segmentPositions
212529
+ };
212530
+ }
212531
+ function walkParagraphs(doc$12, visitor) {
212532
+ doc$12.descendants((node3, pos) => {
212533
+ const typeName = node3.type.name;
212534
+ if (typeName === "header" || typeName === "footer")
212535
+ return false;
212536
+ if (typeName === "paragraph") {
212537
+ visitor(node3, pos, isInsideTableCell(doc$12, pos) ? "table-cell" : "body");
212538
+ return false;
212539
+ }
212540
+ return true;
212541
+ });
212542
+ }
212543
+ function isInsideTableCell(doc$12, pos) {
212544
+ const resolved = doc$12.resolve(pos);
212545
+ for (let depth = resolved.depth;depth > 0; depth--) {
212546
+ const ancestor = resolved.node(depth);
212547
+ if (ancestor.type.name === "tableCell" || ancestor.type.name === "tableHeader")
212548
+ return true;
212549
+ }
212550
+ return false;
212551
+ }
212552
+ function extractParagraphText(paraNode, paraPos) {
212553
+ const parts = [];
212554
+ const slices = [];
212555
+ let textOffset = 0;
212556
+ const contentStart = paraPos + 1;
212557
+ paraNode.forEach((child, offset$1) => {
212558
+ processNode(child, contentStart + offset$1);
212559
+ });
212560
+ return {
212561
+ text: parts.join(""),
212562
+ slices
212563
+ };
212564
+ function processNode(node3, pos) {
212565
+ const typeName = node3.type.name;
212566
+ if (typeName === "run") {
212567
+ const runProps = node3.attrs.runProperties;
212568
+ if (runProps?.vanish === true) {
212569
+ emitBoundary();
212570
+ return;
212571
+ }
212572
+ if (runProps?.noProof === true) {
212573
+ emitBoundary();
212574
+ return;
212575
+ }
212576
+ const runContentStart = pos + 1;
212577
+ node3.forEach((child, childOff) => {
212578
+ processNode(child, runContentStart + childOff);
212579
+ });
212580
+ return;
212581
+ }
212582
+ if (node3.isText && node3.text) {
212583
+ if (hasTrackDeleteMark(node3))
212584
+ return;
212585
+ const text5 = node3.text;
212586
+ const pmFrom = pos;
212587
+ const pmTo = pos + text5.length;
212588
+ slices.push({
212589
+ textStart: textOffset,
212590
+ textEnd: textOffset + text5.length,
212591
+ pmFrom,
212592
+ pmTo
212593
+ });
212594
+ parts.push(text5);
212595
+ textOffset += text5.length;
212596
+ return;
212597
+ }
212598
+ if (isNonTextInlineNode(typeName)) {
212599
+ emitBoundary();
212600
+ return;
212601
+ }
212602
+ if (node3.childCount > 0) {
212603
+ const contentStart$1 = pos + 1;
212604
+ node3.forEach((child, childOff) => {
212605
+ processNode(child, contentStart$1 + childOff);
212606
+ });
212607
+ }
212608
+ }
212609
+ function emitBoundary() {
212610
+ if (parts.length > 0 && !parts[parts.length - 1].endsWith(" ")) {
212611
+ parts.push(" ");
212612
+ textOffset += 1;
212613
+ }
212614
+ }
212615
+ }
212616
+ function hasTrackDeleteMark(node3) {
212617
+ return node3.marks?.some((m$1) => m$1.type.name === "trackDelete") ?? false;
212618
+ }
212619
+ function isNonTextInlineNode(typeName) {
212620
+ return NON_TEXT_INLINE_NODES.has(typeName);
212621
+ }
212622
+ function buildSegmentId(paraNode, paraPos) {
212623
+ const blockId = paraNode.attrs.sdBlockId;
212624
+ return blockId ? `blk-${blockId}` : `pos-${paraPos}`;
212625
+ }
212626
+ function resolveIssuePmRangeFromSlices(issue, slices) {
212627
+ const pmFrom = textOffsetToPmPos(issue.start, slices);
212628
+ const pmTo = textOffsetToPmPos(issue.end, slices);
212629
+ if (pmFrom === null || pmTo === null || pmFrom >= pmTo)
212630
+ return null;
212631
+ return {
212632
+ ...issue,
212633
+ pmFrom,
212634
+ pmTo
212635
+ };
212636
+ }
212637
+ function textOffsetToPmPos(textOffset, slices) {
212638
+ for (const slice2 of slices)
212639
+ if (textOffset >= slice2.textStart && textOffset <= slice2.textEnd) {
212640
+ const delta = textOffset - slice2.textStart;
212641
+ return slice2.pmFrom + delta;
212642
+ }
212643
+ for (const slice2 of slices)
212644
+ if (slice2.textStart >= textOffset)
212645
+ return slice2.pmFrom;
212646
+ if (slices.length > 0) {
212647
+ const last2 = slices[slices.length - 1];
212648
+ if (textOffset >= last2.textEnd)
212649
+ return last2.pmTo;
212650
+ }
212651
+ return null;
212652
+ }
212653
+ function computeDirtySegmentIds(segments, segmentPositions, changedRanges) {
212654
+ if (changedRanges.length === 0)
212655
+ return /* @__PURE__ */ new Set;
212656
+ const dirty = /* @__PURE__ */ new Set;
212657
+ const sorted = segments.map((seg) => ({
212658
+ id: seg.id,
212659
+ pos: segmentPositions.get(seg.id) ?? -1
212660
+ })).filter((s2) => s2.pos >= 0).sort((a2, b$1) => a2.pos - b$1.pos);
212661
+ for (const range of changedRanges)
212662
+ for (let i4 = 0;i4 < sorted.length; i4++) {
212663
+ const seg = sorted[i4];
212664
+ const segEnd = sorted[i4 + 1]?.pos ?? Infinity;
212665
+ if (seg.pos < range.to && segEnd > range.from)
212666
+ dirty.add(seg.id);
212667
+ if (seg.pos <= range.from && segEnd >= range.from && i4 > 0)
212668
+ dirty.add(sorted[i4 - 1].id);
212669
+ }
212670
+ return dirty;
212671
+ }
212672
+ function hashSegmentText(text5) {
212673
+ let hash$3 = 2166136261;
212674
+ for (let i4 = 0;i4 < text5.length; i4++) {
212675
+ hash$3 ^= text5.charCodeAt(i4);
212676
+ hash$3 = Math.imul(hash$3, 16777619);
212677
+ }
212678
+ return (hash$3 >>> 0).toString(16);
212679
+ }
212680
+ function prioritizeByVisibility(segments, visibilitySource) {
212681
+ const visiblePages = visibilitySource.getVisiblePageIndices();
212682
+ if (!visiblePages || visiblePages.length === 0)
212683
+ return segments;
212684
+ const visibleSet = new Set(visiblePages);
212685
+ const visible = [];
212686
+ const rest = [];
212687
+ for (const seg of segments) {
212688
+ const pageIndex = seg.metadata.pageIndex;
212689
+ if (pageIndex !== undefined && visibleSet.has(pageIndex))
212690
+ visible.push(seg);
212691
+ else
212692
+ rest.push(seg);
212693
+ }
212694
+ return [...visible, ...rest];
212695
+ }
212696
+ function buildPaintSlices(issues) {
212697
+ const spellingIssues = issues.filter((i4) => i4.kind === "spelling");
212698
+ if (spellingIssues.length === 0)
212699
+ return [];
212700
+ const sorted = [...spellingIssues].sort((a2, b$1) => a2.pmFrom - b$1.pmFrom || a2.pmTo - b$1.pmTo);
212701
+ const slices = [];
212702
+ let current = null;
212703
+ for (const issue of sorted) {
212704
+ if (!current) {
212705
+ current = {
212706
+ pmFrom: issue.pmFrom,
212707
+ pmTo: issue.pmTo,
212708
+ kind: "spelling",
212709
+ issue
212710
+ };
212711
+ continue;
212712
+ }
212713
+ if (issue.pmFrom <= current.pmTo)
212714
+ current.pmTo = Math.max(current.pmTo, issue.pmTo);
212715
+ else {
212716
+ slices.push(current);
212717
+ current = {
212718
+ pmFrom: issue.pmFrom,
212719
+ pmTo: issue.pmTo,
212720
+ kind: "spelling",
212721
+ issue
212722
+ };
212723
+ }
212724
+ }
212725
+ if (current)
212726
+ slices.push(current);
212727
+ return slices;
212728
+ }
212729
+ function findSliceAtPosition(slices, pmPos) {
212730
+ let lo = 0;
212731
+ let hi = slices.length - 1;
212732
+ while (lo <= hi) {
212733
+ const mid = lo + hi >>> 1;
212734
+ const slice2 = slices[mid];
212735
+ if (pmPos < slice2.pmFrom)
212736
+ hi = mid - 1;
212737
+ else if (pmPos >= slice2.pmTo)
212738
+ lo = mid + 1;
212739
+ else
212740
+ return slice2;
212741
+ }
212742
+ return null;
212743
+ }
211909
212744
  function mapWordFamilyFallback(wordFamily) {
211910
212745
  if (!wordFamily)
211911
212746
  return DEFAULT_GENERIC_FALLBACK2;
@@ -214117,217 +214952,6 @@ function sanitizeUrl(href) {
214117
214952
  return null;
214118
214953
  return sanitizeHref(href)?.href ?? null;
214119
214954
  }
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
214955
  function assertRequiredBlockMeasurePair(label, blocks2, measures) {
214332
214956
  if (blocks2.length !== measures.length)
214333
214957
  throw new Error(`${label} blocks and measures must have the same length.`);
@@ -214368,289 +214992,6 @@ function buildLegacyPaintInput(layout, legacyState, flowMode, pageGap) {
214368
214992
  footerMeasures: legacyState.footerMeasures
214369
214993
  };
214370
214994
  }
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
214995
  function appendToArrayMap(map$12, key$1, value) {
214655
214996
  const existing = map$12.get(key$1);
214656
214997
  if (existing) {
@@ -222762,7 +223103,7 @@ function hydrateImageBlocks(blocks2, mediaFiles) {
222762
223103
  });
222763
223104
  if (normalizedMedia.size === 0)
222764
223105
  return blocks2;
222765
- const resolveImageSrc = (src, relId, attrSrc, extension2) => {
223106
+ const resolveImageSrc = (src, relId, attrSrc, extension3) => {
222766
223107
  if (!src || src.startsWith("data:"))
222767
223108
  return;
222768
223109
  const candidates = /* @__PURE__ */ new Set;
@@ -222770,7 +223111,7 @@ function hydrateImageBlocks(blocks2, mediaFiles) {
222770
223111
  if (attrSrc)
222771
223112
  candidates.add(attrSrc);
222772
223113
  if (relId) {
222773
- const inferredExt = extension2 ?? inferExtensionFromPath(src) ?? "jpeg";
223114
+ const inferredExt = extension3 ?? inferExtensionFromPath(src) ?? "jpeg";
222774
223115
  candidates.add(`word/media/${relId}.${inferredExt}`);
222775
223116
  candidates.add(`media/${relId}.${inferredExt}`);
222776
223117
  }
@@ -222781,7 +223122,7 @@ function hydrateImageBlocks(blocks2, mediaFiles) {
222781
223122
  const base64 = normalizedMedia.get(normalized);
222782
223123
  if (!base64)
222783
223124
  continue;
222784
- const finalExt = extension2 ?? inferExtensionFromPath(normalized) ?? "jpeg";
223125
+ const finalExt = extension3 ?? inferExtensionFromPath(normalized) ?? "jpeg";
222785
223126
  return base64.startsWith("data:") ? base64 : `data:image/${finalExt};base64,${base64}`;
222786
223127
  }
222787
223128
  };
@@ -222813,8 +223154,8 @@ function hydrateImageBlocks(blocks2, mediaFiles) {
222813
223154
  const attrs = blk.attrs ?? {};
222814
223155
  const relId = typeof attrs.rId === "string" ? attrs.rId : undefined;
222815
223156
  const attrSrc = typeof attrs.src === "string" ? attrs.src : undefined;
222816
- const extension2 = typeof attrs.extension === "string" ? attrs.extension.toLowerCase() : undefined;
222817
- const resolvedSrc = resolveImageSrc(blk.src, relId, attrSrc, extension2);
223157
+ const extension3 = typeof attrs.extension === "string" ? attrs.extension.toLowerCase() : undefined;
223158
+ const resolvedSrc = resolveImageSrc(blk.src, relId, attrSrc, extension3);
222818
223159
  if (resolvedSrc)
222819
223160
  return {
222820
223161
  ...blk,
@@ -231459,7 +231800,7 @@ var Node$13 = class Node$14 {
231459
231800
  seededAt: (/* @__PURE__ */ new Date()).toISOString(),
231460
231801
  source: "browser"
231461
231802
  });
231462
- }, initSyncListener = (ydoc, editor, extension2) => {
231803
+ }, initSyncListener = (ydoc, editor, extension3) => {
231463
231804
  const provider = editor.options.collaborationProvider;
231464
231805
  if (!provider)
231465
231806
  return () => {};
@@ -231469,7 +231810,7 @@ var Node$13 = class Node$14 {
231469
231810
  return;
231470
231811
  if (synced === false)
231471
231812
  return;
231472
- extension2.options.isReady = true;
231813
+ extension3.options.isReady = true;
231473
231814
  editor.emit("collaborationReady", {
231474
231815
  editor,
231475
231816
  ydoc
@@ -231622,11 +231963,11 @@ var Node$13 = class Node$14 {
231622
231963
  });
231623
231964
  }
231624
231965
  };
231625
- for (const extension2 of extensions) {
231626
- const addGlobalAttributes = getExtensionConfigField(extension2, "addGlobalAttributes", {
231627
- name: extension2.name,
231628
- options: extension2.options,
231629
- storage: extension2.storage
231966
+ for (const extension3 of extensions) {
231967
+ const addGlobalAttributes = getExtensionConfigField(extension3, "addGlobalAttributes", {
231968
+ name: extension3.name,
231969
+ options: extension3.options,
231970
+ storage: extension3.storage
231630
231971
  });
231631
231972
  if (!addGlobalAttributes)
231632
231973
  continue;
@@ -231641,11 +231982,11 @@ var Node$13 = class Node$14 {
231641
231982
  const nodeAndMarkExtensions = extensions.filter((e) => {
231642
231983
  return e.type === "node" || e.type === "mark";
231643
231984
  });
231644
- for (const extension2 of nodeAndMarkExtensions) {
231645
- const addAttributes = getExtensionConfigField(extension2, "addAttributes", {
231646
- name: extension2.name,
231647
- options: extension2.options,
231648
- storage: extension2.storage
231985
+ for (const extension3 of nodeAndMarkExtensions) {
231986
+ const addAttributes = getExtensionConfigField(extension3, "addAttributes", {
231987
+ name: extension3.name,
231988
+ options: extension3.options,
231989
+ storage: extension3.storage
231649
231990
  });
231650
231991
  if (!addAttributes)
231651
231992
  continue;
@@ -231658,7 +231999,7 @@ var Node$13 = class Node$14 {
231658
231999
  if (typeof merged.default === "function")
231659
232000
  merged.default = merged.default();
231660
232001
  extensionAttributes.push({
231661
- type: extension2.name,
232002
+ type: extension3.name,
231662
232003
  name,
231663
232004
  attribute: merged
231664
232005
  });
@@ -233209,7 +233550,13 @@ var Node$13 = class Node$14 {
233209
233550
  const attrs = {
233210
233551
  ...sdBlockId ? { sdBlockId } : undefined,
233211
233552
  ...paraId ? { paraId } : undefined,
233212
- paragraphProperties: { styleId: `Heading${level}` }
233553
+ paragraphProperties: {
233554
+ styleId: `Heading${level}`,
233555
+ numberingProperties: {
233556
+ numId: "0",
233557
+ ilvl: "0"
233558
+ }
233559
+ }
233213
233560
  };
233214
233561
  const normalizedText = typeof text5 === "string" ? text5 : "";
233215
233562
  const textNode = normalizedText.length > 0 ? state.schema.text(normalizedText) : null;
@@ -233684,24 +234031,25 @@ var Node$13 = class Node$14 {
233684
234031
  if (paragraphsInSelection.length > 0) {
233685
234032
  const firstPara = paragraphsInSelection[0];
233686
234033
  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
- }
234034
+ const firstParagraphPos = firstPara.pos;
234035
+ const lastParagraphPos = lastPara.pos;
234036
+ const firstNode = tr.doc.nodeAt(firstParagraphPos);
234037
+ const lastNode = tr.doc.nodeAt(lastParagraphPos);
234038
+ const restoredSelectionRange = computeToggleListSelectionRange({
234039
+ selectionWasCollapsed: selection.empty,
234040
+ affectedParagraphCount: paragraphsInSelection.length,
234041
+ firstParagraphPos,
234042
+ lastParagraphPos,
234043
+ firstNode,
234044
+ lastNode
234045
+ });
234046
+ if (restoredSelectionRange && restoredSelectionRange.from >= 0 && restoredSelectionRange.to <= tr.doc.content.size && restoredSelectionRange.from <= restoredSelectionRange.to)
234047
+ try {
234048
+ if (selection.empty && paragraphsInSelection.length === 1)
234049
+ tr.setSelection(Selection.near(tr.doc.resolve(restoredSelectionRange.to), -1));
234050
+ else
234051
+ tr.setSelection(TextSelection2.create(tr.doc, restoredSelectionRange.from, restoredSelectionRange.to));
234052
+ } catch {}
233705
234053
  }
233706
234054
  dispatch(tr);
233707
234055
  return true;
@@ -242578,12 +242926,12 @@ var Node$13 = class Node$14 {
242578
242926
  });
242579
242927
  }
242580
242928
  static #createNodesSchema(nodeExtensions, attributes, editor) {
242581
- const nodeEntries = nodeExtensions.map((extension2) => {
242582
- const extensionAttributes = attributes.filter((a2) => a2.type === extension2.name);
242929
+ const nodeEntries = nodeExtensions.map((extension3) => {
242930
+ const extensionAttributes = attributes.filter((a2) => a2.type === extension3.name);
242583
242931
  const context = {
242584
- name: extension2.name,
242585
- options: extension2.options,
242586
- storage: extension2.storage,
242932
+ name: extension3.name,
242933
+ options: extension3.options,
242934
+ storage: extension3.storage,
242587
242935
  editor
242588
242936
  };
242589
242937
  const attrs = Object.fromEntries(extensionAttributes.map((attr) => {
@@ -242593,80 +242941,80 @@ var Node$13 = class Node$14 {
242593
242941
  const extendNodeSchema = getExtensionConfigField(e, "extendNodeSchema", context);
242594
242942
  return {
242595
242943
  ...fields,
242596
- ...extendNodeSchema ? extendNodeSchema(extension2) : {}
242944
+ ...extendNodeSchema ? extendNodeSchema(extension3) : {}
242597
242945
  };
242598
242946
  }, {});
242599
242947
  const schema = cleanSchemaItem({
242600
- content: callOrGet(getExtensionConfigField(extension2, "content", context)),
242601
- group: callOrGet(getExtensionConfigField(extension2, "group", context)),
242602
- marks: callOrGet(getExtensionConfigField(extension2, "marks", context)),
242603
- inline: callOrGet(getExtensionConfigField(extension2, "inline", context)),
242604
- atom: callOrGet(getExtensionConfigField(extension2, "atom", context)),
242605
- selectable: callOrGet(getExtensionConfigField(extension2, "selectable", context)),
242606
- draggable: callOrGet(getExtensionConfigField(extension2, "draggable", context)),
242607
- code: callOrGet(getExtensionConfigField(extension2, "code", context)),
242608
- defining: callOrGet(getExtensionConfigField(extension2, "defining", context)),
242609
- isolating: callOrGet(getExtensionConfigField(extension2, "isolating", context)),
242610
- summary: getExtensionConfigField(extension2, "summary", context),
242948
+ content: callOrGet(getExtensionConfigField(extension3, "content", context)),
242949
+ group: callOrGet(getExtensionConfigField(extension3, "group", context)),
242950
+ marks: callOrGet(getExtensionConfigField(extension3, "marks", context)),
242951
+ inline: callOrGet(getExtensionConfigField(extension3, "inline", context)),
242952
+ atom: callOrGet(getExtensionConfigField(extension3, "atom", context)),
242953
+ selectable: callOrGet(getExtensionConfigField(extension3, "selectable", context)),
242954
+ draggable: callOrGet(getExtensionConfigField(extension3, "draggable", context)),
242955
+ code: callOrGet(getExtensionConfigField(extension3, "code", context)),
242956
+ defining: callOrGet(getExtensionConfigField(extension3, "defining", context)),
242957
+ isolating: callOrGet(getExtensionConfigField(extension3, "isolating", context)),
242958
+ summary: getExtensionConfigField(extension3, "summary", context),
242611
242959
  attrs,
242612
242960
  ...additionalNodeFields
242613
242961
  });
242614
- if (typeof extension2.validChildren === "function" || Array.isArray(extension2.validChildren))
242962
+ if (typeof extension3.validChildren === "function" || Array.isArray(extension3.validChildren))
242615
242963
  Object.defineProperty(schema, "validChildren", {
242616
242964
  enumerable: false,
242617
242965
  configurable: false,
242618
- get: () => extension2.validChildren
242966
+ get: () => extension3.validChildren
242619
242967
  });
242620
- const parseDOM = callOrGet(getExtensionConfigField(extension2, "parseDOM", context));
242968
+ const parseDOM = callOrGet(getExtensionConfigField(extension3, "parseDOM", context));
242621
242969
  if (parseDOM)
242622
242970
  schema.parseDOM = parseDOM.map((parseRule) => {
242623
242971
  return Attribute2.insertExtensionAttrsToParseRule(parseRule, extensionAttributes);
242624
242972
  });
242625
- const renderDOM = getExtensionConfigField(extension2, "renderDOM", context);
242973
+ const renderDOM = getExtensionConfigField(extension3, "renderDOM", context);
242626
242974
  if (renderDOM)
242627
242975
  schema.toDOM = (node3) => renderDOM({
242628
242976
  node: node3,
242629
242977
  htmlAttributes: Attribute2.getAttributesToRender(node3, extensionAttributes)
242630
242978
  });
242631
- const renderText = getExtensionConfigField(extension2, "renderText", context);
242979
+ const renderText = getExtensionConfigField(extension3, "renderText", context);
242632
242980
  if (renderText)
242633
242981
  schema.toText = renderText;
242634
- return [extension2.name, schema];
242982
+ return [extension3.name, schema];
242635
242983
  });
242636
242984
  return Object.fromEntries(nodeEntries);
242637
242985
  }
242638
242986
  static #createMarksSchema(markExtensions, attributes, editor) {
242639
- const markEntries = markExtensions.map((extension2) => {
242640
- const extensionAttributes = attributes.filter((a2) => a2.type === extension2.name);
242987
+ const markEntries = markExtensions.map((extension3) => {
242988
+ const extensionAttributes = attributes.filter((a2) => a2.type === extension3.name);
242641
242989
  const context = {
242642
- name: extension2.name,
242643
- options: extension2.options,
242644
- storage: extension2.storage,
242990
+ name: extension3.name,
242991
+ options: extension3.options,
242992
+ storage: extension3.storage,
242645
242993
  editor
242646
242994
  };
242647
242995
  const attrs = Object.fromEntries(extensionAttributes.map((attr) => {
242648
242996
  return [attr.name, { default: attr?.attribute?.default }];
242649
242997
  }));
242650
242998
  const schema = cleanSchemaItem({
242651
- group: callOrGet(getExtensionConfigField(extension2, "group", context)),
242652
- inclusive: callOrGet(getExtensionConfigField(extension2, "inclusive", context)),
242653
- excludes: callOrGet(getExtensionConfigField(extension2, "excludes", context)),
242654
- spanning: callOrGet(getExtensionConfigField(extension2, "spanning", context)),
242655
- code: callOrGet(getExtensionConfigField(extension2, "code", context)),
242999
+ group: callOrGet(getExtensionConfigField(extension3, "group", context)),
243000
+ inclusive: callOrGet(getExtensionConfigField(extension3, "inclusive", context)),
243001
+ excludes: callOrGet(getExtensionConfigField(extension3, "excludes", context)),
243002
+ spanning: callOrGet(getExtensionConfigField(extension3, "spanning", context)),
243003
+ code: callOrGet(getExtensionConfigField(extension3, "code", context)),
242656
243004
  attrs
242657
243005
  });
242658
- const parseDOM = callOrGet(getExtensionConfigField(extension2, "parseDOM", context));
243006
+ const parseDOM = callOrGet(getExtensionConfigField(extension3, "parseDOM", context));
242659
243007
  if (parseDOM)
242660
243008
  schema.parseDOM = parseDOM.map((parseRule) => {
242661
243009
  return Attribute2.insertExtensionAttrsToParseRule(parseRule, extensionAttributes);
242662
243010
  });
242663
- const renderDOM = getExtensionConfigField(extension2, "renderDOM", context);
243011
+ const renderDOM = getExtensionConfigField(extension3, "renderDOM", context);
242664
243012
  if (renderDOM)
242665
243013
  schema.toDOM = (mark2) => renderDOM({
242666
243014
  mark: mark2,
242667
243015
  htmlAttributes: Attribute2.getAttributesToRender(mark2, extensionAttributes)
242668
243016
  });
242669
- return [extension2.name, schema];
243017
+ return [extension3.name, schema];
242670
243018
  });
242671
243019
  return Object.fromEntries(markEntries);
242672
243020
  }
@@ -242791,9 +243139,9 @@ var Node$13 = class Node$14 {
242791
243139
  constructor(extensions, userExtensions, editor) {
242792
243140
  this.editor = editor;
242793
243141
  this.externalExtensions = userExtensions || [];
242794
- this.externalExtensions = this.externalExtensions.map((extension2) => {
243142
+ this.externalExtensions = this.externalExtensions.map((extension3) => {
242795
243143
  return {
242796
- ...extension2,
243144
+ ...extension3,
242797
243145
  isExternal: true
242798
243146
  };
242799
243147
  });
@@ -242824,13 +243172,13 @@ var Node$13 = class Node$14 {
242824
243172
  }
242825
243173
  get commands() {
242826
243174
  let commandsObject = {};
242827
- for (const extension2 of this.extensions) {
242828
- const addCommands = getExtensionConfigField(extension2, "addCommands", {
242829
- name: extension2.name,
242830
- options: extension2.options,
242831
- storage: extension2.storage,
243175
+ for (const extension3 of this.extensions) {
243176
+ const addCommands = getExtensionConfigField(extension3, "addCommands", {
243177
+ name: extension3.name,
243178
+ options: extension3.options,
243179
+ storage: extension3.storage,
242832
243180
  editor: this.editor,
242833
- type: getSchemaTypeByName(extension2.name, this.schema)
243181
+ type: getSchemaTypeByName(extension3.name, this.schema)
242834
243182
  });
242835
243183
  if (addCommands)
242836
243184
  commandsObject = {
@@ -242842,16 +243190,16 @@ var Node$13 = class Node$14 {
242842
243190
  }
242843
243191
  get helpers() {
242844
243192
  const helpersObject = {};
242845
- for (const extension2 of this.extensions) {
242846
- const name = extension2.name;
243193
+ for (const extension3 of this.extensions) {
243194
+ const name = extension3.name;
242847
243195
  if (!name)
242848
243196
  continue;
242849
- const addHelpers = getExtensionConfigField(extension2, "addHelpers", {
242850
- name: extension2.name,
242851
- options: extension2.options,
242852
- storage: extension2.storage,
243197
+ const addHelpers = getExtensionConfigField(extension3, "addHelpers", {
243198
+ name: extension3.name,
243199
+ options: extension3.options,
243200
+ storage: extension3.storage,
242853
243201
  editor: this.editor,
242854
- type: getSchemaTypeByName(extension2.name, this.schema)
243202
+ type: getSchemaTypeByName(extension3.name, this.schema)
242855
243203
  });
242856
243204
  if (addHelpers)
242857
243205
  helpersObject[name] = addHelpers();
@@ -242862,16 +243210,16 @@ var Node$13 = class Node$14 {
242862
243210
  const editor = this.editor;
242863
243211
  const extensions = ExtensionService2.sortByPriority([...this.extensions].reverse());
242864
243212
  const inputRules = [];
242865
- const allPlugins = extensions.map((extension2) => {
243213
+ const allPlugins = extensions.map((extension3) => {
242866
243214
  const context = {
242867
- name: extension2.name,
242868
- options: extension2.options,
242869
- storage: extension2.storage,
243215
+ name: extension3.name,
243216
+ options: extension3.options,
243217
+ storage: extension3.storage,
242870
243218
  editor,
242871
- type: getSchemaTypeByName(extension2.name, this.schema)
243219
+ type: getSchemaTypeByName(extension3.name, this.schema)
242872
243220
  };
242873
243221
  const plugins = [];
242874
- const addShortcuts = getExtensionConfigField(extension2, "addShortcuts", context);
243222
+ const addShortcuts = getExtensionConfigField(extension3, "addShortcuts", context);
242875
243223
  let bindingsObject = {};
242876
243224
  if (addShortcuts) {
242877
243225
  const entries2 = Object.entries(addShortcuts()).map(([shortcut, method]) => {
@@ -242883,10 +243231,10 @@ var Node$13 = class Node$14 {
242883
243231
  bindingsObject = { ...Object.fromEntries(entries2) };
242884
243232
  }
242885
243233
  plugins.push(keymap(bindingsObject));
242886
- const addInputRules = getExtensionConfigField(extension2, "addInputRules", context);
242887
- if (isExtensionRulesEnabled(extension2, editor.options.enableInputRules) && addInputRules)
243234
+ const addInputRules = getExtensionConfigField(extension3, "addInputRules", context);
243235
+ if (isExtensionRulesEnabled(extension3, editor.options.enableInputRules) && addInputRules)
242888
243236
  inputRules.push(...addInputRules());
242889
- const addPmPlugins = getExtensionConfigField(extension2, "addPmPlugins", context);
243237
+ const addPmPlugins = getExtensionConfigField(extension3, "addPmPlugins", context);
242890
243238
  if (addPmPlugins)
242891
243239
  plugins.push(...addPmPlugins());
242892
243240
  return plugins;
@@ -242898,14 +243246,14 @@ var Node$13 = class Node$14 {
242898
243246
  }
242899
243247
  get nodeViews() {
242900
243248
  const { editor } = this;
242901
- const entries2 = this.extensions.filter((e) => e.type === "node").filter((extension2) => !!getExtensionConfigField(extension2, "addNodeView")).map((extension2) => {
242902
- const extensionAttrs = this.attributes.filter((a2) => a2.type === extension2.name);
242903
- const addNodeView = getExtensionConfigField(extension2, "addNodeView", {
242904
- name: extension2.name,
242905
- options: extension2.options,
242906
- storage: extension2.storage,
243249
+ const entries2 = this.extensions.filter((e) => e.type === "node").filter((extension3) => !!getExtensionConfigField(extension3, "addNodeView")).map((extension3) => {
243250
+ const extensionAttrs = this.attributes.filter((a2) => a2.type === extension3.name);
243251
+ const addNodeView = getExtensionConfigField(extension3, "addNodeView", {
243252
+ name: extension3.name,
243253
+ options: extension3.options,
243254
+ storage: extension3.storage,
242907
243255
  editor,
242908
- type: getNodeType(extension2.name, this.schema)
243256
+ type: getNodeType(extension3.name, this.schema)
242909
243257
  });
242910
243258
  if (!addNodeView)
242911
243259
  return null;
@@ -242919,47 +243267,47 @@ var Node$13 = class Node$14 {
242919
243267
  getPos,
242920
243268
  decorations,
242921
243269
  htmlAttributes: Attribute2.getAttributesToRender(node3, extensionAttrs),
242922
- extension: extension2,
243270
+ extension: extension3,
242923
243271
  extensionAttrs
242924
243272
  });
242925
243273
  };
242926
- return [extension2.name, nodeview];
243274
+ return [extension3.name, nodeview];
242927
243275
  }).filter(Boolean);
242928
243276
  return Object.fromEntries(entries2);
242929
243277
  }
242930
243278
  #setupExtensions() {
242931
- for (const extension2 of this.extensions) {
242932
- this.editor.extensionStorage[extension2.name] = extension2.storage;
243279
+ for (const extension3 of this.extensions) {
243280
+ this.editor.extensionStorage[extension3.name] = extension3.storage;
242933
243281
  const context = {
242934
- name: extension2.name,
242935
- options: extension2.options,
242936
- storage: extension2.storage,
243282
+ name: extension3.name,
243283
+ options: extension3.options,
243284
+ storage: extension3.storage,
242937
243285
  editor: this.editor,
242938
- type: getSchemaTypeByName(extension2.name, this.schema)
243286
+ type: getSchemaTypeByName(extension3.name, this.schema)
242939
243287
  };
242940
- if (extension2.type === "mark") {
242941
- if (callOrGet(getExtensionConfigField(extension2, "keepOnSplit", context)) ?? true)
242942
- this.splittableMarks.push(extension2.name);
243288
+ if (extension3.type === "mark") {
243289
+ if (callOrGet(getExtensionConfigField(extension3, "keepOnSplit", context)) ?? true)
243290
+ this.splittableMarks.push(extension3.name);
242943
243291
  }
242944
- this.#attachEditorEvents(extension2);
243292
+ this.#attachEditorEvents(extension3);
242945
243293
  }
242946
243294
  }
242947
- #attachEditorEvents(extension2) {
243295
+ #attachEditorEvents(extension3) {
242948
243296
  const context = {
242949
- name: extension2.name,
242950
- options: extension2.options,
242951
- storage: extension2.storage,
243297
+ name: extension3.name,
243298
+ options: extension3.options,
243299
+ storage: extension3.storage,
242952
243300
  editor: this.editor,
242953
- type: getSchemaTypeByName(extension2.name, this.schema)
242954
- };
242955
- const onBeforeCreate = getExtensionConfigField(extension2, "onBeforeCreate", context);
242956
- const onCreate2 = getExtensionConfigField(extension2, "onCreate", context);
242957
- const onUpdate = getExtensionConfigField(extension2, "onUpdate", context);
242958
- const onSelectionUpdate = getExtensionConfigField(extension2, "onSelectionUpdate", context);
242959
- const onTransaction = getExtensionConfigField(extension2, "onTransaction", context);
242960
- const onFocus = getExtensionConfigField(extension2, "onFocus", context);
242961
- const onBlur = getExtensionConfigField(extension2, "onBlur", context);
242962
- const onDestroy2 = getExtensionConfigField(extension2, "onDestroy", context);
243301
+ type: getSchemaTypeByName(extension3.name, this.schema)
243302
+ };
243303
+ const onBeforeCreate = getExtensionConfigField(extension3, "onBeforeCreate", context);
243304
+ const onCreate2 = getExtensionConfigField(extension3, "onCreate", context);
243305
+ const onUpdate = getExtensionConfigField(extension3, "onUpdate", context);
243306
+ const onSelectionUpdate = getExtensionConfigField(extension3, "onSelectionUpdate", context);
243307
+ const onTransaction = getExtensionConfigField(extension3, "onTransaction", context);
243308
+ const onFocus = getExtensionConfigField(extension3, "onFocus", context);
243309
+ const onBlur = getExtensionConfigField(extension3, "onBlur", context);
243310
+ const onDestroy2 = getExtensionConfigField(extension3, "onDestroy", context);
242963
243311
  if (onBeforeCreate)
242964
243312
  this.editor.on("beforeCreate", onBeforeCreate);
242965
243313
  if (onCreate2)
@@ -243317,7 +243665,7 @@ var Node$13 = class Node$14 {
243317
243665
  domAvailabilityCache = false;
243318
243666
  return false;
243319
243667
  }
243320
- }, summaryVersion = "1.23.0", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
243668
+ }, summaryVersion = "1.23.1", nodeKeys, markKeys, transformListsInCopiedContent = (html3) => {
243321
243669
  const container = document.createElement("div");
243322
243670
  container.innerHTML = html3;
243323
243671
  const result = [];
@@ -243642,16 +243990,16 @@ var Node$13 = class Node$14 {
243642
243990
  console.warn("Failed to initialize developer tools:", error3);
243643
243991
  }
243644
243992
  }
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) => {
243646
- const extensionLike = extension2;
243993
+ }, BLANK_DOCX_BASE64 = `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`, BLANK_DOCX_DATA_URI, TAB_LEADER_TO_SEPARATOR, SEPARATOR_TO_TAB_LEADER, DEFAULT_TOC_CONFIG, SWITCH_PATTERN$1, BULLET_FORMATS$1, LOCK_MODE_TO_SDT_LOCK, SNIPPET_PADDING = 30, DUAL_KIND_TYPES, KNOWN_BLOCK_PM_NODE_TYPES, KNOWN_INLINE_PM_NODE_TYPES, MAX_PATTERN_LENGTH = 1024, TOGGLE_MARK_SPECS, CORE_MARK_NAMES, METADATA_MARK_NAMES, CSS_NAMED_COLORS, V3_PREFIX = "text:", V4_PREFIX = "text:v4:", HEADING_STYLE_DEPTH, BULLET_FORMATS, MARK_PRIORITY, remarkProcessor, DEFAULT_UNFLATTEN_LISTS = true, HEADING_STYLE_PATTERN, REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, BOOLEAN_INLINE_MARK_KEYS, TEXT_STYLE_KEYS, PRESERVE_RUN_PROPERTIES_META_KEY = "sdPreserveRunPropertiesKeys", CONTENT_CAPABILITIES, INLINE_CAPABILITIES, SDT_LOCK_TO_LOCK_MODE, BODY_LOCATOR2, STUB_WHERE, EMPTY_RESOLUTION, CONTAINER_NODE_TYPES, VALID_EDGE_NODE_TYPES3, FALLBACK_STORE_KEY = "__documentApiComments", STYLES_PART = "word/styles.xml", PROPERTIES_KEY_BY_CHANNEL, XML_PATH_BY_CHANNEL2, UNDERLINE_API_TO_STORAGE, UNDERLINE_STORAGE_TO_API, HEX_SUBKEYS_BY_PROPERTY, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, INDENT_PER_LEVEL_TWIPS = 720, HANGING_INDENT_TWIPS = 360, ORDERED_PRESET_CONFIG, BULLET_PRESET_CONFIG, PRESET_TEMPLATES, LevelFormattingHelpers, PRESET_KIND_MAP, NUMBERING_PART = "word/numbering.xml", DEFAULT_PRESET_FOR_KIND, _setValueDelegate, PREVIEW_TEXT_MAX_LENGTH = 2000, BLOCK_PREVIEW_MAX_LENGTH = 200, EDGE_NODE_TYPES$1, POINTS_TO_PIXELS, POINTS_TO_TWIPS = 20, PIXELS_TO_TWIPS, DEFAULT_TABLE_GRID_WIDTH_TWIPS = 1500, SETTINGS_PART$1 = "word/settings.xml", WORD_DEFAULT_TBL_LOOK, FLAG_TO_OOXML_KEY, INVERTED_FLAGS, XML_KEY_TO_STYLE_OPTION, CLEARED_BORDER_OOXML, TABLE_MARGIN_KEY_GROUPS, TABLE_ADAPTER_DISPATCH, ROW_TARGETED_TABLE_OPS, registered = false, STYLES_PART_ID = "word/styles.xml", stylesPartDescriptor, settingsPartDescriptor, RELS_PART_ID2 = "word/_rels/document.xml.rels", RELS_XMLNS2 = "http://schemas.openxmlformats.org/package/2006/relationships", HEADER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE$1 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", relsPartDescriptor, HISTORY_UNSAFE_OPS, CANONICAL_COMMENT_IGNORED_KEYS, INITIAL_HASH, ROUND_CONSTANTS, V1_COVERAGE, V2_COVERAGE, SNAPSHOT_VERSION_V2 = "sd-diff-snapshot/v2", PAYLOAD_VERSION_V1 = "sd-diff-payload/v1", PAYLOAD_VERSION_V2 = "sd-diff-payload/v2", ENGINE_ID = "super-editor", STAGED_CONVERTER_KEYS, DiffServiceError, DEFAULT_LEVEL = 1, SWITCH_PATTERN, TOC_BOOKMARK_PREFIX = "_Toc", DEFAULT_RIGHT_TAB_POS = 9350, TAB_LEADER_MAP, NO_ENTRIES_PLACEHOLDER, TC_LEVEL_MIN = 1, TC_LEVEL_MAX = 9, ALLOWED_WRAP_ATTRS, WRAP_TYPES_SUPPORTING_SIDE, WRAP_TYPES_SUPPORTING_DISTANCES, RELATIVE_HEIGHT_MIN = 0, RELATIVE_HEIGHT_MAX = 4294967295, FORBIDDEN_RAW_PATCH_NAMES, CONTROL_TYPE_SDT_PR_ELEMENTS, DEFAULT_CHECKBOX_SYMBOL_FONT2 = "MS Gothic", DEFAULT_CHECKBOX_CHECKED_HEX2 = "2612", DEFAULT_CHECKBOX_UNCHECKED_HEX2 = "2610", VARIANT_ORDER, KIND_ORDER, HEADER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", FOOTER_RELATIONSHIP_TYPE3 = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", DOCUMENT_RELS_PATH2 = "word/_rels/document.xml.rels", HEADER_FILE_PATTERN2, FOOTER_FILE_PATTERN2, SETTINGS_PART, SPECIAL_NOTE_TYPES, RESTART_POLICY_TO_OOXML, VALID_DISPLAYS, REFERENCE_BLOCK_PREFIX, CAPTION_STYLE_NAMES, CAPTION_PARAGRAPH_STYLE_ID = "Caption", CAPTION_FORMAT_TO_OOXML, DOCUMENT_STAT_FIELD_TYPES, TOA_LEADER_REVERSE_MAP, EDGE_NODE_TYPES, CONTENT_TYPES_PART_ID = "[Content_Types].xml", CONTENT_TYPES_NS = "http://schemas.openxmlformats.org/package/2006/content-types", contentTypesPartDescriptor, empty_exports, init_empty, CURRENT_APP_VERSION2 = "1.23.1", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension3) => {
243994
+ const extensionLike = extension3;
243647
243995
  const config2 = extensionLike?.config;
243648
243996
  const ExtensionCtor = extensionLike?.constructor;
243649
243997
  if (!config2 || typeof config2 !== "object" || typeof ExtensionCtor !== "function")
243650
- return extension2;
243998
+ return extension3;
243651
243999
  try {
243652
244000
  return new ExtensionCtor(config2);
243653
244001
  } catch {
243654
- return extension2;
244002
+ return extension3;
243655
244003
  }
243656
244004
  }, Editor, token = (varName, fallback) => ({
243657
244005
  css: `var(${varName}, ${fallback})`,
@@ -244293,6 +244641,559 @@ var Node$13 = class Node$14 {
244293
244641
  annotation.style.position = "relative";
244294
244642
  annotation.appendChild(caretAnchor);
244295
244643
  }
244644
+ }, PROOFING_CSS, splitOriginMap, PresentationProofingDecorator = class {
244645
+ #container = null;
244646
+ setContainer(container) {
244647
+ this.#container = container;
244648
+ }
244649
+ applyAnnotations(annotations) {
244650
+ const container = this.#container;
244651
+ if (!container)
244652
+ return false;
244653
+ if (!annotations || annotations.length === 0)
244654
+ return clearProofingDecorations(container);
244655
+ return applyProofingDecorations(container, annotations);
244656
+ }
244657
+ clear() {
244658
+ const container = this.#container;
244659
+ if (!container)
244660
+ return false;
244661
+ return clearProofingDecorations(container);
244662
+ }
244663
+ }, PresentationPostPaintPipeline = class {
244664
+ #fieldAnnotationLayer;
244665
+ #commentHighlightDecorator;
244666
+ #decorationBridge;
244667
+ #proofingDecorator;
244668
+ constructor(deps = {}) {
244669
+ this.#fieldAnnotationLayer = deps.fieldAnnotationLayer ?? new FieldAnnotationInteractionLayer;
244670
+ this.#commentHighlightDecorator = deps.commentHighlightDecorator ?? new CommentHighlightDecorator;
244671
+ this.#decorationBridge = deps.decorationBridge ?? new DecorationBridge;
244672
+ this.#proofingDecorator = deps.proofingDecorator ?? new PresentationProofingDecorator;
244673
+ }
244674
+ setContainer(container) {
244675
+ this.#fieldAnnotationLayer.setContainer(container);
244676
+ this.#commentHighlightDecorator.setContainer(container);
244677
+ this.#proofingDecorator.setContainer(container);
244678
+ }
244679
+ setActiveComment(commentId) {
244680
+ return this.#commentHighlightDecorator.setActiveComment(commentId);
244681
+ }
244682
+ recordDecorationTransaction(transaction) {
244683
+ this.#decorationBridge.recordTransaction(transaction);
244684
+ }
244685
+ hasDecorationChanges(editorState) {
244686
+ return this.#decorationBridge.hasChanges(editorState);
244687
+ }
244688
+ collectDecorationRanges(editorState) {
244689
+ return this.#decorationBridge.collectDecorationRanges(editorState);
244690
+ }
244691
+ syncDecorations(editorState, domPositionIndex, options) {
244692
+ if (!editorState)
244693
+ return false;
244694
+ return this.#decorationBridge.sync(editorState, domPositionIndex, options);
244695
+ }
244696
+ applyCommentHighlights() {
244697
+ this.#commentHighlightDecorator.apply();
244698
+ }
244699
+ syncInlineStyleLayers(editorState, domPositionIndex) {
244700
+ this.applyCommentHighlights();
244701
+ return this.syncDecorations(editorState, domPositionIndex);
244702
+ }
244703
+ applyProofingAnnotations(annotations, rebuildDomPositionIndex) {
244704
+ const mutated = this.#proofingDecorator.applyAnnotations(annotations);
244705
+ if (mutated)
244706
+ rebuildDomPositionIndex();
244707
+ return mutated;
244708
+ }
244709
+ refreshAfterPaint(options) {
244710
+ this.#fieldAnnotationLayer.apply(options.layoutEpoch);
244711
+ options.rebuildDomPositionIndex();
244712
+ this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
244713
+ this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
244714
+ options.reapplyStructuredContentHover?.();
244715
+ }
244716
+ destroy() {
244717
+ this.#proofingDecorator.clear();
244718
+ this.#fieldAnnotationLayer.clear();
244719
+ this.#commentHighlightDecorator.destroy();
244720
+ this.#decorationBridge.destroy();
244721
+ }
244722
+ }, ProofingStore = class {
244723
+ #issuesBySegment = /* @__PURE__ */ new Map;
244724
+ addIssue(issue) {
244725
+ const list5 = this.#issuesBySegment.get(issue.segmentId);
244726
+ if (list5)
244727
+ list5.push(issue);
244728
+ else
244729
+ this.#issuesBySegment.set(issue.segmentId, [issue]);
244730
+ }
244731
+ remapIssues(segmentIds, mapping, recheckId) {
244732
+ for (const id2 of segmentIds) {
244733
+ const list5 = this.#issuesBySegment.get(id2);
244734
+ if (!list5)
244735
+ continue;
244736
+ const surviving = [];
244737
+ for (const issue of list5) {
244738
+ const fromResult = mapping.mapResult(issue.pmFrom, -1);
244739
+ const toResult2 = mapping.mapResult(issue.pmTo, 1);
244740
+ if (fromResult.deleted || toResult2.deleted)
244741
+ continue;
244742
+ if (fromResult.pos >= toResult2.pos)
244743
+ continue;
244744
+ issue.pmFrom = fromResult.pos;
244745
+ issue.pmTo = toResult2.pos;
244746
+ issue.state = "mapped";
244747
+ issue.recheckId = recheckId;
244748
+ surviving.push(issue);
244749
+ }
244750
+ if (surviving.length > 0)
244751
+ this.#issuesBySegment.set(id2, surviving);
244752
+ else
244753
+ this.#issuesBySegment.delete(id2);
244754
+ }
244755
+ }
244756
+ replaceBatchResults(recheckIds, coveredSegmentIds, freshIssues) {
244757
+ for (const segId of coveredSegmentIds) {
244758
+ const list5 = this.#issuesBySegment.get(segId);
244759
+ if (!list5)
244760
+ continue;
244761
+ const filtered = list5.filter((issue) => issue.recheckId === null || !recheckIds.has(issue.recheckId));
244762
+ if (filtered.length > 0)
244763
+ this.#issuesBySegment.set(segId, filtered);
244764
+ else
244765
+ this.#issuesBySegment.delete(segId);
244766
+ }
244767
+ for (const issue of freshIssues)
244768
+ this.addIssue(issue);
244769
+ }
244770
+ removeBySegmentIds(ids) {
244771
+ for (const id2 of ids)
244772
+ this.#issuesBySegment.delete(id2);
244773
+ }
244774
+ removeOrphanedSegments(currentSegmentIds) {
244775
+ for (const segId of this.#issuesBySegment.keys())
244776
+ if (!currentSegmentIds.has(segId))
244777
+ this.#issuesBySegment.delete(segId);
244778
+ }
244779
+ clear() {
244780
+ this.#issuesBySegment.clear();
244781
+ }
244782
+ getAllIssues() {
244783
+ const result = [];
244784
+ for (const list5 of this.#issuesBySegment.values())
244785
+ result.push(...list5);
244786
+ return result;
244787
+ }
244788
+ getDisplayIssues(ignoredWords) {
244789
+ const normalizedIgnored = new Set(ignoredWords.map((w) => w.normalize("NFC").toLowerCase()));
244790
+ const result = [];
244791
+ for (const list5 of this.#issuesBySegment.values())
244792
+ for (const issue of list5) {
244793
+ if (issue.kind !== "spelling")
244794
+ continue;
244795
+ if (isSuppressed(issue, normalizedIgnored))
244796
+ continue;
244797
+ result.push(issue);
244798
+ }
244799
+ return result;
244800
+ }
244801
+ getActiveRecheckIds() {
244802
+ const ids = /* @__PURE__ */ new Set;
244803
+ for (const list5 of this.#issuesBySegment.values())
244804
+ for (const issue of list5)
244805
+ if (issue.state === "mapped" && issue.recheckId !== null)
244806
+ ids.add(issue.recheckId);
244807
+ return ids;
244808
+ }
244809
+ get isEmpty() {
244810
+ return this.#issuesBySegment.size === 0;
244811
+ }
244812
+ get size() {
244813
+ let count2 = 0;
244814
+ for (const list5 of this.#issuesBySegment.values())
244815
+ count2 += list5.length;
244816
+ return count2;
244817
+ }
244818
+ }, 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 {
244819
+ #config;
244820
+ #provider = null;
244821
+ #capabilities = null;
244822
+ #status = "disabled";
244823
+ #store = new ProofingStore;
244824
+ #offsetMaps = /* @__PURE__ */ new Map;
244825
+ #segmentHashes = /* @__PURE__ */ new Map;
244826
+ #debounceTimer = null;
244827
+ #pendingAbortControllers = /* @__PURE__ */ new Set;
244828
+ #inFlightCount = 0;
244829
+ #documentEpoch = 0;
244830
+ #disposed = false;
244831
+ #pendingSegments = [];
244832
+ #nextRecheckId = 0;
244833
+ #isComposing = false;
244834
+ #lastCheckFiredAt = 0;
244835
+ #visibilitySource = null;
244836
+ #documentId = null;
244837
+ #pageResolver = null;
244838
+ #lastDoc = null;
244839
+ #lastSegments = [];
244840
+ constructor(config2 = {}) {
244841
+ this.onResultsChanged = null;
244842
+ this.#config = {
244843
+ enabled: config2.enabled ?? false,
244844
+ debounceMs: config2.debounceMs ?? DEFAULT_DEBOUNCE_MS,
244845
+ maxSuggestions: config2.maxSuggestions ?? DEFAULT_MAX_SUGGESTIONS,
244846
+ visibleFirst: config2.visibleFirst ?? true,
244847
+ allowIgnoreWord: config2.allowIgnoreWord ?? true,
244848
+ defaultLanguage: config2.defaultLanguage ?? null,
244849
+ ignoredWords: config2.ignoredWords ?? [],
244850
+ timeoutMs: config2.timeoutMs ?? DEFAULT_TIMEOUT_MS,
244851
+ maxConcurrentRequests: config2.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT,
244852
+ maxSegmentsPerBatch: config2.maxSegmentsPerBatch ?? DEFAULT_MAX_SEGMENTS_PER_BATCH,
244853
+ onProofingError: config2.onProofingError ?? null,
244854
+ onStatusChange: config2.onStatusChange ?? null
244855
+ };
244856
+ if (config2.provider)
244857
+ this.#provider = config2.provider;
244858
+ if (this.#config.enabled && this.#provider)
244859
+ this.#setStatus("idle");
244860
+ }
244861
+ get status() {
244862
+ return this.#status;
244863
+ }
244864
+ get isEnabled() {
244865
+ return this.#config.enabled && this.#provider !== null;
244866
+ }
244867
+ get config() {
244868
+ return this.#config;
244869
+ }
244870
+ setVisibilitySource(source) {
244871
+ this.#visibilitySource = source;
244872
+ }
244873
+ setDocumentId(id2) {
244874
+ this.#documentId = id2;
244875
+ }
244876
+ setPageResolver(resolver2) {
244877
+ this.#pageResolver = resolver2;
244878
+ }
244879
+ setComposing(composing) {
244880
+ this.#isComposing = composing;
244881
+ if (!composing && this.#lastSegments.length > 0 && this.isEnabled)
244882
+ this.#scheduleDebouncedCheck(this.#lastSegments);
244883
+ }
244884
+ getPaintSlices(activeWordRange) {
244885
+ if (!this.isEnabled)
244886
+ return [];
244887
+ const slices = buildPaintSlices(this.#store.getDisplayIssues(this.#config.ignoredWords));
244888
+ if (!activeWordRange)
244889
+ return slices;
244890
+ return slices.filter((s2) => s2.pmTo <= activeWordRange.from || s2.pmFrom >= activeWordRange.to);
244891
+ }
244892
+ getIssueAtPosition(pmPos, activeWordRange) {
244893
+ return findSliceAtPosition(this.getPaintSlices(activeWordRange), pmPos)?.issue ?? null;
244894
+ }
244895
+ updateConfig(patch3, doc$12) {
244896
+ const prevEnabled = this.#config.enabled;
244897
+ const prevProvider = this.#provider;
244898
+ const needsRecheck = patch3.provider !== undefined || patch3.defaultLanguage !== undefined;
244899
+ if (patch3.debounceMs !== undefined)
244900
+ this.#config.debounceMs = patch3.debounceMs;
244901
+ if (patch3.maxSuggestions !== undefined)
244902
+ this.#config.maxSuggestions = patch3.maxSuggestions;
244903
+ if (patch3.visibleFirst !== undefined)
244904
+ this.#config.visibleFirst = patch3.visibleFirst;
244905
+ if (patch3.allowIgnoreWord !== undefined)
244906
+ this.#config.allowIgnoreWord = patch3.allowIgnoreWord;
244907
+ if (patch3.timeoutMs !== undefined)
244908
+ this.#config.timeoutMs = patch3.timeoutMs;
244909
+ if (patch3.maxConcurrentRequests !== undefined)
244910
+ this.#config.maxConcurrentRequests = patch3.maxConcurrentRequests;
244911
+ if (patch3.maxSegmentsPerBatch !== undefined)
244912
+ this.#config.maxSegmentsPerBatch = patch3.maxSegmentsPerBatch;
244913
+ if (patch3.onProofingError !== undefined)
244914
+ this.#config.onProofingError = patch3.onProofingError ?? null;
244915
+ if (patch3.onStatusChange !== undefined)
244916
+ this.#config.onStatusChange = patch3.onStatusChange ?? null;
244917
+ if (patch3.defaultLanguage !== undefined)
244918
+ this.#config.defaultLanguage = patch3.defaultLanguage ?? null;
244919
+ if (patch3.ignoredWords !== undefined) {
244920
+ this.#config.ignoredWords = patch3.ignoredWords ?? [];
244921
+ this.onResultsChanged?.();
244922
+ }
244923
+ if (patch3.provider !== undefined) {
244924
+ if (prevProvider && prevProvider !== patch3.provider)
244925
+ prevProvider.dispose?.();
244926
+ this.#provider = patch3.provider ?? null;
244927
+ this.#capabilities = null;
244928
+ }
244929
+ if (patch3.enabled !== undefined) {
244930
+ this.#config.enabled = patch3.enabled;
244931
+ if (!patch3.enabled) {
244932
+ this.#cancelAll();
244933
+ this.#store.clear();
244934
+ this.#segmentHashes.clear();
244935
+ this.#offsetMaps.clear();
244936
+ this.#setStatus("disabled");
244937
+ this.onResultsChanged?.();
244938
+ return;
244939
+ }
244940
+ if (patch3.enabled && !prevEnabled && doc$12) {
244941
+ this.#setStatus("idle");
244942
+ this.#scheduleFullCheck(doc$12);
244943
+ return;
244944
+ }
244945
+ }
244946
+ if (needsRecheck && this.isEnabled && doc$12) {
244947
+ this.#cancelAll();
244948
+ this.#documentEpoch++;
244949
+ this.#store.clear();
244950
+ this.#segmentHashes.clear();
244951
+ this.onResultsChanged?.();
244952
+ this.#scheduleFullCheck(doc$12);
244953
+ }
244954
+ }
244955
+ onDocumentChanged(doc$12, changedRanges, mapping) {
244956
+ if (!this.isEnabled)
244957
+ return;
244958
+ this.#documentEpoch++;
244959
+ this.#lastDoc = doc$12;
244960
+ const { segments, offsetMaps, segmentPositions } = extractSegmentsWithMaps(doc$12, this.#config.defaultLanguage, this.#pageResolver ?? undefined);
244961
+ this.#lastSegments = segments;
244962
+ this.#offsetMaps = offsetMaps;
244963
+ const dirtyIds = computeDirtySegmentIds(segments, segmentPositions, changedRanges);
244964
+ for (const id2 of dirtyIds)
244965
+ this.#segmentHashes.delete(id2);
244966
+ if (dirtyIds.size > 0) {
244967
+ const recheckId = this.#nextRecheckId++;
244968
+ this.#store.remapIssues(dirtyIds, mapping, recheckId);
244969
+ this.#store.removeOrphanedSegments(new Set(segments.map((s2) => s2.id)));
244970
+ }
244971
+ this.#scheduleDebouncedCheck(segments);
244972
+ }
244973
+ runInitialCheck(doc$12) {
244974
+ if (!this.isEnabled)
244975
+ return;
244976
+ this.#scheduleFullCheck(doc$12);
244977
+ }
244978
+ ignoreWord(word$1) {
244979
+ const normalized = word$1.normalize("NFC").toLowerCase();
244980
+ if (!this.#config.ignoredWords.includes(normalized)) {
244981
+ this.#config.ignoredWords = [...this.#config.ignoredWords, normalized];
244982
+ this.onResultsChanged?.();
244983
+ }
244984
+ }
244985
+ removeIgnoredWord(word$1) {
244986
+ const normalized = word$1.normalize("NFC").toLowerCase();
244987
+ this.#config.ignoredWords = this.#config.ignoredWords.filter((w) => w !== normalized);
244988
+ this.onResultsChanged?.();
244989
+ }
244990
+ dispose() {
244991
+ this.#disposed = true;
244992
+ this.#cancelAll();
244993
+ this.#store.clear();
244994
+ this.#offsetMaps.clear();
244995
+ this.#segmentHashes.clear();
244996
+ this.#lastDoc = null;
244997
+ this.#lastSegments = [];
244998
+ this.#pendingSegments = [];
244999
+ this.#provider?.dispose?.();
245000
+ this.#provider = null;
245001
+ this.#setStatus("disabled");
245002
+ }
245003
+ #scheduleFullCheck(doc$12) {
245004
+ this.#lastDoc = doc$12;
245005
+ const { segments, offsetMaps } = extractSegmentsWithMaps(doc$12, this.#config.defaultLanguage, this.#pageResolver ?? undefined);
245006
+ this.#lastSegments = segments;
245007
+ this.#offsetMaps = offsetMaps;
245008
+ this.#segmentHashes.clear();
245009
+ this.#store.clear();
245010
+ this.#scheduleDebouncedCheck(segments);
245011
+ }
245012
+ #scheduleDebouncedCheck(segments) {
245013
+ if (this.#isComposing)
245014
+ return;
245015
+ if (this.#debounceTimer !== null)
245016
+ clearTimeout(this.#debounceTimer);
245017
+ const msSinceLastCheck = Date.now() - this.#lastCheckFiredAt;
245018
+ if (this.#lastCheckFiredAt > 0 && msSinceLastCheck >= DEFAULT_MAX_WAIT_MS)
245019
+ this.#fireCheck(segments);
245020
+ else
245021
+ this.#debounceTimer = setTimeout(() => {
245022
+ this.#debounceTimer = null;
245023
+ this.#fireCheck(segments);
245024
+ }, this.#config.debounceMs);
245025
+ }
245026
+ #fireCheck(segments) {
245027
+ this.#lastCheckFiredAt = Date.now();
245028
+ this.#runCheck(segments);
245029
+ }
245030
+ async#runCheck(segments) {
245031
+ if (this.#disposed || !this.#provider)
245032
+ return;
245033
+ if (!this.#capabilities && this.#provider.getCapabilities)
245034
+ try {
245035
+ this.#capabilities = await this.#provider.getCapabilities();
245036
+ } catch {}
245037
+ const unchecked = segments.filter((seg) => {
245038
+ const hash$3 = hashSegmentText(seg.text);
245039
+ return this.#segmentHashes.get(seg.id) !== hash$3;
245040
+ });
245041
+ if (unchecked.length === 0) {
245042
+ this.#setStatus("idle");
245043
+ return;
245044
+ }
245045
+ const activeRecheckIds = this.#store.getActiveRecheckIds();
245046
+ const ordered = this.#config.visibleFirst && this.#visibilitySource ? prioritizeByVisibility(unchecked, this.#visibilitySource) : unchecked;
245047
+ const batches = this.#batchSegments(ordered);
245048
+ const epoch = this.#documentEpoch;
245049
+ this.#pendingSegments = [];
245050
+ for (let i4 = 0;i4 < batches.length; i4++) {
245051
+ if (this.#disposed || epoch !== this.#documentEpoch)
245052
+ return;
245053
+ if (this.#inFlightCount >= this.#config.maxConcurrentRequests) {
245054
+ for (let j = i4;j < batches.length; j++)
245055
+ this.#pendingSegments.push(...batches[j]);
245056
+ break;
245057
+ }
245058
+ this.#sendBatch(batches[i4], epoch, activeRecheckIds);
245059
+ }
245060
+ }
245061
+ async#sendBatch(segments, epoch, recheckIds) {
245062
+ if (!this.#provider || this.#disposed)
245063
+ return;
245064
+ const controller = new AbortController;
245065
+ this.#pendingAbortControllers.add(controller);
245066
+ this.#inFlightCount++;
245067
+ this.#setStatus("checking");
245068
+ const timeoutId = setTimeout(() => controller.abort(), this.#config.timeoutMs);
245069
+ const request = {
245070
+ documentId: this.#documentId,
245071
+ defaultLanguage: this.#config.defaultLanguage,
245072
+ maxSuggestions: this.#config.maxSuggestions,
245073
+ segments,
245074
+ signal: controller.signal
245075
+ };
245076
+ try {
245077
+ const result = await this.#provider.check(request);
245078
+ clearTimeout(timeoutId);
245079
+ if (!this.#pendingAbortControllers.delete(controller))
245080
+ return;
245081
+ this.#inFlightCount--;
245082
+ if (epoch !== this.#documentEpoch || this.#disposed) {
245083
+ this.#drainPendingSegments();
245084
+ return;
245085
+ }
245086
+ const validSegmentIds = new Set(segments.map((s2) => s2.id));
245087
+ const segmentTextMap = new Map(segments.map((s2) => [s2.id, s2]));
245088
+ const freshIssues = [];
245089
+ for (const issue of result.issues) {
245090
+ if (!this.#validateIssue(issue, validSegmentIds, segmentTextMap))
245091
+ continue;
245092
+ const offsetMap = this.#offsetMaps.get(issue.segmentId);
245093
+ if (!offsetMap)
245094
+ continue;
245095
+ const resolved = resolveIssuePmRangeFromSlices(issue, offsetMap.slices);
245096
+ if (!resolved)
245097
+ continue;
245098
+ const segment = segmentTextMap.get(issue.segmentId);
245099
+ const storedIssue = {
245100
+ ...resolved,
245101
+ state: "confirmed",
245102
+ recheckId: null
245103
+ };
245104
+ if (segment)
245105
+ storedIssue.word = segment.text.slice(issue.start, issue.end);
245106
+ freshIssues.push(storedIssue);
245107
+ }
245108
+ this.#store.replaceBatchResults(recheckIds, validSegmentIds, freshIssues);
245109
+ for (const seg of segments)
245110
+ this.#segmentHashes.set(seg.id, hashSegmentText(seg.text));
245111
+ this.#setStatus(this.#inFlightCount > 0 ? "checking" : "idle");
245112
+ this.onResultsChanged?.();
245113
+ this.#schedulePendingSegments(epoch, recheckIds);
245114
+ } catch (err) {
245115
+ clearTimeout(timeoutId);
245116
+ if (!this.#pendingAbortControllers.delete(controller))
245117
+ return;
245118
+ this.#inFlightCount--;
245119
+ if (this.#disposed)
245120
+ return;
245121
+ if (epoch !== this.#documentEpoch) {
245122
+ this.#drainPendingSegments();
245123
+ return;
245124
+ }
245125
+ const isTimeout = controller.signal.aborted;
245126
+ const proofingError = {
245127
+ kind: isTimeout ? "timeout" : "provider-error",
245128
+ message: isTimeout ? "Provider request timed out" : String(err),
245129
+ segmentIds: segments.map((s2) => s2.id),
245130
+ cause: err
245131
+ };
245132
+ this.#config.onProofingError?.(proofingError);
245133
+ this.#setStatus(this.#inFlightCount > 0 ? "checking" : "degraded");
245134
+ this.#schedulePendingSegments(epoch, recheckIds);
245135
+ }
245136
+ }
245137
+ #schedulePendingSegments(epoch, recheckIds) {
245138
+ if (this.#disposed || epoch !== this.#documentEpoch)
245139
+ return;
245140
+ if (this.#pendingSegments.length === 0)
245141
+ return;
245142
+ if (this.#inFlightCount >= this.#config.maxConcurrentRequests)
245143
+ return;
245144
+ const nextBatch = this.#pendingSegments.splice(0, this.#config.maxSegmentsPerBatch);
245145
+ if (nextBatch.length > 0)
245146
+ this.#sendBatch(nextBatch, epoch, recheckIds);
245147
+ }
245148
+ #drainPendingSegments() {
245149
+ if (this.#disposed || this.#pendingSegments.length === 0)
245150
+ return;
245151
+ this.#schedulePendingSegments(this.#documentEpoch, this.#store.getActiveRecheckIds());
245152
+ }
245153
+ #validateIssue(issue, validSegmentIds, segmentTextMap) {
245154
+ if (!validSegmentIds.has(issue.segmentId)) {
245155
+ this.#reportValidationError(`Unknown segmentId: ${issue.segmentId}`, [issue.segmentId]);
245156
+ return false;
245157
+ }
245158
+ const segment = segmentTextMap.get(issue.segmentId);
245159
+ if (!segment)
245160
+ return false;
245161
+ if (issue.start < 0 || issue.end <= issue.start || issue.end > segment.text.length) {
245162
+ this.#reportValidationError(`Invalid offsets [${issue.start}, ${issue.end}) for segment "${issue.segmentId}" (length ${segment.text.length})`, [issue.segmentId]);
245163
+ return false;
245164
+ }
245165
+ return true;
245166
+ }
245167
+ #reportValidationError(message, segmentIds) {
245168
+ this.#config.onProofingError?.({
245169
+ kind: "validation-error",
245170
+ message,
245171
+ segmentIds
245172
+ });
245173
+ }
245174
+ #batchSegments(segments) {
245175
+ const batches = [];
245176
+ for (let i4 = 0;i4 < segments.length; i4 += this.#config.maxSegmentsPerBatch)
245177
+ batches.push(segments.slice(i4, i4 + this.#config.maxSegmentsPerBatch));
245178
+ return batches;
245179
+ }
245180
+ #cancelAll() {
245181
+ if (this.#debounceTimer !== null) {
245182
+ clearTimeout(this.#debounceTimer);
245183
+ this.#debounceTimer = null;
245184
+ }
245185
+ for (const controller of this.#pendingAbortControllers)
245186
+ controller.abort();
245187
+ this.#pendingAbortControllers.clear();
245188
+ this.#inFlightCount = 0;
245189
+ this.#pendingSegments = [];
245190
+ }
245191
+ #setStatus(status) {
245192
+ if (this.#status !== status) {
245193
+ this.#status = status;
245194
+ this.#config.onStatusChange?.(status);
245195
+ }
245196
+ }
244296
245197
  }, FONT_FAMILY_FALLBACKS2, DEFAULT_GENERIC_FALLBACK2 = "sans-serif", normalizeParts = (value) => (value || "").split(",").map((part) => part.trim()).filter(Boolean), splitOutsideQuotes = (str, delimiter) => {
244297
245198
  if (!str.includes('"') && !str.includes("'"))
244298
245199
  return str.split(delimiter).map((p$12) => p$12.trim()).filter(Boolean);
@@ -247221,7 +248122,7 @@ var Node$13 = class Node$14 {
247221
248122
  if (runToken === "totalPageCount")
247222
248123
  return context.totalPages ? String(context.totalPages) : run2.text ?? "";
247223
248124
  return run2.text ?? "";
247224
- }, PROOFING_CSS, splitOriginMap, createDomPainter = (options) => {
248125
+ }, createDomPainter = (options) => {
247225
248126
  if ((options.blocks ?? []).length !== (options.measures ?? []).length)
247226
248127
  throw new Error("DomPainter requires the same number of blocks and measures");
247227
248128
  const painter = new DomPainter({
@@ -247278,559 +248179,6 @@ var Node$13 = class Node$14 {
247278
248179
  painter.setScrollContainer(el);
247279
248180
  }
247280
248181
  };
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
248182
  }, PresentationPaintIndex = class {
247835
248183
  #snapshot = null;
247836
248184
  #annotationsByPmStart = /* @__PURE__ */ new Map;
@@ -257076,9 +257424,9 @@ var Node$13 = class Node$14 {
257076
257424
  return;
257077
257425
  console.log(...args$1);
257078
257426
  }, 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(() => {
257427
+ var init_src_wLlfPuEU_es = __esm(() => {
257080
257428
  init_rolldown_runtime_B2q5OVn9_es();
257081
- init_SuperConverter_C6rVgqDZ_es();
257429
+ init_SuperConverter_Dyz8lKjn_es();
257082
257430
  init_jszip_ChlR43oI_es();
257083
257431
  init_uuid_qzgm05fK_es();
257084
257432
  init_constants_CIF8yzNk_es();
@@ -258194,7 +258542,7 @@ ${err.toString()}`);
258194
258542
  }
258195
258543
  static valid($pos) {
258196
258544
  let parent = $pos.parent;
258197
- if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos))
258545
+ if (parent.inlineContent || !closedBefore($pos) || !closedAfter($pos))
258198
258546
  return false;
258199
258547
  let override = parent.type.spec.allowGapCursor;
258200
258548
  if (override != null)
@@ -258257,11 +258605,11 @@ ${err.toString()}`);
258257
258605
  addPmPlugins() {
258258
258606
  return [gapCursor()];
258259
258607
  },
258260
- extendNodeSchema(extension2) {
258261
- return { allowGapCursor: callOrGet(getExtensionConfigField(extension2, "allowGapCursor", {
258262
- name: extension2.name,
258263
- options: extension2.options,
258264
- storage: extension2.storage
258608
+ extendNodeSchema(extension3) {
258609
+ return { allowGapCursor: callOrGet(getExtensionConfigField(extension3, "allowGapCursor", {
258610
+ name: extension3.name,
258611
+ options: extension3.options,
258612
+ storage: extension3.storage
258265
258613
  })) ?? null };
258266
258614
  }
258267
258615
  });
@@ -261705,11 +262053,11 @@ ${err.toString()}`);
261705
262053
  })()
261706
262054
  ];
261707
262055
  },
261708
- extendNodeSchema(extension2) {
261709
- return { tableRole: callOrGet(getExtensionConfigField(extension2, "tableRole", {
261710
- name: extension2.name,
261711
- options: extension2.options,
261712
- storage: extension2.storage
262056
+ extendNodeSchema(extension3) {
262057
+ return { tableRole: callOrGet(getExtensionConfigField(extension3, "tableRole", {
262058
+ name: extension3.name,
262059
+ options: extension3.options,
262060
+ storage: extension3.storage
261713
262061
  })) };
261714
262062
  }
261715
262063
  });
@@ -281286,6 +281634,10 @@ function print() { __p += __j.call(arguments, '') }
281286
281634
  pm.classList.remove("view-mode");
281287
281635
  }
281288
281636
  applyEffectiveEditability(this);
281637
+ this.emit("documentModeChange", {
281638
+ editor: this,
281639
+ documentMode: cleanedMode
281640
+ });
281289
281641
  }
281290
281642
  blur() {
281291
281643
  this.view?.dom?.blur();
@@ -281503,11 +281855,11 @@ function print() { __p += __j.call(arguments, '') }
281503
281855
  SelectionHandleExtension
281504
281856
  ];
281505
281857
  const externalExtensions = this.options.externalExtensions || [];
281506
- const allExtensions = [...coreExtensions, ...this.options.extensions].filter((extension2) => {
281507
- const extensionType = typeof extension2?.type === "string" ? extension2.type : undefined;
281858
+ const allExtensions = [...coreExtensions, ...this.options.extensions].filter((extension3) => {
281859
+ const extensionType = typeof extension3?.type === "string" ? extension3.type : undefined;
281508
281860
  return extensionType ? allowedExtensions.includes(extensionType) : false;
281509
- }).map((extension2) => cloneExtensionInstance(extension2));
281510
- const isolatedExternalExtensions = externalExtensions.map((extension2) => cloneExtensionInstance(extension2));
281861
+ }).map((extension3) => cloneExtensionInstance(extension3));
281862
+ const isolatedExternalExtensions = externalExtensions.map((extension3) => cloneExtensionInstance(extension3));
281511
281863
  this.extensionService = ExtensionService.create(allExtensions, isolatedExternalExtensions, this);
281512
281864
  }
281513
281865
  #createCommandService() {
@@ -282564,6 +282916,24 @@ function print() { __p += __j.call(arguments, '') }
282564
282916
  CANONICAL: "canonical",
282565
282917
  DERIVED: "derived"
282566
282918
  };
282919
+ PROOFING_CSS = {
282920
+ SPELLING: "sd-proofing-spelling",
282921
+ GRAMMAR: "sd-proofing-grammar",
282922
+ STYLE: "sd-proofing-style",
282923
+ DATA_ATTR: "data-sd-proofing",
282924
+ SPLIT_ATTR: "data-sd-proofing-split"
282925
+ };
282926
+ splitOriginMap = /* @__PURE__ */ new WeakMap;
282927
+ NON_TEXT_INLINE_NODES = new Set([
282928
+ "fieldAnnotation",
282929
+ "image",
282930
+ "equation",
282931
+ "hardBreak",
282932
+ "lineBreak",
282933
+ "tab",
282934
+ "footnoteReference",
282935
+ "symbol"
282936
+ ]);
282567
282937
  FONT_FAMILY_FALLBACKS2 = Object.freeze({
282568
282938
  swiss: "Arial, sans-serif",
282569
282939
  roman: "Times New Roman, serif",
@@ -286519,24 +286889,6 @@ function print() { __p += __j.call(arguments, '') }
286519
286889
  "path(",
286520
286890
  "rect("
286521
286891
  ];
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
286892
  SINGLE_COLUMN_DEFAULT = {
286541
286893
  count: 1,
286542
286894
  gap: 0
@@ -288171,6 +288523,10 @@ function print() { __p += __j.call(arguments, '') }
288171
288523
  this.#scheduleRerender();
288172
288524
  }
288173
288525
  this.#updatePermissionOverlay();
288526
+ this.emit("documentModeChange", {
288527
+ editor: this.#editor,
288528
+ documentMode: mode
288529
+ });
288174
288530
  }
288175
288531
  #syncDocumentModeClass() {
288176
288532
  if (!this.#visibleHost)
@@ -291641,8 +291997,8 @@ var init_zipper_YmNpPIyc_es = __esm(() => {
291641
291997
 
291642
291998
  // ../../packages/superdoc/dist/super-editor.es.js
291643
291999
  var init_super_editor_es = __esm(() => {
291644
- init_src_DIxjKbQ9_es();
291645
- init_SuperConverter_C6rVgqDZ_es();
292000
+ init_src_wLlfPuEU_es();
292001
+ init_SuperConverter_Dyz8lKjn_es();
291646
292002
  init_jszip_ChlR43oI_es();
291647
292003
  init_xml_js_40FWvL78_es();
291648
292004
  init_constants_CIF8yzNk_es();
@@ -343039,16 +343395,17 @@ var init_operation_params = __esm(() => {
343039
343395
  }
343040
343396
  ],
343041
343397
  "doc.insert": [
343042
- ...TEXT_TARGET_FLAT_PARAMS,
343398
+ ...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN,
343043
343399
  {
343044
343400
  name: "offset",
343045
343401
  kind: "flag",
343046
343402
  type: "number",
343047
- description: "Character offset for insertion (alias for --start/--end with same value)."
343403
+ description: "Character offset for insertion (alias for --start/--end with same value).",
343404
+ agentVisible: false
343048
343405
  }
343049
343406
  ],
343050
- "doc.replace": [...TEXT_TARGET_FLAT_PARAMS],
343051
- "doc.delete": [...TEXT_TARGET_FLAT_PARAMS],
343407
+ "doc.replace": [...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN],
343408
+ "doc.delete": [...TEXT_TARGET_FLAT_PARAMS_AGENT_HIDDEN],
343052
343409
  "doc.styles.apply": [
343053
343410
  {
343054
343411
  name: "target",
@@ -347451,11 +347808,12 @@ var require_braces = __commonJS((exports, module) => {
347451
347808
  module.exports = braces;
347452
347809
  });
347453
347810
 
347454
- // ../../node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/constants.js
347811
+ // ../../node_modules/.pnpm/picomatch@2.3.2/node_modules/picomatch/lib/constants.js
347455
347812
  var require_constants4 = __commonJS((exports, module) => {
347456
347813
  var path2 = __require("path");
347457
347814
  var WIN_SLASH = "\\\\/";
347458
347815
  var WIN_NO_SLASH = `[^${WIN_SLASH}]`;
347816
+ var DEFAULT_MAX_EXTGLOB_RECURSION = 0;
347459
347817
  var DOT_LITERAL = "\\.";
347460
347818
  var PLUS_LITERAL = "\\+";
347461
347819
  var QMARK_LITERAL = "\\?";
@@ -347503,6 +347861,7 @@ var require_constants4 = __commonJS((exports, module) => {
347503
347861
  END_ANCHOR: `(?:[${WIN_SLASH}]|$)`
347504
347862
  };
347505
347863
  var POSIX_REGEX_SOURCE = {
347864
+ __proto__: null,
347506
347865
  alnum: "a-zA-Z0-9",
347507
347866
  alpha: "a-zA-Z",
347508
347867
  ascii: "\\x00-\\x7F",
@@ -347519,6 +347878,7 @@ var require_constants4 = __commonJS((exports, module) => {
347519
347878
  xdigit: "A-Fa-f0-9"
347520
347879
  };
347521
347880
  module.exports = {
347881
+ DEFAULT_MAX_EXTGLOB_RECURSION,
347522
347882
  MAX_LENGTH: 1024 * 64,
347523
347883
  POSIX_REGEX_SOURCE,
347524
347884
  REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g,
@@ -347528,6 +347888,7 @@ var require_constants4 = __commonJS((exports, module) => {
347528
347888
  REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g,
347529
347889
  REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g,
347530
347890
  REPLACEMENTS: {
347891
+ __proto__: null,
347531
347892
  "***": "*",
347532
347893
  "**/**": "**",
347533
347894
  "**/**/**": "**"
@@ -347591,7 +347952,7 @@ var require_constants4 = __commonJS((exports, module) => {
347591
347952
  };
347592
347953
  });
347593
347954
 
347594
- // ../../node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/utils.js
347955
+ // ../../node_modules/.pnpm/picomatch@2.3.2/node_modules/picomatch/lib/utils.js
347595
347956
  var require_utils3 = __commonJS((exports) => {
347596
347957
  var path2 = __require("path");
347597
347958
  var win32 = process.platform === "win32";
@@ -347651,7 +348012,7 @@ var require_utils3 = __commonJS((exports) => {
347651
348012
  };
347652
348013
  });
347653
348014
 
347654
- // ../../node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/scan.js
348015
+ // ../../node_modules/.pnpm/picomatch@2.3.2/node_modules/picomatch/lib/scan.js
347655
348016
  var require_scan = __commonJS((exports, module) => {
347656
348017
  var utils = require_utils3();
347657
348018
  var {
@@ -347966,7 +348327,7 @@ var require_scan = __commonJS((exports, module) => {
347966
348327
  module.exports = scan;
347967
348328
  });
347968
348329
 
347969
- // ../../node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/parse.js
348330
+ // ../../node_modules/.pnpm/picomatch@2.3.2/node_modules/picomatch/lib/parse.js
347970
348331
  var require_parse2 = __commonJS((exports, module) => {
347971
348332
  var constants2 = require_constants4();
347972
348333
  var utils = require_utils3();
@@ -347993,6 +348354,213 @@ var require_parse2 = __commonJS((exports, module) => {
347993
348354
  var syntaxError = (type2, char) => {
347994
348355
  return `Missing ${type2}: "${char}" - use "\\\\${char}" to match literal characters`;
347995
348356
  };
348357
+ var splitTopLevel = (input2) => {
348358
+ const parts = [];
348359
+ let bracket = 0;
348360
+ let paren = 0;
348361
+ let quote2 = 0;
348362
+ let value2 = "";
348363
+ let escaped = false;
348364
+ for (const ch of input2) {
348365
+ if (escaped === true) {
348366
+ value2 += ch;
348367
+ escaped = false;
348368
+ continue;
348369
+ }
348370
+ if (ch === "\\") {
348371
+ value2 += ch;
348372
+ escaped = true;
348373
+ continue;
348374
+ }
348375
+ if (ch === '"') {
348376
+ quote2 = quote2 === 1 ? 0 : 1;
348377
+ value2 += ch;
348378
+ continue;
348379
+ }
348380
+ if (quote2 === 0) {
348381
+ if (ch === "[") {
348382
+ bracket++;
348383
+ } else if (ch === "]" && bracket > 0) {
348384
+ bracket--;
348385
+ } else if (bracket === 0) {
348386
+ if (ch === "(") {
348387
+ paren++;
348388
+ } else if (ch === ")" && paren > 0) {
348389
+ paren--;
348390
+ } else if (ch === "|" && paren === 0) {
348391
+ parts.push(value2);
348392
+ value2 = "";
348393
+ continue;
348394
+ }
348395
+ }
348396
+ }
348397
+ value2 += ch;
348398
+ }
348399
+ parts.push(value2);
348400
+ return parts;
348401
+ };
348402
+ var isPlainBranch = (branch) => {
348403
+ let escaped = false;
348404
+ for (const ch of branch) {
348405
+ if (escaped === true) {
348406
+ escaped = false;
348407
+ continue;
348408
+ }
348409
+ if (ch === "\\") {
348410
+ escaped = true;
348411
+ continue;
348412
+ }
348413
+ if (/[?*+@!()[\]{}]/.test(ch)) {
348414
+ return false;
348415
+ }
348416
+ }
348417
+ return true;
348418
+ };
348419
+ var normalizeSimpleBranch = (branch) => {
348420
+ let value2 = branch.trim();
348421
+ let changed = true;
348422
+ while (changed === true) {
348423
+ changed = false;
348424
+ if (/^@\([^\\()[\]{}|]+\)$/.test(value2)) {
348425
+ value2 = value2.slice(2, -1);
348426
+ changed = true;
348427
+ }
348428
+ }
348429
+ if (!isPlainBranch(value2)) {
348430
+ return;
348431
+ }
348432
+ return value2.replace(/\\(.)/g, "$1");
348433
+ };
348434
+ var hasRepeatedCharPrefixOverlap = (branches) => {
348435
+ const values2 = branches.map(normalizeSimpleBranch).filter(Boolean);
348436
+ for (let i4 = 0;i4 < values2.length; i4++) {
348437
+ for (let j = i4 + 1;j < values2.length; j++) {
348438
+ const a2 = values2[i4];
348439
+ const b2 = values2[j];
348440
+ const char = a2[0];
348441
+ if (!char || a2 !== char.repeat(a2.length) || b2 !== char.repeat(b2.length)) {
348442
+ continue;
348443
+ }
348444
+ if (a2 === b2 || a2.startsWith(b2) || b2.startsWith(a2)) {
348445
+ return true;
348446
+ }
348447
+ }
348448
+ }
348449
+ return false;
348450
+ };
348451
+ var parseRepeatedExtglob = (pattern, requireEnd = true) => {
348452
+ if (pattern[0] !== "+" && pattern[0] !== "*" || pattern[1] !== "(") {
348453
+ return;
348454
+ }
348455
+ let bracket = 0;
348456
+ let paren = 0;
348457
+ let quote2 = 0;
348458
+ let escaped = false;
348459
+ for (let i4 = 1;i4 < pattern.length; i4++) {
348460
+ const ch = pattern[i4];
348461
+ if (escaped === true) {
348462
+ escaped = false;
348463
+ continue;
348464
+ }
348465
+ if (ch === "\\") {
348466
+ escaped = true;
348467
+ continue;
348468
+ }
348469
+ if (ch === '"') {
348470
+ quote2 = quote2 === 1 ? 0 : 1;
348471
+ continue;
348472
+ }
348473
+ if (quote2 === 1) {
348474
+ continue;
348475
+ }
348476
+ if (ch === "[") {
348477
+ bracket++;
348478
+ continue;
348479
+ }
348480
+ if (ch === "]" && bracket > 0) {
348481
+ bracket--;
348482
+ continue;
348483
+ }
348484
+ if (bracket > 0) {
348485
+ continue;
348486
+ }
348487
+ if (ch === "(") {
348488
+ paren++;
348489
+ continue;
348490
+ }
348491
+ if (ch === ")") {
348492
+ paren--;
348493
+ if (paren === 0) {
348494
+ if (requireEnd === true && i4 !== pattern.length - 1) {
348495
+ return;
348496
+ }
348497
+ return {
348498
+ type: pattern[0],
348499
+ body: pattern.slice(2, i4),
348500
+ end: i4
348501
+ };
348502
+ }
348503
+ }
348504
+ }
348505
+ };
348506
+ var getStarExtglobSequenceOutput = (pattern) => {
348507
+ let index2 = 0;
348508
+ const chars = [];
348509
+ while (index2 < pattern.length) {
348510
+ const match2 = parseRepeatedExtglob(pattern.slice(index2), false);
348511
+ if (!match2 || match2.type !== "*") {
348512
+ return;
348513
+ }
348514
+ const branches = splitTopLevel(match2.body).map((branch2) => branch2.trim());
348515
+ if (branches.length !== 1) {
348516
+ return;
348517
+ }
348518
+ const branch = normalizeSimpleBranch(branches[0]);
348519
+ if (!branch || branch.length !== 1) {
348520
+ return;
348521
+ }
348522
+ chars.push(branch);
348523
+ index2 += match2.end + 1;
348524
+ }
348525
+ if (chars.length < 1) {
348526
+ return;
348527
+ }
348528
+ const source = chars.length === 1 ? utils.escapeRegex(chars[0]) : `[${chars.map((ch) => utils.escapeRegex(ch)).join("")}]`;
348529
+ return `${source}*`;
348530
+ };
348531
+ var repeatedExtglobRecursion = (pattern) => {
348532
+ let depth = 0;
348533
+ let value2 = pattern.trim();
348534
+ let match2 = parseRepeatedExtglob(value2);
348535
+ while (match2) {
348536
+ depth++;
348537
+ value2 = match2.body.trim();
348538
+ match2 = parseRepeatedExtglob(value2);
348539
+ }
348540
+ return depth;
348541
+ };
348542
+ var analyzeRepeatedExtglob = (body2, options2) => {
348543
+ if (options2.maxExtglobRecursion === false) {
348544
+ return { risky: false };
348545
+ }
348546
+ const max5 = typeof options2.maxExtglobRecursion === "number" ? options2.maxExtglobRecursion : constants2.DEFAULT_MAX_EXTGLOB_RECURSION;
348547
+ const branches = splitTopLevel(body2).map((branch) => branch.trim());
348548
+ if (branches.length > 1) {
348549
+ if (branches.some((branch) => branch === "") || branches.some((branch) => /^[*?]+$/.test(branch)) || hasRepeatedCharPrefixOverlap(branches)) {
348550
+ return { risky: true };
348551
+ }
348552
+ }
348553
+ for (const branch of branches) {
348554
+ const safeOutput = getStarExtglobSequenceOutput(branch);
348555
+ if (safeOutput) {
348556
+ return { risky: true, safeOutput };
348557
+ }
348558
+ if (repeatedExtglobRecursion(branch) > max5) {
348559
+ return { risky: true };
348560
+ }
348561
+ }
348562
+ return { risky: false };
348563
+ };
347996
348564
  var parse4 = (input2, options2) => {
347997
348565
  if (typeof input2 !== "string") {
347998
348566
  throw new TypeError("Expected a string");
@@ -348125,6 +348693,8 @@ var require_parse2 = __commonJS((exports, module) => {
348125
348693
  token2.prev = prev;
348126
348694
  token2.parens = state2.parens;
348127
348695
  token2.output = state2.output;
348696
+ token2.startIndex = state2.index;
348697
+ token2.tokensIndex = tokens.length;
348128
348698
  const output = (opts.capture ? "(" : "") + token2.open;
348129
348699
  increment2("parens");
348130
348700
  push2({ type: type2, value: value3, output: state2.output ? "" : ONE_CHAR });
@@ -348132,6 +348702,26 @@ var require_parse2 = __commonJS((exports, module) => {
348132
348702
  extglobs.push(token2);
348133
348703
  };
348134
348704
  const extglobClose = (token2) => {
348705
+ const literal = input2.slice(token2.startIndex, state2.index + 1);
348706
+ const body2 = input2.slice(token2.startIndex + 2, state2.index);
348707
+ const analysis = analyzeRepeatedExtglob(body2, opts);
348708
+ if ((token2.type === "plus" || token2.type === "star") && analysis.risky) {
348709
+ const safeOutput = analysis.safeOutput ? (token2.output ? "" : ONE_CHAR) + (opts.capture ? `(${analysis.safeOutput})` : analysis.safeOutput) : undefined;
348710
+ const open2 = tokens[token2.tokensIndex];
348711
+ open2.type = "text";
348712
+ open2.value = literal;
348713
+ open2.output = safeOutput || utils.escapeRegex(literal);
348714
+ for (let i4 = token2.tokensIndex + 1;i4 < tokens.length; i4++) {
348715
+ tokens[i4].value = "";
348716
+ tokens[i4].output = "";
348717
+ delete tokens[i4].suffix;
348718
+ }
348719
+ state2.output = token2.output + open2.output;
348720
+ state2.backtrack = true;
348721
+ push2({ type: "paren", extglob: true, value: value2, output: "" });
348722
+ decrement("parens");
348723
+ return;
348724
+ }
348135
348725
  let output = token2.close + (opts.capture ? ")" : "");
348136
348726
  let rest;
348137
348727
  if (token2.type === "negate") {
@@ -348744,7 +349334,7 @@ var require_parse2 = __commonJS((exports, module) => {
348744
349334
  module.exports = parse4;
348745
349335
  });
348746
349336
 
348747
- // ../../node_modules/.pnpm/picomatch@2.3.1/node_modules/picomatch/lib/picomatch.js
349337
+ // ../../node_modules/.pnpm/picomatch@2.3.2/node_modules/picomatch/lib/picomatch.js
348748
349338
  var require_picomatch = __commonJS((exports, module) => {
348749
349339
  var path2 = __require("path");
348750
349340
  var scan = require_scan();