asciify-engine 1.0.0
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/LICENSE +21 -0
- package/README.md +204 -0
- package/dist/index.cjs +876 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +118 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.js +865 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/ascii-engine.ts"],"names":["parseGIF","decompressFrames"],"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';\nexport type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal';\nexport type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';\nexport type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';\nexport type SourceType = 'image' | 'video' | 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}\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} 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};\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.5,\n hoverEffect: 'spotlight',\n hoverColor: '#ffffff',\n artStyle: 'classic',\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.5, hoverColor: '#ffffff' },\n },\n subtle: {\n label: 'Subtle',\n options: { hoverStrength: 0.8, hoverEffect: 'glow', hoverRadius: 0.4, hoverColor: '#ffffff' },\n },\n flashlight: {\n label: 'Flashlight',\n options: { hoverStrength: 2.5, hoverEffect: 'spotlight', hoverRadius: 0.6, hoverColor: '#fffbe6' },\n },\n magnifier: {\n label: 'Magnifier',\n options: { hoverStrength: 3, hoverEffect: 'magnify', hoverRadius: 0.35, hoverColor: '#ffffff' },\n },\n forceField: {\n label: 'Force Field',\n options: { hoverStrength: 3.5, hoverEffect: 'repel', hoverRadius: 0.5, hoverColor: '#a0e8ff' },\n },\n neon: {\n label: 'Neon',\n options: { hoverStrength: 2.5, hoverEffect: 'colorShift', hoverRadius: 0.55, hoverColor: '#d946ef' },\n },\n fire: {\n label: 'Fire',\n options: { hoverStrength: 3, hoverEffect: 'spotlight', hoverRadius: 0.5, hoverColor: '#ff6b2b' },\n },\n ice: {\n label: 'Ice',\n options: { hoverStrength: 2, hoverEffect: 'glow', hoverRadius: 0.65, 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 } 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 * 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\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 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 = 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(patch, 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 * Performance-critical: targets 60+ FPS with active hover effects.\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 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 instead of scanning every cell\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\n const hoverIntensity = hoverPos?.intensity ?? 1;\n const hoverActive = !!(hoverPos && options.hoverStrength > 0 && hoverIntensity > 0.005);\n\n // Parse hover color once for reuse\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 // 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 + options.hoverRadius * 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 = options.hoverRadius;\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; // / 255\n const intensity = isInverted ? 1 - lum : lum;\n if (intensity < 0.02) continue;\n\n const animMul = noAnimation ? 1 : 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 // Only set canvas state when it changes\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\n if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n // Use fillRect for tiny dots (faster than arc), arc for larger ones\n if (radius <= 1.5) {\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 ctx.font = `${fontSize}px \"JetBrains Mono\", monospace`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n // Capture the base transform for fast reset after hover scaling\n const baseTransform = ctx.getTransform();\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 : 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 const alpha = Math.min(1, (cell.a * 0.00392156863) * animMul * (1 + hoverGlow));\n if (alpha !== lastAlpha) { ctx.globalAlpha = alpha; lastAlpha = alpha; }\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 if (color !== lastFillStyle) { ctx.fillStyle = color; lastFillStyle = color; }\n\n if (hoverScale !== 1) {\n // Use setTransform instead of font change — avoids expensive font string parsing\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 ctx.globalAlpha = 1;\n}\n\n/**\n * Serialize a frame's cell data compactly for embed use.\n * Returns: [{r,g,b,a,c},...] per row — c = char code for ascii, omitted for dots\n */\nfunction serializeFrame(frame: AsciiFrame, includeChars: boolean): unknown[][] {\n return frame.map(row => row.map(cell => {\n const obj: Record<string, number> = { r: cell.r, g: cell.g, b: cell.b, a: cell.a };\n if (includeChars) obj.c = cell.char.charCodeAt(0);\n else obj.l = Math.round(0.299 * cell.r + 0.587 * cell.g + 0.114 * cell.b);\n return obj;\n }));\n}\n\n/**\n * Build the animation multiplier function as an inlined JS string\n * matching the engine's getAnimationMultiplier.\n */\nfunction buildAnimFnJS(style: AnimationStyle, speed: number): string {\n if (style === 'none') 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 */\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/**\n * Generate a self-contained HTML embed snippet for an ASCII image.\n * Features: canvas rendering, animation loop, hover effects.\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\n const isDots = options.renderMode === 'dots';\n const data = serializeFrame(frame, !isDots);\n const hasAnim = options.animationStyle !== 'none';\n const hasHover = options.hoverStrength > 0;\n const charset = isDots ? '' : options.charset;\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n\n // Check for transparency in frame data\n const hasTransparency = frame.some(row => row.some(cell => cell.a < 200));\n\n return `<!-- Asciify Embed -->\n<canvas id=\"ar-embed\" width=\"${width}\" height=\"${height}\" style=\"${hasTransparency ? '' : 'background:#0a0a0a;'}display:block;\"></canvas>\n<script>\n(function(){\n var D=${JSON.stringify(data)};\n var R=${rows},C=${cols},W=${width},H=${height};\n var cW=W/C,cH=H/R;\n var isDots=${isDots};\n var invert=${options.invert};\n var dotR=${options.dotSizeRatio};\n var hStr=${options.hoverStrength},hRad=${options.hoverRadius};\n var hcR=${hcR},hcG=${hcG},hcB=${hcB};\n var hEff='${options.hoverEffect}';\n var charset=${JSON.stringify(charset)};\n var hasTr=${hasTransparency};\n var cv=document.getElementById('ar-embed'),ctx=cv.getContext('2d');\n var mx=-1,my=-1,mIn=0;\n var getColor=${buildColorFnJS(options)};\n var getAnim=${buildAnimFnJS(options.animationStyle, options.animationSpeed)};\n ${hasHover ? `\n cv.addEventListener('mousemove',function(e){var r=cv.getBoundingClientRect();mx=(e.clientX-r.left)/r.width;my=(e.clientY-r.top)/r.height});\n cv.addEventListener('mouseleave',function(){mx=-1;my=-1});\n function ss(t){return t*t*(3-2*t)}\n ` : ''}\n var smX=.5,smY=.5;\n function draw(t){\n var time=t/1000;\n ctx.clearRect(0,0,W,H);\n if(!hasTr){ctx.fillStyle='#0a0a0a';ctx.fillRect(0,0,W,H)};\n ${hasHover ? `\n if(mx>=0){smX+=(mx-smX)*.1;smY+=(my-smY)*.1;mIn+=(1-mIn)*.12}\n else{mIn*=.96;if(mIn<.003)mIn=0}\n ` : ''}\n for(var y=0;y<R;y++)for(var x=0;x<C;x++){\n var p=D[y][x];if(p.a<10)continue;\n var am=getAnim(x,y,C,R,time);if(am<.05)continue;\n var sc=1,ox=0,oy=0,gl=0,cb=0;\n ${hasHover ? `\n if(mIn>.003&&hStr>0){\n var nx=x/C,ny=y/R,dx=nx-smX,dy=ny-smY,dd=Math.sqrt(dx*dx+dy*dy);\n var rad=(.08+hRad*.35)+hStr*.04;\n if(dd<rad){\n var tt=1-dd/rad,e=ss(tt)*mIn,ang=Math.atan2(dy,dx);\n if(hEff==='spotlight'){sc=1+e*hStr*1.8;var pf=e*e*hStr*.6;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH;gl=e*hStr*.4;cb=e*e*hStr*.25}\n else if(hEff==='magnify'){sc=1+e*hStr*2.5;gl=e*hStr*.15}\n else if(hEff==='repel'){sc=1+e*hStr*.3;var pf=e*e*hStr*1.2;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH}\n else if(hEff==='glow'){gl=e*hStr*.8;cb=e*hStr*.4}\n else if(hEff==='colorShift'){sc=1+e*hStr*.4;gl=e*hStr*.2;cb=e*hStr*.7}\n }\n }\n ` : ''}\n var px=x*cW+cW/2+ox,py=y*cH+cH/2+oy;\n var col=getColor(p);\n if(cb>0){var m=col.match(/rgb\\\\((\\\\d+),(\\\\d+),(\\\\d+)\\\\)/);if(m){var rr=+m[1],gg=+m[2],bb=+m[3];col='rgb('+Math.min(255,Math.round(rr+(hcR-rr)*cb))+','+Math.min(255,Math.round(gg+(hcG-gg)*cb))+','+Math.min(255,Math.round(bb+(hcB-bb)*cb))+')'}}\n if(isDots){\n var lum=p.l/255;var int=invert?1-lum:lum;if(int<.02)continue;\n var rad=Math.min(cW,cH)*.5*dotR*int*am*sc;if(rad<.3)continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*am*(1+gl));\n ctx.fillStyle=col;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill()\n }else{\n var lum=(.299*p.r+.587*p.g+.114*p.b)/255;if(invert)lum=1-lum;\n var ci=Math.floor(lum*(charset.length-1));\n var ch=charset[Math.max(0,Math.min(charset.length-1,ci))];\n if(ch===' ')continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*am*(1+gl));\n ctx.fillStyle=col;\n var fs=Math.min(cW/.55,cH)*.9*sc;\n ctx.font=fs+'px \"JetBrains Mono\",monospace';ctx.textAlign='center';ctx.textBaseline='middle';\n ctx.fillText(ch,px,py)\n }\n }\n ctx.globalAlpha=1;\n ${(hasAnim || hasHover) ? 'requestAnimationFrame(draw)' : ''};\n }\n ${(hasAnim || hasHover) ? 'requestAnimationFrame(draw)' : 'draw(0)'};\n})();\n</script>\n<!-- /Asciify Embed -->`;\n}\n\n/**\n * Generate animated embed code for multi-frame (video) ASCII art.\n * Canvas-based with frame cycling, animation effects, and hover.\n */\nexport function generateAnimatedEmbedCode(\n frames: AsciiFrame[],\n options: AsciiOptions,\n fps: number,\n width: number,\n height: number\n): string {\n const rows = frames[0].length;\n const cols = frames[0][0].length;\n const isDots = options.renderMode === 'dots';\n\n // Serialize all frames compactly\n const allData = frames.map(f => serializeFrame(f, !isDots));\n const hasHover = options.hoverStrength > 0;\n\n const hc = options.hoverColor || '#ffffff';\n const hcR = parseInt(hc.slice(1, 3), 16) || 255;\n const hcG = parseInt(hc.slice(3, 5), 16) || 255;\n const hcB = parseInt(hc.slice(5, 7), 16) || 255;\n const charset = isDots ? '' : options.charset;\n\n // Check for transparency in frame data\n const hasTransparency = frames.some(f => f.some(row => row.some(cell => cell.a < 200)));\n\n return `<!-- Asciify Animated Embed -->\n<canvas id=\"ar-anim\" width=\"${width}\" height=\"${height}\" style=\"${hasTransparency ? '' : 'background:#0a0a0a;'}display:block;\"></canvas>\n<script>\n(function(){\n var F=${JSON.stringify(allData)};\n var R=${rows},C=${cols},W=${width},H=${height},FPS=${fps};\n var cW=W/C,cH=H/R;\n var isDots=${isDots};\n var invert=${options.invert};\n var dotR=${options.dotSizeRatio};\n var hStr=${options.hoverStrength},hRad=${options.hoverRadius};\n var hcR=${hcR},hcG=${hcG},hcB=${hcB};\n var hEff='${options.hoverEffect}';\n var charset=${JSON.stringify(charset)};\n var hasTr=${hasTransparency};\n var cv=document.getElementById('ar-anim'),ctx=cv.getContext('2d');\n var mx=-1,my=-1,mIn=0,smX=.5,smY=.5;\n var fi=0,lastT=0;\n var getColor=${buildColorFnJS(options)};\n ${hasHover ? `\n cv.addEventListener('mousemove',function(e){var r=cv.getBoundingClientRect();mx=(e.clientX-r.left)/r.width;my=(e.clientY-r.top)/r.height});\n cv.addEventListener('mouseleave',function(){mx=-1;my=-1});\n function ss(t){return t*t*(3-2*t)}\n ` : ''}\n function draw(t){\n var time=t/1000;\n if(t-lastT>=1000/FPS){fi=(fi+1)%F.length;lastT=t}\n var D=F[fi];\n ctx.clearRect(0,0,W,H);if(!hasTr){ctx.fillStyle='#0a0a0a';ctx.fillRect(0,0,W,H)};\n ${hasHover ? `\n if(mx>=0){smX+=(mx-smX)*.1;smY+=(my-smY)*.1;mIn+=(1-mIn)*.12}\n else{mIn*=.96;if(mIn<.003)mIn=0}\n ` : ''}\n for(var y=0;y<R;y++)for(var x=0;x<C;x++){\n var p=D[y][x];if(p.a<10)continue;\n var sc=1,ox=0,oy=0,gl=0,cb=0;\n ${hasHover ? `\n if(mIn>.003&&hStr>0){\n var nx=x/C,ny=y/R,dx=nx-smX,dy=ny-smY,dd=Math.sqrt(dx*dx+dy*dy);\n var rad=(.08+hRad*.35)+hStr*.04;\n if(dd<rad){\n var tt=1-dd/rad,e=ss(tt)*mIn,ang=Math.atan2(dy,dx);\n if(hEff==='spotlight'){sc=1+e*hStr*1.8;var pf=e*e*hStr*.6;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH;gl=e*hStr*.4;cb=e*e*hStr*.25}\n else if(hEff==='magnify'){sc=1+e*hStr*2.5;gl=e*hStr*.15}\n else if(hEff==='repel'){sc=1+e*hStr*.3;var pf=e*e*hStr*1.2;ox=Math.cos(ang)*pf*cW;oy=Math.sin(ang)*pf*cH}\n else if(hEff==='glow'){gl=e*hStr*.8;cb=e*hStr*.4}\n else if(hEff==='colorShift'){sc=1+e*hStr*.4;gl=e*hStr*.2;cb=e*hStr*.7}\n }\n }\n ` : ''}\n var px=x*cW+cW/2+ox,py=y*cH+cH/2+oy;\n var col=getColor(p);\n if(cb>0){var m=col.match(/rgb\\\\((\\\\d+),(\\\\d+),(\\\\d+)\\\\)/);if(m){var rr=+m[1],gg=+m[2],bb=+m[3];col='rgb('+Math.min(255,Math.round(rr+(hcR-rr)*cb))+','+Math.min(255,Math.round(gg+(hcG-gg)*cb))+','+Math.min(255,Math.round(bb+(hcB-bb)*cb))+')'}}\n if(isDots){\n var lum=p.l/255;var int=invert?1-lum:lum;if(int<.02)continue;\n var rad=Math.min(cW,cH)*.5*dotR*int*sc;if(rad<.3)continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*(1+gl));\n ctx.fillStyle=col;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill()\n }else{\n var lum=(.299*p.r+.587*p.g+.114*p.b)/255;if(invert)lum=1-lum;\n var ci=Math.floor(lum*(charset.length-1));\n var ch=charset[Math.max(0,Math.min(charset.length-1,ci))];\n if(ch===' ')continue;\n ctx.globalAlpha=Math.min(1,(p.a/255)*(1+gl));\n ctx.fillStyle=col;\n var fs=Math.min(cW/.55,cH)*.9*sc;\n ctx.font=fs+'px \"JetBrains Mono\",monospace';ctx.textAlign='center';ctx.textBaseline='middle';\n ctx.fillText(ch,px,py)\n }\n }\n ctx.globalAlpha=1;\n requestAnimationFrame(draw);\n }\n requestAnimationFrame(draw);\n})();\n</script>\n<!-- /Asciify Animated Embed -->`;\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';
|
|
2
|
+
type RenderMode = 'ascii' | 'dots';
|
|
3
|
+
type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter';
|
|
4
|
+
type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal';
|
|
5
|
+
type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';
|
|
6
|
+
type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';
|
|
7
|
+
type SourceType = 'image' | 'video' | null;
|
|
8
|
+
interface AsciiOptions {
|
|
9
|
+
fontSize: number;
|
|
10
|
+
charSpacing: number;
|
|
11
|
+
brightness: number;
|
|
12
|
+
contrast: number;
|
|
13
|
+
charset: string;
|
|
14
|
+
colorMode: ColorMode;
|
|
15
|
+
accentColor: string;
|
|
16
|
+
invert: boolean;
|
|
17
|
+
renderMode: RenderMode;
|
|
18
|
+
animationStyle: AnimationStyle;
|
|
19
|
+
animationSpeed: number;
|
|
20
|
+
dotSizeRatio: number;
|
|
21
|
+
ditherStrength: number;
|
|
22
|
+
hoverStrength: number;
|
|
23
|
+
hoverRadius: number;
|
|
24
|
+
hoverEffect: HoverEffect;
|
|
25
|
+
hoverColor: string;
|
|
26
|
+
artStyle: ArtStyle;
|
|
27
|
+
}
|
|
28
|
+
interface AsciiCell {
|
|
29
|
+
char: string;
|
|
30
|
+
r: number;
|
|
31
|
+
g: number;
|
|
32
|
+
b: number;
|
|
33
|
+
a: number;
|
|
34
|
+
}
|
|
35
|
+
type AsciiFrame = AsciiCell[][];
|
|
36
|
+
interface AsciiResult {
|
|
37
|
+
frames: AsciiFrame[];
|
|
38
|
+
cols: number;
|
|
39
|
+
rows: number;
|
|
40
|
+
fps: number;
|
|
41
|
+
}
|
|
42
|
+
declare const CHARSETS: {
|
|
43
|
+
readonly standard: " .:-=+*#%@";
|
|
44
|
+
readonly blocks: " ░▒▓█";
|
|
45
|
+
readonly minimal: " .:+";
|
|
46
|
+
readonly dense: " .'`^\",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$";
|
|
47
|
+
readonly binary: "01";
|
|
48
|
+
readonly dots: " ⠁⠃⠇⡇⣇⣧⣷⣿";
|
|
49
|
+
readonly letters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
50
|
+
readonly claudeCode: " ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼";
|
|
51
|
+
};
|
|
52
|
+
type CharsetKey = keyof typeof CHARSETS;
|
|
53
|
+
/**
|
|
54
|
+
* Art Style presets — each one sets render mode, charset, color mode, etc.
|
|
55
|
+
*/
|
|
56
|
+
declare const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>>;
|
|
57
|
+
declare const DEFAULT_OPTIONS: AsciiOptions;
|
|
58
|
+
/**
|
|
59
|
+
* Hover presets — one-click configurations for the hover system.
|
|
60
|
+
*/
|
|
61
|
+
declare const HOVER_PRESETS: Record<HoverPreset, {
|
|
62
|
+
label: string;
|
|
63
|
+
options: Partial<AsciiOptions>;
|
|
64
|
+
}>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Convert an image element or canvas to a single ASCII frame.
|
|
68
|
+
* Now reads alpha channel for transparency support.
|
|
69
|
+
*/
|
|
70
|
+
declare function imageToAsciiFrame(source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement, options: AsciiOptions, targetWidth?: number, targetHeight?: number): {
|
|
71
|
+
frame: AsciiFrame;
|
|
72
|
+
cols: number;
|
|
73
|
+
rows: number;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Extract frames from a video element for ASCII animation.
|
|
77
|
+
*/
|
|
78
|
+
declare function videoToAsciiFrames(video: HTMLVideoElement, options: AsciiOptions, targetWidth: number, targetHeight: number, targetFps?: number, maxDuration?: number, onProgress?: (progress: number) => void): Promise<{
|
|
79
|
+
frames: AsciiFrame[];
|
|
80
|
+
cols: number;
|
|
81
|
+
rows: number;
|
|
82
|
+
fps: number;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Extract frames from an animated GIF file buffer.
|
|
86
|
+
* Uses gifuct-js to parse and decompress GIF frames, then composites
|
|
87
|
+
* them onto a canvas (handling disposal methods) to produce full frames.
|
|
88
|
+
*/
|
|
89
|
+
declare function gifToAsciiFrames(buffer: ArrayBuffer, options: AsciiOptions, targetWidth: number, targetHeight: number, onProgress?: (progress: number) => void): Promise<{
|
|
90
|
+
frames: AsciiFrame[];
|
|
91
|
+
cols: number;
|
|
92
|
+
rows: number;
|
|
93
|
+
fps: number;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Render an ASCII frame to a canvas context.
|
|
97
|
+
* Supports both ASCII text mode and Dots mode.
|
|
98
|
+
* Performance-critical: targets 60+ FPS with active hover effects.
|
|
99
|
+
* @param time - elapsed time in seconds for animation effects
|
|
100
|
+
* @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect
|
|
101
|
+
*/
|
|
102
|
+
declare function renderFrameToCanvas(ctx: CanvasRenderingContext2D, frame: AsciiFrame, options: AsciiOptions, canvasWidth: number, canvasHeight: number, time?: number, hoverPos?: {
|
|
103
|
+
x: number;
|
|
104
|
+
y: number;
|
|
105
|
+
intensity?: number;
|
|
106
|
+
} | null): void;
|
|
107
|
+
/**
|
|
108
|
+
* Generate a self-contained HTML embed snippet for an ASCII image.
|
|
109
|
+
* Features: canvas rendering, animation loop, hover effects.
|
|
110
|
+
*/
|
|
111
|
+
declare function generateEmbedCode(frame: AsciiFrame, options: AsciiOptions, width: number, height: number): string;
|
|
112
|
+
/**
|
|
113
|
+
* Generate animated embed code for multi-frame (video) ASCII art.
|
|
114
|
+
* Canvas-based with frame cycling, animation effects, and hover.
|
|
115
|
+
*/
|
|
116
|
+
declare function generateAnimatedEmbedCode(frames: AsciiFrame[], options: AsciiOptions, fps: number, width: number, height: number): string;
|
|
117
|
+
|
|
118
|
+
export { ART_STYLE_PRESETS, type AnimationStyle, type ArtStyle, type AsciiCell, type AsciiFrame, type AsciiOptions, type AsciiResult, CHARSETS, type CharsetKey, type ColorMode, DEFAULT_OPTIONS, HOVER_PRESETS, type HoverEffect, type HoverPreset, type RenderMode, type SourceType, generateAnimatedEmbedCode, generateEmbedCode, gifToAsciiFrames, imageToAsciiFrame, renderFrameToCanvas, videoToAsciiFrames };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
type ColorMode = 'grayscale' | 'fullcolor' | 'matrix' | 'accent';
|
|
2
|
+
type RenderMode = 'ascii' | 'dots';
|
|
3
|
+
type AnimationStyle = 'none' | 'wave' | 'pulse' | 'rain' | 'breathe' | 'sparkle' | 'glitch' | 'spiral' | 'typewriter' | 'scatter';
|
|
4
|
+
type ArtStyle = 'classic' | 'particles' | 'letters' | 'claudeCode' | 'art' | 'terminal';
|
|
5
|
+
type HoverEffect = 'spotlight' | 'magnify' | 'repel' | 'glow' | 'colorShift';
|
|
6
|
+
type HoverPreset = 'none' | 'subtle' | 'flashlight' | 'magnifier' | 'forceField' | 'neon' | 'fire' | 'ice';
|
|
7
|
+
type SourceType = 'image' | 'video' | null;
|
|
8
|
+
interface AsciiOptions {
|
|
9
|
+
fontSize: number;
|
|
10
|
+
charSpacing: number;
|
|
11
|
+
brightness: number;
|
|
12
|
+
contrast: number;
|
|
13
|
+
charset: string;
|
|
14
|
+
colorMode: ColorMode;
|
|
15
|
+
accentColor: string;
|
|
16
|
+
invert: boolean;
|
|
17
|
+
renderMode: RenderMode;
|
|
18
|
+
animationStyle: AnimationStyle;
|
|
19
|
+
animationSpeed: number;
|
|
20
|
+
dotSizeRatio: number;
|
|
21
|
+
ditherStrength: number;
|
|
22
|
+
hoverStrength: number;
|
|
23
|
+
hoverRadius: number;
|
|
24
|
+
hoverEffect: HoverEffect;
|
|
25
|
+
hoverColor: string;
|
|
26
|
+
artStyle: ArtStyle;
|
|
27
|
+
}
|
|
28
|
+
interface AsciiCell {
|
|
29
|
+
char: string;
|
|
30
|
+
r: number;
|
|
31
|
+
g: number;
|
|
32
|
+
b: number;
|
|
33
|
+
a: number;
|
|
34
|
+
}
|
|
35
|
+
type AsciiFrame = AsciiCell[][];
|
|
36
|
+
interface AsciiResult {
|
|
37
|
+
frames: AsciiFrame[];
|
|
38
|
+
cols: number;
|
|
39
|
+
rows: number;
|
|
40
|
+
fps: number;
|
|
41
|
+
}
|
|
42
|
+
declare const CHARSETS: {
|
|
43
|
+
readonly standard: " .:-=+*#%@";
|
|
44
|
+
readonly blocks: " ░▒▓█";
|
|
45
|
+
readonly minimal: " .:+";
|
|
46
|
+
readonly dense: " .'`^\",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$";
|
|
47
|
+
readonly binary: "01";
|
|
48
|
+
readonly dots: " ⠁⠃⠇⡇⣇⣧⣷⣿";
|
|
49
|
+
readonly letters: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
50
|
+
readonly claudeCode: " ╔╗╚╝║═╠╣╦╩╬░▒▓█│─┌┐└┘├┤┬┴┼";
|
|
51
|
+
};
|
|
52
|
+
type CharsetKey = keyof typeof CHARSETS;
|
|
53
|
+
/**
|
|
54
|
+
* Art Style presets — each one sets render mode, charset, color mode, etc.
|
|
55
|
+
*/
|
|
56
|
+
declare const ART_STYLE_PRESETS: Record<ArtStyle, Partial<AsciiOptions>>;
|
|
57
|
+
declare const DEFAULT_OPTIONS: AsciiOptions;
|
|
58
|
+
/**
|
|
59
|
+
* Hover presets — one-click configurations for the hover system.
|
|
60
|
+
*/
|
|
61
|
+
declare const HOVER_PRESETS: Record<HoverPreset, {
|
|
62
|
+
label: string;
|
|
63
|
+
options: Partial<AsciiOptions>;
|
|
64
|
+
}>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Convert an image element or canvas to a single ASCII frame.
|
|
68
|
+
* Now reads alpha channel for transparency support.
|
|
69
|
+
*/
|
|
70
|
+
declare function imageToAsciiFrame(source: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement, options: AsciiOptions, targetWidth?: number, targetHeight?: number): {
|
|
71
|
+
frame: AsciiFrame;
|
|
72
|
+
cols: number;
|
|
73
|
+
rows: number;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Extract frames from a video element for ASCII animation.
|
|
77
|
+
*/
|
|
78
|
+
declare function videoToAsciiFrames(video: HTMLVideoElement, options: AsciiOptions, targetWidth: number, targetHeight: number, targetFps?: number, maxDuration?: number, onProgress?: (progress: number) => void): Promise<{
|
|
79
|
+
frames: AsciiFrame[];
|
|
80
|
+
cols: number;
|
|
81
|
+
rows: number;
|
|
82
|
+
fps: number;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Extract frames from an animated GIF file buffer.
|
|
86
|
+
* Uses gifuct-js to parse and decompress GIF frames, then composites
|
|
87
|
+
* them onto a canvas (handling disposal methods) to produce full frames.
|
|
88
|
+
*/
|
|
89
|
+
declare function gifToAsciiFrames(buffer: ArrayBuffer, options: AsciiOptions, targetWidth: number, targetHeight: number, onProgress?: (progress: number) => void): Promise<{
|
|
90
|
+
frames: AsciiFrame[];
|
|
91
|
+
cols: number;
|
|
92
|
+
rows: number;
|
|
93
|
+
fps: number;
|
|
94
|
+
}>;
|
|
95
|
+
/**
|
|
96
|
+
* Render an ASCII frame to a canvas context.
|
|
97
|
+
* Supports both ASCII text mode and Dots mode.
|
|
98
|
+
* Performance-critical: targets 60+ FPS with active hover effects.
|
|
99
|
+
* @param time - elapsed time in seconds for animation effects
|
|
100
|
+
* @param hoverPos - optional smoothed mouse position {x, y, intensity} for hover effect
|
|
101
|
+
*/
|
|
102
|
+
declare function renderFrameToCanvas(ctx: CanvasRenderingContext2D, frame: AsciiFrame, options: AsciiOptions, canvasWidth: number, canvasHeight: number, time?: number, hoverPos?: {
|
|
103
|
+
x: number;
|
|
104
|
+
y: number;
|
|
105
|
+
intensity?: number;
|
|
106
|
+
} | null): void;
|
|
107
|
+
/**
|
|
108
|
+
* Generate a self-contained HTML embed snippet for an ASCII image.
|
|
109
|
+
* Features: canvas rendering, animation loop, hover effects.
|
|
110
|
+
*/
|
|
111
|
+
declare function generateEmbedCode(frame: AsciiFrame, options: AsciiOptions, width: number, height: number): string;
|
|
112
|
+
/**
|
|
113
|
+
* Generate animated embed code for multi-frame (video) ASCII art.
|
|
114
|
+
* Canvas-based with frame cycling, animation effects, and hover.
|
|
115
|
+
*/
|
|
116
|
+
declare function generateAnimatedEmbedCode(frames: AsciiFrame[], options: AsciiOptions, fps: number, width: number, height: number): string;
|
|
117
|
+
|
|
118
|
+
export { ART_STYLE_PRESETS, type AnimationStyle, type ArtStyle, type AsciiCell, type AsciiFrame, type AsciiOptions, type AsciiResult, CHARSETS, type CharsetKey, type ColorMode, DEFAULT_OPTIONS, HOVER_PRESETS, type HoverEffect, type HoverPreset, type RenderMode, type SourceType, generateAnimatedEmbedCode, generateEmbedCode, gifToAsciiFrames, imageToAsciiFrame, renderFrameToCanvas, videoToAsciiFrames };
|