npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@mkhuda/dom-screenshot

v1.0.3

Published

DOM screenshot by dom-to-image

Downloads

32

Readme

dom-screenshot

Build Status npm version

A modern TypeScript library to capture DOM elements as SVG, PNG, JPEG, or Blob images. Built with latest tooling and fully type-safe.

Forked & modified from dom-to-image


✨ Features

  • 📸 Multiple Formats: SVG (vector), PNG (raster), JPEG (compressed), Blob, Pixel Data
  • 🎨 Style Preservation: Captures all CSS styles, colors, gradients, shadows, transforms
  • 📦 Modern Build: Rollup with TypeScript, ESM and CommonJS outputs
  • 🔒 Type Safe: Full TypeScript support with complete type definitions
  • Fast: Optimized for performance, lazy initialization of dependencies
  • 🚀 Production Ready: Tested and used in real-world applications
  • 🎯 React Friendly: Works seamlessly with React via refs

📚 Documentation

Quick Reference

File Guides

| File | Purpose | |------|---------| | EXAMPLES_QUICKSTART.md | Quick start guide for running examples | | TESTING.md | Testing framework setup and usage | | TESTING_STATUS.md | Current test status and results | | TEST_SETUP_SUMMARY.md | Comprehensive testing documentation | | examples/README.md | Examples overview | | examples/react-app/README.md | Detailed React example guide | | tests/README.md | Test infrastructure details |


🎬 Live Demo

Try it now!dom-screenshot React Demo

Experience the library in action with an interactive React application. Capture UI elements as SVG, PNG, or JPEG with live preview! 🚀


🚀 Quick Start

Installation

npm install @mkhuda/dom-screenshot
# or
yarn add @mkhuda/dom-screenshot

Basic Usage

import { domtoimage } from '@mkhuda/dom-screenshot';

// Get the element to capture
const element = document.getElementById('content');

// Capture as SVG
const svg = await domtoimage.toSvg(element);

// Capture as PNG
const png = await domtoimage.toPng(element);

// Capture as JPEG
const jpeg = await domtoimage.toJpeg(element);

// Get as Blob
const blob = await domtoimage.toBlob(element);

// Get pixel data
const pixelData = await domtoimage.toPixelData(element);

React Example

import { useRef } from 'react';
import { domtoimage } from '@mkhuda/dom-screenshot';

export function MyComponent() {
  const contentRef = useRef<HTMLDivElement>(null);

  const handleCapture = async () => {
    if (!contentRef.current) return;

    try {
      const png = await domtoimage.toPng(contentRef.current);

      // Download
      const link = document.createElement('a');
      link.href = png;
      link.download = 'screenshot.png';
      link.click();
    } catch (error) {
      console.error('Capture failed:', error);
    }
  };

  return (
    <div>
      <div ref={contentRef}>
        <h1>Content to capture</h1>
        <p>This will be captured</p>
      </div>
      <button onClick={handleCapture}>📸 Download as PNG</button>
    </div>
  );
}

📸 API Reference

Functions

toSvg(node, options?)

Renders DOM node to SVG data URL (scalable vector format).

Returns: Promise<string> - SVG data URL

Best for: UI components, diagrams, simple graphics

const svg = await domtoimage.toSvg(element);

toPng(node, options?)

Renders DOM node to PNG data URL (lossless raster format).

Returns: Promise<string> - PNG data URL

Best for: Screenshots, general purpose captures

const png = await domtoimage.toPng(element);

toJpeg(node, options?)

Renders DOM node to JPEG data URL (lossy compressed format).

Returns: Promise<string> - JPEG data URL

Best for: Photos, space-constrained scenarios

const jpeg = await domtoimage.toJpeg(element, { quality: 0.95 });

toBlob(node, options?)

Renders DOM node to Blob object.

Returns: Promise<Blob> - Blob object

Best for: Uploading to server, efficient data handling

