asciify-engine 1.0.19 → 1.0.20
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/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/core/utils.ts","../src/core/animation.ts","../src/backgrounds/_shared.ts","../src/backgrounds/wave.ts","../src/core/renderer.ts","../src/core/embed-gen.ts","../src/core/simple-api.ts","../src/backgrounds/rain.ts","../src/backgrounds/stars.ts","../src/backgrounds/pulse.ts","../src/backgrounds/noise.ts","../src/backgrounds/grid.ts","../src/backgrounds/aurora.ts","../src/backgrounds/silk.ts","../src/backgrounds/void.ts","../src/backgrounds/morph.ts","../src/backgrounds/index.ts","../src/webgl-engine.ts"],"names":["fade","parseGIF","decompressFrames","alpha","render"],"mappings":"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","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n fontSize: number;\n charSpacing: number;\n brightness: number;\n contrast: number;\n charset: string;\n colorMode: ColorMode;\n accentColor: string;\n invert: boolean;\n renderMode: RenderMode;\n animationStyle: AnimationStyle;\n animationSpeed: number;\n dotSizeRatio: number;\n ditherStrength: number;\n hoverStrength: number;\n hoverRadius: number;\n hoverEffect: HoverEffect;\n hoverColor: string;\n artStyle: ArtStyle;\n customText: string;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|\\\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n} as const;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\n customText: '',\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n};\n","/**\n * Low-level canvas and color utilities shared across the entire engine.\n * No imports from other engine modules — pure logic.\n */\n\nimport type { AsciiCell } from '../types';\n\n// ─── Offscreen canvas ─────────────────────────────────────────────\n\nexport function createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n// ─── Luminance helpers ────────────────────────────────────────────\n\nexport function adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\nexport function luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const index = Math.floor(normalized * (charset.length - 1));\n return charset[Math.max(0, Math.min(charset.length - 1, index))];\n}\n\nexport function customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n if (normalized < 0.12) return ' ';\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n// ─── Dithering ────────────────────────────────────────────────────\n\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n] as const;\n\nexport function applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n// ─── Pre-computed Color LUTs ──────────────────────────────────────\n\nexport const GRAY_LUT: string[] = new Array(256);\nexport const GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cell color resolution ────────────────────────────────────────\n\nexport function getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n return `rgb(${(acR * ab) | 0},${(acG * ab) | 0},${(acB * ab) | 0})`;\n }\n default:\n return GRAY_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n }\n}\n\nconst _colorRGB = [0, 0, 0];\nexport function getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n _colorRGB[0] = (acR * ab) | 0; _colorRGB[1] = (acG * ab) | 0; _colorRGB[2] = (acB * ab) | 0;\n break;\n }\n default: {\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n// ─── Glow sprite cache ────────────────────────────────────────────\n\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4;\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n","/**\n * Animation multiplier and hover effect computations.\n */\n\nimport type { AnimationStyle } from '../types';\nimport type { HoverEffect } from '../types';\n\nexport function smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\nexport function getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1);\n const revealPoint = progress * totalCells * 1.3;\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5;\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas\n return 1;\n default:\n return 1;\n }\n}\n\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nexport function computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: HoverEffect = 'spotlight',\n radiusFactor: number = 0.5\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n const distSq = dx * dx + dy * dy;\n\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n if (distSq >= radius * radius) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const dist = Math.sqrt(distSq);\n const t = 1 - dist / radius;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n","/**\n * Shared utilities for all background renderers:\n * - CSS color parser\n * - Value noise helpers (fade, lerp, hash2, vnoise, fbm)\n */\n\n// ─── Color parser ─────────────────────────────────────────────────\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nexport function parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n// ─── Value-noise helpers ──────────────────────────────────────────\n\nexport function fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nexport function lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n/** Fast 2-D hash → pseudo-random gradient value between -1 and 1 */\nexport function hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return (((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x3fffffff) - 1;\n}\n\n/** Single octave value noise */\nexport function vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = fade(fx), uy = fade(fy);\n const v00 = hash2(ix, iy );\n const v10 = hash2(ix + 1, iy );\n const v01 = hash2(ix, iy + 1);\n const v11 = hash2(ix + 1, iy + 1);\n return lerp(lerp(v00, v10, ux), lerp(v01, v11, ux), uy); // -1..1\n}\n\n/** 3-octave FBM (fractal Brownian motion) */\nexport function fbm(x: number, y: number): number {\n return (\n vnoise(x, y ) * 0.500 +\n vnoise(x * 2.1, y * 2.1) * 0.250 +\n vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875;\n}\n","/**\n * renderWaveBackground — interactive ASCII wave field with vortex, sparkles,\n * breathe pulse, and cursor proximity spotlight.\n */\nimport { hash2, fbm } from './_shared';\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .:-=+*#%@') */\n chars?: string;\n /** Base colour — use '{a}' as alpha placeholder */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = '#d4ff00',\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const mx = mousePos.x;\n const my = mousePos.y;\n\n let acR = 212, acG = 255, acB = 0;\n if (accentColor) {\n const hex = accentColor.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n const clamped = Math.min(1, Math.max(0, intensity));\n\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n const bucket = Math.floor(t * 8);\n const sparkleSeed = hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.90 : 0.28, alpha * (lightMode ? 14 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(0,0,0,${alpha * 7})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n","/**\n * Core frame-to-canvas renderer and source-to-frame converters.\n */\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\nimport {\n createOffscreenCanvas,\n adjustLuminance,\n luminanceToChar,\n customTextToChar,\n applyDither,\n getCellColorStr,\n getCellColorRGB,\n} from './utils';\nimport { getAnimationMultiplier, computeHoverEffect } from './animation';\nimport { renderWaveBackground } from '../backgrounds/wave';\n\n// Re-export AsciiFrame for downstream consumers that import from this module\nexport type { AsciiFrame };\nvoid DEFAULT_OPTIONS; // keep import alive for tree-shaking hint\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = 0.55;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const { ctx } = createOffscreenCanvas(cols, rows);\n ctx.drawImage(source, 0, 0, cols, rows);\n const imageData = ctx.getImageData(0, 0, cols, rows);\n const pixels = imageData.data;\n\n const frame: AsciiFrame = [];\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n const i = (y * cols + x) * 4;\n const r = pixels[i];\n const g = pixels[i + 1];\n const b = pixels[i + 2];\n const a = pixels[i + 3];\n\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, options.invert)\n : luminanceToChar(ditheredLum, options.charset, options.invert);\n\n row.push({ char, r, g, b, a });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = (i / targetFps);\n if (time > duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n let totalDelay = 0;\n for (const f of rawFrames) { totalDelay += (f.delay || 100); }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n const frameImageData = new ImageData(new Uint8ClampedArray(patch.buffer), dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n if (disposalType === 2) {\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // waveField short-circuit\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = (options.accentColor || '#d4ff00').replace('#', '');\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n ctx.fillStyle = '#0a0a0a';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const isInverted = options.invert;\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const cs = options.charset;\n const csLen = cs.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[cs[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.char === ' ' || cell.a < 10) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n if (useFastRect) {\n const weight = charWeights![cell.char] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(cell.char, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(cell.char, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * Embed code generation — serializes ASCII frames into self-contained\n * HTML snippets that replay via the CDN embed runtime.\n */\n\nimport type { AsciiOptions, AsciiFrame, AnimationStyle } from '../types';\n\nexport const EMBED_CDN_VERSION = '1.0.17';\n\n/** Compact frame serialiser.\n * fullcolor → 3 bytes/cell (r,g,b); otherwise 1 byte/cell (luma).\n * First byte is a stride marker so the runtime can auto-detect format.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n const stride = fullColor ? 3 : 1;\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride;\n let i = 1;\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n const cell = frame[y][x];\n if (fullColor) {\n buf[i++] = cell.r;\n buf[i++] = cell.g;\n buf[i++] = cell.b;\n } else {\n buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n }\n }\n }\n let binary = '';\n for (let j = 0; j < buf.length; j++) binary += String.fromCharCode(buf[j]);\n return btoa(binary);\n}\n\n/**\n * Build the animation multiplier function as an inlined JS string.\n * @internal\n */\nfunction buildAnimFnJS(style: AnimationStyle, speed: number): string {\n if (style === 'none' || style === 'waveField') return 'function(){return 1}';\n return `function(x,y,cols,rows,t){\n var s=${speed},T=t*s;\n ${style === 'wave' ? `var w=Math.sin(x/cols*Math.PI*4+T*3)*.5+.5,w2=Math.sin(y/rows*Math.PI*3+T*2)*.5+.5;return .3+.7*(w*.6+w2*.4);` : ''}${style === 'pulse' ? `var cx=cols/2,cy=rows/2,d=Math.sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)),m=Math.sqrt(cx*cx+cy*cy);return .2+.8*(Math.sin(d/m*Math.PI*6-T*4)*.5+.5);` : ''}${style === 'rain' ? `return .1+.9*(Math.sin(y/rows*Math.PI*8-T*5+x*.3)*.5+.5)*(Math.sin(x/cols*Math.PI*2+T)*.3+.7);` : ''}${style === 'breathe' ? `return Math.max(.1,Math.min(1,Math.sin(T*2)*.3+.7+Math.sin((x+y)*.1+T)*.1));` : ''}${style === 'sparkle' ? `var h=Math.sin(x*127.1+y*311.7+Math.floor(T*8)*43758.5453)*43758.5453;var sp=h-Math.floor(h);return sp>.7?1:.15+sp*.4;` : ''}${style === 'glitch' ? `var b=Math.floor(y/(rows*.05)),gh=Math.sin(b*43.23+Math.floor(T*6)*17.89)*43758.5453,gv=gh-Math.floor(gh);if(gv>.85){var fl=Math.sin(T*30+b)*.5+.5;return fl<.3?0:fl}return 1;` : ''}${style === 'spiral' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,a=Math.atan2(dy,dx),d=Math.sqrt(dx*dx+dy*dy),m=Math.sqrt(cx*cx+cy*cy);return .15+.85*(Math.sin(a*3+d/m*Math.PI*8-T*3)*.5+.5);` : ''}${style === 'typewriter' ? `var tc=cols*rows,ci=y*cols+x,p=(T*.5)%1,rp=p*tc*1.3,dd=ci-rp;if(dd>0)return 0;return Math.min(1,Math.max(0,1+dd/(tc*.15)));` : ''}${style === 'scatter' ? `var cx=cols/2,cy=rows/2,dx=x-cx,dy=y-cy,sd=Math.sqrt(dx*dx+dy*dy)/Math.sqrt(cx*cx+cy*cy),ph=Math.sin(T*1.5)*.5+.5;if(sd>ph)return Math.max(0,1-(sd-ph)*3);return .7+.3*Math.sin(sd*10-T*2);` : ''}\n}`;\n}\n\n/**\n * Build inline JS for resolving cell color.\n * @internal\n */\nfunction buildColorFnJS(options: AsciiOptions): string {\n switch (options.colorMode) {\n case 'fullcolor':\n return `function(c){return 'rgb('+c.r+','+c.g+','+c.b+')'}`;\n case 'matrix':\n return `function(c){var b=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb(0,'+b+',0)'}`;\n case 'accent': {\n const hex = options.accentColor.replace('#', '');\n const ar = parseInt(hex.substring(0, 2), 16);\n const ag = parseInt(hex.substring(2, 4), 16);\n const ab = parseInt(hex.substring(4, 6), 16);\n return `function(c){var b=(.299*c.r+.587*c.g+.114*c.b)/255;return 'rgb('+Math.floor(${ar}*b)+','+Math.floor(${ag}*b)+','+Math.floor(${ab}*b)+')'}`;\n }\n default:\n return `function(c){var g=Math.floor(.299*c.r+.587*c.g+.114*c.b);return 'rgb('+g+','+g+','+g+')'}`;\n }\n}\n\nfunction buildEmbedOpts(\n options: AsciiOptions,\n rows: number,\n cols: number,\n width: number,\n height: number,\n fps?: number,\n animated?: boolean\n): string {\n const o: Record<string, unknown> = {\n r: rows, c: cols, w: width, h: height,\n cs: options.charset,\n cm: options.colorMode,\n as: options.animationStyle,\n sp: options.animationSpeed,\n inv: options.invert,\n hs: options.hoverStrength,\n hr: options.hoverRadius,\n he: options.hoverEffect,\n hc: options.hoverColor,\n dr: options.dotSizeRatio,\n dots: options.renderMode === 'dots',\n };\n if (options.colorMode === 'accent') o.ac = options.accentColor;\n if (fps !== undefined) o.fps = fps;\n if (animated) o.anim = true;\n return JSON.stringify(o);\n}\n\nconst CDN_SCRIPT = `<script src=\"https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js\" async></` + `script>`;\n\n/**\n * Generate a static single-frame embed snippet.\n */\nexport function generateEmbedCode(\n frame: AsciiFrame,\n options: AsciiOptions,\n width: number,\n height: number\n): string {\n const rows = frame.length;\n if (rows === 0) return '';\n const cols = frame[0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const data = serializeFrame(frame, isFullColor);\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height);\n\n return `<!-- Asciify Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">\"${data}\"</script>\n${CDN_SCRIPT}\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate an animated multi-frame embed snippet (GIF / video).\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n if (frames.length === 0) return '';\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const allData = frames.map(f => serializeFrame(f, isFullColor));\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">${JSON.stringify(allData)}</script>\n${CDN_SCRIPT}\n<!-- /Asciify Animated Embed -->`;\n}\n","/**\n * Simple one-call asciify API.\n * Wraps imageToAsciiFrame + renderFrameToCanvas behind easy-to-use helpers.\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, videoToAsciiFrames, gifToAsciiFrames, renderFrameToCanvas } from './renderer';\n\nexport { videoToAsciiFrames, gifToAsciiFrames };\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * @example\n * await asciify(document.querySelector('img'), canvas);\n * await asciify(img, canvas, { fontSize: 8, style: 'letters' });\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<void> {\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[style];\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frame } = imageToAsciiFrame(el, merged, canvas.width, canvas.height);\n renderFrameToCanvas(ctx, frame, merged, canvas.width, canvas.height);\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Convert a video element to ASCII art and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${source}`));\n });\n } else {\n video = source;\n }\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await videoToAsciiFrames(video, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n","/**\n * renderRainBackground — digital column rain (Matrix-style).\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00') */\n accentColor?: string;\n /** Custom character colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Fraction of columns active at once 0-1 (default: 0.55) */\n density?: number;\n /** Number of cells in the fading tail (default: 14) */\n tailLength?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderRainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: RainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = '0123456789ABCDEF@#$&*+=/<>',\n accentColor = '#d4ff00',\n color,\n speed = 1,\n density = 0.55,\n tailLength = 14,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) {\n const p = parseColor(color);\n if (p) { br = p.r; bg = p.g; bb = p.b; }\n }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const period = rows + tailLength;\n\n for (let c = 0; c < cols; c++) {\n if (hash2(c * 17, 3) > density) continue;\n\n const colSpeed = (0.5 + hash2(c * 31, 7) * 1.5) * speed;\n const phase = hash2(c * 13, 11) * period;\n const headRow = Math.floor((time * colSpeed * 7 + phase) % period);\n const x = c * charW;\n\n for (let k = 0; k <= tailLength; k++) {\n const row = headRow - (tailLength - k);\n if (row < 0 || row >= rows) continue;\n\n const y = row * lineH;\n const charSeed = hash2(c * 53 + Math.floor(time * 5 + k), row * 7);\n const ch = chars[Math.floor(charSeed * chars.length)];\n const tRatio = k / tailLength;\n\n if (k === tailLength) {\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n const alpha = lightMode ? tRatio * 0.85 : tRatio * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n","/**\n * renderStarsBackground — 3-D star-warp / hyperspace ASCII effect.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Number of star particles (default: 180) */\n count?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderStarsBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: StarsBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' . · * + ° ★',\n accentColor = '#d4ff00',\n color,\n speed = 1,\n count = 180,\n lightMode = false,\n } = options;\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * (0.2 + mousePos.x * 0.6);\n const cy = height * (0.2 + mousePos.y * 0.6);\n const maxR = Math.sqrt(width * width + height * height) * 0.65;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n for (let i = 0; i < count; i++) {\n const angle = hash2(i * 17, 3) * Math.PI * 2;\n const baseSpd = 0.15 + hash2(i * 31, 7) * 0.85;\n const phase = hash2(i * 13, 11);\n\n const r = ((time * baseSpd * speed * 0.22 + phase) % 1.0);\n\n const x = cx + Math.cos(angle) * r * maxR;\n const y = cy + Math.sin(angle) * r * maxR;\n\n if (x < -20 || x > width + 20 || y < -20 || y > height + 20) continue;\n\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n const isAccent = r > 0.72;\n const alpha = lightMode ? r * 0.85 : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.92 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderPulseBackground — concentric ASCII ring pulses emanating from the cursor.\n */\nimport { parseColor } from './_shared';\n\nexport interface PulseBackgroundOptions {\n fontSize?: number;\n /** Characters to tile (default: '. · ○ ◎ ●') */\n chars?: string;\n /** Ring peak colour (default: '#00ffcc') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Number of simultaneous rings (default: 5) */\n rings?: number;\n /** Animation speed (default: 1) */\n speed?: number;\n /** Ring edge sharpness 1–10 (default: 4) */\n sharpness?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderPulseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: PulseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = '. · ○ ◎ ●',\n accentColor = '#00ffcc',\n color,\n rings = 5,\n speed = 1,\n sharpness = 4,\n lightMode = false,\n } = options;\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * mousePos.x;\n const cy = height * mousePos.y;\n const maxDist = Math.sqrt(cx * cx + cy * cy) * 1.6 + Math.sqrt(width * width + height * height) * 0.2;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 0, acG = 255, acB = 204;\n const ap = parseColor(accentColor);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n const cols = Math.ceil(width / fontSize);\n const rows = Math.ceil(height / fontSize);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const px = col * fontSize + fontSize * 0.5;\n const py = row * fontSize + fontSize * 0.5;\n const dx = px - cx;\n const dy = py - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const norm = dist / maxDist; // 0..1+\n\n let totalIntensity = 0;\n for (let r = 0; r < rings; r++) {\n const phase = r / rings;\n const t = ((time * speed * 0.38 + phase) % 1.0);\n const ringDist = Math.abs(norm - t);\n const ringNorm = Math.max(0, 1 - ringDist * maxDist / (fontSize * (12 - sharpness)));\n totalIntensity += Math.cos(ringNorm * Math.PI * 0.5) * ringNorm;\n }\n totalIntensity = Math.min(1, totalIntensity);\n\n if (totalIntensity < 0.02) continue;\n\n const isAccent = totalIntensity > 0.6;\n ctx.font = `${fontSize}px monospace`;\n const charIdx = Math.floor(totalIntensity * (charArr.length - 1));\n const ch = charArr[Math.min(charIdx, charArr.length - 1)];\n const alpha = lightMode ? totalIntensity * 0.88 : totalIntensity * 0.22;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.95 : 0.4, totalIntensity * 0.55)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, px, py);\n }\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderNoiseBackground — slow-drifting organic fractal noise field.\n * No directional pattern — pure ambient texture. Mouse warps the field.\n */\nimport { parseColor, vnoise } from './_shared';\n\nexport interface NoiseBackgroundOptions {\n /** Font size in CSS pixels (default: 14). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .·:;=+*#%@░▒▓'). */\n chars?: string;\n /** Accent colour on intensity peaks (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of noise octaves for FBM detail (default: 4, max: 6). */\n octaves?: number;\n /** Drift / scroll speed (default: 1). */\n speed?: number;\n /** Noise scale — lower = larger blobs (default: 1). */\n scale?: number;\n /** Accent threshold 0-1 (default: 0.78). */\n accentThreshold?: number;\n /** Mouse warp radius 0-1 (default: 0.3). */\n mouseWarp?: number;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderNoiseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: NoiseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' .·:;=+*#%@░▒▓',\n accentColor = '#d4ff00',\n color,\n octaves = 4,\n speed = 1,\n scale = 1,\n accentThreshold = 0.78,\n mouseWarp = 0.3,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgc = 255, bb = 255;\n if (lightMode) { br = 0; bgc = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgc = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const noiseScale = 0.035 * scale;\n const t = time * speed;\n const oct = Math.min(6, Math.max(1, octaves));\n\n // FBM with configurable octaves\n const fbmN = (x: number, y: number): number => {\n let v = 0, amp = 0.5, freq = 1, norm = 0;\n for (let o = 0; o < oct; o++) {\n v += vnoise(x * freq, y * freq) * amp;\n norm += amp;\n amp *= 0.5;\n freq *= 2.1;\n }\n return v / norm; // -1..1\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col * noiseScale + t * 0.06;\n const ny = row * noiseScale * 1.3 - t * 0.04;\n\n // Mouse warp: displace sample coords near cursor\n const dx = col / cols - mousePos.x;\n const dy = row / rows - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const warp = mouseWarp > 0 ? Math.max(0, 1 - dist / mouseWarp) * 0.12 : 0;\n const wx = nx + warp * Math.sin(t * 1.3 + dy * 8);\n const wy = ny + warp * Math.cos(t * 0.9 + dx * 8);\n\n const raw = fbmN(wx, wy); // -1..1\n const norm2 = raw * 0.5 + 0.5; // 0..1\n\n if (norm2 < 0.12) continue;\n\n const charIdx = Math.floor(norm2 * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = norm2 > accentThreshold;\n const alpha = lightMode ? norm2 * 0.82 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderGridBackground — CRT-style horizontal scan-line sweep.\n * Bright scan bands travel downward continuously; cursor creates a local glitch zone.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface GridBackgroundOptions {\n /** Font size in CSS pixels (default: 12). */\n fontSize?: number;\n /** Character set (default: '·-=+|/'). */\n chars?: string;\n /** Accent / scan-band colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of scan bands visible at once (default: 3). */\n bands?: number;\n /** Band travel speed (default: 1). */\n speed?: number;\n /** Band width as fraction of canvas height (default: 0.12). */\n bandWidth?: number;\n /** Enable cursor disruption glitch zone (default: true). */\n glitch?: boolean;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderGridBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: GridBackgroundOptions = {},\n): void {\n const {\n fontSize = 12,\n chars = '·-=+|/',\n accentColor = '#d4ff00',\n color,\n bands = 3,\n speed = 1,\n bandWidth = 0.12,\n glitch = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgv = 255, bb = 255;\n if (lightMode) { br = 0; bgv = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgv = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const ny = row / rows;\n\n // Scan-band phase: bands cycle 0→1 over time\n const scanPhase = ((ny * bands - t * 0.5) % 1.0 + 1.0) % 1.0;\n // Intensity spike at scanPhase ≈ 0 (leading edge)\n const bandIntensity = Math.max(0, 1 - scanPhase / bandWidth);\n\n // Base grid texture via hash\n const gridSeed = hash2(col * 3, row * 7);\n const gridBase = (gridSeed * 0.5 + 0.5) * 0.35;\n\n // Cursor glitch zone\n let glitchBump = 0;\n if (glitch) {\n const dx = col / cols - mousePos.x;\n const dy = ny - mousePos.y;\n const d = Math.sqrt(dx * dx + dy * dy);\n if (d < 0.18) {\n const g = hash2(col * 11 + Math.floor(t * 12), row * 5);\n glitchBump = Math.max(0, 1 - d / 0.18) * (g > 0.5 ? g - 0.3 : 0);\n }\n }\n\n const intensity = Math.min(1, gridBase + bandIntensity * 0.8 + glitchBump * 0.6);\n if (intensity < 0.04) continue;\n\n const charIdx = Math.floor(intensity * (chars.length - 1));\n const ch = chars[charIdx];\n\n const isAccent = bandIntensity > 0.55;\n const alpha = lightMode ? intensity * 0.82 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderAuroraBackground — premium slow-drifting light bands.\n * Multiple sine layers create smooth organic interference patterns —\n * like silk, aurora borealis, or light through water.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. */\n chars?: string;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Number of wave layers stacked. More = richer interference. Default 5. */\n layers?: number;\n /** Wave spread/softness — higher = broader, more diffuse bands. Default 1.2. */\n softness?: number;\n /** Mouse distortion radius (0–1). Elegant ripple that follows the cursor. Default 0.2. */\n mouseRipple?: number;\n /** Force light mode (dark chars on light bg). Default false. */\n lightMode?: boolean;\n}\n\nexport function renderAuroraBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: AuroraBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:;+=≡≣#@',\n color,\n accentColor = '#d4ff00',\n speed = 1,\n layers = 5,\n softness = 1.2,\n mouseRipple = 0.2,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Pre-bake layer parameters — each layer has unique freq, direction, phase offset\n const layerParams: Array<{ fx: number; fy: number; phase: number; dt: number; amp: number }> = [];\n for (let l = 0; l < layers; l++) {\n const seed = hash2(l * 17, l * 31 + 7);\n const seed2 = hash2(l * 23 + 5, l * 11);\n layerParams.push({\n fx: 0.8 + seed * 2.2,\n fy: 1.2 + seed2 * 1.8,\n phase: seed * Math.PI * 4,\n dt: (0.3 + hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1),\n amp: 0.55 + hash2(l * 29, l * 3) * 0.45,\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Mouse distortion: gaussian lens warp\n const mdx = nx - mousePos.x;\n const mdy = ny - mousePos.y;\n const md = Math.sqrt(mdx * mdx + mdy * mdy);\n const warp = mouseRipple * Math.exp(-md * md / 0.06);\n const wx = nx + mdx * warp;\n const wy = ny + mdy * warp;\n\n // Sum wave layers\n let sum = 0;\n let totalAmp = 0;\n for (let l = 0; l < layers; l++) {\n const { fx, fy, phase, dt, amp } = layerParams[l];\n const wave = Math.sin(wx * fx * Math.PI * 2 + t * dt + phase)\n * Math.cos(wy * fy * Math.PI * 2 + t * dt * 0.7 + phase * 1.3);\n sum += wave * amp;\n totalAmp += amp;\n }\n\n // Normalise to 0→1 with soft sigmoid\n const rawVal = sum / totalAmp;\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n if (curved < 0.12) continue;\n\n const normalized = (curved - 0.12) / 0.88;\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = curved > 0.82;\n const alpha = lightMode ? curved * 0.82 : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderSilkBackground — smooth directional flow-field ribbons.\n * Each cell reads its angle from a slow-drifting vector field.\n * No mouse interaction by design — pure ambient texture.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface SilkBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.4 (intentionally slow). */\n speed?: number;\n /** Number of flow-field layers. More = richer ribbons. Default 4. */\n layers?: number;\n /** Flow turbulence (0–2). Higher = more folded, tangled ribbons. Default 0.8. */\n turbulence?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderSilkBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: SilkBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n color,\n accentColor = '#d4ff00',\n speed = 0.4,\n layers = 4,\n turbulence = 0.8,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Direction chars: flow-angle-mapped for the ribbon illusion\n const dirChars = ['─', '─', '╌', '·', '╌', '─', '─', '╌', '·'];\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Stack multiple sine-based flow layers\n let angleSum = 0;\n let intensitySum = 0;\n for (let l = 0; l < layers; l++) {\n const ls = hash2(l * 13, l * 7 + 3);\n const ls2 = hash2(l * 29, l * 11 + 1);\n const fx = 1.1 + ls * 2.4;\n const fy = 0.9 + ls2 * 2.0;\n const ph = ls * Math.PI * 6;\n const dr = (0.2 + hash2(l * 41, l * 17) * 0.5) * (l % 2 === 0 ? 1 : -1.3);\n\n const u = Math.sin(nx * fx * Math.PI * 2 + t * dr + ph);\n const v = Math.cos(ny * fy * Math.PI * 2 + t * dr * 0.6 + ph * 1.7);\n\n const cross = Math.sin(nx * fy * Math.PI * turbulence + ny * fx * Math.PI * turbulence + t * dr * 0.4);\n\n angleSum += Math.atan2(v + cross * 0.3, u);\n intensitySum += (u * v + 1) * 0.5;\n }\n\n const angle = angleSum / layers;\n const intensity = Math.min(1, intensitySum / layers);\n\n if (intensity < 0.1) continue;\n\n const angleNorm = (angle + Math.PI) / (Math.PI * 2);\n const charIdx = Math.floor(angleNorm * dirChars.length) % dirChars.length;\n const ch = dirChars[charIdx];\n\n const isAccent = intensity > 0.80;\n const alpha = lightMode ? intensity * 0.80 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.90 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderVoidBackground — gravitational singularity follows the cursor.\n * Characters are pulled inward and spiral around the attractor.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface VoidBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Character ramp. Default space-to-dense. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for the inner singularity ring. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Gravity well radius (fraction of canvas width). Default 0.38. */\n radius?: number;\n /** Spiral tightness — higher = more rotation per unit distance. Default 3. */\n swirl?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderVoidBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: VoidBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' ·:;=+*#%@',\n color,\n accentColor = '#d4ff00',\n speed = 1,\n radius = 0.38,\n swirl = 3,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const aspect = width / height;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const r = dist / radius;\n\n // Outside radius: very faint scattered field\n if (r > 1) {\n const outerNoise = hash2(col * 3, row * 7) * Math.max(0, 1 - (r - 1) * 3);\n if (outerNoise < 0.62) continue;\n const alpha = outerNoise * (lightMode ? 0.28 : 0.04);\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(chars[1], col * charW, row * lineH);\n continue;\n }\n\n // Spiral displacement: angle rotates faster near center\n const baseAngle = Math.atan2(dy, dx * aspect);\n const swirlAmt = (1 - r) * swirl;\n const angle = baseAngle + swirlAmt + t * 0.4;\n\n // Intensity: rises sharply toward center, with animated pulse ring\n const pulseRing = Math.max(0, 1 - Math.abs(r - (0.15 + 0.12 * Math.sin(t * 1.1))) / 0.07);\n const gravity = Math.pow(1 - r, 2.2);\n const intensity = Math.min(1, gravity + pulseRing * 0.6);\n\n if (intensity < 0.06) continue;\n\n void angle; // angle influences char variety at mid-range (kept for future use)\n const densityI = Math.floor(intensity * (chars.length - 1));\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx];\n\n const isAccent = pulseRing > 0.35 || r < 0.08;\n const alpha = lightMode ? intensity * 0.85 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.95 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderMorphBackground — per-cell multi-frequency oscillation.\n * Each cell uses a unique rhythm. Pure ambient texture. No mouse interaction.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface MorphBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp. Default clean gradient. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.5 (intentionally slow). */\n speed?: number;\n /** How many frequency harmonics per cell. More = richer shimmer. Default 3. */\n harmonics?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderMorphBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: MorphBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:-=+*#',\n color,\n accentColor = '#d4ff00',\n speed = 0.5,\n harmonics = 3,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Max possible sum: sum(1/(h+1)) for h=0..harmonics-1\n const maxV = Array.from({ length: harmonics }, (_, h) => 1 / (h + 1)).reduce((a, b) => a + b, 0);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n // Each cell gets unique frequency seeds derived from its position\n let v = 0;\n for (let h = 0; h < harmonics; h++) {\n const fBase = hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4;\n const phase = hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n const norm = (v / maxV + 1) * 0.5; // 0→1\n\n if (norm < 0.28) continue;\n\n const remapped = (norm - 0.28) / 0.72;\n const charIdx = Math.min(chars.length - 1, Math.floor(remapped * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = norm > 0.88;\n const alpha = lightMode ? remapped * 0.82 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * ASCII Background — public entry point for the backgrounds sub-system.\n *\n * Exports:\n * - All 10 render functions\n * - All 10 option interfaces\n * - `AsciiBackgroundOptions` — combined union type + mount options\n * - `asciiBackground()` — the drop-in mount helper\n * - `mountWaveBackground` / `MountWaveOptions` — deprecated aliases\n */\n\nexport type { WaveBackgroundOptions } from './wave';\nexport { renderWaveBackground } from './wave';\n\nexport type { RainBackgroundOptions } from './rain';\nexport { renderRainBackground } from './rain';\n\nexport type { StarsBackgroundOptions } from './stars';\nexport { renderStarsBackground } from './stars';\n\nexport type { PulseBackgroundOptions } from './pulse';\nexport { renderPulseBackground } from './pulse';\n\nexport type { NoiseBackgroundOptions } from './noise';\nexport { renderNoiseBackground } from './noise';\n\nexport type { GridBackgroundOptions } from './grid';\nexport { renderGridBackground } from './grid';\n\nexport type { AuroraBackgroundOptions } from './aurora';\nexport { renderAuroraBackground } from './aurora';\n\nexport type { SilkBackgroundOptions } from './silk';\nexport { renderSilkBackground } from './silk';\n\nexport type { VoidBackgroundOptions } from './void';\nexport { renderVoidBackground } from './void';\n\nexport type { MorphBackgroundOptions } from './morph';\nexport { renderMorphBackground } from './morph';\n\nimport { renderWaveBackground } from './wave';\nimport type { WaveBackgroundOptions } from './wave';\nimport { renderRainBackground } from './rain';\nimport type { RainBackgroundOptions } from './rain';\nimport { renderStarsBackground } from './stars';\nimport type { StarsBackgroundOptions } from './stars';\nimport { renderPulseBackground } from './pulse';\nimport type { PulseBackgroundOptions } from './pulse';\nimport { renderNoiseBackground } from './noise';\nimport type { NoiseBackgroundOptions } from './noise';\nimport { renderGridBackground } from './grid';\nimport type { GridBackgroundOptions } from './grid';\nimport { renderAuroraBackground } from './aurora';\nimport type { AuroraBackgroundOptions } from './aurora';\nimport { renderSilkBackground } from './silk';\nimport type { SilkBackgroundOptions } from './silk';\nimport { renderVoidBackground } from './void';\nimport type { VoidBackgroundOptions } from './void';\nimport { renderMorphBackground } from './morph';\nimport type { MorphBackgroundOptions } from './morph';\n\n// Inline _parseColor for the inject helper (avoids circular dep through _shared re-export)\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n/**\n * Combined options for `asciiBackground()`. Extends all 10 background option\n * interfaces so every background's options can be passed through one object.\n */\nexport interface AsciiBackgroundOptions extends\n WaveBackgroundOptions,\n RainBackgroundOptions,\n StarsBackgroundOptions,\n PulseBackgroundOptions,\n NoiseBackgroundOptions,\n GridBackgroundOptions,\n AuroraBackgroundOptions,\n SilkBackgroundOptions,\n VoidBackgroundOptions,\n MorphBackgroundOptions\n{\n /**\n * Which background to render (default: 'wave').\n * - 'wave' — interactive ASCII field with vortex, sparkles, breathe\n * - 'rain' — digital column rain (Matrix-style falling characters)\n * - 'stars' — 3D star-warp / hyperspace chars fly toward the viewer\n * - 'pulse' — concentric ASCII ripples radiating from the mouse\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n * - 'aurora' — premium slow-drifting light bands\n * - 'silk' — smooth directional flow-field ribbons\n * - 'void' — gravitational singularity follows the cursor\n * - 'morph' — per-cell multi-frequency shimmer\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid' | 'aurora' | 'silk' | 'void' | 'morph';\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows system prefers-color-scheme and updates live\n * - 'dark' — always render bright chars on dark background\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * Overrides the default white/black for ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/**\n * Drop-in helper that mounts an interactive ASCII background onto any element.\n * Injects a canvas, wires DPR resize, mouse tracking, and the RAF loop.\n * Auto-detects light/dark mode and stays in sync if the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n type = 'wave',\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute', 'inset:0', 'width:100%', 'height:100%',\n `opacity:${opacity}`, 'pointer-events:none', `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches;\n };\n\n const parsedColor = color ? _parseColor(color) : null;\n\n type AnyRenderOpts =\n | WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions\n | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions\n | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions\n | MorphBackgroundOptions;\n\n const buildWaveOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : (renderOpts as WaveBackgroundOptions).baseColor,\n });\n const buildRainOpts = (): RainBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as RainBackgroundOptions).color,\n });\n const buildStarsOpts = (): StarsBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as StarsBackgroundOptions).color,\n });\n const buildPulseOpts = (): PulseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as PulseBackgroundOptions).color,\n });\n const buildNoiseOpts = (): NoiseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as NoiseBackgroundOptions).color,\n });\n const buildGridOpts = (): GridBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as GridBackgroundOptions).color,\n });\n const buildAuroraOpts = (): AuroraBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as AuroraBackgroundOptions).color,\n });\n const buildSilkOpts = (): SilkBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as SilkBackgroundOptions).color,\n });\n const buildVoidOpts = (): VoidBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as VoidBackgroundOptions).color,\n });\n const buildMorphOpts = (): MorphBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as MorphBackgroundOptions).color,\n });\n\n const optsRef = { current: buildWaveOpts() as AnyRenderOpts };\n const rebuildOpts = () => {\n if (type === 'rain') optsRef.current = buildRainOpts();\n else if (type === 'stars') optsRef.current = buildStarsOpts();\n else if (type === 'pulse') optsRef.current = buildPulseOpts();\n else if (type === 'noise') optsRef.current = buildNoiseOpts();\n else if (type === 'grid') optsRef.current = buildGridOpts();\n else if (type === 'aurora') optsRef.current = buildAuroraOpts();\n else if (type === 'silk') optsRef.current = buildSilkOpts();\n else if (type === 'void') optsRef.current = buildVoidOpts();\n else if (type === 'morph') optsRef.current = buildMorphOpts();\n else optsRef.current = buildWaveOpts();\n };\n rebuildOpts();\n\n const onSchemeChange = () => { rebuildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n\n if (type === 'rain') {\n renderRainBackground(ctx, r.width, r.height, time, optsRef.current as RainBackgroundOptions);\n } else if (type === 'stars') {\n renderStarsBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as StarsBackgroundOptions);\n } else if (type === 'pulse') {\n renderPulseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as PulseBackgroundOptions);\n } else if (type === 'noise') {\n renderNoiseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as NoiseBackgroundOptions);\n } else if (type === 'grid') {\n renderGridBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as GridBackgroundOptions);\n } else if (type === 'aurora') {\n renderAuroraBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as AuroraBackgroundOptions);\n } else if (type === 'silk') {\n renderSilkBackground(ctx, r.width, r.height, time, optsRef.current as SilkBackgroundOptions);\n } else if (type === 'void') {\n renderVoidBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as VoidBackgroundOptions);\n } else if (type === 'morph') {\n renderMorphBackground(ctx, r.width, r.height, time, optsRef.current as MorphBackgroundOptions);\n } else {\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as WaveBackgroundOptions);\n }\n\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","// ─── Asciify WebGL Renderer ───────────────────────────────────────\n// GPU-accelerated drop-in replacement for renderFrameToCanvas.\n// All cells rendered in ONE instanced draw call per frame.\n// Animation + hover effects computed entirely in GLSL shaders.\n// No glyph atlas — uses solid rect/dots per cell (matches Canvas2D fillRect fast path).\n// Falls back gracefully to null if WebGL2 is unavailable.\n\nimport type { AsciiFrame, AsciiOptions } from './types';\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport interface WebGLRenderer {\n render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void;\n /** Call when options or the source frame has changed to invalidate cell data cache. */\n notifyDirty(): void;\n destroy(): void;\n}\n\n// ─── Vertex Shader ────────────────────────────────────────────────\n// One instance = one cell. Position, animation, hover, color all computed on GPU.\n// Cell data arrives as a single RGBA8 texture:\n// .rgb = cell color (normalized 0-1)\n// .a = char weight (0=space/invisible … 1=densest char, fully opaque)\n\nconst VERT_SRC = /* glsl */`#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Unit quad corners: (-0.5,-0.5) to (0.5,0.5) - TRIANGLE_STRIP, 4 verts\nin vec2 a_corner;\n\n// Layout\nuniform vec2 u_canvasSize;\nuniform vec2 u_gridSize;\nuniform vec2 u_cellSize;\n\n// Animation\nuniform float u_time;\nuniform float u_animSpeed;\nuniform int u_animStyle;\n\n// Color\nuniform int u_colorMode;\nuniform vec3 u_accentColor;\nuniform int u_invert;\n\n// Hover\nuniform float u_hoverStrength;\nuniform float u_hoverIntensity;\nuniform vec2 u_hoverPos;\nuniform float u_hoverRadius;\nuniform int u_hoverEffect;\nuniform vec3 u_hoverColor;\n\n// Render mode: 0=rect 1=dots\nuniform int u_renderMode;\nuniform float u_dotSizeRatio;\n\n// Cell data: RGBA8 texture (cols x rows)\n// rgb = cell colour, a = source alpha\nuniform sampler2D u_cellTex;\n\nout vec4 v_color;\nout float v_alpha;\nout vec2 v_localUv;\n\n#define PI 3.141592653589793\n\nfloat ss(float t) { return t * t * (3.0 - 2.0 * t); }\n\nfloat getAnim(float nx, float ny, float cx, float cy, float t) {\n if (u_animStyle == 0) return 1.0;\n if (u_animStyle == 1) { // wave\n return 0.3 + 0.7 * (sin(nx * PI * 4.0 + t * 3.0) * 0.3 + 0.5\n + sin(ny * PI * 3.0 + t * 2.0) * 0.2);\n }\n if (u_animStyle == 2) { // pulse\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.2 + 0.8 * (sin(d * PI * 6.0 - t * 4.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 3) { // rain\n float drop = sin(ny * PI * 8.0 - t * 5.0 + cx * 0.3) * 0.5 + 0.5;\n return 0.1 + 0.9 * drop * (sin(nx * PI * 2.0 + t) * 0.3 + 0.7);\n }\n if (u_animStyle == 4) { // breathe\n return clamp(sin(t * 2.0) * 0.3 + 0.7 + sin((cx + cy) * 0.1 + t) * 0.1, 0.1, 1.0);\n }\n if (u_animStyle == 5) { // sparkle\n float sp = fract(sin(cx * 127.1 + cy * 311.7 + floor(t * 8.0) * 43758.5453) * 43758.5453);\n return sp > 0.7 ? 1.0 : 0.15 + sp * 0.4;\n }\n if (u_animStyle == 6) { // glitch\n float band = floor(cy / max(1.0, u_gridSize.y * 0.05));\n float gv = fract(sin(band * 43.23 + floor(t * 6.0) * 17.89) * 43758.5453);\n if (gv > 0.85) { float fl = sin(t * 30.0 + band) * 0.5 + 0.5; return fl < 0.3 ? 0.0 : fl; }\n return 1.0;\n }\n if (u_animStyle == 7) { // spiral\n float angle = atan(ny - 0.5, nx - 0.5);\n float dist = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.15 + 0.85 * (sin(angle * 3.0 + dist * PI * 8.0 - t * 3.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 8) { // typewriter\n float reveal = fract(t * 0.5) * u_gridSize.x * u_gridSize.y * 1.3;\n float dist = cy * u_gridSize.x + cx - reveal;\n if (dist > 0.0) return 0.0;\n return clamp(1.0 + dist / (u_gridSize.x * u_gridSize.y * 0.15), 0.0, 1.0);\n }\n if (u_animStyle == 9) { // scatter\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n float phase = sin(t * 1.5) * 0.5 + 0.5;\n if (d > phase) return max(0.0, 1.0 - (d - phase) * 3.0);\n return 0.7 + 0.3 * sin(d * 10.0 - t * 2.0);\n }\n return 1.0;\n}\n\nvec3 applyColorMode(vec3 rgb) {\n float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n if (u_colorMode == 0) return vec3(lum);\n if (u_colorMode == 2) return vec3(0.0, lum, 0.0);\n if (u_colorMode == 3) return lum * u_accentColor;\n return rgb;\n}\n\nvoid main() {\n int cols = int(u_gridSize.x);\n int rows = int(u_gridSize.y);\n int cx = gl_InstanceID % cols;\n int cy = gl_InstanceID / cols;\n\n float fnx = (float(cx) + 0.5) / float(cols);\n float fny = (float(cy) + 0.5) / float(rows);\n\n // Sample cell data\n vec4 cell = texture(u_cellTex, vec2(fnx, fny));\n // cell.rgb = colour, cell.a = source alpha (0=transparent, 1=opaque)\n\n // Invisible cells (fully transparent source pixel)\n if (cell.a < 0.004) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Char weight: 0=dark/space .. 1=dense/bright (luminance, matches luminanceToChar ordering)\n float charW = dot(cell.rgb, vec3(0.299, 0.587, 0.114));\n\n float cellW = u_cellSize.x;\n float cellH = u_cellSize.y;\n\n // Animation\n float t = u_time * u_animSpeed;\n float am = getAnim(fnx, fny, float(cx), float(cy), t);\n if (am < 0.04) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Hover\n float hoverScale = 1.0;\n vec2 hoverOff = vec2(0.0);\n float hoverGlow = 0.0;\n float hoverBlend = 0.0;\n\n if (u_hoverStrength > 0.0 && u_hoverIntensity > 0.005) {\n vec2 d = vec2(fnx - u_hoverPos.x, fny - u_hoverPos.y);\n float r = 0.08 + u_hoverRadius * 0.35 + u_hoverStrength * 0.04;\n float dist = length(d);\n if (dist < r) {\n float tv = 1.0 - dist / r;\n float e = ss(tv) * u_hoverIntensity;\n if (u_hoverEffect == 0) { // spotlight\n hoverScale = 1.0 + e * u_hoverStrength * 1.8;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 0.6 * vec2(cellW, cellH);\n hoverGlow = e * u_hoverStrength * 0.4;\n hoverBlend = e * e * u_hoverStrength * 0.25;\n } else if (u_hoverEffect == 1) { // magnify\n hoverScale = 1.0 + e * u_hoverStrength * 2.5;\n hoverGlow = e * u_hoverStrength * 0.15;\n } else if (u_hoverEffect == 2) { // repel\n hoverScale = 1.0 + e * u_hoverStrength * 0.3;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 1.2 * vec2(cellW, cellH);\n } else if (u_hoverEffect == 3) { // glow\n hoverGlow = e * u_hoverStrength * 0.8;\n hoverBlend = e * u_hoverStrength * 0.4;\n } else { // colorShift\n hoverScale = 1.0 + e * u_hoverStrength * 0.4;\n hoverGlow = e * u_hoverStrength * 0.2;\n hoverBlend = e * u_hoverStrength * 0.7;\n }\n }\n }\n\n // Final colour\n vec3 rgb = (u_invert == 1) ? (1.0 - cell.rgb) : cell.rgb;\n vec3 baseColor = applyColorMode(rgb);\n v_color = vec4(mix(baseColor, u_hoverColor, hoverBlend), 1.0);\n\n // Quad size & alpha\n vec2 quadSize;\n float finalAlpha;\n\n if (u_renderMode == 1) { // dots: radius driven by char weight (bright=big dot)\n float maxR = min(cellW, cellH) * 0.5 * u_dotSizeRatio;\n float radius = maxR * charW * am * hoverScale;\n if (radius < 0.3) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(radius * 2.0);\n finalAlpha = min(1.0, cell.a * am * (1.0 + hoverGlow));\n } else { // rect: size proportional to luminance — dark=tiny, bright=full (ASCII density look)\n if (charW < 0.01) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(cellW * charW * hoverScale, cellH * charW * hoverScale);\n finalAlpha = min(1.0, am * (1.0 + hoverGlow));\n }\n\n v_alpha = finalAlpha;\n v_localUv = a_corner;\n\n // NDC position (Y flipped: WebGL bottom-up, canvas top-down)\n float px = float(cx) * cellW + cellW * 0.5 + hoverOff.x;\n float py = float(cy) * cellH + cellH * 0.5 + hoverOff.y;\n vec2 pos = vec2(px, py) + a_corner * quadSize;\n vec2 ndc = pos / u_canvasSize * 2.0 - 1.0;\n ndc.y = -ndc.y;\n gl_Position = vec4(ndc, 0.0, 1.0);\n}\n`;\n\n// ─── Fragment Shader ──────────────────────────────────────────────\n\nconst FRAG_SRC = /* glsl */`#version 300 es\nprecision mediump float;\nprecision highp int;\n\nin vec4 v_color;\nin float v_alpha;\nin vec2 v_localUv;\n\nuniform int u_renderMode;\n\nout vec4 outColor;\n\nvoid main() {\n if (v_alpha < 0.01) discard;\n if (u_renderMode == 1) {\n // Dots: circle SDF clip\n if (length(v_localUv) > 0.5) discard;\n }\n outColor = vec4(v_color.rgb, v_alpha);\n}\n`;\n\n// ─── WebGL Helpers ────────────────────────────────────────────────\n\nfunction compileShader(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(sh) ?? 'unknown';\n gl.deleteShader(sh);\n throw new Error(`Shader compile error: ${info}`);\n }\n return sh;\n}\n\nfunction linkProgram(gl: WebGL2RenderingContext, vert: WebGLShader, frag: WebGLShader): WebGLProgram {\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vert);\n gl.attachShader(prog, frag);\n gl.linkProgram(prog);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(prog) ?? 'unknown';\n gl.deleteProgram(prog);\n throw new Error(`Program link error: ${info}`);\n }\n return prog;\n}\n\nfunction makeTexture(gl: WebGL2RenderingContext, filter: number = gl.NEAREST): WebGLTexture {\n const t = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return t;\n}\n\n// ─── Animation / color / hover index maps ────────────────────────\nconst ANIM_STYLES = ['none','wave','pulse','rain','breathe','sparkle','glitch','spiral','typewriter','scatter','waveField'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift'] as const;\nconst COLOR_MODES = ['grayscale','fullcolor','matrix','accent'] as const;\n\n// ─── Main Factory ─────────────────────────────────────────────────\n\n/**\n * Try to create a WebGL2 renderer for the given canvas.\n * Returns null if WebGL2 is unavailable (caller can then use Canvas2D).\n * On setup failure after context is claimed, returns a stub that clears to dark.\n */\nexport function tryCreateWebGLRenderer(canvas: HTMLCanvasElement): WebGLRenderer | null {\n const glOrNull = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n }) as WebGL2RenderingContext | null;\n\n if (!glOrNull) return null;\n const gl: WebGL2RenderingContext = glOrNull; // non-null, stable in closures\n\n try {\n // ─── Compile shaders ─────────────────────────────────────────\n const vert = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const prog = linkProgram(gl, vert, frag);\n gl.deleteShader(vert);\n gl.deleteShader(frag);\n\n // ─── VAO: unit quad (TRIANGLE_STRIP, 4 vertices) ─────────────\n const vao = gl.createVertexArray()!;\n gl.bindVertexArray(vao);\n\n const corners = new Float32Array([-0.5,-0.5, 0.5,-0.5, -0.5,0.5, 0.5,0.5]);\n const vbo = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n const aCorner = gl.getAttribLocation(prog, 'a_corner');\n gl.enableVertexAttribArray(aCorner);\n gl.vertexAttribPointer(aCorner, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindVertexArray(null);\n\n // ─── Single cell data texture (RGBA8: rgb=colour, a=charWeight 0-255) ─\n const cellTex = makeTexture(gl);\n\n // ─── Cached uniform locations ─────────────────────────────────\n const g = (n: string) => gl.getUniformLocation(prog, n)!;\n const u = {\n canvasSize: g('u_canvasSize'),\n gridSize: g('u_gridSize'),\n cellSize: g('u_cellSize'),\n time: g('u_time'),\n animSpeed: g('u_animSpeed'),\n animStyle: g('u_animStyle'),\n colorMode: g('u_colorMode'),\n accentColor: g('u_accentColor'),\n invert: g('u_invert'),\n hoverStrength: g('u_hoverStrength'),\n hoverIntensity:g('u_hoverIntensity'),\n hoverPos: g('u_hoverPos'),\n hoverRadius: g('u_hoverRadius'),\n hoverEffect: g('u_hoverEffect'),\n hoverColor: g('u_hoverColor'),\n renderMode: g('u_renderMode'),\n dotSizeRatio: g('u_dotSizeRatio'),\n cellTexU: g('u_cellTex'),\n };\n\n // ─── State ────────────────────────────────────────────────────\n let lastCols = 0;\n let lastRows = 0;\n let cellBuf = new Uint8Array(0); // rgba: rgb=colour, a=sourceAlpha\n let cellDataDirty = true;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // ─── Render ───────────────────────────────────────────────────\n function render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void {\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n if (cols === 0) return;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Clear to dark or transparent based on source alpha\n let hasTransparency = false;\n const sy = Math.max(1, rows >> 2), sx = Math.max(1, cols >> 2);\n outer: for (let iy = 0; iy < rows; iy += sy)\n for (let ix = 0; ix < cols; ix += sx)\n if (frame[iy][ix].a < 200) { hasTransparency = true; break outer; }\n gl.clearColor(hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Re-allocate cell buffer when grid changes\n if (cols !== lastCols || rows !== lastRows) {\n cellBuf = new Uint8Array(cols * rows * 4);\n lastCols = cols;\n lastRows = rows;\n cellDataDirty = true;\n }\n\n // Upload cell data (rgb = colour, a = char weight 0-255)\n if (cellDataDirty) {\n for (let y = 0; y < rows; y++) {\n const row = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = row[x];\n const i = (y * cols + x) * 4;\n cellBuf[i] = cell.r;\n cellBuf[i + 1] = cell.g;\n cellBuf[i + 2] = cell.b;\n // alpha channel = source alpha (used for transparency masking in shader)\n cellBuf[i + 3] = cell.a;\n }\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, cellBuf);\n cellDataDirty = false;\n }\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n\n gl.useProgram(prog);\n gl.bindVertexArray(vao);\n\n const cellW = displayW / cols;\n const cellH = displayH / rows;\n\n gl.uniform2f(u.canvasSize, displayW, displayH);\n gl.uniform2f(u.gridSize, cols, rows);\n gl.uniform2f(u.cellSize, cellW, cellH);\n gl.uniform1f(u.time, time);\n gl.uniform1f(u.animSpeed, options.animationSpeed);\n gl.uniform1i(u.animStyle, ANIM_STYLES.indexOf(options.animationStyle));\n gl.uniform1i(u.colorMode, COLOR_MODES.indexOf(options.colorMode));\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n gl.uniform3f(u.accentColor,\n parseInt(acHex.slice(0, 2), 16) / 255,\n parseInt(acHex.slice(2, 4), 16) / 255,\n parseInt(acHex.slice(4, 6), 16) / 255);\n gl.uniform1i(u.invert, options.invert ? 1 : 0);\n\n const totalCells = rows * cols;\n const animActive = options.animationStyle !== 'none';\n const suppressHover = animActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!hoverPos && options.hoverStrength > 0;\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6 : 1;\n\n gl.uniform1f(u.hoverStrength, hoverActive ? options.hoverStrength : 0);\n gl.uniform1f(u.hoverIntensity, hoverActive ? (hoverPos?.intensity ?? 0) : 0);\n gl.uniform2f(u.hoverPos, hoverPos?.x ?? 0.5, hoverPos?.y ?? 0.5);\n gl.uniform1f(u.hoverRadius, options.hoverRadius * radiusScale);\n gl.uniform1i(u.hoverEffect, HOVER_EFFECTS.indexOf(options.hoverEffect));\n const hc = options.hoverColor || '#ffffff';\n gl.uniform3f(u.hoverColor,\n parseInt(hc.slice(1, 3), 16) / 255,\n parseInt(hc.slice(3, 5), 16) / 255,\n parseInt(hc.slice(5, 7), 16) / 255);\n\n gl.uniform1i(u.renderMode, options.renderMode === 'dots' ? 1 : 0);\n gl.uniform1f(u.dotSizeRatio, options.dotSizeRatio);\n gl.uniform1i(u.cellTexU, 0);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, cols * rows);\n gl.bindVertexArray(null);\n }\n\n return {\n render,\n notifyDirty() { cellDataDirty = true; },\n destroy() {\n gl.deleteProgram(prog);\n gl.deleteVertexArray(vao);\n gl.deleteBuffer(vbo);\n gl.deleteTexture(cellTex);\n },\n };\n\n } catch (err) {\n console.error('[asciify] WebGL renderer setup FAILED (returning stub):', err);\n const stub: WebGLRenderer = {\n render() {\n try { gl.clearColor(0.039, 0.039, 0.039, 1); gl.clear(gl.COLOR_BUFFER_BIT); } catch { /* */ }\n },\n notifyDirty() {},\n destroy() {},\n };\n return stub;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/core/utils.ts","../src/core/animation.ts","../src/backgrounds/_shared.ts","../src/backgrounds/wave.ts","../src/core/renderer.ts","../src/core/embed-gen.ts","../src/core/simple-api.ts","../src/backgrounds/rain.ts","../src/backgrounds/stars.ts","../src/backgrounds/pulse.ts","../src/backgrounds/noise.ts","../src/backgrounds/grid.ts","../src/backgrounds/aurora.ts","../src/backgrounds/silk.ts","../src/backgrounds/void.ts","../src/backgrounds/morph.ts","../src/backgrounds/index.ts","../src/webgl-engine.ts"],"names":["fade","parseGIF","decompressFrames","alpha","render"],"mappings":"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","file":"index.cjs","sourcesContent":["// ─── Asciify Types ────────────────────────────────────────────────\n\nexport type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';\nexport type RenderMode = 'ascii' | 'dots';\nexport type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter' | 'waveField';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal' | 'box' | 'lines';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\nexport type SourceType = 'image' | 'video' | 'gif' | null;\n\nexport interface AsciiOptions {\n fontSize: number;\n charSpacing: number;\n brightness: number;\n contrast: number;\n charset: string;\n colorMode: ColorMode;\n accentColor: string;\n invert: boolean;\n renderMode: RenderMode;\n animationStyle: AnimationStyle;\n animationSpeed: number;\n dotSizeRatio: number;\n ditherStrength: number;\n hoverStrength: number;\n hoverRadius: number;\n hoverEffect: HoverEffect;\n hoverColor: string;\n artStyle: ArtStyle;\n customText: string;\n}\n\nexport interface AsciiCell {\n char: string;\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type AsciiFrame = AsciiCell[][];\n\nexport interface AsciiResult {\n frames: AsciiFrame[];\n cols: number;\n rows: number;\n fps: number;\n}\n\nexport const CHARSETS = {\n standard: ' .:-=+*#%@',\n blocks: ' ░▒▓█',\n minimal: ' .:+',\n dense: ' .\\'`^\",:;Il!i><~+_-?][}{1)(|\\\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$',\n binary: '01',\n dots: ' ⠁⠃⠇⡇⣇⣧⣷⣿',\n letters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n claudeCode: ' ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼',\n box: ' ▪◾◼■█',\n lines: ' ˗‐–—―━',\n} as const;\n\nexport type CharsetKey = keyof typeof CHARSETS;\n\n/**\n * Art Style presets — each one sets render mode, charset, color mode, etc.\n */\nexport const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>> = {\n classic: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n },\n particles: {\n renderMode: 'dots',\n colorMode: 'fullcolor',\n dotSizeRatio: 0.8,\n },\n letters: {\n renderMode: 'ascii',\n charset: CHARSETS.letters,\n colorMode: 'fullcolor',\n },\n claudeCode: {\n renderMode: 'ascii',\n charset: CHARSETS.claudeCode,\n colorMode: 'accent',\n accentColor: '#f97316',\n },\n art: {\n renderMode: 'ascii',\n charset: CHARSETS.dense,\n colorMode: 'fullcolor',\n },\n terminal: {\n renderMode: 'ascii',\n charset: CHARSETS.standard,\n colorMode: 'matrix',\n },\n box: {\n renderMode: 'ascii',\n charset: CHARSETS.box,\n colorMode: 'grayscale',\n },\n lines: {\n renderMode: 'ascii',\n charset: CHARSETS.lines,\n colorMode: 'fullcolor',\n },\n};\n\nexport const DEFAULT_OPTIONS: AsciiOptions = {\n fontSize: 10,\n charSpacing: 1,\n brightness: 0,\n contrast: 0,\n charset: CHARSETS.standard,\n colorMode: 'grayscale',\n accentColor: '#d4ff00',\n invert: false,\n renderMode: 'ascii',\n animationStyle: 'none',\n animationSpeed: 1,\n dotSizeRatio: 0.8,\n ditherStrength: 0,\n hoverStrength: 0,\n hoverRadius: 0.2,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\n customText: '',\n};\n\n/**\n * Hover presets — one-click configurations for the hover system.\n */\nexport const HOVER_PRESETS: Record<HoverPreset, { label: string; options: Partial<AsciiOptions> }> = {\n none: {\n label: 'Off',\n options: { hoverStrength: 0, hoverEffect: 'spotlight', hoverRadius: 0.2, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.25, hoverEffect: 'glow', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 0.6, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 0.7, hoverEffect: 'magnify', hoverRadius: 0.12, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 0.7, hoverEffect: 'repel', hoverRadius: 0.15, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 0.6, hoverEffect: 'colorShift', hoverRadius: 0.15, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 0.7, hoverEffect: 'spotlight', hoverRadius: 0.15, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 0.5, hoverEffect: 'glow', hoverRadius: 0.15, hoverColor: '#60d5f7' },\n },\n};\n","/**\n * Low-level canvas and color utilities shared across the entire engine.\n * No imports from other engine modules — pure logic.\n */\n\nimport type { AsciiCell } from '../types';\n\n// ─── Offscreen canvas ─────────────────────────────────────────────\n\nexport function createOffscreenCanvas(width: number, height: number): {\n canvas: HTMLCanvasElement | OffscreenCanvas;\n ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n} {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n return { canvas, ctx };\n}\n\n// ─── Luminance helpers ────────────────────────────────────────────\n\nexport function adjustLuminance(lum: number, brightness: number, contrast: number): number {\n let adjusted = lum + brightness * 255;\n const factor = (259 * (contrast * 255 + 255)) / (255 * (259 - contrast * 255));\n adjusted = factor * (adjusted - 128) + 128;\n return Math.max(0, Math.min(255, adjusted));\n}\n\nexport function luminanceToChar(lum: number, charset: string, invert: boolean): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n const index = Math.floor(normalized * (charset.length - 1));\n return charset[Math.max(0, Math.min(charset.length - 1, index))];\n}\n\nexport function customTextToChar(\n lum: number, text: string, x: number, y: number, cols: number, invert: boolean\n): string {\n const normalized = invert ? 1 - lum / 255 : lum / 255;\n if (normalized < 0.12) return ' ';\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n// ─── Dithering ────────────────────────────────────────────────────\n\nconst BAYER_4X4 = [\n [ 0, 8, 2,10],\n [12, 4,14, 6],\n [ 3,11, 1, 9],\n [15, 7,13, 5],\n] as const;\n\nexport function applyDither(lum: number, x: number, y: number, strength: number): number {\n if (strength <= 0) return lum;\n const threshold = (BAYER_4X4[y % 4][x % 4] / 16 - 0.5) * strength * 128;\n return Math.max(0, Math.min(255, lum + threshold));\n}\n\n// ─── Pre-computed Color LUTs ──────────────────────────────────────\n\nexport const GRAY_LUT: string[] = new Array(256);\nexport const GREEN_LUT: string[] = new Array(256);\nfor (let _i = 0; _i < 256; _i++) {\n GRAY_LUT[_i] = `rgb(${_i},${_i},${_i})`;\n GREEN_LUT[_i] = `rgb(0,${_i},0)`;\n}\n\n// ─── Cell color resolution ────────────────────────────────────────\n\nexport function getCellColorStr(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): string {\n switch (colorMode) {\n case 'fullcolor':\n return `rgb(${cell.r},${cell.g},${cell.b})`;\n case 'matrix':\n return GREEN_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n return `rgb(${(acR * ab) | 0},${(acG * ab) | 0},${(acB * ab) | 0})`;\n }\n default:\n return GRAY_LUT[(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0];\n }\n}\n\nconst _colorRGB = [0, 0, 0];\nexport function getCellColorRGB(\n cell: AsciiCell, colorMode: string, acR: number, acG: number, acB: number\n): number[] {\n switch (colorMode) {\n case 'fullcolor':\n _colorRGB[0] = cell.r; _colorRGB[1] = cell.g; _colorRGB[2] = cell.b;\n break;\n case 'matrix': {\n const mb = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = 0; _colorRGB[1] = mb; _colorRGB[2] = 0;\n break;\n }\n case 'accent': {\n const ab = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) / 255;\n _colorRGB[0] = (acR * ab) | 0; _colorRGB[1] = (acG * ab) | 0; _colorRGB[2] = (acB * ab) | 0;\n break;\n }\n default: {\n const gray = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) | 0;\n _colorRGB[0] = gray; _colorRGB[1] = gray; _colorRGB[2] = gray;\n break;\n }\n }\n return _colorRGB;\n}\n\n// ─── Glow sprite cache ────────────────────────────────────────────\n\nlet _glowCache: { canvas: HTMLCanvasElement; size: number; r: number; g: number; b: number } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4;\n if (_glowCache && _glowCache.size === size && _glowCache.r === r && _glowCache.g === g && _glowCache.b === b) {\n return _glowCache.canvas;\n }\n const dim = size * 2;\n const canvas = document.createElement('canvas');\n canvas.width = dim;\n canvas.height = dim;\n const gCtx = canvas.getContext('2d')!;\n const gradient = gCtx.createRadialGradient(size, size, 0, size, size, size);\n gradient.addColorStop(0, `rgba(${r},${g},${b},1)`);\n gradient.addColorStop(0.4, `rgba(${r},${g},${b},0.4)`);\n gradient.addColorStop(1, `rgba(${r},${g},${b},0)`);\n gCtx.fillStyle = gradient;\n gCtx.fillRect(0, 0, dim, dim);\n _glowCache = { canvas, size, r, g, b };\n return canvas;\n}\n","/**\n * Animation multiplier and hover effect computations.\n */\n\nimport type { AnimationStyle } from '../types';\nimport type { HoverEffect } from '../types';\n\nexport function smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\nexport function getAnimationMultiplier(\n x: number,\n y: number,\n cols: number,\n rows: number,\n time: number,\n style: AnimationStyle,\n speed: number\n): number {\n if (style === 'none') return 1;\n\n const t = time * speed;\n\n switch (style) {\n case 'wave': {\n const wave = Math.sin((x / cols) * Math.PI * 4 + t * 3) * 0.5 + 0.5;\n const wave2 = Math.sin((y / rows) * Math.PI * 3 + t * 2) * 0.5 + 0.5;\n return 0.3 + 0.7 * (wave * 0.6 + wave2 * 0.4);\n }\n case 'pulse': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dist = Math.sqrt((x - cx) ** 2 + (y - cy) ** 2);\n const maxDist = Math.sqrt(cx ** 2 + cy ** 2);\n const ring = Math.sin(dist / maxDist * Math.PI * 6 - t * 4) * 0.5 + 0.5;\n return 0.2 + 0.8 * ring;\n }\n case 'rain': {\n const drop = Math.sin(y / rows * Math.PI * 8 - t * 5 + x * 0.3) * 0.5 + 0.5;\n const fade = Math.sin(x / cols * Math.PI * 2 + t) * 0.3 + 0.7;\n return 0.1 + 0.9 * drop * fade;\n }\n case 'breathe': {\n const breathe = Math.sin(t * 2) * 0.3 + 0.7;\n const subtle = Math.sin((x + y) * 0.1 + t) * 0.1;\n return Math.max(0.1, Math.min(1, breathe + subtle));\n }\n case 'sparkle': {\n const hash = Math.sin(x * 127.1 + y * 311.7 + Math.floor(t * 8) * 43758.5453) * 43758.5453;\n const sparkle = (hash - Math.floor(hash));\n return sparkle > 0.7 ? 1 : 0.15 + sparkle * 0.4;\n }\n case 'glitch': {\n const band = Math.floor(y / (rows * 0.05));\n const glitchHash = Math.sin(band * 43.23 + Math.floor(t * 6) * 17.89) * 43758.5453;\n const glitchVal = glitchHash - Math.floor(glitchHash);\n if (glitchVal > 0.85) {\n const flicker = Math.sin(t * 30 + band) * 0.5 + 0.5;\n return flicker < 0.3 ? 0 : flicker;\n }\n return 1;\n }\n case 'spiral': {\n const cx = cols / 2;\n const cy = rows / 2;\n const dx = x - cx;\n const dy = y - cy;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = Math.sqrt(cx * cx + cy * cy);\n const spiral = Math.sin(angle * 3 + dist / maxDist * Math.PI * 8 - t * 3) * 0.5 + 0.5;\n return 0.15 + 0.85 * spiral;\n }\n case 'typewriter': {\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1);\n const revealPoint = progress * totalCells * 1.3;\n const dist = cellIndex - revealPoint;\n if (dist > 0) return 0;\n const fade = Math.max(0, 1 + dist / (totalCells * 0.15));\n return Math.min(1, fade);\n }\n case 'scatter': {\n const scx = cols / 2;\n const scy = rows / 2;\n const sdx = x - scx;\n const sdy = y - scy;\n const sdist = Math.sqrt(sdx * sdx + sdy * sdy) / Math.sqrt(scx * scx + scy * scy);\n const phase = Math.sin(t * 1.5) * 0.5 + 0.5;\n const threshold = phase;\n if (sdist > threshold) {\n return Math.max(0, 1 - (sdist - threshold) * 3);\n }\n return 0.7 + 0.3 * Math.sin(sdist * 10 - t * 2);\n }\n case 'waveField':\n // waveField is handled as a full short-circuit in renderFrameToCanvas\n return 1;\n default:\n return 1;\n }\n}\n\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nexport function computeHoverEffect(\n nx: number,\n ny: number,\n hoverX: number,\n hoverY: number,\n hoverIntensity: number,\n strength: number,\n cellW: number,\n cellH: number,\n effect: HoverEffect = 'spotlight',\n radiusFactor: number = 0.5\n): typeof _hoverResult {\n const dx = nx - hoverX;\n const dy = ny - hoverY;\n const distSq = dx * dx + dy * dy;\n\n const radius = (0.08 + radiusFactor * 0.35) + strength * 0.04;\n\n if (distSq >= radius * radius) {\n _hoverResult.scale = 1;\n _hoverResult.offsetX = 0;\n _hoverResult.offsetY = 0;\n _hoverResult.glow = 0;\n _hoverResult.colorBlend = 0;\n _hoverResult.proximity = 0;\n return _hoverResult;\n }\n\n const dist = Math.sqrt(distSq);\n const t = 1 - dist / radius;\n const eased = smoothstep(t) * hoverIntensity;\n\n let scale = 1;\n let offsetX = 0;\n let offsetY = 0;\n let glow = 0;\n let colorBlend = 0;\n\n switch (effect) {\n case 'spotlight': {\n scale = 1 + eased * strength * 1.8;\n const angle = Math.atan2(dy, dx);\n const pushForce = eased * eased * strength * 0.6;\n offsetX = Math.cos(angle) * pushForce * cellW;\n offsetY = Math.sin(angle) * pushForce * cellH;\n glow = eased * strength * 0.4;\n colorBlend = eased * eased * strength * 0.25;\n break;\n }\n case 'magnify':\n scale = 1 + eased * strength * 2.5;\n glow = eased * strength * 0.15;\n break;\n case 'repel': {\n scale = 1 + eased * strength * 0.3;\n const angle2 = Math.atan2(dy, dx);\n const push = eased * eased * strength * 1.2;\n offsetX = Math.cos(angle2) * push * cellW;\n offsetY = Math.sin(angle2) * push * cellH;\n break;\n }\n case 'glow':\n glow = eased * strength * 0.8;\n colorBlend = eased * strength * 0.4;\n break;\n case 'colorShift':\n scale = 1 + eased * strength * 0.4;\n glow = eased * strength * 0.2;\n colorBlend = eased * strength * 0.7;\n break;\n }\n\n _hoverResult.scale = scale;\n _hoverResult.offsetX = offsetX;\n _hoverResult.offsetY = offsetY;\n _hoverResult.glow = glow;\n _hoverResult.colorBlend = colorBlend;\n _hoverResult.proximity = eased;\n return _hoverResult;\n}\n","/**\n * Shared utilities for all background renderers:\n * - CSS color parser\n * - Value noise helpers (fade, lerp, hash2, vnoise, fbm)\n */\n\n// ─── Color parser ─────────────────────────────────────────────────\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\nexport function parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n// ─── Value-noise helpers ──────────────────────────────────────────\n\nexport function fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nexport function lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\n\n/** Fast 2-D hash → pseudo-random gradient value between -1 and 1 */\nexport function hash2(ix: number, iy: number): number {\n let n = ix * 127 + iy * 311;\n n = ((n >> 13) ^ n);\n return (((n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 0x3fffffff) - 1;\n}\n\n/** Single octave value noise */\nexport function vnoise(x: number, y: number): number {\n const ix = Math.floor(x), iy = Math.floor(y);\n const fx = x - ix, fy = y - iy;\n const ux = fade(fx), uy = fade(fy);\n const v00 = hash2(ix, iy );\n const v10 = hash2(ix + 1, iy );\n const v01 = hash2(ix, iy + 1);\n const v11 = hash2(ix + 1, iy + 1);\n return lerp(lerp(v00, v10, ux), lerp(v01, v11, ux), uy); // -1..1\n}\n\n/** 3-octave FBM (fractal Brownian motion) */\nexport function fbm(x: number, y: number): number {\n return (\n vnoise(x, y ) * 0.500 +\n vnoise(x * 2.1, y * 2.1) * 0.250 +\n vnoise(x * 4.3, y * 4.3) * 0.125\n ) / 0.875;\n}\n","/**\n * renderWaveBackground — interactive ASCII wave field with vortex, sparkles,\n * breathe pulse, and cursor proximity spotlight.\n */\nimport { hash2, fbm } from './_shared';\n\nexport interface WaveBackgroundOptions {\n /** Font size in CSS pixels (default: 13) */\n fontSize?: number;\n /** Character aspect ratio width/height (default: 0.62) */\n charAspect?: number;\n /** Line height multiplier (default: 1.4) */\n lineHeightRatio?: number;\n /** Character set from dark→bright (default: ' .:-=+*#%@') */\n chars?: string;\n /** Base colour — use '{a}' as alpha placeholder */\n baseColor?: string;\n /** Accent colour applied near the cursor and on wave peaks (default: '#d4ff00') */\n accentColor?: string;\n /** Accent threshold: normalised intensity above which accent kicks in (default: 0.52) */\n accentThreshold?: number;\n /** How strongly the mouse influences local intensity (default: 0.55) */\n mouseInfluence?: number;\n /** Radial falloff for mouse influence (default: 2.8) */\n mouseFalloff?: number;\n /** Base wave animation speed (default: 1) */\n speed?: number;\n /** Enable vortex swirl effect around cursor (default: true) */\n vortex?: boolean;\n /** Enable sparkle / pop flicker (default: true) */\n sparkles?: boolean;\n /** Enable a slow global breathe pulse (default: true) */\n breathe?: boolean;\n /** Light mode: swap fill colours to dark-on-light (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderWaveBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: WaveBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n charAspect = 0.62,\n lineHeightRatio = 1.4,\n chars = ' .:-=+*#%@',\n baseColor = null as string | null,\n accentColor = '#d4ff00',\n accentThreshold = 0.52,\n mouseInfluence = 0.55,\n mouseFalloff = 2.8,\n speed = 1,\n vortex = true,\n sparkles = true,\n breathe = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * charAspect;\n const lineH = fontSize * lineHeightRatio;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const mx = mousePos.x;\n const my = mousePos.y;\n\n let acR = 212, acG = 255, acB = 0;\n if (accentColor) {\n const hex = accentColor.replace('#', '');\n if (hex.length === 6) {\n acR = parseInt(hex.slice(0, 2), 16);\n acG = parseInt(hex.slice(2, 4), 16);\n acB = parseInt(hex.slice(4, 6), 16);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textBaseline = 'top';\n\n const t = time * speed;\n const breatheAmp = breathe ? (Math.sin(t * 0.22) * 0.5 + 0.5) * 0.12 : 0;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n const ny = row / rows;\n\n const w1 = Math.sin(col * 0.08 + row * 0.05 + t * 0.60) * 0.5 + 0.5;\n const w2 = Math.sin(col * 0.03 - row * 0.07 + t * 0.40) * 0.5 + 0.5;\n const w3 = Math.sin(col * 0.05 + row * 0.03 + t * 0.80) * 0.5 + 0.5;\n const sinePart = (w1 + w2 + w3) / 3;\n\n const noiseScale = 0.045;\n const noiseShift = t * 0.08;\n const noisePart = (fbm(col * noiseScale + noiseShift, row * noiseScale * 1.4 - noiseShift * 0.7) * 0.5 + 0.5);\n\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n const dxRaw = nx - mx;\n const dyRaw = ny - my;\n const distRaw = Math.sqrt(dxRaw * dxRaw + dyRaw * dyRaw);\n let vortexBump = 0;\n if (vortex && distRaw < 0.35) {\n const angle = Math.atan2(dyRaw, dxRaw);\n const swirl = Math.sin(angle * 4 + t * 2.2 - distRaw * 14);\n const falloff = Math.max(0, 1 - distRaw / 0.35);\n vortexBump = swirl * falloff * falloff * 0.22;\n }\n\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n const clamped = Math.min(1, Math.max(0, intensity));\n\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n const bucket = Math.floor(t * 8);\n const sparkleSeed = hash2(col * 7 + bucket * 3, row * 11 + bucket);\n if (sparkleSeed > 0.88) {\n finalIntensity = Math.min(1, clamped + (sparkleSeed - 0.88) * 4);\n }\n }\n\n const charIdx = Math.floor(finalIntensity * (chars.length - 1));\n if (chars[charIdx] === ' ') continue;\n\n const alpha = 0.015 + finalIntensity * 0.07;\n const isAccent = finalIntensity > accentThreshold;\n\n if (isAccent) {\n const accentAlpha = Math.min(lightMode ? 0.90 : 0.28, alpha * (lightMode ? 14 : 2.8));\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${accentAlpha})`;\n } else if (baseColor) {\n ctx.fillStyle = baseColor.replace('{a}', String(alpha));\n } else if (lightMode) {\n ctx.fillStyle = `rgba(0,0,0,${alpha * 7})`;\n } else {\n ctx.fillStyle = `rgba(255,255,255,${alpha})`;\n }\n\n ctx.fillText(chars[charIdx], col * charW, row * lineH);\n }\n }\n}\n","/**\n * Core frame-to-canvas renderer and source-to-frame converters.\n */\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame } from '../types';\nimport { DEFAULT_OPTIONS } from '../types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\nimport {\n createOffscreenCanvas,\n adjustLuminance,\n luminanceToChar,\n customTextToChar,\n applyDither,\n getCellColorStr,\n getCellColorRGB,\n} from './utils';\nimport { getAnimationMultiplier, computeHoverEffect } from './animation';\nimport { renderWaveBackground } from '../backgrounds/wave';\n\n// Re-export AsciiFrame for downstream consumers that import from this module\nexport type { AsciiFrame };\nvoid DEFAULT_OPTIONS; // keep import alive for tree-shaking hint\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n */\nexport function imageToAsciiFrame(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement,\n options: AsciiOptions,\n targetWidth?: number,\n targetHeight?: number\n): { frame: AsciiFrame; cols: number; rows: number } {\n const srcWidth = source instanceof HTMLVideoElement ? source.videoWidth : source.width;\n const srcHeight = source instanceof HTMLVideoElement ? source.videoHeight : source.height;\n\n if (srcWidth === 0 || srcHeight === 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const charAspect = 0.55;\n const cellW = options.fontSize * options.charSpacing;\n const cellH = options.fontSize / charAspect * options.charSpacing;\n\n const renderW = targetWidth || srcWidth;\n const renderH = targetHeight || srcHeight;\n const cols = Math.floor(renderW / cellW);\n const rows = Math.floor(renderH / cellH);\n\n if (cols <= 0 || rows <= 0) {\n return { frame: [], cols: 0, rows: 0 };\n }\n\n const { ctx } = createOffscreenCanvas(cols, rows);\n ctx.drawImage(source, 0, 0, cols, rows);\n const imageData = ctx.getImageData(0, 0, cols, rows);\n const pixels = imageData.data;\n\n const frame: AsciiFrame = [];\n\n for (let y = 0; y < rows; y++) {\n const row: AsciiCell[] = [];\n for (let x = 0; x < cols; x++) {\n const i = (y * cols + x) * 4;\n const r = pixels[i];\n const g = pixels[i + 1];\n const b = pixels[i + 2];\n const a = pixels[i + 3];\n\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const adjustedLum = adjustLuminance(lum, options.brightness, options.contrast);\n const ditheredLum = applyDither(adjustedLum, x, y, options.ditherStrength);\n const char = options.customText\n ? customTextToChar(ditheredLum, options.customText, x, y, cols, options.invert)\n : luminanceToChar(ditheredLum, options.charset, options.invert);\n\n row.push({ char, r, g, b, a });\n }\n frame.push(row);\n }\n\n return { frame, cols, rows };\n}\n\n/**\n * Extract frames from a video element for ASCII animation.\n */\nexport async function videoToAsciiFrames(\n video: HTMLVideoElement,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n targetFps: number = 12,\n maxDuration: number = 10,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const duration = Math.min(video.duration, maxDuration);\n const totalFrames = Math.ceil(duration * targetFps);\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n for (let i = 0; i < totalFrames; i++) {\n const time = (i / targetFps);\n if (time > duration) break;\n\n video.currentTime = time;\n await new Promise<void>((resolve) => {\n const handler = () => {\n video.removeEventListener('seeked', handler);\n resolve();\n };\n video.addEventListener('seeked', handler);\n });\n\n const result = imageToAsciiFrame(video, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n onProgress?.((i + 1) / totalFrames);\n }\n\n return { frames, cols, rows, fps: targetFps };\n}\n\n/**\n * Extract frames from an animated GIF file buffer.\n */\nexport async function gifToAsciiFrames(\n buffer: ArrayBuffer,\n options: AsciiOptions,\n targetWidth: number,\n targetHeight: number,\n onProgress?: (progress: number) => void\n): Promise<{ frames: AsciiFrame[]; cols: number; rows: number; fps: number }> {\n const gif = parseGIF(buffer);\n const rawFrames = decompressFrames(gif, true);\n\n if (rawFrames.length === 0) {\n return { frames: [], cols: 0, rows: 0, fps: 10 };\n }\n\n const gifW = rawFrames[0].dims.width;\n const gifH = rawFrames[0].dims.height;\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n const prevCanvas = document.createElement('canvas');\n prevCanvas.width = logicalW;\n prevCanvas.height = logicalH;\n const prevCtx = prevCanvas.getContext('2d')!;\n\n const frames: AsciiFrame[] = [];\n let cols = 0;\n let rows = 0;\n\n let totalDelay = 0;\n for (const f of rawFrames) { totalDelay += (f.delay || 100); }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n const maxFrames = Math.min(rawFrames.length, 300);\n\n for (let i = 0; i < maxFrames; i++) {\n const f = rawFrames[i];\n const { dims, patch, disposalType } = f;\n\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n const frameImageData = new ImageData(new Uint8ClampedArray(patch.buffer), dims.width, dims.height);\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = dims.width;\n tempCanvas.height = dims.height;\n const tempCtx = tempCanvas.getContext('2d')!;\n tempCtx.putImageData(frameImageData, 0, 0);\n\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n if (disposalType === 2) {\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n */\nexport function renderFrameToCanvas(\n ctx: CanvasRenderingContext2D,\n frame: AsciiFrame,\n options: AsciiOptions,\n canvasWidth: number,\n canvasHeight: number,\n time: number = 0,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n) {\n // waveField short-circuit\n if (options.animationStyle === 'waveField') {\n const mouseNorm = hoverPos ? { x: hoverPos.x, y: hoverPos.y } : { x: 0.5, y: 0.5 };\n const acHexWF = (options.accentColor || '#d4ff00').replace('#', '');\n renderWaveBackground(ctx, canvasWidth, canvasHeight, time, mouseNorm, {\n accentColor: `#${acHexWF}`,\n accentThreshold: 0.52,\n mouseInfluence: options.hoverStrength > 0 ? Math.min(1, 0.3 + options.hoverStrength * 0.5) : 0.55,\n mouseFalloff: 2.8,\n speed: options.animationSpeed,\n vortex: options.hoverStrength > 0,\n sparkles: true,\n breathe: true,\n });\n return;\n }\n\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n\n ctx.clearRect(0, 0, canvasWidth, canvasHeight);\n\n let hasTransparency = false;\n const sampleStepY = Math.max(1, rows >> 2);\n const sampleStepX = Math.max(1, cols >> 2);\n outer:\n for (let sampleY = 0; sampleY < rows; sampleY += sampleStepY) {\n const row = frame[sampleY];\n for (let sampleX = 0; sampleX < cols; sampleX += sampleStepX) {\n if (row[sampleX].a < 200) { hasTransparency = true; break outer; }\n }\n }\n\n if (!hasTransparency) {\n ctx.fillStyle = '#0a0a0a';\n ctx.fillRect(0, 0, canvasWidth, canvasHeight);\n }\n\n const cellW = canvasWidth / cols;\n const cellH = canvasHeight / rows;\n const totalCells = rows * cols;\n\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const animationActive = options.animationStyle !== 'none';\n const suppressHover = animationActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n const acR = parseInt(acHex.substring(0, 2), 16) || 255;\n const acG = parseInt(acHex.substring(2, 4), 16) || 255;\n const acB = parseInt(acHex.substring(4, 6), 16) || 255;\n\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6\n : 1;\n const effectiveHoverRadius = options.hoverRadius * radiusScale;\n\n let hoverMinCol = 0, hoverMaxCol = cols, hoverMinRow = 0, hoverMaxRow = rows;\n let hoverPosX = 0, hoverPosY = 0;\n if (hoverActive && hoverPos) {\n hoverPosX = hoverPos.x;\n hoverPosY = hoverPos.y;\n const hoverNormRadius = (0.08 + effectiveHoverRadius * 0.35) + options.hoverStrength * 0.04;\n hoverMinCol = Math.max(0, Math.floor((hoverPosX - hoverNormRadius) * cols) - 1);\n hoverMaxCol = Math.min(cols, Math.ceil((hoverPosX + hoverNormRadius) * cols) + 1);\n hoverMinRow = Math.max(0, Math.floor((hoverPosY - hoverNormRadius) * rows) - 1);\n hoverMaxRow = Math.min(rows, Math.ceil((hoverPosY + hoverNormRadius) * rows) + 1);\n }\n\n const animStyle = options.animationStyle;\n const animSpeed = options.animationSpeed;\n const noAnimation = animStyle === 'none';\n const hoverStrength = options.hoverStrength;\n const hoverEffect = options.hoverEffect;\n const hoverRadiusFactor = effectiveHoverRadius;\n const isInverted = options.invert;\n const colorMode = options.colorMode;\n const TWO_PI = Math.PI * 2;\n const invCols = 1 / cols;\n const invRows = 1 / rows;\n\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n const maxRadius = Math.min(cellW, cellH) * 0.5 * options.dotSizeRatio;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.a < 10) continue;\n\n const lum = (0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b) * 0.00392156863;\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n\n let hoverMul = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverMul = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const radius = maxRadius * intensity * animMul * hoverMul;\n if (radius < 0.3) continue;\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (radius <= 3) {\n const d = radius * 2;\n ctx.fillRect(px - radius, py - radius, d, d);\n } else {\n ctx.beginPath();\n ctx.arc(px, py, radius, 0, TWO_PI);\n ctx.fill();\n }\n }\n }\n } else {\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n const useFastRect = fontSize < 6;\n\n if (!useFastRect) {\n ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n }\n\n let charWeights: Record<string, number> | null = null;\n if (useFastRect) {\n charWeights = {};\n const cs = options.charset;\n const csLen = cs.length;\n for (let i = 0; i < csLen; i++) {\n charWeights[cs[i]] = Math.max(0.1, (i + 0.3) / csLen);\n }\n }\n\n const baseTransform = !useFastRect ? ctx.getTransform() : null;\n\n for (let y = 0; y < rows; y++) {\n const rowData = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = rowData[x];\n if (cell.char === ' ' || cell.a < 10) continue;\n\n const animMul = noAnimation ? 1\n : getAnimationMultiplier(x, y, cols, rows, time, animStyle, animSpeed);\n if (animMul < 0.05) continue;\n\n let hoverScale = 1;\n let hoverOffX = 0;\n let hoverOffY = 0;\n let hoverGlow = 0;\n let hoverBlend = 0;\n\n if (hoverActive && x >= hoverMinCol && x <= hoverMaxCol && y >= hoverMinRow && y <= hoverMaxRow) {\n const fx = computeHoverEffect(\n x * invCols, y * invRows, hoverPosX, hoverPosY, hoverIntensity,\n hoverStrength, cellW, cellH, hoverEffect, hoverRadiusFactor\n );\n hoverScale = fx.scale;\n hoverOffX = fx.offsetX;\n hoverOffY = fx.offsetY;\n hoverGlow = fx.glow;\n hoverBlend = fx.colorBlend;\n }\n\n const px = x * cellW + cellW * 0.5 + hoverOffX;\n const py = y * cellH + cellH * 0.5 + hoverOffY;\n\n let color: string;\n if (hoverBlend > 0) {\n const rgb = getCellColorRGB(cell, colorMode, acR, acG, acB);\n const cr = Math.min(255, (rgb[0] + (hcR - rgb[0]) * hoverBlend) | 0);\n const cg = Math.min(255, (rgb[1] + (hcG - rgb[1]) * hoverBlend) | 0);\n const cb = Math.min(255, (rgb[2] + (hcB - rgb[2]) * hoverBlend) | 0);\n color = `rgb(${cr},${cg},${cb})`;\n } else {\n color = getCellColorStr(cell, colorMode, acR, acG, acB);\n }\n\n if (useFastRect) {\n const weight = charWeights![cell.char] ?? 0.5;\n const effAlpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow)) * weight;\n if (effAlpha < 0.02) continue;\n if (effAlpha !== lastAlpha) { ctx.globalAlpha = effAlpha; lastAlpha = effAlpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n const rw = cellW * hoverScale;\n const rh = cellH * hoverScale;\n ctx.fillRect(px - rw * 0.5, py - rh * 0.5, rw, rh);\n } else {\n const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n if (hoverScale !== 1) {\n ctx.translate(px, py);\n ctx.scale(hoverScale, hoverScale);\n ctx.fillText(cell.char, 0, 0);\n ctx.setTransform(baseTransform!);\n } else {\n ctx.fillText(cell.char, px, py);\n }\n }\n }\n }\n }\n\n ctx.globalAlpha = 1;\n}\n","/**\n * Embed code generation — serializes ASCII frames into self-contained\n * HTML snippets that replay via the CDN embed runtime.\n */\n\nimport type { AsciiOptions, AsciiFrame } from '../types';\n\nexport const EMBED_CDN_VERSION = '1.0.17';\n\n/** Compact frame serialiser.\n * fullcolor → 3 bytes/cell (r,g,b); otherwise 1 byte/cell (luma).\n * First byte is a stride marker so the runtime can auto-detect format.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n const stride = fullColor ? 3 : 1;\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride;\n let i = 1;\n for (let y = 0; y < rows; y++) {\n for (let x = 0; x < cols; x++) {\n const cell = frame[y][x];\n if (fullColor) {\n buf[i++] = cell.r;\n buf[i++] = cell.g;\n buf[i++] = cell.b;\n } else {\n buf[i++] = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n }\n }\n }\n let binary = '';\n for (let j = 0; j < buf.length; j++) binary += String.fromCharCode(buf[j]);\n return btoa(binary);\n}\n\nfunction buildEmbedOpts(\n options: AsciiOptions,\n rows: number,\n cols: number,\n width: number,\n height: number,\n fps?: number,\n animated?: boolean\n): string {\n const o: Record<string, unknown> = {\n r: rows, c: cols, w: width, h: height,\n cs: options.charset,\n cm: options.colorMode,\n as: options.animationStyle,\n sp: options.animationSpeed,\n inv: options.invert,\n hs: options.hoverStrength,\n hr: options.hoverRadius,\n he: options.hoverEffect,\n hc: options.hoverColor,\n dr: options.dotSizeRatio,\n dots: options.renderMode === 'dots',\n };\n if (options.colorMode === 'accent') o.ac = options.accentColor;\n if (fps !== undefined) o.fps = fps;\n if (animated) o.anim = true;\n return JSON.stringify(o);\n}\n\nconst CDN_SCRIPT = `<script src=\"https://cdn.jsdelivr.net/npm/asciify-engine@${EMBED_CDN_VERSION}/dist/embed.js\" async></` + `script>`;\n\n/**\n * Generate a static single-frame embed snippet.\n */\nexport function generateEmbedCode(\n frame: AsciiFrame,\n options: AsciiOptions,\n width: number,\n height: number\n): string {\n const rows = frame.length;\n if (rows === 0) return '';\n const cols = frame[0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const data = serializeFrame(frame, isFullColor);\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height);\n\n return `<!-- Asciify Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">\"${data}\"</script>\n${CDN_SCRIPT}\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate an animated multi-frame embed snippet (GIF / video).\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n if (frames.length === 0) return '';\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isFullColor = options.colorMode === 'fullcolor';\n const allData = frames.map(f => serializeFrame(f, isFullColor));\n const id = `ar-${Math.random().toString(36).slice(2, 9)}`;\n const opts = buildEmbedOpts(options, rows, cols, width, height, fps, true);\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"${id}\" data-asciify-opts='${opts}' width=\"${width}\" height=\"${height}\"></canvas>\n<script type=\"application/json\" id=\"${id}-d\">${JSON.stringify(allData)}</script>\n${CDN_SCRIPT}\n<!-- /Asciify Animated Embed -->`;\n}\n","/**\n * Simple one-call asciify API.\n * Wraps imageToAsciiFrame + renderFrameToCanvas behind easy-to-use helpers.\n */\n\nimport type { AsciiOptions, ArtStyle } from '../types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from '../types';\nimport { imageToAsciiFrame, videoToAsciiFrames, gifToAsciiFrames, renderFrameToCanvas } from './renderer';\n\nexport { videoToAsciiFrames, gifToAsciiFrames };\n\nexport interface AsciifySimpleOptions {\n /** Character size in pixels. Default: 10 */\n fontSize?: number;\n /** Art style preset. Default: 'classic' */\n style?: ArtStyle;\n /** Extra options to merge on top of the preset */\n options?: Partial<AsciiOptions>;\n}\n\n/**\n * Convert an image/video/canvas element to ASCII art and render it onto a canvas.\n *\n * @example\n * await asciify(document.querySelector('img'), canvas);\n * await asciify(img, canvas, { fontSize: 8, style: 'letters' });\n */\nexport async function asciify(\n source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<void> {\n let el: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n if (typeof source === 'string') {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n await new Promise<void>((resolve, reject) => {\n img.onload = () => resolve();\n img.onerror = () => reject(new Error(`Failed to load image: ${source}`));\n img.src = source;\n });\n el = img;\n } else if (source instanceof HTMLImageElement && !source.complete) {\n await new Promise<void>((resolve, reject) => {\n source.onload = () => resolve();\n source.onerror = () => reject(new Error('Image failed to load'));\n });\n el = source;\n } else {\n el = source;\n }\n\n const preset = ART_STYLE_PRESETS[style];\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...preset, ...options, fontSize };\n\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frame } = imageToAsciiFrame(el, merged, canvas.width, canvas.height);\n renderFrameToCanvas(ctx, frame, merged, canvas.width, canvas.height);\n}\n\n/**\n * Fetch a GIF, convert it to ASCII, and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyGif('animation.gif', canvas);\n * // later: stop();\n */\nexport async function asciifyGif(\n source: string | ArrayBuffer,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n const buffer = typeof source === 'string'\n ? await fetch(source).then(r => r.arrayBuffer())\n : source;\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await gifToAsciiFrames(buffer, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n\n/**\n * Convert a video element to ASCII art and start an animation loop on a canvas.\n * Returns a `stop()` function that cancels the loop.\n *\n * @example\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n */\nexport async function asciifyVideo(\n source: HTMLVideoElement | string,\n canvas: HTMLCanvasElement,\n { fontSize = 10, style = 'classic', options = {} }: AsciifySimpleOptions = {}\n): Promise<() => void> {\n let video: HTMLVideoElement;\n if (typeof source === 'string') {\n video = document.createElement('video');\n video.crossOrigin = 'anonymous';\n video.src = source;\n await new Promise<void>((resolve, reject) => {\n video.onloadeddata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${source}`));\n });\n } else {\n video = source;\n }\n\n const merged: AsciiOptions = { ...DEFAULT_OPTIONS, ...ART_STYLE_PRESETS[style], ...options, fontSize };\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2d context from canvas');\n\n const { frames, fps } = await videoToAsciiFrames(video, merged, canvas.width, canvas.height);\n\n let cancelled = false;\n let animId: number;\n let i = 0;\n let last = performance.now();\n const interval = 1000 / fps;\n\n const tick = (now: number) => {\n if (cancelled) return;\n if (now - last >= interval) {\n renderFrameToCanvas(ctx, frames[i], merged, canvas.width, canvas.height);\n i = (i + 1) % frames.length;\n last = now;\n }\n animId = requestAnimationFrame(tick);\n };\n animId = requestAnimationFrame(tick);\n\n return () => { cancelled = true; cancelAnimationFrame(animId); };\n}\n","/**\n * renderRainBackground — digital column rain (Matrix-style).\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00') */\n accentColor?: string;\n /** Custom character colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Fraction of columns active at once 0-1 (default: 0.55) */\n density?: number;\n /** Number of cells in the fading tail (default: 14) */\n tailLength?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderRainBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: RainBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = '0123456789ABCDEF@#$&*+=/<>',\n accentColor = '#d4ff00',\n color,\n speed = 1,\n density = 0.55,\n tailLength = 14,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) {\n const p = parseColor(color);\n if (p) { br = p.r; bg = p.g; bb = p.b; }\n }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const period = rows + tailLength;\n\n for (let c = 0; c < cols; c++) {\n if (hash2(c * 17, 3) > density) continue;\n\n const colSpeed = (0.5 + hash2(c * 31, 7) * 1.5) * speed;\n const phase = hash2(c * 13, 11) * period;\n const headRow = Math.floor((time * colSpeed * 7 + phase) % period);\n const x = c * charW;\n\n for (let k = 0; k <= tailLength; k++) {\n const row = headRow - (tailLength - k);\n if (row < 0 || row >= rows) continue;\n\n const y = row * lineH;\n const charSeed = hash2(c * 53 + Math.floor(time * 5 + k), row * 7);\n const ch = chars[Math.floor(charSeed * chars.length)];\n const tRatio = k / tailLength;\n\n if (k === tailLength) {\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n const alpha = lightMode ? tRatio * 0.85 : tRatio * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n","/**\n * renderStarsBackground — 3-D star-warp / hyperspace ASCII effect.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Global speed multiplier (default: 1) */\n speed?: number;\n /** Number of star particles (default: 180) */\n count?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderStarsBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: StarsBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' . · * + ° ★',\n accentColor = '#d4ff00',\n color,\n speed = 1,\n count = 180,\n lightMode = false,\n } = options;\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * (0.2 + mousePos.x * 0.6);\n const cy = height * (0.2 + mousePos.y * 0.6);\n const maxR = Math.sqrt(width * width + height * height) * 0.65;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n for (let i = 0; i < count; i++) {\n const angle = hash2(i * 17, 3) * Math.PI * 2;\n const baseSpd = 0.15 + hash2(i * 31, 7) * 0.85;\n const phase = hash2(i * 13, 11);\n\n const r = ((time * baseSpd * speed * 0.22 + phase) % 1.0);\n\n const x = cx + Math.cos(angle) * r * maxR;\n const y = cy + Math.sin(angle) * r * maxR;\n\n if (x < -20 || x > width + 20 || y < -20 || y > height + 20) continue;\n\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n const isAccent = r > 0.72;\n const alpha = lightMode ? r * 0.85 : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.92 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderPulseBackground — concentric ASCII ring pulses emanating from the cursor.\n */\nimport { parseColor } from './_shared';\n\nexport interface PulseBackgroundOptions {\n fontSize?: number;\n /** Characters to tile (default: '. · ○ ◎ ●') */\n chars?: string;\n /** Ring peak colour (default: '#00ffcc') */\n accentColor?: string;\n /** Custom base colour */\n color?: string;\n /** Number of simultaneous rings (default: 5) */\n rings?: number;\n /** Animation speed (default: 1) */\n speed?: number;\n /** Ring edge sharpness 1–10 (default: 4) */\n sharpness?: number;\n /** Light mode (default: false) */\n lightMode?: boolean;\n}\n\nexport function renderPulseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: PulseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = '. · ○ ◎ ●',\n accentColor = '#00ffcc',\n color,\n rings = 5,\n speed = 1,\n sharpness = 4,\n lightMode = false,\n } = options;\n\n ctx.clearRect(0, 0, width, height);\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n\n const cx = width * mousePos.x;\n const cy = height * mousePos.y;\n const maxDist = Math.sqrt(cx * cx + cy * cy) * 1.6 + Math.sqrt(width * width + height * height) * 0.2;\n\n let br = 255, bg = 255, bb = 255;\n if (lightMode) { br = 0; bg = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bg = p.g; bb = p.b; } }\n\n let acR = 0, acG = 255, acB = 204;\n const ap = parseColor(accentColor);\n if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const charArr = chars.replace(/ /g,'').split('');\n if (charArr.length === 0) return;\n\n const cols = Math.ceil(width / fontSize);\n const rows = Math.ceil(height / fontSize);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const px = col * fontSize + fontSize * 0.5;\n const py = row * fontSize + fontSize * 0.5;\n const dx = px - cx;\n const dy = py - cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const norm = dist / maxDist; // 0..1+\n\n let totalIntensity = 0;\n for (let r = 0; r < rings; r++) {\n const phase = r / rings;\n const t = ((time * speed * 0.38 + phase) % 1.0);\n const ringDist = Math.abs(norm - t);\n const ringNorm = Math.max(0, 1 - ringDist * maxDist / (fontSize * (12 - sharpness)));\n totalIntensity += Math.cos(ringNorm * Math.PI * 0.5) * ringNorm;\n }\n totalIntensity = Math.min(1, totalIntensity);\n\n if (totalIntensity < 0.02) continue;\n\n const isAccent = totalIntensity > 0.6;\n ctx.font = `${fontSize}px monospace`;\n const charIdx = Math.floor(totalIntensity * (charArr.length - 1));\n const ch = charArr[Math.min(charIdx, charArr.length - 1)];\n const alpha = lightMode ? totalIntensity * 0.88 : totalIntensity * 0.22;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.95 : 0.4, totalIntensity * 0.55)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, px, py);\n }\n }\n\n ctx.textAlign = 'left';\n}\n","/**\n * renderNoiseBackground — slow-drifting organic fractal noise field.\n * No directional pattern — pure ambient texture. Mouse warps the field.\n */\nimport { parseColor, vnoise } from './_shared';\n\nexport interface NoiseBackgroundOptions {\n /** Font size in CSS pixels (default: 14). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .·:;=+*#%@░▒▓'). */\n chars?: string;\n /** Accent colour on intensity peaks (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of noise octaves for FBM detail (default: 4, max: 6). */\n octaves?: number;\n /** Drift / scroll speed (default: 1). */\n speed?: number;\n /** Noise scale — lower = larger blobs (default: 1). */\n scale?: number;\n /** Accent threshold 0-1 (default: 0.78). */\n accentThreshold?: number;\n /** Mouse warp radius 0-1 (default: 0.3). */\n mouseWarp?: number;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderNoiseBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: NoiseBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' .·:;=+*#%@░▒▓',\n accentColor = '#d4ff00',\n color,\n octaves = 4,\n speed = 1,\n scale = 1,\n accentThreshold = 0.78,\n mouseWarp = 0.3,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgc = 255, bb = 255;\n if (lightMode) { br = 0; bgc = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgc = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const noiseScale = 0.035 * scale;\n const t = time * speed;\n const oct = Math.min(6, Math.max(1, octaves));\n\n // FBM with configurable octaves\n const fbmN = (x: number, y: number): number => {\n let v = 0, amp = 0.5, freq = 1, norm = 0;\n for (let o = 0; o < oct; o++) {\n v += vnoise(x * freq, y * freq) * amp;\n norm += amp;\n amp *= 0.5;\n freq *= 2.1;\n }\n return v / norm; // -1..1\n };\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const nx = col * noiseScale + t * 0.06;\n const ny = row * noiseScale * 1.3 - t * 0.04;\n\n // Mouse warp: displace sample coords near cursor\n const dx = col / cols - mousePos.x;\n const dy = row / rows - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const warp = mouseWarp > 0 ? Math.max(0, 1 - dist / mouseWarp) * 0.12 : 0;\n const wx = nx + warp * Math.sin(t * 1.3 + dy * 8);\n const wy = ny + warp * Math.cos(t * 0.9 + dx * 8);\n\n const raw = fbmN(wx, wy); // -1..1\n const norm2 = raw * 0.5 + 0.5; // 0..1\n\n if (norm2 < 0.12) continue;\n\n const charIdx = Math.floor(norm2 * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = norm2 > accentThreshold;\n const alpha = lightMode ? norm2 * 0.82 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderGridBackground — CRT-style horizontal scan-line sweep.\n * Bright scan bands travel downward continuously; cursor creates a local glitch zone.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface GridBackgroundOptions {\n /** Font size in CSS pixels (default: 12). */\n fontSize?: number;\n /** Character set (default: '·-=+|/'). */\n chars?: string;\n /** Accent / scan-band colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of scan bands visible at once (default: 3). */\n bands?: number;\n /** Band travel speed (default: 1). */\n speed?: number;\n /** Band width as fraction of canvas height (default: 0.12). */\n bandWidth?: number;\n /** Enable cursor disruption glitch zone (default: true). */\n glitch?: boolean;\n /** Light mode (default: false). */\n lightMode?: boolean;\n}\n\nexport function renderGridBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: GridBackgroundOptions = {},\n): void {\n const {\n fontSize = 12,\n chars = '·-=+|/',\n accentColor = '#d4ff00',\n color,\n bands = 3,\n speed = 1,\n bandWidth = 0.12,\n glitch = true,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let br = 255, bgv = 255, bb = 255;\n if (lightMode) { br = 0; bgv = 0; bb = 0; }\n if (color) { const p = parseColor(color); if (p) { br = p.r; bgv = p.g; bb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n const ny = row / rows;\n\n // Scan-band phase: bands cycle 0→1 over time\n const scanPhase = ((ny * bands - t * 0.5) % 1.0 + 1.0) % 1.0;\n // Intensity spike at scanPhase ≈ 0 (leading edge)\n const bandIntensity = Math.max(0, 1 - scanPhase / bandWidth);\n\n // Base grid texture via hash\n const gridSeed = hash2(col * 3, row * 7);\n const gridBase = (gridSeed * 0.5 + 0.5) * 0.35;\n\n // Cursor glitch zone\n let glitchBump = 0;\n if (glitch) {\n const dx = col / cols - mousePos.x;\n const dy = ny - mousePos.y;\n const d = Math.sqrt(dx * dx + dy * dy);\n if (d < 0.18) {\n const g = hash2(col * 11 + Math.floor(t * 12), row * 5);\n glitchBump = Math.max(0, 1 - d / 0.18) * (g > 0.5 ? g - 0.3 : 0);\n }\n }\n\n const intensity = Math.min(1, gridBase + bandIntensity * 0.8 + glitchBump * 0.6);\n if (intensity < 0.04) continue;\n\n const charIdx = Math.floor(intensity * (chars.length - 1));\n const ch = chars[charIdx];\n\n const isAccent = bandIntensity > 0.55;\n const alpha = lightMode ? intensity * 0.82 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderAuroraBackground — premium slow-drifting light bands.\n * Multiple sine layers create smooth organic interference patterns —\n * like silk, aurora borealis, or light through water.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. */\n chars?: string;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Number of wave layers stacked. More = richer interference. Default 5. */\n layers?: number;\n /** Wave spread/softness — higher = broader, more diffuse bands. Default 1.2. */\n softness?: number;\n /** Mouse distortion radius (0–1). Elegant ripple that follows the cursor. Default 0.2. */\n mouseRipple?: number;\n /** Force light mode (dark chars on light bg). Default false. */\n lightMode?: boolean;\n}\n\nexport function renderAuroraBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: AuroraBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:;+=≡≣#@',\n color,\n accentColor = '#d4ff00',\n speed = 1,\n layers = 5,\n softness = 1.2,\n mouseRipple = 0.2,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Pre-bake layer parameters — each layer has unique freq, direction, phase offset\n const layerParams: Array<{ fx: number; fy: number; phase: number; dt: number; amp: number }> = [];\n for (let l = 0; l < layers; l++) {\n const seed = hash2(l * 17, l * 31 + 7);\n const seed2 = hash2(l * 23 + 5, l * 11);\n layerParams.push({\n fx: 0.8 + seed * 2.2,\n fy: 1.2 + seed2 * 1.8,\n phase: seed * Math.PI * 4,\n dt: (0.3 + hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1),\n amp: 0.55 + hash2(l * 29, l * 3) * 0.45,\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Mouse distortion: gaussian lens warp\n const mdx = nx - mousePos.x;\n const mdy = ny - mousePos.y;\n const md = Math.sqrt(mdx * mdx + mdy * mdy);\n const warp = mouseRipple * Math.exp(-md * md / 0.06);\n const wx = nx + mdx * warp;\n const wy = ny + mdy * warp;\n\n // Sum wave layers\n let sum = 0;\n let totalAmp = 0;\n for (let l = 0; l < layers; l++) {\n const { fx, fy, phase, dt, amp } = layerParams[l];\n const wave = Math.sin(wx * fx * Math.PI * 2 + t * dt + phase)\n * Math.cos(wy * fy * Math.PI * 2 + t * dt * 0.7 + phase * 1.3);\n sum += wave * amp;\n totalAmp += amp;\n }\n\n // Normalise to 0→1 with soft sigmoid\n const rawVal = sum / totalAmp;\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n if (curved < 0.12) continue;\n\n const normalized = (curved - 0.12) / 0.88;\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = curved > 0.82;\n const alpha = lightMode ? curved * 0.82 : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderSilkBackground — smooth directional flow-field ribbons.\n * Each cell reads its angle from a slow-drifting vector field.\n * No mouse interaction by design — pure ambient texture.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface SilkBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Base character color. Default theme-aware white/black. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.4 (intentionally slow). */\n speed?: number;\n /** Number of flow-field layers. More = richer ribbons. Default 4. */\n layers?: number;\n /** Flow turbulence (0–2). Higher = more folded, tangled ribbons. Default 0.8. */\n turbulence?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderSilkBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: SilkBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n color,\n accentColor = '#d4ff00',\n speed = 0.4,\n layers = 4,\n turbulence = 0.8,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Direction chars: flow-angle-mapped for the ribbon illusion\n const dirChars = ['─', '─', '╌', '·', '╌', '─', '─', '╌', '·'];\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n // Stack multiple sine-based flow layers\n let angleSum = 0;\n let intensitySum = 0;\n for (let l = 0; l < layers; l++) {\n const ls = hash2(l * 13, l * 7 + 3);\n const ls2 = hash2(l * 29, l * 11 + 1);\n const fx = 1.1 + ls * 2.4;\n const fy = 0.9 + ls2 * 2.0;\n const ph = ls * Math.PI * 6;\n const dr = (0.2 + hash2(l * 41, l * 17) * 0.5) * (l % 2 === 0 ? 1 : -1.3);\n\n const u = Math.sin(nx * fx * Math.PI * 2 + t * dr + ph);\n const v = Math.cos(ny * fy * Math.PI * 2 + t * dr * 0.6 + ph * 1.7);\n\n const cross = Math.sin(nx * fy * Math.PI * turbulence + ny * fx * Math.PI * turbulence + t * dr * 0.4);\n\n angleSum += Math.atan2(v + cross * 0.3, u);\n intensitySum += (u * v + 1) * 0.5;\n }\n\n const angle = angleSum / layers;\n const intensity = Math.min(1, intensitySum / layers);\n\n if (intensity < 0.1) continue;\n\n const angleNorm = (angle + Math.PI) / (Math.PI * 2);\n const charIdx = Math.floor(angleNorm * dirChars.length) % dirChars.length;\n const ch = dirChars[charIdx];\n\n const isAccent = intensity > 0.80;\n const alpha = lightMode ? intensity * 0.80 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.90 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderVoidBackground — gravitational singularity follows the cursor.\n * Characters are pulled inward and spiral around the attractor.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface VoidBackgroundOptions {\n /** Character grid density. Default 13. */\n fontSize?: number;\n /** Character ramp. Default space-to-dense. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for the inner singularity ring. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 1. */\n speed?: number;\n /** Gravity well radius (fraction of canvas width). Default 0.38. */\n radius?: number;\n /** Spiral tightness — higher = more rotation per unit distance. Default 3. */\n swirl?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderVoidBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n mousePos: { x: number; y: number } = { x: 0.5, y: 0.5 },\n options: VoidBackgroundOptions = {},\n): void {\n const {\n fontSize = 13,\n chars = ' ·:;=+*#%@',\n color,\n accentColor = '#d4ff00',\n speed = 1,\n radius = 0.38,\n swirl = 3,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n const aspect = width / height;\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows;\n for (let col = 0; col < cols; col++) {\n const nx = col / cols;\n\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n const r = dist / radius;\n\n // Outside radius: very faint scattered field\n if (r > 1) {\n const outerNoise = hash2(col * 3, row * 7) * Math.max(0, 1 - (r - 1) * 3);\n if (outerNoise < 0.62) continue;\n const alpha = outerNoise * (lightMode ? 0.28 : 0.04);\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(chars[1], col * charW, row * lineH);\n continue;\n }\n\n // Spiral displacement: angle rotates faster near center\n const baseAngle = Math.atan2(dy, dx * aspect);\n const swirlAmt = (1 - r) * swirl;\n const angle = baseAngle + swirlAmt + t * 0.4;\n\n // Intensity: rises sharply toward center, with animated pulse ring\n const pulseRing = Math.max(0, 1 - Math.abs(r - (0.15 + 0.12 * Math.sin(t * 1.1))) / 0.07);\n const gravity = Math.pow(1 - r, 2.2);\n const intensity = Math.min(1, gravity + pulseRing * 0.6);\n\n if (intensity < 0.06) continue;\n\n void angle; // angle influences char variety at mid-range (kept for future use)\n const densityI = Math.floor(intensity * (chars.length - 1));\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx];\n\n const isAccent = pulseRing > 0.35 || r < 0.08;\n const alpha = lightMode ? intensity * 0.85 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.95 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * renderMorphBackground — per-cell multi-frequency oscillation.\n * Each cell uses a unique rhythm. Pure ambient texture. No mouse interaction.\n */\nimport { parseColor, hash2 } from './_shared';\n\nexport interface MorphBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp. Default clean gradient. */\n chars?: string;\n /** Base character color. Default theme-aware. */\n color?: string;\n /** Accent color for intensity peaks. Default '#d4ff00'. */\n accentColor?: string;\n /** Animation speed multiplier. Default 0.5 (intentionally slow). */\n speed?: number;\n /** How many frequency harmonics per cell. More = richer shimmer. Default 3. */\n harmonics?: number;\n /** Force light mode. Default false. */\n lightMode?: boolean;\n}\n\nexport function renderMorphBackground(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n time: number,\n options: MorphBackgroundOptions = {},\n): void {\n const {\n fontSize = 14,\n chars = ' ·∙•:-=+*#',\n color,\n accentColor = '#d4ff00',\n speed = 0.5,\n harmonics = 3,\n lightMode = false,\n } = options;\n\n const charW = fontSize * 0.62;\n const lineH = fontSize * 1.4;\n const cols = Math.ceil(width / charW);\n const rows = Math.ceil(height / lineH);\n\n ctx.clearRect(0, 0, width, height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = 'top';\n\n let cr = 255, cg = 255, cb = 255;\n if (lightMode) { cr = 0; cg = 0; cb = 0; }\n if (color) { const p = parseColor(color); if (p) { cr = p.r; cg = p.g; cb = p.b; } }\n let acR = 212, acG = 255, acB = 0;\n const ap = parseColor(accentColor); if (ap) { acR = ap.r; acG = ap.g; acB = ap.b; }\n\n const t = time * speed;\n\n // Max possible sum: sum(1/(h+1)) for h=0..harmonics-1\n const maxV = Array.from({ length: harmonics }, (_, h) => 1 / (h + 1)).reduce((a, b) => a + b, 0);\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < cols; col++) {\n // Each cell gets unique frequency seeds derived from its position\n let v = 0;\n for (let h = 0; h < harmonics; h++) {\n const fBase = hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4;\n const phase = hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n const norm = (v / maxV + 1) * 0.5; // 0→1\n\n if (norm < 0.28) continue;\n\n const remapped = (norm - 0.28) / 0.72;\n const charIdx = Math.min(chars.length - 1, Math.floor(remapped * chars.length));\n const ch = chars[charIdx];\n\n const isAccent = norm > 0.88;\n const alpha = lightMode ? remapped * 0.82 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.92 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n","/**\n * ASCII Background — public entry point for the backgrounds sub-system.\n *\n * Exports:\n * - All 10 render functions\n * - All 10 option interfaces\n * - `AsciiBackgroundOptions` — combined union type + mount options\n * - `asciiBackground()` — the drop-in mount helper\n * - `mountWaveBackground` / `MountWaveOptions` — deprecated aliases\n */\n\nexport type { WaveBackgroundOptions } from './wave';\nexport { renderWaveBackground } from './wave';\n\nexport type { RainBackgroundOptions } from './rain';\nexport { renderRainBackground } from './rain';\n\nexport type { StarsBackgroundOptions } from './stars';\nexport { renderStarsBackground } from './stars';\n\nexport type { PulseBackgroundOptions } from './pulse';\nexport { renderPulseBackground } from './pulse';\n\nexport type { NoiseBackgroundOptions } from './noise';\nexport { renderNoiseBackground } from './noise';\n\nexport type { GridBackgroundOptions } from './grid';\nexport { renderGridBackground } from './grid';\n\nexport type { AuroraBackgroundOptions } from './aurora';\nexport { renderAuroraBackground } from './aurora';\n\nexport type { SilkBackgroundOptions } from './silk';\nexport { renderSilkBackground } from './silk';\n\nexport type { VoidBackgroundOptions } from './void';\nexport { renderVoidBackground } from './void';\n\nexport type { MorphBackgroundOptions } from './morph';\nexport { renderMorphBackground } from './morph';\n\nimport { renderWaveBackground } from './wave';\nimport type { WaveBackgroundOptions } from './wave';\nimport { renderRainBackground } from './rain';\nimport type { RainBackgroundOptions } from './rain';\nimport { renderStarsBackground } from './stars';\nimport type { StarsBackgroundOptions } from './stars';\nimport { renderPulseBackground } from './pulse';\nimport type { PulseBackgroundOptions } from './pulse';\nimport { renderNoiseBackground } from './noise';\nimport type { NoiseBackgroundOptions } from './noise';\nimport { renderGridBackground } from './grid';\nimport type { GridBackgroundOptions } from './grid';\nimport { renderAuroraBackground } from './aurora';\nimport type { AuroraBackgroundOptions } from './aurora';\nimport { renderSilkBackground } from './silk';\nimport type { SilkBackgroundOptions } from './silk';\nimport { renderVoidBackground } from './void';\nimport type { VoidBackgroundOptions } from './void';\nimport { renderMorphBackground } from './morph';\nimport type { MorphBackgroundOptions } from './morph';\n\n// Inline _parseColor for the inject helper (avoids circular dep through _shared re-export)\nfunction _parseColor(c: string): { r: number; g: number; b: number } | null {\n const hex = c.match(/^#([0-9a-f]{3,8})$/i)?.[1];\n if (hex) {\n const h = hex.length <= 4\n ? hex.split('').map(x => parseInt(x + x, 16))\n : [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];\n return { r: h[0], g: h[1], b: h[2] };\n }\n const rgb = c.match(/rgba?\\(\\s*(\\d+)[,\\s]+(\\d+)[,\\s]+(\\d+)/i);\n if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };\n return null;\n}\n\n/**\n * Combined options for `asciiBackground()`. Extends all 10 background option\n * interfaces so every background's options can be passed through one object.\n */\nexport interface AsciiBackgroundOptions extends\n WaveBackgroundOptions,\n RainBackgroundOptions,\n StarsBackgroundOptions,\n PulseBackgroundOptions,\n NoiseBackgroundOptions,\n GridBackgroundOptions,\n AuroraBackgroundOptions,\n SilkBackgroundOptions,\n VoidBackgroundOptions,\n MorphBackgroundOptions\n{\n /**\n * Which background to render (default: 'wave').\n * - 'wave' — interactive ASCII field with vortex, sparkles, breathe\n * - 'rain' — digital column rain (Matrix-style falling characters)\n * - 'stars' — 3D star-warp / hyperspace chars fly toward the viewer\n * - 'pulse' — concentric ASCII ripples radiating from the mouse\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n * - 'aurora' — premium slow-drifting light bands\n * - 'silk' — smooth directional flow-field ribbons\n * - 'void' — gravitational singularity follows the cursor\n * - 'morph' — per-cell multi-frequency shimmer\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid' | 'aurora' | 'silk' | 'void' | 'morph';\n /** CSS opacity applied to the canvas element (default: 0.2) */\n opacity?: number;\n /** Extra CSS class names added to the injected canvas */\n className?: string;\n /** z-index of the canvas (default: 0) */\n zIndex?: number;\n /**\n * Colour scheme handling (default: 'auto').\n * - 'auto' — follows system prefers-color-scheme and updates live\n * - 'dark' — always render bright chars on dark background\n * - 'light' — always render dark chars on light background\n */\n colorScheme?: 'auto' | 'light' | 'dark';\n /**\n * Custom character colour. Accepts any CSS colour string: hex, rgb(), hsl().\n * Overrides the default white/black for ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/**\n * Drop-in helper that mounts an interactive ASCII background onto any element.\n * Injects a canvas, wires DPR resize, mouse tracking, and the RAF loop.\n * Auto-detects light/dark mode and stays in sync if the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport function asciiBackground(\n target: string | HTMLElement | null,\n options: AsciiBackgroundOptions = {},\n): { destroy: () => void } {\n const {\n type = 'wave',\n opacity = 0.2,\n className,\n zIndex = 0,\n colorScheme = 'auto',\n color,\n ...renderOpts\n } = options;\n\n const container = typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n\n if (!container) {\n console.warn('[asciify] asciiBackground: target not found', target);\n return { destroy: () => {} };\n }\n\n const prevPosition = container.style.position;\n if (getComputedStyle(container).position === 'static') {\n container.style.position = 'relative';\n }\n\n const canvas = document.createElement('canvas');\n canvas.style.cssText = [\n 'position:absolute', 'inset:0', 'width:100%', 'height:100%',\n `opacity:${opacity}`, 'pointer-events:none', `z-index:${zIndex}`,\n ].join(';');\n if (className) canvas.className = className;\n container.prepend(canvas);\n\n const ctx = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n const mouse = { x: 0.5, y: 0.5 };\n const smoothMouse = { x: 0.5, y: 0.5 };\n\n // ── Color scheme ──\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const isLight = (): boolean => {\n if (colorScheme === 'light') return true;\n if (colorScheme === 'dark') return false;\n return mq.matches;\n };\n\n const parsedColor = color ? _parseColor(color) : null;\n\n type AnyRenderOpts =\n | WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions\n | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions\n | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions\n | MorphBackgroundOptions;\n\n const buildWaveOpts = (): WaveBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n baseColor: parsedColor\n ? `rgba(${parsedColor.r},${parsedColor.g},${parsedColor.b},{a})`\n : (renderOpts as WaveBackgroundOptions).baseColor,\n });\n const buildRainOpts = (): RainBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as RainBackgroundOptions).color,\n });\n const buildStarsOpts = (): StarsBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as StarsBackgroundOptions).color,\n });\n const buildPulseOpts = (): PulseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as PulseBackgroundOptions).color,\n });\n const buildNoiseOpts = (): NoiseBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as NoiseBackgroundOptions).color,\n });\n const buildGridOpts = (): GridBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as GridBackgroundOptions).color,\n });\n const buildAuroraOpts = (): AuroraBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as AuroraBackgroundOptions).color,\n });\n const buildSilkOpts = (): SilkBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as SilkBackgroundOptions).color,\n });\n const buildVoidOpts = (): VoidBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as VoidBackgroundOptions).color,\n });\n const buildMorphOpts = (): MorphBackgroundOptions => ({\n ...renderOpts,\n lightMode: renderOpts.lightMode !== undefined ? renderOpts.lightMode : isLight(),\n color: color ?? (renderOpts as MorphBackgroundOptions).color,\n });\n\n const optsRef = { current: buildWaveOpts() as AnyRenderOpts };\n const rebuildOpts = () => {\n if (type === 'rain') optsRef.current = buildRainOpts();\n else if (type === 'stars') optsRef.current = buildStarsOpts();\n else if (type === 'pulse') optsRef.current = buildPulseOpts();\n else if (type === 'noise') optsRef.current = buildNoiseOpts();\n else if (type === 'grid') optsRef.current = buildGridOpts();\n else if (type === 'aurora') optsRef.current = buildAuroraOpts();\n else if (type === 'silk') optsRef.current = buildSilkOpts();\n else if (type === 'void') optsRef.current = buildVoidOpts();\n else if (type === 'morph') optsRef.current = buildMorphOpts();\n else optsRef.current = buildWaveOpts();\n };\n rebuildOpts();\n\n const onSchemeChange = () => { rebuildOpts(); };\n if (colorScheme === 'auto') mq.addEventListener('change', onSchemeChange);\n\n const resize = () => {\n const r = container.getBoundingClientRect();\n canvas.width = r.width * dpr;\n canvas.height = r.height * dpr;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n };\n resize();\n\n const onMouseMove = (e: MouseEvent) => {\n const r = container.getBoundingClientRect();\n mouse.x = (e.clientX - r.left) / r.width;\n mouse.y = (e.clientY - r.top) / r.height;\n };\n const ro = new ResizeObserver(resize);\n ro.observe(container);\n window.addEventListener('mousemove', onMouseMove);\n\n let time = 0;\n let raf = 0;\n const tick = () => {\n smoothMouse.x += (mouse.x - smoothMouse.x) * 0.07;\n smoothMouse.y += (mouse.y - smoothMouse.y) * 0.07;\n const r = container.getBoundingClientRect();\n\n if (type === 'rain') {\n renderRainBackground(ctx, r.width, r.height, time, optsRef.current as RainBackgroundOptions);\n } else if (type === 'stars') {\n renderStarsBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as StarsBackgroundOptions);\n } else if (type === 'pulse') {\n renderPulseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as PulseBackgroundOptions);\n } else if (type === 'noise') {\n renderNoiseBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as NoiseBackgroundOptions);\n } else if (type === 'grid') {\n renderGridBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as GridBackgroundOptions);\n } else if (type === 'aurora') {\n renderAuroraBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as AuroraBackgroundOptions);\n } else if (type === 'silk') {\n renderSilkBackground(ctx, r.width, r.height, time, optsRef.current as SilkBackgroundOptions);\n } else if (type === 'void') {\n renderVoidBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as VoidBackgroundOptions);\n } else if (type === 'morph') {\n renderMorphBackground(ctx, r.width, r.height, time, optsRef.current as MorphBackgroundOptions);\n } else {\n renderWaveBackground(ctx, r.width, r.height, time, smoothMouse, optsRef.current as WaveBackgroundOptions);\n }\n\n time += 0.016;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n return {\n destroy: () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n if (colorScheme === 'auto') mq.removeEventListener('change', onSchemeChange);\n window.removeEventListener('mousemove', onMouseMove);\n canvas.remove();\n container.style.position = prevPosition;\n },\n };\n}\n\n/** @deprecated Use `asciiBackground` instead. */\nexport const mountWaveBackground = asciiBackground;\n\n/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n","// ─── Asciify WebGL Renderer ───────────────────────────────────────\n// GPU-accelerated drop-in replacement for renderFrameToCanvas.\n// All cells rendered in ONE instanced draw call per frame.\n// Animation + hover effects computed entirely in GLSL shaders.\n// No glyph atlas — uses solid rect/dots per cell (matches Canvas2D fillRect fast path).\n// Falls back gracefully to null if WebGL2 is unavailable.\n\nimport type { AsciiFrame, AsciiOptions } from './types';\n\n// ─── Types ────────────────────────────────────────────────────────\n\nexport interface WebGLRenderer {\n render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void;\n /** Call when options or the source frame has changed to invalidate cell data cache. */\n notifyDirty(): void;\n destroy(): void;\n}\n\n// ─── Vertex Shader ────────────────────────────────────────────────\n// One instance = one cell. Position, animation, hover, color all computed on GPU.\n// Cell data arrives as a single RGBA8 texture:\n// .rgb = cell color (normalized 0-1)\n// .a = char weight (0=space/invisible … 1=densest char, fully opaque)\n\nconst VERT_SRC = /* glsl */`#version 300 es\nprecision highp float;\nprecision highp int;\n\n// Unit quad corners: (-0.5,-0.5) to (0.5,0.5) - TRIANGLE_STRIP, 4 verts\nin vec2 a_corner;\n\n// Layout\nuniform vec2 u_canvasSize;\nuniform vec2 u_gridSize;\nuniform vec2 u_cellSize;\n\n// Animation\nuniform float u_time;\nuniform float u_animSpeed;\nuniform int u_animStyle;\n\n// Color\nuniform int u_colorMode;\nuniform vec3 u_accentColor;\nuniform int u_invert;\n\n// Hover\nuniform float u_hoverStrength;\nuniform float u_hoverIntensity;\nuniform vec2 u_hoverPos;\nuniform float u_hoverRadius;\nuniform int u_hoverEffect;\nuniform vec3 u_hoverColor;\n\n// Render mode: 0=rect 1=dots\nuniform int u_renderMode;\nuniform float u_dotSizeRatio;\n\n// Cell data: RGBA8 texture (cols x rows)\n// rgb = cell colour, a = source alpha\nuniform sampler2D u_cellTex;\n\nout vec4 v_color;\nout float v_alpha;\nout vec2 v_localUv;\n\n#define PI 3.141592653589793\n\nfloat ss(float t) { return t * t * (3.0 - 2.0 * t); }\n\nfloat getAnim(float nx, float ny, float cx, float cy, float t) {\n if (u_animStyle == 0) return 1.0;\n if (u_animStyle == 1) { // wave\n return 0.3 + 0.7 * (sin(nx * PI * 4.0 + t * 3.0) * 0.3 + 0.5\n + sin(ny * PI * 3.0 + t * 2.0) * 0.2);\n }\n if (u_animStyle == 2) { // pulse\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.2 + 0.8 * (sin(d * PI * 6.0 - t * 4.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 3) { // rain\n float drop = sin(ny * PI * 8.0 - t * 5.0 + cx * 0.3) * 0.5 + 0.5;\n return 0.1 + 0.9 * drop * (sin(nx * PI * 2.0 + t) * 0.3 + 0.7);\n }\n if (u_animStyle == 4) { // breathe\n return clamp(sin(t * 2.0) * 0.3 + 0.7 + sin((cx + cy) * 0.1 + t) * 0.1, 0.1, 1.0);\n }\n if (u_animStyle == 5) { // sparkle\n float sp = fract(sin(cx * 127.1 + cy * 311.7 + floor(t * 8.0) * 43758.5453) * 43758.5453);\n return sp > 0.7 ? 1.0 : 0.15 + sp * 0.4;\n }\n if (u_animStyle == 6) { // glitch\n float band = floor(cy / max(1.0, u_gridSize.y * 0.05));\n float gv = fract(sin(band * 43.23 + floor(t * 6.0) * 17.89) * 43758.5453);\n if (gv > 0.85) { float fl = sin(t * 30.0 + band) * 0.5 + 0.5; return fl < 0.3 ? 0.0 : fl; }\n return 1.0;\n }\n if (u_animStyle == 7) { // spiral\n float angle = atan(ny - 0.5, nx - 0.5);\n float dist = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n return 0.15 + 0.85 * (sin(angle * 3.0 + dist * PI * 8.0 - t * 3.0) * 0.5 + 0.5);\n }\n if (u_animStyle == 8) { // typewriter\n float reveal = fract(t * 0.5) * u_gridSize.x * u_gridSize.y * 1.3;\n float dist = cy * u_gridSize.x + cx - reveal;\n if (dist > 0.0) return 0.0;\n return clamp(1.0 + dist / (u_gridSize.x * u_gridSize.y * 0.15), 0.0, 1.0);\n }\n if (u_animStyle == 9) { // scatter\n float d = length(vec2(nx - 0.5, ny - 0.5)) * 1.41421;\n float phase = sin(t * 1.5) * 0.5 + 0.5;\n if (d > phase) return max(0.0, 1.0 - (d - phase) * 3.0);\n return 0.7 + 0.3 * sin(d * 10.0 - t * 2.0);\n }\n return 1.0;\n}\n\nvec3 applyColorMode(vec3 rgb) {\n float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n if (u_colorMode == 0) return vec3(lum);\n if (u_colorMode == 2) return vec3(0.0, lum, 0.0);\n if (u_colorMode == 3) return lum * u_accentColor;\n return rgb;\n}\n\nvoid main() {\n int cols = int(u_gridSize.x);\n int rows = int(u_gridSize.y);\n int cx = gl_InstanceID % cols;\n int cy = gl_InstanceID / cols;\n\n float fnx = (float(cx) + 0.5) / float(cols);\n float fny = (float(cy) + 0.5) / float(rows);\n\n // Sample cell data\n vec4 cell = texture(u_cellTex, vec2(fnx, fny));\n // cell.rgb = colour, cell.a = source alpha (0=transparent, 1=opaque)\n\n // Invisible cells (fully transparent source pixel)\n if (cell.a < 0.004) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Char weight: 0=dark/space .. 1=dense/bright (luminance, matches luminanceToChar ordering)\n float charW = dot(cell.rgb, vec3(0.299, 0.587, 0.114));\n\n float cellW = u_cellSize.x;\n float cellH = u_cellSize.y;\n\n // Animation\n float t = u_time * u_animSpeed;\n float am = getAnim(fnx, fny, float(cx), float(cy), t);\n if (am < 0.04) {\n gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return;\n }\n\n // Hover\n float hoverScale = 1.0;\n vec2 hoverOff = vec2(0.0);\n float hoverGlow = 0.0;\n float hoverBlend = 0.0;\n\n if (u_hoverStrength > 0.0 && u_hoverIntensity > 0.005) {\n vec2 d = vec2(fnx - u_hoverPos.x, fny - u_hoverPos.y);\n float r = 0.08 + u_hoverRadius * 0.35 + u_hoverStrength * 0.04;\n float dist = length(d);\n if (dist < r) {\n float tv = 1.0 - dist / r;\n float e = ss(tv) * u_hoverIntensity;\n if (u_hoverEffect == 0) { // spotlight\n hoverScale = 1.0 + e * u_hoverStrength * 1.8;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 0.6 * vec2(cellW, cellH);\n hoverGlow = e * u_hoverStrength * 0.4;\n hoverBlend = e * e * u_hoverStrength * 0.25;\n } else if (u_hoverEffect == 1) { // magnify\n hoverScale = 1.0 + e * u_hoverStrength * 2.5;\n hoverGlow = e * u_hoverStrength * 0.15;\n } else if (u_hoverEffect == 2) { // repel\n hoverScale = 1.0 + e * u_hoverStrength * 0.3;\n float ang = atan(d.y, d.x);\n hoverOff = vec2(cos(ang), sin(ang)) * e * e * u_hoverStrength * 1.2 * vec2(cellW, cellH);\n } else if (u_hoverEffect == 3) { // glow\n hoverGlow = e * u_hoverStrength * 0.8;\n hoverBlend = e * u_hoverStrength * 0.4;\n } else { // colorShift\n hoverScale = 1.0 + e * u_hoverStrength * 0.4;\n hoverGlow = e * u_hoverStrength * 0.2;\n hoverBlend = e * u_hoverStrength * 0.7;\n }\n }\n }\n\n // Final colour\n vec3 rgb = (u_invert == 1) ? (1.0 - cell.rgb) : cell.rgb;\n vec3 baseColor = applyColorMode(rgb);\n v_color = vec4(mix(baseColor, u_hoverColor, hoverBlend), 1.0);\n\n // Quad size & alpha\n vec2 quadSize;\n float finalAlpha;\n\n if (u_renderMode == 1) { // dots: radius driven by char weight (bright=big dot)\n float maxR = min(cellW, cellH) * 0.5 * u_dotSizeRatio;\n float radius = maxR * charW * am * hoverScale;\n if (radius < 0.3) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(radius * 2.0);\n finalAlpha = min(1.0, cell.a * am * (1.0 + hoverGlow));\n } else { // rect: size proportional to luminance — dark=tiny, bright=full (ASCII density look)\n if (charW < 0.01) { gl_Position = vec4(2.0, 2.0, 0.0, 1.0); v_alpha = 0.0; return; }\n quadSize = vec2(cellW * charW * hoverScale, cellH * charW * hoverScale);\n finalAlpha = min(1.0, am * (1.0 + hoverGlow));\n }\n\n v_alpha = finalAlpha;\n v_localUv = a_corner;\n\n // NDC position (Y flipped: WebGL bottom-up, canvas top-down)\n float px = float(cx) * cellW + cellW * 0.5 + hoverOff.x;\n float py = float(cy) * cellH + cellH * 0.5 + hoverOff.y;\n vec2 pos = vec2(px, py) + a_corner * quadSize;\n vec2 ndc = pos / u_canvasSize * 2.0 - 1.0;\n ndc.y = -ndc.y;\n gl_Position = vec4(ndc, 0.0, 1.0);\n}\n`;\n\n// ─── Fragment Shader ──────────────────────────────────────────────\n\nconst FRAG_SRC = /* glsl */`#version 300 es\nprecision mediump float;\nprecision highp int;\n\nin vec4 v_color;\nin float v_alpha;\nin vec2 v_localUv;\n\nuniform int u_renderMode;\n\nout vec4 outColor;\n\nvoid main() {\n if (v_alpha < 0.01) discard;\n if (u_renderMode == 1) {\n // Dots: circle SDF clip\n if (length(v_localUv) > 0.5) discard;\n }\n outColor = vec4(v_color.rgb, v_alpha);\n}\n`;\n\n// ─── WebGL Helpers ────────────────────────────────────────────────\n\nfunction compileShader(gl: WebGL2RenderingContext, type: number, src: string): WebGLShader {\n const sh = gl.createShader(type)!;\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (!gl.getShaderParameter(sh, gl.COMPILE_STATUS)) {\n const info = gl.getShaderInfoLog(sh) ?? 'unknown';\n gl.deleteShader(sh);\n throw new Error(`Shader compile error: ${info}`);\n }\n return sh;\n}\n\nfunction linkProgram(gl: WebGL2RenderingContext, vert: WebGLShader, frag: WebGLShader): WebGLProgram {\n const prog = gl.createProgram()!;\n gl.attachShader(prog, vert);\n gl.attachShader(prog, frag);\n gl.linkProgram(prog);\n if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {\n const info = gl.getProgramInfoLog(prog) ?? 'unknown';\n gl.deleteProgram(prog);\n throw new Error(`Program link error: ${info}`);\n }\n return prog;\n}\n\nfunction makeTexture(gl: WebGL2RenderingContext, filter: number = gl.NEAREST): WebGLTexture {\n const t = gl.createTexture()!;\n gl.bindTexture(gl.TEXTURE_2D, t);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n return t;\n}\n\n// ─── Animation / color / hover index maps ────────────────────────\nconst ANIM_STYLES = ['none','wave','pulse','rain','breathe','sparkle','glitch','spiral','typewriter','scatter','waveField'] as const;\nconst HOVER_EFFECTS = ['spotlight','magnify','repel','glow','colorShift'] as const;\nconst COLOR_MODES = ['grayscale','fullcolor','matrix','accent'] as const;\n\n// ─── Main Factory ─────────────────────────────────────────────────\n\n/**\n * Try to create a WebGL2 renderer for the given canvas.\n * Returns null if WebGL2 is unavailable (caller can then use Canvas2D).\n * On setup failure after context is claimed, returns a stub that clears to dark.\n */\nexport function tryCreateWebGLRenderer(canvas: HTMLCanvasElement): WebGLRenderer | null {\n const glOrNull = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n }) as WebGL2RenderingContext | null;\n\n if (!glOrNull) return null;\n const gl: WebGL2RenderingContext = glOrNull; // non-null, stable in closures\n\n try {\n // ─── Compile shaders ─────────────────────────────────────────\n const vert = compileShader(gl, gl.VERTEX_SHADER, VERT_SRC);\n const frag = compileShader(gl, gl.FRAGMENT_SHADER, FRAG_SRC);\n const prog = linkProgram(gl, vert, frag);\n gl.deleteShader(vert);\n gl.deleteShader(frag);\n\n // ─── VAO: unit quad (TRIANGLE_STRIP, 4 vertices) ─────────────\n const vao = gl.createVertexArray()!;\n gl.bindVertexArray(vao);\n\n const corners = new Float32Array([-0.5,-0.5, 0.5,-0.5, -0.5,0.5, 0.5,0.5]);\n const vbo = gl.createBuffer()!;\n gl.bindBuffer(gl.ARRAY_BUFFER, vbo);\n gl.bufferData(gl.ARRAY_BUFFER, corners, gl.STATIC_DRAW);\n\n const aCorner = gl.getAttribLocation(prog, 'a_corner');\n gl.enableVertexAttribArray(aCorner);\n gl.vertexAttribPointer(aCorner, 2, gl.FLOAT, false, 0, 0);\n\n gl.bindVertexArray(null);\n\n // ─── Single cell data texture (RGBA8: rgb=colour, a=charWeight 0-255) ─\n const cellTex = makeTexture(gl);\n\n // ─── Cached uniform locations ─────────────────────────────────\n const g = (n: string) => gl.getUniformLocation(prog, n)!;\n const u = {\n canvasSize: g('u_canvasSize'),\n gridSize: g('u_gridSize'),\n cellSize: g('u_cellSize'),\n time: g('u_time'),\n animSpeed: g('u_animSpeed'),\n animStyle: g('u_animStyle'),\n colorMode: g('u_colorMode'),\n accentColor: g('u_accentColor'),\n invert: g('u_invert'),\n hoverStrength: g('u_hoverStrength'),\n hoverIntensity:g('u_hoverIntensity'),\n hoverPos: g('u_hoverPos'),\n hoverRadius: g('u_hoverRadius'),\n hoverEffect: g('u_hoverEffect'),\n hoverColor: g('u_hoverColor'),\n renderMode: g('u_renderMode'),\n dotSizeRatio: g('u_dotSizeRatio'),\n cellTexU: g('u_cellTex'),\n };\n\n // ─── State ────────────────────────────────────────────────────\n let lastCols = 0;\n let lastRows = 0;\n let cellBuf = new Uint8Array(0); // rgba: rgb=colour, a=sourceAlpha\n let cellDataDirty = true;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // ─── Render ───────────────────────────────────────────────────\n function render(\n frame: AsciiFrame,\n options: AsciiOptions,\n displayW: number,\n displayH: number,\n time: number,\n hoverPos?: { x: number; y: number; intensity?: number } | null\n ): void {\n const rows = frame.length;\n if (rows === 0) return;\n const cols = frame[0].length;\n if (cols === 0) return;\n\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n\n // Clear to dark or transparent based on source alpha\n let hasTransparency = false;\n const sy = Math.max(1, rows >> 2), sx = Math.max(1, cols >> 2);\n outer: for (let iy = 0; iy < rows; iy += sy)\n for (let ix = 0; ix < cols; ix += sx)\n if (frame[iy][ix].a < 200) { hasTransparency = true; break outer; }\n gl.clearColor(hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 0.0392,\n hasTransparency ? 0 : 1.0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n // Re-allocate cell buffer when grid changes\n if (cols !== lastCols || rows !== lastRows) {\n cellBuf = new Uint8Array(cols * rows * 4);\n lastCols = cols;\n lastRows = rows;\n cellDataDirty = true;\n }\n\n // Upload cell data (rgb = colour, a = char weight 0-255)\n if (cellDataDirty) {\n for (let y = 0; y < rows; y++) {\n const row = frame[y];\n for (let x = 0; x < cols; x++) {\n const cell = row[x];\n const i = (y * cols + x) * 4;\n cellBuf[i] = cell.r;\n cellBuf[i + 1] = cell.g;\n cellBuf[i + 2] = cell.b;\n // alpha channel = source alpha (used for transparency masking in shader)\n cellBuf[i + 3] = cell.a;\n }\n }\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, cols, rows, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, cellBuf);\n cellDataDirty = false;\n }\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, cellTex);\n\n gl.useProgram(prog);\n gl.bindVertexArray(vao);\n\n const cellW = displayW / cols;\n const cellH = displayH / rows;\n\n gl.uniform2f(u.canvasSize, displayW, displayH);\n gl.uniform2f(u.gridSize, cols, rows);\n gl.uniform2f(u.cellSize, cellW, cellH);\n gl.uniform1f(u.time, time);\n gl.uniform1f(u.animSpeed, options.animationSpeed);\n gl.uniform1i(u.animStyle, ANIM_STYLES.indexOf(options.animationStyle));\n gl.uniform1i(u.colorMode, COLOR_MODES.indexOf(options.colorMode));\n\n const acHex = (options.accentColor || '#ffffff').replace('#', '');\n gl.uniform3f(u.accentColor,\n parseInt(acHex.slice(0, 2), 16) / 255,\n parseInt(acHex.slice(2, 4), 16) / 255,\n parseInt(acHex.slice(4, 6), 16) / 255);\n gl.uniform1i(u.invert, options.invert ? 1 : 0);\n\n const totalCells = rows * cols;\n const animActive = options.animationStyle !== 'none';\n const suppressHover = animActive && totalCells > 5_000;\n const hoverActive = !suppressHover && !!hoverPos && options.hoverStrength > 0;\n const radiusScale = totalCells > 30_000 ? 0.25\n : totalCells > 15_000 ? 0.4\n : totalCells > 5_000 ? 0.6 : 1;\n\n gl.uniform1f(u.hoverStrength, hoverActive ? options.hoverStrength : 0);\n gl.uniform1f(u.hoverIntensity, hoverActive ? (hoverPos?.intensity ?? 0) : 0);\n gl.uniform2f(u.hoverPos, hoverPos?.x ?? 0.5, hoverPos?.y ?? 0.5);\n gl.uniform1f(u.hoverRadius, options.hoverRadius * radiusScale);\n gl.uniform1i(u.hoverEffect, HOVER_EFFECTS.indexOf(options.hoverEffect));\n const hc = options.hoverColor || '#ffffff';\n gl.uniform3f(u.hoverColor,\n parseInt(hc.slice(1, 3), 16) / 255,\n parseInt(hc.slice(3, 5), 16) / 255,\n parseInt(hc.slice(5, 7), 16) / 255);\n\n gl.uniform1i(u.renderMode, options.renderMode === 'dots' ? 1 : 0);\n gl.uniform1f(u.dotSizeRatio, options.dotSizeRatio);\n gl.uniform1i(u.cellTexU, 0);\n\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, cols * rows);\n gl.bindVertexArray(null);\n }\n\n return {\n render,\n notifyDirty() { cellDataDirty = true; },\n destroy() {\n gl.deleteProgram(prog);\n gl.deleteVertexArray(vao);\n gl.deleteBuffer(vbo);\n gl.deleteTexture(cellTex);\n },\n };\n\n } catch (err) {\n console.error('[asciify] WebGL renderer setup FAILED (returning stub):', err);\n const stub: WebGLRenderer = {\n render() {\n try { gl.clearColor(0.039, 0.039, 0.039, 1); gl.clear(gl.COLOR_BUFFER_BIT); } catch { /* */ }\n },\n notifyDirty() {},\n destroy() {},\n };\n return stub;\n }\n}\n"]}
|