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

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 +1522 -291
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -52172,7 +52172,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
52172
52172
  emptyOptions2 = {};
52173
52173
  });
52174
52174
 
52175
- // ../../packages/superdoc/dist/chunks/SuperConverter-C6RGktKO.es.js
52175
+ // ../../packages/superdoc/dist/chunks/SuperConverter-DJyHekqW.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,
@@ -95369,6 +95546,7 @@ function groupTrackedChanges(editor) {
95369
95546
  return cached2.grouped;
95370
95547
  const marks = getRawTrackedMarks(editor);
95371
95548
  const byRawId = /* @__PURE__ */ new Map;
95549
+ const segmentsByRawId = /* @__PURE__ */ new Map;
95372
95550
  for (const item of marks) {
95373
95551
  const attrs = item.mark?.attrs ?? {};
95374
95552
  const id = toNonEmptyString(attrs.id);
@@ -95384,6 +95562,17 @@ function groupTrackedChanges(editor) {
95384
95562
  const wordRevisionIdKey = getWordRevisionIdKey(markType);
95385
95563
  const excerptText = !wordRevisionId || !hasChildTrackedMarkOnNode(item, id) ? getTrackedMarkText(editor, item) : "";
95386
95564
  const range = [item.from, item.to];
95565
+ const priorSegments = segmentsByRawId.get(groupKey);
95566
+ if (priorSegments)
95567
+ priorSegments.push({
95568
+ from: item.from,
95569
+ to: item.to
95570
+ });
95571
+ else
95572
+ segmentsByRawId.set(groupKey, [{
95573
+ from: item.from,
95574
+ to: item.to
95575
+ }]);
95387
95576
  if (!existing) {
95388
95577
  byRawId.set(groupKey, {
95389
95578
  rawId: groupKey,
@@ -95431,7 +95620,23 @@ function groupTrackedChanges(editor) {
95431
95620
  return a.id.localeCompare(b.id);
95432
95621
  });
95433
95622
  attachOverlapMetadata(grouped);
95434
- for (const structural of enumerateStructuralRowChanges(editor.state)) {
95623
+ const structuralChanges = enumerateStructuralRowChanges(editor.state);
95624
+ const wholeTableRanges = structuralChanges.filter((structural) => structural.decidable && structural.wholeTable).map((structural) => ({
95625
+ from: structural.tableFrom,
95626
+ to: structural.tableTo
95627
+ }));
95628
+ if (wholeTableRanges.length > 0) {
95629
+ const segmentInsideSomeTable = (segment) => wholeTableRanges.some((range) => segment.from >= range.from && segment.to <= range.to);
95630
+ for (let i$1 = grouped.length - 1;i$1 >= 0; i$1 -= 1) {
95631
+ const change = grouped[i$1];
95632
+ if ((segmentsByRawId.get(change.rawId) ?? [{
95633
+ from: change.from,
95634
+ to: change.to
95635
+ }]).every(segmentInsideSomeTable))
95636
+ grouped.splice(i$1, 1);
95637
+ }
95638
+ }
95639
+ for (const structural of structuralChanges) {
95435
95640
  const excerpt = normalizeExcerpt(editor.state.doc.textBetween(structural.tableFrom, structural.tableTo, " ", ""));
95436
95641
  const stableRawId = structural.sourceId ? `word:structural:${structural.sourceId}` : structural.id;
95437
95642
  grouped.push({
@@ -113559,18 +113764,10 @@ var isRegExp = (value) => {
113559
113764
  physical: primary,
113560
113765
  reason: "registered_face"
113561
113766
  };
113767
+ const docfonts = resolveDocfontsFace(primary, face, hasFace);
113768
+ if (docfonts)
113769
+ return docfonts;
113562
113770
  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
113771
  if (override || bundled)
113575
113772
  return {
113576
113773
  physical: primary,
@@ -113603,11 +113800,12 @@ var isRegExp = (value) => {
113603
113800
  }
113604
113801
  resolveFace(logicalFamily, face, hasFace) {
113605
113802
  const primary = splitStack(logicalFamily)[0] ?? logicalFamily;
113606
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
113803
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
113607
113804
  return {
113608
113805
  logicalFamily,
113609
113806
  physicalFamily: stripFamilyQuotes(physical),
113610
- reason
113807
+ reason,
113808
+ ...sourceFace ? { sourceFace } : {}
113611
113809
  };
113612
113810
  }
113613
113811
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
@@ -113632,7 +113830,17 @@ var isRegExp = (value) => {
113632
113830
  out.add(this.resolvePrimaryPhysicalFamily(family$1));
113633
113831
  return [...out];
113634
113832
  }
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 {
113833
+ }, defaultResolver, DEFAULT_FONT_MEASURE_CONTEXT, fontConfigVersion = 0, defaultAssetBase = "/fonts/", installedRegistries, faceSlotFor = ({ weight, style }) => {
113834
+ const bold = weight === "700";
113835
+ const italic = style === "italic";
113836
+ if (bold && italic)
113837
+ return "boldItalic";
113838
+ if (bold)
113839
+ return "bold";
113840
+ if (italic)
113841
+ return "italic";
113842
+ return "regular";
113843
+ }, 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
113844
  #fontSet;
113637
113845
  #FontFaceCtor;
113638
113846
  #probeSize;
@@ -113973,7 +114181,7 @@ var isRegExp = (value) => {
113973
114181
  const detail = sources && sources.length ? ` from ${sources.join(", ")}` : "";
113974
114182
  console.warn(`[superdoc] font asset failed to load for "${family$1}"${detail}. Check fonts.assetBaseUrl / fonts.resolveAssetUrl so the bundled .woff2 are served.`);
113975
114183
  }
113976
- }, registriesByFontSet, domlessRegistry = null, PHYSICAL_GENERIC, BUNDLED_FAMILIES, FONT_OFFERINGS, DEFAULT_FONT_ORDER, prepareCommentParaIds = (comment) => {
114184
+ }, registriesByFontSet, domlessRegistry = null, BUNDLED_FAMILIES, ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES, FONT_OFFERINGS, prepareCommentParaIds = (comment) => {
113977
114185
  return {
113978
114186
  ...comment,
113979
114187
  commentParaId: generateDocxRandomId()
@@ -117949,7 +118157,7 @@ var isRegExp = (value) => {
117949
118157
  state.kern = kernNode.attributes["w:val"];
117950
118158
  }
117951
118159
  }, SuperConverter;
117952
- var init_SuperConverter_C6RGktKO_es = __esm(() => {
118160
+ var init_SuperConverter_DJyHekqW_es = __esm(() => {
117953
118161
  init_rolldown_runtime_Bg48TavK_es();
117954
118162
  init_jszip_C49i9kUs_es();
117955
118163
  init_xml_js_CqGKpaft_es();
@@ -155269,6 +155477,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155269
155477
  SUBSTITUTION_EVIDENCE$1 = [
155270
155478
  {
155271
155479
  evidenceId: "calibri",
155480
+ generic: "sans-serif",
155272
155481
  logicalFamily: "Calibri",
155273
155482
  physicalFamily: "Carlito",
155274
155483
  verdict: "metric_safe",
@@ -155288,6 +155497,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155288
155497
  measurementRefs: ["calibri__carlito#analytic_advance#2026-06-03", "calibri__carlito#face_aggregate#2026-06-03"],
155289
155498
  exportRule: "preserve_original_name",
155290
155499
  advance: {
155500
+ basis: "latin_full",
155291
155501
  meanDelta: 0,
155292
155502
  maxDelta: 0
155293
155503
  },
@@ -155295,6 +155505,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155295
155505
  },
155296
155506
  {
155297
155507
  evidenceId: "cambria",
155508
+ generic: "serif",
155298
155509
  logicalFamily: "Cambria",
155299
155510
  physicalFamily: "Caladea",
155300
155511
  verdict: "visual_only",
@@ -155319,6 +155530,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155319
155530
  ],
155320
155531
  exportRule: "preserve_original_name",
155321
155532
  advance: {
155533
+ basis: "latin_full",
155322
155534
  meanDelta: 0.0002378,
155323
155535
  maxDelta: 0.2310758
155324
155536
  },
@@ -155338,6 +155550,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155338
155550
  },
155339
155551
  {
155340
155552
  evidenceId: "arial",
155553
+ generic: "sans-serif",
155341
155554
  logicalFamily: "Arial",
155342
155555
  physicalFamily: "Liberation Sans",
155343
155556
  verdict: "metric_safe",
@@ -155357,6 +155570,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155357
155570
  measurementRefs: ["arial__liberation-sans#analytic_advance#2026-06-03"],
155358
155571
  exportRule: "preserve_original_name",
155359
155572
  advance: {
155573
+ basis: "latin_full",
155360
155574
  meanDelta: 0,
155361
155575
  maxDelta: 0
155362
155576
  },
@@ -155364,6 +155578,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155364
155578
  },
155365
155579
  {
155366
155580
  evidenceId: "times-new-roman",
155581
+ generic: "serif",
155367
155582
  logicalFamily: "Times New Roman",
155368
155583
  physicalFamily: "Liberation Serif",
155369
155584
  verdict: "metric_safe",
@@ -155383,6 +155598,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155383
155598
  measurementRefs: ["times-new-roman__liberation-serif#analytic_advance#2026-06-03"],
155384
155599
  exportRule: "preserve_original_name",
155385
155600
  advance: {
155601
+ basis: "latin_full",
155386
155602
  meanDelta: 0,
155387
155603
  maxDelta: 0
155388
155604
  },
@@ -155390,6 +155606,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155390
155606
  },
155391
155607
  {
155392
155608
  evidenceId: "courier-new",
155609
+ generic: "monospace",
155393
155610
  logicalFamily: "Courier New",
155394
155611
  physicalFamily: "Liberation Mono",
155395
155612
  verdict: "metric_safe",
@@ -155409,6 +155626,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155409
155626
  measurementRefs: ["courier-new__liberation-mono#analytic_advance#2026-06-03"],
155410
155627
  exportRule: "preserve_original_name",
155411
155628
  advance: {
155629
+ basis: "latin_full",
155412
155630
  meanDelta: 0,
155413
155631
  maxDelta: 0
155414
155632
  },
@@ -155416,6 +155634,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155416
155634
  },
155417
155635
  {
155418
155636
  evidenceId: "georgia",
155637
+ generic: "serif",
155419
155638
  logicalFamily: "Georgia",
155420
155639
  physicalFamily: "Gelasio",
155421
155640
  verdict: "near_metric",
@@ -155444,6 +155663,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155444
155663
  ],
155445
155664
  exportRule: "preserve_original_name",
155446
155665
  advance: {
155666
+ basis: "latin_full",
155447
155667
  meanDelta: 0.0000197,
155448
155668
  maxDelta: 0.0183727
155449
155669
  },
@@ -155468,6 +155688,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155468
155688
  },
155469
155689
  {
155470
155690
  evidenceId: "arial-narrow",
155691
+ generic: "sans-serif",
155471
155692
  logicalFamily: "Arial Narrow",
155472
155693
  physicalFamily: "Liberation Sans Narrow",
155473
155694
  verdict: "visual_only",
@@ -155492,6 +155713,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155492
155713
  ],
155493
155714
  exportRule: "preserve_original_name",
155494
155715
  advance: {
155716
+ basis: "latin_full",
155495
155717
  meanDelta: 0,
155496
155718
  maxDelta: 0.5
155497
155719
  },
@@ -155511,6 +155733,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155511
155733
  },
155512
155734
  {
155513
155735
  evidenceId: "aptos",
155736
+ generic: "sans-serif",
155514
155737
  logicalFamily: "Aptos",
155515
155738
  physicalFamily: null,
155516
155739
  verdict: "no_substitute",
@@ -155531,8 +155754,134 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155531
155754
  exportRule: "preserve_original_name",
155532
155755
  candidateLicense: null
155533
155756
  },
155757
+ {
155758
+ evidenceId: "arial-black",
155759
+ generic: "sans-serif",
155760
+ logicalFamily: "Arial Black",
155761
+ physicalFamily: "Archivo Black",
155762
+ verdict: "visual_only",
155763
+ faces: {
155764
+ regular: true,
155765
+ bold: false,
155766
+ italic: false,
155767
+ boldItalic: false
155768
+ },
155769
+ faceSources: { italic: {
155770
+ kind: "synthetic",
155771
+ from: "regular"
155772
+ } },
155773
+ gates: {
155774
+ static: "pass",
155775
+ metric: "fail",
155776
+ layout: "not_run",
155777
+ ship: "fail"
155778
+ },
155779
+ policyAction: "substitute",
155780
+ measurementRefs: ["arial-black__archivo-black#visual_review#2026-06-09"],
155781
+ exportRule: "preserve_original_name",
155782
+ candidateLicense: "OFL-1.1",
155783
+ faceVerdicts: { italic: "visual_only" }
155784
+ },
155785
+ {
155786
+ evidenceId: "arial-rounded-mt-bold",
155787
+ generic: "sans-serif",
155788
+ logicalFamily: "Arial Rounded MT Bold",
155789
+ physicalFamily: "Ubuntu",
155790
+ verdict: "visual_only",
155791
+ faces: {
155792
+ regular: true,
155793
+ bold: true,
155794
+ italic: true,
155795
+ boldItalic: true
155796
+ },
155797
+ gates: {
155798
+ static: "pass",
155799
+ metric: "fail",
155800
+ layout: "not_run",
155801
+ ship: "fail"
155802
+ },
155803
+ policyAction: "category_fallback",
155804
+ measurementRefs: ["arial-rounded-mt-bold__ubuntu#visual_review#2026-06-09"],
155805
+ exportRule: "preserve_original_name",
155806
+ candidateLicense: "Ubuntu-font-1.0"
155807
+ },
155808
+ {
155809
+ evidenceId: "bookman-old-style",
155810
+ generic: "serif",
155811
+ logicalFamily: "Bookman Old Style",
155812
+ physicalFamily: "TeX Gyre Bonum",
155813
+ verdict: "visual_only",
155814
+ faces: {
155815
+ regular: true,
155816
+ bold: true,
155817
+ italic: true,
155818
+ boldItalic: true
155819
+ },
155820
+ gates: {
155821
+ static: "pass",
155822
+ metric: "fail",
155823
+ layout: "not_run",
155824
+ ship: "fail"
155825
+ },
155826
+ policyAction: "substitute",
155827
+ measurementRefs: ["bookman-old-style__tex-gyre-bonum#visual_review#2026-06-09"],
155828
+ exportRule: "preserve_original_name",
155829
+ candidateLicense: "GUST-Font-License-1.0"
155830
+ },
155831
+ {
155832
+ evidenceId: "century",
155833
+ generic: "serif",
155834
+ logicalFamily: "Century",
155835
+ physicalFamily: "C059",
155836
+ verdict: "visual_only",
155837
+ faces: {
155838
+ regular: true,
155839
+ bold: true,
155840
+ italic: true,
155841
+ boldItalic: true
155842
+ },
155843
+ gates: {
155844
+ static: "pass",
155845
+ metric: "fail",
155846
+ layout: "not_run",
155847
+ ship: "fail"
155848
+ },
155849
+ policyAction: "substitute",
155850
+ measurementRefs: ["century__c059#visual_review#2026-06-09"],
155851
+ exportRule: "preserve_original_name",
155852
+ candidateLicense: "AGPL-3.0-only WITH PS-or-PDF-font-exception-20170817"
155853
+ },
155854
+ {
155855
+ evidenceId: "garamond",
155856
+ generic: "serif",
155857
+ logicalFamily: "Garamond",
155858
+ physicalFamily: "Cardo",
155859
+ verdict: "visual_only",
155860
+ faces: {
155861
+ regular: true,
155862
+ bold: true,
155863
+ italic: true,
155864
+ boldItalic: false
155865
+ },
155866
+ faceSources: { boldItalic: {
155867
+ kind: "synthetic",
155868
+ from: "bold"
155869
+ } },
155870
+ gates: {
155871
+ static: "pass",
155872
+ metric: "fail",
155873
+ layout: "not_run",
155874
+ ship: "fail"
155875
+ },
155876
+ policyAction: "category_fallback",
155877
+ measurementRefs: ["garamond__cardo#visual_review#2026-06-09"],
155878
+ exportRule: "preserve_original_name",
155879
+ candidateLicense: "OFL-1.1",
155880
+ faceVerdicts: { boldItalic: "visual_only" }
155881
+ },
155534
155882
  {
155535
155883
  evidenceId: "consolas",
155884
+ generic: "monospace",
155536
155885
  logicalFamily: "Consolas",
155537
155886
  physicalFamily: "Inconsolata SemiExpanded",
155538
155887
  verdict: "cell_width_only",
@@ -155552,6 +155901,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155552
155901
  measurementRefs: ["consolas__inconsolata-semiexpanded#analytic_advance#2026-06-03"],
155553
155902
  exportRule: "preserve_original_name",
155554
155903
  advance: {
155904
+ basis: "monospace_cell",
155555
155905
  meanDelta: 0.00035999999999999997,
155556
155906
  maxDelta: 0.00035999999999999997
155557
155907
  },
@@ -155559,6 +155909,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155559
155909
  },
155560
155910
  {
155561
155911
  evidenceId: "verdana",
155912
+ generic: "sans-serif",
155562
155913
  logicalFamily: "Verdana",
155563
155914
  physicalFamily: null,
155564
155915
  verdict: "visual_only",
@@ -155581,76 +155932,90 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155581
155932
  },
155582
155933
  {
155583
155934
  evidenceId: "tahoma",
155935
+ generic: "sans-serif",
155584
155936
  logicalFamily: "Tahoma",
155585
- physicalFamily: null,
155937
+ physicalFamily: "Noto Sans",
155586
155938
  verdict: "visual_only",
155587
155939
  faces: {
155588
- regular: false,
155589
- bold: false,
155590
- italic: false,
155591
- boldItalic: false
155940
+ regular: true,
155941
+ bold: true,
155942
+ italic: true,
155943
+ boldItalic: true
155592
155944
  },
155593
155945
  gates: {
155594
- static: "not_run",
155946
+ static: "pass",
155595
155947
  metric: "fail",
155596
155948
  layout: "not_run",
155597
- ship: "not_run"
155949
+ ship: "fail"
155598
155950
  },
155599
155951
  policyAction: "category_fallback",
155600
- measurementRefs: ["tahoma#top_candidates#2026-06-03"],
155952
+ measurementRefs: ["tahoma__noto-sans#visual_review#2026-06-09"],
155601
155953
  exportRule: "preserve_original_name",
155602
- candidateLicense: null
155954
+ candidateLicense: "OFL-1.1"
155603
155955
  },
155604
155956
  {
155605
155957
  evidenceId: "trebuchet-ms",
155958
+ generic: "sans-serif",
155606
155959
  logicalFamily: "Trebuchet MS",
155607
- physicalFamily: null,
155960
+ physicalFamily: "PT Sans",
155608
155961
  verdict: "visual_only",
155609
155962
  faces: {
155610
- regular: false,
155611
- bold: false,
155612
- italic: false,
155613
- boldItalic: false
155963
+ regular: true,
155964
+ bold: true,
155965
+ italic: true,
155966
+ boldItalic: true
155614
155967
  },
155615
155968
  gates: {
155616
- static: "not_run",
155969
+ static: "pass",
155617
155970
  metric: "fail",
155618
155971
  layout: "not_run",
155619
- ship: "not_run"
155972
+ ship: "fail"
155620
155973
  },
155621
155974
  policyAction: "category_fallback",
155622
- measurementRefs: ["trebuchet-ms#top_candidates#2026-06-03"],
155975
+ measurementRefs: ["trebuchet-ms__pt-sans#visual_review#2026-06-09"],
155623
155976
  exportRule: "preserve_original_name",
155624
- candidateLicense: null
155977
+ candidateLicense: "OFL-1.1"
155625
155978
  },
155626
155979
  {
155627
155980
  evidenceId: "comic-sans-ms",
155981
+ generic: "sans-serif",
155628
155982
  logicalFamily: "Comic Sans MS",
155629
- physicalFamily: "Comic Neue",
155983
+ physicalFamily: "Comic Relief",
155630
155984
  verdict: "visual_only",
155631
155985
  faces: {
155632
- regular: false,
155633
- bold: false,
155986
+ regular: true,
155987
+ bold: true,
155634
155988
  italic: false,
155635
155989
  boldItalic: false
155636
155990
  },
155991
+ faceSources: {
155992
+ italic: {
155993
+ kind: "synthetic",
155994
+ from: "regular"
155995
+ },
155996
+ boldItalic: {
155997
+ kind: "synthetic",
155998
+ from: "bold"
155999
+ }
156000
+ },
155637
156001
  gates: {
155638
- static: "not_run",
156002
+ static: "pass",
155639
156003
  metric: "fail",
155640
156004
  layout: "not_run",
155641
- ship: "not_run"
156005
+ ship: "fail"
155642
156006
  },
155643
156007
  policyAction: "category_fallback",
155644
- measurementRefs: ["comic-sans-ms__comic-neue#analytic_advance#2026-06-03"],
156008
+ measurementRefs: ["comic-sans-ms__comic-relief#visual_review#2026-06-09"],
155645
156009
  exportRule: "preserve_original_name",
155646
- advance: {
155647
- meanDelta: 0.1005,
155648
- maxDelta: 0.1419
155649
- },
155650
- candidateLicense: "OFL-1.1"
156010
+ candidateLicense: "OFL-1.1",
156011
+ faceVerdicts: {
156012
+ italic: "visual_only",
156013
+ boldItalic: "visual_only"
156014
+ }
155651
156015
  },
155652
156016
  {
155653
156017
  evidenceId: "candara",
156018
+ generic: "sans-serif",
155654
156019
  logicalFamily: "Candara",
155655
156020
  physicalFamily: null,
155656
156021
  verdict: "visual_only",
@@ -155673,6 +156038,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155673
156038
  },
155674
156039
  {
155675
156040
  evidenceId: "constantia",
156041
+ generic: "serif",
155676
156042
  logicalFamily: "Constantia",
155677
156043
  physicalFamily: null,
155678
156044
  verdict: "visual_only",
@@ -155695,6 +156061,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155695
156061
  },
155696
156062
  {
155697
156063
  evidenceId: "corbel",
156064
+ generic: "sans-serif",
155698
156065
  logicalFamily: "Corbel",
155699
156066
  physicalFamily: null,
155700
156067
  verdict: "visual_only",
@@ -155717,6 +156084,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155717
156084
  },
155718
156085
  {
155719
156086
  evidenceId: "lucida-console",
156087
+ generic: "monospace",
155720
156088
  logicalFamily: "Lucida Console",
155721
156089
  physicalFamily: "Cousine",
155722
156090
  verdict: "cell_width_only",
@@ -155736,13 +156104,54 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155736
156104
  measurementRefs: ["lucida-console__cousine#analytic_advance#2026-06-03"],
155737
156105
  exportRule: "preserve_original_name",
155738
156106
  advance: {
156107
+ basis: "monospace_cell",
155739
156108
  meanDelta: 0.004050000000000001,
155740
156109
  maxDelta: 0.004050000000000001
155741
156110
  },
155742
156111
  candidateLicense: "OFL-1.1"
155743
156112
  },
156113
+ {
156114
+ evidenceId: "gill-sans-mt-condensed",
156115
+ generic: "sans-serif",
156116
+ logicalFamily: "Gill Sans MT Condensed",
156117
+ physicalFamily: "PT Sans Narrow",
156118
+ verdict: "visual_only",
156119
+ faces: {
156120
+ regular: true,
156121
+ bold: true,
156122
+ italic: false,
156123
+ boldItalic: false
156124
+ },
156125
+ faceSources: {
156126
+ italic: {
156127
+ kind: "synthetic",
156128
+ from: "regular"
156129
+ },
156130
+ boldItalic: {
156131
+ kind: "synthetic",
156132
+ from: "bold"
156133
+ }
156134
+ },
156135
+ gates: {
156136
+ static: "pass",
156137
+ metric: "fail",
156138
+ layout: "not_run",
156139
+ ship: "fail"
156140
+ },
156141
+ policyAction: "category_fallback",
156142
+ measurementRefs: ["gill-sans-mt-condensed__pt-sans-narrow#visual_review#2026-06-09"],
156143
+ exportRule: "preserve_original_name",
156144
+ candidateLicense: "OFL-1.1",
156145
+ faceVerdicts: {
156146
+ regular: "visual_only",
156147
+ bold: "visual_only",
156148
+ italic: "visual_only",
156149
+ boldItalic: "visual_only"
156150
+ }
156151
+ },
155744
156152
  {
155745
156153
  evidenceId: "aptos-display",
156154
+ generic: "sans-serif",
155746
156155
  logicalFamily: "Aptos Display",
155747
156156
  physicalFamily: null,
155748
156157
  verdict: "customer_supplied",
@@ -155764,6 +156173,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155764
156173
  },
155765
156174
  {
155766
156175
  evidenceId: "cambria-math",
156176
+ generic: "serif",
155767
156177
  logicalFamily: "Cambria Math",
155768
156178
  physicalFamily: null,
155769
156179
  verdict: "preserve_only",
@@ -155785,6 +156195,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155785
156195
  },
155786
156196
  {
155787
156197
  evidenceId: "helvetica",
156198
+ generic: "sans-serif",
155788
156199
  logicalFamily: "Helvetica",
155789
156200
  physicalFamily: "Liberation Sans",
155790
156201
  verdict: "metric_safe",
@@ -155804,6 +156215,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155804
156215
  measurementRefs: ["helvetica__liberation-sans#analytic_advance#2026-06-03"],
155805
156216
  exportRule: "preserve_original_name",
155806
156217
  advance: {
156218
+ basis: "latin_full",
155807
156219
  meanDelta: 0,
155808
156220
  maxDelta: 0
155809
156221
  },
@@ -155811,6 +156223,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155811
156223
  },
155812
156224
  {
155813
156225
  evidenceId: "calibri-light",
156226
+ generic: "sans-serif",
155814
156227
  logicalFamily: "Calibri Light",
155815
156228
  physicalFamily: "Carlito",
155816
156229
  verdict: "visual_only",
@@ -155830,6 +156243,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155830
156243
  measurementRefs: ["calibri-light__carlito#analytic_advance#2026-06-05"],
155831
156244
  exportRule: "preserve_original_name",
155832
156245
  advance: {
156246
+ basis: "latin_full",
155833
156247
  meanDelta: 0.0148,
155834
156248
  maxDelta: 0.066
155835
156249
  },
@@ -155837,6 +156251,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155837
156251
  },
155838
156252
  {
155839
156253
  evidenceId: "baskerville-old-face",
156254
+ generic: "serif",
155840
156255
  logicalFamily: "Baskerville Old Face",
155841
156256
  physicalFamily: "Bacasime Antique",
155842
156257
  verdict: "visual_only",
@@ -155856,6 +156271,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155856
156271
  measurementRefs: ["baskerville-old-face_regular__bacasime-antique#regular#w400#7dac1e5f#analytic_advance#2026-06-05"],
155857
156272
  exportRule: "preserve_original_name",
155858
156273
  advance: {
156274
+ basis: "latin_full",
155859
156275
  meanDelta: 0,
155860
156276
  maxDelta: 0.4915590863952334
155861
156277
  },
@@ -155867,6 +156283,54 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155867
156283
  advanceDelta: 0.4916,
155868
156284
  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
156285
  }]
156286
+ },
156287
+ {
156288
+ evidenceId: "cooper-black",
156289
+ generic: "serif",
156290
+ logicalFamily: "Cooper Black",
156291
+ physicalFamily: "Caprasimo",
156292
+ verdict: "visual_only",
156293
+ faces: {
156294
+ regular: true,
156295
+ bold: false,
156296
+ italic: false,
156297
+ boldItalic: false
156298
+ },
156299
+ faceSources: {
156300
+ bold: {
156301
+ kind: "synthetic",
156302
+ from: "regular"
156303
+ },
156304
+ italic: {
156305
+ kind: "synthetic",
156306
+ from: "regular"
156307
+ },
156308
+ boldItalic: {
156309
+ kind: "synthetic",
156310
+ from: "regular"
156311
+ }
156312
+ },
156313
+ gates: {
156314
+ static: "pass",
156315
+ metric: "pass",
156316
+ layout: "not_run",
156317
+ ship: "not_run"
156318
+ },
156319
+ policyAction: "substitute",
156320
+ measurementRefs: ["cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05", "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"],
156321
+ exportRule: "preserve_original_name",
156322
+ advance: {
156323
+ basis: "latin_full",
156324
+ meanDelta: 0,
156325
+ maxDelta: 0
156326
+ },
156327
+ candidateLicense: "OFL-1.1",
156328
+ faceVerdicts: {
156329
+ regular: "metric_safe",
156330
+ bold: "visual_only",
156331
+ italic: "visual_only",
156332
+ boldItalic: "visual_only"
156333
+ }
155870
156334
  }
155871
156335
  ];
155872
156336
  LINE_BREAK_SAFE_VERDICTS = new Set([
@@ -155880,7 +156344,41 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155880
156344
  family("Caladea", "Caladea", "Apache-2.0"),
155881
156345
  family("Liberation Sans", "LiberationSans", "OFL-1.1"),
155882
156346
  family("Liberation Serif", "LiberationSerif", "OFL-1.1"),
155883
- family("Liberation Mono", "LiberationMono", "OFL-1.1")
156347
+ family("Liberation Mono", "LiberationMono", "OFL-1.1"),
156348
+ familyWithFaces("Caprasimo", "OFL-1.1", [{
156349
+ weight: "normal",
156350
+ style: "normal",
156351
+ file: "Caprasimo-Regular.woff2"
156352
+ }]),
156353
+ family("Gelasio", "Gelasio", "OFL-1.1"),
156354
+ familyWithFaces("Cardo", "OFL-1.1", [
156355
+ {
156356
+ weight: "normal",
156357
+ style: "normal",
156358
+ file: "Cardo-Regular.woff2"
156359
+ },
156360
+ {
156361
+ weight: "bold",
156362
+ style: "normal",
156363
+ file: "Cardo-Bold.woff2"
156364
+ },
156365
+ {
156366
+ weight: "normal",
156367
+ style: "italic",
156368
+ file: "Cardo-Italic.woff2"
156369
+ }
156370
+ ]),
156371
+ familyWithFaces("Comic Relief", "OFL-1.1", [{
156372
+ weight: "normal",
156373
+ style: "normal",
156374
+ file: "ComicRelief-Regular.woff2"
156375
+ }, {
156376
+ weight: "bold",
156377
+ style: "normal",
156378
+ file: "ComicRelief-Bold.woff2"
156379
+ }]),
156380
+ family("Noto Sans", "NotoSans", "OFL-1.1"),
156381
+ family("PT Sans", "PTSans", "OFL-1.1")
155884
156382
  ]);
155885
156383
  SUBSTITUTION_EVIDENCE = SUBSTITUTION_EVIDENCE$1;
155886
156384
  bundledFamilies = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
@@ -155892,24 +156390,19 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
155892
156390
  fontSignature: ""
155893
156391
  });
155894
156392
  installedRegistries = /* @__PURE__ */ new WeakMap;
156393
+ RENDER_ALL = { canRenderFamily: () => true };
155895
156394
  OS2_MIN_LENGTH = OS2_FSSELECTION + 2;
155896
156395
  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
156396
  BUNDLED_FAMILIES = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
156397
+ ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES = new Set([
156398
+ "Cooper Black",
156399
+ "Comic Sans MS",
156400
+ "Garamond",
156401
+ "Georgia",
156402
+ "Tahoma",
156403
+ "Trebuchet MS"
156404
+ ]);
155905
156405
  FONT_OFFERINGS = deriveOfferings();
155906
- DEFAULT_FONT_ORDER = [
155907
- "Calibri",
155908
- "Arial",
155909
- "Courier New",
155910
- "Times New Roman",
155911
- "Helvetica"
155912
- ];
155913
156406
  ALL_COMMENT_TARGETS = COMMENT_FILE_BASENAMES;
155914
156407
  REL_ID_NUMERIC_PATTERN = /rId|mi/g;
155915
156408
  FOOTNOTES_CONFIG$1 = {
@@ -157696,7 +158189,7 @@ var init_SuperConverter_C6RGktKO_es = __esm(() => {
157696
158189
  };
157697
158190
  });
157698
158191
 
157699
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-D7rUpTS1.es.js
158192
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-Jmx2i-9i.es.js
157700
158193
  function parseSizeUnit(val = "0") {
157701
158194
  const length = val.toString() || "0";
157702
158195
  const value = Number.parseFloat(length);
@@ -168054,8 +168547,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, normalizeActorId = (value) => {
168054
168547
  }
168055
168548
  };
168056
168549
  };
168057
- var init_create_headless_toolbar_D7rUpTS1_es = __esm(() => {
168058
- init_SuperConverter_C6RGktKO_es();
168550
+ var init_create_headless_toolbar_Jmx2i_9i_es = __esm(() => {
168551
+ init_SuperConverter_DJyHekqW_es();
168059
168552
  init_uuid_B2wVPhPi_es();
168060
168553
  init_constants_D9qj59G2_es();
168061
168554
  init_dist_B8HfvhaK_es();
@@ -209096,7 +209589,7 @@ If you want to remount the same app, move your app creation logic into a factory
209096
209589
  var createVNodeWithArgsTransform = (...args2) => {
209097
209590
  return _createVNode(...vnodeArgsTransformer ? vnodeArgsTransformer(args2, currentRenderingInstance) : args2);
209098
209591
  };
209099
- var normalizeKey = ({ key: key2 }) => key2 != null ? key2 : null;
209592
+ var normalizeKey2 = ({ key: key2 }) => key2 != null ? key2 : null;
209100
209593
  var normalizeRef = ({
209101
209594
  ref: ref2,
209102
209595
  ref_key,
@@ -209113,7 +209606,7 @@ If you want to remount the same app, move your app creation logic into a factory
209113
209606
  __v_skip: true,
209114
209607
  type,
209115
209608
  props,
209116
- key: props && normalizeKey(props),
209609
+ key: props && normalizeKey2(props),
209117
209610
  ref: props && normalizeRef(props),
209118
209611
  scopeId: currentScopeId,
209119
209612
  slotScopeIds: null,
@@ -209213,7 +209706,7 @@ Component that was made reactive: `, type);
209213
209706
  __v_skip: true,
209214
209707
  type: vnode.type,
209215
209708
  props: mergedProps,
209216
- key: mergedProps && normalizeKey(mergedProps),
209709
+ key: mergedProps && normalizeKey2(mergedProps),
209217
209710
  ref: extraProps && extraProps.ref ? mergeRef && ref2 ? shared.isArray(ref2) ? ref2.concat(normalizeRef(extraProps)) : [ref2, normalizeRef(extraProps)] : normalizeRef(extraProps) : ref2,
209218
209711
  scopeId: vnode.scopeId,
209219
209712
  slotScopeIds: vnode.slotScopeIds,
@@ -222739,7 +223232,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
222739
223232
  init_remark_gfm_BhnWr3yf_es();
222740
223233
  });
222741
223234
 
222742
- // ../../packages/superdoc/dist/chunks/src-D29bOSuq.es.js
223235
+ // ../../packages/superdoc/dist/chunks/src-BB_FFFud.es.js
222743
223236
  function deleteProps(obj, propOrProps) {
222744
223237
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
222745
223238
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -231833,9 +232326,6 @@ function replaceCommand(wrap4, moveForward) {
231833
232326
  return true;
231834
232327
  };
231835
232328
  }
231836
- function buildSdtBlockSelector(escapedSdtId) {
231837
- return `.${DOM_CLASS_NAMES.BLOCK_SDT}[${DATA_ATTRS.SDT_ID}="${escapedSdtId}"]`;
231838
- }
231839
232329
  function buildAnnotationSelector() {
231840
232330
  return `.${DOM_CLASS_NAMES.ANNOTATION}[${DATA_ATTRS.PM_START}]`;
231841
232331
  }
@@ -235097,6 +235587,36 @@ function scrollToElement(targetElement, options = {
235097
235587
  behavior: options.behavior
235098
235588
  });
235099
235589
  }
235590
+ function normalizeToolbarFamily(value) {
235591
+ return String(value ?? "").trim().toLowerCase();
235592
+ }
235593
+ function compareToolbarFontOptions(a2, b$1) {
235594
+ return String(a2.label ?? "").trim().localeCompare(String(b$1.label ?? "").trim(), "en", { sensitivity: "base" });
235595
+ }
235596
+ function composeToolbarFontOptions(documentOptions, configFonts) {
235597
+ if (configFonts)
235598
+ return configFonts;
235599
+ if (!documentOptions?.length)
235600
+ return;
235601
+ const seen = new Set(TOOLBAR_FONTS.map((option) => normalizeToolbarFamily(option.label)));
235602
+ const merged = [...TOOLBAR_FONTS];
235603
+ for (const option of documentOptions) {
235604
+ const dedupeKey = normalizeToolbarFamily(option.logicalFamily);
235605
+ if (seen.has(dedupeKey))
235606
+ continue;
235607
+ seen.add(dedupeKey);
235608
+ merged.push({
235609
+ label: option.logicalFamily,
235610
+ key: option.logicalFamily,
235611
+ fontWeight: 400,
235612
+ props: {
235613
+ style: { fontFamily: option.previewFamily || option.logicalFamily },
235614
+ "data-item": "btn-fontFamily-option"
235615
+ }
235616
+ });
235617
+ }
235618
+ return merged.length > TOOLBAR_FONTS.length ? merged.sort(compareToolbarFontOptions) : undefined;
235619
+ }
235100
235620
  function isExtensionRulesEnabled(extension2, enabled) {
235101
235621
  if (Array.isArray(enabled))
235102
235622
  return enabled.some((enabledExtension) => {
@@ -263179,6 +263699,9 @@ function applySourceAnchorDataset(element3, sourceAnchor) {
263179
263699
  else
263180
263700
  delete element3.dataset.sourceOccurrenceId;
263181
263701
  }
263702
+ function allowFontSynthesis(element3) {
263703
+ element3.style.setProperty("font-synthesis", "weight style");
263704
+ }
263182
263705
  function getCellSegmentCount(cell2) {
263183
263706
  if (cell2.blocks && cell2.blocks.length > 0) {
263184
263707
  let total = 0;
@@ -267723,7 +268246,10 @@ function calculateBalancedColumnHeight(ctx$1, config3 = DEFAULT_BALANCING_CONFIG
267723
268246
  iterations: 0
267724
268247
  };
267725
268248
  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);
268249
+ const maxBlockHeight = ctx$1.contentBlocks.reduce((m$1, b$1) => {
268250
+ const indivisible = b$1.canBreak && b$1.lineHeights && b$1.lineHeights.length > 1 ? Math.max(...b$1.lineHeights) : b$1.measuredHeight;
268251
+ return Math.max(m$1, indivisible);
268252
+ }, 0);
267727
268253
  if (totalHeight < config3.minColumnHeight * ctx$1.columnCount)
267728
268254
  return createSingleColumnResult(ctx$1);
267729
268255
  let lo = Math.max(maxBlockHeight, config3.minColumnHeight);
@@ -267893,6 +268419,8 @@ function shouldSkipBalancing(ctx$1, config3 = DEFAULT_BALANCING_CONFIG) {
267893
268419
  }
267894
268420
  function getFragmentHeight(fragment, measureMap) {
267895
268421
  if (fragment.kind === "para") {
268422
+ if (fragment.lines && fragment.lines.length > 0)
268423
+ return fragment.lines.reduce((sum$1, l) => sum$1 + (l.lineHeight ?? 0), 0);
267896
268424
  const measure = measureMap.get(fragment.blockId);
267897
268425
  if (!measure || measure.kind !== "paragraph" || !measure.lines)
267898
268426
  return 0;
@@ -267973,13 +268501,38 @@ function balanceSectionOnPage(args$1) {
267973
268501
  return a2.x - b$1.x;
267974
268502
  return a2.y - b$1.y;
267975
268503
  });
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
- }));
268504
+ const lineHeightsFor = (f2) => {
268505
+ if (f2.kind !== "para")
268506
+ return;
268507
+ if (args$1.sectPrMarkerBlockIds?.has(f2.blockId))
268508
+ return;
268509
+ if (args$1.keepLinesBlockIds?.has(f2.blockId))
268510
+ return;
268511
+ if (f2.lines && f2.lines.length > 0) {
268512
+ if (f2.lines.length <= 1)
268513
+ return;
268514
+ return f2.lines.map((l) => l.lineHeight);
268515
+ }
268516
+ const measure = args$1.measureMap.get(f2.blockId);
268517
+ if (!measure || measure.kind !== "paragraph" || !Array.isArray(measure.lines))
268518
+ return;
268519
+ const fromLine = f2.fromLine ?? 0;
268520
+ const toLine = f2.toLine ?? measure.lines.length;
268521
+ if (toLine - fromLine <= 1)
268522
+ return;
268523
+ return measure.lines.slice(fromLine, toLine).map((l) => l.lineHeight);
268524
+ };
268525
+ const contentBlocks = ordered.map((f2, i4) => {
268526
+ const lineHeights = lineHeightsFor(f2);
268527
+ return {
268528
+ blockId: `${f2.blockId}#${i4}`,
268529
+ measuredHeight: getBalancingHeight(f2, args$1.measureMap, args$1.sectPrMarkerBlockIds),
268530
+ canBreak: lineHeights !== undefined,
268531
+ keepWithNext: false,
268532
+ keepTogether: lineHeights === undefined,
268533
+ lineHeights
268534
+ };
268535
+ });
267983
268536
  if (shouldSkipBalancing({
267984
268537
  columnCount,
267985
268538
  columnWidth,
@@ -268014,6 +268567,39 @@ function balanceSectionOnPage(args$1) {
268014
268567
  f2.x = columnX(col);
268015
268568
  f2.y = colCursors[col];
268016
268569
  f2.width = columnWidth;
268570
+ const bp = result.blockBreakPoints?.get(block.blockId);
268571
+ if (bp && bp.heightAfterBreak > 0 && col < columnCount - 1) {
268572
+ const splitLine = (f2.fromLine ?? 0) + bp.breakAfterLine + 1;
268573
+ const measureLineCount = args$1.measureMap.get(f2.blockId)?.lines?.length ?? splitLine;
268574
+ const originalToLine = f2.toLine ?? measureLineCount;
268575
+ const originalContinuesOnNext = f2.continuesOnNext ?? false;
268576
+ const secondHalf = {
268577
+ ...f2,
268578
+ fromLine: splitLine,
268579
+ toLine: originalToLine,
268580
+ x: columnX(col + 1),
268581
+ y: colCursors[col + 1],
268582
+ width: columnWidth,
268583
+ continuesFromPrev: true,
268584
+ continuesOnNext: originalContinuesOnNext
268585
+ };
268586
+ if (f2.lines && f2.lines.length > 0) {
268587
+ secondHalf.lines = f2.lines.slice(bp.breakAfterLine + 1);
268588
+ f2.lines = f2.lines.slice(0, bp.breakAfterLine + 1);
268589
+ }
268590
+ f2.toLine = splitLine;
268591
+ f2.continuesOnNext = true;
268592
+ colCursors[col] += bp.heightBeforeBreak;
268593
+ colCursors[col + 1] += bp.heightAfterBreak;
268594
+ const fragIdx = fragments.indexOf(f2);
268595
+ if (fragIdx >= 0)
268596
+ fragments.splice(fragIdx + 1, 0, secondHalf);
268597
+ if (colCursors[col] > maxY)
268598
+ maxY = colCursors[col];
268599
+ if (colCursors[col + 1] > maxY)
268600
+ maxY = colCursors[col + 1];
268601
+ continue;
268602
+ }
268017
268603
  colCursors[col] += block.measuredHeight;
268018
268604
  if (colCursors[col] > maxY)
268019
268605
  maxY = colCursors[col];
@@ -269165,6 +269751,7 @@ function layoutDocument(blocks2, measures, options = {}) {
269165
269751
  const sectionTypeIsExplicit = /* @__PURE__ */ new Map;
269166
269752
  let lastSectionIdx = null;
269167
269753
  const sectPrMarkerBlockIds = /* @__PURE__ */ new Set;
269754
+ const keepLinesBlockIds = /* @__PURE__ */ new Set;
269168
269755
  let documentHasExplicitColumnBreak = false;
269169
269756
  let documentHasAnySectionBreak = false;
269170
269757
  const alreadyBalancedSections = /* @__PURE__ */ new Set;
@@ -269198,6 +269785,8 @@ function layoutDocument(blocks2, measures, options = {}) {
269198
269785
  documentHasExplicitColumnBreak = true;
269199
269786
  if (block.kind === "paragraph" && blockWithAttrs.attrs?.sectPrMarker === true)
269200
269787
  sectPrMarkerBlockIds.add(block.id);
269788
+ if (block.kind === "paragraph" && blockWithAttrs.attrs?.keepLines === true)
269789
+ keepLinesBlockIds.add(block.id);
269201
269790
  });
269202
269791
  const anchoredByParagraph = collectAnchoredDrawings(blocks2, measures);
269203
269792
  const anchoredTables = collectAnchoredTables(blocks2, measures);
@@ -269416,7 +270005,8 @@ function layoutDocument(blocks2, measures, options = {}) {
269416
270005
  columnWidth: normalized.width,
269417
270006
  availableHeight,
269418
270007
  measureMap: balancingMeasureMap,
269419
- sectPrMarkerBlockIds
270008
+ sectPrMarkerBlockIds,
270009
+ keepLinesBlockIds
269420
270010
  });
269421
270011
  if (balanceResult) {
269422
270012
  state.cursorY = balanceResult.maxY;
@@ -269815,7 +270405,9 @@ function layoutDocument(blocks2, measures, options = {}) {
269815
270405
  const isMultiPage = sectionPagesCount > 1;
269816
270406
  if (isMultiPage && !isLast)
269817
270407
  continue;
269818
- const allowedByMidDocContinuous = endBreakType === "continuous" && !isLast;
270408
+ const nextSectionBeginType = sectionEndBreakType.get(sectionIdx + 1);
270409
+ const nextIsBody = lastSectionIdx !== null && sectionIdx + 1 === lastSectionIdx;
270410
+ const allowedByMidDocContinuous = !isLast && !nextIsBody && nextSectionBeginType === "continuous";
269819
270411
  const allowedByBodyExplicitContinuous = bodyExplicitContinuousIdx !== null && sectionIdx === bodyExplicitContinuousIdx - 1 && !isExplicitNonContinuous;
269820
270412
  if (!allowedByMidDocContinuous && !allowedByBodyExplicitContinuous && !isMultiPage)
269821
270413
  continue;
@@ -269846,7 +270438,8 @@ function layoutDocument(blocks2, measures, options = {}) {
269846
270438
  columnWidth: normalized.width,
269847
270439
  availableHeight: sectionAvailableHeight,
269848
270440
  measureMap: balancingMeasureMap,
269849
- sectPrMarkerBlockIds
270441
+ sectPrMarkerBlockIds,
270442
+ keepLinesBlockIds
269850
270443
  });
269851
270444
  }
269852
270445
  for (const state of states) {
@@ -274683,9 +275276,28 @@ function computeDomCaretPageLocal(options, pos) {
274683
275276
  const boundary = resolveTextBoundaryInElement(targetEl, pos, entry.pmStart, entry.pmEnd, "forward");
274684
275277
  if (!boundary) {
274685
275278
  const elRect = targetEl.getBoundingClientRect();
275279
+ if (targetEl.classList.contains("superdoc-line")) {
275280
+ const paddingLeft = parseFloat(targetEl.style.paddingLeft) || 0;
275281
+ const paddingRight = parseFloat(targetEl.style.paddingRight) || 0;
275282
+ const lineLeft = (elRect.left - pageRect.left) / zoom + paddingLeft;
275283
+ const lineRight = (elRect.right - pageRect.left) / zoom - paddingRight;
275284
+ const textAlign = targetEl.style.textAlign;
275285
+ let x;
275286
+ if (textAlign === "center")
275287
+ x = (lineLeft + lineRight) / 2;
275288
+ else if (textAlign === "right")
275289
+ x = lineRight;
275290
+ else
275291
+ x = lineLeft;
275292
+ return {
275293
+ pageIndex: Number(page.dataset.pageIndex ?? "0"),
275294
+ x,
275295
+ y: (elRect.top - pageRect.top) / zoom
275296
+ };
275297
+ }
274686
275298
  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
275299
  const atEnd = isEmptySdtPlaceholder ? pos > entry.pmEnd : pos >= entry.pmEnd;
274688
- const yRect = (isEmptySdtPlaceholder ? targetEl.closest(".superdoc-line") : null)?.getBoundingClientRect() ?? elRect;
275300
+ const yRect = (isEmptySdtPlaceholder || targetEl.classList.contains("superdoc-tab") ? targetEl.closest(".superdoc-line") : null)?.getBoundingClientRect() ?? elRect;
274689
275301
  return {
274690
275302
  pageIndex: Number(page.dataset.pageIndex ?? "0"),
274691
275303
  x: ((atEnd ? elRect.right : elRect.left) - pageRect.left) / zoom,
@@ -282108,7 +282720,8 @@ function makeResolveFace(resolver2, hasFace) {
282108
282720
  const r$1 = resolver2.resolveFace(logical, face, hasFace);
282109
282721
  return {
282110
282722
  physicalFamily: r$1.physicalFamily,
282111
- reason: r$1.reason
282723
+ reason: r$1.reason,
282724
+ sourceFace: r$1.sourceFace
282112
282725
  };
282113
282726
  };
282114
282727
  if (resolver2)
@@ -282138,10 +282751,14 @@ function collect(acc, node2, resolveFace2) {
282138
282751
  const usedKey = `${logicalPrimary.toLowerCase()}|${weight}|${style2}`;
282139
282752
  if (acc.usedFaces.has(usedKey))
282140
282753
  return;
282141
- const { physicalFamily, reason } = resolveFace2(node2.fontFamily, {
282754
+ const { physicalFamily, reason, sourceFace } = resolveFace2(node2.fontFamily, {
282142
282755
  weight,
282143
282756
  style: style2
282144
282757
  });
282758
+ const requiredFace = sourceFace ?? {
282759
+ weight,
282760
+ style: style2
282761
+ };
282145
282762
  acc.usedFaces.set(usedKey, {
282146
282763
  logicalFamily: logicalPrimary,
282147
282764
  weight,
@@ -282152,15 +282769,17 @@ function collect(acc, node2, resolveFace2) {
282152
282769
  weight,
282153
282770
  style2,
282154
282771
  (physicalFamily || "").toLowerCase(),
282772
+ requiredFace.weight,
282773
+ requiredFace.style,
282155
282774
  reason
282156
282775
  ]);
282157
282776
  if (physicalFamily) {
282158
- const reqKey = `${physicalFamily.toLowerCase()}|${weight}|${style2}`;
282777
+ const reqKey = `${physicalFamily.toLowerCase()}|${requiredFace.weight}|${requiredFace.style}`;
282159
282778
  if (!acc.requiredFaces.has(reqKey))
282160
282779
  acc.requiredFaces.set(reqKey, {
282161
282780
  family: physicalFamily,
282162
- weight,
282163
- style: style2
282781
+ weight: requiredFace.weight,
282782
+ style: requiredFace.style
282164
282783
  });
282165
282784
  }
282166
282785
  }
@@ -301788,6 +302407,7 @@ var Node$13 = class Node$14 {
301788
302407
  this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
301789
302408
  this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
301790
302409
  options.reapplyStructuredContentHover?.();
302410
+ options.reapplyTocGroupHover?.();
301791
302411
  }
301792
302412
  destroy() {
301793
302413
  this.#proofingDecorator.clear();
@@ -301797,6 +302417,83 @@ var Node$13 = class Node$14 {
301797
302417
  this.#commentHighlightDecorator.destroy();
301798
302418
  this.#decorationBridge.destroy();
301799
302419
  }
302420
+ }, HoverGroupCoordinator = class {
302421
+ #spec;
302422
+ #current = null;
302423
+ constructor(spec) {
302424
+ this.handleMouseEnter = (event) => {
302425
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
302426
+ if (!entry)
302427
+ return;
302428
+ const id2 = this.#spec.getId(entry);
302429
+ if (!id2)
302430
+ return;
302431
+ this.#set(id2);
302432
+ };
302433
+ this.handleMouseLeave = (event) => {
302434
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
302435
+ if (!entry)
302436
+ return;
302437
+ const id2 = this.#spec.getId(entry);
302438
+ if (!id2)
302439
+ return;
302440
+ const relatedTarget = event.relatedTarget;
302441
+ if (relatedTarget) {
302442
+ const nextEntry = relatedTarget.closest?.(this.#spec.entrySelector);
302443
+ if (nextEntry && this.#spec.getId(nextEntry) === id2)
302444
+ return;
302445
+ }
302446
+ this.clear();
302447
+ };
302448
+ this.#spec = spec;
302449
+ }
302450
+ reapply() {
302451
+ if (!this.#current)
302452
+ return;
302453
+ const { id: id2 } = this.#current;
302454
+ const elements = this.#spec.queryGroup(id2);
302455
+ if (elements.length === 0) {
302456
+ this.#current = null;
302457
+ return;
302458
+ }
302459
+ this.#applyClass(elements);
302460
+ this.#spec.onApply?.(elements);
302461
+ this.#current = {
302462
+ id: id2,
302463
+ elements
302464
+ };
302465
+ }
302466
+ clear() {
302467
+ if (!this.#current)
302468
+ return;
302469
+ for (const element3 of this.#current.elements) {
302470
+ element3.classList.remove(this.#spec.hoverClass);
302471
+ this.#spec.onClear?.(element3);
302472
+ }
302473
+ this.#current = null;
302474
+ }
302475
+ #set(id2) {
302476
+ if (this.#current?.id === id2)
302477
+ return;
302478
+ this.clear();
302479
+ const elements = this.#spec.queryGroup(id2);
302480
+ if (elements.length === 0)
302481
+ return;
302482
+ this.#applyClass(elements);
302483
+ this.#spec.onApply?.(elements);
302484
+ this.#current = {
302485
+ id: id2,
302486
+ elements
302487
+ };
302488
+ }
302489
+ #applyClass(elements) {
302490
+ const filter = this.#spec.shouldApplyTo;
302491
+ for (const element3 of elements) {
302492
+ if (filter && !filter(element3))
302493
+ continue;
302494
+ element3.classList.add(this.#spec.hoverClass);
302495
+ }
302496
+ }
301800
302497
  }, ProofingStore = class {
301801
302498
  #issuesBySegment = /* @__PURE__ */ new Map;
301802
302499
  addIssue(issue2) {
@@ -302407,6 +303104,9 @@ var Node$13 = class Node$14 {
302407
303104
  color: inherit !important;
302408
303105
  text-decoration: none !important;
302409
303106
  cursor: default;
303107
+ /* Disable native link drag so our pointer loop can run text-selection. */
303108
+ -webkit-user-drag: none;
303109
+ user-drag: none;
302410
303110
  }
302411
303111
 
302412
303112
  .superdoc-toc-entry .superdoc-link:hover {
@@ -302418,6 +303118,31 @@ var Node$13 = class Node$14 {
302418
303118
  outline: none;
302419
303119
  }
302420
303120
 
303121
+ /* TOC hover. .toc-group-hover is set by PresentationEditor on every entry
303122
+ sharing a data-toc-id so the whole TOC greys out together. The ::after
303123
+ stripe (height set via --toc-gap-below) fills the paragraph-spacing gap
303124
+ between adjacent entries so the hover reads as one continuous block. */
303125
+ .superdoc-toc-entry:hover,
303126
+ .superdoc-toc-entry.toc-group-hover {
303127
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
303128
+ }
303129
+
303130
+ /* Pointer-events stay on (default) so the stripe extends the parent entry's
303131
+ hit-test area through the paragraph-spacing gap. Without this, moving the
303132
+ cursor between two adjacent entries fires mouseout on the upper entry with
303133
+ relatedTarget = the page (not a TOC entry), the coordinator drops the
303134
+ group-hover class, and the grey disappears for a frame before the next
303135
+ entry's mouseover restores it — visible as a flicker. */
303136
+ .superdoc-toc-entry.toc-group-hover::after {
303137
+ content: '';
303138
+ position: absolute;
303139
+ left: 0;
303140
+ right: 0;
303141
+ top: 100%;
303142
+ height: var(--toc-gap-below, 0px);
303143
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
303144
+ }
303145
+
302421
303146
  /* Remove focus outlines from layout engine elements */
302422
303147
  .superdoc-layout,
302423
303148
  .superdoc-page,
@@ -304472,6 +305197,7 @@ menclose::after {
304472
305197
  });
304473
305198
  if (run2.fontSize != null)
304474
305199
  markerEl.style.fontSize = `${run2.fontSize}px`;
305200
+ allowFontSynthesis(markerEl);
304475
305201
  markerEl.style.fontWeight = run2.bold ? "bold" : "";
304476
305202
  markerEl.style.fontStyle = run2.italic ? "italic" : "";
304477
305203
  if (run2.color)
@@ -306395,8 +307121,12 @@ menclose::after {
306395
307121
  applyResolvedFragmentFrame(fragmentEl, resolvedItem, fragment);
306396
307122
  else
306397
307123
  applyFragmentFrame(fragmentEl, fragment);
306398
- if (isTocEntry)
306399
- fragmentEl.classList.add("superdoc-toc-entry");
307124
+ if (isTocEntry) {
307125
+ fragmentEl.classList.add(DOM_CLASS_NAMES.TOC_ENTRY);
307126
+ const tocId = block.attrs?.tocId;
307127
+ if (typeof tocId === "string" && tocId.length > 0)
307128
+ fragmentEl.dataset.tocId = tocId;
307129
+ }
306400
307130
  if (paraContinuesFromPrev)
306401
307131
  fragmentEl.dataset.continuesFromPrev = "true";
306402
307132
  if (paraContinuesOnNext)
@@ -306453,6 +307183,7 @@ menclose::after {
306453
307183
  style: run2.italic ? "italic" : "normal"
306454
307184
  });
306455
307185
  dropCapEl.style.fontSize = `${run2.fontSize}px`;
307186
+ allowFontSynthesis(dropCapEl);
306456
307187
  if (run2.bold)
306457
307188
  dropCapEl.style.fontWeight = "bold";
306458
307189
  if (run2.italic)
@@ -306572,6 +307303,7 @@ menclose::after {
306572
307303
  style: run2.italic ? "italic" : "normal"
306573
307304
  });
306574
307305
  element3.style.fontSize = `${run2.fontSize}px`;
307306
+ allowFontSynthesis(element3);
306575
307307
  if (run2.bold)
306576
307308
  element3.style.fontWeight = "bold";
306577
307309
  if (run2.italic)
@@ -306764,6 +307496,7 @@ menclose::after {
306764
307496
  }
306765
307497
  if (run2.textColor)
306766
307498
  annotation.style.color = run2.textColor;
307499
+ allowFontSynthesis(annotation);
306767
307500
  if (run2.bold)
306768
307501
  annotation.style.fontWeight = "bold";
306769
307502
  if (run2.italic)
@@ -314591,6 +315324,7 @@ menclose::after {
314591
315324
  #cellAnchor = null;
314592
315325
  #cellDragMode = "none";
314593
315326
  #pendingMarginClick = null;
315327
+ #pendingTocLinkNav = null;
314594
315328
  #lastSelectedImageBlockId = null;
314595
315329
  #suppressFocusInFromDraggable = false;
314596
315330
  #pendingStructuredContentLabelGesture = null;
@@ -315132,10 +315866,14 @@ menclose::after {
315132
315866
  return;
315133
315867
  }
315134
315868
  const linkEl = target?.closest?.("a.superdoc-link");
315135
- if (linkEl) {
315136
- this.#handleLinkClick(event, linkEl);
315137
- return;
315138
- }
315869
+ this.#pendingTocLinkNav = null;
315870
+ if (linkEl)
315871
+ if (linkEl.closest(`.${DOM_CLASS_NAMES.TOC_ENTRY}`))
315872
+ this.#pendingTocLinkNav = linkEl;
315873
+ else {
315874
+ this.#handleLinkClick(event, linkEl);
315875
+ return;
315876
+ }
315139
315877
  const annotationEl = target?.closest?.(buildAnnotationSelector());
315140
315878
  const isDraggableAnnotation = target?.closest?.(DRAGGABLE_SELECTOR) != null;
315141
315879
  const isNativeDragSource = target?.closest?.(DRAG_SOURCE_SELECTOR) != null;
@@ -315474,6 +316212,10 @@ menclose::after {
315474
316212
  event
315475
316213
  });
315476
316214
  this.#suppressFocusInFromDraggable = false;
316215
+ const pendingTocLink = this.#pendingTocLinkNav;
316216
+ this.#pendingTocLinkNav = null;
316217
+ if (pendingTocLink && !this.#dragThresholdExceeded)
316218
+ this.#handleLinkClick(event, pendingTocLink);
315477
316219
  if (!this.#isDragging) {
315478
316220
  this.#stopAutoScroll();
315479
316221
  return;
@@ -319498,6 +320240,17 @@ menclose::after {
319498
320240
  const declaredRows = buildFontReport(declared.filter((family2) => family2 && !usedFamilies.has(family2.toLowerCase())), registry3, resolver2);
319499
320241
  return [...faceRows, ...declaredRows];
319500
320242
  }
320243
+ getDocumentFontOptions() {
320244
+ try {
320245
+ const usedFaces = this.#getUsedFaces?.() ?? [];
320246
+ if (!usedFaces.length)
320247
+ return [];
320248
+ const { registry: registry3 } = this.#resolveContext();
320249
+ return buildDocumentFontOptions(usedFaces, registry3, this.#fontResolver ?? undefined);
320250
+ } catch {
320251
+ return [];
320252
+ }
320253
+ }
319501
320254
  async ensureReadyForMeasure() {
319502
320255
  if (this.#getRequiredFaces)
319503
320256
  return this.#ensureFacesReady(this.#getRequiredFaces);
@@ -319937,13 +320690,13 @@ menclose::after {
319937
320690
  return;
319938
320691
  console.log(...args$1);
319939
320692
  }, 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(() => {
320693
+ var init_src_BB_FFFud_es = __esm(() => {
319941
320694
  init_rolldown_runtime_Bg48TavK_es();
319942
- init_SuperConverter_C6RGktKO_es();
320695
+ init_SuperConverter_DJyHekqW_es();
319943
320696
  init_jszip_C49i9kUs_es();
319944
320697
  init_xml_js_CqGKpaft_es();
319945
320698
  init_uuid_B2wVPhPi_es();
319946
- init_create_headless_toolbar_D7rUpTS1_es();
320699
+ init_create_headless_toolbar_Jmx2i_9i_es();
319947
320700
  init_constants_D9qj59G2_es();
319948
320701
  init_dist_B8HfvhaK_es();
319949
320702
  init_unified_Dsuw2be5_es();
@@ -338873,6 +339626,8 @@ function print() { __p += __j.call(arguments, '') }
338873
339626
  TABLE_FRAGMENT: "superdoc-table-fragment",
338874
339627
  DOCUMENT_SECTION: "superdoc-document-section",
338875
339628
  SDT_GROUP_HOVER: "sdt-group-hover",
339629
+ TOC_ENTRY: "superdoc-toc-entry",
339630
+ TOC_GROUP_HOVER: "toc-group-hover",
338876
339631
  IMAGE_FRAGMENT: "superdoc-image-fragment",
338877
339632
  INLINE_IMAGE: "superdoc-inline-image",
338878
339633
  LIST_MARKER: "superdoc-list-marker",
@@ -340653,7 +341408,7 @@ function print() { __p += __j.call(arguments, '') }
340653
341408
  };
340654
341409
  }
340655
341410
  }, [["__scopeId", "data-v-d25821a5"]]);
340656
- TOOLBAR_FONTS = getDefaultFontOfferings().map((offering) => ({
341411
+ TOOLBAR_FONTS = getBuiltInToolbarFontOfferings().map((offering) => ({
340657
341412
  label: offering.logicalFamily,
340658
341413
  key: fontOfferingStack(offering),
340659
341414
  fontWeight: 400,
@@ -341186,7 +341941,8 @@ function print() { __p += __j.call(arguments, '') }
341186
341941
  const menuRef = exports_vue.ref(null);
341187
341942
  const menuPosition = exports_vue.ref({
341188
341943
  top: "0px",
341189
- left: "0px"
341944
+ left: "0px",
341945
+ maxHeight: "none"
341190
341946
  });
341191
341947
  const optionRefs = exports_vue.ref([]);
341192
341948
  const keyboardIndex = exports_vue.ref(-1);
@@ -341223,6 +341979,7 @@ function print() { __p += __j.call(arguments, '') }
341223
341979
  position: "fixed",
341224
341980
  top: menuPosition.value.top,
341225
341981
  left: menuPosition.value.left,
341982
+ maxHeight: menuPosition.value.maxHeight,
341226
341983
  zIndex: 2000
341227
341984
  };
341228
341985
  });
@@ -341238,17 +341995,30 @@ function print() { __p += __j.call(arguments, '') }
341238
341995
  if (!triggerRef.value)
341239
341996
  return;
341240
341997
  const rect = triggerRef.value.getBoundingClientRect();
341241
- const menuWidth = menuRef.value?.offsetWidth ?? 0;
341998
+ const menuEl = menuRef.value;
341999
+ const menuWidth = menuEl?.offsetWidth ?? 0;
342000
+ const menuHeight = menuEl?.scrollHeight ?? menuEl?.offsetHeight ?? 0;
341242
342001
  const viewportWidth = window.innerWidth || document.documentElement.clientWidth || 0;
342002
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight || 0;
341243
342003
  const gutter = 8;
342004
+ const gap = 4;
342005
+ const belowTop = rect.bottom + gap;
342006
+ const aboveBottom = rect.top - gap;
342007
+ const availableBelow = Math.max(0, viewportHeight - belowTop - gutter);
342008
+ const availableAbove = Math.max(0, aboveBottom - gutter);
342009
+ const openAbove = availableBelow < menuHeight && availableAbove > availableBelow;
342010
+ const maxHeight = openAbove ? availableAbove : availableBelow;
342011
+ const menuRenderHeight = menuHeight ? Math.min(menuHeight, maxHeight) : maxHeight;
342012
+ const top$1 = openAbove ? Math.max(gutter, aboveBottom - menuRenderHeight) : belowTop;
341244
342013
  let left$1 = rect.left;
341245
342014
  if (props.placement === "bottom-end")
341246
342015
  left$1 = rect.right - menuWidth;
341247
342016
  const maxLeft = Math.max(gutter, viewportWidth - menuWidth - gutter);
341248
342017
  left$1 = Math.min(Math.max(gutter, left$1), maxLeft);
341249
342018
  menuPosition.value = {
341250
- top: `${rect.bottom + 4}px`,
341251
- left: `${left$1}px`
342019
+ top: `${top$1}px`,
342020
+ left: `${left$1}px`,
342021
+ maxHeight: `${maxHeight}px`
341252
342022
  };
341253
342023
  };
341254
342024
  const onTriggerClick = () => {
@@ -341314,8 +342084,13 @@ function print() { __p += __j.call(arguments, '') }
341314
342084
  el.setAttribute("tabindex", index2 === keyboardIndex.value ? "0" : "-1");
341315
342085
  });
341316
342086
  const target = optionRefs.value[keyboardIndex.value];
341317
- if (target && typeof target.focus === "function")
342087
+ if (target && typeof target.focus === "function") {
341318
342088
  target.focus();
342089
+ target.scrollIntoView?.({
342090
+ block: "nearest",
342091
+ inline: "nearest"
342092
+ });
342093
+ }
341319
342094
  };
341320
342095
  const moveKeyboardIndex = (direction) => {
341321
342096
  const navigableIndexes = getNavigableIndexes();
@@ -341450,6 +342225,7 @@ function print() { __p += __j.call(arguments, '') }
341450
342225
  if (hasRenderOptions.value)
341451
342226
  return;
341452
342227
  keyboardIndex.value = getInitialKeyboardIndex();
342228
+ await exports_vue.nextTick();
341453
342229
  focusKeyboardIndex();
341454
342230
  }, { immediate: true });
341455
342231
  exports_vue.watch(isOpen, (open) => {
@@ -341513,7 +342289,7 @@ function print() { __p += __j.call(arguments, '') }
341513
342289
  })]))]);
341514
342290
  };
341515
342291
  }
341516
- }, [["__scopeId", "data-v-302f7d86"]]);
342292
+ }, [["__scopeId", "data-v-69732782"]]);
341517
342293
  SdTooltip_default = /* @__PURE__ */ __plugin_vue_export_helper_default(/* @__PURE__ */ Object.assign({ inheritAttrs: false }, {
341518
342294
  __name: "SdTooltip",
341519
342295
  props: {
@@ -342163,16 +342939,21 @@ function print() { __p += __j.call(arguments, '') }
342163
342939
  toolbarKey.value += 1;
342164
342940
  };
342165
342941
  const onResizeThrottled = throttle(onWindowResized, 300);
342166
- function teardownWindowListeners() {
342942
+ const onToolbarItemsChanged = () => {
342943
+ toolbarKey.value += 1;
342944
+ };
342945
+ function teardownListeners() {
342167
342946
  window.removeEventListener("resize", onResizeThrottled);
342168
342947
  window.removeEventListener("keydown", onKeyDown);
342948
+ proxy.$toolbar.off?.("toolbar-items-changed", onToolbarItemsChanged);
342169
342949
  containerResizeObserver?.disconnect();
342170
342950
  containerResizeObserver = null;
342171
342951
  }
342172
- function setupWindowListeners() {
342173
- teardownWindowListeners();
342952
+ function setupListeners() {
342953
+ teardownListeners();
342174
342954
  window.addEventListener("resize", onResizeThrottled);
342175
342955
  window.addEventListener("keydown", onKeyDown);
342956
+ proxy.$toolbar.on?.("toolbar-items-changed", onToolbarItemsChanged);
342176
342957
  if (typeof ResizeObserver !== "undefined" && proxy.$toolbar.config?.responsiveToContainer && proxy.$toolbar.toolbarContainer) {
342177
342958
  containerResizeObserver = new ResizeObserver(() => {
342178
342959
  onResizeThrottled();
@@ -342181,10 +342962,10 @@ function print() { __p += __j.call(arguments, '') }
342181
342962
  }
342182
342963
  updateCompactSideGroups();
342183
342964
  }
342184
- exports_vue.onMounted(setupWindowListeners);
342185
- exports_vue.onActivated(setupWindowListeners);
342186
- exports_vue.onDeactivated(teardownWindowListeners);
342187
- exports_vue.onBeforeUnmount(teardownWindowListeners);
342965
+ exports_vue.onMounted(setupListeners);
342966
+ exports_vue.onActivated(setupListeners);
342967
+ exports_vue.onDeactivated(teardownListeners);
342968
+ exports_vue.onBeforeUnmount(teardownListeners);
342188
342969
  const handleCommand = ({ item, argument, option }) => {
342189
342970
  proxy.$toolbar.emitCommand({
342190
342971
  item,
@@ -342263,7 +343044,7 @@ function print() { __p += __j.call(arguments, '') }
342263
343044
  ], 32);
342264
343045
  };
342265
343046
  }
342266
- }, [["__scopeId", "data-v-b83d488a"]]);
343047
+ }, [["__scopeId", "data-v-938eaa1b"]]);
342267
343048
  toolbarTexts = {
342268
343049
  bold: "Bold",
342269
343050
  fontFamily: "Font",
@@ -342394,8 +343175,10 @@ function print() { __p += __j.call(arguments, '') }
342394
343175
  this._boundEditorHandlers = {
342395
343176
  transaction: null,
342396
343177
  selectionUpdate: null,
342397
- focus: null
343178
+ focus: null,
343179
+ fontsChanged: null
342398
343180
  };
343181
+ this._lastFontOptionsSignature = "";
342399
343182
  this._restoreFocusTimeoutId = null;
342400
343183
  if (!this.config.selector && this.config.element)
342401
343184
  this.config.selector = this.config.element;
@@ -342454,24 +343237,40 @@ function print() { __p += __j.call(arguments, '') }
342454
343237
  if (this.config.groups && !Array.isArray(this.config.groups) && Object.keys(this.config.groups).length)
342455
343238
  this.config.toolbarGroups = Object.keys(this.config.groups);
342456
343239
  }
343240
+ #detachActiveEditorListeners() {
343241
+ if (!this.activeEditor || !this._boundEditorHandlers.transaction)
343242
+ return;
343243
+ this.activeEditor.off("transaction", this._boundEditorHandlers.transaction);
343244
+ this.activeEditor.off("selectionUpdate", this._boundEditorHandlers.selectionUpdate);
343245
+ this.activeEditor.off("focus", this._boundEditorHandlers.focus);
343246
+ this.activeEditor.off("fonts-changed", this._boundEditorHandlers.fontsChanged);
343247
+ this._boundEditorHandlers.transaction = null;
343248
+ this._boundEditorHandlers.selectionUpdate = null;
343249
+ this._boundEditorHandlers.focus = null;
343250
+ this._boundEditorHandlers.fontsChanged = null;
343251
+ }
342457
343252
  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;
343253
+ const sameEditor = editor === this.activeEditor;
343254
+ const alreadyListening = Boolean(this._boundEditorHandlers.transaction);
343255
+ if (sameEditor && (!editor || alreadyListening)) {
343256
+ this.updateToolbarState();
343257
+ return;
342465
343258
  }
343259
+ this.#detachActiveEditorListeners();
342466
343260
  this.activeEditor = editor;
342467
343261
  if (editor) {
342468
343262
  this._boundEditorHandlers.transaction = this.onEditorTransaction.bind(this);
342469
343263
  this._boundEditorHandlers.selectionUpdate = this.onEditorSelectionUpdate.bind(this);
342470
343264
  this._boundEditorHandlers.focus = this.onEditorFocus.bind(this);
343265
+ this._boundEditorHandlers.fontsChanged = this.onEditorFontsChanged.bind(this);
342471
343266
  this.activeEditor.on("transaction", this._boundEditorHandlers.transaction);
342472
343267
  this.activeEditor.on("selectionUpdate", this._boundEditorHandlers.selectionUpdate);
342473
343268
  this.activeEditor.on("focus", this._boundEditorHandlers.focus);
343269
+ this.activeEditor.on("fonts-changed", this._boundEditorHandlers.fontsChanged);
342474
343270
  }
343271
+ this.#rebuildToolbarItems();
343272
+ this._lastFontOptionsSignature = this.#fontOptionsSignature();
343273
+ this.updateToolbarState();
342475
343274
  }
342476
343275
  getToolbarItemByGroup(groupName) {
342477
343276
  return this.toolbarItems.filter((item) => (item.group?.value || "center") === groupName);
@@ -342488,13 +343287,14 @@ function print() { __p += __j.call(arguments, '') }
342488
343287
  return this.config.responsiveToContainer ? containerWidth : documentWidth;
342489
343288
  }
342490
343289
  #makeToolbarItems({ superToolbar, icons: icons$1, texts, fonts, hideButtons, isDev = false } = {}) {
343290
+ const availableWidth = this.getAvailableWidth();
342491
343291
  const { defaultItems, overflowItems } = makeDefaultItems({
342492
343292
  superToolbar,
342493
343293
  toolbarIcons: icons$1,
342494
343294
  toolbarTexts: texts,
342495
- toolbarFonts: fonts,
343295
+ toolbarFonts: this.#resolveToolbarFonts(fonts),
342496
343296
  hideButtons,
342497
- availableWidth: this.getAvailableWidth(),
343297
+ availableWidth,
342498
343298
  role: this.role,
342499
343299
  isDev
342500
343300
  });
@@ -342507,6 +343307,26 @@ function print() { __p += __j.call(arguments, '') }
342507
343307
  this.toolbarItems = defaultItems.filter((item) => allConfigItems.includes(item.name.value)).filter((item) => !this.config.excludeItems.includes(item.name.value));
342508
343308
  this.overflowItems = overflowItems.filter((item) => allConfigItems.includes(item.name.value));
342509
343309
  }
343310
+ #resolveToolbarFonts(configFonts) {
343311
+ return composeToolbarFontOptions(this.superdoc?.fonts?.getDocumentFontOptions?.() ?? [], configFonts);
343312
+ }
343313
+ #rebuildToolbarItems() {
343314
+ this.#makeToolbarItems({
343315
+ superToolbar: this,
343316
+ icons: this.config.icons,
343317
+ texts: this.config.texts,
343318
+ fonts: this.config.fonts,
343319
+ hideButtons: this.config.hideButtons,
343320
+ isDev: this.isDev
343321
+ });
343322
+ this.emit("toolbar-items-changed");
343323
+ }
343324
+ #fontOptionsSignature() {
343325
+ if (this.config.fonts)
343326
+ return "custom-fonts";
343327
+ const options = this.superdoc?.fonts?.getDocumentFontOptions?.() ?? [];
343328
+ return JSON.stringify(options.map((option) => [option.logicalFamily, option.previewFamily]));
343329
+ }
342510
343330
  #initDefaultFonts() {
342511
343331
  if (!this.activeEditor || !this.activeEditor.converter)
342512
343332
  return;
@@ -342878,6 +343698,14 @@ function print() { __p += __j.call(arguments, '') }
342878
343698
  if (this.#restoreStickyMarksIfNeeded())
342879
343699
  this.updateToolbarState();
342880
343700
  }
343701
+ onEditorFontsChanged() {
343702
+ const signature = this.#fontOptionsSignature();
343703
+ if (signature !== this._lastFontOptionsSignature) {
343704
+ this._lastFontOptionsSignature = signature;
343705
+ this.#rebuildToolbarItems();
343706
+ }
343707
+ this.updateToolbarState();
343708
+ }
342881
343709
  onEditorFocus() {
342882
343710
  if (this.pendingMarkCommands.length) {
342883
343711
  this.onEditorSelectionUpdate();
@@ -342944,6 +343772,7 @@ function print() { __p += __j.call(arguments, '') }
342944
343772
  clearTimeout(this._restoreFocusTimeoutId);
342945
343773
  this._restoreFocusTimeoutId = null;
342946
343774
  }
343775
+ this.#detachActiveEditorListeners();
342947
343776
  this.destroyHeadlessToolbar();
342948
343777
  this.app?.unmount();
342949
343778
  }
@@ -346320,6 +347149,7 @@ function print() { __p += __j.call(arguments, '') }
346320
347149
  editor: this
346321
347150
  });
346322
347151
  console.error(err);
347152
+ throw err;
346323
347153
  }
346324
347154
  }
346325
347155
  #endCollaboration() {
@@ -348323,7 +349153,8 @@ function print() { __p += __j.call(arguments, '') }
348323
349153
  #lastSelectedFieldAnnotation = null;
348324
349154
  #lastSelectedStructuredContentBlock = null;
348325
349155
  #lastSelectedStructuredContentInline = null;
348326
- #lastHoveredStructuredContentBlock = null;
349156
+ #sdtHoverCoordinator = null;
349157
+ #tocHoverCoordinator = null;
348327
349158
  #remoteCursorManager = null;
348328
349159
  #cursorUpdateTimer = null;
348329
349160
  #remoteCursorOverlay = null;
@@ -348394,8 +349225,11 @@ function print() { __p += __j.call(arguments, '') }
348394
349225
  ensureEditorNativeSelectionStyles(doc$12);
348395
349226
  ensureEditorFieldAnnotationInteractionStyles(doc$12);
348396
349227
  ensureEditorMovableObjectInteractionStyles(doc$12);
348397
- this.#painterHost.addEventListener("mouseover", this.#handleStructuredContentBlockMouseEnter);
348398
- this.#painterHost.addEventListener("mouseout", this.#handleStructuredContentBlockMouseLeave);
349228
+ this.#initializeHoverCoordinators();
349229
+ this.#painterHost.addEventListener("mouseover", this.#sdtHoverCoordinator.handleMouseEnter);
349230
+ this.#painterHost.addEventListener("mouseout", this.#sdtHoverCoordinator.handleMouseLeave);
349231
+ this.#painterHost.addEventListener("mouseover", this.#tocHoverCoordinator.handleMouseEnter);
349232
+ this.#painterHost.addEventListener("mouseout", this.#tocHoverCoordinator.handleMouseLeave);
348399
349233
  this.#domIndexObserverManager = new DomPositionIndexObserverManager({
348400
349234
  windowRoot: this.#visibleHost?.ownerDocument?.defaultView ?? window,
348401
349235
  getPainterHost: () => this.#painterHost,
@@ -349563,6 +350397,9 @@ function print() { __p += __j.call(arguments, '') }
349563
350397
  getFontReport() {
349564
350398
  return this.#fontGate?.getReport() ?? [];
349565
350399
  }
350400
+ getDocumentFontOptions() {
350401
+ return this.#fontGate?.getDocumentFontOptions() ?? [];
350402
+ }
349566
350403
  getMissingFonts() {
349567
350404
  return [...new Set(this.getFontReport().filter((record3) => record3.missing).map((record3) => record3.logicalFamily))];
349568
350405
  }
@@ -352383,74 +353220,50 @@ function print() { __p += __j.call(arguments, '') }
352383
353220
  }
352384
353221
  this.#setSelectedStructuredContentBlockClass(elements, id2);
352385
353222
  }
352386
- #handleStructuredContentBlockMouseEnter = (event) => {
352387
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
352388
- if (!block || !(block instanceof HTMLElement))
353223
+ #initializeHoverCoordinators() {
353224
+ if (this.#sdtHoverCoordinator || this.#tocHoverCoordinator)
352389
353225
  return;
352390
- if (block.classList.contains("ProseMirror-selectednode"))
353226
+ this.#sdtHoverCoordinator = new HoverGroupCoordinator({
353227
+ entrySelector: `.${DOM_CLASS_NAMES.BLOCK_SDT}`,
353228
+ getId: (entry) => entry.dataset.sdtId,
353229
+ queryGroup: (id2) => this.#painterAdapter.getStructuredContentBlockElementsById(id2),
353230
+ hoverClass: DOM_CLASS_NAMES.SDT_GROUP_HOVER,
353231
+ shouldApplyTo: (element3) => !element3.classList.contains("ProseMirror-selectednode")
353232
+ });
353233
+ this.#tocHoverCoordinator = new HoverGroupCoordinator({
353234
+ entrySelector: `.${DOM_CLASS_NAMES.TOC_ENTRY}`,
353235
+ getId: (entry) => entry.dataset.tocId,
353236
+ queryGroup: (id2) => this.#queryTocEntryElementsById(id2),
353237
+ hoverClass: DOM_CLASS_NAMES.TOC_GROUP_HOVER,
353238
+ onApply: (elements) => this.#applyTocGapFill(elements),
353239
+ onClear: (element3) => element3.style.removeProperty("--toc-gap-below")
353240
+ });
353241
+ }
353242
+ #applyTocGapFill(elements) {
353243
+ if (elements.length < 2)
352391
353244
  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)
