wavedance 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/color.ts","../src/core/config.ts","../src/animations/none.ts","../src/core/rng.ts","../src/animations/random.ts","../src/core/noise.ts","../src/animations/wave.ts","../src/core/field.ts","../src/core/grid.ts","../src/render/canvas2d.ts","../src/wavedance.ts"],"names":["x","y","offsetX","offsetY","index"],"mappings":"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","file":"index.cjs","sourcesContent":["const HEX_SHORT = /^#([0-9a-fA-F]{3})$/\nconst HEX_LONG = /^#([0-9a-fA-F]{6})$/\n\n/** Parse a hex color string into RGB components (0-255). */\nexport function parseHexColor(hex: string): { r: number; g: number; b: number } {\n const trimmed = hex.trim()\n\n const shortMatch = HEX_SHORT.exec(trimmed)\n if (shortMatch) {\n const [, value] = shortMatch\n return {\n r: Number.parseInt(value[0] + value[0], 16),\n g: Number.parseInt(value[1] + value[1], 16),\n b: Number.parseInt(value[2] + value[2], 16),\n }\n }\n\n const longMatch = HEX_LONG.exec(trimmed)\n if (longMatch) {\n const [, value] = longMatch\n return {\n r: Number.parseInt(value.slice(0, 2), 16),\n g: Number.parseInt(value.slice(2, 4), 16),\n b: Number.parseInt(value.slice(4, 6), 16),\n }\n }\n\n throw new Error(`Invalid hex color: \"${hex}\". Expected #rgb or #rrggbb.`)\n}\n\n/** Validate and normalize a hex color string. */\nexport function normalizeHexColor(hex: string): string {\n const trimmed = hex.trim().toLowerCase()\n parseHexColor(trimmed)\n return trimmed\n}\n","import type { GapConfig, ResolvedWavedanceConfig, WavedanceConfig } from \"../types\"\nimport { normalizeHexColor } from \"./color\"\n\nconst DEFAULT_GAP = 10\nconst DEFAULT_DOT_SIZE = 1\n\nexport function resolveGap(gap: number | GapConfig | undefined): GapConfig {\n if (gap === undefined) {\n return { x: DEFAULT_GAP, y: DEFAULT_GAP }\n }\n if (typeof gap === \"number\") {\n return { x: gap, y: gap }\n }\n return { x: gap.x, y: gap.y }\n}\n\nexport function resolveConfig(config: WavedanceConfig = {}): ResolvedWavedanceConfig {\n const gap = resolveGap(config.gap)\n\n return {\n dotSize: config.dotSize ?? DEFAULT_DOT_SIZE,\n gap,\n foreground: normalizeHexColor(config.foreground ?? \"#7c7c7c\"),\n background: normalizeHexColor(config.background ?? \"#161616\"),\n animation: config.animation ?? \"wave\",\n wave: {\n scale: config.wave?.scale ?? 0.004,\n speed: config.wave?.speed ?? 0.0003,\n threshold: config.wave?.threshold ?? 0.15,\n softness: config.wave?.softness ?? 0.5,\n seed: config.wave?.seed ?? 42,\n },\n random: {\n speed: config.random?.speed ?? 0.8,\n minOpacity: config.random?.minOpacity ?? 0.05,\n maxOpacity: config.random?.maxOpacity ?? 1,\n seed: config.random?.seed ?? 42,\n },\n devicePixelRatio:\n config.devicePixelRatio ?? (typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1),\n maxDots: config.maxDots ?? 100_000,\n respectReducedMotion: config.respectReducedMotion ?? true,\n }\n}\n","/** Set all dots to full opacity. */\nexport function computeNoneField(intensities: Float32Array, count: number): void {\n for (let i = 0; i < count; i++) {\n intensities[i] = 1\n }\n}\n","/** Mulberry32 seeded PRNG — deterministic, fast, portable. */\nexport class SeededRng {\n private state: number\n\n constructor(seed: number) {\n this.state = seed >>> 0\n }\n\n next(): number {\n this.state += 0x6d2b79f5\n let t = this.state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n\n range(min: number, max: number): number {\n return min + this.next() * (max - min)\n }\n}\n","import { SeededRng } from \"../core/rng\"\nimport type { GridLayout, RandomAnimationOptions } from \"../types\"\n\nexport class RandomAnimation {\n private readonly options: Required<RandomAnimationOptions>\n private readonly targets: Float32Array\n private readonly rng: SeededRng\n private initialized = false\n\n constructor(maxDots: number, options: Required<RandomAnimationOptions>) {\n this.options = options\n this.targets = new Float32Array(maxDots)\n this.rng = new SeededRng(options.seed)\n }\n\n updateOptions(options: Required<RandomAnimationOptions>): void {\n Object.assign(this.options, options)\n }\n\n private pickTarget(): number {\n const { minOpacity, maxOpacity } = this.options\n return this.rng.range(minOpacity, maxOpacity)\n }\n\n compute(grid: GridLayout, intensities: Float32Array, deltaMs: number): void {\n const { speed } = this.options\n const step = speed * (deltaMs / 1000)\n const count = grid.count\n\n if (!this.initialized) {\n for (let i = 0; i < count; i++) {\n intensities[i] = this.pickTarget()\n this.targets[i] = this.pickTarget()\n }\n this.initialized = true\n return\n }\n\n for (let i = 0; i < count; i++) {\n const current = intensities[i]\n const target = this.targets[i]\n const diff = target - current\n\n if (Math.abs(diff) <= step) {\n intensities[i] = target\n this.targets[i] = this.pickTarget()\n } else {\n intensities[i] = current + Math.sign(diff) * step\n }\n }\n }\n\n reset(): void {\n this.initialized = false\n }\n}\n","/**\n * Seeded 3D Simplex noise implementation.\n * Self-contained, deterministic, and portable to Rust.\n */\nexport class SimplexNoise {\n private readonly perm: Uint8Array\n private readonly permMod12: Uint8Array\n\n private static readonly grad3 = new Float32Array([\n 1, 1, 0, -1, 1, 0, 1, -1, 0, -1, -1, 0, 1, 0, 1, -1, 0, 1, 1, 0, -1, -1, 0, -1, 0, 1, 1, 0, -1,\n 1, 0, 1, -1, 0, -1, -1,\n ])\n\n constructor(seed = 0) {\n const source = new Uint8Array(256)\n for (let i = 0; i < 256; i++) {\n source[i] = i\n }\n\n let state = (seed ^ 0x9e3779b9) >>> 0\n if (state === 0) {\n state = 1\n }\n const random = () => {\n state = (state * 1664525 + 1013904223) >>> 0\n return state / 4294967296\n }\n\n for (let i = 255; i > 0; i--) {\n const j = Math.floor(random() * (i + 1))\n const tmp = source[i]\n source[i] = source[j]\n source[j] = tmp\n }\n\n this.perm = new Uint8Array(512)\n this.permMod12 = new Uint8Array(512)\n for (let i = 0; i < 512; i++) {\n this.perm[i] = source[i & 255]\n this.permMod12[i] = this.perm[i] % 12\n }\n }\n\n /** Returns noise in approximately [-1, 1]. */\n noise3(x: number, y: number, z: number): number {\n const grad3 = SimplexNoise.grad3\n const perm = this.perm\n const permMod12 = this.permMod12\n\n const F3 = 1 / 3\n const G3 = 1 / 6\n\n const s = (x + y + z) * F3\n const i = Math.floor(x + s)\n const j = Math.floor(y + s)\n const k = Math.floor(z + s)\n\n const t = (i + j + k) * G3\n const x0 = x - (i - t)\n const y0 = y - (j - t)\n const z0 = z - (k - t)\n\n let i1: number\n let j1: number\n let k1: number\n let i2: number\n let j2: number\n let k2: number\n\n if (x0 >= y0) {\n if (y0 >= z0) {\n i1 = 1\n j1 = 0\n k1 = 0\n i2 = 1\n j2 = 1\n k2 = 0\n } else if (x0 >= z0) {\n i1 = 1\n j1 = 0\n k1 = 0\n i2 = 1\n j2 = 0\n k2 = 1\n } else {\n i1 = 0\n j1 = 0\n k1 = 1\n i2 = 1\n j2 = 0\n k2 = 1\n }\n } else if (y0 < z0) {\n i1 = 0\n j1 = 0\n k1 = 1\n i2 = 0\n j2 = 1\n k2 = 1\n } else if (x0 < z0) {\n i1 = 0\n j1 = 1\n k1 = 0\n i2 = 0\n j2 = 1\n k2 = 1\n } else {\n i1 = 0\n j1 = 1\n k1 = 0\n i2 = 1\n j2 = 1\n k2 = 0\n }\n\n const x1 = x0 - i1 + G3\n const y1 = y0 - j1 + G3\n const z1 = z0 - k1 + G3\n const x2 = x0 - i2 + 2 * G3\n const y2 = y0 - j2 + 2 * G3\n const z2 = z0 - k2 + 2 * G3\n const x3 = x0 - 1 + 3 * G3\n const y3 = y0 - 1 + 3 * G3\n const z3 = z0 - 1 + 3 * G3\n\n const ii = i & 255\n const jj = j & 255\n const kk = k & 255\n\n let n0 = 0\n let t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0\n if (t0 >= 0) {\n const gi0 = permMod12[ii + perm[jj + perm[kk]]] * 3\n t0 *= t0\n n0 = t0 * t0 * (grad3[gi0] * x0 + grad3[gi0 + 1] * y0 + grad3[gi0 + 2] * z0)\n }\n\n let n1 = 0\n let t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1\n if (t1 >= 0) {\n const gi1 = permMod12[ii + i1 + perm[jj + j1 + perm[kk + k1]]] * 3\n t1 *= t1\n n1 = t1 * t1 * (grad3[gi1] * x1 + grad3[gi1 + 1] * y1 + grad3[gi1 + 2] * z1)\n }\n\n let n2 = 0\n let t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2\n if (t2 >= 0) {\n const gi2 = permMod12[ii + i2 + perm[jj + j2 + perm[kk + k2]]] * 3\n t2 *= t2\n n2 = t2 * t2 * (grad3[gi2] * x2 + grad3[gi2 + 1] * y2 + grad3[gi2 + 2] * z2)\n }\n\n let n3 = 0\n let t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3\n if (t3 >= 0) {\n const gi3 = permMod12[ii + 1 + perm[jj + 1 + perm[kk + 1]]] * 3\n t3 *= t3\n n3 = t3 * t3 * (grad3[gi3] * x3 + grad3[gi3 + 1] * y3 + grad3[gi3 + 2] * z3)\n }\n\n return 32 * (n0 + n1 + n2 + n3)\n }\n\n /** Returns noise in approximately [0, 1]. */\n noise3Normalized(x: number, y: number, z: number): number {\n return this.noise3(x, y, z) * 0.5 + 0.5\n }\n}\n\n/** Smooth Hermite interpolation for soft cluster edges. */\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\n const t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0)))\n return t * t * (3 - 2 * t)\n}\n","import { SimplexNoise, smoothstep } from \"../core/noise\"\nimport type { GridLayout, WaveAnimationOptions } from \"../types\"\n\nexport class WaveAnimation {\n private noise: SimplexNoise\n private options: Required<WaveAnimationOptions>\n\n constructor(options: Required<WaveAnimationOptions>) {\n this.options = { ...options }\n this.noise = new SimplexNoise(options.seed)\n }\n\n updateOptions(options: Required<WaveAnimationOptions>): void {\n if (options.seed !== this.options.seed) {\n this.noise = new SimplexNoise(options.seed)\n }\n this.options = { ...options }\n }\n\n compute(grid: GridLayout, intensities: Float32Array, time: number): void {\n const { scale, speed, threshold, softness } = this.options\n const t = time * speed\n const edge1 = threshold + softness\n\n for (let i = 0; i < grid.count; i++) {\n const nx = grid.x[i] * scale\n const ny = grid.y[i] * scale\n const noiseValue = this.noise.noise3Normalized(nx, ny, t)\n intensities[i] = smoothstep(threshold, edge1, noiseValue)\n }\n }\n}\n","import { computeNoneField } from \"../animations/none\"\nimport { RandomAnimation } from \"../animations/random\"\nimport { WaveAnimation } from \"../animations/wave\"\nimport type { AnimationType, GridLayout, ResolvedWavedanceConfig } from \"../types\"\n\nexport class FieldComputer {\n private readonly intensities: Float32Array\n private wave: WaveAnimation\n private random: RandomAnimation\n private animation: AnimationType\n\n constructor(maxDots: number, config: ResolvedWavedanceConfig) {\n this.intensities = new Float32Array(maxDots)\n this.animation = config.animation\n this.wave = new WaveAnimation(config.wave)\n this.random = new RandomAnimation(maxDots, config.random)\n }\n\n get buffer(): Float32Array {\n return this.intensities\n }\n\n updateConfig(config: ResolvedWavedanceConfig): void {\n if (config.animation !== this.animation) {\n this.animation = config.animation\n if (config.animation === \"random\") {\n this.random.reset()\n }\n }\n this.wave.updateOptions(config.wave)\n this.random.updateOptions(config.random)\n }\n\n compute(grid: GridLayout, time: number, deltaMs: number): Float32Array {\n const count = grid.count\n\n switch (this.animation) {\n case \"none\":\n computeNoneField(this.intensities, count)\n break\n case \"wave\":\n this.wave.compute(grid, this.intensities, time)\n break\n case \"random\":\n this.random.compute(grid, this.intensities, deltaMs)\n break\n }\n\n return this.intensities\n }\n}\n","import type { GapConfig, GridLayout } from \"../types\"\n\nexport interface BuildGridOptions {\n width: number\n height: number\n dotSize: number\n gap: GapConfig\n dpr: number\n maxDots: number\n}\n\n/**\n * Build a dot grid layout for the given dimensions.\n * Positions are in device pixels (CSS size * dpr).\n */\nexport function buildGrid(options: BuildGridOptions): GridLayout {\n const { width, height, dotSize, gap, dpr, maxDots } = options\n\n const cellX = (dotSize + gap.x) * dpr\n const cellY = (dotSize + gap.y) * dpr\n const dotRadius = (dotSize * dpr) / 2\n\n const cols = Math.max(1, Math.floor((width * dpr) / cellX))\n const rows = Math.max(1, Math.floor((height * dpr) / cellY))\n let count = cols * rows\n\n if (count > maxDots) {\n const scale = Math.sqrt(maxDots / count)\n const scaledCols = Math.max(1, Math.floor(cols * scale))\n const scaledRows = Math.max(1, Math.floor(rows * scale))\n count = scaledCols * scaledRows\n\n const x = new Float32Array(count)\n const y = new Float32Array(count)\n\n const offsetX = (width * dpr - (scaledCols - 1) * cellX) / 2 + dotRadius\n const offsetY = (height * dpr - (scaledRows - 1) * cellY) / 2 + dotRadius\n\n let index = 0\n for (let row = 0; row < scaledRows; row++) {\n for (let col = 0; col < scaledCols; col++) {\n x[index] = offsetX + col * cellX\n y[index] = offsetY + row * cellY\n index++\n }\n }\n\n return {\n count,\n cols: scaledCols,\n rows: scaledRows,\n x,\n y,\n width,\n height,\n dpr,\n }\n }\n\n const x = new Float32Array(count)\n const y = new Float32Array(count)\n\n const offsetX = (width * dpr - (cols - 1) * cellX) / 2 + dotRadius\n const offsetY = (height * dpr - (rows - 1) * cellY) / 2 + dotRadius\n\n let index = 0\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n x[index] = offsetX + col * cellX\n y[index] = offsetY + row * cellY\n index++\n }\n }\n\n return {\n count,\n cols,\n rows,\n x,\n y,\n width,\n height,\n dpr,\n }\n}\n","import { parseHexColor } from \"../core/color\"\nimport type { DrawOptions, GridLayout } from \"../types\"\nimport type { Renderer } from \"./renderer\"\n\nconst BUCKET_COUNT = 32\n\nexport class Canvas2DRenderer implements Renderer {\n private canvas: HTMLCanvasElement | null = null\n private ctx: CanvasRenderingContext2D | null = null\n private readonly buckets: Int32Array[] = Array.from(\n { length: BUCKET_COUNT },\n () => new Int32Array(0),\n )\n private readonly bucketCounts = new Int32Array(BUCKET_COUNT)\n private foregroundRgb = { r: 255, g: 255, b: 255 }\n private lastForeground = \"\"\n\n init(container: HTMLElement): void {\n this.canvas = document.createElement(\"canvas\")\n this.canvas.style.display = \"block\"\n this.canvas.style.width = \"100%\"\n this.canvas.style.height = \"100%\"\n this.canvas.style.pointerEvents = \"none\"\n\n const ctx = this.canvas.getContext(\"2d\", { alpha: false })\n if (!ctx) {\n throw new Error(\"Failed to get 2D canvas context\")\n }\n\n this.ctx = ctx\n container.appendChild(this.canvas)\n }\n\n resize(width: number, height: number, dpr: number): void {\n if (!this.canvas) return\n\n const pixelWidth = Math.max(1, Math.floor(width * dpr))\n const pixelHeight = Math.max(1, Math.floor(height * dpr))\n\n this.canvas.width = pixelWidth\n this.canvas.height = pixelHeight\n this.canvas.style.width = `${width}px`\n this.canvas.style.height = `${height}px`\n }\n\n draw(grid: GridLayout, intensities: Float32Array, options: DrawOptions): void {\n const ctx = this.ctx\n const canvas = this.canvas\n if (!ctx || !canvas) return\n\n const { dotSize, foreground, background, dpr } = options\n const count = grid.count\n const dotPixelSize = Math.max(1, dotSize * dpr)\n\n if (foreground !== this.lastForeground) {\n this.foregroundRgb = parseHexColor(foreground)\n this.lastForeground = foreground\n }\n\n ctx.fillStyle = background\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n\n this.bucketDots(count, intensities)\n\n const { r, g, b } = this.foregroundRgb\n const rgb = `rgb(${r},${g},${b})`\n ctx.fillStyle = rgb\n\n for (let bucket = 0; bucket < BUCKET_COUNT; bucket++) {\n const bucketSize = this.bucketCounts[bucket]\n if (bucketSize === 0) continue\n\n const alpha = (bucket + 0.5) / BUCKET_COUNT\n if (alpha < 0.02) continue\n\n ctx.globalAlpha = alpha\n const indices = this.buckets[bucket]\n\n for (let i = 0; i < bucketSize; i++) {\n const idx = indices[i]\n const x = grid.x[idx] - dotPixelSize / 2\n const y = grid.y[idx] - dotPixelSize / 2\n ctx.fillRect(x, y, dotPixelSize, dotPixelSize)\n }\n }\n\n ctx.globalAlpha = 1\n }\n\n private bucketDots(count: number, intensities: Float32Array): void {\n this.bucketCounts.fill(0)\n\n for (let i = 0; i < count; i++) {\n const intensity = intensities[i]\n if (intensity <= 0) continue\n\n const bucket = Math.min(BUCKET_COUNT - 1, Math.floor(intensity * BUCKET_COUNT))\n const bucketArray = this.buckets[bucket]\n const bucketIndex = this.bucketCounts[bucket]\n\n if (bucketIndex >= bucketArray.length) {\n const newSize = bucketArray.length === 0 ? 64 : bucketArray.length * 2\n const grown = new Int32Array(newSize)\n grown.set(bucketArray)\n this.buckets[bucket] = grown\n }\n\n this.buckets[bucket][bucketIndex] = i\n this.bucketCounts[bucket]++\n }\n }\n\n destroy(): void {\n if (this.canvas?.parentElement) {\n this.canvas.parentElement.removeChild(this.canvas)\n }\n this.canvas = null\n this.ctx = null\n }\n\n getCanvas(): HTMLCanvasElement | null {\n return this.canvas\n }\n}\n","import { resolveConfig } from \"./core/config\"\nimport { FieldComputer } from \"./core/field\"\nimport { buildGrid } from \"./core/grid\"\nimport { Canvas2DRenderer } from \"./render/canvas2d\"\nimport type {\n GridLayout,\n ResolvedWavedanceConfig,\n WavedanceConfig,\n WavedanceInstance,\n} from \"./types\"\n\nfunction prefersReducedMotion(): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n}\n\nexport function createWavedance(\n container: HTMLElement,\n config: WavedanceConfig = {},\n): WavedanceInstance {\n if (!container) {\n throw new Error(\"createWavedance requires a container element\")\n }\n\n let resolved = resolveConfig(config)\n const renderer = new Canvas2DRenderer()\n renderer.init(container)\n\n let grid: GridLayout | null = null\n const field = new FieldComputer(resolved.maxDots, resolved)\n\n let rafId = 0\n let running = false\n let visible = true\n let inView = true\n let startTime = performance.now()\n let lastFrameTime = startTime\n let resizeObserver: ResizeObserver | null = null\n let intersectionObserver: IntersectionObserver | null = null\n let motionMediaQuery: MediaQueryList | null = null\n let motionChangeHandler: ((event: MediaQueryListEvent) => void) | null = null\n let visibilityHandler: (() => void) | null = null\n let resizeTimer = 0\n\n const shouldAnimate = (): boolean => {\n if (resolved.animation === \"none\") return false\n if (resolved.respectReducedMotion && prefersReducedMotion()) return false\n return visible && inView\n }\n\n const rebuildGrid = (): void => {\n const rect = container.getBoundingClientRect()\n const width = Math.max(1, rect.width)\n const height = Math.max(1, rect.height)\n const dpr = resolved.devicePixelRatio\n\n grid = buildGrid({\n width,\n height,\n dotSize: resolved.dotSize,\n gap: resolved.gap,\n dpr,\n maxDots: resolved.maxDots,\n })\n\n renderer.resize(width, height, dpr)\n }\n\n const drawFrame = (time: number): void => {\n if (!grid) return\n\n const deltaMs = time - lastFrameTime\n lastFrameTime = time\n\n const intensities = field.compute(grid, time - startTime, deltaMs)\n renderer.draw(grid, intensities, {\n dotSize: resolved.dotSize,\n foreground: resolved.foreground,\n background: resolved.background,\n dpr: resolved.devicePixelRatio,\n })\n }\n\n const loop = (time: number): void => {\n if (!running) return\n\n if (shouldAnimate()) {\n drawFrame(time)\n } else if (grid) {\n drawFrame(time)\n }\n\n rafId = requestAnimationFrame(loop)\n }\n\n const start = (): void => {\n if (running) return\n running = true\n startTime = performance.now()\n lastFrameTime = startTime\n rafId = requestAnimationFrame(loop)\n }\n\n const stop = (): void => {\n running = false\n if (rafId) {\n cancelAnimationFrame(rafId)\n rafId = 0\n }\n }\n\n const scheduleResize = (): void => {\n if (resizeTimer) {\n window.clearTimeout(resizeTimer)\n }\n resizeTimer = window.setTimeout(() => {\n rebuildGrid()\n if (grid) {\n drawFrame(performance.now())\n }\n }, 100)\n }\n\n rebuildGrid()\n start()\n\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(scheduleResize)\n resizeObserver.observe(container)\n }\n\n if (typeof IntersectionObserver !== \"undefined\") {\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n inView = entries.some((entry) => entry.isIntersecting)\n },\n { root: null, threshold: 0 },\n )\n intersectionObserver.observe(container)\n }\n\n if (typeof window !== \"undefined\") {\n visibilityHandler = () => {\n visible = document.visibilityState === \"visible\"\n }\n document.addEventListener(\"visibilitychange\", visibilityHandler)\n\n if (typeof window.matchMedia === \"function\") {\n motionMediaQuery = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n motionChangeHandler = () => {\n if (grid) {\n drawFrame(performance.now())\n }\n }\n motionMediaQuery.addEventListener(\"change\", motionChangeHandler)\n }\n }\n\n return {\n update(partial: Partial<WavedanceConfig>) {\n const merged: WavedanceConfig = {\n ...resolved,\n ...partial,\n wave: partial.wave ? { ...resolved.wave, ...partial.wave } : resolved.wave,\n random: partial.random ? { ...resolved.random, ...partial.random } : resolved.random,\n }\n resolved = resolveConfig(merged)\n field.updateConfig(resolved)\n\n if (\n partial.dotSize !== undefined ||\n partial.gap !== undefined ||\n partial.devicePixelRatio !== undefined ||\n partial.maxDots !== undefined\n ) {\n rebuildGrid()\n }\n\n if (grid) {\n drawFrame(performance.now())\n }\n },\n\n destroy() {\n stop()\n\n if (resizeTimer) {\n window.clearTimeout(resizeTimer)\n resizeTimer = 0\n }\n\n resizeObserver?.disconnect()\n resizeObserver = null\n\n intersectionObserver?.disconnect()\n intersectionObserver = null\n\n if (visibilityHandler) {\n document.removeEventListener(\"visibilitychange\", visibilityHandler)\n visibilityHandler = null\n }\n\n if (motionMediaQuery && motionChangeHandler) {\n motionMediaQuery.removeEventListener(\"change\", motionChangeHandler)\n motionMediaQuery = null\n motionChangeHandler = null\n }\n\n renderer.destroy()\n grid = null\n },\n\n getConfig(): ResolvedWavedanceConfig {\n return {\n ...resolved,\n gap: { ...resolved.gap },\n wave: { ...resolved.wave },\n random: { ...resolved.random },\n }\n },\n }\n}\n"]}
@@ -0,0 +1,154 @@
1
+ type AnimationType = "none" | "random" | "wave";
2
+ interface GapConfig {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ interface WaveAnimationOptions {
7
+ /** Noise sampling scale. Lower = larger clusters. Default: 0.008 */
8
+ scale?: number;
9
+ /** Animation speed multiplier. Default: 0.0004 */
10
+ speed?: number;
11
+ /** Lower edge of smoothstep threshold. Default: 0.35 */
12
+ threshold?: number;
13
+ /** Width of the fade transition. Default: 0.25 */
14
+ softness?: number;
15
+ /** Noise seed for deterministic output. Default: 42 */
16
+ seed?: number;
17
+ }
18
+ interface RandomAnimationOptions {
19
+ /** Opacity transition speed (0-1 per second). Default: 0.8 */
20
+ speed?: number;
21
+ /** Minimum target opacity. Default: 0.05 */
22
+ minOpacity?: number;
23
+ /** Maximum target opacity. Default: 1 */
24
+ maxOpacity?: number;
25
+ /** RNG seed for deterministic output. Default: 42 */
26
+ seed?: number;
27
+ }
28
+ interface WavedanceConfig {
29
+ /** Dot diameter in CSS pixels. Default: 2 */
30
+ dotSize?: number;
31
+ /** Gap between dots in CSS pixels (symmetric or per-axis). Default: 12 */
32
+ gap?: number | GapConfig;
33
+ /** Dot color as hex string. Default: "#7c7c7c" */
34
+ foreground?: string;
35
+ /** Canvas background color as hex string. Default: "#161616" */
36
+ background?: string;
37
+ /** Animation mode. Default: "wave" */
38
+ animation?: AnimationType;
39
+ /** Wave animation options */
40
+ wave?: WaveAnimationOptions;
41
+ /** Random animation options */
42
+ random?: RandomAnimationOptions;
43
+ /** Device pixel ratio override. Default: window.devicePixelRatio */
44
+ devicePixelRatio?: number;
45
+ /** Safety cap on dot count. Default: 100000 */
46
+ maxDots?: number;
47
+ /** Pause animation when prefers-reduced-motion is set. Default: true */
48
+ respectReducedMotion?: boolean;
49
+ }
50
+ interface ResolvedWavedanceConfig {
51
+ dotSize: number;
52
+ gap: GapConfig;
53
+ foreground: string;
54
+ background: string;
55
+ animation: AnimationType;
56
+ wave: Required<WaveAnimationOptions>;
57
+ random: Required<RandomAnimationOptions>;
58
+ devicePixelRatio: number;
59
+ maxDots: number;
60
+ respectReducedMotion: boolean;
61
+ }
62
+ interface WavedanceInstance {
63
+ /** Update configuration at runtime */
64
+ update: (config: Partial<WavedanceConfig>) => void;
65
+ /** Stop animation and remove canvas */
66
+ destroy: () => void;
67
+ /** Current resolved configuration */
68
+ getConfig: () => ResolvedWavedanceConfig;
69
+ }
70
+ interface GridLayout {
71
+ count: number;
72
+ cols: number;
73
+ rows: number;
74
+ x: Float32Array;
75
+ y: Float32Array;
76
+ width: number;
77
+ height: number;
78
+ dpr: number;
79
+ }
80
+ interface DrawOptions {
81
+ dotSize: number;
82
+ foreground: string;
83
+ background: string;
84
+ dpr: number;
85
+ }
86
+
87
+ declare function createWavedance(container: HTMLElement, config?: WavedanceConfig): WavedanceInstance;
88
+
89
+ interface BuildGridOptions {
90
+ width: number;
91
+ height: number;
92
+ dotSize: number;
93
+ gap: GapConfig;
94
+ dpr: number;
95
+ maxDots: number;
96
+ }
97
+ /**
98
+ * Build a dot grid layout for the given dimensions.
99
+ * Positions are in device pixels (CSS size * dpr).
100
+ */
101
+ declare function buildGrid(options: BuildGridOptions): GridLayout;
102
+
103
+ /**
104
+ * Seeded 3D Simplex noise implementation.
105
+ * Self-contained, deterministic, and portable to Rust.
106
+ */
107
+ declare class SimplexNoise {
108
+ private readonly perm;
109
+ private readonly permMod12;
110
+ private static readonly grad3;
111
+ constructor(seed?: number);
112
+ /** Returns noise in approximately [-1, 1]. */
113
+ noise3(x: number, y: number, z: number): number;
114
+ /** Returns noise in approximately [0, 1]. */
115
+ noise3Normalized(x: number, y: number, z: number): number;
116
+ }
117
+ /** Smooth Hermite interpolation for soft cluster edges. */
118
+ declare function smoothstep(edge0: number, edge1: number, x: number): number;
119
+
120
+ /** Parse a hex color string into RGB components (0-255). */
121
+ declare function parseHexColor(hex: string): {
122
+ r: number;
123
+ g: number;
124
+ b: number;
125
+ };
126
+ /** Validate and normalize a hex color string. */
127
+ declare function normalizeHexColor(hex: string): string;
128
+
129
+ declare function resolveConfig(config?: WavedanceConfig): ResolvedWavedanceConfig;
130
+
131
+ interface Renderer {
132
+ init(container: HTMLElement): void;
133
+ resize(width: number, height: number, dpr: number): void;
134
+ draw(grid: GridLayout, intensities: Float32Array, options: DrawOptions): void;
135
+ destroy(): void;
136
+ getCanvas(): HTMLCanvasElement | null;
137
+ }
138
+
139
+ declare class Canvas2DRenderer implements Renderer {
140
+ private canvas;
141
+ private ctx;
142
+ private readonly buckets;
143
+ private readonly bucketCounts;
144
+ private foregroundRgb;
145
+ private lastForeground;
146
+ init(container: HTMLElement): void;
147
+ resize(width: number, height: number, dpr: number): void;
148
+ draw(grid: GridLayout, intensities: Float32Array, options: DrawOptions): void;
149
+ private bucketDots;
150
+ destroy(): void;
151
+ getCanvas(): HTMLCanvasElement | null;
152
+ }
153
+
154
+ export { type AnimationType, Canvas2DRenderer, type DrawOptions, type GapConfig, type GridLayout, type RandomAnimationOptions, type Renderer, type ResolvedWavedanceConfig, SimplexNoise, type WaveAnimationOptions, type WavedanceConfig, type WavedanceInstance, buildGrid, createWavedance, normalizeHexColor, parseHexColor, resolveConfig, smoothstep };
@@ -0,0 +1,154 @@
1
+ type AnimationType = "none" | "random" | "wave";
2
+ interface GapConfig {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ interface WaveAnimationOptions {
7
+ /** Noise sampling scale. Lower = larger clusters. Default: 0.008 */
8
+ scale?: number;
9
+ /** Animation speed multiplier. Default: 0.0004 */
10
+ speed?: number;
11
+ /** Lower edge of smoothstep threshold. Default: 0.35 */
12
+ threshold?: number;
13
+ /** Width of the fade transition. Default: 0.25 */
14
+ softness?: number;
15
+ /** Noise seed for deterministic output. Default: 42 */
16
+ seed?: number;
17
+ }
18
+ interface RandomAnimationOptions {
19
+ /** Opacity transition speed (0-1 per second). Default: 0.8 */
20
+ speed?: number;
21
+ /** Minimum target opacity. Default: 0.05 */
22
+ minOpacity?: number;
23
+ /** Maximum target opacity. Default: 1 */
24
+ maxOpacity?: number;
25
+ /** RNG seed for deterministic output. Default: 42 */
26
+ seed?: number;
27
+ }
28
+ interface WavedanceConfig {
29
+ /** Dot diameter in CSS pixels. Default: 2 */
30
+ dotSize?: number;
31
+ /** Gap between dots in CSS pixels (symmetric or per-axis). Default: 12 */
32
+ gap?: number | GapConfig;
33
+ /** Dot color as hex string. Default: "#7c7c7c" */
34
+ foreground?: string;
35
+ /** Canvas background color as hex string. Default: "#161616" */
36
+ background?: string;
37
+ /** Animation mode. Default: "wave" */
38
+ animation?: AnimationType;
39
+ /** Wave animation options */
40
+ wave?: WaveAnimationOptions;
41
+ /** Random animation options */
42
+ random?: RandomAnimationOptions;
43
+ /** Device pixel ratio override. Default: window.devicePixelRatio */
44
+ devicePixelRatio?: number;
45
+ /** Safety cap on dot count. Default: 100000 */
46
+ maxDots?: number;
47
+ /** Pause animation when prefers-reduced-motion is set. Default: true */
48
+ respectReducedMotion?: boolean;
49
+ }
50
+ interface ResolvedWavedanceConfig {
51
+ dotSize: number;
52
+ gap: GapConfig;
53
+ foreground: string;
54
+ background: string;
55
+ animation: AnimationType;
56
+ wave: Required<WaveAnimationOptions>;
57
+ random: Required<RandomAnimationOptions>;
58
+ devicePixelRatio: number;
59
+ maxDots: number;
60
+ respectReducedMotion: boolean;
61
+ }
62
+ interface WavedanceInstance {
63
+ /** Update configuration at runtime */
64
+ update: (config: Partial<WavedanceConfig>) => void;
65
+ /** Stop animation and remove canvas */
66
+ destroy: () => void;
67
+ /** Current resolved configuration */
68
+ getConfig: () => ResolvedWavedanceConfig;
69
+ }
70
+ interface GridLayout {
71
+ count: number;
72
+ cols: number;
73
+ rows: number;
74
+ x: Float32Array;
75
+ y: Float32Array;
76
+ width: number;
77
+ height: number;
78
+ dpr: number;
79
+ }
80
+ interface DrawOptions {
81
+ dotSize: number;
82
+ foreground: string;
83
+ background: string;
84
+ dpr: number;
85
+ }
86
+
87
+ declare function createWavedance(container: HTMLElement, config?: WavedanceConfig): WavedanceInstance;
88
+
89
+ interface BuildGridOptions {
90
+ width: number;
91
+ height: number;
92
+ dotSize: number;
93
+ gap: GapConfig;
94
+ dpr: number;
95
+ maxDots: number;
96
+ }
97
+ /**
98
+ * Build a dot grid layout for the given dimensions.
99
+ * Positions are in device pixels (CSS size * dpr).
100
+ */
101
+ declare function buildGrid(options: BuildGridOptions): GridLayout;
102
+
103
+ /**
104
+ * Seeded 3D Simplex noise implementation.
105
+ * Self-contained, deterministic, and portable to Rust.
106
+ */
107
+ declare class SimplexNoise {
108
+ private readonly perm;
109
+ private readonly permMod12;
110
+ private static readonly grad3;
111
+ constructor(seed?: number);
112
+ /** Returns noise in approximately [-1, 1]. */
113
+ noise3(x: number, y: number, z: number): number;
114
+ /** Returns noise in approximately [0, 1]. */
115
+ noise3Normalized(x: number, y: number, z: number): number;
116
+ }
117
+ /** Smooth Hermite interpolation for soft cluster edges. */
118
+ declare function smoothstep(edge0: number, edge1: number, x: number): number;
119
+
120
+ /** Parse a hex color string into RGB components (0-255). */
121
+ declare function parseHexColor(hex: string): {
122
+ r: number;
123
+ g: number;
124
+ b: number;
125
+ };
126
+ /** Validate and normalize a hex color string. */
127
+ declare function normalizeHexColor(hex: string): string;
128
+
129
+ declare function resolveConfig(config?: WavedanceConfig): ResolvedWavedanceConfig;
130
+
131
+ interface Renderer {
132
+ init(container: HTMLElement): void;
133
+ resize(width: number, height: number, dpr: number): void;
134
+ draw(grid: GridLayout, intensities: Float32Array, options: DrawOptions): void;
135
+ destroy(): void;
136
+ getCanvas(): HTMLCanvasElement | null;
137
+ }
138
+
139
+ declare class Canvas2DRenderer implements Renderer {
140
+ private canvas;
141
+ private ctx;
142
+ private readonly buckets;
143
+ private readonly bucketCounts;
144
+ private foregroundRgb;
145
+ private lastForeground;
146
+ init(container: HTMLElement): void;
147
+ resize(width: number, height: number, dpr: number): void;
148
+ draw(grid: GridLayout, intensities: Float32Array, options: DrawOptions): void;
149
+ private bucketDots;
150
+ destroy(): void;
151
+ getCanvas(): HTMLCanvasElement | null;
152
+ }
153
+
154
+ export { type AnimationType, Canvas2DRenderer, type DrawOptions, type GapConfig, type GridLayout, type RandomAnimationOptions, type Renderer, type ResolvedWavedanceConfig, SimplexNoise, type WaveAnimationOptions, type WavedanceConfig, type WavedanceInstance, buildGrid, createWavedance, normalizeHexColor, parseHexColor, resolveConfig, smoothstep };