# @zakkster/lite-smoke
> Zero-GC SoA volumetric smoke engine. DPI-aware radial buffers, dynamic drift, OKLCH palette, configurable blend.

## Install
npm i @zakkster/lite-smoke

## API
- new SmokeEngine(maxParticles?, config?)
- .emit(x, y, count, angleMin, angleMax, speedMin, speedMax, sizeMin, sizeMax, growRate, lifeMin?, lifeMax?)
- .updateAndDraw(ctx, dt, w, h) — physics + render (overlay, no clearRect)
- .clear() / .destroy()

## Config
buoyancy (-150), friction (0.95), driftStrength (20), driftFreq (2), maxOpacity (0.6),
bufferSize (64), dpr (1), blendMode ('source-over'), palette (4 OKLCH), rng (Math.random)

## Key Features
- Pre-rendered radial gradient puff buffers (DPI-aware, one per color)
- drawImage for puffs — GPU-accelerated, no per-frame gradient creation
- Alpha curve: fade-in at birth + fade-out at death
- Size growth: puffs expand over lifetime (sizeBase + progress × sizeGrow)
- Velocity sleep threshold (< 0.01)
- Configurable blend mode for different atmospherics
- invLife[] precomputed, dt clamped to 0.1
