@ansh-ui/core 0.2.0 → 0.3.1
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.
- package/dist/behaviours.cjs +20 -15
- package/dist/behaviours.d.cts +2 -2
- package/dist/behaviours.d.ts +2 -2
- package/dist/behaviours.js +3 -2
- package/dist/{chunk-56NNBIAO.js → chunk-2DOA43UB.js} +1047 -18
- package/dist/chunk-2DOA43UB.js.map +1 -0
- package/dist/{chunk-7MYTSAPR.js → chunk-37GPMMMT.js} +3 -3
- package/dist/{chunk-7MYTSAPR.js.map → chunk-37GPMMMT.js.map} +1 -1
- package/dist/{chunk-23GSSIMK.cjs → chunk-4ORYTFY3.cjs} +3 -3
- package/dist/{chunk-23GSSIMK.cjs.map → chunk-4ORYTFY3.cjs.map} +1 -1
- package/dist/{chunk-MMO7KO53.cjs → chunk-FNR4B3KY.cjs} +3 -3
- package/dist/{chunk-MMO7KO53.cjs.map → chunk-FNR4B3KY.cjs.map} +1 -1
- package/dist/{chunk-BOQQHICI.js → chunk-GQH5ZHPB.js} +3 -3
- package/dist/{chunk-BOQQHICI.js.map → chunk-GQH5ZHPB.js.map} +1 -1
- package/dist/{chunk-R7UJ7MWP.cjs → chunk-OSNUN5JJ.cjs} +1070 -34
- package/dist/chunk-OSNUN5JJ.cjs.map +1 -0
- package/dist/{chunk-GHBRGMSO.cjs → chunk-PZF3YXVE.cjs} +6 -6
- package/dist/{chunk-GHBRGMSO.cjs.map → chunk-PZF3YXVE.cjs.map} +1 -1
- package/dist/{chunk-UJBXY6QC.cjs → chunk-SSAWZIO2.cjs} +150 -28
- package/dist/chunk-SSAWZIO2.cjs.map +1 -0
- package/dist/{chunk-C6XPQO2O.js → chunk-WLOGUD3G.js} +126 -5
- package/dist/{chunk-C6XPQO2O.js.map → chunk-WLOGUD3G.js.map} +1 -1
- package/dist/{chunk-KTUBCQC3.js → chunk-YHSCAGCI.js} +3 -3
- package/dist/{chunk-KTUBCQC3.js.map → chunk-YHSCAGCI.js.map} +1 -1
- package/dist/color.cjs +39 -39
- package/dist/color.d.cts +5 -4
- package/dist/color.d.ts +5 -4
- package/dist/color.js +3 -3
- package/dist/effects.cjs +53 -25
- package/dist/effects.d.cts +4 -4
- package/dist/effects.d.ts +4 -4
- package/dist/effects.js +4 -4
- package/dist/{index-CQEEPu-D.d.ts → index-DN0bQII7.d.ts} +47 -2
- package/dist/{index-DHOfsEIn.d.cts → index-DmJ3i1Tr.d.cts} +330 -4
- package/dist/{index-Dl8GCsya.d.cts → index-Dv3gw7Mb.d.cts} +47 -2
- package/dist/{index-CCdpefMp.d.ts → index-SO8zHlVo.d.ts} +330 -4
- package/dist/index.cjs +186 -154
- package/dist/index.d.cts +10 -9
- package/dist/index.d.ts +10 -9
- package/dist/index.js +9 -9
- package/dist/math.d.cts +3 -2
- package/dist/math.d.ts +3 -2
- package/dist/noise.d.cts +2 -1
- package/dist/noise.d.ts +2 -1
- package/dist/{palette-6HkVltYU.d.ts → palette-Dcomsp9R.d.cts} +2 -1
- package/dist/{palette-6HkVltYU.d.cts → palette-Dcomsp9R.d.ts} +2 -1
- package/dist/{random--4mSc5Lp.d.cts → random-YnhdaiIx.d.cts} +2 -1
- package/dist/{random--4mSc5Lp.d.ts → random-YnhdaiIx.d.ts} +2 -1
- package/dist/{reduced-motion-D0LUgZle.d.cts → reduced-motion-DaeXwgzb.d.cts} +2 -1
- package/dist/{reduced-motion-D0LUgZle.d.ts → reduced-motion-DaeXwgzb.d.ts} +2 -1
- package/package.json +1 -1
- package/dist/chunk-56NNBIAO.js.map +0 -1
- package/dist/chunk-R7UJ7MWP.cjs.map +0 -1
- package/dist/chunk-UJBXY6QC.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/render/surface.ts","../src/render/draw.ts","../src/effects/mount.ts","../src/effects/particles/buffer.ts","../src/effects/backgrounds/aurora.ts","../src/effects/backgrounds/mesh-gradient.ts","../src/effects/particles/field.ts","../src/effects/particles/constellation.ts","../src/effects/particles/powder-explosion.ts","../src/effects/particles/strange-attractor.ts","../src/effects/particles/swarm.ts","../src/effects/atmosphere/meteors.ts","../src/effects/atmosphere/precipitation.ts","../src/effects/atmosphere/fireflies.ts","../src/effects/atmosphere/light-rays.ts","../src/effects/atmosphere/smoke.ts","../src/effects/geometry/floating-geometry.ts","../src/effects/geometry/orbit.ts","../src/effects/surfaces/waves.ts","../src/effects/surfaces/blob.ts","../src/effects/overlays/noise-layer.ts","../src/effects/overlays/spotlight.ts","../src/effects/index.ts"],"names":["DEFAULTS","MAX_PARTICLES"],"mappings":"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","file":"chunk-2DOA43UB.js","sourcesContent":["import { clamp } from '../math/scalar'\nimport { observeResize } from '../observers/pool'\nimport type { Unsubscribe } from '../kernel/types'\n\n/**\n * A managed canvas drawing surface.\n *\n * Getting a canvas right is deceptively fiddly, and every project gets some of it wrong:\n *\n * - **Device pixel ratio.** A canvas sized only in CSS renders blurry on any Retina display.\n * The backing store must be `size × dpr` with a matching context transform.\n * - **Resolution scaling.** Full DPR is wasteful for soft, out-of-focus imagery. A blurred\n * gradient at 0.5× resolution is visually identical and costs a quarter of the fill rate,\n * so effects declare their own `resolution` and adaptive quality can lower it further.\n * - **Context loss.** Browsers discard canvas backing stores under memory pressure —\n * routinely on iOS Safari with several canvases on a page. Without a restore path the\n * effect silently goes blank and never comes back.\n * - **Resize storms.** A window drag fires dozens of resize events per second, and\n * reallocating a multi-megabyte backing store on each one janks badly. Resizes are\n * coalesced to one per frame.\n */\n\nexport interface Size {\n /** CSS pixels. */\n width: number\n height: number\n /** Backing-store pixels: `width × dpr × resolution`. */\n pixelWidth: number\n pixelHeight: number\n /** The effective scale factor from CSS pixels to backing-store pixels. */\n scale: number\n}\n\nexport interface SurfaceOptions {\n /**\n * Resolution multiplier applied on top of the device pixel ratio, in `(0, 1]`.\n * `1` is full DPR; `0.5` quarters the pixel count. Default `1`.\n */\n resolution?: number\n /**\n * Cap on the device pixel ratio actually used. Default `2`.\n *\n * Phones report DPRs up to 4. Rendering a full-viewport canvas at 4× costs sixteen times\n * the fill rate of 1× for a difference nobody can see on a 5-inch screen at arm's length.\n */\n maxDevicePixelRatio?: number\n /** `alpha: false` lets the compositor skip blending. Default `true` — most effects need it. */\n alpha?: boolean\n /** Hint that the canvas will be read back with `getImageData`. Default `false`. */\n willReadFrequently?: boolean\n /** Called after a resize, before the next frame is drawn. */\n onResize?: (size: Size) => void\n /**\n * Called after the context is lost and restored. All GPU-side state is gone at this point;\n * the effect must rebuild any cached gradients or patterns.\n */\n onRestore?: () => void\n}\n\nexport interface Surface {\n readonly canvas: HTMLCanvasElement\n /** The 2D context, or `null` if the browser refused to provide one. */\n readonly ctx: CanvasRenderingContext2D | null\n readonly size: Readonly<Size>\n /** `true` while the context is lost; effects should skip drawing. */\n readonly isLost: boolean\n /**\n * Reset the transform to the current scale and clear the canvas.\n * Call at the top of each frame unless deliberately compositing over the previous one.\n */\n clear(): void\n /** Change the resolution multiplier at runtime. Used by adaptive quality. */\n setResolution(resolution: number): void\n /** Force a re-measure and resize. */\n resize(): void\n destroy(): void\n}\n\n/**\n * Create a managed surface over a canvas element.\n *\n * The canvas is sized from its parent element, because a canvas has no intrinsic layout size\n * of its own — it must be told, and its parent is the thing CSS has actually sized.\n */\nexport function createSurface(canvas: HTMLCanvasElement, options: SurfaceOptions = {}): Surface {\n const maxDpr = Math.max(1, options.maxDevicePixelRatio ?? 2)\n let resolution = clamp(options.resolution ?? 1, 0.1, 1)\n\n const size: Size = {\n width: 1,\n height: 1,\n pixelWidth: 1,\n pixelHeight: 1,\n scale: 1,\n }\n\n let ctx: CanvasRenderingContext2D | null = null\n let isLost = false\n let pendingResize = true\n let rafHandle: number | null = null\n let destroyed = false\n\n const acquireContext = (): void => {\n ctx = canvas.getContext('2d', {\n alpha: options.alpha ?? true,\n willReadFrequently: options.willReadFrequently ?? false,\n })\n if (!ctx) {\n console.error(\n '[ansh] Could not acquire a 2D canvas context. ' +\n 'The effect will not render. This usually means too many live canvases on the page.',\n )\n }\n }\n\n acquireContext()\n\n const measure = (): void => {\n // Measure the parent, not the canvas: the canvas' own box is driven by the attributes we\n // are about to set, so reading it would be circular.\n const host = canvas.parentElement\n const rect = host ? host.getBoundingClientRect() : canvas.getBoundingClientRect()\n\n const cssWidth = Math.max(1, Math.round(rect.width))\n const cssHeight = Math.max(1, Math.round(rect.height))\n\n const dpr = Math.min(\n maxDpr,\n typeof devicePixelRatio === 'number' && devicePixelRatio > 0 ? devicePixelRatio : 1,\n )\n const scale = dpr * resolution\n\n const pixelWidth = Math.max(1, Math.round(cssWidth * scale))\n const pixelHeight = Math.max(1, Math.round(cssHeight * scale))\n\n const changed =\n size.width !== cssWidth ||\n size.height !== cssHeight ||\n size.pixelWidth !== pixelWidth ||\n size.pixelHeight !== pixelHeight\n\n size.width = cssWidth\n size.height = cssHeight\n size.pixelWidth = pixelWidth\n size.pixelHeight = pixelHeight\n size.scale = scale\n\n if (!changed) return\n\n // Assigning width/height clears the canvas and resets all context state, which is why the\n // transform must be reapplied afterwards and why we avoid doing this unless it changed.\n canvas.width = pixelWidth\n canvas.height = pixelHeight\n canvas.style.width = `${cssWidth}px`\n canvas.style.height = `${cssHeight}px`\n\n if (ctx) ctx.setTransform(scale, 0, 0, scale, 0, 0)\n\n options.onResize?.({ ...size })\n }\n\n /**\n * Coalesce resizes to one per animation frame.\n *\n * `ResizeObserver` can fire several times in a single frame during a window drag, and each\n * reallocation of the backing store is a large, synchronous memory operation.\n */\n const scheduleResize = (): void => {\n pendingResize = true\n if (rafHandle !== null || destroyed) return\n rafHandle = requestAnimationFrame(() => {\n rafHandle = null\n if (destroyed) return\n if (pendingResize) {\n pendingResize = false\n measure()\n }\n })\n }\n\n const stopResizeObserver = canvas.parentElement\n ? observeResize(canvas.parentElement, scheduleResize)\n : () => {}\n\n // --- Context loss ---------------------------------------------------------\n\n const onContextLost = (event: Event): void => {\n // Preventing the default is what makes the context *restorable*; without it the browser\n // never fires `contextrestored` and the canvas is permanently dead.\n event.preventDefault()\n isLost = true\n }\n\n const onContextRestored = (): void => {\n isLost = false\n acquireContext()\n // Everything was discarded: re-measure, reapply the transform, and let the effect rebuild\n // its cached gradients.\n measure()\n if (ctx) ctx.setTransform(size.scale, 0, 0, size.scale, 0, 0)\n options.onRestore?.()\n }\n\n canvas.addEventListener('contextlost', onContextLost)\n canvas.addEventListener('contextrestored', onContextRestored)\n\n measure()\n\n return {\n canvas,\n get ctx() {\n return ctx\n },\n get size() {\n return size\n },\n get isLost() {\n return isLost\n },\n\n clear() {\n if (!ctx || isLost) return\n // Clear in device space to guarantee full coverage regardless of the current transform,\n // then restore the scale transform for the effect's own drawing.\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n ctx.clearRect(0, 0, size.pixelWidth, size.pixelHeight)\n ctx.setTransform(size.scale, 0, 0, size.scale, 0, 0)\n },\n\n setResolution(next: number) {\n const clamped = clamp(next, 0.1, 1)\n // Ignore sub-2% changes: adaptive quality moves continuously, and reallocating the\n // backing store for an imperceptible difference costs far more than it saves.\n if (Math.abs(clamped - resolution) < 0.02) return\n resolution = clamped\n scheduleResize()\n },\n\n resize: scheduleResize,\n\n destroy() {\n destroyed = true\n if (rafHandle !== null) cancelAnimationFrame(rafHandle)\n stopResizeObserver()\n canvas.removeEventListener('contextlost', onContextLost)\n canvas.removeEventListener('contextrestored', onContextRestored)\n // Shrinking to 1×1 releases the backing store immediately rather than waiting for GC.\n // On iOS this is the difference between a page that survives navigation and one that\n // gets its whole tab reaped for memory.\n canvas.width = 1\n canvas.height = 1\n ctx = null\n },\n }\n}\n\n/** Is `OffscreenCanvas` with a 2D context available? Gates the worker rendering path. */\nexport function supportsOffscreenCanvas(): boolean {\n if (typeof OffscreenCanvas === 'undefined') return false\n try {\n const probe = new OffscreenCanvas(1, 1)\n return probe.getContext('2d') !== null\n } catch {\n return false\n }\n}\n\n/** Can this canvas hand its rendering to a worker? Requires `transferControlToOffscreen`. */\nexport function supportsWorkerRendering(canvas: HTMLCanvasElement): boolean {\n return (\n supportsOffscreenCanvas() &&\n typeof (canvas as HTMLCanvasElement & { transferControlToOffscreen?: unknown })\n .transferControlToOffscreen === 'function'\n )\n}\n\nexport type Unsub = Unsubscribe\n","import { TAU } from '../math/scalar'\nimport { toRgbString } from '../color/format'\nimport type { Rgb } from '../color/types'\n\n/**\n * Canvas drawing primitives shared across effects.\n *\n * These exist so that \"draw a soft glow\" is one call with one consistent look, rather than\n * eight effects each inventing their own radial gradient with slightly different falloff.\n * Consistency of light and falloff is a large part of why a component set looks designed\n * rather than assembled.\n */\n\n/**\n * A cache for `CanvasGradient` objects.\n *\n * Creating a gradient is not free, and effects that draw dozens of glows per frame would\n * otherwise allocate dozens of gradient objects per frame. Keyed by geometry and colour, so\n * a field of identically-coloured particles shares one object.\n *\n * Bounded and cleared wholesale rather than evicted per-entry: gradients are cheap to rebuild,\n * the working set is small and stable, and LRU bookkeeping would cost more than it saves.\n */\nexport class GradientCache {\n private readonly cache = new Map<string, CanvasGradient>()\n constructor(private readonly limit = 128) {}\n\n radial(\n ctx: CanvasRenderingContext2D,\n radius: number,\n stops: readonly [number, string][],\n key: string,\n ): CanvasGradient {\n const cached = this.cache.get(key)\n if (cached) return cached\n\n // Built at the origin; callers translate the context rather than moving the gradient,\n // which is what makes caching possible at all.\n const gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, Math.max(0.01, radius))\n for (const [offset, color] of stops) gradient.addColorStop(offset, color)\n\n if (this.cache.size >= this.limit) this.cache.clear()\n this.cache.set(key, gradient)\n return gradient\n }\n\n clear(): void {\n this.cache.clear()\n }\n}\n\n/**\n * A soft radial glow.\n *\n * The falloff is deliberately not linear. A linear alpha ramp produces a visible hard edge at\n * the boundary because the eye is sensitive to the discontinuity in the *derivative*. Two\n * intermediate stops approximating a Gaussian shoulder remove it, which is the difference\n * between \"glow\" and \"circle with a gradient\".\n */\nexport function drawGlow(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n radius: number,\n color: Rgb,\n intensity = 1,\n cache?: GradientCache,\n): void {\n if (radius <= 0 || intensity <= 0) return\n\n const rgb = `${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)}`\n const alpha = color.a * intensity\n\n const stops: [number, string][] = [\n [0, `rgba(${rgb},${alpha})`],\n [0.35, `rgba(${rgb},${alpha * 0.55})`],\n [0.65, `rgba(${rgb},${alpha * 0.18})`],\n [1, `rgba(${rgb},0)`],\n ]\n\n ctx.save()\n ctx.translate(x, y)\n\n const gradient = cache\n ? cache.radial(ctx, radius, stops, `${rgb}|${alpha.toFixed(3)}|${radius.toFixed(1)}`)\n : buildRadial(ctx, radius, stops)\n\n ctx.fillStyle = gradient\n ctx.beginPath()\n ctx.arc(0, 0, radius, 0, TAU)\n ctx.fill()\n ctx.restore()\n}\n\nfunction buildRadial(\n ctx: CanvasRenderingContext2D,\n radius: number,\n stops: readonly [number, string][],\n): CanvasGradient {\n const gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, Math.max(0.01, radius))\n for (const [offset, color] of stops) gradient.addColorStop(offset, color)\n return gradient\n}\n\n/** A filled circle. Cheaper than {@link drawGlow} when no falloff is needed. */\nexport function drawDot(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n radius: number,\n color: Rgb,\n): void {\n if (radius <= 0) return\n ctx.fillStyle = toRgbString(color)\n ctx.beginPath()\n ctx.arc(x, y, radius, 0, TAU)\n ctx.fill()\n}\n\n/**\n * A closed Catmull-Rom spline through the given points, rendered as bézier segments.\n *\n * Effects that morph organic shapes (blobs, aurora ribbons, wave crests) need a curve that\n * passes *through* its control points, which bézier does not and Catmull-Rom does. Converting\n * to cubic béziers lets the canvas rasterise it natively rather than us approximating with\n * line segments.\n *\n * @param tension `0.5` is the standard Catmull-Rom; lower is tighter, higher is looser.\n */\nexport function traceClosedSpline(\n ctx: CanvasRenderingContext2D,\n points: readonly { x: number; y: number }[],\n tension = 0.5,\n): void {\n const n = points.length\n if (n < 3) {\n if (n === 2) {\n ctx.moveTo(points[0].x, points[0].y)\n ctx.lineTo(points[1].x, points[1].y)\n }\n return\n }\n\n const at = (i: number) => points[((i % n) + n) % n]\n const k = tension / 3\n\n ctx.moveTo(points[0].x, points[0].y)\n\n for (let i = 0; i < n; i++) {\n const p0 = at(i - 1)\n const p1 = at(i)\n const p2 = at(i + 1)\n const p3 = at(i + 2)\n\n // Tangents are the halved difference of the neighbours — the Catmull-Rom definition.\n ctx.bezierCurveTo(\n p1.x + (p2.x - p0.x) * k,\n p1.y + (p2.y - p0.y) * k,\n p2.x - (p3.x - p1.x) * k,\n p2.y - (p3.y - p1.y) * k,\n p2.x,\n p2.y,\n )\n }\n\n ctx.closePath()\n}\n\n/** An open Catmull-Rom spline. Used for wave crests and ribbon paths. */\nexport function traceOpenSpline(\n ctx: CanvasRenderingContext2D,\n points: readonly { x: number; y: number }[],\n tension = 0.5,\n): void {\n const n = points.length\n if (n < 2) return\n if (n === 2) {\n ctx.moveTo(points[0].x, points[0].y)\n ctx.lineTo(points[1].x, points[1].y)\n return\n }\n\n const k = tension / 3\n // Clamp at the ends: duplicating the endpoint gives a zero tangent, which is what makes the\n // curve start and finish cleanly instead of overshooting.\n const at = (i: number) => points[Math.max(0, Math.min(n - 1, i))]\n\n ctx.moveTo(points[0].x, points[0].y)\n for (let i = 0; i < n - 1; i++) {\n const p0 = at(i - 1)\n const p1 = at(i)\n const p2 = at(i + 1)\n const p3 = at(i + 2)\n ctx.bezierCurveTo(\n p1.x + (p2.x - p0.x) * k,\n p1.y + (p2.y - p0.y) * k,\n p2.x - (p3.x - p1.x) * k,\n p2.y - (p3.y - p1.y) * k,\n p2.x,\n p2.y,\n )\n }\n}\n\n/** A rounded rectangle path, using the native `roundRect` when available. */\nexport function traceRoundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n): void {\n const r = Math.min(radius, width / 2, height / 2)\n if (typeof ctx.roundRect === 'function') {\n ctx.roundRect(x, y, width, height, r)\n return\n }\n ctx.moveTo(x + r, y)\n ctx.lineTo(x + width - r, y)\n ctx.arcTo(x + width, y, x + width, y + r, r)\n ctx.lineTo(x + width, y + height - r)\n ctx.arcTo(x + width, y + height, x + width - r, y + height, r)\n ctx.lineTo(x + r, y + height)\n ctx.arcTo(x, y + height, x, y + height - r, r)\n ctx.lineTo(x, y + r)\n ctx.arcTo(x, y, x + r, y, r)\n ctx.closePath()\n}\n\n/**\n * Canvas composite operations, narrowed to the ones that behave consistently across browsers\n * and are actually useful for the effects here.\n *\n * `'lighter'` (additive) is the workhorse: overlapping glows accumulate brightness the way\n * real light does, which is what makes particle fields look luminous instead of pasted.\n */\nexport type BlendMode =\n | 'source-over'\n | 'lighter'\n | 'screen'\n | 'overlay'\n | 'multiply'\n | 'soft-light'\n | 'hard-light'\n | 'color-dodge'\n | 'hue'\n | 'saturation'\n | 'color'\n | 'luminosity'\n\n/**\n * Apply a CSS filter string to the context, guarding against unsupported values.\n *\n * `ctx.filter` is unsupported in Safari before 17. Rather than losing the effect entirely we\n * detect it once and effects fall back to their non-filtered path.\n */\nlet filterSupport: boolean | null = null\n\nexport function supportsCanvasFilter(ctx: CanvasRenderingContext2D): boolean {\n if (filterSupport !== null) return filterSupport\n const previous = ctx.filter\n try {\n ctx.filter = 'blur(1px)'\n filterSupport = ctx.filter === 'blur(1px)'\n } catch {\n filterSupport = false\n } finally {\n ctx.filter = previous\n }\n return filterSupport\n}\n\n/** Reset the memoised filter probe. Test-only. */\nexport function resetFilterSupport(): void {\n filterSupport = null\n}\n","import { clamp } from '../math/scalar'\nimport { createRng } from '../math/random'\nimport { createNoise } from '../noise'\nimport { getTicker } from '../kernel/ticker'\nimport { getRegistry } from '../plugins/registry'\nimport { resolveMotion, onReducedMotionChange } from '../a11y/reduced-motion'\nimport { observeIntersection } from '../observers/pool'\nimport { type PointerTracker, trackPointer } from '../observers/pointer'\nimport { createSurface } from '../render/surface'\nimport { supportsCanvasFilter } from '../render/draw'\nimport { resolvePalette } from '../color/palette'\nimport { parseColor } from '../color/parse'\nimport type { Unsubscribe } from '../kernel/types'\nimport type { BaseEffectOptions, EffectContext, EffectDefinition, EffectInstance } from './types'\n\n/**\n * Mount an effect into a host element.\n *\n * Everything that is the same for every effect happens here, exactly once:\n *\n * - creating and sizing the canvas (DPR-correct, resize-coalesced, context-loss-recovering)\n * - resolving colours, seeds and noise fields\n * - pointer tracking, if the effect wants it\n * - reduced-motion resolution and live reaction to the preference changing\n * - off-screen pausing via a pooled IntersectionObserver\n * - adaptive quality → render resolution\n * - one ticker subscription, in the `write` phase\n * - complete teardown\n *\n * An individual effect therefore contains only what makes it *that* effect. This is the\n * single most important structural decision in the library: it is why adding an effect is\n * ~100 lines and why the React and Vue components are ~40.\n */\n\nexport interface EffectHandle {\n readonly canvas: HTMLCanvasElement\n /**\n * Apply new options.\n *\n * Live-updates whatever the effect supports and remounts when a structural option changes.\n * Framework bindings call this on every prop change, so it must be cheap in the common case.\n */\n update(options: Partial<BaseEffectOptions & Record<string, unknown>>): void\n pause(): void\n resume(): void\n /** Force one frame to be drawn even while paused. Used for the static reduced-motion render. */\n renderOnce(): void\n destroy(): void\n readonly isRunning: boolean\n}\n\n/** Styles applied to the canvas so it fills its host without affecting layout. */\nconst CANVAS_STYLE: Partial<CSSStyleDeclaration> = {\n position: 'absolute',\n inset: '0',\n width: '100%',\n height: '100%',\n display: 'block',\n // A background canvas must never intercept clicks meant for the content above it.\n pointerEvents: 'none',\n}\n\nexport function mountEffect<Options extends BaseEffectOptions>(\n definition: EffectDefinition<Options>,\n host: HTMLElement,\n userOptions: Partial<Options> = {},\n): EffectHandle {\n getRegistry().requireCapability(definition.capability ?? 'effect:core')\n\n let options = { ...definition.defaults, ...stripUndefined(userOptions) } as Required<Options>\n\n // --- Canvas -------------------------------------------------------------\n const canvas = document.createElement('canvas')\n canvas.setAttribute('aria-hidden', 'true')\n // Decorative canvases are invisible to assistive technology. An effect that conveys\n // information must be paired with a text alternative by the component that uses it — the\n // canvas itself is never the accessible representation.\n canvas.setAttribute('role', 'presentation')\n Object.assign(canvas.style, CANVAS_STYLE)\n\n // The host must establish a containing block for the absolutely-positioned canvas. We only\n // set this when the host is `static`, so an author's own `relative`/`absolute` is respected.\n if (getComputedStyle(host).position === 'static') host.style.position = 'relative'\n host.appendChild(canvas)\n\n let instance: EffectInstance | null = null\n let context: EffectContext | null = null\n let pointer: PointerTracker | null = null\n let tickerSubscription: Unsubscribe | null = null\n let intersectionSubscription: Unsubscribe | null = null\n let reducedMotionSubscription: Unsubscribe | null = null\n\n let destroyed = false\n let userPaused = options.paused ?? false\n let offscreen = false\n let motion = resolveMotion(options.reducedMotion, 0.25)\n let pendingSingleFrame = false\n\n const ticker = getTicker()\n\n const surface = createSurface(canvas, {\n resolution: options.resolution ?? 1,\n alpha: true,\n onResize: (size) => {\n instance?.resize?.(size)\n // A resize invalidates the current frame; redraw immediately rather than waiting, so a\n // window drag doesn't show a stretched previous frame.\n pendingSingleFrame = true\n },\n onRestore: () => {\n // The backing store was discarded. Rebuild the effect from scratch: cached gradients,\n // patterns and image data are all gone, and there is no way to know which an effect held.\n rebuild()\n },\n })\n\n // --- Construction -------------------------------------------------------\n\n function buildContext(): EffectContext | null {\n const ctx = surface.ctx\n if (!ctx) return null\n\n const seed = options.seed ?? 1\n const colors = resolveResolvedColors(options.colors, host)\n\n return {\n ctx,\n surface,\n size: surface.size,\n rng: createRng(seed),\n noise: createNoise(seed),\n pointer: pointer ? pointer.state : null,\n host,\n colors,\n }\n }\n\n function rebuild(): void {\n instance?.destroy?.()\n instance = null\n\n context = buildContext()\n if (!context) return\n\n instance = definition.setup(context, options)\n instance.resize?.(surface.size)\n pendingSingleFrame = true\n }\n\n function ensurePointer(): void {\n const wants = options.interactive !== false\n if (wants && !pointer) {\n pointer = trackPointer(host)\n } else if (!wants && pointer) {\n pointer.destroy()\n pointer = null\n }\n }\n\n ensurePointer()\n rebuild()\n\n // --- The frame ----------------------------------------------------------\n\n const applyQuality = (quality: number): void => {\n if (options.performance === 'high' || options.performance === 'low') return\n // Resolution tracks quality but never drops below half: below that, the softening is\n // visible as blockiness rather than reading as depth of field.\n const base = options.resolution ?? 1\n surface.setResolution(base * clamp(0.5 + quality * 0.5, 0.5, 1))\n }\n\n const frame = (state: {\n time: number\n delta: number\n rawDelta: number\n frame: number\n fps: number\n quality: number\n timestamp: number\n }): void => {\n if (destroyed || surface.isLost || !instance || !context) return\n if ((userPaused || offscreen || !motion.animate) && !pendingSingleFrame) return\n\n pendingSingleFrame = false\n\n const ctx = surface.ctx\n if (!ctx) return\n\n applyQuality(state.quality)\n\n ctx.save()\n\n const opacity = clamp(options.opacity ?? 1, 0, 1)\n if (opacity < 1) ctx.globalAlpha = opacity\n\n const blur = options.blur ?? 0\n if (blur > 0 && supportsCanvasFilter(ctx)) ctx.filter = `blur(${blur}px)`\n\n // Scale the time the effect sees rather than the global clock: two effects on the same\n // page can run at different speeds, and reduced-motion `slow` applies per effect.\n const speed = (options.speed ?? 1) * motion.timeScale\n instance.frame({\n ...state,\n time: state.time * speed,\n delta: state.delta * speed,\n })\n\n ctx.restore()\n }\n\n function startTicker(): void {\n if (tickerSubscription || destroyed) return\n tickerSubscription = ticker.add(frame, { phase: 'write', name: `effect:${definition.name}` })\n }\n\n function stopTicker(): void {\n tickerSubscription?.()\n tickerSubscription = null\n }\n\n // Quality pinning has to happen after the ticker exists, and applies globally, so it is\n // deliberately a one-way door: an effect asking for high quality does not un-pin later.\n if (options.performance === 'high') ticker.lockQuality(1)\n else if (options.performance === 'low') ticker.lockQuality(0.4)\n\n // --- Off-screen pausing -------------------------------------------------\n\n if (options.pauseOffscreen !== false) {\n intersectionSubscription = observeIntersection(\n host,\n (entry) => {\n offscreen = !entry.isIntersecting\n if (offscreen) stopTicker()\n else if (!userPaused && motion.animate) startTicker()\n },\n // A generous margin means the effect is already warm by the time it scrolls in, rather\n // than starting from its first frame in view.\n { rootMargin: '200px' },\n )\n }\n\n // --- Reduced motion -----------------------------------------------------\n\n reducedMotionSubscription = onReducedMotionChange(() => {\n motion = resolveMotion(options.reducedMotion, 0.25)\n if (motion.animate && !userPaused && !offscreen) {\n startTicker()\n } else {\n stopTicker()\n if (motion.renderOnce) renderSingleFrame()\n }\n })\n\n function renderSingleFrame(): void {\n pendingSingleFrame = true\n // `once` runs on the next frame, which guarantees the canvas has been laid out and sized.\n ticker.once((state) => frame(state))\n }\n\n // --- Initial start ------------------------------------------------------\n\n if (motion.animate && !userPaused) startTicker()\n else if (motion.renderOnce) renderSingleFrame()\n\n // --- Handle -------------------------------------------------------------\n\n return {\n canvas,\n\n update(next) {\n if (destroyed) return\n\n const incoming = stripUndefined(next)\n const structural = definition.structuralOptions ?? []\n\n const needsRebuild =\n // A changed seed changes every stochastic decision; nothing can be salvaged.\n ('seed' in incoming && incoming.seed !== options.seed) ||\n structural.some(\n (key) => key in incoming && incoming[key as string] !== options[key as keyof Options],\n ) ||\n // No live-update path means the only correct response is to rebuild.\n (!instance?.update && Object.keys(incoming).length > 0)\n\n const previousInteractive = options.interactive\n options = { ...options, ...incoming } as Required<Options>\n\n if (options.interactive !== previousInteractive) {\n ensurePointer()\n // The context holds a reference to the pointer state object, so it must be rebuilt.\n rebuild()\n } else if (needsRebuild) {\n rebuild()\n } else if (instance?.update && context) {\n // Re-resolve colours here rather than inside the effect: parsing is memoised but the\n // resolved `Rgb[]` is what the frame loop reads, and it must never do the work itself.\n const resolved = resolveResolvedColors(options.colors, host)\n ;(context as { colors: readonly ReturnType<typeof parseColor>[] }).colors = resolved\n instance.update(incoming as Record<string, unknown>, context)\n pendingSingleFrame = true\n }\n\n if (options.resolution !== undefined) surface.setResolution(options.resolution)\n\n const wasPaused = userPaused\n userPaused = options.paused ?? false\n motion = resolveMotion(options.reducedMotion, 0.25)\n\n if (wasPaused && !userPaused && motion.animate && !offscreen) startTicker()\n if (!wasPaused && userPaused) stopTicker()\n if (!motion.animate && motion.renderOnce) renderSingleFrame()\n },\n\n pause() {\n userPaused = true\n stopTicker()\n },\n\n resume() {\n userPaused = false\n if (motion.animate && !offscreen) startTicker()\n },\n\n renderOnce: renderSingleFrame,\n\n destroy() {\n if (destroyed) return\n destroyed = true\n\n stopTicker()\n intersectionSubscription?.()\n reducedMotionSubscription?.()\n pointer?.destroy()\n instance?.destroy?.()\n surface.destroy()\n\n if (canvas.parentNode === host) host.removeChild(canvas)\n\n instance = null\n context = null\n pointer = null\n },\n\n get isRunning() {\n return tickerSubscription !== null\n },\n }\n}\n\n/**\n * Resolve the `colors` option into parsed sRGB.\n *\n * Colours are resolved against the *host element*, not the document root, so `var(--brand)`\n * picks up the right value inside a `.dark` subtree or a themed card.\n */\nfunction resolveResolvedColors(\n colors: BaseEffectOptions['colors'],\n host: HTMLElement,\n): ReturnType<typeof parseColor>[] {\n if (Array.isArray(colors)) {\n return colors.map((color) => {\n if (typeof color === 'string' && color.includes('var(')) {\n const resolved = resolveAgainst(color, host)\n if (resolved) return resolved\n }\n return parseColor(color)\n })\n }\n return resolvePalette(colors as never)\n}\n\n/** Resolve a `var()`-containing colour using the host's computed cascade. */\nfunction resolveAgainst(value: string, host: HTMLElement): ReturnType<typeof parseColor> | null {\n const probe = document.createElement('span')\n probe.style.display = 'none'\n probe.style.color = value\n host.appendChild(probe)\n const computed = getComputedStyle(probe).color\n host.removeChild(probe)\n try {\n return computed ? parseColor(computed) : null\n } catch {\n return null\n }\n}\n\n/**\n * Drop `undefined` values from a partial options object.\n *\n * React and Vue both pass `undefined` for props that were not supplied, and a naive spread\n * would let those overwrite the effect's defaults with `undefined` — the classic bug where\n * omitting a prop breaks the component instead of using its default.\n */\nfunction stripUndefined<T extends object>(input: T): Partial<T> {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(input)) {\n if (value !== undefined) out[key] = value\n }\n return out as Partial<T>\n}\n\n/**\n * Register an effect so the CLI, docs site and registry can discover it.\n * Returns the definition unchanged, so it can wrap a declaration inline.\n */\nexport function defineEffect<Options extends BaseEffectOptions>(\n definition: EffectDefinition<Options>,\n): EffectDefinition<Options> {\n const registry = getRegistry()\n if (!registry.has('effect', definition.name)) {\n registry.register('effect', definition.name, definition)\n }\n return definition\n}\n","/**\n * A structure-of-arrays particle buffer.\n *\n * Every particle effect in the library sits on this. The layout is deliberate:\n *\n * **SoA, not AoS.** An array of `{x, y, vx, vy}` objects means the integrator walks a pointer\n * chase through scattered heap allocations, and V8 must check the hidden class of each. Parallel\n * `Float32Array`s mean the integration loop reads contiguous memory, stays monomorphic, and\n * never allocates. At 2,000 particles the difference is roughly 4×; more importantly, the AoS\n * version generates garbage every frame, and GC pauses are exactly the stutter users notice.\n *\n * **Swap-remove, not splice.** Killing a particle moves the last live one into its slot and\n * decrements the count. O(1), no reallocation, no shifting. Particle order is not meaningful\n * so nothing is lost — and the effects that *do* care about draw order (depth-sorted snow)\n * sort an index array instead.\n *\n * **Fixed capacity.** Allocated once at the maximum the effect will ever need. Growing a\n * typed array means allocating a new one and copying, which is precisely the kind of\n * multi-megabyte operation that must never happen inside a frame.\n */\nexport class ParticleBuffer {\n readonly x: Float32Array\n readonly y: Float32Array\n readonly vx: Float32Array\n readonly vy: Float32Array\n /** Remaining life in seconds. `Infinity` for particles that never expire. */\n readonly life: Float32Array\n /** Life the particle started with, for computing normalised age. */\n readonly maxLife: Float32Array\n readonly size: Float32Array\n /** Index into the effect's resolved palette. */\n readonly colorIndex: Uint8Array\n /** Free-form per-particle scalar — phase, spin, depth, whatever the effect needs. */\n readonly seed: Float32Array\n /** Second free-form scalar. */\n readonly extra: Float32Array\n\n private liveCount = 0\n\n constructor(readonly capacity: number) {\n const n = Math.max(1, Math.floor(capacity))\n this.x = new Float32Array(n)\n this.y = new Float32Array(n)\n this.vx = new Float32Array(n)\n this.vy = new Float32Array(n)\n this.life = new Float32Array(n)\n this.maxLife = new Float32Array(n)\n this.size = new Float32Array(n)\n this.colorIndex = new Uint8Array(n)\n this.seed = new Float32Array(n)\n this.extra = new Float32Array(n)\n }\n\n get count(): number {\n return this.liveCount\n }\n\n /**\n * Claim a slot.\n * @returns The particle index, or `-1` when the buffer is full. Callers must check.\n */\n spawn(): number {\n if (this.liveCount >= this.capacity) return -1\n return this.liveCount++\n }\n\n /**\n * Kill particle `index` by swapping the last live particle into its slot.\n *\n * The caller's loop must **not** advance its cursor after calling this, since a new particle\n * now occupies the current index. Every consumer in this package follows that contract with\n * a `while` loop rather than a `for`.\n */\n kill(index: number): void {\n const last = --this.liveCount\n if (index === last) return\n\n this.x[index] = this.x[last]\n this.y[index] = this.y[last]\n this.vx[index] = this.vx[last]\n this.vy[index] = this.vy[last]\n this.life[index] = this.life[last]\n this.maxLife[index] = this.maxLife[last]\n this.size[index] = this.size[last]\n this.colorIndex[index] = this.colorIndex[last]\n this.seed[index] = this.seed[last]\n this.extra[index] = this.extra[last]\n }\n\n /** Normalised age in `[0, 1]`. `0` for immortal particles. */\n age(index: number): number {\n const max = this.maxLife[index]\n if (!Number.isFinite(max) || max <= 0) return 0\n return 1 - this.life[index] / max\n }\n\n /**\n * Reduce the live count, keeping the first `target` particles.\n *\n * Used by adaptive quality: dropping from 1,200 to 800 particles must not resample or\n * reshuffle, because a visible reshuffle draws far more attention than the density change.\n */\n truncate(target: number): void {\n this.liveCount = Math.max(0, Math.min(this.liveCount, Math.floor(target)))\n }\n\n clear(): void {\n this.liveCount = 0\n }\n}\n\n/**\n * Advance positions by velocity — symplectic Euler.\n *\n * Deliberately not Runge-Kutta. RK4 is more *accurate*, but for particles driven by noise\n * fields there is no ground truth to be accurate to, and symplectic Euler has the property\n * that actually matters here: it conserves energy over long runs, so a field of particles\n * doesn't slowly gain or lose speed over minutes of animation.\n */\nexport function integrate(buffer: ParticleBuffer, dt: number, drag = 0): void {\n const { x, y, vx, vy } = buffer\n const count = buffer.count\n\n if (drag > 0) {\n // Frame-rate independent drag: the fraction retained per second, raised to dt.\n const retain = Math.pow(1 - Math.min(0.999, drag), dt)\n for (let i = 0; i < count; i++) {\n vx[i] *= retain\n vy[i] *= retain\n x[i] += vx[i] * dt\n y[i] += vy[i] * dt\n }\n return\n }\n\n for (let i = 0; i < count; i++) {\n x[i] += vx[i] * dt\n y[i] += vy[i] * dt\n }\n}\n\n/** Reduce life and swap-remove anything that has expired. */\nexport function ageAndCull(buffer: ParticleBuffer, dt: number): void {\n let i = 0\n while (i < buffer.count) {\n buffer.life[i] -= dt\n if (buffer.life[i] <= 0) {\n buffer.kill(i)\n // No increment: a different particle now occupies index `i`.\n continue\n }\n i++\n }\n}\n\n/** Wrap particles that leave the bounds back to the opposite edge, with a margin. */\nexport function wrapBounds(\n buffer: ParticleBuffer,\n width: number,\n height: number,\n margin = 0,\n): void {\n const { x, y } = buffer\n const count = buffer.count\n const left = -margin\n const top = -margin\n const right = width + margin\n const bottom = height + margin\n const spanX = right - left\n const spanY = bottom - top\n\n for (let i = 0; i < count; i++) {\n if (x[i] < left) x[i] += spanX\n else if (x[i] > right) x[i] -= spanX\n if (y[i] < top) y[i] += spanY\n else if (y[i] > bottom) y[i] -= spanY\n }\n}\n\n/**\n * A uniform grid for neighbour queries.\n *\n * The constellation effect needs \"every pair of particles within distance R\", which is O(n²)\n * naively — 2,000 particles is 4 million distance checks per frame, which is not viable. A\n * spatial hash with cell size R reduces it to checking each particle against the nine cells\n * around it, which is effectively O(n) for uniformly distributed particles.\n *\n * Cells are stored as a flat `Int32Array` bucket list rather than an array of arrays, so\n * rebuilding it each frame allocates nothing.\n */\nexport class SpatialGrid {\n private cols = 1\n private rows = 1\n private cellSize = 1\n /** Start index of each cell's run inside `items`. Length `cols * rows + 1`. */\n private cellStart: Int32Array\n /** Particle indices, grouped by cell. */\n private items: Int32Array\n /** Scratch counters used while building. */\n private counts: Int32Array\n\n constructor(private capacity: number) {\n this.cellStart = new Int32Array(2)\n this.items = new Int32Array(Math.max(1, capacity))\n this.counts = new Int32Array(1)\n }\n\n /**\n * Bucket every live particle. Must be called before {@link forEachNeighbour}.\n * @param cellSize Should equal the query radius — smaller means more cells to scan, larger\n * means more candidates per cell.\n */\n build(buffer: ParticleBuffer, width: number, height: number, cellSize: number): void {\n this.cellSize = Math.max(1, cellSize)\n this.cols = Math.max(1, Math.ceil(width / this.cellSize))\n this.rows = Math.max(1, Math.ceil(height / this.cellSize))\n\n const cellCount = this.cols * this.rows\n if (this.counts.length < cellCount) this.counts = new Int32Array(cellCount)\n else this.counts.fill(0, 0, cellCount)\n if (this.cellStart.length < cellCount + 1) this.cellStart = new Int32Array(cellCount + 1)\n if (this.items.length < this.capacity) this.items = new Int32Array(this.capacity)\n\n const count = buffer.count\n\n // Counting sort: first tally per cell…\n for (let i = 0; i < count; i++) {\n this.counts[this.cellIndex(buffer.x[i], buffer.y[i])]++\n }\n\n // …then prefix-sum into start offsets…\n let running = 0\n for (let c = 0; c < cellCount; c++) {\n this.cellStart[c] = running\n running += this.counts[c]\n }\n this.cellStart[cellCount] = running\n\n // …then place, reusing `counts` as a per-cell write cursor.\n this.counts.fill(0, 0, cellCount)\n for (let i = 0; i < count; i++) {\n const cell = this.cellIndex(buffer.x[i], buffer.y[i])\n this.items[this.cellStart[cell] + this.counts[cell]++] = i\n }\n }\n\n private cellIndex(x: number, y: number): number {\n const cx = Math.min(this.cols - 1, Math.max(0, Math.floor(x / this.cellSize)))\n const cy = Math.min(this.rows - 1, Math.max(0, Math.floor(y / this.cellSize)))\n return cy * this.cols + cx\n }\n\n /**\n * Visit candidate neighbours of particle `index` in the 3×3 cell block around it.\n *\n * Only pairs where `neighbour > index` are visited, so each pair is reported exactly once —\n * which halves the work and means the caller doesn't need a \"have I drawn this line\" check.\n * The callback still receives candidates outside the radius; the caller does the exact test,\n * because it usually needs the distance anyway.\n */\n forEachNeighbour(\n buffer: ParticleBuffer,\n index: number,\n visit: (neighbour: number) => void,\n ): void {\n const cx = Math.floor(buffer.x[index] / this.cellSize)\n const cy = Math.floor(buffer.y[index] / this.cellSize)\n\n const minX = Math.max(0, cx - 1)\n const maxX = Math.min(this.cols - 1, cx + 1)\n const minY = Math.max(0, cy - 1)\n const maxY = Math.min(this.rows - 1, cy + 1)\n\n for (let y = minY; y <= maxY; y++) {\n const rowBase = y * this.cols\n for (let x = minX; x <= maxX; x++) {\n const cell = rowBase + x\n const start = this.cellStart[cell]\n const end = this.cellStart[cell + 1]\n for (let k = start; k < end; k++) {\n const neighbour = this.items[k]\n if (neighbour > index) visit(neighbour)\n }\n }\n }\n }\n}\n","import { TAU, clamp, lerp } from '../../math/scalar'\nimport { expandPalette } from '../../color/palette'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition, EffectInstance } from '../types'\nimport type { Rgb } from '../../color/types'\n\n/**\n * Aurora — vertical curtains of light with filament structure.\n *\n * What separates this from \"a few blurred gradients\" is the *filaments*. A real aurora is\n * ridged: bright vertical striations at many scales, because the emission follows magnetic\n * field lines. We get that from ridged multifractal noise (`1 - |n|`, squared) sampled per\n * vertical slice, which produces sharp bright lines with soft valleys between them — exactly\n * the wrong result for terrain and exactly the right one here.\n *\n * Rendering is a set of vertical slices per curtain rather than a single filled path, because\n * the per-slice alpha *is* the filament structure. Each slice is one gradient fill, so a\n * four-curtain composition at 48 slices is under 200 fills per frame — comfortably inside\n * budget at half resolution, which is where blurred imagery belongs anyway.\n */\n\nexport interface AuroraOptions extends BaseEffectOptions {\n /** Number of overlapping curtains. More reads as depth. Default `4`. */\n curtains?: number\n /** Vertical slices per curtain — the filament resolution. Default `48`. */\n slices?: number\n /** Height of the curtains as a fraction of the canvas. Default `0.75`. */\n height?: number\n /** Vertical position of the curtain band centre, `0` top to `1` bottom. Default `0.42`. */\n position?: number\n /** Spatial frequency of the filaments. Higher is finer. Default `2.4`. */\n detail?: number\n /** How far curtains drift horizontally, as a fraction of width. Default `0.18`. */\n drift?: number\n /** Softness of the vertical falloff, in `[0, 1]`. Default `0.55`. */\n falloff?: number\n /** Pointer influence on curtain sway, in `[0, 1]`. Default `0.35`. */\n pointerInfluence?: number\n}\n\nconst DEFAULTS: Required<AuroraOptions> = {\n colors: 'aurora',\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 24,\n blend: 'lighter',\n seed: 1,\n interactive: true,\n // Aurora is entirely soft-focus. Rendering above half resolution is spending fill rate on\n // detail the blur immediately destroys.\n resolution: 0.5,\n performance: 'auto',\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n curtains: 4,\n slices: 48,\n height: 0.75,\n position: 0.42,\n detail: 2.4,\n drift: 0.18,\n falloff: 0.55,\n pointerInfluence: 0.35,\n}\n\ninterface Curtain {\n color: Rgb\n /** Horizontal centre as a fraction of width. */\n center: number\n /** Width as a fraction of canvas width. */\n width: number\n /** Independent noise offset, so curtains don't move in lockstep. */\n noiseOffset: number\n /** Drift speed multiplier. */\n speed: number\n /** Vertical offset as a fraction of height. */\n yOffset: number\n /** Per-curtain alpha, so nearer curtains read brighter. */\n alpha: number\n}\n\nexport const aurora: EffectDefinition<AuroraOptions> = defineEffect<AuroraOptions>({\n name: 'aurora',\n defaults: DEFAULTS,\n // Changing the curtain count rebuilds the whole composition; there is nothing to reconcile.\n structuralOptions: ['curtains', 'slices'],\n\n setup(context, options) {\n let opts = options\n let curtains: Curtain[] = []\n const ridged = context.noise.ridged2D({ octaves: 4, gain: 0.55, lacunarity: 2.2 })\n const flow = context.noise.fbm2D({ octaves: 2, gain: 0.5 })\n\n function build(): void {\n const count = Math.max(1, Math.floor(opts.curtains))\n const palette = expandPalette(context.colors, count)\n const rng = context.rng\n\n curtains = []\n for (let i = 0; i < count; i++) {\n // Spread curtains across the width with jitter, rather than evenly — even spacing\n // reads as a chart, jittered spacing reads as weather.\n const slot = (i + 0.5) / count\n curtains.push({\n color: palette[i],\n center: clamp(slot + rng.range(-0.12, 0.12), 0.05, 0.95),\n width: rng.range(0.28, 0.6),\n noiseOffset: rng.range(0, 100),\n speed: rng.range(0.6, 1.4),\n yOffset: rng.range(-0.08, 0.08),\n // Later curtains are dimmer, which creates depth ordering without a z-buffer.\n alpha: lerp(0.95, 0.5, count === 1 ? 0 : i / (count - 1)),\n })\n }\n }\n\n build()\n\n const instance: EffectInstance = {\n frame({ time }) {\n const { ctx, size, pointer } = context\n const { width, height } = size\n\n context.surface.clear()\n\n const sliceCount = Math.max(4, Math.floor(opts.slices))\n const bandHeight = height * clamp(opts.height, 0.05, 2)\n const bandCenter = height * clamp(opts.position, 0, 1)\n const intensity = Math.max(0, opts.intensity)\n const detail = Math.max(0.1, opts.detail)\n const drift = opts.drift\n const falloff = clamp(opts.falloff, 0, 1)\n\n // Pointer sway is applied to the whole band rather than per-curtain, so the aurora\n // leans toward the cursor as one coherent sheet.\n const sway =\n pointer && opts.interactive !== false\n ? (pointer.smoothNx - 0.5) * width * opts.pointerInfluence\n : 0\n\n const previousBlend = ctx.globalCompositeOperation\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n for (const curtain of curtains) {\n const t = time * curtain.speed\n const curtainWidth = width * curtain.width\n const centerX = width * curtain.center + sway * curtain.speed * 0.5\n const startX = centerX - curtainWidth / 2\n const sliceWidth = curtainWidth / sliceCount\n\n const top = bandCenter - bandHeight / 2 + height * curtain.yOffset\n const bottom = top + bandHeight\n\n // One gradient per curtain, reused across all its slices. The gradient is vertical\n // and identical for every slice, so building it per slice would be pure waste.\n const gradient = ctx.createLinearGradient(0, top, 0, bottom)\n const rgb = `${Math.round(curtain.color.r * 255)},${Math.round(curtain.color.g * 255)},${Math.round(curtain.color.b * 255)}`\n const peak = curtain.alpha * intensity\n\n // Asymmetric falloff: aurora is brightest low down and fades upward, because that\n // is where the atmosphere is densest. Symmetric fading looks like a lens flare.\n gradient.addColorStop(0, `rgba(${rgb},0)`)\n gradient.addColorStop(lerp(0.45, 0.25, falloff), `rgba(${rgb},${peak * 0.75})`)\n gradient.addColorStop(0.72, `rgba(${rgb},${peak})`)\n gradient.addColorStop(1, `rgba(${rgb},0)`)\n\n ctx.fillStyle = gradient\n\n for (let i = 0; i < sliceCount; i++) {\n const u = i / sliceCount\n\n // Filament brightness. Sampling in `u` (curtain-local space) rather than screen\n // space keeps the striations attached to the curtain as it drifts.\n const filament = ridged(\n u * detail * 4 + curtain.noiseOffset,\n t * 0.12 + curtain.noiseOffset,\n )\n\n // Horizontal displacement — the curtain folds and waves.\n const fold = flow(u * detail + curtain.noiseOffset, t * 0.18) * width * drift * 0.5\n\n // Vertical breathing, out of phase per slice so the lower edge ripples.\n const rise = Math.sin(u * TAU * 1.5 + t * 0.6 + curtain.noiseOffset) * height * 0.03\n\n /**\n * Per-slice brightness.\n *\n * Two things are being balanced. Squaring the ridged sample emphasises the filaments —\n * that contrast is what makes it read as aurora rather than as a blurred gradient. But\n * the gradient stops *already* carry the curtain's alpha, so using the squared value\n * directly multiplies the two and lands around 0.04 typical: visible only as a faint\n * smudge, which is what this originally did.\n *\n * The floor fixes it without losing the ridges. A real aurora is a diffuse glow with\n * bright striations through it, not isolated filaments on black, so a base level plus\n * a squared ridge term is both brighter and more physically honest.\n */\n const alpha = 0.3 + 0.7 * filament * filament\n if (alpha < 0.012) continue\n\n ctx.globalAlpha = clamp(alpha, 0, 1)\n // Overlap slices by a pixel: at fractional widths, exact tiling leaves visible\n // seams that the blur turns into vertical banding.\n ctx.fillRect(startX + i * sliceWidth + fold, top + rise, sliceWidth + 1, bandHeight)\n }\n }\n\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = previousBlend\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<AuroraOptions>) } as Required<AuroraOptions>\n // `mountEffect` re-resolves `context.colors` in place before calling us, so rebuilding\n // picks up the new palette. `detail` needs no rebuild — it is a sampling frequency\n // read fresh each frame, not a property of the noise field.\n if ('colors' in next) build()\n },\n\n destroy() {\n curtains = []\n },\n }\n\n return instance\n },\n})\n","import { TAU, clamp, lerp } from '../../math/scalar'\nimport { expandPalette } from '../../color/palette'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition, EffectInstance } from '../types'\nimport type { Rgb } from '../../color/types'\n\n/**\n * Mesh Gradient — soft overlapping colour fields that drift and blend.\n *\n * This is the effect behind almost every modern SaaS hero section, and it is nearly always\n * implemented as a static SVG or a CSS blur stack. Doing it properly on canvas buys three\n * things those can't:\n *\n * 1. **Motion that isn't a loop.** Control points follow a two-frequency Lissajous path with\n * an irrational frequency ratio, so the composition never visibly repeats. A CSS keyframe\n * animation always does, and the eye finds the loop point within about fifteen seconds.\n * 2. **Perceptual blending.** Overlaps are composited in linear-ish additive space with\n * OKLab-derived palettes, so blue over magenta stays vivid instead of going grey.\n * 3. **Pointer response.** Points lean toward the cursor, which makes a hero section feel\n * inhabited rather than decorative.\n *\n * Rendered as one radial gradient fill per point at quarter resolution with a heavy blur. The\n * blur is doing most of the visual work, which is precisely why the low resolution is free.\n */\n\nexport interface MeshGradientOptions extends BaseEffectOptions {\n /** Number of colour control points. Default `5`. */\n points?: number\n /** Radius of each field as a fraction of the canvas diagonal. Default `0.55`. */\n radius?: number\n /** How far each point wanders from its home, as a fraction of the canvas. Default `0.22`. */\n wander?: number\n /** Pointer attraction strength, in `[0, 1]`. Default `0.4`. */\n pointerInfluence?: number\n /** Radius of the pointer's influence as a fraction of the canvas. Default `0.45`. */\n pointerRadius?: number\n /**\n * Fill the canvas with the darkest palette colour before drawing.\n * Without it the effect composites onto whatever is behind, which is usually what you want\n * for an overlay and not what you want for a hero. Default `true`.\n */\n backdrop?: boolean\n /** Grain overlay strength, in `[0, 1]`. A little grain hides gradient banding. Default `0.04`. */\n grain?: number\n}\n\nconst DEFAULTS: Required<MeshGradientOptions> = {\n colors: 'ansh',\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 40,\n blend: 'lighter',\n seed: 7,\n interactive: true,\n // Quarter resolution. The output is a heavily blurred gradient field — there is literally no\n // recoverable detail above this, and it cuts fill cost by 16×.\n resolution: 0.25,\n performance: 'auto',\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n points: 5,\n radius: 0.55,\n wander: 0.22,\n pointerInfluence: 0.4,\n pointerRadius: 0.45,\n backdrop: true,\n grain: 0.04,\n}\n\ninterface MeshPoint {\n color: Rgb\n /** Home position, normalised. */\n homeX: number\n homeY: number\n /** Two frequencies per axis produce a non-repeating Lissajous path. */\n freqX1: number\n freqX2: number\n freqY1: number\n freqY2: number\n phaseX: number\n phaseY: number\n /** Per-point radius multiplier, so fields differ in scale. */\n scale: number\n /** Current resolved position in pixels — held so the pointer term can ease rather than snap. */\n x: number\n y: number\n}\n\nexport const meshGradient: EffectDefinition<MeshGradientOptions> =\n defineEffect<MeshGradientOptions>({\n name: 'mesh-gradient',\n defaults: DEFAULTS,\n structuralOptions: ['points'],\n\n setup(context, options) {\n let opts = options\n let points: MeshPoint[] = []\n let backdropColor: Rgb = { r: 0, g: 0, b: 0, a: 1 }\n\n /** Grain is precomputed once into an offscreen tile and stamped, not generated per frame. */\n let grainTile: HTMLCanvasElement | null = null\n\n function build(): void {\n const count = Math.max(1, Math.floor(opts.points))\n const palette = expandPalette(context.colors, count)\n const rng = context.rng\n\n // The backdrop is the darkest palette entry, so the composition reads as light emerging\n // from a dark ground rather than colours floating on an arbitrary background.\n backdropColor = palette.reduce((darkest, c) =>\n c.r + c.g + c.b < darkest.r + darkest.g + darkest.b ? c : darkest,\n )\n\n points = []\n for (let i = 0; i < count; i++) {\n // Distribute homes on a jittered ring rather than uniformly at random: pure random\n // placement clusters, leaving one half of the canvas empty about a third of the time.\n const angle = (i / count) * TAU + rng.range(-0.4, 0.4)\n const distance = rng.range(0.18, 0.42)\n\n points.push({\n color: palette[i],\n homeX: 0.5 + Math.cos(angle) * distance,\n homeY: 0.5 + Math.sin(angle) * distance,\n // Irrational-ish frequency ratios: the path's period is the LCM of the two, which\n // for these values is long enough that no viewer will see it close.\n freqX1: rng.range(0.08, 0.17),\n freqX2: rng.range(0.19, 0.31),\n freqY1: rng.range(0.09, 0.19),\n freqY2: rng.range(0.21, 0.34),\n phaseX: rng.range(0, TAU),\n phaseY: rng.range(0, TAU),\n scale: rng.range(0.75, 1.3),\n x: 0,\n y: 0,\n })\n }\n }\n\n /**\n * Build the grain tile.\n *\n * A 128×128 tile of seeded noise, drawn as a repeating pattern. Generating grain per frame\n * via `getImageData` would cost more than the entire rest of the effect; a static tile is\n * visually indistinguishable because grain reads as texture, not as motion.\n */\n function buildGrain(): void {\n const strength = clamp(opts.grain, 0, 1)\n if (strength <= 0) {\n grainTile = null\n return\n }\n\n const SIZE = 128\n const tile = document.createElement('canvas')\n tile.width = SIZE\n tile.height = SIZE\n const tileCtx = tile.getContext('2d')\n if (!tileCtx) {\n grainTile = null\n return\n }\n\n const image = tileCtx.createImageData(SIZE, SIZE)\n const data = image.data\n const rng = context.rng.fork()\n\n for (let i = 0; i < data.length; i += 4) {\n const value = rng.next() * 255\n data[i] = value\n data[i + 1] = value\n data[i + 2] = value\n data[i + 3] = 255\n }\n tileCtx.putImageData(image, 0, 0)\n grainTile = tile\n }\n\n build()\n buildGrain()\n\n const instance: EffectInstance = {\n frame({ time }) {\n const { ctx, size, pointer, surface } = context\n const { width, height } = size\n const diagonal = Math.hypot(width, height)\n\n surface.clear()\n\n const intensity = clamp(opts.intensity, 0, 4)\n const wander = opts.wander\n const baseRadius = diagonal * clamp(opts.radius, 0.05, 2)\n\n // --- Backdrop ---\n if (opts.backdrop) {\n ctx.globalCompositeOperation = 'source-over'\n ctx.fillStyle = `rgb(${Math.round(backdropColor.r * 255)},${Math.round(backdropColor.g * 255)},${Math.round(backdropColor.b * 255)})`\n ctx.fillRect(0, 0, width, height)\n }\n\n // --- Pointer target ---\n const interactive = opts.interactive !== false && pointer !== null\n const pointerX = interactive ? pointer.smoothNx : 0.5\n const pointerY = interactive ? pointer.smoothNy : 0.5\n const pointerActive = interactive && pointer.everInside\n const pointerStrength = pointerActive ? clamp(opts.pointerInfluence, 0, 1) : 0\n const pointerRadius = clamp(opts.pointerRadius, 0.01, 2)\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n for (const point of points) {\n // Two-frequency Lissajous drift.\n const driftX =\n (Math.sin(time * point.freqX1 + point.phaseX) * 0.6 +\n Math.sin(time * point.freqX2 + point.phaseX * 1.7) * 0.4) *\n wander\n const driftY =\n (Math.cos(time * point.freqY1 + point.phaseY) * 0.6 +\n Math.cos(time * point.freqY2 + point.phaseY * 1.3) * 0.4) *\n wander\n\n let nx = point.homeX + driftX\n let ny = point.homeY + driftY\n\n if (pointerStrength > 0) {\n // Attraction falls off with distance, so only nearby fields react. A global pull\n // would drag the whole composition and destroy the layout.\n const dx = pointerX - nx\n const dy = pointerY - ny\n const distance = Math.hypot(dx, dy)\n const falloff = clamp(1 - distance / pointerRadius, 0, 1)\n // Squared falloff gives a soft shoulder rather than a visible influence boundary.\n const pull = falloff * falloff * pointerStrength\n nx += dx * pull\n ny += dy * pull\n }\n\n point.x = nx * width\n point.y = ny * height\n\n const radius = baseRadius * point.scale\n const rgb = `${Math.round(point.color.r * 255)},${Math.round(point.color.g * 255)},${Math.round(point.color.b * 255)}`\n const peak = clamp(point.color.a * intensity * 0.85, 0, 1)\n\n const gradient = ctx.createRadialGradient(point.x, point.y, 0, point.x, point.y, radius)\n // Four stops approximating a Gaussian. Two stops leave a visible ring at the\n // boundary because the eye detects the discontinuity in the alpha derivative.\n gradient.addColorStop(0, `rgba(${rgb},${peak})`)\n gradient.addColorStop(0.3, `rgba(${rgb},${peak * 0.62})`)\n gradient.addColorStop(0.62, `rgba(${rgb},${peak * 0.22})`)\n gradient.addColorStop(1, `rgba(${rgb},0)`)\n\n ctx.fillStyle = gradient\n // A rect rather than an arc: the gradient already defines the shape via its alpha,\n // and rect fills avoid the path rasterisation entirely.\n ctx.fillRect(point.x - radius, point.y - radius, radius * 2, radius * 2)\n }\n\n // --- Grain ---\n if (grainTile) {\n const strength = clamp(opts.grain, 0, 1)\n ctx.globalCompositeOperation = 'overlay'\n ctx.globalAlpha = strength\n const pattern = ctx.createPattern(grainTile, 'repeat')\n if (pattern) {\n ctx.fillStyle = pattern\n ctx.fillRect(0, 0, width, height)\n }\n ctx.globalAlpha = 1\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n const previousGrain = opts.grain\n opts = {\n ...opts,\n ...(next as Partial<MeshGradientOptions>),\n } as Required<MeshGradientOptions>\n if ('colors' in next) build()\n if (opts.grain !== previousGrain) buildGrain()\n },\n\n destroy() {\n points = []\n if (grainTile) {\n grainTile.width = 1\n grainTile.height = 1\n grainTile = null\n }\n },\n }\n\n return instance\n },\n })\n\n/**\n * Animated Gradient — a simpler two-to-many stop linear gradient that rotates and shifts.\n *\n * Shares the mesh gradient's palette handling but costs a single fill per frame, which makes it\n * the right choice for cards, buttons and any element small enough that the mesh's radial\n * fields would overlap into mush.\n */\nexport interface AnimatedGradientOptions extends BaseEffectOptions {\n /** Rotations per minute of the gradient axis. `0` holds a fixed angle. Default `4`. */\n rotation?: number\n /** Starting angle in degrees. Default `120`. */\n angle?: number\n /** How far stops slide along the axis, in `[0, 1]`. Default `0.25`. */\n travel?: number\n /** Number of interpolated stops handed to the canvas. Default `24`. */\n stops?: number\n}\n\nconst GRADIENT_DEFAULTS: Required<AnimatedGradientOptions> = {\n colors: 'ansh',\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'source-over',\n seed: 1,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n rotation: 4,\n angle: 120,\n travel: 0.25,\n stops: 24,\n}\n\nexport const animatedGradient: EffectDefinition<AnimatedGradientOptions> =\n defineEffect<AnimatedGradientOptions>({\n name: 'animated-gradient',\n defaults: GRADIENT_DEFAULTS,\n\n setup(context, options) {\n let opts = options\n // Sampled once from the perceptual gradient. Per-frame we only shift *which* samples map\n // to which canvas stop, so the OKLab work happens at setup rather than 60 times a second.\n let samples: Rgb[] = []\n\n function build(): void {\n const count = Math.max(2, Math.floor(opts.stops))\n // Duplicate the palette so sliding the phase wraps seamlessly instead of jumping.\n const doubled = [...context.colors, ...context.colors, context.colors[0]]\n samples = expandPalette(doubled, count * 2)\n }\n\n build()\n\n return {\n frame({ time }) {\n const { ctx, size, surface } = context\n const { width, height } = size\n surface.clear()\n\n const stopCount = Math.max(2, Math.floor(opts.stops))\n const angleDeg = opts.angle + (opts.rotation / 60) * time * 360\n const angle = (angleDeg * Math.PI) / 180\n\n // Project the gradient axis across the full canvas diagonal so it always covers the\n // element regardless of angle — a width-based axis leaves corners unfilled at 45°.\n const halfDiagonal = Math.hypot(width, height) / 2\n const cx = width / 2\n const cy = height / 2\n const dx = Math.cos(angle) * halfDiagonal\n const dy = Math.sin(angle) * halfDiagonal\n\n const gradient = ctx.createLinearGradient(cx - dx, cy - dy, cx + dx, cy + dy)\n const phase = (time * opts.travel * 0.1) % 1\n\n for (let i = 0; i < stopCount; i++) {\n const t = i / (stopCount - 1)\n // Sample the doubled palette at an offset position; the doubling makes the wrap\n // continuous.\n const sampleIndex = Math.floor(((t + phase) % 1) * (samples.length - 1))\n const color = samples[sampleIndex]\n const alpha = clamp(color.a * opts.intensity, 0, 1)\n gradient.addColorStop(\n t,\n `rgba(${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)},${alpha})`,\n )\n }\n\n ctx.globalCompositeOperation = opts.blend ?? 'source-over'\n ctx.fillStyle = gradient\n ctx.fillRect(0, 0, width, height)\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = {\n ...opts,\n ...(next as Partial<AnimatedGradientOptions>),\n } as Required<AnimatedGradientOptions>\n if ('colors' in next || 'stops' in next) build()\n },\n }\n },\n })\n\n/** Re-exported so effects that want the same drift maths can reuse it. */\nexport function lissajous(time: number, f1: number, f2: number, phase: number): number {\n return lerp(Math.sin(time * f1 + phase), Math.sin(time * f2 + phase * 1.7), 0.4)\n}\n","import { TAU, clamp } from '../../math/scalar'\nimport { GradientCache, drawGlow } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer, integrate, wrapBounds } from './buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Particle Field — points advected by a curl-noise flow.\n *\n * The detail that makes this look like fluid rather than like scattered dots: the velocity\n * field is **divergence-free**. Advecting particles by raw noise makes them pool into sinks and\n * evacuate sources, so within a few seconds the field is visibly clumpy and half the canvas is\n * empty. Taking the perpendicular gradient of a noise potential — `(∂N/∂y, −∂N/∂x)` — gives a\n * field with zero divergence, so particle density is preserved indefinitely and the motion reads\n * as smoke or water.\n *\n * Particles are immortal and wrap at the edges rather than respawning, which avoids the\n * distracting pop of particles appearing and vanishing.\n */\n\nexport interface ParticleFieldOptions extends BaseEffectOptions {\n /** Particle count at full quality. Scaled down by adaptive quality. Default `700`. */\n count?: number\n /** Particle radius in CSS pixels. Default `1.6`. */\n size?: number\n /** Random variation in size, in `[0, 1]`. Default `0.6`. */\n sizeVariance?: number\n /** Flow field spatial scale. Smaller means larger, smoother eddies. Default `0.0016`. */\n scale?: number\n /** Speed of the particles through the field, in pixels per second. Default `48`. */\n flowSpeed?: number\n /** How fast the field itself evolves. `0` gives a static flow. Default `0.12`. */\n fieldDrift?: number\n /** Draw particles as soft glows rather than hard dots. Costs more. Default `true`. */\n glow?: boolean\n /** Trail persistence in `[0, 1)`. `0` clears each frame; `0.9` leaves long trails. Default `0`. */\n trails?: number\n /** Radius in pixels within which the pointer pushes particles. Default `140`. */\n pointerRadius?: number\n /** Pointer force. Negative attracts, positive repels. Default `1`. */\n pointerForce?: number\n}\n\nconst DEFAULTS: Required<ParticleFieldOptions> = {\n colors: 'neon',\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 3,\n interactive: true,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'pause',\n paused: false,\n pauseOffscreen: true,\n\n count: 700,\n size: 1.6,\n sizeVariance: 0.6,\n scale: 0.0016,\n flowSpeed: 48,\n fieldDrift: 0.12,\n glow: true,\n trails: 0,\n pointerRadius: 140,\n pointerForce: 1,\n}\n\n/** Hard ceiling on particles regardless of what an author asks for. */\nconst MAX_PARTICLES = 4000\n\nexport const particleField: EffectDefinition<ParticleFieldOptions> =\n defineEffect<ParticleFieldOptions>({\n name: 'particle-field',\n defaults: DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(MAX_PARTICLES, Math.max(1, Math.floor(opts.count)))\n const buffer = new ParticleBuffer(capacity)\n const gradients = new GradientCache(64)\n\n // Animated curl field: 3D noise with time as the third axis, so the flow itself evolves\n // rather than particles endlessly circulating the same fixed eddies.\n const curl = context.noise.curlAnimated({ octaves: 2, gain: 0.5 })\n\n /** Populated on the first frame, once the canvas has a real size. */\n let seeded = false\n\n function seed(): void {\n const { width, height } = context.size\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n buffer.x[index] = rng.next() * width\n buffer.y[index] = rng.next() * height\n buffer.vx[index] = 0\n buffer.vy[index] = 0\n buffer.life[index] = Infinity\n buffer.maxLife[index] = Infinity\n buffer.size[index] =\n opts.size * (1 + (rng.next() * 2 - 1) * clamp(opts.sizeVariance, 0, 1))\n buffer.colorIndex[index] = rng.int(0, colorCount - 1)\n // Per-particle phase, used to desynchronise the brightness shimmer.\n buffer.seed[index] = rng.next() * TAU\n }\n seeded = true\n }\n\n return {\n frame({ time, delta, quality }) {\n const { ctx, size, pointer, surface, colors } = context\n const { width, height } = size\n\n if (!seeded || (buffer.count === 0 && width > 1)) seed()\n\n // Adaptive quality trims the live count. Because `truncate` keeps the *first* N\n // particles and spawn order was random, the remaining field stays evenly distributed.\n const targetCount = Math.max(\n 8,\n Math.floor(capacity * (opts.performance === 'high' ? 1 : quality)),\n )\n if (buffer.count > targetCount) buffer.truncate(targetCount)\n\n // --- Clear or fade for trails ---\n const trails = clamp(opts.trails, 0, 0.98)\n if (trails <= 0) {\n surface.clear()\n } else {\n // Fade rather than clear. `destination-out` with a low alpha subtracts opacity,\n // which fades toward transparent — the right behaviour over an arbitrary\n // background. Filling with a translucent colour would tint the trails instead.\n ctx.globalCompositeOperation = 'destination-out'\n ctx.fillStyle = `rgba(0,0,0,${1 - trails})`\n ctx.fillRect(0, 0, width, height)\n ctx.globalCompositeOperation = 'source-over'\n }\n\n // --- Advect ---\n const scale = Math.max(1e-6, opts.scale)\n const flowSpeed = opts.flowSpeed * opts.intensity\n const fieldTime = time * opts.fieldDrift\n const count = buffer.count\n\n for (let i = 0; i < count; i++) {\n const flow = curl(buffer.x[i] * scale, buffer.y[i] * scale, fieldTime)\n // The curl field is a direction; magnitude comes from `flowSpeed`, so changing\n // speed doesn't change the shape of the flow.\n buffer.vx[i] = flow.x * flowSpeed\n buffer.vy[i] = flow.y * flowSpeed\n }\n\n // --- Pointer ---\n if (opts.interactive !== false && pointer && pointer.everInside) {\n const px = pointer.smoothX\n const py = pointer.smoothY\n const radius = Math.max(1, opts.pointerRadius)\n const radiusSq = radius * radius\n const force = opts.pointerForce * flowSpeed * 2.4\n\n for (let i = 0; i < count; i++) {\n const dx = buffer.x[i] - px\n const dy = buffer.y[i] - py\n const distSq = dx * dx + dy * dy\n if (distSq > radiusSq || distSq < 1e-4) continue\n\n const distance = Math.sqrt(distSq)\n // Linear falloff to zero at the radius, so there is no discontinuity at the edge\n // of the influence zone.\n const falloff = 1 - distance / radius\n const push = (force * falloff * falloff) / distance\n buffer.vx[i] += dx * push\n buffer.vy[i] += dy * push\n }\n }\n\n integrate(buffer, delta, 0)\n // A margin equal to the largest particle keeps wrapping invisible — a particle\n // vanishes only once it is fully off-canvas.\n wrapBounds(buffer, width, height, opts.size * 4)\n\n // --- Draw ---\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n const colorCount = Math.max(1, colors.length)\n const glow = opts.glow\n\n for (let i = 0; i < count; i++) {\n const color = colors[buffer.colorIndex[i] % colorCount]\n // Slow per-particle shimmer. Without it a static field reads as a texture; with it,\n // it reads as alive even when the flow is nearly still.\n const shimmer = 0.72 + 0.28 * Math.sin(time * 1.6 + buffer.seed[i])\n const radius = buffer.size[i]\n\n if (glow) {\n drawGlow(ctx, buffer.x[i], buffer.y[i], radius * 4, color, shimmer, gradients)\n } else {\n ctx.globalAlpha = clamp(color.a * shimmer, 0, 1)\n ctx.fillStyle = `rgb(${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)})`\n ctx.beginPath()\n ctx.arc(buffer.x[i], buffer.y[i], radius, 0, TAU)\n ctx.fill()\n }\n }\n\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n // Reseed on resize rather than rescaling positions: a stretched field has visibly\n // wrong density, and reseeding is imperceptible because the field has no persistent\n // structure a viewer could be tracking.\n seeded = false\n },\n\n update(next) {\n const previousSize = opts.size\n opts = {\n ...opts,\n ...(next as Partial<ParticleFieldOptions>),\n } as Required<ParticleFieldOptions>\n if (opts.size !== previousSize) {\n const rng = context.rng\n for (let i = 0; i < buffer.count; i++) {\n buffer.size[i] =\n opts.size * (1 + (rng.next() * 2 - 1) * clamp(opts.sizeVariance, 0, 1))\n }\n }\n if ('colors' in next) {\n const colorCount = Math.max(1, context.colors.length)\n for (let i = 0; i < buffer.count; i++) {\n buffer.colorIndex[i] = buffer.colorIndex[i] % colorCount\n }\n }\n gradients.clear()\n },\n\n destroy() {\n buffer.clear()\n gradients.clear()\n },\n }\n },\n })\n","import { TAU, clamp } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer, SpatialGrid, wrapBounds } from './buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Constellation — drifting points joined by lines when they come close.\n *\n * The interesting engineering problem here is the pairing. \"Draw a line between every pair\n * within distance R\" is O(n²): at 220 points that's 24,000 checks per frame, which is fine, but\n * authors routinely push the count to 800 and then it's 320,000 checks — enough to blow the\n * budget on its own before anything is drawn.\n *\n * So this uses the {@link SpatialGrid} with cell size R. Each point only checks the nine cells\n * around it, which is effectively O(n), and the grid reports each pair exactly once so no\n * duplicate-line bookkeeping is needed.\n *\n * Lines are drawn in a single batched path per alpha bucket rather than one `stroke()` per line:\n * `strokeStyle` changes force the canvas to flush, so 400 individual strokes cost far more than\n * 8 batched ones.\n */\n\nexport interface ConstellationOptions extends BaseEffectOptions {\n /** Number of nodes at full quality. Default `120`. */\n count?: number\n /** Maximum distance in pixels at which two nodes are linked. Default `140`. */\n linkDistance?: number\n /** Node radius in pixels. Default `2`. */\n nodeSize?: number\n /** Line width in pixels. Default `1`. */\n lineWidth?: number\n /** Drift speed in pixels per second. Default `18`. */\n drift?: number\n /** Radius in pixels within which the pointer becomes a node. Default `180`. */\n pointerRadius?: number\n /** Link the pointer position into the graph. Default `true`. */\n pointerLinks?: boolean\n /** Alpha buckets used to batch line strokes. More is smoother, slower. Default `6`. */\n alphaSteps?: number\n}\n\nconst DEFAULTS: Required<ConstellationOptions> = {\n colors: ['#8ab4ff', '#c9d7ff'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'source-over',\n seed: 11,\n interactive: true,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n count: 120,\n linkDistance: 140,\n nodeSize: 2,\n lineWidth: 1,\n drift: 18,\n pointerRadius: 180,\n pointerLinks: true,\n alphaSteps: 6,\n}\n\nconst MAX_NODES = 1200\n\nexport const constellation: EffectDefinition<ConstellationOptions> =\n defineEffect<ConstellationOptions>({\n name: 'constellation',\n defaults: DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(MAX_NODES, Math.max(2, Math.floor(opts.count)))\n const buffer = new ParticleBuffer(capacity)\n const grid = new SpatialGrid(capacity)\n\n /**\n * Reusable per-bucket point lists for batched stroking.\n *\n * Flat `[x1,y1,x2,y2, …]` arrays rather than objects, and `length = 0` between frames\n * rather than fresh arrays, so the line pass allocates nothing.\n */\n let buckets: number[][] = []\n let seeded = false\n\n function rebuildBuckets(): void {\n const steps = Math.max(1, Math.floor(opts.alphaSteps))\n buckets = Array.from({ length: steps }, () => [])\n }\n\n function seed(): void {\n const { width, height } = context.size\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n buffer.x[index] = rng.next() * width\n buffer.y[index] = rng.next() * height\n const angle = rng.angle()\n // Speed varies per node so the field doesn't drift as a rigid sheet.\n const speed = rng.range(0.4, 1.2)\n buffer.vx[index] = Math.cos(angle) * speed\n buffer.vy[index] = Math.sin(angle) * speed\n buffer.life[index] = Infinity\n buffer.maxLife[index] = Infinity\n buffer.size[index] = opts.nodeSize * rng.range(0.7, 1.4)\n buffer.colorIndex[index] = rng.int(0, colorCount - 1)\n buffer.seed[index] = rng.next() * TAU\n }\n seeded = true\n }\n\n rebuildBuckets()\n\n return {\n frame({ time, delta, quality }) {\n const { ctx, size, pointer, surface, colors } = context\n const { width, height } = size\n\n if (!seeded || (buffer.count === 0 && width > 1)) seed()\n\n const targetCount = Math.max(\n 6,\n Math.floor(capacity * (opts.performance === 'high' ? 1 : quality)),\n )\n if (buffer.count > targetCount) buffer.truncate(targetCount)\n\n surface.clear()\n\n // --- Move ---\n const drift = opts.drift * opts.intensity\n const count = buffer.count\n for (let i = 0; i < count; i++) {\n // Velocities were stored as unit-ish directions at seed time; scale to pixels here\n // so `drift` can change at runtime without re-seeding.\n buffer.x[i] += buffer.vx[i] * drift * delta\n buffer.y[i] += buffer.vy[i] * drift * delta\n }\n wrapBounds(buffer, width, height, opts.nodeSize * 2)\n\n // --- Link ---\n const linkDistance = Math.max(1, opts.linkDistance)\n grid.build(buffer, width, height, linkDistance)\n\n const steps = buckets.length\n for (const bucket of buckets) bucket.length = 0\n\n const linkDistanceSq = linkDistance * linkDistance\n\n for (let i = 0; i < count; i++) {\n const xi = buffer.x[i]\n const yi = buffer.y[i]\n\n grid.forEachNeighbour(buffer, i, (j) => {\n const dx = buffer.x[j] - xi\n const dy = buffer.y[j] - yi\n const distSq = dx * dx + dy * dy\n if (distSq > linkDistanceSq) return\n\n // Alpha falls off with distance so links fade in and out rather than snapping.\n // Squared falloff keeps distant links faint and near ones crisp.\n const proximity = 1 - Math.sqrt(distSq) / linkDistance\n const bucketIndex = Math.min(steps - 1, Math.floor(proximity * proximity * steps))\n const bucket = buckets[bucketIndex]\n bucket.push(xi, yi, buffer.x[j], buffer.y[j])\n })\n }\n\n // --- Pointer as a node ---\n const interactive = opts.interactive !== false && pointer !== null && pointer.everInside\n if (interactive && opts.pointerLinks) {\n const px = pointer.smoothX\n const py = pointer.smoothY\n const radius = Math.max(1, opts.pointerRadius)\n const radiusSq = radius * radius\n\n for (let i = 0; i < count; i++) {\n const dx = buffer.x[i] - px\n const dy = buffer.y[i] - py\n const distSq = dx * dx + dy * dy\n if (distSq > radiusSq) continue\n const proximity = 1 - Math.sqrt(distSq) / radius\n const bucketIndex = Math.min(steps - 1, Math.floor(proximity * steps))\n buckets[bucketIndex].push(px, py, buffer.x[i], buffer.y[i])\n }\n }\n\n // --- Draw lines, one path per alpha bucket ---\n const lineColor = colors[0]\n const lineRgb = `${Math.round(lineColor.r * 255)},${Math.round(lineColor.g * 255)},${Math.round(lineColor.b * 255)}`\n\n ctx.globalCompositeOperation = opts.blend ?? 'source-over'\n ctx.lineWidth = Math.max(0.1, opts.lineWidth)\n ctx.lineCap = 'round'\n\n for (let b = 0; b < steps; b++) {\n const bucket = buckets[b]\n if (bucket.length === 0) continue\n\n // Bucket 0 is the faintest; map buckets onto the alpha range.\n const alpha = ((b + 1) / steps) * 0.55 * opts.intensity * lineColor.a\n ctx.strokeStyle = `rgba(${lineRgb},${clamp(alpha, 0, 1).toFixed(3)})`\n\n ctx.beginPath()\n for (let k = 0; k < bucket.length; k += 4) {\n ctx.moveTo(bucket[k], bucket[k + 1])\n ctx.lineTo(bucket[k + 2], bucket[k + 3])\n }\n ctx.stroke()\n }\n\n // --- Draw nodes ---\n // Nodes are grouped by colour so `fillStyle` changes once per palette entry rather\n // than once per node.\n const colorCount = Math.max(1, colors.length)\n for (let c = 0; c < colorCount; c++) {\n const color = colors[c]\n ctx.fillStyle = `rgba(${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)},${clamp(color.a * opts.intensity, 0, 1)})`\n ctx.beginPath()\n for (let i = 0; i < count; i++) {\n if (buffer.colorIndex[i] % colorCount !== c) continue\n const twinkle = 0.75 + 0.25 * Math.sin(time * 2 + buffer.seed[i])\n const radius = buffer.size[i] * twinkle\n ctx.moveTo(buffer.x[i] + radius, buffer.y[i])\n ctx.arc(buffer.x[i], buffer.y[i], radius, 0, TAU)\n }\n ctx.fill()\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n const previousSteps = opts.alphaSteps\n opts = {\n ...opts,\n ...(next as Partial<ConstellationOptions>),\n } as Required<ConstellationOptions>\n if (opts.alphaSteps !== previousSteps) rebuildBuckets()\n },\n\n destroy() {\n buffer.clear()\n buckets = []\n },\n }\n },\n })\n","import { TAU, clamp } from '../../math/scalar'\nimport { GradientCache, drawGlow } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer } from './buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Powder explosion — bursts of fine particles that decelerate hard and settle.\n *\n * **Drag is what makes it powder.** Fireworks and powder differ almost entirely in how fast the\n * ejecta lose speed. With low drag, particles travel in near-straight lines and the burst reads as\n * a firework; with drag high enough that most of the speed is gone within a few hundred\n * milliseconds, the same particles bloom outward and then hang, which is what powder does. The\n * default sits deliberately in the second regime.\n *\n * **Ejection speed is skewed, not uniform.** Sampling speed uniformly puts a hard edge on the\n * expanding shell, because every particle reaches its maximum radius at the same moment. Squaring\n * a uniform sample biases toward the slower end, so the burst has a dense core and a sparse\n * fringe — the distribution real ejecta have.\n *\n * **Bursts arrive as a Poisson process.** Fixed intervals read as a machine. Exponential\n * inter-arrival times give the clustering and lulls that make repeated bursts feel incidental,\n * the same reasoning `meteors` uses.\n */\n\nexport interface PowderExplosionOptions extends BaseEffectOptions {\n /** Particles per burst. Default `70`. */\n burstSize?: number\n /** Average bursts per second. Default `0.8`. */\n burstRate?: number\n /** Peak ejection speed in pixels per second. Default `420`. */\n force?: number\n /** Velocity retained per second, in `[0, 1)`. High values are what make it read as powder. Default `0.92`. */\n drag?: number\n /** Downward acceleration in pixels per second squared. Default `90`. */\n gravity?: number\n /** Particle lifetime in seconds. Default `1.9`. */\n life?: number\n /** Particle radius in pixels. Default `2.6`. */\n size?: number\n /** Glow radius as a multiple of `size`. Default `2.8`. */\n glow?: number\n /** Burst at the pointer when it is pressed. Default `true`. */\n burstOnPress?: boolean\n}\n\nconst DEFAULTS: Required<PowderExplosionOptions> = {\n colors: ['#ff9d5c', '#ffd76f', '#ff6b8b', '#7cc4ff'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 59,\n interactive: true,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'pause',\n paused: false,\n pauseOffscreen: true,\n\n burstSize: 90,\n burstRate: 0.8,\n force: 420,\n drag: 0.92,\n gravity: 90,\n life: 1.9,\n size: 3,\n glow: 3.2,\n burstOnPress: true,\n}\n\n/** Hard ceiling on live particles across all overlapping bursts. */\nconst MAX_PARTICLES = 1600\n\n/** Fade exponent. Above 1, particles hold brightness then drop away rather than fading linearly. */\nconst FADE_SHAPE = 1.4\n\nexport const powderExplosion: EffectDefinition<PowderExplosionOptions> =\n defineEffect<PowderExplosionOptions>({\n name: 'powder-explosion',\n defaults: DEFAULTS,\n structuralOptions: ['burstSize'],\n\n setup(context, options) {\n let opts = options\n\n // Enough room for every burst that can be alive at once, plus headroom for the Poisson\n // process clustering several together.\n const perBurst = Math.max(1, Math.floor(opts.burstSize))\n const concurrent = Math.max(2, Math.ceil(opts.life * opts.burstRate) + 2)\n const capacity = Math.min(MAX_PARTICLES, perBurst * concurrent)\n\n const buffer = new ParticleBuffer(capacity)\n const gradients = new GradientCache(64)\n\n let untilNextBurst = 0\n let wasDown = false\n\n function burst(x: number, y: number): void {\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n // One hue family per burst reads as a single event; sampling per particle looks like\n // confetti rather than like one thing coming apart.\n const family = rng.int(0, colorCount - 1)\n\n for (let i = 0; i < perBurst; i++) {\n const index = buffer.spawn()\n if (index < 0) return\n\n const angle = rng.angle()\n // Squared uniform: biased toward the slower end, so the shell has no hard edge.\n const t = rng.next()\n const speed = opts.force * t * t * rng.range(0.85, 1.15)\n\n buffer.x[index] = x\n buffer.y[index] = y\n buffer.vx[index] = Math.cos(angle) * speed\n buffer.vy[index] = Math.sin(angle) * speed\n buffer.size[index] = opts.size * rng.range(0.55, 1.5)\n buffer.colorIndex[index] = rng.bool(0.75) ? family : rng.int(0, colorCount - 1)\n buffer.maxLife[index] = opts.life * rng.range(0.6, 1.3)\n buffer.life[index] = buffer.maxLife[index]\n buffer.seed[index] = rng.range(0, TAU)\n buffer.extra[index] = rng.range(0.85, 1.2)\n }\n }\n\n return {\n frame({ delta, quality }) {\n const { ctx, size, surface, pointer, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n\n surface.clear()\n if (colors.length === 0) return\n\n const rng = context.rng\n\n // Scheduled bursts. Quality throttles the rate rather than the particle count, so a\n // burst always looks complete — a thinned-out burst reads as a broken effect.\n const rate = opts.burstRate * (opts.performance === 'high' ? 1 : quality)\n untilNextBurst -= delta * rate\n if (untilNextBurst <= 0) {\n burst(rng.range(width * 0.15, width * 0.85), rng.range(height * 0.2, height * 0.8))\n // Exponential inter-arrival, expressed in units of the (already rate-scaled) clock.\n untilNextBurst = -Math.log(1 - rng.next())\n }\n\n // Pointer bursts, on the press edge only — holding the button must not emit continuously.\n const interactive = opts.interactive !== false && pointer !== null\n if (interactive && opts.burstOnPress) {\n if (pointer.down && !wasDown) burst(pointer.x, pointer.y)\n wasDown = pointer.down\n }\n\n const retain = Math.pow(1 - clamp(opts.drag, 0, 0.999), delta)\n const gravity = opts.gravity * delta\n const alphaScale = clamp(opts.opacity * opts.intensity, 0, 1)\n const colorCount = Math.max(1, colors.length)\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n let i = 0\n while (i < buffer.count) {\n buffer.life[i] -= delta\n if (buffer.life[i] <= 0) {\n buffer.kill(i)\n // No increment — a different particle now occupies index `i`.\n continue\n }\n\n buffer.vx[i] *= retain\n buffer.vy[i] = buffer.vy[i] * retain + gravity\n buffer.x[i] += buffer.vx[i] * delta\n buffer.y[i] += buffer.vy[i] * delta\n\n const age = clamp(1 - buffer.life[i] / buffer.maxLife[i], 0, 1)\n const alpha = alphaScale * Math.pow(1 - age, FADE_SHAPE)\n if (alpha > 0.002) {\n drawGlow(\n ctx,\n buffer.x[i],\n buffer.y[i],\n buffer.size[i] * opts.glow * buffer.extra[i],\n colors[buffer.colorIndex[i] % colorCount],\n alpha,\n gradients,\n )\n }\n i++\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = {\n ...opts,\n ...(next as Partial<PowderExplosionOptions>),\n } as Required<PowderExplosionOptions>\n gradients.clear()\n },\n\n destroy() {\n buffer.clear()\n gradients.clear()\n },\n }\n },\n })\n","import { clamp } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Strange attractor — a chaotic map plotted as a drifting cloud of points.\n *\n * The classic 2D attractors (Clifford, de Jong, Svensson) are four-parameter iterated maps. Feed a\n * point back through one repeatedly and it never repeats and never escapes; it wanders forever\n * across a fixed, intricate shape. Plotting many such points at once draws that shape out of noise.\n *\n * **Many walkers, one step each — not one walker, many steps.** The textbook renderer iterates a\n * single point thousands of times per frame and plots every position, which produces a *static*\n * picture drawn progressively. Stepping a few thousand independent walkers once per frame instead\n * gives the same structure while every point is genuinely in motion, which is what makes this work\n * as a background rather than a plot.\n *\n * **Trails come from erasing, not from painting over.** Fading the canvas by drawing a translucent\n * background rectangle would need to know the page's background colour, and would be wrong on any\n * other. Compositing with `destination-out` lowers the alpha of what is already there, so trails\n * fade to *transparent* and the effect stays composable over anything.\n *\n * **The parameters drift.** Held constant, the attractor is a fixed shape with points crawling\n * over it. Moving `a`–`d` slowly on incommensurable sines makes the shape itself breathe and turn\n * inside out, which is where almost all of the visual interest is.\n */\n\n/** Which iterated map to plot. All four take the same `a`–`d` parameters. */\nexport type AttractorKind = 'clifford' | 'dejong' | 'svensson'\n\nexport interface StrangeAttractorOptions extends BaseEffectOptions {\n /** Which map to iterate. Default `'clifford'`. */\n kind?: AttractorKind\n /** Walkers stepped and plotted each frame. Default `2600`. */\n count?: number\n /** How far the parameters wander from their seeded base. `0` freezes the shape. Default `0.12`. */\n drift?: number\n /** How fast the parameters wander. Default `0.05`. */\n driftSpeed?: number\n /** Plotted point radius in pixels. Default `0.9`. */\n size?: number\n /** Per-point alpha, in `[0, 1]`. Low values are what let density build up. Default `0.34`. */\n pointOpacity?: number\n /** How quickly trails fade, in `[0, 1]`. `0` leaves permanent trails, `1` clears each frame. Default `0.12`. */\n fade?: number\n /** Fraction of the smaller canvas dimension the attractor spans. Default `0.42`. */\n scale?: number\n}\n\nconst DEFAULTS: Required<StrangeAttractorOptions> = {\n colors: ['#7cc4ff', '#a78bfa', '#5eead4', '#fbbf7c'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 83,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n kind: 'clifford',\n count: 2600,\n drift: 0.12,\n driftSpeed: 0.05,\n size: 0.9,\n pointOpacity: 0.34,\n fade: 0.12,\n scale: 0.42,\n}\n\n/**\n * Ceiling on walkers. Each is a handful of trig calls and one `fillRect` per frame, so this is the\n * point past which the cost stops buying visible density.\n */\nconst MAX_WALKERS = 8000\n\n/**\n * Known-strange parameter sets, per map.\n *\n * Sampling `a`–`d` at random inside a plausible window does *not* work: most of that space makes\n * the iteration converge to a fixed point or a short limit cycle, which renders as a single dot or\n * a thin loop rather than an attractor. The first version of this effect did exactly that and\n * produced a one-pixel dot for its default seed. These quadruples are published sets that are\n * known to be strange, so every seed picks something worth looking at.\n */\nconst PARAM_SETS: Record<AttractorKind, readonly (readonly [number, number, number, number])[]> = {\n clifford: [\n [-1.4, 1.6, 1.0, 0.7],\n [1.7, 1.7, 0.06, 1.2],\n [-1.7, 1.3, -0.1, -1.21],\n [1.5, -1.8, 1.6, 0.9],\n [-1.8, -2.0, -0.5, -0.9],\n ],\n dejong: [\n [1.4, -2.3, 2.4, -2.1],\n [2.01, -2.53, 1.61, -0.33],\n [-2.7, -0.09, -0.86, -2.2],\n [1.641, 1.902, 0.316, 1.525],\n ],\n svensson: [\n [1.4, 1.56, 1.4, -6.56],\n [-1.78, -1.28, -0.75, 1.34],\n [1.94, 1.1, -1.63, 0.42],\n ],\n}\n\nexport const strangeAttractor: EffectDefinition<StrangeAttractorOptions> =\n defineEffect<StrangeAttractorOptions>({\n name: 'strange-attractor',\n defaults: DEFAULTS,\n structuralOptions: ['count', 'kind'],\n\n setup(context, options) {\n let opts = options\n const count = Math.min(MAX_WALKERS, Math.max(1, Math.floor(opts.count)))\n\n const px = new Float32Array(count)\n const py = new Float32Array(count)\n const colorIndex = new Uint8Array(count)\n\n const rng = context.rng\n const sets = PARAM_SETS[opts.kind] ?? PARAM_SETS.clifford\n const [baseA, baseB, baseC, baseD] = sets[rng.int(0, sets.length - 1)]\n\n // Independent drift phases, so the four parameters never move in lockstep — which would\n // make the shape pulse symmetrically instead of turning through genuinely different forms.\n const phaseA = rng.angle()\n const phaseB = rng.angle()\n const phaseC = rng.angle()\n const phaseD = rng.angle()\n\n let seeded = false\n\n function seed(): void {\n const colorCount = Math.max(1, context.colors.length)\n for (let i = 0; i < count; i++) {\n // Seeded across the attractor's own coordinate space, not the canvas: walkers converge\n // onto the attractor within a few iterations wherever they start.\n px[i] = rng.range(-1, 1)\n py[i] = rng.range(-1, 1)\n colorIndex[i] = rng.int(0, colorCount - 1)\n }\n seeded = true\n }\n\n return {\n frame({ time, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n if (colors.length === 0) return\n\n if (!seeded) seed()\n\n const fade = clamp(opts.fade, 0, 1)\n if (fade >= 1) {\n surface.clear()\n } else if (fade > 0) {\n // Erase toward transparent rather than painting the background colour, so the effect\n // composites correctly over whatever is behind it.\n ctx.globalCompositeOperation = 'destination-out'\n ctx.fillStyle = `rgba(0,0,0,${fade})`\n ctx.fillRect(0, 0, width, height)\n }\n\n const wobble = opts.drift\n const rate = opts.driftSpeed * time\n const a = baseA + Math.sin(rate + phaseA) * wobble\n const b = baseB + Math.sin(rate * 1.31 + phaseB) * wobble\n const c = baseC + Math.sin(rate * 0.77 + phaseC) * wobble\n const d = baseD + Math.sin(rate * 1.13 + phaseD) * wobble\n\n /*\n * Extent from the *live* parameters, not a fixed per-kind guess. Every one of these maps\n * is a sum of a unit-amplitude sine and a parameter-scaled cosine, so its output is\n * bounded by `1 + max(|c|, |d|)` — and since `c` and `d` drift, so does the bound. A\n * fixed guess either crops the attractor or shrinks it to a speck in the middle.\n */\n const kind = opts.kind\n const extent = kind === 'dejong' ? 2 : 1 + Math.max(Math.abs(c), Math.abs(d))\n const span = Math.min(width, height) * opts.scale\n const cx = width / 2\n const cy = height / 2\n const radius = Math.max(0.35, opts.size)\n const diameter = radius * 2\n\n const walkers =\n opts.performance === 'high' ? count : Math.max(64, Math.round(count * quality))\n const alpha = clamp(opts.pointOpacity * opts.opacity * opts.intensity, 0, 1)\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n ctx.globalAlpha = alpha\n\n const colorCount = colors.length\n let currentColor = -1\n\n for (let i = 0; i < walkers; i++) {\n const x = px[i]\n const y = py[i]\n\n let nx: number\n let ny: number\n if (kind === 'dejong') {\n nx = Math.sin(a * y) - Math.cos(b * x)\n ny = Math.sin(c * x) - Math.cos(d * y)\n } else if (kind === 'svensson') {\n nx = d * Math.sin(a * x) - Math.sin(b * y)\n ny = c * Math.cos(a * x) + Math.cos(b * y)\n } else {\n nx = Math.sin(a * y) + c * Math.cos(a * x)\n ny = Math.sin(b * x) + d * Math.cos(b * y)\n }\n\n px[i] = nx\n py[i] = ny\n\n // Batch by colour: setting `fillStyle` is the expensive part of this loop, and walkers\n // keep their colour for life, so runs of the same index cost one assignment.\n const ci = colorIndex[i] % colorCount\n if (ci !== currentColor) {\n const colour = colors[ci]\n ctx.fillStyle = `rgb(${Math.round(colour.r * 255)},${Math.round(colour.g * 255)},${Math.round(colour.b * 255)})`\n currentColor = ci\n }\n\n // `fillRect` rather than `arc` + `fill`: at sub-pixel radius the shapes are\n // indistinguishable, and a rect is roughly an order of magnitude cheaper per point.\n ctx.fillRect(\n cx + (nx / extent) * span - radius,\n cy + (ny / extent) * span - radius,\n diameter,\n diameter,\n )\n }\n\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = {\n ...opts,\n ...(next as Partial<StrangeAttractorOptions>),\n } as Required<StrangeAttractorOptions>\n },\n }\n },\n })\n","import { TAU, clamp } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer } from './buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Swarm — particles bound to moving attractors, orbiting rather than collapsing.\n *\n * **Pure attraction does not work.** Accelerate particles straight at a point and they all arrive,\n * overshoot, and oscillate through it — within a couple of seconds the field is a flickering line\n * through the centre. Adding a force *perpendicular* to the pull gives each particle angular\n * momentum, so it falls into an orbit instead of a collision. `swirl` is that tangential term, and\n * it is the whole difference between a swarm and a drain.\n *\n * **The force is softened, not inverse-square.** Real gravity goes to infinity at zero distance,\n * which in a fixed timestep means a particle that passes close to an attractor is flung out at\n * enormous speed and never returns. Dividing by `distance + softening` bounds the force, which is\n * the standard fix in n-body simulation and is what keeps the swarm stable indefinitely.\n *\n * **Attractors move on incommensurable Lissajous paths**, so the swarm never settles into a\n * repeating figure — the same reasoning `mesh-gradient` uses for its control points.\n *\n * **Speed drives colour.** Each particle picks its colour from where its speed sits in the palette,\n * so the fast inner orbits and the slow outer ones separate visually. Colouring by index instead\n * would scatter the palette evenly and hide the structure the physics is producing.\n */\n\nexport interface SwarmOptions extends BaseEffectOptions {\n /** Particles. Default `900`. */\n count?: number\n /** Moving attractors. Default `3`. */\n attractors?: number\n /**\n * Peak pull, in pixels per second squared — the acceleration a particle feels *at* an\n * attractor. Halves at `softening` pixels away.\n */\n gravity?: number\n /** Tangential force as a fraction of the pull. `0` collapses the swarm into the centre. Default `0.85`. */\n swirl?: number\n /** Distance added to the denominator, bounding the force near an attractor. Default `70`. */\n softening?: number\n /** Velocity retained per second, in `[0, 1)`. Default `0.45`. */\n drag?: number\n /** How fast the attractors travel their paths. Default `0.08`. */\n attractorSpeed?: number\n /** Particle radius in pixels. Default `1.4`. */\n size?: number\n /** Speed, in pixels per second, treated as the top of the colour ramp. Default `320`. */\n fastSpeed?: number\n /** Pull toward the pointer, as a multiple of `gravity`. `0` ignores it. Default `1.6`. */\n pointerGravity?: number\n}\n\nconst DEFAULTS: Required<SwarmOptions> = {\n colors: ['#3b82f6', '#a78bfa', '#f472b6', '#fbbf24'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 89,\n interactive: true,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n count: 900,\n attractors: 3,\n gravity: 260,\n swirl: 0.85,\n softening: 70,\n drag: 0.45,\n attractorSpeed: 0.08,\n size: 1.4,\n fastSpeed: 320,\n pointerGravity: 1.6,\n}\n\nconst MAX_PARTICLES = 4000\nconst MAX_ATTRACTORS = 8\n\n/**\n * Ceiling on per-frame velocity change, in pixels per second.\n *\n * A second line of defence behind `softening`. A long frame — a background tab waking, a GC pause —\n * multiplies acceleration by a large `delta`, and without a clamp a single such frame can eject the\n * entire swarm off-canvas permanently.\n */\nconst MAX_DELTA_V = 900\n\nexport const swarm: EffectDefinition<SwarmOptions> = defineEffect<SwarmOptions>({\n name: 'swarm',\n defaults: DEFAULTS,\n structuralOptions: ['count', 'attractors'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(MAX_PARTICLES, Math.max(1, Math.floor(opts.count)))\n const attractorCount = Math.min(MAX_ATTRACTORS, Math.max(1, Math.floor(opts.attractors)))\n const buffer = new ParticleBuffer(capacity)\n\n // Per-attractor Lissajous coefficients. Irrational-ish ratios keep the paths from closing.\n const ax = new Float32Array(attractorCount)\n const ay = new Float32Array(attractorCount)\n const fx = new Float32Array(attractorCount)\n const fy = new Float32Array(attractorCount)\n const phx = new Float32Array(attractorCount)\n const phy = new Float32Array(attractorCount)\n\n const rng = context.rng\n for (let a = 0; a < attractorCount; a++) {\n ax[a] = rng.range(0.18, 0.34)\n ay[a] = rng.range(0.18, 0.34)\n fx[a] = rng.range(0.6, 1.4)\n fy[a] = rng.range(0.6, 1.4)\n phx[a] = rng.angle()\n phy[a] = rng.angle()\n }\n\n let seeded = false\n\n function seed(): void {\n const { width, height } = context.size\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n buffer.x[index] = rng.next() * width\n buffer.y[index] = rng.next() * height\n // A little starting velocity, so the first moments are orbits forming rather than a\n // uniform inward rush from rest.\n const angle = rng.angle()\n const speed = rng.range(20, 90)\n buffer.vx[index] = Math.cos(angle) * speed\n buffer.vy[index] = Math.sin(angle) * speed\n buffer.size[index] = opts.size * rng.range(0.7, 1.5)\n buffer.life[index] = Infinity\n buffer.maxLife[index] = Infinity\n }\n seeded = true\n }\n\n return {\n frame({ time, delta, quality }) {\n const { ctx, size, surface, pointer, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n\n if (!seeded || buffer.count === 0) seed()\n surface.clear()\n if (colors.length === 0) return\n\n const target =\n opts.performance === 'high' ? capacity : Math.max(32, Math.floor(capacity * quality))\n if (buffer.count > target) buffer.truncate(target)\n\n const cx = width / 2\n const cy = height / 2\n const t = time * opts.attractorSpeed * TAU\n\n // Attractor positions for this frame, resolved once rather than per particle.\n const atx: number[] = []\n const aty: number[] = []\n for (let a = 0; a < attractorCount; a++) {\n atx.push(cx + Math.sin(t * fx[a] + phx[a]) * width * ax[a])\n aty.push(cy + Math.cos(t * fy[a] + phy[a]) * height * ay[a])\n }\n\n const interactive = opts.interactive !== false && pointer !== null && pointer.everInside\n if (interactive && opts.pointerGravity !== 0) {\n atx.push(pointer.smoothX)\n aty.push(pointer.smoothY)\n }\n\n const gravity = opts.gravity * opts.intensity\n const pointerBoost = opts.pointerGravity\n const swirl = opts.swirl\n const softening = Math.max(1, opts.softening)\n const retain = Math.pow(1 - clamp(opts.drag, 0, 0.999), delta)\n const invFast = 1 / Math.max(1, opts.fastSpeed)\n const alpha = clamp(opts.opacity * opts.intensity, 0, 1)\n const colorCount = colors.length\n const live = buffer.count\n const activeAttractors = atx.length\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n ctx.globalAlpha = alpha\n\n let currentColor = -1\n\n for (let i = 0; i < live; i++) {\n let axSum = 0\n let aySum = 0\n\n for (let a = 0; a < activeAttractors; a++) {\n const dx = atx[a] - buffer.x[i]\n const dy = aty[a] - buffer.y[i]\n const distance = Math.hypot(dx, dy)\n const inv = 1 / (distance + softening)\n\n // `gravity * softening * inv` rather than `gravity * inv`, so `gravity` is literally\n // the acceleration at an attractor and halves at `softening` away. Without the\n // `softening` factor the option is an acceleration *times a distance*, which is\n // impossible to pick a sensible default for — the first attempt here shipped forces\n // roughly 25x too weak, giving terminal speeds around 10 px/s and a field that never\n // visibly orbited.\n const peak = a === attractorCount && interactive ? gravity * pointerBoost : gravity\n const strength = peak * softening * inv\n\n const nx = dx * inv\n const ny = dy * inv\n\n axSum += nx * strength\n aySum += ny * strength\n // Perpendicular to the pull — this is what turns a collision into an orbit.\n axSum += -ny * strength * swirl\n aySum += nx * strength * swirl\n }\n\n const dvx = clamp(axSum * delta, -MAX_DELTA_V, MAX_DELTA_V)\n const dvy = clamp(aySum * delta, -MAX_DELTA_V, MAX_DELTA_V)\n\n buffer.vx[i] = (buffer.vx[i] + dvx) * retain\n buffer.vy[i] = (buffer.vy[i] + dvy) * retain\n buffer.x[i] += buffer.vx[i] * delta\n buffer.y[i] += buffer.vy[i] * delta\n\n const speed = Math.hypot(buffer.vx[i], buffer.vy[i])\n const ci = Math.min(colorCount - 1, Math.floor(clamp(speed * invFast, 0, 1) * colorCount))\n if (ci !== currentColor) {\n const colour = colors[ci]\n ctx.fillStyle = `rgb(${Math.round(colour.r * 255)},${Math.round(colour.g * 255)},${Math.round(colour.b * 255)})`\n currentColor = ci\n }\n\n const r = buffer.size[i]\n ctx.fillRect(buffer.x[i] - r, buffer.y[i] - r, r * 2, r * 2)\n }\n\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<SwarmOptions>) } as Required<SwarmOptions>\n },\n\n destroy() {\n buffer.clear()\n },\n }\n },\n})\n","import { clamp, radians } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer, ageAndCull, integrate } from '../particles/buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Meteor Shower — streaks that fall across the canvas and fade.\n *\n * The two things that make streaks convincing:\n *\n * **The trail is a gradient along the direction of travel, not a fading line.** A meteor is\n * bright at the head and fades behind it, and the gradient must be rebuilt as the meteor moves\n * because its endpoints move. That is one gradient per meteor per frame, which is affordable\n * because there are only ever a dozen or so.\n *\n * **Spawning is Poisson, not periodic.** Evenly spaced spawns read as a machine. Sampling the\n * gap between spawns from an exponential distribution gives clustering and lulls, which is what\n * real meteor showers do and what makes the effect feel observed rather than generated.\n */\n\nexport interface MeteorsOptions extends BaseEffectOptions {\n /** Average meteors visible at once. Default `12`. */\n count?: number\n /** Direction of travel in degrees. `135` falls down-and-right. Default `135`. */\n angle?: number\n /** Random variation in angle, in degrees. Default `8`. */\n angleVariance?: number\n /** Speed in pixels per second. Default `420`. */\n velocity?: number\n /** Random variation in speed, in `[0, 1]`. Default `0.45`. */\n velocityVariance?: number\n /** Trail length in pixels. Default `160`. */\n trailLength?: number\n /** Head thickness in pixels. Default `2` */\n thickness?: number\n /** Draw a bright point at the head. Default `true`. */\n head?: boolean\n}\n\nconst DEFAULTS: Required<MeteorsOptions> = {\n colors: ['#ffffff', '#a5c8ff', '#8a2be2'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 5,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'pause',\n paused: false,\n pauseOffscreen: true,\n\n count: 12,\n angle: 135,\n angleVariance: 8,\n velocity: 420,\n velocityVariance: 0.45,\n trailLength: 160,\n thickness: 2,\n head: true,\n}\n\nconst MAX_METEORS = 200\n\nexport const meteors: EffectDefinition<MeteorsOptions> = defineEffect<MeteorsOptions>({\n name: 'meteors',\n defaults: DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(MAX_METEORS, Math.max(1, Math.floor(opts.count * 2)))\n const buffer = new ParticleBuffer(capacity)\n\n /** Seconds until the next spawn. Resampled from an exponential distribution each time. */\n let nextSpawn = 0\n\n /**\n * Exponentially distributed inter-arrival time for a Poisson process at `rate` per second.\n * `-ln(U)/λ` is the standard inverse-transform sample.\n */\n function sampleGap(rate: number): number {\n const u = Math.max(1e-6, context.rng.next())\n return -Math.log(u) / Math.max(1e-3, rate)\n }\n\n function spawn(): void {\n const { width, height } = context.size\n const rng = context.rng\n const index = buffer.spawn()\n if (index < 0) return\n\n const angle = radians(opts.angle + rng.range(-opts.angleVariance, opts.angleVariance))\n const dirX = Math.cos(angle)\n const dirY = Math.sin(angle)\n const velocity = opts.velocity * (1 + rng.range(-1, 1) * clamp(opts.velocityVariance, 0, 1))\n\n /**\n * Spawn just outside the entry edge, so meteors enter rather than materialising mid-canvas.\n *\n * The margin covers the *head* only, deliberately not the trail. The trail extends backwards\n * from the head, so it is off-canvas anyway while the meteor enters — adding `trailLength`\n * here pushed every meteor a further 160px out and, on a short canvas, meant most of the\n * live population was outside the visible area at any moment. The field looked empty even\n * though the simulation was correct.\n */\n const margin = 48\n // Distribute along the entry edge, extended so diagonal travel still covers the corners.\n const spread = rng.next()\n let x: number\n let y: number\n if (Math.abs(dirY) > Math.abs(dirX)) {\n x = spread * (width + margin * 2) - margin\n y = dirY > 0 ? -margin : height + margin\n } else {\n x = dirX > 0 ? -margin : width + margin\n y = spread * (height + margin * 2) - margin\n }\n\n buffer.x[index] = x\n buffer.y[index] = y\n buffer.vx[index] = dirX * velocity\n buffer.vy[index] = dirY * velocity\n buffer.size[index] = opts.thickness * rng.range(0.6, 1.5)\n buffer.colorIndex[index] = rng.int(0, Math.max(0, context.colors.length - 1))\n // Trail length varies per meteor — uniform trails read as a repeated sprite.\n buffer.extra[index] = opts.trailLength * rng.range(0.6, 1.35)\n\n // Life is derived from how long it takes to cross the canvas plus margins, so meteors\n // are never culled while still visible regardless of angle or speed.\n // Include the trail here even though the spawn margin doesn't: a meteor is only truly gone\n // once its tail has cleared the canvas, and culling on the head would clip trails at the edge.\n const travelDistance = Math.hypot(width, height) + margin * 2 + buffer.extra[index]\n buffer.maxLife[index] = travelDistance / Math.max(1, velocity)\n buffer.life[index] = buffer.maxLife[index]\n }\n\n return {\n frame({ delta, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n\n surface.clear()\n\n // --- Spawn ---\n const targetConcurrent = Math.max(\n 1,\n Math.floor(opts.count * (opts.performance === 'high' ? 1 : clamp(quality, 0.3, 1))),\n )\n nextSpawn -= delta\n // Spawn rate that maintains `targetConcurrent` on average: each meteor lives roughly\n // `maxLife` seconds, so rate = concurrent / life.\n const averageLife = Math.hypot(width, height) / Math.max(1, opts.velocity)\n const rate = targetConcurrent / Math.max(0.1, averageLife)\n\n // Guard the loop: a huge delta after a stall could otherwise spawn hundreds at once.\n let spawnsThisFrame = 0\n while (nextSpawn <= 0 && spawnsThisFrame < 8) {\n if (buffer.count < targetConcurrent * 2) spawn()\n nextSpawn += sampleGap(rate)\n spawnsThisFrame++\n }\n\n integrate(buffer, delta, 0)\n ageAndCull(buffer, delta)\n\n // --- Draw ---\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n ctx.lineCap = 'round'\n\n const count = buffer.count\n const colorCount = Math.max(1, colors.length)\n\n for (let i = 0; i < count; i++) {\n const age = buffer.age(i)\n // Fade in over the first 15% of life and out over the last 35%. The asymmetry matters:\n // a meteor should arrive quickly and linger as it dies.\n const fade = age < 0.15 ? age / 0.15 : age > 0.65 ? 1 - (age - 0.65) / 0.35 : 1\n const alpha = clamp(fade * opts.intensity, 0, 1)\n if (alpha <= 0.01) continue\n\n const color = colors[buffer.colorIndex[i] % colorCount]\n const rgb = `${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)}`\n\n const headX = buffer.x[i]\n const headY = buffer.y[i]\n\n // The trail points backwards along the velocity vector.\n const speed = Math.hypot(buffer.vx[i], buffer.vy[i])\n if (speed < 1e-3) continue\n const trail = buffer.extra[i]\n const tailX = headX - (buffer.vx[i] / speed) * trail\n const tailY = headY - (buffer.vy[i] / speed) * trail\n\n const gradient = ctx.createLinearGradient(headX, headY, tailX, tailY)\n gradient.addColorStop(0, `rgba(${rgb},${alpha})`)\n gradient.addColorStop(0.25, `rgba(${rgb},${alpha * 0.45})`)\n gradient.addColorStop(1, `rgba(${rgb},0)`)\n\n ctx.strokeStyle = gradient\n ctx.lineWidth = buffer.size[i]\n ctx.beginPath()\n ctx.moveTo(headX, headY)\n ctx.lineTo(tailX, tailY)\n ctx.stroke()\n\n if (opts.head) {\n // A small bright core. Drawn additively over the trail head, which is what gives\n // the impression of the streak being *emitted* rather than drawn.\n const coreRadius = buffer.size[i] * 1.8\n const core = ctx.createRadialGradient(headX, headY, 0, headX, headY, coreRadius)\n core.addColorStop(0, `rgba(255,255,255,${alpha})`)\n core.addColorStop(0.5, `rgba(${rgb},${alpha * 0.7})`)\n core.addColorStop(1, `rgba(${rgb},0)`)\n ctx.fillStyle = core\n ctx.fillRect(headX - coreRadius, headY - coreRadius, coreRadius * 2, coreRadius * 2)\n }\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<MeteorsOptions>) } as Required<MeteorsOptions>\n },\n\n destroy() {\n buffer.clear()\n },\n }\n },\n})\n","import { TAU, clamp, radians } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer } from '../particles/buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Rain and Snow.\n *\n * These share one implementation because they are the same simulation with different\n * parameters and one different draw call — and because the part that makes both convincing is\n * the same: **depth**.\n *\n * Each drop or flake gets a `depth` in `[0, 1]`. Depth scales size, opacity *and* speed\n * together, which produces motion parallax: near particles are large, opaque and fast; distant\n * ones small, faint and slow. Without that coupling, precipitation looks like a flat sheet of\n * identical sprites sliding down the screen, which is the tell in almost every implementation.\n *\n * Snow additionally sways — a sinusoidal horizontal drift with a per-flake phase and frequency,\n * because a flake's motion is dominated by air resistance rather than gravity.\n */\n\ninterface PrecipitationShared extends BaseEffectOptions {\n /** Particle count at full quality. */\n count?: number\n /** Fall angle in degrees, measured from the positive x-axis. `90` is straight down. */\n angle?: number\n /** Wind offset in degrees added to `angle`. Separated so wind can be animated. */\n wind?: number\n /** Fall speed in pixels per second at maximum depth. */\n velocity?: number\n /** Depth range as `[near, far]` scale factors. */\n depthRange?: readonly [number, number]\n}\n\n// ---------------------------------------------------------------------------\n// Rain\n// ---------------------------------------------------------------------------\n\nexport interface RainOptions extends PrecipitationShared {\n /** Streak length in pixels at maximum depth. Default `18`. */\n length?: number\n /** Streak width in pixels. Default `1.2`. */\n thickness?: number\n /** Draw splash rings where drops reach the bottom. Default `false`. */\n splash?: boolean\n}\n\nconst RAIN_DEFAULTS: Required<RainOptions> = {\n colors: ['#9fc4ff', '#dbe9ff'],\n speed: 1,\n intensity: 1,\n opacity: 0.7,\n blur: 0,\n blend: 'source-over',\n seed: 17,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'pause',\n paused: false,\n pauseOffscreen: true,\n\n count: 320,\n angle: 96,\n wind: 0,\n velocity: 900,\n depthRange: [1, 0.35],\n length: 18,\n thickness: 1.2,\n splash: false,\n}\n\nexport const rain: EffectDefinition<RainOptions> = defineEffect<RainOptions>({\n name: 'rain',\n defaults: RAIN_DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(2000, Math.max(1, Math.floor(opts.count)))\n const buffer = new ParticleBuffer(capacity)\n let seeded = false\n\n /** Ring splashes: x, y, age. Plain arrays because there are only ever a handful. */\n const splashes: { x: number; y: number; age: number }[] = []\n\n function seedOne(index: number, initial: boolean): void {\n const { width, height } = context.size\n const rng = context.rng\n const [near, far] = opts.depthRange\n\n const depth = rng.range(Math.min(near, far), Math.max(near, far))\n buffer.seed[index] = depth\n buffer.size[index] = opts.thickness * depth\n buffer.extra[index] = opts.length * depth\n buffer.colorIndex[index] = rng.int(0, Math.max(0, context.colors.length - 1))\n buffer.life[index] = Infinity\n buffer.maxLife[index] = Infinity\n\n buffer.x[index] = rng.range(-width * 0.2, width * 1.2)\n // On first seed, scatter vertically so the canvas starts full rather than filling from\n // the top over the first second.\n buffer.y[index] = initial ? rng.range(-height, height) : rng.range(-height * 0.3, -10)\n }\n\n function seed(): void {\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n seedOne(index, true)\n }\n seeded = true\n }\n\n return {\n frame({ delta, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n\n if (!seeded || (buffer.count === 0 && width > 1)) seed()\n\n const target = Math.max(\n 8,\n Math.floor(capacity * (opts.performance === 'high' ? 1 : quality)),\n )\n if (buffer.count > target) buffer.truncate(target)\n\n surface.clear()\n\n const angle = radians(opts.angle + opts.wind)\n const dirX = Math.cos(angle)\n const dirY = Math.sin(angle)\n const baseVelocity = opts.velocity * opts.intensity\n const count = buffer.count\n\n ctx.globalCompositeOperation = opts.blend ?? 'source-over'\n ctx.lineCap = 'butt'\n\n const colorCount = Math.max(1, colors.length)\n\n for (let i = 0; i < count; i++) {\n const depth = buffer.seed[i]\n // Depth scales speed as well as size — this coupling is what creates the parallax.\n const velocity = baseVelocity * depth\n buffer.x[i] += dirX * velocity * delta\n buffer.y[i] += dirY * velocity * delta\n\n const trailLength = buffer.extra[i]\n\n if (buffer.y[i] - trailLength > height) {\n if (opts.splash && splashes.length < 24) {\n splashes.push({ x: buffer.x[i], y: height - 1, age: 0 })\n }\n seedOne(i, false)\n continue\n }\n // Recycle horizontally too, so wind doesn't empty one side of the canvas.\n if (buffer.x[i] < -width * 0.25 || buffer.x[i] > width * 1.25) {\n seedOne(i, false)\n continue\n }\n\n const color = colors[buffer.colorIndex[i] % colorCount]\n ctx.strokeStyle = `rgba(${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)},${clamp(color.a * depth, 0, 1).toFixed(3)})`\n ctx.lineWidth = buffer.size[i]\n ctx.beginPath()\n ctx.moveTo(buffer.x[i], buffer.y[i])\n ctx.lineTo(buffer.x[i] - dirX * trailLength, buffer.y[i] - dirY * trailLength)\n ctx.stroke()\n }\n\n // --- Splashes ---\n if (opts.splash && splashes.length > 0) {\n const SPLASH_DURATION = 0.45\n const color = colors[0]\n const rgb = `${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)}`\n\n for (let s = splashes.length - 1; s >= 0; s--) {\n const splash = splashes[s]\n splash.age += delta\n if (splash.age >= SPLASH_DURATION) {\n splashes.splice(s, 1)\n continue\n }\n const t = splash.age / SPLASH_DURATION\n // Expanding ring with easing-out radius and linear alpha decay.\n const radius = 2 + t * 14\n ctx.strokeStyle = `rgba(${rgb},${(1 - t) * 0.4})`\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.ellipse(splash.x, splash.y, radius, radius * 0.35, 0, 0, TAU)\n ctx.stroke()\n }\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<RainOptions>) } as Required<RainOptions>\n },\n\n destroy() {\n buffer.clear()\n splashes.length = 0\n },\n }\n },\n})\n\n// ---------------------------------------------------------------------------\n// Snow\n// ---------------------------------------------------------------------------\n\nexport interface SnowOptions extends PrecipitationShared {\n /** Flake radius in pixels at maximum depth. Default `2.6`. */\n size?: number\n /** Horizontal sway amplitude in pixels. Default `28`. */\n sway?: number\n /** Sway cycles per second. Default `0.35`. */\n swaySpeed?: number\n /** Soften flakes with a radial falloff. Costs more; looks better on dark backgrounds. Default `true`. */\n soft?: boolean\n}\n\nconst SNOW_DEFAULTS: Required<SnowOptions> = {\n colors: ['#ffffff', '#e8f1ff'],\n speed: 1,\n intensity: 1,\n opacity: 0.9,\n blur: 0,\n blend: 'source-over',\n seed: 23,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'pause',\n paused: false,\n pauseOffscreen: true,\n\n count: 220,\n angle: 92,\n wind: 0,\n velocity: 70,\n depthRange: [1, 0.3],\n size: 2.6,\n sway: 28,\n swaySpeed: 0.35,\n soft: true,\n}\n\nexport const snow: EffectDefinition<SnowOptions> = defineEffect<SnowOptions>({\n name: 'snow',\n defaults: SNOW_DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(1500, Math.max(1, Math.floor(opts.count)))\n const buffer = new ParticleBuffer(capacity)\n let seeded = false\n\n /** Draw order, sorted by depth so near flakes render over far ones. */\n let order: number[] = []\n\n function seedOne(index: number, initial: boolean): void {\n const { width, height } = context.size\n const rng = context.rng\n const [near, far] = opts.depthRange\n\n const depth = rng.range(Math.min(near, far), Math.max(near, far))\n buffer.seed[index] = depth\n buffer.size[index] = opts.size * depth\n // `extra` holds the sway phase; each flake sways independently.\n buffer.extra[index] = rng.range(0, TAU)\n buffer.colorIndex[index] = rng.int(0, Math.max(0, context.colors.length - 1))\n buffer.life[index] = Infinity\n buffer.maxLife[index] = Infinity\n // Per-flake sway frequency multiplier, stored in vx which is otherwise unused here.\n buffer.vx[index] = rng.range(0.6, 1.5)\n\n buffer.x[index] = rng.range(-width * 0.15, width * 1.15)\n buffer.y[index] = initial ? rng.range(-height, height) : rng.range(-height * 0.25, -8)\n }\n\n function seed(): void {\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n seedOne(index, true)\n }\n // Sort once at seed time rather than per frame: depth never changes for a live flake,\n // and re-sorting 220 items every frame for no benefit is exactly the kind of waste that\n // adds up across five effects on a page.\n order = Array.from({ length: buffer.count }, (_, i) => i).sort(\n (a, b) => buffer.seed[a] - buffer.seed[b],\n )\n seeded = true\n }\n\n return {\n frame({ time, delta, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n\n if (!seeded || (buffer.count === 0 && width > 1)) seed()\n\n const target = Math.max(\n 8,\n Math.floor(capacity * (opts.performance === 'high' ? 1 : quality)),\n )\n if (buffer.count > target) {\n buffer.truncate(target)\n order = order.filter((i) => i < buffer.count)\n }\n\n surface.clear()\n\n const angle = radians(opts.angle + opts.wind)\n const dirX = Math.cos(angle)\n const dirY = Math.sin(angle)\n const baseVelocity = opts.velocity * opts.intensity\n const sway = opts.sway\n const swaySpeed = opts.swaySpeed\n\n ctx.globalCompositeOperation = opts.blend ?? 'source-over'\n const colorCount = Math.max(1, colors.length)\n\n for (const i of order) {\n if (i >= buffer.count) continue\n\n const depth = buffer.seed[i]\n const velocity = baseVelocity * depth\n\n buffer.y[i] += dirY * velocity * delta\n // The sway is a velocity contribution rather than a position offset, so it composes\n // with wind instead of fighting it.\n const swayPhase = time * swaySpeed * TAU * buffer.vx[i] + buffer.extra[i]\n buffer.x[i] += (dirX * velocity + Math.cos(swayPhase) * sway * depth) * delta\n\n const radius = buffer.size[i]\n\n if (buffer.y[i] - radius > height) {\n seedOne(i, false)\n continue\n }\n if (buffer.x[i] < -width * 0.2 || buffer.x[i] > width * 1.2) {\n seedOne(i, false)\n continue\n }\n\n const color = colors[buffer.colorIndex[i] % colorCount]\n const alpha = clamp(color.a * depth, 0, 1)\n const rgb = `${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)}`\n\n if (opts.soft) {\n const gradient = ctx.createRadialGradient(\n buffer.x[i],\n buffer.y[i],\n 0,\n buffer.x[i],\n buffer.y[i],\n radius * 2,\n )\n gradient.addColorStop(0, `rgba(${rgb},${alpha})`)\n gradient.addColorStop(0.5, `rgba(${rgb},${alpha * 0.5})`)\n gradient.addColorStop(1, `rgba(${rgb},0)`)\n ctx.fillStyle = gradient\n ctx.fillRect(buffer.x[i] - radius * 2, buffer.y[i] - radius * 2, radius * 4, radius * 4)\n } else {\n ctx.fillStyle = `rgba(${rgb},${alpha})`\n ctx.beginPath()\n ctx.arc(buffer.x[i], buffer.y[i], radius, 0, TAU)\n ctx.fill()\n }\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<SnowOptions>) } as Required<SnowOptions>\n },\n\n destroy() {\n buffer.clear()\n order = []\n },\n }\n },\n})\n","import { TAU, clamp } from '../../math/scalar'\nimport { GradientCache, drawGlow } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer } from '../particles/buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Fireflies — soft points that wander and pulse.\n *\n * Two details do all the work:\n *\n * **Wandering, not drifting.** Each firefly's heading is driven by a slowly-evolving noise\n * sample rather than a fixed velocity, so it curves and doubles back. A constant velocity —\n * even a slow one — reads as dust falling, not as something alive.\n *\n * **Asymmetric pulsing.** The brightness envelope rises faster than it falls (a raised sine\n * with a shaped exponent), because a real bioluminescent flash does. A symmetric sine looks\n * like a dimmer being turned up and down.\n */\n\nexport interface FirefliesOptions extends BaseEffectOptions {\n /** Number of fireflies at full quality. Default `40`. */\n count?: number\n /** Glow radius in pixels. Default `5`. */\n size?: number\n /** Wander speed in pixels per second. Default `22`. */\n wanderSpeed?: number\n /** How sharply headings change. Higher is more erratic. Default `0.35`. */\n turbulence?: number\n /** Average pulses per second. Default `0.5`. */\n pulseRate?: number\n /** Minimum brightness between pulses, in `[0, 1]`. Default `0.12`. */\n baseGlow?: number\n /** Radius in pixels within which the pointer scatters fireflies. Default `120`. */\n pointerRadius?: number\n}\n\nconst DEFAULTS: Required<FirefliesOptions> = {\n colors: ['#ffe98a', '#c8ff8a', '#8affd4'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 29,\n interactive: true,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n count: 40,\n size: 5,\n wanderSpeed: 22,\n turbulence: 0.35,\n pulseRate: 0.5,\n baseGlow: 0.12,\n pointerRadius: 120,\n}\n\nexport const fireflies: EffectDefinition<FirefliesOptions> = defineEffect<FirefliesOptions>({\n name: 'fireflies',\n defaults: DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(400, Math.max(1, Math.floor(opts.count)))\n const buffer = new ParticleBuffer(capacity)\n const gradients = new GradientCache(48)\n\n // A low-octave field: we want smooth, slowly-turning headings, not detailed structure.\n const heading = context.noise.fbm2D({ octaves: 2, gain: 0.5 })\n let seeded = false\n\n function seed(): void {\n const { width, height } = context.size\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n buffer.x[index] = rng.next() * width\n buffer.y[index] = rng.next() * height\n buffer.size[index] = opts.size * rng.range(0.6, 1.5)\n buffer.colorIndex[index] = rng.int(0, colorCount - 1)\n buffer.life[index] = Infinity\n buffer.maxLife[index] = Infinity\n // Pulse phase, so fireflies don't flash in unison.\n buffer.seed[index] = rng.range(0, TAU)\n // Per-firefly pulse rate multiplier.\n buffer.extra[index] = rng.range(0.6, 1.6)\n // Noise-space offset so each firefly samples a different part of the field.\n buffer.vx[index] = rng.range(0, 1000)\n buffer.vy[index] = rng.range(0, 1000)\n }\n seeded = true\n }\n\n return {\n frame({ time, delta, quality }) {\n const { ctx, size, pointer, surface, colors } = context\n const { width, height } = size\n\n if (!seeded || (buffer.count === 0 && width > 1)) seed()\n\n const target = Math.max(\n 4,\n Math.floor(capacity * (opts.performance === 'high' ? 1 : quality)),\n )\n if (buffer.count > target) buffer.truncate(target)\n\n surface.clear()\n\n const wanderSpeed = opts.wanderSpeed * opts.intensity\n const turbulence = opts.turbulence\n const baseGlow = clamp(opts.baseGlow, 0, 1)\n const pulseRate = opts.pulseRate\n const count = buffer.count\n\n const interactive = opts.interactive !== false && pointer !== null && pointer.everInside\n const px = interactive ? pointer.smoothX : 0\n const py = interactive ? pointer.smoothY : 0\n const scatterRadius = Math.max(1, opts.pointerRadius)\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n const colorCount = Math.max(1, colors.length)\n\n for (let i = 0; i < count; i++) {\n // Heading from noise, mapped to a full turn. Sampling with time on the second axis\n // makes the heading evolve; the per-firefly offsets keep them independent.\n const n = heading(buffer.vx[i] * 0.01, buffer.vy[i] * 0.01 + time * turbulence)\n const angle = n * TAU * 2\n\n let dx = Math.cos(angle) * wanderSpeed\n let dy = Math.sin(angle) * wanderSpeed\n\n if (interactive) {\n const ox = buffer.x[i] - px\n const oy = buffer.y[i] - py\n const distance = Math.hypot(ox, oy)\n if (distance < scatterRadius && distance > 1e-3) {\n // Fireflies scatter away from the cursor. Cubic falloff makes the reaction feel\n // local and sudden rather than like a global field.\n const falloff = 1 - distance / scatterRadius\n const push = falloff * falloff * falloff * wanderSpeed * 6\n dx += (ox / distance) * push\n dy += (oy / distance) * push\n }\n }\n\n buffer.x[i] += dx * delta\n buffer.y[i] += dy * delta\n\n // Soft-bounce off the edges rather than wrapping: a firefly that teleports across the\n // canvas breaks the illusion, whereas one that turns around does not.\n const margin = buffer.size[i] * 3\n if (buffer.x[i] < margin) buffer.x[i] += (margin - buffer.x[i]) * 0.08\n else if (buffer.x[i] > width - margin)\n buffer.x[i] -= (buffer.x[i] - (width - margin)) * 0.08\n if (buffer.y[i] < margin) buffer.y[i] += (margin - buffer.y[i]) * 0.08\n else if (buffer.y[i] > height - margin)\n buffer.y[i] -= (buffer.y[i] - (height - margin)) * 0.08\n\n // Asymmetric pulse. `(sin + 1) / 2` raised to a power > 1 spends more time dark,\n // producing a flash rather than a throb.\n const raw = (Math.sin(time * pulseRate * TAU * buffer.extra[i] + buffer.seed[i]) + 1) / 2\n const pulse = baseGlow + (1 - baseGlow) * raw ** 2.6\n\n const color = colors[buffer.colorIndex[i] % colorCount]\n drawGlow(\n ctx,\n buffer.x[i],\n buffer.y[i],\n buffer.size[i] * 3.2,\n color,\n clamp(pulse * opts.intensity, 0, 1),\n gradients,\n )\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<FirefliesOptions>) } as Required<FirefliesOptions>\n gradients.clear()\n },\n\n destroy() {\n buffer.clear()\n gradients.clear()\n },\n }\n },\n})\n","import { TAU, clamp } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Light rays — volumetric shafts fanning from a source point.\n *\n * Three details separate this from a starburst clip-art:\n *\n * **The fan is uneven.** Rays are spaced evenly and then jittered by a fixed per-ray offset drawn\n * once from the seeded RNG. Perfectly even spacing reads as a sunburst *graphic*; real shafts are\n * gaps between whatever is occluding the light, and occluders are not evenly spaced.\n *\n * **Brightness is noise-driven, not sinusoidal.** Each ray samples an fBm field at its own offset,\n * so shafts brighten and fade independently and never fall into a visible collective rhythm — the\n * look of light through moving foliage or drifting dust rather than a pulsing lamp.\n *\n * **One gradient per colour, alpha via `globalAlpha`.** The obvious implementation rebuilds a\n * linear gradient per ray per frame because the brightness changes every frame. Baking brightness\n * into the stops would make the cache key change constantly and defeat it entirely, so the stops\n * are built once at full alpha and the per-ray brightness is applied with `globalAlpha` instead.\n */\n\nexport interface LightRaysOptions extends BaseEffectOptions {\n /** Number of shafts. Default `14`. */\n count?: number\n /** Source X as a fraction of width. Values outside `[0, 1]` put it off-canvas. Default `0.5`. */\n originX?: number\n /** Source Y as a fraction of height. Default `-0.25` — above the canvas, so shafts angle down. */\n originY?: number\n /** Direction the fan points, in radians. `Math.PI / 2` is straight down. Default `1.5708`. */\n angle?: number\n /** Total angular width of the fan, in radians. Default `1.5`. */\n spread?: number\n /** Angular half-width of a single shaft, in radians. Default `0.045`. */\n rayWidth?: number\n /** Shaft length as a multiple of the canvas diagonal. Default `1.4` — always exits the frame. */\n length?: number\n /** How far along a shaft the light survives, in `[0, 1]`. Higher reaches further. Default `0.5`. */\n falloff?: number\n /** Lateral edge softness, in `[0, 1]`. `0` gives hard-edged wedges. Default `0.65`. */\n softness?: number\n /** Depth of the brightness variation, in `[0, 1]`. `0` is a steady fan. Default `0.55`. */\n flicker?: number\n /** How fast brightness varies. Default `0.35`. */\n flickerSpeed?: number\n /** Angular sway of the whole fan, in radians. Default `0.06`. */\n sway?: number\n /** Sway frequency. Default `0.12`. */\n swaySpeed?: number\n /** How far the source follows the pointer, in `[0, 1]`. Default `0.25`. */\n pointerPull?: number\n}\n\nconst DEFAULTS: Required<LightRaysOptions> = {\n colors: ['#fff4d6', '#ffd9a0', '#ffb865'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 41,\n interactive: true,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n count: 16,\n originX: 0.5,\n originY: -0.6,\n angle: Math.PI / 2,\n spread: 1.1,\n rayWidth: 0.03,\n length: 1.4,\n falloff: 0.5,\n softness: 0.65,\n flicker: 0.55,\n flickerSpeed: 0.35,\n sway: 0.06,\n swaySpeed: 0.12,\n pointerPull: 0.25,\n}\n\n/** Hard ceiling on shafts. Past this they overlap into a flat wash and only cost fill rate. */\nconst MAX_RAYS = 64\n\n/**\n * Floor on a shaft's brightness as a fraction of its peak. Letting flicker reach zero makes rays\n * blink out entirely, which reads as a rendering fault rather than as moving light.\n */\nconst MIN_BRIGHTNESS = 0.15\n\n/**\n * Nested wedges drawn per shaft, widest and dimmest first.\n *\n * A single wedge has a gradient along its length but nothing across its width, so its sides are\n * perfectly hard and the fan reads as painted stripes. Blurring would fix it but `ctx.filter` is\n * unavailable in Safari before 17 and costs a full-canvas pass regardless. Summing a few nested\n * wedges under additive blending approximates the lateral falloff for three fills per shaft.\n */\n/** Widest the outermost soft layer gets, as a multiple of the shaft's own half-width, at `softness: 1`. */\nconst MAX_SOFT_SPREAD = 2.5\n\nconst SOFT_LAYERS: readonly { width: number; alpha: number }[] = [\n { width: 1, alpha: 0.28 },\n { width: 0.55, alpha: 0.32 },\n { width: 0.28, alpha: 0.4 },\n]\n\nexport const lightRays: EffectDefinition<LightRaysOptions> = defineEffect<LightRaysOptions>({\n name: 'light-rays',\n defaults: DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const count = Math.min(MAX_RAYS, Math.max(1, Math.floor(opts.count)))\n\n // Per-ray constants, drawn once so the composition is stable for a given seed.\n const angleJitter = new Float32Array(count)\n const widthScale = new Float32Array(count)\n const noiseOffset = new Float32Array(count)\n const colorIndex = new Uint8Array(count)\n\n const rng = context.rng\n for (let i = 0; i < count; i++) {\n angleJitter[i] = rng.range(-0.5, 0.5)\n widthScale[i] = rng.range(0.45, 1.55)\n noiseOffset[i] = rng.range(0, 128)\n colorIndex[i] = rng.int(0, 255)\n }\n\n // Two octaves: enough to avoid an obvious period, few enough to stay cheap at 60 Hz.\n const brightness = context.noise.fbm2D({ octaves: 2, gain: 0.55 })\n\n /**\n * Gradients are keyed by colour only. They live in local ray space — origin to `(length, 0)` —\n * which is exactly why the context is rotated per ray rather than the geometry rebuilt.\n */\n let gradients: CanvasGradient[] = []\n let gradientLength = -1\n\n function buildGradients(rayLength: number): void {\n const { ctx, colors } = context\n gradients = colors.map((color) => {\n const rgb = `${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)}`\n const gradient = ctx.createLinearGradient(0, 0, Math.max(1, rayLength), 0)\n const reach = clamp(opts.falloff, 0.05, 1)\n // Peaks below full alpha on purpose. These layers sum under additive blending, and a\n // shaft that reaches 1.0 at the source clips to white and stops reading as light.\n gradient.addColorStop(0, `rgba(${rgb},${color.a * 0.7})`)\n gradient.addColorStop(reach * 0.4, `rgba(${rgb},${color.a * 0.36})`)\n gradient.addColorStop(reach, `rgba(${rgb},${color.a * 0.12})`)\n gradient.addColorStop(1, `rgba(${rgb},0)`)\n return gradient\n })\n gradientLength = rayLength\n }\n\n return {\n frame({ time, quality }) {\n const { ctx, size, surface, pointer, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n\n surface.clear()\n if (colors.length === 0) return\n\n const rayLength = Math.hypot(width, height) * opts.length\n if (rayLength !== gradientLength) buildGradients(rayLength)\n\n // Adaptive quality drops shafts rather than resolution: overlapping additive wedges are\n // the entire cost here, and fewer of them degrades far more gracefully than a blurrier one.\n const drawn = opts.performance === 'high' ? count : Math.max(3, Math.round(count * quality))\n\n let originX = opts.originX\n let originY = opts.originY\n const interactive = opts.interactive !== false && pointer !== null && pointer.everInside\n if (interactive) {\n const pull = clamp(opts.pointerPull, 0, 1)\n originX += (pointer.smoothNx - originX) * pull\n originY += (pointer.smoothNy - originY) * pull\n }\n\n const sourceX = originX * width\n const sourceY = originY * height\n\n const sway = Math.sin(time * opts.swaySpeed * TAU) * opts.sway\n const half = opts.spread / 2\n const step = opts.spread / drawn\n const flickerDepth = clamp(opts.flicker, 0, 1)\n const alphaScale = clamp(opts.opacity * opts.intensity, 0, 1)\n\n ctx.save()\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n ctx.translate(sourceX, sourceY)\n\n for (let i = 0; i < drawn; i++) {\n // Even spacing plus a fixed jitter of up to half a step — enough to break the sunburst\n // regularity without letting shafts cross each other.\n const rayAngle = opts.angle - half + (i + 0.5) * step + angleJitter[i] * step + sway\n\n const n = brightness(noiseOffset[i], time * opts.flickerSpeed)\n // fBm is roughly `[-1, 1]`; map to `[MIN_BRIGHTNESS, 1]` scaled by the flicker depth.\n const varied = 1 - flickerDepth * (1 - (n * 0.5 + 0.5))\n const alpha = clamp(Math.max(MIN_BRIGHTNESS, varied) * alphaScale, 0, 1)\n if (alpha <= 0.002) continue\n\n const halfWidth = opts.rayWidth * widthScale[i]\n // `softness` widens the outermost layer. At 0 every layer collapses to the same width\n // and the shaft is a hard-edged wedge again, which is the documented behaviour.\n const spreadFactor = 1 + clamp(opts.softness, 0, 1) * MAX_SOFT_SPREAD\n\n ctx.save()\n ctx.rotate(rayAngle)\n ctx.fillStyle = gradients[colorIndex[i] % gradients.length]\n\n for (const layer of SOFT_LAYERS) {\n const hw = halfWidth * (1 + (spreadFactor - 1) * layer.width)\n ctx.globalAlpha = alpha * layer.alpha\n ctx.beginPath()\n ctx.moveTo(0, 0)\n ctx.lineTo(Math.cos(-hw) * rayLength, Math.sin(-hw) * rayLength)\n ctx.lineTo(Math.cos(hw) * rayLength, Math.sin(hw) * rayLength)\n ctx.closePath()\n ctx.fill()\n }\n\n ctx.restore()\n }\n\n ctx.restore()\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n gradientLength = -1\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<LightRaysOptions>) } as Required<LightRaysOptions>\n gradientLength = -1\n },\n\n destroy() {\n gradients = []\n },\n }\n },\n})\n","import { clamp } from '../../math/scalar'\nimport { GradientCache, drawGlow } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport { ParticleBuffer } from '../particles/buffer'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Smoke — a rising, dissipating plume.\n *\n * **Recycled, never respawned.** A continuous emitter that kills and spawns particles churns the\n * buffer every frame and makes the live count sawtooth. Here a puff that reaches the end of its\n * life is reset in place instead, so the count is constant, the swap-remove path is never taken,\n * and density stays even — which is what a plume actually looks like.\n *\n * **Curl turbulence, not random jitter.** Lateral motion comes from a divergence-free curl field,\n * the same reason `particle-field` uses one: raw noise has sources and sinks, so puffs pool into\n * clumps and leave gaps. Curl preserves density, so the plume stays coherent as it climbs.\n *\n * **The opacity envelope is asymmetric.** A puff reaches full opacity in the first fraction of its\n * life and then decays slowly over the rest. Smoke becomes visible almost immediately and takes a\n * long time to disperse; a symmetric fade reads as a light being dimmed up and down.\n *\n * **Growth is tied to age, not to velocity.** Real smoke expands as it entrains surrounding air,\n * which happens on a clock rather than in proportion to how fast it is moving.\n */\n\nexport interface SmokeOptions extends BaseEffectOptions {\n /** Puffs held live at full quality. Default `90`. */\n count?: number\n /** Emitter X as a fraction of width. Default `0.5`. */\n sourceX?: number\n /** Emitter Y as a fraction of height. Default `1.05` — just below frame, so the plume enters. */\n sourceY?: number\n /** Horizontal spawn jitter, in pixels. Default `28`. */\n spread?: number\n /** Buoyancy in pixels per second. Default `54`. */\n rise?: number\n /** Strength of the curl-driven lateral swirl. Default `40`. */\n turbulence?: number\n /** Spatial frequency of the curl field. Higher is more chaotic. Default `0.0035`. */\n scale?: number\n /** Starting puff radius in pixels. Default `16`. */\n size?: number\n /** How much a puff expands over its life, as a multiplier. Default `2.6`. */\n growth?: number\n /** Puff lifetime in seconds. Default `4.5`. */\n life?: number\n /** Velocity retained per second, in `[0, 1)`. Higher slows puffs faster. Default `0.55`. */\n drag?: number\n /** Peak opacity of an individual puff, in `[0, 1]`. Default `0.32`. */\n density?: number\n}\n\nconst DEFAULTS: Required<SmokeOptions> = {\n colors: ['#8e9bb0', '#b9c3d1', '#6b7688'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n // `source-over`, not `lighter` — the one place this effect deliberately breaks with the other\n // particle effects here. Smoke *occludes* light rather than emitting it, and additive blending\n // drives overlapping puffs to pure white, which reads as a lens flare rather than a plume.\n blend: 'source-over',\n seed: 53,\n interactive: false,\n resolution: 0.85,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n count: 100,\n sourceX: 0.5,\n sourceY: 1.05,\n // Tight at the emitter: a wide spawn scatters puffs into unrelated blobs instead of a column,\n // and the curl field widens the plume on its own as it climbs.\n spread: 16,\n rise: 54,\n turbulence: 26,\n scale: 0.0035,\n size: 18,\n growth: 2.2,\n life: 4.5,\n drag: 0.55,\n density: 0.16,\n}\n\n/** Ceiling on live puffs — past this the plume is opaque and extra puffs only cost fill rate. */\nconst MAX_PUFFS = 400\n\n/**\n * Fraction of a puff's life spent ramping to full opacity. Short on purpose: smoke appears almost\n * at once and lingers, so nearly the whole envelope should be the decay.\n */\nconst FADE_IN = 0.14\n\n/**\n * How fast the curl field itself evolves, relative to wall time. Without this the field is static\n * and puffs retrace the same eddies; too high and the plume boils rather than drifts.\n */\nconst FIELD_DRIFT = 0.12\n\n/** Exponent on the decay. Above 1 it lingers then drops away rather than fading linearly. */\nconst DECAY_SHAPE = 1.6\n\nexport const smoke: EffectDefinition<SmokeOptions> = defineEffect<SmokeOptions>({\n name: 'smoke',\n defaults: DEFAULTS,\n structuralOptions: ['count'],\n\n setup(context, options) {\n let opts = options\n const capacity = Math.min(MAX_PUFFS, Math.max(1, Math.floor(opts.count)))\n const buffer = new ParticleBuffer(capacity)\n const gradients = new GradientCache(64)\n\n const curl = context.noise.curlAnimated({ octaves: 2, gain: 0.5 })\n let seeded = false\n\n /**\n * Place one puff at the emitter.\n *\n * `ageOffset` staggers the initial fill so the plume starts mid-flight rather than as a single\n * clump leaving the emitter together — without it the first four seconds look like a puff of\n * exhaust rather than a steady column.\n */\n function place(index: number, ageOffset: number): void {\n const { width, height } = context.size\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n\n buffer.x[index] = opts.sourceX * width + rng.range(-opts.spread, opts.spread)\n buffer.y[index] = opts.sourceY * height + rng.range(-opts.spread, opts.spread) * 0.35\n buffer.vx[index] = rng.range(-8, 8)\n buffer.vy[index] = -opts.rise * rng.range(0.7, 1.3)\n buffer.size[index] = opts.size * rng.range(0.65, 1.4)\n buffer.colorIndex[index] = rng.int(0, colorCount - 1)\n buffer.maxLife[index] = opts.life * rng.range(0.75, 1.25)\n buffer.life[index] = buffer.maxLife[index] * (1 - ageOffset)\n // Independent offset into the curl field, so neighbouring puffs don't swirl in lockstep.\n buffer.seed[index] = rng.range(0, 500)\n buffer.extra[index] = rng.range(0.7, 1.35)\n }\n\n function seed(): void {\n buffer.clear()\n for (let i = 0; i < capacity; i++) {\n const index = buffer.spawn()\n if (index < 0) break\n place(index, context.rng.next())\n }\n seeded = true\n }\n\n return {\n frame({ time, delta, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n\n if (!seeded || buffer.count === 0) seed()\n\n const target =\n opts.performance === 'high' ? capacity : Math.max(4, Math.floor(capacity * quality))\n if (buffer.count > target) buffer.truncate(target)\n\n surface.clear()\n if (colors.length === 0) return\n\n const count = buffer.count\n const colorCount = Math.max(1, colors.length)\n const retain = Math.pow(1 - clamp(opts.drag, 0, 0.999), delta)\n const turbulence = opts.turbulence * opts.intensity\n const rise = opts.rise * opts.intensity\n const peak = clamp(opts.density, 0, 1) * clamp(opts.opacity, 0, 1)\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n for (let i = 0; i < count; i++) {\n buffer.life[i] -= delta\n if (buffer.life[i] <= 0) {\n // Recycle in place rather than kill/spawn — see the note at the top of this file.\n place(i, 0)\n continue\n }\n\n const flow = curl(\n (buffer.x[i] + buffer.seed[i]) * opts.scale,\n buffer.y[i] * opts.scale,\n time * FIELD_DRIFT,\n )\n\n buffer.vx[i] = buffer.vx[i] * retain + flow.x * turbulence * delta\n // Buoyancy is re-applied every frame rather than set once, so drag can't bleed the\n // climb away — a puff that slows to a stop halfway up stops reading as smoke.\n buffer.vy[i] = buffer.vy[i] * retain + (flow.y * turbulence - rise) * delta\n\n buffer.x[i] += buffer.vx[i] * delta\n buffer.y[i] += buffer.vy[i] * delta\n\n const age = clamp(1 - buffer.life[i] / buffer.maxLife[i], 0, 1)\n const fadeIn = Math.min(1, age / FADE_IN)\n const decay = Math.pow(1 - age, DECAY_SHAPE)\n const alpha = peak * fadeIn * decay\n if (alpha <= 0.002) continue\n\n const radius = buffer.size[i] * (1 + opts.growth * age) * buffer.extra[i]\n drawGlow(\n ctx,\n buffer.x[i],\n buffer.y[i],\n radius,\n colors[buffer.colorIndex[i] % colorCount],\n alpha,\n gradients,\n )\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<SmokeOptions>) } as Required<SmokeOptions>\n gradients.clear()\n },\n\n destroy() {\n buffer.clear()\n gradients.clear()\n },\n }\n },\n})\n","import { TAU, clamp, lerp } from '../../math/scalar'\nimport { toRgbString } from '../../color/format'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Floating geometry — polygons drifting in depth.\n *\n * **A real perspective divide, not a linear scale.** Depth is projected as\n * `focal / (focal + z)` rather than lerped between a near and a far size. The difference is\n * visible: linear scaling spaces the depth planes evenly, so the field reads as flat cut-outs at\n * different sizes, while the perspective divide compresses the far planes together the way an\n * actual lens does.\n *\n * **Every depth cue moves together.** Size, opacity and drift speed are all derived from the same\n * projected scale. Depth is only convincing when the cues agree — a shape that is small but moves\n * as fast as a near one immediately reads as small rather than as distant.\n *\n * **Shape names resolve to side counts once, at setup.** The frame loop reads a `Uint8Array`, so\n * no string comparison happens per shape per frame.\n */\n\n/** Shapes a field can be built from. `'circle'` is drawn as an arc rather than an n-gon. */\nexport type GeometryShape = 'triangle' | 'square' | 'pentagon' | 'hexagon' | 'circle'\n\nexport interface FloatingGeometryOptions extends BaseEffectOptions {\n /** Number of shapes. Default `18`. */\n count?: number\n /** Which shapes to draw, sampled per instance. Default all five. */\n shapes?: readonly GeometryShape[]\n /** Base radius in pixels, before the depth projection. Default `46`. */\n size?: number\n /** Drift speed in pixels per second at the nearest depth. Default `26`. */\n drift?: number\n /** Rotations per second at the fastest. Default `0.06`. */\n spin?: number\n /** Focal length for the projection. Lower exaggerates the depth. Default `1`. */\n perspective?: number\n /** How far back the field extends. Higher means more size falloff. Default `2.6`. */\n depth?: number\n /** Opacity of the furthest shapes relative to the nearest, in `[0, 1]`. Default `0.25`. */\n haze?: number\n /** Fill the shapes instead of stroking them. Default `false`. */\n filled?: boolean\n /** Stroke width in pixels at the nearest depth. Default `1.5`. */\n lineWidth?: number\n}\n\nconst ALL_SHAPES: readonly GeometryShape[] = ['triangle', 'square', 'pentagon', 'hexagon', 'circle']\n\nconst DEFAULTS: Required<FloatingGeometryOptions> = {\n colors: ['#7cc4ff', '#a78bfa', '#5eead4'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 67,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n count: 18,\n shapes: ALL_SHAPES,\n size: 46,\n drift: 26,\n spin: 0.06,\n perspective: 1,\n depth: 2.6,\n haze: 0.25,\n filled: false,\n lineWidth: 1.5,\n}\n\n/** Ceiling on shapes. Past this the field is visual noise and costs stroke rate for nothing. */\nconst MAX_SHAPES = 120\n\n/** `0` marks a circle in the side-count array — no polygon has zero sides, so it is unambiguous. */\nconst CIRCLE = 0\n\nfunction sidesFor(shape: GeometryShape): number {\n switch (shape) {\n case 'triangle':\n return 3\n case 'square':\n return 4\n case 'pentagon':\n return 5\n case 'hexagon':\n return 6\n default:\n return CIRCLE\n }\n}\n\nexport const floatingGeometry: EffectDefinition<FloatingGeometryOptions> =\n defineEffect<FloatingGeometryOptions>({\n name: 'floating-geometry',\n defaults: DEFAULTS,\n structuralOptions: ['count', 'shapes'],\n\n setup(context, options) {\n let opts = options\n const count = Math.min(MAX_SHAPES, Math.max(1, Math.floor(opts.count)))\n\n const x = new Float32Array(count)\n const y = new Float32Array(count)\n /** Depth in `[0, 1]`. `0` is nearest. */\n const z = new Float32Array(count)\n const rotation = new Float32Array(count)\n const spinRate = new Float32Array(count)\n const radius = new Float32Array(count)\n const driftX = new Float32Array(count)\n const driftY = new Float32Array(count)\n const sides = new Uint8Array(count)\n const colorIndex = new Uint8Array(count)\n /** Indices sorted far-to-near, so nearer shapes overdraw further ones. */\n const order = new Int32Array(count)\n\n let seeded = false\n\n function seed(): void {\n const { width, height } = context.size\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n const palette = opts.shapes.length > 0 ? opts.shapes : ALL_SHAPES\n\n for (let i = 0; i < count; i++) {\n x[i] = rng.next() * width\n y[i] = rng.next() * height\n z[i] = rng.next()\n rotation[i] = rng.angle()\n // Signed, so roughly half the field counter-rotates.\n spinRate[i] = rng.range(-1, 1) * opts.spin * TAU\n radius[i] = opts.size * rng.range(0.55, 1.45)\n const angle = rng.angle()\n driftX[i] = Math.cos(angle)\n driftY[i] = Math.sin(angle)\n sides[i] = sidesFor(palette[rng.int(0, palette.length - 1)])\n colorIndex[i] = rng.int(0, colorCount - 1)\n order[i] = i\n }\n\n // Painter's algorithm, sorted once: depth never changes, so this cannot go stale.\n const indices = Array.from(order)\n indices.sort((a, b) => z[b] - z[a])\n for (let i = 0; i < count; i++) order[i] = indices[i]\n\n seeded = true\n }\n\n return {\n frame({ delta, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n\n if (!seeded) seed()\n\n surface.clear()\n if (colors.length === 0) return\n\n const drawn =\n opts.performance === 'high' ? count : Math.max(3, Math.round(count * quality))\n const focal = Math.max(0.05, opts.perspective)\n const spread = Math.max(0, opts.depth)\n const drift = opts.drift * opts.intensity\n const haze = clamp(opts.haze, 0, 1)\n const alphaScale = clamp(opts.opacity, 0, 1)\n const colorCount = Math.max(1, colors.length)\n\n ctx.save()\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n // `order` runs far-to-near, so the shapes adaptive quality should drop are at the\n // *start* of it. Everything still integrates below — only drawing is skipped.\n const firstDrawn = count - drawn\n\n for (let k = 0; k < count; k++) {\n const i = order[k]\n\n // One projection, three cues: size, opacity and parallax all read from it.\n const projected = focal / (focal + z[i] * spread)\n\n // Position advances for every shape, drawn or not. Integrating only the visible ones\n // would freeze the rest, so they would visibly teleport the moment quality recovered\n // and they were drawn again.\n x[i] += driftX[i] * drift * projected * delta\n y[i] += driftY[i] * drift * projected * delta\n rotation[i] += spinRate[i] * delta\n\n // Wrap with a margin wide enough for the largest projected radius, so a shape never\n // pops in at the edge mid-frame.\n const margin = radius[i] * projected + opts.lineWidth * 2\n if (x[i] < -margin) x[i] = width + margin\n else if (x[i] > width + margin) x[i] = -margin\n if (y[i] < -margin) y[i] = height + margin\n else if (y[i] > height + margin) y[i] = -margin\n\n if (k < firstDrawn) continue\n\n const alpha = alphaScale * lerp(1, haze, z[i])\n if (alpha <= 0.002) continue\n\n const r = radius[i] * projected\n const color = colors[colorIndex[i] % colorCount]\n\n ctx.save()\n ctx.translate(x[i], y[i])\n ctx.rotate(rotation[i])\n ctx.globalAlpha = alpha\n ctx.beginPath()\n\n if (sides[i] === CIRCLE) {\n ctx.arc(0, 0, r, 0, TAU)\n } else {\n const n = sides[i]\n for (let v = 0; v < n; v++) {\n const a = (v / n) * TAU\n const px = Math.cos(a) * r\n const py = Math.sin(a) * r\n if (v === 0) ctx.moveTo(px, py)\n else ctx.lineTo(px, py)\n }\n ctx.closePath()\n }\n\n if (opts.filled) {\n ctx.fillStyle = toRgbString(color)\n ctx.fill()\n } else {\n ctx.lineWidth = Math.max(0.3, opts.lineWidth * projected)\n ctx.strokeStyle = toRgbString(color)\n ctx.stroke()\n }\n\n ctx.restore()\n }\n\n ctx.restore()\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n },\n\n resize() {\n seeded = false\n },\n\n update(next) {\n opts = {\n ...opts,\n ...(next as Partial<FloatingGeometryOptions>),\n } as Required<FloatingGeometryOptions>\n },\n }\n },\n })\n","import { TAU, clamp, lerp } from '../../math/scalar'\nimport { GradientCache, drawGlow } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Orbit — nested rings of points circling a common centre.\n *\n * **The 3D read comes from squashing, not from a 3D engine.** Each ring is an ellipse whose\n * vertical radius is scaled by `tilt`, which is exactly what a circle viewed at an angle projects\n * to. No matrix maths is needed for a convincing result.\n *\n * **Depth is split, not sorted.** The points are drawn in two passes — the far half of every orbit\n * first, the near half last — with the orbit guides laid down between them. Sorting every point by\n * depth each frame would be correct too, but the ring geometry already says which half a point is\n * on (`sin(θ)` *is* the depth), so the split buys the same occlusion for none of the sort cost.\n *\n * **Near points are larger *and* brighter.** Scaling alone reads as points of different sizes on a\n * flat plane; brightness alone reads as a flicker. Moving both together is what makes the ring\n * read as tilted in space.\n *\n * **Adjacent rings counter-rotate by default.** Rings all turning the same way look like one rigid\n * object spinning; alternating the direction makes them read as independent shells.\n */\n\nexport interface OrbitOptions extends BaseEffectOptions {\n /** Number of concentric rings. Default `3`. */\n rings?: number\n /** Points on each ring. Default `14`. */\n perRing?: number\n /** Outer ring radius as a fraction of the smaller canvas dimension. Default `0.42`. */\n radius?: number\n /** Radius of the innermost ring relative to the outer, in `(0, 1]`. Default `0.45`. */\n innerRadius?: number\n /** Vertical squash of every ring, in `(0, 1]`. `1` is head-on, lower is more tilted. Default `0.34`. */\n tilt?: number\n /** Revolutions per second of the outer ring. Default `0.05`. */\n orbitSpeed?: number\n /** Point radius in pixels. Default `3.2`. */\n size?: number\n /** Glow radius as a multiple of `size`. Default `3`. */\n glow?: number\n /** Reverse every other ring. Default `true`. */\n counterRotate?: boolean\n /** Draw the elliptical orbit paths. Default `true`. */\n showOrbits?: boolean\n /** Opacity of the orbit paths, in `[0, 1]`. Default `0.12`. */\n orbitOpacity?: number\n /** Radius of the glow at the centre, in pixels. `0` omits it. Default `26`. */\n core?: number\n}\n\nconst DEFAULTS: Required<OrbitOptions> = {\n colors: ['#7cc4ff', '#a78bfa', '#5eead4', '#fbbf7c'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 71,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'slow',\n paused: false,\n pauseOffscreen: true,\n\n rings: 3,\n perRing: 14,\n radius: 0.42,\n innerRadius: 0.45,\n tilt: 0.34,\n orbitSpeed: 0.05,\n size: 3.2,\n glow: 3,\n counterRotate: true,\n showOrbits: true,\n orbitOpacity: 0.12,\n core: 26,\n}\n\nconst MAX_RINGS = 12\nconst MAX_PER_RING = 80\n\n/** Scale applied to a point at the far and near extremes of its orbit. */\nconst DEPTH_SCALE_FAR = 0.55\nconst DEPTH_SCALE_NEAR = 1.3\n\n/** Opacity applied at the far and near extremes. */\nconst DEPTH_ALPHA_FAR = 0.3\nconst DEPTH_ALPHA_NEAR = 1\n\n/**\n * Angular-rate multiplier for the innermost ring relative to the outermost.\n *\n * Above 1 because real orbital periods shorten as the radius does. Rings all sweeping at the same\n * angular rate read as one rigid disc rotating rather than as independent shells.\n */\nconst INNER_RING_SPEEDUP = 1.8\n\nexport const orbit: EffectDefinition<OrbitOptions> = defineEffect<OrbitOptions>({\n name: 'orbit',\n defaults: DEFAULTS,\n structuralOptions: ['rings', 'perRing'],\n\n setup(context, options) {\n let opts = options\n const rings = Math.min(MAX_RINGS, Math.max(1, Math.floor(opts.rings)))\n const perRing = Math.min(MAX_PER_RING, Math.max(1, Math.floor(opts.perRing)))\n\n // Per-point constants, drawn once so a seed always produces the same arrangement.\n const total = rings * perRing\n const phase = new Float32Array(total)\n const sizeScale = new Float32Array(total)\n const colorIndex = new Uint8Array(total)\n /** Per-ring angular offset, so rings don't all start aligned at θ = 0. */\n const ringPhase = new Float32Array(rings)\n\n const rng = context.rng\n const colorCount = Math.max(1, context.colors.length)\n for (let r = 0; r < rings; r++) {\n ringPhase[r] = rng.angle()\n for (let p = 0; p < perRing; p++) {\n const i = r * perRing + p\n // Even spacing plus a small jitter — evenly spaced points read as a mechanical dial.\n phase[i] = (p / perRing) * TAU + rng.range(-0.12, 0.12)\n sizeScale[i] = rng.range(0.7, 1.35)\n colorIndex[i] = rng.int(0, colorCount - 1)\n }\n }\n\n const gradients = new GradientCache(64)\n\n return {\n frame({ time, quality }) {\n const { ctx, size, surface, colors } = context\n const { width, height } = size\n if (width < 1 || height < 1) return\n\n surface.clear()\n if (colors.length === 0) return\n\n const cx = width / 2\n const cy = height / 2\n const outer = Math.min(width, height) * opts.radius\n const inner = outer * clamp(opts.innerRadius, 0.05, 1)\n const tilt = clamp(opts.tilt, 0.02, 1)\n const alphaScale = clamp(opts.opacity * opts.intensity, 0, 1)\n const count = colors.length\n\n const drawnPerRing =\n opts.performance === 'high' ? perRing : Math.max(3, Math.round(perRing * quality))\n\n ctx.save()\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n /**\n * @param near When true, draw only points on the near half of their orbit.\n */\n const drawPoints = (near: boolean): void => {\n for (let r = 0; r < rings; r++) {\n // Rings are evenly spaced between the inner and outer radius. A single ring sits at\n // the outer radius rather than dividing by zero.\n const t = rings === 1 ? 1 : r / (rings - 1)\n const ringRadius = lerp(inner, outer, t)\n\n const direction = opts.counterRotate && r % 2 === 1 ? -1 : 1\n const rate = opts.orbitSpeed * TAU * direction * lerp(INNER_RING_SPEEDUP, 1, t)\n const base = ringPhase[r] + time * rate\n\n for (let p = 0; p < drawnPerRing; p++) {\n const i = r * perRing + p\n const theta = base + phase[i]\n const depth = Math.sin(theta)\n if (near !== depth > 0) continue\n\n // `depth` is in [-1, 1]; remap to [0, 1] where 1 is nearest the viewer.\n const d = depth * 0.5 + 0.5\n const alpha = alphaScale * lerp(DEPTH_ALPHA_FAR, DEPTH_ALPHA_NEAR, d)\n if (alpha <= 0.002) continue\n\n const scale = lerp(DEPTH_SCALE_FAR, DEPTH_SCALE_NEAR, d)\n drawGlow(\n ctx,\n cx + Math.cos(theta) * ringRadius,\n cy + depth * ringRadius * tilt,\n opts.size * opts.glow * sizeScale[i] * scale,\n colors[colorIndex[i] % count],\n alpha,\n gradients,\n )\n }\n }\n }\n\n drawPoints(false)\n\n if (opts.showOrbits && opts.orbitOpacity > 0) {\n const guide = colors[0]\n ctx.globalAlpha = clamp(opts.orbitOpacity * alphaScale, 0, 1)\n ctx.strokeStyle = `rgb(${Math.round(guide.r * 255)},${Math.round(guide.g * 255)},${Math.round(guide.b * 255)})`\n ctx.lineWidth = 1\n for (let r = 0; r < rings; r++) {\n const t = rings === 1 ? 1 : r / (rings - 1)\n const ringRadius = lerp(inner, outer, t)\n ctx.beginPath()\n ctx.ellipse(cx, cy, ringRadius, ringRadius * tilt, 0, 0, TAU)\n ctx.stroke()\n }\n ctx.globalAlpha = 1\n }\n\n if (opts.core > 0) {\n drawGlow(ctx, cx, cy, opts.core, colors[0], alphaScale, gradients)\n }\n\n drawPoints(true)\n\n ctx.restore()\n ctx.globalAlpha = 1\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<OrbitOptions>) } as Required<OrbitOptions>\n gradients.clear()\n },\n\n destroy() {\n gradients.clear()\n },\n }\n },\n})\n","import { TAU, clamp, lerp } from '../../math/scalar'\nimport { expandPalette } from '../../color/palette'\nimport { traceOpenSpline } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\nimport type { Rgb } from '../../color/types'\n\n/**\n * Waves — layered undulating bands.\n *\n * The crest of each layer is the sum of three sine components at incommensurable frequencies\n * plus a noise term. That specific recipe matters:\n *\n * - **One sine** is obviously a sine wave.\n * - **Two sines** beat against each other in a period the eye picks up within seconds.\n * - **Three sines at non-integer frequency ratios** produce a profile with no visible period.\n * - **Plus noise** breaks the remaining symmetry so crests differ in height and sharpness.\n *\n * Layers are drawn back to front with decreasing opacity and increasing amplitude, which reads\n * as depth. The path is a Catmull-Rom spline through sampled crest points rather than a polyline,\n * because at 32 samples across a wide canvas a polyline shows visible faceting on the crests.\n */\n\nexport interface WavesOptions extends BaseEffectOptions {\n /** Number of stacked wave layers. Default `4`. */\n layers?: number\n /** Crest samples per layer. More is smoother and slower. Default `28`. */\n samples?: number\n /** Wave height in pixels at the frontmost layer. Default `40`. */\n amplitude?: number\n /** Horizontal wavelength as a fraction of canvas width. Default `0.6`. */\n wavelength?: number\n /** Vertical position of the wave band, `0` top to `1` bottom. Default `0.68`. */\n position?: number\n /** Noise contribution to the crest profile, in `[0, 1]`. Default `0.35`. */\n roughness?: number\n /** Fill below the crest as a solid band rather than stroking the line. Default `true`. */\n filled?: boolean\n /** Stroke width when `filled` is false, or the highlight width when it is true. Default `0`. */\n lineWidth?: number\n}\n\nconst DEFAULTS: Required<WavesOptions> = {\n colors: 'abyss',\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n blend: 'source-over',\n seed: 31,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n layers: 4,\n samples: 28,\n amplitude: 40,\n wavelength: 0.6,\n position: 0.68,\n roughness: 0.35,\n filled: true,\n lineWidth: 0,\n}\n\ninterface WaveLayer {\n color: Rgb\n /** Three frequency multipliers, chosen to be mutually incommensurable. */\n f1: number\n f2: number\n f3: number\n phase: number\n /** Temporal speed multiplier. */\n speed: number\n /** Amplitude multiplier — back layers are taller so they peek above the front ones. */\n amplitude: number\n /** Vertical offset in fractions of canvas height. */\n offset: number\n alpha: number\n noiseOffset: number\n}\n\nexport const waves: EffectDefinition<WavesOptions> = defineEffect<WavesOptions>({\n name: 'waves',\n defaults: DEFAULTS,\n structuralOptions: ['layers'],\n\n setup(context, options) {\n let opts = options\n let layers: WaveLayer[] = []\n const profile = context.noise.fbm2D({ octaves: 3, gain: 0.5 })\n\n /** Reused crest buffer, so the spline pass allocates nothing per frame. */\n let crest: { x: number; y: number }[] = []\n\n function build(): void {\n const count = Math.max(1, Math.floor(opts.layers))\n // Sorted dark-to-light so the palette reads as depth, whatever order the author gave.\n const palette = expandPalette(context.colors, count)\n const rng = context.rng\n\n layers = []\n for (let i = 0; i < count; i++) {\n // `t` is 0 for the backmost layer, 1 for the front.\n const t = count === 1 ? 1 : i / (count - 1)\n layers.push({\n color: palette[i],\n f1: rng.range(0.8, 1.2),\n f2: rng.range(1.7, 2.4),\n f3: rng.range(3.1, 4.3),\n phase: rng.range(0, TAU),\n speed: rng.range(0.5, 1.1),\n // Back layers are taller: they need to show above the front ones to read as distance.\n amplitude: lerp(1.35, 0.7, t),\n offset: lerp(-0.1, 0.06, t),\n alpha: lerp(0.5, 0.95, t),\n noiseOffset: rng.range(0, 100),\n })\n }\n }\n\n function ensureCrest(sampleCount: number): void {\n if (crest.length === sampleCount + 1) return\n crest = Array.from({ length: sampleCount + 1 }, () => ({ x: 0, y: 0 }))\n }\n\n build()\n\n return {\n frame({ time }) {\n const { ctx, size, surface } = context\n const { width, height } = size\n\n surface.clear()\n\n const sampleCount = Math.max(4, Math.floor(opts.samples))\n ensureCrest(sampleCount)\n\n const amplitude = opts.amplitude * opts.intensity\n const baseY = height * clamp(opts.position, 0, 1)\n const wavelength = Math.max(0.05, opts.wavelength)\n const roughness = clamp(opts.roughness, 0, 1)\n\n ctx.globalCompositeOperation = opts.blend ?? 'source-over'\n\n for (const layer of layers) {\n const t = time * layer.speed\n const layerAmplitude = amplitude * layer.amplitude\n const layerY = baseY + height * layer.offset\n\n for (let s = 0; s <= sampleCount; s++) {\n const u = s / sampleCount\n // Phase advances with x; the three components use different spatial frequencies.\n const p = (u / wavelength) * TAU + layer.phase\n\n const sines =\n Math.sin(p * layer.f1 + t * 0.9) * 0.5 +\n Math.sin(p * layer.f2 - t * 0.6) * 0.32 +\n Math.sin(p * layer.f3 + t * 1.4) * 0.18\n\n const noise = roughness > 0 ? profile(u * 3 + layer.noiseOffset, t * 0.25) : 0\n\n const y = layerY + (sines * (1 - roughness) + noise * roughness) * layerAmplitude\n\n crest[s].x = u * width\n crest[s].y = y\n }\n\n const rgb = `${Math.round(layer.color.r * 255)},${Math.round(layer.color.g * 255)},${Math.round(layer.color.b * 255)}`\n\n if (opts.filled) {\n ctx.beginPath()\n traceOpenSpline(ctx, crest, 0.5)\n // Close down to below the canvas so the fill covers everything beneath the crest,\n // regardless of how far the wave dips.\n ctx.lineTo(width, height + layerAmplitude * 2)\n ctx.lineTo(0, height + layerAmplitude * 2)\n ctx.closePath()\n\n // A subtle vertical gradient inside each band, so a stack of flat colours doesn't\n // read as paper cut-outs.\n const gradient = ctx.createLinearGradient(0, layerY - layerAmplitude, 0, height)\n gradient.addColorStop(0, `rgba(${rgb},${clamp(layer.alpha, 0, 1)})`)\n gradient.addColorStop(1, `rgba(${rgb},${clamp(layer.alpha * 0.82, 0, 1)})`)\n ctx.fillStyle = gradient\n ctx.fill()\n }\n\n if (opts.lineWidth > 0) {\n ctx.beginPath()\n traceOpenSpline(ctx, crest, 0.5)\n // A lighter crest line reads as specular highlight on the wave edge.\n ctx.strokeStyle = `rgba(255,255,255,${clamp(layer.alpha * 0.25, 0, 1)})`\n ctx.lineWidth = opts.lineWidth\n ctx.stroke()\n }\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<WavesOptions>) } as Required<WavesOptions>\n if ('colors' in next) build()\n },\n\n destroy() {\n layers = []\n crest = []\n },\n }\n },\n})\n","import { TAU, clamp, lerp } from '../../math/scalar'\nimport { expandPalette } from '../../color/palette'\nimport { traceClosedSpline } from '../../render/draw'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\nimport type { Rgb } from '../../color/types'\n\n/**\n * Liquid Blob — organic shapes that morph continuously.\n *\n * The radius at each angle is `base * (1 + noise(angle, time) * distortion)`, sampled around\n * the circle and traced as a closed Catmull-Rom spline.\n *\n * The subtlety that most implementations get wrong: the noise must be sampled on a **circle in\n * noise space**, not on the angle as a linear coordinate. If you sample `noise(angle, t)`\n * directly, the value at `angle = 0` and `angle = 2π` are different points in the noise field,\n * so the shape has a visible seam where it fails to close. Sampling\n * `noise(cos(angle) * r, sin(angle) * r, t)` instead means the sample path is genuinely closed\n * and the blob is seamless.\n */\n\nexport interface BlobOptions extends BaseEffectOptions {\n /** Number of overlapping blobs. Default `3`. */\n count?: number\n /** Points sampled around each blob's circumference. More is smoother. Default `48`. */\n segments?: number\n /** Base radius as a fraction of the smaller canvas dimension. Default `0.32`. */\n radius?: number\n /** How far the radius deviates, in `[0, 1]`. `0` is a circle. Default `0.35`. */\n distortion?: number\n /** Noise detail around the circumference. Higher gives more lobes. Default `1.6`. */\n detail?: number\n /** How fast the shape morphs. Default `0.4`. */\n morphSpeed?: number\n /** How far blobs drift from their home position, as a fraction of the canvas. Default `0.1`. */\n drift?: number\n /** Draw a stroke outline instead of a fill. Default `false`. */\n outline?: boolean\n /** Stroke width when `outline` is true. Default `2`. */\n lineWidth?: number\n /** Pointer attraction, in `[0, 1]`. Default `0.25`. */\n pointerInfluence?: number\n}\n\nconst DEFAULTS: Required<BlobOptions> = {\n colors: 'ansh',\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 30,\n blend: 'lighter',\n seed: 37,\n interactive: true,\n resolution: 0.6,\n performance: 'auto',\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n count: 3,\n segments: 48,\n radius: 0.32,\n distortion: 0.35,\n detail: 1.6,\n morphSpeed: 0.4,\n drift: 0.1,\n outline: false,\n lineWidth: 2,\n pointerInfluence: 0.25,\n}\n\ninterface Blob {\n color: Rgb\n homeX: number\n homeY: number\n radiusScale: number\n /** Offset into the noise field, so blobs morph independently. */\n noiseOffset: number\n driftFreqX: number\n driftFreqY: number\n phase: number\n alpha: number\n}\n\nexport const blob: EffectDefinition<BlobOptions> = defineEffect<BlobOptions>({\n name: 'blob',\n defaults: DEFAULTS,\n structuralOptions: ['count', 'segments'],\n\n setup(context, options) {\n let opts = options\n let blobs: Blob[] = []\n const field = context.noise.fbm3D({ octaves: 3, gain: 0.5 })\n\n /** Reused ring buffer for the spline points. */\n let ring: { x: number; y: number }[] = []\n\n function build(): void {\n const count = Math.max(1, Math.floor(opts.count))\n const palette = expandPalette(context.colors, count)\n const rng = context.rng\n\n blobs = []\n for (let i = 0; i < count; i++) {\n const angle = (i / count) * TAU + rng.range(-0.5, 0.5)\n const distance = rng.range(0.1, 0.3)\n blobs.push({\n color: palette[i],\n homeX: 0.5 + Math.cos(angle) * distance,\n homeY: 0.5 + Math.sin(angle) * distance,\n radiusScale: rng.range(0.7, 1.25),\n noiseOffset: rng.range(0, 60),\n driftFreqX: rng.range(0.07, 0.16),\n driftFreqY: rng.range(0.08, 0.18),\n phase: rng.range(0, TAU),\n alpha: lerp(0.85, 0.5, count === 1 ? 0 : i / (count - 1)),\n })\n }\n }\n\n function ensureRing(pointCount: number): void {\n if (ring.length === pointCount) return\n ring = Array.from({ length: pointCount }, () => ({ x: 0, y: 0 }))\n }\n\n build()\n\n return {\n frame({ time }) {\n const { ctx, size, pointer, surface } = context\n const { width, height } = size\n\n surface.clear()\n\n const pointCount = Math.max(8, Math.floor(opts.segments))\n ensureRing(pointCount)\n\n const minDimension = Math.min(width, height)\n const baseRadius = minDimension * clamp(opts.radius, 0.02, 1)\n const distortion = clamp(opts.distortion, 0, 1) * opts.intensity\n const detail = Math.max(0.1, opts.detail)\n const morph = time * opts.morphSpeed\n const drift = opts.drift\n\n const interactive = opts.interactive !== false && pointer !== null && pointer.everInside\n const pointerX = interactive ? pointer.smoothNx : 0.5\n const pointerY = interactive ? pointer.smoothNy : 0.5\n const pull = interactive ? clamp(opts.pointerInfluence, 0, 1) : 0\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n for (const b of blobs) {\n let nx = b.homeX + Math.sin(time * b.driftFreqX + b.phase) * drift\n let ny = b.homeY + Math.cos(time * b.driftFreqY + b.phase * 1.4) * drift\n\n if (pull > 0) {\n nx += (pointerX - nx) * pull * 0.5\n ny += (pointerY - ny) * pull * 0.5\n }\n\n const cx = nx * width\n const cy = ny * height\n const radius = baseRadius * b.radiusScale\n\n for (let i = 0; i < pointCount; i++) {\n const angle = (i / pointCount) * TAU\n // Sample on a circle in noise space so the profile closes exactly at 2π.\n const sampleX = Math.cos(angle) * detail + b.noiseOffset\n const sampleY = Math.sin(angle) * detail + b.noiseOffset\n const n = field(sampleX, sampleY, morph)\n\n const r = radius * (1 + n * distortion)\n ring[i].x = cx + Math.cos(angle) * r\n ring[i].y = cy + Math.sin(angle) * r\n }\n\n ctx.beginPath()\n traceClosedSpline(ctx, ring, 0.5)\n\n const rgb = `${Math.round(b.color.r * 255)},${Math.round(b.color.g * 255)},${Math.round(b.color.b * 255)}`\n\n if (opts.outline) {\n ctx.strokeStyle = `rgba(${rgb},${clamp(b.alpha * b.color.a, 0, 1)})`\n ctx.lineWidth = opts.lineWidth\n ctx.stroke()\n } else {\n // Radial gradient rather than a flat fill: a flat blob reads as a sticker, a\n // graded one reads as volume.\n const gradient = ctx.createRadialGradient(cx, cy, 0, cx, cy, radius * 1.4)\n const peak = clamp(b.alpha * b.color.a * opts.intensity, 0, 1)\n gradient.addColorStop(0, `rgba(${rgb},${peak})`)\n gradient.addColorStop(0.55, `rgba(${rgb},${peak * 0.72})`)\n gradient.addColorStop(1, `rgba(${rgb},${peak * 0.25})`)\n ctx.fillStyle = gradient\n ctx.fill()\n }\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<BlobOptions>) } as Required<BlobOptions>\n if ('colors' in next) build()\n },\n\n destroy() {\n blobs = []\n ring = []\n },\n }\n },\n})\n","import { clamp } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Noise Layer — film grain and dithering overlay.\n *\n * Grain does real work in a design system: it hides the banding that 8-bit gradients produce on\n * large soft fills, and it gives flat colour a physical texture that reads as premium. It is the\n * single cheapest way to make a gradient look intentional rather than default.\n *\n * The implementation is a pre-rendered tile stamped as a repeating pattern. That choice is not\n * an optimisation, it is the only viable approach: generating full-canvas grain per frame needs\n * `createImageData` + a per-pixel write + `putImageData`, which at 1920×1080 is 8 million writes\n * — roughly 30 ms, twice the entire frame budget.\n *\n * Animated grain works by cycling between a handful of pre-generated tiles and jittering the\n * pattern origin, which is visually indistinguishable from true per-frame noise because the eye\n * cannot track individual grain pixels anyway.\n */\n\nexport interface NoiseLayerOptions extends BaseEffectOptions {\n /** Grain strength in `[0, 1]`. `0.05` is subtle, `0.2` is heavy. Default `0.08`. */\n amount?: number\n /** Tile size in pixels. Larger tiles repeat less visibly but cost more memory. Default `160`. */\n tileSize?: number\n /** Number of pre-generated tiles cycled through when animating. Default `4`. */\n frames?: number\n /** Tile changes per second. `0` gives static grain. Default `12`. */\n frameRate?: number\n /**\n * Grain scale in pixels. `1` is per-pixel; `2` gives chunkier, more filmic grain.\n * Values above 1 also reduce generation cost quadratically. Default `1`.\n */\n grainSize?: number\n /** Monochrome grain, or independent per-channel (chromatic) noise. Default `true`. */\n monochrome?: boolean\n}\n\nconst DEFAULTS: Required<NoiseLayerOptions> = {\n colors: ['#ffffff'],\n speed: 1,\n intensity: 1,\n opacity: 1,\n blur: 0,\n // `overlay` preserves the underlying luminance while adding texture, which is what grain\n // should do. `source-over` would just wash the image out with grey.\n blend: 'overlay',\n seed: 41,\n interactive: false,\n resolution: 1,\n performance: 'auto',\n // Grain has no directional motion, so it causes no vestibular discomfort. But flickering can\n // trigger photosensitivity, so under reduced motion we hold a single static tile.\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n amount: 0.08,\n tileSize: 160,\n frames: 4,\n frameRate: 12,\n grainSize: 1,\n monochrome: true,\n}\n\nexport const noiseLayer: EffectDefinition<NoiseLayerOptions> = defineEffect<NoiseLayerOptions>({\n name: 'noise-layer',\n defaults: DEFAULTS,\n structuralOptions: ['tileSize', 'frames', 'grainSize', 'monochrome'],\n\n setup(context, options) {\n let opts = options\n let tiles: HTMLCanvasElement[] = []\n let patterns: (CanvasPattern | null)[] = []\n\n function buildTiles(): void {\n disposeTiles()\n\n const size = Math.max(16, Math.floor(opts.tileSize))\n const frameCount = Math.max(1, Math.min(12, Math.floor(opts.frames)))\n const grain = Math.max(1, Math.floor(opts.grainSize))\n const rng = context.rng.fork()\n const monochrome = opts.monochrome\n\n // Generate at reduced size when grainSize > 1, then let the pattern scale it up. This is\n // both cheaper to generate and what produces the chunky filmic look.\n const generated = Math.max(8, Math.floor(size / grain))\n\n for (let f = 0; f < frameCount; f++) {\n const tile = document.createElement('canvas')\n tile.width = generated\n tile.height = generated\n const tileCtx = tile.getContext('2d')\n if (!tileCtx) continue\n\n const image = tileCtx.createImageData(generated, generated)\n const data = image.data\n\n for (let i = 0; i < data.length; i += 4) {\n if (monochrome) {\n const value = rng.next() * 255\n data[i] = value\n data[i + 1] = value\n data[i + 2] = value\n } else {\n data[i] = rng.next() * 255\n data[i + 1] = rng.next() * 255\n data[i + 2] = rng.next() * 255\n }\n data[i + 3] = 255\n }\n\n tileCtx.putImageData(image, 0, 0)\n tiles.push(tile)\n }\n\n patterns = new Array(tiles.length).fill(null)\n }\n\n function disposeTiles(): void {\n for (const tile of tiles) {\n tile.width = 1\n tile.height = 1\n }\n tiles = []\n patterns = []\n }\n\n buildTiles()\n\n return {\n frame({ time }) {\n const { ctx, size, surface } = context\n const { width, height } = size\n\n surface.clear()\n\n const amount = clamp(opts.amount * opts.intensity, 0, 1)\n if (amount <= 0.001 || tiles.length === 0) return\n\n // Which tile to show. `frameRate` of 0 pins tile 0, giving static grain.\n const index = opts.frameRate > 0 ? Math.floor(time * opts.frameRate) % tiles.length : 0\n\n // Patterns are cached per tile. Creating one per frame is measurable at this call rate.\n let pattern = patterns[index]\n if (!pattern) {\n pattern = ctx.createPattern(tiles[index], 'repeat')\n patterns[index] = pattern\n }\n if (!pattern) return\n\n ctx.save()\n ctx.globalCompositeOperation = opts.blend ?? 'overlay'\n ctx.globalAlpha = amount\n\n const grain = Math.max(1, Math.floor(opts.grainSize))\n if (grain > 1) {\n // Scale the pattern up so each generated pixel covers `grain × grain` output pixels.\n // Scaling the context rather than the tile keeps the tile small in memory.\n ctx.scale(grain, grain)\n }\n\n // Jitter the pattern origin each tile change. With only four tiles this is what prevents\n // the grain from reading as a looping texture — the offset breaks the repeat.\n if (opts.frameRate > 0) {\n const jitterX = (index * 37) % Math.max(1, Math.floor(opts.tileSize))\n const jitterY = (index * 53) % Math.max(1, Math.floor(opts.tileSize))\n ctx.translate(-jitterX, -jitterY)\n }\n\n ctx.fillStyle = pattern\n // Overdraw by the jitter and scale so translation never exposes an unfilled edge.\n const overdraw = Math.max(1, Math.floor(opts.tileSize))\n ctx.fillRect(0, 0, width / grain + overdraw, height / grain + overdraw)\n\n ctx.restore()\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<NoiseLayerOptions>) } as Required<NoiseLayerOptions>\n },\n\n destroy() {\n disposeTiles()\n },\n }\n },\n})\n","import { TAU, clamp } from '../../math/scalar'\nimport { defineEffect } from '../mount'\nimport type { BaseEffectOptions, EffectDefinition } from '../types'\n\n/**\n * Spotlight — a soft light that follows the pointer.\n *\n * The trick that makes this read as *light* rather than as a moving circle is that it is drawn\n * once as a large, very soft radial gradient with an additive blend, and it *eases into\n * existence* rather than appearing at full strength. A spotlight that snaps on at the moment\n * the cursor enters reads as a bug; one that fades up over ~200 ms reads as a light being aimed.\n *\n * The pointer position comes from the tracker's critically-damped `smooth` values, so the light\n * trails very slightly behind the cursor. That lag is deliberate — a spotlight rigidly locked to\n * the cursor feels weightless and cheap.\n */\n\nexport interface SpotlightOptions extends BaseEffectOptions {\n /** Radius in pixels. Default `320`. */\n radius?: number\n /** Falloff shape. `1` is linear, `2` is quadratic (softer core). Default `1.6`. */\n falloff?: number\n /** Seconds for the light to fade in and out as the pointer enters and leaves. Default `0.35`. */\n fade?: number\n /**\n * Keep the light visible when the pointer is elsewhere, drifting slowly.\n * Useful for hero sections that should look alive before any interaction. Default `false`.\n */\n ambient?: boolean\n /** Drift radius for the ambient light, as a fraction of the canvas. Default `0.25`. */\n ambientDrift?: number\n /** Add a second, tighter and brighter core. Default `true`. */\n core?: boolean\n}\n\nconst DEFAULTS: Required<SpotlightOptions> = {\n colors: ['#ffffff'],\n speed: 1,\n intensity: 0.35,\n opacity: 1,\n blur: 0,\n blend: 'lighter',\n seed: 43,\n interactive: true,\n // The output is one enormous soft gradient. Even quarter resolution is more than enough.\n resolution: 0.35,\n performance: 'auto',\n // The light only moves in response to the user's own pointer, which is not the kind of\n // autonomous motion reduced-motion is protecting against. A static centred light is the\n // sensible fallback.\n reducedMotion: 'static',\n paused: false,\n pauseOffscreen: true,\n\n radius: 320,\n falloff: 1.6,\n fade: 0.35,\n ambient: false,\n ambientDrift: 0.25,\n core: true,\n}\n\nexport const spotlight: EffectDefinition<SpotlightOptions> = defineEffect<SpotlightOptions>({\n name: 'spotlight',\n defaults: DEFAULTS,\n\n setup(context, options) {\n let opts = options\n /** Eased presence in `[0, 1]` — how \"on\" the light currently is. */\n let presence = opts.ambient ? 1 : 0\n const drift = { phaseX: context.rng.range(0, TAU), phaseY: context.rng.range(0, TAU) }\n\n return {\n frame({ time, delta }) {\n const { ctx, size, pointer, surface, colors } = context\n const { width, height } = size\n\n surface.clear()\n\n const interactive = opts.interactive !== false && pointer !== null\n const hovering = interactive && pointer.inside\n\n // Ease presence toward its target. A fade of 0 snaps, which is available but rarely right.\n const fadeSeconds = Math.max(0, opts.fade)\n const target = hovering || opts.ambient ? 1 : 0\n if (fadeSeconds <= 0) {\n presence = target\n } else {\n const step = delta / fadeSeconds\n presence =\n presence < target\n ? Math.min(target, presence + step)\n : Math.max(target, presence - step)\n }\n\n if (presence <= 0.002) return\n\n // Position: the pointer when available, otherwise a slow Lissajous drift so ambient mode\n // doesn't sit dead centre.\n let x: number\n let y: number\n if (interactive && pointer.everInside) {\n x = pointer.smoothX\n y = pointer.smoothY\n } else {\n const driftAmount = opts.ambientDrift\n x = width * (0.5 + Math.sin(time * 0.11 + drift.phaseX) * driftAmount)\n y = height * (0.5 + Math.cos(time * 0.13 + drift.phaseY) * driftAmount)\n }\n\n const radius = Math.max(1, opts.radius)\n const color = colors[0]\n const rgb = `${Math.round(color.r * 255)},${Math.round(color.g * 255)},${Math.round(color.b * 255)}`\n const peak = clamp(color.a * opts.intensity * presence, 0, 1)\n const falloff = Math.max(0.2, opts.falloff)\n\n ctx.globalCompositeOperation = opts.blend ?? 'lighter'\n\n // Six stops on a power curve. A power falloff is what a real inverse-square light looks\n // like once the eye's own response is accounted for; a linear ramp has a visible edge.\n const gradient = ctx.createRadialGradient(x, y, 0, x, y, radius)\n const STOPS = 6\n for (let i = 0; i <= STOPS; i++) {\n const t = i / STOPS\n const alpha = peak * (1 - t) ** falloff\n gradient.addColorStop(t, `rgba(${rgb},${alpha.toFixed(4)})`)\n }\n\n ctx.fillStyle = gradient\n ctx.fillRect(x - radius, y - radius, radius * 2, radius * 2)\n\n if (opts.core) {\n // A tighter, brighter inner core. Two nested gradients read as a light with a hotspot,\n // which is what a physical spotlight has; one gradient reads as a flat glow.\n const coreRadius = radius * 0.32\n const core = ctx.createRadialGradient(x, y, 0, x, y, coreRadius)\n core.addColorStop(0, `rgba(${rgb},${(peak * 0.75).toFixed(4)})`)\n core.addColorStop(0.5, `rgba(${rgb},${(peak * 0.28).toFixed(4)})`)\n core.addColorStop(1, `rgba(${rgb},0)`)\n ctx.fillStyle = core\n ctx.fillRect(x - coreRadius, y - coreRadius, coreRadius * 2, coreRadius * 2)\n }\n\n ctx.globalCompositeOperation = 'source-over'\n },\n\n update(next) {\n opts = { ...opts, ...(next as Partial<SpotlightOptions>) } as Required<SpotlightOptions>\n if (opts.ambient) presence = Math.max(presence, 0.001)\n },\n }\n },\n})\n","export * from './types'\nexport * from './mount'\nexport * from './particles/buffer'\n\n// --- Backgrounds ---\nexport { aurora, type AuroraOptions } from './backgrounds/aurora'\nexport {\n meshGradient,\n animatedGradient,\n type MeshGradientOptions,\n type AnimatedGradientOptions,\n} from './backgrounds/mesh-gradient'\n\n// --- Particles ---\nexport { particleField, type ParticleFieldOptions } from './particles/field'\nexport { constellation, type ConstellationOptions } from './particles/constellation'\nexport { powderExplosion, type PowderExplosionOptions } from './particles/powder-explosion'\nexport {\n strangeAttractor,\n type StrangeAttractorOptions,\n type AttractorKind,\n} from './particles/strange-attractor'\nexport { swarm, type SwarmOptions } from './particles/swarm'\n\n// --- Atmosphere ---\nexport { meteors, type MeteorsOptions } from './atmosphere/meteors'\nexport { rain, snow, type RainOptions, type SnowOptions } from './atmosphere/precipitation'\nexport { fireflies, type FirefliesOptions } from './atmosphere/fireflies'\nexport { lightRays, type LightRaysOptions } from './atmosphere/light-rays'\nexport { smoke, type SmokeOptions } from './atmosphere/smoke'\n\n// --- Geometry ---\nexport {\n floatingGeometry,\n type FloatingGeometryOptions,\n type GeometryShape,\n} from './geometry/floating-geometry'\nexport { orbit, type OrbitOptions } from './geometry/orbit'\n\n// --- Surfaces ---\nexport { waves, type WavesOptions } from './surfaces/waves'\nexport { blob, type BlobOptions } from './surfaces/blob'\n\n// --- Overlays ---\nexport { noiseLayer, type NoiseLayerOptions } from './overlays/noise-layer'\nexport { spotlight, type SpotlightOptions } from './overlays/spotlight'\n\nimport { aurora } from './backgrounds/aurora'\nimport { animatedGradient, meshGradient } from './backgrounds/mesh-gradient'\nimport { particleField } from './particles/field'\nimport { constellation } from './particles/constellation'\nimport { powderExplosion } from './particles/powder-explosion'\nimport { strangeAttractor } from './particles/strange-attractor'\nimport { swarm } from './particles/swarm'\nimport { meteors } from './atmosphere/meteors'\nimport { rain, snow } from './atmosphere/precipitation'\nimport { fireflies } from './atmosphere/fireflies'\nimport { lightRays } from './atmosphere/light-rays'\nimport { smoke } from './atmosphere/smoke'\nimport { floatingGeometry } from './geometry/floating-geometry'\nimport { orbit } from './geometry/orbit'\nimport { waves } from './surfaces/waves'\nimport { blob } from './surfaces/blob'\nimport { noiseLayer } from './overlays/noise-layer'\nimport { spotlight } from './overlays/spotlight'\n\n/**\n * Every built-in effect, keyed by name.\n *\n * Used by the docs site to enumerate the catalogue and by the CLI to resolve `ansh add`.\n * Application code should import individual effects so the rest tree-shake away — importing this\n * map pulls in all of them.\n */\nexport const effects = {\n aurora,\n 'mesh-gradient': meshGradient,\n 'animated-gradient': animatedGradient,\n 'particle-field': particleField,\n constellation,\n 'powder-explosion': powderExplosion,\n 'strange-attractor': strangeAttractor,\n swarm,\n meteors,\n rain,\n snow,\n fireflies,\n 'light-rays': lightRays,\n smoke,\n 'floating-geometry': floatingGeometry,\n orbit,\n waves,\n blob,\n 'noise-layer': noiseLayer,\n spotlight,\n} as const\n\nexport type EffectName = keyof typeof effects\n"]}
|