@superdoc-dev/cli 0.7.0-next.14 → 0.7.0-next.15

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 +886 -480
  2. package/package.json +7 -7
package/dist/index.js CHANGED
@@ -1241,7 +1241,7 @@ var init_operation_definitions = __esm(() => {
1241
1241
  INTENT_GROUP_META = {
1242
1242
  search: {
1243
1243
  toolName: "superdoc_search",
1244
- 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.",
1244
+ description: "Find text patterns or nodes in the document and get ref handles for targeting edits and formatting. " + "Refs expire after any mutation that changes the document. Re-search before the next edit when using individual tools (superdoc_edit, superdoc_format). " + 'Within a superdoc_mutations batch, selectors in "where" clauses resolve automatically at compile time; no manual re-searching needed between steps. ' + "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.",
1245
1245
  inputExamples: [
1246
1246
  { select: { type: "text", pattern: "Introduction" }, require: "first" },
1247
1247
  { select: { type: "text", pattern: "total amount" }, require: "all" },
@@ -1255,9 +1255,10 @@ var init_operation_definitions = __esm(() => {
1255
1255
  },
1256
1256
  get_content: {
1257
1257
  toolName: "superdoc_get_content",
1258
- 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.",
1258
+ 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, optional full text when includeText:true, formatting properties (fontFamily, fontSize, color, bold, underline, alignment), and ref handles for immediate use with superdoc_edit or superdoc_format. ' + 'When you need to evaluate or rewrite existing paragraphs or clauses, prefer action "blocks" with includeText:true so you can identify the correct block and then target it by nodeId. ' + '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.",
1259
1259
  inputExamples: [
1260
1260
  { action: "blocks" },
1261
+ { action: "blocks", includeText: true, offset: 0, limit: 20 },
1261
1262
  { action: "blocks", offset: 0, limit: 20, nodeTypes: ["heading", "paragraph"] },
1262
1263
  { action: "text" },
1263
1264
  { action: "info" }
@@ -1265,18 +1266,36 @@ var init_operation_definitions = __esm(() => {
1265
1266
  },
1266
1267
  edit: {
1267
1268
  toolName: "superdoc_edit",
1268
- 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.',
1269
+ description: "The primary tool for inserting content into documents. " + 'ALWAYS use action "insert" with type "markdown" to create headings, paragraphs, or any block content this is faster and creates proper document structure in one call. Do NOT use superdoc_create for headings or paragraphs. ' + "The markdown parser creates headings from # markers (# = Heading1, ## = Heading2), bold from **text**, italic from *text*, and numbered/bullet lists. " + 'Position markdown inserts with "target" (a BlockNodeAddress like {kind:"block", nodeType, nodeId}) and "placement" (before, after, insideStart, insideEnd). Without a target, content appends at the end of the document. ' + "IMPORTANT: After a markdown insert, analyze the document context (what kind of document, how titles and body text are styled) and follow up with ONE superdoc_mutations call to format inserted blocks so they look like they belong. " + 'Each format.apply step accepts "inline" (fontFamily, fontSize, bold, underline, color), "alignment", and "scope" in the same step. ' + 'Use scope: "block" so formatting covers the entire paragraph. ' + "Copy the exact property values from the existing get_content blocks (fontFamily, fontSize, color, alignment, bold, underline). Do NOT invent values — use what the blocks show. " + 'Also supports replace, delete, and undo/redo. 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. " + 'For multi-step redlines or whole-clause rewrites, prefer superdoc_mutations with where:{by:"block", nodeType, nodeId} from superdoc_get_content action "blocks" includeText:true rather than relying on text selectors. ' + "Refs expire after any mutation; always re-search before the next edit. " + "For 2+ edits that must succeed or fail atomically, use superdoc_mutations instead. " + 'Supports "dryRun" to preview changes and "changeMode: tracked" to record edits as tracked changes (not supported for markdown/html inserts). ' + 'Do NOT build "target" objects manually when a ref is available; prefer "ref" for simpler, more reliable targeting.',
1269
1270
  inputExamples: [
1271
+ {
1272
+ action: "insert",
1273
+ type: "markdown",
1274
+ target: { kind: "block", nodeType: "paragraph", nodeId: "<nodeId>" },
1275
+ placement: "before",
1276
+ value: `# Executive Summary
1277
+
1278
+ This agreement sets forth the principal terms...`
1279
+ },
1280
+ {
1281
+ action: "insert",
1282
+ type: "markdown",
1283
+ value: `# Section Title
1284
+
1285
+ Paragraph content here.
1286
+
1287
+ # Another Section
1288
+
1289
+ More content with **bold** and *italic*.`
1290
+ },
1270
1291
  { action: "replace", ref: "<handle.ref>", text: "new text here" },
1271
- { action: "insert", value: "Appended paragraph.", placement: "insideEnd" },
1272
- { action: "insert", ref: "<block.ref>", value: "Inserted before.", placement: "before" },
1273
1292
  { action: "delete", ref: "<handle.ref>" },
1274
1293
  { action: "undo" }
1275
1294
  ]
1276
1295
  },
1277
1296
  create: {
1278
1297
  toolName: "superdoc_create",
1279
- 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.',
1298
+ description: 'IMPORTANT: For headings and paragraphs, use superdoc_edit with type "markdown" instead it is faster, creates proper styles, and handles positioning via target + placement. ' + "Only use superdoc_create for tables or when markdown cannot express the content. " + "Creates a single paragraph, heading, or table. Returns nodeId and ref for the created block. " + "After creating, the returned ref is valid for ONE immediate superdoc_format call. For subsequent operations, re-fetch blocks with superdoc_get_content to get fresh refs (refs expire after any mutation). " + 'When the user asks for a "heading", use action "heading" with a level (default 1). Use action "paragraph" for regular body text. ' + '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.',
1280
1299
  inputExamples: [
1281
1300
  { action: "paragraph", text: "New paragraph content.", at: { kind: "documentEnd" } },
1282
1301
  {
@@ -1295,7 +1314,7 @@ var init_operation_definitions = __esm(() => {
1295
1314
  },
1296
1315
  format: {
1297
1316
  toolName: "superdoc_format",
1298
- 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.",
1317
+ description: "Change text and paragraph formatting. " + 'To format multiple items at once, use superdoc_mutations with format.apply steps instead of calling this tool repeatedly. Use require "all" with a node selector to format every heading or paragraph in one batch. ' + "Use this tool for single-item formatting when you have a valid ref or nodeId. " + '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.",
1299
1318
  inputExamples: [
1300
1319
  { action: "inline", ref: "<handle.ref>", inline: { bold: true } },
1301
1320
  {
@@ -1373,7 +1392,7 @@ var init_operation_definitions = __esm(() => {
1373
1392
  section: { toolName: "superdoc_section", description: "Page layout, margins, columns" },
1374
1393
  mutations: {
1375
1394
  toolName: "superdoc_mutations",
1376
- 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.",
1395
+ description: "All steps succeed or all fail; no partial application. " + "Execute multiple operations atomically in one batch. Use this for any workflow needing 2+ changes. " + "Supported step types: text (text.rewrite, text.insert, text.delete), format (format.apply), create (create.heading, create.paragraph, create.table), assert. " + 'Each step has an id, an op, a "where" clause for targeting ({by:"select", select:{...}, require:"first"|"exactlyOne"|"all"} or {by:"ref", ref:"..."} or {by:"block", nodeType:"paragraph", nodeId:"..."}), and "args" with operation-specific parameters. ' + 'Use {by:"block", nodeType, nodeId} when you want to rewrite, delete, format, or anchor against a whole known block from superdoc_get_content action "blocks" without relying on text matching. ' + 'For full-paragraph or full-clause rewrites, first call superdoc_get_content with action:"blocks" and includeText:true, then rewrite the matching block by nodeId. ' + 'Use {by:"select"} only for substring edits, discovery, or insertion relative to a sentence fragment; do NOT use a shortened text selector to replace an entire known block. ' + 'For create steps, "where" targets an existing anchor block and args.position ("before" or "after") controls placement. Sequential creates targeting the same anchor maintain correct order via internal position mapping. ' + 'For format.apply with require "all", use a node selector to format every heading or paragraph at once: {by:"select", select:{type:"node", nodeType:"heading"}, require:"all"}. ' + "Selectors resolve at compile time (before execution). This means format.apply steps CANNOT target content created by earlier create steps in the same batch. Split creates and formatting into separate batches: first a mutations call with creates, then a mutations call with format.apply. " + 'Action "preview" dry-runs the plan. Action "apply" executes it. ' + "If a selector matches nothing, the failure reports the step id plus selector details so you can retry with a shorter or more distinctive anchor. " + "Do NOT create two steps that target overlapping text in the same block; combine them into a single text.rewrite step.",
1377
1396
  inputExamples: [
1378
1397
  {
1379
1398
  action: "apply",
@@ -1393,6 +1412,29 @@ var init_operation_definitions = __esm(() => {
1393
1412
  args: {}
1394
1413
  }
1395
1414
  ]
1415
+ },
1416
+ {
1417
+ action: "apply",
1418
+ steps: [
1419
+ {
1420
+ id: "r1",
1421
+ op: "text.rewrite",
1422
+ where: { by: "block", nodeType: "paragraph", nodeId: "<nodeId>" },
1423
+ args: { replacement: { text: "Updated clause text." } }
1424
+ },
1425
+ {
1426
+ id: "f1",
1427
+ op: "format.apply",
1428
+ where: { by: "select", select: { type: "node", nodeType: "heading" }, require: "all" },
1429
+ args: { inline: { color: "#FF0000" } }
1430
+ },
1431
+ {
1432
+ id: "f2",
1433
+ op: "format.apply",
1434
+ where: { by: "select", select: { type: "text", pattern: "Confidential Information" }, require: "all" },
1435
+ args: { inline: { bold: true } }
1436
+ }
1437
+ ]
1396
1438
  }
1397
1439
  ]
1398
1440
  }
@@ -1735,8 +1777,8 @@ var init_operation_definitions = __esm(() => {
1735
1777
  },
1736
1778
  "blocks.list": {
1737
1779
  memberPath: "blocks.list",
1738
- description: "List top-level blocks in document order with IDs, types, and text previews. Supports pagination via offset/limit and optional nodeType filtering.",
1739
- expectedResult: "Returns a BlocksListResult with total block count, an ordered array of block entries (ordinal, nodeId, nodeType, textPreview, isEmpty), and the current document revision.",
1780
+ description: "List top-level blocks in document order with IDs, types, text previews, and optional full text when includeText:true. Supports pagination via offset/limit and optional nodeType filtering.",
1781
+ expectedResult: "Returns a BlocksListResult with total block count, an ordered array of block entries (ordinal, nodeId, nodeType, textPreview, optional text, isEmpty), and the current document revision.",
1740
1782
  requiresDocumentContext: true,
1741
1783
  metadata: readOperation({
1742
1784
  throws: ["INVALID_INPUT"]
@@ -9737,6 +9779,10 @@ var init_schemas = __esm(() => {
9737
9779
  type: "array",
9738
9780
  items: { enum: [...blockNodeTypeValues] },
9739
9781
  description: "Filter by block types (e.g. ['paragraph', 'heading']). Omit for all types."
9782
+ },
9783
+ includeText: {
9784
+ type: "boolean",
9785
+ description: "When true, includes the full flattened block text in each block entry."
9740
9786
  }
9741
9787
  }),
9742
9788
  output: objectSchema({
@@ -9748,6 +9794,10 @@ var init_schemas = __esm(() => {
9748
9794
  nodeId: { type: "string", description: "Block ID for targeting with other tools." },
9749
9795
  nodeType: { enum: [...blockNodeTypeValues] },
9750
9796
  textPreview: { oneOf: [{ type: "string" }, { type: "null" }] },
9797
+ text: {
9798
+ oneOf: [{ type: "string" }, { type: "null" }],
9799
+ description: "Full flattened block text when requested with includeText."
9800
+ },
9751
9801
  isEmpty: { type: "boolean" },
9752
9802
  styleId: { oneOf: [{ type: "string" }, { type: "null" }], description: "Named paragraph style." },
9753
9803
  fontFamily: { type: "string", description: "Font family from first text run." },
@@ -11097,13 +11147,27 @@ var init_schemas = __esm(() => {
11097
11147
  by: { const: "target", type: "string" },
11098
11148
  target: selectionTargetSchema
11099
11149
  }, ["by", "target"]);
11100
- const stepWhereSchema = { oneOf: [selectWhereSchema, refWhereSchema, targetWhereSchema] };
11101
- const insertWhereSchema = objectSchema({
11102
- by: { const: "select", type: "string" },
11103
- select: { oneOf: [textSelectorSchema, nodeSelectorSchema] },
11104
- within: blockNodeAddressSchema,
11105
- require: { enum: ["first", "exactlyOne"] }
11106
- }, ["by", "select", "require"]);
11150
+ const blockWhereSchema = objectSchema({
11151
+ by: { const: "block", type: "string" },
11152
+ nodeType: { enum: [...blockNodeTypeValues] },
11153
+ nodeId: { type: "string" }
11154
+ }, ["by", "nodeType", "nodeId"]);
11155
+ const stepWhereSchema = {
11156
+ oneOf: [selectWhereSchema, refWhereSchema, targetWhereSchema, blockWhereSchema]
11157
+ };
11158
+ const insertWhereSchema = {
11159
+ oneOf: [
11160
+ objectSchema({
11161
+ by: { const: "select", type: "string" },
11162
+ select: { oneOf: [textSelectorSchema, nodeSelectorSchema] },
11163
+ within: blockNodeAddressSchema,
11164
+ require: { enum: ["first", "exactlyOne"] }
11165
+ }, ["by", "select", "require"]),
11166
+ refWhereSchema,
11167
+ targetWhereSchema,
11168
+ blockWhereSchema
11169
+ ]
11170
+ };
11107
11171
  const assertWhereSchema = objectSchema({
11108
11172
  by: { const: "select", type: "string" },
11109
11173
  select: { oneOf: [textSelectorSchema, nodeSelectorSchema] },
@@ -11171,9 +11235,22 @@ var init_schemas = __esm(() => {
11171
11235
  id: { type: "string" },
11172
11236
  op: { const: "format.apply", type: "string" },
11173
11237
  where: stepWhereSchema,
11174
- args: objectSchema({
11175
- inline: buildInlineRunPatchSchema()
11176
- }, ["inline"])
11238
+ args: {
11239
+ ...objectSchema({
11240
+ inline: buildInlineRunPatchSchema(),
11241
+ alignment: {
11242
+ type: "string",
11243
+ enum: ["left", "center", "right", "justify"],
11244
+ description: "Set paragraph alignment on the target block(s). Can be combined with inline formatting in the same step."
11245
+ },
11246
+ scope: {
11247
+ type: "string",
11248
+ enum: ["match", "block"],
11249
+ description: 'When "block", inline formatting expands to cover the entire parent paragraph(s), not just the matched text. Use "block" after markdown inserts to format whole paragraphs with a short identifying pattern. Default: "match".'
11250
+ }
11251
+ }, []),
11252
+ minProperties: 1
11253
+ }
11177
11254
  }, ["id", "op", "where", "args"]);
11178
11255
  const assertStepSchema = objectSchema({
11179
11256
  id: { type: "string" },
@@ -14408,22 +14485,35 @@ function validateInsertInput(input) {
14408
14485
  }
14409
14486
  }
14410
14487
  function validateTextInsertInput(input) {
14411
- if ("placement" in input && input.placement !== undefined) {
14412
- throw new DocumentApiValidationError("INVALID_INPUT", '"placement" is only valid with structural content input, not with "value".', { field: "placement" });
14488
+ const contentType = typeof input.type === "string" ? input.type : "text";
14489
+ const isRichContent = contentType === "markdown" || contentType === "html";
14490
+ if ("placement" in input && input.placement !== undefined && !isRichContent) {
14491
+ throw new DocumentApiValidationError("INVALID_INPUT", '"placement" is only valid with structural content input or markdown/html inserts, not with plain "value".', { field: "placement" });
14413
14492
  }
14414
14493
  if ("nestingPolicy" in input && input.nestingPolicy !== undefined) {
14415
14494
  throw new DocumentApiValidationError("INVALID_INPUT", '"nestingPolicy" is only valid with structural content input, not with "value".', { field: "nestingPolicy" });
14416
14495
  }
14417
14496
  assertNoUnknownFields(input, TEXT_INSERT_ALLOWED_KEYS, "insert");
14497
+ if (isRichContent && "placement" in input && input.placement !== undefined) {
14498
+ if (typeof input.placement !== "string" || !PLACEMENT_VALUES.has(input.placement)) {
14499
+ throw new DocumentApiValidationError("INVALID_INPUT", `placement must be one of: before, after, insideStart, insideEnd. Got "${String(input.placement)}".`, { field: "placement", value: input.placement });
14500
+ }
14501
+ }
14418
14502
  const { target, ref: ref2, value, type } = input;
14419
14503
  if (target !== undefined && ref2 !== undefined) {
14420
14504
  throw new DocumentApiValidationError("INVALID_INPUT", 'Insert input must provide either "target" or "ref", not both.', { fields: ["target", "ref"] });
14421
14505
  }
14422
- if (target !== undefined && !isSelectionTarget(target)) {
14423
- throw new DocumentApiValidationError("INVALID_TARGET", "target must be a SelectionTarget object.", {
14424
- field: "target",
14425
- value: target
14426
- });
14506
+ if (target !== undefined) {
14507
+ if (isRichContent) {
14508
+ if (!isSelectionTarget(target) && !isBlockNodeAddress(target)) {
14509
+ throw new DocumentApiValidationError("INVALID_TARGET", "target must be a SelectionTarget or BlockNodeAddress for markdown/html inserts.", { field: "target", value: target });
14510
+ }
14511
+ } else if (!isSelectionTarget(target)) {
14512
+ throw new DocumentApiValidationError("INVALID_TARGET", "target must be a SelectionTarget object.", {
14513
+ field: "target",
14514
+ value: target
14515
+ });
14516
+ }
14427
14517
  }
14428
14518
  if (ref2 !== undefined && (typeof ref2 !== "string" || ref2 === "")) {
14429
14519
  throw new DocumentApiValidationError("INVALID_TARGET", "ref must be a non-empty string.", {
@@ -14487,7 +14577,7 @@ var init_insert = __esm(() => {
14487
14577
  init_selection_target_validator();
14488
14578
  init_fragment_validator();
14489
14579
  init_story_validator();
14490
- TEXT_INSERT_ALLOWED_KEYS = new Set(["value", "type", "target", "ref", "in"]);
14580
+ TEXT_INSERT_ALLOWED_KEYS = new Set(["value", "type", "target", "ref", "in", "placement"]);
14491
14581
  STRUCTURAL_INSERT_ALLOWED_KEYS = new Set(["content", "target", "placement", "nestingPolicy", "in"]);
14492
14582
  VALID_INSERT_TYPES = new Set(["text", "markdown", "html"]);
14493
14583
  });
@@ -15347,6 +15437,11 @@ function validateBlocksListInput(input) {
15347
15437
  }
15348
15438
  }
15349
15439
  }
15440
+ if (input.includeText != null && typeof input.includeText !== "boolean") {
15441
+ throw new DocumentApiValidationError("INVALID_INPUT", "blocks.list includeText must be a boolean.", {
15442
+ fields: ["includeText"]
15443
+ });
15444
+ }
15350
15445
  }
15351
15446
  function validateBlocksDeleteInput(input) {
15352
15447
  if (!input || typeof input !== "object") {
@@ -65398,7 +65493,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
65398
65493
  emptyOptions2 = {};
65399
65494
  });
65400
65495
 
65401
- // ../../packages/superdoc/dist/chunks/SuperConverter-CWhofwLf.es.js
65496
+ // ../../packages/superdoc/dist/chunks/SuperConverter-w6yaFRT5.es.js
65402
65497
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
65403
65498
  const fieldValue = extension$1.config[field];
65404
65499
  if (typeof fieldValue === "function")
@@ -68822,19 +68917,36 @@ function validateInsertInput2(input) {
68822
68917
  validateTextInsertInput2(input);
68823
68918
  }
68824
68919
  function validateTextInsertInput2(input) {
68825
- if ("placement" in input && input.placement !== undefined)
68826
- throw new DocumentApiValidationError2("INVALID_INPUT", '"placement" is only valid with structural content input, not with "value".', { field: "placement" });
68920
+ const contentType = typeof input.type === "string" ? input.type : "text";
68921
+ const isRichContent = contentType === "markdown" || contentType === "html";
68922
+ if ("placement" in input && input.placement !== undefined && !isRichContent)
68923
+ throw new DocumentApiValidationError2("INVALID_INPUT", '"placement" is only valid with structural content input or markdown/html inserts, not with plain "value".', { field: "placement" });
68827
68924
  if ("nestingPolicy" in input && input.nestingPolicy !== undefined)
68828
68925
  throw new DocumentApiValidationError2("INVALID_INPUT", '"nestingPolicy" is only valid with structural content input, not with "value".', { field: "nestingPolicy" });
68829
68926
  assertNoUnknownFields3(input, TEXT_INSERT_ALLOWED_KEYS2, "insert");
68927
+ if (isRichContent && "placement" in input && input.placement !== undefined) {
68928
+ if (typeof input.placement !== "string" || !PLACEMENT_VALUES2.has(input.placement))
68929
+ throw new DocumentApiValidationError2("INVALID_INPUT", `placement must be one of: before, after, insideStart, insideEnd. Got "${String(input.placement)}".`, {
68930
+ field: "placement",
68931
+ value: input.placement
68932
+ });
68933
+ }
68830
68934
  const { target, ref: ref$1, value, type } = input;
68831
68935
  if (target !== undefined && ref$1 !== undefined)
68832
68936
  throw new DocumentApiValidationError2("INVALID_INPUT", 'Insert input must provide either "target" or "ref", not both.', { fields: ["target", "ref"] });
68833
- if (target !== undefined && !isSelectionTarget2(target))
68834
- throw new DocumentApiValidationError2("INVALID_TARGET", "target must be a SelectionTarget object.", {
68835
- field: "target",
68836
- value: target
68837
- });
68937
+ if (target !== undefined) {
68938
+ if (isRichContent) {
68939
+ if (!isSelectionTarget2(target) && !isBlockNodeAddress2(target))
68940
+ throw new DocumentApiValidationError2("INVALID_TARGET", "target must be a SelectionTarget or BlockNodeAddress for markdown/html inserts.", {
68941
+ field: "target",
68942
+ value: target
68943
+ });
68944
+ } else if (!isSelectionTarget2(target))
68945
+ throw new DocumentApiValidationError2("INVALID_TARGET", "target must be a SelectionTarget object.", {
68946
+ field: "target",
68947
+ value: target
68948
+ });
68949
+ }
68838
68950
  if (ref$1 !== undefined && (typeof ref$1 !== "string" || ref$1 === ""))
68839
68951
  throw new DocumentApiValidationError2("INVALID_TARGET", "ref must be a non-empty string.", {
68840
68952
  field: "ref",
@@ -69673,6 +69785,8 @@ function validateBlocksListInput2(input) {
69673
69785
  nodeType: nt
69674
69786
  });
69675
69787
  }
69788
+ if (input.includeText != null && typeof input.includeText !== "boolean")
69789
+ throw new DocumentApiValidationError2("INVALID_INPUT", "blocks.list includeText must be a boolean.", { fields: ["includeText"] });
69676
69790
  }
69677
69791
  function validateBlocksDeleteInput2(input) {
69678
69792
  if (!input || typeof input !== "object")
@@ -117089,7 +117203,7 @@ var isRegExp = (value) => {
117089
117203
  state.kern = kernNode.attributes["w:val"];
117090
117204
  }
117091
117205
  }, SuperConverter;
117092
- var init_SuperConverter_CWhofwLf_es = __esm(() => {
117206
+ var init_SuperConverter_w6yaFRT5_es = __esm(() => {
117093
117207
  init_rolldown_runtime_Bg48TavK_es();
117094
117208
  init_jszip_C49i9kUs_es();
117095
117209
  init_xml_js_CqGKpaft_es();
@@ -120363,8 +120477,8 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
120363
120477
  },
120364
120478
  "blocks.list": {
120365
120479
  memberPath: "blocks.list",
120366
- description: "List top-level blocks in document order with IDs, types, and text previews. Supports pagination via offset/limit and optional nodeType filtering.",
120367
- expectedResult: "Returns a BlocksListResult with total block count, an ordered array of block entries (ordinal, nodeId, nodeType, textPreview, isEmpty), and the current document revision.",
120480
+ description: "List top-level blocks in document order with IDs, types, text previews, and optional full text when includeText:true. Supports pagination via offset/limit and optional nodeType filtering.",
120481
+ expectedResult: "Returns a BlocksListResult with total block count, an ordered array of block entries (ordinal, nodeId, nodeType, textPreview, optional text, isEmpty), and the current document revision.",
120368
120482
  requiresDocumentContext: true,
120369
120483
  metadata: readOperation2({ throws: ["INVALID_INPUT"] }),
120370
120484
  referenceDocPath: "blocks/list.mdx",
@@ -128278,6 +128392,10 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
128278
128392
  type: "array",
128279
128393
  items: { enum: [...blockNodeTypeValues2] },
128280
128394
  description: "Filter by block types (e.g. ['paragraph', 'heading']). Omit for all types."
128395
+ },
128396
+ includeText: {
128397
+ type: "boolean",
128398
+ description: "When true, includes the full flattened block text in each block entry."
128281
128399
  }
128282
128400
  }), objectSchema2({
128283
128401
  total: { type: "number" },
@@ -128291,6 +128409,10 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
128291
128409
  },
128292
128410
  nodeType: { enum: [...blockNodeTypeValues2] },
128293
128411
  textPreview: { oneOf: [{ type: "string" }, { type: "null" }] },
128412
+ text: {
128413
+ oneOf: [{ type: "string" }, { type: "null" }],
128414
+ description: "Full flattened block text when requested with includeText."
128415
+ },
128294
128416
  isEmpty: { type: "boolean" },
128295
128417
  styleId: {
128296
128418
  oneOf: [{ type: "string" }, { type: "null" }],
@@ -129449,7 +129571,57 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
129449
129571
  const queryMatchMetaSchema = objectSchema2({ effectiveResolved: { type: "boolean" } }, ["effectiveResolved"]);
129450
129572
  return discoveryResultSchema2({ oneOf: [textMatchItemSchema, nodeMatchItemSchema] }, queryMatchMetaSchema);
129451
129573
  })(), { ...(() => {
129574
+ const selectWhereSchema = objectSchema2({
129575
+ by: {
129576
+ const: "select",
129577
+ type: "string"
129578
+ },
129579
+ select: { oneOf: [textSelectorSchema2, nodeSelectorSchema2] },
129580
+ within: blockNodeAddressSchema2,
129581
+ require: { enum: [
129582
+ "first",
129583
+ "exactlyOne",
129584
+ "all"
129585
+ ] }
129586
+ }, [
129587
+ "by",
129588
+ "select",
129589
+ "require"
129590
+ ]);
129591
+ const refWhereSchema = objectSchema2({
129592
+ by: {
129593
+ const: "ref",
129594
+ type: "string"
129595
+ },
129596
+ ref: { type: "string" },
129597
+ within: blockNodeAddressSchema2
129598
+ }, ["by", "ref"]);
129599
+ const targetWhereSchema = objectSchema2({
129600
+ by: {
129601
+ const: "target",
129602
+ type: "string"
129603
+ },
129604
+ target: selectionTargetSchema2
129605
+ }, ["by", "target"]);
129606
+ const blockWhereSchema = objectSchema2({
129607
+ by: {
129608
+ const: "block",
129609
+ type: "string"
129610
+ },
129611
+ nodeType: { enum: [...blockNodeTypeValues2] },
129612
+ nodeId: { type: "string" }
129613
+ }, [
129614
+ "by",
129615
+ "nodeType",
129616
+ "nodeId"
129617
+ ]);
129452
129618
  const stepWhereSchema = { oneOf: [
129619
+ selectWhereSchema,
129620
+ refWhereSchema,
129621
+ targetWhereSchema,
129622
+ blockWhereSchema
129623
+ ] };
129624
+ const insertWhereSchema = { oneOf: [
129453
129625
  objectSchema2({
129454
129626
  by: {
129455
129627
  const: "select",
@@ -129457,45 +129629,16 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
129457
129629
  },
129458
129630
  select: { oneOf: [textSelectorSchema2, nodeSelectorSchema2] },
129459
129631
  within: blockNodeAddressSchema2,
129460
- require: { enum: [
129461
- "first",
129462
- "exactlyOne",
129463
- "all"
129464
- ] }
129632
+ require: { enum: ["first", "exactlyOne"] }
129465
129633
  }, [
129466
129634
  "by",
129467
129635
  "select",
129468
129636
  "require"
129469
129637
  ]),
129470
- objectSchema2({
129471
- by: {
129472
- const: "ref",
129473
- type: "string"
129474
- },
129475
- ref: { type: "string" },
129476
- within: blockNodeAddressSchema2
129477
- }, ["by", "ref"]),
129478
- objectSchema2({
129479
- by: {
129480
- const: "target",
129481
- type: "string"
129482
- },
129483
- target: selectionTargetSchema2
129484
- }, ["by", "target"])
129638
+ refWhereSchema,
129639
+ targetWhereSchema,
129640
+ blockWhereSchema
129485
129641
  ] };
129486
- const insertWhereSchema = objectSchema2({
129487
- by: {
129488
- const: "select",
129489
- type: "string"
129490
- },
129491
- select: { oneOf: [textSelectorSchema2, nodeSelectorSchema2] },
129492
- within: blockNodeAddressSchema2,
129493
- require: { enum: ["first", "exactlyOne"] }
129494
- }, [
129495
- "by",
129496
- "select",
129497
- "require"
129498
- ]);
129499
129642
  const assertWhereSchema = objectSchema2({
129500
129643
  by: {
129501
129644
  const: "select",
@@ -129626,7 +129769,27 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
129626
129769
  type: "string"
129627
129770
  },
129628
129771
  where: stepWhereSchema,
129629
- args: objectSchema2({ inline: buildInlineRunPatchSchema2() }, ["inline"])
129772
+ args: {
129773
+ ...objectSchema2({
129774
+ inline: buildInlineRunPatchSchema2(),
129775
+ alignment: {
129776
+ type: "string",
129777
+ enum: [
129778
+ "left",
129779
+ "center",
129780
+ "right",
129781
+ "justify"
129782
+ ],
129783
+ description: "Set paragraph alignment on the target block(s). Can be combined with inline formatting in the same step."
129784
+ },
129785
+ scope: {
129786
+ type: "string",
129787
+ enum: ["match", "block"],
129788
+ description: 'When "block", inline formatting expands to cover the entire parent paragraph(s), not just the matched text. Use "block" after markdown inserts to format whole paragraphs with a short identifying pattern. Default: "match".'
129789
+ }
129790
+ }, []),
129791
+ minProperties: 1
129792
+ }
129630
129793
  }, [
129631
129794
  "id",
129632
129795
  "op",
@@ -131595,7 +131758,8 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
131595
131758
  "type",
131596
131759
  "target",
131597
131760
  "ref",
131598
- "in"
131761
+ "in",
131762
+ "placement"
131599
131763
  ]);
131600
131764
  STRUCTURAL_INSERT_ALLOWED_KEYS2 = new Set([
131601
131765
  "content",
@@ -154285,7 +154449,7 @@ var init_SuperConverter_CWhofwLf_es = __esm(() => {
154285
154449
  };
154286
154450
  });
154287
154451
 
154288
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-C2iuH72Y.es.js
154452
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-CHK8yJic.es.js
154289
154453
  function parseSizeUnit(val = "0") {
154290
154454
  const length3 = val.toString() || "0";
154291
154455
  const value = Number.parseFloat(length3);
@@ -155896,8 +156060,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, Extension = class Extension2 {
155896
156060
  return false;
155897
156061
  return Boolean(checker(attrs));
155898
156062
  };
155899
- var init_create_headless_toolbar_C2iuH72Y_es = __esm(() => {
155900
- init_SuperConverter_CWhofwLf_es();
156063
+ var init_create_headless_toolbar_CHK8yJic_es = __esm(() => {
156064
+ init_SuperConverter_w6yaFRT5_es();
155901
156065
  init_constants_CGhJRd87_es();
155902
156066
  init_dist_B8HfvhaK_es();
155903
156067
  CSS_DIMENSION_REGEX = /[\d-.]+(\w+)$/;
@@ -204335,7 +204499,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
204335
204499
  init_remark_gfm_BhnWr3yf_es();
204336
204500
  });
204337
204501
 
204338
- // ../../packages/superdoc/dist/chunks/src-CXW8xV2H.es.js
204502
+ // ../../packages/superdoc/dist/chunks/src-966rF_JP.es.js
204339
204503
  function deleteProps(obj, propOrProps) {
204340
204504
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
204341
204505
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -220808,6 +220972,9 @@ function isRefWhere(where) {
220808
220972
  function isTargetWhere(where) {
220809
220973
  return where.by === "target";
220810
220974
  }
220975
+ function isBlockWhere(where) {
220976
+ return where.by === "block";
220977
+ }
220811
220978
  function validateCreateStepPosition(step3) {
220812
220979
  const args$1 = step3.args;
220813
220980
  if (args$1.position === undefined || args$1.position === null) {
@@ -221237,6 +221404,67 @@ function resolveTargetWhereClause(editor, step3, where) {
221237
221404
  capturedStyle
221238
221405
  };
221239
221406
  }
221407
+ function buildWholeBlockRangeTarget(editor, step3, candidate) {
221408
+ if (isTextBlockCandidate(candidate)) {
221409
+ const blockText = getBlockText(editor, candidate);
221410
+ return buildRangeTarget(editor, step3, {
221411
+ blockId: candidate.nodeId,
221412
+ from: 0,
221413
+ to: blockText.length,
221414
+ text: blockText,
221415
+ marks: [],
221416
+ blockPos: candidate.pos
221417
+ }, candidate);
221418
+ }
221419
+ return {
221420
+ kind: "range",
221421
+ stepId: step3.id,
221422
+ op: step3.op,
221423
+ blockId: candidate.nodeId,
221424
+ from: 0,
221425
+ to: 0,
221426
+ absFrom: candidate.pos,
221427
+ absTo: candidate.end,
221428
+ text: "",
221429
+ marks: [],
221430
+ capturedStyle: undefined
221431
+ };
221432
+ }
221433
+ function resolveBlockWhereClause(editor, index2, step3, where) {
221434
+ const key2 = `${where.nodeType}:${where.nodeId}`;
221435
+ if (index2.ambiguous.has(key2))
221436
+ throw planError("AMBIGUOUS_TARGET", `block "${key2}" matched multiple blocks`, step3.id, {
221437
+ stepId: step3.id,
221438
+ stepOp: step3.op,
221439
+ whereBy: "block",
221440
+ target: {
221441
+ nodeType: where.nodeType,
221442
+ nodeId: where.nodeId
221443
+ }
221444
+ });
221445
+ const candidate = index2.byId.get(key2);
221446
+ if (!candidate)
221447
+ throw planError("TARGET_NOT_FOUND", `block "${key2}" was not found`, step3.id, {
221448
+ stepId: step3.id,
221449
+ stepOp: step3.op,
221450
+ whereBy: "block",
221451
+ target: {
221452
+ nodeType: where.nodeType,
221453
+ nodeId: where.nodeId
221454
+ }
221455
+ });
221456
+ if (!isCreateOp(step3.op) && !isTextBlockCandidate(candidate))
221457
+ throw planError("INVALID_TARGET", `step "${step3.op}" requires a text-bearing block for where.by "block", but "${where.nodeType}" is not text-bearing`, step3.id, {
221458
+ stepId: step3.id,
221459
+ stepOp: step3.op,
221460
+ whereBy: "block",
221461
+ target: {
221462
+ nodeType: where.nodeType,
221463
+ nodeId: where.nodeId
221464
+ }
221465
+ });
221466
+ return buildWholeBlockRangeTarget(editor, step3, candidate);
221467
+ }
221240
221468
  function captureStyleAtAbsoluteRange(editor, absFrom, absTo) {
221241
221469
  const doc$12 = editor.state.doc;
221242
221470
  const allRuns = [];
@@ -221273,9 +221501,12 @@ function resolveStepTargets(editor, index2, step3) {
221273
221501
  const refWhere = isRefWhere(where) ? where : undefined;
221274
221502
  const selectWhere = isSelectWhere(where) ? where : undefined;
221275
221503
  const targetWhere = isTargetWhere(where) ? where : undefined;
221504
+ const blockWhere = isBlockWhere(where) ? where : undefined;
221276
221505
  let targets;
221277
221506
  if (targetWhere)
221278
221507
  targets = [resolveTargetWhereClause(editor, step3, targetWhere)];
221508
+ else if (blockWhere)
221509
+ targets = [resolveBlockWhereClause(editor, index2, step3, blockWhere)];
221279
221510
  else if (refWhere)
221280
221511
  targets = resolveRefTargets(editor, index2, step3, refWhere);
221281
221512
  else if (selectWhere) {
@@ -221318,7 +221549,7 @@ function resolveStepTargets(editor, index2, step3) {
221318
221549
  return true;
221319
221550
  return t.blockId !== prev.blockId || t.from !== prev.from || t.to !== prev.to;
221320
221551
  });
221321
- if (targetWhere)
221552
+ if (targetWhere || blockWhere)
221322
221553
  return targets;
221323
221554
  if (refWhere) {
221324
221555
  if (targets.length === 0)
@@ -221344,22 +221575,33 @@ function buildMatchNotFoundDetails(step3, editor) {
221344
221575
  const within$1 = "within" in where ? where.within : undefined;
221345
221576
  let textPreview;
221346
221577
  if (editor) {
221347
- const docSize = editor.state.doc.content.size;
221348
- const len3 = Math.min(docSize, 300);
221349
- if (len3 > 0)
221578
+ const rawDocSize = editor.state.doc.content?.size;
221579
+ const len3 = typeof rawDocSize === "number" ? Math.min(rawDocSize, 300) : 300;
221580
+ if (len3 > 0 && typeof editor.state.doc.textBetween === "function")
221350
221581
  textPreview = editor.state.doc.textBetween(0, len3, `
221351
221582
  `, `
221352
221583
  `);
221353
221584
  }
221354
221585
  return {
221586
+ stepId: step3.id,
221587
+ stepOp: step3.op,
221588
+ whereBy: where.by,
221355
221589
  selectorType: select2?.type ?? "unknown",
221356
221590
  selectorPattern: select2?.pattern ?? "",
221357
221591
  selectorMode: select2?.mode ?? "contains",
221358
- searchScope: within$1?.blockId ?? "document",
221592
+ searchScope: within$1?.nodeId ? `${within$1.nodeType ?? "block"}:${within$1.nodeId}` : "document",
221359
221593
  candidateCount: 0,
221360
221594
  ...textPreview ? { textPreview } : {}
221361
221595
  };
221362
221596
  }
221597
+ function buildMatchNotFoundMessage(step3) {
221598
+ const where = step3.where;
221599
+ const select2 = "select" in where ? where.select : undefined;
221600
+ const within$1 = "within" in where ? where.within : undefined;
221601
+ const selectorDescription = select2?.type === "node" ? `node selector for "${select2.nodeType ?? "unknown"}"` : `text selector for "${select2?.pattern ?? ""}"`;
221602
+ const scopeDescription = within$1?.nodeId ? ` within ${within$1.nodeType ?? "block"}:${within$1.nodeId}` : "";
221603
+ return `step "${step3.id}" (${step3.op}) matched zero ranges for ${selectorDescription}${scopeDescription}`;
221604
+ }
221363
221605
  function applyCardinalityCheck(step3, targets, editor) {
221364
221606
  const where = step3.where;
221365
221607
  if (!("require" in where) || where.require === undefined)
@@ -221367,15 +221609,15 @@ function applyCardinalityCheck(step3, targets, editor) {
221367
221609
  const require$1 = where.require;
221368
221610
  if (require$1 === "first") {
221369
221611
  if (targets.length === 0)
221370
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step3.id, buildMatchNotFoundDetails(step3, editor));
221612
+ throw planError("MATCH_NOT_FOUND", buildMatchNotFoundMessage(step3), step3.id, buildMatchNotFoundDetails(step3, editor));
221371
221613
  } else if (require$1 === "exactlyOne") {
221372
221614
  if (targets.length === 0)
221373
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step3.id, buildMatchNotFoundDetails(step3, editor));
221615
+ throw planError("MATCH_NOT_FOUND", buildMatchNotFoundMessage(step3), step3.id, buildMatchNotFoundDetails(step3, editor));
221374
221616
  if (targets.length > 1)
221375
221617
  throw planError("AMBIGUOUS_MATCH", `selector matched ${targets.length} ranges, expected exactly one`, step3.id, { matchCount: targets.length });
221376
221618
  } else if (require$1 === "all") {
221377
221619
  if (targets.length === 0)
221378
- throw planError("MATCH_NOT_FOUND", "selector matched zero ranges", step3.id, buildMatchNotFoundDetails(step3, editor));
221620
+ throw planError("MATCH_NOT_FOUND", buildMatchNotFoundMessage(step3), step3.id, buildMatchNotFoundDetails(step3, editor));
221379
221621
  }
221380
221622
  }
221381
221623
  function normalizeOpForMatrix(op) {
@@ -221587,6 +221829,360 @@ function compilePlan(editor, steps) {
221587
221829
  compiledRevision
221588
221830
  };
221589
221831
  }
221832
+ function resolveParagraphBlock(editor, target) {
221833
+ const candidate = findBlockByIdStrict(getBlockIndex(editor), target);
221834
+ if (!PARAGRAPH_NODE_TYPES.has(candidate.nodeType))
221835
+ throw new DocumentApiAdapterError("INVALID_TARGET", `format.paragraph.* / styles.paragraph.* operations require a paragraph, heading, or listItem target. Got "${candidate.nodeType}".`, { nodeType: candidate.nodeType });
221836
+ return candidate;
221837
+ }
221838
+ function successResult(target) {
221839
+ return {
221840
+ success: true,
221841
+ target,
221842
+ resolution: { target }
221843
+ };
221844
+ }
221845
+ function noOpResult(operation) {
221846
+ return {
221847
+ success: false,
221848
+ failure: {
221849
+ code: "NO_OP",
221850
+ message: `${operation} produced no changes.`
221851
+ }
221852
+ };
221853
+ }
221854
+ function getPreservedCharacterStyleAttrs(mark2) {
221855
+ const styleId = mark2.attrs?.[TEXT_STYLE_CHARACTER_STYLE_ATTR];
221856
+ if (typeof styleId !== "string" || styleId.length === 0)
221857
+ return null;
221858
+ return { [TEXT_STYLE_CHARACTER_STYLE_ATTR]: styleId };
221859
+ }
221860
+ function hasTextStyleDirectFormatting(mark2) {
221861
+ return Object.entries(mark2.attrs ?? {}).some(([key2, value]) => key2 !== TEXT_STYLE_CHARACTER_STYLE_ATTR && value != null);
221862
+ }
221863
+ function clearTextStyleDirectFormatting(tr, from$1, to, mark2) {
221864
+ const preservedCharacterStyle = getPreservedCharacterStyleAttrs(mark2);
221865
+ const hadDirectFormatting = hasTextStyleDirectFormatting(mark2);
221866
+ if (!hadDirectFormatting && preservedCharacterStyle)
221867
+ return false;
221868
+ tr.removeMark?.(from$1, to, mark2);
221869
+ if (hadDirectFormatting && preservedCharacterStyle && mark2.type?.create && tr.addMark)
221870
+ tr.addMark(from$1, to, mark2.type.create(preservedCharacterStyle));
221871
+ return true;
221872
+ }
221873
+ function clearDirectFormattingInBlock(tr, pos, nodeSize2) {
221874
+ if (!tr.doc?.nodesBetween || !tr.removeMark || nodeSize2 <= 2)
221875
+ return false;
221876
+ let changed = false;
221877
+ tr.doc.nodesBetween(pos + 1, pos + nodeSize2 - 1, (node3, nodePos) => {
221878
+ if (!node3.isText || !Array.isArray(node3.marks) || node3.marks.length === 0 || typeof node3.nodeSize !== "number")
221879
+ return true;
221880
+ node3.marks.forEach((mark2) => {
221881
+ const markName = mark2?.type?.name;
221882
+ if (!markName || !DIRECT_FORMATTING_MARK_NAMES.has(markName))
221883
+ return;
221884
+ if (markName === "textStyle") {
221885
+ changed = clearTextStyleDirectFormatting(tr, nodePos, nodePos + node3.nodeSize, mark2) || changed;
221886
+ return;
221887
+ }
221888
+ tr.removeMark(nodePos, nodePos + node3.nodeSize, mark2);
221889
+ changed = true;
221890
+ });
221891
+ return true;
221892
+ });
221893
+ return changed;
221894
+ }
221895
+ function mutateParagraphProperties(editor, candidate, operation, target, transform, options, extras) {
221896
+ if (options?.dryRun)
221897
+ return successResult(target);
221898
+ if (executeDomainCommand(editor, () => {
221899
+ const node3 = editor.state.doc.nodeAt(candidate.pos);
221900
+ if (!node3)
221901
+ return false;
221902
+ const existing = node3.attrs.paragraphProperties ?? {};
221903
+ const updated = transform({ ...existing });
221904
+ if (JSON.stringify(existing) === JSON.stringify(updated))
221905
+ return false;
221906
+ const tr = editor.state.tr;
221907
+ if (extras?.clearDirectFormatting)
221908
+ clearDirectFormattingInBlock(tr, candidate.pos, node3.nodeSize);
221909
+ tr.setNodeMarkup(candidate.pos, undefined, {
221910
+ ...node3.attrs,
221911
+ paragraphProperties: updated
221912
+ });
221913
+ editor.dispatch(tr);
221914
+ clearIndexCache(editor);
221915
+ return true;
221916
+ }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
221917
+ return noOpResult(operation);
221918
+ return successResult(target);
221919
+ }
221920
+ function mergeDefinedFields(existing, patch3) {
221921
+ const result = { ...existing ?? {} };
221922
+ for (const [key2, value] of Object.entries(patch3))
221923
+ if (value !== undefined)
221924
+ result[key2] = value;
221925
+ return result;
221926
+ }
221927
+ function mergeIndentationFields(existing, patch3) {
221928
+ const result = mergeDefinedFields(existing, patch3);
221929
+ const firstLineWasUpdated = patch3.firstLine !== undefined;
221930
+ const hangingWasUpdated = patch3.hanging !== undefined;
221931
+ if (firstLineWasUpdated && !hangingWasUpdated)
221932
+ delete result.hanging;
221933
+ if (hangingWasUpdated && !firstLineWasUpdated)
221934
+ delete result.firstLine;
221935
+ return result;
221936
+ }
221937
+ function deleteKey(obj, key2) {
221938
+ const result = { ...obj };
221939
+ delete result[key2];
221940
+ return Object.keys(result).length > 0 ? result : undefined;
221941
+ }
221942
+ function addOrReplaceTabStop(existing, entry) {
221943
+ return [...(existing ?? []).filter((t) => t.tab.pos !== entry.tab.pos), entry].sort((a2, b$1) => a2.tab.pos - b$1.tab.pos);
221944
+ }
221945
+ function removeTabStop(existing, position4) {
221946
+ const filtered = (existing ?? []).filter((t) => t.tab.pos !== position4);
221947
+ return filtered.length > 0 ? filtered : undefined;
221948
+ }
221949
+ function paragraphsSetStyleWrapper(editor, input2, options) {
221950
+ rejectTrackedMode("styles.paragraph.setStyle", options);
221951
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "styles.paragraph.setStyle", input2.target, (pPr) => ({
221952
+ ...pPr,
221953
+ styleId: input2.styleId
221954
+ }), options, { clearDirectFormatting: true });
221955
+ }
221956
+ function paragraphsClearStyleWrapper(editor, input2, options) {
221957
+ rejectTrackedMode("styles.paragraph.clearStyle", options);
221958
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "styles.paragraph.clearStyle", input2.target, (pPr) => {
221959
+ const result = { ...pPr };
221960
+ delete result.styleId;
221961
+ return result;
221962
+ }, options);
221963
+ }
221964
+ function paragraphsResetDirectFormattingWrapper(editor, input2, options) {
221965
+ rejectTrackedMode("format.paragraph.resetDirectFormatting", options);
221966
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.resetDirectFormatting", input2.target, (pPr) => {
221967
+ const result = {};
221968
+ if (pPr.styleId !== undefined)
221969
+ result.styleId = pPr.styleId;
221970
+ if (pPr.numberingProperties !== undefined)
221971
+ result.numberingProperties = pPr.numberingProperties;
221972
+ if (pPr.sectPr !== undefined)
221973
+ result.sectPr = pPr.sectPr;
221974
+ return result;
221975
+ }, options);
221976
+ }
221977
+ function paragraphsSetAlignmentWrapper(editor, input2, options) {
221978
+ rejectTrackedMode("format.paragraph.setAlignment", options);
221979
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setAlignment", input2.target, (pPr) => ({
221980
+ ...pPr,
221981
+ justification: ALIGNMENT_TO_JUSTIFICATION[input2.alignment]
221982
+ }), options);
221983
+ }
221984
+ function paragraphsClearAlignmentWrapper(editor, input2, options) {
221985
+ rejectTrackedMode("format.paragraph.clearAlignment", options);
221986
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearAlignment", input2.target, (pPr) => {
221987
+ const result = { ...pPr };
221988
+ delete result.justification;
221989
+ return result;
221990
+ }, options);
221991
+ }
221992
+ function paragraphsSetIndentationWrapper(editor, input2, options) {
221993
+ rejectTrackedMode("format.paragraph.setIndentation", options);
221994
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setIndentation", input2.target, (pPr) => ({
221995
+ ...pPr,
221996
+ indent: mergeIndentationFields(pPr.indent, {
221997
+ left: input2.left,
221998
+ right: input2.right,
221999
+ firstLine: input2.firstLine,
222000
+ hanging: input2.hanging
222001
+ })
222002
+ }), options);
222003
+ }
222004
+ function paragraphsClearIndentationWrapper(editor, input2, options) {
222005
+ rejectTrackedMode("format.paragraph.clearIndentation", options);
222006
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearIndentation", input2.target, (pPr) => {
222007
+ const result = { ...pPr };
222008
+ delete result.indent;
222009
+ return result;
222010
+ }, options);
222011
+ }
222012
+ function paragraphsSetSpacingWrapper(editor, input2, options) {
222013
+ rejectTrackedMode("format.paragraph.setSpacing", options);
222014
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setSpacing", input2.target, (pPr) => ({
222015
+ ...pPr,
222016
+ spacing: mergeDefinedFields(pPr.spacing, {
222017
+ before: input2.before,
222018
+ after: input2.after,
222019
+ line: input2.line,
222020
+ lineRule: input2.lineRule
222021
+ })
222022
+ }), options);
222023
+ }
222024
+ function paragraphsClearSpacingWrapper(editor, input2, options) {
222025
+ rejectTrackedMode("format.paragraph.clearSpacing", options);
222026
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearSpacing", input2.target, (pPr) => {
222027
+ const result = { ...pPr };
222028
+ delete result.spacing;
222029
+ return result;
222030
+ }, options);
222031
+ }
222032
+ function paragraphsSetKeepOptionsWrapper(editor, input2, options) {
222033
+ rejectTrackedMode("format.paragraph.setKeepOptions", options);
222034
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setKeepOptions", input2.target, (pPr) => {
222035
+ const result = { ...pPr };
222036
+ if (input2.keepNext !== undefined)
222037
+ result.keepNext = input2.keepNext;
222038
+ if (input2.keepLines !== undefined)
222039
+ result.keepLines = input2.keepLines;
222040
+ if (input2.widowControl !== undefined)
222041
+ result.widowControl = input2.widowControl;
222042
+ return result;
222043
+ }, options);
222044
+ }
222045
+ function paragraphsSetOutlineLevelWrapper(editor, input2, options) {
222046
+ rejectTrackedMode("format.paragraph.setOutlineLevel", options);
222047
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setOutlineLevel", input2.target, (pPr) => {
222048
+ if (input2.outlineLevel === null) {
222049
+ const result = { ...pPr };
222050
+ delete result.outlineLvl;
222051
+ return result;
222052
+ }
222053
+ return {
222054
+ ...pPr,
222055
+ outlineLvl: input2.outlineLevel
222056
+ };
222057
+ }, options);
222058
+ }
222059
+ function paragraphsSetFlowOptionsWrapper(editor, input2, options) {
222060
+ rejectTrackedMode("format.paragraph.setFlowOptions", options);
222061
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setFlowOptions", input2.target, (pPr) => {
222062
+ const result = { ...pPr };
222063
+ if (input2.contextualSpacing !== undefined)
222064
+ result.contextualSpacing = input2.contextualSpacing;
222065
+ if (input2.pageBreakBefore !== undefined)
222066
+ result.pageBreakBefore = input2.pageBreakBefore;
222067
+ if (input2.suppressAutoHyphens !== undefined)
222068
+ result.suppressAutoHyphens = input2.suppressAutoHyphens;
222069
+ return result;
222070
+ }, options);
222071
+ }
222072
+ function paragraphsSetTabStopWrapper(editor, input2, options) {
222073
+ rejectTrackedMode("format.paragraph.setTabStop", options);
222074
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setTabStop", input2.target, (pPr) => {
222075
+ const entry = { tab: {
222076
+ pos: input2.position,
222077
+ tabType: input2.alignment,
222078
+ ...input2.leader !== undefined && { leader: input2.leader }
222079
+ } };
222080
+ return {
222081
+ ...pPr,
222082
+ tabStops: addOrReplaceTabStop(pPr.tabStops, entry)
222083
+ };
222084
+ }, options);
222085
+ }
222086
+ function paragraphsClearTabStopWrapper(editor, input2, options) {
222087
+ rejectTrackedMode("format.paragraph.clearTabStop", options);
222088
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearTabStop", input2.target, (pPr) => {
222089
+ const updated = removeTabStop(pPr.tabStops, input2.position);
222090
+ if (updated === undefined) {
222091
+ const result = { ...pPr };
222092
+ delete result.tabStops;
222093
+ return result;
222094
+ }
222095
+ return {
222096
+ ...pPr,
222097
+ tabStops: updated
222098
+ };
222099
+ }, options);
222100
+ }
222101
+ function paragraphsClearAllTabStopsWrapper(editor, input2, options) {
222102
+ rejectTrackedMode("format.paragraph.clearAllTabStops", options);
222103
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearAllTabStops", input2.target, (pPr) => {
222104
+ const result = { ...pPr };
222105
+ delete result.tabStops;
222106
+ return result;
222107
+ }, options);
222108
+ }
222109
+ function paragraphsSetBorderWrapper(editor, input2, options) {
222110
+ rejectTrackedMode("format.paragraph.setBorder", options);
222111
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setBorder", input2.target, (pPr) => {
222112
+ const existing = pPr.borders ?? {};
222113
+ const border = { val: input2.style };
222114
+ if (input2.color !== undefined)
222115
+ border.color = input2.color;
222116
+ if (input2.size !== undefined)
222117
+ border.size = input2.size;
222118
+ if (input2.space !== undefined)
222119
+ border.space = input2.space;
222120
+ return {
222121
+ ...pPr,
222122
+ borders: {
222123
+ ...existing,
222124
+ [input2.side]: border
222125
+ }
222126
+ };
222127
+ }, options);
222128
+ }
222129
+ function paragraphsClearBorderWrapper(editor, input2, options) {
222130
+ rejectTrackedMode("format.paragraph.clearBorder", options);
222131
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearBorder", input2.target, (pPr) => {
222132
+ if (input2.side === "all") {
222133
+ const result = { ...pPr };
222134
+ delete result.borders;
222135
+ return result;
222136
+ }
222137
+ const updated = deleteKey(pPr.borders ?? {}, input2.side);
222138
+ if (updated === undefined) {
222139
+ const result = { ...pPr };
222140
+ delete result.borders;
222141
+ return result;
222142
+ }
222143
+ return {
222144
+ ...pPr,
222145
+ borders: updated
222146
+ };
222147
+ }, options);
222148
+ }
222149
+ function paragraphsSetShadingWrapper(editor, input2, options) {
222150
+ rejectTrackedMode("format.paragraph.setShading", options);
222151
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setShading", input2.target, (pPr) => ({
222152
+ ...pPr,
222153
+ shading: mergeDefinedFields(pPr.shading, {
222154
+ fill: input2.fill,
222155
+ color: input2.color,
222156
+ val: input2.pattern
222157
+ })
222158
+ }), options);
222159
+ }
222160
+ function paragraphsClearShadingWrapper(editor, input2, options) {
222161
+ rejectTrackedMode("format.paragraph.clearShading", options);
222162
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearShading", input2.target, (pPr) => {
222163
+ const result = { ...pPr };
222164
+ delete result.shading;
222165
+ return result;
222166
+ }, options);
222167
+ }
222168
+ function paragraphsSetDirectionWrapper(editor, input2, options) {
222169
+ rejectTrackedMode("format.paragraph.setDirection", options);
222170
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setDirection", input2.target, (pPr) => {
222171
+ const result = { ...pPr };
222172
+ result.rightToLeft = input2.direction === "rtl";
222173
+ if (input2.alignmentPolicy === "matchDirection")
222174
+ result.justification = input2.direction === "rtl" ? "right" : "left";
222175
+ return result;
222176
+ }, options);
222177
+ }
222178
+ function paragraphsClearDirectionWrapper(editor, input2, options) {
222179
+ rejectTrackedMode("format.paragraph.clearDirection", options);
222180
+ return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearDirection", input2.target, (pPr) => {
222181
+ const result = { ...pPr };
222182
+ delete result.rightToLeft;
222183
+ return result;
222184
+ }, options);
222185
+ }
221590
222186
  function resolveBlockInsertionPos(editor, anchorBlockId, position4, stepId) {
221591
222187
  const candidate = getBlockIndex(editor).candidates.find((c) => c.nodeId === anchorBlockId);
221592
222188
  if (!candidate)
@@ -222168,8 +222764,59 @@ function executeTextDelete(_editor, tr, target, _step, mapping) {
222168
222764
  tr.delete(absFrom, absTo);
222169
222765
  return { changed: true };
222170
222766
  }
222767
+ function applyAlignmentToRange(tr, absFrom, absTo, alignment$1) {
222768
+ const justification = ALIGNMENT_TO_JUSTIFICATION[alignment$1];
222769
+ if (!justification)
222770
+ return false;
222771
+ let changed = false;
222772
+ tr.doc.nodesBetween(absFrom, absTo, (node3, pos) => {
222773
+ if (!node3.isTextblock)
222774
+ return;
222775
+ const existing = node3.attrs.paragraphProperties;
222776
+ if (existing?.justification === justification)
222777
+ return;
222778
+ const updated = {
222779
+ ...existing ?? {},
222780
+ justification
222781
+ };
222782
+ tr.setNodeMarkup(pos, undefined, {
222783
+ ...node3.attrs,
222784
+ paragraphProperties: updated
222785
+ });
222786
+ changed = true;
222787
+ });
222788
+ return changed;
222789
+ }
222790
+ function expandToBlockBoundaries$1(doc$12, from$1, to) {
222791
+ let expandedFrom = from$1;
222792
+ let expandedTo = to;
222793
+ doc$12.nodesBetween(from$1, to, (node3, pos) => {
222794
+ if (!node3.isTextblock)
222795
+ return;
222796
+ const blockContentStart = pos + 1;
222797
+ const blockContentEnd = pos + node3.nodeSize - 1;
222798
+ expandedFrom = Math.min(expandedFrom, blockContentStart);
222799
+ expandedTo = Math.max(expandedTo, blockContentEnd);
222800
+ });
222801
+ return {
222802
+ from: expandedFrom,
222803
+ to: expandedTo
222804
+ };
222805
+ }
222171
222806
  function executeStyleApply3(editor, tr, target, step3, mapping) {
222172
- return { changed: applyInlinePatchToRange(editor, tr, mapping.map(target.absFrom), mapping.map(target.absTo), step3.args.inline) };
222807
+ let absFrom = mapping.map(target.absFrom);
222808
+ let absTo = mapping.map(target.absTo);
222809
+ if (step3.args.scope === "block") {
222810
+ const expanded = expandToBlockBoundaries$1(tr.doc, absFrom, absTo);
222811
+ absFrom = expanded.from;
222812
+ absTo = expanded.to;
222813
+ }
222814
+ let changed = false;
222815
+ if (step3.args.inline)
222816
+ changed = applyInlinePatchToRange(editor, tr, absFrom, absTo, step3.args.inline) || changed;
222817
+ if (step3.args.alignment)
222818
+ changed = applyAlignmentToRange(tr, absFrom, absTo, step3.args.alignment) || changed;
222819
+ return { changed };
222173
222820
  }
222174
222821
  function validateMappedSpanContiguity(target, mapping, stepId) {
222175
222822
  let lastMappedEnd = -1;
@@ -222237,7 +222884,19 @@ function executeSpanStyleApply(editor, tr, target, step3, mapping) {
222237
222884
  validateMappedSpanContiguity(target, mapping, step3.id);
222238
222885
  const firstSeg = target.segments[0];
222239
222886
  const lastSeg = target.segments[target.segments.length - 1];
222240
- return { changed: applyInlinePatchToRange(editor, tr, mapping.map(firstSeg.absFrom, 1), mapping.map(lastSeg.absTo, -1), step3.args.inline) };
222887
+ let absFrom = mapping.map(firstSeg.absFrom, 1);
222888
+ let absTo = mapping.map(lastSeg.absTo, -1);
222889
+ if (step3.args.scope === "block") {
222890
+ const expanded = expandToBlockBoundaries$1(tr.doc, absFrom, absTo);
222891
+ absFrom = expanded.from;
222892
+ absTo = expanded.to;
222893
+ }
222894
+ let changed = false;
222895
+ if (step3.args.inline)
222896
+ changed = applyInlinePatchToRange(editor, tr, absFrom, absTo, step3.args.inline) || changed;
222897
+ if (step3.args.alignment)
222898
+ changed = applyAlignmentToRange(tr, absFrom, absTo, step3.args.alignment) || changed;
222899
+ return { changed };
222241
222900
  }
222242
222901
  function getReplacementText(replacement) {
222243
222902
  if (replacement.blocks !== undefined)
@@ -224392,14 +225051,44 @@ function insertStructuredInner(editor, input2, options) {
224392
225051
  if (isStructuralInsertInput2(input2))
224393
225052
  return executeStructuralInsertWrapper(editor, input2, options);
224394
225053
  const contentType = input2.type ?? "text";
224395
- const { value, target, ref: ref$1 } = input2;
225054
+ const { value, ref: ref$1 } = input2;
225055
+ const rawTarget = input2.target;
225056
+ const placement2 = input2.placement;
224396
225057
  if ((options?.changeMode ?? "direct") === "tracked")
224397
225058
  throw new DocumentApiAdapterError("CAPABILITY_UNAVAILABLE", `Tracked mode is not supported for type: '${contentType}' insert operations.`);
224398
225059
  let resolvedRange;
224399
225060
  let effectiveTarget;
224400
225061
  if (ref$1 !== undefined && ref$1 === "")
224401
225062
  throw new DocumentApiAdapterError("INVALID_TARGET", "ref must be a non-empty string.", { ref: ref$1 });
224402
- if (target) {
225063
+ if (rawTarget && typeof rawTarget === "object" && "kind" in rawTarget && rawTarget.kind === "block") {
225064
+ const blockTarget = rawTarget;
225065
+ let resolved;
225066
+ try {
225067
+ resolved = resolveInsertTarget(editor, blockTarget);
225068
+ } catch (err) {
225069
+ if (err instanceof DocumentApiAdapterError)
225070
+ throw err;
225071
+ throw new DocumentApiAdapterError("TARGET_NOT_FOUND", `Cannot resolve insert target for block "${blockTarget.nodeId}".`);
225072
+ }
225073
+ let insertPos;
225074
+ if (resolved.targetNode && resolved.targetNodePos !== undefined)
225075
+ insertPos = resolvePlacement(editor.state.doc, resolved.targetNodePos, resolved.targetNode, placement2);
225076
+ else
225077
+ insertPos = resolved.insertPos;
225078
+ resolvedRange = {
225079
+ from: insertPos,
225080
+ to: insertPos
225081
+ };
225082
+ effectiveTarget = {
225083
+ kind: "text",
225084
+ blockId: blockTarget.nodeId,
225085
+ range: {
225086
+ start: 0,
225087
+ end: 0
225088
+ }
225089
+ };
225090
+ } else if (rawTarget) {
225091
+ const target = rawTarget;
224403
225092
  const resolved = resolveSelectionTarget(editor, target);
224404
225093
  resolvedRange = {
224405
225094
  from: resolved.absFrom,
@@ -224484,7 +225173,7 @@ function insertStructuredInner(editor, input2, options) {
224484
225173
  text: readTextAtResolvedRange(editor, resolvedRange)
224485
225174
  });
224486
225175
  const { from: from$1, to } = resolvedRange;
224487
- if (target && from$1 !== to)
225176
+ if (rawTarget && from$1 !== to)
224488
225177
  return {
224489
225178
  success: false,
224490
225179
  resolution,
@@ -225080,7 +225769,45 @@ function extractTextPreview(node3) {
225080
225769
  return text5;
225081
225770
  return text5.slice(0, TEXT_PREVIEW_MAX_LENGTH);
225082
225771
  }
225083
- function extractBlockFormatting(node3) {
225772
+ function extractBlockText$1(node3) {
225773
+ if (!node3.isTextblock)
225774
+ return null;
225775
+ return node3.textContent;
225776
+ }
225777
+ function buildStyleContext(editor) {
225778
+ const styleProps = readTranslatedLinkedStyles(editor);
225779
+ if (!styleProps)
225780
+ return null;
225781
+ return {
225782
+ styles: styleProps.styles ?? {},
225783
+ docDefaultsFontSizeHp: typeof styleProps.docDefaults?.runProperties?.fontSize === "number" ? styleProps.docDefaults.runProperties.fontSize : undefined
225784
+ };
225785
+ }
225786
+ function resolveBlockFontSizePt(styleCtx, styleId) {
225787
+ if (!styleCtx)
225788
+ return OOXML_DEFAULT_FONT_SIZE_PT;
225789
+ let currentId = styleId ?? "Normal";
225790
+ const visited = /* @__PURE__ */ new Set;
225791
+ while (currentId && !visited.has(currentId)) {
225792
+ visited.add(currentId);
225793
+ const style2 = styleCtx.styles[currentId];
225794
+ if (!style2)
225795
+ break;
225796
+ const fs = style2.runProperties?.fontSize;
225797
+ if (typeof fs === "number")
225798
+ return fs / 2;
225799
+ currentId = style2.basedOn ?? "";
225800
+ }
225801
+ if (!visited.has("Normal")) {
225802
+ const fs = styleCtx.styles["Normal"]?.runProperties?.fontSize;
225803
+ if (typeof fs === "number")
225804
+ return fs / 2;
225805
+ }
225806
+ if (typeof styleCtx.docDefaultsFontSizeHp === "number")
225807
+ return styleCtx.docDefaultsFontSizeHp / 2;
225808
+ return OOXML_DEFAULT_FONT_SIZE_PT;
225809
+ }
225810
+ function extractBlockFormatting(node3, styleCtx) {
225084
225811
  const pProps = node3.attrs.paragraphProperties;
225085
225812
  const styleId = pProps?.styleId ?? null;
225086
225813
  let fontFamily;
@@ -225126,7 +225853,7 @@ function extractBlockFormatting(node3) {
225126
225853
  return {
225127
225854
  ...styleId ? { styleId } : {},
225128
225855
  ...fontFamily ? { fontFamily } : {},
225129
- ...fontSize !== undefined ? { fontSize } : {},
225856
+ ...fontSize !== undefined ? { fontSize } : styleCtx ? { fontSize: resolveBlockFontSizePt(styleCtx, styleId) } : {},
225130
225857
  ...bold2 ? { bold: bold2 } : {},
225131
225858
  ...underline ? { underline } : {},
225132
225859
  ...color2 ? { color: color2 } : {},
@@ -225198,10 +225925,12 @@ function blocksListWrapper(editor, input2) {
225198
225925
  const limit = input2?.limit ?? total;
225199
225926
  const paged = filtered.slice(offset$1, offset$1 + limit);
225200
225927
  const rev = getRevision(editor);
225928
+ const styleCtx = buildStyleContext(editor);
225201
225929
  return {
225202
225930
  total,
225203
225931
  blocks: paged.map((candidate, i4) => {
225204
225932
  const textLength = computeTextContentLength(candidate.node);
225933
+ const fullText = input2?.includeText ? extractBlockText$1(candidate.node) : undefined;
225205
225934
  const ref$1 = textLength > 0 ? encodeV4Ref({
225206
225935
  v: 4,
225207
225936
  rev,
@@ -225220,8 +225949,9 @@ function blocksListWrapper(editor, input2) {
225220
225949
  nodeId: candidate.nodeId,
225221
225950
  nodeType: candidate.nodeType,
225222
225951
  textPreview: extractTextPreview(candidate.node),
225952
+ ...fullText !== undefined ? { text: fullText } : {},
225223
225953
  isEmpty: textLength === 0,
225224
- ...extractBlockFormatting(candidate.node),
225954
+ ...extractBlockFormatting(candidate.node, styleCtx),
225225
225955
  ...ref$1 ? { ref: ref$1 } : {}
225226
225956
  };
225227
225957
  }),
@@ -226844,360 +227574,6 @@ function stylesApplyAdapter(editor, input2, options) {
226844
227574
  }
226845
227575
  }).result;
226846
227576
  }
226847
- function resolveParagraphBlock(editor, target) {
226848
- const candidate = findBlockByIdStrict(getBlockIndex(editor), target);
226849
- if (!PARAGRAPH_NODE_TYPES.has(candidate.nodeType))
226850
- throw new DocumentApiAdapterError("INVALID_TARGET", `format.paragraph.* / styles.paragraph.* operations require a paragraph, heading, or listItem target. Got "${candidate.nodeType}".`, { nodeType: candidate.nodeType });
226851
- return candidate;
226852
- }
226853
- function successResult(target) {
226854
- return {
226855
- success: true,
226856
- target,
226857
- resolution: { target }
226858
- };
226859
- }
226860
- function noOpResult(operation) {
226861
- return {
226862
- success: false,
226863
- failure: {
226864
- code: "NO_OP",
226865
- message: `${operation} produced no changes.`
226866
- }
226867
- };
226868
- }
226869
- function getPreservedCharacterStyleAttrs(mark2) {
226870
- const styleId = mark2.attrs?.[TEXT_STYLE_CHARACTER_STYLE_ATTR];
226871
- if (typeof styleId !== "string" || styleId.length === 0)
226872
- return null;
226873
- return { [TEXT_STYLE_CHARACTER_STYLE_ATTR]: styleId };
226874
- }
226875
- function hasTextStyleDirectFormatting(mark2) {
226876
- return Object.entries(mark2.attrs ?? {}).some(([key2, value]) => key2 !== TEXT_STYLE_CHARACTER_STYLE_ATTR && value != null);
226877
- }
226878
- function clearTextStyleDirectFormatting(tr, from$1, to, mark2) {
226879
- const preservedCharacterStyle = getPreservedCharacterStyleAttrs(mark2);
226880
- const hadDirectFormatting = hasTextStyleDirectFormatting(mark2);
226881
- if (!hadDirectFormatting && preservedCharacterStyle)
226882
- return false;
226883
- tr.removeMark?.(from$1, to, mark2);
226884
- if (hadDirectFormatting && preservedCharacterStyle && mark2.type?.create && tr.addMark)
226885
- tr.addMark(from$1, to, mark2.type.create(preservedCharacterStyle));
226886
- return true;
226887
- }
226888
- function clearDirectFormattingInBlock(tr, pos, nodeSize2) {
226889
- if (!tr.doc?.nodesBetween || !tr.removeMark || nodeSize2 <= 2)
226890
- return false;
226891
- let changed = false;
226892
- tr.doc.nodesBetween(pos + 1, pos + nodeSize2 - 1, (node3, nodePos) => {
226893
- if (!node3.isText || !Array.isArray(node3.marks) || node3.marks.length === 0 || typeof node3.nodeSize !== "number")
226894
- return true;
226895
- node3.marks.forEach((mark2) => {
226896
- const markName = mark2?.type?.name;
226897
- if (!markName || !DIRECT_FORMATTING_MARK_NAMES.has(markName))
226898
- return;
226899
- if (markName === "textStyle") {
226900
- changed = clearTextStyleDirectFormatting(tr, nodePos, nodePos + node3.nodeSize, mark2) || changed;
226901
- return;
226902
- }
226903
- tr.removeMark(nodePos, nodePos + node3.nodeSize, mark2);
226904
- changed = true;
226905
- });
226906
- return true;
226907
- });
226908
- return changed;
226909
- }
226910
- function mutateParagraphProperties(editor, candidate, operation, target, transform, options, extras) {
226911
- if (options?.dryRun)
226912
- return successResult(target);
226913
- if (executeDomainCommand(editor, () => {
226914
- const node3 = editor.state.doc.nodeAt(candidate.pos);
226915
- if (!node3)
226916
- return false;
226917
- const existing = node3.attrs.paragraphProperties ?? {};
226918
- const updated = transform({ ...existing });
226919
- if (JSON.stringify(existing) === JSON.stringify(updated))
226920
- return false;
226921
- const tr = editor.state.tr;
226922
- if (extras?.clearDirectFormatting)
226923
- clearDirectFormattingInBlock(tr, candidate.pos, node3.nodeSize);
226924
- tr.setNodeMarkup(candidate.pos, undefined, {
226925
- ...node3.attrs,
226926
- paragraphProperties: updated
226927
- });
226928
- editor.dispatch(tr);
226929
- clearIndexCache(editor);
226930
- return true;
226931
- }, { expectedRevision: options?.expectedRevision }).steps[0]?.effect !== "changed")
226932
- return noOpResult(operation);
226933
- return successResult(target);
226934
- }
226935
- function mergeDefinedFields(existing, patch3) {
226936
- const result = { ...existing ?? {} };
226937
- for (const [key2, value] of Object.entries(patch3))
226938
- if (value !== undefined)
226939
- result[key2] = value;
226940
- return result;
226941
- }
226942
- function mergeIndentationFields(existing, patch3) {
226943
- const result = mergeDefinedFields(existing, patch3);
226944
- const firstLineWasUpdated = patch3.firstLine !== undefined;
226945
- const hangingWasUpdated = patch3.hanging !== undefined;
226946
- if (firstLineWasUpdated && !hangingWasUpdated)
226947
- delete result.hanging;
226948
- if (hangingWasUpdated && !firstLineWasUpdated)
226949
- delete result.firstLine;
226950
- return result;
226951
- }
226952
- function deleteKey(obj, key2) {
226953
- const result = { ...obj };
226954
- delete result[key2];
226955
- return Object.keys(result).length > 0 ? result : undefined;
226956
- }
226957
- function addOrReplaceTabStop(existing, entry) {
226958
- return [...(existing ?? []).filter((t) => t.tab.pos !== entry.tab.pos), entry].sort((a2, b$1) => a2.tab.pos - b$1.tab.pos);
226959
- }
226960
- function removeTabStop(existing, position4) {
226961
- const filtered = (existing ?? []).filter((t) => t.tab.pos !== position4);
226962
- return filtered.length > 0 ? filtered : undefined;
226963
- }
226964
- function paragraphsSetStyleWrapper(editor, input2, options) {
226965
- rejectTrackedMode("styles.paragraph.setStyle", options);
226966
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "styles.paragraph.setStyle", input2.target, (pPr) => ({
226967
- ...pPr,
226968
- styleId: input2.styleId
226969
- }), options, { clearDirectFormatting: true });
226970
- }
226971
- function paragraphsClearStyleWrapper(editor, input2, options) {
226972
- rejectTrackedMode("styles.paragraph.clearStyle", options);
226973
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "styles.paragraph.clearStyle", input2.target, (pPr) => {
226974
- const result = { ...pPr };
226975
- delete result.styleId;
226976
- return result;
226977
- }, options);
226978
- }
226979
- function paragraphsResetDirectFormattingWrapper(editor, input2, options) {
226980
- rejectTrackedMode("format.paragraph.resetDirectFormatting", options);
226981
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.resetDirectFormatting", input2.target, (pPr) => {
226982
- const result = {};
226983
- if (pPr.styleId !== undefined)
226984
- result.styleId = pPr.styleId;
226985
- if (pPr.numberingProperties !== undefined)
226986
- result.numberingProperties = pPr.numberingProperties;
226987
- if (pPr.sectPr !== undefined)
226988
- result.sectPr = pPr.sectPr;
226989
- return result;
226990
- }, options);
226991
- }
226992
- function paragraphsSetAlignmentWrapper(editor, input2, options) {
226993
- rejectTrackedMode("format.paragraph.setAlignment", options);
226994
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setAlignment", input2.target, (pPr) => ({
226995
- ...pPr,
226996
- justification: ALIGNMENT_TO_JUSTIFICATION[input2.alignment]
226997
- }), options);
226998
- }
226999
- function paragraphsClearAlignmentWrapper(editor, input2, options) {
227000
- rejectTrackedMode("format.paragraph.clearAlignment", options);
227001
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearAlignment", input2.target, (pPr) => {
227002
- const result = { ...pPr };
227003
- delete result.justification;
227004
- return result;
227005
- }, options);
227006
- }
227007
- function paragraphsSetIndentationWrapper(editor, input2, options) {
227008
- rejectTrackedMode("format.paragraph.setIndentation", options);
227009
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setIndentation", input2.target, (pPr) => ({
227010
- ...pPr,
227011
- indent: mergeIndentationFields(pPr.indent, {
227012
- left: input2.left,
227013
- right: input2.right,
227014
- firstLine: input2.firstLine,
227015
- hanging: input2.hanging
227016
- })
227017
- }), options);
227018
- }
227019
- function paragraphsClearIndentationWrapper(editor, input2, options) {
227020
- rejectTrackedMode("format.paragraph.clearIndentation", options);
227021
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearIndentation", input2.target, (pPr) => {
227022
- const result = { ...pPr };
227023
- delete result.indent;
227024
- return result;
227025
- }, options);
227026
- }
227027
- function paragraphsSetSpacingWrapper(editor, input2, options) {
227028
- rejectTrackedMode("format.paragraph.setSpacing", options);
227029
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setSpacing", input2.target, (pPr) => ({
227030
- ...pPr,
227031
- spacing: mergeDefinedFields(pPr.spacing, {
227032
- before: input2.before,
227033
- after: input2.after,
227034
- line: input2.line,
227035
- lineRule: input2.lineRule
227036
- })
227037
- }), options);
227038
- }
227039
- function paragraphsClearSpacingWrapper(editor, input2, options) {
227040
- rejectTrackedMode("format.paragraph.clearSpacing", options);
227041
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearSpacing", input2.target, (pPr) => {
227042
- const result = { ...pPr };
227043
- delete result.spacing;
227044
- return result;
227045
- }, options);
227046
- }
227047
- function paragraphsSetKeepOptionsWrapper(editor, input2, options) {
227048
- rejectTrackedMode("format.paragraph.setKeepOptions", options);
227049
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setKeepOptions", input2.target, (pPr) => {
227050
- const result = { ...pPr };
227051
- if (input2.keepNext !== undefined)
227052
- result.keepNext = input2.keepNext;
227053
- if (input2.keepLines !== undefined)
227054
- result.keepLines = input2.keepLines;
227055
- if (input2.widowControl !== undefined)
227056
- result.widowControl = input2.widowControl;
227057
- return result;
227058
- }, options);
227059
- }
227060
- function paragraphsSetOutlineLevelWrapper(editor, input2, options) {
227061
- rejectTrackedMode("format.paragraph.setOutlineLevel", options);
227062
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setOutlineLevel", input2.target, (pPr) => {
227063
- if (input2.outlineLevel === null) {
227064
- const result = { ...pPr };
227065
- delete result.outlineLvl;
227066
- return result;
227067
- }
227068
- return {
227069
- ...pPr,
227070
- outlineLvl: input2.outlineLevel
227071
- };
227072
- }, options);
227073
- }
227074
- function paragraphsSetFlowOptionsWrapper(editor, input2, options) {
227075
- rejectTrackedMode("format.paragraph.setFlowOptions", options);
227076
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setFlowOptions", input2.target, (pPr) => {
227077
- const result = { ...pPr };
227078
- if (input2.contextualSpacing !== undefined)
227079
- result.contextualSpacing = input2.contextualSpacing;
227080
- if (input2.pageBreakBefore !== undefined)
227081
- result.pageBreakBefore = input2.pageBreakBefore;
227082
- if (input2.suppressAutoHyphens !== undefined)
227083
- result.suppressAutoHyphens = input2.suppressAutoHyphens;
227084
- return result;
227085
- }, options);
227086
- }
227087
- function paragraphsSetTabStopWrapper(editor, input2, options) {
227088
- rejectTrackedMode("format.paragraph.setTabStop", options);
227089
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setTabStop", input2.target, (pPr) => {
227090
- const entry = { tab: {
227091
- pos: input2.position,
227092
- tabType: input2.alignment,
227093
- ...input2.leader !== undefined && { leader: input2.leader }
227094
- } };
227095
- return {
227096
- ...pPr,
227097
- tabStops: addOrReplaceTabStop(pPr.tabStops, entry)
227098
- };
227099
- }, options);
227100
- }
227101
- function paragraphsClearTabStopWrapper(editor, input2, options) {
227102
- rejectTrackedMode("format.paragraph.clearTabStop", options);
227103
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearTabStop", input2.target, (pPr) => {
227104
- const updated = removeTabStop(pPr.tabStops, input2.position);
227105
- if (updated === undefined) {
227106
- const result = { ...pPr };
227107
- delete result.tabStops;
227108
- return result;
227109
- }
227110
- return {
227111
- ...pPr,
227112
- tabStops: updated
227113
- };
227114
- }, options);
227115
- }
227116
- function paragraphsClearAllTabStopsWrapper(editor, input2, options) {
227117
- rejectTrackedMode("format.paragraph.clearAllTabStops", options);
227118
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearAllTabStops", input2.target, (pPr) => {
227119
- const result = { ...pPr };
227120
- delete result.tabStops;
227121
- return result;
227122
- }, options);
227123
- }
227124
- function paragraphsSetBorderWrapper(editor, input2, options) {
227125
- rejectTrackedMode("format.paragraph.setBorder", options);
227126
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setBorder", input2.target, (pPr) => {
227127
- const existing = pPr.borders ?? {};
227128
- const border = { val: input2.style };
227129
- if (input2.color !== undefined)
227130
- border.color = input2.color;
227131
- if (input2.size !== undefined)
227132
- border.size = input2.size;
227133
- if (input2.space !== undefined)
227134
- border.space = input2.space;
227135
- return {
227136
- ...pPr,
227137
- borders: {
227138
- ...existing,
227139
- [input2.side]: border
227140
- }
227141
- };
227142
- }, options);
227143
- }
227144
- function paragraphsClearBorderWrapper(editor, input2, options) {
227145
- rejectTrackedMode("format.paragraph.clearBorder", options);
227146
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearBorder", input2.target, (pPr) => {
227147
- if (input2.side === "all") {
227148
- const result = { ...pPr };
227149
- delete result.borders;
227150
- return result;
227151
- }
227152
- const updated = deleteKey(pPr.borders ?? {}, input2.side);
227153
- if (updated === undefined) {
227154
- const result = { ...pPr };
227155
- delete result.borders;
227156
- return result;
227157
- }
227158
- return {
227159
- ...pPr,
227160
- borders: updated
227161
- };
227162
- }, options);
227163
- }
227164
- function paragraphsSetShadingWrapper(editor, input2, options) {
227165
- rejectTrackedMode("format.paragraph.setShading", options);
227166
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setShading", input2.target, (pPr) => ({
227167
- ...pPr,
227168
- shading: mergeDefinedFields(pPr.shading, {
227169
- fill: input2.fill,
227170
- color: input2.color,
227171
- val: input2.pattern
227172
- })
227173
- }), options);
227174
- }
227175
- function paragraphsClearShadingWrapper(editor, input2, options) {
227176
- rejectTrackedMode("format.paragraph.clearShading", options);
227177
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearShading", input2.target, (pPr) => {
227178
- const result = { ...pPr };
227179
- delete result.shading;
227180
- return result;
227181
- }, options);
227182
- }
227183
- function paragraphsSetDirectionWrapper(editor, input2, options) {
227184
- rejectTrackedMode("format.paragraph.setDirection", options);
227185
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.setDirection", input2.target, (pPr) => {
227186
- const result = { ...pPr };
227187
- result.rightToLeft = input2.direction === "rtl";
227188
- if (input2.alignmentPolicy === "matchDirection")
227189
- result.justification = input2.direction === "rtl" ? "right" : "left";
227190
- return result;
227191
- }, options);
227192
- }
227193
- function paragraphsClearDirectionWrapper(editor, input2, options) {
227194
- rejectTrackedMode("format.paragraph.clearDirection", options);
227195
- return mutateParagraphProperties(editor, resolveParagraphBlock(editor, input2.target), "format.paragraph.clearDirection", input2.target, (pPr) => {
227196
- const result = { ...pPr };
227197
- delete result.rightToLeft;
227198
- return result;
227199
- }, options);
227200
- }
227201
227577
  function collectTrackInsertRefsInRange(editor, from$1, to) {
227202
227578
  if (to <= from$1)
227203
227579
  return;
@@ -233302,7 +233678,7 @@ function executeTextStep(ctx$1, targets, step3, rangeExecutor, spanExecutor) {
233302
233678
  };
233303
233679
  }
