own-the-canvas 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/README.md +34 -17
  3. package/lib/components/AuroraBorealis/AuroraBorealis.d.ts +5 -3
  4. package/lib/components/AuroraBorealis/useAuroraBorealis.d.ts +14 -3
  5. package/lib/components/ButterflySwarm/useButterflySwarm.d.ts +7 -0
  6. package/lib/components/Candle/Candle.d.ts +35 -0
  7. package/lib/components/Candle/index.d.ts +2 -0
  8. package/lib/components/Candle/useCandle.d.ts +18 -0
  9. package/lib/components/Cat/Cat.d.ts +42 -0
  10. package/lib/components/Cat/index.d.ts +2 -0
  11. package/lib/components/Cat/useCat.d.ts +22 -0
  12. package/lib/components/Eye/Eye.d.ts +46 -0
  13. package/lib/components/Eye/index.d.ts +3 -0
  14. package/lib/components/Eye/useEye.d.ts +29 -0
  15. package/lib/components/Fireworks/Fireworks.d.ts +2 -0
  16. package/lib/components/Fireworks/useFireworks.d.ts +1 -0
  17. package/lib/components/FluidSimulation/useFluidSimulation.d.ts +9 -3
  18. package/lib/components/GameOfLife/GameOfLife.d.ts +2 -2
  19. package/lib/components/GameOfLife/useGameOfLife.d.ts +10 -1
  20. package/lib/components/Hummingbird/Hummingbird.d.ts +43 -0
  21. package/lib/components/Hummingbird/index.d.ts +2 -0
  22. package/lib/components/Hummingbird/useHummingbird.d.ts +35 -0
  23. package/lib/components/Jellyfish/Jellyfish.d.ts +37 -0
  24. package/lib/components/Jellyfish/index.d.ts +2 -0
  25. package/lib/components/Jellyfish/useJellyfish.d.ts +20 -0
  26. package/lib/components/KoiPond/KoiPond.d.ts +2 -2
  27. package/lib/components/KoiPond/useKoiPond.d.ts +10 -3
  28. package/lib/components/Komorebi/Komorebi.d.ts +34 -0
  29. package/lib/components/Komorebi/index.d.ts +2 -0
  30. package/lib/components/Komorebi/useKomorebi.d.ts +22 -0
  31. package/lib/components/Lightning/Lightning.d.ts +1 -1
  32. package/lib/components/Lightning/useLightning.d.ts +7 -0
  33. package/lib/components/Octopus/Octopus.d.ts +44 -0
  34. package/lib/components/Octopus/index.d.ts +2 -0
  35. package/lib/components/Octopus/useOctopus.d.ts +35 -0
  36. package/lib/components/Owl/Owl.d.ts +48 -0
  37. package/lib/components/Owl/index.d.ts +2 -0
  38. package/lib/components/Owl/useOwl.d.ts +29 -0
  39. package/lib/components/Rain/Rain.d.ts +2 -0
  40. package/lib/components/Rain/useRain.d.ts +1 -0
  41. package/lib/components/ReactionDiffusion/ReactionDiffusion.d.ts +1 -1
  42. package/lib/components/ReactionDiffusion/useReactionDiffusion.d.ts +9 -3
  43. package/lib/components/Snail/Snail.d.ts +38 -0
  44. package/lib/components/Snail/index.d.ts +2 -0
  45. package/lib/components/Snail/useSnail.d.ts +21 -0
  46. package/lib/components/SpiderWeb/SpiderWeb.d.ts +4 -0
  47. package/lib/components/SpiderWeb/useSpiderWeb.d.ts +3 -0
  48. package/lib/components/Starfield/useStarfield.d.ts +10 -3
  49. package/lib/components/Sunflowers/Sunflowers.d.ts +36 -0
  50. package/lib/components/Sunflowers/index.d.ts +2 -0
  51. package/lib/components/Sunflowers/useSunflowers.d.ts +23 -0
  52. package/lib/components/TidePool/TidePool.d.ts +32 -0
  53. package/lib/components/TidePool/index.d.ts +2 -0
  54. package/lib/components/TidePool/useTidePool.d.ts +21 -0
  55. package/lib/components/WaveInterference/WaveInterference.d.ts +2 -0
  56. package/lib/components/WaveInterference/useWaveInterference.d.ts +20 -3
  57. package/lib/index.cjs.js +1 -1
  58. package/lib/index.d.ts +22 -6
  59. package/lib/index.es.js +11154 -9467
  60. package/lib/runtime/caustics.d.ts +16 -0
  61. package/package.json +2 -2
  62. package/lib/components/DeepSeaBioluminescence/DeepSeaBioluminescence.d.ts +0 -29
  63. package/lib/components/DeepSeaBioluminescence/index.d.ts +0 -2
  64. package/lib/components/DeepSeaBioluminescence/useDeepSeaBioluminescence.d.ts +0 -18
  65. package/lib/components/FrostGlass/FrostGlass.d.ts +0 -33
  66. package/lib/components/FrostGlass/index.d.ts +0 -2
  67. package/lib/components/FrostGlass/useFrostGlass.d.ts +0 -38
  68. package/lib/components/LSystem/LSystem.d.ts +0 -33
  69. package/lib/components/LSystem/index.d.ts +0 -2
  70. package/lib/components/LSystem/useLSystem.d.ts +0 -23
