# Ripple Pond — `ripple-pond@1.0.0`

Raindrops landing on a still pond from above: thin rings spread, cross and fade while lily pads rock. Loops perfectly.

Raindrops on a still pond seen from above. Drops land at seeded places at fixed moments of the loop; each sends out a set of thin circular ripples that widen, thin and fade, and where rings from different drops cross they pass through each other cleanly. A soft sky reflection tints the water, and lily pads, some with a flower, sit on the surface and rock slightly when a ripple reaches them. Each drop repeats once per loop, so the loop is exact. Choose the number of drops, the colours (twilight, morning, koi or night), the number of lily pads and the seed.

- Kind: background; status: published; digest sha256:cb2676a2321fe8fa130b4d69e25cc6e65e6a7487302225ba5e4780183984c844
- Role: Background (Canvas 2D): a calm, meditative water scene.
- Implementation: canvas2d; entry `src/ripple-pond.js`
- Files: https://aipixelwizard.com/registry/ripple-pond/1.0.0/<path> (`LICENSE`, `asset.json`, `demo.js`, `index.html`, `src/ripple-pond.js`)
- Manifest JSON: https://aipixelwizard.com/api/v1/visuals/ripple-pond/versions/1.0.0
- Runnable demo: https://aipixelwizard.com/registry/ripple-pond/1.0.0/index.html (open over http; it imports sibling packages by relative path)
- Dependencies (exact): `apw-runtime@1.0.0` (demo) — Demo harness. The reusable source has no dependencies.

## Exports
- `createRipplePond({ drops?, palette?, pads?, seed? }) => { draw(ctx, info, width, height) }` — Canvas 2D scene; info.progress (0 to 1 over the loop) sets the place in the loop; it fills the canvas.
- `PALETTES: { twilight, morning, koi, night }` — Water, ripple and lily-pad colours.

## Parameters
- `drops` (integer 3–24, default 9) — Drops per loop
- `palette` (select one of twilight | morning | koi | night, default "twilight") — Colours
- `pads` (integer 0–8, default 4) — Lily pads
- `seed` (integer 1–999, default 5) — Seed

## Composition
- Inputs: Canvas 2D context, info.progress (0 to 1 over the loop), width, height.
- Outputs: Fills the whole canvas.
- Coordinates: Drops and pads are placed in fractions of the canvas; ripple reach and pad size scale with the smaller side.
- Lighting: A soft radial water colour with a faint sheen; pads cast a soft shadow.
- Timing: Pure function of info.progress.
- Works with: kinetic-title, gradient-background
- Ripples are drawn as thin rings with a wider faint ring behind each, which reads as a glint.

## Output and loop
- 1080×1080, 30 fps, 12 s, procedural
- Seamless loop: yes — Each drop's ripples are a function of the time since it landed, wrapping round the loop, and the pads rock in whole cycles, so the last frame meets the first.
- Verified 2026-10-08 in Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0 (Canvas 2D); deterministic: yes; loop check: Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255.

## Use it
New project: Create it once, then each frame draw your backdrop and call draw(ctx, { progress }, width, height).

Existing project: Copy src/ripple-pond.js. Call draw on your existing 2D canvas.

Reuse ideas:
- Sleep video: Twilight pond.
- Calm morning: Morning, light rain.
- Storm mood: Koi pond, heavy rain.

## Limitations
- Ripples do not reflect off the edges or interfere; rings cross without changing.
- The water has no depth or refraction.

## License
MIT. Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.

Provenance: Original code written for AI Pixel Wizard in October 2026, to the catalog quality bar (docs/QUALITY.md).

