@superdoc-dev/cli 0.16.0-next.13 → 0.16.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 +908 -342
  2. package/package.json +8 -8
package/dist/index.js CHANGED
@@ -68110,7 +68110,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
68110
68110
  emptyOptions2 = {};
68111
68111
  });
68112
68112
 
68113
- // ../../packages/superdoc/dist/chunks/SuperConverter-CcHCWpfX.es.js
68113
+ // ../../packages/superdoc/dist/chunks/SuperConverter-CvwFiCth.es.js
68114
68114
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
68115
68115
  const fieldValue = extension$1.config[field];
68116
68116
  if (typeof fieldValue === "function")
@@ -77655,6 +77655,46 @@ function effectiveTableCellSpacing(spacing, isBoundary, padding) {
77655
77655
  return 0;
77656
77656
  return isBoundary ? Math.max(0, spacing - padding) : spacing;
77657
77657
  }
77658
+ function selectHeaderFooterVariantForPage({ documentPageNumber, sectionPageNumber, titlePg, alternateHeaders }) {
77659
+ if (!Number.isFinite(documentPageNumber) || !Number.isFinite(sectionPageNumber))
77660
+ return null;
77661
+ if (sectionPageNumber < 1)
77662
+ return null;
77663
+ if (sectionPageNumber === 1 && titlePg === true)
77664
+ return "first";
77665
+ if (alternateHeaders === true)
77666
+ return documentPageNumber % 2 === 0 ? "even" : "odd";
77667
+ return "default";
77668
+ }
77669
+ function candidateVariantsFor(variant) {
77670
+ return variant === "odd" ? ["odd", "default"] : [variant];
77671
+ }
77672
+ function sectionRefsFor(section, kind) {
77673
+ return kind === "header" ? section?.headerRefs : section?.footerRefs;
77674
+ }
77675
+ function resolveEffectiveHeaderFooterRef({ sections, sectionIndex, kind, variant }) {
77676
+ if (sectionIndex < 0)
77677
+ return null;
77678
+ const sectionsByIndex = /* @__PURE__ */ new Map;
77679
+ for (const section of sections)
77680
+ sectionsByIndex.set(section.sectionIndex, section);
77681
+ const candidates = candidateVariantsFor(variant);
77682
+ for (let currentIndex = sectionIndex;currentIndex >= 0; currentIndex -= 1) {
77683
+ const refs = sectionRefsFor(sectionsByIndex.get(currentIndex), kind);
77684
+ if (!refs)
77685
+ continue;
77686
+ for (const candidate of candidates) {
77687
+ const refId = refs[candidate];
77688
+ if (refId)
77689
+ return {
77690
+ refId,
77691
+ matchedSectionIndex: currentIndex,
77692
+ matchedVariant: candidate
77693
+ };
77694
+ }
77695
+ }
77696
+ return null;
77697
+ }
77658
77698
  function rescaleColumnWidths(measureColumnWidths, measureTotalWidth, fragmentWidth) {
77659
77699
  if (!measureColumnWidths || measureColumnWidths.length === 0 || measureTotalWidth <= fragmentWidth || measureTotalWidth <= 0)
77660
77700
  return;
@@ -78058,6 +78098,77 @@ function getSdtContainerKeyForBlock(block) {
78058
78098
  return null;
78059
78099
  return getSdtContainerKey(block.attrs?.sdt, block.attrs?.containerSdt);
78060
78100
  }
78101
+ function toUpperRoman$1(value) {
78102
+ if (value < 1 || value > 3999)
78103
+ return String(value);
78104
+ const values = [
78105
+ 1000,
78106
+ 900,
78107
+ 500,
78108
+ 400,
78109
+ 100,
78110
+ 90,
78111
+ 50,
78112
+ 40,
78113
+ 10,
78114
+ 9,
78115
+ 5,
78116
+ 4,
78117
+ 1
78118
+ ];
78119
+ const numerals = [
78120
+ "M",
78121
+ "CM",
78122
+ "D",
78123
+ "CD",
78124
+ "C",
78125
+ "XC",
78126
+ "L",
78127
+ "XL",
78128
+ "X",
78129
+ "IX",
78130
+ "V",
78131
+ "IV",
78132
+ "I"
78133
+ ];
78134
+ let remaining = value;
78135
+ let result = "";
78136
+ for (let i$1 = 0;i$1 < values.length; i$1 += 1)
78137
+ while (remaining >= values[i$1]) {
78138
+ result += numerals[i$1];
78139
+ remaining -= values[i$1];
78140
+ }
78141
+ return result;
78142
+ }
78143
+ function toUpperLetter$1(value) {
78144
+ const normalized = Math.max(1, value);
78145
+ const index2 = (normalized - 1) % 26;
78146
+ const repeatCount = Math.floor((normalized - 1) / 26) + 1;
78147
+ return String.fromCharCode(65 + index2).repeat(repeatCount);
78148
+ }
78149
+ function formatPageNumber(pageNumber, format) {
78150
+ const value = Math.max(1, Math.trunc(Number.isFinite(pageNumber) ? pageNumber : 1));
78151
+ switch (format) {
78152
+ case "upperRoman":
78153
+ return toUpperRoman$1(value);
78154
+ case "lowerRoman":
78155
+ return toUpperRoman$1(value).toLowerCase();
78156
+ case "upperLetter":
78157
+ return toUpperLetter$1(value);
78158
+ case "lowerLetter":
78159
+ return toUpperLetter$1(value).toLowerCase();
78160
+ case "numberInDash":
78161
+ return `- ${value} -`;
78162
+ case "decimal":
78163
+ default:
78164
+ return String(value);
78165
+ }
78166
+ }
78167
+ function formatPageNumberFieldValue$1(pageNumber, fieldFormat) {
78168
+ const format = fieldFormat?.format ?? "decimal";
78169
+ const formatted = formatPageNumber(pageNumber, format);
78170
+ return fieldFormat?.zeroPadding && format === "decimal" ? formatted.padStart(fieldFormat.zeroPadding, "0") : formatted;
78171
+ }
78061
78172
  function resolveSpacingIndent(style, numbering) {
78062
78173
  const spacing = {
78063
78174
  before: style.spacing?.before ?? 0,
@@ -82446,10 +82557,48 @@ function convertTiffToPng(data) {
82446
82557
  return null;
82447
82558
  }
82448
82559
  }
82449
- function preProcessPageInstruction(nodesToCombine, _instrText, fieldRunRPr = null) {
82560
+ function parsePageNumberFieldSwitches(instruction, fieldType) {
82561
+ const normalizedInstruction = typeof instruction === "string" ? instruction.trim().replace(/\s+/g, " ") : fieldType;
82562
+ const result = {};
82563
+ if (normalizedInstruction && normalizedInstruction !== fieldType)
82564
+ result.instruction = normalizedInstruction;
82565
+ for (const match of normalizedInstruction.matchAll(/\\\*\s+("[^"]+"|\S+)/g)) {
82566
+ const rawValue = unquote(match[1]);
82567
+ const mapped = GENERAL_FORMATS.get(rawValue) ?? CASE_INSENSITIVE_GENERAL_FORMATS.get(rawValue.toLowerCase());
82568
+ if (mapped) {
82569
+ result.pageNumberFormat = mapped;
82570
+ break;
82571
+ }
82572
+ }
82573
+ for (const match of normalizedInstruction.matchAll(/\\#\s+("[^"]+"|\S+)/g)) {
82574
+ const picture = unquote(match[1]);
82575
+ if (/^0+$/.test(picture)) {
82576
+ result.pageNumberFormat ??= "decimal";
82577
+ result.pageNumberZeroPadding = picture.length;
82578
+ break;
82579
+ }
82580
+ }
82581
+ return result;
82582
+ }
82583
+ function formatPageNumberFieldValue(pageNumber, attrs = {}) {
82584
+ return formatPageNumberFieldValue$1(pageNumber, {
82585
+ format: attrs.pageNumberFormat || "decimal",
82586
+ zeroPadding: attrs.pageNumberZeroPadding ?? undefined
82587
+ });
82588
+ }
82589
+ function unquote(value) {
82590
+ return value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1) : value;
82591
+ }
82592
+ function preProcessPageInstruction(nodesToCombine, instrText = "PAGE", options = {}) {
82593
+ const fieldRunRPr = options.fieldRunRPr ?? null;
82594
+ const normalizedInstruction = typeof instrText === "string" && instrText.trim() ? instrText.trim().replace(/\s+/g, " ") : "PAGE";
82450
82595
  const pageNumNode = {
82451
82596
  name: "sd:autoPageNumber",
82452
- type: "element"
82597
+ type: "element",
82598
+ attributes: {
82599
+ instruction: normalizedInstruction,
82600
+ ...parsePageNumberFieldSwitches(normalizedInstruction, "PAGE")
82601
+ }
82453
82602
  };
82454
82603
  let foundContentRPr = false;
82455
82604
  nodesToCombine.forEach((n) => {
@@ -82463,11 +82612,12 @@ function preProcessPageInstruction(nodesToCombine, _instrText, fieldRunRPr = nul
82463
82612
  pageNumNode.elements = [fieldRunRPr];
82464
82613
  return [pageNumNode];
82465
82614
  }
82466
- function preProcessNumPagesInstruction(nodesToCombine, _instrText, fieldRunRPr = null) {
82615
+ function preProcessNumPagesInstruction(nodesToCombine, instrText = "NUMPAGES", options = {}) {
82616
+ const fieldRunRPr = options.fieldRunRPr ?? null;
82467
82617
  const totalPageNumNode = {
82468
82618
  name: "sd:totalPageNumber",
82469
82619
  type: "element",
82470
- attributes: {}
82620
+ attributes: { ...parsePageNumberFieldSwitches(instrText, "NUMPAGES") }
82471
82621
  };
82472
82622
  const cachedText = extractCachedText$1(nodesToCombine);
82473
82623
  if (cachedText)
@@ -82496,7 +82646,7 @@ function extractCachedText$1(nodes) {
82496
82646
  }
82497
82647
  return texts.join("");
82498
82648
  }
82499
- function preProcessPageRefInstruction(nodesToCombine, instrText) {
82649
+ function preProcessPageRefInstruction(nodesToCombine, instrText, options = {}) {
82500
82650
  return [{
82501
82651
  name: "sd:pageReference",
82502
82652
  type: "element",
@@ -82505,7 +82655,7 @@ function preProcessPageRefInstruction(nodesToCombine, instrText) {
82505
82655
  }];
82506
82656
  }
82507
82657
  function resolveHyperlinkAttributes(instruction, docx) {
82508
- const urlMatch = instruction.match(/HYPERLINK\s+"([^"]+)"/);
82658
+ const urlMatch = instruction.match(/^\s*HYPERLINK\s+"([^"]+)"/i);
82509
82659
  if (urlMatch && urlMatch.length >= 2) {
82510
82660
  const url2 = urlMatch[1];
82511
82661
  const relationships = docx?.["word/_rels/document.xml.rels"]?.elements?.find((el) => el.name === "Relationships");
@@ -82545,7 +82695,8 @@ function resolveHyperlinkAttributes(instruction, docx) {
82545
82695
  return null;
82546
82696
  return { ...parsedSwitches };
82547
82697
  }
82548
- function preProcessHyperlinkInstruction(nodesToCombine, instruction, docx) {
82698
+ function preProcessHyperlinkInstruction(nodesToCombine, instruction, options = {}) {
82699
+ const docx = options.docx;
82549
82700
  return [{
82550
82701
  name: "w:hyperlink",
82551
82702
  type: "element",
@@ -82553,7 +82704,7 @@ function preProcessHyperlinkInstruction(nodesToCombine, instruction, docx) {
82553
82704
  elements: nodesToCombine
82554
82705
  }];
82555
82706
  }
82556
- function preProcessTocInstruction(nodesToCombine, instrText) {
82707
+ function preProcessTocInstruction(nodesToCombine, instrText, options = {}) {
82557
82708
  return [{
82558
82709
  name: "sd:tableOfContents",
82559
82710
  type: "element",
@@ -82604,10 +82755,11 @@ function buildBlockFieldNode(xmlName, nodesToCombine, instrText, instructionToke
82604
82755
  elements: normalizeFieldContentToParagraphs(nodesToCombine)
82605
82756
  }];
82606
82757
  }
82607
- function preProcessIndexInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82608
- return buildBlockFieldNode("sd:index", nodesToCombine, instrText, instructionTokens);
82758
+ function preProcessIndexInstruction(nodesToCombine, instrText, options = {}, legacyInstructionTokens = null) {
82759
+ return buildBlockFieldNode("sd:index", nodesToCombine, instrText, options?.instructionTokens ?? legacyInstructionTokens);
82609
82760
  }
82610
- function preProcessXeInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82761
+ function preProcessXeInstruction(nodesToCombine, instrText, options = {}) {
82762
+ const instructionTokens = options.instructionTokens ?? null;
82611
82763
  return [{
82612
82764
  name: "sd:indexEntry",
82613
82765
  type: "element",
@@ -82618,7 +82770,8 @@ function preProcessXeInstruction(nodesToCombine, instrText, _docx, instructionTo
82618
82770
  elements: nodesToCombine
82619
82771
  }];
82620
82772
  }
82621
- function preProcessTcInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82773
+ function preProcessTcInstruction(nodesToCombine, instrText, options = {}) {
82774
+ const instructionTokens = options.instructionTokens ?? null;
82622
82775
  return [{
82623
82776
  name: "sd:tableOfContentsEntry",
82624
82777
  type: "element",
@@ -82629,7 +82782,7 @@ function preProcessTcInstruction(nodesToCombine, instrText, _docx, instructionTo
82629
82782
  elements: nodesToCombine
82630
82783
  }];
82631
82784
  }
82632
- function preProcessRefInstruction(nodesToCombine, instrText) {
82785
+ function preProcessRefInstruction(nodesToCombine, instrText, options = {}) {
82633
82786
  return [{
82634
82787
  name: "sd:crossReference",
82635
82788
  type: "element",
@@ -82640,7 +82793,7 @@ function preProcessRefInstruction(nodesToCombine, instrText) {
82640
82793
  elements: nodesToCombine
82641
82794
  }];
82642
82795
  }
82643
- function preProcessNoterefInstruction(nodesToCombine, instrText) {
82796
+ function preProcessNoterefInstruction(nodesToCombine, instrText, options = {}) {
82644
82797
  return [{
82645
82798
  name: "sd:crossReference",
82646
82799
  type: "element",
@@ -82651,7 +82804,7 @@ function preProcessNoterefInstruction(nodesToCombine, instrText) {
82651
82804
  elements: nodesToCombine
82652
82805
  }];
82653
82806
  }
82654
- function preProcessStylerefInstruction(nodesToCombine, instrText) {
82807
+ function preProcessStylerefInstruction(nodesToCombine, instrText, options = {}) {
82655
82808
  return [{
82656
82809
  name: "sd:crossReference",
82657
82810
  type: "element",
@@ -82662,7 +82815,8 @@ function preProcessStylerefInstruction(nodesToCombine, instrText) {
82662
82815
  elements: nodesToCombine
82663
82816
  }];
82664
82817
  }
82665
- function preProcessSeqInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82818
+ function preProcessSeqInstruction(nodesToCombine, instrText, options = {}) {
82819
+ const instructionTokens = options.instructionTokens ?? null;
82666
82820
  return [{
82667
82821
  name: "sd:sequenceField",
82668
82822
  type: "element",
@@ -82673,7 +82827,8 @@ function preProcessSeqInstruction(nodesToCombine, instrText, _docx, instructionT
82673
82827
  elements: nodesToCombine
82674
82828
  }];
82675
82829
  }
82676
- function preProcessCitationInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82830
+ function preProcessCitationInstruction(nodesToCombine, instrText, options = {}) {
82831
+ const instructionTokens = options.instructionTokens ?? null;
82677
82832
  return [{
82678
82833
  name: "sd:citation",
82679
82834
  type: "element",
@@ -82684,10 +82839,11 @@ function preProcessCitationInstruction(nodesToCombine, instrText, _docx, instruc
82684
82839
  elements: nodesToCombine
82685
82840
  }];
82686
82841
  }
82687
- function preProcessBibliographyInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82688
- return buildBlockFieldNode("sd:bibliography", nodesToCombine, instrText, instructionTokens);
82842
+ function preProcessBibliographyInstruction(nodesToCombine, instrText, options = {}, legacyInstructionTokens = null) {
82843
+ return buildBlockFieldNode("sd:bibliography", nodesToCombine, instrText, options?.instructionTokens ?? legacyInstructionTokens);
82689
82844
  }
82690
- function preProcessTaInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82845
+ function preProcessTaInstruction(nodesToCombine, instrText, options = {}) {
82846
+ const instructionTokens = options.instructionTokens ?? null;
82691
82847
  return [{
82692
82848
  name: "sd:authorityEntry",
82693
82849
  type: "element",
@@ -82698,11 +82854,11 @@ function preProcessTaInstruction(nodesToCombine, instrText, _docx, instructionTo
82698
82854
  elements: nodesToCombine
82699
82855
  }];
82700
82856
  }
82701
- function preProcessToaInstruction(nodesToCombine, instrText, _docx, instructionTokens = null) {
82702
- return buildBlockFieldNode("sd:tableOfAuthorities", nodesToCombine, instrText, instructionTokens);
82857
+ function preProcessToaInstruction(nodesToCombine, instrText, options = {}, legacyInstructionTokens = null) {
82858
+ return buildBlockFieldNode("sd:tableOfAuthorities", nodesToCombine, instrText, options?.instructionTokens ?? legacyInstructionTokens);
82703
82859
  }
82704
- function preProcessDocumentStatInstruction(nodesToCombine, instrText, _docxOrFieldRunRPr = null, instructionTokensOrFieldRunRPr = null, fieldRunRPr = null) {
82705
- const effectiveFieldRunRPr = fieldRunRPr ?? (instructionTokensOrFieldRunRPr?.name === "w:rPr" ? instructionTokensOrFieldRunRPr : null) ?? (_docxOrFieldRunRPr?.name === "w:rPr" ? _docxOrFieldRunRPr : null);
82860
+ function preProcessDocumentStatInstruction(nodesToCombine, instrText, options = {}) {
82861
+ const fieldRunRPr = options.fieldRunRPr ?? null;
82706
82862
  const statFieldNode = {
82707
82863
  name: "sd:documentStatField",
82708
82864
  type: "element",
@@ -82719,10 +82875,13 @@ function preProcessDocumentStatInstruction(nodesToCombine, instrText, _docxOrFie
82719
82875
  foundContentRPr = true;
82720
82876
  }
82721
82877
  });
82722
- if (!foundContentRPr && effectiveFieldRunRPr && effectiveFieldRunRPr.name === "w:rPr")
82723
- statFieldNode.elements = [effectiveFieldRunRPr, ...nodesToCombine];
82878
+ if (!foundContentRPr && fieldRunRPr && fieldRunRPr.name === "w:rPr")
82879
+ statFieldNode.elements = [fieldRunRPr, ...nodesToCombine];
82724
82880
  return [statFieldNode];
82725
82881
  }
82882
+ function extractFieldKeyword(instruction) {
82883
+ return String(instruction ?? "").trim().split(/\s+/)[0].toUpperCase();
82884
+ }
82726
82885
  function scanFieldSequence(nodes, beginIndex) {
82727
82886
  let instrText = "";
82728
82887
  let separateIndex = -1;
@@ -82754,7 +82913,7 @@ function scanFieldSequence(nodes, beginIndex) {
82754
82913
  if (endIndex === -1)
82755
82914
  return null;
82756
82915
  return {
82757
- fieldType: instrText.trim().split(" ")[0],
82916
+ fieldType: extractFieldKeyword(instrText),
82758
82917
  instrText: instrText.trim(),
82759
82918
  contentNodes,
82760
82919
  fieldRunRPr,
@@ -98239,7 +98398,16 @@ function parseSeqInstruction(instruction) {
98239
98398
  function extractResolvedText(content$2) {
98240
98399
  if (!Array.isArray(content$2))
98241
98400
  return "";
98242
- return content$2.filter((n) => n.type === "text").map((n) => n.text || "").join("");
98401
+ let text$2 = "";
98402
+ for (const node3 of content$2) {
98403
+ if (!node3)
98404
+ continue;
98405
+ if (node3.type === "text")
98406
+ text$2 += node3.text || "";
98407
+ if (Array.isArray(node3.content))
98408
+ text$2 += extractResolvedText(node3.content);
98409
+ }
98410
+ return text$2;
98243
98411
  }
98244
98412
  function deriveRightAlignPageNumbers(content$2) {
98245
98413
  for (const para of content$2) {
@@ -98250,6 +98418,33 @@ function deriveRightAlignPageNumbers(content$2) {
98250
98418
  }
98251
98419
  return true;
98252
98420
  }
98421
+ function pageNumberFormatToInstructionSwitch(pageNumberFormat) {
98422
+ for (const [switchName, format] of Object.entries(PAGE_VALUE_FORMAT_SWITCHES))
98423
+ if (format === pageNumberFormat)
98424
+ return switchName;
98425
+ }
98426
+ function getPageNumberFieldAttrs$1(node3) {
98427
+ const attrs = {};
98428
+ if (node3.attributes?.instruction)
98429
+ attrs.instruction = node3.attributes.instruction;
98430
+ if (node3.attributes?.pageNumberFormat)
98431
+ attrs.pageNumberFormat = node3.attributes.pageNumberFormat;
98432
+ if (node3.attributes?.pageNumberZeroPadding != null)
98433
+ attrs.pageNumberZeroPadding = Number(node3.attributes.pageNumberZeroPadding);
98434
+ return attrs;
98435
+ }
98436
+ function getPageInstructionText(attrs = {}) {
98437
+ if (typeof attrs.instruction === "string" && attrs.instruction.trim())
98438
+ return attrs.instruction.trim();
98439
+ if (typeof attrs.pageNumberFormat === "string") {
98440
+ const instructionSwitch = pageNumberFormatToInstructionSwitch(attrs.pageNumberFormat);
98441
+ if (instructionSwitch)
98442
+ return `PAGE \\* ${instructionSwitch}${typeof attrs.pageNumberZeroPadding === "number" && attrs.pageNumberZeroPadding > 0 ? ` \\# ${"0".repeat(attrs.pageNumberZeroPadding)}` : ""}`;
98443
+ }
98444
+ if (typeof attrs.pageNumberZeroPadding === "number" && attrs.pageNumberZeroPadding > 0)
98445
+ return `PAGE \\# ${"0".repeat(attrs.pageNumberZeroPadding)}`;
98446
+ return "PAGE";
98447
+ }
98253
98448
  function buildComplexFieldRuns({ instruction, cachedText, outputMarks, dirty }) {
98254
98449
  const beginAttrs = { "w:fldCharType": "begin" };
98255
98450
  if (dirty)
@@ -98315,10 +98510,24 @@ function buildComplexFieldRuns({ instruction, cachedText, outputMarks, dirty })
98315
98510
  }
98316
98511
  ];
98317
98512
  }
98513
+ function getPageNumberFieldAttrs(node3) {
98514
+ const attrs = {};
98515
+ if (node3.attributes?.instruction)
98516
+ attrs.instruction = node3.attributes.instruction;
98517
+ if (node3.attributes?.pageNumberFormat)
98518
+ attrs.pageNumberFormat = node3.attributes.pageNumberFormat;
98519
+ if (node3.attributes?.pageNumberZeroPadding != null)
98520
+ attrs.pageNumberZeroPadding = Number(node3.attributes.pageNumberZeroPadding);
98521
+ return attrs;
98522
+ }
98318
98523
  function resolveCachedPageCount(params3, node3) {
98319
98524
  const cacheMap = params3.statFieldCacheMap;
98320
- if (cacheMap?.has?.("NUMPAGES"))
98525
+ if (cacheMap?.has?.("NUMPAGES")) {
98526
+ const pageCount = Number(cacheMap.get("NUMPAGES"));
98527
+ if (node3.attrs?.pageNumberFormat || node3.attrs?.pageNumberZeroPadding)
98528
+ return formatPageNumberFieldValue(pageCount, node3.attrs);
98321
98529
  return String(cacheMap.get("NUMPAGES"));
98530
+ }
98322
98531
  if (node3.attrs?.resolvedText)
98323
98532
  return String(node3.attrs.resolvedText);
98324
98533
  if (node3.attrs?.importedCachedText)
@@ -102320,6 +102529,18 @@ function computeWordParagraphLayout(input) {
102320
102529
  };
102321
102530
  return layout;
102322
102531
  }
102532
+ function getPageNumberFieldFormat(attrs) {
102533
+ if (!attrs)
102534
+ return;
102535
+ const format = typeof attrs.pageNumberFormat === "string" ? attrs.pageNumberFormat : undefined;
102536
+ const zeroPadding = typeof attrs.pageNumberZeroPadding === "number" && Number.isFinite(attrs.pageNumberZeroPadding) ? attrs.pageNumberZeroPadding : undefined;
102537
+ if (!format && !zeroPadding)
102538
+ return;
102539
+ return {
102540
+ ...format ? { format } : {},
102541
+ ...zeroPadding ? { zeroPadding } : {}
102542
+ };
102543
+ }
102323
102544
  function textNodeToRun({ node: node3, positions, storyKey, defaultFont, defaultSize, inheritedMarks = [], sdtMetadata, hyperlinkConfig = DEFAULT_HYPERLINK_CONFIG, themeColors, enableComments, runProperties, inlineRunProperties, converterContext }) {
102324
102545
  let run$1 = {
102325
102546
  text: node3.text || "",
@@ -103545,6 +103766,9 @@ function tokenNodeToRun({ node: node3, positions, storyKey, defaultFont, default
103545
103766
  fontFamily: defaultFont,
103546
103767
  fontSize: defaultSize
103547
103768
  };
103769
+ const pageNumberFieldFormat = getPageNumberFieldFormat(node3.attrs);
103770
+ if (pageNumberFieldFormat)
103771
+ run$1.pageNumberFieldFormat = pageNumberFieldFormat;
103548
103772
  const pos = positions.get(node3);
103549
103773
  if (pos) {
103550
103774
  run$1.pmStart = pos.start;
@@ -107647,31 +107871,29 @@ function createHeaderFooterPart(editor, input) {
107647
107871
  throw new Error(`[createHeaderFooterPart] Failed to create ${newPartPath}: mutation rolled back (possible afterCommit degradation).`);
107648
107872
  return finalResult;
107649
107873
  }
107650
- function resolveEffectiveRef(editor, sections, startSectionIndex, kind, variant) {
107651
- for (let i$1 = startSectionIndex - 1;i$1 >= 0; i$1--) {
107652
- const section = sections.find((s) => s.range.sectionIndex === i$1);
107653
- if (!section)
107654
- continue;
107655
- const sectPr = readTargetSectPr(editor, section);
107656
- if (!sectPr)
107657
- continue;
107658
- const refs = readSectPrHeaderFooterRefs(sectPr, kind);
107659
- if (!refs)
107660
- continue;
107661
- if (refs[variant])
107662
- return {
107663
- refId: refs[variant],
107664
- resolvedFromSection: section.address,
107665
- resolvedVariant: variant
107666
- };
107667
- if (variant !== "default" && refs.default)
107668
- return {
107669
- refId: refs.default,
107670
- resolvedFromSection: section.address,
107671
- resolvedVariant: "default"
107672
- };
107673
- }
107674
- return null;
107874
+ function resolveEffectiveRef(sections, startSectionIndex, kind, variant) {
107875
+ const refsFor = (section, refKind) => refKind === "header" ? section.range.headerRefs ?? section.domain.headerRefs : section.range.footerRefs ?? section.domain.footerRefs;
107876
+ const resolved = resolveEffectiveHeaderFooterRef({
107877
+ sections: sections.map((section) => ({
107878
+ sectionIndex: section.range.sectionIndex,
107879
+ titlePg: section.range.titlePg,
107880
+ headerRefs: refsFor(section, "header"),
107881
+ footerRefs: refsFor(section, "footer")
107882
+ })),
107883
+ sectionIndex: startSectionIndex - 1,
107884
+ kind,
107885
+ variant
107886
+ });
107887
+ if (!resolved)
107888
+ return null;
107889
+ const resolvedSection = sections.find((section) => section.range.sectionIndex === resolved.matchedSectionIndex);
107890
+ if (!resolvedSection)
107891
+ return null;
107892
+ return {
107893
+ refId: resolved.refId,
107894
+ resolvedFromSection: resolvedSection.address,
107895
+ resolvedVariant: resolved.matchedVariant
107896
+ };
107675
107897
  }
107676
107898
  function getConverter$5(editor) {
107677
107899
  return editor.converter;
@@ -107748,7 +107970,7 @@ function setLinkedToPreviousMutation(sectPr, projection, sections, kind, variant
107748
107970
  message: `${operationName} already has an explicit reference.`
107749
107971
  }
107750
107972
  };
107751
- const resolved = resolveEffectiveRef(editor, sections, projection.range.sectionIndex, kind, variant);
107973
+ const resolved = resolveEffectiveRef(sections, projection.range.sectionIndex, kind, variant);
107752
107974
  if (dryRun) {
107753
107975
  setSectPrHeaderFooterRef(sectPr, kind, variant, "(dry-run)");
107754
107976
  return;
@@ -108264,7 +108486,7 @@ function ensureExplicitHeaderFooterSlot(editor, input) {
108264
108486
  created: false
108265
108487
  };
108266
108488
  }
108267
- const inheritedRef = resolveEffectiveRef(editor, sections, sections.indexOf(projection), kind, variant);
108489
+ const inheritedRef = resolveEffectiveRef(sections, sections.indexOf(projection), kind, variant);
108268
108490
  const effectiveSourceRefId = sourceRefId ?? inheritedRef?.refId ?? undefined;
108269
108491
  let result = null;
108270
108492
  if (!compoundMutation({
@@ -108331,7 +108553,7 @@ function resolveHeaderFooterSlotRuntime(hostEditor, locator, options = {}) {
108331
108553
  storyKey,
108332
108554
  resolution
108333
108555
  });
108334
- effectiveRefId = resolveEffectiveRef(hostEditor, sections, projection.range.sectionIndex, headerFooterKind, variant)?.refId ?? null;
108556
+ effectiveRefId = resolveEffectiveRef(sections, projection.range.sectionIndex, headerFooterKind, variant)?.refId ?? null;
108335
108557
  }
108336
108558
  const isInherited = explicitRefId === null;
108337
108559
  const onWrite = locator.onWrite ?? "materializeIfInherited";
@@ -118931,8 +119153,9 @@ var isRegExp = (value) => {
118931
119153
  domEnvironment$1 = env || null;
118932
119154
  }, MM_ANISOTROPIC = 8, EMF_SIGNATURE = 1179469088, EMF_PLUS_SIGNATURE = 726027589, EMR_COMMENT = 70, EMF_PLUS_OBJECT = 16392, EMF_PLUS_OBJECT_TYPE_IMAGE = 5, EMF_PLUS_IMAGE_TYPE_BITMAP = 1, EMF_PLUS_BITMAP_TYPE_PIXEL = 0, EMF_PLUS_BITMAP_TYPE_COMPRESSED = 1, EMF_PLUS_PIXEL_FORMAT_INDEXED_FLAG = 65536, EMF_PLUS_PIXEL_FORMAT_24BPP_RGB = 137224, EMF_PLUS_PIXEL_FORMAT_32BPP_RGB = 139273, EMF_PLUS_PIXEL_FORMAT_32BPP_ARGB = 2498570, EMF_PLUS_PIXEL_FORMAT_32BPP_PARGB = 925707, MAX_PIXEL_BITMAP_PIXELS = 1e8, base64ToArrayBuffer, require_common, require_trees, require_adler32, require_crc32, require_messages, require_deflate$1, require_strings, require_zstream, require_deflate, require_inffast, require_inftrees, require_inflate$1, require_constants2, require_gzheader, require_inflate, require_pako, import_UTIF, domEnvironment = null, MAX_PIXEL_COUNT = 1e8, setTiffDomEnvironment = (env) => {
118933
119155
  domEnvironment = env || null;
118934
- }, getInstructionPreProcessor = (instruction) => {
118935
- switch (instruction.split(" ")[0]) {
119156
+ }, GENERAL_FORMATS, CASE_INSENSITIVE_GENERAL_FORMATS, getInstructionPreProcessor = (instruction) => {
119157
+ const rawInstructionType = String(instruction ?? "").trim().split(/\s+/)[0];
119158
+ switch (extractFieldKeyword(instruction)) {
118936
119159
  case "PAGE":
118937
119160
  return preProcessPageInstruction;
118938
119161
  case "NUMPAGES":
@@ -118959,6 +119182,8 @@ var isRegExp = (value) => {
118959
119182
  case "STYLEREF":
118960
119183
  return preProcessStylerefInstruction;
118961
119184
  case "SEQ":
119185
+ if (rawInstructionType !== "SEQ")
119186
+ return null;
118962
119187
  return preProcessSeqInstruction;
118963
119188
  case "CITATION":
118964
119189
  return preProcessCitationInstruction;
@@ -119032,10 +119257,9 @@ var isRegExp = (value) => {
119032
119257
  if (node3.name === "w:fldSimple") {
119033
119258
  const instr = node3.attributes?.["w:instr"];
119034
119259
  if (typeof instr === "string") {
119035
- const instructionType = instr.trim().split(" ")[0];
119036
- const instructionPreProcessor = getInstructionPreProcessor(instructionType);
119260
+ const instructionPreProcessor = getInstructionPreProcessor(instr);
119037
119261
  if (instructionPreProcessor) {
119038
- const processed = instructionPreProcessor(node3.elements ?? [], instr, docx, null);
119262
+ const processed = instructionPreProcessor(node3.elements ?? [], instr, { docx });
119039
119263
  if (collecting) {
119040
119264
  collectedNodesStack[collectedNodesStack.length - 1].push(...processed);
119041
119265
  rawCollectedNodesStack[rawCollectedNodesStack.length - 1].push(...processed);
@@ -119167,11 +119391,14 @@ var isRegExp = (value) => {
119167
119391
  unpairedEndPreserveRaw
119168
119392
  };
119169
119393
  }, _processCombinedNodesForFldChar = (nodesToCombine = [], instrText, docx, instructionTokens, fieldRunRPr) => {
119170
- const instructionType = instrText.trim().split(" ")[0];
119171
- const instructionPreProcessor = getInstructionPreProcessor(instructionType);
119394
+ const instructionPreProcessor = getInstructionPreProcessor(instrText);
119172
119395
  if (instructionPreProcessor)
119173
119396
  return {
119174
- nodes: instructionPreProcessor(nodesToCombine, instrText, docx, instructionTokens, fieldRunRPr),
119397
+ nodes: instructionPreProcessor(nodesToCombine, instrText, {
119398
+ docx,
119399
+ instructionTokens,
119400
+ fieldRunRPr
119401
+ }),
119175
119402
  handled: true
119176
119403
  };
119177
119404
  return {
@@ -119179,7 +119406,7 @@ var isRegExp = (value) => {
119179
119406
  handled: false
119180
119407
  };
119181
119408
  }, applyConstructiveFieldInterpretation = (rawNodes, instrText, docx) => {
119182
- if (instrText.split(" ")[0] !== "HYPERLINK")
119409
+ if (extractFieldKeyword(instrText) !== "HYPERLINK")
119183
119410
  return;
119184
119411
  const linkAttributes = resolveHyperlinkAttributes(instrText, docx);
119185
119412
  if (!linkAttributes)
@@ -119334,8 +119561,7 @@ var isRegExp = (value) => {
119334
119561
  const fldType = node3.elements?.find((el) => el.name === "w:fldChar")?.attributes?.["w:fldCharType"];
119335
119562
  if (node3.name === "w:fldSimple") {
119336
119563
  const instrAttr = node3.attributes?.["w:instr"] || "";
119337
- const fieldType = instrAttr.trim().split(/\s+/)[0];
119338
- const fldSimplePreprocessor = getHeaderFooterFieldPreprocessor(fieldType);
119564
+ const fldSimplePreprocessor = getHeaderFooterFieldPreprocessor(extractFieldKeyword(instrAttr));
119339
119565
  if (fldSimplePreprocessor) {
119340
119566
  const contentNodes = node3.elements || [];
119341
119567
  let fieldRunRPr = null;
@@ -119346,7 +119572,7 @@ var isRegExp = (value) => {
119346
119572
  break;
119347
119573
  }
119348
119574
  }
119349
- const processedField = fldSimplePreprocessor(contentNodes, instrAttr.trim(), fieldRunRPr);
119575
+ const processedField = fldSimplePreprocessor(contentNodes, instrAttr.trim(), { fieldRunRPr });
119350
119576
  processedNodes.push(...processedField);
119351
119577
  i$1++;
119352
119578
  continue;
@@ -119368,7 +119594,7 @@ var isRegExp = (value) => {
119368
119594
  if (fieldInfo && complexFieldPreprocessor) {
119369
119595
  const preprocessor = complexFieldPreprocessor;
119370
119596
  const contentNodes = fieldInfo.contentNodes;
119371
- const processedField = preprocessor(contentNodes, fieldInfo.instrText, fieldInfo.fieldRunRPr);
119597
+ const processedField = preprocessor(contentNodes, fieldInfo.instrText, { fieldRunRPr: fieldInfo.fieldRunRPr });
119372
119598
  processedNodes.push(...processedField);
119373
119599
  i$1 = fieldInfo.endIndex + 1;
119374
119600
  continue;
@@ -119384,7 +119610,7 @@ var isRegExp = (value) => {
119384
119610
  }
119385
119611
  }
119386
119612
  if (node3.name === "w:r" && node3.elements?.some((el) => el.name === "w:pgNum")) {
119387
- const processedField = preProcessPageInstruction([], "", node3.elements.find((el) => el.name === "w:rPr") || null);
119613
+ const processedField = preProcessPageInstruction([], "", { fieldRunRPr: node3.elements.find((el) => el.name === "w:rPr") || null });
119388
119614
  processedNodes.push(...processedField);
119389
119615
  i$1++;
119390
119616
  continue;
@@ -125170,16 +125396,26 @@ var isRegExp = (value) => {
125170
125396
  }]
125171
125397
  }
125172
125398
  ];
125173
- }, config$9, translator$26, XML_NODE_NAME$7 = "sd:autoPageNumber", SD_NODE_NAME$7 = "page-number", encode$11 = (params3) => {
125399
+ }, config$9, translator$26, PAGE_VALUE_FORMAT_SWITCHES, XML_NODE_NAME$7 = "sd:autoPageNumber", SD_NODE_NAME$7 = "page-number", encode$11 = (params3) => {
125174
125400
  const { nodes = [] } = params3 || {};
125175
- const rPr = nodes[0].elements?.find((el) => el.name === "w:rPr");
125176
- return {
125401
+ const node3 = nodes[0];
125402
+ const rPr = node3.elements?.find((el) => el.name === "w:rPr");
125403
+ const processedNode = {
125177
125404
  type: "page-number",
125178
- attrs: { marksAsAttrs: parseMarks(rPr || { elements: [] }) }
125405
+ attrs: {
125406
+ marksAsAttrs: parseMarks(rPr || { elements: [] }),
125407
+ ...getPageNumberFieldAttrs$1(node3)
125408
+ }
125179
125409
  };
125410
+ if (typeof node3.attributes?.instruction === "string")
125411
+ processedNode.attrs.instruction = node3.attributes.instruction;
125412
+ if (typeof node3.attributes?.pageNumberFormat === "string")
125413
+ processedNode.attrs.pageNumberFormat = node3.attributes.pageNumberFormat;
125414
+ return processedNode;
125180
125415
  }, decode$11 = (params3) => {
125181
125416
  const { node: node3 } = params3;
125182
125417
  const outputMarks = processOutputMarks(node3.attrs?.marksAsAttrs || []);
125418
+ const instruction = getPageInstructionText(node3.attrs);
125183
125419
  return [
125184
125420
  {
125185
125421
  name: "w:r",
@@ -125201,7 +125437,7 @@ var isRegExp = (value) => {
125201
125437
  attributes: { "xml:space": "preserve" },
125202
125438
  elements: [{
125203
125439
  type: "text",
125204
- text: " PAGE"
125440
+ text: ` ${instruction}`
125205
125441
  }]
125206
125442
  }]
125207
125443
  },
@@ -125234,17 +125470,20 @@ var isRegExp = (value) => {
125234
125470
  type: "total-page-number",
125235
125471
  attrs: {
125236
125472
  marksAsAttrs: parseMarks(rPr || { elements: [] }),
125237
- importedCachedText: node3.attributes?.importedCachedText || null
125473
+ importedCachedText: node3.attributes?.importedCachedText || null,
125474
+ ...getPageNumberFieldAttrs(node3)
125238
125475
  }
125239
125476
  };
125240
125477
  }, decode$10 = (params3) => {
125241
125478
  const { node: node3 } = params3;
125242
125479
  const outputMarks = processOutputMarks(node3.attrs?.marksAsAttrs || []);
125480
+ const cachedText = resolveCachedPageCount(params3, node3);
125481
+ const dirty = !params3.statFieldCacheMap?.has?.("NUMPAGES");
125243
125482
  return buildComplexFieldRuns({
125244
- instruction: "NUMPAGES",
125245
- cachedText: resolveCachedPageCount(params3, node3),
125483
+ instruction: node3.attrs?.instruction || "NUMPAGES",
125484
+ cachedText,
125246
125485
  outputMarks,
125247
- dirty: !params3.statFieldCacheMap?.has?.("NUMPAGES")
125486
+ dirty
125248
125487
  });
125249
125488
  }, config$7, translator$28, XML_NODE_NAME$5 = "sd:documentStatField", SD_NODE_NAME$5 = "documentStatField", encode$9 = (params3) => {
125250
125489
  const { nodes = [] } = params3 || {};
@@ -130806,7 +131045,7 @@ var isRegExp = (value) => {
130806
131045
  state.kern = kernNode.attributes["w:val"];
130807
131046
  }
130808
131047
  }, SuperConverter;
130809
- var init_SuperConverter_CcHCWpfX_es = __esm(() => {
131048
+ var init_SuperConverter_CvwFiCth_es = __esm(() => {
130810
131049
  init_rolldown_runtime_Bg48TavK_es();
130811
131050
  init_jszip_C49i9kUs_es();
130812
131051
  init_xml_js_CqGKpaft_es();
@@ -159390,6 +159629,16 @@ var init_SuperConverter_CcHCWpfX_es = __esm(() => {
159390
159629
  })(UTIF, pako$1);
159391
159630
  })();
159392
159631
  }))(), 1);
159632
+ GENERAL_FORMATS = new Map([
159633
+ ["Arabic", "decimal"],
159634
+ ["roman", "lowerRoman"],
159635
+ ["Roman", "upperRoman"],
159636
+ ["ROMAN", "upperRoman"],
159637
+ ["alphabetic", "lowerLetter"],
159638
+ ["ALPHABETIC", "upperLetter"],
159639
+ ["ArabicDash", "numberInDash"]
159640
+ ]);
159641
+ CASE_INSENSITIVE_GENERAL_FORMATS = new Map([["arabic", "decimal"], ["arabicdash", "numberInDash"]]);
159393
159642
  TRACK_CHANGE_ELEMENT_NAMES = new Set([
159394
159643
  "w:del",
159395
159644
  "w:ins",
@@ -167092,6 +167341,15 @@ var init_SuperConverter_CcHCWpfX_es = __esm(() => {
167092
167341
  decode: decode$12
167093
167342
  };
167094
167343
  translator$26 = NodeTranslator.from(config$9);
167344
+ PAGE_VALUE_FORMAT_SWITCHES = {
167345
+ Arabic: "decimal",
167346
+ Roman: "upperRoman",
167347
+ ROMAN: "upperRoman",
167348
+ roman: "lowerRoman",
167349
+ ALPHABETIC: "upperLetter",
167350
+ alphabetic: "lowerLetter",
167351
+ ArabicDash: "numberInDash"
167352
+ };
167095
167353
  config$8 = {
167096
167354
  xmlName: XML_NODE_NAME$7,
167097
167355
  sdNodeOrKeyName: SD_NODE_NAME$7,
@@ -169580,7 +169838,7 @@ var init_SuperConverter_CcHCWpfX_es = __esm(() => {
169580
169838
  };
169581
169839
  });
169582
169840
 
169583
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-DKwoydAR.es.js
169841
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-DdDLS67b.es.js
169584
169842
  function parseSizeUnit(val = "0") {
169585
169843
  const length3 = val.toString() || "0";
169586
169844
  const value = Number.parseFloat(length3);
@@ -179911,8 +180169,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, normalizeActorId = (value) => {
179911
180169
  }
179912
180170
  };
179913
180171
  };
179914
- var init_create_headless_toolbar_DKwoydAR_es = __esm(() => {
179915
- init_SuperConverter_CcHCWpfX_es();
180172
+ var init_create_headless_toolbar_DdDLS67b_es = __esm(() => {
180173
+ init_SuperConverter_CvwFiCth_es();
179916
180174
  init_uuid_qzgm05fK_es();
179917
180175
  init_constants_D_X7xF4s_es();
179918
180176
  init_dist_B8HfvhaK_es();
@@ -229075,7 +229333,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
229075
229333
  init_remark_gfm_BhnWr3yf_es();
229076
229334
  });
229077
229335
 
229078
- // ../../packages/superdoc/dist/chunks/src-C8mTdIvv.es.js
229336
+ // ../../packages/superdoc/dist/chunks/src-BbNQjpxw.es.js
229079
229337
  function deleteProps(obj, propOrProps) {
229080
229338
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
229081
229339
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -260004,7 +260262,7 @@ function headerFootersResolveAdapter(editor, input2) {
260004
260262
  section: projection.address
260005
260263
  };
260006
260264
  }
260007
- const resolved = resolveEffectiveRef(editor, sections, projection.range.sectionIndex, headerFooterKind, variant);
260265
+ const resolved = resolveEffectiveRef(sections, projection.range.sectionIndex, headerFooterKind, variant);
260008
260266
  if (resolved)
260009
260267
  return {
260010
260268
  status: "inherited",
@@ -268737,6 +268995,55 @@ function convertOmmlToMathml(ommlJson, doc$12) {
268737
268995
  function isMinimalWordLayout$1(value) {
268738
268996
  return isMinimalWordLayout(value);
268739
268997
  }
268998
+ function pageContextSignature(context) {
268999
+ return [
269000
+ context.pageNumber,
269001
+ context.totalPages,
269002
+ context.pageNumberText ?? "",
269003
+ context.displayPageNumber ?? ""
269004
+ ].join("|");
269005
+ }
269006
+ function hasPageContextTokenInShapeText(textContent$1) {
269007
+ return Array.isArray(textContent$1?.parts) && textContent$1.parts.some((part) => part.fieldType === "PAGE" || part.fieldType === "NUMPAGES");
269008
+ }
269009
+ function hasPageContextTokenInShapeGroup(shapes) {
269010
+ return Array.isArray(shapes) && shapes.some((shape) => {
269011
+ if (shape.shapeType !== "vectorShape")
269012
+ return false;
269013
+ return hasPageContextTokenInShapeText(shape.attrs.textContent);
269014
+ });
269015
+ }
269016
+ function hasPageContextTokenInBlock(block) {
269017
+ if (!block)
269018
+ return false;
269019
+ if (block.kind === "paragraph") {
269020
+ for (const run2 of block.runs)
269021
+ if ("token" in run2 && (run2.token === "pageNumber" || run2.token === "totalPageCount"))
269022
+ return true;
269023
+ } else if (block.kind === "list") {
269024
+ const list5 = block;
269025
+ for (const item of list5.items ?? [])
269026
+ if (hasPageContextTokenInBlock(item.paragraph))
269027
+ return true;
269028
+ } else if (block.kind === "table") {
269029
+ const table2 = block;
269030
+ for (const row2 of table2.rows ?? [])
269031
+ for (const cell2 of row2.cells ?? [])
269032
+ if ((cell2.blocks ? cell2.blocks : cell2.paragraph ? [cell2.paragraph] : []).some(hasPageContextTokenInBlock))
269033
+ return true;
269034
+ } else if (block.kind === "drawing") {
269035
+ const drawing = block;
269036
+ if (drawing.drawingKind === "vectorShape")
269037
+ return hasPageContextTokenInShapeText(drawing.textContent);
269038
+ if (drawing.drawingKind === "shapeGroup")
269039
+ return hasPageContextTokenInShapeGroup(drawing.shapes);
269040
+ }
269041
+ return false;
269042
+ }
269043
+ function needsRebuildForPageContext(currentContext, nextContext, resolvedItem) {
269044
+ const block = resolvedItem?.kind === "fragment" && "block" in resolvedItem ? resolvedItem.block : undefined;
269045
+ return pageContextSignature(currentContext) !== pageContextSignature(nextContext) && hasPageContextTokenInBlock(block);
269046
+ }
268740
269047
  function roundSnapshotMetric(value) {
268741
269048
  if (!Number.isFinite(value))
268742
269049
  return null;
@@ -269533,6 +269840,7 @@ function resolveLayout(input2) {
269533
269840
  footnoteReserved: page.footnoteReserved,
269534
269841
  displayNumber: page.displayNumber,
269535
269842
  numberText: page.numberText,
269843
+ effectivePageNumber: page.effectivePageNumber,
269536
269844
  vAlign: page.vAlign,
269537
269845
  baseMargins: page.baseMargins,
269538
269846
  sectionIndex: page.sectionIndex,
@@ -271952,85 +272260,6 @@ function createPaginator(opts) {
271952
272260
  pruneTrailingEmptyPages
271953
272261
  };
271954
272262
  }
271955
- function toUpperRoman2(num) {
271956
- if (num < 1 || num > 3999)
271957
- return String(num);
271958
- const values = [
271959
- 1000,
271960
- 900,
271961
- 500,
271962
- 400,
271963
- 100,
271964
- 90,
271965
- 50,
271966
- 40,
271967
- 10,
271968
- 9,
271969
- 5,
271970
- 4,
271971
- 1
271972
- ];
271973
- const numerals = [
271974
- "M",
271975
- "CM",
271976
- "D",
271977
- "CD",
271978
- "C",
271979
- "XC",
271980
- "L",
271981
- "XL",
271982
- "X",
271983
- "IX",
271984
- "V",
271985
- "IV",
271986
- "I"
271987
- ];
271988
- let result = "";
271989
- let remaining = num;
271990
- for (let i4 = 0;i4 < values.length; i4++)
271991
- while (remaining >= values[i4]) {
271992
- result += numerals[i4];
271993
- remaining -= values[i4];
271994
- }
271995
- return result;
271996
- }
271997
- function toLowerRoman(num) {
271998
- return toUpperRoman2(num).toLowerCase();
271999
- }
272000
- function toUpperLetter2(num) {
272001
- if (num < 1)
272002
- return "A";
272003
- let result = "";
272004
- let n = num;
272005
- while (n > 0) {
272006
- const remainder = (n - 1) % 26;
272007
- result = String.fromCharCode(65 + remainder) + result;
272008
- n = Math.floor((n - 1) / 26);
272009
- }
272010
- return result;
272011
- }
272012
- function toLowerLetter(num) {
272013
- return toUpperLetter2(num).toLowerCase();
272014
- }
272015
- function formatPageNumber(pageNumber, format) {
272016
- const num = Math.max(1, pageNumber);
272017
- switch (format) {
272018
- case "decimal":
272019
- return String(num);
272020
- case "upperRoman":
272021
- return toUpperRoman2(num);
272022
- case "lowerRoman":
272023
- return toLowerRoman(num);
272024
- case "upperLetter":
272025
- return toUpperLetter2(num);
272026
- case "lowerLetter":
272027
- return toLowerLetter(num);
272028
- case "numberInDash":
272029
- return `-${num}-`;
272030
- default:
272031
- return String(num);
272032
- }
272033
- }
272034
272263
  function computeDisplayPageNumber(pages, sections) {
272035
272264
  const result = [];
272036
272265
  if (pages.length === 0)
@@ -272495,7 +272724,6 @@ function resolvePageNumberTokens(layout, blocks2, measures, numberingCtx) {
272495
272724
  console.warn(`[resolvePageTokens] No display page info for page ${page.number} - skipping`);
272496
272725
  continue;
272497
272726
  }
272498
- const displayPageText = displayPageInfo.displayText;
272499
272727
  for (const fragment2 of page.fragments)
272500
272728
  if (fragment2.kind === "para") {
272501
272729
  const blockId = fragment2.blockId;
@@ -272510,7 +272738,7 @@ function resolvePageNumberTokens(layout, blocks2, measures, numberingCtx) {
272510
272738
  processedBlocks.add(blockId);
272511
272739
  continue;
272512
272740
  }
272513
- const clonedBlock = cloneBlockWithResolvedTokens(block, displayPageText, totalPagesStr);
272741
+ const clonedBlock = cloneBlockWithResolvedTokens(block, displayPageInfo, totalPagesStr, numberingCtx.totalPages);
272514
272742
  updatedBlocks.set(blockId, clonedBlock);
272515
272743
  affectedBlockIds.add(blockId);
272516
272744
  processedBlocks.add(blockId);
@@ -272528,20 +272756,20 @@ function hasPageTokens$1(block) {
272528
272756
  return true;
272529
272757
  return false;
272530
272758
  }
272531
- function cloneBlockWithResolvedTokens(block, displayPageText, totalPagesStr) {
272759
+ function cloneBlockWithResolvedTokens(block, displayPageInfo, totalPagesStr, totalPages) {
272532
272760
  const clonedRuns = block.runs.map((run2) => {
272533
272761
  if ("token" in run2 && run2.token) {
272534
272762
  if (run2.token === "pageNumber") {
272535
- const { token: _token, ...runWithoutToken } = run2;
272763
+ const { token: _token, pageNumberFieldFormat, ...runWithoutToken } = run2;
272536
272764
  return {
272537
272765
  ...runWithoutToken,
272538
- text: displayPageText
272766
+ text: pageNumberFieldFormat ? formatPageNumberFieldValue$1(displayPageInfo.displayNumber, pageNumberFieldFormat) : displayPageInfo.displayText
272539
272767
  };
272540
272768
  } else if (run2.token === "totalPageCount") {
272541
272769
  const { token: _token, ...runWithoutToken } = run2;
272542
272770
  return {
272543
272771
  ...runWithoutToken,
272544
- text: totalPagesStr
272772
+ text: run2.pageNumberFieldFormat ? formatPageNumberFieldValue$1(totalPages, run2.pageNumberFieldFormat) : totalPagesStr
272545
272773
  };
272546
272774
  }
272547
272775
  }
@@ -272731,13 +272959,6 @@ function layoutDocument(blocks2, measures, options = {}) {
272731
272959
  const headerContentHeightsBySectionRef = options.headerContentHeightsBySectionRef;
272732
272960
  const footerContentHeightsByRId = options.footerContentHeightsByRId;
272733
272961
  const footerContentHeightsBySectionRef = options.footerContentHeightsBySectionRef;
272734
- const getVariantTypeForPage = (args$1) => {
272735
- if (args$1.sectionPageNumber === 1 && args$1.titlePgEnabled)
272736
- return "first";
272737
- if (args$1.alternateHeaders)
272738
- return args$1.parityPageNumber % 2 === 0 ? "even" : "odd";
272739
- return "default";
272740
- };
272741
272962
  const getHeaderHeightForPage = (variantType, headerRef, sectionIndex) => {
272742
272963
  if (headerRef && sectionIndex != null) {
272743
272964
  const sectionKey = buildSectionAwareReferenceKey(headerRef, sectionIndex);
@@ -272804,9 +273025,7 @@ function layoutDocument(blocks2, measures, options = {}) {
272804
273025
  const maxFooterContentHeight = footerContentHeights ? Math.max(0, validateContentHeight(footerContentHeights.default), validateContentHeight(footerContentHeights.first), validateContentHeight(footerContentHeights.even), validateContentHeight(footerContentHeights.odd)) : 0;
272805
273026
  const headerDistance = margins.header ?? margins.top;
272806
273027
  const footerDistance = margins.footer ?? margins.bottom;
272807
- const defaultHeaderHeight = getHeaderHeightForPage("default", undefined, 0);
272808
- const defaultFooterHeight = getFooterHeightForPage("default", undefined, 0);
272809
- const effectiveMargins = clampHeaderFooterInflatedMargins(calculateEffectiveTopMargin(defaultHeaderHeight, headerDistance, margins.top), calculateEffectiveBottomMargin(defaultFooterHeight, footerDistance, margins.bottom), margins.top, margins.bottom, pageSize.h);
273028
+ const effectiveMargins = clampHeaderFooterInflatedMargins(calculateEffectiveTopMargin(0, headerDistance, margins.top), calculateEffectiveBottomMargin(0, footerDistance, margins.bottom), margins.top, margins.bottom, pageSize.h);
272810
273029
  let activeTopMargin = effectiveMargins.top;
272811
273030
  let activeBottomMargin = effectiveMargins.bottom;
272812
273031
  let activeLeftMargin = margins.left;
@@ -272911,7 +273130,7 @@ function layoutDocument(blocks2, measures, options = {}) {
272911
273130
  const firstMetadataIndex = typeof firstSectionIndexRaw === "number" ? firstSectionIndexRaw : Number(firstSectionIndexRaw ?? NaN);
272912
273131
  if (Number.isFinite(firstMetadataIndex))
272913
273132
  activeSectionIndex = firstMetadataIndex;
272914
- const firstSectionMetadata = Number.isFinite(firstMetadataIndex) ? sectionMetadataList[firstMetadataIndex] : undefined;
273133
+ const firstSectionMetadata = Number.isFinite(firstMetadataIndex) ? getSectionMetadata(firstMetadataIndex) : undefined;
272915
273134
  if (firstSectionMetadata?.numbering) {
272916
273135
  if (firstSectionMetadata.numbering.format)
272917
273136
  activeNumberFormat = firstSectionMetadata.numbering.format;
@@ -272969,7 +273188,7 @@ function layoutDocument(blocks2, measures, options = {}) {
272969
273188
  const metadataIndex = typeof sectionIndexRaw === "number" ? sectionIndexRaw : Number(sectionIndexRaw ?? NaN);
272970
273189
  if (Number.isFinite(metadataIndex))
272971
273190
  pendingSectionIndex = metadataIndex;
272972
- const sectionMetadata = Number.isFinite(metadataIndex) ? sectionMetadataList[metadataIndex] : undefined;
273191
+ const sectionMetadata = Number.isFinite(metadataIndex) ? getSectionMetadata(metadataIndex) : undefined;
272973
273192
  if (sectionMetadata?.numbering)
272974
273193
  pendingNumbering = { ...sectionMetadata.numbering };
272975
273194
  else if (block.numbering)
@@ -273212,6 +273431,29 @@ function layoutDocument(blocks2, measures, options = {}) {
273212
273431
  };
273213
273432
  };
273214
273433
  const sectionMetadataList = options.sectionMetadata ?? [];
273434
+ const getSectionMetadata = (sectionIndex) => sectionMetadataList.find((section, fallbackIndex) => (section.sectionIndex ?? fallbackIndex) === sectionIndex);
273435
+ const runtimeSectionRefsByIndex = /* @__PURE__ */ new Map;
273436
+ const buildHeaderFooterResolutionSections = () => {
273437
+ const sectionIndexes = /* @__PURE__ */ new Set;
273438
+ sectionMetadataList.forEach((section, fallbackIndex) => sectionIndexes.add(section.sectionIndex ?? fallbackIndex));
273439
+ runtimeSectionRefsByIndex.forEach((_refs, sectionIndex) => sectionIndexes.add(sectionIndex));
273440
+ if (sectionIndexes.size === 0)
273441
+ sectionIndexes.add(0);
273442
+ return Array.from(sectionIndexes).sort((a2, b$1) => a2 - b$1).map((sectionIndex) => {
273443
+ const metadata = getSectionMetadata(sectionIndex);
273444
+ const runtimeRefs = runtimeSectionRefsByIndex.get(sectionIndex);
273445
+ return {
273446
+ sectionIndex,
273447
+ titlePg: metadata?.titlePg === true,
273448
+ headerRefs: runtimeRefs?.headerRefs ?? metadata?.headerRefs,
273449
+ footerRefs: runtimeRefs?.footerRefs ?? metadata?.footerRefs
273450
+ };
273451
+ });
273452
+ };
273453
+ const hasAnyHeaderFooterRefs = (sections, kind) => {
273454
+ const refKey = kind === "header" ? "headerRefs" : "footerRefs";
273455
+ return sections.some((section) => Object.values(section[refKey] ?? {}).some(Boolean));
273456
+ };
273215
273457
  const initialSectionMetadata = sectionMetadataList[0];
273216
273458
  if (initialSectionMetadata?.numbering?.format)
273217
273459
  activeNumberFormat = initialSectionMetadata.numbering.format;
@@ -273221,11 +273463,13 @@ function layoutDocument(blocks2, measures, options = {}) {
273221
273463
  }
273222
273464
  let activeSectionRefs = null;
273223
273465
  let pendingSectionRefs = null;
273224
- if (initialSectionMetadata?.headerRefs || initialSectionMetadata?.footerRefs)
273466
+ if (initialSectionMetadata?.headerRefs || initialSectionMetadata?.footerRefs) {
273225
273467
  activeSectionRefs = {
273226
273468
  ...initialSectionMetadata.headerRefs && { headerRefs: initialSectionMetadata.headerRefs },
273227
273469
  ...initialSectionMetadata.footerRefs && { footerRefs: initialSectionMetadata.footerRefs }
273228
273470
  };
273471
+ runtimeSectionRefsByIndex.set(initialSectionMetadata.sectionIndex ?? 0, activeSectionRefs);
273472
+ }
273229
273473
  if (initialSectionMetadata?.vAlign)
273230
273474
  activeVAlign = initialSectionMetadata.vAlign;
273231
273475
  let activeSectionIndex = initialSectionMetadata?.sectionIndex ?? 0;
@@ -273317,6 +273561,8 @@ function layoutDocument(blocks2, measures, options = {}) {
273317
273561
  activeSectionIndex = pendingSectionIndex;
273318
273562
  pendingSectionIndex = null;
273319
273563
  }
273564
+ if (activeSectionRefs)
273565
+ runtimeSectionRefsByIndex.set(activeSectionIndex, activeSectionRefs);
273320
273566
  if (pendingVAlign !== undefined) {
273321
273567
  activeVAlign = pendingVAlign;
273322
273568
  pendingVAlign = undefined;
@@ -273336,53 +273582,42 @@ function layoutDocument(blocks2, measures, options = {}) {
273336
273582
  if (isEnteringNewSection || !sectionFirstPageNumbers.has(activeSectionIndex))
273337
273583
  sectionFirstPageNumbers.set(activeSectionIndex, newPageNumber);
273338
273584
  const sectionPageNumber = newPageNumber - (sectionFirstPageNumbers.get(activeSectionIndex) ?? newPageNumber) + 1;
273339
- const titlePgEnabled = sectionMetadataList[activeSectionIndex]?.titlePg ?? false;
273585
+ const titlePgEnabled = getSectionMetadata(activeSectionIndex)?.titlePg ?? false;
273340
273586
  const alternateHeaders = options.alternateHeaders ?? false;
273341
- const variantType = getVariantTypeForPage({
273587
+ const variantType = selectHeaderFooterVariantForPage({
273342
273588
  sectionPageNumber,
273343
- parityPageNumber: activePageCounter,
273344
- titlePgEnabled,
273589
+ documentPageNumber: activePageCounter,
273590
+ titlePg: titlePgEnabled,
273345
273591
  alternateHeaders
273346
273592
  });
273347
- let headerRef = activeSectionRefs?.headerRefs?.[variantType];
273348
- let footerRef = activeSectionRefs?.footerRefs?.[variantType];
273349
- let effectiveVariantType = variantType;
273350
- if (!headerRef && variantType !== "default" && activeSectionIndex > 0) {
273351
- const prevSectionMetadata = sectionMetadataList[activeSectionIndex - 1];
273352
- if (prevSectionMetadata?.headerRefs?.[variantType]) {
273353
- headerRef = prevSectionMetadata.headerRefs[variantType];
273354
- layoutLog(`[Layout] Page ${newPageNumber}: Inheriting header '${variantType}' from section ${activeSectionIndex - 1}: ${headerRef}`);
273355
- }
273356
- }
273357
- if (!footerRef && variantType !== "default" && activeSectionIndex > 0) {
273358
- const prevSectionMetadata = sectionMetadataList[activeSectionIndex - 1];
273359
- if (prevSectionMetadata?.footerRefs?.[variantType]) {
273360
- footerRef = prevSectionMetadata.footerRefs[variantType];
273361
- layoutLog(`[Layout] Page ${newPageNumber}: Inheriting footer '${variantType}' from section ${activeSectionIndex - 1}: ${footerRef}`);
273362
- }
273363
- }
273364
- const defaultHeaderRef = activeSectionRefs?.headerRefs?.default;
273365
- const defaultFooterRef = activeSectionRefs?.footerRefs?.default;
273366
- const shouldUseDefaultHeaderRef = variantType !== "default" && defaultHeaderRef && (!alternateHeaders || variantType === "odd");
273367
- const shouldUseDefaultFooterRef = variantType !== "default" && defaultFooterRef && (!alternateHeaders || variantType === "odd");
273368
- if (!headerRef && shouldUseDefaultHeaderRef) {
273369
- headerRef = defaultHeaderRef;
273370
- effectiveVariantType = "default";
273371
- }
273372
- if (!footerRef && shouldUseDefaultFooterRef)
273373
- footerRef = defaultFooterRef;
273374
- const headerHeight = getHeaderHeightForPage(effectiveVariantType, headerRef, activeSectionIndex);
273375
- const footerHeight = getFooterHeightForPage(variantType !== "default" && !activeSectionRefs?.footerRefs?.[variantType] ? "default" : variantType, footerRef, activeSectionIndex);
273593
+ const resolutionSections = buildHeaderFooterResolutionSections();
273594
+ const headerResolved = variantType && resolveEffectiveHeaderFooterRef({
273595
+ sections: resolutionSections,
273596
+ sectionIndex: activeSectionIndex,
273597
+ kind: "header",
273598
+ variant: variantType
273599
+ });
273600
+ const footerResolved = variantType && resolveEffectiveHeaderFooterRef({
273601
+ sections: resolutionSections,
273602
+ sectionIndex: activeSectionIndex,
273603
+ kind: "footer",
273604
+ variant: variantType
273605
+ });
273606
+ const hasHeaderRefs = hasAnyHeaderFooterRefs(resolutionSections, "header");
273607
+ const hasFooterRefs = hasAnyHeaderFooterRefs(resolutionSections, "footer");
273608
+ const headerHeight = headerResolved ? getHeaderHeightForPage(headerResolved.matchedVariant, headerResolved.refId, activeSectionIndex) : variantType && !hasHeaderRefs ? getHeaderHeightForPage(variantType, undefined, activeSectionIndex) : 0;
273609
+ const footerHeight = footerResolved ? getFooterHeightForPage(footerResolved.matchedVariant, footerResolved.refId, activeSectionIndex) : variantType && !hasFooterRefs ? getFooterHeightForPage(variantType, undefined, activeSectionIndex) : 0;
273376
273610
  const adjustedMargins = clampHeaderFooterInflatedMargins(calculateEffectiveTopMargin(headerHeight, activeHeaderDistance, activeSectionBaseTopMargin), calculateEffectiveBottomMargin(footerHeight, activeFooterDistance, activeSectionBaseBottomMargin), activeSectionBaseTopMargin, activeSectionBaseBottomMargin, activePageSize.h);
273377
273611
  activeTopMargin = adjustedMargins.top;
273378
273612
  activeBottomMargin = adjustedMargins.bottom;
273379
- layoutLog(`[Layout] Page ${newPageNumber}: Using variant '${variantType}' - headerHeight: ${headerHeight}, footerHeight: ${footerHeight}`);
273613
+ layoutLog(`[Layout] Page ${newPageNumber}: Using variant '${variantType ?? "none"}' - headerHeight: ${headerHeight}, footerHeight: ${footerHeight}`);
273380
273614
  layoutLog(`[Layout] Page ${newPageNumber}: Adjusted margins - top: ${activeTopMargin}, bottom: ${activeBottomMargin} (base: ${activeSectionBaseTopMargin}, ${activeSectionBaseBottomMargin})`);
273381
273615
  return;
273382
273616
  }
273383
273617
  if (state?.page) {
273384
273618
  state.page.displayNumber = activePageCounter;
273385
273619
  state.page.numberText = formatPageNumber(activePageCounter, activeNumberFormat);
273620
+ state.page.effectivePageNumber = activePageCounter;
273386
273621
  state.page.sectionIndex = activeSectionIndex;
273387
273622
  layoutLog(`[Layout] Page ${state.page.number}: Stamped sectionIndex:`, activeSectionIndex);
273388
273623
  if (activeSectionRefs) {
@@ -273691,7 +273926,7 @@ function layoutDocument(blocks2, measures, options = {}) {
273691
273926
  activeSectionIndex = metadataIndex;
273692
273927
  else
273693
273928
  pendingSectionIndex = metadataIndex;
273694
- const sectionMetadata = Number.isFinite(metadataIndex) ? sectionMetadataList[metadataIndex] : undefined;
273929
+ const sectionMetadata = Number.isFinite(metadataIndex) ? getSectionMetadata(metadataIndex) : undefined;
273695
273930
  if (sectionMetadata?.numbering)
273696
273931
  if (isFirstSection) {
273697
273932
  if (sectionMetadata.numbering.format)
@@ -274672,6 +274907,25 @@ function extractParagraphIndent(indent2) {
274672
274907
  hanging: typeof indent2?.hanging === "number" && Number.isFinite(indent2.hanging) ? indent2.hanging : 0
274673
274908
  };
274674
274909
  }
274910
+ function refreshResolutionSections(identifier) {
274911
+ if (identifier.sectionCount === 0 && identifier.sectionHeaderIds.size === 0 && identifier.sectionFooterIds.size === 0 && identifier.sectionTitlePg.size === 0) {
274912
+ identifier.sections = [];
274913
+ return;
274914
+ }
274915
+ const maxIndex = Math.max(identifier.sectionCount - 1, ...Array.from(identifier.sectionHeaderIds.keys()), ...Array.from(identifier.sectionFooterIds.keys()), ...Array.from(identifier.sectionTitlePg.keys()));
274916
+ const sections = [];
274917
+ for (let sectionIndex = 0;sectionIndex <= maxIndex; sectionIndex += 1)
274918
+ sections.push({
274919
+ sectionIndex,
274920
+ titlePg: identifier.sectionTitlePg.get(sectionIndex) ?? false,
274921
+ headerRefs: identifier.sectionHeaderIds.get(sectionIndex),
274922
+ footerRefs: identifier.sectionFooterIds.get(sectionIndex)
274923
+ });
274924
+ identifier.sections = sections;
274925
+ }
274926
+ function getSectionTitlePg(identifier, sectionIndex) {
274927
+ return identifier.sectionTitlePg.get(sectionIndex) ?? false;
274928
+ }
274675
274929
  function buildMultiSectionIdentifier(sectionMetadata, pageStyles$1, converterIds) {
274676
274930
  const identifier = defaultMultiSectionIdentifier();
274677
274931
  identifier.alternateHeaders = Boolean(pageStyles$1?.alternateHeaders ?? false);
@@ -274692,7 +274946,8 @@ function buildMultiSectionIdentifier(sectionMetadata, pageStyles$1, converterIds
274692
274946
  even: section.footerRefs.even ?? null,
274693
274947
  odd: section.footerRefs.odd ?? null
274694
274948
  });
274695
- identifier.sectionTitlePg.set(idx, section.titlePg === true);
274949
+ if (Object.prototype.hasOwnProperty.call(section, "titlePg"))
274950
+ identifier.sectionTitlePg.set(idx, section.titlePg === true);
274696
274951
  }
274697
274952
  const section0Headers = identifier.sectionHeaderIds.get(0);
274698
274953
  const section0Footers = identifier.sectionFooterIds.get(0);
@@ -274717,45 +274972,28 @@ function buildMultiSectionIdentifier(sectionMetadata, pageStyles$1, converterIds
274717
274972
  identifier.footerIds.even = identifier.footerIds.even ?? converterIds.footerIds.even ?? null;
274718
274973
  identifier.footerIds.odd = identifier.footerIds.odd ?? converterIds.footerIds.odd ?? null;
274719
274974
  }
274975
+ refreshResolutionSections(identifier);
274720
274976
  return identifier;
274721
274977
  }
274722
274978
  function getHeaderFooterTypeForSection(pageNumber, sectionIndex, identifier, options) {
274723
- if (pageNumber <= 0)
274979
+ if (!Number.isFinite(pageNumber))
274724
274980
  return null;
274725
274981
  const kind = options?.kind ?? "header";
274726
274982
  const sectionPageNumber = options?.sectionPageNumber ?? pageNumber;
274727
- const parityPageNumber = options?.parityPageNumber ?? pageNumber;
274728
- const ids = (kind === "header" ? identifier.sectionHeaderIds.get(sectionIndex) : identifier.sectionFooterIds.get(sectionIndex)) ?? (kind === "header" ? identifier.headerIds : identifier.footerIds);
274729
- const hasFirst = Boolean(ids.first);
274730
- const hasEven = Boolean(ids.even);
274731
- const hasOdd = Boolean(ids.odd);
274732
- const hasDefault = Boolean(ids.default);
274733
- const legacyIds = kind === "header" ? identifier.headerIds : identifier.footerIds;
274734
- let hasAny = hasFirst || hasEven || hasOdd || hasDefault;
274735
- if (!hasAny)
274736
- for (let index2 = sectionIndex - 1;index2 >= 0; index2 -= 1) {
274737
- const inheritedIds = kind === "header" ? identifier.sectionHeaderIds.get(index2) : identifier.sectionFooterIds.get(index2);
274738
- if (inheritedIds?.first || inheritedIds?.even || inheritedIds?.odd || inheritedIds?.default) {
274739
- hasAny = true;
274740
- break;
274741
- }
274742
- }
274743
- if (!hasAny)
274744
- hasAny = Boolean(legacyIds.first || legacyIds.even || legacyIds.odd || legacyIds.default);
274745
- const titlePgEnabled = (identifier.sectionTitlePg.has(sectionIndex) ? identifier.sectionTitlePg.get(sectionIndex) : identifier.titlePg) === true;
274746
- if (sectionPageNumber === 1 && titlePgEnabled) {
274747
- if (hasAny)
274748
- return "first";
274983
+ const variant = selectHeaderFooterVariantForPage({
274984
+ documentPageNumber: options?.parityPageNumber ?? pageNumber,
274985
+ sectionPageNumber,
274986
+ titlePg: getSectionTitlePg(identifier, sectionIndex),
274987
+ alternateHeaders: identifier.alternateHeaders
274988
+ });
274989
+ if (!variant)
274749
274990
  return null;
274750
- }
274751
- if (identifier.alternateHeaders) {
274752
- if (!hasAny)
274753
- return null;
274754
- return parityPageNumber % 2 === 0 ? "even" : "odd";
274755
- }
274756
- if (hasDefault)
274757
- return "default";
274758
- return null;
274991
+ return resolveEffectiveHeaderFooterRef({
274992
+ sections: identifier.sections,
274993
+ sectionIndex,
274994
+ kind,
274995
+ variant
274996
+ }) ? variant : null;
274759
274997
  }
274760
274998
  function isNoneBorder(value) {
274761
274999
  return typeof value === "object" && value !== null && "none" in value && value.none === true;
@@ -274780,7 +275018,7 @@ function forEachParagraphBlock(blocks2, visit2) {
274780
275018
  forEachParagraphBlock([cell2.paragraph], visit2);
274781
275019
  }
274782
275020
  }
274783
- function resolveHeaderFooterTokens(blocks2, pageNumber, totalPages, pageNumberText) {
275021
+ function resolveHeaderFooterTokens(blocks2, pageNumber, totalPages, pageNumberText, displayPageNumber) {
274784
275022
  if (!blocks2 || blocks2.length === 0)
274785
275023
  return;
274786
275024
  if (!Number.isFinite(pageNumber) || pageNumber < 1) {
@@ -274793,13 +275031,14 @@ function resolveHeaderFooterTokens(blocks2, pageNumber, totalPages, pageNumberTe
274793
275031
  }
274794
275032
  const pageNumberStr = pageNumberText ?? String(pageNumber);
274795
275033
  const totalPagesStr = String(totalPages);
275034
+ const displayNumber = displayPageNumber ?? pageNumber;
274796
275035
  forEachParagraphBlock(blocks2, (paraBlock) => {
274797
275036
  for (const run2 of paraBlock.runs)
274798
275037
  if ("token" in run2 && run2.token) {
274799
275038
  if (run2.token === "pageNumber")
274800
- run2.text = pageNumberStr;
275039
+ run2.text = run2.pageNumberFieldFormat ? formatPageNumberFieldValue$1(displayNumber, run2.pageNumberFieldFormat) : pageNumberStr;
274801
275040
  else if (run2.token === "totalPageCount")
274802
- run2.text = totalPagesStr;
275041
+ run2.text = run2.pageNumberFieldFormat ? formatPageNumberFieldValue$1(totalPages, run2.pageNumberFieldFormat) : totalPagesStr;
274803
275042
  }
274804
275043
  });
274805
275044
  }
@@ -274864,17 +275103,122 @@ function getBucketRepresentative(bucket) {
274864
275103
  return 5000;
274865
275104
  }
274866
275105
  }
275106
+ function getBucketForDigitCount(digitCount) {
275107
+ if (digitCount <= 1)
275108
+ return "d1";
275109
+ if (digitCount === 2)
275110
+ return "d2";
275111
+ if (digitCount === 3)
275112
+ return "d3";
275113
+ return "d4";
275114
+ }
275115
+ function getBucketForRenderedPageNumberText(text5) {
275116
+ const digitCount = (text5.match(/\d/g) ?? []).length;
275117
+ if (digitCount <= 0)
275118
+ return null;
275119
+ return getBucketForDigitCount(digitCount);
275120
+ }
275121
+ function forEachPageNumberRun(blocks2, visit2) {
275122
+ for (const block of blocks2)
275123
+ if (block.kind === "paragraph") {
275124
+ const paraBlock = block;
275125
+ for (const run2 of paraBlock.runs)
275126
+ if ("token" in run2 && run2.token === "pageNumber")
275127
+ visit2(run2);
275128
+ } else if (block.kind === "list") {
275129
+ const list5 = block;
275130
+ for (const item of list5.items ?? [])
275131
+ for (const run2 of item.paragraph.runs)
275132
+ if ("token" in run2 && run2.token === "pageNumber")
275133
+ visit2(run2);
275134
+ } else if (block.kind === "table") {
275135
+ const table2 = block;
275136
+ for (const row2 of table2.rows ?? [])
275137
+ for (const cell2 of row2.cells ?? [])
275138
+ forEachPageNumberRun(cell2.blocks ? cell2.blocks : cell2.paragraph ? [cell2.paragraph] : [], visit2);
275139
+ }
275140
+ }
275141
+ function buildCompatibleFieldFormatKey(fieldFormat) {
275142
+ return `${fieldFormat.format ?? "decimal"}:${fieldFormat.zeroPadding ?? ""}`;
275143
+ }
275144
+ function getPageNumberBucketingStrategy(blocks2) {
275145
+ let sawImplicitPageNumber = false;
275146
+ const explicitFieldFormats = /* @__PURE__ */ new Map;
275147
+ forEachPageNumberRun(blocks2, (run2) => {
275148
+ const fieldFormat = run2.pageNumberFieldFormat;
275149
+ if (!fieldFormat) {
275150
+ sawImplicitPageNumber = true;
275151
+ return;
275152
+ }
275153
+ if (!isDigitBucketCompatiblePageNumberFormat(fieldFormat.format)) {
275154
+ explicitFieldFormats.clear();
275155
+ sawImplicitPageNumber = true;
275156
+ return;
275157
+ }
275158
+ explicitFieldFormats.set(buildCompatibleFieldFormatKey(fieldFormat), fieldFormat);
275159
+ });
275160
+ if (explicitFieldFormats.size === 0)
275161
+ return sawImplicitPageNumber ? { kind: "displayText" } : null;
275162
+ if (sawImplicitPageNumber || explicitFieldFormats.size > 1)
275163
+ return null;
275164
+ return {
275165
+ kind: "fieldFormat",
275166
+ fieldFormat: explicitFieldFormats.values().next().value
275167
+ };
275168
+ }
275169
+ function canUseDigitBucketingForVariant(blocks2, docTotalPages, pageResolver) {
275170
+ const strategy = getPageNumberBucketingStrategy(blocks2);
275171
+ if (!strategy)
275172
+ return false;
275173
+ const renderedBucketForPage = (pageNumber) => {
275174
+ const pageInfo = pageResolver(pageNumber);
275175
+ const renderedText = strategy.kind === "fieldFormat" ? Number.isFinite(pageInfo.displayNumber) ? formatPageNumberFieldValue$1(pageInfo.displayNumber ?? pageNumber, strategy.fieldFormat) : null : pageInfo.displayText;
275176
+ return renderedText ? getBucketForRenderedPageNumberText(renderedText) : null;
275177
+ };
275178
+ const expectedRenderedBuckets = /* @__PURE__ */ new Map;
275179
+ for (let pageNumber = 1;pageNumber <= docTotalPages; pageNumber += 1) {
275180
+ const physicalBucket = getBucketForPageNumber(pageNumber);
275181
+ const renderedBucket = renderedBucketForPage(pageNumber);
275182
+ if (!renderedBucket)
275183
+ return false;
275184
+ const expectedBucket = expectedRenderedBuckets.get(physicalBucket);
275185
+ if (!expectedBucket) {
275186
+ expectedRenderedBuckets.set(physicalBucket, renderedBucket);
275187
+ continue;
275188
+ }
275189
+ if (expectedBucket !== renderedBucket)
275190
+ return false;
275191
+ }
275192
+ for (const [physicalBucket, expectedRenderedBucket] of expectedRenderedBuckets)
275193
+ if (renderedBucketForPage(getBucketRepresentative(physicalBucket)) !== expectedRenderedBucket)
275194
+ return false;
275195
+ return true;
275196
+ }
274867
275197
  function paragraphHasPageToken(para) {
274868
275198
  for (const run2 of para.runs)
274869
275199
  if ("token" in run2 && (run2.token === "pageNumber" || run2.token === "totalPageCount"))
274870
275200
  return true;
274871
275201
  return false;
274872
275202
  }
275203
+ function isDigitBucketCompatiblePageNumberFormat(format) {
275204
+ return !format || format === "decimal" || format === "numberInDash";
275205
+ }
275206
+ function paragraphRequiresPerPageLayout(para) {
275207
+ for (const run2 of para.runs)
275208
+ if ("token" in run2 && run2.token === "pageNumber" && run2.pageNumberFieldFormat && !isDigitBucketCompatiblePageNumberFormat(run2.pageNumberFieldFormat.format))
275209
+ return true;
275210
+ return false;
275211
+ }
274873
275212
  function hasPageTokens(blocks2) {
274874
275213
  for (const block of blocks2)
274875
275214
  if (block.kind === "paragraph") {
274876
275215
  if (paragraphHasPageToken(block))
274877
275216
  return true;
275217
+ } else if (block.kind === "list") {
275218
+ const list5 = block;
275219
+ for (const item of list5.items ?? [])
275220
+ if (paragraphHasPageToken(item.paragraph))
275221
+ return true;
274878
275222
  } else if (block.kind === "table") {
274879
275223
  const table2 = block;
274880
275224
  for (const row2 of table2.rows ?? [])
@@ -274884,6 +275228,25 @@ function hasPageTokens(blocks2) {
274884
275228
  }
274885
275229
  return false;
274886
275230
  }
275231
+ function hasPageNumberTokensRequiringPerPageLayout(blocks2) {
275232
+ for (const block of blocks2)
275233
+ if (block.kind === "paragraph") {
275234
+ if (paragraphRequiresPerPageLayout(block))
275235
+ return true;
275236
+ } else if (block.kind === "list") {
275237
+ const list5 = block;
275238
+ for (const item of list5.items ?? [])
275239
+ if (paragraphRequiresPerPageLayout(item.paragraph))
275240
+ return true;
275241
+ } else if (block.kind === "table") {
275242
+ const table2 = block;
275243
+ for (const row2 of table2.rows ?? [])
275244
+ for (const cell2 of row2.cells ?? [])
275245
+ if (hasPageNumberTokensRequiringPerPageLayout(cell2.blocks ? cell2.blocks : cell2.paragraph ? [cell2.paragraph] : []))
275246
+ return true;
275247
+ }
275248
+ return false;
275249
+ }
274887
275250
  async function layoutHeaderFooterWithCache(sections, constraints, measureBlock$1, cache$2 = sharedHeaderFooterCache, totalPages, pageResolver, kind) {
274888
275251
  const result = {};
274889
275252
  if (!pageResolver) {
@@ -274919,7 +275282,7 @@ async function layoutHeaderFooterWithCache(sections, constraints, measureBlock$1
274919
275282
  continue;
274920
275283
  }
274921
275284
  let pagesToLayout;
274922
- if (!useBucketing) {
275285
+ if (!(useBucketing && !hasPageNumberTokensRequiringPerPageLayout(blocks2) && canUseDigitBucketingForVariant(blocks2, docTotalPages, pageResolver))) {
274923
275286
  pagesToLayout = Array.from({ length: docTotalPages }, (_$1, i4) => i4 + 1);
274924
275287
  HeaderFooterCacheLogger.logBucketingDecision(docTotalPages, false);
274925
275288
  } else {
@@ -274932,8 +275295,8 @@ async function layoutHeaderFooterWithCache(sections, constraints, measureBlock$1
274932
275295
  const pages = [];
274933
275296
  for (const pageNum of pagesToLayout) {
274934
275297
  const clonedBlocks = cloneHeaderFooterBlocks(blocks2);
274935
- const { displayText, totalPages: totalPagesForPage } = pageResolver(pageNum);
274936
- resolveHeaderFooterTokens(clonedBlocks, pageNum, totalPagesForPage, displayText);
275298
+ const { displayText, displayNumber, totalPages: totalPagesForPage } = pageResolver(pageNum);
275299
+ resolveHeaderFooterTokens(clonedBlocks, pageNum, totalPagesForPage, displayText, displayNumber);
274937
275300
  const measures = await cache$2.measureBlocks(clonedBlocks, constraints, measureBlock$1);
274938
275301
  const pageLayout = layoutHeaderFooter(clonedBlocks, measures, constraints, kind);
274939
275302
  const measuresById = /* @__PURE__ */ new Map;
@@ -274952,9 +275315,11 @@ async function layoutHeaderFooterWithCache(sections, constraints, measureBlock$1
274952
275315
  }) ?? [];
274953
275316
  pages.push({
274954
275317
  number: pageNum,
275318
+ displayNumber,
274955
275319
  blocks: clonedBlocks,
274956
275320
  measures,
274957
- fragments: fragmentsWithLines
275321
+ fragments: fragmentsWithLines,
275322
+ numberText: displayText
274958
275323
  });
274959
275324
  }
274960
275325
  const firstPageLayout = pages[0] ? layoutHeaderFooter(pages[0].blocks, pages[0].measures, constraints, kind) : {
@@ -274968,7 +275333,9 @@ async function layoutHeaderFooterWithCache(sections, constraints, measureBlock$1
274968
275333
  renderHeight: firstPageLayout.renderHeight,
274969
275334
  pages: pages.map((p$12) => ({
274970
275335
  number: p$12.number,
275336
+ displayNumber: p$12.displayNumber,
274971
275337
  fragments: p$12.fragments,
275338
+ numberText: p$12.numberText,
274972
275339
  blocks: p$12.blocks,
274973
275340
  measures: p$12.measures
274974
275341
  }))
@@ -275588,6 +275955,8 @@ function computeHeaderFooterContentHash(blocks2) {
275588
275955
  parts.push("i");
275589
275956
  if ("token" in run2 && run2.token)
275590
275957
  parts.push(`token:${run2.token}`);
275958
+ if ("pageNumberFormat" in run2 && run2.pageNumberFormat)
275959
+ parts.push(`pnf:${run2.pageNumberFormat}`);
275591
275960
  }
275592
275961
  }
275593
275962
  return parts.join("|");
@@ -276960,8 +277329,10 @@ async function incrementalLayout(previousBlocks, _previousLayout, nextBlocks, op
276960
277329
  const numberingCtx = buildNumberingContext(layout, sections);
276961
277330
  const pageResolver = FeatureFlags.HEADER_FOOTER_PAGE_TOKENS ? (pageNumber) => {
276962
277331
  const pageIndex = pageNumber - 1;
277332
+ const displayInfo = numberingCtx.displayPages[pageIndex];
276963
277333
  return {
276964
- displayText: numberingCtx.displayPages[pageIndex]?.displayText ?? String(pageNumber),
277334
+ displayText: displayInfo?.displayText ?? String(pageNumber),
277335
+ displayNumber: displayInfo?.displayNumber ?? pageNumber,
276965
277336
  totalPages: numberingCtx.totalPages
276966
277337
  };
276967
277338
  } : undefined;
@@ -283976,7 +284347,7 @@ async function measureParagraphBlock(block, maxWidth) {
283976
284347
  toChar: 1,
283977
284348
  width: 0,
283978
284349
  maxFontSize: lastFontSize,
283979
- maxFontInfo: hasSeenTextRun ? undefined : fallbackFontInfo,
284350
+ maxFontInfo: hasSeenTextRun ? undefined : fallbackFontInfo ?? getFontInfoFromRun(run2),
283980
284351
  maxWidth: getEffectiveWidth(lines.length === 0 ? initialAvailableWidth : bodyContentWidth),
283981
284352
  segments: [],
283982
284353
  spaceCount: 0
@@ -285267,8 +285638,10 @@ async function layoutPerRIdHeaderFooters(headerFooterInput, layout, sectionMetad
285267
285638
  const displayPages = computeDisplayPageNumber(layout.pages, sectionMetadata);
285268
285639
  const totalPages = layout.pages.length;
285269
285640
  const pageResolver = (pageNumber) => {
285641
+ const displayInfo = displayPages[pageNumber - 1];
285270
285642
  return {
285271
- displayText: displayPages[pageNumber - 1]?.displayText ?? String(pageNumber),
285643
+ displayText: displayInfo?.displayText ?? String(pageNumber),
285644
+ displayNumber: displayInfo?.displayNumber ?? pageNumber,
285272
285645
  totalPages
285273
285646
  };
285274
285647
  };
@@ -285371,6 +285744,10 @@ async function layoutWithPerSectionConstraints(kind, blocksByRId, sectionMetadat
285371
285744
  }
285372
285745
  }
285373
285746
  }
285747
+ function hasSectionRefsForKind(identifier, kind) {
285748
+ const refKey = kind === "header" ? "headerRefs" : "footerRefs";
285749
+ return Boolean(identifier?.sections?.some((section) => section[refKey] !== undefined));
285750
+ }
285374
285751
  function buildSurfacePmEntries(surface) {
285375
285752
  const nodes = Array.from(surface.querySelectorAll("[data-pm-start][data-pm-end]"));
285376
285753
  const nonLeaf = /* @__PURE__ */ new WeakSet;
@@ -285475,6 +285852,18 @@ function buildHeaderFooterStory(kind, id2) {
285475
285852
  function storyIdFromHeaderFooterLayoutKey(key2) {
285476
285853
  return key2.replace(/::s\d+$/, "");
285477
285854
  }
285855
+ function refForVariant(refs, variant) {
285856
+ const ref$1 = refs?.[variant];
285857
+ if (ref$1)
285858
+ return {
285859
+ refId: ref$1,
285860
+ matchedVariant: variant
285861
+ };
285862
+ return variant === "odd" && refs?.default ? {
285863
+ refId: refs.default,
285864
+ matchedVariant: "default"
285865
+ } : undefined;
285866
+ }
285478
285867
  function resolveResult(result, storyId) {
285479
285868
  const story = buildHeaderFooterStory(result.kind, storyId ?? String(result.type));
285480
285869
  return resolveHeaderFooterLayout(result.layout, result.blocks, result.measures, story);
@@ -285491,19 +285880,34 @@ function shiftResolvedPaintItemY(item, yOffset) {
285491
285880
  y: item.y + yOffset
285492
285881
  };
285493
285882
  }
285494
- function normalizeDecorationFragments(fragments, layoutMinY) {
285495
- if (layoutMinY >= 0)
285883
+ function isExplicitBehindDocMediaFragment(fragment2) {
285884
+ return (fragment2.kind === "image" || fragment2.kind === "drawing") && fragment2.behindDoc === true;
285885
+ }
285886
+ function getDecorationNormalizationMinY(fragments, layoutMinY) {
285887
+ if (!Number.isFinite(layoutMinY) || layoutMinY >= 0)
285888
+ return 0;
285889
+ let minY = Infinity;
285890
+ for (const fragment2 of fragments) {
285891
+ if (isExplicitBehindDocMediaFragment(fragment2))
285892
+ continue;
285893
+ if (Number.isFinite(fragment2.y))
285894
+ minY = Math.min(minY, fragment2.y);
285895
+ }
285896
+ return minY < 0 ? minY : 0;
285897
+ }
285898
+ function normalizeDecorationFragments(fragments, normalizationMinY) {
285899
+ if (normalizationMinY >= 0)
285496
285900
  return fragments;
285497
- const yOffset = -layoutMinY;
285901
+ const yOffset = -normalizationMinY;
285498
285902
  return fragments.map((fragment2) => ({
285499
285903
  ...fragment2,
285500
285904
  y: fragment2.y + yOffset
285501
285905
  }));
285502
285906
  }
285503
- function normalizeDecorationItems(items, layoutMinY) {
285504
- if (layoutMinY >= 0)
285907
+ function normalizeDecorationItems(items, normalizationMinY) {
285908
+ if (normalizationMinY >= 0)
285505
285909
  return items;
285506
- const yOffset = -layoutMinY;
285910
+ const yOffset = -normalizationMinY;
285507
285911
  return items.map((item) => shiftResolvedPaintItemY(item, yOffset));
285508
285912
  }
285509
285913
  function createStoryHiddenHost(doc$12, widthPx, options = {}) {
@@ -306208,6 +306612,7 @@ menclose::after {
306208
306612
  highlight: run2.highlight ?? null,
306209
306613
  textTransform: run2.textTransform ?? null,
306210
306614
  token: run2.token ?? null,
306615
+ pageNumberFieldFormat: run2.pageNumberFieldFormat ?? null,
306211
306616
  pageRefMetadata: run2.pageRefMetadata ?? null,
306212
306617
  trackedChange: run2.trackedChange ?? null,
306213
306618
  trackedChanges: run2.trackedChanges ?? null,
@@ -309326,10 +309731,16 @@ menclose::after {
309326
309731
  return "";
309327
309732
  if (!runToken)
309328
309733
  return run2.text ?? "";
309329
- if (runToken === "pageNumber")
309734
+ if (runToken === "pageNumber") {
309735
+ if (run2.pageNumberFieldFormat)
309736
+ return formatPageNumberFieldValue$1(context.displayPageNumber ?? context.pageNumber, run2.pageNumberFieldFormat);
309330
309737
  return context.pageNumberText ?? String(context.pageNumber);
309331
- if (runToken === "totalPageCount")
309738
+ }
309739
+ if (runToken === "totalPageCount") {
309740
+ if (run2.pageNumberFieldFormat)
309741
+ return formatPageNumberFieldValue$1(context.totalPages || 1, run2.pageNumberFieldFormat);
309332
309742
  return context.totalPages ? String(context.totalPages) : run2.text ?? "";
309743
+ }
309333
309744
  return run2.text ?? "";
309334
309745
  }, extractLinkData = (run2) => {
309335
309746
  if (run2.kind === "tab" || run2.kind === "image" || run2.kind === "lineBreak" || run2.kind === "math")
@@ -310062,20 +310473,39 @@ menclose::after {
310062
310473
  if (!("text" in run2) || !run2.text)
310063
310474
  return null;
310064
310475
  return renderTextRun(run2, context, renderContext, trackedConfig);
310065
- }, renderInlineTabRun = (run2, line, doc$12, layoutEpoch, styleId) => {
310476
+ }, getRunUnderline = (run2) => ("underline" in run2) ? run2.underline : undefined, getRunFontSize = (run2) => ("fontSize" in run2) && typeof run2.fontSize === "number" ? run2.fontSize : 16, getRunColor = (run2) => ("color" in run2) && typeof run2.color === "string" ? run2.color : undefined, underlineStyleForRun = (run2) => getRunUnderline(run2)?.style ?? "single", canPaintUnderlineAsBorder = (run2) => {
310477
+ if (!getRunUnderline(run2))
310478
+ return false;
310479
+ const style2 = underlineStyleForRun(run2);
310480
+ return style2 !== "none" && style2 !== "words";
310481
+ }, canPaintUnderlineOverlay = (run2) => {
310482
+ if (!canPaintUnderlineAsBorder(run2))
310483
+ return false;
310484
+ const style2 = underlineStyleForRun(run2);
310485
+ return style2 === "single" || style2 === "double" || style2 === "dotted" || style2 === "dashed";
310486
+ }, underlineBorderForRun = (run2) => {
310487
+ if (!canPaintUnderlineAsBorder(run2))
310488
+ return;
310489
+ const underlineStyle = underlineStyleForRun(run2);
310490
+ const borderStyle = underlineStyle === "double" || underlineStyle === "dotted" || underlineStyle === "dashed" ? underlineStyle : "solid";
310491
+ const underlineColor = getRunUnderline(run2)?.color ?? getRunColor(run2) ?? "#000000";
310492
+ return `${underlineThicknessPx(getRunFontSize(run2))}px ${borderStyle} ${underlineColor}`;
310493
+ }, renderInlineTabRun = (run2, line, doc$12, layoutEpoch, styleId, paintUnderline = true) => {
310066
310494
  const tabEl = doc$12.createElement("span");
310067
310495
  tabEl.classList.add("superdoc-tab");
310068
310496
  const tabWidth = run2.width ?? 48;
310069
310497
  tabEl.style.display = "inline-block";
310070
310498
  tabEl.style.width = `${tabWidth}px`;
310071
- if (run2.underline) {
310499
+ const shouldPaintUnderline = paintUnderline && canPaintUnderlineAsBorder(run2);
310500
+ if (shouldPaintUnderline) {
310072
310501
  tabEl.style.height = `${underlineOffsetFromLineTop(line)}px`;
310073
310502
  tabEl.style.verticalAlign = "top";
310074
310503
  } else {
310075
310504
  tabEl.style.height = `${line.lineHeight}px`;
310076
310505
  tabEl.style.verticalAlign = "bottom";
310077
310506
  }
310078
- applyTabUnderlineBorder(tabEl, run2);
310507
+ if (shouldPaintUnderline)
310508
+ applyTabUnderlineBorder(tabEl, run2);
310079
310509
  if (styleId)
310080
310510
  tabEl.setAttribute("styleid", styleId);
310081
310511
  if (run2.pmStart != null)
@@ -310084,7 +310514,7 @@ menclose::after {
310084
310514
  tabEl.dataset.pmEnd = String(run2.pmEnd);
310085
310515
  tabEl.dataset.layoutEpoch = String(layoutEpoch);
310086
310516
  return tabEl;
310087
- }, renderPositionedTabRun = (run2, line, doc$12, layoutEpoch, tabStartX, indentOffset, immediateNextSegment, styleId) => {
310517
+ }, renderPositionedTabRun = (run2, line, doc$12, layoutEpoch, tabStartX, indentOffset, immediateNextSegment, styleId, paintUnderline = true) => {
310088
310518
  const measuredTabEndX = tabStartX + (run2.width ?? 0);
310089
310519
  const tabEndX = immediateNextSegment?.precedingTabEndX ?? immediateNextSegment?.x ?? measuredTabEndX;
310090
310520
  const actualTabWidth = tabEndX - tabStartX;
@@ -310093,12 +310523,14 @@ menclose::after {
310093
310523
  tabEl.style.left = `${tabStartX + indentOffset}px`;
310094
310524
  tabEl.style.top = "0px";
310095
310525
  tabEl.style.width = `${actualTabWidth}px`;
310096
- tabEl.style.height = run2.underline ? `${underlineOffsetFromLineTop(line)}px` : `${line.lineHeight}px`;
310526
+ const shouldPaintUnderline = paintUnderline && canPaintUnderlineAsBorder(run2);
310527
+ tabEl.style.height = shouldPaintUnderline ? `${underlineOffsetFromLineTop(line)}px` : `${line.lineHeight}px`;
310097
310528
  tabEl.style.display = "inline-block";
310098
310529
  tabEl.style.pointerEvents = "none";
310099
310530
  tabEl.style.zIndex = "1";
310100
- applyTabUnderlineBorder(tabEl, run2);
310101
- if (!run2.underline)
310531
+ if (shouldPaintUnderline)
310532
+ applyTabUnderlineBorder(tabEl, run2);
310533
+ else
310102
310534
  tabEl.style.visibility = "hidden";
310103
310535
  if (styleId)
310104
310536
  tabEl.setAttribute("styleid", styleId);
@@ -310115,13 +310547,10 @@ menclose::after {
310115
310547
  }, underlineOffsetFromLineTop = (line) => {
310116
310548
  return Math.max(0, (line.lineHeight - line.ascent - line.descent) / 2) + line.ascent + Math.min(line.descent, line.lineHeight * 0.08);
310117
310549
  }, applyTabUnderlineBorder = (tabEl, run2) => {
310118
- if (!run2.underline)
310550
+ const border = underlineBorderForRun(run2);
310551
+ if (!border)
310119
310552
  return;
310120
- const underlineStyle = run2.underline.style ?? "single";
310121
- const underlineColor = run2.underline.color ?? "#000000";
310122
- const borderStyle = underlineStyle === "double" ? "double" : "solid";
310123
- const fontSize = run2.fontSize ?? 16;
310124
- tabEl.style.borderBottom = `${underlineThicknessPx(fontSize)}px ${borderStyle} ${underlineColor}`;
310553
+ tabEl.style.borderBottom = border;
310125
310554
  }, applyStyles$1 = (el, styles) => {
310126
310555
  Object.entries(styles).forEach(([key2, value]) => {
310127
310556
  if (value != null && value !== "" && key2 in el.style)
@@ -310226,6 +310655,73 @@ menclose::after {
310226
310655
  break;
310227
310656
  }
310228
310657
  return merged;
310658
+ }, isTextRun$5 = (run2) => (run2.kind === "text" || run2.kind === undefined) && ("text" in run2), isOverlaySafeRunKind = (run2) => {
310659
+ const kind = run2.kind ?? "text";
310660
+ return kind === "text" || kind === "tab" || kind === "lineBreak" || kind === "break";
310661
+ }, shouldUseLineUnderlineOverlay = (runsForLine) => runsForLine.every(isOverlaySafeRunKind) && runsForLine.some((run2) => run2.kind === "tab" && canPaintUnderlineOverlay(run2)), cloneRunWithoutUnderline = (run2) => ({
310662
+ ...run2,
310663
+ underline: undefined
310664
+ }), appendUnderlineOverlaySpan = (spans, from$1, to, border) => {
310665
+ if (!border || to <= from$1)
310666
+ return;
310667
+ const last2 = spans[spans.length - 1];
310668
+ if (last2 && last2.border === border && Math.abs(last2.to - from$1) < 0.5) {
310669
+ last2.to = to;
310670
+ return;
310671
+ }
310672
+ spans.push({
310673
+ from: from$1,
310674
+ to,
310675
+ border
310676
+ });
310677
+ }, runInlinePaintWidth = (run2, runIndex, segmentsByRun, spacingPerSpace) => {
310678
+ if (run2.kind === "tab")
310679
+ return run2.width ?? 48;
310680
+ const segments = segmentsByRun.get(runIndex);
310681
+ if (segments?.length)
310682
+ return segments.reduce((sum, segment) => {
310683
+ const text5 = isTextRun$5(run2) ? (run2.text ?? "").slice(segment.fromChar, segment.toChar) : "";
310684
+ return sum + segment.width + spacingPerSpace * countSpaces$1(text5);
310685
+ }, 0);
310686
+ if ("width" in run2 && typeof run2.width === "number")
310687
+ return run2.width;
310688
+ return 0;
310689
+ }, buildInlineUnderlineSpans = (block, line, spacingPerSpace, lineTextStartOffsetPx) => {
310690
+ const segmentsByRun = /* @__PURE__ */ new Map;
310691
+ line.segments?.forEach((segment) => {
310692
+ const segments = segmentsByRun.get(segment.runIndex);
310693
+ if (segments)
310694
+ segments.push(segment);
310695
+ else
310696
+ segmentsByRun.set(segment.runIndex, [segment]);
310697
+ });
310698
+ const spans = [];
310699
+ let currentX = lineTextStartOffsetPx;
310700
+ for (let runIndex = line.fromRun;runIndex <= line.toRun; runIndex += 1) {
310701
+ const run2 = block.runs[runIndex];
310702
+ if (!run2)
310703
+ continue;
310704
+ const width = runInlinePaintWidth(run2, runIndex, segmentsByRun, spacingPerSpace);
310705
+ if (canPaintUnderlineOverlay(run2))
310706
+ appendUnderlineOverlaySpan(spans, currentX, currentX + width, underlineBorderForRun(run2));
310707
+ currentX += width;
310708
+ }
310709
+ return spans;
310710
+ }, renderUnderlineSpans = (spans, top$1, el, doc$12) => {
310711
+ spans.forEach((span) => {
310712
+ const overlay = doc$12.createElement("div");
310713
+ overlay.classList.add("superdoc-underline-overlay");
310714
+ overlay.setAttribute("aria-hidden", "true");
310715
+ overlay.style.position = "absolute";
310716
+ overlay.style.left = `${span.from}px`;
310717
+ overlay.style.top = `${top$1}px`;
310718
+ overlay.style.width = `${Math.max(0, span.to - span.from)}px`;
310719
+ overlay.style.height = "0px";
310720
+ overlay.style.borderTop = span.border;
310721
+ overlay.style.pointerEvents = "none";
310722
+ overlay.style.zIndex = "2";
310723
+ el.appendChild(overlay);
310724
+ });
310229
310725
  }, renderLine = ({ block, line, context, availableWidthOverride, lineIndex, skipJustify, preExpandedRuns, resolvedListTextStartPx, indentOffsetOverride, paragraphMarkLeftOffsetOverride, runContext }) => {
310230
310726
  const expandedBlock = {
310231
310727
  ...block,
@@ -310320,6 +310816,11 @@ menclose::after {
310320
310816
  shouldJustify: justifyShouldApply
310321
310817
  });
310322
310818
  const lineContainsInlineImage = runsForLine.some((run2) => isImageRun$1(run2));
310819
+ const useSegmentPositioning = shouldUseSegmentPositioning(hasExplicitPositioning ?? false, Boolean(line.segments), isRtl);
310820
+ const overlayAlignment = block.attrs?.alignment;
310821
+ const overlayIndent = block.attrs?.indent;
310822
+ const inlineOverlayOriginMatchesContent = overlayAlignment !== "center" && overlayAlignment !== "right" && (overlayIndent?.hanging ?? 0) === 0 && (overlayIndent?.left ?? 0) >= 0;
310823
+ const useLineUnderlineOverlay = Boolean(line.segments) && !isRtl && shouldUseLineUnderlineOverlay(runsForLine) && (useSegmentPositioning || inlineOverlayOriginMatchesContent);
310323
310824
  const resolveLineIndentOffset = () => {
310324
310825
  if (indentOffsetOverride != null)
310325
310826
  return indentOffsetOverride;
@@ -310339,7 +310840,8 @@ menclose::after {
310339
310840
  const paragraphMarkLeftOffsetPx = lineTextStartOffsetPx;
310340
310841
  if (spacingPerSpace !== 0)
310341
310842
  el.style.wordSpacing = `${spacingPerSpace}px`;
310342
- if (shouldUseSegmentPositioning(hasExplicitPositioning ?? false, Boolean(line.segments), isRtl))
310843
+ const underlineSpans = [];
310844
+ if (useSegmentPositioning)
310343
310845
  renderExplicitlyPositionedRuns({
310344
310846
  block,
310345
310847
  line,
@@ -310350,9 +310852,11 @@ menclose::after {
310350
310852
  styleId,
310351
310853
  runContext,
310352
310854
  trackedConfig,
310353
- lineContainsInlineImage
310855
+ lineContainsInlineImage,
310856
+ useLineUnderlineOverlay,
310857
+ underlineSpanCollector: useLineUnderlineOverlay ? underlineSpans : undefined
310354
310858
  });
310355
- else
310859
+ else {
310356
310860
  renderInlineRuns({
310357
310861
  runsForLine,
310358
310862
  line,
@@ -310361,8 +310865,14 @@ menclose::after {
310361
310865
  styleId,
310362
310866
  runContext,
310363
310867
  trackedConfig,
310364
- lineContainsInlineImage
310868
+ lineContainsInlineImage,
310869
+ useLineUnderlineOverlay
310365
310870
  });
310871
+ if (useLineUnderlineOverlay)
310872
+ underlineSpans.push(...buildInlineUnderlineSpans(expandedBlock, line, spacingPerSpace, lineTextStartOffsetPx));
310873
+ }
310874
+ if (useLineUnderlineOverlay && underlineSpans.length > 0)
310875
+ renderUnderlineSpans(underlineSpans, underlineOffsetFromLineTop(line), el, runContext.doc);
310366
310876
  appendFormattingParagraphMark(el, line, expandedBlock.runs, paragraphMarkLeftOffsetPx, availableWidth, hasExplicitPositioning ?? false, runContext.doc, runContext.showFormattingMarks);
310367
310877
  el.querySelectorAll("a[href]").forEach((anchor) => {
310368
310878
  const pendingTooltip = runContext.pendingTooltips.get(anchor);
@@ -310372,7 +310882,7 @@ menclose::after {
310372
310882
  }
310373
310883
  });
310374
310884
  return el;
310375
- }, renderExplicitlyPositionedRuns = ({ block, line, context, el, lineTextStartOffsetPx, spacingPerSpace, styleId, runContext, trackedConfig, lineContainsInlineImage }) => {
310885
+ }, renderExplicitlyPositionedRuns = ({ block, line, context, el, lineTextStartOffsetPx, spacingPerSpace, styleId, runContext, trackedConfig, lineContainsInlineImage, useLineUnderlineOverlay, underlineSpanCollector }) => {
310376
310886
  const indentOffset = lineTextStartOffsetPx;
310377
310887
  let cumulativeX = 0;
310378
310888
  const segments = line.segments;
@@ -310441,8 +310951,11 @@ menclose::after {
310441
310951
  if (baseRun.kind === "tab") {
310442
310952
  const immediateNextSegment = findImmediateNextSegment(runIndex);
310443
310953
  const tabStartX = cumulativeX;
310444
- const { element: tabEl, tabEndX, actualTabWidth } = renderPositionedTabRun(baseRun, line, runContext.doc, runContext.layoutEpoch, tabStartX, indentOffset, immediateNextSegment, styleId);
310954
+ const coveredByOverlay$1 = useLineUnderlineOverlay && canPaintUnderlineOverlay(baseRun);
310955
+ const { element: tabEl, tabEndX, actualTabWidth } = renderPositionedTabRun(baseRun, line, runContext.doc, runContext.layoutEpoch, tabStartX, indentOffset, immediateNextSegment, styleId, !coveredByOverlay$1);
310445
310956
  appendToLineGeo(tabEl, baseRun, tabStartX + indentOffset, actualTabWidth);
310957
+ if (coveredByOverlay$1 && underlineSpanCollector)
310958
+ appendUnderlineOverlaySpan(underlineSpanCollector, tabStartX + indentOffset, tabStartX + indentOffset + actualTabWidth, underlineBorderForRun(baseRun));
310446
310959
  cumulativeX = tabEndX;
310447
310960
  continue;
310448
310961
  }
@@ -310521,6 +311034,7 @@ menclose::after {
310521
311034
  const baseText = baseRun.text ?? "";
310522
311035
  const runPmStart = baseRun.pmStart ?? null;
310523
311036
  const fallbackPmEnd = runPmStart != null && baseRun.pmEnd == null ? runPmStart + baseText.length : baseRun.pmEnd ?? null;
311037
+ const coveredByOverlay = useLineUnderlineOverlay && canPaintUnderlineOverlay(baseRun);
310524
311038
  runSegments.forEach((segment) => {
310525
311039
  const segmentText = baseText.slice(segment.fromChar, segment.toChar);
310526
311040
  if (!segmentText)
@@ -310531,10 +311045,13 @@ menclose::after {
310531
311045
  ...baseRun,
310532
311046
  text: segmentText,
310533
311047
  pmStart: pmSliceStart,
310534
- pmEnd: pmSliceEnd
311048
+ pmEnd: pmSliceEnd,
311049
+ ...coveredByOverlay ? { underline: undefined } : {}
310535
311050
  };
310536
311051
  const elem = renderRun(segmentRun, context, runContext, trackedConfig);
310537
311052
  if (elem) {
311053
+ if (coveredByOverlay)
311054
+ elem.style.textDecorationLine = segmentRun.strike ? "line-through" : "none";
310538
311055
  if (styleId)
310539
311056
  elem.setAttribute("styleid", styleId);
310540
311057
  alignNormalTextBesideInlineImage(elem, segmentRun, lineContainsInlineImage);
@@ -310544,6 +311061,8 @@ menclose::after {
310544
311061
  elem.style.left = `${xPos}px`;
310545
311062
  appendToLineGeo(elem, segmentRun, xPos, segment.width);
310546
311063
  const visualWidth = segment.width + (spacingPerSpace !== 0 ? spacingPerSpace * countSpaces$1(segmentText) : 0);
311064
+ if (coveredByOverlay && underlineSpanCollector)
311065
+ appendUnderlineOverlaySpan(underlineSpanCollector, xPos, xPos + visualWidth, underlineBorderForRun(baseRun));
310547
311066
  cumulativeX = baseX + visualWidth;
310548
311067
  if (geoSdtWrapper)
310549
311068
  geoSdtMaxRight = Math.max(geoSdtMaxRight, xPos + visualWidth);
@@ -310551,7 +311070,7 @@ menclose::after {
310551
311070
  });
310552
311071
  }
310553
311072
  closeGeoSdtWrapper();
310554
- }, renderInlineRuns = ({ runsForLine, line, context, el, styleId, runContext, trackedConfig, lineContainsInlineImage }) => {
311073
+ }, renderInlineRuns = ({ runsForLine, line, context, el, styleId, runContext, trackedConfig, lineContainsInlineImage, useLineUnderlineOverlay }) => {
310555
311074
  let currentInlineSdtWrapper = null;
310556
311075
  let currentInlineSdtId = null;
310557
311076
  const closeCurrentWrapper = () => {
@@ -310566,11 +311085,15 @@ menclose::after {
310566
311085
  const runSdtId = resolved?.sdtId ?? null;
310567
311086
  if (runSdtId !== currentInlineSdtId)
310568
311087
  closeCurrentWrapper();
310569
- const elem = run2.kind === "tab" ? renderInlineTabRun(run2, line, runContext.doc, runContext.layoutEpoch, styleId) : renderRun(run2, context, runContext, trackedConfig);
311088
+ const suppressUnderline = useLineUnderlineOverlay && canPaintUnderlineOverlay(run2);
311089
+ const runForRender = suppressUnderline ? cloneRunWithoutUnderline(run2) : run2;
311090
+ const elem = run2.kind === "tab" ? renderInlineTabRun(runForRender, line, runContext.doc, runContext.layoutEpoch, styleId, !suppressUnderline) : renderRun(runForRender, context, runContext, trackedConfig);
310570
311091
  if (elem) {
311092
+ if (suppressUnderline && run2.kind !== "tab")
311093
+ elem.style.textDecorationLine = "strike" in runForRender && runForRender.strike ? "line-through" : "none";
310571
311094
  if (styleId)
310572
311095
  elem.setAttribute("styleid", styleId);
310573
- alignNormalTextBesideInlineImage(elem, run2, lineContainsInlineImage);
311096
+ alignNormalTextBesideInlineImage(elem, runForRender, lineContainsInlineImage);
310574
311097
  if (resolved) {
310575
311098
  if (!currentInlineSdtWrapper) {
310576
311099
  currentInlineSdtWrapper = runContext.createInlineSdtWrapper(resolved.sdt);
@@ -311474,6 +311997,7 @@ menclose::after {
311474
311997
  totalPages: this.totalPages,
311475
311998
  section: "body",
311476
311999
  pageNumberText: page.numberText,
312000
+ displayPageNumber: page.displayNumber,
311477
312001
  pageIndex
311478
312002
  };
311479
312003
  const resolvedItems = page.items;
@@ -311688,6 +312212,7 @@ menclose::after {
311688
312212
  section: kind,
311689
312213
  story: resolveDecorationStory(kind, data),
311690
312214
  pageNumberText: page.numberText,
312215
+ displayPageNumber: page.displayNumber,
311691
312216
  pageIndex
311692
312217
  };
311693
312218
  const decorationItems = data.items ?? [];
@@ -311833,6 +312358,7 @@ menclose::after {
311833
312358
  totalPages: this.totalPages,
311834
312359
  section: "body",
311835
312360
  pageNumberText: page.numberText,
312361
+ displayPageNumber: page.displayNumber,
311836
312362
  pageIndex
311837
312363
  };
311838
312364
  resolvedItems.forEach((resolvedItem, index2) => {
@@ -311849,9 +312375,10 @@ menclose::after {
311849
312375
  const geometryChanged = hasFragmentGeometryChanged(current.fragment, fragment2);
311850
312376
  const sdtBoundaryMismatch = shouldRebuildForSdtBoundary(current.element, sdtBoundary);
311851
312377
  const betweenBorderMismatch = current.element.dataset.betweenBorder === "true" !== (betweenInfo?.showBetweenBorder ?? false) || current.element.dataset.suppressTopBorder === "true" !== (betweenInfo?.suppressTopBorder ?? false) || (current.element.dataset.gapBelow ?? "") !== (betweenInfo?.gapBelow ? String(betweenInfo.gapBelow) : "");
312378
+ const pageContextChanged = needsRebuildForPageContext(current.context, contextBase, resolvedItem);
311852
312379
  const newPmStart = fragment2.pmStart;
311853
312380
  const mappingUnreliable = this.currentMapping != null && newPmStart != null && current.element.dataset.pmStart != null && this.currentMapping.map(Number(current.element.dataset.pmStart)) !== newPmStart;
311854
- if (geometryChanged || this.changedBlocks.has(fragment2.blockId) || current.signature !== resolvedSig || sdtBoundaryMismatch || betweenBorderMismatch || mappingUnreliable) {
312381
+ if (geometryChanged || this.changedBlocks.has(fragment2.blockId) || current.signature !== resolvedSig || sdtBoundaryMismatch || betweenBorderMismatch || pageContextChanged || mappingUnreliable) {
311855
312382
  const replacement = this.renderFragment(fragment2, contextBase, sdtBoundary, betweenInfo, resolvedItem);
311856
312383
  pageEl.replaceChild(replacement, current.element);
311857
312384
  current.element = replacement;
@@ -311933,6 +312460,7 @@ menclose::after {
311933
312460
  totalPages: this.totalPages,
311934
312461
  section: "body",
311935
312462
  pageNumberText: page.numberText,
312463
+ displayPageNumber: page.displayNumber,
311936
312464
  pageIndex
311937
312465
  };
311938
312466
  const resolvedItems = page.items;
@@ -313429,7 +313957,13 @@ menclose::after {
313429
313957
  run2.text ?? "",
313430
313958
  "tab",
313431
313959
  run2.underline?.style ?? "",
313432
- run2.underline?.color ?? ""
313960
+ run2.underline?.color ?? "",
313961
+ run2.fontSize ?? "",
313962
+ run2.fontFamily ?? "",
313963
+ run2.bold ? 1 : 0,
313964
+ run2.italic ? 1 : 0,
313965
+ getFontConfigVersion(),
313966
+ run2.color ?? ""
313433
313967
  ].join(",");
313434
313968
  if (run2.kind === "fieldAnnotation") {
313435
313969
  const fieldRun = run2;
@@ -313477,6 +314011,7 @@ menclose::after {
313477
314011
  textRun.vertAlign ?? "",
313478
314012
  textRun.baselineShift != null ? textRun.baselineShift : "",
313479
314013
  textRun.token ?? "",
314014
+ textRun.pageNumberFieldFormat ? JSON.stringify(textRun.pageNumberFieldFormat) : "",
313480
314015
  trackedVersion,
313481
314016
  textRun.comments?.length ?? 0,
313482
314017
  textRun.bidi ? JSON.stringify(textRun.bidi) : ""
@@ -313633,6 +314168,9 @@ menclose::after {
313633
314168
  hash$3 = hashString(hash$3, getRunBooleanProp(run2, "strike") ? "1" : "");
313634
314169
  hash$3 = hashString(hash$3, getRunStringProp(run2, "vertAlign"));
313635
314170
  hash$3 = hashNumber(hash$3, getRunNumberProp(run2, "baselineShift"));
314171
+ hash$3 = hashString(hash$3, getRunStringProp(run2, "token"));
314172
+ const pageNumberFieldFormat = run2.pageNumberFieldFormat;
314173
+ hash$3 = hashString(hash$3, pageNumberFieldFormat ? JSON.stringify(pageNumberFieldFormat) : "");
313636
314174
  const bidi = run2.bidi;
313637
314175
  hash$3 = hashString(hash$3, bidi ? JSON.stringify(bidi) : "");
313638
314176
  hash$3 = hashString(hash$3, trackedChangeVersion(run2));
@@ -314026,7 +314564,8 @@ menclose::after {
314026
314564
  sectionCount: 0,
314027
314565
  sectionHeaderIds: /* @__PURE__ */ new Map,
314028
314566
  sectionFooterIds: /* @__PURE__ */ new Map,
314029
- sectionTitlePg: /* @__PURE__ */ new Map
314567
+ sectionTitlePg: /* @__PURE__ */ new Map,
314568
+ sections: []
314030
314569
  }), fieldAnnotationKey = (run2) => {
314031
314570
  if (run2.kind !== "fieldAnnotation")
314032
314571
  return "";
@@ -321184,17 +321723,20 @@ menclose::after {
321184
321723
  }
321185
321724
  #computeExpectedSectionType(kind, page, sectionFirstPageNumbers) {
321186
321725
  const pageNumber = page.number;
321726
+ const effectivePageNumber = page.effectivePageNumber ?? page.displayNumber ?? pageNumber;
321187
321727
  const sectionIndex = page.sectionIndex ?? 0;
321188
321728
  const isFirstPageOfSection = sectionFirstPageNumbers.get(sectionIndex) === pageNumber;
321189
321729
  const converter = this.#options.editor.converter;
321190
- const hasAlternateHeaders = converter?.pageStyles?.alternateHeaders === true;
321730
+ const hasAlternateHeaders = this.#multiSectionIdentifier?.alternateHeaders === true || converter?.pageStyles?.alternateHeaders === true;
321191
321731
  const headerIds = converter?.headerIds;
321192
321732
  const footerIds = converter?.footerIds;
321193
- const titlePgEnabled = headerIds?.titlePg === true || footerIds?.titlePg === true;
321733
+ let titlePgEnabled = headerIds?.titlePg === true || footerIds?.titlePg === true;
321734
+ if (this.#multiSectionIdentifier?.sectionTitlePg?.has(sectionIndex))
321735
+ titlePgEnabled = this.#multiSectionIdentifier.sectionTitlePg.get(sectionIndex) === true;
321194
321736
  if (isFirstPageOfSection && titlePgEnabled)
321195
321737
  return "first";
321196
321738
  if (hasAlternateHeaders)
321197
- return (page.displayNumber ?? page.number) % 2 === 0 ? "even" : "odd";
321739
+ return effectivePageNumber % 2 === 0 ? "even" : "odd";
321198
321740
  return "default";
321199
321741
  }
321200
321742
  #stripFootnoteReserveFromBottomMargin(margins, page) {
@@ -321575,37 +322117,33 @@ menclose::after {
321575
322117
  if (!sectionFirstPageNumbers.has(idx))
321576
322118
  sectionFirstPageNumbers.set(idx, p$12.number);
321577
322119
  }
322120
+ const hasSectionResolution = hasSectionRefsForKind(multiSectionId, kind);
321578
322121
  return (pageNumber, pageMargins, page) => {
321579
322122
  const sectionIndex = page?.sectionIndex ?? 0;
322123
+ const effectivePageNumber = page?.effectivePageNumber ?? page?.displayNumber ?? pageNumber;
321580
322124
  const firstPageInSection = sectionFirstPageNumbers.get(sectionIndex);
321581
322125
  const sectionPageNumber = typeof firstPageInSection === "number" ? pageNumber - firstPageInSection + 1 : pageNumber;
321582
- const parityPageNumber = page?.displayNumber ?? pageNumber;
321583
- const headerFooterType = multiSectionId ? getHeaderFooterTypeForSection(pageNumber, sectionIndex, multiSectionId, {
322126
+ const headerFooterType = hasSectionResolution ? getHeaderFooterTypeForSection(effectivePageNumber, sectionIndex, multiSectionId, {
321584
322127
  kind,
321585
322128
  sectionPageNumber,
321586
- parityPageNumber
322129
+ parityPageNumber: effectivePageNumber
321587
322130
  }) : getHeaderFooterType2(pageNumber, legacyIdentifier, {
321588
322131
  kind,
321589
- parityPageNumber
321590
- });
321591
- let sectionRId;
321592
- if (page?.sectionRefs && kind === "header") {
321593
- sectionRId = page.sectionRefs.headerRefs?.[headerFooterType];
321594
- if (!sectionRId && headerFooterType && headerFooterType !== "default" && sectionIndex > 0 && multiSectionId)
321595
- sectionRId = multiSectionId.sectionHeaderIds.get(sectionIndex - 1)?.[headerFooterType] ?? undefined;
321596
- const shouldUseDefaultHeaderRef = headerFooterType !== "default" && page.sectionRefs.headerRefs?.default && (!multiSectionId?.alternateHeaders || headerFooterType === "odd");
321597
- if (!sectionRId && shouldUseDefaultHeaderRef)
321598
- sectionRId = page.sectionRefs.headerRefs?.default;
321599
- } else if (page?.sectionRefs && kind === "footer") {
321600
- sectionRId = page.sectionRefs.footerRefs?.[headerFooterType];
321601
- if (!sectionRId && headerFooterType && headerFooterType !== "default" && sectionIndex > 0 && multiSectionId)
321602
- sectionRId = multiSectionId.sectionFooterIds.get(sectionIndex - 1)?.[headerFooterType] ?? undefined;
321603
- const shouldUseDefaultFooterRef = headerFooterType !== "default" && page.sectionRefs.footerRefs?.default && (!multiSectionId?.alternateHeaders || headerFooterType === "odd");
321604
- if (!sectionRId && shouldUseDefaultFooterRef)
321605
- sectionRId = page.sectionRefs.footerRefs?.default;
321606
- }
322132
+ parityPageNumber: effectivePageNumber
322133
+ });
321607
322134
  if (!headerFooterType)
321608
322135
  return null;
322136
+ const pageSectionRefs = kind === "header" ? page?.sectionRefs?.headerRefs : page?.sectionRefs?.footerRefs;
322137
+ const sectionResolvedRef = hasSectionResolution ? resolveEffectiveHeaderFooterRef({
322138
+ sections: multiSectionId.sections,
322139
+ sectionIndex,
322140
+ kind,
322141
+ variant: headerFooterType
322142
+ }) : null;
322143
+ const legacyRefs = kind === "header" ? legacyIdentifier.headerIds : legacyIdentifier.footerIds;
322144
+ const resolvedRef = refForVariant(pageSectionRefs, headerFooterType) ?? sectionResolvedRef ?? (!hasSectionResolution ? refForVariant(legacyRefs, headerFooterType) : undefined);
322145
+ const sectionRId = resolvedRef?.refId;
322146
+ const layoutVariantType = resolvedRef?.matchedVariant ?? headerFooterType;
321609
322147
  const compositeKey = sectionRId ? `${sectionRId}::s${sectionIndex}` : undefined;
321610
322148
  const rIdLayoutKey = compositeKey && layoutsByRId.has(compositeKey) && compositeKey || sectionRId && layoutsByRId.has(sectionRId) && sectionRId || undefined;
321611
322149
  if (rIdLayoutKey) {
@@ -321628,8 +322166,9 @@ menclose::after {
321628
322166
  const rawLayoutHeight$1 = rIdLayout.layout.height ?? 0;
321629
322167
  const metrics$1 = this.#computeMetrics(kind, rawLayoutHeight$1, box$1, pageHeight$1, margins$1?.footer ?? 0);
321630
322168
  const layoutMinY$1 = rIdLayout.layout.minY ?? 0;
321631
- const normalizedFragments$1 = normalizeDecorationFragments(fragments$1, layoutMinY$1);
321632
- const normalizedItems$1 = normalizeDecorationItems(alignedItems, layoutMinY$1);
322169
+ const normalizationMinY$1 = getDecorationNormalizationMinY(fragments$1, layoutMinY$1);
322170
+ const normalizedFragments$1 = normalizeDecorationFragments(fragments$1, normalizationMinY$1);
322171
+ const normalizedItems$1 = normalizeDecorationItems(alignedItems, normalizationMinY$1);
321633
322172
  const isActiveHeaderFooter$1 = this.#isActiveDecoration(kind, sectionRId, pageNumber);
321634
322173
  return {
321635
322174
  fragments: normalizedFragments$1,
@@ -321661,7 +322200,7 @@ menclose::after {
321661
322200
  }
321662
322201
  if (!results || results.length === 0)
321663
322202
  return null;
321664
- const variantIndex = results.findIndex((entry) => entry.type === headerFooterType);
322203
+ const variantIndex = results.findIndex((entry) => entry.type === layoutVariantType);
321665
322204
  const variant = variantIndex >= 0 ? results[variantIndex] : undefined;
321666
322205
  if (!variant || !variant.layout?.pages?.length)
321667
322206
  return null;
@@ -321672,7 +322211,7 @@ menclose::after {
321672
322211
  const fallbackId = this.#headerFooterManager?.getVariantId(kind, headerFooterType);
321673
322212
  const finalHeaderId = sectionRId ?? fallbackId ?? undefined;
321674
322213
  const resolvedVariant = resolvedResults?.[variantIndex];
321675
- const alignedVariantItems = this.resolveAlignedDecorationItems(fragments, slotPage.number, variant, resolvedVariant, `variant '${headerFooterType}' page ${pageNumber}`, finalHeaderId ?? headerFooterType);
322214
+ const alignedVariantItems = this.resolveAlignedDecorationItems(fragments, slotPage.number, variant, resolvedVariant, `variant '${layoutVariantType}' page ${pageNumber}`, finalHeaderId ?? headerFooterType);
321676
322215
  if (!alignedVariantItems)
321677
322216
  return null;
321678
322217
  const pageHeight = page?.height ?? resolvedLayout.pages[0]?.height ?? layoutOptions.pageSize?.h ?? defaultPageSize.h;
@@ -321682,8 +322221,9 @@ menclose::after {
321682
322221
  const rawLayoutHeight = variant.layout.height ?? 0;
321683
322222
  const metrics = this.#computeMetrics(kind, rawLayoutHeight, box, pageHeight, margins?.footer ?? 0);
321684
322223
  const layoutMinY = variant.layout.minY ?? 0;
321685
- const normalizedFragments = normalizeDecorationFragments(fragments, layoutMinY);
321686
- const normalizedItems = normalizeDecorationItems(alignedVariantItems, layoutMinY);
322224
+ const normalizationMinY = getDecorationNormalizationMinY(fragments, layoutMinY);
322225
+ const normalizedFragments = normalizeDecorationFragments(fragments, normalizationMinY);
322226
+ const normalizedItems = normalizeDecorationItems(alignedVariantItems, normalizationMinY);
321687
322227
  const isActiveHeaderFooter = this.#isActiveDecoration(kind, finalHeaderId, pageNumber);
321688
322228
  return {
321689
322229
  fragments: normalizedFragments,
@@ -322264,13 +322804,13 @@ menclose::after {
322264
322804
  return;
322265
322805
  console.log(...args$1);
322266
322806
  }, 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, TRACKED_MARK_NAMES;
322267
- var init_src_C8mTdIvv_es = __esm(() => {
322807
+ var init_src_BbNQjpxw_es = __esm(() => {
322268
322808
  init_rolldown_runtime_Bg48TavK_es();
322269
- init_SuperConverter_CcHCWpfX_es();
322809
+ init_SuperConverter_CvwFiCth_es();
322270
322810
  init_jszip_C49i9kUs_es();
322271
322811
  init_xml_js_CqGKpaft_es();
322272
322812
  init_uuid_qzgm05fK_es();
322273
- init_create_headless_toolbar_DKwoydAR_es();
322813
+ init_create_headless_toolbar_DdDLS67b_es();
322274
322814
  init_constants_D_X7xF4s_es();
322275
322815
  init_dist_B8HfvhaK_es();
322276
322816
  init_unified_Dsuw2be5_es();
@@ -329150,10 +329690,24 @@ ${err.toString()}`);
329150
329690
  } };
329151
329691
  },
329152
329692
  addAttributes() {
329153
- return { marksAsAttrs: {
329154
- default: null,
329155
- rendered: false
329156
- } };
329693
+ return {
329694
+ marksAsAttrs: {
329695
+ default: null,
329696
+ rendered: false
329697
+ },
329698
+ instruction: {
329699
+ default: null,
329700
+ rendered: false
329701
+ },
329702
+ pageNumberFormat: {
329703
+ default: null,
329704
+ rendered: false
329705
+ },
329706
+ pageNumberZeroPadding: {
329707
+ default: null,
329708
+ rendered: false
329709
+ }
329710
+ };
329157
329711
  },
329158
329712
  addNodeView() {
329159
329713
  return ({ node: node3, editor, getPos, decorations }) => {
@@ -329210,6 +329764,18 @@ ${err.toString()}`);
329210
329764
  default: null,
329211
329765
  rendered: false
329212
329766
  },
329767
+ instruction: {
329768
+ default: null,
329769
+ rendered: false
329770
+ },
329771
+ pageNumberFormat: {
329772
+ default: null,
329773
+ rendered: false
329774
+ },
329775
+ pageNumberZeroPadding: {
329776
+ default: null,
329777
+ rendered: false
329778
+ },
329213
329779
  importedCachedText: {
329214
329780
  default: null,
329215
329781
  rendered: false
@@ -356620,11 +357186,11 @@ function print() { __p += __j.call(arguments, '') }
356620
357186
  ]);
356621
357187
  });
356622
357188
 
356623
- // ../../packages/superdoc/dist/chunks/create-super-doc-ui-CEjelItp.es.js
357189
+ // ../../packages/superdoc/dist/chunks/create-super-doc-ui-Dzh6dolN.es.js
356624
357190
  var MOD_ALIASES, ALT_ALIASES, CTRL_ALIASES, SHIFT_ALIASES, BUILTIN_CONTEXT_MENU_GROUPS, BUILTIN_GROUP_ORDER, RESERVED_PROXY_PROPERTY_NAMES, ALL_TOOLBAR_COMMAND_IDS, EMPTY_ACTIVE_IDS;
356625
- var init_create_super_doc_ui_CEjelItp_es = __esm(() => {
356626
- init_SuperConverter_CcHCWpfX_es();
356627
- init_create_headless_toolbar_DKwoydAR_es();
357191
+ var init_create_super_doc_ui_Dzh6dolN_es = __esm(() => {
357192
+ init_SuperConverter_CvwFiCth_es();
357193
+ init_create_headless_toolbar_DdDLS67b_es();
356628
357194
  MOD_ALIASES = new Set([
356629
357195
  "Mod",
356630
357196
  "Meta",
@@ -356666,16 +357232,16 @@ var init_zipper_yaJVJ4z9_es = __esm(() => {
356666
357232
 
356667
357233
  // ../../packages/superdoc/dist/super-editor.es.js
356668
357234
  var init_super_editor_es = __esm(() => {
356669
- init_src_C8mTdIvv_es();
356670
- init_SuperConverter_CcHCWpfX_es();
357235
+ init_src_BbNQjpxw_es();
357236
+ init_SuperConverter_CvwFiCth_es();
356671
357237
  init_jszip_C49i9kUs_es();
356672
357238
  init_xml_js_CqGKpaft_es();
356673
- init_create_headless_toolbar_DKwoydAR_es();
357239
+ init_create_headless_toolbar_DdDLS67b_es();
356674
357240
  init_constants_D_X7xF4s_es();
356675
357241
  init_dist_B8HfvhaK_es();
356676
357242
  init_unified_Dsuw2be5_es();
356677
357243
  init_DocxZipper_nv_KfOqb_es();
356678
- init_create_super_doc_ui_CEjelItp_es();
357244
+ init_create_super_doc_ui_Dzh6dolN_es();
356679
357245
  init_ui_C5PAS9hY_es();
356680
357246
  init_eventemitter3_BnGqBE_Q_es();
356681
357247
  init_errors_CNaD6vcg_es();