const blob = await domtoimage.toBlob(element);

toPixelData(node, options?)

Extracts raw pixel data from DOM node.

Returns: Promise<Uint8ClampedArray> - RGBA pixel data

Best for: Image processing, pixel manipulation

const pixelData = await domtoimage.toPixelData(element);

Options

interface DomScreenshotOptions {
  width?: number;           // Override width
  height?: number;          // Override height
  bgcolor?: string;         // Background color
  quality?: number;         // JPEG quality (0-1)
  style?: CSSStyleDeclaration;  // Additional styles
  filter?: (node: Node) => boolean;  // Filter nodes
  cacheBust?: boolean;      // Bust cache with random query
  imagePlaceholder?: string; // Placeholder for broken images
}

🎯 Real-World Use Cases

1. Export Feature

Let users download rendered UI as images:

const png = await domtoimage.toPng(contentElement);
downloadFile(png, 'export.png');

2. Report Generation

Create visual reports from data:

const reports = await Promise.all([
  domtoimage.toPng(chart1),
  domtoimage.toPng(chart2),
  domtoimage.toPng(table),
]);

3. Screenshot Tools

Build screenshot applications:

const screenshots = [];
screenshots.push(await domtoimage.toPng(screen1));
screenshots.push(await domtoimage.toPng(screen2));

4. Documentation

Auto-capture UI for documentation:

const componentScreenshot = await domtoimage.toSvg(component);

🧪 Testing

The project includes a comprehensive test suite with:

  • ✅ 20 infrastructure tests
  • ✅ Unit tests for all functions
  • ✅ Integration tests
  • ✅ Custom test matchers
  • ✅ Full TypeScript support

Run Tests

# Run tests once
npm run test:run

# Watch mode
npm run test:watch

# UI dashboard
npm run test:ui

# Coverage report
npm run test:coverage

See TESTING.md for detailed testing information.


💻 Examples

🎬 Live Demo

Experience the library instantly without any setup:

  • dom-screenshot React Demo - Interactive demo with live preview
  • Supports SVG, PNG, JPEG capture
  • Real-time gallery view
  • Auto-download functionality

React Example App

A complete, production-ready React application demonstrating all features:

Features:

  • Capture as SVG, PNG, JPEG
  • Live preview gallery
  • Auto-download files
  • Beautiful responsive UI
  • Full TypeScript

Quick Start:

npm run example:dev

Opens at http://localhost:5173

For detailed information, see:


🏗️ Project Structure

dom-screenshot/
├── src/
│   ├── dom-screenshot.ts         # Main library
│   └── types/
│       └── options.ts             # Type definitions
├── dist/
│   ├── dom-screenshot.esm.js      # ES Module
│   ├── dom-screenshot.min.js      # IIFE (minified)
│   └── dom-screenshot.d.ts        # TypeScript types
├── tests/
│   ├── setup.ts                   # Test configuration
│   ├── helpers/                   # Test utilities
│   ├── mocks/                     # Mock implementations
│   ├── fixtures/                  # Test data
│   └── unit/
│       ├── simple.test.ts         # Infrastructure tests
│       └── basic.test.ts          # Feature tests
├── examples/
│   └── react-app/                 # React example application
├── vitest.config.mts              # Test runner config
├── tsconfig.json                  # TypeScript config
├── rollup.config.mjs              # Build config
└── package.json

🛠️ Development

Prerequisites

  • Node.js 22.12.0 (pinned with Volta)
  • npm or yarn

Setup

# Install dependencies
npm install

# Build library
npm run build

# Watch for changes
npm run watch

Build Commands

npm run build              # Build production
npm run test:run           # Run tests
npm run test:watch         # Watch tests
npm run test:ui            # Test UI dashboard
npm run example:dev        # Run React example
npm run example:build      # Build React example

📊 What's New (TypeScript Migration)

