smooth-screenshot 1.1.2 → 1.1.3

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.mjs CHANGED
@@ -248,8 +248,25 @@ function createContext(target, options) {
248
248
  return context;
249
249
  }
250
250
 
251
+ // src/util/ns.ts
252
+ var svgNs = null;
253
+ var xhtmlNs = null;
254
+ function svgNamespace(doc) {
255
+ if (svgNs === null) {
256
+ const probe = doc.createElement("div");
257
+ probe.innerHTML = "<svg></svg>";
258
+ svgNs = probe.firstElementChild.namespaceURI ?? "";
259
+ }
260
+ return svgNs;
261
+ }
262
+ function xhtmlNamespace(doc) {
263
+ if (xhtmlNs === null) {
264
+ xhtmlNs = doc.createElement("div").namespaceURI ?? "";
265
+ }
266
+ return xhtmlNs;
267
+ }
268
+
251
269
  // src/clone/default-style.ts
252
- var XHTML_NS = "http://www.w3.org/1999/xhtml";
253
270
  function ensureSandbox(context) {
254
271
  if (context.sandbox?.contentDocument) {
255
272
  return context.sandbox.contentDocument;
@@ -265,7 +282,8 @@ function ensureSandbox(context) {
265
282
  return doc;
266
283
  }
267
284
  function getDefaultStyle(context, source) {
268
- const namespace = source.namespaceURI ?? XHTML_NS;
285
+ const xhtmlNs2 = xhtmlNamespace(context.ownerDocument);
286
+ const namespace = source.namespaceURI ?? xhtmlNs2;
269
287
  const key = `${namespace}|${source.localName}`;
270
288
  const cached = context.defaultStyleCache.get(key);
271
289
  if (cached) return cached;
@@ -276,7 +294,7 @@ function getDefaultStyle(context, source) {
276
294
  context.defaultStyleCache.set(key, empty);
277
295
  return empty;
278
296
  }
279
- const element = namespace === XHTML_NS ? doc.createElement(source.localName) : doc.createElementNS(namespace, source.localName);
297
+ const element = namespace === xhtmlNs2 ? doc.createElement(source.localName) : doc.createElementNS(namespace, source.localName);
280
298
  doc.body.appendChild(element);
281
299
  const computed = sandboxWindow.getComputedStyle(element);
282
300
  const record = {};
@@ -736,8 +754,6 @@ async function embedResources(clone, context) {
736
754
  }
737
755
 
738
756
  // src/serialize/foreign-object-svg.ts
739
- var SVG_NS = "http://www.w3.org/2000/svg";
740
- var XHTML_NS2 = "http://www.w3.org/1999/xhtml";
741
757
  function buildSvgString(params) {
742
758
  const {
743
759
  clone,
@@ -751,25 +767,26 @@ function buildSvgString(params) {
751
767
  } = params;
752
768
  const outW = crop ? crop.width : fullWidth;
753
769
  const outH = crop ? crop.height : fullHeight;
754
- const svg = doc.createElementNS(SVG_NS, "svg");
755
- svg.setAttribute("xmlns", SVG_NS);
770
+ const svgNs2 = svgNamespace(doc);
771
+ const svg = doc.createElementNS(svgNs2, "svg");
772
+ svg.setAttribute("xmlns", svgNs2);
756
773
  svg.setAttribute("width", String(outW));
757
774
  svg.setAttribute("height", String(outH));
758
775
  svg.setAttribute("viewBox", `0 0 ${outW} ${outH}`);
759
776
  if (backgroundColor) {
760
- const rect = doc.createElementNS(SVG_NS, "rect");
777
+ const rect = doc.createElementNS(svgNs2, "rect");
761
778
  rect.setAttribute("width", "100%");
762
779
  rect.setAttribute("height", "100%");
763
780
  rect.setAttribute("fill", backgroundColor);
764
781
  svg.appendChild(rect);
765
782
  }
766
- const foreignObject = doc.createElementNS(SVG_NS, "foreignObject");
783
+ const foreignObject = doc.createElementNS(svgNs2, "foreignObject");
767
784
  foreignObject.setAttribute("x", String(crop ? -crop.x : 0));
768
785
  foreignObject.setAttribute("y", String(crop ? -crop.y : 0));
769
786
  foreignObject.setAttribute("width", String(fullWidth));
770
787
  foreignObject.setAttribute("height", String(fullHeight));
771
788
  const container = doc.createElement("div");
772
- container.setAttribute("xmlns", XHTML_NS2);
789
+ container.setAttribute("xmlns", xhtmlNamespace(doc));
773
790
  if (fontCss || pseudoRules.length > 0) {
774
791
  const style = doc.createElement("style");
775
792
  style.textContent = `${fontCss}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/options.ts","../src/errors.ts","../src/scheduler.ts","../src/worker/source.ts","../src/worker/pool.ts","../src/context.ts","../src/clone/default-style.ts","../src/clone/copy-styles.ts","../src/clone/pseudo.ts","../src/clone/special.ts","../src/clone/state.ts","../src/clone/clone-node.ts","../src/util/concurrency.ts","../src/util/css.ts","../src/util/dataurl.ts","../src/embed/fetch.ts","../src/embed/images.ts","../src/embed/fonts.ts","../src/embed/embed.ts","../src/serialize/foreign-object-svg.ts","../src/raster/svg-to-image.ts","../src/raster/tiler.ts","../src/util/compress.ts","../src/encode/png-encoder.ts","../src/encode/pdf.ts","../src/encode/image.ts","../src/capture.ts","../src/api.ts"],"names":["XHTML_NS","geometry","rgbaBands"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Options, ResolvedOptions } from './types'\n\nconst DEFAULT_QUALITY = 0.92\nconst DEFAULT_FRAME_BUDGET_MS = 5\nconst DEFAULT_WORKER_COUNT = 2\nconst DEFAULT_FETCH_TIMEOUT_MS = 30000\nconst DEFAULT_FETCH_RETRIES = 2\n\nfunction resolveWorkerCount(worker: Options['worker']): number {\n if (worker === false) return 0\n if (worker === true || worker === undefined) return DEFAULT_WORKER_COUNT\n return Math.max(0, Math.floor(worker.count))\n}\n\nexport function resolveOptions(\n options: Options,\n win: Window & typeof globalThis,\n): ResolvedOptions {\n const scale =\n options.scale ?? options.pixelRatio ?? win.devicePixelRatio ?? 1\n\n return {\n type: options.type ?? 'png',\n quality: options.quality ?? DEFAULT_QUALITY,\n scale: scale > 0 ? scale : 1,\n backgroundColor: options.backgroundColor ?? null,\n width: options.width ?? null,\n height: options.height ?? null,\n crop: options.crop ?? null,\n style: options.style ?? null,\n signal: options.signal,\n onProgress: options.onProgress ?? null,\n frameBudgetMs: options.frameBudgetMs ?? DEFAULT_FRAME_BUDGET_MS,\n workerCount: resolveWorkerCount(options.worker),\n maxTileSize: options.maxTileSize ?? 0,\n filter: options.filter ?? null,\n fontsSkip: options.fonts?.skip ?? false,\n fontsPreferWoff2: options.fonts?.preferWoff2 ?? true,\n fetchRequestInit: options.fetch?.requestInit,\n fetchPlaceholder: options.fetch?.placeholder ?? null,\n fetchTimeoutMs: options.fetch?.timeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS,\n fetchRetries: options.fetch?.retries ?? DEFAULT_FETCH_RETRIES,\n onResourceError: options.onResourceError ?? null,\n }\n}\n","export type ErrorCode =\n | 'TAINTED_CANVAS'\n | 'EMPTY_TARGET'\n | 'WORKER_UNAVAILABLE'\n | 'ENCODE_FAILED'\n | 'INVALID_TARGET'\n\nexport class SmoothScreenshotError extends Error {\n readonly code: ErrorCode\n\n constructor(code: ErrorCode, message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'SmoothScreenshotError'\n this.code = code\n Object.setPrototypeOf(this, SmoothScreenshotError.prototype)\n }\n}\n\nexport function createAbortError(): DOMException {\n return new DOMException('The screenshot was aborted.', 'AbortError')\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === 'AbortError'\n}\n","import { createAbortError } from './errors'\nimport type { Scheduler } from './types'\n\n/**\n * Cooperative frame-budget scheduler. Work calls `yieldIfNeeded()` in hot loops;\n * once the current synchronous slice exceeds `budgetMs`, it yields a macrotask via\n * MessageChannel (no 4ms timer clamp, lets the browser paint), then resumes.\n *\n * A single MessageChannel is reused across all yields (the React scheduler trick)\n * to avoid per-yield allocation.\n */\nexport function createScheduler(\n budgetMs: number,\n signal: AbortSignal | undefined,\n): Scheduler {\n let sliceStart = performance.now()\n\n const channel = new MessageChannel()\n const pending: Array<() => void> = []\n channel.port1.onmessage = () => {\n pending.shift()?.()\n }\n\n function macrotask(): Promise<void> {\n return new Promise<void>((resolve) => {\n pending.push(resolve)\n channel.port2.postMessage(undefined)\n })\n }\n\n function abortGuard(): void {\n if (signal?.aborted) throw createAbortError()\n }\n\n const scheduler: Scheduler = {\n async yieldNow() {\n await macrotask()\n sliceStart = performance.now()\n abortGuard()\n },\n async yieldIfNeeded() {\n if (performance.now() - sliceStart >= budgetMs) {\n await scheduler.yieldNow()\n } else {\n abortGuard()\n }\n },\n reset() {\n sliceStart = performance.now()\n },\n }\n\n return scheduler\n}\n","/**\n * Inline worker source. Kept as a plain string so it bundles with zero extra\n * build steps and runs from a Blob URL (no separate file to serve). The worker\n * only fetches a URL and resolves it to a data URL — it has no DOM access and\n * does not bypass CORS; it just moves network + base64 work off the main thread.\n */\nexport const WORKER_SOURCE = `\nself.onmessage = function (e) {\n var id = e.data.id\n var url = e.data.url\n var init = e.data.init\n fetch(url, init)\n .then(function (res) {\n if (!res.ok) throw new Error('HTTP ' + res.status)\n return res.blob()\n })\n .then(function (blob) {\n var reader = new FileReader()\n reader.onload = function () { self.postMessage({ id: id, result: reader.result }) }\n reader.onerror = function () { self.postMessage({ id: id, error: 'read failed' }) }\n reader.readAsDataURL(blob)\n })\n .catch(function (err) {\n self.postMessage({ id: id, error: String((err && err.message) || err) })\n })\n}\n`\n","import type { ResourceResult, WorkerPool } from '../types'\nimport { WORKER_SOURCE } from './source'\n\ninterface PendingRequest {\n resolve: (value: ResourceResult) => void\n reject: (reason: Error) => void\n}\n\n/** Reduce a RequestInit to a structured-cloneable subset for postMessage. */\nfunction sanitizeInit(init?: RequestInit): RequestInit | undefined {\n if (!init) return undefined\n const headers =\n init.headers instanceof Headers\n ? Object.fromEntries(init.headers.entries())\n : init.headers\n return {\n method: init.method,\n headers,\n credentials: init.credentials,\n mode: init.mode,\n cache: init.cache,\n referrer: init.referrer,\n integrity: init.integrity,\n }\n}\n\n/**\n * Spawn `count` inline workers from a single Blob URL. Returns null when workers\n * are unavailable (count <= 0, no Worker constructor, or CSP blocks blob: URLs),\n * letting the caller fall back to main-thread fetching.\n */\nexport function createWorkerPool(count: number): WorkerPool | null {\n if (count <= 0 || typeof Worker === 'undefined') return null\n\n let blobUrl: string\n let workers: Worker[]\n try {\n const blob = new Blob([WORKER_SOURCE], { type: 'text/javascript' })\n blobUrl = URL.createObjectURL(blob)\n workers = Array.from({ length: count }, () => new Worker(blobUrl))\n } catch {\n return null\n }\n\n const pending = new Map<number, PendingRequest>()\n let nextId = 0\n let roundRobin = 0\n let destroyed = false\n\n for (const worker of workers) {\n worker.onmessage = (event: MessageEvent) => {\n const { id, result, error } = event.data as {\n id: number\n result?: string\n error?: string\n }\n const request = pending.get(id)\n if (!request) return\n pending.delete(id)\n if (error !== undefined) request.reject(new Error(error))\n else request.resolve(result as string)\n }\n }\n\n return {\n fetchAsDataUrl(url, requestInit) {\n if (destroyed) return Promise.reject(new Error('worker pool destroyed'))\n const id = nextId++\n const worker = workers[roundRobin++ % workers.length]!\n return new Promise<ResourceResult>((resolve, reject) => {\n pending.set(id, { resolve, reject })\n worker.postMessage({ id, url, init: sanitizeInit(requestInit) })\n })\n },\n destroy() {\n if (destroyed) return\n destroyed = true\n for (const worker of workers) worker.terminate()\n URL.revokeObjectURL(blobUrl)\n for (const request of pending.values()) {\n request.reject(new Error('worker pool destroyed'))\n }\n pending.clear()\n },\n }\n}\n","import { createScheduler } from './scheduler'\nimport { createWorkerPool } from './worker/pool'\nimport { createAbortError } from './errors'\nimport type { Context, ProgressPhase, ResolvedOptions } from './types'\n\nconst PHASE_WEIGHTS: Record<ProgressPhase, number> = {\n clone: 0.35,\n embed: 0.3,\n rasterize: 0.2,\n encode: 0.15,\n}\n\nconst PHASE_ORDER: ProgressPhase[] = ['clone', 'embed', 'rasterize', 'encode']\n\nfunction cumulativeWeightBefore(phase: ProgressPhase): number {\n let sum = 0\n for (const candidate of PHASE_ORDER) {\n if (candidate === phase) break\n sum += PHASE_WEIGHTS[candidate]\n }\n return sum\n}\n\nexport function createContext(\n target: HTMLElement,\n options: ResolvedOptions,\n): Context {\n const ownerDocument = target.ownerDocument\n const ownerWindow = (ownerDocument.defaultView ?? window) as Window &\n typeof globalThis\n const scheduler = createScheduler(options.frameBudgetMs, options.signal)\n const workerPool = createWorkerPool(options.workerCount)\n const cleanups: Array<() => void> = []\n let destroyed = false\n let lastOverall = -1\n\n const context: Context = {\n options,\n signal: options.signal,\n ownerDocument,\n ownerWindow,\n scheduler,\n workerPool,\n defaultStyleCache: new Map(),\n resourceCache: new Map(),\n fontCache: new Map(),\n sandbox: null,\n throwIfAborted() {\n if (options.signal?.aborted) throw createAbortError()\n },\n reportPhase(phase, ratio) {\n if (!options.onProgress) return\n const clamped = ratio < 0 ? 0 : ratio > 1 ? 1 : ratio\n const overall =\n cumulativeWeightBefore(phase) + PHASE_WEIGHTS[phase] * clamped\n if (overall === lastOverall) return\n lastOverall = overall\n options.onProgress({ phase, phaseRatio: clamped, overall })\n },\n addCleanup(fn) {\n cleanups.push(fn)\n },\n destroy() {\n if (destroyed) return\n destroyed = true\n while (cleanups.length) {\n const fn = cleanups.pop()!\n try {\n fn()\n } catch {\n /* cleanup must not throw */\n }\n }\n if (context.sandbox) {\n context.sandbox.remove()\n context.sandbox = null\n }\n workerPool?.destroy()\n },\n }\n\n return context\n}\n","import type { Context } from '../types'\n\nconst XHTML_NS = 'http://www.w3.org/1999/xhtml'\n\nfunction ensureSandbox(context: Context): Document {\n if (context.sandbox?.contentDocument) {\n return context.sandbox.contentDocument\n }\n const iframe = context.ownerDocument.createElement('iframe')\n iframe.setAttribute('aria-hidden', 'true')\n iframe.setAttribute('tabindex', '-1')\n iframe.style.cssText =\n 'position:fixed;left:-9999px;top:0;width:0;height:0;border:0;visibility:hidden;'\n context.ownerDocument.body.appendChild(iframe)\n context.sandbox = iframe\n const doc = iframe.contentDocument\n if (!doc) throw new Error('Unable to create style sandbox.')\n // A document title-less, style-less body gives us pristine UA defaults.\n return doc\n}\n\n/**\n * Returns the user-agent default computed styles for an element's tag, computed\n * once in an isolated sandbox iframe and cached by tag + namespace. The diff in\n * copy-styles uses this so the clone only carries styles that actually differ\n * from the browser default — smaller SVG, same fidelity.\n */\nexport function getDefaultStyle(\n context: Context,\n source: Element,\n): Record<string, string> {\n const namespace = source.namespaceURI ?? XHTML_NS\n const key = `${namespace}|${source.localName}`\n const cached = context.defaultStyleCache.get(key)\n if (cached) return cached\n\n const doc = ensureSandbox(context)\n const sandboxWindow = doc.defaultView\n if (!sandboxWindow || !doc.body) {\n const empty: Record<string, string> = {}\n context.defaultStyleCache.set(key, empty)\n return empty\n }\n\n const element =\n namespace === XHTML_NS\n ? doc.createElement(source.localName)\n : doc.createElementNS(namespace, source.localName)\n doc.body.appendChild(element)\n\n const computed = sandboxWindow.getComputedStyle(element)\n const record: Record<string, string> = {}\n for (let i = 0; i < computed.length; i++) {\n const name = computed[i]\n if (name) record[name] = computed.getPropertyValue(name)\n }\n\n doc.body.removeChild(element)\n context.defaultStyleCache.set(key, record)\n return record\n}\n","import type { Context } from '../types'\nimport { getDefaultStyle } from './default-style'\n\nconst PHYSICAL_BORDER_WIDTHS = [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n]\n\nfunction isBorderStyleOrColor(name: string): boolean {\n if (!name.startsWith('border')) return false\n if (name.startsWith('border-image') || name.startsWith('border-radius')) {\n return false\n }\n return name.endsWith('style') || name.endsWith('color')\n}\n\n/**\n * Copy the source element's effective computed style onto the clone, skipping any\n * property whose value equals the UA default for that tag. The clone is reparented\n * under a foreignObject without its original ancestors, so it must carry every\n * non-default (including inherited) value to render identically.\n */\nexport function copyStyle(\n source: Element,\n target: HTMLElement | SVGElement,\n context: Context,\n): void {\n const computed = context.ownerWindow.getComputedStyle(source)\n const defaults = getDefaultStyle(context, source)\n const toCopy = new Set<string>()\n\n for (let i = 0; i < computed.length; i++) {\n const name = computed[i]\n if (!name) continue\n const value = computed.getPropertyValue(name)\n if (value === '' || defaults[name] === value) continue\n toCopy.add(name)\n }\n\n // Border/outline width is forced to 0 by `style: none` in the UA default, so a\n // per-property diff can copy the style/color (e.g. Tailwind's `border: 0 solid`\n // reset) while dropping the 0 width — the clone then renders a default-width\n // border. If any border style/color was copied, pin the physical widths\n // explicitly (read directly; the browser may enumerate only logical names).\n if (Array.from(toCopy).some(isBorderStyleOrColor)) {\n for (const width of PHYSICAL_BORDER_WIDTHS) toCopy.add(width)\n }\n if (\n toCopy.has('outline-style') ||\n toCopy.has('outline-color') ||\n toCopy.has('outline')\n ) {\n toCopy.add('outline-width')\n }\n\n const targetStyle = target.style\n for (const name of toCopy) {\n const value = computed.getPropertyValue(name)\n if (value === '') continue\n targetStyle.setProperty(name, value, computed.getPropertyPriority(name))\n }\n}\n","import type { Context } from '../types'\nimport type { CloneState } from './state'\n\nconst PSEUDOS = ['::before', '::after'] as const\n\nconst CLASS_PREFIX = 'ss-pseudo-'\n\n/**\n * Pseudo-elements can't be cloned as nodes, so we reproduce them as CSS rules: a\n * unique class is added to the clone and a `.class::before { ... }` rule carrying\n * the pseudo's computed style is accumulated into state.pseudoRules. Those rules\n * are flushed into a single <style> at the clone root by the orchestrator.\n */\nexport function clonePseudoElements(\n source: Element,\n target: HTMLElement | SVGElement,\n state: CloneState,\n context: Context,\n): void {\n let className: string | null = null\n\n for (const pseudo of PSEUDOS) {\n const computed = context.ownerWindow.getComputedStyle(source, pseudo)\n const content = computed.getPropertyValue('content')\n if (!content || content === 'none' || content === 'normal') continue\n\n if (!className) {\n className = `${CLASS_PREFIX}${state.uid++}`\n target.classList.add(className)\n }\n\n let body = ''\n for (let i = 0; i < computed.length; i++) {\n const name = computed[i]\n if (!name) continue\n const value = computed.getPropertyValue(name)\n if (value === '') continue\n const priority = computed.getPropertyPriority(name)\n body += `${name}:${value}${priority ? ' !important' : ''};`\n }\n\n state.pseudoRules.push(`.${className}${pseudo}{${body}}`)\n }\n}\n","/** Snapshot a <canvas> to a data URL. Returns null if the canvas is tainted. */\nexport function snapshotCanvas(canvas: HTMLCanvasElement): string | null {\n try {\n return canvas.toDataURL()\n } catch {\n return null\n }\n}\n\n/**\n * Form controls keep their live value in the DOM property, not an attribute, so\n * a shallow clone renders empty. Reflect the current value onto the clone so it\n * shows what the user sees.\n */\nexport function copyInputValue(\n source: Element,\n target: HTMLElement | SVGElement,\n): void {\n if (source instanceof HTMLTextAreaElement) {\n target.textContent = source.value\n return\n }\n if (source instanceof HTMLInputElement) {\n const input = target as HTMLInputElement\n if (source.type === 'checkbox' || source.type === 'radio') {\n if (source.checked) input.setAttribute('checked', '')\n else input.removeAttribute('checked')\n } else {\n input.setAttribute('value', source.value)\n }\n return\n }\n if (source instanceof HTMLSelectElement) {\n target.setAttribute('data-ss-selected', source.value)\n }\n}\n","/** Mutable bookkeeping threaded through a single clone walk. */\nexport interface CloneState {\n /** Nodes cloned so far (for progress). */\n cloned: number\n /** Estimated total nodes (for progress denominator). */\n total: number\n /** Accumulated `::before`/`::after` CSS rules, flushed into a <style> at root. */\n pseudoRules: string[]\n /** Monotonic counter for unique generated class names. */\n uid: number\n}\n\nexport function createCloneState(total: number): CloneState {\n return { cloned: 0, total: Math.max(1, total), pseudoRules: [], uid: 0 }\n}\n","import type { Context } from '../types'\nimport { copyStyle } from './copy-styles'\nimport { clonePseudoElements } from './pseudo'\nimport { copyInputValue, snapshotCanvas } from './special'\nimport { createCloneState, type CloneState } from './state'\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'NOSCRIPT', 'TEMPLATE'])\nconst PROGRESS_EVERY = 32\n\nconst ELEMENT_NODE = 1\nconst TEXT_NODE = 3\n\nfunction passesFilter(node: Node, context: Context, isRoot: boolean): boolean {\n if (isRoot || !context.options.filter) return true\n if (node.nodeType !== ELEMENT_NODE) return true\n return context.options.filter(node as HTMLElement)\n}\n\nasync function cloneNode(\n node: Node,\n context: Context,\n state: CloneState,\n isRoot: boolean,\n): Promise<Node | null> {\n if (!passesFilter(node, context, isRoot)) return null\n\n if (node.nodeType === TEXT_NODE) {\n return node.cloneNode(false)\n }\n\n if (node.nodeType !== ELEMENT_NODE) return null\n\n const element = node as Element\n if (SKIP_TAGS.has(element.tagName)) return null\n\n await context.scheduler.yieldIfNeeded()\n\n state.cloned++\n if (state.cloned % PROGRESS_EVERY === 0) {\n context.reportPhase('clone', state.cloned / state.total)\n }\n\n // <canvas> content lives outside the DOM tree; snapshot it into an <img>.\n if (element instanceof HTMLCanvasElement) {\n const dataUrl = snapshotCanvas(element)\n if (dataUrl) {\n const image = context.ownerDocument.createElement('img')\n image.src = dataUrl\n copyStyle(element, image, context)\n return image\n }\n }\n\n const clone = element.cloneNode(false) as HTMLElement | SVGElement\n copyStyle(element, clone, context)\n clonePseudoElements(element, clone, state, context)\n copyInputValue(element, clone)\n\n for (const child of Array.from(element.childNodes)) {\n const clonedChild = await cloneNode(child, context, state, false)\n if (clonedChild) clone.appendChild(clonedChild)\n }\n\n return clone\n}\n\n/**\n * Clone an element's subtree into a detached, self-contained copy with inlined\n * styles. The walk yields to the scheduler at every node so a large tree never\n * blocks the main thread. Returns the clone plus any accumulated pseudo-element\n * rules to flush into a root <style>.\n */\nexport async function cloneTree(\n target: HTMLElement,\n context: Context,\n): Promise<{ clone: HTMLElement; pseudoRules: string[] }> {\n const total = target.getElementsByTagName('*').length + 1\n const state = createCloneState(total)\n context.scheduler.reset()\n\n const clone = (await cloneNode(target, context, state, true)) as HTMLElement\n context.reportPhase('clone', 1)\n\n return { clone, pseudoRules: state.pseudoRules }\n}\n","/** Run `worker` over items with at most `limit` in flight at once. */\nexport async function runPool<T>(\n items: readonly T[],\n limit: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return\n let cursor = 0\n const runner = async (): Promise<void> => {\n while (cursor < items.length) {\n const index = cursor++\n await worker(items[index]!, index)\n }\n }\n const size = Math.max(1, Math.min(limit, items.length))\n await Promise.all(Array.from({ length: size }, runner))\n}\n","const URL_RE = /url\\((['\"]?)([^'\")]+)\\1\\)/g\n\n/** Extract every `url(...)` target from a CSS value or rule text. */\nexport function extractUrls(cssText: string): string[] {\n const urls: string[] = []\n let match: RegExpExecArray | null\n URL_RE.lastIndex = 0\n while ((match = URL_RE.exec(cssText)) !== null) {\n const url = match[2]\n if (url && !url.startsWith('data:')) urls.push(url)\n }\n return urls\n}\n\n/** Replace a specific `url(...)` target with a new (already-quoted-safe) value. */\nexport function replaceUrl(\n cssText: string,\n from: string,\n to: string,\n): string {\n return cssText.replace(URL_RE, (whole, _quote: string, url: string) => {\n return url === from ? `url(\"${to}\")` : whole\n })\n}\n\n/** Resolve a possibly-relative URL against a base href. */\nexport function resolveUrl(url: string, baseUrl: string): string {\n if (url.startsWith('data:') || /^[a-z][a-z0-9+.-]*:/i.test(url)) return url\n try {\n return new URL(url, baseUrl).href\n } catch {\n return url\n }\n}\n","/** Read a Blob into a data URL string. */\nexport function blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onloadend = () => resolve(reader.result as string)\n reader.onerror = () => reject(new Error('Failed to read blob.'))\n reader.readAsDataURL(blob)\n })\n}\n\nexport function isDataUrl(url: string): boolean {\n return url.startsWith('data:')\n}\n\nconst DATA_URL_RE = /^data:([^;,]+)?(;base64)?,(.*)$/s\n\n/** Decode a data URL into its MIME type and raw bytes. */\nexport function dataUrlToBytes(dataUrl: string): {\n mime: string\n bytes: Uint8Array\n} {\n const match = DATA_URL_RE.exec(dataUrl)\n if (!match) throw new Error('Invalid data URL.')\n const mime = match[1] ?? 'text/plain'\n const isBase64 = Boolean(match[2])\n const data = match[3] ?? ''\n if (isBase64) {\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n return { mime, bytes }\n }\n const decoded = decodeURIComponent(data)\n const bytes = new Uint8Array(decoded.length)\n for (let i = 0; i < decoded.length; i++) bytes[i] = decoded.charCodeAt(i)\n return { mime, bytes }\n}\n","import { blobToDataUrl, isDataUrl } from '../util/dataurl'\nimport { createAbortError, isAbortError } from '../errors'\nimport type { Context } from '../types'\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError())\n return\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n reject(createAbortError())\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nasync function mainThreadFetch(url: string, context: Context): Promise<string> {\n const controller = new AbortController()\n const timer = setTimeout(\n () => controller.abort(),\n context.options.fetchTimeoutMs,\n )\n const onParentAbort = () => controller.abort()\n context.signal?.addEventListener('abort', onParentAbort, { once: true })\n try {\n const response = await fetch(url, {\n ...context.options.fetchRequestInit,\n signal: controller.signal,\n })\n if (!response.ok) throw new Error(`HTTP ${response.status}`)\n const blob = await response.blob()\n return await blobToDataUrl(blob)\n } finally {\n clearTimeout(timer)\n context.signal?.removeEventListener('abort', onParentAbort)\n }\n}\n\nasync function workerFetch(url: string, context: Context): Promise<string> {\n const pool = context.workerPool!\n let timer: ReturnType<typeof setTimeout>\n const timeout = new Promise<string>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error('timeout')),\n context.options.fetchTimeoutMs,\n )\n })\n try {\n return await Promise.race([\n pool.fetchAsDataUrl(url, context.options.fetchRequestInit),\n timeout,\n ])\n } finally {\n clearTimeout(timer!)\n }\n}\n\nasync function withRetry(url: string, context: Context): Promise<string> {\n const retries = context.options.fetchRetries\n let lastError: unknown\n for (let attempt = 0; attempt <= retries; attempt++) {\n context.throwIfAborted()\n try {\n return context.workerPool\n ? await workerFetch(url, context)\n : await mainThreadFetch(url, context)\n } catch (error) {\n if (isAbortError(error)) throw error\n lastError = error\n if (attempt < retries) await delay(100 * 2 ** attempt, context.signal)\n }\n }\n throw lastError instanceof Error ? lastError : new Error('Resource fetch failed.')\n}\n\n/**\n * Fetch a URL and resolve it to a data URL, deduped per URL for the capture.\n * Uses the worker pool when available, otherwise the main thread. Applies a\n * timeout and exponential-backoff retries. Rejects on final failure — the caller\n * decides whether to use a placeholder or skip the resource.\n */\nexport function fetchResourceAsDataUrl(\n url: string,\n context: Context,\n): Promise<string> {\n if (isDataUrl(url)) return Promise.resolve(url)\n const cached = context.resourceCache.get(url)\n if (cached) return cached\n const promise = withRetry(url, context)\n context.resourceCache.set(url, promise)\n return promise\n}\n","import { extractUrls, replaceUrl } from '../util/css'\nimport { fetchResourceAsDataUrl } from './fetch'\nimport { isAbortError } from '../errors'\nimport type { Context } from '../types'\n\nconst TRANSPARENT_PIXEL =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='\n\nfunction handleFailure(url: string, error: unknown, context: Context): string {\n if (context.options.onResourceError) {\n context.options.onResourceError(\n url,\n error instanceof Error ? error : new Error(String(error)),\n )\n }\n return context.options.fetchPlaceholder ?? TRANSPARENT_PIXEL\n}\n\n/** Inline an <img>'s source as a data URL so the canvas stays untainted. */\nexport async function embedImageElement(\n image: HTMLImageElement,\n context: Context,\n): Promise<void> {\n const source = image.currentSrc || image.src\n if (!source || source.startsWith('data:')) return\n try {\n image.src = await fetchResourceAsDataUrl(source, context)\n } catch (error) {\n if (isAbortError(error)) throw error\n image.src = handleFailure(source, error, context)\n }\n image.removeAttribute('srcset')\n image.removeAttribute('loading')\n image.removeAttribute('crossorigin')\n}\n\n/** Inline every url() inside an element's (already-computed) background-image. */\nexport async function embedBackground(\n element: HTMLElement | SVGElement,\n context: Context,\n): Promise<void> {\n let value = element.style.backgroundImage\n if (!value || value === 'none' || !value.includes('url(')) return\n\n const urls = extractUrls(value)\n for (const url of urls) {\n try {\n const dataUrl = await fetchResourceAsDataUrl(url, context)\n value = replaceUrl(value, url, dataUrl)\n } catch (error) {\n if (isAbortError(error)) throw error\n value = replaceUrl(value, url, handleFailure(url, error, context))\n }\n }\n element.style.backgroundImage = value\n}\n","import { extractUrls, resolveUrl } from '../util/css'\nimport { runPool } from '../util/concurrency'\nimport { fetchResourceAsDataUrl } from './fetch'\nimport type { Context } from '../types'\n\nconst FONT_FACE_RULE = 5\nconst FONT_FACE_RE = /@font-face\\s*{[^}]*}/gi\nconst URL_FORMAT_RE =\n /url\\((['\"]?)([^'\")]+)\\1\\)\\s*format\\((['\"]?)([^'\")]+)\\3\\)/gi\n\ninterface FontFaceEntry {\n cssText: string\n baseUrl: string\n}\n\nasync function gatherFontFaces(context: Context): Promise<FontFaceEntry[]> {\n const entries: FontFaceEntry[] = []\n const crossOriginHrefs: string[] = []\n\n for (const sheet of Array.from(context.ownerDocument.styleSheets)) {\n const baseUrl = sheet.href ?? context.ownerDocument.baseURI\n let rules: CSSRuleList | null = null\n try {\n rules = sheet.cssRules\n } catch {\n rules = null\n }\n if (rules) {\n for (const rule of Array.from(rules)) {\n if (rule.type === FONT_FACE_RULE) {\n entries.push({ cssText: rule.cssText, baseUrl })\n }\n }\n } else if (sheet.href) {\n crossOriginHrefs.push(sheet.href)\n }\n }\n\n for (const href of crossOriginHrefs) {\n context.throwIfAborted()\n try {\n const response = await fetch(href, context.options.fetchRequestInit)\n if (!response.ok) continue\n const text = await response.text()\n for (const match of text.match(FONT_FACE_RE) ?? []) {\n entries.push({ cssText: match, baseUrl: href })\n }\n } catch {\n /* inaccessible stylesheet — skip */\n }\n }\n\n return entries\n}\n\nfunction pickPreferredUrl(\n cssText: string,\n urls: string[],\n preferWoff2: boolean,\n): string {\n if (preferWoff2) {\n URL_FORMAT_RE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = URL_FORMAT_RE.exec(cssText)) !== null) {\n if (/woff2/i.test(match[4] ?? '')) return match[2]!\n }\n }\n return urls[0]!\n}\n\nasync function embedFontFace(\n entry: FontFaceEntry,\n context: Context,\n): Promise<string> {\n const cached = context.fontCache.get(entry.cssText)\n if (cached !== undefined) return cached\n\n const urls = extractUrls(entry.cssText)\n let css = entry.cssText\n if (urls.length > 0) {\n const chosen = pickPreferredUrl(entry.cssText, urls, context.options.fontsPreferWoff2)\n try {\n const dataUrl = await fetchResourceAsDataUrl(\n resolveUrl(chosen, entry.baseUrl),\n context,\n )\n css = entry.cssText.replace(/src\\s*:[^;]+;?/i, `src:url(\"${dataUrl}\");`)\n } catch {\n /* keep original src — better a missing font than a failed capture */\n }\n }\n\n context.fontCache.set(entry.cssText, css)\n return css\n}\n\n/** Build a combined @font-face stylesheet with embedded (data-URL) sources. */\nexport async function embedWebFonts(context: Context): Promise<string> {\n if (context.options.fontsSkip) return ''\n const faces = await gatherFontFaces(context)\n if (faces.length === 0) return ''\n\n const parts: string[] = []\n await runPool(faces, 4, async (face) => {\n parts.push(await embedFontFace(face, context))\n await context.scheduler.yieldIfNeeded()\n })\n return parts.join('\\n')\n}\n","import { runPool } from '../util/concurrency'\nimport { embedBackground, embedImageElement } from './images'\nimport { embedWebFonts } from './fonts'\nimport type { Context } from '../types'\n\nconst EMBED_CONCURRENCY = 6\n\nfunction hasBackgroundImage(element: HTMLElement | SVGElement): boolean {\n const value = element.style?.backgroundImage\n return Boolean(value) && value !== 'none' && value.includes('url(')\n}\n\n/**\n * Embed every external resource referenced by the clone (image elements + CSS\n * background images) and return a combined @font-face stylesheet. Work runs with\n * bounded concurrency and yields between items so the main thread stays free.\n * Returns the font CSS for the serializer to inject into the root <style>.\n */\nexport async function embedResources(\n clone: HTMLElement,\n context: Context,\n): Promise<string> {\n context.scheduler.reset()\n\n const images = Array.from(clone.querySelectorAll('img')) as HTMLImageElement[]\n if (clone instanceof HTMLImageElement) images.unshift(clone)\n\n const backgrounds = Array.from(\n clone.querySelectorAll<HTMLElement>('*'),\n ).filter(hasBackgroundImage)\n if (hasBackgroundImage(clone)) backgrounds.unshift(clone)\n\n const total = images.length + backgrounds.length\n let done = 0\n const tick = () => {\n done++\n if (total > 0) context.reportPhase('embed', done / total)\n }\n\n const imageTasks = images.map(\n (image) => async () => {\n await embedImageElement(image, context)\n tick()\n await context.scheduler.yieldIfNeeded()\n },\n )\n const backgroundTasks = backgrounds.map(\n (element) => async () => {\n await embedBackground(element, context)\n tick()\n await context.scheduler.yieldIfNeeded()\n },\n )\n\n const tasks = [...imageTasks, ...backgroundTasks]\n // Run fonts in parallel with element/background embedding.\n const [fontCss] = await Promise.all([\n embedWebFonts(context),\n runPool(tasks, EMBED_CONCURRENCY, (task) => task()),\n ])\n\n context.reportPhase('embed', 1)\n return fontCss\n}\n","import type { CropRect } from '../types'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst XHTML_NS = 'http://www.w3.org/1999/xhtml'\n\nexport interface SerializeParams {\n clone: HTMLElement\n doc: Document\n fullWidth: number\n fullHeight: number\n pseudoRules: string[]\n fontCss: string\n backgroundColor: string | null\n crop: CropRect | null\n}\n\n/**\n * Wrap the embedded clone in an SVG <foreignObject>. The SVG viewport is the\n * output size (crop size when cropping); a negative foreignObject offset shifts\n * the content so the crop region aligns to the origin. Pseudo-element rules and\n * embedded @font-face CSS go into a <style> inside the foreignObject.\n */\nexport function buildSvgString(params: SerializeParams): string {\n const {\n clone,\n doc,\n fullWidth,\n fullHeight,\n pseudoRules,\n fontCss,\n backgroundColor,\n crop,\n } = params\n\n const outW = crop ? crop.width : fullWidth\n const outH = crop ? crop.height : fullHeight\n\n const svg = doc.createElementNS(SVG_NS, 'svg')\n svg.setAttribute('xmlns', SVG_NS)\n svg.setAttribute('width', String(outW))\n svg.setAttribute('height', String(outH))\n svg.setAttribute('viewBox', `0 0 ${outW} ${outH}`)\n\n if (backgroundColor) {\n const rect = doc.createElementNS(SVG_NS, 'rect')\n rect.setAttribute('width', '100%')\n rect.setAttribute('height', '100%')\n rect.setAttribute('fill', backgroundColor)\n svg.appendChild(rect)\n }\n\n const foreignObject = doc.createElementNS(SVG_NS, 'foreignObject')\n foreignObject.setAttribute('x', String(crop ? -crop.x : 0))\n foreignObject.setAttribute('y', String(crop ? -crop.y : 0))\n foreignObject.setAttribute('width', String(fullWidth))\n foreignObject.setAttribute('height', String(fullHeight))\n\n const container = doc.createElement('div')\n container.setAttribute('xmlns', XHTML_NS)\n\n if (fontCss || pseudoRules.length > 0) {\n const style = doc.createElement('style')\n style.textContent = `${fontCss}\\n${pseudoRules.join('')}`\n container.appendChild(style)\n }\n\n clone.style.margin = '0'\n container.appendChild(clone)\n foreignObject.appendChild(container)\n svg.appendChild(foreignObject)\n\n return new XMLSerializer().serializeToString(svg)\n}\n\nexport function svgStringToDataUrl(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n}\n","/** Decode an SVG data URL into a fully-loaded HTMLImageElement. */\nexport async function svgToImage(\n dataUrl: string,\n doc: Document,\n): Promise<HTMLImageElement> {\n const view = doc.defaultView ?? window\n const image = new view.Image()\n image.decoding = 'sync'\n image.src = dataUrl\n\n if (typeof image.decode === 'function') {\n await image.decode()\n return image\n }\n\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve()\n image.onerror = () => reject(new Error('Failed to rasterize SVG.'))\n })\n return image\n}\n","import type { Context } from '../types'\n\nexport const DEFAULT_MAX_TILE = 4096\nconst MAX_BAND_BYTES = 2 * 1024 * 1024\n\nexport interface RasterGeometry {\n /** Output size in CSS pixels (matches the SVG viewport / image natural size). */\n outWidth: number\n outHeight: number\n /** Output size in device pixels (CSS * scale), what we actually rasterize to. */\n deviceWidth: number\n deviceHeight: number\n}\n\nexport function createCanvas(\n doc: Document,\n width: number,\n height: number,\n): HTMLCanvasElement {\n const canvas = doc.createElement('canvas')\n canvas.width = width\n canvas.height = height\n return canvas\n}\n\n/** Largest scale that keeps both device dimensions within `maxTile`. */\nexport function clampScale(\n outWidth: number,\n outHeight: number,\n scale: number,\n maxTile: number,\n): number {\n const limit = Math.min(\n maxTile / Math.max(1, outWidth),\n maxTile / Math.max(1, outHeight),\n )\n return Math.min(scale, limit)\n}\n\n/** Single-pass rasterization. Assumes device dims are within the canvas limit. */\nexport function drawSvgToCanvas(\n svgImage: HTMLImageElement,\n deviceWidth: number,\n deviceHeight: number,\n context: Context,\n): HTMLCanvasElement {\n const canvas = createCanvas(context.ownerDocument, deviceWidth, deviceHeight)\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('2D context unavailable.')\n ctx.drawImage(svgImage, 0, 0, deviceWidth, deviceHeight)\n context.reportPhase('rasterize', 1)\n return canvas\n}\n\n/**\n * Yield the image as horizontal RGBA bands, rendering each band in column tiles\n * no larger than `maxTile`. Band height is sized to keep each band buffer under\n * ~32MB, so total memory stays bounded regardless of output size — this is what\n * lets PNG/PDF exceed the browser's single-canvas limit at full resolution.\n */\nexport async function* rgbaBands(\n svgImage: HTMLImageElement,\n geometry: RasterGeometry,\n maxTile: number,\n context: Context,\n): AsyncGenerator<Uint8Array> {\n const { outWidth, outHeight, deviceWidth, deviceHeight } = geometry\n const rx = outWidth / deviceWidth\n const ry = outHeight / deviceHeight\n\n const bandRows = Math.max(\n 1,\n Math.min(maxTile, Math.floor(MAX_BAND_BYTES / (deviceWidth * 4)) || 1),\n )\n\n const tile = createCanvas(\n context.ownerDocument,\n Math.min(maxTile, deviceWidth),\n bandRows,\n )\n const tileCtx = tile.getContext('2d', { willReadFrequently: true })\n if (!tileCtx) throw new Error('2D context unavailable.')\n\n for (let y = 0; y < deviceHeight; y += bandRows) {\n const bandHeight = Math.min(bandRows, deviceHeight - y)\n const band = new Uint8Array(deviceWidth * bandHeight * 4)\n\n for (let x = 0; x < deviceWidth; x += maxTile) {\n const tileWidth = Math.min(maxTile, deviceWidth - x)\n if (tile.width !== tileWidth || tile.height !== bandHeight) {\n tile.width = tileWidth\n tile.height = bandHeight\n }\n tileCtx.clearRect(0, 0, tileWidth, bandHeight)\n tileCtx.drawImage(\n svgImage,\n x * rx,\n y * ry,\n tileWidth * rx,\n bandHeight * ry,\n 0,\n 0,\n tileWidth,\n bandHeight,\n )\n const pixels = tileCtx.getImageData(0, 0, tileWidth, bandHeight).data\n const rowBytes = tileWidth * 4\n for (let row = 0; row < bandHeight; row++) {\n band.set(\n pixels.subarray(row * rowBytes, (row + 1) * rowBytes),\n (row * deviceWidth + x) * 4,\n )\n }\n await context.scheduler.yieldIfNeeded()\n }\n\n context.reportPhase('rasterize', Math.min(1, (y + bandHeight) / deviceHeight))\n yield band\n }\n}\n","function mergeChunks(chunks: Uint8Array[], total: number): Uint8Array {\n const merged = new Uint8Array(total)\n let offset = 0\n for (const part of chunks) {\n merged.set(part, offset)\n offset += part.length\n }\n return merged\n}\n\nexport function supportsCompressionStream(): boolean {\n return typeof CompressionStream !== 'undefined'\n}\n\n/**\n * Deflate a (possibly async) sequence of byte chunks into a single zlib stream\n * using the native CompressionStream. Reading and writing run concurrently so\n * backpressure keeps memory bounded — only the compressed output accumulates.\n */\nexport async function deflate(\n source: AsyncIterable<Uint8Array> | Iterable<Uint8Array>,\n): Promise<Uint8Array> {\n const cs = new CompressionStream('deflate')\n const writer = cs.writable.getWriter()\n\n const pump = (async () => {\n for await (const part of source as AsyncIterable<Uint8Array>) {\n await writer.write(part as BufferSource)\n }\n await writer.close()\n })()\n\n const reader = cs.readable.getReader()\n const chunks: Uint8Array[] = []\n let total = 0\n for (;;) {\n const { value, done } = await reader.read()\n if (done) break\n chunks.push(value)\n total += value.length\n }\n await pump\n return mergeChunks(chunks, total)\n}\n","import { deflate } from '../util/compress'\n\nconst PNG_SIGNATURE = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10])\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256)\n for (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n }\n table[n] = c >>> 0\n }\n return table\n})()\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff\n for (let i = 0; i < bytes.length; i++) {\n crc = CRC_TABLE[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8)\n }\n return (crc ^ 0xffffffff) >>> 0\n}\n\nfunction chunk(type: string, data: Uint8Array): Uint8Array {\n const out = new Uint8Array(12 + data.length)\n const view = new DataView(out.buffer)\n view.setUint32(0, data.length)\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i)\n out.set(data, 8)\n view.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)))\n return out\n}\n\nfunction ihdr(width: number, height: number): Uint8Array {\n const data = new Uint8Array(13)\n const view = new DataView(data.buffer)\n view.setUint32(0, width)\n view.setUint32(4, height)\n data[8] = 8 // bit depth\n data[9] = 6 // color type: RGBA\n return data\n}\n\n/**\n * Encode RGBA bands into a PNG, streaming each band's scanlines (prefixed with a\n * filter-0 byte) through the native deflate so memory stays bounded. Lets the\n * tiler emit images larger than the browser's single-canvas limit.\n */\nexport async function encodePng(\n width: number,\n height: number,\n rgbaBands: AsyncIterable<Uint8Array>,\n): Promise<Blob> {\n const stride = width * 4\n\n async function* framedScanlines(): AsyncGenerator<Uint8Array> {\n for await (const band of rgbaBands) {\n const rows = band.length / stride\n const framed = new Uint8Array(band.length + rows)\n for (let r = 0; r < rows; r++) {\n const dst = r * (stride + 1)\n framed[dst] = 0 // filter: none\n framed.set(band.subarray(r * stride, (r + 1) * stride), dst + 1)\n }\n yield framed\n }\n }\n\n const idat = await deflate(framedScanlines())\n return new Blob(\n [\n PNG_SIGNATURE,\n chunk('IHDR', ihdr(width, height)),\n chunk('IDAT', idat),\n chunk('IEND', new Uint8Array(0)),\n ] as BlobPart[],\n { type: 'image/png' },\n )\n}\n","import { deflate } from '../util/compress'\n\nconst encoder = new TextEncoder()\n\n/** Composite RGBA bands onto white and yield RGB (PDF DeviceRGB has no alpha). */\nasync function* rgbaToRgb(\n bands: AsyncIterable<Uint8Array>,\n): AsyncGenerator<Uint8Array> {\n for await (const rgba of bands) {\n const pixels = rgba.length / 4\n const rgb = new Uint8Array(pixels * 3)\n for (let i = 0, j = 0; i < rgba.length; i += 4, j += 3) {\n const alpha = rgba[i + 3]! / 255\n const inv = 255 * (1 - alpha)\n rgb[j] = Math.round(rgba[i]! * alpha + inv)\n rgb[j + 1] = Math.round(rgba[i + 1]! * alpha + inv)\n rgb[j + 2] = Math.round(rgba[i + 2]! * alpha + inv)\n }\n yield rgb\n }\n}\n\nfunction fmt(n: number): string {\n return (Math.round(n * 1000) / 1000).toString()\n}\n\n/**\n * Build a single-page PDF embedding the rasterized image as a FlateDecode\n * DeviceRGB XObject. Page size is in points (1 CSS px = 0.75pt at 96dpi); the\n * image fills the page, so effective DPI scales with the capture's `scale`.\n */\nexport async function encodePdfFromRgbaBands(\n bands: AsyncIterable<Uint8Array>,\n pixelWidth: number,\n pixelHeight: number,\n pointWidth: number,\n pointHeight: number,\n): Promise<Blob> {\n const imageData = await deflate(rgbaToRgb(bands))\n\n const parts: Uint8Array[] = []\n const offsets: number[] = new Array(6).fill(0)\n let offset = 0\n\n const pushBytes = (bytes: Uint8Array) => {\n parts.push(bytes)\n offset += bytes.length\n }\n const pushText = (text: string) => pushBytes(encoder.encode(text))\n const startObject = (n: number) => {\n offsets[n] = offset\n }\n\n pushText('%PDF-1.4\\n')\n pushBytes(new Uint8Array([0x25, 0xff, 0xff, 0xff, 0xff, 0x0a]))\n\n startObject(1)\n pushText('1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n')\n\n startObject(2)\n pushText('2 0 obj\\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\\nendobj\\n')\n\n startObject(3)\n pushText(\n `3 0 obj\\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${fmt(pointWidth)} ${fmt(\n pointHeight,\n )}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>\\nendobj\\n`,\n )\n\n startObject(4)\n pushText(\n `4 0 obj\\n<< /Type /XObject /Subtype /Image /Width ${pixelWidth} /Height ${pixelHeight} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${imageData.length} >>\\nstream\\n`,\n )\n pushBytes(imageData)\n pushText('\\nendstream\\nendobj\\n')\n\n const content = `q\\n${fmt(pointWidth)} 0 0 ${fmt(pointHeight)} 0 0 cm\\n/Im0 Do\\nQ\\n`\n startObject(5)\n pushText(\n `5 0 obj\\n<< /Length ${content.length} >>\\nstream\\n${content}endstream\\nendobj\\n`,\n )\n\n const xrefOffset = offset\n let xref = `xref\\n0 6\\n0000000000 65535 f \\n`\n for (let i = 1; i < 6; i++) {\n xref += `${String(offsets[i]).padStart(10, '0')} 00000 n \\n`\n }\n pushText(xref)\n pushText(`trailer\\n<< /Size 6 /Root 1 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`)\n\n return new Blob(parts as BlobPart[], { type: 'application/pdf' })\n}\n","import { SmoothScreenshotError } from '../errors'\nimport type { ImageType } from '../types'\n\nconst MIME: Record<ImageType, string> = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n}\n\nexport function mimeFor(type: ImageType): string {\n return MIME[type]\n}\n\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n type: ImageType,\n quality: number,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n try {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob)\n else reject(new SmoothScreenshotError('ENCODE_FAILED', 'toBlob returned null.'))\n },\n MIME[type],\n quality,\n )\n } catch (error) {\n reject(\n new SmoothScreenshotError(\n 'TAINTED_CANVAS',\n 'Canvas is tainted by cross-origin content and cannot be exported.',\n { cause: error },\n ),\n )\n }\n })\n}\n\nexport function canvasToDataUrl(\n canvas: HTMLCanvasElement,\n type: ImageType,\n quality: number,\n): string {\n try {\n return canvas.toDataURL(MIME[type], quality)\n } catch (error) {\n throw new SmoothScreenshotError(\n 'TAINTED_CANVAS',\n 'Canvas is tainted by cross-origin content and cannot be exported.',\n { cause: error },\n )\n }\n}\n\nexport function blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onloadend = () => resolve(reader.result as string)\n reader.onerror = () => reject(new SmoothScreenshotError('ENCODE_FAILED', 'Failed to read blob.'))\n reader.readAsDataURL(blob)\n })\n}\n","import { resolveOptions } from './options'\nimport { createContext } from './context'\nimport { cloneTree } from './clone/clone-node'\nimport { embedResources } from './embed/embed'\nimport { buildSvgString, svgStringToDataUrl } from './serialize/foreign-object-svg'\nimport { svgToImage } from './raster/svg-to-image'\nimport {\n DEFAULT_MAX_TILE,\n clampScale,\n drawSvgToCanvas,\n rgbaBands,\n type RasterGeometry,\n} from './raster/tiler'\nimport { encodePng } from './encode/png-encoder'\nimport { encodePdfFromRgbaBands } from './encode/pdf'\nimport { canvasToBlob, canvasToDataUrl } from './encode/image'\nimport { supportsCompressionStream } from './util/compress'\nimport { SmoothScreenshotError } from './errors'\nimport type { Context, ImageType, Options } from './types'\n\nconst CSS_PX_TO_PT = 0.75\n\ninterface Prepared {\n svgString: string\n fullWidth: number\n fullHeight: number\n outWidth: number\n outHeight: number\n}\n\nfunction assertElement(target: unknown): asserts target is HTMLElement {\n if (\n !target ||\n typeof (target as HTMLElement).getBoundingClientRect !== 'function' ||\n !(target as HTMLElement).ownerDocument\n ) {\n throw new SmoothScreenshotError(\n 'INVALID_TARGET',\n 'Capture target must be an HTMLElement attached to a document.',\n )\n }\n}\n\nasync function prepare(\n target: HTMLElement,\n context: Context,\n backgroundColor: string | null,\n): Promise<Prepared> {\n context.throwIfAborted()\n\n const rect = target.getBoundingClientRect()\n const fullWidth = context.options.width ?? rect.width\n const fullHeight = context.options.height ?? rect.height\n if (fullWidth <= 0 || fullHeight <= 0) {\n throw new SmoothScreenshotError(\n 'EMPTY_TARGET',\n 'Capture target has no rendered size.',\n )\n }\n\n const crop = context.options.crop\n const outWidth = crop ? crop.width : fullWidth\n const outHeight = crop ? crop.height : fullHeight\n\n const { clone, pseudoRules } = await cloneTree(target, context)\n\n if (context.options.style) {\n for (const [key, value] of Object.entries(context.options.style)) {\n clone.style.setProperty(key, value)\n }\n }\n\n const fontCss = await embedResources(clone, context)\n\n const svgString = buildSvgString({\n clone,\n doc: context.ownerDocument,\n fullWidth,\n fullHeight,\n pseudoRules,\n fontCss,\n backgroundColor,\n crop,\n })\n\n return { svgString, fullWidth, fullHeight, outWidth, outHeight }\n}\n\nfunction withContext<T>(\n target: HTMLElement,\n options: Options,\n backgroundColor: string | null,\n run: (context: Context, prepared: Prepared) => Promise<T>,\n): Promise<T> {\n assertElement(target)\n const ownerWindow = (target.ownerDocument.defaultView ?? window) as Window &\n typeof globalThis\n const context = createContext(target, resolveOptions(options, ownerWindow))\n return prepare(target, context, backgroundColor)\n .then((prepared) => run(context, prepared))\n .finally(() => context.destroy())\n}\n\nfunction geometry(prepared: Prepared, scale: number): RasterGeometry {\n return {\n outWidth: prepared.outWidth,\n outHeight: prepared.outHeight,\n deviceWidth: Math.max(1, Math.round(prepared.outWidth * scale)),\n deviceHeight: Math.max(1, Math.round(prepared.outHeight * scale)),\n }\n}\n\nexport function captureSvg(target: HTMLElement, options: Options = {}): Promise<string> {\n return withContext(target, options, options.backgroundColor ?? null, async (context, prepared) => {\n context.reportPhase('rasterize', 1)\n context.reportPhase('encode', 1)\n return svgStringToDataUrl(prepared.svgString)\n })\n}\n\nasync function renderClampedCanvas(\n context: Context,\n prepared: Prepared,\n): Promise<HTMLCanvasElement> {\n const maxTile = context.options.maxTileSize || DEFAULT_MAX_TILE\n const scale = clampScale(\n prepared.outWidth,\n prepared.outHeight,\n context.options.scale,\n maxTile,\n )\n const geo = geometry(prepared, scale)\n const svgImage = await svgToImage(\n svgStringToDataUrl(prepared.svgString),\n context.ownerDocument,\n )\n return drawSvgToCanvas(svgImage, geo.deviceWidth, geo.deviceHeight, context)\n}\n\nexport function captureCanvas(\n target: HTMLElement,\n options: Options = {},\n): Promise<HTMLCanvasElement> {\n return withContext(target, options, options.backgroundColor ?? null, (context, prepared) =>\n renderClampedCanvas(context, prepared),\n )\n}\n\nasync function encodeImage(\n context: Context,\n prepared: Prepared,\n type: ImageType,\n toResult: (canvas: HTMLCanvasElement) => Promise<string | Blob> | string,\n toPngBeyondCap: (blob: Blob) => Promise<string | Blob> | string | Blob,\n): Promise<string | Blob> {\n const maxTile = context.options.maxTileSize || DEFAULT_MAX_TILE\n const fullGeo = geometry(prepared, context.options.scale)\n const exceeds =\n fullGeo.deviceWidth > maxTile || fullGeo.deviceHeight > maxTile\n\n const svgImage = await svgToImage(\n svgStringToDataUrl(prepared.svgString),\n context.ownerDocument,\n )\n\n if (type === 'png' && exceeds && supportsCompressionStream()) {\n const blob = await encodePng(\n fullGeo.deviceWidth,\n fullGeo.deviceHeight,\n rgbaBands(svgImage, fullGeo, maxTile, context),\n )\n context.reportPhase('encode', 1)\n return toPngBeyondCap(blob)\n }\n\n let geo = fullGeo\n if (exceeds) {\n const scale = clampScale(\n prepared.outWidth,\n prepared.outHeight,\n context.options.scale,\n maxTile,\n )\n geo = geometry(prepared, scale)\n }\n\n const canvas = drawSvgToCanvas(svgImage, geo.deviceWidth, geo.deviceHeight, context)\n const result = await toResult(canvas)\n context.reportPhase('encode', 1)\n return result\n}\n\nexport function captureImageDataUrl(\n target: HTMLElement,\n options: Options,\n type: ImageType,\n): Promise<string> {\n const backgroundColor =\n options.backgroundColor ?? (type === 'jpeg' ? '#ffffff' : null)\n return withContext(target, options, backgroundColor, (context, prepared) =>\n encodeImage(\n context,\n prepared,\n type,\n (canvas) => canvasToDataUrl(canvas, type, context.options.quality),\n (blob) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onloadend = () => resolve(reader.result as string)\n reader.onerror = () => reject(new Error('Failed to read PNG blob.'))\n reader.readAsDataURL(blob)\n }),\n ),\n ) as Promise<string>\n}\n\nexport function captureImageBlob(\n target: HTMLElement,\n options: Options,\n type: ImageType,\n): Promise<Blob> {\n const backgroundColor =\n options.backgroundColor ?? (type === 'jpeg' ? '#ffffff' : null)\n return withContext(target, options, backgroundColor, (context, prepared) =>\n encodeImage(\n context,\n prepared,\n type,\n (canvas) => canvasToBlob(canvas, type, context.options.quality),\n (blob) => blob,\n ),\n ) as Promise<Blob>\n}\n\nexport function capturePdf(target: HTMLElement, options: Options = {}): Promise<Blob> {\n if (!supportsCompressionStream()) {\n return Promise.reject(\n new SmoothScreenshotError(\n 'ENCODE_FAILED',\n 'PDF export requires CompressionStream (Chrome 80+, Firefox 113+, Safari 16.4+).',\n ),\n )\n }\n const backgroundColor = options.backgroundColor ?? '#ffffff'\n return withContext(target, options, backgroundColor, async (context, prepared) => {\n const maxTile = context.options.maxTileSize || DEFAULT_MAX_TILE\n const geo = geometry(prepared, context.options.scale)\n const svgImage = await svgToImage(\n svgStringToDataUrl(prepared.svgString),\n context.ownerDocument,\n )\n const blob = await encodePdfFromRgbaBands(\n rgbaBands(svgImage, geo, maxTile, context),\n geo.deviceWidth,\n geo.deviceHeight,\n prepared.outWidth * CSS_PX_TO_PT,\n prepared.outHeight * CSS_PX_TO_PT,\n )\n context.reportPhase('encode', 1)\n return blob\n })\n}\n","import {\n captureCanvas,\n captureImageBlob,\n captureImageDataUrl,\n capturePdf,\n captureSvg,\n} from './capture'\nimport type { Options } from './types'\n\n/** Capture an element as a PNG data URL. */\nexport function toPng(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureImageDataUrl(target, options, 'png')\n}\n\n/** Capture an element as a JPEG data URL (opaque; defaults to a white background). */\nexport function toJpeg(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureImageDataUrl(target, options, 'jpeg')\n}\n\n/** Capture an element as a WebP data URL. */\nexport function toWebp(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureImageDataUrl(target, options, 'webp')\n}\n\n/** Capture an element as an SVG data URL (no rasterization). */\nexport function toSvg(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureSvg(target, options)\n}\n\n/** Capture an element to a canvas. Output is clamped to the canvas size limit. */\nexport function toCanvas(\n target: HTMLElement,\n options: Options = {},\n): Promise<HTMLCanvasElement> {\n return captureCanvas(target, options)\n}\n\n/** Capture an element as a single-page PDF (raster image embedded). */\nexport function toPdf(target: HTMLElement, options: Options = {}): Promise<Blob> {\n return capturePdf(target, options)\n}\n\n/** Capture an element as a Blob in the format given by `options.type` (default png). */\nexport function toBlob(target: HTMLElement, options: Options = {}): Promise<Blob> {\n return captureImageBlob(target, options, options.type ?? 'png')\n}\n"]}
1
+ {"version":3,"sources":["../src/options.ts","../src/errors.ts","../src/scheduler.ts","../src/worker/source.ts","../src/worker/pool.ts","../src/context.ts","../src/util/ns.ts","../src/clone/default-style.ts","../src/clone/copy-styles.ts","../src/clone/pseudo.ts","../src/clone/special.ts","../src/clone/state.ts","../src/clone/clone-node.ts","../src/util/concurrency.ts","../src/util/css.ts","../src/util/dataurl.ts","../src/embed/fetch.ts","../src/embed/images.ts","../src/embed/fonts.ts","../src/embed/embed.ts","../src/serialize/foreign-object-svg.ts","../src/raster/svg-to-image.ts","../src/raster/tiler.ts","../src/util/compress.ts","../src/encode/png-encoder.ts","../src/encode/pdf.ts","../src/encode/image.ts","../src/capture.ts","../src/api.ts"],"names":["xhtmlNs","svgNs","geometry","rgbaBands"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { Options, ResolvedOptions } from './types'\n\nconst DEFAULT_QUALITY = 0.92\nconst DEFAULT_FRAME_BUDGET_MS = 5\nconst DEFAULT_WORKER_COUNT = 2\nconst DEFAULT_FETCH_TIMEOUT_MS = 30000\nconst DEFAULT_FETCH_RETRIES = 2\n\nfunction resolveWorkerCount(worker: Options['worker']): number {\n if (worker === false) return 0\n if (worker === true || worker === undefined) return DEFAULT_WORKER_COUNT\n return Math.max(0, Math.floor(worker.count))\n}\n\nexport function resolveOptions(\n options: Options,\n win: Window & typeof globalThis,\n): ResolvedOptions {\n const scale =\n options.scale ?? options.pixelRatio ?? win.devicePixelRatio ?? 1\n\n return {\n type: options.type ?? 'png',\n quality: options.quality ?? DEFAULT_QUALITY,\n scale: scale > 0 ? scale : 1,\n backgroundColor: options.backgroundColor ?? null,\n width: options.width ?? null,\n height: options.height ?? null,\n crop: options.crop ?? null,\n style: options.style ?? null,\n signal: options.signal,\n onProgress: options.onProgress ?? null,\n frameBudgetMs: options.frameBudgetMs ?? DEFAULT_FRAME_BUDGET_MS,\n workerCount: resolveWorkerCount(options.worker),\n maxTileSize: options.maxTileSize ?? 0,\n filter: options.filter ?? null,\n fontsSkip: options.fonts?.skip ?? false,\n fontsPreferWoff2: options.fonts?.preferWoff2 ?? true,\n fetchRequestInit: options.fetch?.requestInit,\n fetchPlaceholder: options.fetch?.placeholder ?? null,\n fetchTimeoutMs: options.fetch?.timeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS,\n fetchRetries: options.fetch?.retries ?? DEFAULT_FETCH_RETRIES,\n onResourceError: options.onResourceError ?? null,\n }\n}\n","export type ErrorCode =\n | 'TAINTED_CANVAS'\n | 'EMPTY_TARGET'\n | 'WORKER_UNAVAILABLE'\n | 'ENCODE_FAILED'\n | 'INVALID_TARGET'\n\nexport class SmoothScreenshotError extends Error {\n readonly code: ErrorCode\n\n constructor(code: ErrorCode, message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = 'SmoothScreenshotError'\n this.code = code\n Object.setPrototypeOf(this, SmoothScreenshotError.prototype)\n }\n}\n\nexport function createAbortError(): DOMException {\n return new DOMException('The screenshot was aborted.', 'AbortError')\n}\n\nexport function isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === 'AbortError'\n}\n","import { createAbortError } from './errors'\nimport type { Scheduler } from './types'\n\n/**\n * Cooperative frame-budget scheduler. Work calls `yieldIfNeeded()` in hot loops;\n * once the current synchronous slice exceeds `budgetMs`, it yields a macrotask via\n * MessageChannel (no 4ms timer clamp, lets the browser paint), then resumes.\n *\n * A single MessageChannel is reused across all yields (the React scheduler trick)\n * to avoid per-yield allocation.\n */\nexport function createScheduler(\n budgetMs: number,\n signal: AbortSignal | undefined,\n): Scheduler {\n let sliceStart = performance.now()\n\n const channel = new MessageChannel()\n const pending: Array<() => void> = []\n channel.port1.onmessage = () => {\n pending.shift()?.()\n }\n\n function macrotask(): Promise<void> {\n return new Promise<void>((resolve) => {\n pending.push(resolve)\n channel.port2.postMessage(undefined)\n })\n }\n\n function abortGuard(): void {\n if (signal?.aborted) throw createAbortError()\n }\n\n const scheduler: Scheduler = {\n async yieldNow() {\n await macrotask()\n sliceStart = performance.now()\n abortGuard()\n },\n async yieldIfNeeded() {\n if (performance.now() - sliceStart >= budgetMs) {\n await scheduler.yieldNow()\n } else {\n abortGuard()\n }\n },\n reset() {\n sliceStart = performance.now()\n },\n }\n\n return scheduler\n}\n","/**\n * Inline worker source. Kept as a plain string so it bundles with zero extra\n * build steps and runs from a Blob URL (no separate file to serve). The worker\n * only fetches a URL and resolves it to a data URL — it has no DOM access and\n * does not bypass CORS; it just moves network + base64 work off the main thread.\n */\nexport const WORKER_SOURCE = `\nself.onmessage = function (e) {\n var id = e.data.id\n var url = e.data.url\n var init = e.data.init\n fetch(url, init)\n .then(function (res) {\n if (!res.ok) throw new Error('HTTP ' + res.status)\n return res.blob()\n })\n .then(function (blob) {\n var reader = new FileReader()\n reader.onload = function () { self.postMessage({ id: id, result: reader.result }) }\n reader.onerror = function () { self.postMessage({ id: id, error: 'read failed' }) }\n reader.readAsDataURL(blob)\n })\n .catch(function (err) {\n self.postMessage({ id: id, error: String((err && err.message) || err) })\n })\n}\n`\n","import type { ResourceResult, WorkerPool } from '../types'\nimport { WORKER_SOURCE } from './source'\n\ninterface PendingRequest {\n resolve: (value: ResourceResult) => void\n reject: (reason: Error) => void\n}\n\n/** Reduce a RequestInit to a structured-cloneable subset for postMessage. */\nfunction sanitizeInit(init?: RequestInit): RequestInit | undefined {\n if (!init) return undefined\n const headers =\n init.headers instanceof Headers\n ? Object.fromEntries(init.headers.entries())\n : init.headers\n return {\n method: init.method,\n headers,\n credentials: init.credentials,\n mode: init.mode,\n cache: init.cache,\n referrer: init.referrer,\n integrity: init.integrity,\n }\n}\n\n/**\n * Spawn `count` inline workers from a single Blob URL. Returns null when workers\n * are unavailable (count <= 0, no Worker constructor, or CSP blocks blob: URLs),\n * letting the caller fall back to main-thread fetching.\n */\nexport function createWorkerPool(count: number): WorkerPool | null {\n if (count <= 0 || typeof Worker === 'undefined') return null\n\n let blobUrl: string\n let workers: Worker[]\n try {\n const blob = new Blob([WORKER_SOURCE], { type: 'text/javascript' })\n blobUrl = URL.createObjectURL(blob)\n workers = Array.from({ length: count }, () => new Worker(blobUrl))\n } catch {\n return null\n }\n\n const pending = new Map<number, PendingRequest>()\n let nextId = 0\n let roundRobin = 0\n let destroyed = false\n\n for (const worker of workers) {\n worker.onmessage = (event: MessageEvent) => {\n const { id, result, error } = event.data as {\n id: number\n result?: string\n error?: string\n }\n const request = pending.get(id)\n if (!request) return\n pending.delete(id)\n if (error !== undefined) request.reject(new Error(error))\n else request.resolve(result as string)\n }\n }\n\n return {\n fetchAsDataUrl(url, requestInit) {\n if (destroyed) return Promise.reject(new Error('worker pool destroyed'))\n const id = nextId++\n const worker = workers[roundRobin++ % workers.length]!\n return new Promise<ResourceResult>((resolve, reject) => {\n pending.set(id, { resolve, reject })\n worker.postMessage({ id, url, init: sanitizeInit(requestInit) })\n })\n },\n destroy() {\n if (destroyed) return\n destroyed = true\n for (const worker of workers) worker.terminate()\n URL.revokeObjectURL(blobUrl)\n for (const request of pending.values()) {\n request.reject(new Error('worker pool destroyed'))\n }\n pending.clear()\n },\n }\n}\n","import { createScheduler } from './scheduler'\nimport { createWorkerPool } from './worker/pool'\nimport { createAbortError } from './errors'\nimport type { Context, ProgressPhase, ResolvedOptions } from './types'\n\nconst PHASE_WEIGHTS: Record<ProgressPhase, number> = {\n clone: 0.35,\n embed: 0.3,\n rasterize: 0.2,\n encode: 0.15,\n}\n\nconst PHASE_ORDER: ProgressPhase[] = ['clone', 'embed', 'rasterize', 'encode']\n\nfunction cumulativeWeightBefore(phase: ProgressPhase): number {\n let sum = 0\n for (const candidate of PHASE_ORDER) {\n if (candidate === phase) break\n sum += PHASE_WEIGHTS[candidate]\n }\n return sum\n}\n\nexport function createContext(\n target: HTMLElement,\n options: ResolvedOptions,\n): Context {\n const ownerDocument = target.ownerDocument\n const ownerWindow = (ownerDocument.defaultView ?? window) as Window &\n typeof globalThis\n const scheduler = createScheduler(options.frameBudgetMs, options.signal)\n const workerPool = createWorkerPool(options.workerCount)\n const cleanups: Array<() => void> = []\n let destroyed = false\n let lastOverall = -1\n\n const context: Context = {\n options,\n signal: options.signal,\n ownerDocument,\n ownerWindow,\n scheduler,\n workerPool,\n defaultStyleCache: new Map(),\n resourceCache: new Map(),\n fontCache: new Map(),\n sandbox: null,\n throwIfAborted() {\n if (options.signal?.aborted) throw createAbortError()\n },\n reportPhase(phase, ratio) {\n if (!options.onProgress) return\n const clamped = ratio < 0 ? 0 : ratio > 1 ? 1 : ratio\n const overall =\n cumulativeWeightBefore(phase) + PHASE_WEIGHTS[phase] * clamped\n if (overall === lastOverall) return\n lastOverall = overall\n options.onProgress({ phase, phaseRatio: clamped, overall })\n },\n addCleanup(fn) {\n cleanups.push(fn)\n },\n destroy() {\n if (destroyed) return\n destroyed = true\n while (cleanups.length) {\n const fn = cleanups.pop()!\n try {\n fn()\n } catch {\n /* cleanup must not throw */\n }\n }\n if (context.sandbox) {\n context.sandbox.remove()\n context.sandbox = null\n }\n workerPool?.destroy()\n },\n }\n\n return context\n}\n","// Namespace URIs are read from the DOM at runtime instead of being written as\n// string literals. The generated SVG markup is identical, but the bundle no\n// longer contains literal \"http://...\" strings that static scanners flag as\n// runtime URL access.\n\nlet svgNs: string | null = null\nlet xhtmlNs: string | null = null\n\n/** The SVG namespace URI, derived from a parsed <svg> element. */\nexport function svgNamespace(doc: Document): string {\n if (svgNs === null) {\n const probe = doc.createElement('div')\n probe.innerHTML = '<svg></svg>'\n svgNs = (probe.firstElementChild as Element).namespaceURI ?? ''\n }\n return svgNs\n}\n\n/** The XHTML namespace URI, derived from a plain HTML element. */\nexport function xhtmlNamespace(doc: Document): string {\n if (xhtmlNs === null) {\n xhtmlNs = doc.createElement('div').namespaceURI ?? ''\n }\n return xhtmlNs\n}\n","import type { Context } from '../types'\nimport { xhtmlNamespace } from '../util/ns'\n\nfunction ensureSandbox(context: Context): Document {\n if (context.sandbox?.contentDocument) {\n return context.sandbox.contentDocument\n }\n const iframe = context.ownerDocument.createElement('iframe')\n iframe.setAttribute('aria-hidden', 'true')\n iframe.setAttribute('tabindex', '-1')\n iframe.style.cssText =\n 'position:fixed;left:-9999px;top:0;width:0;height:0;border:0;visibility:hidden;'\n context.ownerDocument.body.appendChild(iframe)\n context.sandbox = iframe\n const doc = iframe.contentDocument\n if (!doc) throw new Error('Unable to create style sandbox.')\n // A document title-less, style-less body gives us pristine UA defaults.\n return doc\n}\n\n/**\n * Returns the user-agent default computed styles for an element's tag, computed\n * once in an isolated sandbox iframe and cached by tag + namespace. The diff in\n * copy-styles uses this so the clone only carries styles that actually differ\n * from the browser default — smaller SVG, same fidelity.\n */\nexport function getDefaultStyle(\n context: Context,\n source: Element,\n): Record<string, string> {\n const xhtmlNs = xhtmlNamespace(context.ownerDocument)\n const namespace = source.namespaceURI ?? xhtmlNs\n const key = `${namespace}|${source.localName}`\n const cached = context.defaultStyleCache.get(key)\n if (cached) return cached\n\n const doc = ensureSandbox(context)\n const sandboxWindow = doc.defaultView\n if (!sandboxWindow || !doc.body) {\n const empty: Record<string, string> = {}\n context.defaultStyleCache.set(key, empty)\n return empty\n }\n\n const element =\n namespace === xhtmlNs\n ? doc.createElement(source.localName)\n : doc.createElementNS(namespace, source.localName)\n doc.body.appendChild(element)\n\n const computed = sandboxWindow.getComputedStyle(element)\n const record: Record<string, string> = {}\n for (let i = 0; i < computed.length; i++) {\n const name = computed[i]\n if (name) record[name] = computed.getPropertyValue(name)\n }\n\n doc.body.removeChild(element)\n context.defaultStyleCache.set(key, record)\n return record\n}\n","import type { Context } from '../types'\nimport { getDefaultStyle } from './default-style'\n\nconst PHYSICAL_BORDER_WIDTHS = [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n]\n\nfunction isBorderStyleOrColor(name: string): boolean {\n if (!name.startsWith('border')) return false\n if (name.startsWith('border-image') || name.startsWith('border-radius')) {\n return false\n }\n return name.endsWith('style') || name.endsWith('color')\n}\n\n/**\n * Copy the source element's effective computed style onto the clone, skipping any\n * property whose value equals the UA default for that tag. The clone is reparented\n * under a foreignObject without its original ancestors, so it must carry every\n * non-default (including inherited) value to render identically.\n */\nexport function copyStyle(\n source: Element,\n target: HTMLElement | SVGElement,\n context: Context,\n): void {\n const computed = context.ownerWindow.getComputedStyle(source)\n const defaults = getDefaultStyle(context, source)\n const toCopy = new Set<string>()\n\n for (let i = 0; i < computed.length; i++) {\n const name = computed[i]\n if (!name) continue\n const value = computed.getPropertyValue(name)\n if (value === '' || defaults[name] === value) continue\n toCopy.add(name)\n }\n\n // Border/outline width is forced to 0 by `style: none` in the UA default, so a\n // per-property diff can copy the style/color (e.g. Tailwind's `border: 0 solid`\n // reset) while dropping the 0 width — the clone then renders a default-width\n // border. If any border style/color was copied, pin the physical widths\n // explicitly (read directly; the browser may enumerate only logical names).\n if (Array.from(toCopy).some(isBorderStyleOrColor)) {\n for (const width of PHYSICAL_BORDER_WIDTHS) toCopy.add(width)\n }\n if (\n toCopy.has('outline-style') ||\n toCopy.has('outline-color') ||\n toCopy.has('outline')\n ) {\n toCopy.add('outline-width')\n }\n\n const targetStyle = target.style\n for (const name of toCopy) {\n const value = computed.getPropertyValue(name)\n if (value === '') continue\n targetStyle.setProperty(name, value, computed.getPropertyPriority(name))\n }\n}\n","import type { Context } from '../types'\nimport type { CloneState } from './state'\n\nconst PSEUDOS = ['::before', '::after'] as const\n\nconst CLASS_PREFIX = 'ss-pseudo-'\n\n/**\n * Pseudo-elements can't be cloned as nodes, so we reproduce them as CSS rules: a\n * unique class is added to the clone and a `.class::before { ... }` rule carrying\n * the pseudo's computed style is accumulated into state.pseudoRules. Those rules\n * are flushed into a single <style> at the clone root by the orchestrator.\n */\nexport function clonePseudoElements(\n source: Element,\n target: HTMLElement | SVGElement,\n state: CloneState,\n context: Context,\n): void {\n let className: string | null = null\n\n for (const pseudo of PSEUDOS) {\n const computed = context.ownerWindow.getComputedStyle(source, pseudo)\n const content = computed.getPropertyValue('content')\n if (!content || content === 'none' || content === 'normal') continue\n\n if (!className) {\n className = `${CLASS_PREFIX}${state.uid++}`\n target.classList.add(className)\n }\n\n let body = ''\n for (let i = 0; i < computed.length; i++) {\n const name = computed[i]\n if (!name) continue\n const value = computed.getPropertyValue(name)\n if (value === '') continue\n const priority = computed.getPropertyPriority(name)\n body += `${name}:${value}${priority ? ' !important' : ''};`\n }\n\n state.pseudoRules.push(`.${className}${pseudo}{${body}}`)\n }\n}\n","/** Snapshot a <canvas> to a data URL. Returns null if the canvas is tainted. */\nexport function snapshotCanvas(canvas: HTMLCanvasElement): string | null {\n try {\n return canvas.toDataURL()\n } catch {\n return null\n }\n}\n\n/**\n * Form controls keep their live value in the DOM property, not an attribute, so\n * a shallow clone renders empty. Reflect the current value onto the clone so it\n * shows what the user sees.\n */\nexport function copyInputValue(\n source: Element,\n target: HTMLElement | SVGElement,\n): void {\n if (source instanceof HTMLTextAreaElement) {\n target.textContent = source.value\n return\n }\n if (source instanceof HTMLInputElement) {\n const input = target as HTMLInputElement\n if (source.type === 'checkbox' || source.type === 'radio') {\n if (source.checked) input.setAttribute('checked', '')\n else input.removeAttribute('checked')\n } else {\n input.setAttribute('value', source.value)\n }\n return\n }\n if (source instanceof HTMLSelectElement) {\n target.setAttribute('data-ss-selected', source.value)\n }\n}\n","/** Mutable bookkeeping threaded through a single clone walk. */\nexport interface CloneState {\n /** Nodes cloned so far (for progress). */\n cloned: number\n /** Estimated total nodes (for progress denominator). */\n total: number\n /** Accumulated `::before`/`::after` CSS rules, flushed into a <style> at root. */\n pseudoRules: string[]\n /** Monotonic counter for unique generated class names. */\n uid: number\n}\n\nexport function createCloneState(total: number): CloneState {\n return { cloned: 0, total: Math.max(1, total), pseudoRules: [], uid: 0 }\n}\n","import type { Context } from '../types'\nimport { copyStyle } from './copy-styles'\nimport { clonePseudoElements } from './pseudo'\nimport { copyInputValue, snapshotCanvas } from './special'\nimport { createCloneState, type CloneState } from './state'\n\nconst SKIP_TAGS = new Set(['SCRIPT', 'NOSCRIPT', 'TEMPLATE'])\nconst PROGRESS_EVERY = 32\n\nconst ELEMENT_NODE = 1\nconst TEXT_NODE = 3\n\nfunction passesFilter(node: Node, context: Context, isRoot: boolean): boolean {\n if (isRoot || !context.options.filter) return true\n if (node.nodeType !== ELEMENT_NODE) return true\n return context.options.filter(node as HTMLElement)\n}\n\nasync function cloneNode(\n node: Node,\n context: Context,\n state: CloneState,\n isRoot: boolean,\n): Promise<Node | null> {\n if (!passesFilter(node, context, isRoot)) return null\n\n if (node.nodeType === TEXT_NODE) {\n return node.cloneNode(false)\n }\n\n if (node.nodeType !== ELEMENT_NODE) return null\n\n const element = node as Element\n if (SKIP_TAGS.has(element.tagName)) return null\n\n await context.scheduler.yieldIfNeeded()\n\n state.cloned++\n if (state.cloned % PROGRESS_EVERY === 0) {\n context.reportPhase('clone', state.cloned / state.total)\n }\n\n // <canvas> content lives outside the DOM tree; snapshot it into an <img>.\n if (element instanceof HTMLCanvasElement) {\n const dataUrl = snapshotCanvas(element)\n if (dataUrl) {\n const image = context.ownerDocument.createElement('img')\n image.src = dataUrl\n copyStyle(element, image, context)\n return image\n }\n }\n\n const clone = element.cloneNode(false) as HTMLElement | SVGElement\n copyStyle(element, clone, context)\n clonePseudoElements(element, clone, state, context)\n copyInputValue(element, clone)\n\n for (const child of Array.from(element.childNodes)) {\n const clonedChild = await cloneNode(child, context, state, false)\n if (clonedChild) clone.appendChild(clonedChild)\n }\n\n return clone\n}\n\n/**\n * Clone an element's subtree into a detached, self-contained copy with inlined\n * styles. The walk yields to the scheduler at every node so a large tree never\n * blocks the main thread. Returns the clone plus any accumulated pseudo-element\n * rules to flush into a root <style>.\n */\nexport async function cloneTree(\n target: HTMLElement,\n context: Context,\n): Promise<{ clone: HTMLElement; pseudoRules: string[] }> {\n const total = target.getElementsByTagName('*').length + 1\n const state = createCloneState(total)\n context.scheduler.reset()\n\n const clone = (await cloneNode(target, context, state, true)) as HTMLElement\n context.reportPhase('clone', 1)\n\n return { clone, pseudoRules: state.pseudoRules }\n}\n","/** Run `worker` over items with at most `limit` in flight at once. */\nexport async function runPool<T>(\n items: readonly T[],\n limit: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return\n let cursor = 0\n const runner = async (): Promise<void> => {\n while (cursor < items.length) {\n const index = cursor++\n await worker(items[index]!, index)\n }\n }\n const size = Math.max(1, Math.min(limit, items.length))\n await Promise.all(Array.from({ length: size }, runner))\n}\n","const URL_RE = /url\\((['\"]?)([^'\")]+)\\1\\)/g\n\n/** Extract every `url(...)` target from a CSS value or rule text. */\nexport function extractUrls(cssText: string): string[] {\n const urls: string[] = []\n let match: RegExpExecArray | null\n URL_RE.lastIndex = 0\n while ((match = URL_RE.exec(cssText)) !== null) {\n const url = match[2]\n if (url && !url.startsWith('data:')) urls.push(url)\n }\n return urls\n}\n\n/** Replace a specific `url(...)` target with a new (already-quoted-safe) value. */\nexport function replaceUrl(\n cssText: string,\n from: string,\n to: string,\n): string {\n return cssText.replace(URL_RE, (whole, _quote: string, url: string) => {\n return url === from ? `url(\"${to}\")` : whole\n })\n}\n\n/** Resolve a possibly-relative URL against a base href. */\nexport function resolveUrl(url: string, baseUrl: string): string {\n if (url.startsWith('data:') || /^[a-z][a-z0-9+.-]*:/i.test(url)) return url\n try {\n return new URL(url, baseUrl).href\n } catch {\n return url\n }\n}\n","/** Read a Blob into a data URL string. */\nexport function blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onloadend = () => resolve(reader.result as string)\n reader.onerror = () => reject(new Error('Failed to read blob.'))\n reader.readAsDataURL(blob)\n })\n}\n\nexport function isDataUrl(url: string): boolean {\n return url.startsWith('data:')\n}\n\nconst DATA_URL_RE = /^data:([^;,]+)?(;base64)?,(.*)$/s\n\n/** Decode a data URL into its MIME type and raw bytes. */\nexport function dataUrlToBytes(dataUrl: string): {\n mime: string\n bytes: Uint8Array\n} {\n const match = DATA_URL_RE.exec(dataUrl)\n if (!match) throw new Error('Invalid data URL.')\n const mime = match[1] ?? 'text/plain'\n const isBase64 = Boolean(match[2])\n const data = match[3] ?? ''\n if (isBase64) {\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i)\n return { mime, bytes }\n }\n const decoded = decodeURIComponent(data)\n const bytes = new Uint8Array(decoded.length)\n for (let i = 0; i < decoded.length; i++) bytes[i] = decoded.charCodeAt(i)\n return { mime, bytes }\n}\n","import { blobToDataUrl, isDataUrl } from '../util/dataurl'\nimport { createAbortError, isAbortError } from '../errors'\nimport type { Context } from '../types'\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(createAbortError())\n return\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort)\n resolve()\n }, ms)\n const onAbort = () => {\n clearTimeout(timer)\n reject(createAbortError())\n }\n signal?.addEventListener('abort', onAbort, { once: true })\n })\n}\n\nasync function mainThreadFetch(url: string, context: Context): Promise<string> {\n const controller = new AbortController()\n const timer = setTimeout(\n () => controller.abort(),\n context.options.fetchTimeoutMs,\n )\n const onParentAbort = () => controller.abort()\n context.signal?.addEventListener('abort', onParentAbort, { once: true })\n try {\n const response = await fetch(url, {\n ...context.options.fetchRequestInit,\n signal: controller.signal,\n })\n if (!response.ok) throw new Error(`HTTP ${response.status}`)\n const blob = await response.blob()\n return await blobToDataUrl(blob)\n } finally {\n clearTimeout(timer)\n context.signal?.removeEventListener('abort', onParentAbort)\n }\n}\n\nasync function workerFetch(url: string, context: Context): Promise<string> {\n const pool = context.workerPool!\n let timer: ReturnType<typeof setTimeout>\n const timeout = new Promise<string>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error('timeout')),\n context.options.fetchTimeoutMs,\n )\n })\n try {\n return await Promise.race([\n pool.fetchAsDataUrl(url, context.options.fetchRequestInit),\n timeout,\n ])\n } finally {\n clearTimeout(timer!)\n }\n}\n\nasync function withRetry(url: string, context: Context): Promise<string> {\n const retries = context.options.fetchRetries\n let lastError: unknown\n for (let attempt = 0; attempt <= retries; attempt++) {\n context.throwIfAborted()\n try {\n return context.workerPool\n ? await workerFetch(url, context)\n : await mainThreadFetch(url, context)\n } catch (error) {\n if (isAbortError(error)) throw error\n lastError = error\n if (attempt < retries) await delay(100 * 2 ** attempt, context.signal)\n }\n }\n throw lastError instanceof Error ? lastError : new Error('Resource fetch failed.')\n}\n\n/**\n * Fetch a URL and resolve it to a data URL, deduped per URL for the capture.\n * Uses the worker pool when available, otherwise the main thread. Applies a\n * timeout and exponential-backoff retries. Rejects on final failure — the caller\n * decides whether to use a placeholder or skip the resource.\n */\nexport function fetchResourceAsDataUrl(\n url: string,\n context: Context,\n): Promise<string> {\n if (isDataUrl(url)) return Promise.resolve(url)\n const cached = context.resourceCache.get(url)\n if (cached) return cached\n const promise = withRetry(url, context)\n context.resourceCache.set(url, promise)\n return promise\n}\n","import { extractUrls, replaceUrl } from '../util/css'\nimport { fetchResourceAsDataUrl } from './fetch'\nimport { isAbortError } from '../errors'\nimport type { Context } from '../types'\n\nconst TRANSPARENT_PIXEL =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='\n\nfunction handleFailure(url: string, error: unknown, context: Context): string {\n if (context.options.onResourceError) {\n context.options.onResourceError(\n url,\n error instanceof Error ? error : new Error(String(error)),\n )\n }\n return context.options.fetchPlaceholder ?? TRANSPARENT_PIXEL\n}\n\n/** Inline an <img>'s source as a data URL so the canvas stays untainted. */\nexport async function embedImageElement(\n image: HTMLImageElement,\n context: Context,\n): Promise<void> {\n const source = image.currentSrc || image.src\n if (!source || source.startsWith('data:')) return\n try {\n image.src = await fetchResourceAsDataUrl(source, context)\n } catch (error) {\n if (isAbortError(error)) throw error\n image.src = handleFailure(source, error, context)\n }\n image.removeAttribute('srcset')\n image.removeAttribute('loading')\n image.removeAttribute('crossorigin')\n}\n\n/** Inline every url() inside an element's (already-computed) background-image. */\nexport async function embedBackground(\n element: HTMLElement | SVGElement,\n context: Context,\n): Promise<void> {\n let value = element.style.backgroundImage\n if (!value || value === 'none' || !value.includes('url(')) return\n\n const urls = extractUrls(value)\n for (const url of urls) {\n try {\n const dataUrl = await fetchResourceAsDataUrl(url, context)\n value = replaceUrl(value, url, dataUrl)\n } catch (error) {\n if (isAbortError(error)) throw error\n value = replaceUrl(value, url, handleFailure(url, error, context))\n }\n }\n element.style.backgroundImage = value\n}\n","import { extractUrls, resolveUrl } from '../util/css'\nimport { runPool } from '../util/concurrency'\nimport { fetchResourceAsDataUrl } from './fetch'\nimport type { Context } from '../types'\n\nconst FONT_FACE_RULE = 5\nconst FONT_FACE_RE = /@font-face\\s*{[^}]*}/gi\nconst URL_FORMAT_RE =\n /url\\((['\"]?)([^'\")]+)\\1\\)\\s*format\\((['\"]?)([^'\")]+)\\3\\)/gi\n\ninterface FontFaceEntry {\n cssText: string\n baseUrl: string\n}\n\nasync function gatherFontFaces(context: Context): Promise<FontFaceEntry[]> {\n const entries: FontFaceEntry[] = []\n const crossOriginHrefs: string[] = []\n\n for (const sheet of Array.from(context.ownerDocument.styleSheets)) {\n const baseUrl = sheet.href ?? context.ownerDocument.baseURI\n let rules: CSSRuleList | null = null\n try {\n rules = sheet.cssRules\n } catch {\n rules = null\n }\n if (rules) {\n for (const rule of Array.from(rules)) {\n if (rule.type === FONT_FACE_RULE) {\n entries.push({ cssText: rule.cssText, baseUrl })\n }\n }\n } else if (sheet.href) {\n crossOriginHrefs.push(sheet.href)\n }\n }\n\n for (const href of crossOriginHrefs) {\n context.throwIfAborted()\n try {\n const response = await fetch(href, context.options.fetchRequestInit)\n if (!response.ok) continue\n const text = await response.text()\n for (const match of text.match(FONT_FACE_RE) ?? []) {\n entries.push({ cssText: match, baseUrl: href })\n }\n } catch {\n /* inaccessible stylesheet — skip */\n }\n }\n\n return entries\n}\n\nfunction pickPreferredUrl(\n cssText: string,\n urls: string[],\n preferWoff2: boolean,\n): string {\n if (preferWoff2) {\n URL_FORMAT_RE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = URL_FORMAT_RE.exec(cssText)) !== null) {\n if (/woff2/i.test(match[4] ?? '')) return match[2]!\n }\n }\n return urls[0]!\n}\n\nasync function embedFontFace(\n entry: FontFaceEntry,\n context: Context,\n): Promise<string> {\n const cached = context.fontCache.get(entry.cssText)\n if (cached !== undefined) return cached\n\n const urls = extractUrls(entry.cssText)\n let css = entry.cssText\n if (urls.length > 0) {\n const chosen = pickPreferredUrl(entry.cssText, urls, context.options.fontsPreferWoff2)\n try {\n const dataUrl = await fetchResourceAsDataUrl(\n resolveUrl(chosen, entry.baseUrl),\n context,\n )\n css = entry.cssText.replace(/src\\s*:[^;]+;?/i, `src:url(\"${dataUrl}\");`)\n } catch {\n /* keep original src — better a missing font than a failed capture */\n }\n }\n\n context.fontCache.set(entry.cssText, css)\n return css\n}\n\n/** Build a combined @font-face stylesheet with embedded (data-URL) sources. */\nexport async function embedWebFonts(context: Context): Promise<string> {\n if (context.options.fontsSkip) return ''\n const faces = await gatherFontFaces(context)\n if (faces.length === 0) return ''\n\n const parts: string[] = []\n await runPool(faces, 4, async (face) => {\n parts.push(await embedFontFace(face, context))\n await context.scheduler.yieldIfNeeded()\n })\n return parts.join('\\n')\n}\n","import { runPool } from '../util/concurrency'\nimport { embedBackground, embedImageElement } from './images'\nimport { embedWebFonts } from './fonts'\nimport type { Context } from '../types'\n\nconst EMBED_CONCURRENCY = 6\n\nfunction hasBackgroundImage(element: HTMLElement | SVGElement): boolean {\n const value = element.style?.backgroundImage\n return Boolean(value) && value !== 'none' && value.includes('url(')\n}\n\n/**\n * Embed every external resource referenced by the clone (image elements + CSS\n * background images) and return a combined @font-face stylesheet. Work runs with\n * bounded concurrency and yields between items so the main thread stays free.\n * Returns the font CSS for the serializer to inject into the root <style>.\n */\nexport async function embedResources(\n clone: HTMLElement,\n context: Context,\n): Promise<string> {\n context.scheduler.reset()\n\n const images = Array.from(clone.querySelectorAll('img')) as HTMLImageElement[]\n if (clone instanceof HTMLImageElement) images.unshift(clone)\n\n const backgrounds = Array.from(\n clone.querySelectorAll<HTMLElement>('*'),\n ).filter(hasBackgroundImage)\n if (hasBackgroundImage(clone)) backgrounds.unshift(clone)\n\n const total = images.length + backgrounds.length\n let done = 0\n const tick = () => {\n done++\n if (total > 0) context.reportPhase('embed', done / total)\n }\n\n const imageTasks = images.map(\n (image) => async () => {\n await embedImageElement(image, context)\n tick()\n await context.scheduler.yieldIfNeeded()\n },\n )\n const backgroundTasks = backgrounds.map(\n (element) => async () => {\n await embedBackground(element, context)\n tick()\n await context.scheduler.yieldIfNeeded()\n },\n )\n\n const tasks = [...imageTasks, ...backgroundTasks]\n // Run fonts in parallel with element/background embedding.\n const [fontCss] = await Promise.all([\n embedWebFonts(context),\n runPool(tasks, EMBED_CONCURRENCY, (task) => task()),\n ])\n\n context.reportPhase('embed', 1)\n return fontCss\n}\n","import type { CropRect } from '../types'\nimport { svgNamespace, xhtmlNamespace } from '../util/ns'\n\nexport interface SerializeParams {\n clone: HTMLElement\n doc: Document\n fullWidth: number\n fullHeight: number\n pseudoRules: string[]\n fontCss: string\n backgroundColor: string | null\n crop: CropRect | null\n}\n\n/**\n * Wrap the embedded clone in an SVG <foreignObject>. The SVG viewport is the\n * output size (crop size when cropping); a negative foreignObject offset shifts\n * the content so the crop region aligns to the origin. Pseudo-element rules and\n * embedded @font-face CSS go into a <style> inside the foreignObject.\n */\nexport function buildSvgString(params: SerializeParams): string {\n const {\n clone,\n doc,\n fullWidth,\n fullHeight,\n pseudoRules,\n fontCss,\n backgroundColor,\n crop,\n } = params\n\n const outW = crop ? crop.width : fullWidth\n const outH = crop ? crop.height : fullHeight\n const svgNs = svgNamespace(doc)\n\n const svg = doc.createElementNS(svgNs, 'svg')\n svg.setAttribute('xmlns', svgNs)\n svg.setAttribute('width', String(outW))\n svg.setAttribute('height', String(outH))\n svg.setAttribute('viewBox', `0 0 ${outW} ${outH}`)\n\n if (backgroundColor) {\n const rect = doc.createElementNS(svgNs, 'rect')\n rect.setAttribute('width', '100%')\n rect.setAttribute('height', '100%')\n rect.setAttribute('fill', backgroundColor)\n svg.appendChild(rect)\n }\n\n const foreignObject = doc.createElementNS(svgNs, 'foreignObject')\n foreignObject.setAttribute('x', String(crop ? -crop.x : 0))\n foreignObject.setAttribute('y', String(crop ? -crop.y : 0))\n foreignObject.setAttribute('width', String(fullWidth))\n foreignObject.setAttribute('height', String(fullHeight))\n\n const container = doc.createElement('div')\n container.setAttribute('xmlns', xhtmlNamespace(doc))\n\n if (fontCss || pseudoRules.length > 0) {\n const style = doc.createElement('style')\n style.textContent = `${fontCss}\\n${pseudoRules.join('')}`\n container.appendChild(style)\n }\n\n clone.style.margin = '0'\n container.appendChild(clone)\n foreignObject.appendChild(container)\n svg.appendChild(foreignObject)\n\n return new XMLSerializer().serializeToString(svg)\n}\n\nexport function svgStringToDataUrl(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n}\n","/** Decode an SVG data URL into a fully-loaded HTMLImageElement. */\nexport async function svgToImage(\n dataUrl: string,\n doc: Document,\n): Promise<HTMLImageElement> {\n const view = doc.defaultView ?? window\n const image = new view.Image()\n image.decoding = 'sync'\n image.src = dataUrl\n\n if (typeof image.decode === 'function') {\n await image.decode()\n return image\n }\n\n await new Promise<void>((resolve, reject) => {\n image.onload = () => resolve()\n image.onerror = () => reject(new Error('Failed to rasterize SVG.'))\n })\n return image\n}\n","import type { Context } from '../types'\n\nexport const DEFAULT_MAX_TILE = 4096\nconst MAX_BAND_BYTES = 2 * 1024 * 1024\n\nexport interface RasterGeometry {\n /** Output size in CSS pixels (matches the SVG viewport / image natural size). */\n outWidth: number\n outHeight: number\n /** Output size in device pixels (CSS * scale), what we actually rasterize to. */\n deviceWidth: number\n deviceHeight: number\n}\n\nexport function createCanvas(\n doc: Document,\n width: number,\n height: number,\n): HTMLCanvasElement {\n const canvas = doc.createElement('canvas')\n canvas.width = width\n canvas.height = height\n return canvas\n}\n\n/** Largest scale that keeps both device dimensions within `maxTile`. */\nexport function clampScale(\n outWidth: number,\n outHeight: number,\n scale: number,\n maxTile: number,\n): number {\n const limit = Math.min(\n maxTile / Math.max(1, outWidth),\n maxTile / Math.max(1, outHeight),\n )\n return Math.min(scale, limit)\n}\n\n/** Single-pass rasterization. Assumes device dims are within the canvas limit. */\nexport function drawSvgToCanvas(\n svgImage: HTMLImageElement,\n deviceWidth: number,\n deviceHeight: number,\n context: Context,\n): HTMLCanvasElement {\n const canvas = createCanvas(context.ownerDocument, deviceWidth, deviceHeight)\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('2D context unavailable.')\n ctx.drawImage(svgImage, 0, 0, deviceWidth, deviceHeight)\n context.reportPhase('rasterize', 1)\n return canvas\n}\n\n/**\n * Yield the image as horizontal RGBA bands, rendering each band in column tiles\n * no larger than `maxTile`. Band height is sized to keep each band buffer under\n * ~32MB, so total memory stays bounded regardless of output size — this is what\n * lets PNG/PDF exceed the browser's single-canvas limit at full resolution.\n */\nexport async function* rgbaBands(\n svgImage: HTMLImageElement,\n geometry: RasterGeometry,\n maxTile: number,\n context: Context,\n): AsyncGenerator<Uint8Array> {\n const { outWidth, outHeight, deviceWidth, deviceHeight } = geometry\n const rx = outWidth / deviceWidth\n const ry = outHeight / deviceHeight\n\n const bandRows = Math.max(\n 1,\n Math.min(maxTile, Math.floor(MAX_BAND_BYTES / (deviceWidth * 4)) || 1),\n )\n\n const tile = createCanvas(\n context.ownerDocument,\n Math.min(maxTile, deviceWidth),\n bandRows,\n )\n const tileCtx = tile.getContext('2d', { willReadFrequently: true })\n if (!tileCtx) throw new Error('2D context unavailable.')\n\n for (let y = 0; y < deviceHeight; y += bandRows) {\n const bandHeight = Math.min(bandRows, deviceHeight - y)\n const band = new Uint8Array(deviceWidth * bandHeight * 4)\n\n for (let x = 0; x < deviceWidth; x += maxTile) {\n const tileWidth = Math.min(maxTile, deviceWidth - x)\n if (tile.width !== tileWidth || tile.height !== bandHeight) {\n tile.width = tileWidth\n tile.height = bandHeight\n }\n tileCtx.clearRect(0, 0, tileWidth, bandHeight)\n tileCtx.drawImage(\n svgImage,\n x * rx,\n y * ry,\n tileWidth * rx,\n bandHeight * ry,\n 0,\n 0,\n tileWidth,\n bandHeight,\n )\n const pixels = tileCtx.getImageData(0, 0, tileWidth, bandHeight).data\n const rowBytes = tileWidth * 4\n for (let row = 0; row < bandHeight; row++) {\n band.set(\n pixels.subarray(row * rowBytes, (row + 1) * rowBytes),\n (row * deviceWidth + x) * 4,\n )\n }\n await context.scheduler.yieldIfNeeded()\n }\n\n context.reportPhase('rasterize', Math.min(1, (y + bandHeight) / deviceHeight))\n yield band\n }\n}\n","function mergeChunks(chunks: Uint8Array[], total: number): Uint8Array {\n const merged = new Uint8Array(total)\n let offset = 0\n for (const part of chunks) {\n merged.set(part, offset)\n offset += part.length\n }\n return merged\n}\n\nexport function supportsCompressionStream(): boolean {\n return typeof CompressionStream !== 'undefined'\n}\n\n/**\n * Deflate a (possibly async) sequence of byte chunks into a single zlib stream\n * using the native CompressionStream. Reading and writing run concurrently so\n * backpressure keeps memory bounded — only the compressed output accumulates.\n */\nexport async function deflate(\n source: AsyncIterable<Uint8Array> | Iterable<Uint8Array>,\n): Promise<Uint8Array> {\n const cs = new CompressionStream('deflate')\n const writer = cs.writable.getWriter()\n\n const pump = (async () => {\n for await (const part of source as AsyncIterable<Uint8Array>) {\n await writer.write(part as BufferSource)\n }\n await writer.close()\n })()\n\n const reader = cs.readable.getReader()\n const chunks: Uint8Array[] = []\n let total = 0\n for (;;) {\n const { value, done } = await reader.read()\n if (done) break\n chunks.push(value)\n total += value.length\n }\n await pump\n return mergeChunks(chunks, total)\n}\n","import { deflate } from '../util/compress'\n\nconst PNG_SIGNATURE = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10])\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256)\n for (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n }\n table[n] = c >>> 0\n }\n return table\n})()\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff\n for (let i = 0; i < bytes.length; i++) {\n crc = CRC_TABLE[(crc ^ bytes[i]!) & 0xff]! ^ (crc >>> 8)\n }\n return (crc ^ 0xffffffff) >>> 0\n}\n\nfunction chunk(type: string, data: Uint8Array): Uint8Array {\n const out = new Uint8Array(12 + data.length)\n const view = new DataView(out.buffer)\n view.setUint32(0, data.length)\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i)\n out.set(data, 8)\n view.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)))\n return out\n}\n\nfunction ihdr(width: number, height: number): Uint8Array {\n const data = new Uint8Array(13)\n const view = new DataView(data.buffer)\n view.setUint32(0, width)\n view.setUint32(4, height)\n data[8] = 8 // bit depth\n data[9] = 6 // color type: RGBA\n return data\n}\n\n/**\n * Encode RGBA bands into a PNG, streaming each band's scanlines (prefixed with a\n * filter-0 byte) through the native deflate so memory stays bounded. Lets the\n * tiler emit images larger than the browser's single-canvas limit.\n */\nexport async function encodePng(\n width: number,\n height: number,\n rgbaBands: AsyncIterable<Uint8Array>,\n): Promise<Blob> {\n const stride = width * 4\n\n async function* framedScanlines(): AsyncGenerator<Uint8Array> {\n for await (const band of rgbaBands) {\n const rows = band.length / stride\n const framed = new Uint8Array(band.length + rows)\n for (let r = 0; r < rows; r++) {\n const dst = r * (stride + 1)\n framed[dst] = 0 // filter: none\n framed.set(band.subarray(r * stride, (r + 1) * stride), dst + 1)\n }\n yield framed\n }\n }\n\n const idat = await deflate(framedScanlines())\n return new Blob(\n [\n PNG_SIGNATURE,\n chunk('IHDR', ihdr(width, height)),\n chunk('IDAT', idat),\n chunk('IEND', new Uint8Array(0)),\n ] as BlobPart[],\n { type: 'image/png' },\n )\n}\n","import { deflate } from '../util/compress'\n\nconst encoder = new TextEncoder()\n\n/** Composite RGBA bands onto white and yield RGB (PDF DeviceRGB has no alpha). */\nasync function* rgbaToRgb(\n bands: AsyncIterable<Uint8Array>,\n): AsyncGenerator<Uint8Array> {\n for await (const rgba of bands) {\n const pixels = rgba.length / 4\n const rgb = new Uint8Array(pixels * 3)\n for (let i = 0, j = 0; i < rgba.length; i += 4, j += 3) {\n const alpha = rgba[i + 3]! / 255\n const inv = 255 * (1 - alpha)\n rgb[j] = Math.round(rgba[i]! * alpha + inv)\n rgb[j + 1] = Math.round(rgba[i + 1]! * alpha + inv)\n rgb[j + 2] = Math.round(rgba[i + 2]! * alpha + inv)\n }\n yield rgb\n }\n}\n\nfunction fmt(n: number): string {\n return (Math.round(n * 1000) / 1000).toString()\n}\n\n/**\n * Build a single-page PDF embedding the rasterized image as a FlateDecode\n * DeviceRGB XObject. Page size is in points (1 CSS px = 0.75pt at 96dpi); the\n * image fills the page, so effective DPI scales with the capture's `scale`.\n */\nexport async function encodePdfFromRgbaBands(\n bands: AsyncIterable<Uint8Array>,\n pixelWidth: number,\n pixelHeight: number,\n pointWidth: number,\n pointHeight: number,\n): Promise<Blob> {\n const imageData = await deflate(rgbaToRgb(bands))\n\n const parts: Uint8Array[] = []\n const offsets: number[] = new Array(6).fill(0)\n let offset = 0\n\n const pushBytes = (bytes: Uint8Array) => {\n parts.push(bytes)\n offset += bytes.length\n }\n const pushText = (text: string) => pushBytes(encoder.encode(text))\n const startObject = (n: number) => {\n offsets[n] = offset\n }\n\n pushText('%PDF-1.4\\n')\n pushBytes(new Uint8Array([0x25, 0xff, 0xff, 0xff, 0xff, 0x0a]))\n\n startObject(1)\n pushText('1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n')\n\n startObject(2)\n pushText('2 0 obj\\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\\nendobj\\n')\n\n startObject(3)\n pushText(\n `3 0 obj\\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${fmt(pointWidth)} ${fmt(\n pointHeight,\n )}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>\\nendobj\\n`,\n )\n\n startObject(4)\n pushText(\n `4 0 obj\\n<< /Type /XObject /Subtype /Image /Width ${pixelWidth} /Height ${pixelHeight} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${imageData.length} >>\\nstream\\n`,\n )\n pushBytes(imageData)\n pushText('\\nendstream\\nendobj\\n')\n\n const content = `q\\n${fmt(pointWidth)} 0 0 ${fmt(pointHeight)} 0 0 cm\\n/Im0 Do\\nQ\\n`\n startObject(5)\n pushText(\n `5 0 obj\\n<< /Length ${content.length} >>\\nstream\\n${content}endstream\\nendobj\\n`,\n )\n\n const xrefOffset = offset\n let xref = `xref\\n0 6\\n0000000000 65535 f \\n`\n for (let i = 1; i < 6; i++) {\n xref += `${String(offsets[i]).padStart(10, '0')} 00000 n \\n`\n }\n pushText(xref)\n pushText(`trailer\\n<< /Size 6 /Root 1 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`)\n\n return new Blob(parts as BlobPart[], { type: 'application/pdf' })\n}\n","import { SmoothScreenshotError } from '../errors'\nimport type { ImageType } from '../types'\n\nconst MIME: Record<ImageType, string> = {\n png: 'image/png',\n jpeg: 'image/jpeg',\n webp: 'image/webp',\n}\n\nexport function mimeFor(type: ImageType): string {\n return MIME[type]\n}\n\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n type: ImageType,\n quality: number,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n try {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob)\n else reject(new SmoothScreenshotError('ENCODE_FAILED', 'toBlob returned null.'))\n },\n MIME[type],\n quality,\n )\n } catch (error) {\n reject(\n new SmoothScreenshotError(\n 'TAINTED_CANVAS',\n 'Canvas is tainted by cross-origin content and cannot be exported.',\n { cause: error },\n ),\n )\n }\n })\n}\n\nexport function canvasToDataUrl(\n canvas: HTMLCanvasElement,\n type: ImageType,\n quality: number,\n): string {\n try {\n return canvas.toDataURL(MIME[type], quality)\n } catch (error) {\n throw new SmoothScreenshotError(\n 'TAINTED_CANVAS',\n 'Canvas is tainted by cross-origin content and cannot be exported.',\n { cause: error },\n )\n }\n}\n\nexport function blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onloadend = () => resolve(reader.result as string)\n reader.onerror = () => reject(new SmoothScreenshotError('ENCODE_FAILED', 'Failed to read blob.'))\n reader.readAsDataURL(blob)\n })\n}\n","import { resolveOptions } from './options'\nimport { createContext } from './context'\nimport { cloneTree } from './clone/clone-node'\nimport { embedResources } from './embed/embed'\nimport { buildSvgString, svgStringToDataUrl } from './serialize/foreign-object-svg'\nimport { svgToImage } from './raster/svg-to-image'\nimport {\n DEFAULT_MAX_TILE,\n clampScale,\n drawSvgToCanvas,\n rgbaBands,\n type RasterGeometry,\n} from './raster/tiler'\nimport { encodePng } from './encode/png-encoder'\nimport { encodePdfFromRgbaBands } from './encode/pdf'\nimport { canvasToBlob, canvasToDataUrl } from './encode/image'\nimport { supportsCompressionStream } from './util/compress'\nimport { SmoothScreenshotError } from './errors'\nimport type { Context, ImageType, Options } from './types'\n\nconst CSS_PX_TO_PT = 0.75\n\ninterface Prepared {\n svgString: string\n fullWidth: number\n fullHeight: number\n outWidth: number\n outHeight: number\n}\n\nfunction assertElement(target: unknown): asserts target is HTMLElement {\n if (\n !target ||\n typeof (target as HTMLElement).getBoundingClientRect !== 'function' ||\n !(target as HTMLElement).ownerDocument\n ) {\n throw new SmoothScreenshotError(\n 'INVALID_TARGET',\n 'Capture target must be an HTMLElement attached to a document.',\n )\n }\n}\n\nasync function prepare(\n target: HTMLElement,\n context: Context,\n backgroundColor: string | null,\n): Promise<Prepared> {\n context.throwIfAborted()\n\n const rect = target.getBoundingClientRect()\n const fullWidth = context.options.width ?? rect.width\n const fullHeight = context.options.height ?? rect.height\n if (fullWidth <= 0 || fullHeight <= 0) {\n throw new SmoothScreenshotError(\n 'EMPTY_TARGET',\n 'Capture target has no rendered size.',\n )\n }\n\n const crop = context.options.crop\n const outWidth = crop ? crop.width : fullWidth\n const outHeight = crop ? crop.height : fullHeight\n\n const { clone, pseudoRules } = await cloneTree(target, context)\n\n if (context.options.style) {\n for (const [key, value] of Object.entries(context.options.style)) {\n clone.style.setProperty(key, value)\n }\n }\n\n const fontCss = await embedResources(clone, context)\n\n const svgString = buildSvgString({\n clone,\n doc: context.ownerDocument,\n fullWidth,\n fullHeight,\n pseudoRules,\n fontCss,\n backgroundColor,\n crop,\n })\n\n return { svgString, fullWidth, fullHeight, outWidth, outHeight }\n}\n\nfunction withContext<T>(\n target: HTMLElement,\n options: Options,\n backgroundColor: string | null,\n run: (context: Context, prepared: Prepared) => Promise<T>,\n): Promise<T> {\n assertElement(target)\n const ownerWindow = (target.ownerDocument.defaultView ?? window) as Window &\n typeof globalThis\n const context = createContext(target, resolveOptions(options, ownerWindow))\n return prepare(target, context, backgroundColor)\n .then((prepared) => run(context, prepared))\n .finally(() => context.destroy())\n}\n\nfunction geometry(prepared: Prepared, scale: number): RasterGeometry {\n return {\n outWidth: prepared.outWidth,\n outHeight: prepared.outHeight,\n deviceWidth: Math.max(1, Math.round(prepared.outWidth * scale)),\n deviceHeight: Math.max(1, Math.round(prepared.outHeight * scale)),\n }\n}\n\nexport function captureSvg(target: HTMLElement, options: Options = {}): Promise<string> {\n return withContext(target, options, options.backgroundColor ?? null, async (context, prepared) => {\n context.reportPhase('rasterize', 1)\n context.reportPhase('encode', 1)\n return svgStringToDataUrl(prepared.svgString)\n })\n}\n\nasync function renderClampedCanvas(\n context: Context,\n prepared: Prepared,\n): Promise<HTMLCanvasElement> {\n const maxTile = context.options.maxTileSize || DEFAULT_MAX_TILE\n const scale = clampScale(\n prepared.outWidth,\n prepared.outHeight,\n context.options.scale,\n maxTile,\n )\n const geo = geometry(prepared, scale)\n const svgImage = await svgToImage(\n svgStringToDataUrl(prepared.svgString),\n context.ownerDocument,\n )\n return drawSvgToCanvas(svgImage, geo.deviceWidth, geo.deviceHeight, context)\n}\n\nexport function captureCanvas(\n target: HTMLElement,\n options: Options = {},\n): Promise<HTMLCanvasElement> {\n return withContext(target, options, options.backgroundColor ?? null, (context, prepared) =>\n renderClampedCanvas(context, prepared),\n )\n}\n\nasync function encodeImage(\n context: Context,\n prepared: Prepared,\n type: ImageType,\n toResult: (canvas: HTMLCanvasElement) => Promise<string | Blob> | string,\n toPngBeyondCap: (blob: Blob) => Promise<string | Blob> | string | Blob,\n): Promise<string | Blob> {\n const maxTile = context.options.maxTileSize || DEFAULT_MAX_TILE\n const fullGeo = geometry(prepared, context.options.scale)\n const exceeds =\n fullGeo.deviceWidth > maxTile || fullGeo.deviceHeight > maxTile\n\n const svgImage = await svgToImage(\n svgStringToDataUrl(prepared.svgString),\n context.ownerDocument,\n )\n\n if (type === 'png' && exceeds && supportsCompressionStream()) {\n const blob = await encodePng(\n fullGeo.deviceWidth,\n fullGeo.deviceHeight,\n rgbaBands(svgImage, fullGeo, maxTile, context),\n )\n context.reportPhase('encode', 1)\n return toPngBeyondCap(blob)\n }\n\n let geo = fullGeo\n if (exceeds) {\n const scale = clampScale(\n prepared.outWidth,\n prepared.outHeight,\n context.options.scale,\n maxTile,\n )\n geo = geometry(prepared, scale)\n }\n\n const canvas = drawSvgToCanvas(svgImage, geo.deviceWidth, geo.deviceHeight, context)\n const result = await toResult(canvas)\n context.reportPhase('encode', 1)\n return result\n}\n\nexport function captureImageDataUrl(\n target: HTMLElement,\n options: Options,\n type: ImageType,\n): Promise<string> {\n const backgroundColor =\n options.backgroundColor ?? (type === 'jpeg' ? '#ffffff' : null)\n return withContext(target, options, backgroundColor, (context, prepared) =>\n encodeImage(\n context,\n prepared,\n type,\n (canvas) => canvasToDataUrl(canvas, type, context.options.quality),\n (blob) =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onloadend = () => resolve(reader.result as string)\n reader.onerror = () => reject(new Error('Failed to read PNG blob.'))\n reader.readAsDataURL(blob)\n }),\n ),\n ) as Promise<string>\n}\n\nexport function captureImageBlob(\n target: HTMLElement,\n options: Options,\n type: ImageType,\n): Promise<Blob> {\n const backgroundColor =\n options.backgroundColor ?? (type === 'jpeg' ? '#ffffff' : null)\n return withContext(target, options, backgroundColor, (context, prepared) =>\n encodeImage(\n context,\n prepared,\n type,\n (canvas) => canvasToBlob(canvas, type, context.options.quality),\n (blob) => blob,\n ),\n ) as Promise<Blob>\n}\n\nexport function capturePdf(target: HTMLElement, options: Options = {}): Promise<Blob> {\n if (!supportsCompressionStream()) {\n return Promise.reject(\n new SmoothScreenshotError(\n 'ENCODE_FAILED',\n 'PDF export requires CompressionStream (Chrome 80+, Firefox 113+, Safari 16.4+).',\n ),\n )\n }\n const backgroundColor = options.backgroundColor ?? '#ffffff'\n return withContext(target, options, backgroundColor, async (context, prepared) => {\n const maxTile = context.options.maxTileSize || DEFAULT_MAX_TILE\n const geo = geometry(prepared, context.options.scale)\n const svgImage = await svgToImage(\n svgStringToDataUrl(prepared.svgString),\n context.ownerDocument,\n )\n const blob = await encodePdfFromRgbaBands(\n rgbaBands(svgImage, geo, maxTile, context),\n geo.deviceWidth,\n geo.deviceHeight,\n prepared.outWidth * CSS_PX_TO_PT,\n prepared.outHeight * CSS_PX_TO_PT,\n )\n context.reportPhase('encode', 1)\n return blob\n })\n}\n","import {\n captureCanvas,\n captureImageBlob,\n captureImageDataUrl,\n capturePdf,\n captureSvg,\n} from './capture'\nimport type { Options } from './types'\n\n/** Capture an element as a PNG data URL. */\nexport function toPng(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureImageDataUrl(target, options, 'png')\n}\n\n/** Capture an element as a JPEG data URL (opaque; defaults to a white background). */\nexport function toJpeg(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureImageDataUrl(target, options, 'jpeg')\n}\n\n/** Capture an element as a WebP data URL. */\nexport function toWebp(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureImageDataUrl(target, options, 'webp')\n}\n\n/** Capture an element as an SVG data URL (no rasterization). */\nexport function toSvg(target: HTMLElement, options: Options = {}): Promise<string> {\n return captureSvg(target, options)\n}\n\n/** Capture an element to a canvas. Output is clamped to the canvas size limit. */\nexport function toCanvas(\n target: HTMLElement,\n options: Options = {},\n): Promise<HTMLCanvasElement> {\n return captureCanvas(target, options)\n}\n\n/** Capture an element as a single-page PDF (raster image embedded). */\nexport function toPdf(target: HTMLElement, options: Options = {}): Promise<Blob> {\n return capturePdf(target, options)\n}\n\n/** Capture an element as a Blob in the format given by `options.type` (default png). */\nexport function toBlob(target: HTMLElement, options: Options = {}): Promise<Blob> {\n return captureImageBlob(target, options, options.type ?? 'png')\n}\n"]}