package/CHANGELOG.md CHANGED
@@ -2,9 +2,41 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [Unreleased]
6
+
7
+ ## [2.0.2] - 2026-11-06
8
+
9
+ ### Added
10
+
11
+ - 11 new Living Scenes on the shared runtime: `Eye`, `Owl`, `Octopus`, `Hummingbird`, `Candle`, `Cat`, `Jellyfish`, `Snail`, `Sunflowers`, `Komorebi`, `TidePool`. `Owl`, `Octopus`, `Hummingbird`, `Cat`, `Jellyfish`, and `Snail` support `collide`.
12
+
13
+ ### Improved
14
+
15
+ - `KoiPond` is rebuilt: koi swim on a 12-point spine with a full silhouette, painted patches, flapping pectoral fins and a butterfly tail, each casting a shadow on the pond floor; lily pads have veins and waterlilies and drift on the ripples. Tap to drop food and the koi race to eat it.
16
+ - `AuroraBorealis` draws real curtains: vertical ray striations with a sharp hem fading upward into a second color, brightest where they fold, over a mountain lake that mirrors them. New `interactive` prop (default `true`): the cursor brightens nearby curtains, a tap sets off a substorm.
17
+ - `Starfield` (2D) is a deep-sky vista: a Milky Way band with star clouds, dust lanes and nebulae, three parallax layers of temperature-tinted stars that shift with the cursor, diffraction spikes on bright stars and tapered meteors. 3D warp streaks stars and the cursor steers the vanishing point.
18
+ - `GameOfLife` cells glow: they swell in at birth, cool with age, leave fading embers, and cross-fade between generations under a bloom. Dragging paints life, and a settled board is stirred with gliders.
19
+ - `ReactionDiffusion` lets feed and kill rates drift across the canvas so pattern types coexist and keep morphing; hovering seeds chemical, and a dead field reseeds itself.
20
+ - `FluidSimulation` uses square cells at any aspect ratio, vorticity confinement for crisp eddies, orbiting ink jets so it is never blank, and tone-mapped ink with a relief sheen.
21
+ - `WaveInterference` renders a lit water surface (diffuse plus specular glint) with glowing sources. New `interactive` prop (default `true`): drag sources to move them, and the hovering cursor stirs its own ripples.
22
+ - All seven now run on the shared canvas runtime (pause offscreen, reduced motion, DPR cap, window-level pointer).
23
+
24
+ ### Removed (breaking)
25
+
26
+ - `DeepSeaBioluminescence` (use `Jellyfish`), `FrostGlass`, and `LSystem`.
27
+
28
+ ## [2.0.1] - 2026-11-01
29
+
30
+ Docs-only release so the npm page shows the 2.0 README.
31
+
32
+ ### Changed
33
+
34
+ - README: new cover image (the old one showed the 1.x monochrome look and advertised removed components), a Living Scenes table describing each Living Scene and which react to `data-otc-solid`, updated descriptions for the rebuilt DragonCursor, Rain, and BubbleUniverse, and corrected defaults for `FluidSimulation.resolution` (80) and `FireEffect.spread` (0).
35
+ - `package.json`: normalized `repository.url` (npm warned on publish).
36
+
5
37
  ## [2.0.0] - 2026-11-01
6
38
 
7
- The big one: 18 new Living Scenes, effects that react to your page's elements, a production-safe runtime, color by default, and a redrawn catalog. 11 components are removed; see the README's "Upgrading from 1.x" for replacements.
39
+ The big one: new Living Scenes, effects that react to your page's elements, a production-safe runtime, color by default, and a redrawn catalog. 11 components are removed; see the README's "Upgrading from 1.x" for replacements.
8
40
 
9
41
  ### Added
10
42
 
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # own-the-canvas
6
6
 
7
- **60 canvas-based React visual components. Zero dependencies. TypeScript.**
7
+ **50+ canvas-based React visual components. Zero dependencies. TypeScript.**
8
8
 
