@pixldocs/canvas-renderer 0.5.57 → 0.5.58

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.
package/dist/index.cjs CHANGED
@@ -12263,6 +12263,46 @@ async function ensureFontsForResolvedConfig(config) {
12263
12263
  });
12264
12264
  }
12265
12265
  }
12266
+ function configHasAutoShrinkText$1(config) {
12267
+ var _a;
12268
+ if (!((_a = config == null ? void 0 : config.pages) == null ? void 0 : _a.length)) return false;
12269
+ const walk = (nodes) => {
12270
+ for (const node of nodes || []) {
12271
+ if (!node) continue;
12272
+ if (node.type === "text" && node.overflowPolicy === "auto-shrink") return true;
12273
+ if (Array.isArray(node.children) && node.children.length && walk(node.children)) return true;
12274
+ }
12275
+ return false;
12276
+ };
12277
+ for (const page of config.pages) {
12278
+ if (walk(page.children || [])) return true;
12279
+ }
12280
+ return false;
12281
+ }
12282
+ async function awaitFontsForConfig(config, maxWaitMs) {
12283
+ if (typeof document === "undefined" || !document.fonts) return;
12284
+ void ensureFontsForResolvedConfig(config);
12285
+ const descriptors = collectFontDescriptorsFromConfig(config);
12286
+ if (descriptors.length === 0) return;
12287
+ const loads = Promise.all(
12288
+ descriptors.map((d) => {
12289
+ const stylePrefix = d.style === "italic" ? "italic " : "";
12290
+ const spec = `${stylePrefix}${d.weight} 16px "${d.family}"`;
12291
+ return document.fonts.load(spec).catch(() => []);
12292
+ })
12293
+ ).then(() => void 0);
12294
+ await Promise.race([
12295
+ loads,
12296
+ new Promise((resolve) => setTimeout(resolve, maxWaitMs))
12297
+ ]);
12298
+ await Promise.race([
12299
+ document.fonts.ready.catch(() => void 0).then(() => void 0),
12300
+ new Promise((r) => setTimeout(r, Math.min(500, maxWaitMs)))
12301
+ ]);
12302
+ await new Promise(
12303
+ (resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))
12304
+ );
12305
+ }
12266
12306
  const PREVIEW_DEBUG_PREFIX = "[canvas-renderer][preview-debug]";
12267
12307
  function countUnderlinedNodes(config) {
12268
12308
  var _a;
@@ -12348,15 +12388,17 @@ function PixldocsPreview(props) {
12348
12388
  underlinedNodes: countUnderlinedNodes(resolved.config)
12349
12389
  });
12350
12390
  setResolvedConfig(resolved.config);
12351
- ensureFontsForResolvedConfig(resolved.config).then(() => {
12391
+ const hasAutoShrink = configHasAutoShrinkText$1(resolved.config);
12392
+ const waitMs = hasAutoShrink ? 4e3 : 1800;
12393
+ awaitFontsForConfig(resolved.config, waitMs).then(() => {
12352
12394
  if (!cancelled) {
12353
- console.log(PREVIEW_DEBUG_PREFIX, "resolve-mode fonts queued");
12395
+ console.log(PREVIEW_DEBUG_PREFIX, "resolve-mode fonts settled", { hasAutoShrink, waitMs });
12354
12396
  setFontsReady(true);
12355
12397
  setIsLoading(false);
12356
12398
  }
12357
12399
  }).catch((err) => {
12358
12400
  if (!cancelled) {
12359
- console.warn(PREVIEW_DEBUG_PREFIX, "resolve-mode fonts queue failed", err);
12401
+ console.warn(PREVIEW_DEBUG_PREFIX, "resolve-mode font wait failed", err);
12360
12402
  setFontsReady(true);
12361
12403
  setIsLoading(false);
12362
12404
  }
@@ -12425,16 +12467,26 @@ function PixldocsPreview(props) {
12425
12467
  setFontsReady(false);
12426
12468
  setCanvasSettled(false);
12427
12469
  setStabilizationPass(0);
12428
- ensureFontsForResolvedConfig(config).then(() => {
12429
- console.log(PREVIEW_DEBUG_PREFIX, "config-mode fonts queued", {
12470
+ let cancelled = false;
12471
+ const hasAutoShrink = configHasAutoShrinkText$1(config);
12472
+ const waitMs = hasAutoShrink ? 4e3 : 1800;
12473
+ awaitFontsForConfig(config, waitMs).then(() => {
12474
+ if (cancelled) return;
12475
+ console.log(PREVIEW_DEBUG_PREFIX, "config-mode fonts settled", {
12430
12476
  pageIndex,
12477
+ hasAutoShrink,
12478
+ waitMs,
12431
12479
  underlinedNodes: countUnderlinedNodes(config)
12432
12480
  });
12433
12481
  setFontsReady(true);
12434
12482
  }).catch((err) => {
12435
- console.warn(PREVIEW_DEBUG_PREFIX, "config-mode fonts queue failed", err);
12483
+ if (cancelled) return;
12484
+ console.warn(PREVIEW_DEBUG_PREFIX, "config-mode font wait failed", err);
12436
12485
  setFontsReady(true);
12437
12486
  });
12487
+ return () => {
12488
+ cancelled = true;
12489
+ };
12438
12490
  }, [isResolveMode, config]);
12439
12491
  const handleCanvasReady = react.useCallback(() => {
12440
12492
  if (stabilizationPass === 0) {
@@ -15642,9 +15694,11 @@ exports.PixldocsPreview = PixldocsPreview;
15642
15694
  exports.PixldocsRenderer = PixldocsRenderer;
15643
15695
  exports.applyThemeToConfig = applyThemeToConfig;
15644
15696
  exports.assemblePdfFromSvgs = assemblePdfFromSvgs;
15697
+ exports.awaitFontsForConfig = awaitFontsForConfig;
15645
15698
  exports.collectFontDescriptorsFromConfig = collectFontDescriptorsFromConfig;
15646
15699
  exports.collectFontsFromConfig = collectFontsFromConfig;
15647
15700
  exports.collectImageUrls = collectImageUrls;
15701
+ exports.configHasAutoShrinkText = configHasAutoShrinkText$1;
15648
15702
  exports.embedFont = embedFont;
15649
15703
  exports.embedFontsForConfig = embedFontsForConfig;
15650
15704
  exports.embedFontsInPdf = embedFontsInPdf;