asciify-engine 1.0.15 → 1.0.17
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 +336 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +83 -3
- package/dist/index.d.ts +83 -3
- package/dist/index.js +333 -2
- 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/ascii-engine.ts","../src/webgl-engine.ts"],"names":["parseGIF","decompressFrames","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","// ─── Asciify Engine ───────────────────────────────────────────────\n// Framework-agnostic. Pure TypeScript.\n// Converts image/video/GIF pixel data to ASCII character grids.\n// Supports: ASCII text mode, Dots mode, Animation effects, Transparency.\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame, AnimationStyle, ArtStyle } from './types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from './types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\n\n/**\n * Create an offscreen canvas for pixel sampling.\n */\nfunction 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/**\n * Apply brightness and contrast adjustments to a luminance value.\n */\nfunction 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\n/**\n * Map a luminance value (0-255) to a character from the charset.\n */\nfunction 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\n/**\n * Map a cell position to a character from custom text, tiled across the image.\n * Only shows characters where brightness is above a threshold; otherwise space.\n * This makes the custom text readable as a repeating pattern across the image.\n */\nfunction 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 // Below threshold → space (dark/empty areas stay blank)\n if (normalized < 0.12) return ' ';\n // Tile the full text across positions so it reads naturally left-to-right\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n/**\n * Simple ordered-dither noise based on Bayer 4x4 matrix.\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];\n\n// ─── Pre-computed Color LUTs ───\n// Avoid per-cell string allocation for grayscale and matrix modes.\nconst _GRAY_LUT: string[] = new Array(256);\nconst _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// ─── Cached Hover Glow Sprite ───\n// Avoids createRadialGradient() every frame.\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\nfunction _getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4; // quantize to reduce cache misses\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\nfunction 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/**\n * Resolve a cell's fill color as a string — uses LUT for grayscale/matrix.\n * colorMode is passed directly to avoid per-cell object property lookup.\n */\nfunction 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\n/**\n * Resolve a cell's fill color as numeric [r, g, b] — avoids string allocation.\n * Uses the shared _colorRGB array to avoid per-call allocation.\n * colorMode passed directly to avoid per-cell object property lookup.\n */\nconst _colorRGB = [0, 0, 0];\nfunction 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/**\n * Get animation multiplier for a cell based on animation style.\n * Returns a value between 0 and 1 that modulates the cell's visibility/size.\n */\nfunction 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 // Random-looking sparkle using pseudo-random hash\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 // Horizontal glitch bands that shift randomly\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 // This band glitches — offset or blank\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 // Reveals characters left-to-right, top-to-bottom in a looping sweep\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1); // 0-1 sweep\n const revealPoint = progress * totalCells * 1.3; // overshoot for full coverage\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 // Particles scatter outward from center then reform\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; // 0-1 oscillation\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 — never reaches here\n return 1;\n default:\n return 1;\n }\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n * Now reads alpha channel for transparency support.\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]; // Alpha channel\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 * Uses gifuct-js to parse and decompress GIF frames, then composites\n * them onto a canvas (handling disposal methods) to produce full frames.\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\n // Use the full GIF logical screen size for compositing\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n // Compositing canvas (full GIF size)\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n // Previous frame canvas for restore-to-previous disposal\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 // Calculate average delay to determine FPS\n let totalDelay = 0;\n for (const f of rawFrames) {\n totalDelay += (f.delay || 100);\n }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n // Limit frames to avoid memory issues (cap at ~300 frames)\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 // Save state before drawing (for disposal type 3 = restore to previous)\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n // Create ImageData for this frame's patch\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 // Draw patch onto compositing canvas at the correct position\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n // Now sample the composited canvas\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n // Handle disposal\n if (disposalType === 2) {\n // Dispose to background (clear the patch area)\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n // Restore to previous\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n // disposalType 0 or 1 = leave as is (do nothing)\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Smoothstep easing for premium falloff curves.\n */\nfunction smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\n/**\n * Compute premium hover effects for a cell — writes results into\n * the reusable _hoverResult object to avoid per-cell allocation.\n * Uses the HoverEffect mode to vary the behaviour.\n */\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nfunction 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: import('./types').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 // Dynamic radius — radiusFactor (0-1) maps to visual influence area\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/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n * Always renders every cell at full quality.\n *\n * Performance strategy:\n * - fillRect fast path for sub-6px text (30x faster than fillText)\n * - Auto-scaling hover radius: at high cell counts, the hover area\n * is proportionally smaller so fewer cells compute hover effects\n * - Hover bounding box early-exit skips cells outside the hover zone\n *\n * @param time - elapsed time in seconds for animation effects\n * @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect\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: render procedurally, ignore frame ──\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 const wfAccentR = parseInt(acHexWF.substring(0, 2), 16) || 212;\n const wfAccentG = parseInt(acHexWF.substring(2, 4), 16) || 255;\n const wfAccentB = parseInt(acHexWF.substring(4, 6), 16) || 0;\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 void wfAccentR; void wfAccentG; void wfAccentB;\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 // Quick transparency check — sparse sample\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 // When animation is active at high cell counts, disable hover to keep FPS up.\n // Animation already re-renders every cell every frame (expensive trig per cell);\n // adding hover on top doubles the math for cells in the hover zone.\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 // Parse hover color once\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 // Pre-parse accent color once\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 // Auto-scale hover radius based on cell count for consistent performance.\n // At high cell counts the user's radius slider value is scaled down so the\n // hover zone stays a reasonable size (fewer cells to compute effects for).\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 // Pre-compute hover bounding box in grid coords for early-exit\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 // Cache options lookups outside the inner loop\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 // Track last canvas state to skip redundant calls\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n // ─── Dots Render Mode ───\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 // ─── Hover Effect ───\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 // Compute fill color\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 // ─── ASCII Text Render Mode ───\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n\n // Below 6px, characters are illegible — use fast fillRect with weight modulation\n // This turns 30K slow fillText calls into fast fillRect calls (30x speedup)\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 // Pre-build character weight map for fillRect mode\n // Maps each charset char to its visual density (0.1 – 1.0)\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 // ─── Hover Effect ───\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 // ─── Fast fillRect path (sub-6px text) ───\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 // ─── Standard fillText path ───\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/**\n * Serialize a frame to a compact base64 string.\n *\n * Encoding (chosen by colorMode):\n * fullcolor → 4 bytes/cell: [r, g, b, a]\n * otherwise → 2 bytes/cell: [luma, a] (grayscale/matrix/accent)\n *\n * The first byte of the buffer is a stride marker (2 or 4) so the runtime\n * can auto-detect the format without extra options.\n * Charcode is NEVER stored — the runtime recomputes it from luma + charset.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n // Alpha is always 255 for solid content — omit it to halve grayscale data.\n // stride=1: luma only, stride=3: r,g,b only. Header byte stores stride.\n const stride = fullColor ? 3 : 1;\n // 1 header byte + rows*cols*stride\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride; // stride marker\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 * matching the engine's getAnimationMultiplier.\n * @internal reserved for embed code generation\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\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 based on color mode.\n * @internal reserved for embed code generation\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\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\n// ─── Simple one-call API ──────────────────────────────────────────\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 * const img = document.querySelector('img');\n * const canvas = document.querySelector('canvas');\n * await asciify(img, canvas);\n *\n * @example with options\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 // Resolve string → HTMLImageElement\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 *\n * @example with style\n * const stop = await asciifyGif('animation.gif', canvas, { style: 'letters' });\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 video = document.querySelector('video');\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyVideo(video, canvas, { fontSize: 8, style: 'art' });\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\nconst EMBED_CDN_VERSION = '1.0.15';\n\n/** Build the compact options object for the CDN embed runtime. */\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 clean embed snippet.\n *\n * Structure:\n * <canvas id> — the render target, short and clean\n * <script type=json id> — frame data lives here, clearly separated\n * <script src=cdn> — always the same line, cached by browsers\n *\n * Output (static):\n * <!-- Asciify Embed -->\n * <canvas id=\"ar-xxx\" data-asciify-opts=\"{…}\" width=\"…\" height=\"…\"></canvas>\n * <script type=\"application/json\" id=\"ar-xxx-d\">\"BASE64\"</script>\n * <script src=\"cdn/embed.js\" async></script>\n * <!-- /Asciify Embed -->\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 embed snippet for multi-frame (GIF/video) ASCII art.\n * Uses the same CDN runtime as generateEmbedCode.\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// ─── Wave Background ──────────────────────────────────────────────\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 for low-intensity cells — use '{a}' as alpha placeholder (default: white) */\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 — higher = tighter spotlight (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 layered on top (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\n// ─── Smooth noise helpers (value-noise via polynomial hash) ────────\nfunction _fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nfunction _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\nfunction _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, inputs should be floats\nfunction _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) — adds richness to flat sine waves\nfunction _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; // normalise amplitude sum → roughly -1..1\n}\n\n/**\n * Render a procedural interactive wave-field of ASCII characters.\n *\n * Layers stacked per cell:\n * 1. Three cardinal sine waves (classic feel)\n * 2. Fractal Brownian Motion noise (organic structure)\n * 3. Diagonal drift ripple (depth / perspective)\n * 4. Slow global breathe pulse (heartbeat)\n * 5. Vortex swirl near cursor (energy field)\n * 6. Proximity spotlight (cursor highlight)\n * 7. Sparkle flickers on bright peaks (life)\n *\n * Call inside a requestAnimationFrame loop with accumulated time in seconds\n * and the current normalised mouse position {x, y} (0-1 range each).\n *\n * @example\n * ```ts\n * import { renderWaveBackground } from 'asciify-engine';\n *\n * const canvas = document.getElementById('bg') as HTMLCanvasElement;\n * const ctx = canvas.getContext('2d')!;\n * const mouse = { x: 0.5, y: 0.5 };\n * canvas.addEventListener('mousemove', e => {\n * const r = canvas.getBoundingClientRect();\n * mouse.x = (e.clientX - r.left) / r.width;\n * mouse.y = (e.clientY - r.top) / r.height;\n * });\n *\n * let t = 0;\n * const tick = () => {\n * renderWaveBackground(ctx, canvas.clientWidth, canvas.clientHeight, t, mouse);\n * t += 0.016;\n * requestAnimationFrame(tick);\n * };\n * requestAnimationFrame(tick);\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\n const mx = mousePos.x;\n const my = mousePos.y;\n\n // parse accent colour once per call\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\n // ── Layer 4: global breathe — slow sinusoidal pulsation ──\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 // ── Layer 1: three cardinal sine waves ──\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 // ── Layer 2: FBM noise (slowly drifting) ──\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 // ── Layer 3: diagonal drift ripple ──\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n // Blend wave layers with weights\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n // ── Layer 5: vortex swirl near cursor ──\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 // ── Layer 6: proximity spotlight ──\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n\n const clamped = Math.min(1, Math.max(0, intensity));\n\n // ── Layer 7: sparkle flicker on bright peaks ──\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n // rare random pop — deterministic per cell+time bucket so it doesn't jitter every frame\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.40 : 0.28, alpha * (lightMode ? 4 : 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 * 1.3})`;\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// ─── renderRainBackground ────────────────────────────────────────\n/**\n * Renders a digital-rain ASCII background — independent columns of falling\n * characters each with a glowing head and fading tail. Deterministic and\n * stateless: derived entirely from elapsed time.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'rain' });\n * ```\n */\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns (one picked randomly per cell per frame). */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom character colour (any CSS colour string). */\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: dark chars on light background (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 // Base char colour\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 // Accent colour\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 // Skip inactive columns\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 // k=0 → tail tip (dim), k=tailLength → head (bright)\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 t = k / tailLength; // 0→1\n\n if (k === tailLength) {\n // Head — accent colour\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n // Tail — fade out, near-head cells slightly brighter\n const alpha = lightMode ? t * 0.22 : t * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n\n// ─── renderStarsBackground ────────────────────────────────────────\n/**\n * Renders a 3-D star-warp / hyperspace ASCII background — ASCII chars fly\n * outward from a vanishing point that gently follows the mouse cursor.\n * Stars scale up and brighten as they approach the screen edge.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'stars' });\n * ```\n */\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars (sparse = more authentic). */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base colour (any CSS colour string). */\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 // Vanishing point follows mouse with slight margin\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) {\n const p = _parseColor(color);\n 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 // r: normalised radial distance 0 (center) → 1 (edge), wraps each cycle\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 // Scale font with r — small near center, larger near edge\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n // Pick char by depth\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n\n const isAccent = r > 0.72;\n const alpha = lightMode\n ? r * 0.28\n : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.45 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n // Reset textAlign\n ctx.textAlign = 'left';\n}\n\n// ─── renderPulseBackground ────────────────────────────────────────\n/**\n * Concentric ASCII ripples that radiate from a vanishing point following\n * the mouse — like a sonar / radar signal.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'pulse' });\n * ```\n */\nexport interface PulseBackgroundOptions {\n /** Font size in CSS pixels (default: 13). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .:-=+*#%@'). */\n chars?: string;\n /** Accent colour on ring crests (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of concentric rings (default: 6). */\n rings?: number;\n /** Ring travel speed (default: 1). */\n speed?: number;\n /** Ring width sharpness — higher = thinner rings (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 = 13,\n chars = ' .:-=+*#%@',\n accentColor = '#d4ff00',\n color,\n rings = 6,\n speed = 1,\n sharpness = 4,\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 const maxR = Math.sqrt(width * width + height * height) * 0.5;\n const ox = mousePos.x * width;\n const oy = mousePos.y * height;\n\n let br = 255, bg2 = 255, bb = 255;\n if (lightMode) { br = 0; bg2 = 0; bb = 0; }\n if (color) { const p = _parseColor(color); if (p) { br = p.r; bg2 = 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 px = col * charW + charW * 0.5;\n const py = row * lineH + lineH * 0.5;\n const dist = Math.sqrt((px - ox) ** 2 + (py - oy) ** 2);\n const norm = dist / maxR; // 0→1\n\n // Phase: each ring offset by 1/rings fraction\n const phase = (norm * rings - t * 1.4) % 1.0;\n // Ring crest = cosine peak near phase = 0\n const wave = Math.pow(Math.max(0, Math.cos(phase * Math.PI * 2)), sharpness);\n\n if (wave < 0.02) continue;\n\n const charIdx = Math.floor(wave * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = wave > 0.75;\n const alpha = lightMode ? wave * 0.22 : wave * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.50 : 0.35})`\n : `rgba(${br},${bg2},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n// ─── renderNoiseBackground ────────────────────────────────────────\n/**\n * Slow-drifting organic fractal noise field. No directional pattern —\n * pure ambient texture. The mouse subtly warps the field around the cursor.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'noise' });\n * ```\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.20 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.42 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n// ─── renderGridBackground ────────────────────────────────────────\n/**\n * CRT-style horizontal scan-line sweep. Bright scan bands travel downward\n * continuously; the cursor creates a local disruption / glitch zone.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'grid' });\n * ```\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.20 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.46 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n\n/**\n * Drop-in helper that mounts an interactive ASCII wave background onto any\n * element. Injects a canvas, wires DPR resize, mouse tracking, and the RAF\n * loop — all internally. Auto-detects light/dark mode and stays in sync if\n * the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * import { asciiBackground } from 'asciify-engine';\n *\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // Custom color:\n * asciiBackground('#hero', { color: '#6b8700', accentColor: '#d4ff00' });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport interface AsciiBackgroundOptions extends WaveBackgroundOptions, RainBackgroundOptions, StarsBackgroundOptions, PulseBackgroundOptions, NoiseBackgroundOptions, GridBackgroundOptions {\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 position\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\n */\n type?: 'wave' | 'rain' | 'stars' | 'pulse' | 'noise' | 'grid';\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 the 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 the ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\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\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 // Build options for each renderer type; injects lightMode + color\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\n type AnyRenderOpts = WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions;\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 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 {\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/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n\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/ascii-engine.ts","../src/webgl-engine.ts"],"names":["parseGIF","decompressFrames","alpha","ch","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","// ─── Asciify Engine ───────────────────────────────────────────────\n// Framework-agnostic. Pure TypeScript.\n// Converts image/video/GIF pixel data to ASCII character grids.\n// Supports: ASCII text mode, Dots mode, Animation effects, Transparency.\n\nimport type { AsciiOptions, AsciiCell, AsciiFrame, AnimationStyle, ArtStyle } from './types';\nimport { DEFAULT_OPTIONS, ART_STYLE_PRESETS } from './types';\nimport { parseGIF, decompressFrames } from 'gifuct-js';\n\n/**\n * Create an offscreen canvas for pixel sampling.\n */\nfunction 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/**\n * Apply brightness and contrast adjustments to a luminance value.\n */\nfunction 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\n/**\n * Map a luminance value (0-255) to a character from the charset.\n */\nfunction 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\n/**\n * Map a cell position to a character from custom text, tiled across the image.\n * Only shows characters where brightness is above a threshold; otherwise space.\n * This makes the custom text readable as a repeating pattern across the image.\n */\nfunction 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 // Below threshold → space (dark/empty areas stay blank)\n if (normalized < 0.12) return ' ';\n // Tile the full text across positions so it reads naturally left-to-right\n const pos = y * cols + x;\n return text[pos % text.length];\n}\n\n/**\n * Simple ordered-dither noise based on Bayer 4x4 matrix.\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];\n\n// ─── Pre-computed Color LUTs ───\n// Avoid per-cell string allocation for grayscale and matrix modes.\nconst _GRAY_LUT: string[] = new Array(256);\nconst _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// ─── Cached Hover Glow Sprite ───\n// Avoids createRadialGradient() every frame.\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\nfunction _getGlowSprite(radius: number, r: number, g: number, b: number): HTMLCanvasElement {\n const size = Math.ceil(radius / 4) * 4; // quantize to reduce cache misses\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\nfunction 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/**\n * Resolve a cell's fill color as a string — uses LUT for grayscale/matrix.\n * colorMode is passed directly to avoid per-cell object property lookup.\n */\nfunction 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\n/**\n * Resolve a cell's fill color as numeric [r, g, b] — avoids string allocation.\n * Uses the shared _colorRGB array to avoid per-call allocation.\n * colorMode passed directly to avoid per-cell object property lookup.\n */\nconst _colorRGB = [0, 0, 0];\nfunction 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/**\n * Get animation multiplier for a cell based on animation style.\n * Returns a value between 0 and 1 that modulates the cell's visibility/size.\n */\nfunction 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 // Random-looking sparkle using pseudo-random hash\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 // Horizontal glitch bands that shift randomly\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 // This band glitches — offset or blank\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 // Reveals characters left-to-right, top-to-bottom in a looping sweep\n const totalCells = cols * rows;\n const cellIndex = y * cols + x;\n const progress = ((t * 0.5) % 1); // 0-1 sweep\n const revealPoint = progress * totalCells * 1.3; // overshoot for full coverage\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 // Particles scatter outward from center then reform\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; // 0-1 oscillation\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 — never reaches here\n return 1;\n default:\n return 1;\n }\n}\n\n/**\n * Convert an image element or canvas to a single ASCII frame.\n * Now reads alpha channel for transparency support.\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]; // Alpha channel\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 * Uses gifuct-js to parse and decompress GIF frames, then composites\n * them onto a canvas (handling disposal methods) to produce full frames.\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\n // Use the full GIF logical screen size for compositing\n const logicalW = gif.lsd?.width || gifW;\n const logicalH = gif.lsd?.height || gifH;\n\n // Compositing canvas (full GIF size)\n const compCanvas = document.createElement('canvas');\n compCanvas.width = logicalW;\n compCanvas.height = logicalH;\n const compCtx = compCanvas.getContext('2d')!;\n\n // Previous frame canvas for restore-to-previous disposal\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 // Calculate average delay to determine FPS\n let totalDelay = 0;\n for (const f of rawFrames) {\n totalDelay += (f.delay || 100);\n }\n const avgDelay = totalDelay / rawFrames.length;\n const fps = Math.round(Math.min(30, Math.max(5, 1000 / avgDelay)));\n\n // Limit frames to avoid memory issues (cap at ~300 frames)\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 // Save state before drawing (for disposal type 3 = restore to previous)\n if (disposalType === 3) {\n prevCtx.clearRect(0, 0, logicalW, logicalH);\n prevCtx.drawImage(compCanvas, 0, 0);\n }\n\n // Create ImageData for this frame's patch\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 // Draw patch onto compositing canvas at the correct position\n compCtx.drawImage(tempCanvas, dims.left || 0, dims.top || 0);\n\n // Now sample the composited canvas\n const result = imageToAsciiFrame(compCanvas, options, targetWidth, targetHeight);\n frames.push(result.frame);\n cols = result.cols;\n rows = result.rows;\n\n // Handle disposal\n if (disposalType === 2) {\n // Dispose to background (clear the patch area)\n compCtx.clearRect(dims.left || 0, dims.top || 0, dims.width, dims.height);\n } else if (disposalType === 3) {\n // Restore to previous\n compCtx.clearRect(0, 0, logicalW, logicalH);\n compCtx.drawImage(prevCanvas, 0, 0);\n }\n // disposalType 0 or 1 = leave as is (do nothing)\n\n onProgress?.((i + 1) / maxFrames);\n }\n\n return { frames, cols, rows, fps };\n}\n\n/**\n * Smoothstep easing for premium falloff curves.\n */\nfunction smoothstep(t: number): number {\n return t * t * (3 - 2 * t);\n}\n\n/**\n * Compute premium hover effects for a cell — writes results into\n * the reusable _hoverResult object to avoid per-cell allocation.\n * Uses the HoverEffect mode to vary the behaviour.\n */\nconst _hoverResult = { scale: 1, offsetX: 0, offsetY: 0, glow: 0, colorBlend: 0, proximity: 0 };\n\nfunction 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: import('./types').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 // Dynamic radius — radiusFactor (0-1) maps to visual influence area\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/**\n * Render an ASCII frame to a canvas context.\n * Supports both ASCII text mode and Dots mode.\n * Always renders every cell at full quality.\n *\n * Performance strategy:\n * - fillRect fast path for sub-6px text (30x faster than fillText)\n * - Auto-scaling hover radius: at high cell counts, the hover area\n * is proportionally smaller so fewer cells compute hover effects\n * - Hover bounding box early-exit skips cells outside the hover zone\n *\n * @param time - elapsed time in seconds for animation effects\n * @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect\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: render procedurally, ignore frame ──\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 const wfAccentR = parseInt(acHexWF.substring(0, 2), 16) || 212;\n const wfAccentG = parseInt(acHexWF.substring(2, 4), 16) || 255;\n const wfAccentB = parseInt(acHexWF.substring(4, 6), 16) || 0;\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 void wfAccentR; void wfAccentG; void wfAccentB;\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 // Quick transparency check — sparse sample\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 // When animation is active at high cell counts, disable hover to keep FPS up.\n // Animation already re-renders every cell every frame (expensive trig per cell);\n // adding hover on top doubles the math for cells in the hover zone.\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 // Parse hover color once\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 // Pre-parse accent color once\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 // Auto-scale hover radius based on cell count for consistent performance.\n // At high cell counts the user's radius slider value is scaled down so the\n // hover zone stays a reasonable size (fewer cells to compute effects for).\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 // Pre-compute hover bounding box in grid coords for early-exit\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 // Cache options lookups outside the inner loop\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 // Track last canvas state to skip redundant calls\n let lastFillStyle = '';\n let lastAlpha = -1;\n\n if (options.renderMode === 'dots') {\n // ─── Dots Render Mode ───\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 // ─── Hover Effect ───\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 // Compute fill color\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 // ─── ASCII Text Render Mode ───\n const charAspect = 0.55;\n const fontSize = Math.min(cellW / charAspect, cellH) * 0.9;\n\n // Below 6px, characters are illegible — use fast fillRect with weight modulation\n // This turns 30K slow fillText calls into fast fillRect calls (30x speedup)\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 // Pre-build character weight map for fillRect mode\n // Maps each charset char to its visual density (0.1 – 1.0)\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 // ─── Hover Effect ───\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 // ─── Fast fillRect path (sub-6px text) ───\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 // ─── Standard fillText path ───\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/**\n * Serialize a frame to a compact base64 string.\n *\n * Encoding (chosen by colorMode):\n * fullcolor → 4 bytes/cell: [r, g, b, a]\n * otherwise → 2 bytes/cell: [luma, a] (grayscale/matrix/accent)\n *\n * The first byte of the buffer is a stride marker (2 or 4) so the runtime\n * can auto-detect the format without extra options.\n * Charcode is NEVER stored — the runtime recomputes it from luma + charset.\n */\nfunction serializeFrame(frame: AsciiFrame, fullColor: boolean): string {\n const rows = frame.length;\n const cols = rows > 0 ? frame[0].length : 0;\n // Alpha is always 255 for solid content — omit it to halve grayscale data.\n // stride=1: luma only, stride=3: r,g,b only. Header byte stores stride.\n const stride = fullColor ? 3 : 1;\n // 1 header byte + rows*cols*stride\n const buf = new Uint8Array(1 + rows * cols * stride);\n buf[0] = stride; // stride marker\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 * matching the engine's getAnimationMultiplier.\n * @internal reserved for embed code generation\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\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 based on color mode.\n * @internal reserved for embed code generation\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\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\n// ─── Simple one-call API ──────────────────────────────────────────\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 * const img = document.querySelector('img');\n * const canvas = document.querySelector('canvas');\n * await asciify(img, canvas);\n *\n * @example with options\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 // Resolve string → HTMLImageElement\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 *\n * @example with style\n * const stop = await asciifyGif('animation.gif', canvas, { style: 'letters' });\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 video = document.querySelector('video');\n * const stop = await asciifyVideo(video, canvas);\n * // later: stop();\n *\n * @example with style\n * const stop = await asciifyVideo(video, canvas, { fontSize: 8, style: 'art' });\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\nconst EMBED_CDN_VERSION = '1.0.17';\n\n/** Build the compact options object for the CDN embed runtime. */\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 clean embed snippet.\n *\n * Structure:\n * <canvas id> — the render target, short and clean\n * <script type=json id> — frame data lives here, clearly separated\n * <script src=cdn> — always the same line, cached by browsers\n *\n * Output (static):\n * <!-- Asciify Embed -->\n * <canvas id=\"ar-xxx\" data-asciify-opts=\"{…}\" width=\"…\" height=\"…\"></canvas>\n * <script type=\"application/json\" id=\"ar-xxx-d\">\"BASE64\"</script>\n * <script src=\"cdn/embed.js\" async></script>\n * <!-- /Asciify Embed -->\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 embed snippet for multi-frame (GIF/video) ASCII art.\n * Uses the same CDN runtime as generateEmbedCode.\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// ─── Wave Background ──────────────────────────────────────────────\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 for low-intensity cells — use '{a}' as alpha placeholder (default: white) */\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 — higher = tighter spotlight (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 layered on top (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\n// ─── Smooth noise helpers (value-noise via polynomial hash) ────────\nfunction _fade(t: number): number { return t * t * t * (t * (t * 6 - 15) + 10); }\nfunction _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\nfunction _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, inputs should be floats\nfunction _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) — adds richness to flat sine waves\nfunction _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; // normalise amplitude sum → roughly -1..1\n}\n\n/**\n * Render a procedural interactive wave-field of ASCII characters.\n *\n * Layers stacked per cell:\n * 1. Three cardinal sine waves (classic feel)\n * 2. Fractal Brownian Motion noise (organic structure)\n * 3. Diagonal drift ripple (depth / perspective)\n * 4. Slow global breathe pulse (heartbeat)\n * 5. Vortex swirl near cursor (energy field)\n * 6. Proximity spotlight (cursor highlight)\n * 7. Sparkle flickers on bright peaks (life)\n *\n * Call inside a requestAnimationFrame loop with accumulated time in seconds\n * and the current normalised mouse position {x, y} (0-1 range each).\n *\n * @example\n * ```ts\n * import { renderWaveBackground } from 'asciify-engine';\n *\n * const canvas = document.getElementById('bg') as HTMLCanvasElement;\n * const ctx = canvas.getContext('2d')!;\n * const mouse = { x: 0.5, y: 0.5 };\n * canvas.addEventListener('mousemove', e => {\n * const r = canvas.getBoundingClientRect();\n * mouse.x = (e.clientX - r.left) / r.width;\n * mouse.y = (e.clientY - r.top) / r.height;\n * });\n *\n * let t = 0;\n * const tick = () => {\n * renderWaveBackground(ctx, canvas.clientWidth, canvas.clientHeight, t, mouse);\n * t += 0.016;\n * requestAnimationFrame(tick);\n * };\n * requestAnimationFrame(tick);\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\n const mx = mousePos.x;\n const my = mousePos.y;\n\n // parse accent colour once per call\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\n // ── Layer 4: global breathe — slow sinusoidal pulsation ──\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 // ── Layer 1: three cardinal sine waves ──\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 // ── Layer 2: FBM noise (slowly drifting) ──\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 // ── Layer 3: diagonal drift ripple ──\n const driftFreq = 0.06;\n const driftPart = Math.sin((col + row * 0.65) * driftFreq + t * 1.1) * 0.5 + 0.5;\n\n // Blend wave layers with weights\n const wavePart = sinePart * 0.45 + noisePart * 0.35 + driftPart * 0.20 + breatheAmp;\n\n // ── Layer 5: vortex swirl near cursor ──\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 // ── Layer 6: proximity spotlight ──\n const proximity = Math.max(0, 1 - distRaw * mouseFalloff);\n\n const intensity = (\n wavePart * (1 - mouseInfluence) +\n (proximity + vortexBump * 0.5) * mouseInfluence\n ) + vortexBump * 0.15;\n\n const clamped = Math.min(1, Math.max(0, intensity));\n\n // ── Layer 7: sparkle flicker on bright peaks ──\n let finalIntensity = clamped;\n if (sparkles && clamped > 0.72) {\n // rare random pop — deterministic per cell+time bucket so it doesn't jitter every frame\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.40 : 0.28, alpha * (lightMode ? 4 : 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 * 1.3})`;\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// ─── renderRainBackground ────────────────────────────────────────\n/**\n * Renders a digital-rain ASCII background — independent columns of falling\n * characters each with a glowing head and fading tail. Deterministic and\n * stateless: derived entirely from elapsed time.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'rain' });\n * ```\n */\nexport interface RainBackgroundOptions {\n fontSize?: number;\n /** Characters drawn in columns (one picked randomly per cell per frame). */\n chars?: string;\n /** Head / accent colour (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom character colour (any CSS colour string). */\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: dark chars on light background (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 // Base char colour\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 // Accent colour\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 // Skip inactive columns\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 // k=0 → tail tip (dim), k=tailLength → head (bright)\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 t = k / tailLength; // 0→1\n\n if (k === tailLength) {\n // Head — accent colour\n ctx.fillStyle = `rgba(${acR},${acG},${acB},${lightMode ? 0.70 : 0.85})`;\n } else {\n // Tail — fade out, near-head cells slightly brighter\n const alpha = lightMode ? t * 0.22 : t * 0.15;\n ctx.fillStyle = `rgba(${br},${bg},${bb},${alpha})`;\n }\n ctx.fillText(ch, x, y);\n }\n }\n}\n\n// ─── renderStarsBackground ────────────────────────────────────────\n/**\n * Renders a 3-D star-warp / hyperspace ASCII background — ASCII chars fly\n * outward from a vanishing point that gently follows the mouse cursor.\n * Stars scale up and brighten as they approach the screen edge.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'stars' });\n * ```\n */\nexport interface StarsBackgroundOptions {\n fontSize?: number;\n /** Characters used as stars (sparse = more authentic). */\n chars?: string;\n /** Accent/trail colour for fast near-edge stars (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base colour (any CSS colour string). */\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 // Vanishing point follows mouse with slight margin\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) {\n const p = _parseColor(color);\n 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 // r: normalised radial distance 0 (center) → 1 (edge), wraps each cycle\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 // Scale font with r — small near center, larger near edge\n const sz = Math.max(6, fontSize * (0.4 + r * 0.9));\n ctx.font = `${sz}px monospace`;\n\n // Pick char by depth\n const charIdx = Math.min(charArr.length - 1, Math.floor(r * charArr.length));\n const ch = charArr[charIdx];\n\n const isAccent = r > 0.72;\n const alpha = lightMode\n ? r * 0.28\n : r * 0.20;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${Math.min(lightMode ? 0.45 : 0.32, alpha * 2.2)})`\n : `rgba(${br},${bg},${bb},${alpha})`;\n\n ctx.fillText(ch, x, y);\n }\n\n // Reset textAlign\n ctx.textAlign = 'left';\n}\n\n// ─── renderPulseBackground ────────────────────────────────────────\n/**\n * Concentric ASCII ripples that radiate from a vanishing point following\n * the mouse — like a sonar / radar signal.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'pulse' });\n * ```\n */\nexport interface PulseBackgroundOptions {\n /** Font size in CSS pixels (default: 13). */\n fontSize?: number;\n /** Character ramp dark → bright (default: ' .:-=+*#%@'). */\n chars?: string;\n /** Accent colour on ring crests (default: '#d4ff00'). */\n accentColor?: string;\n /** Custom base character colour (any CSS colour string). */\n color?: string;\n /** Number of concentric rings (default: 6). */\n rings?: number;\n /** Ring travel speed (default: 1). */\n speed?: number;\n /** Ring width sharpness — higher = thinner rings (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 = 13,\n chars = ' .:-=+*#%@',\n accentColor = '#d4ff00',\n color,\n rings = 6,\n speed = 1,\n sharpness = 4,\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 const maxR = Math.sqrt(width * width + height * height) * 0.5;\n const ox = mousePos.x * width;\n const oy = mousePos.y * height;\n\n let br = 255, bg2 = 255, bb = 255;\n if (lightMode) { br = 0; bg2 = 0; bb = 0; }\n if (color) { const p = _parseColor(color); if (p) { br = p.r; bg2 = 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 px = col * charW + charW * 0.5;\n const py = row * lineH + lineH * 0.5;\n const dist = Math.sqrt((px - ox) ** 2 + (py - oy) ** 2);\n const norm = dist / maxR; // 0→1\n\n // Phase: each ring offset by 1/rings fraction\n const phase = (norm * rings - t * 1.4) % 1.0;\n // Ring crest = cosine peak near phase = 0\n const wave = Math.pow(Math.max(0, Math.cos(phase * Math.PI * 2)), sharpness);\n\n if (wave < 0.02) continue;\n\n const charIdx = Math.floor(wave * (chars.length - 1));\n const ch = chars[charIdx];\n if (ch === ' ') continue;\n\n const isAccent = wave > 0.75;\n const alpha = lightMode ? wave * 0.22 : wave * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.50 : 0.35})`\n : `rgba(${br},${bg2},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n// ─── renderNoiseBackground ────────────────────────────────────────\n/**\n * Slow-drifting organic fractal noise field. No directional pattern —\n * pure ambient texture. The mouse subtly warps the field around the cursor.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'noise' });\n * ```\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.20 : norm2 * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.42 : 0.28})`\n : `rgba(${br},${bgc},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n// ─── renderGridBackground ────────────────────────────────────────\n/**\n * CRT-style horizontal scan-line sweep. Bright scan bands travel downward\n * continuously; the cursor creates a local disruption / glitch zone.\n *\n * @example\n * ```ts\n * asciiBackground('#hero', { type: 'grid' });\n * ```\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.20 : intensity * 0.12;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.46 : 0.28})`\n : `rgba(${br},${bgv},${bb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n\n// ─── Aurora Background ────────────────────────────────────────────────────────\n// Premium slow-drifting light bands. Multiple sine layers create smooth organic\n// interference patterns — like silk, aurora borealis, or light through water.\n\nexport interface AuroraBackgroundOptions {\n /** Character grid density. Default 14. */\n fontSize?: number;\n /** Character ramp from sparse to dense. Default fine gradient ramp. */\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 // Base color\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 // so they drift independently and sum into a richly organic field\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, // x spatial frequency\n fy: 1.2 + seed2 * 1.8, // y spatial frequency\n phase: seed * Math.PI * 4, // phase offset\n dt: (0.3 + _hash2(l * 7, l * 13 + 3) * 0.5) * (l % 2 === 0 ? 1 : -1), // drift speed & direction\n amp: 0.55 + _hash2(l * 29, l * 3) * 0.45, // amplitude weight\n });\n }\n\n for (let row = 0; row < rows; row++) {\n const ny = row / rows; // 0→1 normalised y\n\n for (let col = 0; col < cols; col++) {\n const nx = col / cols; // 0→1 normalised x\n\n // Mouse distortion: the cursor creates a subtle gravitational lens\n // that elegantly warps the field rather than blowing it up\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 // Two-axis sinusoidal wave, slowly drifting\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 controllable softness/contrast\n const rawVal = sum / totalAmp; // -1 → 1\n // Soft sigmoid-like curve — pulls the midrange wider for premium feel\n const curved = 0.5 + 0.5 * Math.tanh(rawVal * softness * 2.2);\n\n // Very low values → blank. Keeps the field breathable/airy.\n if (curved < 0.12) continue;\n\n // Remap 0.12→1 to 0→1 for char selection\n const normalized = (curved - 0.12) / 0.88;\n\n const charIdx = Math.min(chars.length - 1, Math.floor(normalized * chars.length));\n const ch = chars[charIdx];\n\n // Accent fires only on the very top intensity peaks — precise, elegant\n const isAccent = curved > 0.82;\n\n // Alpha envelope: scales with intensity but stays subtle for ambient elegance\n const alpha = lightMode\n ? curved * 0.18\n : curved * 0.14;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.50 : 0.32})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n\n// ─── Silk Background ──────────────────────────────────────────────────────────\n// Smooth directional flow-field ribbons. Each cell reads its angle from a\n// slow-drifting vector field; the character is chosen from a direction-sensitive\n// ramp. The result looks like translucent fabric or liquid light — no harsh edges,\n// no directionality bias, pure luxury texture. No mouse interaction by design.\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: ─ / \\ | for flow angle, density chars for intensity\n // The ramp uses horizontal/diagonal chars that reinforce the ribbon feel\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 with distinct frequencies and phases\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 // Cross-axis turbulence links x/y flows\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 // Map angle to a direction char — creates the ribbon illusion\n const angleNorm = (angle + Math.PI) / (Math.PI * 2); // 0→1\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.16 : intensity * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.44 : 0.26})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n\n// ─── Void Background ──────────────────────────────────────────────────────────\n// A gravitational singularity follows the cursor. Characters are pulled inward\n// and spiral around the attractor — density and angular displacement increase\n// with proximity. Far from the cursor the field is sparse and calm. Premium dark\n// drama — like a black hole or whirlpool rendered in ASCII.\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 // Distance to attractor (correct for aspect ratio)\n const dx = (nx - mousePos.x) * aspect;\n const dy = ny - mousePos.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n\n // Normalise to radius — 0 = singularity, 1+ = outer void\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.05 : 0.04);\n const ch = chars[1];\n ctx.fillStyle = `rgba(${cr},${cg},${cb},${alpha})`;\n ctx.fillText(ch, 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 // Char choice: denser chars for higher intensity, but also modulated by angle\n // to reinforce the spiral/ribbon feel\n const angleIdx = Math.floor(((angle % (Math.PI * 2)) + Math.PI * 2) % (Math.PI * 2) / (Math.PI * 2) * 4);\n const densityI = Math.floor(intensity * (chars.length - 1));\n // Blend: mostly density-driven, angle adds variety at mid-range\n const charIdx = Math.min(chars.length - 1, densityI);\n const ch = chars[charIdx + (angleIdx > 2 && densityI > 2 ? 0 : 0)];\n\n const isAccent = pulseRing > 0.35 || (r < 0.08);\n const alpha = lightMode ? intensity * 0.22 : intensity * 0.18;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.55 : 0.38})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n\n// ─── Morph Background ─────────────────────────────────────────────────────────\n// Each cell oscillates through its own slow intensity cycle using a unique\n// multi-frequency combination — no two cells share the same rhythm. The result is\n// a shimmering, dissolving, breathing field with no directionality whatsoever.\n// Pure ambient texture. Meditative and premium. No hover effect.\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 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 // Unique base frequency per cell per harmonic\n const fBase = _hash2(col * (h + 3) + 7, row * (h + 5) + 11);\n const fineF = 0.18 + fBase * 1.4; // 0.18–1.58 Hz\n const phase = _hash2(col * (h + 7), row * (h + 9) + 3) * Math.PI * 2;\n // Harmonic weight: fundamental loudest, overtones quieter\n const weight = 1 / (h + 1);\n v += Math.sin(t * fineF + phase) * weight;\n }\n\n // Normalise sum to 0→1\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 const norm = (v / maxV + 1) * 0.5; // 0→1\n\n // Blank out the bottom third of the range — keeps field breathable\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.17 : remapped * 0.13;\n\n ctx.fillStyle = isAccent\n ? `rgba(${acR},${acG},${acB},${lightMode ? 0.45 : 0.28})`\n : `rgba(${cr},${cg},${cb},${alpha})`;\n\n ctx.fillText(ch, col * charW, row * lineH);\n }\n }\n}\n\n\n/**\n * Drop-in helper that mounts an interactive ASCII wave background onto any\n * element. Injects a canvas, wires DPR resize, mouse tracking, and the RAF\n * loop — all internally. Auto-detects light/dark mode and stays in sync if\n * the system theme changes.\n *\n * Returns a `destroy()` function to clean everything up.\n *\n * @example\n * ```ts\n * import { asciiBackground } from 'asciify-engine';\n *\n * // 1 line:\n * const { destroy } = asciiBackground('#hero', { opacity: 0.2 });\n *\n * // Custom color:\n * asciiBackground('#hero', { color: '#6b8700', accentColor: '#d4ff00' });\n *\n * // React — return destroy as cleanup:\n * useEffect(() => asciiBackground(ref.current).destroy, []);\n * ```\n */\nexport interface AsciiBackgroundOptions extends WaveBackgroundOptions, RainBackgroundOptions, StarsBackgroundOptions, PulseBackgroundOptions, NoiseBackgroundOptions, GridBackgroundOptions, AuroraBackgroundOptions, SilkBackgroundOptions, VoidBackgroundOptions, MorphBackgroundOptions {\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 position\n * - 'noise' — slow-drifting organic fractal noise field\n * - 'grid' — CRT-style horizontal scan bands with cursor glitch zone\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 the 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 the ASCII chars.\n * @example '#6b8700'\n */\n color?: string;\n}\n\n/** Parse a hex or rgb CSS colour string into { r, g, b }. Returns null on failure. */\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\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 // Build options for each renderer type; injects lightMode + color\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 type AnyRenderOpts = WaveBackgroundOptions | RainBackgroundOptions | StarsBackgroundOptions | PulseBackgroundOptions | NoiseBackgroundOptions | GridBackgroundOptions | AuroraBackgroundOptions | SilkBackgroundOptions | VoidBackgroundOptions | MorphBackgroundOptions;\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/** @deprecated Use `AsciiBackgroundOptions` instead. */\nexport type MountWaveOptions = AsciiBackgroundOptions;\n\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"]}
|