233304
233680
  function ensureFormatStepCapabilities(ctx$1, step3) {
233305
- const inlineKeys = Object.keys(step3.args.inline);
233681
+ const inlineKeys = step3.args.inline ? Object.keys(step3.args.inline) : [];
233306
233682
  const capabilityIssue = getInlinePropertyCapabilityIssue(ctx$1.editor, inlineKeys, step3.op);
233307
233683
  if (capabilityIssue)
233308
233684
  throw planError(capabilityIssue.code, capabilityIssue.message, step3.id, capabilityIssue.details);
@@ -273909,7 +274285,7 @@ var Node$13 = class Node$14 {
273909
274285
  console.warn("Failed to initialize developer tools:", error3);
273910
274286
  }
273911
274287
  }
273912
- }, 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, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, DEBUG_TEXT_REWRITE, 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, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, FALLBACK_STORE_KEY = "__documentApiComments", REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, 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, 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.26.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension3) => {
274288
+ }, 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, registry, VALID_CREATE_POSITIONS, REF_HANDLERS, STEP_INTERACTION_MATRIX, MATRIX_EXEMPT_OPS, PARAGRAPH_NODE_TYPES, TEXT_STYLE_CHARACTER_STYLE_ATTR = "styleId", DIRECT_FORMATTING_MARK_NAMES, ALIGNMENT_TO_JUSTIFICATION, DEFAULT_INLINE_POLICY, CORE_SET_MARK_KEYS, DEBUG_TEXT_REWRITE, 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, SUPPORTED_DELETE_NODE_TYPES3, REJECTED_DELETE_NODE_TYPES3, TEXT_PREVIEW_MAX_LENGTH = 80, RANGE_DELETE_SAFE_NODE_TYPES, HEADING_PATTERN, OOXML_DEFAULT_FONT_SIZE_PT = 10, FALLBACK_STORE_KEY = "__documentApiComments", REQUIRED_COMMANDS, VALID_CAPABILITY_REASON_CODES, REQUIRED_HELPERS, SCHEMA_NODE_GATES, schemaGatedIds, SUPPORTED_NON_UNIFORM_STRATEGIES, SUPPORTED_SET_MARKS, REGEX_MAX_PATTERN_LENGTH = 1024, 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, 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.26.0", PIXELS_PER_INCH2 = 96, MAX_HEIGHT_BUFFER_PX = 50, MAX_WIDTH_BUFFER_PX = 20, cloneExtensionInstance = (extension3) => {
273913
274289
  const extensionLike = extension3;
