"Because sometimes the only valid response to centering a div is blowing up the entire UI."
DOMolition is a React-based physics engine wrapper that converts standard DOM elements into interactive, rigid-body physics simulations. It is designed to provide highly satisfying "rage quit" UI mechanisms by capturing the visual state of a component tree and destroying it dynamically on an HTML5 canvas.
The underlying system operates in three distinct phases:
- Capture Phase: Utilizes
html-to-image(specificallytoCanvas) to perform a high-fidelity capture of the target DOM node, resolving computed styles while supporting modern CSS features better than older rasterization libraries. - Kinematic Phase: Integrates
matter-jsto compute rigid body dynamics. Depending on the selected "engine" (e.g., Grid, Glass, Implode), the source bitmap is algorithmically subdivided—either into a discrete Cartesian grid or via Voronoi tessellations usingd3-delaunay. Each subdivision becomes a physical body with calculated mass, restitution, and friction. Specific force vectors are applied based on the engine's explosive profile. - Render Pipeline: The original DOM element is visually hidden, and a full-viewport canvas is injected. A synchronized
requestAnimationFrameloop paints the bitmap slices—using complex world-space clipping masks—according to the translation and rotation matrices calculated by the physics engine. The loop self-terminates when all rigid bodies reach a sleeping state.
Install the package via npm:
npm install domolitionNote: Ensure react and react-dom (v18.0.0 or higher) are installed in your project.
The library exposes the primary RageQuitWrapper component. The physics simulation is typically controlled imperatively via a React Ref, allowing you to trigger the effect from external buttons.
import React, { useRef, useState } from 'react';
import { RageQuitWrapper, RageQuitRef } from 'domolition';
export const Application = () => {
const shatterRef = useRef<RageQuitRef>(null);
return (
<main style={{ padding: '2rem' }}>
<button onClick={() => shatterRef.current?.triggerShatter()}>
Initiate Destruction
</button>
<RageQuitWrapper ref="{shatterRef}" effect="glass" shardCount="{150}" onShatterComplete="{()"> console.log('Simulation terminated.')}
>
<section style={{ padding: '2rem', border: '1px solid #ccc', background: '#fff' }}>
<h1>System Dashboard</h1>
<p>This interface remains fully functional until the sequence is triggered.</p>
</section>
</RageQuitWrapper>
</main>
);
};DOMolition supports multiple destruction engines, selected via the effect prop.
Simulates brittle fracture. The UI cracks first (Pre-Fracture Phase), holding tension for 250ms, before shattering into jagged, realistic glass shards using Voronoi tessellation and a deterministic jitter-grid for performance.
Usage:
<RageQuitWrapper effect="glass" shardCount="{200}" // Controls the number of jagged pieces>
<YourComponent/>
</RageQuitWrapper>A high-energy inward collapse. The UI is broken into a grid, and forces pull all pieces toward the center of mass before they drop.
Usage:
<RageQuitWrapper effect="implode" rows="{25}" // Horizontal grid subdivisions cols="{20}" Vertical>
<YourComponent/>
</RageQuitWrapper>The classic blocky explosion. The UI splits into a clean grid of rectangles that explode outward uniformly.
Usage:
<RageQuitWrapper effect="grid" rows="{12}" cols="{10}">
<YourComponent/>
</RageQuitWrapper>| Property | Type | Default | Description |
|---|---|---|---|
children |
React.ReactNode |
required | The DOM sub-tree to be captured and simulated. |
effect |
'grid' | 'glass' | 'implode' |
'glass' |
The physics engine to use for destruction. |
isShattered |
boolean |
false |
A declarative fallback prop to trigger the shatter effect. |
shardCount |
number |
150 |
The number of shards generated by the glass engine. |
rows |
number |
10 |
The horizontal subdivisions for the grid and implode engines. |
cols |
number |
8 |
The vertical subdivisions for the grid and implode engines. |
onShatterComplete |
() => void |
undefined |
Callback invoked when all rigid bodies stop moving. |
| Method | Signature | Description |
|---|---|---|
triggerShatter |
() => void |
Imperatively triggers the capture and subsequent physics simulation. |
- matter-js: Resolves 2D rigid body collisions, tunneling prevention, and kinematics.
- d3-delaunay: Powers the Voronoi tessellation math for realistic glass fractures.
- html-to-image: Executes the target DOM rasterization (replacing older html2canvas setups).