@superdoc-dev/mcp 0.12.0-next.7 → 0.12.0-next.9

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 +944 -209
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -52172,7 +52172,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
52172
52172
  emptyOptions2 = {};
52173
52173
  });
52174
52174
 
52175
- // ../../packages/superdoc/dist/chunks/SuperConverter-BaKhr4cp.es.js
52175
+ // ../../packages/superdoc/dist/chunks/SuperConverter-BtvpSnE5.es.js
52176
52176
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
52177
52177
  const fieldValue = extension$1.config[field];
52178
52178
  if (typeof fieldValue === "function")
@@ -86315,7 +86315,7 @@ function isSettled(status) {
86315
86315
  function normalizeFamilyName(name) {
86316
86316
  return name.trim().replace(/^['"]+|['"]+$/g, "").trim().toLowerCase();
86317
86317
  }
86318
- function buildFallback(row, physicalFamily, verdict, faceSlot) {
86318
+ function buildFallback(row, physicalFamily, verdict, faceSlot, faceSource) {
86319
86319
  const glyphExceptions = faceSlot ? row.glyphExceptions?.filter((g) => g.slot === faceSlot) : row.glyphExceptions ? [...row.glyphExceptions] : undefined;
86320
86320
  return {
86321
86321
  substituteFamily: physicalFamily,
@@ -86325,6 +86325,7 @@ function buildFallback(row, physicalFamily, verdict, faceSlot) {
86325
86325
  faces: row.faces,
86326
86326
  evidenceId: row.evidenceId,
86327
86327
  generic: row.generic,
86328
+ ...faceSource ? { faceSource: { ...faceSource } } : {},
86328
86329
  ...glyphExceptions && glyphExceptions.length > 0 ? { glyphExceptions } : {}
86329
86330
  };
86330
86331
  }
@@ -86365,11 +86366,18 @@ function isFaceScoped(row) {
86365
86366
  const f2 = row.faces;
86366
86367
  return f2.regular || f2.bold || f2.italic || f2.boldItalic;
86367
86368
  }
86369
+ function faceSourceFor(row, face) {
86370
+ const explicit = row.faceSources?.[face];
86371
+ if (explicit)
86372
+ return explicit;
86373
+ return isFaceScoped(row) && row.faces[face] ? { kind: "real" } : undefined;
86374
+ }
86368
86375
  function decideRowForFace(row, face, canRenderFamily$1) {
86369
86376
  const base$1 = decideRow(row, canRenderFamily$1);
86370
86377
  if (base$1.kind !== "fallback")
86371
86378
  return base$1;
86372
- if (isFaceScoped(row) && !row.faces[face])
86379
+ const faceSource = faceSourceFor(row, face);
86380
+ if (isFaceScoped(row) && !faceSource)
86373
86381
  return {
86374
86382
  kind: "face_missing",
86375
86383
  substituteFamily: base$1.fallback.substituteFamily,
@@ -86377,9 +86385,10 @@ function decideRowForFace(row, face, canRenderFamily$1) {
86377
86385
  generic: row.generic
86378
86386
  };
86379
86387
  const faceVerdict = row.faceVerdicts?.[face] ?? row.verdict;
86388
+ const projectedFaceSource = faceSource?.kind === "synthetic" ? faceSource : undefined;
86380
86389
  return {
86381
86390
  kind: "fallback",
86382
- fallback: buildFallback(row, base$1.fallback.substituteFamily, faceVerdict, face)
86391
+ fallback: buildFallback(row, base$1.fallback.substituteFamily, faceVerdict, face, projectedFaceSource)
86383
86392
  };
86384
86393
  }
86385
86394
  function getFallbackDecision(family$1, options = {}) {
@@ -86429,12 +86438,87 @@ function family(name, filePrefix, license) {
86429
86438
  faces: fourFaces(filePrefix)
86430
86439
  };
86431
86440
  }
86441
+ function familyWithFaces(name, license, faces) {
86442
+ return {
86443
+ family: name,
86444
+ license,
86445
+ faces
86446
+ };
86447
+ }
86432
86448
  function normalizeFamilyKey$1(family$1) {
86433
86449
  return family$1.trim().replace(/^["']|["']$/g, "").toLowerCase();
86434
86450
  }
86435
86451
  function sortPairs(pairs) {
86436
86452
  return pairs.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
86437
86453
  }
86454
+ function faceSlotFor$1({ weight, style }) {
86455
+ const bold = weight === "700";
86456
+ const italic = style === "italic";
86457
+ if (bold && italic)
86458
+ return "boldItalic";
86459
+ if (bold)
86460
+ return "bold";
86461
+ if (italic)
86462
+ return "italic";
86463
+ return "regular";
86464
+ }
86465
+ function faceKeyForSlot(slot) {
86466
+ switch (slot) {
86467
+ case "bold":
86468
+ return {
86469
+ weight: "700",
86470
+ style: "normal"
86471
+ };
86472
+ case "italic":
86473
+ return {
86474
+ weight: "400",
86475
+ style: "italic"
86476
+ };
86477
+ case "boldItalic":
86478
+ return {
86479
+ weight: "700",
86480
+ style: "italic"
86481
+ };
86482
+ case "regular":
86483
+ return {
86484
+ weight: "400",
86485
+ style: "normal"
86486
+ };
86487
+ }
86488
+ }
86489
+ function reasonForFallback(policyAction) {
86490
+ return policyAction === "category_fallback" ? "category_fallback" : "bundled_substitute";
86491
+ }
86492
+ function resolveDocfontsFace(primary, face, hasFace) {
86493
+ const decision = getFallbackDecisionForFace(primary, faceSlotFor$1(face), { canRenderFamily });
86494
+ if (decision.kind === "face_missing")
86495
+ return {
86496
+ physical: primary,
86497
+ reason: "fallback_face_absent"
86498
+ };
86499
+ if (decision.kind !== "fallback")
86500
+ return null;
86501
+ const fallback = decision.fallback;
86502
+ if (fallback.policyAction !== "substitute" && fallback.policyAction !== "category_fallback")
86503
+ return null;
86504
+ if (hasFace(fallback.substituteFamily, face.weight, face.style))
86505
+ return {
86506
+ physical: fallback.substituteFamily,
86507
+ reason: reasonForFallback(fallback.policyAction)
86508
+ };
86509
+ const sourceFace = fallback.faceSource?.kind === "synthetic" ? faceKeyForSlot(fallback.faceSource.from) : face;
86510
+ if (!hasFace(fallback.substituteFamily, sourceFace.weight, sourceFace.style))
86511
+ return fallback.policyAction === "substitute" ? {
86512
+ physical: primary,
86513
+ reason: "fallback_face_absent"
86514
+ } : null;
86515
+ const sourceDiffers = sourceFace.weight !== face.weight || sourceFace.style !== face.style;
86516
+ return {
86517
+ physical: fallback.substituteFamily,
86518
+ reason: reasonForFallback(fallback.policyAction),
86519
+ ...sourceDiffers ? { sourceFace } : {}
86520
+ };
86521
+ }
86438
86522
  function deriveBundledSubstitutes() {
86439
86523
  const substitutes = {};
86440
86524
  for (const row of SUBSTITUTION_EVIDENCE) {
@@ -86576,11 +86660,13 @@ function buildFaceReport(usedFaces, registry2, resolver$1) {
86576
86660
  weight,
86577
86661
  style
86578
86662
  };
86579
- const { physicalFamily, reason } = resolver$1 ? resolver$1.resolveFace(logicalFamily, face, hasFace) : resolveFace(logicalFamily, face, hasFace);
86663
+ const resolution = resolver$1 ? resolver$1.resolveFace(logicalFamily, face, hasFace) : resolveFace(logicalFamily, face, hasFace);
86664
+ const { physicalFamily, reason } = resolution;
86665
+ const statusFace = resolution.sourceFace ?? face;
86580
86666
  const loadStatus = registry2.getFaceStatus({
86581
86667
  family: physicalFamily,
86582
- weight,
86583
- style
86668
+ weight: statusFace.weight,
86669
+ style: statusFace.style
86584
86670
  });
86585
86671
  const missing = reason === "fallback_face_absent" || reason === "category_fallback" || isSettled(loadStatus) && loadStatus !== "loaded";
86586
86672
  const evidence = isRenderedSubstitute(reason) ? toEvidence(getRenderableFallbackForFace(logicalFamily, faceSlotFor(face), RENDER_ALL)) : undefined;
@@ -86707,8 +86793,8 @@ function deriveOfferings() {
86707
86793
  function compareLogicalFamily(a, b) {
86708
86794
  return a.logicalFamily.localeCompare(b.logicalFamily, "en", { sensitivity: "base" });
86709
86795
  }
86710
- function getDefaultFontOfferings() {
86711
- return FONT_OFFERINGS.filter((o) => o.offering === "default").sort(compareLogicalFamily);
86796
+ function getBuiltInToolbarFontOfferings() {
86797
+ return FONT_OFFERINGS.filter((o) => o.offering === "default" || o.offering === "qualified" && ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES.has(o.logicalFamily)).sort(compareLogicalFamily);
86712
86798
  }
86713
86799
  function fontOfferingStack(offering) {
86714
86800
  return `${offering.logicalFamily}, ${offering.generic}`;
@@ -86717,7 +86803,7 @@ function fontOfferingRenderStack(offering) {
86717
86803
  return offering.physicalFamily ? `${offering.physicalFamily}, ${offering.generic}` : fontOfferingStack(offering);
86718
86804
  }
86719
86805
  function getDefaultFontFamilyOptions() {
86720
- return getDefaultFontOfferings().map((offering) => ({
86806
+ return getBuiltInToolbarFontOfferings().map((offering) => ({
86721
86807
  label: offering.logicalFamily,
86722
86808
  value: fontOfferingStack(offering)
86723
86809
  }));
@@ -88738,12 +88824,14 @@ function applyTocMetadata(blocks, metadata) {
88738
88824
  };
88739
88825
  if (metadata.instruction)
88740
88826
  block.attrs.tocInstruction = metadata.instruction;
88827
+ if (metadata.tocId)
88828
+ block.attrs.tocId = metadata.tocId;
88741
88829
  }
88742
88830
  });
88743
88831
  }
88744
88832
  function processTocChildren(children, metadata, context, outputArrays) {
88745
88833
  const paragraphConverter = context.converters.paragraphToFlowBlocks;
88746
- const { docPartGallery, docPartObjectId, tocInstruction } = metadata;
88834
+ const { docPartGallery, docPartObjectId, tocInstruction, tocId } = metadata;
88747
88835
  const { blocks, recordBlockKind } = outputArrays;
88748
88836
  children.forEach((child) => {
88749
88837
  if (child.type === "paragraph") {
@@ -88768,7 +88856,8 @@ function processTocChildren(children, metadata, context, outputArrays) {
88768
88856
  applyTocMetadata(paragraphBlocks, {
88769
88857
  gallery: docPartGallery,
88770
88858
  uniqueId: docPartObjectId,
88771
- instruction: tocInstruction
88859
+ instruction: tocInstruction,
88860
+ tocId
88772
88861
  });
88773
88862
  applySdtMetadataToParagraphBlocks(paragraphBlocks.filter((b) => b.kind === "paragraph"), metadata.sdtMetadata);
88774
88863
  paragraphBlocks.forEach((block) => {
@@ -88783,7 +88872,8 @@ function processTocChildren(children, metadata, context, outputArrays) {
88783
88872
  docPartGallery,
88784
88873
  docPartObjectId,
88785
88874
  tocInstruction: finalInstruction,
88786
- sdtMetadata: metadata.sdtMetadata
88875
+ sdtMetadata: metadata.sdtMetadata,
88876
+ tocId
88787
88877
  }, context, outputArrays);
88788
88878
  }
88789
88879
  });
@@ -88791,7 +88881,11 @@ function processTocChildren(children, metadata, context, outputArrays) {
88791
88881
  function handleTableOfContentsNode(node2, context) {
88792
88882
  if (!Array.isArray(node2.content))
88793
88883
  return;
88794
- processTocChildren(node2.content, { tocInstruction: getNodeInstruction(node2) }, {
88884
+ const sdBlockId = node2.attrs?.sdBlockId;
88885
+ processTocChildren(node2.content, {
88886
+ tocInstruction: getNodeInstruction(node2),
88887
+ tocId: typeof sdBlockId === "string" ? sdBlockId : undefined
88888
+ }, {
88795
88889
  nextBlockId: context.nextBlockId,
88796
88890
  positions: context.positions,
88797
88891
  bookmarks: context.bookmarks,
@@ -89120,7 +89214,8 @@ function processDocumentPartObject(child, sectionMetadata, context, output, conv
89120
89214
  docPartGallery,
89121
89215
  docPartObjectId,
89122
89216
  tocInstruction,
89123
- sdtMetadata: docPartSdtMetadata
89217
+ sdtMetadata: docPartSdtMetadata,
89218
+ tocId: docPartObjectId ?? undefined
89124
89219
  }, {
89125
89220
  nextBlockId: context.nextBlockId,
89126
89221
  positions: context.positions,
@@ -89191,12 +89286,15 @@ function handleDocumentPartObjectNode(node2, context) {
89191
89286
  const tocInstruction = getNodeInstruction(node2);
89192
89287
  const docPartSdtMetadata = resolveNodeSdtMetadata(node2, "docPartObject");
89193
89288
  const paragraphToFlowBlocks$1 = converters$1.paragraphToFlowBlocks;
89289
+ const sdBlockId = node2.attrs?.sdBlockId;
89290
+ const tocId = docPartObjectId && docPartObjectId.length > 0 ? docPartObjectId : typeof sdBlockId === "string" && sdBlockId.length > 0 ? sdBlockId : undefined;
89194
89291
  if (docPartGallery === "Table of Contents")
89195
89292
  processTocChildren(Array.from(node2.content), {
89196
89293
  docPartGallery,
89197
89294
  docPartObjectId,
89198
89295
  tocInstruction,
89199
- sdtMetadata: docPartSdtMetadata
89296
+ sdtMetadata: docPartSdtMetadata,
89297
+ tocId
89200
89298
  }, {
89201
89299
  nextBlockId,
89202
89300
  positions,
@@ -89244,7 +89342,8 @@ function handleDocumentPartObjectNode(node2, context) {
89244
89342
  docPartGallery: docPartGallery ?? "",
89245
89343
  docPartObjectId,
89246
89344
  tocInstruction: getNodeInstruction(child) ?? tocInstruction,
89247
- sdtMetadata: docPartSdtMetadata
89345
+ sdtMetadata: docPartSdtMetadata,
89346
+ tocId
89248
89347
  };
89249
89348
  const tocContext = {
89250
89349
  nextBlockId,
@@ -113637,18 +113736,10 @@ var isRegExp = (value) => {
113637
113736
  physical: primary,
113638
113737
  reason: "registered_face"
113639
113738
  };
113739
+ const docfonts = resolveDocfontsFace(primary, face, hasFace);
113740
+ if (docfonts)
113741
+ return docfonts;
113640
113742
  const bundled = BUNDLED_SUBSTITUTES[key];
113641
- if (bundled && hasFace(bundled, face.weight, face.style))
113642
- return {
113643
- physical: bundled,
113644
- reason: "bundled_substitute"
113645
- };
113646
- const category = CATEGORY_FALLBACKS[key];
113647
- if (category && hasFace(category, face.weight, face.style))
113648
- return {
113649
- physical: category,
113650
- reason: "category_fallback"
113651
- };
113652
113743
  if (override || bundled)
113653
113744
  return {
113654
113745
  physical: primary,
@@ -113681,11 +113772,12 @@ var isRegExp = (value) => {
113681
113772
  }
113682
113773
  resolveFace(logicalFamily, face, hasFace) {
113683
113774
  const primary = splitStack(logicalFamily)[0] ?? logicalFamily;
113684
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
113775
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
113685
113776
  return {
113686
113777
  logicalFamily,
113687
113778
  physicalFamily: stripFamilyQuotes(physical),
113688
- reason
113779
+ reason,
113780
+ ...sourceFace ? { sourceFace } : {}
113689
113781
  };
113690
113782
  }
113691
113783
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
@@ -114061,7 +114153,7 @@ var isRegExp = (value) => {
114061
114153
  const detail = sources && sources.length ? ` from ${sources.join(", ")}` : "";
114062
114154
  console.warn(`[superdoc] font asset failed to load for "${family$1}"${detail}. Check fonts.assetBaseUrl / fonts.resolveAssetUrl so the bundled .woff2 are served.`);
114063
114155
  }
114064
- }, registriesByFontSet, domlessRegistry = null, BUNDLED_FAMILIES, FONT_OFFERINGS, prepareCommentParaIds = (comment) => {
114156
+ }, registriesByFontSet, domlessRegistry = null, BUNDLED_FAMILIES, ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES, FONT_OFFERINGS, prepareCommentParaIds = (comment) => {
114065
114157
  return {
114066
114158
  ...comment,
114067
114159
  commentParaId: generateDocxRandomId()
@@ -118037,7 +118129,7 @@ var isRegExp = (value) => {
118037
118129
  state.kern = kernNode.attributes["w:val"];
118038
118130
  }
118039
118131
  }, SuperConverter;
118040
- var init_SuperConverter_BaKhr4cp_es = __esm(() => {
118132
+ var init_SuperConverter_BtvpSnE5_es = __esm(() => {
118041
118133
  init_rolldown_runtime_Bg48TavK_es();
118042
118134
  init_jszip_C49i9kUs_es();
118043
118135
  init_xml_js_CqGKpaft_es();
@@ -155377,6 +155469,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155377
155469
  measurementRefs: ["calibri__carlito#analytic_advance#2026-06-03", "calibri__carlito#face_aggregate#2026-06-03"],
155378
155470
  exportRule: "preserve_original_name",
155379
155471
  advance: {
155472
+ basis: "latin_full",
155380
155473
  meanDelta: 0,
155381
155474
  maxDelta: 0
155382
155475
  },
@@ -155409,6 +155502,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155409
155502
  ],
155410
155503
  exportRule: "preserve_original_name",
155411
155504
  advance: {
155505
+ basis: "latin_full",
155412
155506
  meanDelta: 0.0002378,
155413
155507
  maxDelta: 0.2310758
155414
155508
  },
@@ -155448,6 +155542,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155448
155542
  measurementRefs: ["arial__liberation-sans#analytic_advance#2026-06-03"],
155449
155543
  exportRule: "preserve_original_name",
155450
155544
  advance: {
155545
+ basis: "latin_full",
155451
155546
  meanDelta: 0,
155452
155547
  maxDelta: 0
155453
155548
  },
@@ -155475,6 +155570,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155475
155570
  measurementRefs: ["times-new-roman__liberation-serif#analytic_advance#2026-06-03"],
155476
155571
  exportRule: "preserve_original_name",
155477
155572
  advance: {
155573
+ basis: "latin_full",
155478
155574
  meanDelta: 0,
155479
155575
  maxDelta: 0
155480
155576
  },
@@ -155502,6 +155598,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155502
155598
  measurementRefs: ["courier-new__liberation-mono#analytic_advance#2026-06-03"],
155503
155599
  exportRule: "preserve_original_name",
155504
155600
  advance: {
155601
+ basis: "latin_full",
155505
155602
  meanDelta: 0,
155506
155603
  maxDelta: 0
155507
155604
  },
@@ -155538,6 +155635,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155538
155635
  ],
155539
155636
  exportRule: "preserve_original_name",
155540
155637
  advance: {
155638
+ basis: "latin_full",
155541
155639
  meanDelta: 0.0000197,
155542
155640
  maxDelta: 0.0183727
155543
155641
  },
@@ -155587,6 +155685,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155587
155685
  ],
155588
155686
  exportRule: "preserve_original_name",
155589
155687
  advance: {
155688
+ basis: "latin_full",
155590
155689
  meanDelta: 0,
155591
155690
  maxDelta: 0.5
155592
155691
  },
@@ -155627,6 +155726,131 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155627
155726
  exportRule: "preserve_original_name",
155628
155727
  candidateLicense: null
155629
155728
  },
155729
+ {
155730
+ evidenceId: "arial-black",
155731
+ generic: "sans-serif",
155732
+ logicalFamily: "Arial Black",
155733
+ physicalFamily: "Archivo Black",
155734
+ verdict: "visual_only",
155735
+ faces: {
155736
+ regular: true,
155737
+ bold: false,
155738
+ italic: false,
155739
+ boldItalic: false
155740
+ },
155741
+ faceSources: { italic: {
155742
+ kind: "synthetic",
155743
+ from: "regular"
155744
+ } },
155745
+ gates: {
155746
+ static: "pass",
155747
+ metric: "fail",
155748
+ layout: "not_run",
155749
+ ship: "fail"
155750
+ },
155751
+ policyAction: "substitute",
155752
+ measurementRefs: ["arial-black__archivo-black#visual_review#2026-06-09"],
155753
+ exportRule: "preserve_original_name",
155754
+ candidateLicense: "OFL-1.1",
155755
+ faceVerdicts: { italic: "visual_only" }
155756
+ },
155757
+ {
155758
+ evidenceId: "arial-rounded-mt-bold",
155759
+ generic: "sans-serif",
155760
+ logicalFamily: "Arial Rounded MT Bold",
155761
+ physicalFamily: "Ubuntu",
155762
+ verdict: "visual_only",
155763
+ faces: {
155764
+ regular: true,
155765
+ bold: true,
155766
+ italic: true,
155767
+ boldItalic: true
155768
+ },
155769
+ gates: {
155770
+ static: "pass",
155771
+ metric: "fail",
155772
+ layout: "not_run",
155773
+ ship: "fail"
155774
+ },
155775
+ policyAction: "category_fallback",
155776
+ measurementRefs: ["arial-rounded-mt-bold__ubuntu#visual_review#2026-06-09"],
155777
+ exportRule: "preserve_original_name",
155778
+ candidateLicense: "Ubuntu-font-1.0"
155779
+ },
155780
+ {
155781
+ evidenceId: "bookman-old-style",
155782
+ generic: "serif",
155783
+ logicalFamily: "Bookman Old Style",
155784
+ physicalFamily: "TeX Gyre Bonum",
155785
+ verdict: "visual_only",
155786
+ faces: {
155787
+ regular: true,
155788
+ bold: true,
155789
+ italic: true,
155790
+ boldItalic: true
155791
+ },
155792
+ gates: {
155793
+ static: "pass",
155794
+ metric: "fail",
155795
+ layout: "not_run",
155796
+ ship: "fail"
155797
+ },
155798
+ policyAction: "substitute",
155799
+ measurementRefs: ["bookman-old-style__tex-gyre-bonum#visual_review#2026-06-09"],
155800
+ exportRule: "preserve_original_name",
155801
+ candidateLicense: "GUST-Font-License-1.0"
155802
+ },
155803
+ {
155804
+ evidenceId: "century",
155805
+ generic: "serif",
155806
+ logicalFamily: "Century",
155807
+ physicalFamily: "C059",
155808
+ verdict: "visual_only",
155809
+ faces: {
155810
+ regular: true,
155811
+ bold: true,
155812
+ italic: true,
155813
+ boldItalic: true
155814
+ },
155815
+ gates: {
155816
+ static: "pass",
155817
+ metric: "fail",
155818
+ layout: "not_run",
155819
+ ship: "fail"
155820
+ },
155821
+ policyAction: "substitute",
155822
+ measurementRefs: ["century__c059#visual_review#2026-06-09"],
155823
+ exportRule: "preserve_original_name",
155824
+ candidateLicense: "AGPL-3.0-only WITH PS-or-PDF-font-exception-20170817"
155825
+ },
155826
+ {
155827
+ evidenceId: "garamond",
155828
+ generic: "serif",
155829
+ logicalFamily: "Garamond",
155830
+ physicalFamily: "Cardo",
155831
+ verdict: "visual_only",
155832
+ faces: {
155833
+ regular: true,
155834
+ bold: true,
155835
+ italic: true,
155836
+ boldItalic: false
155837
+ },
155838
+ faceSources: { boldItalic: {
155839
+ kind: "synthetic",
155840
+ from: "bold"
155841
+ } },
155842
+ gates: {
155843
+ static: "pass",
155844
+ metric: "fail",
155845
+ layout: "not_run",
155846
+ ship: "fail"
155847
+ },
155848
+ policyAction: "category_fallback",
155849
+ measurementRefs: ["garamond__cardo#visual_review#2026-06-09"],
155850
+ exportRule: "preserve_original_name",
155851
+ candidateLicense: "OFL-1.1",
155852
+ faceVerdicts: { boldItalic: "visual_only" }
155853
+ },
155630
155854
  {
155631
155855
  evidenceId: "consolas",
155632
155856
  generic: "monospace",
@@ -155649,6 +155873,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155649
155873
  measurementRefs: ["consolas__inconsolata-semiexpanded#analytic_advance#2026-06-03"],
155650
155874
  exportRule: "preserve_original_name",
155651
155875
  advance: {
155876
+ basis: "monospace_cell",
155652
155877
  meanDelta: 0.00035999999999999997,
155653
155878
  maxDelta: 0.00035999999999999997
155654
155879
  },
@@ -155681,74 +155906,84 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155681
155906
  evidenceId: "tahoma",
155682
155907
  generic: "sans-serif",
155683
155908
  logicalFamily: "Tahoma",
155684
- physicalFamily: null,
155909
+ physicalFamily: "Noto Sans",
155685
155910
  verdict: "visual_only",
155686
155911
  faces: {
155687
- regular: false,
155688
- bold: false,
155689
- italic: false,
155690
- boldItalic: false
155912
+ regular: true,
155913
+ bold: true,
155914
+ italic: true,
155915
+ boldItalic: true
155691
155916
  },
155692
155917
  gates: {
155693
- static: "not_run",
155918
+ static: "pass",
155694
155919
  metric: "fail",
155695
155920
  layout: "not_run",
155696
- ship: "not_run"
155921
+ ship: "fail"
155697
155922
  },
155698
155923
  policyAction: "category_fallback",
155699
- measurementRefs: ["tahoma#top_candidates#2026-06-03"],
155924
+ measurementRefs: ["tahoma__noto-sans#visual_review#2026-06-09"],
155700
155925
  exportRule: "preserve_original_name",
155701
- candidateLicense: null
155926
+ candidateLicense: "OFL-1.1"
155702
155927
  },
155703
155928
  {
155704
155929
  evidenceId: "trebuchet-ms",
155705
155930
  generic: "sans-serif",
155706
155931
  logicalFamily: "Trebuchet MS",
155707
- physicalFamily: null,
155932
+ physicalFamily: "PT Sans",
155708
155933
  verdict: "visual_only",
155709
155934
  faces: {
155710
- regular: false,
155711
- bold: false,
155712
- italic: false,
155713
- boldItalic: false
155935
+ regular: true,
155936
+ bold: true,
155937
+ italic: true,
155938
+ boldItalic: true
155714
155939
  },
155715
155940
  gates: {
155716
- static: "not_run",
155941
+ static: "pass",
155717
155942
  metric: "fail",
155718
155943
  layout: "not_run",
155719
- ship: "not_run"
155944
+ ship: "fail"
155720
155945
  },
155721
155946
  policyAction: "category_fallback",
155722
- measurementRefs: ["trebuchet-ms#top_candidates#2026-06-03"],
155947
+ measurementRefs: ["trebuchet-ms__pt-sans#visual_review#2026-06-09"],
155723
155948
  exportRule: "preserve_original_name",
155724
- candidateLicense: null
155949
+ candidateLicense: "OFL-1.1"
155725
155950
  },
155726
155951
  {
155727
155952
  evidenceId: "comic-sans-ms",
155728
155953
  generic: "sans-serif",
155729
155954
  logicalFamily: "Comic Sans MS",
155730
- physicalFamily: "Comic Neue",
155955
+ physicalFamily: "Comic Relief",
155731
155956
  verdict: "visual_only",
155732
155957
  faces: {
155733
- regular: false,
155734
- bold: false,
155958
+ regular: true,
155959
+ bold: true,
155735
155960
  italic: false,
155736
155961
  boldItalic: false
155737
155962
  },
155963
+ faceSources: {
155964
+ italic: {
155965
+ kind: "synthetic",
155966
+ from: "regular"
155967
+ },
155968
+ boldItalic: {
155969
+ kind: "synthetic",
155970
+ from: "bold"
155971
+ }
155972
+ },
155738
155973
  gates: {
155739
- static: "not_run",
155974
+ static: "pass",
155740
155975
  metric: "fail",
155741
155976
  layout: "not_run",
155742
- ship: "not_run"
155977
+ ship: "fail"
155743
155978
  },
155744
155979
  policyAction: "category_fallback",
155745
- measurementRefs: ["comic-sans-ms__comic-neue#analytic_advance#2026-06-03"],
155980
+ measurementRefs: ["comic-sans-ms__comic-relief#visual_review#2026-06-09"],
155746
155981
  exportRule: "preserve_original_name",
155747
- advance: {
155748
- meanDelta: 0.1005,
155749
- maxDelta: 0.1419
155750
- },
155751
- candidateLicense: "OFL-1.1"
155982
+ candidateLicense: "OFL-1.1",
155983
+ faceVerdicts: {
155984
+ italic: "visual_only",
155985
+ boldItalic: "visual_only"
155986
+ }
155752
155987
  },
155753
155988
  {
155754
155989
  evidenceId: "candara",
@@ -155841,11 +156076,51 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155841
156076
  measurementRefs: ["lucida-console__cousine#analytic_advance#2026-06-03"],
155842
156077
  exportRule: "preserve_original_name",
155843
156078
  advance: {
156079
+ basis: "monospace_cell",
155844
156080
  meanDelta: 0.004050000000000001,
155845
156081
  maxDelta: 0.004050000000000001
155846
156082
  },
155847
156083
  candidateLicense: "OFL-1.1"
155848
156084
  },
156085
+ {
156086
+ evidenceId: "gill-sans-mt-condensed",
156087
+ generic: "sans-serif",
156088
+ logicalFamily: "Gill Sans MT Condensed",
156089
+ physicalFamily: "PT Sans Narrow",
156090
+ verdict: "visual_only",
156091
+ faces: {
156092
+ regular: true,
156093
+ bold: true,
156094
+ italic: false,
156095
+ boldItalic: false
156096
+ },
156097
+ faceSources: {
156098
+ italic: {
156099
+ kind: "synthetic",
156100
+ from: "regular"
156101
+ },
156102
+ boldItalic: {
156103
+ kind: "synthetic",
156104
+ from: "bold"
156105
+ }
156106
+ },
156107
+ gates: {
156108
+ static: "pass",
156109
+ metric: "fail",
156110
+ layout: "not_run",
156111
+ ship: "fail"
156112
+ },
156113
+ policyAction: "category_fallback",
156114
+ measurementRefs: ["gill-sans-mt-condensed__pt-sans-narrow#visual_review#2026-06-09"],
156115
+ exportRule: "preserve_original_name",
156116
+ candidateLicense: "OFL-1.1",
156117
+ faceVerdicts: {
156118
+ regular: "visual_only",
156119
+ bold: "visual_only",
156120
+ italic: "visual_only",
156121
+ boldItalic: "visual_only"
156122
+ }
156123
+ },
155849
156124
  {
155850
156125
  evidenceId: "aptos-display",
155851
156126
  generic: "sans-serif",
@@ -155912,6 +156187,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155912
156187
  measurementRefs: ["helvetica__liberation-sans#analytic_advance#2026-06-03"],
155913
156188
  exportRule: "preserve_original_name",
155914
156189
  advance: {
156190
+ basis: "latin_full",
155915
156191
  meanDelta: 0,
155916
156192
  maxDelta: 0
155917
156193
  },
@@ -155939,6 +156215,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155939
156215
  measurementRefs: ["calibri-light__carlito#analytic_advance#2026-06-05"],
155940
156216
  exportRule: "preserve_original_name",
155941
156217
  advance: {
156218
+ basis: "latin_full",
155942
156219
  meanDelta: 0.0148,
155943
156220
  maxDelta: 0.066
155944
156221
  },
@@ -155966,6 +156243,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155966
156243
  measurementRefs: ["baskerville-old-face_regular__bacasime-antique#regular#w400#7dac1e5f#analytic_advance#2026-06-05"],
155967
156244
  exportRule: "preserve_original_name",
155968
156245
  advance: {
156246
+ basis: "latin_full",
155969
156247
  meanDelta: 0,
155970
156248
  maxDelta: 0.4915590863952334
155971
156249
  },
@@ -155983,13 +156261,27 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155983
156261
  generic: "serif",
155984
156262
  logicalFamily: "Cooper Black",
155985
156263
  physicalFamily: "Caprasimo",
155986
- verdict: "metric_safe",
156264
+ verdict: "visual_only",
155987
156265
  faces: {
155988
156266
  regular: true,
155989
156267
  bold: false,
155990
156268
  italic: false,
155991
156269
  boldItalic: false
155992
156270
  },
156271
+ faceSources: {
156272
+ bold: {
156273
+ kind: "synthetic",
156274
+ from: "regular"
156275
+ },
156276
+ italic: {
156277
+ kind: "synthetic",
156278
+ from: "regular"
156279
+ },
156280
+ boldItalic: {
156281
+ kind: "synthetic",
156282
+ from: "regular"
156283
+ }
156284
+ },
155993
156285
  gates: {
155994
156286
  static: "pass",
155995
156287
  metric: "pass",
@@ -155997,14 +156289,20 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
155997
156289
  ship: "not_run"
155998
156290
  },
155999
156291
  policyAction: "substitute",
156000
- measurementRefs: ["cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05"],
156292
+ measurementRefs: ["cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05", "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"],
156001
156293
  exportRule: "preserve_original_name",
156002
156294
  advance: {
156295
+ basis: "latin_full",
156003
156296
  meanDelta: 0,
156004
156297
  maxDelta: 0
156005
156298
  },
156006
156299
  candidateLicense: "OFL-1.1",
156007
- faceVerdicts: { regular: "metric_safe" }
156300
+ faceVerdicts: {
156301
+ regular: "metric_safe",
156302
+ bold: "visual_only",
156303
+ italic: "visual_only",
156304
+ boldItalic: "visual_only"
156305
+ }
156008
156306
  }
156009
156307
  ];
156010
156308
  LINE_BREAK_SAFE_VERDICTS = new Set([
@@ -156018,7 +156316,12 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
156018
156316
  family("Caladea", "Caladea", "Apache-2.0"),
156019
156317
  family("Liberation Sans", "LiberationSans", "OFL-1.1"),
156020
156318
  family("Liberation Serif", "LiberationSerif", "OFL-1.1"),
156021
- family("Liberation Mono", "LiberationMono", "OFL-1.1")
156319
+ family("Liberation Mono", "LiberationMono", "OFL-1.1"),
156320
+ familyWithFaces("Caprasimo", "OFL-1.1", [{
156321
+ weight: "normal",
156322
+ style: "normal",
156323
+ file: "Caprasimo-Regular.woff2"
156324
+ }])
156022
156325
  ]);
156023
156326
  SUBSTITUTION_EVIDENCE = SUBSTITUTION_EVIDENCE$1;
156024
156327
  bundledFamilies = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
@@ -156034,6 +156337,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
156034
156337
  OS2_MIN_LENGTH = OS2_FSSELECTION + 2;
156035
156338
  registriesByFontSet = /* @__PURE__ */ new WeakMap;
156036
156339
  BUNDLED_FAMILIES = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
156340
+ ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES = new Set(["Cooper Black"]);
156037
156341
  FONT_OFFERINGS = deriveOfferings();
156038
156342
  ALL_COMMENT_TARGETS = COMMENT_FILE_BASENAMES;
156039
156343
  REL_ID_NUMERIC_PATTERN = /rId|mi/g;
@@ -157821,7 +158125,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
157821
158125
  };
157822
158126
  });
157823
158127
 
157824
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-B3wNa0zb.es.js
158128
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-BV5L35wQ.es.js
157825
158129
  function parseSizeUnit(val = "0") {
157826
158130
  const length = val.toString() || "0";
157827
158131
  const value = Number.parseFloat(length);
@@ -168179,8 +168483,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, normalizeActorId = (value) => {
168179
168483
  }
168180
168484
  };
168181
168485
  };
168182
- var init_create_headless_toolbar_B3wNa0zb_es = __esm(() => {
168183
- init_SuperConverter_BaKhr4cp_es();
168486
+ var init_create_headless_toolbar_BV5L35wQ_es = __esm(() => {
168487
+ init_SuperConverter_BtvpSnE5_es();
168184
168488
  init_uuid_B2wVPhPi_es();
168185
168489
  init_constants_D9qj59G2_es();
168186
168490
  init_dist_B8HfvhaK_es();
@@ -222864,7 +223168,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
222864
223168
  init_remark_gfm_BhnWr3yf_es();
222865
223169
  });
222866
223170
 
222867
- // ../../packages/superdoc/dist/chunks/src-BKOC1-8-.es.js
223171
+ // ../../packages/superdoc/dist/chunks/src-DumwyEvl.es.js
222868
223172
  function deleteProps(obj, propOrProps) {
222869
223173
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
222870
223174
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -231958,9 +232262,6 @@ function replaceCommand(wrap4, moveForward) {
231958
232262
  return true;
231959
232263
  };
231960
232264
  }
231961
- function buildSdtBlockSelector(escapedSdtId) {
231962
- return `.${DOM_CLASS_NAMES.BLOCK_SDT}[${DATA_ATTRS.SDT_ID}="${escapedSdtId}"]`;
231963
- }
231964
232265
  function buildAnnotationSelector() {
231965
232266
  return `.${DOM_CLASS_NAMES.ANNOTATION}[${DATA_ATTRS.PM_START}]`;
231966
232267
  }
@@ -263334,6 +263635,9 @@ function applySourceAnchorDataset(element3, sourceAnchor) {
263334
263635
  else
263335
263636
  delete element3.dataset.sourceOccurrenceId;
263336
263637
  }
263638
+ function allowFontSynthesis(element3) {
263639
+ element3.style.setProperty("font-synthesis", "weight style");
263640
+ }
263337
263641
  function getCellSegmentCount(cell2) {
263338
263642
  if (cell2.blocks && cell2.blocks.length > 0) {
263339
263643
  let total = 0;
@@ -282352,7 +282656,8 @@ function makeResolveFace(resolver2, hasFace) {
282352
282656
  const r$1 = resolver2.resolveFace(logical, face, hasFace);
282353
282657
  return {
282354
282658
  physicalFamily: r$1.physicalFamily,
282355
- reason: r$1.reason
282659
+ reason: r$1.reason,
282660
+ sourceFace: r$1.sourceFace
282356
282661
  };
282357
282662
  };
282358
282663
  if (resolver2)
@@ -282382,10 +282687,14 @@ function collect(acc, node2, resolveFace2) {
282382
282687
  const usedKey = `${logicalPrimary.toLowerCase()}|${weight}|${style2}`;
282383
282688
  if (acc.usedFaces.has(usedKey))
282384
282689
  return;
282385
- const { physicalFamily, reason } = resolveFace2(node2.fontFamily, {
282690
+ const { physicalFamily, reason, sourceFace } = resolveFace2(node2.fontFamily, {
282386
282691
  weight,
282387
282692
  style: style2
282388
282693
  });
282694
+ const requiredFace = sourceFace ?? {
282695
+ weight,
282696
+ style: style2
282697
+ };
282389
282698
  acc.usedFaces.set(usedKey, {
282390
282699
  logicalFamily: logicalPrimary,
282391
282700
  weight,
@@ -282396,15 +282705,17 @@ function collect(acc, node2, resolveFace2) {
282396
282705
  weight,
282397
282706
  style2,
282398
282707
  (physicalFamily || "").toLowerCase(),
282708
+ requiredFace.weight,
282709
+ requiredFace.style,
282399
282710
  reason
282400
282711
  ]);
282401
282712
  if (physicalFamily) {
282402
- const reqKey = `${physicalFamily.toLowerCase()}|${weight}|${style2}`;
282713
+ const reqKey = `${physicalFamily.toLowerCase()}|${requiredFace.weight}|${requiredFace.style}`;
282403
282714
  if (!acc.requiredFaces.has(reqKey))
282404
282715
  acc.requiredFaces.set(reqKey, {
282405
282716
  family: physicalFamily,
282406
- weight,
282407
- style: style2
282717
+ weight: requiredFace.weight,
282718
+ style: requiredFace.style
282408
282719
  });
282409
282720
  }
282410
282721
  }
@@ -302032,6 +302343,7 @@ var Node$13 = class Node$14 {
302032
302343
  this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
302033
302344
  this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
302034
302345
  options.reapplyStructuredContentHover?.();
302346
+ options.reapplyTocGroupHover?.();
302035
302347
  }
302036
302348
  destroy() {
302037
302349
  this.#proofingDecorator.clear();
@@ -302041,6 +302353,83 @@ var Node$13 = class Node$14 {
302041
302353
  this.#commentHighlightDecorator.destroy();
302042
302354
  this.#decorationBridge.destroy();
302043
302355
  }
302356
+ }, HoverGroupCoordinator = class {
302357
+ #spec;
302358
+ #current = null;
302359
+ constructor(spec) {
302360
+ this.handleMouseEnter = (event) => {
302361
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
302362
+ if (!entry)
302363
+ return;
302364
+ const id2 = this.#spec.getId(entry);
302365
+ if (!id2)
302366
+ return;
302367
+ this.#set(id2);
302368
+ };
302369
+ this.handleMouseLeave = (event) => {
302370
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
302371
+ if (!entry)
302372
+ return;
302373
+ const id2 = this.#spec.getId(entry);
302374
+ if (!id2)
302375
+ return;
302376
+ const relatedTarget = event.relatedTarget;
302377
+ if (relatedTarget) {
302378
+ const nextEntry = relatedTarget.closest?.(this.#spec.entrySelector);
302379
+ if (nextEntry && this.#spec.getId(nextEntry) === id2)
302380
+ return;
302381
+ }
302382
+ this.clear();
302383
+ };
302384
+ this.#spec = spec;
302385
+ }
302386
+ reapply() {
302387
+ if (!this.#current)
302388
+ return;
302389
+ const { id: id2 } = this.#current;
302390
+ const elements = this.#spec.queryGroup(id2);
302391
+ if (elements.length === 0) {
302392
+ this.#current = null;
302393
+ return;
302394
+ }
302395
+ this.#applyClass(elements);
302396
+ this.#spec.onApply?.(elements);
302397
+ this.#current = {
302398
+ id: id2,
302399
+ elements
302400
+ };
302401
+ }
302402
+ clear() {
302403
+ if (!this.#current)
302404
+ return;
302405
+ for (const element3 of this.#current.elements) {
302406
+ element3.classList.remove(this.#spec.hoverClass);
302407
+ this.#spec.onClear?.(element3);
302408
+ }
302409
+ this.#current = null;
302410
+ }
302411
+ #set(id2) {
302412
+ if (this.#current?.id === id2)
302413
+ return;
302414
+ this.clear();
302415
+ const elements = this.#spec.queryGroup(id2);
302416
+ if (elements.length === 0)
302417
+ return;
302418
+ this.#applyClass(elements);
302419
+ this.#spec.onApply?.(elements);
302420
+ this.#current = {
302421
+ id: id2,
302422
+ elements
302423
+ };
302424
+ }
302425
+ #applyClass(elements) {
302426
+ const filter = this.#spec.shouldApplyTo;
302427
+ for (const element3 of elements) {
302428
+ if (filter && !filter(element3))
302429
+ continue;
302430
+ element3.classList.add(this.#spec.hoverClass);
302431
+ }
302432
+ }
302044
302433
  }, ProofingStore = class {
302045
302434
  #issuesBySegment = /* @__PURE__ */ new Map;
302046
302435
  addIssue(issue2) {
@@ -302651,6 +303040,9 @@ var Node$13 = class Node$14 {
302651
303040
  color: inherit !important;
302652
303041
  text-decoration: none !important;
302653
303042
  cursor: default;
303043
+ /* Disable native link drag so our pointer loop can run text-selection. */
303044
+ -webkit-user-drag: none;
303045
+ user-drag: none;
302654
303046
  }
302655
303047
 
302656
303048
  .superdoc-toc-entry .superdoc-link:hover {
@@ -302662,6 +303054,31 @@ var Node$13 = class Node$14 {
302662
303054
  outline: none;
302663
303055
  }
302664
303056
 
303057
+ /* TOC hover. .toc-group-hover is set by PresentationEditor on every entry
303058
+ sharing a data-toc-id so the whole TOC greys out together. The ::after
303059
+ stripe (height set via --toc-gap-below) fills the paragraph-spacing gap
303060
+ between adjacent entries so the hover reads as one continuous block. */
303061
+ .superdoc-toc-entry:hover,
303062
+ .superdoc-toc-entry.toc-group-hover {
303063
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
303064
+ }
303065
+
303066
+ /* Pointer-events stay on (default) so the stripe extends the parent entry's
303067
+ hit-test area through the paragraph-spacing gap. Without this, moving the
303068
+ cursor between two adjacent entries fires mouseout on the upper entry with
303069
+ relatedTarget = the page (not a TOC entry), the coordinator drops the
303070
+ group-hover class, and the grey disappears for a frame before the next
303071
+ entry's mouseover restores it — visible as a flicker. */
303072
+ .superdoc-toc-entry.toc-group-hover::after {
303073
+ content: '';
303074
+ position: absolute;
303075
+ left: 0;
303076
+ right: 0;
303077
+ top: 100%;
303078
+ height: var(--toc-gap-below, 0px);
303079
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
303080
+ }
303081
+
302665
303082
  /* Remove focus outlines from layout engine elements */
302666
303083
  .superdoc-layout,
302667
303084
  .superdoc-page,
@@ -304716,6 +305133,7 @@ menclose::after {
304716
305133
  });
304717
305134
  if (run2.fontSize != null)
304718
305135
  markerEl.style.fontSize = `${run2.fontSize}px`;
305136
+ allowFontSynthesis(markerEl);
304719
305137
  markerEl.style.fontWeight = run2.bold ? "bold" : "";
304720
305138
  markerEl.style.fontStyle = run2.italic ? "italic" : "";
304721
305139
  if (run2.color)
@@ -306639,8 +307057,12 @@ menclose::after {
306639
307057
  applyResolvedFragmentFrame(fragmentEl, resolvedItem, fragment);
306640
307058
  else
306641
307059
  applyFragmentFrame(fragmentEl, fragment);
306642
- if (isTocEntry)
306643
- fragmentEl.classList.add("superdoc-toc-entry");
307060
+ if (isTocEntry) {
307061
+ fragmentEl.classList.add(DOM_CLASS_NAMES.TOC_ENTRY);
307062
+ const tocId = block.attrs?.tocId;
307063
+ if (typeof tocId === "string" && tocId.length > 0)
307064
+ fragmentEl.dataset.tocId = tocId;
307065
+ }
306644
307066
  if (paraContinuesFromPrev)
306645
307067
  fragmentEl.dataset.continuesFromPrev = "true";
306646
307068
  if (paraContinuesOnNext)
@@ -306697,6 +307119,7 @@ menclose::after {
306697
307119
  style: run2.italic ? "italic" : "normal"
306698
307120
  });
306699
307121
  dropCapEl.style.fontSize = `${run2.fontSize}px`;
307122
+ allowFontSynthesis(dropCapEl);
306700
307123
  if (run2.bold)
306701
307124
  dropCapEl.style.fontWeight = "bold";
306702
307125
  if (run2.italic)
@@ -306816,6 +307239,7 @@ menclose::after {
306816
307239
  style: run2.italic ? "italic" : "normal"
306817
307240
  });
306818
307241
  element3.style.fontSize = `${run2.fontSize}px`;
307242
+ allowFontSynthesis(element3);
306819
307243
  if (run2.bold)
306820
307244
  element3.style.fontWeight = "bold";
306821
307245
  if (run2.italic)
@@ -307008,6 +307432,7 @@ menclose::after {
307008
307432
  }
307009
307433
  if (run2.textColor)
307010
307434
  annotation.style.color = run2.textColor;
307435
+ allowFontSynthesis(annotation);
307011
307436
  if (run2.bold)
307012
307437
  annotation.style.fontWeight = "bold";
307013
307438
  if (run2.italic)
@@ -314835,6 +315260,7 @@ menclose::after {
314835
315260
  #cellAnchor = null;
314836
315261
  #cellDragMode = "none";
314837
315262
  #pendingMarginClick = null;
315263
+ #pendingTocLinkNav = null;
314838
315264
  #lastSelectedImageBlockId = null;
314839
315265
  #suppressFocusInFromDraggable = false;
314840
315266
  #pendingStructuredContentLabelGesture = null;
@@ -315376,10 +315802,14 @@ menclose::after {
315376
315802
  return;
315377
315803
  }
315378
315804
  const linkEl = target?.closest?.("a.superdoc-link");
315379
- if (linkEl) {
315380
- this.#handleLinkClick(event, linkEl);
315381
- return;
315382
- }
315805
+ this.#pendingTocLinkNav = null;
315806
+ if (linkEl)
315807
+ if (linkEl.closest(`.${DOM_CLASS_NAMES.TOC_ENTRY}`))
315808
+ this.#pendingTocLinkNav = linkEl;
315809
+ else {
315810
+ this.#handleLinkClick(event, linkEl);
315811
+ return;
315812
+ }
315383
315813
  const annotationEl = target?.closest?.(buildAnnotationSelector());
315384
315814
  const isDraggableAnnotation = target?.closest?.(DRAGGABLE_SELECTOR) != null;
315385
315815
  const isNativeDragSource = target?.closest?.(DRAG_SOURCE_SELECTOR) != null;
@@ -315718,6 +316148,10 @@ menclose::after {
315718
316148
  event
315719
316149
  });
315720
316150
  this.#suppressFocusInFromDraggable = false;
316151
+ const pendingTocLink = this.#pendingTocLinkNav;
316152
+ this.#pendingTocLinkNav = null;
316153
+ if (pendingTocLink && !this.#dragThresholdExceeded)
316154
+ this.#handleLinkClick(event, pendingTocLink);
315721
316155
  if (!this.#isDragging) {
315722
316156
  this.#stopAutoScroll();
315723
316157
  return;
@@ -320192,13 +320626,13 @@ menclose::after {
320192
320626
  return;
320193
320627
  console.log(...args$1);
320194
320628
  }, 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;
320195
- var init_src_BKOC1_8_es = __esm(() => {
320629
+ var init_src_DumwyEvl_es = __esm(() => {
320196
320630
  init_rolldown_runtime_Bg48TavK_es();
320197
- init_SuperConverter_BaKhr4cp_es();
320631
+ init_SuperConverter_BtvpSnE5_es();
320198
320632
  init_jszip_C49i9kUs_es();
320199
320633
  init_xml_js_CqGKpaft_es();
320200
320634
  init_uuid_B2wVPhPi_es();
320201
- init_create_headless_toolbar_B3wNa0zb_es();
320635
+ init_create_headless_toolbar_BV5L35wQ_es();
320202
320636
  init_constants_D9qj59G2_es();
320203
320637
  init_dist_B8HfvhaK_es();
320204
320638
  init_unified_Dsuw2be5_es();
@@ -339128,6 +339562,8 @@ function print() { __p += __j.call(arguments, '') }
339128
339562
  TABLE_FRAGMENT: "superdoc-table-fragment",
339129
339563
  DOCUMENT_SECTION: "superdoc-document-section",
339130
339564
  SDT_GROUP_HOVER: "sdt-group-hover",
339565
+ TOC_ENTRY: "superdoc-toc-entry",
339566
+ TOC_GROUP_HOVER: "toc-group-hover",
339131
339567
  IMAGE_FRAGMENT: "superdoc-image-fragment",
339132
339568
  INLINE_IMAGE: "superdoc-inline-image",
339133
339569
  LIST_MARKER: "superdoc-list-marker",
@@ -340908,7 +341344,7 @@ function print() { __p += __j.call(arguments, '') }
340908
341344
  };
340909
341345
  }
340910
341346
  }, [["__scopeId", "data-v-d25821a5"]]);
340911
- TOOLBAR_FONTS = getDefaultFontOfferings().map((offering) => ({
341347
+ TOOLBAR_FONTS = getBuiltInToolbarFontOfferings().map((offering) => ({
340912
341348
  label: offering.logicalFamily,
340913
341349
  key: fontOfferingStack(offering),
340914
341350
  fontWeight: 400,
@@ -348653,7 +349089,8 @@ function print() { __p += __j.call(arguments, '') }
348653
349089
  #lastSelectedFieldAnnotation = null;
348654
349090
  #lastSelectedStructuredContentBlock = null;
348655
349091
  #lastSelectedStructuredContentInline = null;
348656
- #lastHoveredStructuredContentBlock = null;
349092
+ #sdtHoverCoordinator = null;
349093
+ #tocHoverCoordinator = null;
348657
349094
  #remoteCursorManager = null;
348658
349095
  #cursorUpdateTimer = null;
348659
349096
  #remoteCursorOverlay = null;
@@ -348724,8 +349161,11 @@ function print() { __p += __j.call(arguments, '') }
348724
349161
  ensureEditorNativeSelectionStyles(doc$12);
348725
349162
  ensureEditorFieldAnnotationInteractionStyles(doc$12);
348726
349163
  ensureEditorMovableObjectInteractionStyles(doc$12);
348727
- this.#painterHost.addEventListener("mouseover", this.#handleStructuredContentBlockMouseEnter);
348728
- this.#painterHost.addEventListener("mouseout", this.#handleStructuredContentBlockMouseLeave);
349164
+ this.#initializeHoverCoordinators();
349165
+ this.#painterHost.addEventListener("mouseover", this.#sdtHoverCoordinator.handleMouseEnter);
349166
+ this.#painterHost.addEventListener("mouseout", this.#sdtHoverCoordinator.handleMouseLeave);
349167
+ this.#painterHost.addEventListener("mouseover", this.#tocHoverCoordinator.handleMouseEnter);
349168
+ this.#painterHost.addEventListener("mouseout", this.#tocHoverCoordinator.handleMouseLeave);
348729
349169
  this.#domIndexObserverManager = new DomPositionIndexObserverManager({
348730
349170
  windowRoot: this.#visibleHost?.ownerDocument?.defaultView ?? window,
348731
349171
  getPainterHost: () => this.#painterHost,
@@ -352716,74 +353156,50 @@ function print() { __p += __j.call(arguments, '') }
352716
353156
  }
352717
353157
  this.#setSelectedStructuredContentBlockClass(elements, id2);
352718
353158
  }
352719
- #handleStructuredContentBlockMouseEnter = (event) => {
352720
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
352721
- if (!block || !(block instanceof HTMLElement))
353159
+ #initializeHoverCoordinators() {
353160
+ if (this.#sdtHoverCoordinator || this.#tocHoverCoordinator)
352722
353161
  return;
352723
- if (block.classList.contains("ProseMirror-selectednode"))
353162
+ this.#sdtHoverCoordinator = new HoverGroupCoordinator({
353163
+ entrySelector: `.${DOM_CLASS_NAMES.BLOCK_SDT}`,
353164
+ getId: (entry) => entry.dataset.sdtId,
353165
+ queryGroup: (id2) => this.#painterAdapter.getStructuredContentBlockElementsById(id2),
353166
+ hoverClass: DOM_CLASS_NAMES.SDT_GROUP_HOVER,
353167
+ shouldApplyTo: (element3) => !element3.classList.contains("ProseMirror-selectednode")
353168
+ });
353169
+ this.#tocHoverCoordinator = new HoverGroupCoordinator({
353170
+ entrySelector: `.${DOM_CLASS_NAMES.TOC_ENTRY}`,
353171
+ getId: (entry) => entry.dataset.tocId,
353172
+ queryGroup: (id2) => this.#queryTocEntryElementsById(id2),
353173
+ hoverClass: DOM_CLASS_NAMES.TOC_GROUP_HOVER,
353174
+ onApply: (elements) => this.#applyTocGapFill(elements),
353175
+ onClear: (element3) => element3.style.removeProperty("--toc-gap-below")
353176
+ });
353177
+ }
353178
+ #applyTocGapFill(elements) {
353179
+ if (elements.length < 2)
352724
353180
  return;
352725
- const rawId = block.dataset.sdtId;
352726
- if (!rawId)
352727
- return;
352728
- this.#setHoveredStructuredContentBlockClass(rawId);
352729
- };
352730
- #handleStructuredContentBlockMouseLeave = (event) => {
352731
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
352732
- if (!block)
352733
- return;
352734
- const relatedTarget = event.relatedTarget;
352735
- if (relatedTarget && block.dataset.sdtId) {
352736
- const escapedCheckId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(block.dataset.sdtId) : block.dataset.sdtId.replace(/"/g, "\\\"");
352737
- if (relatedTarget.closest(buildSdtBlockSelector(escapedCheckId)))
352738
- return;
353181
+ const measured = elements.map((element3) => ({
353182
+ element: element3,
353183
+ rect: element3.getBoundingClientRect()
353184
+ })).sort((a2, b$1) => a2.rect.top - b$1.rect.top);
353185
+ for (let i4 = 0;i4 < measured.length - 1; i4++) {
353186
+ const current = measured[i4];
353187
+ const next2 = measured[i4 + 1];
353188
+ const currentPage = current.element.closest("[data-page-index]");
353189
+ if (!currentPage || currentPage !== next2.element.closest("[data-page-index]"))
353190
+ continue;
353191
+ const rawGap = next2.rect.top - current.rect.bottom;
353192
+ const scaleY = current.rect.height && current.element.offsetHeight ? current.rect.height / current.element.offsetHeight : 1;
353193
+ const gap = scaleY > 0 ? rawGap / scaleY : rawGap;
353194
+ if (gap > 0)
353195
+ current.element.style.setProperty("--toc-gap-below", `${gap + 1}px`);
352739
353196
  }
352740
- this.#clearHoveredStructuredContentBlockClass();
352741
- };
352742
- #clearHoveredStructuredContentBlockClass() {
352743
- if (!this.#lastHoveredStructuredContentBlock)
352744
- return;
352745
- this.#lastHoveredStructuredContentBlock.elements.forEach((element3) => {
352746
- element3.classList.remove(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
352747
- });
352748
- this.#lastHoveredStructuredContentBlock = null;
352749
353197
  }
352750
- #setHoveredStructuredContentBlockClass(id2) {
352751
- if (this.#lastHoveredStructuredContentBlock?.id === id2)
352752
- return;
352753
- this.#clearHoveredStructuredContentBlockClass();
353198
+ #queryTocEntryElementsById(id2) {
352754
353199
  if (!this.#painterHost)
352755
- return;
352756
- const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
352757
- if (elements.length === 0)
352758
- return;
352759
- elements.forEach((element3) => {
352760
- if (!element3.classList.contains("ProseMirror-selectednode"))
352761
- element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
352762
- });
352763
- this.#lastHoveredStructuredContentBlock = {
352764
- id: id2,
352765
- elements
352766
- };
352767
- }
352768
- #reapplySdtGroupHover() {
352769
- if (!this.#lastHoveredStructuredContentBlock || !this.#painterHost)
352770
- return;
352771
- const { id: id2 } = this.#lastHoveredStructuredContentBlock;
352772
- if (!id2)
352773
- return;
352774
- const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
352775
- if (elements.length === 0) {
352776
- this.#lastHoveredStructuredContentBlock = null;
352777
- return;
352778
- }
352779
- elements.forEach((element3) => {
352780
- if (!element3.classList.contains("ProseMirror-selectednode"))
352781
- element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
352782
- });
352783
- this.#lastHoveredStructuredContentBlock = {
352784
- id: id2,
352785
- elements
352786
- };
353200
+ return [];
353201
+ const escapedId = escapeAttrValue(id2);
353202
+ return Array.from(this.#painterHost.querySelectorAll(`.${DOM_CLASS_NAMES.TOC_ENTRY}[data-toc-id="${escapedId}"]`));
352787
353203
  }
352788
353204
  #refreshEditorDomAugmentations() {
352789
353205
  this.#postPaintPipeline.refreshAfterPaint({
@@ -352792,7 +353208,8 @@ function print() { __p += __j.call(arguments, '') }
352792
353208
  domPositionIndex: this.#domPositionIndex,
352793
353209
  proofingAnnotations: this.#buildProofingAnnotations(),
352794
353210
  rebuildDomPositionIndex: () => this.#rebuildDomPositionIndex(),
352795
- reapplyStructuredContentHover: () => this.#reapplySdtGroupHover()
353211
+ reapplyStructuredContentHover: () => this.#sdtHoverCoordinator?.reapply(),
353212
+ reapplyTocGroupHover: () => this.#tocHoverCoordinator?.reapply()
352796
353213
  });
352797
353214
  }
352798
353215
  #clearSelectedStructuredContentInlineClass() {
@@ -355180,11 +355597,11 @@ function print() { __p += __j.call(arguments, '') }
355180
355597
  ]);
355181
355598
  });
355182
355599
 
355183
- // ../../packages/superdoc/dist/chunks/create-super-doc-ui-ClaBD_rO.es.js
355600
+ // ../../packages/superdoc/dist/chunks/create-super-doc-ui-DCDD6DVT.es.js
355184
355601
  var headlessToolbarConstants, 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;
355185
- var init_create_super_doc_ui_ClaBD_rO_es = __esm(() => {
355186
- init_SuperConverter_BaKhr4cp_es();
355187
- init_create_headless_toolbar_B3wNa0zb_es();
355602
+ var init_create_super_doc_ui_DCDD6DVT_es = __esm(() => {
355603
+ init_SuperConverter_BtvpSnE5_es();
355604
+ init_create_headless_toolbar_BV5L35wQ_es();
355188
355605
  headlessToolbarConstants = {
355189
355606
  DEFAULT_TEXT_ALIGN_OPTIONS: [
355190
355607
  {
@@ -355466,16 +355883,16 @@ var init_zipper_yaJVJ4z9_es = __esm(() => {
355466
355883
 
355467
355884
  // ../../packages/superdoc/dist/super-editor.es.js
355468
355885
  var init_super_editor_es = __esm(() => {
355469
- init_src_BKOC1_8_es();
355470
- init_SuperConverter_BaKhr4cp_es();
355886
+ init_src_DumwyEvl_es();
355887
+ init_SuperConverter_BtvpSnE5_es();
355471
355888
  init_jszip_C49i9kUs_es();
355472
355889
  init_xml_js_CqGKpaft_es();
355473
- init_create_headless_toolbar_B3wNa0zb_es();
355890
+ init_create_headless_toolbar_BV5L35wQ_es();
355474
355891
  init_constants_D9qj59G2_es();
355475
355892
  init_dist_B8HfvhaK_es();
355476
355893
  init_unified_Dsuw2be5_es();
355477
355894
  init_DocxZipper_FUsfThjV_es();
355478
- init_create_super_doc_ui_ClaBD_rO_es();
355895
+ init_create_super_doc_ui_DCDD6DVT_es();
355479
355896
  init_ui_C5PAS9hY_es();
355480
355897
  init_eventemitter3_BnGqBE_Q_es();
355481
355898
  init_errors_CNaD6vcg_es();
@@ -456685,7 +457102,7 @@ var init_exporter = __esm(() => {
456685
457102
  // ../../shared/font-system/src/types.ts
456686
457103
  var init_types8 = () => {};
456687
457104
 
456688
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.6.0/node_modules/@docfonts/fallbacks/dist/data.js
457105
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/data.js
456689
457106
  var SUBSTITUTION_EVIDENCE2;
456690
457107
  var init_data = __esm(() => {
456691
457108
  SUBSTITUTION_EVIDENCE2 = [
@@ -456714,6 +457131,7 @@ var init_data = __esm(() => {
456714
457131
  ],
456715
457132
  exportRule: "preserve_original_name",
456716
457133
  advance: {
457134
+ basis: "latin_full",
456717
457135
  meanDelta: 0,
456718
457136
  maxDelta: 0
456719
457137
  },
@@ -456746,6 +457164,7 @@ var init_data = __esm(() => {
456746
457164
  ],
456747
457165
  exportRule: "preserve_original_name",
456748
457166
  advance: {
457167
+ basis: "latin_full",
456749
457168
  meanDelta: 0.0002378,
456750
457169
  maxDelta: 0.2310758
456751
457170
  },
@@ -456789,6 +457208,7 @@ var init_data = __esm(() => {
456789
457208
  ],
456790
457209
  exportRule: "preserve_original_name",
456791
457210
  advance: {
457211
+ basis: "latin_full",
456792
457212
  meanDelta: 0,
456793
457213
  maxDelta: 0
456794
457214
  },
@@ -456818,6 +457238,7 @@ var init_data = __esm(() => {
456818
457238
  ],
456819
457239
  exportRule: "preserve_original_name",
456820
457240
  advance: {
457241
+ basis: "latin_full",
456821
457242
  meanDelta: 0,
456822
457243
  maxDelta: 0
456823
457244
  },
@@ -456847,6 +457268,7 @@ var init_data = __esm(() => {
456847
457268
  ],
456848
457269
  exportRule: "preserve_original_name",
456849
457270
  advance: {
457271
+ basis: "latin_full",
456850
457272
  meanDelta: 0,
456851
457273
  maxDelta: 0
456852
457274
  },
@@ -456883,6 +457305,7 @@ var init_data = __esm(() => {
456883
457305
  ],
456884
457306
  exportRule: "preserve_original_name",
456885
457307
  advance: {
457308
+ basis: "latin_full",
456886
457309
  meanDelta: 0.0000197,
456887
457310
  maxDelta: 0.0183727
456888
457311
  },
@@ -456935,6 +457358,7 @@ var init_data = __esm(() => {
456935
457358
  ],
456936
457359
  exportRule: "preserve_original_name",
456937
457360
  advance: {
457361
+ basis: "latin_full",
456938
457362
  meanDelta: 0,
456939
457363
  maxDelta: 0.5
456940
457364
  },
@@ -456979,6 +457403,149 @@ var init_data = __esm(() => {
456979
457403
  exportRule: "preserve_original_name",
456980
457404
  candidateLicense: null
456981
457405
  },
457406
+ {
457407
+ evidenceId: "arial-black",
457408
+ generic: "sans-serif",
457409
+ logicalFamily: "Arial Black",
457410
+ physicalFamily: "Archivo Black",
457411
+ verdict: "visual_only",
457412
+ faces: {
457413
+ regular: true,
457414
+ bold: false,
457415
+ italic: false,
457416
+ boldItalic: false
457417
+ },
457418
+ faceSources: {
457419
+ italic: {
457420
+ kind: "synthetic",
457421
+ from: "regular"
457422
+ }
457423
+ },
457424
+ gates: {
457425
+ static: "pass",
457426
+ metric: "fail",
457427
+ layout: "not_run",
457428
+ ship: "fail"
457429
+ },
457430
+ policyAction: "substitute",
457431
+ measurementRefs: [
457432
+ "arial-black__archivo-black#visual_review#2026-06-09"
457433
+ ],
457434
+ exportRule: "preserve_original_name",
457435
+ candidateLicense: "OFL-1.1",
457436
+ faceVerdicts: {
457437
+ italic: "visual_only"
457438
+ }
457439
+ },
457440
+ {
457441
+ evidenceId: "arial-rounded-mt-bold",
457442
+ generic: "sans-serif",
457443
+ logicalFamily: "Arial Rounded MT Bold",
457444
+ physicalFamily: "Ubuntu",
457445
+ verdict: "visual_only",
457446
+ faces: {
457447
+ regular: true,
457448
+ bold: true,
457449
+ italic: true,
457450
+ boldItalic: true
457451
+ },
457452
+ gates: {
457453
+ static: "pass",
457454
+ metric: "fail",
457455
+ layout: "not_run",
457456
+ ship: "fail"
457457
+ },
457458
+ policyAction: "category_fallback",
457459
+ measurementRefs: [
457460
+ "arial-rounded-mt-bold__ubuntu#visual_review#2026-06-09"
457461
+ ],
457462
+ exportRule: "preserve_original_name",
457463
+ candidateLicense: "Ubuntu-font-1.0"
457464
+ },
457465
+ {
457466
+ evidenceId: "bookman-old-style",
457467
+ generic: "serif",
457468
+ logicalFamily: "Bookman Old Style",
457469
+ physicalFamily: "TeX Gyre Bonum",
457470
+ verdict: "visual_only",
457471
+ faces: {
457472
+ regular: true,
457473
+ bold: true,
457474
+ italic: true,
457475
+ boldItalic: true
457476
+ },
457477
+ gates: {
457478
+ static: "pass",
457479
+ metric: "fail",
457480
+ layout: "not_run",
457481
+ ship: "fail"
457482
+ },
457483
+ policyAction: "substitute",
457484
+ measurementRefs: [
457485
+ "bookman-old-style__tex-gyre-bonum#visual_review#2026-06-09"
457486
+ ],
457487
+ exportRule: "preserve_original_name",
457488
+ candidateLicense: "GUST-Font-License-1.0"
457489
+ },
457490
+ {
457491
+ evidenceId: "century",
457492
+ generic: "serif",
457493
+ logicalFamily: "Century",
457494
+ physicalFamily: "C059",
457495
+ verdict: "visual_only",
457496
+ faces: {
457497
+ regular: true,
457498
+ bold: true,
457499
+ italic: true,
457500
+ boldItalic: true
457501
+ },
457502
+ gates: {
457503
+ static: "pass",
457504
+ metric: "fail",
457505
+ layout: "not_run",
457506
+ ship: "fail"
457507
+ },
457508
+ policyAction: "substitute",
457509
+ measurementRefs: [
457510
+ "century__c059#visual_review#2026-06-09"
457511
+ ],
457512
+ exportRule: "preserve_original_name",
457513
+ candidateLicense: "AGPL-3.0-only WITH PS-or-PDF-font-exception-20170817"
457514
+ },
457515
+ {
457516
+ evidenceId: "garamond",
457517
+ generic: "serif",
457518
+ logicalFamily: "Garamond",
457519
+ physicalFamily: "Cardo",
457520
+ verdict: "visual_only",
457521
+ faces: {
457522
+ regular: true,
457523
+ bold: true,
457524
+ italic: true,
457525
+ boldItalic: false
457526
+ },
457527
+ faceSources: {
457528
+ boldItalic: {
457529
+ kind: "synthetic",
457530
+ from: "bold"
457531
+ }
457532
+ },
457533
+ gates: {
457534
+ static: "pass",
457535
+ metric: "fail",
457536
+ layout: "not_run",
457537
+ ship: "fail"
457538
+ },
457539
+ policyAction: "category_fallback",
457540
+ measurementRefs: [
457541
+ "garamond__cardo#visual_review#2026-06-09"
457542
+ ],
457543
+ exportRule: "preserve_original_name",
457544
+ candidateLicense: "OFL-1.1",
457545
+ faceVerdicts: {
457546
+ boldItalic: "visual_only"
457547
+ }
457548
+ },
456982
457549
  {
456983
457550
  evidenceId: "consolas",
456984
457551
  generic: "monospace",
@@ -457003,6 +457570,7 @@ var init_data = __esm(() => {
457003
457570
  ],
457004
457571
  exportRule: "preserve_original_name",
457005
457572
  advance: {
457573
+ basis: "monospace_cell",
457006
457574
  meanDelta: 0.00035999999999999997,
457007
457575
  maxDelta: 0.00035999999999999997
457008
457576
  },
@@ -457037,80 +457605,90 @@ var init_data = __esm(() => {
457037
457605
  evidenceId: "tahoma",
457038
457606
  generic: "sans-serif",
457039
457607
  logicalFamily: "Tahoma",
457040
- physicalFamily: null,
457608
+ physicalFamily: "Noto Sans",
457041
457609
  verdict: "visual_only",
457042
457610
  faces: {
457043
- regular: false,
457044
- bold: false,
457045
- italic: false,
457046
- boldItalic: false
457611
+ regular: true,
457612
+ bold: true,
457613
+ italic: true,
457614
+ boldItalic: true
457047
457615
  },
457048
457616
  gates: {
457049
- static: "not_run",
457617
+ static: "pass",
457050
457618
  metric: "fail",
457051
457619
  layout: "not_run",
457052
- ship: "not_run"
457620
+ ship: "fail"
457053
457621
  },
457054
457622
  policyAction: "category_fallback",
457055
457623
  measurementRefs: [
457056
- "tahoma#top_candidates#2026-06-03"
457624
+ "tahoma__noto-sans#visual_review#2026-06-09"
457057
457625
  ],
457058
457626
  exportRule: "preserve_original_name",
457059
- candidateLicense: null
457627
+ candidateLicense: "OFL-1.1"
457060
457628
  },
457061
457629
  {
457062
457630
  evidenceId: "trebuchet-ms",
457063
457631
  generic: "sans-serif",
457064
457632
  logicalFamily: "Trebuchet MS",
457065
- physicalFamily: null,
457633
+ physicalFamily: "PT Sans",
457066
457634
  verdict: "visual_only",
457067
457635
  faces: {
457068
- regular: false,
457069
- bold: false,
457070
- italic: false,
457071
- boldItalic: false
457636
+ regular: true,
457637
+ bold: true,
457638
+ italic: true,
457639
+ boldItalic: true
457072
457640
  },
457073
457641
  gates: {
457074
- static: "not_run",
457642
+ static: "pass",
457075
457643
  metric: "fail",
457076
457644
  layout: "not_run",
457077
- ship: "not_run"
457645
+ ship: "fail"
457078
457646
  },
457079
457647
  policyAction: "category_fallback",
457080
457648
  measurementRefs: [
457081
- "trebuchet-ms#top_candidates#2026-06-03"
457649
+ "trebuchet-ms__pt-sans#visual_review#2026-06-09"
457082
457650
  ],
457083
457651
  exportRule: "preserve_original_name",
457084
- candidateLicense: null
457652
+ candidateLicense: "OFL-1.1"
457085
457653
  },
457086
457654
  {
457087
457655
  evidenceId: "comic-sans-ms",
457088
457656
  generic: "sans-serif",
457089
457657
  logicalFamily: "Comic Sans MS",
457090
- physicalFamily: "Comic Neue",
457658
+ physicalFamily: "Comic Relief",
457091
457659
  verdict: "visual_only",
457092
457660
  faces: {
457093
- regular: false,
457094
- bold: false,
457661
+ regular: true,
457662
+ bold: true,
457095
457663
  italic: false,
457096
457664
  boldItalic: false
457097
457665
  },
457666
+ faceSources: {
457667
+ italic: {
457668
+ kind: "synthetic",
457669
+ from: "regular"
457670
+ },
457671
+ boldItalic: {
457672
+ kind: "synthetic",
457673
+ from: "bold"
457674
+ }
457675
+ },
457098
457676
  gates: {
457099
- static: "not_run",
457677
+ static: "pass",
457100
457678
  metric: "fail",
457101
457679
  layout: "not_run",
457102
- ship: "not_run"
457680
+ ship: "fail"
457103
457681
  },
457104
457682
  policyAction: "category_fallback",
457105
457683
  measurementRefs: [
457106
- "comic-sans-ms__comic-neue#analytic_advance#2026-06-03"
457684
+ "comic-sans-ms__comic-relief#visual_review#2026-06-09"
457107
457685
  ],
457108
457686
  exportRule: "preserve_original_name",
457109
- advance: {
457110
- meanDelta: 0.1005,
457111
- maxDelta: 0.1419
457112
- },
457113
- candidateLicense: "OFL-1.1"
457687
+ candidateLicense: "OFL-1.1",
457688
+ faceVerdicts: {
457689
+ italic: "visual_only",
457690
+ boldItalic: "visual_only"
457691
+ }
457114
457692
  },
457115
457693
  {
457116
457694
  evidenceId: "candara",
@@ -457211,11 +457789,53 @@ var init_data = __esm(() => {
457211
457789
  ],
457212
457790
  exportRule: "preserve_original_name",
457213
457791
  advance: {
457792
+ basis: "monospace_cell",
457214
457793
  meanDelta: 0.004050000000000001,
457215
457794
  maxDelta: 0.004050000000000001
457216
457795
  },
457217
457796
  candidateLicense: "OFL-1.1"
457218
457797
  },
457798
+ {
457799
+ evidenceId: "gill-sans-mt-condensed",
457800
+ generic: "sans-serif",
457801
+ logicalFamily: "Gill Sans MT Condensed",
457802
+ physicalFamily: "PT Sans Narrow",
457803
+ verdict: "visual_only",
457804
+ faces: {
457805
+ regular: true,
457806
+ bold: true,
457807
+ italic: false,
457808
+ boldItalic: false
457809
+ },
457810
+ faceSources: {
457811
+ italic: {
457812
+ kind: "synthetic",
457813
+ from: "regular"
457814
+ },
457815
+ boldItalic: {
457816
+ kind: "synthetic",
457817
+ from: "bold"
457818
+ }
457819
+ },
457820
+ gates: {
457821
+ static: "pass",
457822
+ metric: "fail",
457823
+ layout: "not_run",
457824
+ ship: "fail"
457825
+ },
457826
+ policyAction: "category_fallback",
457827
+ measurementRefs: [
457828
+ "gill-sans-mt-condensed__pt-sans-narrow#visual_review#2026-06-09"
457829
+ ],
457830
+ exportRule: "preserve_original_name",
457831
+ candidateLicense: "OFL-1.1",
457832
+ faceVerdicts: {
457833
+ regular: "visual_only",
457834
+ bold: "visual_only",
457835
+ italic: "visual_only",
457836
+ boldItalic: "visual_only"
457837
+ }
457838
+ },
457219
457839
  {
457220
457840
  evidenceId: "aptos-display",
457221
457841
  generic: "sans-serif",
@@ -457284,6 +457904,7 @@ var init_data = __esm(() => {
457284
457904
  ],
457285
457905
  exportRule: "preserve_original_name",
457286
457906
  advance: {
457907
+ basis: "latin_full",
457287
457908
  meanDelta: 0,
457288
457909
  maxDelta: 0
457289
457910
  },
@@ -457313,6 +457934,7 @@ var init_data = __esm(() => {
457313
457934
  ],
457314
457935
  exportRule: "preserve_original_name",
457315
457936
  advance: {
457937
+ basis: "latin_full",
457316
457938
  meanDelta: 0.0148,
457317
457939
  maxDelta: 0.066
457318
457940
  },
@@ -457342,6 +457964,7 @@ var init_data = __esm(() => {
457342
457964
  ],
457343
457965
  exportRule: "preserve_original_name",
457344
457966
  advance: {
457967
+ basis: "latin_full",
457345
457968
  meanDelta: 0,
457346
457969
  maxDelta: 0.4915590863952334
457347
457970
  },
@@ -457363,13 +457986,27 @@ var init_data = __esm(() => {
457363
457986
  generic: "serif",
457364
457987
  logicalFamily: "Cooper Black",
457365
457988
  physicalFamily: "Caprasimo",
457366
- verdict: "metric_safe",
457989
+ verdict: "visual_only",
457367
457990
  faces: {
457368
457991
  regular: true,
457369
457992
  bold: false,
457370
457993
  italic: false,
457371
457994
  boldItalic: false
457372
457995
  },
457996
+ faceSources: {
457997
+ bold: {
457998
+ kind: "synthetic",
457999
+ from: "regular"
458000
+ },
458001
+ italic: {
458002
+ kind: "synthetic",
458003
+ from: "regular"
458004
+ },
458005
+ boldItalic: {
458006
+ kind: "synthetic",
458007
+ from: "regular"
458008
+ }
458009
+ },
457373
458010
  gates: {
457374
458011
  static: "pass",
457375
458012
  metric: "pass",
@@ -457378,26 +458015,31 @@ var init_data = __esm(() => {
457378
458015
  },
457379
458016
  policyAction: "substitute",
457380
458017
  measurementRefs: [
457381
- "cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05"
458018
+ "cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05",
458019
+ "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"
457382
458020
  ],
457383
458021
  exportRule: "preserve_original_name",
457384
458022
  advance: {
458023
+ basis: "latin_full",
457385
458024
  meanDelta: 0,
457386
458025
  maxDelta: 0
457387
458026
  },
457388
458027
  candidateLicense: "OFL-1.1",
457389
458028
  faceVerdicts: {
457390
- regular: "metric_safe"
458029
+ regular: "metric_safe",
458030
+ bold: "visual_only",
458031
+ italic: "visual_only",
458032
+ boldItalic: "visual_only"
457391
458033
  }
457392
458034
  }
457393
458035
  ];
457394
458036
  });
457395
458037
 
457396
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.6.0/node_modules/@docfonts/fallbacks/dist/fallbacks.js
458038
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/fallbacks.js
457397
458039
  function normalizeFamilyName2(name) {
457398
458040
  return name.trim().replace(/^['"]+|['"]+$/g, "").trim().toLowerCase();
457399
458041
  }
457400
- function buildFallback2(row2, physicalFamily, verdict, faceSlot) {
458042
+ function buildFallback2(row2, physicalFamily, verdict, faceSlot, faceSource) {
457401
458043
  const glyphExceptions = faceSlot ? row2.glyphExceptions?.filter((g2) => g2.slot === faceSlot) : row2.glyphExceptions ? [...row2.glyphExceptions] : undefined;
457402
458044
  return {
457403
458045
  substituteFamily: physicalFamily,
@@ -457407,6 +458049,7 @@ function buildFallback2(row2, physicalFamily, verdict, faceSlot) {
457407
458049
  faces: row2.faces,
457408
458050
  evidenceId: row2.evidenceId,
457409
458051
  generic: row2.generic,
458052
+ ...faceSource ? { faceSource: { ...faceSource } } : {},
457410
458053
  ...glyphExceptions && glyphExceptions.length > 0 ? { glyphExceptions } : {}
457411
458054
  };
457412
458055
  }
@@ -457431,6 +458074,35 @@ function decideRow2(row2, canRenderFamily2) {
457431
458074
  fallback: buildFallback2(row2, physicalFamily, verdict)
457432
458075
  };
457433
458076
  }
458077
+ function isFaceScoped2(row2) {
458078
+ const f2 = row2.faces;
458079
+ return f2.regular || f2.bold || f2.italic || f2.boldItalic;
458080
+ }
458081
+ function faceSourceFor2(row2, face) {
458082
+ const explicit = row2.faceSources?.[face];
458083
+ if (explicit)
458084
+ return explicit;
458085
+ return isFaceScoped2(row2) && row2.faces[face] ? { kind: "real" } : undefined;
458086
+ }
458087
+ function decideRowForFace2(row2, face, canRenderFamily2) {
458088
+ const base6 = decideRow2(row2, canRenderFamily2);
458089
+ if (base6.kind !== "fallback")
458090
+ return base6;
458091
+ const faceSource = faceSourceFor2(row2, face);
458092
+ if (isFaceScoped2(row2) && !faceSource)
458093
+ return {
458094
+ kind: "face_missing",
458095
+ substituteFamily: base6.fallback.substituteFamily,
458096
+ evidenceId: row2.evidenceId,
458097
+ generic: row2.generic
458098
+ };
458099
+ const faceVerdict = row2.faceVerdicts?.[face] ?? row2.verdict;
458100
+ const projectedFaceSource = faceSource?.kind === "synthetic" ? faceSource : undefined;
458101
+ return {
458102
+ kind: "fallback",
458103
+ fallback: buildFallback2(row2, base6.fallback.substituteFamily, faceVerdict, face, projectedFaceSource)
458104
+ };
458105
+ }
457434
458106
  function getFallbackDecision2(family2, options = {}) {
457435
458107
  const row2 = BY_LOGICAL2.get(normalizeFamilyName2(family2));
457436
458108
  return row2 ? decideRow2(row2, options.canRenderFamily) : { kind: "unknown" };
@@ -457439,6 +458111,10 @@ function getRenderableFallback2(family2, options) {
457439
458111
  const decision = getFallbackDecision2(family2, options);
457440
458112
  return decision.kind === "fallback" ? decision.fallback : null;
457441
458113
  }
458114
+ function getFallbackDecisionForFace2(family2, face, options = {}) {
458115
+ const row2 = BY_LOGICAL2.get(normalizeFamilyName2(family2));
458116
+ return row2 ? decideRowForFace2(row2, face, options.canRenderFamily) : { kind: "unknown" };
458117
+ }
457442
458118
  var LINE_BREAK_SAFE_VERDICTS2, BY_LOGICAL2;
457443
458119
  var init_fallbacks = __esm(() => {
457444
458120
  init_data();
@@ -457453,7 +458129,7 @@ var init_fallbacks = __esm(() => {
457453
458129
  ]));
457454
458130
  });
457455
458131
 
457456
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.6.0/node_modules/@docfonts/fallbacks/dist/index.js
458132
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/index.js
457457
458133
  var init_dist11 = __esm(() => {
457458
458134
  init_data();
457459
458135
  init_fallbacks();
@@ -457471,6 +458147,9 @@ function fourFaces2(filePrefix) {
457471
458147
  function family2(name, filePrefix, license) {
457472
458148
  return { family: name, license, faces: fourFaces2(filePrefix) };
457473
458149
  }
458150
+ function familyWithFaces2(name, license, faces) {
458151
+ return { family: name, license, faces };
458152
+ }
457474
458153
  var BUNDLED_MANIFEST2;
457475
458154
  var init_bundled_manifest = __esm(() => {
457476
458155
  BUNDLED_MANIFEST2 = Object.freeze([
@@ -457478,7 +458157,8 @@ var init_bundled_manifest = __esm(() => {
457478
458157
  family2("Caladea", "Caladea", "Apache-2.0"),
457479
458158
  family2("Liberation Sans", "LiberationSans", "OFL-1.1"),
457480
458159
  family2("Liberation Serif", "LiberationSerif", "OFL-1.1"),
457481
- family2("Liberation Mono", "LiberationMono", "OFL-1.1")
458160
+ family2("Liberation Mono", "LiberationMono", "OFL-1.1"),
458161
+ familyWithFaces2("Caprasimo", "OFL-1.1", [{ weight: "normal", style: "normal", file: "Caprasimo-Regular.woff2" }])
457482
458162
  ]);
457483
458163
  });
457484
458164
 
@@ -457496,6 +458176,59 @@ function normalizeFamilyKey3(family3) {
457496
458176
  function sortPairs2(pairs) {
457497
458177
  return pairs.sort(([a2], [b2]) => a2 < b2 ? -1 : a2 > b2 ? 1 : 0);
457498
458178
  }
458179
+ function faceSlotFor2({ weight, style: style2 }) {
458180
+ const bold = weight === "700";
458181
+ const italic = style2 === "italic";
458182
+ if (bold && italic)
458183
+ return "boldItalic";
458184
+ if (bold)
458185
+ return "bold";
458186
+ if (italic)
458187
+ return "italic";
458188
+ return "regular";
458189
+ }
458190
+ function faceKeyForSlot2(slot) {
458191
+ switch (slot) {
458192
+ case "bold":
458193
+ return { weight: "700", style: "normal" };
458194
+ case "italic":
458195
+ return { weight: "400", style: "italic" };
458196
+ case "boldItalic":
458197
+ return { weight: "700", style: "italic" };
458198
+ case "regular":
458199
+ return { weight: "400", style: "normal" };
458200
+ }
458201
+ }
458202
+ function reasonForFallback2(policyAction) {
458203
+ return policyAction === "category_fallback" ? "category_fallback" : "bundled_substitute";
458204
+ }
458205
+ function resolveDocfontsFace2(primary, face, hasFace) {
458206
+ const decision = getFallbackDecisionForFace2(primary, faceSlotFor2(face), { canRenderFamily: canRenderFamily2 });
458207
+ if (decision.kind === "face_missing") {
458208
+ return { physical: primary, reason: "fallback_face_absent" };
458209
+ }
458210
+ if (decision.kind !== "fallback")
458211
+ return null;
458212
+ const fallback = decision.fallback;
458213
+ if (fallback.policyAction !== "substitute" && fallback.policyAction !== "category_fallback")
458214
+ return null;
458215
+ if (hasFace(fallback.substituteFamily, face.weight, face.style)) {
458216
+ return {
458217
+ physical: fallback.substituteFamily,
458218
+ reason: reasonForFallback2(fallback.policyAction)
458219
+ };
458220
+ }
458221
+ const sourceFace = fallback.faceSource?.kind === "synthetic" ? faceKeyForSlot2(fallback.faceSource.from) : face;
458222
+ if (!hasFace(fallback.substituteFamily, sourceFace.weight, sourceFace.style)) {
458223
+ return fallback.policyAction === "substitute" ? { physical: primary, reason: "fallback_face_absent" } : null;
458224
+ }
458225
+ const sourceDiffers = sourceFace.weight !== face.weight || sourceFace.style !== face.style;
458226
+ return {
458227
+ physical: fallback.substituteFamily,
458228
+ reason: reasonForFallback2(fallback.policyAction),
458229
+ ...sourceDiffers ? { sourceFace } : {}
458230
+ };
458231
+ }
457499
458232
  function deriveBundledSubstitutes2() {
457500
458233
  const substitutes = {};
457501
458234
  for (const row2 of SUBSTITUTION_EVIDENCE3) {
@@ -457618,14 +458351,10 @@ class FontResolver2 {
457618
458351
  if (hasFace(primary, face.weight, face.style)) {
457619
458352
  return { physical: primary, reason: "registered_face" };
457620
458353
  }
458354
+ const docfonts = resolveDocfontsFace2(primary, face, hasFace);
458355
+ if (docfonts)
458356
+ return docfonts;
457621
458357
  const bundled = BUNDLED_SUBSTITUTES2[key2];
457622
- if (bundled && hasFace(bundled, face.weight, face.style)) {
457623
- return { physical: bundled, reason: "bundled_substitute" };
457624
- }
457625
- const category = CATEGORY_FALLBACKS2[key2];
457626
- if (category && hasFace(category, face.weight, face.style)) {
457627
- return { physical: category, reason: "category_fallback" };
457628
- }
457629
458358
  if (override || bundled) {
457630
458359
  return { physical: primary, reason: "fallback_face_absent" };
457631
458360
  }
@@ -457651,8 +458380,13 @@ class FontResolver2 {
457651
458380
  resolveFace(logicalFamily, face, hasFace) {
457652
458381
  const parts = splitStack2(logicalFamily);
457653
458382
  const primary = parts[0] ?? logicalFamily;
457654
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
457655
- return { logicalFamily, physicalFamily: stripFamilyQuotes2(physical), reason };
458383
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
458384
+ return {
458385
+ logicalFamily,
458386
+ physicalFamily: stripFamilyQuotes2(physical),
458387
+ reason,
458388
+ ...sourceFace ? { sourceFace } : {}
458389
+ };
457656
458390
  }
457657
458391
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
457658
458392
  if (!cssFontFamily)
@@ -458111,11 +458845,12 @@ function deriveOfferings2() {
458111
458845
  });
458112
458846
  return Object.freeze(offerings);
458113
458847
  }
458114
- var BUNDLED_FAMILIES2, FONT_OFFERINGS2;
458848
+ var BUNDLED_FAMILIES2, ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES2, FONT_OFFERINGS2;
458115
458849
  var init_font_offerings = __esm(() => {
458116
458850
  init_substitution_evidence();
458117
458851
  init_bundled_manifest();
458118
458852
  BUNDLED_FAMILIES2 = new Set(BUNDLED_MANIFEST2.map((f2) => f2.family));
458853
+ ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES2 = new Set(["Cooper Black"]);
458119
458854
  FONT_OFFERINGS2 = deriveOfferings2();
458120
458855
  });
458121
458856