@pixldocs/canvas-renderer 0.5.16 → 0.5.17

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.d.ts CHANGED
@@ -369,6 +369,8 @@ export declare class PixldocsRenderer {
369
369
  renderAllById(templateId: string, formData?: Record<string, any>, options?: Omit<RenderOptions, 'pageIndex'>): Promise<RenderResult[]>;
370
370
  private getExpectedImageCount;
371
371
  private waitForCanvasImages;
372
+ private waitForCanvasScene;
373
+ private waitForRelevantFonts;
372
374
  private getNormalizedGradientStops;
373
375
  private paintPageBackground;
374
376
  private renderPageViaPreviewCanvas;
package/dist/index.js CHANGED
@@ -12281,6 +12281,49 @@ class PixldocsRenderer {
12281
12281
  setTimeout(check, 0);
12282
12282
  });
12283
12283
  }
12284
+ waitForCanvasScene(container, config, pageIndex, maxWaitMs = 8e3, pollMs = 50) {
12285
+ return new Promise((resolve) => {
12286
+ var _a, _b;
12287
+ const start = Date.now();
12288
+ const pageHasContent = (((_b = (_a = config.pages[pageIndex]) == null ? void 0 : _a.children) == null ? void 0 : _b.length) ?? 0) > 0;
12289
+ const settle = () => requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
12290
+ const check = () => {
12291
+ const fabricCanvas = this.getFabricCanvasFromContainer(container);
12292
+ const lowerCanvas = (fabricCanvas == null ? void 0 : fabricCanvas.lowerCanvasEl) || container.querySelector("canvas.lower-canvas, canvas");
12293
+ const objectCount = typeof (fabricCanvas == null ? void 0 : fabricCanvas.getObjects) === "function" ? fabricCanvas.getObjects().length : 0;
12294
+ const ready = !!lowerCanvas && (!pageHasContent || objectCount > 0);
12295
+ if (ready) {
12296
+ console.log(`[canvas-renderer][scene-wait] ready after ${Date.now() - start}ms (objects=${objectCount})`);
12297
+ settle();
12298
+ return;
12299
+ }
12300
+ if (Date.now() - start >= maxWaitMs) {
12301
+ console.warn(`[canvas-renderer][scene-wait-timeout] elapsed=${Date.now() - start}ms objects=${objectCount} pageHasContent=${pageHasContent}`);
12302
+ settle();
12303
+ return;
12304
+ }
12305
+ setTimeout(check, pollMs);
12306
+ };
12307
+ setTimeout(check, 0);
12308
+ });
12309
+ }
12310
+ async waitForRelevantFonts(config, maxWaitMs = 1800) {
12311
+ if (typeof document === "undefined" || !document.fonts) return;
12312
+ const descriptors = collectFontDescriptorsFromConfig(config);
12313
+ if (descriptors.length === 0) return;
12314
+ const loads = Promise.all(
12315
+ descriptors.map((descriptor) => {
12316
+ const stylePrefix = descriptor.style === "italic" ? "italic " : "";
12317
+ const spec = `${stylePrefix}${descriptor.weight} 16px "${descriptor.family}"`;
12318
+ return document.fonts.load(spec).catch(() => []);
12319
+ })
12320
+ ).then(() => void 0);
12321
+ await Promise.race([
12322
+ loads,
12323
+ new Promise((resolve) => setTimeout(resolve, maxWaitMs))
12324
+ ]);
12325
+ await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve())));
12326
+ }
12284
12327
  getNormalizedGradientStops(gradient) {
12285
12328
  const stops = Array.isArray(gradient == null ? void 0 : gradient.stops) ? gradient.stops.map((stop) => ({
12286
12329
  offset: Math.max(0, Math.min(1, Number((stop == null ? void 0 : stop.offset) ?? 0))),
@@ -12393,10 +12436,11 @@ class PixldocsRenderer {
12393
12436
  );
12394
12437
  return;
12395
12438
  }
12396
- const expectedImageCount = this.getExpectedImageCount(config, pageIndex);
12397
- this.waitForCanvasImages(container, expectedImageCount).then(async () => {
12439
+ this.waitForCanvasScene(container, config, pageIndex).then(async () => {
12398
12440
  try {
12399
12441
  const fabricInstance = this.getFabricCanvasFromContainer(container);
12442
+ const expectedImageCount = this.getExpectedImageCount(config, pageIndex);
12443
+ await this.waitForCanvasImages(container, expectedImageCount);
12400
12444
  await this.waitForStableTextMetrics(container, config);
12401
12445
  const fabricCanvas = container.querySelector("canvas.upper-canvas, canvas");
12402
12446
  const sourceCanvas = (fabricInstance == null ? void 0 : fabricInstance.lowerCanvasEl) || container.querySelector("canvas.lower-canvas") || fabricCanvas;
@@ -12487,8 +12531,7 @@ class PixldocsRenderer {
12487
12531
  );
12488
12532
  return;
12489
12533
  }
12490
- const expectedImageCount = this.getExpectedImageCount(config, pageIndex);
12491
- this.waitForCanvasImages(container, expectedImageCount).then(async () => {
12534
+ this.waitForCanvasScene(container, config, pageIndex).then(async () => {
12492
12535
  var _a, _b;
12493
12536
  try {
12494
12537
  const fabricInstance = this.getFabricCanvasFromContainer(container);
@@ -12497,6 +12540,8 @@ class PixldocsRenderer {
12497
12540
  reject(new Error("No Fabric canvas instance found for SVG capture"));
12498
12541
  return;
12499
12542
  }
12543
+ const expectedImageCount = this.getExpectedImageCount(config, pageIndex);
12544
+ await this.waitForCanvasImages(container, expectedImageCount);
12500
12545
  await this.waitForStableTextMetrics(container, config);
12501
12546
  const prevVPT = fabricInstance.viewportTransform ? [...fabricInstance.viewportTransform] : void 0;
12502
12547
  const prevSvgVPT = fabricInstance.svgViewportTransformation;
@@ -12621,7 +12666,8 @@ class PixldocsRenderer {
12621
12666
  }
12622
12667
  async waitForStableTextMetrics(container, config) {
12623
12668
  if (typeof document !== "undefined") {
12624
- await ensureFontsForResolvedConfig(config);
12669
+ void ensureFontsForResolvedConfig(config);
12670
+ await this.waitForRelevantFonts(config);
12625
12671
  }
12626
12672
  const fabricInstance = this.getFabricCanvasFromContainer(container);
12627
12673
  if (!(fabricInstance == null ? void 0 : fabricInstance.getObjects)) return;