@zumer/snapdom 1.9.13 → 2.0.0-dev.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zumer/snapdom",
3
- "version": "1.9.13",
3
+ "version": "2.0.0-dev.0",
4
4
  "description": "snapDOM captures HTML elements to images with exceptional speed and accuracy.",
5
5
  "main": "dist/snapdom.js",
6
6
  "module": "dist/snapdom.mjs",
@@ -1,265 +1,358 @@
1
1
  /**
2
2
  * snapDOM – ultra-fast DOM-to-image capture
3
- * TypeScript definitions (v1.9.10-dev.2)
3
+ * TypeScript definitions (v1.9.14)
4
4
  *
5
5
  * Notes:
6
6
  * - Style compression is internal (no public option).
7
7
  * - Icon fonts are always embedded; `embedFonts` controls non-icon fonts only.
8
+ * - This file preserves backward compatibility with earlier 1.9.x defs.
8
9
  */
9
10
 
11
+ /* =========================
12
+ * Basic MIME / type aliases
13
+ * ========================= */
14
+
10
15
  export type RasterMime = "png" | "jpg" | "jpeg" | "webp";
11
16
  export type BlobType = "svg" | RasterMime;
12
17
 
13
18
  export type IconFontMatcher = string | RegExp;
14
19
  export type CachePolicy = "disabled" | "full" | "auto" | "soft";
15
20
 
16
- export type ExcludeMode = 'hide' | 'remove';
17
- export type FilterMode = 'hide' | 'remove';
21
+ /* =========================
22
+ * Font & proxy declarations
23
+ * ========================= */
18
24
 
