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.js","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"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "wavedance",
3
+ "version": "0.2.1",
4
+ "description": "High-performance animated dot-grid canvas library",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": {
13
+ "types": "./dist/index.d.ts",
14
+ "default": "./dist/index.js"
15
+ },
16
+ "require": {
17
+ "types": "./dist/index.d.cts",
18
+ "default": "./dist/index.cjs"
19
+ }
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "keywords": [
29
+ "canvas",
30
+ "animation",
31
+ "dots",
32
+ "grid",
33
+ "background",
34
+ "perlin-noise"
35
+ ],
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/biering/wavedance.git",
40
+ "directory": "wavedance"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.15.21",
47
+ "jsdom": "^26.1.0",
48
+ "tsup": "^8.5.0",
49
+ "typescript": "^5.8.3",
50
+ "vitest": "^3.2.1"
51
+ },
52
+ "scripts": {
53
+ "build": "tsup",
54
+ "dev": "tsup --watch",
55
+ "typecheck": "tsc --noEmit",
56
+ "test": "vitest run",
57
+ "test:watch": "vitest"
58
+ }
59
+ }