Skip to content

Latest commit

 

History

History
1035 lines (778 loc) · 94 KB

File metadata and controls

1035 lines (778 loc) · 94 KB

Changelog

All notable changes to this project will be documented in this file.

10 September 2026

  • fix: three layout misalignments in pseudo boxes, scroll containers and images #498
  • fix(pseudo): skip non-generated pseudo-elements #497
  • fix(pseudo): preserve font style for icon glyphs #496

9 September 2026

  • fix: make DOM type checks realm-agnostic (ref #494) 84359e5
  • fix(color-tint): accept clone roots from another realm (ref #494) ed8c31a
  • chore(plugins): bump to 2.2.2 93a8e60

8 September 2026

  • exposed internal visual demos for SnapDOM testing and add new tests 5766151
  • fix: stop discarding a whole stylesheet when one family looks like an icon font a154f18
  • docs: acknowledge open-source program support 5b30335

30 August 2026

  • fix: fractional with. Ref #491 cffd222
  • fix: update network gate logic to manage lane budget and improve test reliability 8ae2371
  • fix(clone): drop light DOM that no slot accepted b75e88b

28 August 2026

  • Split visual demo suite into 6 shards and gate network-bound demos 56b1e01
  • Fix legacy bundle global leakage. Ref #490 80fe19d

25 August 2026

  • fix: transformed reconciliation. Ref #489 9b28ab4
  • fix: offscreen captures. Ref #488 460b75e
  • fix(iframe): stop suggesting an option that is already on 98de375
  • add funding e839ec0

21 August 2026

  • fix: measure text truncation without replacing live text nodes (Ref #485) 418d18f
  • fix: bound the canvas frame wait, warn on an empty canvas (Ref #486) de521b8
  • fix: let <use> icons inherit fill from the use site (Ref #487) 1b6cd96

18 August 2026

  • fix: keep an author-specified width on blockified spans (Ref #484) f3c75d3
  • fix: neutralize CSS zoom on the capture root (Ref #483) 14b2047

10 August 2026

  • fix: stripe height df94e3e
  • feat(plugins): expose capture geometry, exact export options and canvas cropping 7abb29a
  • fix(styles): reproduce visibility and content-visibility the way browsers do 21251f7
  • update 1c8e12f
  • fix(fonts): emit only the @font-face descriptors the source declared 8d0345a
  • fix(clone): keep the pre-toDataURL frame for WebGL canvases 1c44d1d
  • test: pin devicePixelRatio in DPR-dependent tests fb7311a
  • fix(clone): clone slotted light DOM only once f4b1859
  • chore: bump version to 2.24.0 4a2ced5

4 August 2026

  • fix(fonts): keep a custom @font-face when the page asks for a far weight/stretch #478

27 July 2026

  • perf: probe ink first in Safari's waitForImgPaint instead of a blind two-frame wait 50ea4eb
  • fix: rAF timeout fallback so Safari captures don't hang in occluded windows 104cb06

27 July 2026

⚡ perf

  • perf: replace Safari's 3x pre-capture warmup with a verified draw at raster time 6ee4680

🛠 fix

  • fix: keep Safari toSvg/toImg vector at scale instead of rasterizing to PNG dbbff09
  • fix(styles): disable animations on clones so entry keyframes don't blank the capture #476
  • fix: I freeze nowrap box widths and isolate measure mounts in shadow DOM #474
  • fix: freeze the image the browser actually shows (srcset descriptors, type filters, content:url) 6ac87ef
  • fix: parse final font-face declarations without semicolons #475
  • fix: stop concurrent captures from sharing session maps and counter state d1379a6
  • fix: realm-safe element guards — pseudos and per-node handlers now survive iframe-content captures 5e9d8e1
  • fix: collect svg defs referenced from the root svg's own attributes 441e3cf
  • fix: prefetch mask and border-image URLs in preCache, drop the dead warm call 423acd5
  • fix: first-letter materialization no longer false-positives on margined elements 52a6fff

25 July 2026

✨ feat

  • feat: warn once when width-softened text risks re-wrap without reconcile:true 1b882d6
  • feat: add burst:true capture memoization, replacing session() c3f0a56
  • feat(pseudo): add function to strip CSS content alt-text suffix. Ref #458 9cefe86
  • feat(session): close the MutationObserver-only staleness gap b15b418
  • feat: snapdom.session — memoized repeated captures with mutation tracking 94f206c
  • feat: reconcile option — measured layout reconciliation of the clone against the live DOM 1597d77
  • feat(plugins): per-node resolveNode hook + internal tag handler registry aacc512

🛠 fix

  • fix: resolve <picture> srcset via media-query matching, not currentSrc b94f652
  • fix: capture roots that are themselves the target element were skipped 23a3611
  • fix: resolve image-set()/-webkit-image-set() by device pixel ratio f1e1cc2
  • fix(css): emit the base reset for tags evicted from the defaultStyle cache ef584a8
  • fix(styles): keep the height of wrappers whose children are all out of flow 714cdb4
  • fix(capture): stop background/asset passes losing the session nodeMap when same-origin iframes capture concurrently f5e1778
  • fix(clone): drop <picture> <source> elements so inlined <img> src is not overridden ff7b10d
  • fix(images): inline the capture root itself when it is an <img> or SVG <image> 5d5bf71
  • fix(CSSVar): update SVG_TEMPLATE_TAGS and refine isInSvgTemplate logic for mask/clipPath handling. Closes #459 509bed1
  • fix(capture): honor filterMode:'remove' in shrink pass and height estimate e84557e
  • fix: serialize session.capture() calls to stop races on shared cache.session 9f3cb23
  • fix: reuse snapFetch in pictureResolver instead of a hand-rolled fetch pipeline a737419
  • fix(types): drop phantom snapdom.toJpeg(), add clip option, document outer* defaults 633a09c
  • fix: stop a failed export from poisoning every later export on the same result e69f51b
  • fix: dedup extendIconFonts entries instead of growing list unboundedly 56cbe26
  • fix: derive missing export dimension from post-bleed viewBox, not pre-bleed box 4173c93
  • fix: stop color-tint plugin from clipping bleed content 56784aa
  • fix: align margin-collapse neutralization by nodeMap, not child index 9fa7d89
  • fix(pseudo): render box-generating pseudos that paint only via box-shadow/outline d239ec4

📦 other (chore/docs/refactor/…)

  • docs: plain restyle, npm run site local-dist server, clearer burst demo 13f8662
  • test: split burst benchmark into isolated static/mutating files 72bbe81
  • docs(labs): add a live burst capture demo with a real Pikachu card 3706d62
  • docs: document reconcile, burst, invalidate, and image-set() resolution 5d9d74f
  • chore: update contributors list bf37697
  • docs: add CORS & external resources guidance to README 84221c1
  • test(clone): stop asserting picture <source> resolution timing across engines e1fb59e
  • docs: drop Tanker from the Web fonts showcase paragraph, use plain sans-serif 64aabbf
  • test: add type-checking for types/snapdom.d.ts to the test pipeline a06a71a
  • perf: defer buildCounterContext's document walk until actually needed 8020750
  • perf(preCache): use fused collectFontUsage (one walk instead of two) 6a8a488
  • docs(types): add reconcile option, snapdom.session / CaptureSession, resolveNode plugin hook bc0f854
  • perf(raster): header-peek instead of full SVG decode, single decode/encode cycle, async canvas encode af8c549
  • perf: fuse tree passes — single-walk font usage collector, snapshot-flagged background pass f7274f7
  • perf: parallelize network-bound capture phases and memoize image downsampling b7fedc7
  • perf(clone): skip idle machinery per child in fast mode, make canvas pre-rAF Safari-only a5536ae
  • perf: stop self-invalidating the style epoch, memoize scrollbar CSS scan, gate Safari warmup walk 7a5179d

21 July 2026

feat

  • feat: emulate backdrop-filter at capture time #457
  • feat: clip option + snapdom.viewport() — region capture with offscreen culling 328226b

fix

  • fix: shadow fidelity in WebKit's SVG rasterization b7e9af2
  • Fix rotated-root captures clipped at edges (d31) 64c5a8f
  • fix: key the embedded-fonts cache by document identity 05ef9a9
  • fix: guard content-sized boxes against sub-pixel width truncation (text re-wrap) 4b92392
  • Fix type definitions drift: compress default, quality default, missing options (excludeStyleProps, fontStylesheetDomains, safariWarmupAttempts, debug, filename), toRaw/to on result, LocalFont.stretchPct 7a473c4
  • fix: keep root filter blur() and always expand bbox for its bleed 3f6e6e7
  • fix: stop compensating the root's stripped translation in the viewBox bbox 3241481
  • fix: repair the broken htmlInCanvas re-export in the plugins barrel 1b74a1a
  • fix: stop stabilizeLayout from leaving a permanent border on the source element cf3da9b
  • fix: guard the container padding offset against Chromium 140 all:initial expansion 0b24929

other (docs)

  • FEATURES_CN.md: '按设计跳过' → '有意跳过'. The phrasing fix was independently #453
  • docs: refine Chinese documentation dce83ab
  • docs: add Chinese translation maintenance guide 4e53063
  • Update FEATURES_CN.md to change '按设计跳过' to '有意跳过' 56ff167

other (test)

  • Make the test suite pass on Firefox and WebKit 74de348
  • Add cross-browser test runs (BROWSER=firefox|webkit|all) with per-engine visual baselines f2b72d8
  • test: wait for KaTeX CDN + fonts in the d454 visual demo 8205e1b

other (chore/refactor/merge)

  • chore: add cross-engine visual report (npm run report:cross) 5b6e8cd
  • chore: update snapdom plugins version ed984ff
  • refactor(api): drop snapdom.viewport() — clip: 'viewport' is the one spelling 4a0f301
  • Merge pull request #455 from mosuzi/codex/discussion-450-chinese-docs-review 5b0d149

13 July 2026

  • fix(iframe): rasterize long iframe documents and pin them to the viewport to prevent full expansion during capture #449 c610d4a
  • fix(textarea): first letter issue expanded to textarea #447 bc5ce38
  • fix(iframe): improve margin and padding handling in pinIframeViewport to preserve content offset #448 6a78d3b

3 July 2026

  • fix(capture): drop *-prefixed attributes to keep XMLSerializer output well-formed #445
  • refactor(tests): simplify tests for *-prefixed HTML attributes 0a818bf

24 June 2026

  • fix(fonts): scan the capture element's ownerDocument so iframe fonts embed (#441) #442
  • fix(fonts): scan the capture element's ownerDocument for fonts #441
  • fix: use nodeMap for source/clone child alignment in inlineBackgroundImages #440
  • Delete .github/workflows/issue-triage.yml ab5b36f
  • Delete .github/workflows/label-sync.yml 7366d5a
  • fix(capture): preserve parent session across nested iframe capture cb0ece1
  • chore: update contributors list f18dee0
  • chore(compress): raise RES_FACTOR to 0.95 0bd87d7
  • update b541784

17 June 2026

  • feat: opt-in perceptual image downsampling (compress option) e353569
  • chore: remove unused exporters registry 711d591
  • feat(compress): downsample CSS backgrounds and SVG <image> too 6666f59
  • fix: content-aware width softening 0832e72
  • feat(compress): enable image downsampling by default + docs + image benchmark 7148c74
  • refactor: simplify compress to a boolean option 39e8714
  • fix(#394): pre-decode foreignObject images before raster (cross-browser) 9895218
  • feat(compress): downsample oversized images below visible resolution (0.6 factor) 47b9ed7
  • fix(#394): wait for foreignObject image compositing on all browsers 25279e9
  • fix(compress): decode images before drawing to avoid blank downsamples 5aedeca
  • types: add compress option to SnapdomOptions 495a089
  • fix: reuse preCache image dataURLs in the capture path 37d99a5
  • fix: pass the documented payload to before/afterExport hooks 1a14fd0
  • fix: re-fetch a font when its resource cache entry was evicted 2e938a4
  • chore(deps): bump esbuild to ^0.28.1 (fixes Dependabot high alert) 3d9a8e6

16 June 2026

  • fix: emit captured width as a min-width floor instead of dropping it
  • fix(#432): escape U+FFFE/U+FFFF noncharacters in sanitize regex

3 June 2026

  • fix: root margin-collapse clipping (#426) and oversized-raster decode failure #425
  • fix(#425): strip XML-invalid control chars before serializing the clone 880376b
  • fix(#429): don't freeze auto-sized table cell widths 33b81eb
  • fix: honor the localFonts option in the capture path 9122152
  • fix(#429): also skip the logical inline-size and the rest of the table box tree 69400a6

29 May 2026

  • fix(pseudo): render bordered + layout-spacer pseudo-elements (#418, #419) #423
  • fix(pseudo): keep empty box-generating pseudos used as layout spacers #418
  • fix(pseudo): render pseudo-elements with a single-side border #419
  • Add new super power plugins 88cb353
  • chore(plugins): v2.2.0 — gif/video/html 9c84259

28 May 2026

  • Fix for placeholder colors not being copied over on webkit browsers #420
  • fix(pseudo): support counter-set; drop divergent dead counter duplicates eb8bdb7
  • fix: proxy-keyed bg cache, case-insensitive font match, nodeMap icon pairing 0623bcd
  • fix(bbox): correct bleed/transform math for inset shadows, blur chains, root scale 1c43605
  • perf: trim redundant per-node work on the capture hot path 6d1ad72
  • fix(capture): stop mutating the live DOM during capture (non-destructive) db69e78
  • fix(export): flatten jpeg/webp background by resolved format, not export name 1dcfbcd
  • fix(cache): invalidate snapshot on option change, reset measureHints on disabled 0b8d697
  • add SnapDIFF 9bda342
  • test(precache): align cache.background keys with proxy-prefixed contract 064b004
  • fix(clone): ensure placeholder color is correctly rendered in SVG 44899b3
  • chore: update contributors list 73358a1
  • Fix download format option types 2f93d39
  • add sponsor 70c4140
  • chore: revert .gitignore to main 3091154
  • fix(clone): restore original placeholder logic and styles efe1dd9
  • chore: exclude screenshots folder in .gitignore d364607
  • Merge pull request #417 from puneetdixit200/fix-download-format-types be6bc02

5 May 2026

  • feat(plugin)!: rename prompt-export to agent-map, focused on visual agents cd5ca18
  • update Mr SnapDOM theme d9fb7bc
  • feat(plugin: prompt-export): richer element map for LLM agents dd0769a
  • html2canvas is not good 4002631
  • feat(plugin: prompt-export): default include omits image; +benchmark section 7adc87f
  • update html-in-canva to new API 935069a
  • Añadir prueba de regresión para el problema #235: corregir el renderizado de counter(x) ")" sin espacios adicionales. 6e209e8
  • feat(clone): enhance SVG handling by preventing var() materialization in templates. See #408 5d566fa
  • test(visual): skip suite when demos/ folder is absent 652693b

23 April 2026

  • fix(toCanvas): wait for compositing after decode on Safari. Fixes #394 #394
  • fix(iframe): restore live iframe scroll position after capture. Closes #393 #393
  • fix(capture): preserve mask-mode and mask-composite through shorthand inlining. #402
  • fix(capture): phantom whitespace in inline-flex + gap elements. Fixes #406 #406
  • docs(site): add prompt-export to the plugins page + live demo b451415
  • fix(plugins): enforce local-first priority for plugin-provided exports. See #401 ed272f4
  • fix(capture): drop invisible border props from style snapshot. See #390 8942fd4
  • docs(plugins): add prompt-export section to plugins README f9743db
  • fix(capture): disable WebKit text autosizer inside foreignObject. See #327 9c49d6a
  • fix(images): increase batch size for processing images to 6 to optimize HTTP/1.1 connection limits 311c9e4
  • fix(plugin: prompt-export): flow metadata to the toPrompt() export b94b589
  • Merge pull request #398 from kohaiy/patch-2 da438d5

8 April 2026

  • Improve robustness of icon font detection #397
  • feat(docs): add LLM-friendly documentation links and new reference files bc7ece1
  • feat(plugins): add prompt-export plugin for LLM-friendly captures 314c51a
  • feat: extract pictureResolver into standalone module 1d3dd70
  • feat(docs): add official and community plugins sections to README, including installation instructions, usage examples, and detailed descriptions of each plugin's functionality. b10235e
  • feat(docs): enhance plugin documentation with event tracking attributes for improved analytics on user interactions 84d6901
  • feat(docs): add tracking scripts and enhance plugin documentation with event tracking for better analytics 20de0f2
  • Ensure font names are escaped before creating dynamic RegExp 2cd41ec
  • fix(docs): update "Build a Plugin" link to anchor and add section ID for improved navigation in documentation 3c01910

27 March 2026

  • feat(docs): enhance documentation with new community plugins section, update index and labs pages, and add shared CSS for consistent styling across SnapDOM documentation. d35278c
  • feat(plugins): add multiple new SnapDOM plugins including ascii-export, color-tint, filter, html-in-canvas, pdf-image, picture-resolver, replace-text, timestamp-overlay. Each plugin enhances image processing and manipulation capabilities. Ref #391 a4d2331
  • feat(docs): add contributing guidelines and plugin specification for SnapDOM plugins, including usage examples, lifecycle hooks, and best practices. 5243a34
  • feat(plugin-template): add initial SnapDOM plugin template with example usage and options. See #391
  • feat(workspaces): add workspaces configuration to package.json for better package management 3032187

23 March 2026

  • fix(clone): add support for copying form validation attributes and handle nested foreignObject in deepClone f87c896
  • fix(clone): video frames (#277), SVG paint props (#365), placeholder color (#315), object-fit (#337), cross-origin iframe warn (NEW-7) 946ec83
  • fix(clone): sanitize XML-invalid control characters from attribute values 4218a17
  • fix(transforms): handle matrix3d transforms and extract decomposeScaleShear as shared helper (#216) 0b5eeab
  • fix(prepare): force content-visibility:visible before capture (#281) and fix fixed elements inside scroll wrappers (#364) ba2aa6d
  • fix(styles): handle detached elements in inlineAllStyles and evict oversized snapshotKeyCache 02280d2
  • Bumped version 96da0a5
  • fix(counter): implement counter-set support to manage top values without new scopes f869a46
  • fix(capture): implement caching for clone measurements to optimize performance ff455c2
  • fix(counter): handle negative values in formatCounter and update tests for counter resolution b9b965d
  • fix(fonts): embed all families in font-family fallback chain, not just the primary (#357) 13ab5c8
  • fix(styles): enforce visibility:hidden when content-visibility:hidden to prevent content leakage in snapshots 4f5f15a
  • fix(outline): enhance parseOutline to account for outline-offset in bleed calculation 7f45084
  • fix(inlinePseudoElements): enhance style comparison by including additional CSS properties df2dd99
  • fix(capture): normalize foreignObject defaults for flex layout (#351) and whitespace (#349) 55f3962
  • fix(download): ignore non-image type field to prevent format override (#339) 3f42049
  • fix(CSSVar): prevent redundant property resolution by tracking visited properties e76d700
  • fix(clone.helpers): preserve vertical-align from original input in checkbox/radio replacement (#311) ccaf138
  • fix(pseudo): increase CSS_RULE_SCAN_BUDGET to 1000 for better performance in large applications a09f438
  • fix(cache): add persistent cache for clone-in-document layout measurements c65049b
  • fix(toCanvas): omit CSS inset box-shadows in canvas export to prevent incorrect rendering ff4a137
  • fix(css): exclude zoom from style snapshot to prevent double-zoom inside foreignObject (#369) 8f80d2a
  • fix(background): preserve all url() layers in background shorthand when inlining images fe18140

17 March 2026

  • fix: CSS vars perf, scrollbar styles, SVG image inline, nested line-clamp, iframe pseudos & isolation, Tailwind border (#334 #341 #348 #362 #371 #372 #386) #387
  • fix: enable image download on iOS via Web Share API #384
  • feat(scrollbar): implement custom scrollbar style collection for capture, ensuring styles are applied correctly. Closes #334 #334
  • feat(styles): normalize Tailwind border styles in capture and inlineAllStyles to ensure consistent output. Closes #362 #362
  • feat(lineClamp): introduce lineClampTree function to apply line-clamp to nested elements, enhancing ellipsis rendering. Closes #386 #386
  • test(styles): add tests for excluding CSS properties from snapshots, ensuring fidelity with CSS variables. Closes #348 #348
  • test(capture): add test for iframe CSS isolation to ensure wrapper div does not inherit iframe styles. Closes #372 #372
  • refactor(capture): replace getComputedStyle with getStyle for improved iframe support and consistency across style retrieval. Closes #371 #371
  • feat(pseudo): implement suppression of native ::before/::after pseudo-elements in cloned styles to prevent double rendering. Closes #359 #359
  • fix(capture): update Safari padding logic to avoid edge clipping by applying padding only when necessary based on bounding box transforms. Closes #333 #333
  • test(fonts): add test for cross-origin CSS support in embedCustomFonts function, verifying correct handling of custom CDN stylesheets. Closes #309 #309
  • feat(fonts): add fontStylesheetDomains option to support cross-origin CSS fetching, enhancing font loading capabilities. Closes #309, closes #370 #309 #370
  • feat(styles): add support for capturing -webkit-text-stroke properties in Safari to enhance style snapshot accuracy. Closes #340 #340
  • fix(styles): normalize inline styles to ensure !important rules in stylesheets correctly override inline styles in clones. Fixes #328. #328
  • refactor: improve dimension handling in deepClone and createCheckboxRadioReplacement functions for better accuracy and consistency. Closes #321. See #378 #321
  • refactor: enhance checkbox/radio replacement for Firefox with SVG implementation for consistent rendering and improved styling. Closes #290 #290
  • fix(background): resolve relative URLs and fallback to background shorthand for url() when background-image is empty. Closes #343 #343
  • fix: enable image download on iOS via Web Share API #383
  • feat(tests): add comprehensive test coverage for various modules including exporters, utils, and modules to improve overall code reliability 06cc896
  • feat(debug): introduce debug option to log suppressed errors for troubleshooting, enhancing error visibility during capture processes f107bbe
  • fix: Firefox checkbox radio replacement b97e553
  • refactor(cache): implement EvictingMap for cache management to limit memory usage and improve performance 212cd4f
  • refactor(styles): improve height handling for transparent wrappers to support margin collapsing and enhance layout stability c50ccef
  • fix(styles): prevent overriding border styles when using border-image, and improve getStyle fallback handling a5857c5
  • feat(images): add support for inlining SVG <image> elements as data URLs, addressing #341. f7d4616
  • feat(safari): implement font and image decode warmup for Safari to address WebKit Bug #219770, enhancing capture reliability ad450ce
  • test(getStyle): add tests to ensure getStyle never returns undefined for elements and pseudo-elements 83c3854
  • refactor(snapdom): streamline plugin exports by consolidating export functions into a loop for improved maintainability ca35387
  • feat(capture): enhance DOM capture dimensions for root elements by measuring scroll dimensions and using a temporary container for accurate height and width calculations 31e50f2
  • fix(css): enhance getWindowForElement and getStyle functions to handle cross-document scenarios and improve fallback logic b0fbc8d
  • refactor(context): remove inline cache policy normalization and import from cache module for improved code organization 0492756
  • feat(safari): add safariWarmupAttempts option to optimize font and image decoding for improved capture performance 2474c05
  • fix(styles): prevent width constraints on inline and specific tags to avoid text wrapping issues 674ef27
  • chore: update contributors list b30de75
  • docs: update README files to replace NPM version badge with weekly downloads badge 8e12d01
  • chore(.gitignore): add 'demos/' directory to .gitignore to exclude demo files from version control fa34905
  • refactor(prepare): simplify deepClone call by removing redundant element argument for cleaner code 399bfaf
  • fix(styles): adjust inline style for timestamp demo to prevent text wrapping b88e8d7
  • fix(snapdom): remove redundant safariWarmup reset to improve iteration logic 72d3fb7
  • Merge PR #384: enable image download on iOS via Web Share API 05bc67c
  • Merge main into dev (2.1.0) 5f5ab34

10 March 2026

  • fix(background): inline background-image inside shadow DOM hosts #379
  • Update URL handling to use location.origin in fonts.js #380
  • fix: use nodeMap for source-clone alignment in inlinePseudoElements #381
  • fix(background): properly inline background-image inside shadow DOM hosts #318
  • update demo site 4de1850
  • feat: classify open issues by importance with priority labels and triage workflows 246a4c4
  • fix: Enhanced font embedding functionality for dynamically injected stylesheets 3d4985a
  • fix: resolve CSS transform double-scale bug (issue #321) d41504b
  • fix: improve demo capture functionality with Safari support and locking mechanism 2cb3856
  • refactor: update build configuration for legacy and ESM outputs, removing module structure and adding subpath exports 94f6289
  • docs: update README to reflect changes in SnapDOM ESM build structure and usage instructions 8e5a710
  • fix: only change to location.origin when treating inline styles in font.js 94c91c6
  • fix: validate fallback image data before setting source 2c754fe
  • fix: ensure image is only appended if data URL is valid 46957c5
  • fix: ensure valid CSS text is fetched for font links 201209f
  • Merge pull request #301 from Amyuan23/fix/svg-root-font-size 5bd53ba
  • Merge pull request #350 from ZiuChen/fix/remote-katex-font 3cbbd57
  • Merge pull request #378 from FlavioLimaMindera/fix-scale-image-issue-321 e53f2f8
  • Fix: Inherit root font-size in SVG output 3bdf300
  • Merge pull request #374 from kohaiy/patch-1 0b21142

20 January 2026

  • Fix bug when captured element is SVG. Closes #324 #324
  • Improve docs for blob #352

26 November 2025

  • Fix spaces. Closes #326 #326
  • Fix download options. Closes #323 #323
  • Fix Safari Image Issue. See #330 ba80b6f
  • Minify mjs version 9155d4f
  • Add a re-export for preCache. See #332 acc5b79

18 November 2025

18 November 2025

  • Feature enable tree-shakeable code ebb7b6a
  • Fix bug when img has height with % units. Closes #268 #268
  • Fix regression to process MathJax 7ef116c
  • Fix bug See #316 7efbede

11 November 2025

  • Reorganice helper functions d1fd982
  • Perf improvement daf0eca
  • Fix placeholder dimensions when image loading fails e44b9d9

9 November 2025

  • Integrate createBackground into toCanvas. Closes #297 #297
  • Add Chinese translation of README.md (readme_cn.md) #298
  • Adjust final dimensions when excludeMode: remove. See #294 a860827
  • Improve material icon / symbols. See #304 526c4c8
  • Add XHTML sanitize. See #282 0039301
  • Add detection to Baidu on iOS. Also detect other apps/browsers on iOS. See #295 97e6dff
  • add support for text-underline-offset. See #303 fb603bc
  • add support for text-underline-offset. See#303 0b93c0d
  • fix: improve CSS src property parsing in font faces dbe52a1

23 October 2025

  • Add basic support for icons with ligature such as material-icons. Closes #275 #275
  • Replace straighten with outerTransforms, and noShadows with outerShadows 902f032
  • Fix straighten regression 60c6569

14 October 2025

  • Document plugin system d87ac01
  • First plugin and exporter draft 5da0948
  • Fix subpixel bug. See #261 465950b
  • Update demos with plugins 50e6c4f
  • Update plugin system 4e21b47
  • Enhance external SVG defs. See #262 cd4a7fb
  • First plugin system draft 9c6b91b
  • Fix complex canvas render on Safari. See #263 2697207
  • Enhance CSS vars detection. See #262 6655303
  • Fix counter CSS reset and bug when exist background-image. See #265 3c29997
  • FIx excludeFonts defs. See #260 84b1770
  • Fix local register 9c4508e
  • Enable use built-in exporters in custom exporter 5c6fe36
  • Fix background-repeat. See #259 0ad5fa4
  • Fix export name format jpg -> jpeg 47d532a
  • Update roadmap dff59b9
  • Fix local plugin registration 0997618

5 October 2025

5 October 2025

  • Improve CSS vars detection. Closes #255 #255
  • Fix toImg() dimensions when scale==1. Closes #254 #254
  • Enhance web fonts detection on deph relative paths. See #253 e2a8c45
  • Add two new options to control transforms and shadows on root element 8c9a75f
  • Add toSvg() in replacement of toImg() 10e2043, 122317e
  • Improve relative path detection. See #253 34158e0
  • Lint code c754981
  • Lint tests ee974ed

30 September 2025

  • Add basic support to sticky elements. See #232 02893e6
  • Update types 19317e6
  • fix formating 58ca761
  • Enhance browser detection. See #251 cfe753c
  • Fix pseudo capture. See #252 e85678e
  • Merge pull request #249 from K1ender/dev e497bba

26 September 2025

  • Captures CSS shadows 050365f
  • Improve counter simulation 4c9e21d
  • Fix scale, width, height options 8ef48cb
  • Just run safariWarmup if it is needed a32846d
  • Safari, in case of scale, width or height options use png to ensure fidelity 0711a77
  • Sanitize container a6ba396

22 September 2025

  • Fix margin collapsing in some cases. See #243 7fe0a3f

20 September 2025

  • Modularize counters 024a7f9
  • Improve CSS counter() and counters() handling. See #120, see #235 8fb0385
  • Feat lineClamp. See #241 4082cd6
  • Fix width/height options 7cd2111
  • Fix bug that hangs snapDOM on some browsers. See #236 bc3c400
  • Fix bug that overrides options.width/heigth. See #241 49fbb63
  • Improve webFonts render. See #229 3082a3a
  • Feat. detect wechat browser. See #223 e7c4723
  • Ensure donwload file measure. See #241 eed1995
  • Add iframe support ec59e4b

11 September 2025

  • Try fix fallback images 67bedd3
  • Two separate mode: filterMode and excludeMode 394e7f4
  • Workaround Safari See #231 593ad59
  • Try new approach for solve Safari fonts/images decoding 5b77738

9 September 2025

  • Fix Safari bug that prevents capture 6a43e59

9 September 2025

8 September 2025

  • Fix cache disabled bug. Closes #221 #221
  • Add extra margin when element has transform 6688eee
  • Feat. handkles css trasnforms and scale rotate new props. Ref #216 d151da1
  • Add same-origin iframe support .See #222 f50720f
  • Fix regression that doesnt reset origial translate 800c427
  • Fix duplicated values on textArea 0915f8d
  • 增强图像处理功能,添加图像加载失败时的后备图像源支持,并记录原始图像尺寸以便于使用。更新类型定义以包含新选项。 011620a
  • ✨ feat: e3a4556
  • remove iframe limitation 77abf8f
  • Merge pull request #220 from Jarvis2018/main adb6455
  • Merge pull request #215 from xiaobai-web715/dev 37be327

3 September 2025

  • Fix flickering on Safari. Closes #197 #197
  • Prevents default svg values overwrite custom ones. Closes #217 #217
  • Feature: add placeholders option to disable rendered placeholder for iframes and fallback images. Closes #137 #137
  • FIx textarea styles. Closes #212 #212

29 August 2025

  • Code refactor, cache improve, options centralized 3bd7182
  • Improve performance and cache 8882025
  • Enhance font handling cb1e04a
  • Improve capture fidelity e05f027
  • fix font fetching 70dd092
  • Set compress as default 7e5ab00
  • optimice code df52437
  • Core update: increase X3 speed capture compared 1.9.9 94bc57d
  • Ensure custom fonts are capured 8125689
  • Fix first custom font bug on Safari 971d976
  • Fix bug that affects overall capture fidelity 35539a5
  • update to avoid vitest issues 51ef80d

14 August 2025

  • Improves external fonts handling. Closes #139, closes #146, closes #186 #139 #146 #186
  • Handles srcset. Closes #190 #190
  • Fix speed regression. 542ed00
  • Handles Blob scr fe27239. Closes #169

10 August 2025

  • fix(types): update preCache #166
  • Fix defs & symbols outside captured element and hidden visibility, closes #178. Stabilize layout before cloning, closes #179. Fix inline styles, closes #177 #178 #177 #179
  • Fix icontFont alignment and rendered size. Closes #176 #176
  • Ensure skip empty pseudo elements. Closes #168 #168
  • Add basic border-image support. Closes #159 #159
  • Fix input css styles. Closes #144, closes #147 #144 #147

27 July 2025

  • Fix input css styles. Closes #144, closes #147 #144 #147
  • Fix Safari scale. Closes #133 #133
  • Fix @font-face. Closes #145 #145
  • Fix edge case that generates blank images on Safari. Closes #129 #129
  • Improve pseudo elements detection. Closes # 143 539e488
  • Remove default backgroundColor on download(). Ref dissussion #142 a875fe3
  • Update docs, thanks @kohaiye38d67b

20 July 2025

  • Add options argument to toBlob function. Thanks @rbbydotdev #118
  • Keep canvas CSS style. Fixes #121. #121
  • Improve: handles local() source font. See #114 c088aa0
  • Improve webcomponent clone a0f37a5
  • Perf: unifies cache fe3a368
  • Improve cache handling. 183ae2f
  • Adjust cache reset ff33ed3
  • Improve regex 1b4d5ad
  • Add primitive support to css counter. See #120 160bc2e
  • Fix bug background-color on export formats. See #90 47a34a9
  • Fix regression textArea duplication 1759fd0
  • Prevent process local ids. See #128 659e862
  • Add node version and improve docs. See #123. Thanks @miusuncle e457bf6

14 July 2025

Fix: add type def for SnapOptions. Thanks @simon1uo #111

  • Add checkbox.indeterminate. Thanks @titoBouzout #104
  • Add mask-image CSS detection (closes #106) #106
  • Add slot detection (closes # 97) / Fix textarea content duplication (closes #110) #110
  • Add html-to-image to benchmark. Closes #103 #103

30 June 2025

  • fix: encode same uri multiple times #65
  • Add Lucide to icon font detection #50
  • Avoid background-image logic duplication, closes #66 #66
  • Feat: sanitize rootElement to avoid CSS layout conflicts. Fixes #56, fixes #24 #56 #24
  • Fix: canvas style props, closes #63 #63
  • Feat: handling @import and optimice cache, closes #61 #61
  • Compile .js to es2015, closes #58 #58
  • Fix background image handling, closes #57 #57
  • Improve inlinePseudoElements() to handle decorative properties, closes #55 #55
  • Add ::first-letter detection, closes #52 #52
  • test: increases coverage 7ebc871
  • Increase test coverage 0c63478
  • Improve split multiple backgrounds 0e67a9b
  • chore: update contributors list da22404
  • chore: update contributors list ec7c275
  • Add check bf9a888
  • Create update-contributors.js 453dff0
  • Document width and height options 0f7fb7a
  • Create update-contributors.yml b48e334
  • Update 7da2892
  • Bumped version f322f51
  • Update README.md 99c51a8
  • Update update-contributors.js 46a868b
  • Update update-contributors.js 2a77e4c
  • chore: update contributors list 020eff8
  • Update update-contributors.js b4cf877
  • chore: update contributors list a2d28d9
  • Update doc 7cf19de
  • Update update-contributors.js 962c7c6
  • Update README.md 183de8c
  • Update README.md 4352ae7
  • Update update-contributors.js 7dca4a1
  • Update README.md ebb7f32
  • Clean transform RootElement prop f293e5b
  • Check if getStyle is iterable 24dfe05
  • chore: update contributors list 8ac4aa1
  • chore: update contributors list 9987328
  • Update README.md 4b52b87

19 June 2025

14 June 2025

  • fix: double scaled images #38
  • Fix: background img & img base64 in pseudo elements, closes #36 #36
  • Feat: captures input values, closes #35 #35
  • Improve: Device Pixel Ratio handling, thanks @jswhisperer 1a14f69
  • Bumped version 489be08
  • Update description 4db784b

9 June 2025

  • Fix duplicated font-icon when embedFonts is true, closes #30 #30
  • Fix url with encode url, closes #29 #29
  • Fix .toCanvas scale fb47284
  • Bumped version 75b917a
  • Update cdn 37533a2
  • add homepage aa85c5d

4 June 2025

  • Patch: type script definitions, closes #23 #23
  • Bumped version 548d7f3

31 May 2025

  • feat(embedFonts): also embed icon fonts when embedFonts is true #18
  • Fix expose snapdom and preCache on browser compilation, closes #26 #26
  • Improve icon-font conversion 7bac4ee
  • Fix compress mode 652cfe9
  • Bumped version 0cd7973
  • Remove some logs 4348b39
  • Chore: delete old comments ff81a40
  • Chore: add dry bump script 5c421c7

28 May 2025

19 May 2025

18 May 2025

  • Fix retina and scale bug, closes #15 #15
  • Improve public API, closes #16 #16
  • Fix bug to render canvas with precache compress mode, closes #13 #13
  • Update to reflect new public API b6024cb
  • Update tests and benckmarks f06a0f8
  • Add helper to check Safari 6c9ee04
  • Remove preWarm d3bd582
  • Bumped version fb0855d

14 May 2025

14 May 2025

14 May 2025

1 May 2025

1 May 2025

  • This PR dramatically improves the speed and accuracy of snapDOM. It increases the result size and may produce some long tasks, but it provides a solid foundation to address these side effects in the future. #6
  • Add as draft new default approach - not implemented 6f4ec41
  • Add tests bdd5a7f
  • Feat: captures icon fonts 7b39e5f
  • Omit process default styles - temporary 2953196
  • update to v.0.9.2 e0179a1
  • Add options as Object and allow bgColor on jpg and webp e5abaa7
  • Update commented docs cfd2272
  • Update README.md fef6751
  • update 26ff7ea
  • Update README.md 3fda999
  • Update README.md 8ee616b
  • Omit delay function - temporary 0f04721
  • update unpkg url 13ce66b
  • Bumped version 9e4f518
  • Update README.md 3733476
  • Update README.md 00c74b0
  • Update README.md dd2c9c5
  • Update README.md d271cf7
  • Update README.md 02bf650

27 April 2025

v0.9.0

27 April 2025