273914
274290
  const config2 = extensionLike?.config;
273915
274291
  const ExtensionCtor = extensionLike?.constructor;
@@ -287758,12 +288134,12 @@ var Node$13 = class Node$14 {
287758
288134
  return;
287759
288135
  console.log(...args$1);
287760
288136
  }, 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;
287761
- var init_src_CXW8xV2H_es = __esm(() => {
288137
+ var init_src_966rF_JP_es = __esm(() => {
287762
288138
  init_rolldown_runtime_Bg48TavK_es();
287763
- init_SuperConverter_CWhofwLf_es();
288139
+ init_SuperConverter_w6yaFRT5_es();
287764
288140
  init_jszip_C49i9kUs_es();
287765
288141
  init_uuid_qzgm05fK_es();
287766
- init_create_headless_toolbar_C2iuH72Y_es();
288142
+ init_create_headless_toolbar_CHK8yJic_es();
287767
288143
  init_constants_CGhJRd87_es();
287768
288144
  init_dist_B8HfvhaK_es();
287769
288145
  init_unified_Dsuw2be5_es();
@@ -310229,6 +310605,27 @@ function print() { __p += __j.call(arguments, '') }
310229
310605
  ["text.insert::text.insert::same_target", "reject"]
310230
310606
  ]);
310231
310607
  MATRIX_EXEMPT_OPS = new Set(["assert"]);
310608
+ PARAGRAPH_NODE_TYPES = new Set([
310609
+ "paragraph",
310610
+ "heading",
310611
+ "listItem"
310612
+ ]);
310613
+ DIRECT_FORMATTING_MARK_NAMES = new Set([
310614
+ "textStyle",
310615
+ "bold",
310616
+ "italic",
310617
+ "underline",
310618
+ "strike",
310619
+ "subscript",
310620
+ "superscript",
310621
+ "highlight"
310622
+ ]);
310623
+ ALIGNMENT_TO_JUSTIFICATION = {
310624
+ left: "left",
310625
+ center: "center",
310626
+ right: "right",
310627
+ justify: "both"
310628
+ };
310232
310629
  DEFAULT_INLINE_POLICY = {
310233
310630
  mode: "preserve",
310234
310631
  onNonUniform: "majority"
@@ -310756,27 +311153,6 @@ function print() { __p += __j.call(arguments, '') }
310756
311153
  underline: new Set(["color", "w:color"]),
310757
311154
  borders: new Set(["color"])
310758
311155
  };
310759
- PARAGRAPH_NODE_TYPES = new Set([
310760
- "paragraph",
310761
- "heading",
310762
- "listItem"
310763
- ]);
310764
- DIRECT_FORMATTING_MARK_NAMES = new Set([
310765
- "textStyle",
310766
- "bold",
310767
- "italic",
310768
- "underline",
310769
- "strike",
310770
- "subscript",
310771
- "superscript",
310772
- "highlight"
310773
- ]);
310774
- ALIGNMENT_TO_JUSTIFICATION = {
310775
- left: "left",
310776
- center: "center",
310777
- right: "right",
310778
- justify: "both"
310779
- };
310780
311156
  ORDERED_PRESET_CONFIG = {
310781
311157
  decimal: {
310782
311158
  numFmt: "decimal",
@@ -322518,11 +322894,11 @@ var init_zipper_DbkgrypV_es = __esm(() => {
322518
322894
 
322519
322895
  // ../../packages/superdoc/dist/super-editor.es.js
322520
322896
  var init_super_editor_es = __esm(() => {
322521
- init_src_CXW8xV2H_es();
322522
- init_SuperConverter_CWhofwLf_es();
322897
+ init_src_966rF_JP_es();
322898
+ init_SuperConverter_w6yaFRT5_es();
322523
322899
  init_jszip_C49i9kUs_es();
322524
322900
  init_xml_js_CqGKpaft_es();
322525
- init_create_headless_toolbar_C2iuH72Y_es();
322901
+ init_create_headless_toolbar_CHK8yJic_es();
322526
322902
  init_constants_CGhJRd87_es();
322527
322903
  init_dist_B8HfvhaK_es();
322528
322904
  init_unified_Dsuw2be5_es();
@@ -375090,6 +375466,31 @@ function extractConstValues(variants) {
375090
375466
  }
375091
375467
  return values2;
375092
375468
  }
375469
+ function isNestedValidationMessage(path2, message) {
375470
+ return message.startsWith(`${path2}.`) || message.startsWith(`${path2}[`);
375471
+ }
375472
+ function selectRepeatedActionableOneOfError(path2, errors2) {
375473
+ const counts = new Map;
375474
+ for (const error4 of errors2) {
375475
+ counts.set(error4, (counts.get(error4) ?? 0) + 1);
375476
+ }
375477
+ let bestMessage = null;
375478
+ let bestScore = 0;
375479
+ for (const [message, count2] of counts.entries()) {
375480
+ if (count2 < 2)
375481
+ continue;
375482
+ const nested = isNestedValidationMessage(path2, message);
375483
+ const isShapeError = message.includes(" is not allowed by schema.") || message.includes(" is required.");
375484
+ if (!nested && !isShapeError)
375485
+ continue;
375486
+ const score = count2 * 10 + (nested ? 2 : 0) + (isShapeError ? 1 : 0);
375487
+ if (score > bestScore) {
375488
+ bestScore = score;
375489
+ bestMessage = message;
375490
+ }
375491
+ }
375492
+ return bestMessage;
375493
+ }
375093
375494
  function validateValueAgainstTypeSpec(value2, schema, path2) {
375094
375495
  if ("const" in schema) {
375095
375496
  if (value2 !== schema.const) {
@@ -375109,8 +375510,9 @@ function validateValueAgainstTypeSpec(value2, schema, path2) {
375109
375510
  }
375110
375511
  }
375111
375512
  const allowedValues = extractConstValues(variants);
375112
- const message = allowedValues.length > 0 ? `${path2} must be one of: ${allowedValues.join(", ")}.` : `${path2} must match one of the allowed schema variants.`;
375113
- throw new CliError("VALIDATION_ERROR", message, { errors: errors2 });
375513
+ const selectedError = selectRepeatedActionableOneOfError(path2, errors2);
375514
+ const message = allowedValues.length > 0 ? `${path2} must be one of: ${allowedValues.join(", ")}.` : selectedError ?? `${path2} must match one of the allowed schema variants.`;
375515
+ throw new CliError("VALIDATION_ERROR", message, { errors: errors2, selectedError });
375114
375516
  }
375115
375517
  if (schema.type === "json")
375116
375518
  return;
@@ -375189,7 +375591,11 @@ function validateResponseValueAgainstTypeSpec(value2, schema, path2) {
375189
375591
  errors2.push(error4 instanceof Error ? error4.message : String(error4));
375190
375592
  }
375191
375593
  }
375192
- throw new CliError("VALIDATION_ERROR", `${path2} must match one of the allowed schema variants.`, { errors: errors2 });
375594
+ const selectedError = selectRepeatedActionableOneOfError(path2, errors2);
375595
+ throw new CliError("VALIDATION_ERROR", selectedError ?? `${path2} must match one of the allowed schema variants.`, {
375596
+ errors: errors2,
375597
+ selectedError
375598
+ });
375193
375599
  }
375194
375600
  if (schema.type === "json")
375195
375601
  return;