19
- export interface LocalFontDescriptor {
20
- /** CSS font-family name (e.g. "Inter"). */
25
+ export interface LocalFont {
21
26
  family: string;
22
- /** URL to the font source (woff2/woff/ttf). Data URLs allowed. */
23
- src: string;
24
- /** CSS font-weight value (e.g. 400, "bold"). */
27
+ src: string; // URL or data: URL
25
28
  weight?: string | number;
26
- /** CSS font-style value (e.g. "normal", "italic"). */
27
29
  style?: string;
28
- /** CSS font-stretch as percentage (e.g. 100 for normal). */
29
- stretchPct?: number;
30
30
  }
31
31
 
32
- export interface CaptureOptions {
33
- /**
34
- * Enable additional internal logs.
35
- * Default: false
36
- */
37
- debug?: boolean;
32
+ export interface ExcludeFonts {
33
+ /** Case-insensitive family names to skip (non-icon only). */
34
+ families?: string[];
35
+ /** Host substrings to skip (e.g., "fonts.gstatic.com"). */
36
+ domains?: string[];
37
+ /** Unicode-range subset tags to skip (e.g., "cyrillic-ext"). */
38
+ subsets?: string[];
39
+ }
38
40
 
39
- /**
40
- * Skip small idle delays for faster overall capture.
41
- * Default: true
42
- */
43
- fast?: boolean;
41
+ /* =========================
42
+ * Capture options
43
+ * ========================= */
44
44
 
45
- /**
46
- * Output scale multiplier. If set, takes precedence over width/height.
47
- * Default: 1
48
- */
45
+ export interface SnapdomOptions {
46
+ /** Fast path: skip small idle delays where safe. */
47
+ fast?: boolean;
48
+ /** Output scale multiplier. Takes precedence over width/height. */
49
49
  scale?: number;
50
-
51
- /**
52
- * Device pixel ratio to use for raster exports.
53
- * Default: `window.devicePixelRatio` at capture time.
54
- */
50
+ /** Device pixel ratio to use for rasterization (defaults to `devicePixelRatio`). */
55
51
  dpr?: number;
56
-
57
- /** Target width for the exported image. Ignored if `scale` is provided. */
52
+ /** Target width of the export (keeps aspect if only one dimension is provided). */
58
53
  width?: number;
59
-
60
- /** Target height for the exported image. Ignored if `scale` is provided. */
54
+ /** Target height of the export (keeps aspect if only one dimension is provided). */
61
55
  height?: number;
62
56
 
63
- /**
64
- * Fallback color for lossy raster formats (JPG/WebP have no alpha).
65
- * Default: "#ffffff" for JPG/JPEG/WebP, `null` otherwise.
66
- */
67
- backgroundColor?: string | null;
68
-
69
- /**
70
- * Quality for JPG/WebP (0..1).
71
- * Default: 0.92
72
- */
57
+ /** Background fallback color (used esp. for JPEG). Default "#fff". */
58
+ backgroundColor?: string;
59
+ /** Quality for JPEG/WebP (0..1). Default 1. */
73
60
  quality?: number;
74
61
 
75
- /**
76
- * Proxy base URL used as a fallback for CORS-restricted images/fonts.
77
- * Example: "https://corsproxy.io/?url="
78
- */
62
+ /** Cross-origin proxy prefix (used as a fallback when CORS blocks). */
79
63
  useProxy?: string;
80
64
 
81
- /** Preferred Blob type for `toBlob`. Default: "svg". */
65
+ /** Default Blob type for toBlob() when unspecified. */
82
66
  type?: BlobType;
83
67
 
84
- /**
85
- * Preferred export format used by convenience methods / download.
86
- * Default: "png"
87
- */
88
- format?: BlobType;
89
-
90
- /** CSS selectors removed from the cloned subtree before processing. */
68
+ /** CSS selector list to filter nodes. */
91
69
  exclude?: string[];
70
+ /** How to apply `exclude` ("hide" keeps layout via visibility:hidden; "remove" drops nodes). Default "hide". */
71
+ excludeMode?: "hide" | "remove";
92
72
 
93
73
  /**
94
- * Mode applied to excluded nodes of the cloned tree.
95
- * Default: "hide"
96
- */
97
- excludeMode?: ExcludeMode;
98
-
99
- /**
100
- * Advanced node filter; return false to exclude a node during traversal.
101
- * Applied to the cloned subtree.
74
+ * Custom predicate: return true to keep node, false to exclude.
75
+ * Runs in document order; pairs with `filterMode`.
102
76
  */
103
77
  filter?: (el: Element) => boolean;
78
+ /** How to apply `filter` ("hide" or "remove"). Default "hide". */
79
+ filterMode?: "hide" | "remove";
104
80
 
81
+ /** Straighten the root: remove translate/rotate, keep scale/skew. */
82
+ straighten?: boolean;
105
83
  /**
106
- * Mode applied to filtered nodes of the cloned tree.
107
- * Default: "hide"
108
- */
109
- filterMode?: FilterMode;
110
-
111
- /**
112
- * Whether to synthesize placeholders for broken images, etc.
113
- * Default: true
84
+ * Do not expand root bbox for shadows/blur/outline; also strip shadows/outline
85
+ * from the cloned root to get a tight capture box.
114
86
  */
115
- placeholders?: boolean;
87
+ noShadows?: boolean;
116
88
 
117
- /**
118
- * Inline non-icon fonts used within the captured subtree.
119
- * Icon fonts are always embedded.
120
- * Default: false
121
- */
89
+ /** Inline non-icon fonts actually used within the subtree. */
122
90
  embedFonts?: boolean;
123
-
124
- /**
125
- * Additional local fonts to be considered during embedding.
126
- */
127
- localFonts?: LocalFontDescriptor[];
128
-
129
- /**
130
- * Extra icon font family matchers (by name or regex).
131
- */
91
+ /** Provide fonts explicitly to avoid remote discovery. */
92
+ localFonts?: LocalFont[];
93
+ /** Additional matchers for icon font families (strings or regex). */
132
94
  iconFonts?: IconFontMatcher | IconFontMatcher[];
95
+ /** Skip specific non-icon fonts (by family/domain/subset). */
96
+ excludeFonts?: ExcludeFonts;
133
97
 
134
98
  /**
135
- * Font family matchers to explicitly exclude from embedding.
136
- */
137
- excludeFonts?: IconFontMatcher[];
138
-
139
- /**
140
- * Fallback image source when an <img> fails to load.
141
- * - String: use as-is.
142
- * - Callback: receives measured width/height and original src, returns a URL string.
99
+ * Fallback image when <img> fails to load.
100
+ * Can be a fixed URL or a callback that receives measured dimensions.
143
101
  */
144
102
  fallbackURL?:
145
103
  | string
146
- | ((
147
- args: {
148
- width?: number;
149
- height?: number;
150
- src?: string;
151
- element: HTMLImageElement;
152
- }
153
- ) => string | Promise<string>);
104
+ | ((dims: { width?: number; height?: number }) => string);
154
105
 
155
- /**
156
- * Cache policy applied at capture start.
157
- * Default: "soft"
158
- */
106
+ /** Cache policy for resources and style maps. Default "soft". */
159
107
  cache?: CachePolicy;
160
108
 
161
- /**
162
- * Base filename used by `download`.
163
- * Default: "snapDOM"
164
- */
165
- filename?: string;
109
+ /** Show placeholders when resources are missing. Default true. */
110
+ placeholders?: boolean;
111
+
112
+ /** Arbitrary plugin configuration at call-site (see PluginUse). */
113
+ plugins?: PluginUse[];
114
+ }
115
+
116
+ /* =========================
117
+ * Capture context (hook state)
118
+ * ========================= */
119
+
120
+ export interface CaptureContext extends SnapdomOptions {
121
+ /** Input element being captured. */
122
+ element: Element;
123
+
124
+ /** Cloned root (detached), available after `beforeClone`/`afterClone`. */
125
+ clone?: HTMLElement | SVGElement | null;
126
+
127
+ /** Internal style/class caches (opaque to user). */
128
+ classCSS?: string;
129
+ styleCache?: unknown;
130
+ fontsCSS?: string;
131
+ baseCSS?: string;
132
+
133
+ /** Serialized artifacts, available after render. */
134
+ svgString?: string;
135
+ dataURL?: string;
136
+
137
+ /** Current export info during beforeExport/afterExport. */
138
+ export?: {
139
+ /** Export key (e.g., "png", "jpeg", "svg", or any custom key). */
140
+ type: string;
141
+ /** Options passed to the exporter. */
142
+ options?: any;
143
+ /** Canonical SVG data URL of this capture. */
144
+ url: string;
145
+ };
146
+ }
147
+
148
+ /* =========================
149
+ * Exporter signatures
150
+ * ========================= */
151
+
152
+ export type Exporter = (ctx: CaptureContext, opts?: any) => Promise<any>;
153
+
154
+ /** Map returned by `defineExports`: keys are exposed on the result (e.g., `pdf` → `result.toPdf()` as well as `result['pdf']()`). */
155
+ export type ExportMap = Record<string, Exporter>;
156
+
157
+ /* =========================
158
+ * Plugin system
159
+ * ========================= */
160
+
161
+ export interface SnapdomPlugin {
162
+ /** Unique name for de-dupe/overrides. */
163
+ name: string;
166
164
 
165
+ /** Hook order follows registration order. All hooks may be async. */
166
+ beforeSnap?(context: CaptureContext): void | Promise<void>;
167
+ beforeClone?(context: CaptureContext): void | Promise<void>;
168
+ afterClone?(context: CaptureContext): void | Promise<void>;
169
+ beforeRender?(context: CaptureContext): void | Promise<void>;
170
+ afterRender?(context: CaptureContext): void | Promise<void>;
171
+
172
+ /** Runs before EACH export. */
173
+ beforeExport?(context: CaptureContext): void | Promise<void>;
167
174
  /**
168
- * Normalize only translate*rotate* on the cloned root (keeps scale/skew intact).
169
- * Children are not modified.
170
- * Default: false
175
+ * Runs after EACH export; returning a value will be chained to the next plugin
176
+ * (transform pipeline). If undefined is returned, the prior result is preserved.
171
177
  */
172
- straighten?: boolean;
178
+ afterExport?(context: CaptureContext, result: any): any | Promise<any>;
173
179
 
174
180
  /**
175
- * Do not expand the root viewBox for shadows/blur/outline/drop-shadow.
176
- * Children are not modified. The root may also have those visuals cleared to avoid clipping.
177
- * Default: false
181
+ * Provide custom exporters (e.g., { pdf: async (ctx, opts) => Blob }).
182
+ * Keys are exposed on the capture result as helpers (toPdf()) and as index access (result['pdf']()).
178
183
  */
179
- noShadows?: boolean;
184
+ defineExports?(context: CaptureContext): ExportMap | Promise<ExportMap>;
185
+
186
+ /** Runs ONCE after the FIRST successful export of this capture (good for cleanup). */
187
+ afterSnap?(context: CaptureContext): void | Promise<void>;
180
188
  }
181
189
 
190
+ export type PluginFactory = (options?: any) => SnapdomPlugin;
191
+ /** You can pass a plugin instance, a factory, or a tuple with options. */
192
+ export type PluginUse =
193
+ | SnapdomPlugin
194
+ | PluginFactory
195
+ | [PluginFactory, any]
196
+ | { plugin: PluginFactory; options?: any };
182
197
 
183
- export interface BlobOptions {
184
- /** Blob type to export. Default: "svg". */
198
+ /* =========================
199
+ * Capture result API
200
+ * ========================= */
201
+
202
+ export interface DownloadOptions {
203
+ filename?: string;
204
+ /** Override default blob type for this download. */
185
205
  type?: BlobType;
186
- /** JPG/WebP quality (0..1). */
206
+ /** Quality hint for raster formats. */
187
207
  quality?: number;
188
- /** Background override for lossy formats. */
189
- backgroundColor?: string | null;
208
+ /** Target width/height for this export. */
209
+ width?: number;
210
+ height?: number;
190
211
  }
191
212
 
192
- export interface DownloadOptions {
193
- /** File format. Default: "png". */
194
- format?: "svg" | RasterMime;
195
- /** Base filename without extension. Default: "snapDOM". */
196
- filename?: string;
197
- /** Background override for lossy formats. */
198
- backgroundColor?: string | null;
199
- /** JPG/WebP quality (0..1). Default: 0.92. */
213
+ export interface BlobOptions {
214
+ type?: BlobType;
200
215
  quality?: number;
216
+ width?: number;
217
+ height?: number;
201
218
  }
202
219
 
203
220
  export interface CaptureResult {
204
- /** SVG data URL representing the captured element. */
221
+ /** Canonical data URL of the SVG snapshot (when available). */
205
222
  url: string;
206
- /** Returns the same SVG data URL string. */
207
- toRaw(): string;
208
- /** Creates an HTMLImageElement from the SVG (accepts options). */
209
- toImg(options?: CaptureOptions): Promise<HTMLImageElement>;
210
- /** Creates an HTMLImageElement from the SVG (accepts options). */
211
- toSvg(options?: CaptureOptions): Promise<HTMLImageElement>;
212
- /** Renders into a Canvas element (accepts options). */
213
- toCanvas(options?: CaptureOptions): Promise<HTMLCanvasElement>;
214
- /** Exports to a Blob (SVG/PNG/JPG/WebP). */
215
- toBlob(options?: CaptureOptions & BlobOptions): Promise<Blob>;
216
- /** Convenience PNG export (returns an <img>). */
217
- toPng(options?: CaptureOptions): Promise<HTMLImageElement>;
218
- /** Convenience JPG export (returns an <img>). */
219
- toJpg(options?: CaptureOptions): Promise<HTMLImageElement>;
220
- /** Convenience WebP export (returns an <img>). */
221
- toWebp(options?: CaptureOptions): Promise<HTMLImageElement>;
222
- /** Triggers a file download. */
223
- download(options?: CaptureOptions & DownloadOptions): Promise<void>;
223
+
224
+ /**
225
+ * @deprecated Use `toSvg()` for an <img> that renders the SVG snapshot.
226
+ * Historical alias kept for compatibility.
227
+ */
228
+ toImg(): Promise<HTMLImageElement>;
229
+
230
+ /** Returns an HTMLImageElement that renders the SVG snapshot. */
231
+ toSvg(options?: Partial<SnapdomOptions>): Promise<HTMLImageElement>;
232
+
233
+ /** Returns a Canvas with the rasterized snapshot. */
234
+ toCanvas(options?: Partial<SnapdomOptions>): Promise<HTMLCanvasElement>;
235
+
236
+ /** Returns a Blob of the chosen type (svg/png/jpeg/webp). */
237
+ toBlob(options?: BlobOptions & Partial<SnapdomOptions>): Promise<Blob>;
238
+
239
+ /** Convenience raster exports returning an HTMLImageElement. */
240
+ toPng(options?: Partial<SnapdomOptions>): Promise<HTMLImageElement>;
241
+ toJpeg(options?: Partial<SnapdomOptions>): Promise<HTMLImageElement>;
242
+ /** Alias for `toJpeg()`. */
243
+ toJpg(options?: Partial<SnapdomOptions>): Promise<HTMLImageElement>;
244
+ toWebp(options?: Partial<SnapdomOptions>): Promise<HTMLImageElement>;
245
+
246
+ /** Trigger a client-side download of the snapshot using current/default settings. */
247
+ download(options?: DownloadOptions & Partial<SnapdomOptions>): Promise<void>;
248
+
249
+ /**
250
+ * Custom exporters exposed by plugins:
251
+ * - As helpers: a plugin returning { pdf: (...) => ... } also enables result.toPdf(...)
252
+ * - As index access: result["pdf"](...)
253
+ *
254
+ * Since keys are not known ahead of time, we allow index access.
255
+ */
256
+ [key: string]: any;
224
257
  }
225
258
 
259
+ /* =========================
260
+ * Main callable & static helpers
261
+ * ========================= */
262
+
263
+ /** Overload: main callable returns a reusable exporter object for the element. */
264
+ export declare function snapdom(
265
+ element: Element,
266
+ options?: SnapdomOptions
267
+ ): Promise<CaptureResult>;
268
+
226
269
  /**
227
- * Capture an element and return reusable export helpers.
270
+ * Global plugin registration (chainable).
271
+ * - De-duplicates by `name`.
272
+ * - Execution order = registration order.
273
+ * - Per-capture plugins run before globals and override by `name`.
228
274
  */
229
- export declare function snapdom(el: Element, options?: CaptureOptions): Promise<CaptureResult>;
230
-
231
275
  export declare namespace snapdom {
232
- function toImg(el: Element, options?: CaptureOptions): Promise<HTMLImageElement>;
233
- function toSvg(el: Element, options?: CaptureOptions): Promise<HTMLImageElement>;
234
- function toCanvas(el: Element, options?: CaptureOptions): Promise<HTMLCanvasElement>;
235
- function toBlob(el: Element, options?: CaptureOptions & BlobOptions): Promise<Blob>;
236
- function toPng(el: Element, options?: CaptureOptions): Promise<HTMLImageElement>;
237
- function toJpg(el: Element, options?: CaptureOptions): Promise<HTMLImageElement>;
238
- function toWebp(el: Element, options?: CaptureOptions): Promise<HTMLImageElement>;
239
- function download(el: Element, options?: CaptureOptions & DownloadOptions): Promise<void>;
276
+ function plugins(...defs: PluginUse[]): typeof snapdom;
277
+
278
+ /** Shortcut helpers that run a one-off capture+export. */
279
+
280
+ /** @deprecated Returns an SVG <img>; prefer `toSvg`. */
281
+ function toImg(
282
+ element: Element,
283
+ options?: SnapdomOptions
284
+ ): Promise<HTMLImageElement>;
285
+
286
+ function toSvg(
287
+ element: Element,
288
+ options?: SnapdomOptions
289
+ ): Promise<HTMLImageElement>;
290
+
291
+ function toCanvas(
292
+ element: Element,
293
+ options?: SnapdomOptions
294
+ ): Promise<HTMLCanvasElement>;
295
+
296
+ function toBlob(
297
+ element: Element,
298
+ options?: SnapdomOptions & BlobOptions
299
+ ): Promise<Blob>;
300
+
301
+ function toPng(
302
+ element: Element,
303
+ options?: SnapdomOptions
304
+ ): Promise<HTMLImageElement>;
305
+
306
+ function toJpeg(
307
+ element: Element,
308
+ options?: SnapdomOptions
309
+ ): Promise<HTMLImageElement>;
310
+
311
+ /** Alias for `toJpeg`. */
312
+ function toJpg(
313
+ element: Element,
314
+ options?: SnapdomOptions
315
+ ): Promise<HTMLImageElement>;
316
+
317
+ function toWebp(
318
+ element: Element,
319
+ options?: SnapdomOptions
320
+ ): Promise<HTMLImageElement>;
321
+
322
+ function download(
323
+ element: Element,
324
+ options?: SnapdomOptions & DownloadOptions
325
+ ): Promise<void>;
240
326
  }
241
327
 
242
- /**
243
- * Preload resources (images/fonts) to avoid first-capture stalls.
244
- */
328
+ /* =========================
329
+ * preCache helper
330
+ * ========================= */
331
+
245
332
  export interface PreCacheOptions {
246
- /** Inline non-icon fonts during preload. Default: true. */
333
+ /** Root to scan (defaults to `document`). */
334
+ root?: Element | Document;
335
+ /** Try to embed non-icon fonts used under root (see also localFonts). */
247
336
  embedFonts?: boolean;
248
- /** Additional local fonts. */
249
- localFonts?: LocalFontDescriptor[];
250
- /** Proxy for CORS fallbacks. */
337
+ /** Provide fonts explicitly to avoid remote discovery. */
338
+ localFonts?: LocalFont[];
339
+ /** Additional matchers for icon fonts (strings or regex). */
340
+ iconFonts?: IconFontMatcher | IconFontMatcher[];
341
+ /** Cross-origin proxy prefix (as in SnapdomOptions.useProxy). */
251
342
  useProxy?: string;
252
- /** Font family matchers to explicitly exclude from embedding. */
253
- excludeFonts?: IconFontMatcher[];
343
+ /** Cache policy for this preload operation. */
344
+ cache?: CachePolicy;
345
+
346
+ /** Back-compat fields (no-ops if present) */
254
347
  /**
255
- * Cache policy used during precache.
256
- * Note: for `preCache` the option name in runtime is `cacheOpt`.
348
+ * @deprecated Use `cache` instead.
257
349
  */
258
350
  cacheOpt?: CachePolicy;
259
351
  }
260
352
 
261
353
  /**
262
- * Preload resources rooted at `root` (defaults to `document`).
354
+ * Preload external resources for a subtree to avoid first-capture stalls.
355
+ * Uses the same discovery heuristics as the main capture path.
263
356
  */
264
357
  export declare function preCache(
265
358
  root?: Element | Document,