352400
- 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;
353245
+ const measured = elements.map((element3) => ({
353246
+ element: element3,
353247
+ rect: element3.getBoundingClientRect()
353248
+ })).sort((a2, b$1) => a2.rect.top - b$1.rect.top);
353249
+ for (let i4 = 0;i4 < measured.length - 1; i4++) {
353250
+ const current = measured[i4];
353251
+ const next2 = measured[i4 + 1];
353252
+ const currentPage = current.element.closest("[data-page-index]");
353253
+ if (!currentPage || currentPage !== next2.element.closest("[data-page-index]"))
353254
+ continue;
353255
+ const rawGap = next2.rect.top - current.rect.bottom;
353256
+ const scaleY = current.rect.height && current.element.offsetHeight ? current.rect.height / current.element.offsetHeight : 1;
353257
+ const gap = scaleY > 0 ? rawGap / scaleY : rawGap;
353258
+ if (gap > 0)
353259
+ current.element.style.setProperty("--toc-gap-below", `${gap + 1}px`);
352406
353260
  }
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
353261
  }
352417
- #setHoveredStructuredContentBlockClass(id2) {
352418
- if (this.#lastHoveredStructuredContentBlock?.id === id2)
352419
- return;
352420
- this.#clearHoveredStructuredContentBlockClass();
353262
+ #queryTocEntryElementsById(id2) {
352421
353263
  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
- };
353264
+ return [];
353265
+ const escapedId = escapeAttrValue(id2);
353266
+ return Array.from(this.#painterHost.querySelectorAll(`.${DOM_CLASS_NAMES.TOC_ENTRY}[data-toc-id="${escapedId}"]`));
352454
353267
  }
