@superdoc-dev/mcp 0.12.0-next.1 → 0.12.0-next.10

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 +1474 -289
  2. package/package.json +2 -2
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-C6RGktKO.es.js
52175
+ // ../../packages/superdoc/dist/chunks/SuperConverter-BSDZ3hYr.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,42 +86315,80 @@ function isSettled(status) {
86315
86315
  function normalizeFamilyName(name) {
86316
86316
  return name.trim().replace(/^['"]+|['"]+$/g, "").trim().toLowerCase();
86317
86317
  }
86318
- function buildFallback(row, physicalFamily) {
86318
+ function buildFallback(row, physicalFamily, verdict, faceSlot, faceSource) {
86319
+ const glyphExceptions = faceSlot ? row.glyphExceptions?.filter((g) => g.slot === faceSlot) : row.glyphExceptions ? [...row.glyphExceptions] : undefined;
86319
86320
  return {
86320
86321
  substituteFamily: physicalFamily,
86321
86322
  policyAction: row.policyAction,
86322
- verdict: row.verdict,
86323
- lineBreakSafe: LINE_BREAK_SAFE_VERDICTS.has(row.verdict),
86324
- evidenceId: row.evidenceId
86323
+ verdict,
86324
+ lineBreakSafe: LINE_BREAK_SAFE_VERDICTS.has(verdict),
86325
+ faces: row.faces,
86326
+ evidenceId: row.evidenceId,
86327
+ generic: row.generic,
86328
+ ...faceSource ? { faceSource: { ...faceSource } } : {},
86329
+ ...glyphExceptions && glyphExceptions.length > 0 ? { glyphExceptions } : {}
86325
86330
  };
86326
86331
  }
86327
86332
  function decideRow(row, canRenderFamily$1) {
86328
- const { policyAction, physicalFamily, verdict, evidenceId } = row;
86333
+ const { policyAction, physicalFamily, verdict, evidenceId, generic } = row;
86329
86334
  if (policyAction === "preserve_only")
86330
86335
  return {
86331
86336
  kind: "preserve_only",
86332
- evidenceId
86337
+ evidenceId,
86338
+ generic
86333
86339
  };
86334
86340
  if (policyAction === "customer_supplied")
86335
86341
  return {
86336
86342
  kind: "customer_supplied",
86337
- evidenceId
86343
+ evidenceId,
86344
+ generic
86338
86345
  };
86339
86346
  if (physicalFamily === null)
86340
86347
  return {
86341
86348
  kind: "no_recommended_fallback",
86342
- evidenceId
86349
+ evidenceId,
86350
+ generic
86343
86351
  };
86344
86352
  if (canRenderFamily$1 && !canRenderFamily$1(physicalFamily))
86345
86353
  return {
86346
86354
  kind: "asset_missing",
86347
86355
  substituteFamily: physicalFamily,
86348
86356
  verdict,
86349
- evidenceId
86357
+ evidenceId,
86358
+ generic
86350
86359
  };
86351
86360
  return {
86352
86361
  kind: "fallback",
86353
- fallback: buildFallback(row, physicalFamily)
86362
+ fallback: buildFallback(row, physicalFamily, verdict)
86363
+ };
86364
+ }
86365
+ function isFaceScoped(row) {
86366
+ const f2 = row.faces;
86367
+ return f2.regular || f2.bold || f2.italic || f2.boldItalic;
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
+ }
86375
+ function decideRowForFace(row, face, canRenderFamily$1) {
86376
+ const base$1 = decideRow(row, canRenderFamily$1);
86377
+ if (base$1.kind !== "fallback")
86378
+ return base$1;
86379
+ const faceSource = faceSourceFor(row, face);
86380
+ if (isFaceScoped(row) && !faceSource)
86381
+ return {
86382
+ kind: "face_missing",
86383
+ substituteFamily: base$1.fallback.substituteFamily,
86384
+ evidenceId: row.evidenceId,
86385
+ generic: row.generic
86386
+ };
86387
+ const faceVerdict = row.faceVerdicts?.[face] ?? row.verdict;
86388
+ const projectedFaceSource = faceSource?.kind === "synthetic" ? faceSource : undefined;
86389
+ return {
86390
+ kind: "fallback",
86391
+ fallback: buildFallback(row, base$1.fallback.substituteFamily, faceVerdict, face, projectedFaceSource)
86354
86392
  };
86355
86393
  }
86356
86394
  function getFallbackDecision(family$1, options = {}) {
@@ -86361,6 +86399,14 @@ function getRenderableFallback(family$1, options) {
86361
86399
  const decision = getFallbackDecision(family$1, options);
86362
86400
  return decision.kind === "fallback" ? decision.fallback : null;
86363
86401
  }
86402
+ function getFallbackDecisionForFace(family$1, face, options = {}) {
86403
+ const row = BY_LOGICAL.get(normalizeFamilyName(family$1));
86404
+ return row ? decideRowForFace(row, face, options.canRenderFamily) : { kind: "unknown" };
86405
+ }
86406
+ function getRenderableFallbackForFace(family$1, face, options) {
86407
+ const decision = getFallbackDecisionForFace(family$1, face, options);
86408
+ return decision.kind === "fallback" ? decision.fallback : null;
86409
+ }
86364
86410
  function fourFaces(filePrefix) {
86365
86411
  return [
86366
86412
  {
@@ -86392,12 +86438,87 @@ function family(name, filePrefix, license) {
86392
86438
  faces: fourFaces(filePrefix)
86393
86439
  };
86394
86440
  }
86441
+ function familyWithFaces(name, license, faces) {
86442
+ return {
86443
+ family: name,
86444
+ license,
86445
+ faces
86446
+ };
86447
+ }
86395
86448
  function normalizeFamilyKey$1(family$1) {
86396
86449
  return family$1.trim().replace(/^["']|["']$/g, "").toLowerCase();
86397
86450
  }
86398
86451
  function sortPairs(pairs) {
86399
86452
  return pairs.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
86400
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
+ }
86401
86522
  function deriveBundledSubstitutes() {
86402
86523
  const substitutes = {};
86403
86524
  for (const row of SUBSTITUTION_EVIDENCE) {
@@ -86491,6 +86612,17 @@ function installBundledSubstitutes(registry2, options = {}) {
86491
86612
  });
86492
86613
  }
86493
86614
  }
86615
+ function toEvidence(fallback) {
86616
+ if (!fallback)
86617
+ return;
86618
+ return {
86619
+ evidenceId: fallback.evidenceId,
86620
+ policyAction: fallback.policyAction,
86621
+ verdict: fallback.verdict,
86622
+ lineBreakSafe: fallback.lineBreakSafe,
86623
+ ...fallback.glyphExceptions ? { glyphExceptions: fallback.glyphExceptions } : {}
86624
+ };
86625
+ }
86494
86626
  function buildFontReport(logicalFamilies, registry2, resolver$1) {
86495
86627
  const seen = /* @__PURE__ */ new Set;
86496
86628
  const report = [];
@@ -86500,13 +86632,15 @@ function buildFontReport(logicalFamilies, registry2, resolver$1) {
86500
86632
  seen.add(logical);
86501
86633
  const { physicalFamily, reason } = resolver$1 ? resolver$1.resolveFontFamily(logical) : resolveFontFamily(logical);
86502
86634
  const loadStatus = registry2.getStatus(physicalFamily);
86635
+ const evidence = isRenderedSubstitute(reason) ? toEvidence(getRenderableFallback(logical, RENDER_ALL)) : undefined;
86503
86636
  report.push({
86504
86637
  logicalFamily: logical,
86505
86638
  physicalFamily,
86506
86639
  reason,
86507
86640
  loadStatus,
86508
86641
  exportFamily: logical,
86509
- missing: reason === "category_fallback" || isSettled(loadStatus) && loadStatus !== "loaded"
86642
+ missing: reason === "category_fallback" || isSettled(loadStatus) && loadStatus !== "loaded",
86643
+ ...evidence ? { evidence } : {}
86510
86644
  });
86511
86645
  }
86512
86646
  return report;
@@ -86526,13 +86660,16 @@ function buildFaceReport(usedFaces, registry2, resolver$1) {
86526
86660
  weight,
86527
86661
  style
86528
86662
  };
86529
- 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;
86530
86666
  const loadStatus = registry2.getFaceStatus({
86531
86667
  family: physicalFamily,
86532
- weight,
86533
- style
86668
+ weight: statusFace.weight,
86669
+ style: statusFace.style
86534
86670
  });
86535
86671
  const missing = reason === "fallback_face_absent" || reason === "category_fallback" || isSettled(loadStatus) && loadStatus !== "loaded";
86672
+ const evidence = isRenderedSubstitute(reason) ? toEvidence(getRenderableFallbackForFace(logicalFamily, faceSlotFor(face), RENDER_ALL)) : undefined;
86536
86673
  report.push({
86537
86674
  logicalFamily,
86538
86675
  physicalFamily: reason === "registered_face" ? logicalFamily : physicalFamily,
@@ -86540,7 +86677,8 @@ function buildFaceReport(usedFaces, registry2, resolver$1) {
86540
86677
  loadStatus,
86541
86678
  exportFamily: logicalFamily,
86542
86679
  missing,
86543
- face
86680
+ face,
86681
+ ...evidence ? { evidence } : {}
86544
86682
  });
86545
86683
  }
86546
86684
  return report;
@@ -86643,7 +86781,7 @@ function deriveOfferings() {
86643
86781
  return {
86644
86782
  logicalFamily: row.logicalFamily,
86645
86783
  physicalFamily: row.physicalFamily,
86646
- generic: row.physicalFamily && PHYSICAL_GENERIC[row.physicalFamily] || "sans-serif",
86784
+ generic: row.generic,
86647
86785
  offering: classifyOffering(row.policyAction, row.verdict, row.physicalFamily, bundled),
86648
86786
  bundled,
86649
86787
  verdict: row.verdict,
@@ -86652,12 +86790,11 @@ function deriveOfferings() {
86652
86790
  });
86653
86791
  return Object.freeze(offerings);
86654
86792
  }
86655
- function getDefaultFontOfferings() {
86656
- const rank$1 = (name) => {
86657
- const i$1 = DEFAULT_FONT_ORDER.indexOf(name);
86658
- return i$1 === -1 ? DEFAULT_FONT_ORDER.length : i$1;
86659
- };
86660
- return FONT_OFFERINGS.filter((o) => o.offering === "default").sort((a, b) => rank$1(a.logicalFamily) - rank$1(b.logicalFamily));
86793
+ function compareLogicalFamily(a, b) {
86794
+ return a.logicalFamily.localeCompare(b.logicalFamily, "en", { sensitivity: "base" });
86795
+ }
86796
+ function getBuiltInToolbarFontOfferings() {
86797
+ return FONT_OFFERINGS.filter((o) => o.offering === "default" || o.bundled && ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES.has(o.logicalFamily) && (o.offering === "qualified" || o.offering === "category_fallback")).sort(compareLogicalFamily);
86661
86798
  }
86662
86799
  function fontOfferingStack(offering) {
86663
86800
  return `${offering.logicalFamily}, ${offering.generic}`;
@@ -86666,11 +86803,38 @@ function fontOfferingRenderStack(offering) {
86666
86803
  return offering.physicalFamily ? `${offering.physicalFamily}, ${offering.generic}` : fontOfferingStack(offering);
86667
86804
  }
86668
86805
  function getDefaultFontFamilyOptions() {
86669
- return getDefaultFontOfferings().map((offering) => ({
86806
+ return getBuiltInToolbarFontOfferings().map((offering) => ({
86670
86807
  label: offering.logicalFamily,
86671
86808
  value: fontOfferingStack(offering)
86672
86809
  }));
86673
86810
  }
86811
+ function normalizeKey(family$1) {
86812
+ return family$1.trim().replace(/^["']|["']$/g, "").toLowerCase();
86813
+ }
86814
+ function isRegularFace(rec) {
86815
+ return rec.face?.weight === "400" && rec.face?.style === "normal";
86816
+ }
86817
+ function buildDocumentFontOptions(usedFaces, registry2, resolver$1) {
86818
+ const faceRecords = buildFaceReport(usedFaces, registry2, resolver$1);
86819
+ const agg = /* @__PURE__ */ new Map;
86820
+ for (const rec of faceRecords) {
86821
+ const key = normalizeKey(rec.logicalFamily);
86822
+ const existing = agg.get(key);
86823
+ if (!existing) {
86824
+ agg.set(key, rec);
86825
+ continue;
86826
+ }
86827
+ if (isRegularFace(rec) && !isRegularFace(existing))
86828
+ agg.set(key, rec);
86829
+ }
86830
+ const options = [];
86831
+ for (const rep of agg.values())
86832
+ options.push({
86833
+ logicalFamily: rep.logicalFamily,
86834
+ previewFamily: rep.physicalFamily
86835
+ });
86836
+ return options;
86837
+ }
86674
86838
  function writeAppStatistics(convertedXml, stats) {
86675
86839
  const elements = ensureElements$1(ensureAppPropertiesRoot(convertedXml));
86676
86840
  upsertSimpleElement(elements, "Words", String(stats.words));
@@ -88660,12 +88824,14 @@ function applyTocMetadata(blocks, metadata) {
88660
88824
  };
88661
88825
  if (metadata.instruction)
88662
88826
  block.attrs.tocInstruction = metadata.instruction;
88827
+ if (metadata.tocId)
88828
+ block.attrs.tocId = metadata.tocId;
88663
88829
  }
88664
88830
  });
88665
88831
  }
88666
88832
  function processTocChildren(children, metadata, context, outputArrays) {
88667
88833
  const paragraphConverter = context.converters.paragraphToFlowBlocks;
88668
- const { docPartGallery, docPartObjectId, tocInstruction } = metadata;
88834
+ const { docPartGallery, docPartObjectId, tocInstruction, tocId } = metadata;
88669
88835
  const { blocks, recordBlockKind } = outputArrays;
88670
88836
  children.forEach((child) => {
88671
88837
  if (child.type === "paragraph") {
@@ -88690,7 +88856,8 @@ function processTocChildren(children, metadata, context, outputArrays) {
88690
88856
  applyTocMetadata(paragraphBlocks, {
88691
88857
  gallery: docPartGallery,
88692
88858
  uniqueId: docPartObjectId,
88693
- instruction: tocInstruction
88859
+ instruction: tocInstruction,
88860
+ tocId
88694
88861
  });
88695
88862
  applySdtMetadataToParagraphBlocks(paragraphBlocks.filter((b) => b.kind === "paragraph"), metadata.sdtMetadata);
88696
88863
  paragraphBlocks.forEach((block) => {
@@ -88705,7 +88872,8 @@ function processTocChildren(children, metadata, context, outputArrays) {
88705
88872
  docPartGallery,
88706
88873
  docPartObjectId,
88707
88874
  tocInstruction: finalInstruction,
88708
- sdtMetadata: metadata.sdtMetadata
88875
+ sdtMetadata: metadata.sdtMetadata,
88876
+ tocId
88709
88877
  }, context, outputArrays);
88710
88878
  }
88711
88879
  });
@@ -88713,7 +88881,11 @@ function processTocChildren(children, metadata, context, outputArrays) {
88713
88881
  function handleTableOfContentsNode(node2, context) {
88714
88882
  if (!Array.isArray(node2.content))
88715
88883
  return;
88716
- 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
+ }, {
88717
88889
  nextBlockId: context.nextBlockId,
88718
88890
  positions: context.positions,
88719
88891
  bookmarks: context.bookmarks,
@@ -89042,7 +89214,8 @@ function processDocumentPartObject(child, sectionMetadata, context, output, conv
89042
89214
  docPartGallery,
89043
89215
  docPartObjectId,
89044
89216
  tocInstruction,
89045
- sdtMetadata: docPartSdtMetadata
89217
+ sdtMetadata: docPartSdtMetadata,
89218
+ tocId: docPartObjectId ?? undefined
89046
89219
  }, {
89047
89220
  nextBlockId: context.nextBlockId,
89048
89221
  positions: context.positions,
@@ -89113,12 +89286,15 @@ function handleDocumentPartObjectNode(node2, context) {
89113
89286
  const tocInstruction = getNodeInstruction(node2);
89114
89287
  const docPartSdtMetadata = resolveNodeSdtMetadata(node2, "docPartObject");
89115
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;
89116
89291
  if (docPartGallery === "Table of Contents")
89117
89292
  processTocChildren(Array.from(node2.content), {
89118
89293
  docPartGallery,
89119
89294
  docPartObjectId,
89120
89295
  tocInstruction,
89121
- sdtMetadata: docPartSdtMetadata
89296
+ sdtMetadata: docPartSdtMetadata,
89297
+ tocId
89122
89298
  }, {
89123
89299
  nextBlockId,
89124
89300
  positions,
@@ -89166,7 +89342,8 @@ function handleDocumentPartObjectNode(node2, context) {
89166
89342
  docPartGallery: docPartGallery ?? "",
89167
89343
  docPartObjectId,
89168
89344
  tocInstruction: getNodeInstruction(child) ?? tocInstruction,
89169
- sdtMetadata: docPartSdtMetadata
89345
+ sdtMetadata: docPartSdtMetadata,
89346
+ tocId
89170
89347
  };
89171
89348
  const tocContext = {
89172
89349
  nextBlockId,
@@ -113559,18 +113736,10 @@ var isRegExp = (value) => {
113559
113736
  physical: primary,
113560
113737
  reason: "registered_face"
113561
113738
  };
113739
+ const docfonts = resolveDocfontsFace(primary, face, hasFace);
113740
+ if (docfonts)
113741
+ return docfonts;
113562
113742
  const bundled = BUNDLED_SUBSTITUTES[key];
113563
- if (bundled && hasFace(bundled, face.weight, face.style))
113564
- return {
113565
- physical: bundled,
113566
- reason: "bundled_substitute"
113567
- };
113568
- const category = CATEGORY_FALLBACKS[key];
113569
- if (category && hasFace(category, face.weight, face.style))
113570
- return {
113571
- physical: category,
113572
- reason: "category_fallback"
113573
- };
113574
113743
  if (override || bundled)
113575
113744
  return {
113576
113745
  physical: primary,
@@ -113603,11 +113772,12 @@ var isRegExp = (value) => {
113603
113772
  }
113604
113773
  resolveFace(logicalFamily, face, hasFace) {
113605
113774
  const primary = splitStack(logicalFamily)[0] ?? logicalFamily;
113606
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
113775
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
113607
113776
  return {
113608
113777
  logicalFamily,
113609
113778
  physicalFamily: stripFamilyQuotes(physical),
113610
- reason
113779
+ reason,
113780
+ ...sourceFace ? { sourceFace } : {}
113611
113781
  };
113612
113782
  }
113613
113783
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
@@ -113632,7 +113802,17 @@ var isRegExp = (value) => {
113632
113802
  out.add(this.resolvePrimaryPhysicalFamily(family$1));
113633
113803
  return [...out];
113634
113804
  }
113635
- }, defaultResolver, DEFAULT_FONT_MEASURE_CONTEXT, fontConfigVersion = 0, defaultAssetBase = "/fonts/", installedRegistries, FS_TYPE_RESTRICTED = 2, FS_SELECTION_ITALIC = 1, BOLD_WEIGHT_THRESHOLD = 600, SFNT_TABLE_DIR_OFFSET = 12, SFNT_TABLE_RECORD_SIZE = 16, OS2_USWEIGHTCLASS = 4, OS2_FSTYPE = 8, OS2_FSSELECTION = 62, OS2_MIN_LENGTH, DEFAULT_FONT_LOAD_TIMEOUT_MS = 3000, DEFAULT_PROBE_SIZE = "16px", FontRegistry = class {
113805
+ }, defaultResolver, DEFAULT_FONT_MEASURE_CONTEXT, fontConfigVersion = 0, defaultAssetBase = "/fonts/", installedRegistries, faceSlotFor = ({ weight, style }) => {
113806
+ const bold = weight === "700";
113807
+ const italic = style === "italic";
113808
+ if (bold && italic)
113809
+ return "boldItalic";
113810
+ if (bold)
113811
+ return "bold";
113812
+ if (italic)
113813
+ return "italic";
113814
+ return "regular";
113815
+ }, isRenderedSubstitute = (reason) => reason === "bundled_substitute" || reason === "category_fallback", RENDER_ALL, FS_TYPE_RESTRICTED = 2, FS_SELECTION_ITALIC = 1, BOLD_WEIGHT_THRESHOLD = 600, SFNT_TABLE_DIR_OFFSET = 12, SFNT_TABLE_RECORD_SIZE = 16, OS2_USWEIGHTCLASS = 4, OS2_FSTYPE = 8, OS2_FSSELECTION = 62, OS2_MIN_LENGTH, DEFAULT_FONT_LOAD_TIMEOUT_MS = 3000, DEFAULT_PROBE_SIZE = "16px", FontRegistry = class {
113636
113816
  #fontSet;
113637
113817
  #FontFaceCtor;
113638
113818
  #probeSize;
@@ -113973,7 +114153,7 @@ var isRegExp = (value) => {
113973
114153
  const detail = sources && sources.length ? ` from ${sources.join(", ")}` : "";
113974
114154
  console.warn(`[superdoc] font asset failed to load for "${family$1}"${detail}. Check fonts.assetBaseUrl / fonts.resolveAssetUrl so the bundled .woff2 are served.`);
113975
114155
  }
113976
- }, registriesByFontSet, domlessRegistry = null, PHYSICAL_GENERIC, BUNDLED_FAMILIES, FONT_OFFERINGS, DEFAULT_FONT_ORDER, prepareCommentParaIds = (comment) => {
114156
+ }, registriesByFontSet, domlessRegistry = null, BUNDLED_FAMILIES, ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES, FONT_OFFERINGS, prepareCommentParaIds = (comment) => {
113977
114157
  return {
113978
114158
  ...comment,
113979
114159
  commentParaId: generateDocxRandomId()
@@ -117949,7 +118129,7 @@ var isRegExp = (value) => {
117949
118129
  state.kern = kernNode.attributes["w:val"];
117950
118130
  }
117951
118131
  }, SuperConverter;
117952
- var init_SuperConverter_C6RGktKO_es = __esm(() => {
118132
+ var init_SuperConverter_BSDZ3hYr_es = __esm(() => {
117953
118133
  init_rolldown_runtime_Bg48TavK_es();
117954
118134
  init_jszip_C49i9kUs_es();
117955
118135
  init_xml_js_CqGKpaft_es();
@@ -155269,6 +155449,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155269
155449
  SUBSTITUTION_EVIDENCE$1 = [
155270
155450
  {
155271
155451
  evidenceId: "calibri",
155452
+ generic: "sans-serif",
155272
155453
  logicalFamily: "Calibri",
155273
155454
  physicalFamily: "Carlito",
155274
155455
  verdict: "metric_safe",
@@ -155288,6 +155469,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155288
155469
  measurementRefs: ["calibri__carlito#analytic_advance#2026-06-03", "calibri__carlito#face_aggregate#2026-06-03"],
155289
155470
  exportRule: "preserve_original_name",
155290
155471
  advance: {
155472
+ basis: "latin_full",
155291
155473
  meanDelta: 0,
155292
155474
  maxDelta: 0
155293
155475
  },
@@ -155295,6 +155477,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155295
155477
  },
155296
155478
  {
155297
155479
  evidenceId: "cambria",
155480
+ generic: "serif",
155298
155481
  logicalFamily: "Cambria",
155299
155482
  physicalFamily: "Caladea",
155300
155483
  verdict: "visual_only",
@@ -155319,6 +155502,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155319
155502
  ],
155320
155503
  exportRule: "preserve_original_name",
155321
155504
  advance: {
155505
+ basis: "latin_full",
155322
155506
  meanDelta: 0.0002378,
155323
155507
  maxDelta: 0.2310758
155324
155508
  },
@@ -155338,6 +155522,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155338
155522
  },
155339
155523
  {
155340
155524
  evidenceId: "arial",
155525
+ generic: "sans-serif",
155341
155526
  logicalFamily: "Arial",
155342
155527
  physicalFamily: "Liberation Sans",
155343
155528
  verdict: "metric_safe",
@@ -155357,6 +155542,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155357
155542
  measurementRefs: ["arial__liberation-sans#analytic_advance#2026-06-03"],
155358
155543
  exportRule: "preserve_original_name",
155359
155544
  advance: {
155545
+ basis: "latin_full",
155360
155546
  meanDelta: 0,
155361
155547
  maxDelta: 0
155362
155548
  },
@@ -155364,6 +155550,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155364
155550
  },
155365
155551
  {
155366
155552
  evidenceId: "times-new-roman",
155553
+ generic: "serif",
155367
155554
  logicalFamily: "Times New Roman",
155368
155555
  physicalFamily: "Liberation Serif",
155369
155556
  verdict: "metric_safe",
@@ -155383,6 +155570,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155383
155570
  measurementRefs: ["times-new-roman__liberation-serif#analytic_advance#2026-06-03"],
155384
155571
  exportRule: "preserve_original_name",
155385
155572
  advance: {
155573
+ basis: "latin_full",
155386
155574
  meanDelta: 0,
155387
155575
  maxDelta: 0
155388
155576
  },
@@ -155390,6 +155578,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155390
155578
  },
155391
155579
  {
155392
155580
  evidenceId: "courier-new",
155581
+ generic: "monospace",
155393
155582
  logicalFamily: "Courier New",
155394
155583
  physicalFamily: "Liberation Mono",
155395
155584
  verdict: "metric_safe",
@@ -155409,6 +155598,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155409
155598
  measurementRefs: ["courier-new__liberation-mono#analytic_advance#2026-06-03"],
155410
155599
  exportRule: "preserve_original_name",
155411
155600
  advance: {
155601
+ basis: "latin_full",
155412
155602
  meanDelta: 0,
155413
155603
  maxDelta: 0
155414
155604
  },
@@ -155416,6 +155606,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155416
155606
  },
155417
155607
  {
155418
155608
  evidenceId: "georgia",
155609
+ generic: "serif",
155419
155610
  logicalFamily: "Georgia",
155420
155611
  physicalFamily: "Gelasio",
155421
155612
  verdict: "near_metric",
@@ -155444,6 +155635,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155444
155635
  ],
155445
155636
  exportRule: "preserve_original_name",
155446
155637
  advance: {
155638
+ basis: "latin_full",
155447
155639
  meanDelta: 0.0000197,
155448
155640
  maxDelta: 0.0183727
155449
155641
  },
@@ -155468,6 +155660,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155468
155660
  },
155469
155661
  {
155470
155662
  evidenceId: "arial-narrow",
155663
+ generic: "sans-serif",
155471
155664
  logicalFamily: "Arial Narrow",
155472
155665
  physicalFamily: "Liberation Sans Narrow",
155473
155666
  verdict: "visual_only",
@@ -155492,6 +155685,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155492
155685
  ],
155493
155686
  exportRule: "preserve_original_name",
155494
155687
  advance: {
155688
+ basis: "latin_full",
155495
155689
  meanDelta: 0,
155496
155690
  maxDelta: 0.5
155497
155691
  },
@@ -155511,6 +155705,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155511
155705
  },
155512
155706
  {
155513
155707
  evidenceId: "aptos",
155708
+ generic: "sans-serif",
155514
155709
  logicalFamily: "Aptos",
155515
155710
  physicalFamily: null,
155516
155711
  verdict: "no_substitute",
@@ -155531,8 +155726,134 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155531
155726
  exportRule: "preserve_original_name",
155532
155727
  candidateLicense: null
155533
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
+ },
155534
155854
  {
155535
155855
  evidenceId: "consolas",
155856
+ generic: "monospace",
155536
155857
  logicalFamily: "Consolas",
155537
155858
  physicalFamily: "Inconsolata SemiExpanded",
155538
155859
  verdict: "cell_width_only",
@@ -155552,6 +155873,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155552
155873
  measurementRefs: ["consolas__inconsolata-semiexpanded#analytic_advance#2026-06-03"],
155553
155874
  exportRule: "preserve_original_name",
155554
155875
  advance: {
155876
+ basis: "monospace_cell",
155555
155877
  meanDelta: 0.00035999999999999997,
155556
155878
  maxDelta: 0.00035999999999999997
155557
155879
  },
@@ -155559,6 +155881,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155559
155881
  },
155560
155882
  {
155561
155883
  evidenceId: "verdana",
155884
+ generic: "sans-serif",
155562
155885
  logicalFamily: "Verdana",
155563
155886
  physicalFamily: null,
155564
155887
  verdict: "visual_only",
@@ -155581,76 +155904,90 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155581
155904
  },
155582
155905
  {
155583
155906
  evidenceId: "tahoma",
155907
+ generic: "sans-serif",
155584
155908
  logicalFamily: "Tahoma",
155585
- physicalFamily: null,
155909
+ physicalFamily: "Noto Sans",
155586
155910
  verdict: "visual_only",
155587
155911
  faces: {
155588
- regular: false,
155589
- bold: false,
155590
- italic: false,
155591
- boldItalic: false
155912
+ regular: true,
155913
+ bold: true,
155914
+ italic: true,
155915
+ boldItalic: true
155592
155916
  },
155593
155917
  gates: {
155594
- static: "not_run",
155918
+ static: "pass",
155595
155919
  metric: "fail",
155596
155920
  layout: "not_run",
155597
- ship: "not_run"
155921
+ ship: "fail"
155598
155922
  },
155599
155923
  policyAction: "category_fallback",
155600
- measurementRefs: ["tahoma#top_candidates#2026-06-03"],
155924
+ measurementRefs: ["tahoma__noto-sans#visual_review#2026-06-09"],
155601
155925
  exportRule: "preserve_original_name",
155602
- candidateLicense: null
155926
+ candidateLicense: "OFL-1.1"
155603
155927
  },
155604
155928
  {
155605
155929
  evidenceId: "trebuchet-ms",
155930
+ generic: "sans-serif",
155606
155931
  logicalFamily: "Trebuchet MS",
155607
- physicalFamily: null,
155932
+ physicalFamily: "PT Sans",
155608
155933
  verdict: "visual_only",
155609
155934
  faces: {
155610
- regular: false,
155611
- bold: false,
155612
- italic: false,
155613
- boldItalic: false
155935
+ regular: true,
155936
+ bold: true,
155937
+ italic: true,
155938
+ boldItalic: true
155614
155939
  },
155615
155940
  gates: {
155616
- static: "not_run",
155941
+ static: "pass",
155617
155942
  metric: "fail",
155618
155943
  layout: "not_run",
155619
- ship: "not_run"
155944
+ ship: "fail"
155620
155945
  },
155621
155946
  policyAction: "category_fallback",
155622
- measurementRefs: ["trebuchet-ms#top_candidates#2026-06-03"],
155947
+ measurementRefs: ["trebuchet-ms__pt-sans#visual_review#2026-06-09"],
155623
155948
  exportRule: "preserve_original_name",
155624
- candidateLicense: null
155949
+ candidateLicense: "OFL-1.1"
155625
155950
  },
155626
155951
  {
155627
155952
  evidenceId: "comic-sans-ms",
155953
+ generic: "sans-serif",
155628
155954
  logicalFamily: "Comic Sans MS",
155629
- physicalFamily: "Comic Neue",
155955
+ physicalFamily: "Comic Relief",
155630
155956
  verdict: "visual_only",
155631
155957
  faces: {
155632
- regular: false,
155633
- bold: false,
155958
+ regular: true,
155959
+ bold: true,
155634
155960
  italic: false,
155635
155961
  boldItalic: false
155636
155962
  },
155963
+ faceSources: {
155964
+ italic: {
155965
+ kind: "synthetic",
155966
+ from: "regular"
155967
+ },
155968
+ boldItalic: {
155969
+ kind: "synthetic",
155970
+ from: "bold"
155971
+ }
155972
+ },
155637
155973
  gates: {
155638
- static: "not_run",
155974
+ static: "pass",
155639
155975
  metric: "fail",
155640
155976
  layout: "not_run",
155641
- ship: "not_run"
155977
+ ship: "fail"
155642
155978
  },
155643
155979
  policyAction: "category_fallback",
155644
- measurementRefs: ["comic-sans-ms__comic-neue#analytic_advance#2026-06-03"],
155980
+ measurementRefs: ["comic-sans-ms__comic-relief#visual_review#2026-06-09"],
155645
155981
  exportRule: "preserve_original_name",
155646
- advance: {
155647
- meanDelta: 0.1005,
155648
- maxDelta: 0.1419
155649
- },
155650
- candidateLicense: "OFL-1.1"
155982
+ candidateLicense: "OFL-1.1",
155983
+ faceVerdicts: {
155984
+ italic: "visual_only",
155985
+ boldItalic: "visual_only"
155986
+ }
155651
155987
  },
155652
155988
  {
155653
155989
  evidenceId: "candara",
155990
+ generic: "sans-serif",
155654
155991
  logicalFamily: "Candara",
155655
155992
  physicalFamily: null,
155656
155993
  verdict: "visual_only",
@@ -155673,6 +156010,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155673
156010
  },
155674
156011
  {
155675
156012
  evidenceId: "constantia",
156013
+ generic: "serif",
155676
156014
  logicalFamily: "Constantia",
155677
156015
  physicalFamily: null,
155678
156016
  verdict: "visual_only",
@@ -155695,6 +156033,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155695
156033
  },
155696
156034
  {
155697
156035
  evidenceId: "corbel",
156036
+ generic: "sans-serif",
155698
156037
  logicalFamily: "Corbel",
155699
156038
  physicalFamily: null,
155700
156039
  verdict: "visual_only",
@@ -155717,6 +156056,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155717
156056
  },
155718
156057
  {
155719
156058
  evidenceId: "lucida-console",
156059
+ generic: "monospace",
155720
156060
  logicalFamily: "Lucida Console",
155721
156061
  physicalFamily: "Cousine",
155722
156062
  verdict: "cell_width_only",
@@ -155736,13 +156076,54 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155736
156076
  measurementRefs: ["lucida-console__cousine#analytic_advance#2026-06-03"],
155737
156077
  exportRule: "preserve_original_name",
155738
156078
  advance: {
156079
+ basis: "monospace_cell",
155739
156080
  meanDelta: 0.004050000000000001,
155740
156081
  maxDelta: 0.004050000000000001
155741
156082
  },
155742
156083
  candidateLicense: "OFL-1.1"
155743
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
+ },
155744
156124
  {
155745
156125
  evidenceId: "aptos-display",
156126
+ generic: "sans-serif",
155746
156127
  logicalFamily: "Aptos Display",
155747
156128
  physicalFamily: null,
155748
156129
  verdict: "customer_supplied",
@@ -155764,6 +156145,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155764
156145
  },
155765
156146
  {
155766
156147
  evidenceId: "cambria-math",
156148
+ generic: "serif",
155767
156149
  logicalFamily: "Cambria Math",
155768
156150
  physicalFamily: null,
155769
156151
  verdict: "preserve_only",
@@ -155785,6 +156167,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155785
156167
  },
155786
156168
  {
155787
156169
  evidenceId: "helvetica",
156170
+ generic: "sans-serif",
155788
156171
  logicalFamily: "Helvetica",
155789
156172
  physicalFamily: "Liberation Sans",
155790
156173
  verdict: "metric_safe",
@@ -155804,6 +156187,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155804
156187
  measurementRefs: ["helvetica__liberation-sans#analytic_advance#2026-06-03"],
155805
156188
  exportRule: "preserve_original_name",
155806
156189
  advance: {
156190
+ basis: "latin_full",
155807
156191
  meanDelta: 0,
155808
156192
  maxDelta: 0
155809
156193
  },
@@ -155811,6 +156195,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155811
156195
  },
155812
156196
  {
155813
156197
  evidenceId: "calibri-light",
156198
+ generic: "sans-serif",
155814
156199
  logicalFamily: "Calibri Light",
155815
156200
  physicalFamily: "Carlito",
155816
156201
  verdict: "visual_only",
@@ -155830,6 +156215,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155830
156215
  measurementRefs: ["calibri-light__carlito#analytic_advance#2026-06-05"],
155831
156216
  exportRule: "preserve_original_name",
155832
156217
  advance: {
156218
+ basis: "latin_full",
155833
156219
  meanDelta: 0.0148,
155834
156220
  maxDelta: 0.066
155835
156221
  },
@@ -155837,6 +156223,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155837
156223
  },
155838
156224
  {
155839
156225
  evidenceId: "baskerville-old-face",
156226
+ generic: "serif",
155840
156227
  logicalFamily: "Baskerville Old Face",
155841
156228
  physicalFamily: "Bacasime Antique",
155842
156229
  verdict: "visual_only",
@@ -155856,6 +156243,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155856
156243
  measurementRefs: ["baskerville-old-face_regular__bacasime-antique#regular#w400#7dac1e5f#analytic_advance#2026-06-05"],
155857
156244
  exportRule: "preserve_original_name",
155858
156245
  advance: {
156246
+ basis: "latin_full",
155859
156247
  meanDelta: 0,
155860
156248
  maxDelta: 0.4915590863952334
155861
156249
  },
@@ -155867,6 +156255,54 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155867
156255
  advanceDelta: 0.4916,
155868
156256
  note: "Bacasime Antique Regular's no-break space (U+00A0) advance diverges ~49% from Baskerville Old Face; lines containing NBSP reflow. Every other Latin-core glyph is advance-identical, which is why this is visual_only with a single named exception, not near_metric."
155869
156257
  }]
156258
+ },
156259
+ {
156260
+ evidenceId: "cooper-black",
156261
+ generic: "serif",
156262
+ logicalFamily: "Cooper Black",
156263
+ physicalFamily: "Caprasimo",
156264
+ verdict: "visual_only",
156265
+ faces: {
156266
+ regular: true,
156267
+ bold: false,
156268
+ italic: false,
156269
+ boldItalic: false
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
+ },
156285
+ gates: {
156286
+ static: "pass",
156287
+ metric: "pass",
156288
+ layout: "not_run",
156289
+ ship: "not_run"
156290
+ },
156291
+ policyAction: "substitute",
156292
+ measurementRefs: ["cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05", "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"],
156293
+ exportRule: "preserve_original_name",
156294
+ advance: {
156295
+ basis: "latin_full",
156296
+ meanDelta: 0,
156297
+ maxDelta: 0
156298
+ },
156299
+ candidateLicense: "OFL-1.1",
156300
+ faceVerdicts: {
156301
+ regular: "metric_safe",
156302
+ bold: "visual_only",
156303
+ italic: "visual_only",
156304
+ boldItalic: "visual_only"
156305
+ }
155870
156306
  }
155871
156307
  ];
155872
156308
  LINE_BREAK_SAFE_VERDICTS = new Set([
@@ -155880,7 +156316,41 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155880
156316
  family("Caladea", "Caladea", "Apache-2.0"),
155881
156317
  family("Liberation Sans", "LiberationSans", "OFL-1.1"),
155882
156318
  family("Liberation Serif", "LiberationSerif", "OFL-1.1"),
155883
- 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
+ }]),
156325
+ family("Gelasio", "Gelasio", "OFL-1.1"),
156326
+ familyWithFaces("Cardo", "OFL-1.1", [
156327
+ {
156328
+ weight: "normal",
156329
+ style: "normal",
156330
+ file: "Cardo-Regular.woff2"
156331
+ },
156332
+ {
156333
+ weight: "bold",
156334
+ style: "normal",
156335
+ file: "Cardo-Bold.woff2"
156336
+ },
156337
+ {
156338
+ weight: "normal",
156339
+ style: "italic",
156340
+ file: "Cardo-Italic.woff2"
156341
+ }
156342
+ ]),
156343
+ familyWithFaces("Comic Relief", "OFL-1.1", [{
156344
+ weight: "normal",
156345
+ style: "normal",
156346
+ file: "ComicRelief-Regular.woff2"
156347
+ }, {
156348
+ weight: "bold",
156349
+ style: "normal",
156350
+ file: "ComicRelief-Bold.woff2"
156351
+ }]),
156352
+ family("Noto Sans", "NotoSans", "OFL-1.1"),
156353
+ family("PT Sans", "PTSans", "OFL-1.1")
155884
156354
  ]);
155885
156355
  SUBSTITUTION_EVIDENCE = SUBSTITUTION_EVIDENCE$1;
155886
156356
  bundledFamilies = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
@@ -155892,24 +156362,19 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155892
156362
  fontSignature: ""
155893
156363
  });
155894
156364
  installedRegistries = /* @__PURE__ */ new WeakMap;
156365
+ RENDER_ALL = { canRenderFamily: () => true };
155895
156366
  OS2_MIN_LENGTH = OS2_FSSELECTION + 2;
155896
156367
  registriesByFontSet = /* @__PURE__ */ new WeakMap;
155897
- PHYSICAL_GENERIC = Object.freeze({
155898
- Carlito: "sans-serif",
155899
- Caladea: "serif",
155900
- "Liberation Sans": "sans-serif",
155901
- "Liberation Serif": "serif",
155902
- "Liberation Mono": "monospace"
155903
- });
155904
156368
  BUNDLED_FAMILIES = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
156369
+ ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES = new Set([
156370
+ "Cooper Black",
156371
+ "Comic Sans MS",
156372
+ "Garamond",
156373
+ "Georgia",
156374
+ "Tahoma",
156375
+ "Trebuchet MS"
156376
+ ]);
155905
156377
  FONT_OFFERINGS = deriveOfferings();
155906
- DEFAULT_FONT_ORDER = [
155907
- "Calibri",
155908
- "Arial",
155909
- "Courier New",
155910
- "Times New Roman",
155911
- "Helvetica"
155912
- ];
155913
156378
  ALL_COMMENT_TARGETS = COMMENT_FILE_BASENAMES;
155914
156379
  REL_ID_NUMERIC_PATTERN = /rId|mi/g;
155915
156380
  FOOTNOTES_CONFIG$1 = {
@@ -157696,7 +158161,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
157696
158161
  };
157697
158162
  });
157698
158163
 
157699
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-D7rUpTS1.es.js
158164
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-CKZ579SH.es.js
157700
158165
  function parseSizeUnit(val = "0") {
157701
158166
  const length = val.toString() || "0";
157702
158167
  const value = Number.parseFloat(length);
@@ -168054,8 +168519,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, normalizeActorId = (value) => {
168054
168519
  }
168055
168520
  };
168056
168521
  };
168057
- var init_create_headless_toolbar_D7rUpTS1_es = __esm(() => {
168058
- init_SuperConverter_C6RGktKO_es();
168522
+ var init_create_headless_toolbar_CKZ579SH_es = __esm(() => {
168523
+ init_SuperConverter_BSDZ3hYr_es();
168059
168524
  init_uuid_B2wVPhPi_es();
168060
168525
  init_constants_D9qj59G2_es();
168061
168526
  init_dist_B8HfvhaK_es();
@@ -209096,7 +209561,7 @@ If you want to remount the same app, move your app creation logic into a factory
209096
209561
  var createVNodeWithArgsTransform = (...args2) => {
209097
209562
  return _createVNode(...vnodeArgsTransformer ? vnodeArgsTransformer(args2, currentRenderingInstance) : args2);
209098
209563
  };
209099
- var normalizeKey = ({ key: key2 }) => key2 != null ? key2 : null;
209564
+ var normalizeKey2 = ({ key: key2 }) => key2 != null ? key2 : null;
209100
209565
  var normalizeRef = ({
209101
209566
  ref: ref2,
209102
209567
  ref_key,
@@ -209113,7 +209578,7 @@ If you want to remount the same app, move your app creation logic into a factory
209113
209578
  __v_skip: true,
209114
209579
  type,
209115
209580
  props,
209116
- key: props && normalizeKey(props),
209581
+ key: props && normalizeKey2(props),
209117
209582
  ref: props && normalizeRef(props),
209118
209583
  scopeId: currentScopeId,
209119
209584
  slotScopeIds: null,
@@ -209213,7 +209678,7 @@ Component that was made reactive: `, type);
209213
209678
  __v_skip: true,
209214
209679
  type: vnode.type,
209215
209680
  props: mergedProps,
209216
- key: mergedProps && normalizeKey(mergedProps),
209681
+ key: mergedProps && normalizeKey2(mergedProps),
209217
209682
  ref: extraProps && extraProps.ref ? mergeRef && ref2 ? shared.isArray(ref2) ? ref2.concat(normalizeRef(extraProps)) : [ref2, normalizeRef(extraProps)] : normalizeRef(extraProps) : ref2,
209218
209683
  scopeId: vnode.scopeId,
209219
209684
  slotScopeIds: vnode.slotScopeIds,
@@ -222739,7 +223204,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
222739
223204
  init_remark_gfm_BhnWr3yf_es();
222740
223205
  });
222741
223206
 
222742
- // ../../packages/superdoc/dist/chunks/src-D29bOSuq.es.js
223207
+ // ../../packages/superdoc/dist/chunks/src-BXck1nRd.es.js
222743
223208
  function deleteProps(obj, propOrProps) {
222744
223209
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
222745
223210
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -231833,9 +232298,6 @@ function replaceCommand(wrap4, moveForward) {
231833
232298
  return true;
231834
232299
  };
231835
232300
  }
231836
- function buildSdtBlockSelector(escapedSdtId) {
231837
- return `.${DOM_CLASS_NAMES.BLOCK_SDT}[${DATA_ATTRS.SDT_ID}="${escapedSdtId}"]`;
231838
- }
231839
232301
  function buildAnnotationSelector() {
231840
232302
  return `.${DOM_CLASS_NAMES.ANNOTATION}[${DATA_ATTRS.PM_START}]`;
231841
232303
  }
@@ -235097,6 +235559,36 @@ function scrollToElement(targetElement, options = {
235097
235559
  behavior: options.behavior
235098
235560
  });
235099
235561
  }
235562
+ function normalizeToolbarFamily(value) {
235563
+ return String(value ?? "").trim().toLowerCase();
235564
+ }
235565
+ function compareToolbarFontOptions(a2, b$1) {
235566
+ return String(a2.label ?? "").trim().localeCompare(String(b$1.label ?? "").trim(), "en", { sensitivity: "base" });
235567
+ }
235568
+ function composeToolbarFontOptions(documentOptions, configFonts) {
235569
+ if (configFonts)
235570
+ return configFonts;
235571
+ if (!documentOptions?.length)
235572
+ return;
235573
+ const seen = new Set(TOOLBAR_FONTS.map((option) => normalizeToolbarFamily(option.label)));
235574
+ const merged = [...TOOLBAR_FONTS];
235575
+ for (const option of documentOptions) {
235576
+ const dedupeKey = normalizeToolbarFamily(option.logicalFamily);
235577
+ if (seen.has(dedupeKey))
235578
+ continue;
235579
+ seen.add(dedupeKey);
235580
+ merged.push({
235581
+ label: option.logicalFamily,
235582
+ key: option.logicalFamily,
235583
+ fontWeight: 400,
235584
+ props: {
235585
+ style: { fontFamily: option.previewFamily || option.logicalFamily },
235586
+ "data-item": "btn-fontFamily-option"
235587
+ }
235588
+ });
235589
+ }
235590
+ return merged.length > TOOLBAR_FONTS.length ? merged.sort(compareToolbarFontOptions) : undefined;
235591
+ }
235100
235592
  function isExtensionRulesEnabled(extension2, enabled) {
235101
235593
  if (Array.isArray(enabled))
235102
235594
  return enabled.some((enabledExtension) => {
@@ -263179,6 +263671,9 @@ function applySourceAnchorDataset(element3, sourceAnchor) {
263179
263671
  else
263180
263672
  delete element3.dataset.sourceOccurrenceId;
263181
263673
  }
263674
+ function allowFontSynthesis(element3) {
263675
+ element3.style.setProperty("font-synthesis", "weight style");
263676
+ }
263182
263677
  function getCellSegmentCount(cell2) {
263183
263678
  if (cell2.blocks && cell2.blocks.length > 0) {
263184
263679
  let total = 0;
@@ -267723,7 +268218,10 @@ function calculateBalancedColumnHeight(ctx$1, config3 = DEFAULT_BALANCING_CONFIG
267723
268218
  iterations: 0
267724
268219
  };
267725
268220
  const totalHeight = ctx$1.contentBlocks.reduce((sum, b$1) => sum + b$1.measuredHeight, 0);
267726
- const maxBlockHeight = ctx$1.contentBlocks.reduce((m$1, b$1) => Math.max(m$1, b$1.measuredHeight), 0);
268221
+ const maxBlockHeight = ctx$1.contentBlocks.reduce((m$1, b$1) => {
268222
+ const indivisible = b$1.canBreak && b$1.lineHeights && b$1.lineHeights.length > 1 ? Math.max(...b$1.lineHeights) : b$1.measuredHeight;
268223
+ return Math.max(m$1, indivisible);
268224
+ }, 0);
267727
268225
  if (totalHeight < config3.minColumnHeight * ctx$1.columnCount)
267728
268226
  return createSingleColumnResult(ctx$1);
267729
268227
  let lo = Math.max(maxBlockHeight, config3.minColumnHeight);
@@ -267893,6 +268391,8 @@ function shouldSkipBalancing(ctx$1, config3 = DEFAULT_BALANCING_CONFIG) {
267893
268391
  }
267894
268392
  function getFragmentHeight(fragment, measureMap) {
267895
268393
  if (fragment.kind === "para") {
268394
+ if (fragment.lines && fragment.lines.length > 0)
268395
+ return fragment.lines.reduce((sum$1, l) => sum$1 + (l.lineHeight ?? 0), 0);
267896
268396
  const measure = measureMap.get(fragment.blockId);
267897
268397
  if (!measure || measure.kind !== "paragraph" || !measure.lines)
267898
268398
  return 0;
@@ -267973,13 +268473,38 @@ function balanceSectionOnPage(args$1) {
267973
268473
  return a2.x - b$1.x;
267974
268474
  return a2.y - b$1.y;
267975
268475
  });
267976
- const contentBlocks = ordered.map((f2, i4) => ({
267977
- blockId: `${f2.blockId}#${i4}`,
267978
- measuredHeight: getBalancingHeight(f2, args$1.measureMap, args$1.sectPrMarkerBlockIds),
267979
- canBreak: false,
267980
- keepWithNext: false,
267981
- keepTogether: true
267982
- }));
268476
+ const lineHeightsFor = (f2) => {
268477
+ if (f2.kind !== "para")
268478
+ return;
268479
+ if (args$1.sectPrMarkerBlockIds?.has(f2.blockId))
268480
+ return;
268481
+ if (args$1.keepLinesBlockIds?.has(f2.blockId))
268482
+ return;
268483
+ if (f2.lines && f2.lines.length > 0) {
268484
+ if (f2.lines.length <= 1)
268485
+ return;
268486
+ return f2.lines.map((l) => l.lineHeight);
268487
+ }
268488
+ const measure = args$1.measureMap.get(f2.blockId);
268489
+ if (!measure || measure.kind !== "paragraph" || !Array.isArray(measure.lines))
268490
+ return;
268491
+ const fromLine = f2.fromLine ?? 0;
268492
+ const toLine = f2.toLine ?? measure.lines.length;
268493
+ if (toLine - fromLine <= 1)
268494
+ return;
268495
+ return measure.lines.slice(fromLine, toLine).map((l) => l.lineHeight);
268496
+ };
268497
+ const contentBlocks = ordered.map((f2, i4) => {
268498
+ const lineHeights = lineHeightsFor(f2);
268499
+ return {
268500
+ blockId: `${f2.blockId}#${i4}`,
268501
+ measuredHeight: getBalancingHeight(f2, args$1.measureMap, args$1.sectPrMarkerBlockIds),
268502
+ canBreak: lineHeights !== undefined,
268503
+ keepWithNext: false,
268504
+ keepTogether: lineHeights === undefined,
268505
+ lineHeights
268506
+ };
268507
+ });
267983
268508
  if (shouldSkipBalancing({
267984
268509
  columnCount,
267985
268510
  columnWidth,
@@ -268014,6 +268539,39 @@ function balanceSectionOnPage(args$1) {
268014
268539
  f2.x = columnX(col);
268015
268540
  f2.y = colCursors[col];
268016
268541
  f2.width = columnWidth;
268542
+ const bp = result.blockBreakPoints?.get(block.blockId);
268543
+ if (bp && bp.heightAfterBreak > 0 && col < columnCount - 1) {
268544
+ const splitLine = (f2.fromLine ?? 0) + bp.breakAfterLine + 1;
268545
+ const measureLineCount = args$1.measureMap.get(f2.blockId)?.lines?.length ?? splitLine;
268546
+ const originalToLine = f2.toLine ?? measureLineCount;
268547
+ const originalContinuesOnNext = f2.continuesOnNext ?? false;
268548
+ const secondHalf = {
268549
+ ...f2,
268550
+ fromLine: splitLine,
268551
+ toLine: originalToLine,
268552
+ x: columnX(col + 1),
268553
+ y: colCursors[col + 1],
268554
+ width: columnWidth,
268555
+ continuesFromPrev: true,
268556
+ continuesOnNext: originalContinuesOnNext
268557
+ };
268558
+ if (f2.lines && f2.lines.length > 0) {
268559
+ secondHalf.lines = f2.lines.slice(bp.breakAfterLine + 1);
268560
+ f2.lines = f2.lines.slice(0, bp.breakAfterLine + 1);
268561
+ }
268562
+ f2.toLine = splitLine;
268563
+ f2.continuesOnNext = true;
268564
+ colCursors[col] += bp.heightBeforeBreak;
268565
+ colCursors[col + 1] += bp.heightAfterBreak;
268566
+ const fragIdx = fragments.indexOf(f2);
268567
+ if (fragIdx >= 0)
268568
+ fragments.splice(fragIdx + 1, 0, secondHalf);
268569
+ if (colCursors[col] > maxY)
268570
+ maxY = colCursors[col];
268571
+ if (colCursors[col + 1] > maxY)
268572
+ maxY = colCursors[col + 1];
268573
+ continue;
268574
+ }
268017
268575
  colCursors[col] += block.measuredHeight;
268018
268576
  if (colCursors[col] > maxY)
268019
268577
  maxY = colCursors[col];
@@ -269165,6 +269723,7 @@ function layoutDocument(blocks2, measures, options = {}) {
269165
269723
  const sectionTypeIsExplicit = /* @__PURE__ */ new Map;
269166
269724
  let lastSectionIdx = null;
269167
269725
  const sectPrMarkerBlockIds = /* @__PURE__ */ new Set;
269726
+ const keepLinesBlockIds = /* @__PURE__ */ new Set;
269168
269727
  let documentHasExplicitColumnBreak = false;
269169
269728
  let documentHasAnySectionBreak = false;
269170
269729
  const alreadyBalancedSections = /* @__PURE__ */ new Set;
@@ -269198,6 +269757,8 @@ function layoutDocument(blocks2, measures, options = {}) {
269198
269757
  documentHasExplicitColumnBreak = true;
269199
269758
  if (block.kind === "paragraph" && blockWithAttrs.attrs?.sectPrMarker === true)
269200
269759
  sectPrMarkerBlockIds.add(block.id);
269760
+ if (block.kind === "paragraph" && blockWithAttrs.attrs?.keepLines === true)
269761
+ keepLinesBlockIds.add(block.id);
269201
269762
  });
269202
269763
  const anchoredByParagraph = collectAnchoredDrawings(blocks2, measures);
269203
269764
  const anchoredTables = collectAnchoredTables(blocks2, measures);
@@ -269416,7 +269977,8 @@ function layoutDocument(blocks2, measures, options = {}) {
269416
269977
  columnWidth: normalized.width,
269417
269978
  availableHeight,
269418
269979
  measureMap: balancingMeasureMap,
269419
- sectPrMarkerBlockIds
269980
+ sectPrMarkerBlockIds,
269981
+ keepLinesBlockIds
269420
269982
  });
269421
269983
  if (balanceResult) {
269422
269984
  state.cursorY = balanceResult.maxY;
@@ -269815,7 +270377,9 @@ function layoutDocument(blocks2, measures, options = {}) {
269815
270377
  const isMultiPage = sectionPagesCount > 1;
269816
270378
  if (isMultiPage && !isLast)
269817
270379
  continue;
269818
- const allowedByMidDocContinuous = endBreakType === "continuous" && !isLast;
270380
+ const nextSectionBeginType = sectionEndBreakType.get(sectionIdx + 1);
270381
+ const nextIsBody = lastSectionIdx !== null && sectionIdx + 1 === lastSectionIdx;
270382
+ const allowedByMidDocContinuous = !isLast && !nextIsBody && nextSectionBeginType === "continuous";
269819
270383
  const allowedByBodyExplicitContinuous = bodyExplicitContinuousIdx !== null && sectionIdx === bodyExplicitContinuousIdx - 1 && !isExplicitNonContinuous;
269820
270384
  if (!allowedByMidDocContinuous && !allowedByBodyExplicitContinuous && !isMultiPage)
269821
270385
  continue;
@@ -269846,7 +270410,8 @@ function layoutDocument(blocks2, measures, options = {}) {
269846
270410
  columnWidth: normalized.width,
269847
270411
  availableHeight: sectionAvailableHeight,
269848
270412
  measureMap: balancingMeasureMap,
269849
- sectPrMarkerBlockIds
270413
+ sectPrMarkerBlockIds,
270414
+ keepLinesBlockIds
269850
270415
  });
269851
270416
  }
269852
270417
  for (const state of states) {
@@ -274683,9 +275248,28 @@ function computeDomCaretPageLocal(options, pos) {
274683
275248
  const boundary = resolveTextBoundaryInElement(targetEl, pos, entry.pmStart, entry.pmEnd, "forward");
274684
275249
  if (!boundary) {
274685
275250
  const elRect = targetEl.getBoundingClientRect();
275251
+ if (targetEl.classList.contains("superdoc-line")) {
275252
+ const paddingLeft = parseFloat(targetEl.style.paddingLeft) || 0;
275253
+ const paddingRight = parseFloat(targetEl.style.paddingRight) || 0;
275254
+ const lineLeft = (elRect.left - pageRect.left) / zoom + paddingLeft;
275255
+ const lineRight = (elRect.right - pageRect.left) / zoom - paddingRight;
275256
+ const textAlign = targetEl.style.textAlign;
275257
+ let x;
275258
+ if (textAlign === "center")
275259
+ x = (lineLeft + lineRight) / 2;
275260
+ else if (textAlign === "right")
275261
+ x = lineRight;
275262
+ else
275263
+ x = lineLeft;
275264
+ return {
275265
+ pageIndex: Number(page.dataset.pageIndex ?? "0"),
275266
+ x,
275267
+ y: (elRect.top - pageRect.top) / zoom
275268
+ };
275269
+ }
274686
275270
  const isEmptySdtPlaceholder = targetEl.classList.contains("superdoc-empty-sdt-placeholder") || targetEl.classList.contains("superdoc-empty-inline-sdt-placeholder") || targetEl.classList.contains("superdoc-empty-block-sdt-placeholder");
274687
275271
  const atEnd = isEmptySdtPlaceholder ? pos > entry.pmEnd : pos >= entry.pmEnd;
274688
- const yRect = (isEmptySdtPlaceholder ? targetEl.closest(".superdoc-line") : null)?.getBoundingClientRect() ?? elRect;
275272
+ const yRect = (isEmptySdtPlaceholder || targetEl.classList.contains("superdoc-tab") ? targetEl.closest(".superdoc-line") : null)?.getBoundingClientRect() ?? elRect;
274689
275273
  return {
274690
275274
  pageIndex: Number(page.dataset.pageIndex ?? "0"),
274691
275275
  x: ((atEnd ? elRect.right : elRect.left) - pageRect.left) / zoom,
@@ -282108,7 +282692,8 @@ function makeResolveFace(resolver2, hasFace) {
282108
282692
  const r$1 = resolver2.resolveFace(logical, face, hasFace);
282109
282693
  return {
282110
282694
  physicalFamily: r$1.physicalFamily,
282111
- reason: r$1.reason
282695
+ reason: r$1.reason,
282696
+ sourceFace: r$1.sourceFace
282112
282697
  };
282113
282698
  };
282114
282699
  if (resolver2)
@@ -282138,10 +282723,14 @@ function collect(acc, node2, resolveFace2) {
282138
282723
  const usedKey = `${logicalPrimary.toLowerCase()}|${weight}|${style2}`;
282139
282724
  if (acc.usedFaces.has(usedKey))
282140
282725
  return;
282141
- const { physicalFamily, reason } = resolveFace2(node2.fontFamily, {
282726
+ const { physicalFamily, reason, sourceFace } = resolveFace2(node2.fontFamily, {
282142
282727
  weight,
282143
282728
  style: style2
282144
282729
  });
282730
+ const requiredFace = sourceFace ?? {
282731
+ weight,
282732
+ style: style2
282733
+ };
282145
282734
  acc.usedFaces.set(usedKey, {
282146
282735
  logicalFamily: logicalPrimary,
282147
282736
  weight,
@@ -282152,15 +282741,17 @@ function collect(acc, node2, resolveFace2) {
282152
282741
  weight,
282153
282742
  style2,
282154
282743
  (physicalFamily || "").toLowerCase(),
282744
+ requiredFace.weight,
282745
+ requiredFace.style,
282155
282746
  reason
282156
282747
  ]);
282157
282748
  if (physicalFamily) {
282158
- const reqKey = `${physicalFamily.toLowerCase()}|${weight}|${style2}`;
282749
+ const reqKey = `${physicalFamily.toLowerCase()}|${requiredFace.weight}|${requiredFace.style}`;
282159
282750
  if (!acc.requiredFaces.has(reqKey))
282160
282751
  acc.requiredFaces.set(reqKey, {
282161
282752
  family: physicalFamily,
282162
- weight,
282163
- style: style2
282753
+ weight: requiredFace.weight,
282754
+ style: requiredFace.style
282164
282755
  });
282165
282756
  }
282166
282757
  }
@@ -301788,6 +302379,7 @@ var Node$13 = class Node$14 {
301788
302379
  this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
301789
302380
  this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
301790
302381
  options.reapplyStructuredContentHover?.();
302382
+ options.reapplyTocGroupHover?.();
301791
302383
  }
301792
302384
  destroy() {
301793
302385
  this.#proofingDecorator.clear();
@@ -301797,6 +302389,83 @@ var Node$13 = class Node$14 {
301797
302389
  this.#commentHighlightDecorator.destroy();
301798
302390
  this.#decorationBridge.destroy();
301799
302391
  }
302392
+ }, HoverGroupCoordinator = class {
302393
+ #spec;
302394
+ #current = null;
302395
+ constructor(spec) {
302396
+ this.handleMouseEnter = (event) => {
302397
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
302398
+ if (!entry)
302399
+ return;
302400
+ const id2 = this.#spec.getId(entry);
302401
+ if (!id2)
302402
+ return;
302403
+ this.#set(id2);
302404
+ };
302405
+ this.handleMouseLeave = (event) => {
302406
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
302407
+ if (!entry)
302408
+ return;
302409
+ const id2 = this.#spec.getId(entry);
302410
+ if (!id2)
302411
+ return;
302412
+ const relatedTarget = event.relatedTarget;
302413
+ if (relatedTarget) {
302414
+ const nextEntry = relatedTarget.closest?.(this.#spec.entrySelector);
302415
+ if (nextEntry && this.#spec.getId(nextEntry) === id2)
302416
+ return;
302417
+ }
302418
+ this.clear();
302419
+ };
302420
+ this.#spec = spec;
302421
+ }
302422
+ reapply() {
302423
+ if (!this.#current)
302424
+ return;
302425
+ const { id: id2 } = this.#current;
302426
+ const elements = this.#spec.queryGroup(id2);
302427
+ if (elements.length === 0) {
302428
+ this.#current = null;
302429
+ return;
302430
+ }
302431
+ this.#applyClass(elements);
302432
+ this.#spec.onApply?.(elements);
302433
+ this.#current = {
302434
+ id: id2,
302435
+ elements
302436
+ };
302437
+ }
302438
+ clear() {
302439
+ if (!this.#current)
302440
+ return;
302441
+ for (const element3 of this.#current.elements) {
302442
+ element3.classList.remove(this.#spec.hoverClass);
302443
+ this.#spec.onClear?.(element3);
302444
+ }
302445
+ this.#current = null;
302446
+ }
302447
+ #set(id2) {
302448
+ if (this.#current?.id === id2)
302449
+ return;
302450
+ this.clear();
302451
+ const elements = this.#spec.queryGroup(id2);
302452
+ if (elements.length === 0)
302453
+ return;
302454
+ this.#applyClass(elements);
302455
+ this.#spec.onApply?.(elements);
302456
+ this.#current = {
302457
+ id: id2,
302458
+ elements
302459
+ };
302460
+ }
302461
+ #applyClass(elements) {
302462
+ const filter = this.#spec.shouldApplyTo;
302463
+ for (const element3 of elements) {
302464
+ if (filter && !filter(element3))
302465
+ continue;
302466
+ element3.classList.add(this.#spec.hoverClass);
302467
+ }
302468
+ }
301800
302469
  }, ProofingStore = class {
301801
302470
  #issuesBySegment = /* @__PURE__ */ new Map;
301802
302471
  addIssue(issue2) {
@@ -302407,6 +303076,9 @@ var Node$13 = class Node$14 {
302407
303076
  color: inherit !important;
302408
303077
  text-decoration: none !important;
302409
303078
  cursor: default;
303079
+ /* Disable native link drag so our pointer loop can run text-selection. */
303080
+ -webkit-user-drag: none;
303081
+ user-drag: none;
302410
303082
  }
302411
303083
 
302412
303084
  .superdoc-toc-entry .superdoc-link:hover {
@@ -302418,6 +303090,31 @@ var Node$13 = class Node$14 {
302418
303090
  outline: none;
302419
303091
  }
302420
303092
 
303093
+ /* TOC hover. .toc-group-hover is set by PresentationEditor on every entry
303094
+ sharing a data-toc-id so the whole TOC greys out together. The ::after
303095
+ stripe (height set via --toc-gap-below) fills the paragraph-spacing gap
303096
+ between adjacent entries so the hover reads as one continuous block. */
303097
+ .superdoc-toc-entry:hover,
303098
+ .superdoc-toc-entry.toc-group-hover {
303099
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
303100
+ }
303101
+
303102
+ /* Pointer-events stay on (default) so the stripe extends the parent entry's
303103
+ hit-test area through the paragraph-spacing gap. Without this, moving the
303104
+ cursor between two adjacent entries fires mouseout on the upper entry with
303105
+ relatedTarget = the page (not a TOC entry), the coordinator drops the
303106
+ group-hover class, and the grey disappears for a frame before the next
303107
+ entry's mouseover restores it — visible as a flicker. */
303108
+ .superdoc-toc-entry.toc-group-hover::after {
303109
+ content: '';
303110
+ position: absolute;
303111
+ left: 0;
303112
+ right: 0;
303113
+ top: 100%;
303114
+ height: var(--toc-gap-below, 0px);
303115
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
303116
+ }
303117
+
302421
303118
  /* Remove focus outlines from layout engine elements */
302422
303119
  .superdoc-layout,
302423
303120
  .superdoc-page,
@@ -304472,6 +305169,7 @@ menclose::after {
304472
305169
  });
304473
305170
  if (run2.fontSize != null)
304474
305171
  markerEl.style.fontSize = `${run2.fontSize}px`;
305172
+ allowFontSynthesis(markerEl);
304475
305173
  markerEl.style.fontWeight = run2.bold ? "bold" : "";
304476
305174
  markerEl.style.fontStyle = run2.italic ? "italic" : "";
304477
305175
  if (run2.color)
@@ -306395,8 +307093,12 @@ menclose::after {
306395
307093
  applyResolvedFragmentFrame(fragmentEl, resolvedItem, fragment);
306396
307094
  else
306397
307095
  applyFragmentFrame(fragmentEl, fragment);
306398
- if (isTocEntry)
306399
- fragmentEl.classList.add("superdoc-toc-entry");
307096
+ if (isTocEntry) {
307097
+ fragmentEl.classList.add(DOM_CLASS_NAMES.TOC_ENTRY);
307098
+ const tocId = block.attrs?.tocId;
307099
+ if (typeof tocId === "string" && tocId.length > 0)
307100
+ fragmentEl.dataset.tocId = tocId;
307101
+ }
306400
307102
  if (paraContinuesFromPrev)
306401
307103
  fragmentEl.dataset.continuesFromPrev = "true";
306402
307104
  if (paraContinuesOnNext)
@@ -306453,6 +307155,7 @@ menclose::after {
306453
307155
  style: run2.italic ? "italic" : "normal"
306454
307156
  });
306455
307157
  dropCapEl.style.fontSize = `${run2.fontSize}px`;
307158
+ allowFontSynthesis(dropCapEl);
306456
307159
  if (run2.bold)
306457
307160
  dropCapEl.style.fontWeight = "bold";
306458
307161
  if (run2.italic)
@@ -306572,6 +307275,7 @@ menclose::after {
306572
307275
  style: run2.italic ? "italic" : "normal"
306573
307276
  });
306574
307277
  element3.style.fontSize = `${run2.fontSize}px`;
307278
+ allowFontSynthesis(element3);
306575
307279
  if (run2.bold)
306576
307280
  element3.style.fontWeight = "bold";
306577
307281
  if (run2.italic)
@@ -306764,6 +307468,7 @@ menclose::after {
306764
307468
  }
306765
307469
  if (run2.textColor)
306766
307470
  annotation.style.color = run2.textColor;
307471
+ allowFontSynthesis(annotation);
306767
307472
  if (run2.bold)
306768
307473
  annotation.style.fontWeight = "bold";
306769
307474
  if (run2.italic)
@@ -314591,6 +315296,7 @@ menclose::after {
314591
315296
  #cellAnchor = null;
314592
315297
  #cellDragMode = "none";
314593
315298
  #pendingMarginClick = null;
315299
+ #pendingTocLinkNav = null;
314594
315300
  #lastSelectedImageBlockId = null;
314595
315301
  #suppressFocusInFromDraggable = false;
314596
315302
  #pendingStructuredContentLabelGesture = null;
@@ -315132,10 +315838,14 @@ menclose::after {
315132
315838
  return;
315133
315839
  }
315134
315840
  const linkEl = target?.closest?.("a.superdoc-link");
315135
- if (linkEl) {
315136
- this.#handleLinkClick(event, linkEl);
315137
- return;
315138
- }
315841
+ this.#pendingTocLinkNav = null;
315842
+ if (linkEl)
315843
+ if (linkEl.closest(`.${DOM_CLASS_NAMES.TOC_ENTRY}`))
315844
+ this.#pendingTocLinkNav = linkEl;
315845
+ else {
315846
+ this.#handleLinkClick(event, linkEl);
315847
+ return;
315848
+ }
315139
315849
  const annotationEl = target?.closest?.(buildAnnotationSelector());
315140
315850
  const isDraggableAnnotation = target?.closest?.(DRAGGABLE_SELECTOR) != null;
315141
315851
  const isNativeDragSource = target?.closest?.(DRAG_SOURCE_SELECTOR) != null;
@@ -315474,6 +316184,10 @@ menclose::after {
315474
316184
  event
315475
316185
  });
315476
316186
  this.#suppressFocusInFromDraggable = false;
316187
+ const pendingTocLink = this.#pendingTocLinkNav;
316188
+ this.#pendingTocLinkNav = null;
316189
+ if (pendingTocLink && !this.#dragThresholdExceeded)
316190
+ this.#handleLinkClick(event, pendingTocLink);
315477
316191
  if (!this.#isDragging) {
315478
316192
  this.#stopAutoScroll();
315479
316193
  return;
@@ -319498,6 +320212,17 @@ menclose::after {
319498
320212
  const declaredRows = buildFontReport(declared.filter((family2) => family2 && !usedFamilies.has(family2.toLowerCase())), registry3, resolver2);
319499
320213
  return [...faceRows, ...declaredRows];
319500
320214
  }
320215
+ getDocumentFontOptions() {
320216
+ try {
320217
+ const usedFaces = this.#getUsedFaces?.() ?? [];
320218
+ if (!usedFaces.length)
320219
+ return [];
320220
+ const { registry: registry3 } = this.#resolveContext();
320221
+ return buildDocumentFontOptions(usedFaces, registry3, this.#fontResolver ?? undefined);
320222
+ } catch {
320223
+ return [];
320224
+ }
320225
+ }
319501
320226
  async ensureReadyForMeasure() {
319502
320227
  if (this.#getRequiredFaces)
319503
320228
  return this.#ensureFacesReady(this.#getRequiredFaces);
@@ -319937,13 +320662,13 @@ menclose::after {
319937
320662
  return;
319938
320663
  console.log(...args$1);
319939
320664
  }, 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;
319940
- var init_src_D29bOSuq_es = __esm(() => {
320665
+ var init_src_BXck1nRd_es = __esm(() => {
319941
320666
  init_rolldown_runtime_Bg48TavK_es();
319942
- init_SuperConverter_C6RGktKO_es();
320667
+ init_SuperConverter_BSDZ3hYr_es();
319943
320668
  init_jszip_C49i9kUs_es();
319944
320669
  init_xml_js_CqGKpaft_es();
319945
320670
  init_uuid_B2wVPhPi_es();
319946
- init_create_headless_toolbar_D7rUpTS1_es();
320671
+ init_create_headless_toolbar_CKZ579SH_es();
319947
320672
  init_constants_D9qj59G2_es();
319948
320673
  init_dist_B8HfvhaK_es();
319949
320674
  init_unified_Dsuw2be5_es();
@@ -338873,6 +339598,8 @@ function print() { __p += __j.call(arguments, '') }
338873
339598
  TABLE_FRAGMENT: "superdoc-table-fragment",
338874
339599
  DOCUMENT_SECTION: "superdoc-document-section",
338875
339600
  SDT_GROUP_HOVER: "sdt-group-hover",
339601
+ TOC_ENTRY: "superdoc-toc-entry",
339602
+ TOC_GROUP_HOVER: "toc-group-hover",
338876
339603
  IMAGE_FRAGMENT: "superdoc-image-fragment",
338877
339604
  INLINE_IMAGE: "superdoc-inline-image",
338878
339605
  LIST_MARKER: "superdoc-list-marker",
@@ -340653,7 +341380,7 @@ function print() { __p += __j.call(arguments, '') }
340653
341380
  };
340654
341381
  }
340655
341382
  }, [["__scopeId", "data-v-d25821a5"]]);
340656
- TOOLBAR_FONTS = getDefaultFontOfferings().map((offering) => ({
341383
+ TOOLBAR_FONTS = getBuiltInToolbarFontOfferings().map((offering) => ({
340657
341384
  label: offering.logicalFamily,
340658
341385
  key: fontOfferingStack(offering),
340659
341386
  fontWeight: 400,
@@ -341186,7 +341913,8 @@ function print() { __p += __j.call(arguments, '') }
341186
341913
  const menuRef = exports_vue.ref(null);
341187
341914
  const menuPosition = exports_vue.ref({
341188
341915
  top: "0px",
341189
- left: "0px"
341916
+ left: "0px",
341917
+ maxHeight: "none"
341190
341918
  });
341191
341919
  const optionRefs = exports_vue.ref([]);
341192
341920
  const keyboardIndex = exports_vue.ref(-1);
@@ -341223,6 +341951,7 @@ function print() { __p += __j.call(arguments, '') }
341223
341951
  position: "fixed",
341224
341952
  top: menuPosition.value.top,
341225
341953
  left: menuPosition.value.left,
341954
+ maxHeight: menuPosition.value.maxHeight,
341226
341955
  zIndex: 2000
341227
341956
  };
341228
341957
  });
@@ -341238,17 +341967,30 @@ function print() { __p += __j.call(arguments, '') }
341238
341967
  if (!triggerRef.value)
341239
341968
  return;
341240
341969
  const rect = triggerRef.value.getBoundingClientRect();
341241
- const menuWidth = menuRef.value?.offsetWidth ?? 0;
341970
+ const menuEl = menuRef.value;
341971
+ const menuWidth = menuEl?.offsetWidth ?? 0;
341972
+ const menuHeight = menuEl?.scrollHeight ?? menuEl?.offsetHeight ?? 0;
341242
341973
  const viewportWidth = window.innerWidth || document.documentElement.clientWidth || 0;
341974
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight || 0;
341243
341975
  const gutter = 8;
341976
+ const gap = 4;
341977
+ const belowTop = rect.bottom + gap;
341978
+ const aboveBottom = rect.top - gap;
341979
+ const availableBelow = Math.max(0, viewportHeight - belowTop - gutter);
341980
+ const availableAbove = Math.max(0, aboveBottom - gutter);
341981
+ const openAbove = availableBelow < menuHeight && availableAbove > availableBelow;
341982
+ const maxHeight = openAbove ? availableAbove : availableBelow;
341983
+ const menuRenderHeight = menuHeight ? Math.min(menuHeight, maxHeight) : maxHeight;
341984
+ const top$1 = openAbove ? Math.max(gutter, aboveBottom - menuRenderHeight) : belowTop;
341244
341985
  let left$1 = rect.left;
341245
341986
  if (props.placement === "bottom-end")
341246
341987
  left$1 = rect.right - menuWidth;
341247
341988
  const maxLeft = Math.max(gutter, viewportWidth - menuWidth - gutter);
341248
341989
  left$1 = Math.min(Math.max(gutter, left$1), maxLeft);
341249
341990
  menuPosition.value = {
341250
- top: `${rect.bottom + 4}px`,
341251
- left: `${left$1}px`
341991
+ top: `${top$1}px`,
341992
+ left: `${left$1}px`,
341993
+ maxHeight: `${maxHeight}px`
341252
341994
  };
341253
341995
  };
341254
341996
  const onTriggerClick = () => {
@@ -341314,8 +342056,13 @@ function print() { __p += __j.call(arguments, '') }
341314
342056
  el.setAttribute("tabindex", index2 === keyboardIndex.value ? "0" : "-1");
341315
342057
  });
341316
342058
  const target = optionRefs.value[keyboardIndex.value];
341317
- if (target && typeof target.focus === "function")
342059
+ if (target && typeof target.focus === "function") {
341318
342060
  target.focus();
342061
+ target.scrollIntoView?.({
342062
+ block: "nearest",
342063
+ inline: "nearest"
342064
+ });
342065
+ }
341319
342066
  };
341320
342067
  const moveKeyboardIndex = (direction) => {
341321
342068
  const navigableIndexes = getNavigableIndexes();
@@ -341450,6 +342197,7 @@ function print() { __p += __j.call(arguments, '') }
341450
342197
  if (hasRenderOptions.value)
341451
342198
  return;
341452
342199
  keyboardIndex.value = getInitialKeyboardIndex();
342200
+ await exports_vue.nextTick();
341453
342201
  focusKeyboardIndex();
341454
342202
  }, { immediate: true });
341455
342203
  exports_vue.watch(isOpen, (open) => {
@@ -341513,7 +342261,7 @@ function print() { __p += __j.call(arguments, '') }
341513
342261
  })]))]);
341514
342262
  };
341515
342263
  }
341516
- }, [["__scopeId", "data-v-302f7d86"]]);
342264
+ }, [["__scopeId", "data-v-69732782"]]);
341517
342265
  SdTooltip_default = /* @__PURE__ */ __plugin_vue_export_helper_default(/* @__PURE__ */ Object.assign({ inheritAttrs: false }, {
341518
342266
  __name: "SdTooltip",
341519
342267
  props: {
@@ -342163,16 +342911,21 @@ function print() { __p += __j.call(arguments, '') }
342163
342911
  toolbarKey.value += 1;
342164
342912
  };
342165
342913
  const onResizeThrottled = throttle(onWindowResized, 300);
342166
- function teardownWindowListeners() {
342914
+ const onToolbarItemsChanged = () => {
342915
+ toolbarKey.value += 1;
342916
+ };
342917
+ function teardownListeners() {
342167
342918
  window.removeEventListener("resize", onResizeThrottled);
342168
342919
  window.removeEventListener("keydown", onKeyDown);
342920
+ proxy.$toolbar.off?.("toolbar-items-changed", onToolbarItemsChanged);
342169
342921
  containerResizeObserver?.disconnect();
342170
342922
  containerResizeObserver = null;
342171
342923
  }
342172
- function setupWindowListeners() {
342173
- teardownWindowListeners();
342924
+ function setupListeners() {
342925
+ teardownListeners();
342174
342926
  window.addEventListener("resize", onResizeThrottled);
342175
342927
  window.addEventListener("keydown", onKeyDown);
342928
+ proxy.$toolbar.on?.("toolbar-items-changed", onToolbarItemsChanged);
342176
342929
  if (typeof ResizeObserver !== "undefined" && proxy.$toolbar.config?.responsiveToContainer && proxy.$toolbar.toolbarContainer) {
342177
342930
  containerResizeObserver = new ResizeObserver(() => {
342178
342931
  onResizeThrottled();
@@ -342181,10 +342934,10 @@ function print() { __p += __j.call(arguments, '') }
342181
342934
  }
342182
342935
  updateCompactSideGroups();
342183
342936
  }
342184
- exports_vue.onMounted(setupWindowListeners);
342185
- exports_vue.onActivated(setupWindowListeners);
342186
- exports_vue.onDeactivated(teardownWindowListeners);
342187
- exports_vue.onBeforeUnmount(teardownWindowListeners);
342937
+ exports_vue.onMounted(setupListeners);
342938
+ exports_vue.onActivated(setupListeners);
342939
+ exports_vue.onDeactivated(teardownListeners);
342940
+ exports_vue.onBeforeUnmount(teardownListeners);
342188
342941
  const handleCommand = ({ item, argument, option }) => {
342189
342942
  proxy.$toolbar.emitCommand({
342190
342943
  item,
@@ -342263,7 +343016,7 @@ function print() { __p += __j.call(arguments, '') }
342263
343016
  ], 32);
342264
343017
  };
342265
343018
  }
342266
- }, [["__scopeId", "data-v-b83d488a"]]);
343019
+ }, [["__scopeId", "data-v-938eaa1b"]]);
342267
343020
  toolbarTexts = {
342268
343021
  bold: "Bold",
342269
343022
  fontFamily: "Font",
@@ -342394,8 +343147,10 @@ function print() { __p += __j.call(arguments, '') }
342394
343147
  this._boundEditorHandlers = {
342395
343148
  transaction: null,
342396
343149
  selectionUpdate: null,
342397
- focus: null
343150
+ focus: null,
343151
+ fontsChanged: null
342398
343152
  };
343153
+ this._lastFontOptionsSignature = "";
342399
343154
  this._restoreFocusTimeoutId = null;
342400
343155
  if (!this.config.selector && this.config.element)
342401
343156
  this.config.selector = this.config.element;
@@ -342454,24 +343209,40 @@ function print() { __p += __j.call(arguments, '') }
342454
343209
  if (this.config.groups && !Array.isArray(this.config.groups) && Object.keys(this.config.groups).length)
342455
343210
  this.config.toolbarGroups = Object.keys(this.config.groups);
342456
343211
  }
343212
+ #detachActiveEditorListeners() {
343213
+ if (!this.activeEditor || !this._boundEditorHandlers.transaction)
343214
+ return;
343215
+ this.activeEditor.off("transaction", this._boundEditorHandlers.transaction);
343216
+ this.activeEditor.off("selectionUpdate", this._boundEditorHandlers.selectionUpdate);
343217
+ this.activeEditor.off("focus", this._boundEditorHandlers.focus);
343218
+ this.activeEditor.off("fonts-changed", this._boundEditorHandlers.fontsChanged);
343219
+ this._boundEditorHandlers.transaction = null;
343220
+ this._boundEditorHandlers.selectionUpdate = null;
343221
+ this._boundEditorHandlers.focus = null;
343222
+ this._boundEditorHandlers.fontsChanged = null;
343223
+ }
342457
343224
  setActiveEditor(editor) {
342458
- if (this.activeEditor && this._boundEditorHandlers.transaction) {
342459
- this.activeEditor.off("transaction", this._boundEditorHandlers.transaction);
342460
- this.activeEditor.off("selectionUpdate", this._boundEditorHandlers.selectionUpdate);
342461
- this.activeEditor.off("focus", this._boundEditorHandlers.focus);
342462
- this._boundEditorHandlers.transaction = null;
342463
- this._boundEditorHandlers.selectionUpdate = null;
342464
- this._boundEditorHandlers.focus = null;
343225
+ const sameEditor = editor === this.activeEditor;
343226
+ const alreadyListening = Boolean(this._boundEditorHandlers.transaction);
343227
+ if (sameEditor && (!editor || alreadyListening)) {
343228
+ this.updateToolbarState();
343229
+ return;
342465
343230
  }
343231
+ this.#detachActiveEditorListeners();
342466
343232
  this.activeEditor = editor;
342467
343233
  if (editor) {
342468
343234
  this._boundEditorHandlers.transaction = this.onEditorTransaction.bind(this);
342469
343235
  this._boundEditorHandlers.selectionUpdate = this.onEditorSelectionUpdate.bind(this);
342470
343236
  this._boundEditorHandlers.focus = this.onEditorFocus.bind(this);
343237
+ this._boundEditorHandlers.fontsChanged = this.onEditorFontsChanged.bind(this);
342471
343238
  this.activeEditor.on("transaction", this._boundEditorHandlers.transaction);
342472
343239
  this.activeEditor.on("selectionUpdate", this._boundEditorHandlers.selectionUpdate);
342473
343240
  this.activeEditor.on("focus", this._boundEditorHandlers.focus);
343241
+ this.activeEditor.on("fonts-changed", this._boundEditorHandlers.fontsChanged);
342474
343242
  }
343243
+ this.#rebuildToolbarItems();
343244
+ this._lastFontOptionsSignature = this.#fontOptionsSignature();
343245
+ this.updateToolbarState();
342475
343246
  }
342476
343247
  getToolbarItemByGroup(groupName) {
342477
343248
  return this.toolbarItems.filter((item) => (item.group?.value || "center") === groupName);
@@ -342488,13 +343259,14 @@ function print() { __p += __j.call(arguments, '') }
342488
343259
  return this.config.responsiveToContainer ? containerWidth : documentWidth;
342489
343260
  }
342490
343261
  #makeToolbarItems({ superToolbar, icons: icons$1, texts, fonts, hideButtons, isDev = false } = {}) {
343262
+ const availableWidth = this.getAvailableWidth();
342491
343263
  const { defaultItems, overflowItems } = makeDefaultItems({
342492
343264
  superToolbar,
342493
343265
  toolbarIcons: icons$1,
342494
343266
  toolbarTexts: texts,
342495
- toolbarFonts: fonts,
343267
+ toolbarFonts: this.#resolveToolbarFonts(fonts),
342496
343268
  hideButtons,
342497
- availableWidth: this.getAvailableWidth(),
343269
+ availableWidth,
342498
343270
  role: this.role,
342499
343271
  isDev
342500
343272
  });
@@ -342507,6 +343279,26 @@ function print() { __p += __j.call(arguments, '') }
342507
343279
  this.toolbarItems = defaultItems.filter((item) => allConfigItems.includes(item.name.value)).filter((item) => !this.config.excludeItems.includes(item.name.value));
342508
343280
  this.overflowItems = overflowItems.filter((item) => allConfigItems.includes(item.name.value));
342509
343281
  }
343282
+ #resolveToolbarFonts(configFonts) {
343283
+ return composeToolbarFontOptions(this.superdoc?.fonts?.getDocumentFontOptions?.() ?? [], configFonts);
343284
+ }
343285
+ #rebuildToolbarItems() {
343286
+ this.#makeToolbarItems({
343287
+ superToolbar: this,
343288
+ icons: this.config.icons,
343289
+ texts: this.config.texts,
343290
+ fonts: this.config.fonts,
343291
+ hideButtons: this.config.hideButtons,
343292
+ isDev: this.isDev
343293
+ });
343294
+ this.emit("toolbar-items-changed");
343295
+ }
343296
+ #fontOptionsSignature() {
343297
+ if (this.config.fonts)
343298
+ return "custom-fonts";
343299
+ const options = this.superdoc?.fonts?.getDocumentFontOptions?.() ?? [];
343300
+ return JSON.stringify(options.map((option) => [option.logicalFamily, option.previewFamily]));
343301
+ }
342510
343302
  #initDefaultFonts() {
342511
343303
  if (!this.activeEditor || !this.activeEditor.converter)
342512
343304
  return;
@@ -342878,6 +343670,14 @@ function print() { __p += __j.call(arguments, '') }
342878
343670
  if (this.#restoreStickyMarksIfNeeded())
342879
343671
  this.updateToolbarState();
342880
343672
  }
343673
+ onEditorFontsChanged() {
343674
+ const signature = this.#fontOptionsSignature();
343675
+ if (signature !== this._lastFontOptionsSignature) {
343676
+ this._lastFontOptionsSignature = signature;
343677
+ this.#rebuildToolbarItems();
343678
+ }
343679
+ this.updateToolbarState();
343680
+ }
342881
343681
  onEditorFocus() {
342882
343682
  if (this.pendingMarkCommands.length) {
342883
343683
  this.onEditorSelectionUpdate();
@@ -342944,6 +343744,7 @@ function print() { __p += __j.call(arguments, '') }
342944
343744
  clearTimeout(this._restoreFocusTimeoutId);
342945
343745
  this._restoreFocusTimeoutId = null;
342946
343746
  }
343747
+ this.#detachActiveEditorListeners();
342947
343748
  this.destroyHeadlessToolbar();
342948
343749
  this.app?.unmount();
342949
343750
  }
@@ -346320,6 +347121,7 @@ function print() { __p += __j.call(arguments, '') }
346320
347121
  editor: this
346321
347122
  });
346322
347123
  console.error(err);
347124
+ throw err;
346323
347125
  }
346324
347126
  }
346325
347127
  #endCollaboration() {
@@ -348323,7 +349125,8 @@ function print() { __p += __j.call(arguments, '') }
348323
349125
  #lastSelectedFieldAnnotation = null;
348324
349126
  #lastSelectedStructuredContentBlock = null;
348325
349127
  #lastSelectedStructuredContentInline = null;
348326
- #lastHoveredStructuredContentBlock = null;
349128
+ #sdtHoverCoordinator = null;
349129
+ #tocHoverCoordinator = null;
348327
349130
  #remoteCursorManager = null;
348328
349131
  #cursorUpdateTimer = null;
348329
349132
  #remoteCursorOverlay = null;
@@ -348394,8 +349197,11 @@ function print() { __p += __j.call(arguments, '') }
348394
349197
  ensureEditorNativeSelectionStyles(doc$12);
348395
349198
  ensureEditorFieldAnnotationInteractionStyles(doc$12);
348396
349199
  ensureEditorMovableObjectInteractionStyles(doc$12);
348397
- this.#painterHost.addEventListener("mouseover", this.#handleStructuredContentBlockMouseEnter);
348398
- this.#painterHost.addEventListener("mouseout", this.#handleStructuredContentBlockMouseLeave);
349200
+ this.#initializeHoverCoordinators();
349201
+ this.#painterHost.addEventListener("mouseover", this.#sdtHoverCoordinator.handleMouseEnter);
349202
+ this.#painterHost.addEventListener("mouseout", this.#sdtHoverCoordinator.handleMouseLeave);
349203
+ this.#painterHost.addEventListener("mouseover", this.#tocHoverCoordinator.handleMouseEnter);
349204
+ this.#painterHost.addEventListener("mouseout", this.#tocHoverCoordinator.handleMouseLeave);
348399
349205
  this.#domIndexObserverManager = new DomPositionIndexObserverManager({
348400
349206
  windowRoot: this.#visibleHost?.ownerDocument?.defaultView ?? window,
348401
349207
  getPainterHost: () => this.#painterHost,
@@ -349563,6 +350369,9 @@ function print() { __p += __j.call(arguments, '') }
349563
350369
  getFontReport() {
349564
350370
  return this.#fontGate?.getReport() ?? [];
349565
350371
  }
350372
+ getDocumentFontOptions() {
350373
+ return this.#fontGate?.getDocumentFontOptions() ?? [];
350374
+ }
349566
350375
  getMissingFonts() {
349567
350376
  return [...new Set(this.getFontReport().filter((record3) => record3.missing).map((record3) => record3.logicalFamily))];
349568
350377
  }
@@ -352383,74 +353192,50 @@ function print() { __p += __j.call(arguments, '') }
352383
353192
  }
352384
353193
  this.#setSelectedStructuredContentBlockClass(elements, id2);
352385
353194
  }
352386
- #handleStructuredContentBlockMouseEnter = (event) => {
352387
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
352388
- if (!block || !(block instanceof HTMLElement))
353195
+ #initializeHoverCoordinators() {
353196
+ if (this.#sdtHoverCoordinator || this.#tocHoverCoordinator)
352389
353197
  return;
352390
- if (block.classList.contains("ProseMirror-selectednode"))
352391
- return;
352392
- const rawId = block.dataset.sdtId;
352393
- if (!rawId)
352394
- return;
352395
- this.#setHoveredStructuredContentBlockClass(rawId);
352396
- };
352397
- #handleStructuredContentBlockMouseLeave = (event) => {
352398
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
352399
- if (!block)
353198
+ this.#sdtHoverCoordinator = new HoverGroupCoordinator({
353199
+ entrySelector: `.${DOM_CLASS_NAMES.BLOCK_SDT}`,
353200
+ getId: (entry) => entry.dataset.sdtId,
353201
+ queryGroup: (id2) => this.#painterAdapter.getStructuredContentBlockElementsById(id2),
353202
+ hoverClass: DOM_CLASS_NAMES.SDT_GROUP_HOVER,
353203
+ shouldApplyTo: (element3) => !element3.classList.contains("ProseMirror-selectednode")
353204
+ });
353205
+ this.#tocHoverCoordinator = new HoverGroupCoordinator({
353206
+ entrySelector: `.${DOM_CLASS_NAMES.TOC_ENTRY}`,
353207
+ getId: (entry) => entry.dataset.tocId,
353208
+ queryGroup: (id2) => this.#queryTocEntryElementsById(id2),
353209
+ hoverClass: DOM_CLASS_NAMES.TOC_GROUP_HOVER,
353210
+ onApply: (elements) => this.#applyTocGapFill(elements),
353211
+ onClear: (element3) => element3.style.removeProperty("--toc-gap-below")
353212
+ });
353213
+ }
353214
+ #applyTocGapFill(elements) {
353215
+ if (elements.length < 2)
352400
353216
  return;
352401
- const relatedTarget = event.relatedTarget;
352402
- if (relatedTarget && block.dataset.sdtId) {
352403
- const escapedCheckId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(block.dataset.sdtId) : block.dataset.sdtId.replace(/"/g, "\\\"");
352404
- if (relatedTarget.closest(buildSdtBlockSelector(escapedCheckId)))
352405
- return;
353217
+ const measured = elements.map((element3) => ({
353218
+ element: element3,
353219
+ rect: element3.getBoundingClientRect()
353220
+ })).sort((a2, b$1) => a2.rect.top - b$1.rect.top);
353221
+ for (let i4 = 0;i4 < measured.length - 1; i4++) {
353222
+ const current = measured[i4];
353223
+ const next2 = measured[i4 + 1];
353224
+ const currentPage = current.element.closest("[data-page-index]");
353225
+ if (!currentPage || currentPage !== next2.element.closest("[data-page-index]"))
353226
+ continue;
353227
+ const rawGap = next2.rect.top - current.rect.bottom;
353228
+ const scaleY = current.rect.height && current.element.offsetHeight ? current.rect.height / current.element.offsetHeight : 1;
353229
+ const gap = scaleY > 0 ? rawGap / scaleY : rawGap;
353230
+ if (gap > 0)
353231
+ current.element.style.setProperty("--toc-gap-below", `${gap + 1}px`);
352406
353232
  }
352407
- this.#clearHoveredStructuredContentBlockClass();
352408
- };
352409
- #clearHoveredStructuredContentBlockClass() {
352410
- if (!this.#lastHoveredStructuredContentBlock)
352411
- return;
352412
- this.#lastHoveredStructuredContentBlock.elements.forEach((element3) => {
352413
- element3.classList.remove(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
352414
- });
352415
- this.#lastHoveredStructuredContentBlock = null;
352416
353233
  }
352417
- #setHoveredStructuredContentBlockClass(id2) {
352418
- if (this.#lastHoveredStructuredContentBlock?.id === id2)
352419
- return;
352420
- this.#clearHoveredStructuredContentBlockClass();
353234
+ #queryTocEntryElementsById(id2) {
352421
353235
  if (!this.#painterHost)
352422
- return;
352423
- const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
352424
- if (elements.length === 0)
352425
- return;
352426
- elements.forEach((element3) => {
352427
- if (!element3.classList.contains("ProseMirror-selectednode"))
352428
- element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
352429
- });
352430
- this.#lastHoveredStructuredContentBlock = {
352431
- id: id2,
352432
- elements
352433
- };
352434
- }
352435
- #reapplySdtGroupHover() {
352436
- if (!this.#lastHoveredStructuredContentBlock || !this.#painterHost)
352437
- return;
352438
- const { id: id2 } = this.#lastHoveredStructuredContentBlock;
352439
- if (!id2)
352440
- return;
352441
- const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
352442
- if (elements.length === 0) {
352443
- this.#lastHoveredStructuredContentBlock = null;
352444
- return;
352445
- }
352446
- elements.forEach((element3) => {
352447
- if (!element3.classList.contains("ProseMirror-selectednode"))
352448
- element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
352449
- });
352450
- this.#lastHoveredStructuredContentBlock = {
352451
- id: id2,
352452
- elements
352453
- };
353236
+ return [];
353237
+ const escapedId = escapeAttrValue(id2);
353238
+ return Array.from(this.#painterHost.querySelectorAll(`.${DOM_CLASS_NAMES.TOC_ENTRY}[data-toc-id="${escapedId}"]`));
352454
353239
  }
352455
353240
  #refreshEditorDomAugmentations() {
352456
353241
  this.#postPaintPipeline.refreshAfterPaint({
@@ -352459,7 +353244,8 @@ function print() { __p += __j.call(arguments, '') }
352459
353244
  domPositionIndex: this.#domPositionIndex,
352460
353245
  proofingAnnotations: this.#buildProofingAnnotations(),
352461
353246
  rebuildDomPositionIndex: () => this.#rebuildDomPositionIndex(),
352462
- reapplyStructuredContentHover: () => this.#reapplySdtGroupHover()
353247
+ reapplyStructuredContentHover: () => this.#sdtHoverCoordinator?.reapply(),
353248
+ reapplyTocGroupHover: () => this.#tocHoverCoordinator?.reapply()
352463
353249
  });
352464
353250
  }
352465
353251
  #clearSelectedStructuredContentInlineClass() {
@@ -354847,11 +355633,11 @@ function print() { __p += __j.call(arguments, '') }
354847
355633
  ]);
354848
355634
  });
354849
355635
 
354850
- // ../../packages/superdoc/dist/chunks/create-super-doc-ui-BT9gcxxx.es.js
355636
+ // ../../packages/superdoc/dist/chunks/create-super-doc-ui---bNCP-9.es.js
354851
355637
  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;
354852
- var init_create_super_doc_ui_BT9gcxxx_es = __esm(() => {
354853
- init_SuperConverter_C6RGktKO_es();
354854
- init_create_headless_toolbar_D7rUpTS1_es();
355638
+ var init_create_super_doc_ui_bNCP_9_es = __esm(() => {
355639
+ init_SuperConverter_BSDZ3hYr_es();
355640
+ init_create_headless_toolbar_CKZ579SH_es();
354855
355641
  headlessToolbarConstants = {
354856
355642
  DEFAULT_TEXT_ALIGN_OPTIONS: [
354857
355643
  {
@@ -355133,16 +355919,16 @@ var init_zipper_yaJVJ4z9_es = __esm(() => {
355133
355919
 
355134
355920
  // ../../packages/superdoc/dist/super-editor.es.js
355135
355921
  var init_super_editor_es = __esm(() => {
355136
- init_src_D29bOSuq_es();
355137
- init_SuperConverter_C6RGktKO_es();
355922
+ init_src_BXck1nRd_es();
355923
+ init_SuperConverter_BSDZ3hYr_es();
355138
355924
  init_jszip_C49i9kUs_es();
355139
355925
  init_xml_js_CqGKpaft_es();
355140
- init_create_headless_toolbar_D7rUpTS1_es();
355926
+ init_create_headless_toolbar_CKZ579SH_es();
355141
355927
  init_constants_D9qj59G2_es();
355142
355928
  init_dist_B8HfvhaK_es();
355143
355929
  init_unified_Dsuw2be5_es();
355144
355930
  init_DocxZipper_FUsfThjV_es();
355145
- init_create_super_doc_ui_BT9gcxxx_es();
355931
+ init_create_super_doc_ui_bNCP_9_es();
355146
355932
  init_ui_C5PAS9hY_es();
355147
355933
  init_eventemitter3_BnGqBE_Q_es();
355148
355934
  init_errors_CNaD6vcg_es();
@@ -456352,12 +457138,13 @@ var init_exporter = __esm(() => {
456352
457138
  // ../../shared/font-system/src/types.ts
456353
457139
  var init_types8 = () => {};
456354
457140
 
456355
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.2.0/node_modules/@docfonts/fallbacks/dist/data.js
457141
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/data.js
456356
457142
  var SUBSTITUTION_EVIDENCE2;
456357
457143
  var init_data = __esm(() => {
456358
457144
  SUBSTITUTION_EVIDENCE2 = [
456359
457145
  {
456360
457146
  evidenceId: "calibri",
457147
+ generic: "sans-serif",
456361
457148
  logicalFamily: "Calibri",
456362
457149
  physicalFamily: "Carlito",
456363
457150
  verdict: "metric_safe",
@@ -456380,6 +457167,7 @@ var init_data = __esm(() => {
456380
457167
  ],
456381
457168
  exportRule: "preserve_original_name",
456382
457169
  advance: {
457170
+ basis: "latin_full",
456383
457171
  meanDelta: 0,
456384
457172
  maxDelta: 0
456385
457173
  },
@@ -456387,6 +457175,7 @@ var init_data = __esm(() => {
456387
457175
  },
456388
457176
  {
456389
457177
  evidenceId: "cambria",
457178
+ generic: "serif",
456390
457179
  logicalFamily: "Cambria",
456391
457180
  physicalFamily: "Caladea",
456392
457181
  verdict: "visual_only",
@@ -456411,6 +457200,7 @@ var init_data = __esm(() => {
456411
457200
  ],
456412
457201
  exportRule: "preserve_original_name",
456413
457202
  advance: {
457203
+ basis: "latin_full",
456414
457204
  meanDelta: 0.0002378,
456415
457205
  maxDelta: 0.2310758
456416
457206
  },
@@ -456432,6 +457222,7 @@ var init_data = __esm(() => {
456432
457222
  },
456433
457223
  {
456434
457224
  evidenceId: "arial",
457225
+ generic: "sans-serif",
456435
457226
  logicalFamily: "Arial",
456436
457227
  physicalFamily: "Liberation Sans",
456437
457228
  verdict: "metric_safe",
@@ -456453,6 +457244,7 @@ var init_data = __esm(() => {
456453
457244
  ],
456454
457245
  exportRule: "preserve_original_name",
456455
457246
  advance: {
457247
+ basis: "latin_full",
456456
457248
  meanDelta: 0,
456457
457249
  maxDelta: 0
456458
457250
  },
@@ -456460,6 +457252,7 @@ var init_data = __esm(() => {
456460
457252
  },
456461
457253
  {
456462
457254
  evidenceId: "times-new-roman",
457255
+ generic: "serif",
456463
457256
  logicalFamily: "Times New Roman",
456464
457257
  physicalFamily: "Liberation Serif",
456465
457258
  verdict: "metric_safe",
@@ -456481,6 +457274,7 @@ var init_data = __esm(() => {
456481
457274
  ],
456482
457275
  exportRule: "preserve_original_name",
456483
457276
  advance: {
457277
+ basis: "latin_full",
456484
457278
  meanDelta: 0,
456485
457279
  maxDelta: 0
456486
457280
  },
@@ -456488,6 +457282,7 @@ var init_data = __esm(() => {
456488
457282
  },
456489
457283
  {
456490
457284
  evidenceId: "courier-new",
457285
+ generic: "monospace",
456491
457286
  logicalFamily: "Courier New",
456492
457287
  physicalFamily: "Liberation Mono",
456493
457288
  verdict: "metric_safe",
@@ -456509,6 +457304,7 @@ var init_data = __esm(() => {
456509
457304
  ],
456510
457305
  exportRule: "preserve_original_name",
456511
457306
  advance: {
457307
+ basis: "latin_full",
456512
457308
  meanDelta: 0,
456513
457309
  maxDelta: 0
456514
457310
  },
@@ -456516,6 +457312,7 @@ var init_data = __esm(() => {
456516
457312
  },
456517
457313
  {
456518
457314
  evidenceId: "georgia",
457315
+ generic: "serif",
456519
457316
  logicalFamily: "Georgia",
456520
457317
  physicalFamily: "Gelasio",
456521
457318
  verdict: "near_metric",
@@ -456544,6 +457341,7 @@ var init_data = __esm(() => {
456544
457341
  ],
456545
457342
  exportRule: "preserve_original_name",
456546
457343
  advance: {
457344
+ basis: "latin_full",
456547
457345
  meanDelta: 0.0000197,
456548
457346
  maxDelta: 0.0183727
456549
457347
  },
@@ -456571,6 +457369,7 @@ var init_data = __esm(() => {
456571
457369
  },
456572
457370
  {
456573
457371
  evidenceId: "arial-narrow",
457372
+ generic: "sans-serif",
456574
457373
  logicalFamily: "Arial Narrow",
456575
457374
  physicalFamily: "Liberation Sans Narrow",
456576
457375
  verdict: "visual_only",
@@ -456595,6 +457394,7 @@ var init_data = __esm(() => {
456595
457394
  ],
456596
457395
  exportRule: "preserve_original_name",
456597
457396
  advance: {
457397
+ basis: "latin_full",
456598
457398
  meanDelta: 0,
456599
457399
  maxDelta: 0.5
456600
457400
  },
@@ -456616,6 +457416,7 @@ var init_data = __esm(() => {
456616
457416
  },
456617
457417
  {
456618
457418
  evidenceId: "aptos",
457419
+ generic: "sans-serif",
456619
457420
  logicalFamily: "Aptos",
456620
457421
  physicalFamily: null,
456621
457422
  verdict: "no_substitute",
@@ -456638,8 +457439,152 @@ var init_data = __esm(() => {
456638
457439
  exportRule: "preserve_original_name",
456639
457440
  candidateLicense: null
456640
457441
  },
457442
+ {
457443
+ evidenceId: "arial-black",
457444
+ generic: "sans-serif",
457445
+ logicalFamily: "Arial Black",
457446
+ physicalFamily: "Archivo Black",
457447
+ verdict: "visual_only",
457448
+ faces: {
457449
+ regular: true,
457450
+ bold: false,
457451
+ italic: false,
457452
+ boldItalic: false
457453
+ },
457454
+ faceSources: {
457455
+ italic: {
457456
+ kind: "synthetic",
457457
+ from: "regular"
457458
+ }
457459
+ },
457460
+ gates: {
457461
+ static: "pass",
457462
+ metric: "fail",
457463
+ layout: "not_run",
457464
+ ship: "fail"
457465
+ },
457466
+ policyAction: "substitute",
457467
+ measurementRefs: [
457468
+ "arial-black__archivo-black#visual_review#2026-06-09"
457469
+ ],
457470
+ exportRule: "preserve_original_name",
457471
+ candidateLicense: "OFL-1.1",
457472
+ faceVerdicts: {
457473
+ italic: "visual_only"
457474
+ }
457475
+ },
457476
+ {
457477
+ evidenceId: "arial-rounded-mt-bold",
457478
+ generic: "sans-serif",
457479
+ logicalFamily: "Arial Rounded MT Bold",
457480
+ physicalFamily: "Ubuntu",
457481
+ verdict: "visual_only",
457482
+ faces: {
457483
+ regular: true,
457484
+ bold: true,
457485
+ italic: true,
457486
+ boldItalic: true
457487
+ },
457488
+ gates: {
457489
+ static: "pass",
457490
+ metric: "fail",
457491
+ layout: "not_run",
457492
+ ship: "fail"
457493
+ },
457494
+ policyAction: "category_fallback",
457495
+ measurementRefs: [
457496
+ "arial-rounded-mt-bold__ubuntu#visual_review#2026-06-09"
457497
+ ],
457498
+ exportRule: "preserve_original_name",
457499
+ candidateLicense: "Ubuntu-font-1.0"
457500
+ },
457501
+ {
457502
+ evidenceId: "bookman-old-style",
457503
+ generic: "serif",
457504
+ logicalFamily: "Bookman Old Style",
457505
+ physicalFamily: "TeX Gyre Bonum",
457506
+ verdict: "visual_only",
457507
+ faces: {
457508
+ regular: true,
457509
+ bold: true,
457510
+ italic: true,
457511
+ boldItalic: true
457512
+ },
457513
+ gates: {
457514
+ static: "pass",
457515
+ metric: "fail",
457516
+ layout: "not_run",
457517
+ ship: "fail"
457518
+ },
457519
+ policyAction: "substitute",
457520
+ measurementRefs: [
457521
+ "bookman-old-style__tex-gyre-bonum#visual_review#2026-06-09"
457522
+ ],
457523
+ exportRule: "preserve_original_name",
457524
+ candidateLicense: "GUST-Font-License-1.0"
457525
+ },
457526
+ {
457527
+ evidenceId: "century",
457528
+ generic: "serif",
457529
+ logicalFamily: "Century",
457530
+ physicalFamily: "C059",
457531
+ verdict: "visual_only",
457532
+ faces: {
457533
+ regular: true,
457534
+ bold: true,
457535
+ italic: true,
457536
+ boldItalic: true
457537
+ },
457538
+ gates: {
457539
+ static: "pass",
457540
+ metric: "fail",
457541
+ layout: "not_run",
457542
+ ship: "fail"
457543
+ },
457544
+ policyAction: "substitute",
457545
+ measurementRefs: [
457546
+ "century__c059#visual_review#2026-06-09"
457547
+ ],
457548
+ exportRule: "preserve_original_name",
457549
+ candidateLicense: "AGPL-3.0-only WITH PS-or-PDF-font-exception-20170817"
457550
+ },
457551
+ {
457552
+ evidenceId: "garamond",
457553
+ generic: "serif",
457554
+ logicalFamily: "Garamond",
457555
+ physicalFamily: "Cardo",
457556
+ verdict: "visual_only",
457557
+ faces: {
457558
+ regular: true,
457559
+ bold: true,
457560
+ italic: true,
457561
+ boldItalic: false
457562
+ },
457563
+ faceSources: {
457564
+ boldItalic: {
457565
+ kind: "synthetic",
457566
+ from: "bold"
457567
+ }
457568
+ },
457569
+ gates: {
457570
+ static: "pass",
457571
+ metric: "fail",
457572
+ layout: "not_run",
457573
+ ship: "fail"
457574
+ },
457575
+ policyAction: "category_fallback",
457576
+ measurementRefs: [
457577
+ "garamond__cardo#visual_review#2026-06-09"
457578
+ ],
457579
+ exportRule: "preserve_original_name",
457580
+ candidateLicense: "OFL-1.1",
457581
+ faceVerdicts: {
457582
+ boldItalic: "visual_only"
457583
+ }
457584
+ },
456641
457585
  {
456642
457586
  evidenceId: "consolas",
457587
+ generic: "monospace",
456643
457588
  logicalFamily: "Consolas",
456644
457589
  physicalFamily: "Inconsolata SemiExpanded",
456645
457590
  verdict: "cell_width_only",
@@ -456661,6 +457606,7 @@ var init_data = __esm(() => {
456661
457606
  ],
456662
457607
  exportRule: "preserve_original_name",
456663
457608
  advance: {
457609
+ basis: "monospace_cell",
456664
457610
  meanDelta: 0.00035999999999999997,
456665
457611
  maxDelta: 0.00035999999999999997
456666
457612
  },
@@ -456668,6 +457614,7 @@ var init_data = __esm(() => {
456668
457614
  },
456669
457615
  {
456670
457616
  evidenceId: "verdana",
457617
+ generic: "sans-serif",
456671
457618
  logicalFamily: "Verdana",
456672
457619
  physicalFamily: null,
456673
457620
  verdict: "visual_only",
@@ -456692,82 +457639,96 @@ var init_data = __esm(() => {
456692
457639
  },
456693
457640
  {
456694
457641
  evidenceId: "tahoma",
457642
+ generic: "sans-serif",
456695
457643
  logicalFamily: "Tahoma",
456696
- physicalFamily: null,
457644
+ physicalFamily: "Noto Sans",
456697
457645
  verdict: "visual_only",
456698
457646
  faces: {
456699
- regular: false,
456700
- bold: false,
456701
- italic: false,
456702
- boldItalic: false
457647
+ regular: true,
457648
+ bold: true,
457649
+ italic: true,
457650
+ boldItalic: true
456703
457651
  },
456704
457652
  gates: {
456705
- static: "not_run",
457653
+ static: "pass",
456706
457654
  metric: "fail",
456707
457655
  layout: "not_run",
456708
- ship: "not_run"
457656
+ ship: "fail"
456709
457657
  },
456710
457658
  policyAction: "category_fallback",
456711
457659
  measurementRefs: [
456712
- "tahoma#top_candidates#2026-06-03"
457660
+ "tahoma__noto-sans#visual_review#2026-06-09"
456713
457661
  ],
456714
457662
  exportRule: "preserve_original_name",
456715
- candidateLicense: null
457663
+ candidateLicense: "OFL-1.1"
456716
457664
  },
456717
457665
  {
456718
457666
  evidenceId: "trebuchet-ms",
457667
+ generic: "sans-serif",
456719
457668
  logicalFamily: "Trebuchet MS",
456720
- physicalFamily: null,
457669
+ physicalFamily: "PT Sans",
456721
457670
  verdict: "visual_only",
456722
457671
  faces: {
456723
- regular: false,
456724
- bold: false,
456725
- italic: false,
456726
- boldItalic: false
457672
+ regular: true,
457673
+ bold: true,
457674
+ italic: true,
457675
+ boldItalic: true
456727
457676
  },
456728
457677
  gates: {
456729
- static: "not_run",
457678
+ static: "pass",
456730
457679
  metric: "fail",
456731
457680
  layout: "not_run",
456732
- ship: "not_run"
457681
+ ship: "fail"
456733
457682
  },
456734
457683
  policyAction: "category_fallback",
456735
457684
  measurementRefs: [
456736
- "trebuchet-ms#top_candidates#2026-06-03"
457685
+ "trebuchet-ms__pt-sans#visual_review#2026-06-09"
456737
457686
  ],
456738
457687
  exportRule: "preserve_original_name",
456739
- candidateLicense: null
457688
+ candidateLicense: "OFL-1.1"
456740
457689
  },
456741
457690
  {
456742
457691
  evidenceId: "comic-sans-ms",
457692
+ generic: "sans-serif",
456743
457693
  logicalFamily: "Comic Sans MS",
456744
- physicalFamily: "Comic Neue",
457694
+ physicalFamily: "Comic Relief",
456745
457695
  verdict: "visual_only",
456746
457696
  faces: {
456747
- regular: false,
456748
- bold: false,
457697
+ regular: true,
457698
+ bold: true,
456749
457699
  italic: false,
456750
457700
  boldItalic: false
456751
457701
  },
457702
+ faceSources: {
457703
+ italic: {
457704
+ kind: "synthetic",
457705
+ from: "regular"
457706
+ },
457707
+ boldItalic: {
457708
+ kind: "synthetic",
457709
+ from: "bold"
457710
+ }
457711
+ },
456752
457712
  gates: {
456753
- static: "not_run",
457713
+ static: "pass",
456754
457714
  metric: "fail",
456755
457715
  layout: "not_run",
456756
- ship: "not_run"
457716
+ ship: "fail"
456757
457717
  },
456758
457718
  policyAction: "category_fallback",
456759
457719
  measurementRefs: [
456760
- "comic-sans-ms__comic-neue#analytic_advance#2026-06-03"
457720
+ "comic-sans-ms__comic-relief#visual_review#2026-06-09"
456761
457721
  ],
456762
457722
  exportRule: "preserve_original_name",
456763
- advance: {
456764
- meanDelta: 0.1005,
456765
- maxDelta: 0.1419
456766
- },
456767
- candidateLicense: "OFL-1.1"
457723
+ candidateLicense: "OFL-1.1",
457724
+ faceVerdicts: {
457725
+ italic: "visual_only",
457726
+ boldItalic: "visual_only"
457727
+ }
456768
457728
  },
456769
457729
  {
456770
457730
  evidenceId: "candara",
457731
+ generic: "sans-serif",
456771
457732
  logicalFamily: "Candara",
456772
457733
  physicalFamily: null,
456773
457734
  verdict: "visual_only",
@@ -456792,6 +457753,7 @@ var init_data = __esm(() => {
456792
457753
  },
456793
457754
  {
456794
457755
  evidenceId: "constantia",
457756
+ generic: "serif",
456795
457757
  logicalFamily: "Constantia",
456796
457758
  physicalFamily: null,
456797
457759
  verdict: "visual_only",
@@ -456816,6 +457778,7 @@ var init_data = __esm(() => {
456816
457778
  },
456817
457779
  {
456818
457780
  evidenceId: "corbel",
457781
+ generic: "sans-serif",
456819
457782
  logicalFamily: "Corbel",
456820
457783
  physicalFamily: null,
456821
457784
  verdict: "visual_only",
@@ -456840,6 +457803,7 @@ var init_data = __esm(() => {
456840
457803
  },
456841
457804
  {
456842
457805
  evidenceId: "lucida-console",
457806
+ generic: "monospace",
456843
457807
  logicalFamily: "Lucida Console",
456844
457808
  physicalFamily: "Cousine",
456845
457809
  verdict: "cell_width_only",
@@ -456861,13 +457825,56 @@ var init_data = __esm(() => {
456861
457825
  ],
456862
457826
  exportRule: "preserve_original_name",
456863
457827
  advance: {
457828
+ basis: "monospace_cell",
456864
457829
  meanDelta: 0.004050000000000001,
456865
457830
  maxDelta: 0.004050000000000001
456866
457831
  },
456867
457832
  candidateLicense: "OFL-1.1"
456868
457833
  },
457834
+ {
457835
+ evidenceId: "gill-sans-mt-condensed",
457836
+ generic: "sans-serif",
457837
+ logicalFamily: "Gill Sans MT Condensed",
457838
+ physicalFamily: "PT Sans Narrow",
457839
+ verdict: "visual_only",
457840
+ faces: {
457841
+ regular: true,
457842
+ bold: true,
457843
+ italic: false,
457844
+ boldItalic: false
457845
+ },
457846
+ faceSources: {
457847
+ italic: {
457848
+ kind: "synthetic",
457849
+ from: "regular"
457850
+ },
457851
+ boldItalic: {
457852
+ kind: "synthetic",
457853
+ from: "bold"
457854
+ }
457855
+ },
457856
+ gates: {
457857
+ static: "pass",
457858
+ metric: "fail",
457859
+ layout: "not_run",
457860
+ ship: "fail"
457861
+ },
457862
+ policyAction: "category_fallback",
457863
+ measurementRefs: [
457864
+ "gill-sans-mt-condensed__pt-sans-narrow#visual_review#2026-06-09"
457865
+ ],
457866
+ exportRule: "preserve_original_name",
457867
+ candidateLicense: "OFL-1.1",
457868
+ faceVerdicts: {
457869
+ regular: "visual_only",
457870
+ bold: "visual_only",
457871
+ italic: "visual_only",
457872
+ boldItalic: "visual_only"
457873
+ }
457874
+ },
456869
457875
  {
456870
457876
  evidenceId: "aptos-display",
457877
+ generic: "sans-serif",
456871
457878
  logicalFamily: "Aptos Display",
456872
457879
  physicalFamily: null,
456873
457880
  verdict: "customer_supplied",
@@ -456889,6 +457896,7 @@ var init_data = __esm(() => {
456889
457896
  },
456890
457897
  {
456891
457898
  evidenceId: "cambria-math",
457899
+ generic: "serif",
456892
457900
  logicalFamily: "Cambria Math",
456893
457901
  physicalFamily: null,
456894
457902
  verdict: "preserve_only",
@@ -456910,6 +457918,7 @@ var init_data = __esm(() => {
456910
457918
  },
456911
457919
  {
456912
457920
  evidenceId: "helvetica",
457921
+ generic: "sans-serif",
456913
457922
  logicalFamily: "Helvetica",
456914
457923
  physicalFamily: "Liberation Sans",
456915
457924
  verdict: "metric_safe",
@@ -456931,6 +457940,7 @@ var init_data = __esm(() => {
456931
457940
  ],
456932
457941
  exportRule: "preserve_original_name",
456933
457942
  advance: {
457943
+ basis: "latin_full",
456934
457944
  meanDelta: 0,
456935
457945
  maxDelta: 0
456936
457946
  },
@@ -456938,6 +457948,7 @@ var init_data = __esm(() => {
456938
457948
  },
456939
457949
  {
456940
457950
  evidenceId: "calibri-light",
457951
+ generic: "sans-serif",
456941
457952
  logicalFamily: "Calibri Light",
456942
457953
  physicalFamily: "Carlito",
456943
457954
  verdict: "visual_only",
@@ -456959,6 +457970,7 @@ var init_data = __esm(() => {
456959
457970
  ],
456960
457971
  exportRule: "preserve_original_name",
456961
457972
  advance: {
457973
+ basis: "latin_full",
456962
457974
  meanDelta: 0.0148,
456963
457975
  maxDelta: 0.066
456964
457976
  },
@@ -456966,6 +457978,7 @@ var init_data = __esm(() => {
456966
457978
  },
456967
457979
  {
456968
457980
  evidenceId: "baskerville-old-face",
457981
+ generic: "serif",
456969
457982
  logicalFamily: "Baskerville Old Face",
456970
457983
  physicalFamily: "Bacasime Antique",
456971
457984
  verdict: "visual_only",
@@ -456987,6 +458000,7 @@ var init_data = __esm(() => {
456987
458000
  ],
456988
458001
  exportRule: "preserve_original_name",
456989
458002
  advance: {
458003
+ basis: "latin_full",
456990
458004
  meanDelta: 0,
456991
458005
  maxDelta: 0.4915590863952334
456992
458006
  },
@@ -457002,39 +458016,128 @@ var init_data = __esm(() => {
457002
458016
  note: "Bacasime Antique Regular's no-break space (U+00A0) advance diverges ~49% from Baskerville Old Face; lines containing NBSP reflow. Every other Latin-core glyph is advance-identical, which is why this is visual_only with a single named exception, not near_metric."
457003
458017
  }
457004
458018
  ]
458019
+ },
458020
+ {
458021
+ evidenceId: "cooper-black",
458022
+ generic: "serif",
458023
+ logicalFamily: "Cooper Black",
458024
+ physicalFamily: "Caprasimo",
458025
+ verdict: "visual_only",
458026
+ faces: {
458027
+ regular: true,
458028
+ bold: false,
458029
+ italic: false,
458030
+ boldItalic: false
458031
+ },
458032
+ faceSources: {
458033
+ bold: {
458034
+ kind: "synthetic",
458035
+ from: "regular"
458036
+ },
458037
+ italic: {
458038
+ kind: "synthetic",
458039
+ from: "regular"
458040
+ },
458041
+ boldItalic: {
458042
+ kind: "synthetic",
458043
+ from: "regular"
458044
+ }
458045
+ },
458046
+ gates: {
458047
+ static: "pass",
458048
+ metric: "pass",
458049
+ layout: "not_run",
458050
+ ship: "not_run"
458051
+ },
458052
+ policyAction: "substitute",
458053
+ measurementRefs: [
458054
+ "cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05",
458055
+ "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"
458056
+ ],
458057
+ exportRule: "preserve_original_name",
458058
+ advance: {
458059
+ basis: "latin_full",
458060
+ meanDelta: 0,
458061
+ maxDelta: 0
458062
+ },
458063
+ candidateLicense: "OFL-1.1",
458064
+ faceVerdicts: {
458065
+ regular: "metric_safe",
458066
+ bold: "visual_only",
458067
+ italic: "visual_only",
458068
+ boldItalic: "visual_only"
458069
+ }
457005
458070
  }
457006
458071
  ];
457007
458072
  });
457008
458073
 
457009
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.2.0/node_modules/@docfonts/fallbacks/dist/fallbacks.js
458074
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/fallbacks.js
457010
458075
  function normalizeFamilyName2(name) {
457011
458076
  return name.trim().replace(/^['"]+|['"]+$/g, "").trim().toLowerCase();
457012
458077
  }
457013
- function buildFallback2(row2, physicalFamily) {
458078
+ function buildFallback2(row2, physicalFamily, verdict, faceSlot, faceSource) {
458079
+ const glyphExceptions = faceSlot ? row2.glyphExceptions?.filter((g2) => g2.slot === faceSlot) : row2.glyphExceptions ? [...row2.glyphExceptions] : undefined;
457014
458080
  return {
457015
458081
  substituteFamily: physicalFamily,
457016
458082
  policyAction: row2.policyAction,
457017
- verdict: row2.verdict,
457018
- lineBreakSafe: LINE_BREAK_SAFE_VERDICTS2.has(row2.verdict),
457019
- evidenceId: row2.evidenceId
458083
+ verdict,
458084
+ lineBreakSafe: LINE_BREAK_SAFE_VERDICTS2.has(verdict),
458085
+ faces: row2.faces,
458086
+ evidenceId: row2.evidenceId,
458087
+ generic: row2.generic,
458088
+ ...faceSource ? { faceSource: { ...faceSource } } : {},
458089
+ ...glyphExceptions && glyphExceptions.length > 0 ? { glyphExceptions } : {}
457020
458090
  };
457021
458091
  }
457022
458092
  function decideRow2(row2, canRenderFamily2) {
457023
- const { policyAction, physicalFamily, verdict, evidenceId } = row2;
458093
+ const { policyAction, physicalFamily, verdict, evidenceId, generic } = row2;
457024
458094
  if (policyAction === "preserve_only")
457025
- return { kind: "preserve_only", evidenceId };
458095
+ return { kind: "preserve_only", evidenceId, generic };
457026
458096
  if (policyAction === "customer_supplied")
457027
- return { kind: "customer_supplied", evidenceId };
458097
+ return { kind: "customer_supplied", evidenceId, generic };
457028
458098
  if (physicalFamily === null)
457029
- return { kind: "no_recommended_fallback", evidenceId };
458099
+ return { kind: "no_recommended_fallback", evidenceId, generic };
457030
458100
  if (canRenderFamily2 && !canRenderFamily2(physicalFamily))
457031
458101
  return {
457032
458102
  kind: "asset_missing",
457033
458103
  substituteFamily: physicalFamily,
457034
458104
  verdict,
457035
- evidenceId
458105
+ evidenceId,
458106
+ generic
458107
+ };
458108
+ return {
458109
+ kind: "fallback",
458110
+ fallback: buildFallback2(row2, physicalFamily, verdict)
458111
+ };
458112
+ }
458113
+ function isFaceScoped2(row2) {
458114
+ const f2 = row2.faces;
458115
+ return f2.regular || f2.bold || f2.italic || f2.boldItalic;
458116
+ }
458117
+ function faceSourceFor2(row2, face) {
458118
+ const explicit = row2.faceSources?.[face];
458119
+ if (explicit)
458120
+ return explicit;
458121
+ return isFaceScoped2(row2) && row2.faces[face] ? { kind: "real" } : undefined;
458122
+ }
458123
+ function decideRowForFace2(row2, face, canRenderFamily2) {
458124
+ const base6 = decideRow2(row2, canRenderFamily2);
458125
+ if (base6.kind !== "fallback")
458126
+ return base6;
458127
+ const faceSource = faceSourceFor2(row2, face);
458128
+ if (isFaceScoped2(row2) && !faceSource)
458129
+ return {
458130
+ kind: "face_missing",
458131
+ substituteFamily: base6.fallback.substituteFamily,
458132
+ evidenceId: row2.evidenceId,
458133
+ generic: row2.generic
457036
458134
  };
457037
- return { kind: "fallback", fallback: buildFallback2(row2, physicalFamily) };
458135
+ const faceVerdict = row2.faceVerdicts?.[face] ?? row2.verdict;
458136
+ const projectedFaceSource = faceSource?.kind === "synthetic" ? faceSource : undefined;
458137
+ return {
458138
+ kind: "fallback",
458139
+ fallback: buildFallback2(row2, base6.fallback.substituteFamily, faceVerdict, face, projectedFaceSource)
458140
+ };
457038
458141
  }
457039
458142
  function getFallbackDecision2(family2, options = {}) {
457040
458143
  const row2 = BY_LOGICAL2.get(normalizeFamilyName2(family2));
@@ -457044,6 +458147,10 @@ function getRenderableFallback2(family2, options) {
457044
458147
  const decision = getFallbackDecision2(family2, options);
457045
458148
  return decision.kind === "fallback" ? decision.fallback : null;
457046
458149
  }
458150
+ function getFallbackDecisionForFace2(family2, face, options = {}) {
458151
+ const row2 = BY_LOGICAL2.get(normalizeFamilyName2(family2));
458152
+ return row2 ? decideRowForFace2(row2, face, options.canRenderFamily) : { kind: "unknown" };
458153
+ }
457047
458154
  var LINE_BREAK_SAFE_VERDICTS2, BY_LOGICAL2;
457048
458155
  var init_fallbacks = __esm(() => {
457049
458156
  init_data();
@@ -457058,7 +458165,7 @@ var init_fallbacks = __esm(() => {
457058
458165
  ]));
457059
458166
  });
457060
458167
 
457061
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.2.0/node_modules/@docfonts/fallbacks/dist/index.js
458168
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/index.js
457062
458169
  var init_dist11 = __esm(() => {
457063
458170
  init_data();
457064
458171
  init_fallbacks();
@@ -457076,6 +458183,9 @@ function fourFaces2(filePrefix) {
457076
458183
  function family2(name, filePrefix, license) {
457077
458184
  return { family: name, license, faces: fourFaces2(filePrefix) };
457078
458185
  }
458186
+ function familyWithFaces2(name, license, faces) {
458187
+ return { family: name, license, faces };
458188
+ }
457079
458189
  var BUNDLED_MANIFEST2;
457080
458190
  var init_bundled_manifest = __esm(() => {
457081
458191
  BUNDLED_MANIFEST2 = Object.freeze([
@@ -457083,7 +458193,20 @@ var init_bundled_manifest = __esm(() => {
457083
458193
  family2("Caladea", "Caladea", "Apache-2.0"),
457084
458194
  family2("Liberation Sans", "LiberationSans", "OFL-1.1"),
457085
458195
  family2("Liberation Serif", "LiberationSerif", "OFL-1.1"),
457086
- family2("Liberation Mono", "LiberationMono", "OFL-1.1")
458196
+ family2("Liberation Mono", "LiberationMono", "OFL-1.1"),
458197
+ familyWithFaces2("Caprasimo", "OFL-1.1", [{ weight: "normal", style: "normal", file: "Caprasimo-Regular.woff2" }]),
458198
+ family2("Gelasio", "Gelasio", "OFL-1.1"),
458199
+ familyWithFaces2("Cardo", "OFL-1.1", [
458200
+ { weight: "normal", style: "normal", file: "Cardo-Regular.woff2" },
458201
+ { weight: "bold", style: "normal", file: "Cardo-Bold.woff2" },
458202
+ { weight: "normal", style: "italic", file: "Cardo-Italic.woff2" }
458203
+ ]),
458204
+ familyWithFaces2("Comic Relief", "OFL-1.1", [
458205
+ { weight: "normal", style: "normal", file: "ComicRelief-Regular.woff2" },
458206
+ { weight: "bold", style: "normal", file: "ComicRelief-Bold.woff2" }
458207
+ ]),
458208
+ family2("Noto Sans", "NotoSans", "OFL-1.1"),
458209
+ family2("PT Sans", "PTSans", "OFL-1.1")
457087
458210
  ]);
457088
458211
  });
457089
458212
 
@@ -457101,6 +458224,59 @@ function normalizeFamilyKey3(family3) {
457101
458224
  function sortPairs2(pairs) {
457102
458225
  return pairs.sort(([a2], [b2]) => a2 < b2 ? -1 : a2 > b2 ? 1 : 0);
457103
458226
  }
458227
+ function faceSlotFor2({ weight, style: style2 }) {
458228
+ const bold = weight === "700";
458229
+ const italic = style2 === "italic";
458230
+ if (bold && italic)
458231
+ return "boldItalic";
458232
+ if (bold)
458233
+ return "bold";
458234
+ if (italic)
458235
+ return "italic";
458236
+ return "regular";
458237
+ }
458238
+ function faceKeyForSlot2(slot) {
458239
+ switch (slot) {
458240
+ case "bold":
458241
+ return { weight: "700", style: "normal" };
458242
+ case "italic":
458243
+ return { weight: "400", style: "italic" };
458244
+ case "boldItalic":
458245
+ return { weight: "700", style: "italic" };
458246
+ case "regular":
458247
+ return { weight: "400", style: "normal" };
458248
+ }
458249
+ }
458250
+ function reasonForFallback2(policyAction) {
458251
+ return policyAction === "category_fallback" ? "category_fallback" : "bundled_substitute";
458252
+ }
458253
+ function resolveDocfontsFace2(primary, face, hasFace) {
458254
+ const decision = getFallbackDecisionForFace2(primary, faceSlotFor2(face), { canRenderFamily: canRenderFamily2 });
458255
+ if (decision.kind === "face_missing") {
458256
+ return { physical: primary, reason: "fallback_face_absent" };
458257
+ }
458258
+ if (decision.kind !== "fallback")
458259
+ return null;
458260
+ const fallback = decision.fallback;
458261
+ if (fallback.policyAction !== "substitute" && fallback.policyAction !== "category_fallback")
458262
+ return null;
458263
+ if (hasFace(fallback.substituteFamily, face.weight, face.style)) {
458264
+ return {
458265
+ physical: fallback.substituteFamily,
458266
+ reason: reasonForFallback2(fallback.policyAction)
458267
+ };
458268
+ }
458269
+ const sourceFace = fallback.faceSource?.kind === "synthetic" ? faceKeyForSlot2(fallback.faceSource.from) : face;
458270
+ if (!hasFace(fallback.substituteFamily, sourceFace.weight, sourceFace.style)) {
458271
+ return fallback.policyAction === "substitute" ? { physical: primary, reason: "fallback_face_absent" } : null;
458272
+ }
458273
+ const sourceDiffers = sourceFace.weight !== face.weight || sourceFace.style !== face.style;
458274
+ return {
458275
+ physical: fallback.substituteFamily,
458276
+ reason: reasonForFallback2(fallback.policyAction),
458277
+ ...sourceDiffers ? { sourceFace } : {}
458278
+ };
458279
+ }
457104
458280
  function deriveBundledSubstitutes2() {
457105
458281
  const substitutes = {};
457106
458282
  for (const row2 of SUBSTITUTION_EVIDENCE3) {
@@ -457223,14 +458399,10 @@ class FontResolver2 {
457223
458399
  if (hasFace(primary, face.weight, face.style)) {
457224
458400
  return { physical: primary, reason: "registered_face" };
457225
458401
  }
458402
+ const docfonts = resolveDocfontsFace2(primary, face, hasFace);
458403
+ if (docfonts)
458404
+ return docfonts;
457226
458405
  const bundled = BUNDLED_SUBSTITUTES2[key2];
457227
- if (bundled && hasFace(bundled, face.weight, face.style)) {
457228
- return { physical: bundled, reason: "bundled_substitute" };
457229
- }
457230
- const category = CATEGORY_FALLBACKS2[key2];
457231
- if (category && hasFace(category, face.weight, face.style)) {
457232
- return { physical: category, reason: "category_fallback" };
457233
- }
457234
458406
  if (override || bundled) {
457235
458407
  return { physical: primary, reason: "fallback_face_absent" };
457236
458408
  }
@@ -457256,8 +458428,13 @@ class FontResolver2 {
457256
458428
  resolveFace(logicalFamily, face, hasFace) {
457257
458429
  const parts = splitStack2(logicalFamily);
457258
458430
  const primary = parts[0] ?? logicalFamily;
457259
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
457260
- return { logicalFamily, physicalFamily: stripFamilyQuotes2(physical), reason };
458431
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
458432
+ return {
458433
+ logicalFamily,
458434
+ physicalFamily: stripFamilyQuotes2(physical),
458435
+ reason,
458436
+ ...sourceFace ? { sourceFace } : {}
458437
+ };
457261
458438
  }
457262
458439
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
457263
458440
  if (!cssFontFamily)
@@ -457707,7 +458884,7 @@ function deriveOfferings2() {
457707
458884
  return {
457708
458885
  logicalFamily: row2.logicalFamily,
457709
458886
  physicalFamily: row2.physicalFamily,
457710
- generic: row2.physicalFamily && PHYSICAL_GENERIC2[row2.physicalFamily] || "sans-serif",
458887
+ generic: row2.generic,
457711
458888
  offering: classifyOffering2(row2.policyAction, row2.verdict, row2.physicalFamily, bundled),
457712
458889
  bundled,
457713
458890
  verdict: row2.verdict,
@@ -457716,21 +458893,28 @@ function deriveOfferings2() {
457716
458893
  });
457717
458894
  return Object.freeze(offerings);
457718
458895
  }
457719
- var PHYSICAL_GENERIC2, BUNDLED_FAMILIES2, FONT_OFFERINGS2;
458896
+ var BUNDLED_FAMILIES2, ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES2, FONT_OFFERINGS2;
457720
458897
  var init_font_offerings = __esm(() => {
457721
- init_substitution_evidence();
457722
458898
  init_bundled_manifest();
457723
- PHYSICAL_GENERIC2 = Object.freeze({
457724
- Carlito: "sans-serif",
457725
- Caladea: "serif",
457726
- "Liberation Sans": "sans-serif",
457727
- "Liberation Serif": "serif",
457728
- "Liberation Mono": "monospace"
457729
- });
458899
+ init_substitution_evidence();
457730
458900
  BUNDLED_FAMILIES2 = new Set(BUNDLED_MANIFEST2.map((f2) => f2.family));
458901
+ ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES2 = new Set([
458902
+ "Cooper Black",
458903
+ "Comic Sans MS",
458904
+ "Garamond",
458905
+ "Georgia",
458906
+ "Tahoma",
458907
+ "Trebuchet MS"
458908
+ ]);
457731
458909
  FONT_OFFERINGS2 = deriveOfferings2();
457732
458910
  });
457733
458911
 
458912
+ // ../../shared/font-system/src/document-font-options.ts
458913
+ var init_document_font_options = __esm(() => {
458914
+ init_report();
458915
+ init_font_offerings();
458916
+ });
458917
+
457734
458918
  // ../../shared/font-system/src/index.ts
457735
458919
  var init_src5 = __esm(() => {
457736
458920
  init_types8();
@@ -457741,6 +458925,7 @@ var init_src5 = __esm(() => {
457741
458925
  init_os2();
457742
458926
  init_registry2();
457743
458927
  init_font_offerings();
458928
+ init_document_font_options();
457744
458929
  });
457745
458930
 
457746
458931
  // ../../packages/super-editor/src/editors/v1/core/super-converter/v2/exporter/commentsExporter.js