@superdoc-dev/cli 0.17.0-next.7 → 0.17.0-next.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +579 -162
  2. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -68327,7 +68327,7 @@ var init_remark_gfm_BhnWr3yf_es = __esm(() => {
68327
68327
  emptyOptions2 = {};
68328
68328
  });
68329
68329
 
68330
- // ../../packages/superdoc/dist/chunks/SuperConverter-BaKhr4cp.es.js
68330
+ // ../../packages/superdoc/dist/chunks/SuperConverter-BtvpSnE5.es.js
68331
68331
  function getExtensionConfigField(extension$1, field, context = { name: "" }) {
68332
68332
  const fieldValue = extension$1.config[field];
68333
68333
  if (typeof fieldValue === "function")
@@ -102470,7 +102470,7 @@ function isSettled(status) {
102470
102470
  function normalizeFamilyName(name) {
102471
102471
  return name.trim().replace(/^['"]+|['"]+$/g, "").trim().toLowerCase();
102472
102472
  }
102473
- function buildFallback(row, physicalFamily, verdict, faceSlot) {
102473
+ function buildFallback(row, physicalFamily, verdict, faceSlot, faceSource) {
102474
102474
  const glyphExceptions = faceSlot ? row.glyphExceptions?.filter((g2) => g2.slot === faceSlot) : row.glyphExceptions ? [...row.glyphExceptions] : undefined;
102475
102475
  return {
102476
102476
  substituteFamily: physicalFamily,
@@ -102480,6 +102480,7 @@ function buildFallback(row, physicalFamily, verdict, faceSlot) {
102480
102480
  faces: row.faces,
102481
102481
  evidenceId: row.evidenceId,
102482
102482
  generic: row.generic,
102483
+ ...faceSource ? { faceSource: { ...faceSource } } : {},
102483
102484
  ...glyphExceptions && glyphExceptions.length > 0 ? { glyphExceptions } : {}
102484
102485
  };
102485
102486
  }
@@ -102520,11 +102521,18 @@ function isFaceScoped(row) {
102520
102521
  const f2 = row.faces;
102521
102522
  return f2.regular || f2.bold || f2.italic || f2.boldItalic;
102522
102523
  }
102524
+ function faceSourceFor(row, face) {
102525
+ const explicit = row.faceSources?.[face];
102526
+ if (explicit)
102527
+ return explicit;
102528
+ return isFaceScoped(row) && row.faces[face] ? { kind: "real" } : undefined;
102529
+ }
102523
102530
  function decideRowForFace(row, face, canRenderFamily$1) {
102524
102531
  const base$1 = decideRow(row, canRenderFamily$1);
102525
102532
  if (base$1.kind !== "fallback")
102526
102533
  return base$1;
102527
- if (isFaceScoped(row) && !row.faces[face])
102534
+ const faceSource = faceSourceFor(row, face);
102535
+ if (isFaceScoped(row) && !faceSource)
102528
102536
  return {
102529
102537
  kind: "face_missing",
102530
102538
  substituteFamily: base$1.fallback.substituteFamily,
@@ -102532,9 +102540,10 @@ function decideRowForFace(row, face, canRenderFamily$1) {
102532
102540
  generic: row.generic
102533
102541
  };
102534
102542
  const faceVerdict = row.faceVerdicts?.[face] ?? row.verdict;
102543
+ const projectedFaceSource = faceSource?.kind === "synthetic" ? faceSource : undefined;
102535
102544
  return {
102536
102545
  kind: "fallback",
102537
- fallback: buildFallback(row, base$1.fallback.substituteFamily, faceVerdict, face)
102546
+ fallback: buildFallback(row, base$1.fallback.substituteFamily, faceVerdict, face, projectedFaceSource)
102538
102547
  };
102539
102548
  }
102540
102549
  function getFallbackDecision(family$1, options = {}) {
@@ -102584,12 +102593,87 @@ function family(name, filePrefix, license) {
102584
102593
  faces: fourFaces(filePrefix)
102585
102594
  };
102586
102595
  }
102596
+ function familyWithFaces(name, license, faces) {
102597
+ return {
102598
+ family: name,
102599
+ license,
102600
+ faces
102601
+ };
102602
+ }
102587
102603
  function normalizeFamilyKey$1(family$1) {
102588
102604
  return family$1.trim().replace(/^["']|["']$/g, "").toLowerCase();
102589
102605
  }
102590
102606
  function sortPairs(pairs) {
102591
102607
  return pairs.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
102592
102608
  }
102609
+ function faceSlotFor$1({ weight, style }) {
102610
+ const bold2 = weight === "700";
102611
+ const italic = style === "italic";
102612
+ if (bold2 && italic)
102613
+ return "boldItalic";
102614
+ if (bold2)
102615
+ return "bold";
102616
+ if (italic)
102617
+ return "italic";
102618
+ return "regular";
102619
+ }
102620
+ function faceKeyForSlot(slot) {
102621
+ switch (slot) {
102622
+ case "bold":
102623
+ return {
102624
+ weight: "700",
102625
+ style: "normal"
102626
+ };
102627
+ case "italic":
102628
+ return {
102629
+ weight: "400",
102630
+ style: "italic"
102631
+ };
102632
+ case "boldItalic":
102633
+ return {
102634
+ weight: "700",
102635
+ style: "italic"
102636
+ };
102637
+ case "regular":
102638
+ return {
102639
+ weight: "400",
102640
+ style: "normal"
102641
+ };
102642
+ }
102643
+ }
102644
+ function reasonForFallback(policyAction) {
102645
+ return policyAction === "category_fallback" ? "category_fallback" : "bundled_substitute";
102646
+ }
102647
+ function resolveDocfontsFace(primary, face, hasFace) {
102648
+ const decision = getFallbackDecisionForFace(primary, faceSlotFor$1(face), { canRenderFamily });
102649
+ if (decision.kind === "face_missing")
102650
+ return {
102651
+ physical: primary,
102652
+ reason: "fallback_face_absent"
102653
+ };
102654
+ if (decision.kind !== "fallback")
102655
+ return null;
102656
+ const fallback = decision.fallback;
102657
+ if (fallback.policyAction !== "substitute" && fallback.policyAction !== "category_fallback")
102658
+ return null;
102659
+ if (hasFace(fallback.substituteFamily, face.weight, face.style))
102660
+ return {
102661
+ physical: fallback.substituteFamily,
102662
+ reason: reasonForFallback(fallback.policyAction)
102663
+ };
102664
+ const sourceFace = fallback.faceSource?.kind === "synthetic" ? faceKeyForSlot(fallback.faceSource.from) : face;
102665
+ if (!hasFace(fallback.substituteFamily, sourceFace.weight, sourceFace.style))
102666
+ return fallback.policyAction === "substitute" ? {
102667
+ physical: primary,
102668
+ reason: "fallback_face_absent"
102669
+ } : null;
102670
+ const sourceDiffers = sourceFace.weight !== face.weight || sourceFace.style !== face.style;
102671
+ return {
102672
+ physical: fallback.substituteFamily,
102673
+ reason: reasonForFallback(fallback.policyAction),
102674
+ ...sourceDiffers ? { sourceFace } : {}
102675
+ };
102676
+ }
102593
102677
  function deriveBundledSubstitutes() {
102594
102678
  const substitutes = {};
102595
102679
  for (const row of SUBSTITUTION_EVIDENCE) {
@@ -102731,11 +102815,13 @@ function buildFaceReport(usedFaces, registry, resolver$1) {
102731
102815
  weight,
102732
102816
  style
102733
102817
  };
102734
- const { physicalFamily, reason } = resolver$1 ? resolver$1.resolveFace(logicalFamily, face, hasFace) : resolveFace(logicalFamily, face, hasFace);
102818
+ const resolution = resolver$1 ? resolver$1.resolveFace(logicalFamily, face, hasFace) : resolveFace(logicalFamily, face, hasFace);
102819
+ const { physicalFamily, reason } = resolution;
102820
+ const statusFace = resolution.sourceFace ?? face;
102735
102821
  const loadStatus = registry.getFaceStatus({
102736
102822
  family: physicalFamily,
102737
- weight,
102738
- style
102823
+ weight: statusFace.weight,
102824
+ style: statusFace.style
102739
102825
  });
102740
102826
  const missing = reason === "fallback_face_absent" || reason === "category_fallback" || isSettled(loadStatus) && loadStatus !== "loaded";
102741
102827
  const evidence = isRenderedSubstitute(reason) ? toEvidence(getRenderableFallbackForFace(logicalFamily, faceSlotFor(face), RENDER_ALL)) : undefined;
@@ -102862,8 +102948,8 @@ function deriveOfferings() {
102862
102948
  function compareLogicalFamily(a, b) {
102863
102949
  return a.logicalFamily.localeCompare(b.logicalFamily, "en", { sensitivity: "base" });
102864
102950
  }
102865
- function getDefaultFontOfferings() {
102866
- return FONT_OFFERINGS.filter((o) => o.offering === "default").sort(compareLogicalFamily);
102951
+ function getBuiltInToolbarFontOfferings() {
102952
+ return FONT_OFFERINGS.filter((o) => o.offering === "default" || o.offering === "qualified" && ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES.has(o.logicalFamily)).sort(compareLogicalFamily);
102867
102953
  }
102868
102954
  function fontOfferingStack(offering) {
102869
102955
  return `${offering.logicalFamily}, ${offering.generic}`;
@@ -102872,7 +102958,7 @@ function fontOfferingRenderStack(offering) {
102872
102958
  return offering.physicalFamily ? `${offering.physicalFamily}, ${offering.generic}` : fontOfferingStack(offering);
102873
102959
  }
102874
102960
  function getDefaultFontFamilyOptions() {
102875
- return getDefaultFontOfferings().map((offering) => ({
102961
+ return getBuiltInToolbarFontOfferings().map((offering) => ({
102876
102962
  label: offering.logicalFamily,
102877
102963
  value: fontOfferingStack(offering)
102878
102964
  }));
@@ -104893,12 +104979,14 @@ function applyTocMetadata(blocks, metadata) {
104893
104979
  };
104894
104980
  if (metadata.instruction)
104895
104981
  block.attrs.tocInstruction = metadata.instruction;
104982
+ if (metadata.tocId)
104983
+ block.attrs.tocId = metadata.tocId;
104896
104984
  }
104897
104985
  });
104898
104986
  }
104899
104987
  function processTocChildren(children, metadata, context, outputArrays) {
104900
104988
  const paragraphConverter = context.converters.paragraphToFlowBlocks;
104901
- const { docPartGallery, docPartObjectId, tocInstruction } = metadata;
104989
+ const { docPartGallery, docPartObjectId, tocInstruction, tocId } = metadata;
104902
104990
  const { blocks, recordBlockKind } = outputArrays;
104903
104991
  children.forEach((child) => {
104904
104992
  if (child.type === "paragraph") {
@@ -104923,7 +105011,8 @@ function processTocChildren(children, metadata, context, outputArrays) {
104923
105011
  applyTocMetadata(paragraphBlocks, {
104924
105012
  gallery: docPartGallery,
104925
105013
  uniqueId: docPartObjectId,
104926
- instruction: tocInstruction
105014
+ instruction: tocInstruction,
105015
+ tocId
104927
105016
  });
104928
105017
  applySdtMetadataToParagraphBlocks(paragraphBlocks.filter((b) => b.kind === "paragraph"), metadata.sdtMetadata);
104929
105018
  paragraphBlocks.forEach((block) => {
@@ -104938,7 +105027,8 @@ function processTocChildren(children, metadata, context, outputArrays) {
104938
105027
  docPartGallery,
104939
105028
  docPartObjectId,
104940
105029
  tocInstruction: finalInstruction,
104941
- sdtMetadata: metadata.sdtMetadata
105030
+ sdtMetadata: metadata.sdtMetadata,
105031
+ tocId
104942
105032
  }, context, outputArrays);
104943
105033
  }
104944
105034
  });
@@ -104946,7 +105036,11 @@ function processTocChildren(children, metadata, context, outputArrays) {
104946
105036
  function handleTableOfContentsNode(node3, context) {
104947
105037
  if (!Array.isArray(node3.content))
104948
105038
  return;
104949
- processTocChildren(node3.content, { tocInstruction: getNodeInstruction(node3) }, {
105039
+ const sdBlockId = node3.attrs?.sdBlockId;
105040
+ processTocChildren(node3.content, {
105041
+ tocInstruction: getNodeInstruction(node3),
105042
+ tocId: typeof sdBlockId === "string" ? sdBlockId : undefined
105043
+ }, {
104950
105044
  nextBlockId: context.nextBlockId,
104951
105045
  positions: context.positions,
104952
105046
  bookmarks: context.bookmarks,
@@ -105275,7 +105369,8 @@ function processDocumentPartObject(child, sectionMetadata, context, output, conv
105275
105369
  docPartGallery,
105276
105370
  docPartObjectId,
105277
105371
  tocInstruction,
105278
- sdtMetadata: docPartSdtMetadata
105372
+ sdtMetadata: docPartSdtMetadata,
105373
+ tocId: docPartObjectId ?? undefined
105279
105374
  }, {
105280
105375
  nextBlockId: context.nextBlockId,
105281
105376
  positions: context.positions,
@@ -105346,12 +105441,15 @@ function handleDocumentPartObjectNode(node3, context) {
105346
105441
  const tocInstruction = getNodeInstruction(node3);
105347
105442
  const docPartSdtMetadata = resolveNodeSdtMetadata(node3, "docPartObject");
105348
105443
  const paragraphToFlowBlocks$1 = converters$1.paragraphToFlowBlocks;
105444
+ const sdBlockId = node3.attrs?.sdBlockId;
105445
+ const tocId = docPartObjectId && docPartObjectId.length > 0 ? docPartObjectId : typeof sdBlockId === "string" && sdBlockId.length > 0 ? sdBlockId : undefined;
105349
105446
  if (docPartGallery === "Table of Contents")
105350
105447
  processTocChildren(Array.from(node3.content), {
105351
105448
  docPartGallery,
105352
105449
  docPartObjectId,
105353
105450
  tocInstruction,
105354
- sdtMetadata: docPartSdtMetadata
105451
+ sdtMetadata: docPartSdtMetadata,
105452
+ tocId
105355
105453
  }, {
105356
105454
  nextBlockId,
105357
105455
  positions,
@@ -105399,7 +105497,8 @@ function handleDocumentPartObjectNode(node3, context) {
105399
105497
  docPartGallery: docPartGallery ?? "",
105400
105498
  docPartObjectId,
105401
105499
  tocInstruction: getNodeInstruction(child) ?? tocInstruction,
105402
- sdtMetadata: docPartSdtMetadata
105500
+ sdtMetadata: docPartSdtMetadata,
105501
+ tocId
105403
105502
  };
105404
105503
  const tocContext = {
105405
105504
  nextBlockId,
@@ -129792,18 +129891,10 @@ var isRegExp = (value) => {
129792
129891
  physical: primary,
129793
129892
  reason: "registered_face"
129794
129893
  };
129894
+ const docfonts = resolveDocfontsFace(primary, face, hasFace);
129895
+ if (docfonts)
129896
+ return docfonts;
129795
129897
  const bundled = BUNDLED_SUBSTITUTES[key];
129796
- if (bundled && hasFace(bundled, face.weight, face.style))
129797
- return {
129798
- physical: bundled,
129799
- reason: "bundled_substitute"
129800
- };
129801
- const category = CATEGORY_FALLBACKS[key];
129802
- if (category && hasFace(category, face.weight, face.style))
129803
- return {
129804
- physical: category,
129805
- reason: "category_fallback"
129806
- };
129807
129898
  if (override || bundled)
129808
129899
  return {
129809
129900
  physical: primary,
@@ -129836,11 +129927,12 @@ var isRegExp = (value) => {
129836
129927
  }
129837
129928
  resolveFace(logicalFamily, face, hasFace) {
129838
129929
  const primary = splitStack(logicalFamily)[0] ?? logicalFamily;
129839
- const { physical, reason } = this.#resolveFaceLadder(primary, face, hasFace);
129930
+ const { physical, reason, sourceFace } = this.#resolveFaceLadder(primary, face, hasFace);
129840
129931
  return {
129841
129932
  logicalFamily,
129842
129933
  physicalFamily: stripFamilyQuotes(physical),
129843
- reason
129934
+ reason,
129935
+ ...sourceFace ? { sourceFace } : {}
129844
129936
  };
129845
129937
  }
129846
129938
  resolvePhysicalFamilyForFace(cssFontFamily, face, hasFace) {
@@ -130216,7 +130308,7 @@ var isRegExp = (value) => {
130216
130308
  const detail = sources && sources.length ? ` from ${sources.join(", ")}` : "";
130217
130309
  console.warn(`[superdoc] font asset failed to load for "${family$1}"${detail}. Check fonts.assetBaseUrl / fonts.resolveAssetUrl so the bundled .woff2 are served.`);
130218
130310
  }
130219
- }, registriesByFontSet, domlessRegistry = null, BUNDLED_FAMILIES, FONT_OFFERINGS, prepareCommentParaIds = (comment) => {
130311
+ }, registriesByFontSet, domlessRegistry = null, BUNDLED_FAMILIES, ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES, FONT_OFFERINGS, prepareCommentParaIds = (comment) => {
130220
130312
  return {
130221
130313
  ...comment,
130222
130314
  commentParaId: generateDocxRandomId()
@@ -134192,7 +134284,7 @@ var isRegExp = (value) => {
134192
134284
  state.kern = kernNode.attributes["w:val"];
134193
134285
  }
134194
134286
  }, SuperConverter;
134195
- var init_SuperConverter_BaKhr4cp_es = __esm(() => {
134287
+ var init_SuperConverter_BtvpSnE5_es = __esm(() => {
134196
134288
  init_rolldown_runtime_Bg48TavK_es();
134197
134289
  init_jszip_C49i9kUs_es();
134198
134290
  init_xml_js_CqGKpaft_es();
@@ -171532,6 +171624,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171532
171624
  measurementRefs: ["calibri__carlito#analytic_advance#2026-06-03", "calibri__carlito#face_aggregate#2026-06-03"],
171533
171625
  exportRule: "preserve_original_name",
171534
171626
  advance: {
171627
+ basis: "latin_full",
171535
171628
  meanDelta: 0,
171536
171629
  maxDelta: 0
171537
171630
  },
@@ -171564,6 +171657,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171564
171657
  ],
171565
171658
  exportRule: "preserve_original_name",
171566
171659
  advance: {
171660
+ basis: "latin_full",
171567
171661
  meanDelta: 0.0002378,
171568
171662
  maxDelta: 0.2310758
171569
171663
  },
@@ -171603,6 +171697,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171603
171697
  measurementRefs: ["arial__liberation-sans#analytic_advance#2026-06-03"],
171604
171698
  exportRule: "preserve_original_name",
171605
171699
  advance: {
171700
+ basis: "latin_full",
171606
171701
  meanDelta: 0,
171607
171702
  maxDelta: 0
171608
171703
  },
@@ -171630,6 +171725,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171630
171725
  measurementRefs: ["times-new-roman__liberation-serif#analytic_advance#2026-06-03"],
171631
171726
  exportRule: "preserve_original_name",
171632
171727
  advance: {
171728
+ basis: "latin_full",
171633
171729
  meanDelta: 0,
171634
171730
  maxDelta: 0
171635
171731
  },
@@ -171657,6 +171753,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171657
171753
  measurementRefs: ["courier-new__liberation-mono#analytic_advance#2026-06-03"],
171658
171754
  exportRule: "preserve_original_name",
171659
171755
  advance: {
171756
+ basis: "latin_full",
171660
171757
  meanDelta: 0,
171661
171758
  maxDelta: 0
171662
171759
  },
@@ -171693,6 +171790,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171693
171790
  ],
171694
171791
  exportRule: "preserve_original_name",
171695
171792
  advance: {
171793
+ basis: "latin_full",
171696
171794
  meanDelta: 0.0000197,
171697
171795
  maxDelta: 0.0183727
171698
171796
  },
@@ -171742,6 +171840,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171742
171840
  ],
171743
171841
  exportRule: "preserve_original_name",
171744
171842
  advance: {
171843
+ basis: "latin_full",
171745
171844
  meanDelta: 0,
171746
171845
  maxDelta: 0.5
171747
171846
  },
@@ -171782,6 +171881,131 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171782
171881
  exportRule: "preserve_original_name",
171783
171882
  candidateLicense: null
171784
171883
  },
171884
+ {
171885
+ evidenceId: "arial-black",
171886
+ generic: "sans-serif",
171887
+ logicalFamily: "Arial Black",
171888
+ physicalFamily: "Archivo Black",
171889
+ verdict: "visual_only",
171890
+ faces: {
171891
+ regular: true,
171892
+ bold: false,
171893
+ italic: false,
171894
+ boldItalic: false
171895
+ },
171896
+ faceSources: { italic: {
171897
+ kind: "synthetic",
171898
+ from: "regular"
171899
+ } },
171900
+ gates: {
171901
+ static: "pass",
171902
+ metric: "fail",
171903
+ layout: "not_run",
171904
+ ship: "fail"
171905
+ },
171906
+ policyAction: "substitute",
171907
+ measurementRefs: ["arial-black__archivo-black#visual_review#2026-06-09"],
171908
+ exportRule: "preserve_original_name",
171909
+ candidateLicense: "OFL-1.1",
171910
+ faceVerdicts: { italic: "visual_only" }
171911
+ },
171912
+ {
171913
+ evidenceId: "arial-rounded-mt-bold",
171914
+ generic: "sans-serif",
171915
+ logicalFamily: "Arial Rounded MT Bold",
171916
+ physicalFamily: "Ubuntu",
171917
+ verdict: "visual_only",
171918
+ faces: {
171919
+ regular: true,
171920
+ bold: true,
171921
+ italic: true,
171922
+ boldItalic: true
171923
+ },
171924
+ gates: {
171925
+ static: "pass",
171926
+ metric: "fail",
171927
+ layout: "not_run",
171928
+ ship: "fail"
171929
+ },
171930
+ policyAction: "category_fallback",
171931
+ measurementRefs: ["arial-rounded-mt-bold__ubuntu#visual_review#2026-06-09"],
171932
+ exportRule: "preserve_original_name",
171933
+ candidateLicense: "Ubuntu-font-1.0"
171934
+ },
171935
+ {
171936
+ evidenceId: "bookman-old-style",
171937
+ generic: "serif",
171938
+ logicalFamily: "Bookman Old Style",
171939
+ physicalFamily: "TeX Gyre Bonum",
171940
+ verdict: "visual_only",
171941
+ faces: {
171942
+ regular: true,
171943
+ bold: true,
171944
+ italic: true,
171945
+ boldItalic: true
171946
+ },
171947
+ gates: {
171948
+ static: "pass",
171949
+ metric: "fail",
171950
+ layout: "not_run",
171951
+ ship: "fail"
171952
+ },
171953
+ policyAction: "substitute",
171954
+ measurementRefs: ["bookman-old-style__tex-gyre-bonum#visual_review#2026-06-09"],
171955
+ exportRule: "preserve_original_name",
171956
+ candidateLicense: "GUST-Font-License-1.0"
171957
+ },
171958
+ {
171959
+ evidenceId: "century",
171960
+ generic: "serif",
171961
+ logicalFamily: "Century",
171962
+ physicalFamily: "C059",
171963
+ verdict: "visual_only",
171964
+ faces: {
171965
+ regular: true,
171966
+ bold: true,
171967
+ italic: true,
171968
+ boldItalic: true
171969
+ },
171970
+ gates: {
171971
+ static: "pass",
171972
+ metric: "fail",
171973
+ layout: "not_run",
171974
+ ship: "fail"
171975
+ },
171976
+ policyAction: "substitute",
171977
+ measurementRefs: ["century__c059#visual_review#2026-06-09"],
171978
+ exportRule: "preserve_original_name",
171979
+ candidateLicense: "AGPL-3.0-only WITH PS-or-PDF-font-exception-20170817"
171980
+ },
171981
+ {
171982
+ evidenceId: "garamond",
171983
+ generic: "serif",
171984
+ logicalFamily: "Garamond",
171985
+ physicalFamily: "Cardo",
171986
+ verdict: "visual_only",
171987
+ faces: {
171988
+ regular: true,
171989
+ bold: true,
171990
+ italic: true,
171991
+ boldItalic: false
171992
+ },
171993
+ faceSources: { boldItalic: {
171994
+ kind: "synthetic",
171995
+ from: "bold"
171996
+ } },
171997
+ gates: {
171998
+ static: "pass",
171999
+ metric: "fail",
172000
+ layout: "not_run",
172001
+ ship: "fail"
172002
+ },
172003
+ policyAction: "category_fallback",
172004
+ measurementRefs: ["garamond__cardo#visual_review#2026-06-09"],
172005
+ exportRule: "preserve_original_name",
172006
+ candidateLicense: "OFL-1.1",
172007
+ faceVerdicts: { boldItalic: "visual_only" }
172008
+ },
171785
172009
  {
171786
172010
  evidenceId: "consolas",
171787
172011
  generic: "monospace",
@@ -171804,6 +172028,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171804
172028
  measurementRefs: ["consolas__inconsolata-semiexpanded#analytic_advance#2026-06-03"],
171805
172029
  exportRule: "preserve_original_name",
171806
172030
  advance: {
172031
+ basis: "monospace_cell",
171807
172032
  meanDelta: 0.00035999999999999997,
171808
172033
  maxDelta: 0.00035999999999999997
171809
172034
  },
@@ -171836,74 +172061,84 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171836
172061
  evidenceId: "tahoma",
171837
172062
  generic: "sans-serif",
171838
172063
  logicalFamily: "Tahoma",
171839
- physicalFamily: null,
172064
+ physicalFamily: "Noto Sans",
171840
172065
  verdict: "visual_only",
171841
172066
  faces: {
171842
- regular: false,
171843
- bold: false,
171844
- italic: false,
171845
- boldItalic: false
172067
+ regular: true,
172068
+ bold: true,
172069
+ italic: true,
172070
+ boldItalic: true
171846
172071
  },
171847
172072
  gates: {
171848
- static: "not_run",
172073
+ static: "pass",
171849
172074
  metric: "fail",
171850
172075
  layout: "not_run",
171851
- ship: "not_run"
172076
+ ship: "fail"
171852
172077
  },
171853
172078
  policyAction: "category_fallback",
171854
- measurementRefs: ["tahoma#top_candidates#2026-06-03"],
172079
+ measurementRefs: ["tahoma__noto-sans#visual_review#2026-06-09"],
171855
172080
  exportRule: "preserve_original_name",
171856
- candidateLicense: null
172081
+ candidateLicense: "OFL-1.1"
171857
172082
  },
171858
172083
  {
171859
172084
  evidenceId: "trebuchet-ms",
171860
172085
  generic: "sans-serif",
171861
172086
  logicalFamily: "Trebuchet MS",
171862
- physicalFamily: null,
172087
+ physicalFamily: "PT Sans",
171863
172088
  verdict: "visual_only",
171864
172089
  faces: {
171865
- regular: false,
171866
- bold: false,
171867
- italic: false,
171868
- boldItalic: false
172090
+ regular: true,
172091
+ bold: true,
172092
+ italic: true,
172093
+ boldItalic: true
171869
172094
  },
171870
172095
  gates: {
171871
- static: "not_run",
172096
+ static: "pass",
171872
172097
  metric: "fail",
171873
172098
  layout: "not_run",
171874
- ship: "not_run"
172099
+ ship: "fail"
171875
172100
  },
171876
172101
  policyAction: "category_fallback",
171877
- measurementRefs: ["trebuchet-ms#top_candidates#2026-06-03"],
172102
+ measurementRefs: ["trebuchet-ms__pt-sans#visual_review#2026-06-09"],
171878
172103
  exportRule: "preserve_original_name",
171879
- candidateLicense: null
172104
+ candidateLicense: "OFL-1.1"
171880
172105
  },
171881
172106
  {
171882
172107
  evidenceId: "comic-sans-ms",
171883
172108
  generic: "sans-serif",
171884
172109
  logicalFamily: "Comic Sans MS",
171885
- physicalFamily: "Comic Neue",
172110
+ physicalFamily: "Comic Relief",
171886
172111
  verdict: "visual_only",
171887
172112
  faces: {
171888
- regular: false,
171889
- bold: false,
172113
+ regular: true,
172114
+ bold: true,
171890
172115
  italic: false,
171891
172116
  boldItalic: false
171892
172117
  },
172118
+ faceSources: {
172119
+ italic: {
172120
+ kind: "synthetic",
172121
+ from: "regular"
172122
+ },
172123
+ boldItalic: {
172124
+ kind: "synthetic",
172125
+ from: "bold"
172126
+ }
172127
+ },
171893
172128
  gates: {
171894
- static: "not_run",
172129
+ static: "pass",
171895
172130
  metric: "fail",
171896
172131
  layout: "not_run",
171897
- ship: "not_run"
172132
+ ship: "fail"
171898
172133
  },
171899
172134
  policyAction: "category_fallback",
171900
- measurementRefs: ["comic-sans-ms__comic-neue#analytic_advance#2026-06-03"],
172135
+ measurementRefs: ["comic-sans-ms__comic-relief#visual_review#2026-06-09"],
171901
172136
  exportRule: "preserve_original_name",
171902
- advance: {
171903
- meanDelta: 0.1005,
171904
- maxDelta: 0.1419
171905
- },
171906
- candidateLicense: "OFL-1.1"
172137
+ candidateLicense: "OFL-1.1",
172138
+ faceVerdicts: {
172139
+ italic: "visual_only",
172140
+ boldItalic: "visual_only"
172141
+ }
171907
172142
  },
171908
172143
  {
171909
172144
  evidenceId: "candara",
@@ -171996,11 +172231,51 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
171996
172231
  measurementRefs: ["lucida-console__cousine#analytic_advance#2026-06-03"],
171997
172232
  exportRule: "preserve_original_name",
171998
172233
  advance: {
172234
+ basis: "monospace_cell",
171999
172235
  meanDelta: 0.004050000000000001,
172000
172236
  maxDelta: 0.004050000000000001
172001
172237
  },
172002
172238
  candidateLicense: "OFL-1.1"
172003
172239
  },
172240
+ {
172241
+ evidenceId: "gill-sans-mt-condensed",
172242
+ generic: "sans-serif",
172243
+ logicalFamily: "Gill Sans MT Condensed",
172244
+ physicalFamily: "PT Sans Narrow",
172245
+ verdict: "visual_only",
172246
+ faces: {
172247
+ regular: true,
172248
+ bold: true,
172249
+ italic: false,
172250
+ boldItalic: false
172251
+ },
172252
+ faceSources: {
172253
+ italic: {
172254
+ kind: "synthetic",
172255
+ from: "regular"
172256
+ },
172257
+ boldItalic: {
172258
+ kind: "synthetic",
172259
+ from: "bold"
172260
+ }
172261
+ },
172262
+ gates: {
172263
+ static: "pass",
172264
+ metric: "fail",
172265
+ layout: "not_run",
172266
+ ship: "fail"
172267
+ },
172268
+ policyAction: "category_fallback",
172269
+ measurementRefs: ["gill-sans-mt-condensed__pt-sans-narrow#visual_review#2026-06-09"],
172270
+ exportRule: "preserve_original_name",
172271
+ candidateLicense: "OFL-1.1",
172272
+ faceVerdicts: {
172273
+ regular: "visual_only",
172274
+ bold: "visual_only",
172275
+ italic: "visual_only",
172276
+ boldItalic: "visual_only"
172277
+ }
172278
+ },
172004
172279
  {
172005
172280
  evidenceId: "aptos-display",
172006
172281
  generic: "sans-serif",
@@ -172067,6 +172342,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172067
172342
  measurementRefs: ["helvetica__liberation-sans#analytic_advance#2026-06-03"],
172068
172343
  exportRule: "preserve_original_name",
172069
172344
  advance: {
172345
+ basis: "latin_full",
172070
172346
  meanDelta: 0,
172071
172347
  maxDelta: 0
172072
172348
  },
@@ -172094,6 +172370,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172094
172370
  measurementRefs: ["calibri-light__carlito#analytic_advance#2026-06-05"],
172095
172371
  exportRule: "preserve_original_name",
172096
172372
  advance: {
172373
+ basis: "latin_full",
172097
172374
  meanDelta: 0.0148,
172098
172375
  maxDelta: 0.066
172099
172376
  },
@@ -172121,6 +172398,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172121
172398
  measurementRefs: ["baskerville-old-face_regular__bacasime-antique#regular#w400#7dac1e5f#analytic_advance#2026-06-05"],
172122
172399
  exportRule: "preserve_original_name",
172123
172400
  advance: {
172401
+ basis: "latin_full",
172124
172402
  meanDelta: 0,
172125
172403
  maxDelta: 0.4915590863952334
172126
172404
  },
@@ -172138,13 +172416,27 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172138
172416
  generic: "serif",
172139
172417
  logicalFamily: "Cooper Black",
172140
172418
  physicalFamily: "Caprasimo",
172141
- verdict: "metric_safe",
172419
+ verdict: "visual_only",
172142
172420
  faces: {
172143
172421
  regular: true,
172144
172422
  bold: false,
172145
172423
  italic: false,
172146
172424
  boldItalic: false
172147
172425
  },
172426
+ faceSources: {
172427
+ bold: {
172428
+ kind: "synthetic",
172429
+ from: "regular"
172430
+ },
172431
+ italic: {
172432
+ kind: "synthetic",
172433
+ from: "regular"
172434
+ },
172435
+ boldItalic: {
172436
+ kind: "synthetic",
172437
+ from: "regular"
172438
+ }
172439
+ },
172148
172440
  gates: {
172149
172441
  static: "pass",
172150
172442
  metric: "pass",
@@ -172152,14 +172444,20 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172152
172444
  ship: "not_run"
172153
172445
  },
172154
172446
  policyAction: "substitute",
172155
- measurementRefs: ["cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05"],
172447
+ measurementRefs: ["cooper-black_regular__caprasimo#regular#w400#786ab84e#analytic_advance#2026-06-05", "cooper-black__caprasimo#synthetic_faces#visual_review#2026-06-09"],
172156
172448
  exportRule: "preserve_original_name",
172157
172449
  advance: {
172450
+ basis: "latin_full",
172158
172451
  meanDelta: 0,
172159
172452
  maxDelta: 0
172160
172453
  },
172161
172454
  candidateLicense: "OFL-1.1",
172162
- faceVerdicts: { regular: "metric_safe" }
172455
+ faceVerdicts: {
172456
+ regular: "metric_safe",
172457
+ bold: "visual_only",
172458
+ italic: "visual_only",
172459
+ boldItalic: "visual_only"
172460
+ }
172163
172461
  }
172164
172462
  ];
172165
172463
  LINE_BREAK_SAFE_VERDICTS = new Set([
@@ -172173,7 +172471,12 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172173
172471
  family("Caladea", "Caladea", "Apache-2.0"),
172174
172472
  family("Liberation Sans", "LiberationSans", "OFL-1.1"),
172175
172473
  family("Liberation Serif", "LiberationSerif", "OFL-1.1"),
172176
- family("Liberation Mono", "LiberationMono", "OFL-1.1")
172474
+ family("Liberation Mono", "LiberationMono", "OFL-1.1"),
172475
+ familyWithFaces("Caprasimo", "OFL-1.1", [{
172476
+ weight: "normal",
172477
+ style: "normal",
172478
+ file: "Caprasimo-Regular.woff2"
172479
+ }])
172177
172480
  ]);
172178
172481
  SUBSTITUTION_EVIDENCE = SUBSTITUTION_EVIDENCE$1;
172179
172482
  bundledFamilies = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
@@ -172189,6 +172492,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
172189
172492
  OS2_MIN_LENGTH = OS2_FSSELECTION + 2;
172190
172493
  registriesByFontSet = /* @__PURE__ */ new WeakMap;
172191
172494
  BUNDLED_FAMILIES = new Set(BUNDLED_MANIFEST.map((f2) => f2.family));
172495
+ ADVERTISED_QUALIFIED_TOOLBAR_FAMILIES = new Set(["Cooper Black"]);
172192
172496
  FONT_OFFERINGS = deriveOfferings();
172193
172497
  ALL_COMMENT_TARGETS = COMMENT_FILE_BASENAMES;
172194
172498
  REL_ID_NUMERIC_PATTERN = /rId|mi/g;
@@ -173976,7 +174280,7 @@ var init_SuperConverter_BaKhr4cp_es = __esm(() => {
173976
174280
  };
173977
174281
  });
173978
174282
 
173979
- // ../../packages/superdoc/dist/chunks/create-headless-toolbar-B3wNa0zb.es.js
174283
+ // ../../packages/superdoc/dist/chunks/create-headless-toolbar-BV5L35wQ.es.js
173980
174284
  function parseSizeUnit(val = "0") {
173981
174285
  const length3 = val.toString() || "0";
173982
174286
  const value = Number.parseFloat(length3);
@@ -184334,8 +184638,8 @@ var CSS_DIMENSION_REGEX, DOM_SIZE_UNITS, normalizeActorId = (value) => {
184334
184638
  }
184335
184639
  };
184336
184640
  };
184337
- var init_create_headless_toolbar_B3wNa0zb_es = __esm(() => {
184338
- init_SuperConverter_BaKhr4cp_es();
184641
+ var init_create_headless_toolbar_BV5L35wQ_es = __esm(() => {
184642
+ init_SuperConverter_BtvpSnE5_es();
184339
184643
  init_uuid_B2wVPhPi_es();
184340
184644
  init_constants_D9qj59G2_es();
184341
184645
  init_dist_B8HfvhaK_es();
@@ -233498,7 +233802,7 @@ var init_remark_gfm_eZN6yzWQ_es = __esm(() => {
233498
233802
  init_remark_gfm_BhnWr3yf_es();
233499
233803
  });
233500
233804
 
233501
- // ../../packages/superdoc/dist/chunks/src-BKOC1-8-.es.js
233805
+ // ../../packages/superdoc/dist/chunks/src-DumwyEvl.es.js
233502
233806
  function deleteProps(obj, propOrProps) {
233503
233807
  const props = typeof propOrProps === "string" ? [propOrProps] : propOrProps;
233504
233808
  const removeNested = (target, pathParts, index2 = 0) => {
@@ -242592,9 +242896,6 @@ function replaceCommand(wrap5, moveForward) {
242592
242896
  return true;
242593
242897
  };
242594
242898
  }
242595
- function buildSdtBlockSelector(escapedSdtId) {
242596
- return `.${DOM_CLASS_NAMES.BLOCK_SDT}[${DATA_ATTRS.SDT_ID}="${escapedSdtId}"]`;
242597
- }
242598
242899
  function buildAnnotationSelector() {
242599
242900
  return `.${DOM_CLASS_NAMES.ANNOTATION}[${DATA_ATTRS.PM_START}]`;
242600
242901
  }
@@ -274101,6 +274402,9 @@ function applySourceAnchorDataset(element3, sourceAnchor) {
274101
274402
  else
274102
274403
  delete element3.dataset.sourceOccurrenceId;
274103
274404
  }
274405
+ function allowFontSynthesis(element3) {
274406
+ element3.style.setProperty("font-synthesis", "weight style");
274407
+ }
274104
274408
  function getCellSegmentCount(cell2) {
274105
274409
  if (cell2.blocks && cell2.blocks.length > 0) {
274106
274410
  let total = 0;
@@ -293119,7 +293423,8 @@ function makeResolveFace(resolver2, hasFace) {
293119
293423
  const r$1 = resolver2.resolveFace(logical, face, hasFace);
293120
293424
  return {
293121
293425
  physicalFamily: r$1.physicalFamily,
293122
- reason: r$1.reason
293426
+ reason: r$1.reason,
293427
+ sourceFace: r$1.sourceFace
293123
293428
  };
293124
293429
  };
293125
293430
  if (resolver2)
@@ -293149,10 +293454,14 @@ function collect(acc, node3, resolveFace2) {
293149
293454
  const usedKey = `${logicalPrimary.toLowerCase()}|${weight}|${style2}`;
293150
293455
  if (acc.usedFaces.has(usedKey))
293151
293456
  return;
293152
- const { physicalFamily, reason } = resolveFace2(node3.fontFamily, {
293457
+ const { physicalFamily, reason, sourceFace } = resolveFace2(node3.fontFamily, {
293153
293458
  weight,
293154
293459
  style: style2
293155
293460
  });
293461
+ const requiredFace = sourceFace ?? {
293462
+ weight,
293463
+ style: style2
293464
+ };
293156
293465
  acc.usedFaces.set(usedKey, {
293157
293466
  logicalFamily: logicalPrimary,
293158
293467
  weight,
@@ -293163,15 +293472,17 @@ function collect(acc, node3, resolveFace2) {
293163
293472
  weight,
293164
293473
  style2,
293165
293474
  (physicalFamily || "").toLowerCase(),
293475
+ requiredFace.weight,
293476
+ requiredFace.style,
293166
293477
  reason
293167
293478
  ]);
293168
293479
  if (physicalFamily) {
293169
- const reqKey = `${physicalFamily.toLowerCase()}|${weight}|${style2}`;
293480
+ const reqKey = `${physicalFamily.toLowerCase()}|${requiredFace.weight}|${requiredFace.style}`;
293170
293481
  if (!acc.requiredFaces.has(reqKey))
293171
293482
  acc.requiredFaces.set(reqKey, {
293172
293483
  family: physicalFamily,
293173
- weight,
293174
- style: style2
293484
+ weight: requiredFace.weight,
293485
+ style: requiredFace.style
293175
293486
  });
293176
293487
  }
293177
293488
  }
@@ -312799,6 +313110,7 @@ var Node$13 = class Node$14 {
312799
313110
  this.syncInlineStyleLayers(options.editorState, options.domPositionIndex);
312800
313111
  this.applyProofingAnnotations(options.proofingAnnotations, options.rebuildDomPositionIndex);
312801
313112
  options.reapplyStructuredContentHover?.();
313113
+ options.reapplyTocGroupHover?.();
312802
313114
  }
312803
313115
  destroy() {
312804
313116
  this.#proofingDecorator.clear();
@@ -312808,6 +313120,83 @@ var Node$13 = class Node$14 {
312808
313120
  this.#commentHighlightDecorator.destroy();
312809
313121
  this.#decorationBridge.destroy();
312810
313122
  }
313123
+ }, HoverGroupCoordinator = class {
313124
+ #spec;
313125
+ #current = null;
313126
+ constructor(spec) {
313127
+ this.handleMouseEnter = (event) => {
313128
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
313129
+ if (!entry)
313130
+ return;
313131
+ const id2 = this.#spec.getId(entry);
313132
+ if (!id2)
313133
+ return;
313134
+ this.#set(id2);
313135
+ };
313136
+ this.handleMouseLeave = (event) => {
313137
+ const entry = event.target?.closest?.(this.#spec.entrySelector);
313138
+ if (!entry)
313139
+ return;
313140
+ const id2 = this.#spec.getId(entry);
313141
+ if (!id2)
313142
+ return;
313143
+ const relatedTarget = event.relatedTarget;
313144
+ if (relatedTarget) {
313145
+ const nextEntry = relatedTarget.closest?.(this.#spec.entrySelector);
313146
+ if (nextEntry && this.#spec.getId(nextEntry) === id2)
313147
+ return;
313148
+ }
313149
+ this.clear();
313150
+ };
313151
+ this.#spec = spec;
313152
+ }
313153
+ reapply() {
313154
+ if (!this.#current)
313155
+ return;
313156
+ const { id: id2 } = this.#current;
313157
+ const elements = this.#spec.queryGroup(id2);
313158
+ if (elements.length === 0) {
313159
+ this.#current = null;
313160
+ return;
313161
+ }
313162
+ this.#applyClass(elements);
313163
+ this.#spec.onApply?.(elements);
313164
+ this.#current = {
313165
+ id: id2,
313166
+ elements
313167
+ };
313168
+ }
313169
+ clear() {
313170
+ if (!this.#current)
313171
+ return;
313172
+ for (const element3 of this.#current.elements) {
313173
+ element3.classList.remove(this.#spec.hoverClass);
313174
+ this.#spec.onClear?.(element3);
313175
+ }
313176
+ this.#current = null;
313177
+ }
313178
+ #set(id2) {
313179
+ if (this.#current?.id === id2)
313180
+ return;
313181
+ this.clear();
313182
+ const elements = this.#spec.queryGroup(id2);
313183
+ if (elements.length === 0)
313184
+ return;
313185
+ this.#applyClass(elements);
313186
+ this.#spec.onApply?.(elements);
313187
+ this.#current = {
313188
+ id: id2,
313189
+ elements
313190
+ };
313191
+ }
313192
+ #applyClass(elements) {
313193
+ const filter = this.#spec.shouldApplyTo;
313194
+ for (const element3 of elements) {
313195
+ if (filter && !filter(element3))
313196
+ continue;
313197
+ element3.classList.add(this.#spec.hoverClass);
313198
+ }
313199
+ }
312811
313200
  }, ProofingStore = class {
312812
313201
  #issuesBySegment = /* @__PURE__ */ new Map;
312813
313202
  addIssue(issue) {
@@ -313418,6 +313807,9 @@ var Node$13 = class Node$14 {
313418
313807
  color: inherit !important;
313419
313808
  text-decoration: none !important;
313420
313809
  cursor: default;
313810
+ /* Disable native link drag so our pointer loop can run text-selection. */
313811
+ -webkit-user-drag: none;
313812
+ user-drag: none;
313421
313813
  }
313422
313814
 
313423
313815
  .superdoc-toc-entry .superdoc-link:hover {
@@ -313429,6 +313821,31 @@ var Node$13 = class Node$14 {
313429
313821
  outline: none;
313430
313822
  }
313431
313823
 
313824
+ /* TOC hover. .toc-group-hover is set by PresentationEditor on every entry
313825
+ sharing a data-toc-id so the whole TOC greys out together. The ::after
313826
+ stripe (height set via --toc-gap-below) fills the paragraph-spacing gap
313827
+ between adjacent entries so the hover reads as one continuous block. */
313828
+ .superdoc-toc-entry:hover,
313829
+ .superdoc-toc-entry.toc-group-hover {
313830
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
313831
+ }
313832
+
313833
+ /* Pointer-events stay on (default) so the stripe extends the parent entry's
313834
+ hit-test area through the paragraph-spacing gap. Without this, moving the
313835
+ cursor between two adjacent entries fires mouseout on the upper entry with
313836
+ relatedTarget = the page (not a TOC entry), the coordinator drops the
313837
+ group-hover class, and the grey disappears for a frame before the next
313838
+ entry's mouseover restores it — visible as a flicker. */
313839
+ .superdoc-toc-entry.toc-group-hover::after {
313840
+ content: '';
313841
+ position: absolute;
313842
+ left: 0;
313843
+ right: 0;
313844
+ top: 100%;
313845
+ height: var(--toc-gap-below, 0px);
313846
+ background-color: var(--sd-content-controls-block-hover-bg, #f2f2f2);
313847
+ }
313848
+
313432
313849
  /* Remove focus outlines from layout engine elements */
313433
313850
  .superdoc-layout,
313434
313851
  .superdoc-page,
@@ -315483,6 +315900,7 @@ menclose::after {
315483
315900
  });
315484
315901
  if (run2.fontSize != null)
315485
315902
  markerEl.style.fontSize = `${run2.fontSize}px`;
315903
+ allowFontSynthesis(markerEl);
315486
315904
  markerEl.style.fontWeight = run2.bold ? "bold" : "";
315487
315905
  markerEl.style.fontStyle = run2.italic ? "italic" : "";
315488
315906
  if (run2.color)
@@ -317406,8 +317824,12 @@ menclose::after {
317406
317824
  applyResolvedFragmentFrame(fragmentEl, resolvedItem, fragment2);
317407
317825
  else
317408
317826
  applyFragmentFrame(fragmentEl, fragment2);
317409
- if (isTocEntry)
317410
- fragmentEl.classList.add("superdoc-toc-entry");
317827
+ if (isTocEntry) {
317828
+ fragmentEl.classList.add(DOM_CLASS_NAMES.TOC_ENTRY);
317829
+ const tocId = block.attrs?.tocId;
317830
+ if (typeof tocId === "string" && tocId.length > 0)
317831
+ fragmentEl.dataset.tocId = tocId;
317832
+ }
317411
317833
  if (paraContinuesFromPrev)
317412
317834
  fragmentEl.dataset.continuesFromPrev = "true";
317413
317835
  if (paraContinuesOnNext)
@@ -317464,6 +317886,7 @@ menclose::after {
317464
317886
  style: run2.italic ? "italic" : "normal"
317465
317887
  });
317466
317888
  dropCapEl.style.fontSize = `${run2.fontSize}px`;
317889
+ allowFontSynthesis(dropCapEl);
317467
317890
  if (run2.bold)
317468
317891
  dropCapEl.style.fontWeight = "bold";
317469
317892
  if (run2.italic)
@@ -317583,6 +318006,7 @@ menclose::after {
317583
318006
  style: run2.italic ? "italic" : "normal"
317584
318007
  });
317585
318008
  element3.style.fontSize = `${run2.fontSize}px`;
318009
+ allowFontSynthesis(element3);
317586
318010
  if (run2.bold)
317587
318011
  element3.style.fontWeight = "bold";
317588
318012
  if (run2.italic)
@@ -317775,6 +318199,7 @@ menclose::after {
317775
318199
  }
317776
318200
  if (run2.textColor)
317777
318201
  annotation.style.color = run2.textColor;
318202
+ allowFontSynthesis(annotation);
317778
318203
  if (run2.bold)
317779
318204
  annotation.style.fontWeight = "bold";
317780
318205
  if (run2.italic)
@@ -325602,6 +326027,7 @@ menclose::after {
325602
326027
  #cellAnchor = null;
325603
326028
  #cellDragMode = "none";
325604
326029
  #pendingMarginClick = null;
326030
+ #pendingTocLinkNav = null;
325605
326031
  #lastSelectedImageBlockId = null;
325606
326032
  #suppressFocusInFromDraggable = false;
325607
326033
  #pendingStructuredContentLabelGesture = null;
@@ -326143,10 +326569,14 @@ menclose::after {
326143
326569
  return;
326144
326570
  }
326145
326571
  const linkEl = target?.closest?.("a.superdoc-link");
326146
- if (linkEl) {
326147
- this.#handleLinkClick(event, linkEl);
326148
- return;
326149
- }
326572
+ this.#pendingTocLinkNav = null;
326573
+ if (linkEl)
326574
+ if (linkEl.closest(`.${DOM_CLASS_NAMES.TOC_ENTRY}`))
326575
+ this.#pendingTocLinkNav = linkEl;
326576
+ else {
326577
+ this.#handleLinkClick(event, linkEl);
326578
+ return;
326579
+ }
326150
326580
  const annotationEl = target?.closest?.(buildAnnotationSelector());
326151
326581
  const isDraggableAnnotation = target?.closest?.(DRAGGABLE_SELECTOR) != null;
326152
326582
  const isNativeDragSource = target?.closest?.(DRAG_SOURCE_SELECTOR) != null;
@@ -326485,6 +326915,10 @@ menclose::after {
326485
326915
  event
326486
326916
  });
326487
326917
  this.#suppressFocusInFromDraggable = false;
326918
+ const pendingTocLink = this.#pendingTocLinkNav;
326919
+ this.#pendingTocLinkNav = null;
326920
+ if (pendingTocLink && !this.#dragThresholdExceeded)
326921
+ this.#handleLinkClick(event, pendingTocLink);
326488
326922
  if (!this.#isDragging) {
326489
326923
  this.#stopAutoScroll();
326490
326924
  return;
@@ -330959,13 +331393,13 @@ menclose::after {
330959
331393
  return;
330960
331394
  console.log(...args$1);
330961
331395
  }, 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;
330962
- var init_src_BKOC1_8_es = __esm(() => {
331396
+ var init_src_DumwyEvl_es = __esm(() => {
330963
331397
  init_rolldown_runtime_Bg48TavK_es();
330964
- init_SuperConverter_BaKhr4cp_es();
331398
+ init_SuperConverter_BtvpSnE5_es();
330965
331399
  init_jszip_C49i9kUs_es();
330966
331400
  init_xml_js_CqGKpaft_es();
330967
331401
  init_uuid_B2wVPhPi_es();
330968
- init_create_headless_toolbar_B3wNa0zb_es();
331402
+ init_create_headless_toolbar_BV5L35wQ_es();
330969
331403
  init_constants_D9qj59G2_es();
330970
331404
  init_dist_B8HfvhaK_es();
330971
331405
  init_unified_Dsuw2be5_es();
@@ -349895,6 +350329,8 @@ function print() { __p += __j.call(arguments, '') }
349895
350329
  TABLE_FRAGMENT: "superdoc-table-fragment",
349896
350330
  DOCUMENT_SECTION: "superdoc-document-section",
349897
350331
  SDT_GROUP_HOVER: "sdt-group-hover",
350332
+ TOC_ENTRY: "superdoc-toc-entry",
350333
+ TOC_GROUP_HOVER: "toc-group-hover",
349898
350334
  IMAGE_FRAGMENT: "superdoc-image-fragment",
349899
350335
  INLINE_IMAGE: "superdoc-inline-image",
349900
350336
  LIST_MARKER: "superdoc-list-marker",
@@ -351675,7 +352111,7 @@ function print() { __p += __j.call(arguments, '') }
351675
352111
  };
351676
352112
  }
351677
352113
  }, [["__scopeId", "data-v-d25821a5"]]);
351678
- TOOLBAR_FONTS = getDefaultFontOfferings().map((offering) => ({
352114
+ TOOLBAR_FONTS = getBuiltInToolbarFontOfferings().map((offering) => ({
351679
352115
  label: offering.logicalFamily,
351680
352116
  key: fontOfferingStack(offering),
351681
352117
  fontWeight: 400,
@@ -359420,7 +359856,8 @@ function print() { __p += __j.call(arguments, '') }
359420
359856
  #lastSelectedFieldAnnotation = null;
359421
359857
  #lastSelectedStructuredContentBlock = null;
359422
359858
  #lastSelectedStructuredContentInline = null;
359423
- #lastHoveredStructuredContentBlock = null;
359859
+ #sdtHoverCoordinator = null;
359860
+ #tocHoverCoordinator = null;
359424
359861
  #remoteCursorManager = null;
359425
359862
  #cursorUpdateTimer = null;
359426
359863
  #remoteCursorOverlay = null;
@@ -359491,8 +359928,11 @@ function print() { __p += __j.call(arguments, '') }
359491
359928
  ensureEditorNativeSelectionStyles(doc$12);
359492
359929
  ensureEditorFieldAnnotationInteractionStyles(doc$12);
359493
359930
  ensureEditorMovableObjectInteractionStyles(doc$12);
359494
- this.#painterHost.addEventListener("mouseover", this.#handleStructuredContentBlockMouseEnter);
359495
- this.#painterHost.addEventListener("mouseout", this.#handleStructuredContentBlockMouseLeave);
359931
+ this.#initializeHoverCoordinators();
359932
+ this.#painterHost.addEventListener("mouseover", this.#sdtHoverCoordinator.handleMouseEnter);
359933
+ this.#painterHost.addEventListener("mouseout", this.#sdtHoverCoordinator.handleMouseLeave);
359934
+ this.#painterHost.addEventListener("mouseover", this.#tocHoverCoordinator.handleMouseEnter);
359935
+ this.#painterHost.addEventListener("mouseout", this.#tocHoverCoordinator.handleMouseLeave);
359496
359936
  this.#domIndexObserverManager = new DomPositionIndexObserverManager({
359497
359937
  windowRoot: this.#visibleHost?.ownerDocument?.defaultView ?? window,
359498
359938
  getPainterHost: () => this.#painterHost,
@@ -363483,74 +363923,50 @@ function print() { __p += __j.call(arguments, '') }
363483
363923
  }
363484
363924
  this.#setSelectedStructuredContentBlockClass(elements, id2);
363485
363925
  }
363486
- #handleStructuredContentBlockMouseEnter = (event) => {
363487
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
363488
- if (!block || !(block instanceof HTMLElement))
363489
- return;
363490
- if (block.classList.contains("ProseMirror-selectednode"))
363926
+ #initializeHoverCoordinators() {
363927
+ if (this.#sdtHoverCoordinator || this.#tocHoverCoordinator)
363491
363928
  return;
363492
- const rawId = block.dataset.sdtId;
363493
- if (!rawId)
363929
+ this.#sdtHoverCoordinator = new HoverGroupCoordinator({
363930
+ entrySelector: `.${DOM_CLASS_NAMES.BLOCK_SDT}`,
363931
+ getId: (entry) => entry.dataset.sdtId,
363932
+ queryGroup: (id2) => this.#painterAdapter.getStructuredContentBlockElementsById(id2),
363933
+ hoverClass: DOM_CLASS_NAMES.SDT_GROUP_HOVER,
363934
+ shouldApplyTo: (element3) => !element3.classList.contains("ProseMirror-selectednode")
363935
+ });
363936
+ this.#tocHoverCoordinator = new HoverGroupCoordinator({
363937
+ entrySelector: `.${DOM_CLASS_NAMES.TOC_ENTRY}`,
363938
+ getId: (entry) => entry.dataset.tocId,
363939
+ queryGroup: (id2) => this.#queryTocEntryElementsById(id2),
363940
+ hoverClass: DOM_CLASS_NAMES.TOC_GROUP_HOVER,
363941
+ onApply: (elements) => this.#applyTocGapFill(elements),
363942
+ onClear: (element3) => element3.style.removeProperty("--toc-gap-below")
363943
+ });
363944
+ }
363945
+ #applyTocGapFill(elements) {
363946
+ if (elements.length < 2)
363494
363947
  return;
363495
- this.#setHoveredStructuredContentBlockClass(rawId);
363496
- };
363497
- #handleStructuredContentBlockMouseLeave = (event) => {
363498
- const block = event.target.closest(`.${DOM_CLASS_NAMES.BLOCK_SDT}`);
363499
- if (!block)
363500
- return;
363501
- const relatedTarget = event.relatedTarget;
363502
- if (relatedTarget && block.dataset.sdtId) {
363503
- const escapedCheckId = typeof CSS !== "undefined" && CSS.escape ? CSS.escape(block.dataset.sdtId) : block.dataset.sdtId.replace(/"/g, "\\\"");
363504
- if (relatedTarget.closest(buildSdtBlockSelector(escapedCheckId)))
363505
- return;
363948
+ const measured = elements.map((element3) => ({
363949
+ element: element3,
363950
+ rect: element3.getBoundingClientRect()
363951
+ })).sort((a2, b$1) => a2.rect.top - b$1.rect.top);
363952
+ for (let i4 = 0;i4 < measured.length - 1; i4++) {
363953
+ const current = measured[i4];
363954
+ const next2 = measured[i4 + 1];
363955
+ const currentPage = current.element.closest("[data-page-index]");
363956
+ if (!currentPage || currentPage !== next2.element.closest("[data-page-index]"))
363957
+ continue;
363958
+ const rawGap = next2.rect.top - current.rect.bottom;
363959
+ const scaleY = current.rect.height && current.element.offsetHeight ? current.rect.height / current.element.offsetHeight : 1;
363960
+ const gap = scaleY > 0 ? rawGap / scaleY : rawGap;
363961
+ if (gap > 0)
363962
+ current.element.style.setProperty("--toc-gap-below", `${gap + 1}px`);
363506
363963
  }
363507
- this.#clearHoveredStructuredContentBlockClass();
363508
- };
363509
- #clearHoveredStructuredContentBlockClass() {
363510
- if (!this.#lastHoveredStructuredContentBlock)
363511
- return;
363512
- this.#lastHoveredStructuredContentBlock.elements.forEach((element3) => {
363513
- element3.classList.remove(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
363514
- });
363515
- this.#lastHoveredStructuredContentBlock = null;
363516
363964
  }
363517
- #setHoveredStructuredContentBlockClass(id2) {
363518
- if (this.#lastHoveredStructuredContentBlock?.id === id2)
363519
- return;
363520
- this.#clearHoveredStructuredContentBlockClass();
363965
+ #queryTocEntryElementsById(id2) {
363521
363966
  if (!this.#painterHost)
363522
- return;
363523
- const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
363524
- if (elements.length === 0)
363525
- return;
363526
- elements.forEach((element3) => {
363527
- if (!element3.classList.contains("ProseMirror-selectednode"))
363528
- element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
363529
- });
363530
- this.#lastHoveredStructuredContentBlock = {
363531
- id: id2,
363532
- elements
363533
- };
363534
- }
363535
- #reapplySdtGroupHover() {
363536
- if (!this.#lastHoveredStructuredContentBlock || !this.#painterHost)
363537
- return;
363538
- const { id: id2 } = this.#lastHoveredStructuredContentBlock;
363539
- if (!id2)
363540
- return;
363541
- const elements = this.#painterAdapter.getStructuredContentBlockElementsById(id2);
363542
- if (elements.length === 0) {
363543
- this.#lastHoveredStructuredContentBlock = null;
363544
- return;
363545
- }
363546
- elements.forEach((element3) => {
363547
- if (!element3.classList.contains("ProseMirror-selectednode"))
363548
- element3.classList.add(DOM_CLASS_NAMES.SDT_GROUP_HOVER);
363549
- });
363550
- this.#lastHoveredStructuredContentBlock = {
363551
- id: id2,
363552
- elements
363553
- };
363967
+ return [];
363968
+ const escapedId = escapeAttrValue(id2);
363969
+ return Array.from(this.#painterHost.querySelectorAll(`.${DOM_CLASS_NAMES.TOC_ENTRY}[data-toc-id="${escapedId}"]`));
363554
363970
  }
363555
363971
  #refreshEditorDomAugmentations() {
363556
363972
  this.#postPaintPipeline.refreshAfterPaint({
@@ -363559,7 +363975,8 @@ function print() { __p += __j.call(arguments, '') }
363559
363975
  domPositionIndex: this.#domPositionIndex,
363560
363976
  proofingAnnotations: this.#buildProofingAnnotations(),
363561
363977
  rebuildDomPositionIndex: () => this.#rebuildDomPositionIndex(),
363562
- reapplyStructuredContentHover: () => this.#reapplySdtGroupHover()
363978
+ reapplyStructuredContentHover: () => this.#sdtHoverCoordinator?.reapply(),
363979
+ reapplyTocGroupHover: () => this.#tocHoverCoordinator?.reapply()
363563
363980
  });
363564
363981
  }
363565
363982
  #clearSelectedStructuredContentInlineClass() {
@@ -365947,11 +366364,11 @@ function print() { __p += __j.call(arguments, '') }
365947
366364
  ]);
365948
366365
  });
365949
366366
 
365950
- // ../../packages/superdoc/dist/chunks/create-super-doc-ui-ClaBD_rO.es.js
366367
+ // ../../packages/superdoc/dist/chunks/create-super-doc-ui-DCDD6DVT.es.js
365951
366368
  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;
365952
- var init_create_super_doc_ui_ClaBD_rO_es = __esm(() => {
365953
- init_SuperConverter_BaKhr4cp_es();
365954
- init_create_headless_toolbar_B3wNa0zb_es();
366369
+ var init_create_super_doc_ui_DCDD6DVT_es = __esm(() => {
366370
+ init_SuperConverter_BtvpSnE5_es();
366371
+ init_create_headless_toolbar_BV5L35wQ_es();
365955
366372
  headlessToolbarConstants = {
365956
366373
  DEFAULT_TEXT_ALIGN_OPTIONS: [
365957
366374
  {
@@ -366233,16 +366650,16 @@ var init_zipper_yaJVJ4z9_es = __esm(() => {
366233
366650
 
366234
366651
  // ../../packages/superdoc/dist/super-editor.es.js
366235
366652
  var init_super_editor_es = __esm(() => {
366236
- init_src_BKOC1_8_es();
366237
- init_SuperConverter_BaKhr4cp_es();
366653
+ init_src_DumwyEvl_es();
366654
+ init_SuperConverter_BtvpSnE5_es();
366238
366655
  init_jszip_C49i9kUs_es();
366239
366656
  init_xml_js_CqGKpaft_es();
366240
- init_create_headless_toolbar_B3wNa0zb_es();
366657
+ init_create_headless_toolbar_BV5L35wQ_es();
366241
366658
  init_constants_D9qj59G2_es();
366242
366659
  init_dist_B8HfvhaK_es();
366243
366660
  init_unified_Dsuw2be5_es();
366244
366661
  init_DocxZipper_FUsfThjV_es();
366245
- init_create_super_doc_ui_ClaBD_rO_es();
366662
+ init_create_super_doc_ui_DCDD6DVT_es();
366246
366663
  init_ui_C5PAS9hY_es();
366247
366664
  init_eventemitter3_BnGqBE_Q_es();
366248
366665
  init_errors_CNaD6vcg_es();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdoc-dev/cli",
3
- "version": "0.17.0-next.7",
3
+ "version": "0.17.0-next.9",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "superdoc": "./dist/index.js"
@@ -33,11 +33,11 @@
33
33
  "access": "public"
34
34
  },
35
35
  "optionalDependencies": {
36
- "@superdoc-dev/cli-darwin-arm64": "0.17.0-next.7",
37
- "@superdoc-dev/cli-darwin-x64": "0.17.0-next.7",
38
- "@superdoc-dev/cli-linux-arm64": "0.17.0-next.7",
39
- "@superdoc-dev/cli-linux-x64": "0.17.0-next.7",
40
- "@superdoc-dev/cli-windows-x64": "0.17.0-next.7"
36
+ "@superdoc-dev/cli-darwin-x64": "0.17.0-next.9",
37
+ "@superdoc-dev/cli-darwin-arm64": "0.17.0-next.9",
38
+ "@superdoc-dev/cli-linux-arm64": "0.17.0-next.9",
39
+ "@superdoc-dev/cli-windows-x64": "0.17.0-next.9",
40
+ "@superdoc-dev/cli-linux-x64": "0.17.0-next.9"
41
41
  },
42
42
  "scripts": {
43
43
  "predev": "node scripts/ensure-superdoc-build.js",