home / skills / 2025emma / vibe-coding-cn / snapdom

snapdom skill

/i18n/zh/skills/snapdom

This skill accelerates DOM-to-image capture by exporting styled elements to SVG or raster formats with fonts, shadows, and proxy support.

npx playbooks add skill 2025emma/vibe-coding-cn --skill snapdom

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
7.5 KB
---
name: snapdom
description: snapDOM is a fast, accurate DOM-to-image capture tool that converts HTML elements into scalable SVG images. Use for capturing HTML elements, converting DOM to images (SVG, PNG, JPG, WebP), preserving styles, fonts, and pseudo-elements.
---

# SnapDOM Skill

Fast, dependency-free DOM-to-image capture library for converting HTML elements into scalable SVG or raster image formats.

## When to Use This Skill

Use SnapDOM when you need to:
- Convert HTML elements to images (SVG, PNG, JPG, WebP)
- Capture styled DOM with pseudo-elements and shadows
- Export elements with embedded fonts and icons
- Create screenshots with custom dimensions or scaling
- Handle CORS-blocked resources using proxy fallback
- Implement custom rendering pipelines with plugins
- Optimize performance on large or complex elements

## Key Features

### Universal Export Options
- **SVG** - Scalable vector format, embeds all styles
- **PNG, JPG, WebP** - Raster formats with configurable quality
- **Canvas** - Get raw Canvas element for further processing
- **Blob** - Raw binary data for custom handling

### Performance
- Ultra-fast capture (1.6ms for small elements, ~171ms for 4000×2000)
- **No dependencies** - Uses standard Web APIs only
- Outperforms html2canvas by 10-40x on complex elements

### Style Support
- Embedded fonts (including icon fonts)
- CSS pseudo-elements (::before, ::after)
- CSS counters
- CSS line-clamp
- Transform and shadow effects
- Shadow DOM content

### Advanced Capabilities
- Same-origin iframe support
- CORS proxy fallback for blocked assets
- Plugin system for custom transformations
- Straighten transforms (remove rotate/translate)
- Selective element exclusion
- Tight bounding box calculation

## Installation

### NPM/Yarn
```bash
npm install @zumer/snapdom
# or
yarn add @zumer/snapdom
```

### CDN (ES Module)
```html
<script type="module">
  import { snapdom } from "https://unpkg.com/@zumer/snapdom/dist/snapdom.mjs";
</script>
```

### CDN (UMD)
```html
<script src="https://unpkg.com/@zumer/snapdom/dist/snapdom.umd.js"></script>
```

## Quick Start Examples

### Basic Reusable Capture
```javascript
// Create reusable capture object
const result = await snapdom(document.querySelector('#target'));

// Export to different formats
const png = await result.toPng();
const jpg = await result.toJpg();
const svg = await result.toSvg();
const canvas = await result.toCanvas();
const blob = await result.toBlob();

// Use the result
document.body.appendChild(png);
```

### One-Step Export
```javascript
// Direct export without intermediate object
const png = await snapdom.toPng(document.querySelector('#target'));
const svg = await snapdom.toSvg(element);
```

### Download Element
```javascript
// Automatically download as file
await snapdom.download(element, 'screenshot.png');
await snapdom.download(element, 'image.svg');
```

### With Options
```javascript
const result = await snapdom(element, {
  scale: 2,                    // 2x resolution
  width: 800,                  // Custom width
  height: 600,                 // Custom height
  embedFonts: true,            // Include @font-face
  exclude: '.no-capture',      // Hide elements
  useProxy: true,              // Enable CORS proxy
  straighten: true,            // Remove transforms
  noShadows: false             // Keep shadows
});

const png = await result.toPng({ quality: 0.95 });
```

## Essential Options Reference

| Option | Type | Purpose |
|--------|------|---------|
| `scale` | Number | Scale output (e.g., 2 for 2x resolution) |
| `width` | Number | Custom output width in pixels |
| `height` | Number | Custom output height in pixels |
| `embedFonts` | Boolean | Include non-icon @font-face rules |
| `useProxy` | String\|Boolean | Enable CORS proxy (URL or true for default) |
| `exclude` | String | CSS selector for elements to hide |
| `straighten` | Boolean | Remove translate/rotate transforms |
| `noShadows` | Boolean | Strip shadow effects |

## Common Patterns

### Responsive Screenshots
```javascript
// Capture at different scales
const mobile = await snapdom.toPng(element, { scale: 1 });
const tablet = await snapdom.toPng(element, { scale: 1.5 });
const desktop = await snapdom.toPng(element, { scale: 2 });
```

### Exclude Elements
```javascript
// Hide specific elements from capture
const png = await snapdom.toPng(element, {
  exclude: '.controls, .watermark, [data-no-capture]'
});
```

### Fixed Dimensions
```javascript
// Capture with specific size
const result = await snapdom(element, {
  width: 1200,
  height: 630  // Standard social media size
});
```

### CORS Handling
```javascript
// Fallback for CORS-blocked resources
const png = await snapdom.toPng(element, {
  useProxy: 'https://cors.example.com/?' // Custom proxy
});
```