9
9
  [![npm version](https://img.shields.io/npm/v/own-the-canvas?style=flat-square&color=555555)](https://www.npmjs.com/package/own-the-canvas)
10
10
  [![license](https://img.shields.io/npm/l/own-the-canvas?style=flat-square&color=555555)](LICENSE)
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## What's New in 2.0
20
20
 
21
- - **18 Living Scenes:** nature effects with real models underneath, from ivy that grows along your headline to fireflies that flash in sync and a moonlit sea that glitters where the waves catch the moon.
21
+ - **Living Scenes:** nature effects with real models underneath, from ivy that grows along your headline to fireflies that flash in sync and a moonlit sea that glitters where the waves catch the moon.
22
22
  - **Effects that know your page:** mark any element with `data-otc-solid` and petals, snow, seeds, leaves, fireflies, and paper cranes land on it, and ivy climbs it.
23
23
  - **Color by default:** every component opens in its signature palette. Pass `preset="monochrome"` for the 1.x look.
24
24
  - **Production-safe runtime:** effects pause offscreen and in background tabs, respect `prefers-reduced-motion`, and run at the same speed on 60Hz and 120Hz screens.
@@ -94,7 +94,6 @@ What each DOM-aware effect does with marked elements:
94
94
  | `Dandelion` | Blown seeds parachute down and settle on elements |
95
95
  | `PaperLanterns` | Clicking a marked element releases a lantern from it |
96
96
  | `SnowDrift` | Snow piles up on top edges and spills off the sides |
97
- | `FrostGlass` | Frost nucleates on element edges and grows outward |
98
97
  | `OrigamiCranes` | Paper cranes land and rest with wings folded |
99
98
  | `SeasonsTree` | Falling autumn leaves and petals settle on elements |
100
99
 
@@ -104,7 +103,7 @@ Rain and Confetti are next.
104
103
 
105
104
  ## Production-Safe by Default
106
105
 
107
- Runtime-based components (SakuraBlossom, the 18 Living Scenes below, and the rebuilt TornadoVortex, SolarFlare, BlackHole, NoiseGradient, Boids, and WatercolorBloom) get these behaviors with no setup:
106
+ Runtime-based components (SakuraBlossom, the Living Scenes below, and the rebuilt TornadoVortex, SolarFlare, BlackHole, NoiseGradient, Boids, and WatercolorBloom) get these behaviors with no setup:
108
107
 
109
108
  - **Pause offscreen:** zero work while scrolled out of view.
110
109
  - **Pause in background tabs:** resumes without a burst of catch-up motion.
@@ -120,7 +119,7 @@ Runtime-based components (SakuraBlossom, the 18 Living Scenes below, and the reb
120
119
 
121
120
  ### DragonCursor
122
121
 
123
- A sinuous dragon body that trails your cursor in real time. Segments, wings, optional fire breath, and a background star field with optional per-star glow halos — all configurable.
122
+ A glowing dragon that follows your cursor: a tapered, scaled body with dorsal spines, membrane wings, a horned head with glowing eyes, and fire breath. When the cursor leaves the canvas it wanders on its own over a star field.
124
123
 
125
124
  **Presets:** `default · emerald · inferno · void · ice · monochrome`
126
125
 
@@ -168,7 +167,7 @@ import { MatrixRain } from "own-the-canvas";
168
167
 
169
168
  ### KoiPond
170
169
 
171
- Living koi pond on canvas — fish navigate with organic steering, ripple on hover, lily pads float, caustic light dances.
170
+ A koi pond from above: koi on flexible spines with painted patches, fins and trailing tails cast shadows on the pond floor under drifting caustics, and lily pads (some flowering) float on the ripples. Move the cursor to ripple the water; tap to drop food and the koi race to eat it.
172
171
 
173
172
  **Presets:** `default · koi · night · lotus · neon · monochrome`
174
173
 
@@ -184,13 +183,13 @@ import { KoiPond } from "own-the-canvas";
184
183
  | `fishColor` | `string` | `"#ff6030"` | Fish body color |
185
184
  | `showLilies` | `boolean` | `true` | Render floating lily pads |
186
185
  | `caustics` | `boolean` | `true` | Caustic light shimmer |
187
- | `interactive` | `boolean` | `true` | React to mouse movement |
186
+ | `interactive` | `boolean` | `true` | Cursor ripples; tap to feed the koi |
188
187
 
189
188
  ---
190
189
 
191
190
  ### FluidSimulation
192
191
 
193
- Real-time Navier-Stokes fluid solver. Move your mouse to inject velocity and ink — auto-bursts fire at intervals for continuous motion.
192
+ Ink in water: a stable-fluids solver with vorticity confinement on square cells at any aspect ratio. Three slow ink jets keep it marbling untouched; move the cursor to drag ink and current, tap to blow a ring outward.
194
193
 
195
194
  **Presets:** `default · ink · neon · lava · ocean · smoke · monochrome`
196
195
 
@@ -206,10 +205,10 @@ import { FluidSimulation } from "own-the-canvas";
206
205
 
207
206
  | Prop | Type | Default | Description |
208
207
  | --- | --- | --- | --- |
209
- | `resolution` | `number` | `128` | Grid resolution 32–128 |
208
+ | `resolution` | `number` | `80` | Grid resolution 32–128 |
210
209
  | `inkColors` | `string[]` | `["#0c4a6e", "#0891B2", "#06b6d4", "#67e8f9"]` | Ink colors |
211
210
  | `viscosity` | `number` | `0.0001` | Fluid viscosity |
212
- | `autoInk` | `boolean` | `true` | Auto-inject ink bursts |
211
+ | `autoInk` | `boolean` | `true` | Orbiting ink jets plus timed bursts |
213
212
  | `mouseForce` | `number` | `5` | Mouse velocity force multiplier |
214
213
 
215
214
  ---
@@ -243,7 +242,7 @@ import { FlowField } from "own-the-canvas";
243
242
 
244
243
  ### BubbleUniverse
245
244
 
246
- Physics-based soap bubbles that float, collide, merge on contact, and pop on click. Iridescent shimmer and glow included.
245
+ Soap bubbles with real thin-film color: clear centers, swirling rainbow rims, and window reflections. They drift upward over soft bokeh, merge on contact, and pop on click.
247
246
 
248
247
  **Presets:** `default · soap · neon · deep · minimal · monochrome`
249
248
 
@@ -265,7 +264,7 @@ import { BubbleUniverse } from "own-the-canvas";
265
264
 
266
265
  ### Rain
267
266
 
268
- Falling rain streaks with sinusoidal wind drift, splash particles on ground impact, and a background star field with optional glow halos. Great as a layered overlay.
267
+ A rainy night street: three depth layers of rain in a gusting wind, mist, street lamps mirrored on wet asphalt, ripples and spray, and lightning flashes when the rain is heavy.
269
268
 
270
269
  **Presets:** `default · storm · drizzle · neon · golden · monochrome`
271
270
 
@@ -308,7 +307,7 @@ import { FireEffect } from "own-the-canvas";
308
307
  | `intensity` | `number` | `0.95` | Flame intensity 0–1 |
309
308
  | `windStrength` | `number` | `0.3` | Horizontal wind -1 to 1 |
310
309
  | `cooling` | `number` | `0.3` | Cooling rate — higher = shorter flames |
311
- | `spread` | `number` | `0.7` | Flame spread 0–1 |
310
+ | `spread` | `number` | `0` | Flame spread 0–1 |
312
311
 
313
312
  ---
314
313
 
@@ -330,15 +329,33 @@ All components use `forwardRef` — the ref is forwarded to the underlying `<can
330
329
 
331
330
  ## Living Scenes
332
331
 
333
- Nature effects with real models underneath, built for hero sections:
332
+ Nature effects with real models underneath, built for hero sections. Each one runs on the shared runtime, and the ones marked ✦ react to `data-otc-solid` elements.
334
333
 
335
- > IvyGrowth (space colonization) · Fireflies (pulse-coupled sync) · Dandelion (pappus drag) · GrassField (spring blades) · Moths (transverse orientation) · SunbeamDust (Tyndall-lit dust) · PaperLanterns (buoyancy and depth) · KelpForest (anchored rope dynamics) · SnowDrift (angle-of-repose drifts) · FrostGlass (60° ice dendrites) · OrigamiCranes (faceted 3D paper) · SeasonsTree (kinematic tree, four seasons) · InkMountains (sumi-e ridgelines) · WindowRain (refracting drops on fogged glass) · IncenseSmoke (laminar-to-turbulent plume) · MoonlitSea (moon-path glitter) · CloudSea (sunlit cloud deck) · Ferrofluid (Rosensweig spikes)
334
+ | Component | What you see |
335
+ | --- | --- |
336
+ | `IvyGrowth` ✦ | Ivy that grows in real time and climbs the edges of your elements (space colonization) |
337
+ | `Fireflies` ✦ | Fireflies whose flashing slowly falls into sync, perching on your elements |
338
+ | `Dandelion` ✦ | Dandelion clocks you blow apart with the cursor; seeds parachute down on the wind |
339
+ | `GrassField` | Grass on springs that sways in rolling gusts and parts around the cursor |
340
+ | `Moths` | Moths spiraling a lamp by transverse orientation; your cursor is the light |
341
+ | `SunbeamDust` | Window light shafts where dust only glitters inside the beams |
342
+ | `PaperLanterns` ✦ | Sky lanterns rising with depth and flicker; click a button to release one from it |
343
+ | `KelpForest` | Swaying kelp, schooling fish, and surface light; the cursor pushes the water |
344
+ | `SnowDrift` ✦ | Snow that piles up on your headline and buttons, then slides off the edges |
345
+ | `OrigamiCranes` ✦ | Faceted paper cranes in 3D that bank, flap, and land on your elements |
346
+ | `SeasonsTree` ✦ | A swaying tree living through spring, summer, autumn, and winter |
347
+ | `InkMountains` | Ink-wash ridgelines dissolving into drifting mist, with parallax |
348
+ | `WindowRain` | Rain running down a fogged window over blurred city lights; drag to wipe |
349
+ | `IncenseSmoke` | A thread of incense smoke that breaks into curls as it rises |
350
+ | `MoonlitSea` | Night swells with a glittering moon path and cursor ripples |
351
+ | `CloudSea` | A sunset cloud deck seen from above that parts under the cursor |
352
+ | `Ferrofluid` | Glossy ferrofluid that spikes toward the cursor like a magnet |
336
353
 
337
354
  ---
338
355
 
339
- ## 34 More Components
356
+ ## More Components
340
357
 
341
- > AntColony · AuroraBorealis · BlackHole · Boids · ButterflySwarm · Confetti · CrystalGrowth · DeepSeaBioluminescence · DiffusionAggregation · Fireworks · GalaxySpiral · GameOfLife · Kaleidoscope · LSystem · Lightning · MagneticField · Mandala · Metaballs · NeuralWeb · NoiseGradient · ParticleField · PendulaWave · ReactionDiffusion · SakuraBlossom · SandSimulation · SlimeMold · SolarFlare · SpiderWeb · Spirograph · Starfield · TornadoVortex · VoronoiCells · WatercolorBloom · WaveInterference
358
+ > AntColony · AuroraBorealis · BlackHole · Boids · ButterflySwarm · Confetti · CrystalGrowth · DiffusionAggregation · Fireworks · GalaxySpiral · GameOfLife · Kaleidoscope · Lightning · MagneticField · Mandala · Metaballs · NeuralWeb · NoiseGradient · ParticleField · PendulaWave · ReactionDiffusion · SakuraBlossom · SandSimulation · SlimeMold · SolarFlare · SpiderWeb · Spirograph · Starfield · TornadoVortex · VoronoiCells · WatercolorBloom · WaveInterference
342
359
 
343
360
  Full docs, live previews, and interactive playground:
344
361
 
@@ -15,18 +15,20 @@ export interface AuroraBorealisProps extends BaseCanvasProps {
15
15
  speed?: number;
16
16
  /** Band brightness/opacity 0–1 (default: 0.8) */
17
17
  intensity?: number;
18
- /** Number of aurora layers (default: 5) */
18
+ /** Number of aurora curtains (default: 5) */
19
19
  layers?: number;
20
20
  /** Sky background color (default: "#050a0f") */
21
21
  backgroundColor?: string;
22
- /** Wave height as fraction of canvas height (default: 0.15) */
22
+ /** How far the curtains fold, as a fraction of the sky height (default: 0.15) */
23
23
  waveAmplitude?: number;
24
- /** Wave oscillations across canvas width (default: 2) */
24
+ /** Folds across the width (default: 2) */
25
25
  waveFrequency?: number;
26
26
  /** Background star count (default: 80) */
27
27
  starCount?: number;
28
28
  /** Enable animation (default: true) */
29
29
  animated?: boolean;
30
+ /** The cursor brightens the curtains near it; a tap sets off a substorm surge (default: true) */
31
+ interactive?: boolean;
30
32
  /** Named preset */
31
33
  preset?: AuroraBorealisPreset | string;
32
34
  }
@@ -1,5 +1,3 @@
1
- import { RefObject } from 'react';
2
-
3
1
  export interface UseAuroraBorealisOptions {
4
2
  colors: string[];
5
3
  speed: number;
@@ -10,5 +8,18 @@ export interface UseAuroraBorealisOptions {
10
8
  waveFrequency: number;
11
9
  starCount: number;
12
10
  animated: boolean;
11
+ interactive: boolean;
13
12
  }
14
- export declare function useAuroraBorealis(canvasRef: RefObject<HTMLCanvasElement | null>, options: UseAuroraBorealisOptions): void;
13
+ /**
14
+ * Curtain light at height `d` above the curtain's lower hem (d < 0 is below it), for a curtain of
15
+ * ray height `hgt`: a razor-sharp lower edge and a long exponential glow upward, as in real aurora.
16
+ */
17
+ export declare function curtainProfile(d: number, hgt: number): number;
18
+ /**
19
+ * Northern lights over a mountain lake. Each layer is a folding curtain of vertical rays: a
20
+ * sharp bright hem that fades upward into a second color, brighter where the curtain folds back
21
+ * on itself, rippling slowly along its length. Built in a small light buffer, added onto a
22
+ * starry sky and mirrored in the lake below. The cursor brightens the curtains near it; a tap
23
+ * sets off a substorm surge.
24
+ */
25
+ export declare function useAuroraBorealis(options: UseAuroraBorealisOptions): import('../../hooks/useCanvasSetup').CanvasSetupResult;
@@ -11,4 +11,11 @@ export interface UseButterflySwarmOptions {
11
11
  interactive: boolean;
12
12
  showTrails: boolean;
13
13
  }
14
+ /**
15
+ * A drifting swarm of butterflies. Each one has a forewing and hindwing with dusky roots,
16
+ * veins, a dark margin and a row of pale spots; the wings fold in perspective as they beat
17
+ * (fast downstroke, the odd open-winged glide), and the flutter makes the flight bob and
18
+ * wander. Near butterflies are larger and brighter than far ones. They drift toward a slow
19
+ * cursor and scatter from a fast one. Soft out-of-focus light fills the background.
20
+ */
14
21
  export declare function useButterflySwarm(canvasRef: RefObject<HTMLCanvasElement | null>, options: UseButterflySwarmOptions): void;
@@ -0,0 +1,35 @@
1
+ import { BaseCanvasProps } from '../../types';
2
+
3
+ type CandlePreset = "default" | "ivory" | "rose" | "obsidian" | "spirit" | "monochrome";
4
+ interface CandlePresetValues {
5
+ flameColor?: string;
6
+ coreColor?: string;
7
+ waxColor?: string;
8
+ backgroundColor?: string;
9
+ glowIntensity?: number;
10
+ }
11
+ export declare const PRESETS: Record<CandlePreset, CandlePresetValues>;
12
+ export interface CandleProps extends BaseCanvasProps {
13
+ /** Outer flame and light color (default: "#ff9a3c") */
14
+ flameColor?: string;
15
+ /** White-hot inner flame color (default: "#fff3d1") */
16
+ coreColor?: string;
17
+ /** Wax color (default: "#efe2cc") */
18
+ waxColor?: string;
19
+ /** Room color; "transparent" keeps only the candle and its light (default: "#0b0705") */
20
+ backgroundColor?: string;
21
+ /** Candle scale (default: 1) */
22
+ size?: number;
23
+ /** Pillar height, 0.1–1.2 (default: 0.6) */
24
+ candleHeight?: number;
25
+ /** How restless the flame is, 0–3 (default: 1) */
26
+ flicker?: number;
27
+ /** Strength of the light cast on the room, 0–3 (default: 1) */
28
+ glowIntensity?: number;
29
+ /** Cursor drafts bend the flame; click snuffs and relights it (default: true) */
30
+ interactive?: boolean;
31
+ /** Named preset: "default" | "ivory" | "rose" | "obsidian" | "spirit" | "monochrome" */
32
+ preset?: CandlePreset | string;
33
+ }
34
+ export declare const Candle: import('react').ForwardRefExoticComponent<CandleProps & import('react').RefAttributes<HTMLCanvasElement>>;
35
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Candle } from './Candle';
2
+ export type { CandleProps } from './Candle';
@@ -0,0 +1,18 @@
1
+ export interface UseCandleOptions {
2
+ flameColor: string;
3
+ coreColor: string;
4
+ waxColor: string;
5
+ backgroundColor: string;
6
+ size: number;
7
+ candleHeight: number;
8
+ flicker: number;
9
+ glowIntensity: number;
10
+ interactive: boolean;
11
+ }
12
+ /**
13
+ * A single pillar candle in a dark room. The flame is layered light (halo, body, white-hot
14
+ * core, blue base) that breathes and flickers, leans into drafts from the cursor with a
15
+ * springy wobble, and lights the molten pool, the translucent wax and the table around it.
16
+ * Click to snuff it: the wick smoulders and a thread of smoke curls up, then it relights.
17
+ */
18
+ export declare function useCandle(options: UseCandleOptions): import('../../hooks/useCanvasSetup').CanvasSetupResult;
@@ -0,0 +1,42 @@
1
+ import { BaseCanvasProps } from '../../types';
2
+
3
+ type CatPreset = "default" | "tuxedo" | "siamese" | "grey" | "midnight" | "monochrome";
4
+ interface CatPresetValues {
5
+ furColor?: string;
6
+ stripeColor?: string;
7
+ bellyColor?: string;
8
+ eyeColor?: string;
9
+ cushionColor?: string;
10
+ backgroundColor?: string;
11
+ }
12
+ export declare const PRESETS: Record<CatPreset, CatPresetValues>;
13
+ export interface CatProps extends BaseCanvasProps {
14
+ /** Main coat color (default: "#d9822b") */
15
+ furColor?: string;
16
+ /** Tabby stripes, tail bands and tail tip (default: "#8f4a16") */
17
+ stripeColor?: string;
18
+ /** Chest, muzzle and paws (default: "#f4dcc0") */
19
+ bellyColor?: string;
20
+ /** Iris color, seen when it opens an eye (default: "#9cc23a") */
21
+ eyeColor?: string;
22
+ /** Cushion color (default: "#7a2f3d") */
23
+ cushionColor?: string;
24
+ /** Room color; "transparent" drops the scene (default: "#140f16") */
25
+ backgroundColor?: string;
26
+ /** Cat scale (default: 1) */
27
+ size?: number;
28
+ /** Ears flick at nearby movement and an eye cracks open to watch the cursor (default: true) */
29
+ followCursor?: boolean;
30
+ /** Hover slowly to pet (it purrs and kneads); tap to startle it awake (default: true) */
31
+ interactive?: boolean;
32
+ /** Fixed full-viewport, click-through layer over the page (default: false) */
33
+ overlay?: boolean;
34
+ /** Nap on top of an element marked `data-otc-solid` instead of a cushion (default: false) */
35
+ collide?: boolean;
36
+ /** Overlay z-index (default: 10) */
37
+ zIndex?: number;
38
+ /** Named preset: "default" | "tuxedo" | "siamese" | "grey" | "midnight" | "monochrome" */
39
+ preset?: CatPreset | string;
40
+ }
41
+ export declare const Cat: import('react').ForwardRefExoticComponent<CatProps & import('react').RefAttributes<HTMLCanvasElement>>;
42
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Cat } from './Cat';
2
+ export type { CatProps } from './Cat';
@@ -0,0 +1,22 @@
1
+ export interface UseCatOptions {
2
+ furColor: string;
3
+ stripeColor: string;
4
+ bellyColor: string;
5
+ eyeColor: string;
6
+ cushionColor: string;
7
+ backgroundColor: string;
8
+ size: number;
9
+ followCursor: boolean;
10
+ interactive: boolean;
11
+ overlay: boolean;
12
+ collide: boolean;
13
+ }
14
+ /** Is (x, y) on the curled body? Body-local units of S, origin at the cat's feet. */
15
+ export declare function onCat(x: number, y: number): boolean;
16
+ /**
17
+ * A cat asleep, curled nose-to-tail on a cushion. It breathes, dreams (tail tip and whiskers
18
+ * twitch), flicks an ear at nearby movement and cracks one eye open to watch the cursor. Hover
19
+ * slowly over it to pet it: it purrs and kneads. Tap it and it startles awake, then settles
20
+ * back to sleep. With `collide` it naps on top of a `data-otc-solid` element instead.
21
+ */
22
+ export declare function useCat(options: UseCatOptions): import('../../hooks/useCanvasSetup').CanvasSetupResult;
@@ -0,0 +1,46 @@
1
+ import { BaseCanvasProps } from '../../types';
2
+ import { EyePupilShape } from './useEye';
3
+
4
+ type EyePreset = "default" | "ocean" | "amber" | "violet" | "serpent" | "monochrome";
5
+ interface EyePresetValues {
6
+ irisColor?: string;
7
+ irisInnerColor?: string;
8
+ scleraColor?: string;
9
+ skinColor?: string;
10
+ lashColor?: string;
11
+ backgroundColor?: string;
12
+ pupilShape?: EyePupilShape;
13
+ pupilSize?: number;
14
+ showLashes?: boolean;
15
+ }
16
+ export declare const PRESETS: Record<EyePreset, EyePresetValues>;
17
+ export interface EyeProps extends BaseCanvasProps {
18
+ /** Outer iris color (default: "#4a7c59") */
19
+ irisColor?: string;
20
+ /** Color of the ring around the pupil (default: "#c8963e") */
21
+ irisInnerColor?: string;
22
+ /** Color of the white of the eye (default: "#f1ebe4") */
23
+ scleraColor?: string;
24
+ /** Eyelid and face skin color (default: "#c99a7e") */
25
+ skinColor?: string;
26
+ /** Lash and lash-line color (default: "#1a1210") */
27
+ lashColor?: string;
28
+ /** Canvas background; "transparent" lets the face fade into the page (default: "#0c0807") */
29
+ backgroundColor?: string;
30
+ /** "round" or a reptile-like "slit" pupil (default: "round") */
31
+ pupilShape?: EyePupilShape;
32
+ /** Resting pupil size as a fraction of the iris, 0.08–0.85 (default: 0.38) */
33
+ pupilSize?: number;
34
+ /** Eye scale relative to the canvas, 0.2–1.5 (default: 1) */
35
+ eyeSize?: number;
36
+ /** Gaze follows the cursor anywhere on the page and the pupil narrows as it nears; off = the eye looks around on its own (default: true) */
37
+ followCursor?: boolean;
38
+ /** Average ms between blinks; 0 = only blink when clicked (default: 4000) */
39
+ blinkInterval?: number;
40
+ /** Draw eyelashes (default: true) */
41
+ showLashes?: boolean;
42
+ /** Named preset: "default" | "ocean" | "amber" | "violet" | "serpent" | "monochrome" */
43
+ preset?: EyePreset | string;
44
+ }
45
+ export declare const Eye: import('react').ForwardRefExoticComponent<EyeProps & import('react').RefAttributes<HTMLCanvasElement>>;
46
+ export {};
@@ -0,0 +1,3 @@
1
+ export { Eye } from './Eye';
2
+ export type { EyeProps } from './Eye';
3
+ export type { EyePupilShape } from './useEye';
@@ -0,0 +1,29 @@
1
+ import { RefObject } from 'react';
2
+
3
+ export type EyePupilShape = "round" | "slit";
4
+ export interface UseEyeOptions {
5
+ irisColor: string;
6
+ irisInnerColor: string;
7
+ scleraColor: string;
8
+ skinColor: string;
9
+ lashColor: string;
10
+ backgroundColor: string;
11
+ pupilShape: EyePupilShape;
12
+ pupilSize: number;
13
+ eyeSize: number;
14
+ followCursor: boolean;
15
+ blinkInterval: number;
16
+ showLashes: boolean;
17
+ }
18
+ /** Blink closure 0..1 at `s` seconds into a blink: fast close, brief hold, slower open. */
19
+ export declare function blinkClosure(s: number): number;
20
+ /**
21
+ * A single living eye, painted like a chiaroscuro portrait: skin falls away into darkness
22
+ * around an almond-shaped opening. The iris is a baked texture of radial stroma fibres,
23
+ * a pale collarette, crypts and a dark limbal ring; the pupil breathes (hippus), narrows
24
+ * as the cursor (the light) approaches and widens when startled. The gaze moves in
25
+ * saccades with tiny microsaccades, the upper lid rides with it, the lashes follow the
26
+ * lid through each blink, and the wet cornea holds a fixed window reflection.
27
+ * Click to make it blink.
28
+ */
29
+ export declare function useEye(canvasRef: RefObject<HTMLCanvasElement | null>, options: UseEyeOptions): void;
@@ -43,6 +43,8 @@ export interface FireworksProps extends BaseCanvasProps {
43
43
  glowBlur?: number;
44
44
  /** Canvas background (default: "#04060f") */
45
45
  backgroundColor?: string;
46
+ /** Draw the night scene (sky, stars, burst glow, skyline). false = fireworks only, over a plain backgroundColor fill ("transparent" to overlay). (default: true) */
47
+ showBackground?: boolean;
46
48
  /** Shell upward speed (default: 12) */
47
49
  shellSpeed?: number;
48
50
  /** Number of background stars (default: 0) */
@@ -14,6 +14,7 @@ export interface UseFireworksOptions {
14
14
  glowEffect: boolean;
15
15
  glowBlur: number;
16
16
  backgroundColor: string;
17
+ showBackground: boolean;
17
18
  shellSpeed: number;
18
19
  starCount: number;
19
20
  starColor: string;
@@ -1,5 +1,3 @@
1
- import { RefObject } from 'react';
2
-
3
1
  export interface UseFluidSimulationOptions {
4
2
  resolution: number;
5
3
  viscosity: number;
@@ -14,4 +12,12 @@ export interface UseFluidSimulationOptions {
14
12
  mouseForce: number;
15
13
  inkRadius: number;
16
14
  }
17
- export declare function useFluidSimulation(canvasRef: RefObject<HTMLCanvasElement | null>, options: UseFluidSimulationOptions): void;
15
+ /** Semi-Lagrangian advection; velocities are in cells per second. */
16
+ export declare function advect(W: number, H: number, b: number, d: Float32Array, d0: Float32Array, u: Float32Array, v: Float32Array, dt: number): void;
17
+ /**
18
+ * Ink in water. Three slow ink jets orbit the canvas and bursts bloom on a timer, all cycling
19
+ * through the palette, so the field is always flowing and marbling even untouched. Moving the
20
+ * cursor drags ink and current behind it; a tap blows a ring outward. Ink is tone-mapped so
21
+ * overlapping colors mix rather than blow out, with a faint relief sheen on its folds.
22
+ */
23
+ export declare function useFluidSimulation(options: UseFluidSimulationOptions): import('../../hooks/useCanvasSetup').CanvasSetupResult;
@@ -27,13 +27,13 @@ export interface GameOfLifeProps extends BaseCanvasProps {
27
27
  aliveColor?: string;
28
28
  /** Color of old cells. (default: "#004d14") */
29
29
  oldColor?: string;
30
- /** Color of dead cells / background. (default: "#000000") */
30
+ /** Faint lattice dots marking dead cells. (default: "#000000") */
31
31
  deadColor?: string;
32
32
  /** Color cells by generation age. (default: true) */
33
33
  showAge?: boolean;
34
34
  /** Wrap cells at canvas edges. (default: true) */
35
35
  wrapEdges?: boolean;
36
- /** Click to toggle cells. (default: true) */
36
+ /** Click toggles a cell, drag paints life. (default: true) */
37
37
  interactive?: boolean;
38
38
  /** Canvas background color. (default: "#000000") */
39
39
  backgroundColor?: string;
@@ -20,4 +20,13 @@ export interface UseGameOfLifeOptions {
20
20
  interactive: boolean;
21
21
  backgroundColor: string;
22
22
  }
23
- export declare function useGameOfLife(canvasRef: RefObject<HTMLCanvasElement | null>, options: UseGameOfLifeOptions, handleRef: RefObject<GameOfLifeHandle | null>): void;
23
+ /** One Conway generation. Cells hold their age (0 = dead, 1 = newborn, capped at 255). */
24
+ export declare function stepLife(grid: Uint8Array, next: Uint8Array, cols: number, rows: number, wrap: boolean): number;
25
+ /**
26
+ * Conway's Game of Life as living light. Cells are soft glowing dots that swell in when born,
27
+ * cool from the newborn color to the old color as they age, and leave embers that fade when
28
+ * they die; generations cross-fade instead of snapping, under a bloom made from the board
29
+ * itself. Click toggles a cell, dragging paints life. When the board settles into still lifes
30
+ * and blinkers, a few gliders drift in to stir it up again.
31
+ */
32
+ export declare function useGameOfLife(options: UseGameOfLifeOptions, handleRef: RefObject<GameOfLifeHandle | null>): import('../../hooks/useCanvasSetup').CanvasSetupResult;
@@ -0,0 +1,43 @@
1
+ import { BaseCanvasProps } from '../../types';
2
+
3
+ type HummingbirdPreset = "default" | "ruby" | "violet" | "sunset" | "frost" | "monochrome";
4
+ interface HummingbirdPresetValues {
5
+ bodyColor?: string;
6
+ throatColor?: string;
7
+ bellyColor?: string;
8
+ flowerColor?: string;
9
+ backgroundColor?: string;
10
+ }
11
+ export declare const PRESETS: Record<HummingbirdPreset, HummingbirdPresetValues>;
12
+ export interface HummingbirdProps extends BaseCanvasProps {
13
+ /** Iridescent back and head (default: "#2f9e6a") */
14
+ bodyColor?: string;
15
+ /** Gorget (throat patch) color; it flashes as the bird turns (default: "#ff2d6f") */
16
+ throatColor?: string;
17
+ /** Belly color (default: "#e9e4d4") */
18
+ bellyColor?: string;
19
+ /** Trumpet flower color (default: "#e8433a") */
20
+ flowerColor?: string;
21
+ /** Garden color; "transparent" drops the scene (default: "#0c1712") */
22
+ backgroundColor?: string;
23
+ /** Number of birds, 0–8 (default: 1) */
24
+ birdCount?: number;
25
+ /** Bird scale (default: 1) */
26
+ size?: number;
27
+ /** Dart speed multiplier (default: 1) */
28
+ speed?: number;
29
+ /** A slow cursor draws a bird over to look; a fast one scares it off (default: true) */
30
+ interactive?: boolean;
31
+ /** Draw the flowers (default: true) */
32
+ showFlowers?: boolean;
33
+ /** Fixed full-viewport, click-through layer over the page (default: false) */
34
+ overlay?: boolean;
35
+ /** Elements marked `data-otc-solid` become flowers; the hovered one is visited first (default: false) */
36
+ collide?: boolean;
37
+ /** Overlay z-index (default: 10) */
38
+ zIndex?: number;
39
+ /** Named preset: "default" | "ruby" | "violet" | "sunset" | "frost" | "monochrome" */
40
+ preset?: HummingbirdPreset | string;
41
+ }
42
+ export declare const Hummingbird: import('react').ForwardRefExoticComponent<HummingbirdProps & import('react').RefAttributes<HTMLCanvasElement>>;
43
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Hummingbird } from './Hummingbird';
2
+ export type { HummingbirdProps } from './Hummingbird';
@@ -0,0 +1,35 @@
1
+ import { Solid } from '../../runtime/physics';
2
+
3
+ export interface UseHummingbirdOptions {
4
+ bodyColor: string;
5
+ throatColor: string;
6
+ bellyColor: string;
7
+ flowerColor: string;
8
+ backgroundColor: string;
9
+ birdCount: number;
10
+ size: number;
11
+ speed: number;
12
+ interactive: boolean;
13
+ showFlowers: boolean;
14
+ overlay: boolean;
15
+ collide: boolean;
16
+ }
17
+ /** Somewhere a bird can feed: the beak tip goes to (x, y) while the bird faces `face`. */
18
+ export interface Nectar {
19
+ x: number;
20
+ y: number;
21
+ face: 1 | -1;
22
+ key: string;
23
+ }
24
+ /** Feeding spots beside each solid's left and right edge, beak touching the edge. */
25
+ export declare function solidNectar(solids: readonly Solid[]): Nectar[];
26
+ /**
27
+ * Hummingbirds in a dusk garden. Wings beat too fast to see, so each stroke is drawn as a
28
+ * motion blur, densest at the ends where the wing turns, with a faint strobe of the wing
29
+ * itself. A bird darts between trumpet flowers, stops dead, fans its tail to brake, sips
30
+ * with a pumping motion and backs straight out before darting away; pollen puffs where it
31
+ * feeds and its gorget flashes as it turns. A slow cursor draws one over to inspect it, a
32
+ * fast one scares it off, and rival birds chase each other away from the flowers. With
33
+ * `collide`, `data-otc-solid` elements become flowers, and the hovered one is visited now.
34
+ */
35
+ export declare function useHummingbird(options: UseHummingbirdOptions): import('../../hooks/useCanvasSetup').CanvasSetupResult;