✅ Completed

  • ✅ Full TypeScript migration
  • ✅ Strict type checking enabled
  • ✅ Modern build tooling (Rollup 4.x, TypeScript 5.x)
  • ✅ ESM and CommonJS dual output
  • ✅ Complete test suite (20+ tests passing)
  • ✅ Production-ready React example
  • ✅ Comprehensive documentation

🎯 Quality Metrics

| Metric | Status | |--------|--------| | TypeScript | ✅ Full coverage with strict mode | | Tests | ✅ 20+ tests passing | | Build | ✅ 0 errors | | Output | ✅ ESM + IIFE dual format | | Types | ✅ Complete definitions | | Docs | ✅ Comprehensive guides |


🚀 Browser Support

  • ✅ Chrome/Chromium (latest)
  • ✅ Firefox (latest)
  • ✅ Safari (latest)
  • ✅ Edge (latest)

For older browsers, ensure required polyfills are present.


🔄 Format Comparison

| Format | Use Case | Size | Speed | Quality | |--------|----------|------|-------|---------| | SVG | UI/Diagrams | Smallest | Fastest | Vector | | PNG | General Purpose | Medium | Medium | Lossless | | JPEG | Photos | Smallest | Slower | Lossy | | Blob | Server Upload | Any | Any | Any |


⚙️ Advanced Options

Custom Dimensions

const png = await domtoimage.toPng(element, {
  width: 1920,
  height: 1080,
});

Background Color

const png = await domtoimage.toPng(element, {
  bgcolor: '#ffffff',
});

JPEG Quality

const jpeg = await domtoimage.toJpeg(element, {
  quality: 0.95,  // 0 to 1
});

Filter Nodes

const svg = await domtoimage.toSvg(element, {
  filter: (node) => {
    // Exclude elements with class 'no-capture'
    if (node instanceof HTMLElement) {
      return !node.classList.contains('no-capture');
    }
    return true;
  },
});

Cache Busting

const png = await domtoimage.toPng(element, {
  cacheBust: true,  // Add random query string to URLs
});

🐛 Troubleshooting

Styles Not Captured

  • Ensure styles are inline or in <style> tags
  • External stylesheets may not be included
  • Use computed styles for debugging

Canvas-Related Errors

  • SVG capture works in all environments
  • PNG/JPEG may need browser environment
  • Always use try-catch blocks

Performance Issues

  • Use SVG for simple UI elements
  • Break large captures into sections
  • Cache element references

Import Errors

  • Ensure library is built: npm run build
  • Check Node.js version: node --version
  • Try reinstalling: rm -rf node_modules && npm install

📄 File Guides

Main Documentation Files

TESTING.md

Quick reference for:

  • Running tests
  • Test commands
  • Test patterns

TESTING_STATUS.md

Current test status:

  • Test results
  • Coverage information
  • Known issues

TEST_SETUP_SUMMARY.md

Comprehensive testing:

  • Setup details
  • Infrastructure overview
  • Test organization

EXAMPLES_QUICKSTART.md

Quick start for examples:

  • Installation steps
  • Running instructions
  • Troubleshooting

examples/README.md

Examples overview:

  • Available examples
  • Features demonstrated
  • Technologies used

examples/react-app/README.md

React example details:

  • Project structure
  • Component documentation
  • Customization guide

tests/README.md

Testing infrastructure:

  • Test setup
  • Helper utilities
  • Mock implementations

🤝 Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for new features
  4. Ensure all tests pass
  5. Submit a pull request

See TESTING.md for test setup instructions.


📝 License

MIT


🙏 Acknowledgments

  • Original library: dom-to-image by tsayen
  • Modern tooling and TypeScript migration by Muhammad K. Huda

📞 Support

  • 📖 Check the documentation files listed above
  • 🐛 Found a bug? Open an issue
  • 💬 Have questions? Check existing issues or discussions
  • 🚀 Want to contribute? See Contributing section

Ready to capture?

Let's start capturing! 📸