352455
353268
  #refreshEditorDomAugmentations() {
352456
353269
  this.#postPaintPipeline.refreshAfterPaint({
@@ -352459,7 +353272,8 @@ function print() { __p += __j.call(arguments, '') }
352459
353272
  domPositionIndex: this.#domPositionIndex,
352460
353273
  proofingAnnotations: this.#buildProofingAnnotations(),
352461
353274
  rebuildDomPositionIndex: () => this.#rebuildDomPositionIndex(),
352462
- reapplyStructuredContentHover: () => this.#reapplySdtGroupHover()
353275
+ reapplyStructuredContentHover: () => this.#sdtHoverCoordinator?.reapply(),
353276
+ reapplyTocGroupHover: () => this.#tocHoverCoordinator?.reapply()
352463
353277
  });
352464
353278
  }
352465
353279
  #clearSelectedStructuredContentInlineClass() {
@@ -354847,11 +355661,11 @@ function print() { __p += __j.call(arguments, '') }
354847
355661
  ]);
354848
355662
  });
354849
355663
 
354850
- // ../../packages/superdoc/dist/chunks/create-super-doc-ui-BT9gcxxx.es.js
355664
+ // ../../packages/superdoc/dist/chunks/create-super-doc-ui-Cjo_Z85j.es.js
354851
355665
  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();