### Plugin System (Beta)
```javascript
// Extend with custom exporters
snapdom.plugins([pluginFactory, { colorOverlay: true }]);

// Hook into lifecycle
defineExports(context) {
  return {
    pdf: async (ctx, opts) => { /* generate PDF */ }
  };
}

// Lifecycle hooks available:
// beforeSnap → beforeClone → afterClone →
// beforeRender → beforeExport → afterExport
```

## Performance Comparison

SnapDOM significantly outperforms html2canvas:

| Scenario | SnapDOM | html2canvas | Improvement |
|----------|---------|-------------|-------------|
| Small (200×100) | 1.6ms | 68ms | 42x faster |
| Medium (800×600) | 12ms | 280ms | 23x faster |
| Large (4000×2000) | 171ms | 1,800ms | 10x faster |

## Development

### Setup
```bash
git clone https://github.com/zumerlab/snapdom.git
cd snapdom
npm install
```

### Build
```bash
npm run compile
```

### Testing
```bash
npm test
```

## Browser Support

- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Mobile browsers (iOS Safari 14+, Chrome Mobile)

## Resources

### Documentation
- **Official Website:** https://snapdom.dev/
- **GitHub Repository:** https://github.com/zumerlab/snapdom
- **NPM Package:** https://www.npmjs.com/package/@zumer/snapdom
- **License:** MIT

### scripts/
Add helper scripts here for automation, e.g.:
- `batch-screenshot.js` - Capture multiple elements
- `pdf-export.js` - Convert snapshots to PDF
- `compare-outputs.js` - Compare SVG vs PNG quality

### assets/
Add templates and examples:
- HTML templates for common capture scenarios
- CSS frameworks pre-configured with snapdom
- Boilerplate projects integrating snapdom

## Related Tools

- **html2canvas** - Alternative DOM capture (slower but more compatible)
- **Orbit CSS Toolkit** - Companion toolkit by Zumerlab (https://github.com/zumerlab/orbit)

## Tips & Best Practices

1. **Performance**: Use `scale` instead of `width`/`height` for better performance
2. **Fonts**: Set `embedFonts: true` to ensure custom fonts appear correctly
3. **CORS Issues**: Use `useProxy: true` if images fail to load
4. **Large Elements**: Break into smaller chunks for complex pages
5. **Quality**: For PNG/JPG, use `quality: 0.95` for best quality
6. **SVG Vectors**: Prefer SVG export for charts and graphics

## Troubleshooting

### Elements Not Rendering
- Check if element has sufficient height/width
- Verify CSS is fully loaded before capture
- Try `straighten: false` if transforms are causing issues

### Missing Fonts
- Set `embedFonts: true`
- Ensure fonts are loaded before calling snapdom
- Check browser console for font loading errors

### CORS Issues
- Enable `useProxy: true`
- Use custom proxy URL if default fails
- Check if resources are from same origin

### Performance Issues
- Reduce `scale` value
- Use `noShadows: true` to skip shadow rendering
- Consider splitting large captures into smaller sections

Overview

This skill converts DOM elements into high-fidelity images and scalable SVGs quickly and without external dependencies. It preserves styles, fonts, pseudo-elements, and shadow DOM content while offering raster export options (PNG, JPG, WebP) and raw Canvas/Blob outputs. It is optimized for speed and works with CORS fallbacks and plugins for custom pipelines.

How this skill works

The tool clones the target element, inlines computed styles and fonts, and serializes the DOM into an SVG or renders it to a canvas for raster exports. It supports pseudo-elements, CSS counters, transforms, shadows, and shadow DOM content, and can optionally use a proxy to fetch cross-origin resources. The API returns a reusable result object with helpers like toPng, toJpg, toSvg, toCanvas, toBlob, and a direct download helper.

When to use it

  • Generate shareable screenshots of UI components or dashboards while preserving exact styles and fonts
  • Export charts, icons, and vector-heavy content as scalable SVG for print or high-DPI displays
  • Create social media images or thumbnails at custom resolutions (PNG/JPG/WebP)
  • Capture DOM that includes pseudo-elements, icon fonts, or Shadow DOM content
  • Fallback for CORS-blocked assets using a proxy when images or fonts are cross-origin

Best practices

  • Prefer scale for higher resolution exports instead of manually setting width/height for better performance
  • Enable embedFonts to include @font-face rules so custom fonts render correctly
  • Use exclude selectors to hide controls, watermarks, or transient UI before capture
  • Enable useProxy when third-party images or fonts fail to load due to CORS
  • For very large or complex pages, split captures into smaller regions to reduce memory and time

Example use cases

  • Automated generation of Open Graph images: capture a card element at 1200×630
  • Batch-exporting component screenshots for visual regression or documentation
  • Converting canvas-based charts and SVGs into PNG/JPG for email or social sharing
  • Creating printable PDFs by exporting high-quality images and feeding them into a PDF pipeline
  • Removing transforms (straighten) to get tight bounding-box snapshots for asset libraries

FAQ

Will custom fonts render in the output?

Yes—set embedFonts: true and ensure fonts are loaded before capture to embed @font-face rules into the export.

How do I handle cross-origin images that fail to load?

Enable useProxy (true or custom proxy URL) to fetch blocked resources via a CORS proxy fallback.

Which format should I choose for best quality?

Use SVG for vector content and charts; choose PNG or WebP with quality settings for raster photography or screenshots.