355666
+ var init_create_super_doc_ui_Cjo_Z85j_es = __esm(() => {
355667
+ init_SuperConverter_DJyHekqW_es();
355668
+ init_create_headless_toolbar_Jmx2i_9i_es();
354855
355669
  headlessToolbarConstants = {
354856
355670
  DEFAULT_TEXT_ALIGN_OPTIONS: [
354857
355671
  {
@@ -355133,16 +355947,16 @@ var init_zipper_yaJVJ4z9_es = __esm(() => {
355133
355947
 
355134
355948
  // ../../packages/superdoc/dist/super-editor.es.js
355135
355949
  var init_super_editor_es = __esm(() => {
355136
- init_src_D29bOSuq_es();
355137
- init_SuperConverter_C6RGktKO_es();
355950
+ init_src_BB_FFFud_es();
355951
+ init_SuperConverter_DJyHekqW_es();
355138
355952
  init_jszip_C49i9kUs_es();
355139
355953
  init_xml_js_CqGKpaft_es();
355140
- init_create_headless_toolbar_D7rUpTS1_es();
355954
+ init_create_headless_toolbar_Jmx2i_9i_es();
355141
355955
  init_constants_D9qj59G2_es();
355142
355956
  init_dist_B8HfvhaK_es();
355143
355957
  init_unified_Dsuw2be5_es();
355144
355958
  init_DocxZipper_FUsfThjV_es();
355145
- init_create_super_doc_ui_BT9gcxxx_es();
355959
+ init_create_super_doc_ui_Cjo_Z85j_es();
355146
355960
  init_ui_C5PAS9hY_es();
355147
355961
  init_eventemitter3_BnGqBE_Q_es();
355148
355962
  init_errors_CNaD6vcg_es();
@@ -456352,12 +457166,13 @@ var init_exporter = __esm(() => {
456352
457166
  // ../../shared/font-system/src/types.ts
456353
457167
  var init_types8 = () => {};
456354
457168
 
456355
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.2.0/node_modules/@docfonts/fallbacks/dist/data.js
457169
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/data.js
456356
457170
  var SUBSTITUTION_EVIDENCE2;
456357
457171
  var init_data = __esm(() => {
456358
457172
  SUBSTITUTION_EVIDENCE2 = [
456359
457173
  {
456360
457174
  evidenceId: "calibri",
457175
+ generic: "sans-serif",
456361
457176
  logicalFamily: "Calibri",
456362
457177
  physicalFamily: "Carlito",
456363
457178
  verdict: "metric_safe",
@@ -456380,6 +457195,7 @@ var init_data = __esm(() => {
456380
457195
  ],
456381
457196
  exportRule: "preserve_original_name",
456382
457197
  advance: {
457198
+ basis: "latin_full",
456383
457199
  meanDelta: 0,
456384
457200
  maxDelta: 0
456385
457201
  },
@@ -456387,6 +457203,7 @@ var init_data = __esm(() => {
456387
457203
  },
456388
457204
  {
456389
457205
  evidenceId: "cambria",
457206
+ generic: "serif",
456390
457207
  logicalFamily: "Cambria",
456391
457208
  physicalFamily: "Caladea",
456392
457209
  verdict: "visual_only",
@@ -456411,6 +457228,7 @@ var init_data = __esm(() => {
456411
457228
  ],
456412
457229
  exportRule: "preserve_original_name",
456413
457230
  advance: {
457231
+ basis: "latin_full",
456414
457232
  meanDelta: 0.0002378,
456415
457233
  maxDelta: 0.2310758
456416
457234
  },
@@ -456432,6 +457250,7 @@ var init_data = __esm(() => {
456432
457250
  },
456433
457251
  {
456434
457252
  evidenceId: "arial",
457253
+ generic: "sans-serif",
456435
457254
  logicalFamily: "Arial",
456436
457255
  physicalFamily: "Liberation Sans",
456437
457256
  verdict: "metric_safe",
@@ -456453,6 +457272,7 @@ var init_data = __esm(() => {
456453
457272
  ],
456454
457273
  exportRule: "preserve_original_name",
456455
457274
  advance: {
457275
+ basis: "latin_full",
456456
457276
  meanDelta: 0,
456457
457277
  maxDelta: 0
456458
457278
  },
@@ -456460,6 +457280,7 @@ var init_data = __esm(() => {
456460
457280
  },
456461
457281
  {
456462
457282
  evidenceId: "times-new-roman",
457283
+ generic: "serif",
456463
457284
  logicalFamily: "Times New Roman",
456464
457285
  physicalFamily: "Liberation Serif",
456465
457286
  verdict: "metric_safe",
@@ -456481,6 +457302,7 @@ var init_data = __esm(() => {
456481
457302
  ],
456482
457303
  exportRule: "preserve_original_name",
456483
457304
  advance: {
457305
+ basis: "latin_full",
456484
457306
  meanDelta: 0,
456485
457307
  maxDelta: 0
456486
457308
  },
@@ -456488,6 +457310,7 @@ var init_data = __esm(() => {
456488
457310
  },
456489
457311
  {
456490
457312
  evidenceId: "courier-new",
457313
+ generic: "monospace",
456491
457314
  logicalFamily: "Courier New",
456492
457315
  physicalFamily: "Liberation Mono",
456493
457316
  verdict: "metric_safe",
@@ -456509,6 +457332,7 @@ var init_data = __esm(() => {
456509
457332
  ],
456510
457333
  exportRule: "preserve_original_name",
456511
457334
  advance: {
457335
+ basis: "latin_full",
456512
457336
  meanDelta: 0,
456513
457337
  maxDelta: 0
456514
457338
  },
@@ -456516,6 +457340,7 @@ var init_data = __esm(() => {
456516
457340
  },
456517
457341
  {
456518
457342
  evidenceId: "georgia",
457343
+ generic: "serif",
456519
457344
  logicalFamily: "Georgia",
456520
457345
  physicalFamily: "Gelasio",
456521
457346
  verdict: "near_metric",
@@ -456544,6 +457369,7 @@ var init_data = __esm(() => {
456544
457369
  ],
456545
457370
  exportRule: "preserve_original_name",
456546
457371
  advance: {
457372
+ basis: "latin_full",
456547
457373
  meanDelta: 0.0000197,
456548
457374
  maxDelta: 0.0183727
456549
457375
  },
@@ -456571,6 +457397,7 @@ var init_data = __esm(() => {
456571
457397
  },
456572
457398
  {
456573
457399
  evidenceId: "arial-narrow",
457400
+ generic: "sans-serif",
456574
457401
  logicalFamily: "Arial Narrow",
456575
457402
  physicalFamily: "Liberation Sans Narrow",
456576
457403
  verdict: "visual_only",
@@ -456595,6 +457422,7 @@ var init_data = __esm(() => {
456595
457422
  ],
456596
457423
  exportRule: "preserve_original_name",
456597
457424
  advance: {
457425
+ basis: "latin_full",
456598
457426
  meanDelta: 0,
456599
457427
  maxDelta: 0.5
456600
457428
  },
@@ -456616,6 +457444,7 @@ var init_data = __esm(() => {
456616
457444
  },
456617
457445
  {
456618
457446
  evidenceId: "aptos",
457447
+ generic: "sans-serif",
456619
457448
  logicalFamily: "Aptos",
456620
457449
  physicalFamily: null,
456621
457450
  verdict: "no_substitute",
@@ -456638,8 +457467,152 @@ var init_data = __esm(() => {
456638
457467
  exportRule: "preserve_original_name",
456639
457468
  candidateLicense: null
456640
457469
  },
457470
+ {
457471
+ evidenceId: "arial-black",
457472
+ generic: "sans-serif",
457473
+ logicalFamily: "Arial Black",
457474
+ physicalFamily: "Archivo Black",
457475
+ verdict: "visual_only",
457476
+ faces: {
457477
+ regular: true,
457478
+ bold: false,
457479
+ italic: false,
457480
+ boldItalic: false
457481
+ },
457482
+ faceSources: {
457483
+ italic: {
457484
+ kind: "synthetic",
457485
+ from: "regular"
457486
+ }
457487
+ },
457488
+ gates: {
457489
+ static: "pass",
457490
+ metric: "fail",
457491
+ layout: "not_run",
457492
+ ship: "fail"
457493
+ },
457494
+ policyAction: "substitute",
457495
+ measurementRefs: [
457496
+ "arial-black__archivo-black#visual_review#2026-06-09"
457497
+ ],
457498
+ exportRule: "preserve_original_name",
457499
+ candidateLicense: "OFL-1.1",
457500
+ faceVerdicts: {
457501
+ italic: "visual_only"
457502
+ }
457503
+ },
457504
+ {
457505
+ evidenceId: "arial-rounded-mt-bold",
457506
+ generic: "sans-serif",
457507
+ logicalFamily: "Arial Rounded MT Bold",
457508
+ physicalFamily: "Ubuntu",
457509
+ verdict: "visual_only",
457510
+ faces: {
457511
+ regular: true,
457512
+ bold: true,
457513
+ italic: true,
457514
+ boldItalic: true
457515
+ },
457516
+ gates: {
457517
+ static: "pass",
457518
+ metric: "fail",
457519
+ layout: "not_run",
457520
+ ship: "fail"
457521
+ },
457522
+ policyAction: "category_fallback",
457523
+ measurementRefs: [
457524
+ "arial-rounded-mt-bold__ubuntu#visual_review#2026-06-09"
457525
+ ],
457526
+ exportRule: "preserve_original_name",
457527
+ candidateLicense: "Ubuntu-font-1.0"
457528
+ },
457529
+ {
457530
+ evidenceId: "bookman-old-style",
457531
+ generic: "serif",
457532
+ logicalFamily: "Bookman Old Style",
457533
+ physicalFamily: "TeX Gyre Bonum",
457534
+ verdict: "visual_only",
457535
+ faces: {
457536
+ regular: true,
457537
+ bold: true,
457538
+ italic: true,
457539
+ boldItalic: true
457540
+ },
457541
+ gates: {
457542
+ static: "pass",
457543
+ metric: "fail",
457544
+ layout: "not_run",
457545
+ ship: "fail"
457546
+ },
457547
+ policyAction: "substitute",
457548
+ measurementRefs: [
457549
+ "bookman-old-style__tex-gyre-bonum#visual_review#2026-06-09"
457550
+ ],
457551
+ exportRule: "preserve_original_name",
457552
+ candidateLicense: "GUST-Font-License-1.0"
457553
+ },
457554
+ {
457555
+ evidenceId: "century",
457556
+ generic: "serif",
457557
+ logicalFamily: "Century",
457558
+ physicalFamily: "C059",
457559
+ verdict: "visual_only",
457560
+ faces: {
457561
+ regular: true,
457562
+ bold: true,
457563
+ italic: true,
457564
+ boldItalic: true
457565
+ },
457566
+ gates: {
457567
+ static: "pass",
457568
+ metric: "fail",
457569
+ layout: "not_run",
457570
+ ship: "fail"
457571
+ },
457572
+ policyAction: "substitute",
457573
+ measurementRefs: [
457574
+ "century__c059#visual_review#2026-06-09"
457575
+ ],
457576
+ exportRule: "preserve_original_name",
457577
+ candidateLicense: "AGPL-3.0-only WITH PS-or-PDF-font-exception-20170817"
457578
+ },
457579
+ {
457580
+ evidenceId: "garamond",
457581
+ generic: "serif",
457582
+ logicalFamily: "Garamond",
457583
+ physicalFamily: "Cardo",
457584
+ verdict: "visual_only",
457585
+ faces: {
457586
+ regular: true,
457587
+ bold: true,
457588
+ italic: true,
457589
+ boldItalic: false
457590
+ },
457591
+ faceSources: {
457592
+ boldItalic: {
457593
+ kind: "synthetic",
457594
+ from: "bold"
457595
+ }
457596
+ },
457597
+ gates: {
457598
+ static: "pass",
457599
+ metric: "fail",
457600
+ layout: "not_run",
457601
+ ship: "fail"
457602
+ },
457603
+ policyAction: "category_fallback",
457604
+ measurementRefs: [
457605
+ "garamond__cardo#visual_review#2026-06-09"
457606
+ ],
457607
+ exportRule: "preserve_original_name",
457608
+ candidateLicense: "OFL-1.1",
457609
+ faceVerdicts: {
457610
+ boldItalic: "visual_only"
457611
+ }
457612
+ },
456641
457613
  {
456642
457614
  evidenceId: "consolas",
457615
+ generic: "monospace",
456643
457616
  logicalFamily: "Consolas",
456644
457617
  physicalFamily: "Inconsolata SemiExpanded",
456645
457618
  verdict: "cell_width_only",
@@ -456661,6 +457634,7 @@ var init_data = __esm(() => {
456661
457634
  ],
456662
457635
  exportRule: "preserve_original_name",
456663
457636
  advance: {
457637
+ basis: "monospace_cell",
456664
457638
  meanDelta: 0.00035999999999999997,
456665
457639
  maxDelta: 0.00035999999999999997
456666
457640
  },
@@ -456668,6 +457642,7 @@ var init_data = __esm(() => {
456668
457642
  },
456669
457643
  {
456670
457644
  evidenceId: "verdana",
457645
+ generic: "sans-serif",
456671
457646
  logicalFamily: "Verdana",
456672
457647
  physicalFamily: null,
456673
457648
  verdict: "visual_only",
@@ -456692,82 +457667,96 @@ var init_data = __esm(() => {
456692
457667
  },
456693
457668
  {
456694
457669
  evidenceId: "tahoma",
457670
+ generic: "sans-serif",
456695
457671
  logicalFamily: "Tahoma",
456696
- physicalFamily: null,
457672
+ physicalFamily: "Noto Sans",
456697
457673
  verdict: "visual_only",
456698
457674
  faces: {
456699
- regular: false,
456700
- bold: false,
456701
- italic: false,
456702
- boldItalic: false
457675
+ regular: true,
457676
+ bold: true,
457677
+ italic: true,
457678
+ boldItalic: true
456703
457679
  },
456704
457680
  gates: {
456705
- static: "not_run",
457681
+ static: "pass",
456706
457682
  metric: "fail",
456707
457683
  layout: "not_run",
456708
- ship: "not_run"
457684
+ ship: "fail"
456709
457685
  },
456710
457686
  policyAction: "category_fallback",
456711
457687
  measurementRefs: [
456712
- "tahoma#top_candidates#2026-06-03"
457688
+ "tahoma__noto-sans#visual_review#2026-06-09"
456713
457689
  ],
456714
457690
  exportRule: "preserve_original_name",
456715
- candidateLicense: null
457691
+ candidateLicense: "OFL-1.1"
456716
457692
  },
456717
457693
  {
456718
457694
  evidenceId: "trebuchet-ms",
457695
+ generic: "sans-serif",
456719
457696
  logicalFamily: "Trebuchet MS",
456720
- physicalFamily: null,
457697
+ physicalFamily: "PT Sans",
456721
457698
  verdict: "visual_only",
456722
457699
  faces: {
456723
- regular: false,
456724
- bold: false,
456725
- italic: false,
456726
- boldItalic: false
457700
+ regular: true,
457701
+ bold: true,
457702
+ italic: true,
457703
+ boldItalic: true
456727
457704
  },
456728
457705
  gates: {
456729
- static: "not_run",
457706
+ static: "pass",
456730
457707
  metric: "fail",
456731
457708
  layout: "not_run",
456732
- ship: "not_run"
457709
+ ship: "fail"
456733
457710
  },
456734
457711
  policyAction: "category_fallback",
456735
457712
  measurementRefs: [
456736
- "trebuchet-ms#top_candidates#2026-06-03"
457713
+ "trebuchet-ms__pt-sans#visual_review#2026-06-09"
456737
457714
  ],
456738
457715
  exportRule: "preserve_original_name",
456739
- candidateLicense: null
457716
+ candidateLicense: "OFL-1.1"
456740
457717
  },
456741
457718
  {
456742
457719
  evidenceId: "comic-sans-ms",
457720
+ generic: "sans-serif",
456743
457721
  logicalFamily: "Comic Sans MS",
456744
- physicalFamily: "Comic Neue",
457722
+ physicalFamily: "Comic Relief",
456745
457723
  verdict: "visual_only",
456746
457724
  faces: {
456747
- regular: false,
456748
- bold: false,
457725
+ regular: true,
457726
+ bold: true,
456749
457727
  italic: false,
456750
457728
  boldItalic: false
456751
457729
  },
457730
+ faceSources: {
457731
+ italic: {
457732
+ kind: "synthetic",
457733
+ from: "regular"
457734
+ },
457735
+ boldItalic: {
457736
+ kind: "synthetic",
457737
+ from: "bold"
457738
+ }
457739
+ },
456752
457740
  gates: {
456753
- static: "not_run",
457741
+ static: "pass",
456754
457742
  metric: "fail",
456755
457743
  layout: "not_run",
456756
- ship: "not_run"
457744
+ ship: "fail"
456757
457745
  },
456758
457746
  policyAction: "category_fallback",
456759
457747
  measurementRefs: [
456760
- "comic-sans-ms__comic-neue#analytic_advance#2026-06-03"
457748
+ "comic-sans-ms__comic-relief#visual_review#2026-06-09"
456761
457749
  ],
456762
457750
  exportRule: "preserve_original_name",
456763
- advance: {
456764
- meanDelta: 0.1005,
456765
- maxDelta: 0.1419
456766
- },
456767
- candidateLicense: "OFL-1.1"
457751
+ candidateLicense: "OFL-1.1",
457752
+ faceVerdicts: {
457753
+ italic: "visual_only",
457754
+ boldItalic: "visual_only"
457755
+ }
456768
457756
  },
456769
457757
  {
456770
457758
  evidenceId: "candara",
457759
+ generic: "sans-serif",
456771
457760
  logicalFamily: "Candara",
456772
457761
  physicalFamily: null,
456773
457762
  verdict: "visual_only",
@@ -456792,6 +457781,7 @@ var init_data = __esm(() => {
456792
457781
  },
456793
457782
  {
456794
457783
  evidenceId: "constantia",
457784
+ generic: "serif",
456795
457785
  logicalFamily: "Constantia",
456796
457786
  physicalFamily: null,
456797
457787
  verdict: "visual_only",
@@ -456816,6 +457806,7 @@ var init_data = __esm(() => {
456816
457806
  },
456817
457807
  {
456818
457808
  evidenceId: "corbel",
457809
+ generic: "sans-serif",
456819
457810
  logicalFamily: "Corbel",
456820
457811
  physicalFamily: null,
456821
457812
  verdict: "visual_only",
@@ -456840,6 +457831,7 @@ var init_data = __esm(() => {
456840
457831
  },
456841
457832
  {
456842
457833
  evidenceId: "lucida-console",
457834
+ generic: "monospace",
456843
457835
  logicalFamily: "Lucida Console",
456844
457836
  physicalFamily: "Cousine",
456845
457837
  verdict: "cell_width_only",
@@ -456861,13 +457853,56 @@ var init_data = __esm(() => {
456861
457853
  ],
456862
457854
  exportRule: "preserve_original_name",
456863
457855
  advance: {
457856
+ basis: "monospace_cell",
456864
457857
  meanDelta: 0.004050000000000001,
456865
457858
  maxDelta: 0.004050000000000001
456866
457859
  },
456867
457860
  candidateLicense: "OFL-1.1"
456868
457861
  },
457862
+ {
457863
+ evidenceId: "gill-sans-mt-condensed",
457864
+ generic: "sans-serif",
457865
+ logicalFamily: "Gill Sans MT Condensed",
457866
+ physicalFamily: "PT Sans Narrow",
457867
+ verdict: "visual_only",
457868
+ faces: {
457869
+ regular: true,
457870
+ bold: true,
457871
+ italic: false,
457872
+ boldItalic: false
457873
+ },
457874
+ faceSources: {
457875
+ italic: {
457876
+ kind: "synthetic",
457877
+ from: "regular"
457878
+ },
457879
+ boldItalic: {
457880
+ kind: "synthetic",
457881
+ from: "bold"
457882
+ }
457883
+ },
457884
+ gates: {
457885
+ static: "pass",
457886
+ metric: "fail",
457887
+ layout: "not_run",
457888
+ ship: "fail"
457889
+ },
457890
+ policyAction: "category_fallback",
457891
+ measurementRefs: [
457892
+ "gill-sans-mt-condensed__pt-sans-narrow#visual_review#2026-06-09"
457893
+ ],
457894
+ exportRule: "preserve_original_name",
457895
+ candidateLicense: "OFL-1.1",
457896
+ faceVerdicts: {
457897
+ regular: "visual_only",
457898
+ bold: "visual_only",
457899
+ italic: "visual_only",
457900
+ boldItalic: "visual_only"
457901
+ }
457902
+ },
456869
457903
  {
456870
457904
  evidenceId: "aptos-display",
457905
+ generic: "sans-serif",
456871
457906
  logicalFamily: "Aptos Display",
456872
457907
  physicalFamily: null,
456873
457908
  verdict: "customer_supplied",
@@ -456889,6 +457924,7 @@ var init_data = __esm(() => {
456889
457924
  },
456890
457925
  {
456891
457926
  evidenceId: "cambria-math",
457927
+ generic: "serif",
456892
457928
  logicalFamily: "Cambria Math",
456893
457929
  physicalFamily: null,
456894
457930
  verdict: "preserve_only",
@@ -456910,6 +457946,7 @@ var init_data = __esm(() => {
456910
457946
  },
456911
457947
  {
456912
457948
  evidenceId: "helvetica",
457949
+ generic: "sans-serif",
456913
457950
  logicalFamily: "Helvetica",
456914
457951
  physicalFamily: "Liberation Sans",
456915
457952
  verdict: "metric_safe",
@@ -456931,6 +457968,7 @@ var init_data = __esm(() => {
456931
457968
  ],
456932
457969
  exportRule: "preserve_original_name",
456933
457970
  advance: {
457971
+ basis: "latin_full",
456934
457972
  meanDelta: 0,
456935
457973
  maxDelta: 0
456936
457974
  },
@@ -456938,6 +457976,7 @@ var init_data = __esm(() => {
456938
457976
  },
456939
457977
  {
456940
457978
  evidenceId: "calibri-light",
457979
+ generic: "sans-serif",
456941
457980
  logicalFamily: "Calibri Light",
456942
457981
  physicalFamily: "Carlito",
456943
457982
  verdict: "visual_only",
@@ -456959,6 +457998,7 @@ var init_data = __esm(() => {
456959
457998
  ],
456960
457999
  exportRule: "preserve_original_name",
456961
458000
  advance: {
458001
+ basis: "latin_full",
456962
458002
  meanDelta: 0.0148,
456963
458003
  maxDelta: 0.066
456964
458004
  },
@@ -456966,6 +458006,7 @@ var init_data = __esm(() => {
456966
458006
  },
456967
458007
  {
456968
458008
  evidenceId: "baskerville-old-face",
458009
+ generic: "serif",
456969
458010
  logicalFamily: "Baskerville Old Face",
456970
458011
  physicalFamily: "Bacasime Antique",
456971
458012
  verdict: "visual_only",
@@ -456987,6 +458028,7 @@ var init_data = __esm(() => {
456987
458028
  ],
456988
458029
  exportRule: "preserve_original_name",
456989
458030
  advance: {
458031
+ basis: "latin_full",
456990
458032
  meanDelta: 0,
456991
458033
  maxDelta: 0.4915590863952334
456992
458034
  },
@@ -457002,39 +458044,128 @@ var init_data = __esm(() => {
457002
458044
  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
458045
  }
457004
458046
  ]
458047
+ },
458048
+ {
458049
+ evidenceId: "cooper-black",
458050
+ generic: "serif",
458051
+ logicalFamily: "Cooper Black",
458052
+ physicalFamily: "Caprasimo",
458053
+ verdict: "visual_only",
458054
+ faces: {
458055
+ regular: true,
458056
+ bold: false,
458057
+ italic: false,
458058
+ boldItalic: false
458059
+ },
458060
+ faceSources: {
458061
+ bold: {
458062
+ kind: "synthetic",
458063
+ from: "regular"
458064
+ },
458065
+ italic: {
458066
+ kind: "synthetic",
458067
+ from: "regular"
458068
+ },
458069
+ boldItalic: {
458070
+ kind: "synthetic",
458071
+ from: "regular"
458072
+ }
458073
+ },
458074
+ gates: {
458075
+ static: "pass",
458076
+ metric: "pass",
458077
+ layout: "not_run",
458078
+ ship: "not_run"
458079
+ },
458080
+ policyAction: "substitute",
458081
+ measurementRefs: [
458082
+ "cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05",
458083
+ "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"
458084
+ ],
458085
+ exportRule: "preserve_original_name",
458086
+ advance: {
458087
+ basis: "latin_full",
458088
+ meanDelta: 0,
458089
+ maxDelta: 0
458090
+ },
458091
+ candidateLicense: "OFL-1.1",
458092
+ faceVerdicts: {
458093
+ regular: "metric_safe",
458094
+ bold: "visual_only",
458095
+ italic: "visual_only",
458096
+ boldItalic: "visual_only"
458097
+ }
457005
458098
  }
457006
458099
  ];
457007
458100
  });
457008
458101
 
457009
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.2.0/node_modules/@docfonts/fallbacks/dist/fallbacks.js
458102
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/fallbacks.js
457010
458103
  function normalizeFamilyName2(name) {
457011
458104
  return name.trim().replace(/^['"]+|['"]+$/g, "").trim().toLowerCase();
457012
458105
  }
457013
- function buildFallback2(row2, physicalFamily) {
458106
+ function buildFallback2(row2, physicalFamily, verdict, faceSlot, faceSource) {
458107
+ const glyphExceptions = faceSlot ? row2.glyphExceptions?.filter((g2) => g2.slot === faceSlot) : row2.glyphExceptions ? [...row2.glyphExceptions] : undefined;
457014
458108
  return {
457015
458109
  substituteFamily: physicalFamily,
457016
458110
  policyAction: row2.policyAction,
457017
- verdict: row2.verdict,
457018
- lineBreakSafe: LINE_BREAK_SAFE_VERDICTS2.has(row2.verdict),
457019
- evidenceId: row2.evidenceId
458111
+ verdict,
458112
+ lineBreakSafe: LINE_BREAK_SAFE_VERDICTS2.has(verdict),
458113
+ faces: row2.faces,
458114
+ evidenceId: row2.evidenceId,
458115
+ generic: row2.generic,
458116
+ ...faceSource ? { faceSource: { ...faceSource } } : {},
458117
+ ...glyphExceptions && glyphExceptions.length > 0 ? { glyphExceptions } : {}
457020
458118
  };
457021
458119
  }
457022
458120
  function decideRow2(row2, canRenderFamily2) {
457023
- const { policyAction, physicalFamily, verdict, evidenceId } = row2;
458121
+ const { policyAction, physicalFamily, verdict, evidenceId, generic } = row2;
457024
458122
  if (policyAction === "preserve_only")
457025
- return { kind: "preserve_only", evidenceId };
458123
+ return { kind: "preserve_only", evidenceId, generic };
457026
458124
  if (policyAction === "customer_supplied")
457027
- return { kind: "customer_supplied", evidenceId };
458125
+ return { kind: "customer_supplied", evidenceId, generic };
457028
458126
  if (physicalFamily === null)
457029
- return { kind: "no_recommended_fallback", evidenceId };
458127
+ return { kind: "no_recommended_fallback", evidenceId, generic };
457030
458128
  if (canRenderFamily2 && !canRenderFamily2(physicalFamily))
457031
458129
  return {
457032
458130
  kind: "asset_missing",
457033
458131
  substituteFamily: physicalFamily,
457034
458132
  verdict,
457035
- evidenceId
458133
+ evidenceId,
458134
+ generic
457036
458135
  };
457037
- return { kind: "fallback", fallback: buildFallback2(row2, physicalFamily) };
458136
+ return {
458137
+ kind: "fallback",
458138
+ fallback: buildFallback2(row2, physicalFamily, verdict)
458139
+ };
458140
+ }
458141
+ function isFaceScoped2(row2) {
458142
+ const f2 = row2.faces;
458143
+ return f2.regular || f2.bold || f2.italic || f2.boldItalic;
458144
+ }
458145
+ function faceSourceFor2(row2, face) {
458146
+ const explicit = row2.faceSources?.[face];
458147
+ if (explicit)
458148
+ return explicit;
458149
+ return isFaceScoped2(row2) && row2.faces[face] ? { kind: "real" } : undefined;
458150
+ }
458151
+ function decideRowForFace2(row2, face, canRenderFamily2) {
458152
+ const base6 = decideRow2(row2, canRenderFamily2);
458153
+ if (base6.kind !== "fallback")
458154
+ return base6;
458155
+ const faceSource = faceSourceFor2(row2, face);
458156
+ if (isFaceScoped2(row2) && !faceSource)
458157
+ return {
458158
+ kind: "face_missing",
458159
+ substituteFamily: base6.fallback.substituteFamily,
458160
+ evidenceId: row2.evidenceId,
458161
+ generic: row2.generic
458162
+ };
458163
+ const faceVerdict = row2.faceVerdicts?.[face] ?? row2.verdict;
458164
+ const projectedFaceSource = faceSource?.kind === "synthetic" ? faceSource : undefined;
458165
+ return {
458166
+ kind: "fallback",
458167
+ fallback: buildFallback2(row2, base6.fallback.substituteFamily, faceVerdict, face, projectedFaceSource)
458168
+ };
457038
458169
  }
457039
458170
  function getFallbackDecision2(family2, options = {}) {
457040
458171
  const row2 = BY_LOGICAL2.get(normalizeFamilyName2(family2));
@@ -457044,6 +458175,10 @@ function getRenderableFallback2(family2, options) {
457044
458175
  const decision = getFallbackDecision2(family2, options);
457045
458176
  return decision.kind === "fallback" ? decision.fallback : null;
457046
458177
  }
458178
+ function getFallbackDecisionForFace2(family2, face, options = {}) {
458179
+ const row2 = BY_LOGICAL2.get(normalizeFamilyName2(family2));
458180
+ return row2 ? decideRowForFace2(row2, face, options.canRenderFamily) : { kind: "unknown" };
458181
+ }
457047
458182
  var LINE_BREAK_SAFE_VERDICTS2, BY_LOGICAL2;
457048
458183
  var init_fallbacks = __esm(() => {
457049
458184
  init_data();
@@ -457058,7 +458193,7 @@ var init_fallbacks = __esm(() => {
457058
458193
  ]));
457059
458194
  });
457060
458195
 
457061
- // ../../node_modules/.pnpm/@docfonts+fallbacks@0.2.0/node_modules/@docfonts/fallbacks/dist/index.js
458196
+ // ../../node_modules/.pnpm/@docfonts+fallbacks@0.12.0/node_modules/@docfonts/fallbacks/dist/index.js
457062
458197
  var init_dist11 = __esm(() => {
457063
458198
  init_data();
457064
458199
  init_fallbacks();
@@ -457076,6 +458211,9 @@ function fourFaces2(filePrefix) {
457076
458211
  function family2(name, filePrefix, license) {
457077
458212
  return { family: name, license, faces: fourFaces2(filePrefix) };
457078
458213
  }
458214
+ function familyWithFaces2(name, license, faces) {
458215
+ return { family: name, license, faces };
458216
+ }
457079
458217
  var BUNDLED_MANIFEST2;
457080
458218
  var init_bundled_manifest = __esm(() => {
457081
458219
  BUNDLED_MANIFEST2 = Object.freeze([
@@ -457083,7 +458221,20 @@ var init_bundled_manifest = __esm(() => {
457083
458221
  family2("Caladea", "Caladea", "Apache-2.0"),
457084
458222
  family2("Liberation Sans", "LiberationSans", "OFL-1.1"),
457085
458223
  family2("Liberation Serif", "LiberationSerif", "OFL-1.1"),
457086
- family2("Liberation Mono", "LiberationMono", "OFL-1.1")
458224
+ family2("Liberation Mono", "LiberationMono", "OFL-1.1"),
458225
+ familyWithFaces2("Caprasimo", "OFL-1.1", [{ weight: "normal", style: "normal", file: "Caprasimo-Regular.woff2" }]),
458226
+ family2("Gelasio", "Gelasio", "OFL-1.1"),
458227
+ familyWithFaces2("Cardo", "OFL-1.1", [
458228
+ { weight: "normal", style: "normal", file: "Cardo-Regular.woff2" },
458229
+ { weight: "bold", style: "normal", file: "Cardo-Bold.woff2" },
458230
+ { weight: "normal", style: "italic", file: "Cardo-Italic.woff2" }
458231
+ ]),
458232
+ familyWithFaces2("Comic Relief", "OFL-1.1", [
458233
+ { weight: "normal", style: "normal", file: "ComicRelief-Regular.woff2" },
458234
+ { weight: "bold", style: "normal", file: "ComicRelief-Bold.woff2" }
458235
+ ]),
458236
+ family2("Noto Sans", "NotoSans", "OFL-1.1"),
458237
+ family2("PT Sans", "PTSans", "OFL-1.1")
457087
458238
  ]);
457088
458239
  });
457089
458240
 
@@ -457101,6 +458252,59 @@ function normalizeFamilyKey3(family3) {
457101
458252
  function sortPairs2(pairs) {
457102
458253
  return pairs.sort(([a2], [b2]) => a2 < b2 ? -1 : a2 > b2 ? 1 : 0);
457103
458254
  }
458255
+ function faceSlotFor2({ weight, style: style2 }) {
458256
+ const bold = weight === "700";
458257
+ const italic = style2 === "italic";
458258
+ if (bold && italic)
458259
+ return "boldItalic";
458260
+ if (bold)
458261
+ return "bold";
458262
+ if (italic)
458263
+ return "italic";
458264
+ return "regular";
458265
+ }
458266
+ function faceKeyForSlot2(slot) {
458267
+ switch (slot) {
458268
+ case "bold":
458269
+ return { weight: "700", style: "normal" };
458270
+ case "italic":
458271
+ return { weight: "400", style: "italic" };
458272
+ case "boldItalic":
458273
+ return { weight: "700", style: "italic" };
458274
+ case "regular":
458275
+ return { weight: "400", style: "normal" };
458276
+ }
458277
+ }
458278
+ function reasonForFallback2(policyAction) {
458279
+ return policyAction === "category_fallback" ? "category_fallback" : "bundled_substitute";
458280
+ }
458281
+ function resolveDocfontsFace2(primary, face, hasFace) {
458282
+ const decision = getFallbackDecisionForFace2(primary, faceSlotFor2(face), { canRenderFamily: canRenderFamily2 });
458283
+ if (decision.kind === "face_missing") {
458284
+ return { physical: primary, reason: "fallback_face_absent" };
458285
+ }
458286
+ if (decision.kind !== "fallback")
458287
+ return null;
458288
+ const fallback = decision.fallback;
458289
+ if (fallback.policyAction !== "substitute" && fallback.policyAction !== "category_fallback")
458290
+ return null;
458291
+ if (hasFace(fallback.substituteFamily, face.weight, face.style)) {
458292
+ return {
458293
+ physical: fallback.substituteFamily,
458294
+ reason: reasonForFallback2(fallback.policyAction)
458295
+ };
458296
+ }
458297
+ const sourceFace = fallback.faceSource?.kind === "synthetic" ? faceKeyForSlot2(fallback.faceSource.from) : face;
458298
+ if (!hasFace(fallback.substituteFamily, sourceFace.weight, sourceFace.style)) {
458299
+ return fallback.policyAction === "substitute" ? { physical: primary, reason: "fallback_face_absent" } : null;
458300
+ }
458301
+ const sourceDiffers = sourceFace.weight !== face.weight || sourceFace.style !== face.style;
458302
+ return {
458303
+ physical: fallback.substituteFamily,
458304
+ reason: reasonForFallback2(fallback.policyAction),
458305
+ ...sourceDiffers ? { sourceFace } : {}
458306
+ };
458307
+ }
457104
458308
  function deriveBundledSubstitutes2() {
457105
458309
  const substitutes = {};
457106
458310
  for (const row2 of SUBSTITUTION_EVIDENCE3) {
@@ -457223,14 +458427,10 @@ class FontResolver2 {
457223
458427
  if (hasFace(primary, face.weight, face.style)) {
457224
458428
  return { physical: primary, reason: "registered_face" };
457225
458429
  }
458430
+ const docfonts = resolveDocfontsFace2(primary, face, hasFace);
458431
+ if (docfonts)
458432
+ return docfonts;
457226
458433
  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
458434
  if (override || bundled) {
457235
458435
  return { physical: primary, reason: "fallback_face_absent" };
457236
458436
  }
@@ -457256,8 +458456,13 @@ class FontResolver2 {
457256
458456
  resolveFace(logicalFamily, face, hasFace) {
457257
458457
  const parts = splitStack2(logicalFamily);
457258
458458
  const primary = parts[0] ?? logicalFamily;
457259
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
457260
- return { logicalFamily, physicalFamily: stripFamilyQuotes2(physical), reason };
458459
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
458460
+ return {
458461
+ logicalFamily,
458462
+ physicalFamily: stripFamilyQuotes2(physical),
458463
+ reason,
458464
+ ...sourceFace ? { sourceFace } : {}
458465
+ };
457261
458466
  }
457262
458467
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
457263
458468
  if (!cssFontFamily)
@@ -457707,7 +458912,7 @@ function deriveOfferings2() {
457707
458912
  return {
457708
458913
  logicalFamily: row2.logicalFamily,
457709
458914
  physicalFamily: row2.physicalFamily,
457710
- generic: row2.physicalFamily && PHYSICAL_GENERIC2[row2.physicalFamily] || "sans-serif",
458915
+ generic: row2.generic,
457711
458916
  offering: classifyOffering2(row2.policyAction, row2.verdict, row2.physicalFamily, bundled),
457712
458917
  bundled,
457713
458918
  verdict: row2.verdict,
@@ -457716,21 +458921,28 @@ function deriveOfferings2() {
457716
458921
  });
457717
458922
  return Object.freeze(offerings);
457718
458923
  }
457719
- var PHYSICAL_GENERIC2, BUNDLED_FAMILIES2, FONT_OFFERINGS2;
458924
+ var BUNDLED_FAMILIES2, ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES2, FONT_OFFERINGS2;
457720
458925
  var init_font_offerings = __esm(() => {
457721
- init_substitution_evidence();
457722
458926
  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
- });
458927
+ init_substitution_evidence();
457730
458928
  BUNDLED_FAMILIES2 = new Set(BUNDLED_MANIFEST2.map((f2) => f2.family));
458929
+ ADVERTISED_BUILT_IN_TOOLBAR_FAMILIES2 = new Set([
458930
+ "Cooper Black",
458931
+ "Comic Sans MS",
458932
+ "Garamond",
458933
+ "Georgia",
458934
+ "Tahoma",
458935
+ "Trebuchet MS"
458936
+ ]);
457731
458937
  FONT_OFFERINGS2 = deriveOfferings2();
457732
458938
  });
457733
458939
 
458940
+ // ../../shared/font-system/src/document-font-options.ts
458941
+ var init_document_font_options = __esm(() => {
458942
+ init_report();
458943
+ init_font_offerings();
458944
+ });
458945
+
457734
458946
  // ../../shared/font-system/src/index.ts
457735
458947
  var init_src5 = __esm(() => {
457736
458948
  init_types8();
@@ -457741,6 +458953,7 @@ var init_src5 = __esm(() => {
457741
458953
  init_os2();
457742
458954
  init_registry2();
457743
458955
  init_font_offerings();
458956
+ init_document_font_options();
457744
458957
  });
457745
458958
 
457746
458959
  // ../../packages/super-editor/src/editors/v1/core/super-converter/v2/exporter/commentsExporter.js
@@ -458775,6 +459988,7 @@ function groupTrackedChanges2(editor) {
458775
459988
  return cached2.grouped;
458776
459989
  const marks = getRawTrackedMarks2(editor);
458777
459990
  const byRawId = new Map;
459991
+ const segmentsByRawId = new Map;
458778
459992
  for (const item of marks) {
458779
459993
  const attrs = item.mark?.attrs ?? {};
458780
459994
  const id2 = toNonEmptyString2(attrs.id);
@@ -458791,6 +460005,11 @@ function groupTrackedChanges2(editor) {
458791
460005
  const contributesToExcerpt = !wordRevisionId || !hasChildTrackedMarkOnNode2(item, id2);
458792
460006
  const excerptText = contributesToExcerpt ? getTrackedMarkText2(editor, item) : "";
458793
460007
  const range = [item.from, item.to];
460008
+ const priorSegments = segmentsByRawId.get(groupKey);
460009
+ if (priorSegments)
460010
+ priorSegments.push({ from: item.from, to: item.to });
460011
+ else
460012
+ segmentsByRawId.set(groupKey, [{ from: item.from, to: item.to }]);
458794
460013
  if (!existing) {
458795
460014
  byRawId.set(groupKey, {
458796
460015
  rawId: groupKey,
@@ -458840,7 +460059,19 @@ function groupTrackedChanges2(editor) {
458840
460059
  return a2.id.localeCompare(b2.id);
458841
460060
  });
458842
460061
  attachOverlapMetadata2(grouped);
458843
- for (const structural of enumerateStructuralRowChanges2(editor.state)) {
460062
+ const structuralChanges = enumerateStructuralRowChanges2(editor.state);
460063
+ const wholeTableRanges = structuralChanges.filter((structural) => structural.decidable && structural.wholeTable).map((structural) => ({ from: structural.tableFrom, to: structural.tableTo }));
460064
+ if (wholeTableRanges.length > 0) {
460065
+ const segmentInsideSomeTable = (segment) => wholeTableRanges.some((range) => segment.from >= range.from && segment.to <= range.to);
460066
+ for (let i5 = grouped.length - 1;i5 >= 0; i5 -= 1) {
460067
+ const change = grouped[i5];
460068
+ const segments = segmentsByRawId.get(change.rawId) ?? [{ from: change.from, to: change.to }];
460069
+ const ownedByTable = segments.every(segmentInsideSomeTable);
460070
+ if (ownedByTable)
460071
+ grouped.splice(i5, 1);
460072
+ }
460073
+ }
460074
+ for (const structural of structuralChanges) {
458844
460075
  const excerpt = normalizeExcerpt2(editor.state.doc.textBetween(structural.tableFrom, structural.tableTo, " ", ""));
458845
460076
  const stableRawId = structural.sourceId ? `word:structural:${structural.sourceId}` : structural.id;
458846
460077
  grouped.push({