image-to-pixel 3.0.0 → 3.1.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.
Files changed (71) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +2 -2
  3. package/dist/editor.css +1 -1
  4. package/dist/editor.css.map +2 -2
  5. package/dist/editor.esm.js +60 -60
  6. package/dist/editor.esm.js.map +4 -4
  7. package/dist/fonts/README.md +6 -6
  8. package/dist/fonts/geist-LICENSE.txt +93 -93
  9. package/dist/image-to-pixel.bundle.esm.js +16 -16
  10. package/dist/image-to-pixel.bundle.esm.js.map +3 -3
  11. package/dist/image-to-pixel.cjs +2 -2
  12. package/dist/image-to-pixel.cjs.map +2 -2
  13. package/dist/image-to-pixel.esm.js +2 -2
  14. package/dist/image-to-pixel.esm.js.map +2 -2
  15. package/dist/image-to-pixel.js +2 -2
  16. package/dist/image-to-pixel.js.map +2 -2
  17. package/dist/image-to-pixel.min.js +11 -11
  18. package/dist/image-to-pixel.min.js.map +3 -3
  19. package/dist/video.esm.js +2 -2
  20. package/dist/video.esm.js.map +4 -4
  21. package/lib/core/color.js +69 -69
  22. package/lib/core/cpu/pipeline.js +21 -21
  23. package/lib/core/cpu/stages.js +227 -227
  24. package/lib/core/dither/bluenoise-data.js +3 -3
  25. package/lib/core/dither/kernels.js +27 -27
  26. package/lib/core/dither/matrices.js +95 -95
  27. package/lib/core/engine.js +158 -158
  28. package/lib/core/export/canvas.js +22 -22
  29. package/lib/core/export/crc32.js +15 -15
  30. package/lib/core/export/gif.js +153 -153
  31. package/lib/core/export/png.js +94 -94
  32. package/lib/core/export/scale.js +103 -103
  33. package/lib/core/export/sheet.js +95 -95
  34. package/lib/core/export/zip.js +55 -55
  35. package/lib/core/gpu/backend.js +159 -159
  36. package/lib/core/gpu/shaders.js +258 -258
  37. package/lib/core/palette/builtin.js +36 -36
  38. package/lib/core/palette/extract.js +69 -69
  39. package/lib/core/palette/lospec.js +24 -24
  40. package/lib/core/palette/parse.js +112 -112
  41. package/lib/core/plan.js +58 -58
  42. package/lib/core/presets.js +42 -42
  43. package/lib/core/settings.js +274 -274
  44. package/lib/core/source.js +89 -89
  45. package/lib/core/video/audio.js +159 -0
  46. package/lib/core/video/frames.js +38 -0
  47. package/lib/core/video/mux-mp4.js +213 -24
  48. package/lib/core/video/mux-webm.js +63 -22
  49. package/lib/editor/controls.js +139 -139
  50. package/lib/editor/dom.js +65 -65
  51. package/lib/editor/exporter.js +43 -3
  52. package/lib/editor/icons.js +4 -0
  53. package/lib/editor/index.js +218 -9
  54. package/lib/editor/inspector.js +19 -4
  55. package/lib/editor/library.js +8 -2
  56. package/lib/editor/persist.js +18 -18
  57. package/lib/editor/samples.js +90 -90
  58. package/lib/editor/stage.js +239 -239
  59. package/lib/editor/store.js +80 -80
  60. package/lib/editor/styles/editor.css +34 -1
  61. package/lib/editor/styles/fonts/README.md +6 -6
  62. package/lib/editor/styles/fonts/geist-LICENSE.txt +93 -93
  63. package/lib/editor/styles/tokens.css +89 -89
  64. package/lib/editor/ui.js +97 -97
  65. package/lib/editor/workspace.js +62 -0
  66. package/lib/index.js +31 -29
  67. package/lib/video.js +37 -7
  68. package/package.json +1 -1
  69. package/types/editor.d.ts +34 -34
  70. package/types/index.d.ts +196 -196
  71. package/types/video.d.ts +61 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../lib/core/color.js", "../lib/core/export/scale.js", "../lib/core/palette/parse.js", "../lib/core/palette/lospec.js", "../lib/core/video/frames.js", "../lib/core/video/mux-mp4.js", "../lib/core/video/mux-webm.js", "../lib/video.js", "../lib/core/palette/builtin.js", "../lib/core/settings.js", "../lib/core/plan.js", "../lib/core/dither/bluenoise-data.js", "../lib/core/dither/matrices.js", "../lib/core/dither/kernels.js", "../lib/core/palette/extract.js", "../lib/core/cpu/stages.js", "../lib/core/cpu/pipeline.js", "../node_modules/shadermate/src/constants.js", "../node_modules/shadermate/src/utils/util.js", "../node_modules/shadermate/src/core/RefPool.js", "../node_modules/shadermate/src/core/events.js", "../node_modules/shadermate/src/core/tween.js", "../node_modules/shadermate/src/core/passes.js", "../node_modules/shadermate/src/gl/context.js", "../node_modules/shadermate/src/gl/quad.js", "../node_modules/shadermate/src/gl/shader.js", "../node_modules/shadermate/src/glsl/templates.js", "../node_modules/shadermate/src/gl/blit.js", "../node_modules/shadermate/src/gl/params.js", "../node_modules/shadermate/src/gl/targets.js", "../node_modules/shadermate/src/glsl/builtins.js", "../node_modules/shadermate/src/glsl/preprocess.js", "../node_modules/shadermate/src/loaders/image.js", "../node_modules/shadermate/src/loaders/cubemap.js", "../node_modules/shadermate/src/loaders/video.js", "../node_modules/shadermate/src/loaders/audio.js", "../node_modules/shadermate/src/loaders/element.js", "../node_modules/shadermate/src/loaders/keyboard.js", "../node_modules/shadermate/src/loaders/index.js", "../node_modules/shadermate/src/glsl/fragcoord.js", "../node_modules/shadermate/src/core/samplers.js", "../node_modules/shadermate/src/input/camera.js", "../node_modules/shadermate/src/uniforms/types.js", "../node_modules/shadermate/src/uniforms/apply.js", "../node_modules/shadermate/src/input/pointer.js", "../node_modules/shadermate/src/view/sizing.js", "../node_modules/shadermate/src/view/visibility.js", "../node_modules/shadermate/src/ui/theme.js", "../node_modules/shadermate/src/ui/stats.js", "../node_modules/shadermate/src/ui/errorOverlay.js", "../node_modules/shadermate/src/capture/capture.js", "../node_modules/shadermate/src/core/create.js", "../lib/core/gpu/shaders.js", "../lib/core/gpu/backend.js", "../lib/core/source.js", "../lib/core/engine.js", "../lib/core/export/canvas.js", "../lib/core/export/crc32.js", "../lib/core/export/png.js", "../lib/editor/index.js", "../lib/core/presets.js", "../lib/editor/dom.js", "../lib/editor/icons.js", "../lib/editor/store.js", "../lib/editor/stage.js", "../lib/editor/controls.js", "../lib/core/export/gif.js", "../lib/core/export/zip.js", "../lib/core/export/sheet.js", "../lib/editor/exporter.js", "../lib/editor/ui.js", "../lib/editor/persist.js", "../lib/editor/inspector.js", "../lib/editor/library.js", "../lib/editor/samples.js"],
4
- "sourcesContent": ["// Colour helpers shared by the CPU path, the GPU uniforms and the editor.\n// All channel values are sRGB in 0..1 unless a name says otherwise.\n\n/** Parse '#rgb', '#rrggbb', '#rrggbbaa', 'rrggbb' or [r,g,b] (0..255) into [r, g, b] bytes. */\nexport function parseColor(c) {\n if (Array.isArray(c)) return [c[0] | 0, c[1] | 0, c[2] | 0];\n let s = String(c).trim().replace(/^#|^0x/i, '');\n if (s.length === 3 || s.length === 4) s = s.slice(0, 3).split('').map(ch => ch + ch).join('');\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(s)) throw new Error(`Invalid colour \"${c}\"`);\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\n}\n\n/** True when `c` parses as a colour. */\nexport function isColor(c) {\n try { parseColor(c); return true; } catch { return false; }\n}\n\n/** [r, g, b] bytes \u2192 '#rrggbb'. */\nexport function toHex(rgb) {\n return '#' + rgb.slice(0, 3).map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');\n}\n\n/** Normalise any colour to '#rrggbb' (lower case). */\nexport const normHex = c => toHex(parseColor(c));\n\nconst lin = c => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\n\n/** sRGB (0..1) \u2192 OKLab [L, a, b]. Same maths as the GLSL `oklab()` in gpu/shaders.js. */\nexport function oklab(r, g, b) {\n r = lin(r); g = lin(g); b = lin(b);\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,\n ];\n}\n\n/** Relative luminance-ish weight used by saturation (Rec. 709). */\nexport const LUMA = [0.2126, 0.7152, 0.0722];\n\n/** Perceived lightness 0..1 of a hex colour; handy for picking text colours on swatches. */\nexport function lightness(hex) {\n const [r, g, b] = parseColor(hex);\n return oklab(r / 255, g / 255, b / 255)[0];\n}\n\n/**\n * Average distance (sRGB 0..1) from each palette colour to its nearest neighbour.\n * Ordered dithering scales its threshold by this so `strength` means the same thing\n * for a 2-colour and a 64-colour palette.\n */\nexport function paletteSpread(rgbs) {\n if (rgbs.length < 2) return 1;\n let sum = 0;\n for (let i = 0; i < rgbs.length; i++) {\n let best = Infinity;\n for (let j = 0; j < rgbs.length; j++) {\n if (i === j) continue;\n const dr = rgbs[i][0] - rgbs[j][0], dg = rgbs[i][1] - rgbs[j][1], db = rgbs[i][2] - rgbs[j][2];\n const d = Math.sqrt(dr * dr + dg * dg + db * db);\n if (d < best) best = d;\n }\n sum += best;\n }\n return Math.max(0.04, Math.min(1, sum / rgbs.length / 255));\n}\n", "// Pure pixel helpers (no DOM): integer upscaling, grid lines, colour counting.\n\nimport { parseColor, toHex } from '../color.js';\n\n/**\n * Nearest-neighbour integer upscale.\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\n * @param {number} k scale factor (integer \u2265 1)\n * @param {{ grid?: boolean, gridColor?: string, gridAlpha?: number }} [opts] grid: 1px lines between source pixels\n */\nexport function upscale(img, k = 1, opts = {}) {\n k = Math.max(1, Math.round(k));\n const w = img.width * k, h = img.height * k;\n const out = new Uint8ClampedArray(w * h * 4);\n const src = img.data, sw = img.width;\n for (let y = 0; y < h; y++) {\n const sy = (y / k) | 0;\n for (let x = 0; x < w; x++) {\n const so = (sy * sw + ((x / k) | 0)) * 4, o = (y * w + x) * 4;\n out[o] = src[so]; out[o + 1] = src[so + 1]; out[o + 2] = src[so + 2]; out[o + 3] = src[so + 3];\n }\n }\n if (opts.grid && k >= 3) {\n const [r, g, b] = parseColor(opts.gridColor || '#000000');\n const a = opts.gridAlpha ?? 0.35;\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\n if (x % k && y % k) continue;\n const o = (y * w + x) * 4;\n const sa = out[o + 3] / 255, oa = a + sa * (1 - a);\n out[o] = (r * a + out[o] * sa * (1 - a)) / oa;\n out[o + 1] = (g * a + out[o + 1] * sa * (1 - a)) / oa;\n out[o + 2] = (b * a + out[o + 2] * sa * (1 - a)) / oa;\n out[o + 3] = oa * 255;\n }\n }\n return { width: w, height: h, data: out };\n}\n\n/**\n * Nearest-neighbour resize to any size (used to export at the source's resolution, like 2.x's\n * \"full resolution\" download). Pixels may differ by one in size when the ratio isn't whole.\n */\nexport function resizeNearest(img, width, height) {\n width = Math.max(1, Math.round(width)); height = Math.max(1, Math.round(height));\n const out = new Uint8ClampedArray(width * height * 4);\n const xs = new Int32Array(width);\n for (let x = 0; x < width; x++) xs[x] = Math.min(img.width - 1, Math.floor((x + 0.5) * img.width / width));\n for (let y = 0; y < height; y++) {\n const sy = Math.min(img.height - 1, Math.floor((y + 0.5) * img.height / height));\n for (let x = 0; x < width; x++) {\n const so = (sy * img.width + xs[x]) * 4, o = (y * width + x) * 4;\n out[o] = img.data[so]; out[o + 1] = img.data[so + 1]; out[o + 2] = img.data[so + 2]; out[o + 3] = img.data[so + 3];\n }\n }\n return { width, height, data: out };\n}\n\n/** Distinct opaque colours in an image ('#rrggbb'), in order of first appearance. */\nexport function uniqueColors(img, limit = Infinity) {\n const seen = new Set();\n const d = img.data;\n for (let o = 0; o < d.length; o += 4) {\n if (d[o + 3] === 0) continue;\n seen.add((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\n if (seen.size > limit) break;\n }\n return [...seen].map(v => toHex([v >> 16, (v >> 8) & 255, v & 255]));\n}\n\n/** True when the image has at least one non-opaque pixel. */\nexport function hasTransparency(img) {\n for (let o = 3; o < img.data.length; o += 4) if (img.data[o] < 255) return true;\n return false;\n}\n\n/**\n * Detect the pixel-grid size of an upscaled pixel-art image (e.g. a sprite saved at 4\u00D7).\n * Returns the largest block size b such that the image is made of b\u00D7b solid blocks\n * (allowing a small tolerance for JPEG noise), or 1.\n */\nexport function detectGrid(img, tolerance = 8) {\n const { width: w, height: h, data: d } = img;\n const same = (a, b) => Math.abs(d[a] - d[b]) <= tolerance && Math.abs(d[a + 1] - d[b + 1]) <= tolerance && Math.abs(d[a + 2] - d[b + 2]) <= tolerance && Math.abs(d[a + 3] - d[b + 3]) <= tolerance;\n // run lengths along rows and columns; the block size divides all of them (mostly)\n const gcd = (a, b) => (b ? gcd(b, a % b) : a);\n let g = 0;\n const stepY = Math.max(1, Math.floor(h / 64)), stepX = Math.max(1, Math.floor(w / 64));\n for (let y = 0; y < h; y += stepY) {\n let run = 1;\n for (let x = 1; x < w; x++) {\n if (same((y * w + x) * 4, (y * w + x - 1) * 4)) run++;\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\n }\n }\n for (let x = 0; x < w; x += stepX) {\n let run = 1;\n for (let y = 1; y < h; y++) {\n if (same((y * w + x) * 4, ((y - 1) * w + x) * 4)) run++;\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\n }\n }\n return g || 1;\n}\n", "// Palette file formats. Every parser returns { name, colors: ['#rrggbb', \u2026] }.\n//\n// .gpl GIMP / Aseprite / Krita palette\n// .hex one hex colour per line (Lospec \"HEX file\")\n// .txt Paint.NET palette (AARRGGBB per line, ';' comments)\n// .pal JASC-PAL (Paint Shop Pro, Aseprite export)\n// .json Lospec JSON ({ name, colors: ['rrggbb'] }), this tool's own export, or a plain array\n// anything else: every #hex / 6-digit token found in the text\n\nimport { normHex } from '../color.js';\n\nconst dedupe = list => [...new Set(list)];\n\nexport function parseGPL(text) {\n const lines = text.split(/\\r?\\n/);\n if (!/^GIMP Palette/i.test(lines[0] || '')) throw new Error('Not a GIMP palette (missing \"GIMP Palette\" header)');\n let name = '';\n const colors = [];\n for (const raw of lines.slice(1)) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n const nm = /^Name:\\s*(.*)$/i.exec(line);\n if (nm) { name = nm[1].trim(); continue; }\n if (/^Columns:/i.test(line)) continue;\n const m = /^(\\d{1,3})\\s+(\\d{1,3})\\s+(\\d{1,3})/.exec(line);\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\n }\n return { name, colors };\n}\n\nexport function parseHexList(text) {\n const colors = [];\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith(';') || line.startsWith('//')) continue;\n const m = /^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\\b/i.exec(line);\n if (!m) continue;\n // 8 digits in a .txt palette are AARRGGBB (Paint.NET); in a .hex file they are rare, treat the same\n const h = m[1].length === 8 ? m[1].slice(2) : m[1];\n colors.push(normHex(h));\n }\n return { name: '', colors };\n}\n\nexport function parseJASC(text) {\n const lines = text.split(/\\r?\\n/).map(l => l.trim());\n if (lines[0] !== 'JASC-PAL') throw new Error('Not a JASC palette');\n const n = parseInt(lines[2], 10) || 0;\n const colors = [];\n for (let i = 3; i < 3 + n && i < lines.length; i++) {\n const m = /^(\\d+)\\s+(\\d+)\\s+(\\d+)/.exec(lines[i]);\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\n }\n return { name: '', colors };\n}\n\nexport function parseJSON(text) {\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\n const list = Array.isArray(obj) ? obj : (obj.colors || obj.palette || []);\n const colors = list.map(c => (typeof c === 'object' && c ? (c.hex || c.color) : c)).filter(Boolean).map(normHex);\n return { name: (!Array.isArray(obj) && obj.name) || '', colors };\n}\n\n/** Pull every hex-looking token out of free text (pasted CSS, a tweet, a Lospec page). */\nexport function parseLoose(text) {\n const colors = [];\n const re = /#?\\b([0-9a-f]{6})\\b/gi;\n let m;\n while ((m = re.exec(text))) colors.push(normHex(m[1]));\n return { name: '', colors };\n}\n\n/**\n * Parse palette text by file name / content sniffing.\n * @param {string} text\n * @param {string} [filename]\n * @returns {{ name: string, colors: string[] }}\n */\nexport function parsePalette(text, filename = '') {\n const ext = (/\\.([a-z0-9]+)$/i.exec(filename) || [])[1]?.toLowerCase() || '';\n const t = String(text).replace(/^\uFEFF/, '');\n const trimmed = t.trim();\n let out;\n if (ext === 'gpl' || /^GIMP Palette/i.test(trimmed)) out = parseGPL(trimmed);\n else if (ext === 'pal' || trimmed.startsWith('JASC-PAL')) out = parseJASC(trimmed);\n else if (ext === 'json' || trimmed.startsWith('{') || trimmed.startsWith('[')) out = parseJSON(trimmed);\n else if (ext === 'hex' || ext === 'txt') out = parseHexList(trimmed);\n else {\n out = parseHexList(trimmed);\n if (!out.colors.length) out = parseLoose(trimmed);\n }\n out.colors = dedupe(out.colors).slice(0, 256);\n if (!out.name && filename) out.name = filename.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ');\n if (!out.colors.length) throw new Error('No colours found in that palette');\n return out;\n}\n\n/** Palette \u2192 .gpl text. */\nexport function toGPL(name, colors) {\n const rows = colors.map(c => {\n const h = normHex(c);\n const r = parseInt(h.slice(1, 3), 16), g = parseInt(h.slice(3, 5), 16), b = parseInt(h.slice(5, 7), 16);\n return `${String(r).padStart(3)} ${String(g).padStart(3)} ${String(b).padStart(3)}\\t${h.slice(1)}`;\n });\n return `GIMP Palette\\nName: ${name || 'Palette'}\\nColumns: 8\\n#\\n${rows.join('\\n')}\\n`;\n}\n\n/** Palette \u2192 .hex text. */\nexport const toHexFile = colors => colors.map(c => normHex(c).slice(1)).join('\\n') + '\\n';\n\n/** Palette \u2192 JSON text (Lospec-compatible shape). */\nexport const toPaletteJSON = (name, colors) => JSON.stringify({ name: name || 'Palette', colors: colors.map(c => normHex(c).slice(1)) }, null, 2);\n", "// Lospec palette lookup by slug, e.g. 'rgbg-36' from https://lospec.com/palette-list/rgbg-36\n\nimport { parseJSON } from './parse.js';\n\n/** Turn a slug or a full Lospec URL into a slug. */\nexport function lospecSlug(input) {\n const s = String(input || '').trim();\n const m = /palette-list\\/([a-z0-9-]+)/i.exec(s);\n return (m ? m[1] : s).toLowerCase().replace(/\\.(json|hex|gpl)$/, '');\n}\n\n/**\n * Fetch a palette from Lospec. Needs network access; the editor caches results.\n * @returns {Promise<{ name: string, colors: string[], author?: string, slug: string }>}\n */\nexport async function fetchLospec(slugOrUrl, { fetch: f = globalThis.fetch } = {}) {\n const slug = lospecSlug(slugOrUrl);\n if (!/^[a-z0-9-]+$/.test(slug)) throw new Error('That does not look like a Lospec palette slug');\n const res = await f(`https://lospec.com/palette-list/${slug}.json`);\n if (!res.ok) throw new Error(`Lospec returned ${res.status} for \"${slug}\"`);\n const json = await res.json();\n const p = parseJSON(json);\n return { name: json.name || slug, author: json.author || '', colors: p.colors, slug };\n}\n", "// Frame-accurate stepping through an HTMLVideoElement by seeking to the middle of each frame.\n// Seeking (instead of playing) means every frame is visited exactly once, regardless of how\n// long processing takes, and the same input always produces the same frames.\n\nconst wait = (el, ev, ms = 4000) => new Promise((res, rej) => {\n const t = setTimeout(() => { el.removeEventListener(ev, ok); rej(new Error(`Timed out waiting for \"${ev}\"`)); }, ms);\n const ok = () => { clearTimeout(t); res(); };\n el.addEventListener(ev, ok, { once: true });\n});\n\nconst MEDIA_ERRORS = {\n 1: 'loading was aborted',\n 2: 'a network error stopped the download',\n 3: 'the browser could not decode it',\n 4: \"this browser can't play this video's format\",\n};\n\n/** Turn a <video>'s MediaError into a readable Error (err.code is the MediaError code). */\nexport function mediaError(video) {\n const code = video.error ? video.error.code : 0;\n const err = new Error(MEDIA_ERRORS[code] || 'the video could not be loaded');\n err.code = code;\n if (video.error && video.error.message) err.detail = video.error.message;\n return err;\n}\n\n/** Resolve on `ok`, reject straight away if the media element reports an error. */\nconst waitOrFail = (video, ok, ms) => new Promise((res, rej) => {\n const done = () => { clearTimeout(t); video.removeEventListener(ok, onOk); video.removeEventListener('error', onErr); };\n const onOk = () => { done(); res(); };\n const onErr = () => { done(); rej(mediaError(video)); };\n const t = setTimeout(() => { done(); rej(new Error(`no response from the video decoder after ${ms / 1000} s`)); }, ms);\n video.addEventListener(ok, onOk, { once: true });\n video.addEventListener('error', onErr, { once: true });\n});\n\n/**\n * Wait until a video's metadata (size, duration) and first frame are available.\n * Rejects immediately with a readable message when the browser can't play the file.\n */\nexport async function videoReady(video, { timeout = 60000 } = {}) {\n if (video.error) throw mediaError(video);\n if (video.readyState < 1) await waitOrFail(video, 'loadedmetadata', timeout);\n if (video.readyState < 2) await waitOrFail(video, 'loadeddata', timeout).catch(e => { if (e.code) throw e; });\n return video;\n}\n\n/**\n * Best-effort codec name for an MP4/MOV/WebM file, read from its bytes. Used to explain playback errors.\n * @param {Blob} file\n * @returns {Promise<string>} e.g. 'H.265 (HEVC)', or '' when unknown\n */\nexport async function sniffVideoCodec(file) {\n const buf = new Uint8Array(await file.arrayBuffer());\n const NAMES = { avc1: 'H.264', avc3: 'H.264', hvc1: 'H.265 (HEVC)', hev1: 'H.265 (HEVC)', av01: 'AV1', vp09: 'VP9', vp08: 'VP8', mp4v: 'MPEG-4 Part 2', apcn: 'ProRes', apch: 'ProRes', apcs: 'ProRes', apco: 'ProRes', ap4h: 'ProRes 4444', dvh1: 'Dolby Vision', dvhe: 'Dolby Vision' };\n // MP4/MOV: the first sample entry of the 'stsd' box names the codec\n for (let i = 0; i + 24 < buf.length; i++) {\n if (buf[i] === 0x73 && buf[i + 1] === 0x74 && buf[i + 2] === 0x73 && buf[i + 3] === 0x64) {\n const type = String.fromCharCode(buf[i + 16], buf[i + 17], buf[i + 18], buf[i + 19]);\n if (NAMES[type]) return NAMES[type];\n }\n }\n // WebM/Matroska: CodecID strings such as V_VP9, V_AV1, V_MPEGH/ISO/HEVC\n const head = new TextDecoder('latin1').decode(buf.subarray(0, Math.min(buf.length, 1 << 20)));\n const m = /V_(VP8|VP9|AV1|MPEG4\\/ISO\\/AVC|MPEGH\\/ISO\\/HEVC)/.exec(head);\n if (m) return { VP8: 'VP8', VP9: 'VP9', AV1: 'AV1', 'MPEG4/ISO/AVC': 'H.264', 'MPEGH/ISO/HEVC': 'H.265 (HEVC)' }[m[1]];\n return '';\n}\n\n/** Seek and resolve once the frame at `time` is decoded and paintable. */\nexport async function seekTo(video, time) {\n time = Math.max(0, Math.min(time, (video.duration || 0) - 1e-4));\n if (Math.abs(video.currentTime - time) < 1e-6 && video.readyState >= 2) return;\n const presented = 'requestVideoFrameCallback' in video\n ? new Promise(res => { video.requestVideoFrameCallback(() => res()); setTimeout(res, 500); })\n : null;\n const seeked = wait(video, 'seeked');\n video.currentTime = time;\n await seeked;\n if (presented) await presented;\n}\n\n/**\n * Estimate the frame rate from presented frames (requestVideoFrameCallback), falling back to `fallback`.\n * Plays muted for a moment and restores the position.\n */\nexport async function estimateFps(video, fallback = 30) {\n if (!('requestVideoFrameCallback' in video)) return fallback;\n await videoReady(video);\n const was = { t: video.currentTime, muted: video.muted, paused: video.paused };\n const times = [];\n try {\n video.muted = true;\n await new Promise((res) => {\n const done = setTimeout(res, 1200);\n const cb = (_, meta) => {\n times.push(meta.mediaTime);\n if (times.length >= 12) { clearTimeout(done); res(); } else video.requestVideoFrameCallback(cb);\n };\n video.requestVideoFrameCallback(cb);\n video.play().catch(() => { clearTimeout(done); res(); });\n });\n } finally {\n video.pause();\n video.muted = was.muted;\n await seekTo(video, was.t).catch(() => { });\n }\n const deltas = [];\n for (let i = 1; i < times.length; i++) { const d = times[i] - times[i - 1]; if (d > 0.001) deltas.push(d); }\n if (deltas.length < 3) return fallback;\n deltas.sort((a, b) => a - b);\n const fps = 1 / deltas[Math.floor(deltas.length / 2)];\n // snap to common rates\n for (const r of [12, 15, 23.976, 24, 25, 29.97, 30, 48, 50, 59.94, 60]) if (Math.abs(fps - r) < 0.6) return r;\n return Math.round(fps);\n}\n\n/** Frame times (seconds, middle of each frame) for a clip. */\nexport function frameTimes({ duration, fps, start = 0, end = duration, maxFrames = Infinity }) {\n const out = [];\n const n = Math.min(maxFrames, Math.max(1, Math.floor((end - start) * fps + 1e-6)));\n for (let i = 0; i < n; i++) out.push(start + (i + 0.5) / fps);\n return out;\n}\n\n/**\n * Visit frames one by one.\n * @param {HTMLVideoElement} video\n * @param {{ fps: number, start?: number, end?: number, maxFrames?: number, signal?: AbortSignal,\n * onFrame: (info: { index: number, time: number, total: number }) => any }} opts\n */\nexport async function forEachFrame(video, opts) {\n await videoReady(video);\n const wasPaused = video.paused;\n video.pause();\n const times = frameTimes({ duration: video.duration, ...opts });\n for (let i = 0; i < times.length; i++) {\n if (opts.signal && opts.signal.aborted) throw new DOMException('Aborted', 'AbortError');\n await seekTo(video, times[i]);\n await opts.onFrame({ index: i, time: times[i], total: times.length });\n }\n if (!wasPaused) video.play().catch(() => { });\n return times.length;\n}\n", "// Minimal MP4 (ISO BMFF) muxer for one H.264 video track. Everything is buffered in memory and\n// written with the 'moov' box first (\"fast start\"), so the file plays and seeks while downloading.\n// Input: AVCC samples (length-prefixed NAL units, as WebCodecs' VideoEncoder emits with\n// avc.format 'avc') plus the AVCDecoderConfigurationRecord ('description').\n\nconst ENC = new TextEncoder();\n\nclass Writer {\n constructor() { this.parts = []; this.size = 0; }\n u8(v) { return this.bytes([v & 255]); }\n u16(v) { return this.bytes([(v >>> 8) & 255, v & 255]); }\n u32(v) { return this.bytes([(v >>> 24) & 255, (v >>> 16) & 255, (v >>> 8) & 255, v & 255]); }\n str(s) { return this.bytes(ENC.encode(s)); }\n bytes(b) { const a = b instanceof Uint8Array ? b : Uint8Array.from(b); this.parts.push(a); this.size += a.length; return this; }\n zeros(n) { return this.bytes(new Uint8Array(n)); }\n out() { const r = new Uint8Array(this.size); let o = 0; for (const p of this.parts) { r.set(p, o); o += p.length; } return r; }\n}\n\n/** A box: 4-byte size, 4-char type, then the body produced by fill(w). */\nfunction box(type, fill) {\n const w = new Writer();\n fill(w);\n const body = w.out();\n const head = new Writer().u32(body.length + 8).str(type).out();\n const r = new Uint8Array(body.length + 8); r.set(head); r.set(body, 8);\n return r;\n}\nconst fullBox = (type, version, flags, fill) => box(type, w => { w.u8(version).u8(flags >> 16).u8(flags >> 8).u8(flags); fill(w); });\nconst MATRIX = [0x10000, 0, 0, 0, 0x10000, 0, 0, 0, 0x40000000];\n\n/**\n * @param {{ width: number, height: number, timescale?: number }} opts\n */\nexport function createMp4Muxer({ width, height, timescale = 90000 }) {\n const samples = []; // { data, key, ts, dur } with ts/dur in microseconds\n let description = null;\n\n return {\n /** Use with a VideoEncoder `output` callback. */\n addChunk(chunk, meta) {\n if (meta && meta.decoderConfig && meta.decoderConfig.description && !description) {\n const d = meta.decoderConfig.description;\n description = new Uint8Array(d instanceof ArrayBuffer ? d : d.buffer.slice(d.byteOffset, d.byteOffset + d.byteLength));\n }\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n samples.push({ data, key: chunk.type === 'key', ts: chunk.timestamp, dur: chunk.duration || 0 });\n },\n /** Lower-level: add an AVCC sample directly. ts/dur in microseconds. */\n addSample(data, { key, timestamp, duration }) { samples.push({ data, key: !!key, ts: timestamp, dur: duration || 0 }); },\n /** AVCDecoderConfigurationRecord ('avcC' contents). */\n setDescription(d) { description = d; },\n\n /** @returns {Uint8Array} the .mp4 file */\n finish() {\n if (!samples.length) throw new Error('No video frames were encoded');\n if (!description) throw new Error('The encoder gave no H.264 decoder configuration (avcC)');\n // Samples arrive in decode order with presentation timestamps (B-frames make them non-monotonic).\n // Decode times are the sorted presentation times; 'ctts' holds the difference when there is one.\n const t = us => Math.round(us * timescale / 1e6);\n const pts = samples.map(s => t(s.ts));\n const dts = pts.slice().sort((a, b) => a - b);\n const lastDur = t(samples[samples.length - 1].dur) || (dts.length > 1 ? dts[dts.length - 1] - dts[dts.length - 2] : t(33333));\n const durs = dts.map((d, i) => (i + 1 < dts.length ? dts[i + 1] - d : lastDur));\n const offsets = pts.map((p, i) => p - dts[i]);\n const hasOffsets = offsets.some(o => o !== 0);\n const mediaDur = durs.reduce((a, b) => a + b, 0);\n const movieDur = Math.round(mediaDur * 1000 / timescale);\n\n const stts = [];\n for (const d of durs) { const last = stts[stts.length - 1]; if (last && last[1] === d) last[0]++; else stts.push([1, d]); }\n const ctts = [];\n for (const o of offsets) { const last = ctts[ctts.length - 1]; if (last && last[1] === o) last[0]++; else ctts.push([1, o]); }\n const keys = samples.map((s, i) => (s.key ? i + 1 : 0)).filter(Boolean);\n const dataSize = samples.reduce((a, s) => a + s.data.length, 0);\n\n const ftyp = box('ftyp', w => w.str('isom').u32(512).str('isom').str('iso2').str('avc1').str('mp41'));\n const buildMoov = chunkOffset => box('moov', w => {\n w.bytes(fullBox('mvhd', 0, 0, b => {\n b.u32(0).u32(0).u32(1000).u32(movieDur).u32(0x00010000).u16(0x0100).zeros(10);\n MATRIX.forEach(v => b.u32(v)); b.zeros(24).u32(2);\n }));\n w.bytes(box('trak', tr => {\n tr.bytes(fullBox('tkhd', 0, 3, b => {\n b.u32(0).u32(0).u32(1).u32(0).u32(movieDur).zeros(8).u16(0).u16(0).u16(0).u16(0);\n MATRIX.forEach(v => b.u32(v)); b.u32(width << 16).u32(height << 16);\n }));\n tr.bytes(box('mdia', md => {\n md.bytes(fullBox('mdhd', 0, 0, b => b.u32(0).u32(0).u32(timescale).u32(mediaDur).u16(0x55c4).u16(0)));\n md.bytes(fullBox('hdlr', 0, 0, b => b.u32(0).str('vide').zeros(12).str('VideoHandler').u8(0)));\n md.bytes(box('minf', mi => {\n mi.bytes(fullBox('vmhd', 0, 1, b => b.u16(0).u16(0).u16(0).u16(0)));\n mi.bytes(box('dinf', di => di.bytes(fullBox('dref', 0, 0, b => { b.u32(1); b.bytes(fullBox('url ', 0, 1, () => { })); }))));\n mi.bytes(box('stbl', st => {\n st.bytes(fullBox('stsd', 0, 0, b => {\n b.u32(1);\n b.bytes(box('avc1', a => {\n a.zeros(6).u16(1).zeros(16).u16(width).u16(height).u32(0x00480000).u32(0x00480000).u32(0).u16(1);\n const name = ENC.encode('image-to-pixel').slice(0, 31);\n a.u8(name.length).bytes(name).zeros(31 - name.length).u16(0x0018).u16(0xffff);\n a.bytes(box('avcC', c => c.bytes(description)));\n }));\n }));\n st.bytes(fullBox('stts', 0, 0, b => { b.u32(stts.length); for (const [n, d] of stts) b.u32(n).u32(d); }));\n // version 1: signed offsets, so negative composition offsets are allowed\n if (hasOffsets) st.bytes(fullBox('ctts', 1, 0, b => { b.u32(ctts.length); for (const [n, o] of ctts) b.u32(n).u32(o >>> 0); }));\n if (keys.length < samples.length) st.bytes(fullBox('stss', 0, 0, b => { b.u32(keys.length); for (const k of keys) b.u32(k); }));\n st.bytes(fullBox('stsc', 0, 0, b => b.u32(1).u32(1).u32(samples.length).u32(1)));\n st.bytes(fullBox('stsz', 0, 0, b => { b.u32(0).u32(samples.length); for (const s of samples) b.u32(s.data.length); }));\n st.bytes(fullBox('stco', 0, 0, b => b.u32(1).u32(chunkOffset)));\n }));\n }));\n }));\n }));\n });\n // the moov size doesn't depend on the offset value, so measure once and build again\n const moovSize = buildMoov(0).length;\n const offset = ftyp.length + moovSize + 8;\n if (offset + dataSize > 0xffffffff) throw new Error('Video is larger than 4 GB');\n const moov = buildMoov(offset);\n const out = new Uint8Array(offset + dataSize);\n out.set(ftyp, 0); out.set(moov, ftyp.length);\n const dv = new DataView(out.buffer);\n dv.setUint32(ftyp.length + moov.length, dataSize + 8);\n out.set(ENC.encode('mdat'), ftyp.length + moov.length + 4);\n let o = offset;\n for (const s of samples) { out.set(s.data, o); o += s.data.length; }\n return out;\n },\n };\n}\n", "// Minimal WebM (Matroska) muxer for one VP8/VP9/AV1 video track. Buffered in memory, written with\n// a SeekHead and Cues so players can seek. Input: encoded frames from WebCodecs' VideoEncoder.\n\nconst ENC = new TextEncoder();\n\n/** EBML variable-length size, always 8 bytes (simple and valid for any size). */\nfunction size8(n) {\n const b = new Uint8Array(8);\n b[0] = 0x01;\n let v = n;\n for (let i = 7; i >= 1; i--) { b[i] = v % 256; v = Math.floor(v / 256); }\n return b;\n}\nfunction idBytes(id) {\n const out = [];\n for (let v = id; v > 0; v = Math.floor(v / 256)) out.unshift(v % 256);\n return out;\n}\nfunction concat(parts) {\n let n = 0; for (const p of parts) n += p.length;\n const out = new Uint8Array(n); let o = 0;\n for (const p of parts) { out.set(p, o); o += p.length; }\n return out;\n}\n/** An element: id, 8-byte size, data. */\nconst el = (id, data) => concat([Uint8Array.from(idBytes(id)), size8(data.length), data]);\nconst uint = (id, v, bytes = 0) => {\n const b = [];\n for (let x = v; x > 0 || b.length === 0; x = Math.floor(x / 256)) b.unshift(x % 256);\n while (b.length < bytes) b.unshift(0);\n return el(id, Uint8Array.from(b));\n};\nconst str = (id, s) => el(id, ENC.encode(s));\nconst float64 = (id, v) => { const b = new Uint8Array(8); new DataView(b.buffer).setFloat64(0, v); return el(id, b); };\nconst master = (id, children) => el(id, concat(children));\n\nconst ID = {\n EBML: 0x1A45DFA3, EBMLVersion: 0x4286, EBMLReadVersion: 0x42F7, EBMLMaxIDLength: 0x42F2, EBMLMaxSizeLength: 0x42F3,\n DocType: 0x4282, DocTypeVersion: 0x4287, DocTypeReadVersion: 0x4285,\n Segment: 0x18538067, SeekHead: 0x114D9B74, Seek: 0x4DBB, SeekID: 0x53AB, SeekPosition: 0x53AC,\n Info: 0x1549A966, TimestampScale: 0x2AD7B1, Duration: 0x4489, MuxingApp: 0x4D80, WritingApp: 0x5741,\n Tracks: 0x1654AE6B, TrackEntry: 0xAE, TrackNumber: 0xD7, TrackUID: 0x73C5, TrackType: 0x83, FlagLacing: 0x9C,\n CodecID: 0x86, CodecPrivate: 0x63A2, DefaultDuration: 0x23E383, Video: 0xE0, PixelWidth: 0xB0, PixelHeight: 0xBA,\n Cluster: 0x1F43B675, Timestamp: 0xE7, SimpleBlock: 0xA3,\n Cues: 0x1C53BB6B, CuePoint: 0xBB, CueTime: 0xB3, CueTrackPositions: 0xB7, CueTrack: 0xF7, CueClusterPosition: 0xF1,\n};\n\nconst CODEC_IDS = { vp8: 'V_VP8', vp9: 'V_VP9', av1: 'V_AV1' };\n\n/**\n * @param {{ width: number, height: number, codec: 'vp8' | 'vp9' | 'av1', fps?: number }} opts\n */\nexport function createWebmMuxer({ width, height, codec = 'vp9', fps = 0 }) {\n const frames = []; // { data, key, ms }\n let codecPrivate = null;\n\n return {\n addChunk(chunk, meta) {\n if (meta && meta.decoderConfig && meta.decoderConfig.description && !codecPrivate) {\n const d = meta.decoderConfig.description;\n codecPrivate = new Uint8Array(d instanceof ArrayBuffer ? d : d.buffer.slice(d.byteOffset, d.byteOffset + d.byteLength));\n }\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n frames.push({ data, key: chunk.type === 'key', ms: chunk.timestamp / 1000 });\n },\n /** Lower-level: add one encoded frame. timestamp in microseconds. */\n addFrame(data, { key, timestamp }) { frames.push({ data, key: !!key, ms: timestamp / 1000 }); },\n\n /** @returns {Uint8Array} the .webm file */\n finish() {\n if (!frames.length) throw new Error('No video frames were encoded');\n // VP8/VP9/AV1 frames from WebCodecs arrive in decode order, which is the order they're stored in\n const frameMs = fps ? 1000 / fps : (frames.length > 1 ? (frames[frames.length - 1].ms - frames[0].ms) / (frames.length - 1) : 33.333);\n const duration = frames[frames.length - 1].ms + frameMs;\n\n const info = master(ID.Info, [\n uint(ID.TimestampScale, 1000000), // 1 ms\n float64(ID.Duration, duration),\n str(ID.MuxingApp, 'image-to-pixel'), str(ID.WritingApp, 'image-to-pixel'),\n ]);\n const tracks = master(ID.Tracks, [master(ID.TrackEntry, [\n uint(ID.TrackNumber, 1), uint(ID.TrackUID, 1), uint(ID.TrackType, 1), uint(ID.FlagLacing, 0),\n str(ID.CodecID, CODEC_IDS[codec] || codec),\n ...(codecPrivate ? [el(ID.CodecPrivate, codecPrivate)] : []),\n uint(ID.DefaultDuration, Math.round(frameMs * 1e6)),\n master(ID.Video, [uint(ID.PixelWidth, width), uint(ID.PixelHeight, height)]),\n ])]);\n\n // clusters: a new one at each keyframe, and before the 16-bit relative timestamp overflows\n const clusters = [];\n let cur = null;\n for (const f of frames) {\n const t = Math.round(f.ms);\n if (!cur || f.key || t - cur.start > 30000) { cur = { start: t, key: f.key, blocks: [] }; clusters.push(cur); }\n const head = new Uint8Array(4);\n head[0] = 0x81; // track 1\n new DataView(head.buffer).setInt16(1, t - cur.start);\n head[3] = f.key ? 0x80 : 0x00;\n cur.blocks.push(el(ID.SimpleBlock, concat([head, f.data])));\n }\n const clusterBytes = clusters.map(c => master(ID.Cluster, [uint(ID.Timestamp, c.start), ...c.blocks]));\n\n // SeekHead with fixed-width positions, so its size is known before the positions are\n const seekHead = (posInfo, posTracks, posCues) => master(ID.SeekHead, [\n [ID.Info, posInfo], [ID.Tracks, posTracks], [ID.Cues, posCues],\n ].map(([id, pos]) => master(ID.Seek, [el(ID.SeekID, Uint8Array.from(idBytes(id))), uint(ID.SeekPosition, pos, 8)])));\n const shSize = seekHead(0, 0, 0).length;\n const posInfo = shSize, posTracks = posInfo + info.length;\n let pos = posTracks + tracks.length;\n const cuePoints = [];\n clusters.forEach((c, i) => {\n if (c.key) cuePoints.push(master(ID.CuePoint, [uint(ID.CueTime, c.start), master(ID.CueTrackPositions, [uint(ID.CueTrack, 1), uint(ID.CueClusterPosition, pos)])]));\n pos += clusterBytes[i].length;\n });\n const cues = master(ID.Cues, cuePoints.length ? cuePoints : [master(ID.CuePoint, [uint(ID.CueTime, 0), master(ID.CueTrackPositions, [uint(ID.CueTrack, 1), uint(ID.CueClusterPosition, posTracks + tracks.length)])])]);\n const posCues = pos;\n\n const header = master(ID.EBML, [\n uint(ID.EBMLVersion, 1), uint(ID.EBMLReadVersion, 1), uint(ID.EBMLMaxIDLength, 4), uint(ID.EBMLMaxSizeLength, 8),\n str(ID.DocType, 'webm'), uint(ID.DocTypeVersion, 4), uint(ID.DocTypeReadVersion, 2),\n ]);\n const segment = master(ID.Segment, [seekHead(posInfo, posTracks, posCues), info, tracks, ...clusterBytes, cues]);\n return concat([header, segment]);\n },\n };\n}\n", "// image-to-pixel/video: encode processed frames to MP4 (H.264) or WebM (VP9/VP8) with WebCodecs.\n// The muxers are this project's own (lib/core/video/mux-*.js): MIT, no dependencies.\n\nimport { createMp4Muxer } from './core/video/mux-mp4.js';\nimport { createWebmMuxer } from './core/video/mux-webm.js';\nimport { upscale } from './core/export/scale.js';\n\nexport { forEachFrame, estimateFps, seekTo, frameTimes, videoReady } from './core/video/frames.js';\nexport { createMp4Muxer, createWebmMuxer };\n\nconst AVC = ['avc1.640033', 'avc1.4d0033', 'avc1.42003e', 'avc1.640028', 'avc1.42001f'];\nconst VP = [['vp09.00.10.08', 'vp9'], ['vp8', 'vp8']];\n\n/** Which formats this browser can encode. */\nexport async function videoSupport(width = 640, height = 480) {\n const out = { mp4: false, webm: false, webcodecs: typeof VideoEncoder !== 'undefined' };\n if (out.webcodecs) {\n for (const codec of AVC) if ((await VideoEncoder.isConfigSupported({ codec, width, height }).catch(() => ({}))).supported) { out.mp4 = true; break; }\n for (const [codec] of VP) if ((await VideoEncoder.isConfigSupported({ codec, width, height }).catch(() => ({}))).supported) { out.webm = true; break; }\n }\n return out;\n}\n\nconst even = n => n + (n & 1);\n\n/**\n * Start an encoder; add frames one at a time (so a long clip never sits in memory), then finish().\n * @param {{ format: 'mp4' | 'webm', fps: number, width: number, height: number, scale?: number, bitrate?: number }} opts\n * width/height: size of the frames you will add (before scaling)\n */\nexport async function createVideoEncoder(opts) {\n const scale = Math.max(1, Math.round(opts.scale || 1));\n const W = even(opts.width * scale), H = even(opts.height * scale);\n const fps = opts.fps || 30;\n const bitrate = opts.bitrate || Math.min(20e6, Math.max(2e6, W * H * fps * 0.15));\n if (typeof VideoEncoder === 'undefined') throw new Error('This browser has no WebCodecs VideoEncoder. Export a GIF or PNG sequence instead.');\n\n let codec = null, muxCodec = null;\n const list = opts.format === 'mp4' ? AVC.map(c => [c, 'avc']) : VP;\n for (const [c, m] of list) {\n const ok = await VideoEncoder.isConfigSupported({ codec: c, width: W, height: H, bitrate, framerate: fps }).catch(() => ({}));\n if (ok.supported) { codec = c; muxCodec = m; break; }\n }\n if (!codec) throw new Error(`No ${opts.format.toUpperCase()} encoder available in this browser at ${W}\u00D7${H}.`);\n\n const muxer = opts.format === 'mp4'\n ? createMp4Muxer({ width: W, height: H })\n : createWebmMuxer({ width: W, height: H, codec: muxCodec, fps });\n\n let error = null;\n const encoder = new VideoEncoder({\n output: (chunk, meta) => muxer.addChunk(chunk, meta),\n error: e => { error = e; },\n });\n // avc.format 'avc': length-prefixed NAL units plus a decoder config record, which MP4 needs\n encoder.configure({ codec, width: W, height: H, bitrate, framerate: fps, latencyMode: 'quality', ...(opts.format === 'mp4' ? { avc: { format: 'avc' } } : {}) });\n\n const canvas = new OffscreenCanvas(W, H);\n const ctx = canvas.getContext('2d');\n let i = 0;\n const frameUs = 1e6 / fps;\n\n return {\n width: W, height: H, codec,\n /** @param {{ width, height, data }} img */\n async add(img) {\n if (error) throw error;\n const up = scale > 1 ? upscale(img, scale) : img;\n ctx.fillStyle = '#000'; ctx.fillRect(0, 0, W, H);\n ctx.putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\n const frame = new VideoFrame(canvas, { timestamp: Math.round(i * frameUs), duration: Math.round(frameUs) });\n encoder.encode(frame, { keyFrame: i % Math.max(1, Math.round(fps * 2)) === 0 });\n frame.close();\n i++;\n if (encoder.encodeQueueSize > 8) await new Promise(r => setTimeout(r, 0));\n },\n /** @returns {Promise<Blob>} */\n async finish() {\n await encoder.flush();\n if (error) throw error;\n encoder.close();\n return new Blob([muxer.finish()], { type: opts.format === 'mp4' ? 'video/mp4' : 'video/webm' });\n },\n };\n}\n\n/** Convenience: encode an array of frames in one go. */\nexport async function encodeVideo(frames, opts) {\n const enc = await createVideoEncoder({ ...opts, width: frames[0].width, height: frames[0].height });\n for (const f of frames) await enc.add(f);\n return enc.finish();\n}\n", "// Built-in palettes. Most come from Lospec (https://lospec.com/palette-list); credit to their authors.\n// The list matches the classic editor plus a few staples.\n\n/** @type {{ id: string, name: string, author: string, colors: string[] }[]} */\nexport const PALETTES = [\n { id: \"1-bit-monitor\", name: \"1-Bit Monitor\", author: \"\", colors: [\"222323\",\"f0f6f0\"] },\n { id: \"apollo\", name: \"Apollo\", author: \"AdamCYounis\", colors: [\"172038\",\"253a5e\",\"3c5e8b\",\"4f8fba\",\"73bed3\",\"a4dddb\",\"19332d\",\"25562e\",\"468232\",\"75a743\",\"a8ca58\",\"d0da91\",\"4d2b32\",\"7a4841\",\"ad7757\",\"c09473\",\"d7b594\",\"e7d5b3\",\"341c27\",\"602c2c\",\"884b2b\",\"be772b\",\"de9e41\",\"e8c170\",\"241527\",\"411d31\",\"752438\",\"a53030\",\"cf573c\",\"da863e\",\"1e1d39\",\"402751\",\"7a367b\",\"a23e8c\",\"c65197\",\"df84a5\",\"090a14\",\"10141f\",\"151d28\",\"202e37\",\"394a50\",\"577277\",\"819796\",\"a8b5b2\",\"c7cfcc\",\"ebede9\"] },\n { id: \"batpalette\", name: \"Batpalette\", author: \"el Rojaz\", colors: [\"000000\",\"7f7f7f\",\"ffffff\",\"681e99\",\"3f48cc\",\"88ff82\",\"bfa621\",\"cc3d18\"] },\n { id: \"beached-boogaloo\", name: \"Beached Boogaloo\", author: \".tomais\", colors: [\"ff0b20\",\"8f0434\",\"500037\",\"a0ff00\",\"57e71e\",\"0ea717\",\"057833\",\"2cdeef\",\"2483e7\",\"153ab7\",\"0d0a87\",\"ff0b88\",\"a60fff\",\"6409cf\",\"eaef30\",\"ff880b\",\"b75308\",\"802202\",\"000000\",\"231940\",\"514378\",\"ffffff\",\"73a3a7\",\"366770\",\"f7b771\",\"c77650\",\"974c38\",\"873939\",\"601e2c\",\"300c1f\"] },\n { id: \"cc-29\", name: \"CC-29\", author: \"Alpha6\", colors: [\"f2f0e5\",\"b8b5b9\",\"868188\",\"646365\",\"45444f\",\"3a3858\",\"212123\",\"352b42\",\"43436a\",\"4b80ca\",\"68c2d3\",\"a2dcc7\",\"ede19e\",\"d3a068\",\"b45252\",\"6a536e\",\"4b4158\",\"80493a\",\"a77b5b\",\"e5ceb4\",\"c2d368\",\"8ab060\",\"567b79\",\"4e584a\",\"7b7243\",\"b2b47e\",\"edc8c4\",\"cf8acb\",\"5f556a\"] },\n { id: \"cga-16\", name: \"CGA 16\", author: \"\", colors: [\"000000\",\"0000aa\",\"00aa00\",\"00aaaa\",\"aa0000\",\"aa00aa\",\"aa5500\",\"aaaaaa\",\"555555\",\"5555ff\",\"55ff55\",\"55ffff\",\"ff5555\",\"ff55ff\",\"ffff55\",\"ffffff\"] },\n { id: \"chaotic-neutral\", name: \"Chaotic neutral\", author: \"Dodecahedron \u2DFD\", colors: [\"e1d4cb\",\"c19f90\",\"a56457\",\"6d504d\",\"484044\",\"392b29\",\"31312f\",\"d8eef0\",\"97999f\",\"81a4c0\",\"6a7f92\",\"415973\",\"43425a\",\"45334b\",\"4b1f40\",\"671087\",\"955ab9\"] },\n { id: \"endesga-32\", name: \"Endesga 32\", author: \"ENDESGA\", colors: [\"be4a2f\",\"d77643\",\"ead4aa\",\"e4a672\",\"b86f50\",\"733e39\",\"3e2731\",\"a22633\",\"e43b44\",\"f77622\",\"feae34\",\"fee761\",\"63c74d\",\"3e8948\",\"265c42\",\"193c3e\",\"124e89\",\"0099db\",\"2ce8f5\",\"ffffff\",\"c0cbdc\",\"8b9bb4\",\"5a6988\",\"3a4466\",\"262b44\",\"181425\",\"ff0044\",\"68386c\",\"b55088\",\"f6757a\",\"e8b796\",\"c28569\"] },\n { id: \"fantasy-24\", name: \"Fantasy 24\", author: \"\", colors: [\"1f240a\",\"39571c\",\"a58c27\",\"efac28\",\"efd8a1\",\"ab5c1c\",\"183f39\",\"ef692f\",\"efb775\",\"a56243\",\"773421\",\"724113\",\"2a1d0d\",\"392a1c\",\"684c3c\",\"927e6a\",\"276468\",\"ef3a0c\",\"45230d\",\"3c9f9c\",\"9b1a0a\",\"36170c\",\"550f0a\",\"300f0a\"] },\n { id: \"game-boy-dmg\", name: \"Game Boy (DMG)\", author: \"\", colors: [\"0f380f\",\"306230\",\"8bac0f\",\"9bbc0f\"] },\n { id: \"grayscale-4\", name: \"Grayscale 4\", author: \"\", colors: [\"000000\",\"555555\",\"aaaaaa\",\"ffffff\"] },\n { id: \"hidden-library\", name: \"Hidden Library\", author: \"Pixel Hoo\", colors: [\"100b2a\",\"2a213a\",\"314743\",\"65856d\",\"adca9a\",\"ecfeca\",\"582d27\",\"974133\",\"d67654\",\"5d3441\",\"a3685b\",\"ffb379\",\"ffe6a9\",\"ffffff\"] },\n { id: \"intacto14\", name: \"Intacto14\", author: \"Anubi\", colors: [\"221529\",\"4b5561\",\"879ba3\",\"cbf5ef\",\"62b4de\",\"5660d6\",\"5b29a6\",\"d64562\",\"f2735c\",\"edbb8e\",\"ab6375\",\"522152\",\"37ada2\",\"8cde8c\"] },\n { id: \"journey\", name: \"Journey\", author: \"\uD83C\uDF4DPineappleOnPizza\uD83C\uDF4D\", colors: [\"050914\",\"110524\",\"3b063a\",\"691749\",\"9c3247\",\"d46453\",\"f5a15d\",\"ffcf8e\",\"ff7a7d\",\"ff417d\",\"d61a88\",\"94007a\",\"42004e\",\"220029\",\"100726\",\"25082c\",\"3d1132\",\"73263d\",\"bd4035\",\"ed7b39\",\"ffb84a\",\"fff540\",\"c6d831\",\"77b02a\",\"429058\",\"2c645e\",\"153c4a\",\"052137\",\"0e0421\",\"0c0b42\",\"032769\",\"144491\",\"488bd4\",\"78d7ff\",\"b0fff1\",\"faffff\",\"c7d4e1\",\"928fb8\",\"5b537d\",\"392946\",\"24142c\",\"0e0f2c\",\"132243\",\"1a466b\",\"10908e\",\"28c074\",\"3dff6e\",\"f8ffb8\",\"f0c297\",\"cf968c\",\"8f5765\",\"52294b\",\"0f022e\",\"35003b\",\"64004c\",\"9b0e3e\",\"d41e3c\",\"ed4c40\",\"ff9757\",\"d4662f\",\"9c341a\",\"691b22\",\"450c28\",\"2d002e\"] },\n { id: \"lospec500\", name: \"Lospec500\", author: \"\", colors: [\"10121c\",\"2c1e31\",\"6b2643\",\"ac2847\",\"ec273f\",\"94493a\",\"de5d3a\",\"e98537\",\"f3a833\",\"4d3533\",\"6e4c30\",\"a26d3f\",\"ce9248\",\"dab163\",\"e8d282\",\"f7f3b7\",\"1e4044\",\"006554\",\"26854c\",\"5ab552\",\"9de64e\",\"008b8b\",\"62a477\",\"a6cb96\",\"d3eed3\",\"3e3b65\",\"3859b3\",\"3388de\",\"36c5f4\",\"6dead6\",\"5e5b8c\",\"8c78a5\",\"b0a7b8\",\"deceed\",\"9a4d76\",\"c878af\",\"cc99ff\",\"fa6e79\",\"ffa2ac\",\"ffd1d5\",\"f6e8e0\",\"ffffff\"] },\n { id: \"nyx8\", name: \"Nyx8\", author: \"Javier Guerrero\", colors: [\"08141e\",\"0f2a3f\",\"20394f\",\"4e495f\",\"816271\",\"997577\",\"c3a38a\",\"f6d6bd\"] },\n { id: \"oil-6\", name: \"Oil 6\", author: \"\", colors: [\"fbf5ef\",\"f2d3ab\",\"c69fa5\",\"8b6d9c\",\"494d7e\",\"272744\"] },\n { id: \"pico-8\", name: \"PICO-8\", author: \"\", colors: [\"000000\",\"1d2b53\",\"7e2553\",\"008751\",\"ab5236\",\"5f574f\",\"c2c3c7\",\"fff1e8\",\"ff004d\",\"ffa300\",\"ffec27\",\"00e436\",\"29adff\",\"83769c\",\"ff77a8\",\"ffccaa\"] },\n { id: \"resurrect-64\", name: \"Resurrect 64\", author: \"Kerrie Lake\", colors: [\"2e222f\",\"3e3546\",\"625565\",\"966c6c\",\"ab947a\",\"694f62\",\"7f708a\",\"9babb2\",\"c7dcd0\",\"ffffff\",\"6e2727\",\"b33831\",\"ea4f36\",\"f57d4a\",\"ae2334\",\"e83b3b\",\"fb6b1d\",\"f79617\",\"f9c22b\",\"7a3045\",\"9e4539\",\"cd683d\",\"e6904e\",\"fbb954\",\"4c3e24\",\"676633\",\"a2a947\",\"d5e04b\",\"fbff86\",\"165a4c\",\"239063\",\"1ebc73\",\"91db69\",\"cddf6c\",\"313638\",\"374e4a\",\"547e64\",\"92a984\",\"b2ba90\",\"0b5e65\",\"0b8a8f\",\"0eaf9b\",\"30e1b9\",\"8ff8e2\",\"323353\",\"484a77\",\"4d65b4\",\"4d9be6\",\"8fd3ff\",\"45293f\",\"6b3e75\",\"905ea9\",\"a884f3\",\"eaaded\",\"753c54\",\"a24b6f\",\"cf657f\",\"ed8099\",\"831c5d\",\"c32454\",\"f04f78\",\"f68181\",\"fca790\",\"fdcbb0\"] },\n { id: \"slso8\", name: \"SLSO8\", author: \"Luis Miguel Maldonado\", colors: [\"0d2b45\",\"203c56\",\"544e68\",\"8d697a\",\"d08159\",\"ffaa5e\",\"ffd4a3\",\"ffecd6\"] },\n { id: \"sweet-canyon-extended-64\", name: \"Sweet Canyon Extended 64\", author: \"Mr Slime\", colors: [\"0f0e11\",\"2d2c33\",\"40404a\",\"51545c\",\"6b7179\",\"7c8389\",\"a8b2b6\",\"d5d5d5\",\"eeebe0\",\"f1dbb1\",\"eec99f\",\"e1a17e\",\"cc9562\",\"ab7b49\",\"9a643a\",\"86482f\",\"783a29\",\"6a3328\",\"541d29\",\"42192c\",\"512240\",\"782349\",\"8b2e5d\",\"a93e89\",\"d062c8\",\"ec94ea\",\"f2bdfc\",\"eaebff\",\"a2fafa\",\"64e7e7\",\"54cfd8\",\"2fb6c3\",\"2c89af\",\"25739d\",\"2a5684\",\"214574\",\"1f2966\",\"101445\",\"3c0d3b\",\"66164c\",\"901f3d\",\"bb3030\",\"dc473c\",\"ec6a45\",\"fb9b41\",\"f0c04c\",\"f4d66e\",\"fffb76\",\"ccf17a\",\"97d948\",\"6fba3b\",\"229443\",\"1d7e45\",\"116548\",\"0c4f3f\",\"0a3639\",\"251746\",\"48246d\",\"69189c\",\"9f20c0\",\"e527d2\",\"ff51cf\",\"ff7ada\",\"ff9edb\"] },\n { id: \"sweetie-16\", name: \"Sweetie 16\", author: \"\", colors: [\"1a1c2c\",\"5d275d\",\"b13e53\",\"ef7d57\",\"ffcd75\",\"a7f070\",\"38b764\",\"257179\",\"29366f\",\"3b5dc9\",\"41a6f6\",\"73eff7\",\"f4f4f4\",\"94b0c2\",\"566c86\",\"333c57\"] },\n { id: \"toxic-haze\", name: \"Toxic Haze\", author: \"sillyTheJester\", colors: [\"e5ff00\",\"b8d14a\",\"9ab06e\",\"708763\",\"4c5c52\",\"393e40\",\"242424\"] },\n { id: \"vinik24\", name: \"Vinik24\", author: \"Vinik\", colors: [\"000000\",\"6f6776\",\"9a9a97\",\"c5ccb8\",\"8b5580\",\"c38890\",\"a593a5\",\"666092\",\"9a4f50\",\"c28d75\",\"7ca1c0\",\"416aa3\",\"8d6268\",\"be955c\",\"68aca9\",\"387080\",\"6e6962\",\"93a167\",\"6eaa78\",\"557064\",\"9d9f7f\",\"7e9e99\",\"5d6872\",\"433455\"] },\n];\n\n/** Look a built-in palette up by id or name (case-insensitive). */\nexport function getPalette(idOrName) {\n const k = String(idOrName || \"\").toLowerCase();\n return PALETTES.find(p => p.id === k || p.name.toLowerCase() === k) || null;\n}\n", "// The settings object is the one contract between the engine, the editor, presets,\n// share links and saved JSON. Everything goes through normalizeSettings().\n\nimport { getPalette } from './palette/builtin.js';\nimport { normHex, isColor } from './color.js';\n\nexport const SETTINGS_VERSION = 1;\nexport const MAX_SIZE = 2048;\n\n/** Dither methods. `kind` decides which pipeline runs them. */\nexport const DITHER_METHODS = [\n { id: 'none', label: 'None', kind: 'none' },\n { id: 'bayer2', label: 'Bayer 2\u00D72', kind: 'ordered' },\n { id: 'bayer4', label: 'Bayer 4\u00D74', kind: 'ordered' },\n { id: 'bayer8', label: 'Bayer 8\u00D78', kind: 'ordered' },\n { id: 'bayer16', label: 'Bayer 16\u00D716', kind: 'ordered' },\n { id: 'cluster4', label: 'Clustered dot 4\u00D74', kind: 'ordered' },\n { id: 'cluster8', label: 'Clustered dot 8\u00D78', kind: 'ordered' },\n { id: 'lines', label: 'Horizontal lines', kind: 'ordered' },\n { id: 'bluenoise', label: 'Blue noise', kind: 'ordered' },\n { id: 'custom', label: 'Custom matrix', kind: 'ordered' },\n { id: 'floyd-steinberg', label: 'Floyd\u2013Steinberg', kind: 'diffusion' },\n { id: 'atkinson', label: 'Atkinson', kind: 'diffusion' },\n { id: 'sierra-lite', label: 'Sierra Lite', kind: 'diffusion' },\n { id: 'sierra', label: 'Sierra', kind: 'diffusion' },\n { id: 'burkes', label: 'Burkes', kind: 'diffusion' },\n { id: 'jarvis', label: 'Jarvis\u2013Judice\u2013Ninke', kind: 'diffusion' },\n { id: 'stucki', label: 'Stucki', kind: 'diffusion' },\n];\nexport const ditherKind = id => (DITHER_METHODS.find(m => m.id === id) || { kind: 'none' }).kind;\n\n/** Names the classic image-to-pixel.js used, mapped to the new ids. */\nexport const LEGACY_DITHER = {\n 'none': 'none', 'floyd-steinberg': 'floyd-steinberg', 'atkinson': 'atkinson',\n 'ordered': 'bayer8', '2x2 bayer': 'bayer2', '4x4 bayer': 'bayer4', 'clustered 4x4': 'cluster4',\n};\n\nexport const DEFAULTS = Object.freeze({\n version: SETTINGS_VERSION,\n size: { mode: 'width', width: 96, height: 0, block: 8, resample: 'box' },\n adjust: { brightness: 0, contrast: 0, saturation: 0, hue: 0, gamma: 1 },\n frame: { aspect: 'original', zoom: 1, x: 0.5, y: 0.5 },\n palette: { source: 'builtin', id: 'endesga-32', name: 'Endesga 32', colors: [], count: 16, distance: 'oklab' },\n dither: { method: 'bayer4', strength: 0.6, matrix: null },\n alpha: { threshold: 0.5 },\n cleanup: { orphans: false, smooth: false },\n outline: { mode: 'none', color: '#000000', corners: false },\n export: { size: 'scale', scale: 4, indexed: true, grid: false, gridColor: '#000000' },\n});\n\nconst clamp = (v, lo, hi, d) => {\n const n = Number(v);\n return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : d;\n};\nconst oneOf = (v, list, d) => (list.includes(v) ? v : d);\nconst bool = (v, d) => (typeof v === 'boolean' ? v : d);\n\n/** Deep copy of the defaults (palette colours resolved). */\nexport function defaultSettings() {\n return normalizeSettings({});\n}\n\n/**\n * Fill in defaults, clamp ranges, resolve built-in palette colours and drop unknown keys.\n * Never throws on bad values; it falls back to the default for that field.\n * @param {object} input partial settings\n */\nexport function normalizeSettings(input = {}) {\n const d = DEFAULTS;\n const i = input || {};\n const s = {}; const size = i.size || {}; const adj = i.adjust || {}; const pal = i.palette || {};\n const dit = i.dither || {}; const al = i.alpha || {}; const cl = i.cleanup || {}; const ol = i.outline || {};\n const ex = i.export || {};\n\n s.version = SETTINGS_VERSION;\n s.size = {\n mode: oneOf(size.mode, ['width', 'block'], d.size.mode),\n width: Math.round(clamp(size.width, 1, MAX_SIZE, d.size.width)),\n height: Math.round(clamp(size.height, 0, MAX_SIZE, d.size.height)),\n block: clamp(size.block, 1, 256, d.size.block),\n resample: oneOf(size.resample, ['box', 'nearest'], d.size.resample),\n };\n s.adjust = {\n brightness: clamp(adj.brightness, -1, 1, 0),\n contrast: clamp(adj.contrast, -1, 1, 0),\n saturation: clamp(adj.saturation, -1, 1, 0),\n hue: clamp(adj.hue, -180, 180, 0),\n gamma: clamp(adj.gamma, 0.2, 5, 1),\n };\n const fr = i.frame || {};\n s.frame = {\n aspect: oneOf(fr.aspect, ASPECTS.map(a => a.id), 'original'),\n zoom: clamp(fr.zoom, 1, 8, 1),\n x: clamp(fr.x, 0, 1, 0.5),\n y: clamp(fr.y, 0, 1, 0.5),\n };\n\n const source = oneOf(pal.source, ['builtin', 'custom', 'extract', 'none'], d.palette.source);\n s.palette = {\n source,\n id: typeof pal.id === 'string' ? pal.id : (source === 'builtin' ? d.palette.id : ''),\n name: typeof pal.name === 'string' ? pal.name : '',\n colors: [],\n count: Math.round(clamp(pal.count, 2, 256, d.palette.count)),\n distance: oneOf(pal.distance, ['oklab', 'rgb'], d.palette.distance),\n };\n if (source === 'builtin') {\n const p = getPalette(s.palette.id) || getPalette(d.palette.id);\n s.palette.id = p.id; s.palette.name = p.name; s.palette.colors = p.colors.map(c => '#' + c);\n } else if (source === 'custom') {\n s.palette.colors = (Array.isArray(pal.colors) ? pal.colors : []).filter(isColor).map(normHex).slice(0, 256);\n if (!s.palette.colors.length) s.palette.colors = ['#000000', '#ffffff'];\n s.palette.name = s.palette.name || 'Custom';\n } else if (source === 'extract') {\n s.palette.name = `Extracted (${s.palette.count})`;\n } else {\n s.palette.name = 'None';\n }\n\n const method = DITHER_METHODS.some(m => m.id === dit.method) ? dit.method : d.dither.method;\n s.dither = {\n method,\n strength: clamp(dit.strength, 0, 1, d.dither.strength),\n matrix: normalizeMatrix(dit.matrix),\n };\n s.alpha = { threshold: clamp(al.threshold, 0, 1, d.alpha.threshold) };\n s.cleanup = { orphans: bool(cl.orphans, false), smooth: bool(cl.smooth, false) };\n s.outline = {\n mode: oneOf(ol.mode, ['none', 'outer', 'inner'], 'none'),\n color: isColor(ol.color) ? normHex(ol.color) : d.outline.color,\n corners: bool(ol.corners, false),\n };\n s.export = {\n size: oneOf(ex.size, ['scale', 'source'], 'scale'),\n scale: Math.round(clamp(ex.scale, 1, 64, d.export.scale)),\n indexed: bool(ex.indexed, d.export.indexed),\n grid: bool(ex.grid, false),\n gridColor: isColor(ex.gridColor) ? normHex(ex.gridColor) : d.export.gridColor,\n };\n return s;\n}\n\n/** A custom threshold matrix: 2D array of numbers. Ranks are derived from the order of the values. */\nexport function normalizeMatrix(m) {\n if (!Array.isArray(m) || !m.length || !Array.isArray(m[0])) return null;\n const h = Math.min(16, m.length), w = Math.min(16, m[0].length);\n const out = [];\n for (let y = 0; y < h; y++) {\n const row = [];\n for (let x = 0; x < w; x++) { const v = Number((m[y] || [])[x]); row.push(Number.isFinite(v) ? v : 0); }\n out.push(row);\n }\n return out;\n}\n\n/** Frame aspect ratios. `ratio` is width / height; null keeps the source's. */\nexport const ASPECTS = [\n { id: 'original', label: 'Original', ratio: null },\n { id: '1:1', label: '1:1', ratio: 1 },\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\n { id: '3:4', label: '3:4', ratio: 3 / 4 },\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\n { id: '2:3', label: '2:3', ratio: 2 / 3 },\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\n];\n\n/**\n * The part of a srcW \u00D7 srcH source that `frame` keeps, in whole source pixels.\n * The largest rectangle of the chosen aspect that fits, divided by zoom, placed by x/y (0 = left/top, 1 = right/bottom).\n */\nexport function cropRect(srcW, srcH, frame = {}) {\n const a = (ASPECTS.find(x => x.id === frame.aspect) || ASPECTS[0]).ratio || srcW / srcH;\n let w = srcW, h = srcW / a;\n if (h > srcH) { h = srcH; w = srcH * a; }\n const zoom = Math.max(1, frame.zoom || 1);\n w = Math.max(1, Math.min(srcW, Math.round(w / zoom)));\n h = Math.max(1, Math.min(srcH, Math.round(h / zoom)));\n const fx = frame.x ?? 0.5, fy = frame.y ?? 0.5;\n return { x: Math.round((srcW - w) * fx), y: Math.round((srcH - h) * fy), w, h };\n}\n\n/** Output size in pixels for a source of srcW \u00D7 srcH. */\nexport function resolveSize(srcW, srcH, size) {\n let w, h;\n if (size.mode === 'block') {\n w = Math.max(1, Math.round(srcW / size.block));\n h = Math.max(1, Math.round(srcH / size.block));\n } else {\n w = size.width;\n h = size.height || Math.max(1, Math.round(w * srcH / srcW));\n }\n return { width: Math.min(MAX_SIZE, w), height: Math.min(MAX_SIZE, h) };\n}\n\n// ---- sharing ---------------------------------------------------------------\n\nfunction diff(a, b) {\n // keys of `a` whose value differs from `b` (one level deep per group)\n const out = {};\n for (const k of Object.keys(a)) {\n if (k === 'version') continue;\n const va = a[k], vb = b[k];\n if (va && typeof va === 'object' && !Array.isArray(va)) {\n const g = {};\n for (const kk of Object.keys(va)) if (JSON.stringify(va[kk]) !== JSON.stringify(vb && vb[kk])) g[kk] = va[kk];\n if (Object.keys(g).length) out[k] = g;\n } else if (JSON.stringify(va) !== JSON.stringify(vb)) out[k] = va;\n }\n return out;\n}\n\nconst b64url = {\n enc(str) {\n const bytes = new TextEncoder().encode(str);\n let bin = ''; for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n },\n dec(s) {\n const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));\n return new TextDecoder().decode(Uint8Array.from(bin, c => c.charCodeAt(0)));\n },\n};\n\n/** Settings \u2192 the smallest JSON that rebuilds them (only what differs from the defaults). */\nexport function compactSettings(settings) {\n const s = normalizeSettings(settings);\n const out = diff(s, defaultSettings());\n if (out.palette) {\n if (s.palette.source !== 'custom') { delete out.palette.colors; delete out.palette.name; } // a built-in id is enough\n if (s.palette.source !== 'builtin') delete out.palette.id;\n if (s.palette.source !== 'extract') delete out.palette.count;\n }\n if (out.palette && !Object.keys(out.palette).length) delete out.palette;\n return out;\n}\n\n/** Settings \u2192 URL-safe string for `#s=\u2026`. */\nexport function encodeSettings(settings) {\n return b64url.enc(JSON.stringify({ v: SETTINGS_VERSION, ...compactSettings(settings) }));\n}\n\n/** `#s=\u2026` string (or a whole URL / hash) \u2192 settings. Throws on garbage. */\nexport function decodeSettings(str) {\n let s = String(str);\n const m = /[#&?]s=([A-Za-z0-9_-]+)/.exec(s);\n if (m) s = m[1];\n const obj = JSON.parse(b64url.dec(s));\n delete obj.v;\n return normalizeSettings(obj);\n}\n\n/** Settings \u2192 pretty JSON for saving to a file. */\nexport function settingsToJSON(settings) {\n return JSON.stringify({ $schema: 'image-to-pixel/settings', version: SETTINGS_VERSION, ...compactSettings(settings) }, null, 2);\n}\n\n/** JSON text \u2192 settings. Accepts a full or partial settings object. */\nexport function settingsFromJSON(text) {\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\n delete obj.$schema;\n return normalizeSettings(obj);\n}\n\n/** Apply a partial patch on top of settings (one level deep per group). */\nexport function mergeSettings(base, patch) {\n const out = JSON.parse(JSON.stringify(base));\n for (const k of Object.keys(patch || {})) {\n if (patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && out[k] && typeof out[k] === 'object') {\n Object.assign(out[k], patch[k]);\n } else out[k] = patch[k];\n }\n return normalizeSettings(out);\n}\n", "// A \"plan\" is everything both backends need, resolved once from settings + source size:\n// output size, palette bytes, threshold map, kernel, and the numbers derived from them.\n// Building it in one place keeps the CPU and GPU paths in lock-step.\n\nimport { normalizeSettings, resolveSize, ditherKind, cropRect } from './settings.js';\nimport { parseColor, paletteSpread } from './color.js';\nimport { thresholdMap } from './dither/matrices.js';\nimport { KERNELS, kernelSkew, waveCount } from './dither/kernels.js';\nimport { extractPalette } from './palette/extract.js';\nimport { resample, adjust } from './cpu/stages.js';\n\n/**\n * @param {object} settings\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA source (only read for palette extraction)\n */\nexport function makePlan(settings, src) {\n const s = normalizeSettings(settings);\n const crop = cropRect(src.width, src.height, s.frame);\n const { width, height } = resolveSize(crop.w, crop.h, s.size);\n\n let colors = s.palette.colors;\n if (s.palette.source === 'extract') colors = extractFrom(src, s, width, height, crop);\n const quantize = s.palette.source !== 'none' && colors.length > 0;\n const palette = quantize ? colors.map(parseColor) : [];\n\n let kind = quantize ? ditherKind(s.dither.method) : 'none';\n if (s.dither.strength <= 0) kind = 'none';\n\n const map = kind === 'ordered' ? thresholdMap(s.dither.method, s.dither.matrix) : null;\n const kernel = kind === 'diffusion' ? KERNELS[s.dither.method] : null;\n const skew = kernel ? kernelSkew(kernel) : 1;\n\n return {\n settings: s,\n srcWidth: src.width, srcHeight: src.height,\n crop, // source pixels kept by the frame settings\n width, height,\n quantize, kind,\n palette, // [[r, g, b] bytes]\n paletteHex: quantize ? colors.slice() : null,\n distance: s.palette.distance === 'rgb' ? 1 : 0,\n spread: quantize ? paletteSpread(palette) : 0,\n map, kernel, skew,\n waves: kernel ? waveCount(width, height, skew) : 0,\n outline: { mode: s.outline.mode, color: parseColor(s.outline.color), corners: s.outline.corners },\n };\n}\n\nfunction extractFrom(src, s, width, height, crop) {\n // extract from what will actually be quantised: the resized + adjusted image (capped for speed)\n const k = Math.min(1, 160 / Math.max(width, height));\n const w = Math.max(1, Math.round(width * k)), h = Math.max(1, Math.round(height * k));\n const prep = resample(src, w, h, 'box', crop);\n adjust(prep, s.adjust);\n const bytes = new Uint8ClampedArray(prep.length);\n for (let i = 0; i < prep.length; i++) bytes[i] = Math.round(prep[i] * 255);\n return extractPalette({ data: bytes, width: w, height: h }, s.palette.count, { alphaThreshold: Math.max(0.01, s.alpha.threshold) });\n}\n", "// Generated by scripts/gen-bluenoise.mjs: 64\u00D764 void-and-cluster blue noise, one byte per cell (0..255).\nexport const BLUE_NOISE_SIZE = 64;\nexport const BLUE_NOISE_B64 = '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';\n", "// Threshold maps for ordered dithering.\n// A map is { w, h, levels, values: Uint8Array } and the threshold of a cell is (value + 0.5) / levels.\n// The GPU reads the same bytes from a texture, so CPU and GPU agree exactly.\n\nimport { BLUE_NOISE_B64, BLUE_NOISE_SIZE } from './bluenoise-data.js';\n\nfunction fromB64(b64) {\n if (typeof atob === 'function') return Uint8Array.from(atob(b64), c => c.charCodeAt(0));\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Bayer index matrix of size n (power of two). */\nexport function bayer(n) {\n let m = [[0]];\n for (let s = 1; s < n; s *= 2) {\n const next = [];\n for (let y = 0; y < s * 2; y++) next.push(new Array(s * 2));\n for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) {\n const v = 4 * m[y][x];\n next[y][x] = v; next[y][x + s] = v + 2; next[y + s][x] = v + 3; next[y + s][x + s] = v + 1;\n }\n m = next;\n }\n return m;\n}\n\n/** Turn arbitrary numbers into ranks 0..n-1 (ties keep reading order). */\nexport function toRanks(rows) {\n const h = rows.length, w = rows[0].length;\n const cells = [];\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) cells.push({ i: y * w + x, v: rows[y][x] });\n cells.sort((a, b) => a.v - b.v || a.i - b.i);\n const out = new Uint8Array(w * h);\n cells.forEach((c, r) => { out[c.i] = r; });\n return out;\n}\n\n/** Clustered-dot screen: cells ranked by a dot function, two dots per tile at 45\u00B0. */\nfunction clustered(n) {\n const rows = [];\n for (let y = 0; y < n; y++) {\n const row = [];\n for (let x = 0; x < n; x++) {\n const u = (x + 0.5) / n * 2 * Math.PI, v = (y + 0.5) / n * 2 * Math.PI;\n row.push(-(Math.cos(u) + Math.cos(v)) + (x * n + y) * 1e-9);\n }\n rows.push(row);\n }\n return rows;\n}\n\nconst CLUSTER4 = [[7, 13, 11, 4], [12, 16, 14, 8], [10, 15, 6, 2], [5, 9, 3, 1]]; // classic editor's matrix\nconst cache = new Map();\n\n/**\n * Threshold map for an ordered method id ('bayer4', 'bluenoise', 'custom' \u2026).\n * @param {string} method\n * @param {number[][]|null} [custom] matrix for 'custom'\n */\nexport function thresholdMap(method, custom = null) {\n if (method === 'custom') {\n const m = custom && custom.length ? custom : bayer(4);\n return { w: m[0].length, h: m.length, levels: m.length * m[0].length, values: toRanks(m) };\n }\n if (cache.has(method)) return cache.get(method);\n let map;\n const sq = rows => ({ w: rows[0].length, h: rows.length, levels: rows.length * rows[0].length, values: toRanks(rows) });\n switch (method) {\n case 'bayer2': map = sq(bayer(2)); break;\n case 'bayer4': map = sq(bayer(4)); break;\n case 'bayer8': map = sq(bayer(8)); break;\n case 'bayer16': map = sq(bayer(16)); break;\n case 'cluster4': map = sq(CLUSTER4); break;\n case 'cluster8': map = sq(clustered(8)); break;\n case 'lines': map = sq([[0], [2], [1], [3]]); break;\n case 'bluenoise': map = { w: BLUE_NOISE_SIZE, h: BLUE_NOISE_SIZE, levels: 256, values: fromB64(BLUE_NOISE_B64) }; break;\n default: map = sq(bayer(4));\n }\n cache.set(method, map);\n return map;\n}\n\n/**\n * Parse a custom matrix typed by a person: rows on lines, numbers separated by spaces or commas.\n * Accepts an optional \"/ 16\" style divisor line, which is ignored (only the order matters).\n */\nexport function parseMatrix(text) {\n const rows = String(text).split(/\\r?\\n|;/).map(l => l.trim()).filter(l => l && !/^\\//.test(l))\n .map(l => l.replace(/[[\\]]/g, '').split(/[\\s,]+/).filter(Boolean).map(Number));\n if (!rows.length) throw new Error('Matrix is empty');\n const w = rows[0].length;\n if (rows.some(r => r.length !== w || r.some(v => !Number.isFinite(v)))) throw new Error('Every row needs the same number of values');\n if (w > 16 || rows.length > 16) throw new Error('Matrices are limited to 16\u00D716');\n return rows;\n}\n", "// Error-diffusion kernels as push offsets [dx, dy, weight] (weights already divided).\n// `skew` is the wavefront slope the GPU needs: pixels with x + skew*y = k only depend on\n// earlier waves, so each wave is one draw (see docs/how-it-works.md).\n\nconst k = (div, list) => list.map(([dx, dy, w]) => [dx, dy, w / div]);\n\nexport const KERNELS = {\n 'floyd-steinberg': k(16, [[1, 0, 7], [-1, 1, 3], [0, 1, 5], [1, 1, 1]]),\n 'atkinson': k(8, [[1, 0, 1], [2, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1], [0, 2, 1]]),\n 'sierra-lite': k(4, [[1, 0, 2], [-1, 1, 1], [0, 1, 1]]),\n 'sierra': k(32, [[1, 0, 5], [2, 0, 3], [-2, 1, 2], [-1, 1, 4], [0, 1, 5], [1, 1, 4], [2, 1, 2], [-1, 2, 2], [0, 2, 3], [1, 2, 2]]),\n 'burkes': k(32, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2]]),\n 'jarvis': k(48, [[1, 0, 7], [2, 0, 5], [-2, 1, 3], [-1, 1, 5], [0, 1, 7], [1, 1, 5], [2, 1, 3], [-2, 2, 1], [-1, 2, 3], [0, 2, 5], [1, 2, 3], [2, 2, 1]]),\n 'stucki': k(42, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2], [-2, 2, 1], [-1, 2, 2], [0, 2, 4], [1, 2, 2], [2, 2, 1]]),\n};\n\nexport const MAX_KERNEL = 12;\n\n/** Smallest integer s so that every push offset lands on a later wave x + s*y. */\nexport function kernelSkew(kernel) {\n let s = 1;\n for (const [dx, dy] of kernel) if (dy > 0) s = Math.max(s, Math.floor(-dx / dy) + 1);\n return s;\n}\n\n/** Number of waves (GPU draws) for an image of w \u00D7 h. */\nexport const waveCount = (w, h, skew) => (w - 1) + skew * (h - 1) + 1;\n", "// Palette extraction: median cut on the image's colours, refined by a few k-means passes.\n// Deterministic (no randomness), so the same image always gives the same palette.\n\nimport { toHex } from '../color.js';\n\n/**\n * @param {{ data: ArrayLike<number>, width: number, height: number }} img RGBA bytes\n * @param {number} count number of colours (2..256)\n * @param {{ maxSamples?: number, alphaThreshold?: number }} [opts]\n * @returns {string[]} '#rrggbb' colours sorted dark \u2192 light\n */\nexport function extractPalette(img, count = 16, opts = {}) {\n const { maxSamples = 40000, alphaThreshold = 0.5 } = opts;\n const n = img.width * img.height;\n const step = Math.max(1, Math.floor(n / maxSamples));\n const pts = [];\n for (let i = 0; i < n; i += step) {\n const o = i * 4;\n if (img.data[o + 3] < alphaThreshold * 255) continue;\n pts.push([img.data[o], img.data[o + 1], img.data[o + 2]]);\n }\n if (!pts.length) return ['#000000', '#ffffff'].slice(0, Math.max(1, count));\n\n // ---- median cut\n let boxes = [pts];\n while (boxes.length < count) {\n let bi = -1, bestRange = -1, bestAxis = 0;\n boxes.forEach((b, i) => {\n if (b.length < 2) return;\n for (let a = 0; a < 3; a++) {\n let lo = 255, hi = 0;\n for (const p of b) { if (p[a] < lo) lo = p[a]; if (p[a] > hi) hi = p[a]; }\n // weight by population so big flat areas get split before tiny noisy ones\n const r = (hi - lo) * Math.sqrt(b.length);\n if (r > bestRange) { bestRange = r; bi = i; bestAxis = a; }\n }\n });\n if (bi < 0 || bestRange <= 0) break;\n const b = boxes[bi].slice().sort((p, q) => p[bestAxis] - q[bestAxis]);\n const mid = b.length >> 1;\n boxes.splice(bi, 1, b.slice(0, mid), b.slice(mid));\n }\n let centers = boxes.map(b => mean(b));\n\n // ---- k-means refinement\n for (let iter = 0; iter < 6; iter++) {\n const sums = centers.map(() => [0, 0, 0, 0]);\n for (const p of pts) {\n let best = 0, bd = Infinity;\n for (let c = 0; c < centers.length; c++) {\n const dr = p[0] - centers[c][0], dg = p[1] - centers[c][1], db = p[2] - centers[c][2];\n const d = dr * dr + dg * dg + db * db;\n if (d < bd) { bd = d; best = c; }\n }\n const s = sums[best]; s[0] += p[0]; s[1] += p[1]; s[2] += p[2]; s[3]++;\n }\n centers = centers.map((c, i) => (sums[i][3] ? [sums[i][0] / sums[i][3], sums[i][1] / sums[i][3], sums[i][2] / sums[i][3]] : c));\n }\n\n const hexes = [...new Set(centers.map(c => toHex(c)))];\n const lum = h => { const v = parseInt(h.slice(1), 16); return 0.2126 * (v >> 16) + 0.7152 * ((v >> 8) & 255) + 0.0722 * (v & 255); };\n return hexes.sort((a, b) => lum(a) - lum(b));\n}\n\nfunction mean(list) {\n let r = 0, g = 0, b = 0;\n for (const p of list) { r += p[0]; g += p[1]; b += p[2]; }\n return [r / list.length, g / list.length, b / list.length];\n}\n", "// CPU reference implementation of every pipeline stage.\n// The GLSL in gpu/shaders.js mirrors these functions line for line; tests compare the two.\n// Working buffers are Float32Array RGBA, rows top-down, values 0..1.\n\nimport { oklab, LUMA } from '../color.js';\n\n/**\n * Resample to w \u00D7 h. 'box' averages up to 16\u00D716 evenly spaced source texels per output pixel\n * (alpha-weighted); 'nearest' takes the centre texel. Integer maths, identical on the GPU.\n */\nexport function resample(src, w, h, mode = 'box', crop = null) {\n const ox = crop ? crop.x : 0, oy = crop ? crop.y : 0;\n const sw = crop ? crop.w : src.width, sh = crop ? crop.h : src.height, d = src.data, stride = src.width;\n const out = new Float32Array(w * h * 4);\n const nx = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sw / w)));\n const ny = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sh / h)));\n const xs = new Int32Array(w * nx), ys = new Int32Array(h * ny);\n for (let x = 0; x < w; x++) for (let i = 0; i < nx; i++) xs[x * nx + i] = ox + Math.min(sw - 1, Math.floor(((2 * (x * nx + i) + 1) * sw) / (2 * w * nx)));\n for (let y = 0; y < h; y++) for (let j = 0; j < ny; j++) ys[y * ny + j] = oy + Math.min(sh - 1, Math.floor(((2 * (y * ny + j) + 1) * sh) / (2 * h * ny)));\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n let r = 0, g = 0, b = 0, a = 0;\n for (let j = 0; j < ny; j++) {\n const row = ys[y * ny + j] * stride;\n for (let i = 0; i < nx; i++) {\n const o = (row + xs[x * nx + i]) * 4;\n const al = d[o + 3] / 255;\n r += d[o] / 255 * al; g += d[o + 1] / 255 * al; b += d[o + 2] / 255 * al; a += al;\n }\n }\n const o = (y * w + x) * 4;\n if (a > 0) { out[o] = r / a; out[o + 1] = g / a; out[o + 2] = b / a; }\n out[o + 3] = a / (nx * ny);\n }\n }\n return out;\n}\n\n/** Brightness, contrast, saturation, hue, gamma \u2014 in that order, in place. */\nexport function adjust(buf, { brightness = 0, contrast = 0, saturation = 0, hue = 0, gamma = 1 }) {\n if (!brightness && !contrast && !saturation && !hue && gamma === 1) return buf;\n const f = contrast >= 0 ? 1 / (1 - 0.99 * contrast) : 1 + contrast;\n const ig = 1 / gamma;\n // luminance-preserving hue rotation: the CSS hue-rotate() matrix (rows sum to 1, so greys stay grey)\n const hk = Math.cos(hue * Math.PI / 180), hq = Math.sin(hue * Math.PI / 180);\n const M = [\n 0.213 + 0.787 * hk - 0.213 * hq, 0.715 - 0.715 * hk - 0.715 * hq, 0.072 - 0.072 * hk + 0.928 * hq,\n 0.213 - 0.213 * hk + 0.143 * hq, 0.715 + 0.285 * hk + 0.140 * hq, 0.072 - 0.072 * hk - 0.283 * hq,\n 0.213 - 0.213 * hk - 0.787 * hq, 0.715 - 0.715 * hk + 0.715 * hq, 0.072 + 0.928 * hk + 0.072 * hq,\n ];\n for (let o = 0; o < buf.length; o += 4) {\n let r = buf[o] + brightness, g = buf[o + 1] + brightness, b = buf[o + 2] + brightness;\n r = (r - 0.5) * f + 0.5; g = (g - 0.5) * f + 0.5; b = (b - 0.5) * f + 0.5;\n const l = r * LUMA[0] + g * LUMA[1] + b * LUMA[2];\n const k = 1 + saturation;\n r = l + (r - l) * k; g = l + (g - l) * k; b = l + (b - l) * k;\n if (hue) {\n const r2 = M[0] * r + M[1] * g + M[2] * b, g2 = M[3] * r + M[4] * g + M[5] * b, b2 = M[6] * r + M[7] * g + M[8] * b;\n r = r2; g = g2; b = b2;\n }\n buf[o] = Math.pow(clamp01(r), ig); buf[o + 1] = Math.pow(clamp01(g), ig); buf[o + 2] = Math.pow(clamp01(b), ig);\n }\n return buf;\n}\n\n/** Binary alpha: below the threshold becomes fully transparent, the rest fully opaque. */\nexport function alphaCut(buf, threshold) {\n for (let o = 3; o < buf.length; o += 4) buf[o] = buf[o] >= threshold && buf[o] > 0 ? 1 : 0;\n return buf;\n}\n\nexport const clamp01 = v => (v < 0 ? 0 : v > 1 ? 1 : v);\n\n/** Precompute what nearest() needs for a palette. */\nexport function paletteSpace(palette, distance) {\n const n = palette.length;\n const coords = new Float64Array(n * 3);\n const rgb = new Float64Array(n * 3);\n palette.forEach((c, i) => {\n rgb.set([c[0] / 255, c[1] / 255, c[2] / 255], i * 3);\n coords.set(distance === 1 ? [c[0] / 255, c[1] / 255, c[2] / 255] : oklab(c[0] / 255, c[1] / 255, c[2] / 255), i * 3);\n });\n return { n, coords, rgb, distance };\n}\n\nconst W_RGB = [0.299, 0.587, 0.114];\n\n/** Index of the nearest palette colour (ties: lowest index). */\nexport function nearest(sp, r, g, b) {\n let p0, p1, p2, w0 = 1, w1 = 1, w2 = 1;\n if (sp.distance === 1) { p0 = r; p1 = g; p2 = b; w0 = W_RGB[0]; w1 = W_RGB[1]; w2 = W_RGB[2]; }\n else [p0, p1, p2] = oklab(r, g, b);\n let best = 0, bd = Infinity;\n const c = sp.coords;\n for (let i = 0; i < sp.n; i++) {\n const d0 = p0 - c[i * 3], d1 = p1 - c[i * 3 + 1], d2 = p2 - c[i * 3 + 2];\n const dist = w0 * d0 * d0 + w1 * d1 * d1 + w2 * d2 * d2;\n if (dist < bd) { bd = dist; best = i; }\n }\n return best;\n}\n\n/** No dithering / ordered dithering \u2192 RGBA bytes. */\nexport function quantizeOrdered(buf, w, h, plan) {\n const out = new Uint8ClampedArray(w * h * 4);\n const sp = plan.quantize ? paletteSpace(plan.palette, plan.distance) : null;\n const map = plan.kind === 'ordered' ? plan.map : null;\n const amt = map ? plan.spread * plan.settings.dither.strength : 0;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const o = (y * w + x) * 4;\n if (buf[o + 3] < 0.5) continue; // transparent stays 0,0,0,0\n let r = buf[o], g = buf[o + 1], b = buf[o + 2];\n if (sp) {\n if (map) {\n const t = (map.values[(y % map.h) * map.w + (x % map.w)] + 0.5) / map.levels - 0.5;\n r = clamp01(r + t * amt); g = clamp01(g + t * amt); b = clamp01(b + t * amt);\n }\n const i = nearest(sp, r, g, b);\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2];\n } else {\n out[o] = Math.round(r * 255); out[o + 1] = Math.round(g * 255); out[o + 2] = Math.round(b * 255);\n }\n out[o + 3] = 255;\n }\n }\n return out;\n}\n\n/** Error diffusion (left \u2192 right, top \u2192 bottom) \u2192 RGBA bytes. */\nexport function quantizeDiffusion(buf, w, h, plan) {\n const out = new Uint8ClampedArray(w * h * 4);\n const sp = paletteSpace(plan.palette, plan.distance);\n const acc = new Float32Array(w * h * 3);\n const strength = plan.settings.dither.strength;\n const kernel = plan.kernel;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const p = y * w + x, o = p * 4;\n if (buf[o + 3] < 0.5) continue;\n const r = clamp01(buf[o] + acc[p * 3] * strength);\n const g = clamp01(buf[o + 1] + acc[p * 3 + 1] * strength);\n const b = clamp01(buf[o + 2] + acc[p * 3 + 2] * strength);\n const i = nearest(sp, r, g, b);\n const er = r - sp.rgb[i * 3], eg = g - sp.rgb[i * 3 + 1], eb = b - sp.rgb[i * 3 + 2];\n for (const [dx, dy, wt] of kernel) {\n const xx = x + dx, yy = y + dy;\n if (xx < 0 || xx >= w || yy >= h) continue;\n const q = (yy * w + xx) * 3;\n acc[q] += er * wt; acc[q + 1] += eg * wt; acc[q + 2] += eb * wt;\n }\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2]; out[o + 3] = 255;\n }\n }\n return out;\n}\n\nconst key = (d, o) => (d[o + 3] === 0 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\nconst N4 = [[0, -1], [1, 0], [0, 1], [-1, 0]];\n\n/** Replace pixels that share no colour with any 4-neighbour by their most common neighbour. */\nexport function removeOrphans(px, w, h) {\n const src = px.slice();\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const o = (y * w + x) * 4, c = key(src, o);\n const ks = [], os = [];\n for (const [dx, dy] of N4) {\n const xx = x + dx, yy = y + dy;\n if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\n const oo = (yy * w + xx) * 4;\n ks.push(key(src, oo)); os.push(oo);\n }\n if (ks.length < 2 || ks.includes(c)) continue;\n let best = 0, bc = 0;\n for (let i = 0; i < ks.length; i++) {\n let n = 0; for (let j = 0; j < ks.length; j++) if (ks[j] === ks[i]) n++;\n if (n > bc) { bc = n; best = i; }\n }\n px.set(src.subarray(os[best], os[best] + 4), o);\n }\n }\n return px;\n}\n\n/** 3\u00D73 majority: a colour that fills at least 5 of the 9 cells wins. */\nexport function smoothMajority(px, w, h) {\n const src = px.slice();\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const o = (y * w + x) * 4, c = key(src, o);\n const ks = [], os = [];\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\n const xx = Math.min(w - 1, Math.max(0, x + dx)), yy = Math.min(h - 1, Math.max(0, y + dy));\n const oo = (yy * w + xx) * 4; ks.push(key(src, oo)); os.push(oo);\n }\n for (let i = 0; i < 9; i++) {\n if (ks[i] === c) continue;\n let n = 0; for (let j = 0; j < 9; j++) if (ks[j] === ks[i]) n++;\n if (n >= 5) { px.set(src.subarray(os[i], os[i] + 4), o); break; }\n }\n }\n }\n return px;\n}\n\n/** Outline around (outer) or inside (inner) the opaque shape. */\nexport function outline(px, w, h, { mode, color, corners }) {\n if (mode === 'none') return px;\n const src = px.slice();\n const opaque = (x, y) => x >= 0 && y >= 0 && x < w && y < h && src[(y * w + x) * 4 + 3] > 0;\n const inside = (x, y) => x >= 0 && y >= 0 && x < w && y < h;\n const nb = corners ? [[0, -1], [1, 0], [0, 1], [-1, 0], [-1, -1], [1, -1], [1, 1], [-1, 1]] : N4;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n const me = opaque(x, y);\n let hit = false;\n for (const [dx, dy] of nb) {\n const xx = x + dx, yy = y + dy;\n if (!inside(xx, yy)) continue;\n if (mode === 'outer' ? (!me && opaque(xx, yy)) : (me && !opaque(xx, yy))) { hit = true; break; }\n }\n if (hit) { const o = (y * w + x) * 4; px[o] = color[0]; px[o + 1] = color[1]; px[o + 2] = color[2]; px[o + 3] = 255; }\n }\n }\n return px;\n}\n", "// The whole pipeline on the CPU. Used when WebGL 2 is unavailable, in Node, and as the\n// reference the GPU output is tested against.\n\nimport { resample, adjust, alphaCut, quantizeOrdered, quantizeDiffusion, removeOrphans, smoothMajority, outline } from './stages.js';\n\n/**\n * @param {ReturnType<import('../plan.js').makePlan>} plan\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA bytes, rows top-down\n * @returns {Uint8ClampedArray} RGBA bytes, plan.width \u00D7 plan.height\n */\nexport function runCPU(plan, src) {\n const { width: w, height: h, settings: s } = plan;\n const buf = resample(src, w, h, s.size.resample, plan.crop);\n adjust(buf, s.adjust);\n alphaCut(buf, s.alpha.threshold);\n const px = plan.kind === 'diffusion' ? quantizeDiffusion(buf, w, h, plan) : quantizeOrdered(buf, w, h, plan);\n if (s.cleanup.orphans) removeOrphans(px, w, h);\n if (s.cleanup.smooth) smoothMajority(px, w, h);\n outline(px, w, h, plan.outline);\n return px;\n}\n", "/* global __VERSION__ */\n// __VERSION__ is injected by esbuild (see esbuild.config.mjs); falls back when running src/ directly.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '2.0.0-dev';\nexport const MAX_CHANNELS = 4;\nexport const DEFAULT_CANVAS_ID = 'glcanvas';\n", "export class ShaderMateError extends Error {\n constructor(message, details) {\n super(message);\n this.name = 'ShaderMateError';\n if (details) Object.assign(this, details);\n }\n}\n\nconst warned = new Set();\n/** console.warn once per key. */\nexport function warnOnce(key, ...args) {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn('[ShaderMate]', ...args);\n}\n\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nexport const isArrayLike = v => Array.isArray(v) || (ArrayBuffer.isView(v) && !(v instanceof DataView));\nexport const toArray = v => (v == null ? [] : Array.isArray(v) ? v : [v]);\nexport const isPow2 = n => n > 0 && (n & (n - 1)) === 0;\nexport const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));\n\n/** `glsl` tagged template: no-op, but lets editors syntax-highlight inline shaders. */\nexport const glsl = (strings, ...values) => String.raw({ raw: strings }, ...values);\n\n/** Parse a CSS color ('#f80', 'rgb(\u2026)', 'red') or [r,g,b,a] into [r,g,b,a] 0..1. */\nexport function parseColor(c) {\n if (c == null) return null;\n if (Array.isArray(c)) return [c[0] ?? 0, c[1] ?? 0, c[2] ?? 0, c[3] ?? 1];\n if (typeof c === 'string' && isBrowser) {\n const cv = document.createElement('canvas');\n cv.width = cv.height = 1;\n const x = cv.getContext('2d');\n x.fillStyle = c;\n x.fillRect(0, 0, 1, 1);\n const d = x.getImageData(0, 0, 1, 1).data;\n return [d[0] / 255, d[1] / 255, d[2] / 255, d[3] / 255];\n }\n return null;\n}\n\n/** True when running on localhost / file: \u2014 used for dev-only defaults. */\nexport function isDevHost() {\n if (!isBrowser) return false;\n const h = location.hostname;\n return location.protocol === 'file:' || h === 'localhost' || h === '127.0.0.1' || h === '' || h.endsWith('.local');\n}\n", "/** Reference-counted store for GL objects so shared resources are freed exactly once. */\nexport class RefPool {\n constructor(gl) {\n this.gl = gl;\n this._items = new Map(); // id -> { obj, count, type }\n this._nextId = 1;\n }\n\n add(obj, type) {\n const id = this._nextId++;\n this._items.set(id, { obj, count: 1, type });\n return id;\n }\n\n ref(id) {\n const it = this._items.get(id);\n if (it) it.count++;\n return id;\n }\n\n /** Returns the raw GL object for an id (or null). */\n get(id) {\n const it = this._items.get(id);\n return it ? it.obj : null;\n }\n\n unref(id) {\n const it = this._items.get(id);\n if (!it) return;\n it.count--;\n if (it.count <= 0) this._destroy(id, it);\n }\n\n _destroy(id, it) {\n const { obj, type } = it;\n const gl = this.gl;\n switch (type) {\n case 'texture2D':\n case 'textureCube': gl.deleteTexture(obj); break;\n case 'fbo': gl.deleteFramebuffer(obj); break;\n case 'buffer': gl.deleteBuffer(obj); break;\n case 'program': gl.deleteProgram(obj); break;\n }\n this._items.delete(id);\n }\n\n /** Destroy everything regardless of refcount. */\n dispose() {\n for (const [id, it] of [...this._items]) this._destroy(id, it);\n }\n}\n", "/**\n * Tiny event emitter. `forward(ev, data)` (optional) receives every emitted event,\n * which is how instances feed the global ShaderMate.on() bus.\n */\nexport function createEmitter(forward) {\n const map = new Map();\n\n function on(ev, fn) {\n if (!map.has(ev)) map.set(ev, new Set());\n map.get(ev).add(fn);\n return () => off(ev, fn);\n }\n function off(ev, fn) {\n const s = map.get(ev);\n if (s) s.delete(fn);\n }\n function once(ev, fn) {\n const wrapped = data => { off(ev, wrapped); fn(data); };\n return on(ev, wrapped);\n }\n function emit(ev, data) {\n const s = map.get(ev);\n if (s) {\n for (const fn of [...s]) {\n try { fn(data); } catch (e) { console.error(`[ShaderMate] error in \"${ev}\" listener`, e); }\n }\n }\n if (forward) forward(ev, data);\n }\n function clear() { map.clear(); }\n\n return { on, off, once, emit, clear };\n}\n", "// Tiny tween engine for uniforms: sm.tween('u_hover', 1, { duration: 400, ease: 'outCubic' })\n\nexport const EASES = {\n linear: t => t,\n inQuad: t => t * t,\n outQuad: t => t * (2 - t),\n inOutQuad: t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n inCubic: t => t * t * t,\n outCubic: t => 1 - Math.pow(1 - t, 3),\n inOutCubic: t => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n outExpo: t => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n outBack: t => 1 + 2.70158 * Math.pow(t - 1, 3) + 1.70158 * Math.pow(t - 1, 2),\n outElastic: t => (t === 0 || t === 1 ? t : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI) / 3) + 1),\n};\n\nexport function createTweens() {\n const active = new Map(); // key -> tween\n\n /**\n * getter/setter work on the live uniform value. Resolves when finished (false if interrupted).\n */\n function tween(key, get, set, to, opts = {}) {\n const { duration = 500, delay = 0 } = opts;\n const ease = typeof opts.ease === 'function' ? opts.ease : (EASES[opts.ease] || EASES.outCubic);\n const prev = active.get(key);\n if (prev) prev.resolve(false);\n\n const from = get();\n const isArr = Array.isArray(to) || ArrayBuffer.isView(to);\n const f = isArr ? Array.from(from ?? to) : Number(from ?? 0);\n const t = isArr ? Array.from(to) : Number(to);\n\n return new Promise(resolve => {\n const tw = {\n start: performance.now() + delay,\n resolve: v => { active.delete(key); resolve(v); },\n update(now) {\n const p = duration > 0 ? clamp01((now - this.start) / duration) : 1;\n if (p < 0) return;\n const e = ease(p);\n set(isArr ? f.map((a, i) => a + (t[i] - a) * e) : f + (t - f) * e);\n if (p >= 1) this.resolve(true);\n }\n };\n active.set(key, tw);\n });\n }\n\n function update(now) {\n for (const tw of [...active.values()]) tw.update(now);\n }\n\n function cancel(key) {\n if (key === undefined) { for (const tw of [...active.values()]) tw.resolve(false); return; }\n const tw = active.get(key);\n if (tw) tw.resolve(false);\n }\n\n return { tween, update, cancel, get size() { return active.size; } };\n}\n\nconst clamp01 = v => (v < 0 ? v : v > 1 ? 1 : v);\n", "import { MAX_CHANNELS } from '../constants.js';\nimport { ShaderMateError } from '../utils/util.js';\n\n/**\n * Normalize everything the user may pass as \"the shaders\" into an array of pass configs.\n *\n * 'frag.glsl' | '...glsl source...' -> one screen pass\n * { shader|src, ... } -> one pass\n * [ 'a.glsl', { name, shader, ... }, ... ] -> multipass (last one hits the screen unless `screen` is set)\n *\n * Caller objects are shallow-cloned; `uniforms` is kept by reference so live mutation works.\n */\nexport function normalizePasses(input) {\n let list;\n if (typeof input === 'string') list = [{ src: input }];\n else if (Array.isArray(input)) list = input.map(p => (typeof p === 'string' ? { src: p } : { ...p }));\n else if (input && typeof input === 'object') list = [{ ...input }];\n else throw new ShaderMateError('ShaderMate: expected a shader (string), a pass object, or an array of passes');\n if (!list.length) throw new ShaderMateError('ShaderMate: no passes given');\n\n list.forEach((p, i) => {\n if (p.src == null) p.src = p.shader ?? p.frag ?? p.fragment ?? p.glsl ?? p.url;\n if (p.src == null) throw new ShaderMateError(`Pass ${p.name ?? i} has no shader source (use \"shader\")`);\n if (p.name == null) p.name = list.length === 1 ? 'main' : 'pass' + i;\n if (p.uniforms == null) p.uniforms = {};\n });\n\n if (!list.some(p => p.screen)) list[list.length - 1].screen = true;\n if (list.filter(p => p.screen).length > 1) console.warn('[ShaderMate] Multiple screen:true passes; last drawn wins.');\n\n const names = list.map(p => p.name);\n const dupes = names.filter((n, i) => names.indexOf(n) !== i);\n if (dupes.length) throw new ShaderMateError('Duplicate pass names: ' + [...new Set(dupes)].join(', '));\n\n for (const p of list) {\n const chans = Array.isArray(p.channels) ? p.channels : (p.channels ? [p.channels] : []);\n p.channels = chans.slice(0, MAX_CHANNELS).map(c => normalizeChannel(c, names, p.name));\n while (p.channels.length < MAX_CHANNELS) p.channels.push(null);\n }\n return list;\n}\n\nconst isEl = v => typeof HTMLElement !== 'undefined' && v instanceof HTMLElement;\nconst isBitmap = v => typeof ImageBitmap !== 'undefined' && v instanceof ImageBitmap;\nconst isTex = v => typeof WebGLTexture !== 'undefined' && v instanceof WebGLTexture;\n\n/**\n * Channel shorthand:\n * 'BufferA' -> that pass's output (if a pass has that name), else an image URL\n * { pass:'A' } / { id:'A' } -> pass output (buffer: 'prev' | 'current' for ping-pong passes)\n * { url|image }, { video }, { audio|audioFFT }, { mic:true }, { camera:true }, { cubemap:[6 urls] }\n * { element } or a raw <canvas>/<video>/<img>/ImageBitmap\n * { texture: WebGLTexture, width, height, cube? }\n * common params: wrap, filter, flipY, mipmap\n */\nexport function normalizeChannel(ch, passNames = [], ownerName = '') {\n if (ch == null || ch === false) return null;\n if (typeof ch === 'string') return passNames.includes(ch) ? { pass: ch } : { url: ch };\n if (isEl(ch) || isBitmap(ch)) return { element: ch };\n if (isTex(ch)) return { texture: ch };\n const out = { ...ch };\n if (out.pass == null && out.id != null) out.pass = out.id;\n if (out.url == null && out.image != null) out.url = out.image;\n if (out.element == null && out.canvas != null) out.element = out.canvas;\n if (out.pass == null && out.src != null && out.url == null && out.video == null) out.url = out.src;\n if (out.pass != null && !passNames.includes(out.pass)) {\n console.warn(`[ShaderMate] Pass \"${ownerName}\": channel references unknown pass \"${out.pass}\"`);\n }\n return out;\n}\n\n/** True if `src` is GLSL text rather than a URL/path. */\nexport function isInlineSource(src) {\n return /[\\r\\n]/.test(src) || /^\\s*(void|#|precision|uniform|in |out |\\/\\/|\\/\\*)/.test(src) || /[{};]/.test(src);\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\nexport const isWebGL2 = gl =>\n typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n\n/**\n * options.webgl: 'auto' (default) | 2 | 1\n * options.alpha / premultipliedAlpha / preserveDrawingBuffer / antialias, plus options.contextAttributes.\n */\nexport function createContext(canvas, options = {}) {\n const attrs = Object.assign({\n alpha: options.alpha !== false,\n premultipliedAlpha: options.premultipliedAlpha !== false,\n preserveDrawingBuffer: !!options.preserveDrawingBuffer,\n antialias: !!options.antialias,\n powerPreference: options.powerPreference || 'default',\n }, options.contextAttributes);\n\n const want = options.webgl === undefined ? 'auto' : String(options.webgl);\n let gl = null;\n if (want === 'auto' || want === '2') gl = canvas.getContext('webgl2', attrs);\n if (!gl && (want === 'auto' || want === '1')) {\n gl = canvas.getContext('webgl', attrs) || canvas.getContext('experimental-webgl', attrs);\n }\n if (!gl) throw new ShaderMateError('WebGL not supported');\n return gl;\n}\n\nexport function getExtensions(gl, isGL2) {\n const ext = {};\n if (!isGL2) {\n ext.OES_texture_float = gl.getExtension('OES_texture_float');\n ext.OES_texture_half_float = gl.getExtension('OES_texture_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n ext.OES_texture_half_float_linear = gl.getExtension('OES_texture_half_float_linear');\n ext.OES_standard_derivatives = gl.getExtension('OES_standard_derivatives');\n ext.WEBGL_color_buffer_float = gl.getExtension('WEBGL_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.WEBGL_depth_texture = gl.getExtension('WEBGL_depth_texture');\n ext.EXT_shader_texture_lod = gl.getExtension('EXT_shader_texture_lod');\n } else {\n ext.EXT_color_buffer_float = gl.getExtension('EXT_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n }\n return ext;\n}\n", "/** Full-screen two-triangle quad. One per instance (GL buffers can't be shared across contexts). */\nexport function createQuad(gl) {\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n -1, -1, 1, -1, -1, 1,\n -1, 1, 1, -1, 1, 1\n ]), gl.STATIC_DRAW);\n\n return {\n /** Bind the quad to `program`'s a_position attribute (call right before drawing). */\n bind(program) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n const loc = gl.getAttribLocation(program, 'a_position');\n if (loc !== -1) {\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);\n }\n },\n draw() { gl.drawArrays(gl.TRIANGLES, 0, 6); },\n dispose() { gl.deleteBuffer(buf); }\n };\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\n/**\n * Parse a driver info log into [{ line, message }], with `line` relative to the user's\n * source (the injected `#line 1`), so errors point at the file the author wrote.\n */\nexport function parseShaderLog(log, src) {\n const lines = src.split('\\n');\n const userStart = lines.findIndex(l => /^\\s*#line\\s+1\\b/.test(l)) + 1;\n const errors = [];\n for (const row of log.split('\\n')) {\n const m = /ERROR:\\s*\\d+:(\\d+):\\s*(.*)/.exec(row);\n if (!m) continue;\n const logical = parseInt(m[1], 10);\n const physical = userStart > 0 ? userStart + logical - 1 : logical - 1; // 0-based index into `lines`\n errors.push({ line: logical, message: m[2].trim(), source: lines[physical] ?? '', physical });\n }\n return errors;\n}\n\n/**\n * Compile one shader. Returns { shader } or { error: ShaderMateError }.\n */\nexport function compileShader(gl, type, src, { label = '', showExpandedOnError = true } = {}) {\n const sh = gl.createShader(type);\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (gl.getShaderParameter(sh, gl.COMPILE_STATUS)) return { shader: sh };\n\n const log = gl.getShaderInfoLog(sh) || '';\n gl.deleteShader(sh);\n const errors = parseShaderLog(log, src);\n const stage = type === gl.VERTEX_SHADER ? 'Vertex' : 'Fragment';\n const summary = errors.length\n ? errors.map(e => `line ${e.line}: ${e.message}`).join('\\n')\n : log.trim();\n const err = new ShaderMateError(`${stage} shader compile error${label ? ` in pass \"${label}\"` : ''}:\\n${summary}`,\n { pass: label, stage, log, errors, source: src });\n\n if (showExpandedOnError) {\n const marks = new Set(errors.map(e => e.physical));\n const numbered = src.split('\\n').map((line, i) =>\n `${marks.has(i) ? '>>>' : ' '} ${String(i + 1).padStart(4, ' ')} | ${line}`).join('\\n');\n console.error('[ShaderMate] ' + err.message, { COMPILED: '\\n' + numbered });\n } else {\n console.error('[ShaderMate] ' + err.message);\n }\n return { error: err };\n}\n\n/** Link a program. Returns { program } or { error }. */\nexport function createProgram(gl, vsrc, fsrc, opts) {\n const v = compileShader(gl, gl.VERTEX_SHADER, vsrc, opts);\n if (v.error) return v;\n const f = compileShader(gl, gl.FRAGMENT_SHADER, fsrc, opts);\n if (f.error) { gl.deleteShader(v.shader); return f; }\n\n const p = gl.createProgram();\n gl.attachShader(p, v.shader);\n gl.attachShader(p, f.shader);\n gl.linkProgram(p);\n gl.deleteShader(v.shader);\n gl.deleteShader(f.shader);\n\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(p) || '';\n gl.deleteProgram(p);\n const err = new ShaderMateError(`Program link error${opts && opts.label ? ` in pass \"${opts.label}\"` : ''}: ${log}`, { pass: opts && opts.label, log });\n console.error('[ShaderMate] ' + err.message);\n return { error: err };\n }\n return { program: p };\n}\n\n/** name -> { loc, type, size } for every active uniform (array names have `[0]` stripped). */\nexport function getUniformInfo(gl, program) {\n const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n const out = {};\n for (let i = 0; i < n; i++) {\n const info = gl.getActiveUniform(program, i);\n if (!info) continue;\n out[info.name.replace(/\\[0\\]$/, '')] = {\n loc: gl.getUniformLocation(program, info.name),\n type: info.type,\n size: info.size\n };\n }\n return out;\n}\n", "export const VERT_GL2 = `#version 300 es\nlayout(location=0) in vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\nexport const VERT_GL1 = `attribute vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\n/** Texture-sampling compatibility macros so the same source compiles as GLSL ES 1.00 and 3.00. */\nexport const BUILTIN_MACROS_GL2 = `#define texture2D(s,u) texture(s,u)\n#define textureCube(s,u) texture(s,u)\n#define TEX(s,u) texture(s,u)\n#define TEX_LOD(s,u,l) textureLod(s,u,l)\n`;\n\nexport const BUILTIN_MACROS_GL1 = `#define texture(s,u) texture2D(s,u)\n#define TEX(s,u) texture2D(s,u)\n#define TEX_LOD(s,u,l) texture2D(s,u)\n`;\n\nexport const MAIN_WRAP_GL2 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n outColor = c;\n}`;\n\nexport const MAIN_WRAP_GL1 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n gl_FragColor = c;\n}`;\n", "import { createProgram } from './shader.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\n\nconst FRAG_GL2 = `#version 300 es\nprecision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;\nvoid main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`;\nconst FRAG_GL1 = `precision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size;\nvoid main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;\n\n/** Copies a texture to the default framebuffer (used when the screen pass also needs a readable backbuffer). */\nexport function createBlit(gl, isGL2, quad) {\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, isGL2 ? FRAG_GL2 : FRAG_GL1, { label: 'blit' });\n if (r.error) throw r.error;\n const program = r.program;\n const uTex = gl.getUniformLocation(program, 'u_tex');\n const uSize = gl.getUniformLocation(program, 'u_size');\n return {\n draw(tex, w, h) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, w, h);\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.uniform1i(uTex, 0);\n gl.uniform2f(uSize, w, h);\n quad.bind(program);\n quad.draw();\n },\n dispose() { gl.deleteProgram(program); }\n };\n}\n", "/** 'clamp' (default) | 'repeat' | 'mirror' */\nexport function wrapMode(gl, wrap) {\n if (wrap === 'repeat') return gl.REPEAT;\n if (wrap === 'mirror' || wrap === 'mirrored') return gl.MIRRORED_REPEAT;\n return gl.CLAMP_TO_EDGE;\n}\n\n/** 'linear' (default) | 'nearest' */\nexport function filterMode(gl, filter) {\n return filter === 'nearest' ? gl.NEAREST : gl.LINEAR;\n}\n", "import { wrapMode, filterMode } from './params.js';\nimport { warnOnce } from '../utils/util.js';\n\nfunction chooseFormat(gl, isGL2, ext, opts) {\n let ifmt = isGL2 ? gl.RGBA8 : gl.RGBA;\n const fmt = gl.RGBA;\n let type = gl.UNSIGNED_BYTE;\n\n if (opts.float === 'full' || opts.float === 32) {\n if (isGL2) { ifmt = gl.RGBA32F; type = gl.FLOAT; }\n else if (ext.OES_texture_float) type = gl.FLOAT;\n } else if (opts.float) {\n if (isGL2) { ifmt = gl.RGBA16F; type = gl.HALF_FLOAT; }\n else if (ext.OES_texture_half_float) type = ext.OES_texture_half_float.HALF_FLOAT_OES;\n else if (ext.OES_texture_float) type = gl.FLOAT;\n }\n return { ifmt, fmt, type };\n}\n\nfunction isRenderable(gl, ifmt, fmt, type) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, ifmt, 4, 4, 0, fmt, type, null);\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n const ok = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(fbo);\n gl.deleteTexture(tex);\n return ok;\n}\n\n/** Create a colour (+ optional depth) render target. Falls back to 8-bit if float isn't renderable. */\nexport function createTarget(gl, pool, w, h, opts, isGL2, ext) {\n const wanted = chooseFormat(gl, isGL2, ext, opts);\n let chosen = wanted;\n if (!isRenderable(gl, wanted.ifmt, wanted.fmt, wanted.type)) {\n warnOnce('fmt-fallback', 'Requested float format not renderable on this device; falling back to 8-bit.');\n chosen = { ifmt: isGL2 ? gl.RGBA8 : gl.RGBA, fmt: gl.RGBA, type: gl.UNSIGNED_BYTE };\n }\n // Linear filtering of float textures needs an extension; silently use nearest when unavailable.\n let filterOpt = opts.filter;\n if (chosen.type !== gl.UNSIGNED_BYTE && filterOpt !== 'nearest') {\n const linearOK = isGL2\n ? (chosen.type === gl.HALF_FLOAT || ext.OES_texture_float_linear)\n : (chosen.type === gl.FLOAT ? ext.OES_texture_float_linear : ext.OES_texture_half_float_linear);\n if (!linearOK) filterOpt = 'nearest';\n }\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n const wrap = wrapMode(gl, opts.wrap);\n const filter = filterMode(gl, filterOpt);\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, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n gl.texImage2D(gl.TEXTURE_2D, 0, chosen.ifmt, w, h, 0, chosen.fmt, chosen.type, null);\n\n let depthTex = null;\n if (opts.depth) {\n if (!isGL2 && !ext.WEBGL_depth_texture) {\n warnOnce('depth-tex', 'depth: true needs WebGL2 or WEBGL_depth_texture; ignoring.');\n } else {\n depthTex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, depthTex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\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 gl.texImage2D(gl.TEXTURE_2D, 0, isGL2 ? gl.DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT,\n w, h, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);\n }\n }\n\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n if (depthTex) gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTex, 0);\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) console.warn('[ShaderMate] Framebuffer incomplete:', status);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n depthId: depthTex ? pool.add(depthTex, 'texture2D') : null,\n fboId: pool.add(fbo, 'fbo'),\n width: w,\n height: h,\n fmt: chosen\n };\n}\n\nexport function deleteTarget(pool, t) {\n if (!t) return;\n pool.unref(t.texId);\n if (t.depthId) pool.unref(t.depthId);\n pool.unref(t.fboId);\n}\n\n/** Resolve a pass `size` option against the canvas size. */\nexport function resolvePassSize(size, cw, ch) {\n const c = n => Math.max(1, Math.round(n));\n if (size == null || size === 'screen' || size === 'canvas') return [cw, ch];\n if (size === 'half') return [c(cw / 2), c(ch / 2)];\n if (size === 'quarter') return [c(cw / 4), c(ch / 4)];\n if (typeof size === 'number') return [c(cw * size), c(ch * size)]; // scale factor\n if (Array.isArray(size)) return [c(size[0]), c(size[1])];\n if (typeof size === 'object' && size.width && size.height) return [c(size.width), c(size.height)];\n return [cw, ch];\n}\n", "// Built-in uniforms. They are declared automatically when a shader uses them\n// (and not already declared), and uploaded every frame when present in the program.\n//\n// ShaderToy names short names\n// vec3 iResolution vec2 u_resolution\n// float iTime float u_time\n// float iTimeDelta float u_delta\n// int iFrame int u_frame\n// float iFrameRate float u_fps\n// vec4 iMouse (x,y, click.x,click.y) vec2 u_mouse pixels, bottom-left origin\n// vec2 u_mouseUV 0..1\n// float u_mouseDown 0/1\n// vec4 iDate vec4 u_date\n// vec2 iScroll vec2 u_scroll page scroll in px\n// float u_pixelRatio\n// float u_aspect width / height\n// float iChannelTime[4]\n// vec3 iChannelResolution[4]\n// samplerX iChannel0..3\n\nexport const BUILTIN_UNIFORMS = {\n iResolution: 'vec3', iTime: 'float', iTimeDelta: 'float', iFrame: 'int', iFrameRate: 'float',\n iMouse: 'vec4', iDate: 'vec4', iScroll: 'vec2', iSampleRate: 'float',\n iChannelTime: 'float[4]', iChannelResolution: 'vec3[4]',\n u_resolution: 'vec2', u_time: 'float', u_delta: 'float', u_frame: 'int', u_fps: 'float',\n u_mouse: 'vec2', u_mouseUV: 'vec2', u_mouseDown: 'float', u_date: 'vec4', u_scroll: 'vec2',\n u_pixelRatio: 'float', u_aspect: 'float',\n // FragCoord.xyz-style names (declare `uniform vec4 u_mouse;` / `uniform float u_scroll;` yourself to get those shapes)\n u_time_delta: 'float', u_refresh_rate: 'float', u_drag: 'vec2', u_wheel: 'float',\n};\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/** ShaderToy legacy aliases. */\nexport const BUILTIN_DEFINES = '#define iGlobalTime iTime\\n';\n\n/** `out vec4 fragColor` (FragCoord.xyz / GLSL 3 style) when a shader writes to fragColor from its own main(). */\nexport function declareFragColor(src, isGL2) {\n const code = stripComments(src);\n if (!/\\bfragColor\\b/.test(code) || !/\\bvoid\\s+main\\s*\\(/.test(code)) return '';\n if (/\\bout\\s+vec4\\s+fragColor\\b/.test(code) || /#define\\s+fragColor\\b/.test(code)) return '';\n return isGL2 ? 'out vec4 fragColor;\\n' : '#define fragColor gl_FragColor\\n';\n}\n\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n */\n/** FragCoord.xyz-only built-ins (declared when used in a FragCoord-style shader or when dialect: 'fragcoord'). */\nexport const FRAGCOORD_UNIFORMS = {\n u_camera_pos: 'vec3', u_camera_dir: 'vec3', u_camera_view: 'mat4',\n u_recursion: 'int', u_max_recursion: 'int', u_color_gamut: 'int',\n};\n/** Sampler built-ins bound by name (see core/samplers.js). */\nexport const SAMPLER_BUILTINS = ['u_audio', 'u_keyboard', 'u_webcam', 'u_main'];\n\n/**\n * Heuristic: a FragCoord.xyz sketch writes `fragColor` from its own `main()` and never uses mainImage.\n */\nexport function looksLikeFragCoord(src) {\n const code = stripComments(src);\n return /\\bfragColor\\b/.test(code) && /\\bvoid\\s+main\\s*\\(/.test(code) && !/\\bmainImage\\s*\\(/.test(code);\n}\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n * opts.mouseVec4 / opts.scrollFloat switch u_mouse / u_scroll to the FragCoord.xyz shapes.\n * opts.samplerNames: extra sampler2D names to declare when used (pass samplers like u_pass1, u_blur).\n * opts.passCount: size for `u_passes[N]`.\n */\nexport function declareBuiltins(src, channelTypes = [], opts = {}) {\n const code = stripComments(src);\n let out = '';\n const declared = name => new RegExp('uniform\\\\s+(?:\\\\w+\\\\s+)*' + name + '\\\\b').test(code);\n const used = name => new RegExp('\\\\b' + name + '\\\\b').test(code);\n const types = Object.assign({}, BUILTIN_UNIFORMS, opts.fragcoord ? FRAGCOORD_UNIFORMS : null);\n if (opts.mouseVec4) types.u_mouse = 'vec4';\n if (opts.scrollFloat) types.u_scroll = 'float';\n\n for (const name in types) {\n if (!used(name) || declared(name)) continue;\n const t = types[name];\n const m = /^(\\w+)\\[(\\d+)\\]$/.exec(t);\n out += m ? `uniform ${m[1]} ${name}[${m[2]}];\\n` : `uniform ${t} ${name};\\n`;\n }\n for (let i = 0; i < 4; i++) {\n const name = 'iChannel' + i;\n if (!used(name) || declared(name)) continue;\n out += `uniform ${channelTypes[i] === 'cube' ? 'samplerCube' : 'sampler2D'} ${name};\\n`;\n }\n for (const name of new Set([...SAMPLER_BUILTINS, ...(opts.samplerNames || [])])) {\n if (used(name) && !declared(name)) out += `uniform sampler2D ${name};\\n`;\n }\n if (opts.passCount > 0 && /\\bu_passes\\b/.test(code) && !declared('u_passes')) out += `uniform sampler2D u_passes[${opts.passCount}];\\n`;\n return out;\n}\n", "import { BUILTIN_MACROS_GL1, BUILTIN_MACROS_GL2, MAIN_WRAP_GL1, MAIN_WRAP_GL2 } from './templates.js';\nimport { BUILTIN_DEFINES, declareBuiltins, declareFragColor } from './builtins.js';\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Expand `#include \"path\"` / `#include <path>` recursively.\n * Each file is included once (acts like an include guard); real cycles are reported.\n * `loader(path)` returns (a promise of) the file text.\n */\nexport async function resolveIncludes(src, { loader, throwOnError = false, warn = console.warn } = {}) {\n const done = new Set();\n const stack = [];\n\n async function expand(code) {\n const re = /^[ \\t]*#include\\s+[\"<]([^\">]+)[\">]/gm;\n let out = '';\n let last = 0;\n let m;\n while ((m = re.exec(code))) {\n const path = m[1];\n out += code.slice(last, m.index);\n last = re.lastIndex;\n\n if (stack.includes(path)) {\n warn('[ShaderMate] Circular include:', path);\n out += `\\n// skipped include \"${path}\" (circular)\\n`;\n } else if (done.has(path)) {\n out += `\\n// skipped include \"${path}\" (already included)\\n`;\n } else {\n done.add(path);\n stack.push(path);\n try {\n const raw = await loader(path);\n const expanded = await expand(raw);\n out += `\\n// begin include \"${path}\"\\n${expanded}\\n// end include \"${path}\"\\n`;\n } catch (e) {\n warn(`[ShaderMate] Failed to load include \"${path}\"`, e);\n if (throwOnError) throw e;\n out += `\\n// failed include \"${path}\"\\n`;\n } finally {\n stack.pop();\n }\n }\n }\n return out + code.slice(last);\n }\n return expand(src);\n}\n\n/** Turn defines (strings / {KEY: value} objects) into `#define` lines. */\nexport function defineLines(defines) {\n let out = '';\n for (const d of defines) {\n if (typeof d === 'string') out += `#define ${d}\\n`;\n else if (d && typeof d === 'object') {\n for (const k in d) {\n const v = d[k];\n out += (v === true || v === undefined) ? `#define ${k}\\n` : `#define ${k} ${v}\\n`;\n }\n }\n }\n return out;\n}\n\nexport const DEFAULT_INJECT = { header: true, builtins: true, uniforms: true, defines: true, mainWrap: true };\nexport const NO_INJECT = { header: false, builtins: false, uniforms: false, defines: false, mainWrap: false };\n\n/**\n * Wrap user GLSL into a complete fragment shader.\n * inject.header #version (GL2) + precision\n * inject.builtins texture compatibility macros, `out vec4 outColor` (GL2), iGlobalTime alias\n * inject.uniforms auto-declare built-in uniforms the shader uses (iTime, iResolution, iChannel0 \u2026)\n * inject.defines user #defines\n * inject.mainWrap wrap `mainImage(out vec4, in vec2)` in a main()\n */\nexport function assembleFragment(src, { isGL2, defines = [], enableDerivatives = false, inject = DEFAULT_INJECT, channelTypes = [], builtinOpts = {} } = {}) {\n if (!inject || !Object.values(inject).some(Boolean)) return src;\n\n // A user-supplied #version must stay on line 1: hoist it.\n let versionLine = '';\n let body = src;\n const vm = /^[ \\t]*#version[^\\n]*/m.exec(body);\n if (vm) {\n versionLine = vm[0].trim() + '\\n';\n body = body.slice(0, vm.index) + body.slice(vm.index + vm[0].length);\n }\n\n let head = '';\n if (versionLine) head += versionLine;\n else if (inject.header && isGL2) head += '#version 300 es\\n';\n // #extension must precede any non-preprocessor token (incl. precision statements).\n if (inject.builtins && !isGL2 && enableDerivatives) head += '#extension GL_OES_standard_derivatives : enable\\n';\n if (inject.header) head += 'precision highp float;\\nprecision highp int;\\n';\n if (inject.builtins) {\n head += isGL2 ? BUILTIN_MACROS_GL2 : BUILTIN_MACROS_GL1;\n head += BUILTIN_DEFINES;\n // Exactly one fragment output: the user's own `out vec4 \u2026`, a `fragColor` they write to from\n // main() (FragCoord.xyz / GLSL 3 style), or our `outColor` for the mainImage wrapper.\n const fragDecl = declareFragColor(body, isGL2);\n const userOut = /\\bout\\s+(?:\\w+\\s+)*vec4\\s+\\w+\\s*;/.test(stripComments(body)); // a declaration, not a `mainImage(out vec4 c, \u2026)` parameter\n if (fragDecl) head += fragDecl;\n else if (isGL2 && !userOut) head += 'out vec4 outColor;\\n';\n }\n if (inject.uniforms) head += declareBuiltins(body, channelTypes, builtinOpts);\n if (inject.defines) head += defineLines(defines);\n\n const clean = stripComments(body);\n const needWrap = inject.mainWrap && /\\bmainImage\\s*\\(/.test(clean) && !/\\bvoid\\s+main\\s*\\(/.test(clean);\n\n let out = head + '#line 1\\n' + body;\n if (needWrap) out += isGL2 ? MAIN_WRAP_GL2 : MAIN_WRAP_GL1;\n return out;\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\nimport { isPow2, warnOnce } from '../utils/util.js';\n\n/**\n * Upload an image/video/canvas/ImageBitmap to a new 2D texture.\n * Returns a channel wrapper: { texId, width, height, update(), dispose? }.\n */\nexport function makeTexture2D(gl, pool, source, w, h, params = {}, env = {}, { dynamic = false, flipDefault = false } = {}) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n\n const flip = params.flipY === undefined ? flipDefault : !!params.flipY;\n // WebGL1 only supports clamp + no mipmaps on non-power-of-two textures\n const npotLimited = !env.isGL2 && !(isPow2(w) && isPow2(h));\n if (npotLimited && params.wrap && params.wrap !== 'clamp') {\n warnOnce('npot-wrap', 'Non-power-of-two texture in WebGL1: forcing wrap to clamp.');\n }\n const wrap = npotLimited ? gl.CLAMP_TO_EDGE : wrapMode(gl, params.wrap);\n const mip = !!params.mipmap && !dynamic && !npotLimited;\n const filter = filterMode(gl, params.filter);\n const minFilter = mip\n ? (params.filter === 'nearest' ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_LINEAR)\n : filter;\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n\n const upload = () => {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flip);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!params.premultiplyAlpha);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n };\n upload();\n if (mip) gl.generateMipmap(gl.TEXTURE_2D);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n width: w,\n height: h,\n source,\n update: dynamic\n ? () => {\n if (source.readyState !== undefined && source.readyState < 2) return; // media not ready\n gl.bindTexture(gl.TEXTURE_2D, tex);\n upload();\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n : () => { }\n };\n}\n\nexport function loadImage(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const img = new Image();\n img.crossOrigin = params.crossOrigin === undefined ? 'anonymous' : params.crossOrigin;\n img.onload = () => res(makeTexture2D(gl, pool, img, img.naturalWidth, img.naturalHeight, params, env));\n img.onerror = () => rej(new Error(`Failed to load image \"${url}\"`));\n img.src = url;\n });\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\n\nconst FACE_NAMES = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n\n/** urls: [posx, negx, posy, negy, posz, negz] */\nexport function loadCubeMap(gl, pool, urls, params = {}) {\n return new Promise((res, rej) => {\n if (!Array.isArray(urls) || urls.length !== 6) return rej(new Error('cubemap needs an array of 6 URLs'));\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n const wrap = wrapMode(gl, params.wrap);\n const filter = filterMode(gl, params.filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrap);\n\n const faces = [\n gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n ];\n let loaded = 0, w = 0, h = 0, failed = false;\n\n urls.forEach((u, i) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n if (failed) return;\n if (!w) { w = img.width; h = img.height; }\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.texImage2D(faces[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n if (++loaded === 6) {\n if (params.mipmap) gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n res({ texId: pool.add(tex, 'textureCube'), width: w, height: h, cubemap: true, update() { } });\n }\n };\n img.onerror = () => {\n if (failed) return;\n failed = true;\n gl.deleteTexture(tex);\n rej(new Error(`Failed to load cubemap face ${FACE_NAMES[i]}: \"${u}\"`));\n };\n img.src = u;\n });\n });\n}\n", "import { makeTexture2D } from './image.js';\n\n/** Retry media playback on the first user gesture when autoplay is blocked. */\nexport function playOnGesture(media) {\n const p = media.play && media.play();\n if (p && p.catch) {\n p.catch(() => {\n const go = () => { media.play().catch(() => { }); };\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n });\n }\n}\n\n/** Video file -> live texture. `{ video: 'clip.mp4', muted, loop }` */\nexport function loadVideo(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const video = document.createElement('video');\n Object.assign(video, {\n src: url, crossOrigin: 'anonymous',\n loop: params.loop !== false, muted: params.muted !== false, playsInline: true, autoplay: true\n });\n video.addEventListener('error', () => rej(new Error(`Failed to load video \"${url}\"`)), { once: true });\n video.addEventListener('canplay', () => {\n playOnGesture(video);\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.getTime = () => video.currentTime;\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); video.removeAttribute('src'); video.load(); };\n res(wrapper);\n }, { once: true });\n video.load();\n });\n}\n\n/** Webcam -> live texture. `{ camera: true }` or `{ camera: { facingMode: 'user' } }` */\nexport function loadCamera(gl, pool, params = {}, env = {}) {\n const constraints = typeof params.camera === 'object' ? params.camera : { facingMode: 'user' };\n return navigator.mediaDevices.getUserMedia({ video: constraints, audio: false }).then(stream => new Promise(res => {\n const video = document.createElement('video');\n Object.assign(video, { srcObject: stream, muted: true, playsInline: true, autoplay: true });\n video.addEventListener('loadedmetadata', () => {\n video.play().catch(() => { });\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); stream.getTracks().forEach(t => t.stop()); };\n res(wrapper);\n }, { once: true });\n }));\n}\n", "/**\n * Audio -> spectrum texture (width = fftSize/2, 8-bit, read `.r`).\n * Row 0 = frequency spectrum, row 1 = waveform (ShaderToy layout). Height is 2.\n * { audio: 'song.mp3', fftSize: 1024 } file (loops, starts on first user gesture)\n * { mic: true } microphone input\n * { audio: audioElement } an <audio> element you control yourself\n */\nexport function loadAudio(gl, pool, ch, { mic = false } = {}) {\n const spectro = ch.layout === 'spectrogram'; // FragCoord.xyz u_audio: 512x512, scrolling history\n const fftSize = ch.fftSize || (spectro ? 1024 : 512);\n const AC = window.AudioContext || window.webkitAudioContext;\n\n return new Promise((res, rej) => {\n const ctx = new AC();\n const analyser = ctx.createAnalyser();\n analyser.fftSize = fftSize;\n analyser.smoothingTimeConstant = ch.smoothing ?? 0.8;\n\n const bins = analyser.frequencyBinCount;\n const wave = new Uint8Array(fftSize);\n // ShaderToy layout: bins x 2 (row 0 spectrum, row 1 waveform), LUMINANCE.\n // Spectrogram layout: bins x bins RGB, row 0 = newest (R weighted FFT, G waveform, B raw FFT), older rows above.\n const H = spectro ? bins : 2;\n const chans = spectro ? 3 : 1;\n const data = new Uint8Array(bins * H * chans);\n const rawFFT = spectro ? new Uint8Array(bins) : null;\n let rawAnalyser = null;\n if (spectro) { rawAnalyser = ctx.createAnalyser(); rawAnalyser.fftSize = fftSize; rawAnalyser.smoothingTimeConstant = 0; }\n\n const tex = gl.createTexture();\n const fmt = spectro ? gl.RGB : gl.LUMINANCE;\n const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, fmt, bins, H, 0, fmt, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\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 upload();\n\n let getTime = () => ctx.currentTime;\n let cleanup = () => { };\n\n const finish = () => {\n const resume = () => { if (ctx.state === 'suspended') ctx.resume(); };\n resume();\n window.addEventListener('pointerdown', resume, { once: true });\n window.addEventListener('keydown', resume, { once: true });\n res({\n texId: pool.add(tex, 'texture2D'),\n width: bins, height: H,\n analyser, context: ctx,\n getTime,\n update() {\n if (spectro) {\n const row = bins * 3;\n data.copyWithin(row, 0, data.length - row); // scroll history up one row\n analyser.getByteFrequencyData(rawFFT); // smoothed (\"weighted\") spectrum\n analyser.getByteTimeDomainData(wave);\n for (let i = 0; i < bins; i++) { data[i * 3] = rawFFT[i]; data[i * 3 + 1] = wave[i * 2]; }\n rawAnalyser.getByteFrequencyData(rawFFT); // unsmoothed\n for (let i = 0; i < bins; i++) data[i * 3 + 2] = rawFFT[i];\n } else {\n analyser.getByteFrequencyData(data.subarray(0, bins));\n analyser.getByteTimeDomainData(wave);\n data.set(wave.subarray(0, bins), bins);\n }\n upload();\n },\n dispose() { cleanup(); ctx.close && ctx.close(); }\n });\n };\n\n if (mic) {\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(stream => {\n const src = ctx.createMediaStreamSource(stream);\n src.connect(analyser); // not connected to destination: no feedback loop\n if (rawAnalyser) src.connect(rawAnalyser);\n cleanup = () => stream.getTracks().forEach(t => t.stop());\n finish();\n }).catch(rej);\n return;\n }\n\n const url = ch.audio || ch.audioFFT;\n const audio = url instanceof HTMLMediaElement ? url : new Audio();\n const owned = audio !== url;\n if (owned) Object.assign(audio, { src: url, crossOrigin: 'anonymous', loop: ch.loop !== false, autoplay: true });\n getTime = () => audio.currentTime;\n\n const connect = () => {\n const src = ctx.createMediaElementSource(audio);\n src.connect(analyser);\n if (rawAnalyser) src.connect(rawAnalyser);\n analyser.connect(ctx.destination);\n if (owned) {\n const go = () => { if (ctx.state === 'suspended') ctx.resume(); audio.play().catch(() => { }); };\n go();\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n cleanup = () => { audio.pause(); audio.removeAttribute('src'); audio.load(); };\n }\n finish();\n };\n if (audio.readyState >= 3) connect();\n else {\n audio.addEventListener('canplay', connect, { once: true });\n audio.addEventListener('error', () => rej(new Error(`Failed to load audio \"${url}\"`)), { once: true });\n if (owned) audio.load();\n }\n });\n}\n", "import { makeTexture2D } from './image.js';\n\nconst isCanvas = el => typeof HTMLCanvasElement !== 'undefined' && el instanceof HTMLCanvasElement;\nconst isVideo = el => typeof HTMLVideoElement !== 'undefined' && el instanceof HTMLVideoElement;\n\n/**\n * Use an existing element as a texture: <canvas>, <video>, <img>, ImageBitmap.\n * Canvases and videos are re-uploaded every frame (set `dynamic: false` to upload once).\n * Great for feeding a p5 / three.js / 2D canvas into a shader: channels: [myCanvas]\n */\nexport function loadElement(gl, pool, el, params = {}, env = {}) {\n const w = el.videoWidth || el.naturalWidth || el.width || 1;\n const h = el.videoHeight || el.naturalHeight || el.height || 1;\n const live = isCanvas(el) || isVideo(el);\n const dynamic = params.dynamic === undefined ? live : !!params.dynamic;\n const wrapper = makeTexture2D(gl, pool, el, w, h, params, env, { dynamic, flipDefault: live });\n if (isVideo(el)) wrapper.getTime = () => el.currentTime;\n // keep the reported size in sync with a canvas that is resized later\n if (dynamic) {\n const base = wrapper.update;\n wrapper.update = () => {\n wrapper.width = el.videoWidth || el.naturalWidth || el.width || 1;\n wrapper.height = el.videoHeight || el.naturalHeight || el.height || 1;\n base();\n };\n }\n return Promise.resolve(wrapper);\n}\n\n/** Wrap a WebGLTexture the user created elsewhere (same GL context). */\nexport function wrapTexture(gl, pool, ch) {\n const id = pool.add(ch.texture, ch.cube ? 'textureCube' : 'texture2D');\n pool.ref(id); // never deleted by us: the user owns it\n return Promise.resolve({ texId: id, width: ch.width || 1, height: ch.height || 1, cubemap: !!ch.cube, update() { } });\n}\n", "/**\n * Keyboard state texture, ShaderToy layout (also what FragCoord.xyz's u_keyboard describes):\n * 256 x 3, 8-bit, one column per key code:\n * row 0 key currently held (texelFetch(k, ivec2(code, 0), 0).x)\n * row 1 key pressed this frame\n * row 2 toggle (flips on each press)\n * Key codes follow ShaderToy: JS keyCode (letters are their uppercase ASCII, 32 = space, 37..40 = arrows\u2026).\n * { keyboard: true } or { keyboard: { target: element } }\n */\nexport function loadKeyboard(gl, pool, ch = {}) {\n const W = 256, ROWS = 3;\n const data = new Uint8Array(W * ROWS);\n const held = new Uint8Array(W);\n const pressed = new Uint8Array(W);\n const toggle = new Uint8Array(W);\n const target = (ch.keyboard && typeof ch.keyboard === 'object' && ch.keyboard.target) || window;\n\n const code = e => {\n if (typeof e.keyCode === 'number' && e.keyCode) return e.keyCode & 255;\n const k = e.key || '';\n return k.length === 1 ? k.toUpperCase().charCodeAt(0) & 255 : 0;\n };\n const onDown = e => {\n const c = code(e);\n if (!held[c]) { pressed[c] = 255; toggle[c] = toggle[c] ? 0 : 255; }\n held[c] = 255;\n };\n const onUp = e => { held[code(e)] = 0; };\n const onBlur = () => held.fill(0);\n target.addEventListener('keydown', onDown);\n target.addEventListener('keyup', onUp);\n window.addEventListener('blur', onBlur);\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\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 const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, W, ROWS, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n upload();\n\n return Promise.resolve({\n texId: pool.add(tex, 'texture2D'),\n width: W, height: ROWS,\n keyboard: true,\n update() {\n data.set(held, 0);\n data.set(pressed, W);\n data.set(toggle, W * 2);\n upload();\n pressed.fill(0); // \"pressed\" lasts exactly one frame\n },\n dispose() {\n target.removeEventListener('keydown', onDown);\n target.removeEventListener('keyup', onUp);\n window.removeEventListener('blur', onBlur);\n }\n });\n}\n", "import { loadImage } from './image.js';\nimport { loadCubeMap } from './cubemap.js';\nimport { loadVideo, loadCamera } from './video.js';\nimport { loadAudio } from './audio.js';\nimport { loadElement, wrapTexture } from './element.js';\nimport { loadKeyboard } from './keyboard.js';\n\n/**\n * Load one external (non-pass) channel. Resolves to a wrapper\n * { texId, width, height, update(), cubemap?, getTime?, dispose? } or rejects.\n */\nexport function loadChannel(gl, pool, ch, env) {\n if (ch.texture) return wrapTexture(gl, pool, ch);\n if (ch.element) return loadElement(gl, pool, ch.element, ch, env);\n if (ch.url) return loadImage(gl, pool, ch.url, ch, env);\n if (ch.video) return loadVideo(gl, pool, ch.video, ch, env);\n if (ch.camera) return loadCamera(gl, pool, ch, env);\n if (ch.mic) return loadAudio(gl, pool, ch, { mic: true });\n if (ch.keyboard) return loadKeyboard(gl, pool, ch);\n if (ch.audio || ch.audioFFT) return loadAudio(gl, pool, ch);\n if (ch.cubemap) return loadCubeMap(gl, pool, ch.cubemap, ch);\n return Promise.reject(new Error('Unrecognised channel: ' + JSON.stringify(ch)));\n}\n\n/** Sampler type a channel will need in GLSL. */\nexport function channelSamplerType(ch) {\n if (!ch) return null;\n return ch.cubemap || (ch.texture && ch.cube) ? 'cube' : '2D';\n}\n", "// FragCoord.xyz conventions: multi-pass paste blobs and uniform comment annotations.\n// Everything here is plain text processing; the runtime binds the results.\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Split a pasted multi-pass blob into passes. Recognised headers (each on its own line):\n * // Pass 1 // Pass 2 \u2014 Horizontal blur // Main\n * // Common // Pass: blur \u2014 Buffer type: 2D\n * // ===== Pass: Name ===== (export style)\n * Returns null when no headers are present (plain single shader).\n */\nexport function splitPassBlob(text) {\n const re = /^[ \\t]*\\/\\/[ \\t]*(?:=+[ \\t]*)?(?:Pass[ \\t]*:?[ \\t]*([^\\n=\u2014\u2013-]+?)|(Main)|(Common))[ \\t]*(?:[\u2014\u2013-]+[^\\n]*)?(?:=+)?[ \\t]*$/gim;\n const heads = [];\n let m;\n while ((m = re.exec(text))) heads.push({ index: m.index, end: m.index + m[0].length, raw: m[0], pass: m[1], main: !!m[2], common: !!m[3] });\n if (!heads.length) return null;\n\n const out = { common: text.slice(0, heads[0].index).trim(), passes: [] };\n heads.forEach((h, i) => {\n const body = text.slice(h.end, i + 1 < heads.length ? heads[i + 1].index : text.length).trim();\n if (h.common) { out.common = (out.common ? out.common + '\\n' : '') + body; return; }\n const label = h.main ? 'main' : String(h.pass).trim();\n const bufferType = /buffer\\s*type\\s*:\\s*(\\w+)/i.exec(h.raw);\n const num = /^(\\d+)$/.exec(label);\n out.passes.push({\n name: h.main ? 'main' : (num ? 'pass' + num[1] : label.replace(/[^\\w]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase()),\n label,\n main: h.main,\n src: body,\n bufferType: bufferType ? bufferType[1].toLowerCase() : '2d',\n });\n });\n\n // Loose #define lines before the first header belong to Common (FragCoord hoists them).\n if (out.common && !/[{};]/.test(stripComments(out.common))) {\n // only defines/comments: fine as common\n }\n return out;\n}\n\n/** `[linear repeat mipmap]` / `[nearest clamp]` bracket settings -> channel params */\nexport function parseBracketSettings(s) {\n const p = {};\n const m = /\\[([^\\]]*)\\]/.exec(s || '');\n if (!m) return p;\n for (const word of m[1].toLowerCase().split(/[\\s,]+/)) {\n if (word === 'nearest' || word === 'linear') p.filter = word;\n else if (word === 'clamp' || word === 'repeat' || word === 'mirror') p.wrap = word;\n else if (word === 'mipmap') p.mipmap = true;\n else if (word === 'flipy' || word === 'flip') p.flipY = true;\n }\n return p;\n}\n\n/**\n * Parse uniform annotations FragCoord users write in comments and strip the (non-GLSL) initializers.\n *\n * uniform float u_speed; //1.0, [0.0, 5.0] -> value 1.0, min 0, max 5\n * uniform float u_x = 0.5; //[0.0, 5.0] -> value 0.5 (initializer removed from source)\n * uniform vec3 u_color; //0.2, 0.55, 1.0, [0, 1] -> value [0.2,0.55,1]\n * uniform sampler2D u_tex; //https://x/y.png [linear repeat]\n * uniform sampler2D u_clip; //https://x/loop.mp4 -> video + u_clip_time\n * uniform sampler2D u_a; // ref:pass1 [nearest clamp] | ref:pass:blur | ref:main | ref:sampler u_tex\n * uniform sampler2D u_audio; // mic | https://x.mp3 | [VIDEO] | [CAM]\n *\n * Returns { source, uniforms: { name: spec }, samplers: { name: channelSpec } }.\n */\nexport function parseUniformComments(src) {\n const uniforms = {};\n const samplers = {};\n const lines = src.split('\\n');\n const re = /^\\s*uniform\\s+(?:(?:lowp|mediump|highp)\\s+)?(\\w+)\\s+(\\w+)(?:\\s*\\[\\s*\\d+\\s*\\])?\\s*(?:=\\s*([^;]+))?;\\s*(?:\\/\\/(.*))?$/;\n\n const outLines = lines.map(line => {\n const m = re.exec(line);\n if (!m) return line;\n const [, type, name, init, comment = ''] = m;\n const c = comment.trim();\n const isSampler = /^sampler/.test(type);\n\n if (isSampler) {\n const spec = parseSamplerComment(name, c, type);\n if (spec) samplers[name] = spec;\n } else {\n const spec = {};\n const nums = s => (s.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g) || []).map(Number);\n const range = /\\[([^\\]]*)\\]/.exec(c);\n const defaults = nums(c.replace(/\\[[^\\]]*\\]/, ''));\n const comps = /vec(\\d)/.test(type) ? +type.match(/vec(\\d)/)[1] : 1;\n const isBool = /^bool/.test(type);\n let value;\n if (init) {\n const v = nums(init);\n value = comps === 1 ? (isBool ? /true/.test(init) : (v[0] ?? 0)) : v.slice(0, comps);\n } else if (defaults.length) {\n value = comps === 1 ? defaults[0] : (defaults.length >= comps ? defaults.slice(0, comps) : new Array(comps).fill(defaults[0]));\n }\n if (range) {\n const r = nums(range[1]);\n if (r.length >= 2) { spec.min = r[0]; spec.max = r[1]; if (r.length >= 3) spec.step = r[2]; }\n }\n if (value !== undefined || range) {\n spec.value = value !== undefined ? value : (comps === 1 ? (spec.min ?? 0) : new Array(comps).fill(spec.min ?? 0));\n uniforms[name] = spec;\n }\n }\n // GLSL ES has no uniform initializers: `uniform float x = 0.5;` -> `uniform float x;`\n return init ? line.replace(/\\s*=\\s*[^;]+;/, ';') : line;\n });\n\n return { source: outLines.join('\\n'), uniforms, samplers };\n}\n\nfunction parseSamplerComment(name, c, type) {\n const params = parseBracketSettings(c);\n const text = c.replace(/\\[[^\\]]*\\]/g, '').trim();\n\n const ref = /^ref:\\s*(.+)$/i.exec(text);\n if (ref) {\n const r = ref[1].trim();\n let m;\n if ((m = /^pass\\s*(\\d+)(?::out(\\d+))?$/i.exec(r))) return { pass: 'pass' + m[1], ...params };\n if ((m = /^pass:\\s*(\\S+)/i.exec(r))) return { pass: m[1], ...params };\n if (/^main$/i.test(r)) return { pass: 'main', ...params };\n if ((m = /^sampler\\s+(\\w+)/i.exec(r))) return { sameAs: m[1], ...params };\n return null;\n }\n if (name === 'u_audio' || /audio/i.test(name) && /^(mic|\\[CAM\\]|\\[VIDEO\\])?$/i.test(text)) {\n if (/^https?:|^data:/i.test(text)) return { audio: text, layout: 'spectrogram' };\n return { mic: true, layout: 'spectrogram' };\n }\n if (name === 'u_webcam') return { camera: true, ...params };\n if (name === 'u_keyboard') return { keyboard: true };\n if (/^(https?:|data:)/i.test(text)) {\n const url = text.split(/\\s+/)[0];\n if (/\\.(mp4|webm|mov|ogv|m4v)(\\?|$)/i.test(url)) return { video: url, ...params };\n if (/\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|$)/i.test(url)) return { audio: url, layout: 'spectrogram' };\n return type === 'samplerCube' ? null : { url, ...params };\n }\n return null;\n}\n\n/** Does the source use `u_mouse` as a vec4 (any z/w access)? */\nexport function usesMouseVec4(src) {\n return /\\bu_mouse\\s*\\.\\s*[xyzw]*[zw]/.test(stripComments(src));\n}\n\n/** Does the source reference any of the given identifiers? */\nexport function usesAny(src, names) {\n const code = stripComments(src);\n return names.filter(n => new RegExp('\\\\b' + n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b').test(code));\n}\n", "// Named sampler binding: any `uniform sampler2D u_xxx` that isn't an iChannelN gets a source\n// by name \u2014 a pass (`u_blur`, `u_pass1`, `u_main`), a comment-annotated URL/ref (FragCoord.xyz),\n// or a live input (`u_audio`, `u_keyboard`, `u_webcam`). Explicit `samplers: { name: source }`\n// on the pass or instance wins over everything.\n\nexport const GL_SAMPLER_2D = 35678;\nexport const GL_SAMPLER_CUBE = 35680;\n\n/** Aux (non-screen) passes in order: what FragCoord calls Pass 1, Pass 2\u2026 */\nexport const auxPasses = passObjs => passObjs.filter(p => !p.cfg.screen);\n\n/**\n * Decide where each named sampler of a compiled pass comes from.\n * Returns [{ name, info, spec }] where spec is a channel spec ({ pass } | loader spec) or { array: [passObj\u2026] }.\n */\nexport function resolveSamplerSpecs(po, passObjs, instanceSamplers = {}) {\n const out = [];\n const aux = auxPasses(passObjs);\n const screen = passObjs.find(p => p.cfg.screen);\n const byName = new Map(passObjs.map(p => [p.name, p]));\n const annotated = Object.assign({}, po.cfg.annotatedSamplers, po.cfg.samplers);\n\n for (const name in po.uniformInfo) {\n const info = po.uniformInfo[name];\n if (info.type !== GL_SAMPLER_2D && info.type !== GL_SAMPLER_CUBE) continue;\n if (/^iChannel\\d$/.test(name)) continue;\n\n let spec = instanceSamplers[name] || annotated[name] || null;\n let m;\n if (spec && spec.sameAs) spec = annotated[spec.sameAs] || instanceSamplers[spec.sameAs] || null;\n\n if (!spec) {\n if (name === 'u_passes' && info.size > 1) spec = { array: aux.slice(0, info.size) };\n else if (name === 'u_main') spec = screen ? { pass: screen.name } : null;\n else if ((m = /^u_pass(\\d+)$/.exec(name)) && aux[+m[1] - 1]) spec = { pass: aux[+m[1] - 1].name };\n else if (name.startsWith('u_') && byName.has(name.slice(2))) spec = { pass: name.slice(2) };\n else if (name === 'u_audio') spec = { mic: true, layout: 'spectrogram' };\n else if (name === 'u_keyboard') spec = { keyboard: true };\n else if (name === 'u_webcam') spec = { camera: true };\n }\n if (spec && spec.pass != null && !byName.has(spec.pass)) {\n // \"pass1\" style refs resolve by aux index too\n const mm = /^pass(\\d+)$/.exec(spec.pass);\n if (mm && aux[+mm[1] - 1]) spec = { ...spec, pass: aux[+mm[1] - 1].name };\n else if (spec.pass === 'main' && screen) spec = { ...spec, pass: screen.name };\n }\n if (spec) out.push({ name, info, spec });\n }\n return out;\n}\n\n/** Does any pass sample the screen pass (so it needs a readable backbuffer)? */\nexport function needsMainBackbuffer(passObjs) {\n const screen = passObjs.find(p => p.cfg.screen);\n if (!screen) return false;\n return passObjs.some(po => (po.samplers || []).some(s => s.spec.pass === screen.name) ||\n po.cfg.channels.some(c => c && c.pass === screen.name));\n}\n", "/**\n * Fly camera for `u_camera_pos` / `u_camera_dir` / `u_camera_view` (FragCoord.xyz convention).\n * WASD / arrows move, Q/E (or Space/Shift) down/up, mouse drag looks around, wheel dollies.\n * u_camera_view is the world-to-camera matrix, column-major (OpenGL convention), so\n * mat3(u_camera_view) * dir goes world->camera and transpose goes back.\n */\nexport function createCamera(canvas, { target = window, speed = 1.5, sensitivity = 0.004 } = {}) {\n const pos = [0, 0, 0];\n let yaw = -Math.PI / 2, pitch = 0; // looking down -Z\n const keys = new Set();\n let dragging = false, lastX = 0, lastY = 0;\n const dir = [0, 0, -1];\n const view = new Float32Array(16);\n\n const onKey = (e, down) => {\n const k = e.key.length === 1 ? e.key.toLowerCase() : e.key;\n if (down) keys.add(k); else keys.delete(k);\n };\n const kd = e => onKey(e, true), ku = e => onKey(e, false);\n const pd = e => { if (e.button === 0) { dragging = true; lastX = e.clientX; lastY = e.clientY; } };\n const pm = e => {\n if (!dragging) return;\n yaw += (e.clientX - lastX) * sensitivity;\n pitch -= (e.clientY - lastY) * sensitivity;\n pitch = Math.max(-1.55, Math.min(1.55, pitch));\n lastX = e.clientX; lastY = e.clientY;\n };\n const pu = () => { dragging = false; };\n const wh = e => { const f = dir; const d = -e.deltaY * 0.002 * speed; pos[0] += f[0] * d; pos[1] += f[1] * d; pos[2] += f[2] * d; };\n const blur = () => keys.clear();\n\n target.addEventListener('keydown', kd); target.addEventListener('keyup', ku);\n canvas.addEventListener('pointerdown', pd); window.addEventListener('pointermove', pm); window.addEventListener('pointerup', pu);\n canvas.addEventListener('wheel', wh, { passive: true }); window.addEventListener('blur', blur);\n\n function lookAt() {\n const f = dir;\n // right = normalize(cross(f, up)), up' = cross(right, f)\n const upW = [0, 1, 0];\n let r = [f[1] * upW[2] - f[2] * upW[1], f[2] * upW[0] - f[0] * upW[2], f[0] * upW[1] - f[1] * upW[0]];\n const rl = Math.hypot(r[0], r[1], r[2]) || 1; r = r.map(v => v / rl);\n const u = [r[1] * f[2] - r[2] * f[1], r[2] * f[0] - r[0] * f[2], r[0] * f[1] - r[1] * f[0]];\n // column-major world->camera\n view.set([\n r[0], u[0], -f[0], 0,\n r[1], u[1], -f[1], 0,\n r[2], u[2], -f[2], 0,\n -(r[0] * pos[0] + r[1] * pos[1] + r[2] * pos[2]),\n -(u[0] * pos[0] + u[1] * pos[1] + u[2] * pos[2]),\n (f[0] * pos[0] + f[1] * pos[1] + f[2] * pos[2]),\n 1,\n ]);\n return { right: r, up: u };\n }\n\n return {\n pos, dir, view,\n /** Advance by dt seconds. */\n update(dt) {\n dir[0] = Math.cos(pitch) * Math.cos(yaw); dir[1] = Math.sin(pitch); dir[2] = Math.cos(pitch) * Math.sin(yaw);\n const { right } = lookAt();\n const v = speed * dt * (keys.has('Shift') ? 3 : 1);\n const mv = (vec, s) => { pos[0] += vec[0] * s; pos[1] += vec[1] * s; pos[2] += vec[2] * s; };\n if (keys.has('w') || keys.has('ArrowUp')) mv(dir, v);\n if (keys.has('s') || keys.has('ArrowDown')) mv(dir, -v);\n if (keys.has('d') || keys.has('ArrowRight')) mv(right, v);\n if (keys.has('a') || keys.has('ArrowLeft')) mv(right, -v);\n if (keys.has('e') || keys.has(' ')) pos[1] += v;\n if (keys.has('q') || keys.has('c')) pos[1] -= v;\n lookAt();\n },\n dispose() {\n target.removeEventListener('keydown', kd); target.removeEventListener('keyup', ku);\n canvas.removeEventListener('pointerdown', pd); window.removeEventListener('pointermove', pm); window.removeEventListener('pointerup', pu);\n canvas.removeEventListener('wheel', wh); window.removeEventListener('blur', blur);\n }\n };\n}\n", "// Uniform type resolution.\n//\n// A uniform `type` may be written as the GLSL type ('float', 'vec3', 'mat4', 'int[]', ...)\n// or as the classic WebGL shorthand ('1f', '3f', 'Matrix4fv', ...). Case-insensitive.\n// If no type is given at all, it's inferred from the compiled shader (see describeGLType).\n//\n// Descriptor: { kind: 'f' | 'i' | 'u' | 'm', n } (n = components, or matrix dimension)\n\nconst ALIASES = Object.create(null);\nconst add = (desc, ...names) => names.forEach(n => { ALIASES[n.toLowerCase()] = desc; });\n\n// float family\nadd({ kind: 'f', n: 1 }, 'float', 'number', 'f', '1f', '1fv', 'float[]', 'uniform1f', 'uniform1fv');\nadd({ kind: 'f', n: 2 }, 'vec2', '2f', '2fv', 'vec2[]', 'uniform2f', 'uniform2fv');\nadd({ kind: 'f', n: 3 }, 'vec3', '3f', '3fv', 'vec3[]', 'uniform3f', 'uniform3fv');\nadd({ kind: 'f', n: 4 }, 'vec4', '4f', '4fv', 'vec4[]', 'uniform4f', 'uniform4fv');\n\n// int / bool family (bool uniforms are uploaded as ints)\nadd({ kind: 'i', n: 1 }, 'int', 'bool', 'boolean', 'i', '1i', '1iv', 'int[]', 'bool[]', 'uniform1i', 'uniform1iv');\nadd({ kind: 'i', n: 2 }, 'ivec2', 'bvec2', '2i', '2iv', 'ivec2[]', 'bvec2[]', 'uniform2i', 'uniform2iv');\nadd({ kind: 'i', n: 3 }, 'ivec3', 'bvec3', '3i', '3iv', 'ivec3[]', 'bvec3[]', 'uniform3i', 'uniform3iv');\nadd({ kind: 'i', n: 4 }, 'ivec4', 'bvec4', '4i', '4iv', 'ivec4[]', 'bvec4[]', 'uniform4i', 'uniform4iv');\n\n// unsigned int (WebGL2)\nadd({ kind: 'u', n: 1 }, 'uint', '1ui', '1uiv', 'uint[]');\nadd({ kind: 'u', n: 2 }, 'uvec2', '2ui', '2uiv', 'uvec2[]');\nadd({ kind: 'u', n: 3 }, 'uvec3', '3ui', '3uiv', 'uvec3[]');\nadd({ kind: 'u', n: 4 }, 'uvec4', '4ui', '4uiv', 'uvec4[]');\n\n// matrices\nadd({ kind: 'm', n: 2 }, 'mat2', 'matrix2fv', 'mat2fv', 'uniformmatrix2fv');\nadd({ kind: 'm', n: 3 }, 'mat3', 'matrix3fv', 'mat3fv', 'uniformmatrix3fv');\nadd({ kind: 'm', n: 4 }, 'mat4', 'matrix4fv', 'mat4fv', 'uniformmatrix4fv');\n\n/** 'vec3' | '3f' | 'Matrix4fv' | ... -> descriptor, or null if unknown. */\nexport function resolveUniformType(type) {\n if (typeof type !== 'string') return null;\n return ALIASES[type.trim().toLowerCase()] || null;\n}\n\n// GL enum -> descriptor (numeric constants are identical across contexts)\nconst GL_TYPES = {\n 5126: { kind: 'f', n: 1 }, // FLOAT\n 35664: { kind: 'f', n: 2 }, // FLOAT_VEC2\n 35665: { kind: 'f', n: 3 },\n 35666: { kind: 'f', n: 4 },\n 5124: { kind: 'i', n: 1 }, // INT\n 35667: { kind: 'i', n: 2 }, // INT_VEC2\n 35668: { kind: 'i', n: 3 },\n 35669: { kind: 'i', n: 4 },\n 35670: { kind: 'i', n: 1 }, // BOOL\n 35671: { kind: 'i', n: 2 }, // BOOL_VEC2\n 35672: { kind: 'i', n: 3 },\n 35673: { kind: 'i', n: 4 },\n 5125: { kind: 'u', n: 1 }, // UNSIGNED_INT\n 36294: { kind: 'u', n: 2 }, // UNSIGNED_INT_VEC2\n 36295: { kind: 'u', n: 3 },\n 36296: { kind: 'u', n: 4 },\n 35674: { kind: 'm', n: 2 }, // FLOAT_MAT2\n 35675: { kind: 'm', n: 3 },\n 35676: { kind: 'm', n: 4 },\n};\n\n/** Active-uniform GL type -> descriptor. Samplers etc. return undefined (managed via channels). */\nexport function describeGLType(glType) {\n return GL_TYPES[glType];\n}\n\nexport const GL_FLOAT = 5126;\nexport const GL_FLOAT_VEC2 = 35664;\nexport const GL_FLOAT_VEC4 = 35666;\n", "import { describeGLType, resolveUniformType } from './types.js';\nimport { isArrayLike, ShaderMateError, warnOnce } from '../utils/util.js';\n\n/**\n * A uniform entry is either a plain value (`0.5`, `[1,0,0]`, `true`)\n * or a spec object `{ type?, value, transpose?, ...ui hints }`.\n */\nexport function isUniformSpec(v) {\n return v != null && typeof v === 'object' && !isArrayLike(v) && 'value' in v;\n}\n\nconst num = v => (typeof v === 'boolean' ? (v ? 1 : 0) : v);\n\nfunction toList(value, n) {\n if (typeof value === 'number' || typeof value === 'boolean') return new Array(n).fill(num(value)); // broadcast\n if (ArrayBuffer.isView(value)) return value;\n if (Array.isArray(value) && value.some(x => typeof x === 'boolean')) return value.map(num);\n return value;\n}\n\n/** Upload `value` to `loc` according to a descriptor from types.js. */\nexport function uploadUniform(gl, loc, d, value, transpose) {\n const n = d.n;\n switch (d.kind) {\n case 'f':\n if (n === 1 && typeof value === 'number') return gl.uniform1f(loc, value);\n return gl['uniform' + n + 'fv'](loc, toList(value, n));\n case 'i':\n if (n === 1 && (typeof value === 'number' || typeof value === 'boolean')) return gl.uniform1i(loc, +value);\n return gl['uniform' + n + 'iv'](loc, toList(value, n));\n case 'u':\n if (n === 1 && typeof value === 'number') return gl.uniform1ui(loc, value);\n return gl['uniform' + n + 'uiv'](loc, toList(value, n));\n case 'm':\n return gl['uniformMatrix' + n + 'fv'](loc, !!transpose, value);\n }\n}\n\n/**\n * Apply a name -> entry map using the compiled program's uniform info.\n * Types are optional: when omitted they come from the shader itself.\n */\nexport function applyUniformMap(gl, info, map, { strict = false, warnMissing = false, label = '' } = {}) {\n if (!map) return;\n for (const name in map) {\n const raw = map[name];\n const spec = isUniformSpec(raw) ? raw : null;\n const value = spec ? spec.value : raw;\n if (value === undefined || value === null) continue;\n\n const inf = info[name];\n if (!inf || !inf.loc) {\n if (strict) throw new ShaderMateError('Unknown uniform: ' + name);\n if (warnMissing) warnOnce('missing-uniform:' + label + ':' + name,\n `Uniform \"${name}\" not found in ${label ? `pass \"${label}\"` : 'shader'} (misspelled, undeclared, or optimized out).`);\n continue;\n }\n\n let d;\n if (spec && spec.type != null) {\n d = resolveUniformType(spec.type);\n if (!d) {\n if (strict) throw new ShaderMateError('Unknown uniform type: ' + spec.type + ' for ' + name);\n warnOnce('bad-type:' + name, 'Unknown uniform type', spec.type, name);\n continue;\n }\n } else {\n d = describeGLType(inf.type);\n if (!d) continue; // sampler or unsupported type\n }\n uploadUniform(gl, inf.loc, d, value, spec && spec.transpose);\n }\n}\n", "/**\n * Pointer state (mouse / touch / pen). Coordinates are canvas pixels with the origin at the\n * bottom-left (ShaderToy convention), computed from the canvas's *painted* box so they stay\n * correct with CSS scaling, devicePixelRatio and object-fit letterboxing.\n *\n * options.target: 'window' (default \u2014 hero text overlaying the canvas doesn't block input)\n * | 'canvas' | any Element\n * options.smooth: 0 (off) \u2026 1 exponential smoothing applied per frame\n */\nexport function createPointer(canvas, getFit, options = {}) {\n const target = options.target === 'canvas' ? canvas\n : (options.target && typeof options.target === 'object') ? options.target\n : window;\n const smooth = +options.smooth || 0;\n\n const raw = { x: 0, y: 0, down: false, over: false, dragX: 0, dragY: 0, wheel: 0 };\n const state = { x: 0, y: 0, clickX: 0, clickY: 0, down: false, over: false, uvX: 0, uvY: 0, dragX: 0, dragY: 0, wheel: 0, clicked: false };\n let clickPending = false;\n let lastX = 0, lastY = 0;\n let moved = false;\n\n /** Painted rectangle of the bitmap inside the element box (accounts for object-fit). */\n function paintedRect() {\n const r = canvas.getBoundingClientRect();\n const fit = getFit ? getFit() : 'fill';\n if (!r.width || !r.height || (fit !== 'contain' && fit !== 'cover')) return r;\n const ba = canvas.width / canvas.height, ra = r.width / r.height;\n let w, h;\n if ((ra > ba) === (fit === 'contain')) { h = r.height; w = h * ba; } else { w = r.width; h = w / ba; }\n return { left: r.left + (r.width - w) / 2, top: r.top + (r.height - h) / 2, width: w, height: h, bottom: 0, right: 0 };\n }\n\n /** client (DOM) coords -> canvas pixel coords, bottom-left origin */\n function toShader(clientX, clientY) {\n const r = paintedRect();\n if (!r.width || !r.height) return [0, 0];\n return [\n (clientX - r.left) * (canvas.width / r.width),\n (r.top + r.height - clientY) * (canvas.height / r.height)\n ];\n }\n const toUV = (cx, cy) => { const [x, y] = toShader(cx, cy); return [x / canvas.width, y / canvas.height]; };\n\n const onMove = e => {\n const [x, y] = toShader(e.clientX, e.clientY);\n if (raw.down) { raw.dragX += x - lastX; raw.dragY += y - lastY; } // cumulative click-and-drag offset\n lastX = x; lastY = y;\n raw.x = x; raw.y = y;\n raw.over = x >= 0 && y >= 0 && x <= canvas.width && y <= canvas.height;\n if (!moved) { moved = true; state.x = x; state.y = y; }\n };\n const onDown = e => {\n if (e.button !== undefined && e.button !== 0) return;\n onMove(e);\n if (target === window && !raw.over) return; // clicks outside the canvas don't count as a press\n raw.down = true;\n state.down = true;\n clickPending = true;\n lastX = raw.x; lastY = raw.y;\n state.clickX = raw.x; state.clickY = raw.y;\n if (!smooth) { state.x = raw.x; state.y = raw.y; }\n };\n const onUp = () => { raw.down = false; state.down = false; };\n const onLeave = () => { raw.over = false; };\n const onWheel = e => { raw.wheel += -e.deltaY * 0.002; }; // mouse-wheel accumulator (exp(wheel) makes a nice zoom)\n\n if (options.touch !== false && target === canvas) canvas.style.touchAction = 'none';\n target.addEventListener('pointermove', onMove, { passive: true });\n target.addEventListener('pointerdown', onDown, { passive: true });\n window.addEventListener('pointerup', onUp, { passive: true });\n window.addEventListener('pointercancel', onUp, { passive: true });\n target.addEventListener('pointerleave', onLeave, { passive: true });\n target.addEventListener('wheel', onWheel, { passive: true });\n\n return {\n state,\n toShader,\n toUV,\n /** Call once per frame. */\n update() {\n if (smooth > 0 && smooth < 1) {\n const k = 1 - Math.pow(1 - smooth, 1); // per-frame factor\n state.x += (raw.x - state.x) * k;\n state.y += (raw.y - state.y) * k;\n } else { state.x = raw.x; state.y = raw.y; }\n state.over = raw.over;\n state.clicked = clickPending; clickPending = false; // true for exactly one frame after a press\n state.dragX = raw.dragX; state.dragY = raw.dragY; state.wheel = raw.wheel;\n state.uvX = canvas.width ? state.x / canvas.width : 0;\n state.uvY = canvas.height ? state.y / canvas.height : 0;\n },\n dispose() {\n target.removeEventListener('pointermove', onMove);\n target.removeEventListener('pointerdown', onDown);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n target.removeEventListener('pointerleave', onLeave);\n target.removeEventListener('wheel', onWheel);\n }\n };\n}\n", "// Canvas sizing.\n//\n// size: 'canvas' (default when you pass a canvas) bitmap follows the canvas's CSS box \u2014 style it\n// however you like (width:100%; height:60vh \u2026) and ShaderMate keeps up.\n// size: 'window' (default when no canvas is given) fixed full-window canvas.\n// size: [w, h] fixed internal resolution; CSS box is yours, `fit` decides how it's shown.\n//\n// pixelRatio: 'auto' (default, capped by maxPixelRatio = 2) | number\n// scale: 1 extra render-scale multiplier (0.5 = render at half res, cheap on big heroes)\n// aspect: 16/9 | '16:9' | [16, 9] lock the bitmap aspect; shown with object-fit\n// fit: 'contain' | 'cover' | 'fill' how a fixed/aspect-locked bitmap fills its CSS box\n\nfunction parseAspect(a) {\n if (!a) return 0;\n if (typeof a === 'number') return a;\n if (Array.isArray(a)) return a[0] / a[1];\n if (typeof a === 'string') {\n const m = a.split(/[:/x]/).map(Number);\n return m.length === 2 && m[1] ? m[0] / m[1] : Number(a) || 0;\n }\n return 0;\n}\n\nexport function parseSizing(options = {}, hasCanvas = true) {\n const s = options.size ?? options.sizing;\n const cfg = {\n mode: hasCanvas ? 'canvas' : 'window',\n width: 0, height: 0,\n aspect: parseAspect(options.aspect),\n fit: options.fit || 'contain',\n pixelRatio: options.pixelRatio ?? options.dpr ?? 'auto',\n maxPixelRatio: options.maxPixelRatio ?? 2,\n scale: options.scale ?? options.renderScale ?? 1,\n };\n if (Array.isArray(s)) { cfg.mode = 'fixed'; cfg.width = s[0]; cfg.height = s[1]; }\n else if (typeof s === 'string') cfg.mode = s === 'screen' || s === 'fullscreen' ? 'window' : s === 'element' ? 'canvas' : s;\n else if (s && typeof s === 'object') { cfg.mode = 'fixed'; cfg.width = s.width; cfg.height = s.height; if (s.fit) cfg.fit = s.fit; }\n if (cfg.mode === 'fixed') cfg.aspect = cfg.width / cfg.height;\n return cfg;\n}\n\nexport function createSizer(canvas, options = {}, hasCanvas = true) {\n const cfg = parseSizing(options, hasCanvas);\n const ratio = () => (cfg.pixelRatio === 'auto'\n ? Math.min(window.devicePixelRatio || 1, cfg.maxPixelRatio)\n : (Number(cfg.pixelRatio) || 1));\n let styled = false;\n\n function cssBox() {\n if (cfg.mode === 'window') return { w: window.innerWidth, h: window.innerHeight };\n return { w: canvas.clientWidth || window.innerWidth, h: canvas.clientHeight || window.innerHeight };\n }\n\n function measure() {\n if (cfg.mode === 'fixed') return { w: cfg.width, h: cfg.height };\n const box = cssBox();\n const k = ratio() * cfg.scale;\n let w = box.w, h = box.h;\n if (cfg.aspect) {\n if (w / h > cfg.aspect) w = h * cfg.aspect; else h = w / cfg.aspect;\n }\n return { w: w * k, h: h * k };\n }\n\n function applyStyle() {\n if (styled) return;\n styled = true;\n if (cfg.mode === 'window') {\n canvas.style.cssText += ';display:block;position:fixed;left:0;top:0;width:100%;height:100%;';\n }\n if (cfg.mode === 'fixed' || cfg.aspect) canvas.style.objectFit = cfg.fit;\n }\n\n return {\n cfg,\n /** 'contain' | 'cover' | 'fill' as currently applied (for pointer mapping). */\n fit: () => ((cfg.mode === 'fixed' || cfg.aspect) ? cfg.fit : 'fill'),\n setFixed(w, h) { cfg.mode = 'fixed'; cfg.width = w; cfg.height = h; cfg.aspect = w / h; styled = false; },\n /** Recompute; returns true when the bitmap size changed. */\n update() {\n applyStyle();\n const m = measure();\n const w = Math.max(1, Math.round(m.w)), h = Math.max(1, Math.round(m.h));\n if (canvas.width === w && canvas.height === h) return false;\n canvas.width = w;\n canvas.height = h;\n return true;\n },\n /** Call `fn` on window resize / canvas box changes. Returns a disposer. */\n observe(fn) {\n let pending = false;\n const schedule = () => {\n if (pending) return;\n pending = true;\n requestAnimationFrame(() => { pending = false; fn(); });\n };\n window.addEventListener('resize', schedule);\n let ro = null;\n if (cfg.mode === 'canvas' && typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(schedule);\n ro.observe(canvas);\n }\n return () => { window.removeEventListener('resize', schedule); if (ro) ro.disconnect(); };\n }\n };\n}\n", "/**\n * Tracks whether rendering is worthwhile: tab visible AND canvas in (or near) the viewport.\n * Saves battery on long pages with a hero at the top.\n */\nexport function createVisibility(canvas, { enabled = true, margin = '100px', onChange } = {}) {\n let tabVisible = typeof document === 'undefined' ? true : !document.hidden;\n let inView = true;\n const notify = () => onChange && onChange(tabVisible && inView);\n\n const onVis = () => { tabVisible = !document.hidden; notify(); };\n let io = null;\n if (enabled) {\n document.addEventListener('visibilitychange', onVis);\n if (typeof IntersectionObserver !== 'undefined') {\n io = new IntersectionObserver(entries => {\n for (const e of entries) inView = e.isIntersecting;\n notify();\n }, { rootMargin: margin });\n io.observe(canvas);\n }\n }\n return {\n get visible() { return tabVisible && inView; },\n dispose() {\n if (enabled) document.removeEventListener('visibilitychange', onVis);\n if (io) io.disconnect();\n }\n };\n}\n", "// Shared look for ShaderMate's own UI (stats overlay, error overlay, GUI addon).\n// Dark editor palette: VS Code \"Dark Modern\" tones. Override per instance with options.theme.\nexport const DEFAULT_THEME = {\n font: '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n mono: '\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n bg: '#1f1f1f',\n bgAlt: '#181818',\n raised: '#2a2d2e',\n hover: '#37373d',\n border: '#3c3c3c',\n text: '#cccccc',\n textStrong: '#ececec',\n label: '#9d9d9d',\n accent: '#4daafc',\n number: '#4daafc',\n string: '#d1977f',\n red: '#e46962',\n redSoft: '#4e3534',\n redText: '#f9dedc',\n radius: '8px',\n shadow: '0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)',\n};\n\nexport function resolveTheme(t) {\n return Object.assign({}, DEFAULT_THEME, t && typeof t === 'object' ? t : null);\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Stats overlay (FPS, frame time, CPU time, frame count, resolution).\n * Nothing is installed unless you ask: stats: true (visible) | 'key' (hidden until the key is pressed).\n */\nexport function createStats({ visible = false, key = 'F1', position = 'top-left', theme } = {}) {\n const T = resolveTheme(theme);\n const el = document.createElement('div');\n const [v, h] = position.split('-');\n el.style.cssText =\n `position:fixed;${v === 'bottom' ? 'bottom' : 'top'}:12px;${h === 'right' ? 'right' : 'left'}:12px;` +\n `z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${T.border};border-radius:${T.radius};` +\n `background:${T.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${T.shadow};` +\n `color:${T.text};font:12px/1.5 ${T.mono};pointer-events:none;display:none`;\n document.body.appendChild(el);\n\n const row = (label, value) =>\n `<div style=\"display:flex;justify-content:space-between;gap:14px\"><span style=\"color:${T.label}\">${label}</span><span style=\"color:${T.textStrong}\">${value}</span></div>`;\n\n let shown = false;\n let accDt = 0, accCpu = 0, n = 0, lastDom = 0;\n\n function show(on = true) {\n shown = !!on;\n el.style.display = shown ? 'block' : 'none';\n accDt = accCpu = n = 0;\n }\n const toggle = () => show(!shown);\n const onKey = e => { if (e.key === key) { e.preventDefault(); toggle(); } };\n if (key) window.addEventListener('keydown', onKey);\n show(visible);\n\n return {\n show, toggle,\n isVisible: () => shown,\n update(info) {\n if (!shown) return;\n accDt += info.rawDt; accCpu += info.cpuMs; n++;\n const now = performance.now();\n if (now - lastDom < 250) return;\n lastDom = now;\n const ms = (accDt / n) * 1000;\n el.innerHTML =\n `<div style=\"display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px\"><b style=\"color:${T.accent};font-size:16px;font-weight:600\">${(1000 / ms).toFixed(0)}<span style=\"font-size:11px;color:${T.label};font-weight:400\"> fps</span></b><span style=\"color:${T.label}\">${ms.toFixed(1)} ms</span></div>` +\n row('cpu', (accCpu / n).toFixed(2) + ' ms') +\n row('frame', info.frame) +\n row('time', info.time.toFixed(2) + ' s') +\n row('size', `${info.width}\u00D7${info.height}`) +\n row('passes', info.passes);\n accDt = accCpu = n = 0;\n },\n dispose() {\n if (key) window.removeEventListener('keydown', onKey);\n el.remove();\n }\n };\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Compile-error overlay drawn over the canvas (dev aid). Enabled by default on localhost\n * (errorOverlay: 'auto'); set errorOverlay: true/false to force.\n */\nexport function createErrorOverlay(canvas, theme) {\n const T = resolveTheme(theme);\n let el = null;\n\n function place() {\n if (!el) return;\n const r = canvas.getBoundingClientRect();\n Object.assign(el.style, { left: r.left + 'px', top: r.top + 'px', width: r.width + 'px', height: r.height + 'px' });\n }\n const esc = s => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;');\n\n return {\n show(err) {\n if (!el) {\n el = document.createElement('div');\n el.style.cssText =\n 'position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;' +\n `background:${T.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${T.text};font:13px/1.55 ${T.font}`;\n document.body.appendChild(el);\n window.addEventListener('resize', place);\n }\n const errors = err.errors || [];\n const title = esc(err.message.split('\\n')[0]);\n let body = '';\n if (errors.length) {\n body = errors.map(e =>\n `<div style=\"display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};margin-bottom:8px\">` +\n `<span style=\"color:${T.red};font-family:${T.mono};font-size:12px\">line ${e.line}</span><span style=\"color:${T.textStrong}\">${esc(e.message)}</span>` +\n `<span></span><code style=\"color:${T.label};font-family:${T.mono};font-size:12px;white-space:pre-wrap\">${esc(e.source.trim())}</code></div>`).join('');\n } else if (err.log) {\n body = `<pre style=\"margin:0;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};color:${T.label};font:12px/1.5 ${T.mono};white-space:pre-wrap\">${esc(err.log)}</pre>`;\n }\n el.innerHTML =\n `<div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px\">` +\n `<span style=\"display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${T.redSoft};color:${T.redText};font-size:11.5px;font-weight:500\">Shader error</span>` +\n `<b style=\"color:${T.textStrong};font-weight:600\">${title}</b></div>` + body;\n el.style.display = 'block';\n place();\n },\n hide() { if (el) el.style.display = 'none'; },\n dispose() { if (el) { el.remove(); window.removeEventListener('resize', place); el = null; } }\n };\n}\n", "/**\n * Screenshots and video capture. `renderNow()` draws a fresh frame synchronously, so these\n * work without preserveDrawingBuffer (the pixels are read in the same task as the draw).\n */\nexport function createCapture(canvas, renderNow) {\n function screenshot(type = 'image/png', quality) {\n renderNow();\n return canvas.toDataURL(type, quality);\n }\n\n function toBlob(type = 'image/png', quality) {\n renderNow();\n return new Promise((res, rej) => canvas.toBlob(b => (b ? res(b) : rej(new Error('toBlob failed'))), type, quality));\n }\n\n async function download(filename = 'shadermate.png', type, quality) {\n if (!type) type = /\\.jpe?g$/i.test(filename) ? 'image/jpeg' : /\\.webp$/i.test(filename) ? 'image/webp' : 'image/png';\n const blob = await toBlob(type, quality);\n saveBlob(blob, filename);\n }\n\n /**\n * Record the canvas to a WebM (or whatever the browser supports).\n * const rec = sm.record({ fps: 60 }); \u2026 const blob = await rec.stop();\n * await sm.record({ duration: 5000, download: 'loop.webm' });\n */\n function record({ fps = 60, mimeType, bitsPerSecond = 8_000_000, duration = 0, download: dl } = {}) {\n if (typeof MediaRecorder === 'undefined' || !canvas.captureStream) throw new Error('MediaRecorder not supported');\n const stream = canvas.captureStream(fps);\n const type = mimeType || ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm', 'video/mp4']\n .find(t => MediaRecorder.isTypeSupported(t)) || '';\n const rec = new MediaRecorder(stream, { mimeType: type || undefined, videoBitsPerSecond: bitsPerSecond });\n const chunks = [];\n rec.ondataavailable = e => { if (e.data.size) chunks.push(e.data); };\n const done = new Promise(res => { rec.onstop = () => res(new Blob(chunks, { type: rec.mimeType })); });\n rec.start(100);\n\n const handle = {\n recorder: rec,\n stop() { if (rec.state !== 'inactive') rec.stop(); stream.getTracks().forEach(t => t.stop()); return done; },\n done\n };\n if (duration > 0) {\n const finished = new Promise(res => setTimeout(() => res(handle.stop()), duration));\n if (dl) return finished.then(blob => { saveBlob(blob, typeof dl === 'string' ? dl : 'shadermate.webm'); return blob; });\n return finished;\n }\n return handle;\n }\n\n return { screenshot, toBlob, download, record };\n}\n\nexport function saveBlob(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n", "import { MAX_CHANNELS, DEFAULT_CANVAS_ID, VERSION } from '../constants.js';\nimport { ShaderMateError, toArray, warnOnce, isBrowser, parseColor, isDevHost } from '../utils/util.js';\nimport { RefPool } from './RefPool.js';\nimport { createEmitter } from './events.js';\nimport { createTweens } from './tween.js';\nimport { normalizePasses, normalizeChannel, isInlineSource } from './passes.js';\nimport { createContext, getExtensions, isWebGL2 } from '../gl/context.js';\nimport { createQuad } from '../gl/quad.js';\nimport { createBlit } from '../gl/blit.js';\nimport { createProgram, getUniformInfo } from '../gl/shader.js';\nimport { createTarget, deleteTarget, resolvePassSize } from '../gl/targets.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\nimport { resolveIncludes, assembleFragment, DEFAULT_INJECT, NO_INJECT } from '../glsl/preprocess.js';\nimport { loadChannel, channelSamplerType } from '../loaders/index.js';\nimport { splitPassBlob, parseUniformComments, usesMouseVec4 } from '../glsl/fragcoord.js';\nimport { looksLikeFragCoord } from '../glsl/builtins.js';\nimport { resolveSamplerSpecs, needsMainBackbuffer, auxPasses } from './samplers.js';\nimport { createCamera } from '../input/camera.js';\nimport { applyUniformMap, isUniformSpec } from '../uniforms/apply.js';\nimport { GL_FLOAT, GL_FLOAT_VEC4, GL_FLOAT_VEC2 } from '../uniforms/types.js';\nimport { createPointer } from '../input/pointer.js';\nimport { createSizer } from '../view/sizing.js';\nimport { createVisibility } from '../view/visibility.js';\nimport { createStats } from '../ui/stats.js';\nimport { createErrorOverlay } from '../ui/errorOverlay.js';\nimport { createCapture } from '../capture/capture.js';\n\n/** Accepts create(options) or create(shaderOrPasses, options). */\nfunction normalizeArgs(a, b) {\n if (typeof a === 'string' || Array.isArray(a)) return { ...(b || {}), passes: a };\n if (a && typeof a === 'object' && (a.shader != null || a.passes != null || a.src != null)) {\n const o = { ...a };\n // Single-shader form: per-pass fields written at the top level belong to that one pass.\n if (o.passes == null) o.passes = { src: o.shader ?? o.src, uniforms: o.passUniforms, channels: o.channels, pingpong: o.pingpong, float: o.float };\n else if (o.channels != null) console.warn('[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead.');\n return o;\n }\n throw new ShaderMateError('createShader: pass a shader string, an array of passes, or { shader | passes, ...options }');\n}\n\nfunction resolveCanvas(c) {\n if (c && typeof c === 'object' && typeof c.getContext === 'function') return { canvas: c, given: true };\n if (typeof c === 'string') {\n let el = document.getElementById(c);\n if (!el) { try { el = document.querySelector(c); } catch { /* invalid selector */ } }\n if (!el) throw new ShaderMateError(`Canvas not found: \"${c}\"`);\n return { canvas: el, given: true };\n }\n let el = document.getElementById(DEFAULT_CANVAS_ID);\n if (el) return { canvas: el, given: true };\n el = document.createElement('canvas');\n el.id = DEFAULT_CANVAS_ID;\n (document.body || document.documentElement).appendChild(el);\n return { canvas: el, given: false };\n}\n\nfunction setUniformIn(map, name, value) {\n const cur = map[name];\n if (isUniformSpec(cur)) cur.value = value;\n else map[name] = value;\n}\nconst readUniform = (map, name) => (isUniformSpec(map[name]) ? map[name].value : map[name]);\n\n/**\n * Create a ShaderMate instance. Returns synchronously; shaders and textures load in the\n * background. `await sm.ready` to know when the first frame can render.\n */\nexport function createShader(a, b) {\n if (!isBrowser) throw new ShaderMateError('ShaderMate needs a browser environment (window/document).');\n const options = normalizeArgs(a, b);\n\n // ---- options ---------------------------------------------------------\n const autoSetup = options.autoSetup !== false;\n const inject = Object.assign({}, autoSetup ? DEFAULT_INJECT : NO_INJECT, options.inject);\n const globalDefines = toArray(options.defines);\n let commonSrc = typeof options.common === 'string' ? options.common : '';\n const dialect = options.dialect || 'auto'; // 'auto' | 'fragcoord' | 'shadertoy' | 'shadermate'\n const instanceSamplers = options.samplers || {};\n const uniforms = options.uniforms || {}; // instance-wide, live\n const includeStore = options.includes || {};\n const strictUniforms = !!options.strictUniforms;\n const warnUniforms = options.warnMissingUniforms !== false;\n const showExpanded = options.showExpandedOnError !== false;\n const useOverlay = options.errorOverlay === undefined || options.errorOverlay === 'auto' ? isDevHost() : !!options.errorOverlay;\n\n // ---- context ---------------------------------------------------------\n let canvas, givenCanvas, gl;\n if (options.gl) {\n gl = options.gl; canvas = gl.canvas; givenCanvas = true;\n } else {\n ({ canvas, given: givenCanvas } = resolveCanvas(options.canvas));\n gl = createContext(canvas, options);\n }\n const isGL2 = isWebGL2(gl);\n const ext = getExtensions(gl, isGL2);\n const env = { isGL2, ext };\n const pool = new RefPool(gl);\n const enableDerivatives = !!(isGL2 || ext.OES_standard_derivatives);\n const bg = parseColor(options.background ?? options.clearColor) || [0, 0, 0, 0];\n gl.clearColor(bg[0], bg[1], bg[2], bg[3]);\n\n const emitter = createEmitter();\n const { emit, on, off, once } = emitter;\n const quad = createQuad(gl);\n const sizer = createSizer(canvas, options, givenCanvas);\n const pointer = createPointer(canvas, sizer.fit, options.pointer === false ? { target: 'canvas', smooth: 0 } : (typeof options.pointer === 'object' ? options.pointer : {}));\n const tweens = createTweens();\n const overlay = useOverlay ? createErrorOverlay(canvas, options.theme) : null;\n let stats = null;\n if (options.stats) {\n stats = createStats({\n visible: options.stats === true || options.stats === 'visible',\n key: options.statsKey === undefined ? 'F1' : options.statsKey,\n position: options.statsPosition,\n theme: options.theme,\n });\n }\n\n // ---- state -----------------------------------------------------------\n const passObjs = [];\n const byName = new Map();\n let PASSES = [];\n let disposed = false;\n let loaded = false;\n let rafId = null;\n let removeResize = () => { };\n let last = performance.now();\n let lastRender = 0;\n let frame = 0;\n let time = options.time || 0;\n let playing = options.autoplay !== false && !options.startPaused && !options.paused;\n let timeScale = options.timeScale ?? 1;\n let fixedDelta = options.fixedDelta || 0;\n let maxFps = options.maxFps || options.fps || 0;\n let loopLen = options.loop || 0;\n const maxDelta = options.maxDelta ?? 0.1;\n let visible = true;\n let lastError = null;\n let refreshRate = 60; // estimated display refresh rate (median of recent rAF intervals)\n const rafDts = [];\n let camera = null; // fly camera, created when a pass uses u_camera_*\n let blit = null; // copies the screen pass' buffer to the canvas when u_main is sampled\n let mainBackbuffer = false;\n\n const visibility = createVisibility(canvas, {\n enabled: options.pauseWhenHidden !== false,\n onChange: v => { visible = v; if (v) last = performance.now(); emit('visibility', v); }\n });\n\n // ---- helpers ---------------------------------------------------------\n function reportError(err) {\n lastError = err;\n if (overlay) overlay.show(err);\n emit('error', err);\n if (options.onError) options.onError(err);\n }\n function clearError() {\n lastError = null;\n if (overlay) overlay.hide();\n }\n\n const loadText = async path => {\n const r = await fetch(path);\n if (!r.ok) throw new ShaderMateError(`Failed to fetch ${path}: ${r.status} ${r.statusText}`);\n return r.text();\n };\n const includeLoader = async path => (includeStore[path] != null ? includeStore[path] : loadText(path));\n\n let commonText = null;\n async function getCommon() {\n if (commonText !== null) return commonText;\n if (!commonSrc) return (commonText = '');\n const raw = isInlineSource(commonSrc) ? commonSrc : await loadText(commonSrc);\n const parsed = parseUniformComments(raw); // Common may declare annotated uniforms too\n for (const n in parsed.uniforms) if (!(n in uniforms)) uniforms[n] = parsed.uniforms[n];\n Object.assign(instanceSamplers, parsed.samplers, instanceSamplers);\n return (commonText = parsed.source);\n }\n\n /** Fetch (if needed), preprocess and compile a pass' fragment shader. */\n async function buildProgram(pass, src, allPasses = PASSES) {\n let text = isInlineSource(src) ? src : await loadText(src);\n const common = await getCommon();\n\n // FragCoord.xyz annotations: `uniform float u_x = 0.5; //[0, 1]`, `uniform sampler2D u_tex; //https://\u2026`\n const parsed = parseUniformComments(text);\n text = parsed.source;\n for (const n in parsed.uniforms) if (!(n in pass.uniforms) && !(n in uniforms)) pass.uniforms[n] = parsed.uniforms[n];\n pass.annotatedSamplers = parsed.samplers;\n\n const full = common ? common + '\\n#line 1\\n' + text : text;\n const expanded = await resolveIncludes(full, { loader: includeLoader });\n\n const fc = dialect === 'fragcoord' || (dialect === 'auto' && looksLikeFragCoord(expanded));\n const samplerNames = [];\n const aux = allPasses.filter(p => !p.screen);\n allPasses.forEach(p => samplerNames.push('u_' + p.name));\n aux.forEach((p, i) => { const n = 'u_pass' + (i + 1); if (!samplerNames.includes(n)) samplerNames.push(n); });\n\n const frag = assembleFragment(expanded, {\n isGL2,\n defines: [...globalDefines, ...toArray(pass.defines)],\n enableDerivatives,\n inject,\n channelTypes: pass.channels.map(channelSamplerType),\n builtinOpts: {\n fragcoord: fc,\n mouseVec4: fc || dialect === 'fragcoord' || usesMouseVec4(expanded),\n scrollFloat: fc || dialect === 'fragcoord',\n samplerNames,\n passCount: aux.length,\n },\n });\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, frag, { label: pass.name, showExpandedOnError: showExpanded });\n if (r.error) throw r.error;\n return { program: r.program, source: text, compiled: frag, fragcoord: fc };\n }\n\n function resizeTargets() {\n for (const po of passObjs) {\n const cfg = po.cfg;\n if (cfg.screen && !mainBackbuffer) continue;\n const [w, h] = cfg.screen ? [canvas.width, canvas.height] : resolvePassSize(cfg.size, canvas.width, canvas.height);\n if (po.target && po.target.width === w && po.target.height === h) continue;\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.target = createTarget(gl, pool, w, h, cfg, isGL2, ext);\n po.targetPrev = (cfg.pingpong || (cfg.screen && mainBackbuffer)) ? createTarget(gl, pool, w, h, cfg, isGL2, ext) : null;\n }\n }\n\n function handleResize() {\n if (disposed) return;\n if (sizer.update()) {\n gl.viewport(0, 0, canvas.width, canvas.height);\n resizeTargets();\n emit('resize', { width: canvas.width, height: canvas.height });\n if (!playing && loaded) renderNow(); // keep a paused canvas crisp\n }\n }\n\n async function loadPassChannels(po) {\n await Promise.all(po.cfg.channels.map(async (ch, i) => {\n if (!ch || ch.pass != null) return;\n try {\n po.texChannels[i] = await loadChannel(gl, pool, ch, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" channel ${i}: ${e.message}`);\n emit('error', e);\n }\n }));\n // named samplers (u_pass1, u_blur, u_main, u_audio, annotated URLs \u2026)\n po.samplers = resolveSamplerSpecs(po, passObjs, instanceSamplers);\n await Promise.all(po.samplers.map(async s => {\n if (s.spec.pass != null || s.spec.array) return;\n try {\n s.wrap = await loadChannel(gl, pool, s.spec, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" sampler ${s.name}: ${e.message}`);\n emit('error', e);\n }\n }));\n }\n\n // ---- build -----------------------------------------------------------\n /** A pasted FragCoord.xyz multi-pass blob (`// Pass 1` \u2026 `// Main`) becomes a pass list. */\n function expandPassBlob(input) {\n if (typeof input !== 'string' || !isInlineSource(input)) return input;\n const blob = splitPassBlob(input);\n if (!blob) return input;\n if (blob.common) commonSrc = commonSrc ? commonSrc + '\\n' + blob.common : blob.common;\n const unsupported = blob.passes.find(p => p.bufferType !== '2d');\n if (unsupported) throw new ShaderMateError(`Pass \"${unsupported.label}\" uses a ${unsupported.bufferType} buffer; ShaderMate supports 2D buffers only.`);\n const passes = blob.passes.map(p => p.main\n ? { name: 'main', shader: p.src, screen: true }\n : { name: p.name, shader: p.src, pingpong: true, float: true }); // aux passes keep history (feedback) like FragCoord\n if (!passes.some(p => p.screen)) passes[passes.length - 1].screen = true;\n return passes;\n }\n\n async function build() {\n PASSES = normalizePasses(expandPassBlob(options.passes));\n for (const p of PASSES) if (p.iterations > 1 && !p.screen) p.pingpong = true; // recursion reads the previous iteration\n for (let i = 0; i < PASSES.length; i++) {\n const pass = PASSES[i];\n const { program, source, compiled, fragcoord } = await buildProgram(pass, pass.src);\n if (disposed) { gl.deleteProgram(program); return; }\n const po = {\n cfg: pass, name: pass.name, index: i,\n programId: pool.add(program, 'program'),\n uniformInfo: getUniformInfo(gl, program),\n source, compiled, fragcoord,\n target: null, targetPrev: null,\n texChannels: new Array(MAX_CHANNELS).fill(null),\n samplers: [],\n };\n passObjs.push(po);\n byName.set(po.name, po);\n }\n await Promise.all(passObjs.map(loadPassChannels));\n if (disposed) return;\n mainBackbuffer = needsMainBackbuffer(passObjs);\n if (mainBackbuffer && !blit) blit = createBlit(gl, isGL2, quad);\n if (!camera && passObjs.some(po => po.uniformInfo.u_camera_pos || po.uniformInfo.u_camera_dir || po.uniformInfo.u_camera_view)) {\n camera = createCamera(canvas, typeof options.camera === 'object' ? options.camera : {});\n }\n resizeTargets();\n }\n\n // ---- frame -----------------------------------------------------------\n /** Texture of another pass as seen from `po` (previous frame when reading itself / a later pass). */\n function passTexture(po, src, buffer) {\n let t = null;\n if (src.targetPrev) {\n const prev = buffer === 'prev' || (buffer !== 'current' && src.index >= po.index);\n t = prev ? src.targetPrev : src.target;\n } else if (src === po) {\n warnOnce('self:' + po.name, `Pass \"${po.name}\" reads its own output; add pingpong: true.`);\n } else if (src.cfg.screen) {\n warnOnce('screen:' + src.name, `Pass \"${po.name}\" can't read screen pass \"${src.name}\" (it has no texture).`);\n } else t = src.target;\n return t;\n }\n\n function drawPass(po, f, iteration = 0) {\n const cfg = po.cfg;\n const program = pool.get(po.programId);\n const u = po.uniformInfo;\n const m = pointer.state;\n const set1f = (n, v) => { const i = u[n]; if (i) gl.uniform1f(i.loc, v); };\n const set1i = (n, v) => { const i = u[n]; if (i) gl.uniform1i(i.loc, v); };\n\n if (po.targetPrev) { const t = po.targetPrev; po.targetPrev = po.target; po.target = t; }\n\n let rw, rh;\n if (cfg.screen && !mainBackbuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n rw = canvas.width; rh = canvas.height;\n } else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n rw = po.target.width; rh = po.target.height;\n }\n const k = cfg.screen ? 1 : rw / canvas.width; // mouse in this pass' pixel space\n const ky = cfg.screen ? 1 : rh / canvas.height;\n gl.viewport(0, 0, rw, rh);\n gl.useProgram(program);\n gl.clear(gl.COLOR_BUFFER_BIT | (po.target && po.target.depthId ? gl.DEPTH_BUFFER_BIT : 0));\n\n // built-ins\n set1f('iTime', f.time); set1f('u_time', f.time);\n set1f('iTimeDelta', f.dt); set1f('u_delta', f.dt); set1f('u_time_delta', f.dt);\n set1i('iFrame', f.frame); set1i('u_frame', f.frame);\n set1f('iFrameRate', f.fps); set1f('u_fps', f.fps); set1f('u_refresh_rate', f.refreshRate);\n set1f('iSampleRate', 44100);\n if (u.iResolution) gl.uniform3f(u.iResolution.loc, rw, rh, 1);\n if (u.u_resolution) gl.uniform2f(u.u_resolution.loc, rw, rh);\n set1f('u_aspect', rw / rh);\n set1f('u_pixelRatio', f.dpr);\n if (u.iDate) gl.uniform4fv(u.iDate.loc, f.date);\n if (u.u_date) gl.uniform4fv(u.u_date.loc, f.date);\n if (u.iScroll) gl.uniform2f(u.iScroll.loc, f.scrollX, f.scrollY);\n if (u.u_scroll) {\n // vec2 = page scroll (ShaderMate); float = mouse-wheel accumulator (FragCoord.xyz convention)\n if (u.u_scroll.type === GL_FLOAT) gl.uniform1f(u.u_scroll.loc, m.wheel); else gl.uniform2f(u.u_scroll.loc, f.scrollX, f.scrollY);\n }\n set1f('u_wheel', m.wheel);\n if (u.u_drag) gl.uniform2f(u.u_drag.loc, m.dragX * k, m.dragY * ky);\n set1i('u_recursion', iteration);\n set1i('u_max_recursion', cfg.iterations || 1);\n set1i('u_color_gamut', 0);\n if (camera) {\n if (u.u_camera_pos) gl.uniform3fv(u.u_camera_pos.loc, camera.pos);\n if (u.u_camera_dir) gl.uniform3fv(u.u_camera_dir.loc, camera.dir);\n if (u.u_camera_view) gl.uniformMatrix4fv(u.u_camera_view.loc, false, camera.view);\n }\n if (u.iMouse) {\n // ShaderToy semantics: z > 0 while the button is held, w > 0 only on the frame of the click; both carry |click pos| otherwise\n const sz = m.down ? 1 : -1, sw = m.clicked ? 1 : -1;\n gl.uniform4f(u.iMouse.loc, m.x * k, m.y * ky, m.clickX * k * sz, m.clickY * ky * sw);\n }\n if (u.u_mouse) {\n // vec2 = position; vec4 = position + click position, zw negative while the button is up (FragCoord.xyz convention)\n if (u.u_mouse.type === GL_FLOAT_VEC4) { const s = m.down ? 1 : -1; gl.uniform4f(u.u_mouse.loc, m.x * k, m.y * ky, m.clickX * k * s, m.clickY * ky * s); }\n else gl.uniform2f(u.u_mouse.loc, m.x * k, m.y * ky);\n }\n if (u.u_mouseUV) gl.uniform2f(u.u_mouseUV.loc, m.uvX, m.uvY);\n set1f('u_mouseDown', m.down ? 1 : 0);\n\n // channels\n const chTimes = [0, 0, 0, 0];\n const chRes = new Float32Array(12);\n for (let i = 0; i < MAX_CHANNELS; i++) {\n const ch = cfg.channels[i];\n if (!ch) continue;\n let texObj = null, w = 0, h = 0, isCube = false, chTime = f.time;\n\n if (ch.pass != null) {\n const src = byName.get(ch.pass);\n const t = src ? passTexture(po, src, ch.buffer) : null;\n if (t) { texObj = pool.get(t.texId); w = t.width; h = t.height; }\n } else {\n const wrap = po.texChannels[i];\n if (wrap) {\n texObj = pool.get(wrap.texId); w = wrap.width; h = wrap.height; isCube = !!wrap.cubemap;\n if (wrap.getTime) chTime = wrap.getTime();\n }\n }\n if (texObj) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, texObj);\n set1i('iChannel' + i, i);\n chTimes[i] = chTime;\n chRes[i * 3] = w; chRes[i * 3 + 1] = h; chRes[i * 3 + 2] = 1;\n }\n }\n if (u.iChannelTime) (u.iChannelTime.type === GL_FLOAT_VEC4 ? gl.uniform4fv : gl.uniform1fv).call(gl, u.iChannelTime.loc, chTimes);\n if (u.iChannelResolution) gl.uniform3fv(u.iChannelResolution.loc, chRes);\n\n // named samplers on texture units after the four iChannels\n let unit = MAX_CHANNELS;\n for (const s of po.samplers) {\n const bindTex = (tex, isCube) => { gl.activeTexture(gl.TEXTURE0 + unit); gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, tex); return unit++; };\n if (s.spec.array) {\n const units = s.spec.array.map(src => { const t = passTexture(po, src, s.spec.buffer); return t ? bindTex(pool.get(t.texId), false) : 0; });\n gl.uniform1iv(s.info.loc, units);\n } else if (s.spec.pass != null) {\n const src = byName.get(s.spec.pass);\n const t = src ? passTexture(po, src, s.spec.buffer) : null;\n if (t) gl.uniform1i(s.info.loc, bindTex(pool.get(t.texId), false));\n } else if (s.wrap) {\n gl.uniform1i(s.info.loc, bindTex(pool.get(s.wrap.texId), !!s.wrap.cubemap));\n if (s.wrap.getTime) set1f(s.name + '_time', s.wrap.getTime()); // FragCoord: companion <name>_time for video\n const res = u[s.name + '_resolution']; if (res) gl.uniform2f(res.loc, s.wrap.width, s.wrap.height);\n }\n }\n\n // user uniforms: instance-wide first, then per-pass overrides\n applyUniformMap(gl, u, uniforms, { strict: false });\n applyUniformMap(gl, u, cfg.uniforms, { strict: strictUniforms, warnMissing: warnUniforms, label: po.name });\n\n quad.bind(program);\n quad.draw();\n }\n\n /** Advance the clock (if playing/forced) and draw every pass. */\n function frameStep(now, { advance = playing, rawDt } = {}) {\n const t0 = performance.now();\n if (rawDt === undefined) rawDt = Math.max(0, (now - last) * 0.001);\n last = now;\n if (rawDt > 0.002 && rawDt < 0.1) { rafDts.push(rawDt); if (rafDts.length > 30) rafDts.shift(); if (rafDts.length >= 10) { const s = [...rafDts].sort((a, b) => a - b); refreshRate = Math.round(1 / s[s.length >> 1]); } }\n let dt = fixedDelta > 0 ? fixedDelta : Math.min(rawDt, maxDelta);\n if (advance) {\n time += dt * timeScale;\n if (loopLen > 0) time = ((time % loopLen) + loopLen) % loopLen;\n } else dt = 0;\n frame++;\n const fps = rawDt > 0 ? 1 / rawDt : 0;\n tweens.update(now);\n pointer.update();\n\n const info = { time, frame, dt, fps };\n emit('beforeFrame', info);\n if (options.onFrame) options.onFrame(info);\n\n const d = new Date();\n const f = {\n time, frame, dt, fps,\n dpr: window.devicePixelRatio || 1,\n date: [d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds() + d.getMilliseconds() / 1000],\n scrollX: window.scrollX || 0, scrollY: window.scrollY || 0,\n refreshRate,\n };\n\n if (camera) camera.update(rawDt);\n for (const po of passObjs) {\n for (const w of po.texChannels) if (w && w.update) w.update();\n for (const s of po.samplers) if (s.wrap && s.wrap.update) s.wrap.update();\n }\n for (const po of passObjs) {\n const n = Math.max(1, po.cfg.iterations | 0);\n for (let i = 0; i < n; i++) drawPass(po, f, i);\n if (po.cfg.screen && mainBackbuffer && blit) blit.draw(pool.get(po.target.texId), canvas.width, canvas.height);\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n emit('afterFrame', info);\n if (stats) stats.update({ rawDt, cpuMs: performance.now() - t0, frame, time, width: canvas.width, height: canvas.height, passes: passObjs.length });\n }\n\n function loop(now) {\n rafId = requestAnimationFrame(loop);\n if (!loaded || !visible) { last = now; return; }\n if (!playing && tweens.size === 0 && options.renderWhilePaused !== true) { last = now; return; }\n if (maxFps > 0 && now - lastRender < 1000 / maxFps - 0.5) return;\n lastRender = now;\n frameStep(now);\n }\n\n /** Draw one frame right now without advancing time (used by screenshots, resize while paused\u2026). */\n function renderNow() {\n if (!loaded || disposed) return;\n frameStep(performance.now(), { advance: false, rawDt: 0 });\n }\n\n // ---- lifecycle -------------------------------------------------------\n function startLoop() {\n if (disposed || rafId != null) return;\n last = performance.now();\n rafId = requestAnimationFrame(loop);\n }\n function stopLoop() {\n if (rafId != null) cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n function destroy() {\n if (disposed) return;\n disposed = true;\n stopLoop();\n removeResize();\n pointer.dispose();\n visibility.dispose();\n tweens.cancel();\n if (stats) stats.dispose();\n if (overlay) overlay.dispose();\n if (camera) camera.dispose();\n if (blit) blit.dispose();\n canvas.removeEventListener('webglcontextlost', onContextLost);\n canvas.removeEventListener('webglcontextrestored', onContextRestored);\n teardownPasses();\n quad.dispose();\n emit('destroy');\n emitter.clear();\n if (!givenCanvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);\n }\n\n function teardownPasses() {\n for (const po of passObjs) {\n pool.unref(po.programId);\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.texChannels.forEach(w => { if (!w) return; if (w.dispose) w.dispose(); pool.unref(w.texId); });\n (po.samplers || []).forEach(s => { if (!s.wrap) return; if (s.wrap.dispose) s.wrap.dispose(); pool.unref(s.wrap.texId); });\n }\n passObjs.length = 0;\n byName.clear();\n }\n\n function onContextLost(e) {\n e.preventDefault();\n stopLoop();\n loaded = false;\n console.warn('[ShaderMate] WebGL context lost.');\n emit('contextlost');\n }\n async function onContextRestored() {\n console.warn('[ShaderMate] WebGL context restored, rebuilding.');\n pool._items.clear();\n passObjs.length = 0; byName.clear();\n try { await build(); loaded = true; startLoop(); emit('contextrestored'); }\n catch (err) { reportError(err); }\n }\n canvas.addEventListener('webglcontextlost', onContextLost);\n canvas.addEventListener('webglcontextrestored', onContextRestored);\n\n // ---- public API ------------------------------------------------------\n const capture = createCapture(canvas, renderNow);\n\n function set(name, value, passName) {\n if (name && typeof name === 'object') { for (const k in name) set(k, name[k], value); return api; }\n tweens.cancel(name);\n let hit = false;\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) { setUniformIn(po.cfg.uniforms, name, value); hit = true; }\n }\n if (!hit) {\n if (passName) {\n const po = byName.get(passName);\n if (!po) throw new ShaderMateError(`set: unknown pass \"${passName}\"`);\n setUniformIn(po.cfg.uniforms, name, value);\n } else setUniformIn(uniforms, name, value);\n }\n if (!playing && loaded) scheduleRender();\n return api;\n }\n function get(name, passName) {\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) return readUniform(po.cfg.uniforms, name);\n }\n return readUniform(uniforms, name);\n }\n function tween(name, to, opts = {}) {\n const passName = opts.pass;\n const owner = () => {\n for (const po of passObjs) if ((!passName || po.name === passName) && name in po.cfg.uniforms) return po.cfg.uniforms;\n return uniforms;\n };\n return tweens.tween(name, () => readUniform(owner(), name), v => setUniformIn(owner(), name, v), to, opts);\n }\n\n let renderQueued = false;\n function scheduleRender() {\n if (renderQueued) return;\n renderQueued = true;\n requestAnimationFrame(() => { renderQueued = false; if (!playing) renderNow(); });\n }\n\n async function setShader(src, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setShader: unknown pass \"${passName}\"`);\n try {\n const { program, source, compiled } = await buildProgram(po.cfg, src, PASSES);\n if (disposed) { gl.deleteProgram(program); return; }\n pool.unref(po.programId);\n po.programId = pool.add(program, 'program');\n po.uniformInfo = getUniformInfo(gl, program);\n po.cfg.src = src; po.source = source; po.compiled = compiled;\n await loadPassChannels(po);\n clearError();\n emit('shader', { pass: po.name });\n if (!playing) scheduleRender();\n } catch (err) {\n reportError(err);\n throw err;\n }\n }\n\n async function setChannel(index, source, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setChannel: unknown pass \"${passName}\"`);\n const ch = normalizeChannel(source, [...byName.keys()], po.name);\n const old = po.texChannels[index];\n if (old) { if (old.dispose) old.dispose(); pool.unref(old.texId); po.texChannels[index] = null; }\n po.cfg.channels[index] = ch;\n if (ch && ch.pass == null) po.texChannels[index] = await loadChannel(gl, pool, ch, env);\n if (!playing) scheduleRender();\n }\n\n const api = {\n version: VERSION,\n canvas, gl, isWebGL2: isGL2,\n theme: options.theme,\n get camera() { return camera; },\n uniforms,\n get passes() { return passObjs; },\n get ready() { return readyPromise; },\n get loaded() { return loaded; },\n get error() { return lastError; },\n\n // playback\n play() { if (!playing) { playing = true; last = performance.now(); emit('play'); } return api; },\n pause() { if (playing) { playing = false; emit('pause'); } return api; },\n toggle() { return playing ? api.pause() : api.play(); },\n get playing() { return playing; },\n step(n = 1) { for (let i = 0; i < n; i++) frameStep(performance.now(), { advance: true, rawDt: fixedDelta || 1 / 60 }); return api; },\n render: renderNow,\n destroy, dispose: destroy,\n\n // time\n get time() { return time; }, set time(t) { time = t; if (!playing) scheduleRender(); },\n get frame() { return frame; },\n get timeScale() { return timeScale; }, set timeScale(s) { timeScale = s; },\n get maxFps() { return maxFps; }, set maxFps(v) { maxFps = v || 0; },\n get loop() { return loopLen; }, set loop(v) { loopLen = v || 0; },\n seek(t) { time = t; if (!playing) scheduleRender(); return api; },\n setFixedDelta(dt) { fixedDelta = dt || 0; return api; },\n\n // uniforms\n set, get, tween,\n setUniform: set, getUniform: get,\n\n // live editing\n setShader, setChannel,\n getPass: name => byName.get(name) || null,\n getTexture(name) {\n const po = name ? byName.get(name) : passObjs.find(p => !p.cfg.screen) || passObjs[0];\n return po && po.target ? pool.get(po.target.texId) : null;\n },\n readPixels({ pass, x = 0, y = 0, width, height, float } = {}) {\n const po = pass ? byName.get(pass) : null;\n renderNow();\n if (po && po.target) gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n else gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n const w = width ?? (po && po.target ? po.target.width : canvas.width);\n const h = height ?? (po && po.target ? po.target.height : canvas.height);\n let out = new Uint8Array(w * h * 4);\n const isFloat = po && po.target && po.target.fmt.type !== gl.UNSIGNED_BYTE;\n if (isFloat) {\n // float / half-float targets can only be read back as floats\n const f = new Float32Array(w * h * 4);\n gl.readPixels(x, y, w, h, gl.RGBA, gl.FLOAT, f);\n if (float !== false) out = f;\n else for (let i = 0; i < f.length; i++) out[i] = Math.max(0, Math.min(255, Math.round(f[i] * 255)));\n } else gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, out);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { data: out, width: w, height: h, float: out instanceof Float32Array };\n },\n\n // sizing / input\n resize: handleResize,\n setSize(w, h) { sizer.setFixed(w, h); handleResize(); return api; },\n get width() { return canvas.width; },\n get height() { return canvas.height; },\n pointer: pointer.state,\n domToShader: pointer.toShader,\n domToUV: pointer.toUV,\n\n // capture\n screenshot: capture.screenshot,\n toBlob: capture.toBlob,\n download: capture.download,\n record: capture.record,\n\n // events\n on, off, once,\n\n // dev\n stats: {\n show: (v = true) => { if (!stats) stats = createStats({ visible: false, key: options.statsKey === undefined ? 'F1' : options.statsKey, theme: options.theme }); stats.show(v); },\n toggle: () => api.stats.show(!(stats && stats.isVisible())),\n },\n };\n\n // ---- go --------------------------------------------------------------\n sizer.update();\n gl.viewport(0, 0, canvas.width, canvas.height);\n removeResize = sizer.observe(handleResize);\n\n const readyPromise = (async () => {\n await build();\n if (disposed) return api;\n loaded = true;\n clearError();\n emit('load', api);\n if (options.onReady) options.onReady(api);\n startLoop();\n if (!playing) renderNow();\n return api;\n })();\n readyPromise.catch(err => { if (!disposed) reportError(err); });\n\n return api;\n}\n", "// GLSL (WebGL 2) for the GPU pipeline. Each pass mirrors a function in cpu/stages.js.\n// ShaderMate adds the #version line, precision, fragColor and the built-in uniforms.\n//\n// prep \u2500\u25B6 quant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n// \u2514\u2500\u2500\u2500\u25B6 diffuse (N waves) \u2500\u25B6 resolve \u2500\u25B6 orphan \u2500\u25B6 smooth \u2500\u25B6 out (screen)\n//\n// Note: no trailing comments on uniform lines; ShaderMate reads trailing numbers there as default values.\n// All passes address pixels top-down (`P`, row 0 = top) so the maths matches the CPU.\n\nexport const COMMON = /* glsl */`\n// 256\u00D71, palette colours in x = 0..count-1\nuniform sampler2D u_palette;\nuniform int u_count;\n// 0 = OKLab, 1 = weighted RGB\nuniform int u_distance;\n\nivec2 topDown() { return ivec2(int(gl_FragCoord.x), int(u_resolution.y) - 1 - int(gl_FragCoord.y)); }\nvec4 at(sampler2D t, ivec2 p) { ivec2 s = textureSize(t, 0); return texelFetch(t, ivec2(p.x, s.y - 1 - p.y), 0); }\nbool inside(ivec2 p) { return p.x >= 0 && p.y >= 0 && p.x < int(u_resolution.x) && p.y < int(u_resolution.y); }\nvec3 palColor(int i) { return texelFetch(u_palette, ivec2(i, 0), 0).rgb; }\n\nfloat linear1(float c) { return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); }\nvec3 oklab(vec3 c) {\n c = vec3(linear1(c.r), linear1(c.g), linear1(c.b));\n float l = pow(0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b, 1.0 / 3.0);\n float m = pow(0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b, 1.0 / 3.0);\n float s = pow(0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b, 1.0 / 3.0);\n return vec3(0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);\n}\nvec3 space(vec3 c) { return u_distance == 1 ? c : oklab(c); }\nint nearestIndex(vec3 c) {\n vec3 p = space(c);\n vec3 w = u_distance == 1 ? vec3(0.299, 0.587, 0.114) : vec3(1.0);\n int best = 0; float bd = 1e20;\n for (int i = 0; i < 256; i++) {\n if (i >= u_count) break;\n vec3 d = p - space(palColor(i));\n float dist = dot(w * d, d);\n if (dist < bd) { bd = dist; best = i; }\n }\n return best;\n}\nint colorKey(vec4 c) {\n if (c.a < 0.5) return -1;\n ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));\n return b.r * 65536 + b.g * 256 + b.b;\n}\n`;\n\n/** Resample (box / nearest) + adjust + alpha cut. iChannel0 = source image. */\nexport const PREP = /* glsl */`\n// 0 box, 1 nearest\nuniform int u_resample;\n// brightness, contrast, saturation, gamma\nuniform vec4 u_adjust;\n// hue rotation in degrees\nuniform float u_hue;\nuniform float u_alphaCut;\n// source region in texels: x, y (from the top-left), width, height\nuniform ivec4 u_crop;\n\nvoid main() {\n ivec2 P = topDown();\n ivec2 R = ivec2(u_resolution);\n ivec2 O = u_crop.xy;\n ivec2 S = u_crop.zw;\n int nx = u_resample == 1 ? 1 : clamp((S.x + R.x - 1) / R.x, 1, 16);\n int ny = u_resample == 1 ? 1 : clamp((S.y + R.y - 1) / R.y, 1, 16);\n vec4 acc = vec4(0.0);\n for (int j = 0; j < 16; j++) {\n if (j >= ny) break;\n int sy = min(S.y - 1, ((2 * (P.y * ny + j) + 1) * S.y) / (2 * R.y * ny));\n for (int i = 0; i < 16; i++) {\n if (i >= nx) break;\n int sx = min(S.x - 1, ((2 * (P.x * nx + i) + 1) * S.x) / (2 * R.x * nx));\n vec4 c = at(iChannel0, O + ivec2(sx, sy));\n acc += vec4(c.rgb * c.a, c.a);\n }\n }\n vec3 c = acc.a > 0.0 ? acc.rgb / acc.a : vec3(0.0);\n float a = acc.a / float(nx * ny);\n\n float br = u_adjust.x, co = u_adjust.y, sa = u_adjust.z, ga = u_adjust.w;\n if (br != 0.0 || co != 0.0 || sa != 0.0 || ga != 1.0 || u_hue != 0.0) {\n float f = co >= 0.0 ? 1.0 / (1.0 - 0.99 * co) : 1.0 + co;\n c = (c + br - 0.5) * f + 0.5;\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\n c = l + (c - l) * (1.0 + sa);\n if (u_hue != 0.0) {\n float h = radians(u_hue), k = cos(h), q = sin(h);\n c = vec3(\n (0.213 + 0.787 * k - 0.213 * q) * c.r + (0.715 - 0.715 * k - 0.715 * q) * c.g + (0.072 - 0.072 * k + 0.928 * q) * c.b,\n (0.213 - 0.213 * k + 0.143 * q) * c.r + (0.715 + 0.285 * k + 0.140 * q) * c.g + (0.072 - 0.072 * k - 0.283 * q) * c.b,\n (0.213 - 0.213 * k - 0.787 * q) * c.r + (0.715 - 0.715 * k + 0.715 * q) * c.g + (0.072 + 0.928 * k + 0.072 * q) * c.b);\n }\n c = pow(clamp(c, 0.0, 1.0), vec3(1.0 / ga));\n }\n a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;\n fragColor = vec4(c * a, a);\n}\n`;\n\n/** No dither / ordered dither. iChannel0 = prep. */\nexport const QUANT = /* glsl */`\n// threshold bytes in .r\nuniform sampler2D u_matrix;\n// 0 pass-through, 1 nearest, 2 ordered\nuniform int u_mode;\nuniform float u_levels;\n// spread \u00D7 strength\nuniform float u_amount;\n\nvoid main() {\n ivec2 P = topDown();\n vec4 p = at(iChannel0, P);\n if (p.a < 0.5) { fragColor = vec4(0.0); return; }\n vec3 c = p.rgb;\n if (u_mode == 0) { fragColor = vec4(floor(c * 255.0 + 0.5) / 255.0, 1.0); return; }\n if (u_mode == 2) {\n ivec2 ms = textureSize(u_matrix, 0);\n float v = floor(at(u_matrix, ivec2(P.x % ms.x, P.y % ms.y)).r * 255.0 + 0.5);\n float t = (v + 0.5) / u_levels - 0.5;\n c = clamp(c + t * u_amount, 0.0, 1.0);\n }\n fragColor = vec4(palColor(nearestIndex(c)), 1.0);\n}\n`;\n\n/**\n * Error diffusion as a wavefront. Iteration r computes every pixel with x + skew*y == r,\n * pulling the stored error of already-computed neighbours.\n * Output: rgb = quantisation error, a = palette index (-1 not yet computed, -2 transparent).\n * iChannel0 = prep, iChannel1 = this pass (previous iteration).\n */\nexport const DIFFUSE = /* glsl */`\n// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)\nuniform int u_recursion;\nuniform int u_on;\nuniform int u_skew;\nuniform float u_strength;\nuniform int u_kn;\n// push offsets (dx, dy) and weight\nuniform vec3 u_kernel[12];\n\nvoid main() {\n if (u_on == 0) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\n ivec2 P = topDown();\n int k = P.x + u_skew * P.y;\n int r = u_recursion;\n if (k < r) { fragColor = at(iChannel1, P); return; }\n if (k > r) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\n vec4 p = at(iChannel0, P);\n if (p.a < 0.5) { fragColor = vec4(0.0, 0.0, 0.0, -2.0); return; }\n vec3 acc = vec3(0.0);\n for (int i = 0; i < 12; i++) {\n if (i >= u_kn) break;\n ivec2 Q = P - ivec2(u_kernel[i].xy);\n if (!inside(Q)) continue;\n vec4 e = at(iChannel1, Q);\n if (e.a >= 0.0) acc += e.rgb * u_kernel[i].z;\n }\n vec3 c = clamp(p.rgb + acc * u_strength, 0.0, 1.0);\n int idx = nearestIndex(c);\n fragColor = vec4(c - palColor(idx), float(idx));\n}\n`;\n\n/** Pick the ordered result or turn diffusion indices into colours. iChannel0 = quant, iChannel1 = diffuse. */\nexport const RESOLVE = /* glsl */`\nuniform int u_on;\nvoid main() {\n ivec2 P = topDown();\n if (u_on == 0) { fragColor = at(iChannel0, P); return; }\n vec4 d = at(iChannel1, P);\n fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);\n}\n`;\n\n/** Orphan removal. iChannel0 = resolve. */\nexport const ORPHAN = /* glsl */`\nuniform int u_on;\nvoid main() {\n ivec2 P = topDown();\n vec4 me = at(iChannel0, P);\n fragColor = me;\n if (u_on == 0) return;\n int c = colorKey(me);\n ivec2 off[4] = ivec2[4](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0));\n int ks[4]; vec4 cs[4]; int n = 0;\n for (int i = 0; i < 4; i++) {\n ivec2 Q = P + off[i];\n if (!inside(Q)) continue;\n cs[n] = at(iChannel0, Q); ks[n] = colorKey(cs[n]);\n if (ks[n] == c) return;\n n++;\n }\n if (n < 2) return;\n int best = 0, bc = 0;\n for (int i = 0; i < 4; i++) {\n if (i >= n) break;\n int m = 0;\n for (int j = 0; j < 4; j++) { if (j >= n) break; if (ks[j] == ks[i]) m++; }\n if (m > bc) { bc = m; best = i; }\n }\n fragColor = cs[best];\n}\n`;\n\n/** 3\u00D73 majority smoothing. iChannel0 = orphan. */\nexport const SMOOTH = /* glsl */`\nuniform int u_on;\nvoid main() {\n ivec2 P = topDown();\n vec4 me = at(iChannel0, P);\n fragColor = me;\n if (u_on == 0) return;\n int c = colorKey(me);\n ivec2 R = ivec2(u_resolution);\n int ks[9]; vec4 cs[9];\n for (int j = 0; j < 3; j++) for (int i = 0; i < 3; i++) {\n ivec2 Q = clamp(P + ivec2(i - 1, j - 1), ivec2(0), R - 1);\n cs[j * 3 + i] = at(iChannel0, Q); ks[j * 3 + i] = colorKey(cs[j * 3 + i]);\n }\n for (int i = 0; i < 9; i++) {\n if (ks[i] == c) continue;\n int m = 0;\n for (int j = 0; j < 9; j++) if (ks[j] == ks[i]) m++;\n if (m >= 5) { fragColor = cs[i]; return; }\n }\n}\n`;\n\n/** Outline, drawn to the canvas. iChannel0 = smooth. */\nexport const OUTLINE = /* glsl */`\n// 0 none, 1 outer, 2 inner\nuniform int u_outline;\nuniform int u_corners;\nuniform vec3 u_outlineColor;\nbool opaqueAt(ivec2 q) { return inside(q) && at(iChannel0, q).a > 0.5; }\nvoid main() {\n ivec2 P = topDown();\n vec4 me = at(iChannel0, P);\n fragColor = me;\n if (u_outline == 0) return;\n bool o = me.a > 0.5;\n ivec2 off[8] = ivec2[8](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0), ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1));\n int n = u_corners == 1 ? 8 : 4;\n for (int i = 0; i < 8; i++) {\n if (i >= n) break;\n ivec2 Q = P + off[i];\n if (!inside(Q)) continue;\n bool other = opaqueAt(Q);\n if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }\n }\n}\n`;\n", "// GPU backend: one ShaderMate instance, six passes, rendered on demand (never animating).\n\nimport { createShader } from 'shadermate';\nimport { COMMON, PREP, QUANT, DIFFUSE, RESOLVE, ORPHAN, SMOOTH, OUTLINE } from './shaders.js';\nimport { MAX_KERNEL } from '../dither/kernels.js';\n\nconst canvasOf = (w, h) => { const c = document.createElement('canvas'); c.width = w; c.height = h; return c; };\n\n/**\n * Create the WebGL 2 backend. Rejects when WebGL 2 or float render targets are missing,\n * so the caller can fall back to the CPU.\n */\nexport async function createGPUBackend() {\n if (typeof document === 'undefined') throw new Error('No DOM');\n const probe = canvasOf(1, 1).getContext('webgl2');\n if (!probe) throw new Error('WebGL 2 is not available');\n if (!probe.getExtension('EXT_color_buffer_float')) throw new Error('Float render targets are not available');\n const dbg = probe.getExtension('WEBGL_debug_renderer_info');\n const renderer = String(dbg ? probe.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : probe.getParameter(probe.RENDERER));\n probe.getExtension('WEBGL_lose_context')?.loseContext();\n\n const canvas = canvasOf(1, 1);\n const source = canvasOf(1, 1);\n const palette = canvasOf(256, 1);\n const matrix = canvasOf(1, 1);\n const nearest = el => ({ element: el, filter: 'nearest', wrap: 'clamp' });\n\n const sm = createShader({\n canvas,\n webgl: 2,\n size: [1, 1],\n pixelRatio: 1,\n autoplay: false,\n pauseWhenHidden: false,\n pointer: false,\n errorOverlay: false,\n warnMissingUniforms: false,\n preserveDrawingBuffer: true,\n premultipliedAlpha: false,\n antialias: false,\n dialect: 'shadermate',\n common: COMMON,\n samplers: { u_palette: nearest(palette), u_matrix: nearest(matrix) },\n uniforms: {\n u_count: 1, u_distance: 0, u_resample: 0, u_adjust: [0, 0, 0, 1], u_hue: 0, u_crop: [0, 0, 1, 1], u_alphaCut: 0.5,\n u_mode: 0, u_levels: 1, u_amount: 0,\n u_skew: 1, u_strength: 1, u_kn: 0, u_kernel: new Float32Array(MAX_KERNEL * 3),\n u_outline: 0, u_corners: 0, u_outlineColor: [0, 0, 0],\n },\n passes: [\n { name: 'prep', shader: PREP, float: 'full', filter: 'nearest', channels: [{ ...nearest(source), dynamic: false }] },\n { name: 'quant', shader: QUANT, filter: 'nearest', channels: ['prep'] },\n { name: 'diffuse', shader: DIFFUSE, float: 'full', filter: 'nearest', pingpong: true, iterations: 2, channels: ['prep', 'diffuse'] },\n { name: 'resolve', shader: RESOLVE, filter: 'nearest', channels: ['quant', 'diffuse'] },\n { name: 'orphan', shader: ORPHAN, filter: 'nearest', channels: ['resolve'] },\n { name: 'smooth', shader: SMOOTH, filter: 'nearest', channels: ['orphan'] },\n { name: 'out', shader: OUTLINE, screen: true, channels: ['smooth'] },\n ],\n });\n\n let failure = null;\n sm.on('error', e => { failure = e; });\n await sm.ready;\n if (failure || sm.error) { sm.destroy(); throw failure || sm.error; }\n\n // `u_on` is a per-pass switch: same name, different value in each pass\n const passUniforms = (name, values) => { for (const k in values) sm.set(k, values[k], name); };\n\n let lastSource = null;\n let paletteKey = '', matrixKey = '';\n\n async function setSource(frame) {\n if (frame.canvas === lastSource && !frame.dirty) return;\n source.width = frame.width; source.height = frame.height;\n const ctx = source.getContext('2d');\n ctx.clearRect(0, 0, source.width, source.height);\n ctx.drawImage(frame.canvas, 0, 0);\n await sm.setChannel(0, { ...nearest(source), dynamic: false }, 'prep');\n lastSource = frame.canvas;\n }\n\n function setPalette(plan) {\n const key = plan.palette.map(c => c.join(',')).join(';');\n if (key === paletteKey) return;\n paletteKey = key;\n const ctx = palette.getContext('2d');\n const img = ctx.createImageData(256, 1);\n plan.palette.forEach((c, i) => img.data.set([c[0], c[1], c[2], 255], i * 4));\n ctx.putImageData(img, 0, 0);\n }\n\n function setMatrix(map) {\n const key = map ? `${map.w}x${map.h}:${map.levels}:${map.values.join(',')}` : 'none';\n if (key === matrixKey) return;\n matrixKey = key;\n const m = map || { w: 1, h: 1, values: [0] };\n matrix.width = m.w; matrix.height = m.h;\n const ctx = matrix.getContext('2d');\n const img = ctx.createImageData(m.w, m.h);\n for (let i = 0; i < m.values.length; i++) img.data.set([m.values[i], 0, 0, 255], i * 4);\n ctx.putImageData(img, 0, 0);\n }\n\n /**\n * @param {ReturnType<import('../plan.js').makePlan>} plan\n * @param {{ canvas: HTMLCanvasElement, width: number, height: number, dirty?: boolean }} frame\n * @returns {Promise<Uint8ClampedArray>} RGBA bytes, rows top-down\n */\n async function run(plan, frame) {\n const s = plan.settings;\n await setSource(frame);\n if (plan.quantize) setPalette(plan);\n setMatrix(plan.map);\n if (sm.width !== plan.width || sm.height !== plan.height) sm.setSize(plan.width, plan.height);\n\n const diffusion = plan.kind === 'diffusion';\n const kernel = new Array(MAX_KERNEL).fill(null).map((_, i) => (plan.kernel && plan.kernel[i]) || [0, 0, 0]);\n sm.set({\n u_count: plan.palette.length || 1,\n u_distance: plan.distance,\n u_resample: s.size.resample === 'nearest' ? 1 : 0,\n u_adjust: [s.adjust.brightness, s.adjust.contrast, s.adjust.saturation, s.adjust.gamma],\n u_hue: s.adjust.hue,\n u_crop: [plan.crop.x, plan.crop.y, plan.crop.w, plan.crop.h],\n u_alphaCut: s.alpha.threshold,\n u_mode: !plan.quantize ? 0 : plan.kind === 'ordered' ? 2 : 1,\n u_levels: plan.map ? plan.map.levels : 1,\n u_amount: plan.map ? plan.spread * s.dither.strength : 0,\n u_skew: plan.skew,\n u_strength: s.dither.strength,\n u_kn: plan.kernel ? plan.kernel.length : 0,\n u_kernel: new Float32Array(kernel.flat()),\n u_outline: { none: 0, outer: 1, inner: 2 }[plan.outline.mode],\n u_corners: plan.outline.corners ? 1 : 0,\n u_outlineColor: plan.outline.color.map(v => v / 255),\n });\n passUniforms('diffuse', { u_on: diffusion ? 1 : 0 });\n passUniforms('resolve', { u_on: diffusion ? 1 : 0 });\n passUniforms('orphan', { u_on: s.cleanup.orphans ? 1 : 0 });\n passUniforms('smooth', { u_on: s.cleanup.smooth ? 1 : 0 });\n sm.getPass('diffuse').cfg.iterations = diffusion ? plan.waves : 1;\n\n const { data } = sm.readPixels();\n // GL rows are bottom-up\n const w = plan.width, h = plan.height, out = new Uint8ClampedArray(w * h * 4), row = w * 4;\n for (let y = 0; y < h; y++) out.set(data.subarray((h - 1 - y) * row, (h - y) * row), y * row);\n return out;\n }\n\n return {\n name: 'webgl',\n renderer,\n /** Software rasterisers (SwiftShader, llvmpipe) are slower than the CPU path for error diffusion. */\n software: /swiftshader|llvmpipe|softpipe|software|basic render/i.test(renderer),\n run,\n shader: sm,\n destroy() { sm.destroy(); },\n };\n}\n", "// Turning whatever the caller has into a \"frame\": { width, height, canvas?, data }.\n// Accepts URLs, Blobs/Files, <img>, <canvas>, OffscreenCanvas, ImageBitmap, <video> (current frame),\n// VideoFrame, ImageData or any { width, height, data } RGBA object, plus p5 / q5 images.\n\nexport const MAX_SOURCE = 4096;\nconst hasDOM = typeof document !== 'undefined';\n\nconst isRGBA = s => s && typeof s === 'object' && 'data' in s && 'width' in s && 'height' in s && s.data && s.data.length === s.width * s.height * 4;\n\n/** Load a URL or Blob into something drawable. */\nexport async function loadImage(src) {\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\n if (typeof createImageBitmap === 'function') {\n try { return await createImageBitmap(src); } catch { /* fall through (e.g. SVG) */ }\n }\n src = URL.createObjectURL(src);\n }\n if (!hasDOM) throw new Error('Loading images by URL needs a browser; pass { width, height, data } in Node.');\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = src;\n await img.decode();\n return img;\n}\n\n/** Natural pixel size of a drawable. */\nexport function sizeOf(el) {\n return {\n width: el.naturalWidth || el.videoWidth || el.displayWidth || el.codedWidth || el.width || 0,\n height: el.naturalHeight || el.videoHeight || el.displayHeight || el.codedHeight || el.height || 0,\n };\n}\n\nfunction unwrap(src) {\n // p5.Image / q5 image / p5.Graphics / p5.Renderer\n if (src && !isRGBA(src) && typeof src === 'object') {\n if (src.canvas && typeof src.canvas === 'object' && 'getContext' in src.canvas) return src.canvas;\n if (src.elt && typeof src.elt === 'object' && 'getContext' in src.elt) return src.elt;\n }\n return src;\n}\n\n/**\n * @param {any} source\n * @param {{ maxSize?: number, canvas?: HTMLCanvasElement }} [opts] canvas: scratch canvas to reuse\n */\nexport async function toFrame(source, opts = {}) {\n const maxSize = opts.maxSize || MAX_SOURCE;\n let src = unwrap(source);\n if (typeof src === 'string' || (typeof Blob !== 'undefined' && src instanceof Blob)) src = await loadImage(src);\n if (src && typeof src.complete === 'boolean' && !src.complete && src.decode) await src.decode();\n\n if (isRGBA(src)) {\n const frame = { width: src.width, height: src.height, data: src.data, canvas: null };\n if (hasDOM) {\n Object.defineProperty(frame, 'canvas', {\n configurable: true,\n get() {\n const c = document.createElement('canvas'); c.width = src.width; c.height = src.height;\n const img = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\n c.getContext('2d').putImageData(img, 0, 0);\n Object.defineProperty(frame, 'canvas', { value: c });\n return c;\n },\n });\n }\n return frame;\n }\n if (!hasDOM) throw new Error('Unsupported source in a non-browser environment. Pass { width, height, data }.');\n\n let { width, height } = sizeOf(src);\n if (!width || !height) throw new Error('Source has no size yet (is the image or video loaded?)');\n const k = Math.min(1, maxSize / Math.max(width, height));\n width = Math.max(1, Math.round(width * k)); height = Math.max(1, Math.round(height * k));\n\n const canvas = opts.canvas || document.createElement('canvas');\n canvas.width = width; canvas.height = height;\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n ctx.clearRect(0, 0, width, height);\n ctx.imageSmoothingEnabled = k < 1;\n ctx.imageSmoothingQuality = 'high';\n ctx.drawImage(src, 0, 0, width, height);\n let cached = null;\n return {\n width, height, canvas, dirty: true,\n get data() { return (cached ||= ctx.getImageData(0, 0, width, height).data); },\n };\n}\n", "// The public engine: createPixelator() picks a backend and turns sources into pixel art.\n\nimport { makePlan } from './plan.js';\nimport { runCPU } from './cpu/pipeline.js';\nimport { createGPUBackend } from './gpu/backend.js';\nimport { toFrame } from './source.js';\nimport { normalizeSettings, LEGACY_DITHER } from './settings.js';\nimport { uniqueColors } from './export/scale.js';\nimport { toCanvas } from './export/canvas.js';\nimport { encodePNG } from './export/png.js';\n\nconst isVideo = s => typeof HTMLVideoElement !== 'undefined' && s instanceof HTMLVideoElement;\nconst isVideoFrame = s => typeof VideoFrame !== 'undefined' && s instanceof VideoFrame;\n\n/**\n * Create an engine. Reuse one for many images: the GPU backend compiles its shaders once.\n * @param {{ backend?: 'auto' | 'webgl' | 'cpu', diffusion?: 'auto' | 'gpu' | 'cpu', maxSourceSize?: number }} [options]\n * diffusion: where error diffusion runs. 'auto' uses the GPU unless WebGL is software-rendered.\n */\nexport async function createPixelator(options = {}) {\n const want = options.backend || 'auto';\n let gpu = null, gpuError = null;\n if (want !== 'cpu' && typeof document !== 'undefined') {\n try { gpu = await createGPUBackend(); } catch (e) {\n gpuError = e;\n if (want === 'webgl') throw e;\n }\n }\n const scratch = typeof document !== 'undefined' ? document.createElement('canvas') : null;\n let last = { source: null, frame: null };\n let queue = Promise.resolve();\n\n async function frameFor(source) {\n if (source === last.source && last.frame && !isVideo(source) && !isVideoFrame(source)) {\n last.frame.dirty = false;\n return last.frame;\n }\n const frame = await toFrame(source, { maxSize: options.maxSourceSize, canvas: scratch });\n last = { source, frame };\n return frame;\n }\n\n async function processNow(source, settings) {\n const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const frame = await frameFor(source);\n const plan = makePlan(settings, frame);\n let data, backend = 'cpu';\n const diffusionOnCPU = plan.kind === 'diffusion' && (options.diffusion === 'cpu' || (options.diffusion !== 'gpu' && gpu && gpu.software));\n if (gpu && frame.canvas && !diffusionOnCPU) {\n data = await gpu.run(plan, frame);\n backend = 'webgl';\n } else {\n data = runCPU(plan, frame);\n }\n const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\n return makeResult(plan, data, backend, ms);\n }\n\n return {\n /** 'webgl' or 'cpu' */\n get backend() { return gpu ? 'webgl' : 'cpu'; },\n /** GPU renderer string (WebGL backend only). */\n get renderer() { return gpu ? gpu.renderer : ''; },\n /** Why the GPU backend is not in use, if it isn't. */\n get fallbackReason() { return gpuError ? String(gpuError.message || gpuError) : ''; },\n /**\n * Process one source. Calls are queued, so it is safe to call from input handlers.\n * @returns {Promise<PixelResult>}\n */\n process(source, settings = {}) {\n const run = queue.then(() => processNow(source, settings));\n queue = run.catch(() => { });\n return run;\n },\n /** Forget the cached source (call after drawing new content into the same canvas). */\n invalidate() { last = { source: null, frame: null }; },\n destroy() { if (gpu) gpu.destroy(); gpu = null; },\n /** The underlying ShaderMate instance (GPU backend only), for debugging. */\n get shader() { return gpu ? gpu.shader : null; },\n };\n}\n\n/**\n * @typedef {object} PixelResult\n * @property {number} width\n * @property {number} height\n * @property {Uint8ClampedArray} data RGBA, rows top-down\n * @property {string[]} palette colours actually available ('#rrggbb')\n * @property {object} settings normalised settings used\n * @property {'webgl'|'cpu'} backend\n * @property {number} ms processing time\n */\nexport function makeResult(plan, data, backend = 'cpu', ms = 0) {\n const result = {\n width: plan.width,\n height: plan.height,\n data,\n palette: plan.paletteHex ? plan.paletteHex.slice() : null,\n settings: plan.settings,\n kind: plan.kind,\n waves: plan.waves,\n /** The framed part of the source, as fractions of its width and height. */\n crop: { x: plan.crop.x / plan.srcWidth, y: plan.crop.y / plan.srcHeight, w: plan.crop.w / plan.srcWidth, h: plan.crop.h / plan.srcHeight },\n backend,\n ms,\n /** Distinct colours actually used in the image. */\n usedColors() { return uniqueColors(this); },\n toImageData() { return new ImageData(new Uint8ClampedArray(this.data), this.width, this.height); },\n /** Canvas at `scale` \u00D7 (nearest-neighbour), optional grid lines. */\n toCanvas(scale = 1, opts = {}) { return toCanvas(this, scale, opts); },\n /** PNG bytes (indexed when \u2264 256 colours unless `indexed: false`). */\n toPNG(opts = {}) { return encodePNG(this, opts); },\n async toBlob(opts = {}) { return new Blob([await encodePNG(this, opts)], { type: 'image/png' }); },\n };\n return result;\n}\n\nlet shared = null;\n/** One-shot helper with a shared engine. `pixelate(source, settings)`. */\nexport async function pixelate(source, settings) {\n // classic API: pixelate({ image, width, dither, strength, palette, resolution }) \u2192 canvas\n if (settings === undefined && source && typeof source === 'object' && 'image' in source && 'width' in source) {\n return pixelateClassic(source);\n }\n shared ||= createPixelator();\n return (await shared).process(source, settings);\n}\n\n/** Compatibility with image-to-pixel.js 2.x. Returns a canvas like the old function did. */\nasync function pixelateClassic(opts) {\n const { image, width, dither = 'none', strength = 0, palette = null, resolution = 'original' } = opts;\n let pal = { source: 'none' };\n if (Array.isArray(palette)) pal = { source: 'custom', colors: palette };\n else if (typeof palette === 'string') {\n const { fetchLospec } = await import('./palette/lospec.js');\n const p = await fetchLospec(palette);\n pal = { source: 'custom', colors: p.colors, name: p.name };\n }\n const settings = normalizeSettings({\n size: { width },\n palette: pal,\n dither: { method: LEGACY_DITHER[String(dither).toLowerCase()] || 'none', strength: strength / 100 },\n alpha: { threshold: 0 },\n });\n shared ||= createPixelator();\n const engine = await shared;\n const res = await engine.process(image, settings);\n if (resolution === 'original') {\n const frame = await toFrame(image);\n const c = document.createElement('canvas');\n c.width = frame.width; c.height = frame.height;\n const ctx = c.getContext('2d');\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(res.toCanvas(1), 0, 0, c.width, c.height);\n return c;\n }\n return res.toCanvas(1);\n}\n", "// DOM helpers: canvases and downloads.\n\nimport { upscale } from './scale.js';\n\n/** RGBA image \u2192 <canvas>, upscaled by an integer factor with optional grid lines. */\nexport function toCanvas(img, scale = 1, opts = {}) {\n const up = scale > 1 || opts.grid ? upscale(img, scale, opts) : img;\n const c = opts.canvas || document.createElement('canvas');\n c.width = up.width; c.height = up.height;\n c.getContext('2d').putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\n return c;\n}\n\n/** Trigger a browser download for a Blob or bytes. */\nexport function downloadBlob(data, filename, type = 'application/octet-stream') {\n const blob = data instanceof Blob ? data : new Blob([data], { type });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename; a.rel = 'noopener';\n document.body.appendChild(a); a.click(); a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 10000);\n}\n", "// CRC-32 (IEEE), shared by the PNG and zip writers.\nlet table = null;\nexport function crc32(bytes, crc = 0) {\n if (!table) {\n table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[n] = c >>> 0;\n }\n }\n crc = ~crc >>> 0;\n for (let i = 0; i < bytes.length; i++) crc = table[(crc ^ bytes[i]) & 255] ^ (crc >>> 8);\n return ~crc >>> 0;\n}\n", "// Minimal PNG encoder: indexed (colour type 3, with tRNS) when the image has \u2264 256 colours,\n// otherwise RGBA. Uses CompressionStream('deflate'), so it works in browsers and in Node 18+.\n\nimport { crc32 } from './crc32.js';\nimport { upscale, resizeNearest } from './scale.js';\n\nconst SIG = [137, 80, 78, 71, 13, 10, 26, 10];\n\nasync function deflate(bytes) {\n if (typeof CompressionStream === 'function') {\n const cs = new CompressionStream('deflate');\n const stream = new Blob([bytes]).stream().pipeThrough(cs);\n return new Uint8Array(await new Response(stream).arrayBuffer());\n }\n const { deflateSync } = await import('node:zlib');\n return new Uint8Array(deflateSync(bytes));\n}\n\nfunction chunk(type, data) {\n const out = new Uint8Array(12 + data.length);\n const dv = new DataView(out.buffer);\n dv.setUint32(0, data.length);\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i);\n out.set(data, 8);\n dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));\n return out;\n}\n\n/** Map pixels to palette indices. Returns null when there are more than 256 colours. */\nexport function indexImage(img) {\n const d = img.data, n = img.width * img.height;\n const map = new Map(), colors = [], idx = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n const o = i * 4;\n const k = d[o + 3] === 0 ? -1 : ((d[o] << 24) | (d[o + 1] << 16) | (d[o + 2] << 8) | d[o + 3]) >>> 0;\n let v = map.get(k);\n if (v === undefined) {\n if (colors.length === 256) return null;\n v = colors.length; map.set(k, v);\n colors.push(k === -1 ? [0, 0, 0, 0] : [d[o], d[o + 1], d[o + 2], d[o + 3]]);\n }\n idx[i] = v;\n }\n return { colors, indices: idx };\n}\n\n/**\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\n * @param {{ scale?: number, grid?: boolean, gridColor?: string, indexed?: boolean, width?: number, height?: number }} [opts]\n * width/height: resize to exactly this size (nearest neighbour) instead of scaling\n * @returns {Promise<Uint8Array>}\n */\nexport async function encodePNG(img, opts = {}) {\n if (opts.width && opts.height) img = resizeNearest(img, opts.width, opts.height);\n else if ((opts.scale && opts.scale > 1) || opts.grid) img = upscale(img, opts.scale || 1, opts);\n const { width: w, height: h } = img;\n const ix = opts.indexed === false ? null : indexImage(img);\n const ihdr = new Uint8Array(13);\n const dv = new DataView(ihdr.buffer);\n dv.setUint32(0, w); dv.setUint32(4, h);\n const parts = [new Uint8Array(SIG)];\n let raw;\n if (ix) {\n const bits = ix.colors.length <= 2 ? 1 : ix.colors.length <= 4 ? 2 : ix.colors.length <= 16 ? 4 : 8;\n ihdr.set([bits, 3, 0, 0, 0], 8);\n const stride = Math.ceil(w * bits / 8);\n raw = new Uint8Array((stride + 1) * h);\n for (let y = 0; y < h; y++) {\n const row = y * (stride + 1) + 1;\n for (let x = 0; x < w; x++) {\n const v = ix.indices[y * w + x];\n const bit = x * bits;\n raw[row + (bit >> 3)] |= v << (8 - bits - (bit & 7));\n }\n }\n parts.push(chunk('IHDR', ihdr));\n parts.push(chunk('PLTE', Uint8Array.from(ix.colors.flatMap(c => c.slice(0, 3)))));\n if (ix.colors.some(c => c[3] < 255)) {\n let last = ix.colors.length; while (last > 0 && ix.colors[last - 1][3] === 255) last--;\n parts.push(chunk('tRNS', Uint8Array.from(ix.colors.slice(0, last).map(c => c[3]))));\n }\n } else {\n ihdr.set([8, 6, 0, 0, 0], 8);\n raw = new Uint8Array((w * 4 + 1) * h);\n for (let y = 0; y < h; y++) raw.set(img.data.subarray ? img.data.subarray(y * w * 4, (y + 1) * w * 4) : Array.prototype.slice.call(img.data, y * w * 4, (y + 1) * w * 4), y * (w * 4 + 1) + 1);\n parts.push(chunk('IHDR', ihdr));\n }\n parts.push(chunk('IDAT', await deflate(raw)));\n parts.push(chunk('IEND', new Uint8Array(0)));\n const total = parts.reduce((s, p) => s + p.length, 0);\n const out = new Uint8Array(total);\n let o = 0; for (const p of parts) { out.set(p, o); o += p.length; }\n return out;\n}\n", "// The editor UI. mountEditor(element) builds the whole app inside `element`.\n// The core engine (lib/core) has no idea this file exists.\n\nimport { createPixelator } from '../core/engine.js';\nimport { defaultSettings, decodeSettings, encodeSettings, settingsToJSON, settingsFromJSON, mergeSettings } from '../core/settings.js';\nimport { parsePalette, toGPL, toHexFile, toPaletteJSON } from '../core/palette/parse.js';\nimport { fetchLospec } from '../core/palette/lospec.js';\nimport { detectGrid } from '../core/export/scale.js';\nimport { toHex } from '../core/color.js';\nimport { estimateFps, videoReady, seekTo, sniffVideoCodec } from '../core/video/frames.js';\nimport { downloadBlob } from '../core/export/canvas.js';\nimport { PRESETS } from '../core/presets.js';\nimport { h, render, pickFiles } from './dom.js';\nimport { icon } from './icons.js';\nimport { createStore } from './store.js';\nimport { createStage } from './stage.js';\nimport { createInspector } from './inspector.js';\nimport { createLibrary, fmtTime } from './library.js';\nimport { createExporter } from './exporter.js';\nimport { toast, menu, closeMenu, dialog } from './ui.js';\nimport { SAMPLES, loadSample, sampleURL } from './samples.js';\nimport * as persist from './persist.js';\n\nconst IMAGE_TYPES = /^image\\//;\nconst VIDEO_TYPES = /^video\\//;\nconst PALETTE_EXT = /\\.(gpl|hex|pal|txt|json)$/i;\n\n/**\n * Mount the editor.\n * @param {HTMLElement} root\n * @param {{ settings?: object, persist?: boolean, samples?: boolean, homeHref?: string, docsHref?: string }} [options]\n */\nexport async function mountEditor(root, options = {}) {\n const usePersist = options.persist !== false;\n const narrow = () => matchMedia('(max-width: 900px)').matches;\n\n // ---- initial settings: share link > saved > defaults\n let initial = options.settings || (usePersist && persist.load('settings', null)) || defaultSettings();\n if (/[#&]s=/.test(location.hash)) {\n try { initial = decodeSettings(location.hash); } catch { toast('That share link could not be read; using your last settings', { kind: 'error' }); }\n }\n const store = createStore(initial);\n\n const app = {\n store,\n engine: null,\n items: [],\n current: null,\n result: null,\n exporting: false,\n activePreset: null,\n userPalettes: usePersist ? persist.load('palettes', []) : [],\n /** Settings shared by every file that doesn't have its own. */\n shared: store.settings,\n /** Settings copied with \"Copy settings\", ready to paste onto another file. */\n clipboard: null,\n videoSupport: { mp4: false, webm: false },\n toast: (m, o) => toast(m, o),\n };\n\n // ================================================================ layout\n const stage = createStage({ onPick: pickAt, onViewChange: () => updateZoomLabel() });\n const inspector = createInspector(app);\n const library = createLibrary(app);\n const exporter = createExporter(app);\n\n const btn = (ic, label, onclick, extra = {}) => h('button.itp-btn.icon', { type: 'button', 'aria-label': label, title: label, html: icon(ic), onclick, ...extra });\n\n const fileName = h('span.name', { text: 'No image' });\n const fileMeta = h('span.meta.num', {});\n const undoBtn = btn('undo', 'Undo (Ctrl+Z)', () => store.undo());\n const redoBtn = btn('redo', 'Redo (Ctrl+Shift+Z)', () => store.redo());\n const compareBtn = btn('compare', 'Compare with original (C)', () => toggleCompare(), { 'aria-pressed': 'false' });\n const gridBtn = btn('grid', 'Pixel grid (G)', () => toggleGrid(), { 'aria-pressed': 'false' });\n const zoomBtn = h('button.itp-btn.itp-zoom.num', { type: 'button', 'aria-label': 'Zoom', 'aria-haspopup': 'menu', html: `<span>Fit</span>${icon('chevronDown')}`, onclick: e => zoomMenu(e.currentTarget) });\n const themeBtn = btn('moon', 'Toggle theme (T)', () => toggleTheme());\n const libBtn = btn('sidebarLeft', 'Toggle library (\\\\)', () => togglePanel('lib'));\n const inspBtn = btn('sidebarRight', 'Toggle inspector (/)', () => togglePanel('insp'));\n const helpBtn = btn('keyboard', 'Keyboard shortcuts (?)', () => showHelp());\n const exportBtn = h('button.itp-btn.primary', { type: 'button', 'aria-haspopup': 'menu', html: `${icon('download')}<span>Export</span>`, onclick: e => exportMenu(e.currentTarget) });\n const brand = h('a.itp-brand', { href: options.homeHref || '#', title: 'Image-to-Pixel' }, h('span.itp-mark', { 'aria-hidden': 'true' }, ...Array.from({ length: 9 }, () => h('i'))), h('span.hide-sm', { text: 'Image-to-Pixel' }));\n if (!options.homeHref) brand.addEventListener('click', e => e.preventDefault());\n\n const top = h('header.itp-top', {},\n libBtn, brand, h('span.sep.hide-sm'),\n h('div.itp-file', {}, fileName, fileMeta),\n h('div.spacer'),\n h('span.hide-sm.contents', {}, undoBtn, redoBtn, h('span.sep')),\n compareBtn, gridBtn, zoomBtn,\n h('span.sep.hide-sm'), h('span.hide-sm.contents', {}, themeBtn, helpBtn), inspBtn,\n h('span', { style: { width: '6px' } }), exportBtn);\n\n // stage extras\n const sampleButtons = options.samples === false ? null : h('div.samples', {}, ...SAMPLES.map(s => h('button', { type: 'button', title: `Try \"${s.name}\"`, 'aria-label': `Open sample: ${s.name}`, onclick: () => openSample(s) }, h('img', { src: sampleURL(s), alt: '' }))));\n const empty = h('div.itp-empty', {}, h('div.itp-drop', {},\n h('h2', { text: 'Drop an image or a video' }),\n h('p', { text: 'PNG, JPG, WebP, GIF, SVG, MP4 or WebM. Add several files to process them as a batch. You can also paste with Ctrl+V.' }),\n h('div.actions', {},\n h('button.itp-btn.primary', { type: 'button', html: `${icon('upload')}<span>Choose files</span>`, onclick: () => openFiles() }),\n h('button.itp-btn.outline', { type: 'button', html: `${icon('clipboard')}<span>Paste</span>`, onclick: () => pasteFromClipboard() })),\n sampleButtons ? h('p', { style: { fontSize: 'var(--fs-xs)', color: 'var(--faint)' }, text: 'Or start from a sample' }) : null,\n sampleButtons));\n const status = h('div.itp-float.bl', { 'aria-live': 'polite' });\n const busy = h('div.itp-busy.itp-float', { hidden: true, style: { padding: '6px 10px', alignItems: 'center', gap: '8px', fontSize: 'var(--fs-xs)', color: 'var(--muted)', display: 'flex' } }, h('span.itp-spinner'), h('span', { text: 'Rendering' }));\n const viewTools = h('div.itp-float.br', {},\n btn('zoomOut', 'Zoom out (-)', () => stage.zoomOut()),\n btn('fit', 'Fit to view (F)', () => stage.fit()),\n btn('zoomIn', 'Zoom in (+)', () => stage.zoomIn()));\n stage.el.append(empty, status, busy, viewTools);\n\n // transport\n const playBtn = btn('play', 'Play (Space)', () => togglePlay());\n const timeLabel = h('span.itp-time', {});\n const scrub = h('input.itp-scrub', { type: 'range', min: 0, max: 1000, value: 0, 'aria-label': 'Video position' });\n const fpsLabel = h('span.muted.num', { style: { fontSize: 'var(--fs-xs)', whiteSpace: 'nowrap' } });\n const transport = h('div.itp-transport', { role: 'group', 'aria-label': 'Video' },\n btn('stepBack', 'Previous frame (,)', () => stepFrame(-1)), playBtn, btn('stepForward', 'Next frame (.)', () => stepFrame(1)),\n timeLabel, scrub, fpsLabel);\n const stageWrap = h('main.itp-stage', { 'data-video': 'false' }, stage.el, transport);\n\n // on narrow screens the library is a drawer: a tap on the canvas closes it\n stageWrap.addEventListener('pointerdown', () => { if (narrow() && shell.dataset.lib === 'open') togglePanel('lib'); }, true);\n const shell = h('div.itp.itp-app', { 'data-lib': narrow() ? 'closed' : persist.load('lib', 'open'), 'data-insp': persist.load('insp', 'open') }, top, library.el, stageWrap, inspector.el);\n render(root, shell);\n applyTheme(persist.load('theme', null));\n\n // ================================================================ engine\n status.textContent = 'Starting\u2026';\n try {\n app.engine = await createPixelator();\n } catch (e) {\n toast(`Could not start: ${e.message}`, { kind: 'error' });\n throw e;\n }\n inspector.el.querySelector('#itp-backend').textContent = app.engine.backend === 'webgl' ? 'GPU \u00B7 ShaderMate' : 'CPU';\n inspector.el.querySelector('#itp-backend').title = app.engine.backend === 'webgl' ? `WebGL 2: ${app.engine.renderer}` : (app.engine.fallbackReason || 'CPU renderer');\n import('../video.js').then(m => m.videoSupport()).then(v => { app.videoSupport = v; }).catch(() => { });\n\n // ================================================================ rendering\n let dirty = false, running = false, lastSource = null;\n const outCanvas = document.createElement('canvas');\n\n function schedule() {\n dirty = true;\n if (!running) requestAnimationFrame(run);\n }\n app.schedule = schedule;\n\n async function run() {\n if (running || !dirty) return;\n if (app.exporting) return;\n dirty = false;\n const item = app.current;\n if (!item) { app.result = null; stage.clear(); updateStatus(); return; }\n running = true;\n const slow = setTimeout(() => { busy.hidden = false; }, 250);\n try {\n if (item.type === 'video') app.engine.invalidate();\n const res = await app.engine.process(item.source, store.settings);\n if (item !== app.current) return;\n app.result = res;\n res.toCanvas(1, { canvas: outCanvas });\n stage.show(outCanvas, item.source, res.crop);\n inspector.setStats(res);\n inspector.sync(store.settings, res);\n if (lastSource !== item) { lastSource = item; }\n updateStatus();\n } catch (e) {\n console.error(e);\n toast(`Rendering failed: ${e.message}`, { kind: 'error' });\n } finally {\n clearTimeout(slow); busy.hidden = true;\n running = false;\n if (dirty) requestAnimationFrame(run);\n }\n }\n\n function updateStatus() {\n const r = app.result, it = app.current;\n fileName.textContent = it ? it.name : 'No image';\n fileMeta.textContent = it ? (it.type === 'video' ? `${it.width} \u00D7 ${it.height}, ${fmtTime(it.duration)}` : `${it.width} \u00D7 ${it.height}`) : '';\n empty.hidden = !!it;\n viewTools.hidden = !it;\n if (!it || !r) { status.hidden = true; return; }\n status.hidden = false;\n render(status, h('span', {}, h('b', { text: `${r.width} \u00D7 ${r.height}` }), ' px'), h('span', { text: `${Math.round(stage.zoom * 100) / 100}\u00D7 zoom` }));\n undoBtn.disabled = !store.canUndo; redoBtn.disabled = !store.canRedo;\n }\n function updateZoomLabel() {\n zoomBtn.querySelector('span').textContent = !app.current || stage.fitted ? 'Fit' : stage.zoom >= 1 ? `${Math.round(stage.zoom * 10) / 10}\u00D7` : `${Math.round(stage.zoom * 100)}%`;\n if (app.result) updateStatus();\n }\n\n store.subscribe((s, why) => {\n // write the edit back to whatever is being edited: this file's own settings, or the shared ones\n const cur = app.current;\n if (cur && cur.own && store.target === cur.id) cur.own = s;\n else if (store.target === 'shared') app.shared = s;\n inspector.sync(s, app.result);\n undoBtn.disabled = !store.canUndo; redoBtn.disabled = !store.canRedo;\n if (why !== 'preset') app.activePreset = null;\n if (usePersist) saveSoon();\n if (library.tab === 'palettes') library.refresh();\n schedule();\n });\n let saveT = null;\n const saveSoon = () => { clearTimeout(saveT); saveT = setTimeout(() => persist.save('settings', app.shared), 300); };\n\n // ================================================================ files\n async function makeThumb(drawable, w, hgt) {\n const c = document.createElement('canvas');\n const k = 72 / Math.max(w, hgt);\n c.width = Math.max(1, Math.round(w * k)); c.height = Math.max(1, Math.round(hgt * k));\n try { c.getContext('2d').drawImage(drawable, 0, 0, c.width, c.height); } catch { /* not ready */ }\n return c.toDataURL();\n }\n\n async function addImage(name, drawable, file = null) {\n const w = drawable.naturalWidth || drawable.width, hh = drawable.naturalHeight || drawable.height;\n const item = { id: crypto.randomUUID?.() || String(Math.random()), name, type: 'image', source: drawable, width: w, height: hh, file };\n item.thumb = await makeThumb(drawable, w, hh);\n app.items.push(item);\n return item;\n }\n\n async function addVideo(name, file) {\n const video = h('video', { muted: true, playsInline: true, loop: true, preload: 'auto', crossOrigin: 'anonymous' });\n video.muted = true;\n video.src = URL.createObjectURL(file);\n try {\n await videoReady(video);\n } catch (e) {\n URL.revokeObjectURL(video.src);\n if (e.code === 3 || e.code === 4) {\n const codec = await sniffVideoCodec(file).catch(() => '');\n const alt = codec === 'H.264' ? 'WebM (VP9)' : codec === 'VP9' ? 'H.264 MP4' : 'H.264 MP4 or WebM (VP9)';\n const err = new Error(codec\n ? `it's ${codec}, which this browser can't play. Re-save it as ${alt}, or open the editor in a browser that plays ${codec}.`\n : `this browser can't play this video's format. Re-save it as ${alt}.`);\n err.code = e.code;\n throw err;\n }\n throw e;\n }\n const item = { id: crypto.randomUUID?.() || String(Math.random()), name, type: 'video', source: video, width: video.videoWidth, height: video.videoHeight, duration: video.duration, fps: 30, file };\n await seekTo(video, Math.min(0.05, video.duration / 2)).catch(() => { });\n item.thumb = await makeThumb(video, item.width, item.height);\n app.items.push(item);\n estimateFps(video, 30).then(f => { item.fps = f; if (app.current === item) updateTransport(); inspector.syncAnim(); });\n video.addEventListener('timeupdate', () => { if (app.current === item) updateTransport(); });\n video.addEventListener('play', () => { if (app.current === item) { updateTransport(); pumpVideo(item); } });\n video.addEventListener('pause', () => { if (app.current === item) { updateTransport(); schedule(); } });\n video.addEventListener('seeked', () => { if (app.current === item && !app.exporting) schedule(); });\n return item;\n }\n\n async function addFiles(files) {\n const media = [], palettes = [], settingsFiles = [];\n for (const f of files) {\n if (PALETTE_EXT.test(f.name) && !/^image|^video/.test(f.type)) {\n if (/\\.json$/i.test(f.name)) settingsFiles.push(f); else palettes.push(f);\n } else if (IMAGE_TYPES.test(f.type) || VIDEO_TYPES.test(f.type) || /\\.(png|jpe?g|gif|webp|bmp|svg|avif|mp4|webm|mov)$/i.test(f.name)) media.push(f);\n }\n for (const f of palettes) await importPaletteFile(f);\n for (const f of settingsFiles) {\n const text = await f.text();\n try {\n const obj = JSON.parse(text);\n if (obj.colors || Array.isArray(obj)) await importPaletteFile(f, text);\n else { store.replace(settingsFromJSON(obj)); toast(`Loaded settings from ${f.name}`, { kind: 'ok' }); }\n } catch (e) { toast(`${f.name}: ${e.message}`, { kind: 'error' }); }\n }\n let first = null;\n const t = media.length > 2 ? toast(`Loading ${media.length} files`, { progress: true }) : null;\n for (let i = 0; i < media.length; i++) {\n const f = media[i];\n try {\n let item;\n if (VIDEO_TYPES.test(f.type) || /\\.(mp4|webm|mov)$/i.test(f.name)) item = await addVideo(f.name, f);\n else {\n let drawable;\n try { drawable = await createImageBitmap(f); } catch {\n drawable = new Image(); drawable.src = URL.createObjectURL(f); await drawable.decode();\n }\n item = await addImage(f.name, drawable, f);\n }\n first ||= item;\n } catch (e) { toast(`${f.name} could not be opened: ${e.message}`, { kind: 'error' }); }\n t?.progress((i + 1) / media.length);\n }\n t?.close();\n if (first) select(first);\n library.refresh();\n if (media.length > 1) toast(`Added ${media.length} files. They share one set of settings.`, { kind: 'ok' });\n }\n app.addFiles = addFiles;\n\n async function openFiles() {\n const files = await pickFiles({ accept: 'image/*,video/*,.gpl,.hex,.pal,.txt,.json', multiple: true });\n if (files.length) addFiles(files);\n }\n app.openFiles = openFiles;\n\n async function openSample(s) {\n const img = await loadSample(s);\n const item = await addImage(`${s.name}.svg`, img);\n select(item);\n library.refresh();\n }\n\n async function pasteFromClipboard() {\n try {\n const items = await navigator.clipboard.read();\n const files = [];\n for (const it of items) for (const type of it.types) if (IMAGE_TYPES.test(type)) {\n const b = await it.getType(type);\n files.push(new File([b], `pasted-${new Date().toISOString().slice(11, 19).replace(/:/g, '')}.${type.split('/')[1]}`, { type }));\n }\n if (files.length) addFiles(files); else toast('The clipboard has no image', { kind: 'error' });\n } catch {\n toast('Press Ctrl+V (\u2318V) to paste. The browser blocked direct clipboard access.');\n }\n }\n app.pasteFromClipboard = pasteFromClipboard;\n\n function select(item) {\n if (app.current && app.current.type === 'video' && app.current !== item) app.current.source.pause();\n app.current = item;\n editTarget(item);\n stageWrap.dataset.video = String(item && item.type === 'video');\n if (item && item.type === 'video') updateTransport();\n stage.clear();\n app.result = null;\n if (stage.picking) togglePicker();\n library.refresh();\n library.sourceChanged();\n schedule();\n updateStatus();\n }\n app.select = select;\n\n function removeItem(item) {\n const i = app.items.indexOf(item);\n if (i < 0) return;\n app.items.splice(i, 1);\n store.dropTarget(item.id);\n if (item.type === 'video') { item.source.pause(); URL.revokeObjectURL(item.source.src); }\n if (item.source.close && !app.items.some(i => i.source === item.source)) item.source.close(); // duplicates share a bitmap\n if (app.current === item) select(app.items[Math.min(i, app.items.length - 1)] || null);\n library.refresh();\n inspector.sync(store.settings, app.result);\n }\n app.removeItem = removeItem;\n app.clearItems = () => { for (const it of app.items.slice()) removeItem(it); };\n\n // ================================================================ per-file settings\n /** The settings a file renders with. */\n const settingsFor = item => (item === app.current ? store.settings : (item && item.own) || app.shared);\n app.settingsFor = settingsFor;\n const clone = v => JSON.parse(JSON.stringify(v));\n\n /** Point the store at the right settings for this file (its own, or the shared ones). */\n function editTarget(item, force = false) {\n const key = item && item.own ? item.id : 'shared';\n if (store.target === key && !force) return;\n store.setTarget(key, key === 'shared' ? app.shared : item.own);\n }\n\n /** Give a file its own settings (a copy of what it uses now), or link it back to the shared ones. */\n function setOwn(item, own, { quiet = false } = {}) {\n if (!item || !!item.own === own) return;\n if (own) {\n item.own = clone(settingsFor(item));\n if (item === app.current) editTarget(item);\n if (!quiet) toast(`${item.name} now has its own settings. Changes no longer affect other files.`);\n } else {\n const was = item.own;\n item.own = null;\n store.dropTarget(item.id);\n if (item === app.current) editTarget(item);\n if (!quiet) toast(`${item.name} uses the shared settings again`, { action: { label: 'Undo', onClick: () => { item.own = was; if (item === app.current) editTarget(item); afterScopeChange(); } } });\n }\n afterScopeChange();\n }\n function afterScopeChange() {\n library.refresh();\n inspector.sync(store.settings, app.result);\n if (app.result) inspector.setStats(app.result);\n schedule();\n }\n app.setOwn = setOwn;\n\n app.copySettings = item => {\n app.clipboard = clone(settingsFor(item));\n toast(`Copied the settings of ${item.name}`, { timeout: 1800 });\n library.refresh();\n };\n app.pasteSettings = item => {\n if (!app.clipboard) return;\n if (!item.own) setOwn(item, true, { quiet: true });\n if (item === app.current) store.replace(app.clipboard, 'paste');\n else item.own = clone(app.clipboard);\n toast(`Pasted settings onto ${item.name}`, { kind: 'ok', timeout: 1800 });\n afterScopeChange();\n };\n /** Make this file's settings the shared ones, and link every file to them. */\n app.applyToAll = item => {\n const snapshot = { shared: app.shared, own: new Map(app.items.map(i => [i, i.own])) };\n app.shared = clone(settingsFor(item));\n for (const it of app.items) { if (it.own) store.dropTarget(it.id); it.own = null; }\n store.setTarget('shared', app.shared);\n if (usePersist) saveSoon();\n toast(`Every file now uses the settings of ${item.name}`, {\n action: { label: 'Undo', onClick: () => {\n app.shared = snapshot.shared;\n for (const [it, own] of snapshot.own) it.own = own;\n editTarget(app.current, true);\n afterScopeChange();\n } },\n });\n afterScopeChange();\n };\n /** A second copy of a file with its own settings, for comparing two looks. */\n app.duplicate = async item => {\n let copy;\n if (item.type === 'video') copy = await addVideo(nameCopy(item.name), item.file);\n else copy = await addImage(nameCopy(item.name), item.source, item.file);\n // place it right after the original\n app.items.splice(app.items.indexOf(copy), 1);\n app.items.splice(app.items.indexOf(item) + 1, 0, copy);\n copy.own = clone(settingsFor(item));\n select(copy);\n toast(`Duplicated ${item.name}. The copy has its own settings.`, { timeout: 2400 });\n };\n const nameCopy = name => { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); return `${m[1]} copy${m[2] || ''}`; };\n app.move = (item, dir) => {\n const i = app.items.indexOf(item), j = i + dir;\n if (i < 0 || j < 0 || j >= app.items.length) return;\n [app.items[i], app.items[j]] = [app.items[j], app.items[i]];\n library.refresh();\n if (document.activeElement === document.body || document.activeElement?.closest?.('.itp-files')) library.focusFile(item);\n };\n\n // ================================================================ video\n function updateTransport() {\n const it = app.current;\n if (!it || it.type !== 'video') return;\n const v = it.source;\n playBtn.innerHTML = icon(v.paused ? 'play' : 'pause');\n playBtn.setAttribute('aria-label', v.paused ? 'Play (Space)' : 'Pause (Space)');\n const frame = Math.floor(v.currentTime * it.fps + 1e-6);\n timeLabel.innerHTML = `${fmtTime(v.currentTime)} <span>/ ${fmtTime(v.duration)}</span>`;\n timeLabel.title = `Frame ${frame}`;\n scrub.value = String(Math.round(v.currentTime / (v.duration || 1) * 1000));\n scrub.style.setProperty('--p', `${scrub.value / 10}%`);\n fpsLabel.textContent = `${it.fps} fps`;\n }\n function pumpVideo(item) {\n const v = item.source;\n const tick = () => {\n if (v.paused || app.current !== item) return;\n schedule();\n if ('requestVideoFrameCallback' in v) v.requestVideoFrameCallback(tick); else requestAnimationFrame(tick);\n };\n tick();\n }\n function togglePlay() {\n const it = app.current;\n if (!it || it.type !== 'video') return;\n if (it.source.paused) it.source.play().catch(e => toast(e.message, { kind: 'error' })); else it.source.pause();\n }\n function stepFrame(dir) {\n const it = app.current;\n if (!it || it.type !== 'video') return;\n const v = it.source; v.pause();\n const frame = Math.floor(v.currentTime * it.fps + 1e-6) + dir;\n seekTo(v, (Math.max(0, frame) + 0.5) / it.fps).then(() => { updateTransport(); schedule(); });\n }\n scrub.addEventListener('input', () => {\n const it = app.current; if (!it || it.type !== 'video') return;\n it.source.currentTime = scrub.value / 1000 * it.source.duration;\n });\n\n // ================================================================ view\n function toggleCompare(force) {\n const on = force ?? !stage.compare;\n stage.setCompare(on); compareBtn.setAttribute('aria-pressed', String(on));\n }\n function toggleGrid(force) {\n const on = force ?? !stage.grid;\n stage.setGrid(on); gridBtn.setAttribute('aria-pressed', String(on));\n if (on && stage.zoom < 6 && app.result) toast('The grid shows from 6\u00D7 zoom');\n }\n function zoomMenu(anchor) {\n menu(anchor, [\n { label: 'Fit to view', kbd: 'F', icon: 'fit', onClick: () => stage.fit() },\n 'sep',\n ...[1, 2, 4, 8, 16, 32].map(z => ({ label: `${z}\u00D7`, sub: z === 1 ? 'One screen pixel per pixel' : null, onClick: () => stage.zoomTo(z) })),\n 'sep',\n { label: 'Zoom in', kbd: '+', icon: 'zoomIn', onClick: () => stage.zoomIn() },\n { label: 'Zoom out', kbd: '-', icon: 'zoomOut', onClick: () => stage.zoomOut() },\n ]);\n }\n function togglePanel(which) {\n const key = which === 'lib' ? 'lib' : 'insp';\n const open = shell.dataset[key] !== 'open';\n shell.dataset[key] = open ? 'open' : 'closed';\n if (!narrow() || which === 'insp') persist.save(key, shell.dataset[key]);\n requestAnimationFrame(() => stage.resize());\n }\n function applyTheme(t) {\n if (t) document.documentElement.dataset.theme = t; else delete document.documentElement.dataset.theme;\n const dark = t ? t === 'dark' : !matchMedia('(prefers-color-scheme: light)').matches;\n themeBtn.innerHTML = icon(dark ? 'sun' : 'moon');\n themeBtn.setAttribute('aria-label', dark ? 'Switch to light theme (T)' : 'Switch to dark theme (T)');\n stage.redraw();\n }\n function toggleTheme() {\n const cur = document.documentElement.dataset.theme || (matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');\n const next = cur === 'dark' ? 'light' : 'dark';\n persist.save('theme', next);\n applyTheme(next);\n }\n\n // ================================================================ palettes\n function pixelsOf(item, maxSize = 4096) {\n const w = item.width, hh = item.height, k = Math.min(1, maxSize / Math.max(w, hh));\n const c = document.createElement('canvas'); c.width = Math.round(w * k); c.height = Math.round(hh * k);\n const ctx = c.getContext('2d', { willReadFrequently: true });\n ctx.drawImage(item.source, 0, 0, c.width, c.height);\n return ctx.getImageData(0, 0, c.width, c.height);\n }\n function pickAt(u, v) {\n const it = app.current; if (!it) return;\n const img = pixelsOf(it, 1024);\n const c = app.result ? app.result.crop : { x: 0, y: 0, w: 1, h: 1 };\n const x = Math.min(img.width - 1, Math.floor((c.x + u * c.w) * img.width)), y = Math.min(img.height - 1, Math.floor((c.y + v * c.h) * img.height));\n const o = (y * img.width + x) * 4;\n const hex = toHex([img.data[o], img.data[o + 1], img.data[o + 2]]);\n const s = store.settings;\n const colors = s.palette.source === 'custom' ? s.palette.colors : [];\n if (colors.includes(hex)) return toast(`${hex} is already in the palette`);\n store.update({ palette: { source: 'custom', name: s.palette.source === 'custom' ? s.palette.name : 'Picked', colors: [...colors, hex] } });\n toast(`Added ${hex}`, { kind: 'ok', timeout: 1500 });\n }\n let pickerBtn = null;\n function togglePicker(button) {\n if (button) pickerBtn = button;\n const on = !stage.picking;\n stage.setPicking(on);\n pickerBtn?.setAttribute('aria-pressed', String(on));\n if (on) {\n toggleCompare(true);\n toast('Click the image to add colours. Press Esc when done.');\n }\n }\n app.togglePicker = togglePicker;\n\n function usePalette(p) {\n if (p.id && !p.custom) store.update({ palette: { source: 'builtin', id: p.id } });\n else store.update({ palette: { source: 'custom', name: p.name, colors: p.colors } });\n }\n app.usePalette = usePalette;\n\n function rememberPalette(name, colors) {\n const list = app.userPalettes.filter(p => p.name !== name);\n list.unshift({ name, colors, custom: true });\n app.userPalettes = list.slice(0, 100);\n if (usePersist) persist.save('palettes', app.userPalettes);\n if (library.tab === 'palettes') library.refresh();\n }\n async function importPaletteFile(file, text) {\n try {\n const p = parsePalette(text ?? await file.text(), file.name);\n rememberPalette(p.name || 'Imported', p.colors);\n store.update({ palette: { source: 'custom', name: p.name || 'Imported', colors: p.colors } });\n toast(`Imported \"${p.name}\" (${p.colors.length} colours)`, { kind: 'ok' });\n } catch (e) { toast(`${file.name}: ${e.message}`, { kind: 'error' }); }\n }\n app.importPalette = async () => {\n const [f] = await pickFiles({ accept: '.gpl,.hex,.pal,.txt,.json' });\n if (f) importPaletteFile(f);\n };\n app.savePalette = () => {\n const s = store.settings;\n const colors = s.palette.source === 'extract' ? (app.result?.palette || []) : s.palette.colors;\n if (!colors.length) return toast('There is no palette to save', { kind: 'error' });\n const input = h('input.itp-input', { value: s.palette.source === 'custom' ? s.palette.name : `${s.palette.name} copy`, 'aria-label': 'Palette name' });\n const fmt = h('select.itp-select', { 'aria-label': 'Also download as' }, h('option', { value: '', text: \"Don't download\" }), h('option', { value: 'gpl', text: '.gpl (GIMP, Aseprite)' }), h('option', { value: 'hex', text: '.hex (Lospec)' }), h('option', { value: 'json', text: '.json' }));\n dialog('Save palette', [h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Name' })), input), h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Also download as' })), fmt),\n h('div.itp-strip', { style: { height: '18px' } }, ...colors.map(c => h('i', { style: { background: c } })))], {\n actions: [{ label: 'Cancel' }, { label: 'Save', primary: true, onClick: () => {\n const name = input.value.trim() || 'Palette';\n rememberPalette(name, colors);\n store.update({ palette: { source: 'custom', name, colors } });\n const slug = name.replace(/[^\\w-]+/g, '-').toLowerCase();\n if (fmt.value === 'gpl') downloadBlob(toGPL(name, colors), `${slug}.gpl`, 'text/plain');\n if (fmt.value === 'hex') downloadBlob(toHexFile(colors), `${slug}.hex`, 'text/plain');\n if (fmt.value === 'json') downloadBlob(toPaletteJSON(name, colors), `${slug}.json`, 'application/json');\n toast(`Saved \"${name}\" to Your palettes`, { kind: 'ok' });\n } }],\n });\n input.select();\n };\n app.deletePalette = p => {\n app.userPalettes = app.userPalettes.filter(x => x !== p);\n if (usePersist) persist.save('palettes', app.userPalettes);\n library.refresh();\n toast(`Deleted \"${p.name}\"`, { action: { label: 'Undo', onClick: () => rememberPalette(p.name, p.colors) } });\n };\n app.lospecDialog = () => {\n const input = h('input.itp-input', { placeholder: 'e.g. rgbg-36 or a lospec.com palette URL', 'aria-label': 'Lospec slug or URL' });\n const note = h('div.help', { text: 'Looks the palette up on lospec.com. Needs an internet connection.' });\n const d = dialog('Palette from Lospec', [h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Slug or URL' })), input, note)], {\n actions: [{ label: 'Cancel' }, { label: 'Fetch', primary: true, onClick: async () => {\n note.textContent = 'Fetching\u2026'; note.style.color = '';\n try {\n const p = await fetchLospec(input.value);\n rememberPalette(p.name, p.colors);\n store.update({ palette: { source: 'custom', name: p.name, colors: p.colors } });\n toast(`Loaded \"${p.name}\" from Lospec`, { kind: 'ok' });\n return true;\n } catch (e) { note.textContent = e.message; note.style.color = 'var(--danger)'; return false; }\n } }],\n });\n input.addEventListener('keydown', e => { if (e.key === 'Enter') d.querySelector('footer .primary').click(); });\n input.focus();\n };\n\n app.detectGrid = () => {\n const it = app.current; if (!it || it.type !== 'image') return toast('Open an image first', { kind: 'error' });\n const b = detectGrid(pixelsOf(it));\n if (b <= 1) return toast('No pixel grid found. This image doesn\\'t look upscaled.');\n store.update({ size: { mode: 'block', block: b, resample: 'nearest' } });\n toast(`Found ${b} px blocks: switched to pixel size ${b} with nearest sampling`, { kind: 'ok' });\n };\n\n // ================================================================ settings\n app.settingsJSON = () => settingsToJSON(store.settings);\n app.copyLink = async () => {\n const url = `${location.origin}${location.pathname}#s=${encodeSettings(store.settings)}`;\n try { await navigator.clipboard.writeText(url); toast('Link copied. It holds the settings, not the image.', { kind: 'ok' }); }\n catch { dialog('Share link', [h('textarea.itp-input', { rows: 3, readOnly: true, value: url })]); }\n history.replaceState(null, '', `#s=${encodeSettings(store.settings)}`);\n };\n app.saveSettingsFile = () => downloadBlob(settingsToJSON(store.settings), 'image-to-pixel-settings.json', 'application/json');\n app.loadSettingsFile = async () => {\n const [f] = await pickFiles({ accept: '.json,application/json' });\n if (!f) return;\n try { store.replace(settingsFromJSON(await f.text())); toast(`Loaded ${f.name}`, { kind: 'ok' }); } catch (e) { toast(`${f.name}: ${e.message}`, { kind: 'error' }); }\n };\n app.resetSettings = () => { store.replace(defaultSettings()); toast('Settings reset', { action: { label: 'Undo', onClick: () => store.undo() } }); };\n app.applyPreset = p => {\n store.replace(mergeSettings(defaultSettings(), { ...p.settings, export: store.settings.export }), 'preset');\n app.activePreset = p.id;\n library.refresh();\n };\n\n Object.assign(app, exporter);\n\n function exportMenu(anchor) {\n const it = app.current;\n const video = it && it.type === 'video';\n const images = app.items.filter(i => i.type === 'image').length;\n const s = store.settings;\n menu(anchor, [\n { group: 'Image' },\n { label: 'PNG', sub: app.result ? `${app.result.width * s.export.scale} \u00D7 ${app.result.height * s.export.scale}, ${s.export.scale}\u00D7 scale` : 'Open an image first', icon: 'image', kbd: 'Ctrl S', disabled: !app.result, onClick: () => app.exportPNG() },\n { label: 'Copy to clipboard', icon: 'copy', disabled: !app.result, onClick: () => app.copyImage() },\n { label: app.items.length > 1 ? `All ${app.items.length} files as ZIP` : 'All files as ZIP', sub: app.items.length > 1 ? null : 'Add two or more files', icon: 'zip', disabled: app.items.length < 2, onClick: () => app.exportZip() },\n { group: 'Animation' },\n { label: video ? 'GIF from this video' : 'GIF from all images', icon: 'gif', disabled: !video && images < 2, onClick: () => app.exportAnimation({ ...animDefaults(), format: 'gif' }) },\n { label: 'More formats\u2026', sub: 'WebM, MP4, PNG sequence, sprite sheet', icon: 'film', onClick: () => { inspector.setTab('export'); if (shell.dataset.insp !== 'open') togglePanel('insp'); } },\n { group: 'Other' },\n { label: 'Tileset', sub: '16 \u00D7 16 tiles, duplicates removed', icon: 'tiles', disabled: !app.result, onClick: () => app.exportTileset({ tile: 16, flips: false }) },\n { label: 'Copy settings link', icon: 'link', onClick: () => app.copyLink() },\n { label: 'Settings as JSON', icon: 'braces', onClick: () => app.saveSettingsFile() },\n ]);\n }\n const animDefaults = () => {\n const it = app.current;\n const video = it && it.type === 'video';\n return { source: video ? 'video' : 'files', fps: video ? Math.min(30, Math.round(it.fps || 12)) : 8, start: 0, end: video ? it.duration : 0 };\n };\n\n // ================================================================ help\n function showHelp() {\n const keys = [\n ['Open files', 'Ctrl O'], ['Paste image', 'Ctrl V'], ['Export PNG', 'Ctrl S'], ['Undo', 'Ctrl Z'], ['Redo', 'Ctrl Shift Z'],\n ['Compare', 'C'], ['Pixel grid', 'G'], ['Fit', 'F'], ['Zoom in / out', '+ -'], ['Pixel width \u00B11', '[ ]'], ['Pixel width \u00B18', 'Shift [ ]'],\n ['Next / previous dither', 'D Shift D'], ['Play / pause video', 'Space'], ['Step one frame', ', .'], ['Library', '\\\\'], ['Inspector', '/'],\n ['Theme', 'T'], ['Next / previous file', 'Alt \u2193 \u2191'], ['Move file down / up', 'Alt Shift \u2193 \u2191'], ['This list', '?'],\n ];\n dialog('Keyboard shortcuts', [h('div.itp-keys', {}, ...keys.map(([a, k]) => h('div', {}, h('span', { text: a }), h('span', {}, ...k.split(' ').filter(Boolean).map(x => h('kbd', { text: x }))))))]);\n }\n\n // ================================================================ input\n const typing = e => e.target.closest('input, select, textarea, [contenteditable=\"true\"]') && !(e.target.type === 'range' || e.target.type === 'checkbox');\n const DITHER_ORDER = ['none', 'bayer4', 'bayer8', 'bluenoise', 'cluster4', 'floyd-steinberg', 'atkinson', 'sierra-lite', 'jarvis'];\n window.addEventListener('keydown', e => {\n if (!shell.isConnected) return;\n if (document.querySelector('dialog[open]')) return;\n const mod = e.ctrlKey || e.metaKey;\n const k = e.key;\n if (mod && k.toLowerCase() === 'z') { if (typing(e)) return; e.preventDefault(); e.shiftKey ? store.redo() : store.undo(); return; }\n if (mod && k.toLowerCase() === 'y') { if (typing(e)) return; e.preventDefault(); store.redo(); return; }\n if (mod && k.toLowerCase() === 's') { e.preventDefault(); app.exportPNG(); return; }\n if (mod && k.toLowerCase() === 'o') { e.preventDefault(); openFiles(); return; }\n if (mod || e.altKey && !['ArrowUp', 'ArrowDown'].includes(k)) return;\n if (typing(e)) { if (k === 'Escape') e.target.blur(); return; }\n const s = store.settings;\n switch (k) {\n case 'c': case 'C': toggleCompare(); break;\n case 'g': case 'G': toggleGrid(); break;\n case 'f': case 'F': stage.fit(); break;\n case '+': case '=': stage.zoomIn(); break;\n case '-': case '_': stage.zoomOut(); break;\n case 't': case 'T': toggleTheme(); break;\n case '\\\\': togglePanel('lib'); break;\n case '/': togglePanel('insp'); break;\n case '?': showHelp(); break;\n case '[': case '{': store.update({ size: { mode: 'width', width: Math.max(8, s.size.width - (e.shiftKey ? 8 : 1)) } }, { key: 'kw' }); break;\n case ']': case '}': store.update({ size: { mode: 'width', width: s.size.width + (e.shiftKey ? 8 : 1) } }, { key: 'kw' }); break;\n case 'd': case 'D': {\n const i = DITHER_ORDER.indexOf(s.dither.method);\n const next = DITHER_ORDER[(i + (e.shiftKey ? -1 : 1) + DITHER_ORDER.length) % DITHER_ORDER.length];\n store.update({ dither: { method: next } });\n toast(next === 'none' ? 'No dither' : next.replace(/-/g, ' '), { timeout: 900 });\n break;\n }\n case ' ': if (app.current?.type === 'video') { e.preventDefault(); togglePlay(); } break;\n case ',': stepFrame(-1); break;\n case '.': stepFrame(1); break;\n case 'Escape': if (stage.picking) togglePicker(); else closeMenu(); break;\n case 'ArrowDown': case 'ArrowUp':\n if (e.altKey && e.shiftKey && app.current) { e.preventDefault(); app.move(app.current, k === 'ArrowDown' ? 1 : -1); break; }\n if (e.altKey && app.items.length > 1) {\n e.preventDefault();\n const i = app.items.indexOf(app.current);\n select(app.items[(i + (k === 'ArrowDown' ? 1 : -1) + app.items.length) % app.items.length]);\n }\n break;\n default: return;\n }\n });\n\n // drag & drop, paste\n let dragDepth = 0;\n shell.addEventListener('dragenter', e => { if ([...e.dataTransfer.types].includes('Files')) { dragDepth++; shell.classList.add('itp-dragging'); } });\n shell.addEventListener('dragleave', () => { if (--dragDepth <= 0) { dragDepth = 0; shell.classList.remove('itp-dragging'); } });\n shell.addEventListener('dragover', e => { if ([...e.dataTransfer.types].includes('Files')) e.preventDefault(); });\n shell.addEventListener('drop', e => {\n e.preventDefault(); dragDepth = 0; shell.classList.remove('itp-dragging');\n if (e.dataTransfer.files.length) addFiles([...e.dataTransfer.files]);\n });\n window.addEventListener('paste', e => {\n if (!shell.isConnected || typing(e)) return;\n const files = [...(e.clipboardData?.files || [])];\n if (files.length) { e.preventDefault(); addFiles(files); return; }\n const text = e.clipboardData?.getData('text') || '';\n if (/#?[0-9a-f]{6}/i.test(text) && /\\n|,|\\s/.test(text.trim())) {\n try { const p = parsePalette(text); store.update({ palette: { source: 'custom', name: 'Pasted', colors: p.colors } }); toast(`Pasted a ${p.colors.length}-colour palette`, { kind: 'ok' }); } catch { /* not a palette */ }\n }\n });\n window.addEventListener('hashchange', () => {\n if (/[#&]s=/.test(location.hash)) { try { store.replace(decodeSettings(location.hash)); } catch { /* ignore */ } }\n });\n\n // first paint\n inspector.sync(store.settings, null);\n library.refresh();\n updateStatus();\n undoBtn.disabled = redoBtn.disabled = true;\n\n const api = {\n app, store,\n /** Add File objects (images, videos, palettes, settings JSON). */\n addFiles,\n /** Add an image-like source directly. */\n async addImage(source, name = 'image') { const it = await addImage(name, source); select(it); library.refresh(); return it; },\n openSample: id => openSample(SAMPLES.find(s => s.id === id) || SAMPLES[0]),\n applyPreset: id => { const p = PRESETS.find(x => x.id === id); if (p) app.applyPreset(p); },\n setTheme: t => { persist.save('theme', t); applyTheme(t); },\n get result() { return app.result; },\n /** On-screen rectangle of the image in the canvas. */\n get view() { return stage.rect; },\n /** Resolves after pending renders finish. */\n async idle() { for (let i = 0; i < 200 && (dirty || running); i++) await new Promise(r => setTimeout(r, 25)); },\n };\n return api;\n}\n\nexport { SAMPLES };\n", "// Built-in presets: partial settings applied on top of the defaults.\n\nexport const PRESETS = [\n {\n id: 'balanced', name: 'Balanced', description: 'Endesga 32, Bayer 4\u00D74. A good first look at most photos.',\n settings: { size: { width: 96 }, palette: { source: 'builtin', id: 'endesga-32' }, dither: { method: 'bayer4', strength: 0.6 } },\n },\n {\n id: 'game-boy', name: 'Game Boy', description: 'Four greens, 160 px wide, ordered dither.',\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'game-boy-dmg' }, dither: { method: 'bayer4', strength: 1 }, adjust: { contrast: 0.15 } },\n },\n {\n id: 'pico-8', name: 'PICO-8', description: '128 px, the PICO-8 palette, blue-noise dither.',\n settings: { size: { width: 128 }, palette: { source: 'builtin', id: 'pico-8' }, dither: { method: 'bluenoise', strength: 0.7 } },\n },\n {\n id: 'one-bit', name: '1-bit Atkinson', description: 'Classic Mac look: two colours, Atkinson diffusion.',\n settings: { size: { width: 192 }, palette: { source: 'builtin', id: '1-bit-monitor' }, dither: { method: 'atkinson', strength: 1 }, adjust: { contrast: 0.2 } },\n },\n {\n id: 'faithful', name: 'Faithful colour', description: 'Palette extracted from the image, Floyd\u2013Steinberg.',\n settings: { size: { width: 128 }, palette: { source: 'extract', count: 24 }, dither: { method: 'floyd-steinberg', strength: 0.75 } },\n },\n {\n id: 'sprite', name: 'Clean sprite', description: 'No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.',\n settings: { size: { width: 48, resample: 'nearest' }, palette: { source: 'extract', count: 12 }, dither: { method: 'none' }, cleanup: { orphans: true }, outline: { mode: 'outer', color: '#1a1c2c' } },\n },\n {\n id: 'cga', name: 'CGA', description: '16 hard colours with an 8\u00D78 Bayer pattern.',\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'cga-16' }, dither: { method: 'bayer8', strength: 1 } },\n },\n {\n id: 'newsprint', name: 'Newsprint', description: 'Grey clustered-dot halftone.',\n settings: { size: { width: 220 }, palette: { source: 'builtin', id: 'grayscale-4' }, dither: { method: 'cluster8', strength: 1 }, adjust: { saturation: -1 } },\n },\n {\n id: 'soft', name: 'Soft painterly', description: 'Resurrect 64 with Sierra Lite and a light smooth.',\n settings: { size: { width: 112 }, palette: { source: 'builtin', id: 'resurrect-64' }, dither: { method: 'sierra-lite', strength: 0.6 }, cleanup: { smooth: true } },\n },\n];\n\nexport const getPreset = id => PRESETS.find(p => p.id === id) || null;\n", "// Tiny DOM helpers. No framework: the editor is small enough to wire by hand.\n\n/** Create an element: h('button.itp-btn.icon', { onclick, title }, child\u2026) */\nexport function h(tag, props = {}, ...children) {\n const [name, ...classes] = tag.split('.');\n const el = document.createElement(name || 'div');\n if (classes.length) el.className = classes.join(' ');\n for (const [k, v] of Object.entries(props || {})) {\n if (v == null || v === false) continue;\n if (k.startsWith('on') && typeof v === 'function') el.addEventListener(k.slice(2), v);\n else if (k === 'html') el.innerHTML = v;\n else if (k === 'text') el.textContent = v;\n else if (k === 'style' && typeof v === 'object') Object.assign(el.style, v);\n else if (k === 'dataset') Object.assign(el.dataset, v);\n else if (k in el && typeof v !== 'string' && k !== 'list') el[k] = v;\n else el.setAttribute(k, v === true ? '' : v);\n }\n append(el, children);\n return el;\n}\n\nexport function append(el, children) {\n for (const c of children.flat(Infinity)) {\n if (c == null || c === false) continue;\n el.append(c instanceof Node ? c : document.createTextNode(String(c)));\n }\n return el;\n}\n\n/** Replace all children. */\nexport function render(el, ...children) { el.replaceChildren(); return append(el, children); }\n\nexport const $ = (sel, root = document) => root.querySelector(sel);\n\n/** Element from an HTML string (single root). */\nexport function html(str) {\n const t = document.createElement('template');\n t.innerHTML = str.trim();\n return t.content.firstElementChild;\n}\n\nexport const esc = s => String(s).replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\n\nlet uid = 0;\nexport const nextId = (p = 'itp') => `${p}-${++uid}`;\n\n/** Debounce helper. */\nexport function debounce(fn, ms) {\n let t;\n return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), ms); };\n}\n\n/** Read a File as text. */\nexport const readText = file => file.text();\n\n/** Open a file picker and resolve with the chosen files. */\nexport function pickFiles({ accept = '', multiple = false } = {}) {\n return new Promise(res => {\n const input = h('input', { type: 'file', accept, multiple, style: { display: 'none' } });\n input.addEventListener('change', () => { res([...input.files]); input.remove(); });\n input.addEventListener('cancel', () => { res([]); input.remove(); });\n document.body.append(input);\n input.click();\n });\n}\n", "// Thin line icons drawn for this project on a 24\u00D724 grid (stroke 1.5, round caps).\n\nconst P = {\n upload: '<path d=\"M12 15V4m0 0-4 4m4-4 4 4\"/><path d=\"M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3\"/>',\n download: '<path d=\"M12 4v11m0 0-4-4m4 4 4-4\"/><path d=\"M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3\"/>',\n image: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><circle cx=\"9\" cy=\"10\" r=\"1.6\"/><path d=\"m4 17 5-4.5 4 3.5 3-2.5 4 3.5\"/>',\n film: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M7.5 4.5v15M16.5 4.5v15M3.5 9h4M3.5 15h4M16.5 9h4M16.5 15h4\"/>',\n files: '<path d=\"M8 7V5.5A1.5 1.5 0 0 1 9.5 4H15l4 4v8.5a1.5 1.5 0 0 1-1.5 1.5H16\"/><rect x=\"4.5\" y=\"7\" width=\"11.5\" height=\"13\" rx=\"1.5\"/>',\n presets: '<rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.5\"/><path d=\"M16.5 13.5v6M13.5 16.5h6\"/>',\n palette: '<path d=\"M12 3.5a8.5 8.5 0 1 0 0 17c1.2 0 1.8-.9 1.4-2l-.3-.8c-.4-1.2.5-2.2 1.7-2.2h1.7a4 4 0 0 0 4-4c0-4.4-3.8-8-8.5-8Z\"/><circle cx=\"8\" cy=\"11\" r=\"1\"/><circle cx=\"11\" cy=\"7.5\" r=\"1\"/><circle cx=\"15.5\" cy=\"8.5\" r=\"1\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"m20 20-4.5-4.5\"/>',\n x: '<path d=\"M6 6l12 12M18 6 6 18\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n chevron: '<path d=\"m9.5 6 6 6-6 6\"/>',\n chevronDown: '<path d=\"m6 9.5 6 6 6-6\"/>',\n undo: '<path d=\"M9 7 4.5 11.5 9 16\"/><path d=\"M5 11.5h9.5a5 5 0 0 1 0 10H11\"/>',\n redo: '<path d=\"m15 7 4.5 4.5L15 16\"/><path d=\"M19 11.5H9.5a5 5 0 0 0 0 10H13\"/>',\n compare: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M12 2.5v19\"/><path d=\"M15 9.5l2 2.5-2 2.5\"/><path d=\"M9 9.5 7 12l2 2.5\"/>',\n grid: '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2\"/><path d=\"M9.2 3.5v17M14.8 3.5v17M3.5 9.2h17M3.5 14.8h17\"/>',\n fit: '<path d=\"M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15\"/>',\n zoomIn: '<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"m20 20-4.5-4.5M11 8.5v5M8.5 11h5\"/>',\n zoomOut: '<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"m20 20-4.5-4.5M8.5 11h5\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"3.5\"/><path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4\"/>',\n moon: '<path d=\"M19.5 14.5A7.5 7.5 0 0 1 9.5 4.5a7.5 7.5 0 1 0 10 10Z\"/>',\n sidebarLeft: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M9.5 4.5v15\"/>',\n sidebarRight: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M14.5 4.5v15\"/>',\n play: '<path d=\"M8 5.5v13l10.5-6.5L8 5.5Z\"/>',\n pause: '<path d=\"M8.5 5.5v13M15.5 5.5v13\"/>',\n stepBack: '<path d=\"M7 5.5v13M18 6l-8 6 8 6V6Z\"/>',\n stepForward: '<path d=\"M17 5.5v13M6 6l8 6-8 6V6Z\"/>',\n trash: '<path d=\"M4.5 7h15M9.5 7V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M6.5 7l1 12a1.5 1.5 0 0 0 1.5 1.4h6a1.5 1.5 0 0 0 1.5-1.4l1-12\"/>',\n link: '<path d=\"M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3\"/>',\n braces: '<path d=\"M8.5 4.5H8A2 2 0 0 0 6 6.5v3A2.5 2.5 0 0 1 3.5 12 2.5 2.5 0 0 1 6 14.5v3a2 2 0 0 0 2 2h.5M15.5 4.5h.5a2 2 0 0 1 2 2v3a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0-2.5 2.5v3a2 2 0 0 1-2 2h-.5\"/>',\n pipette: '<path d=\"m14.5 6.5 3 3M12 9l-7.2 7.2a2 2 0 0 0-.5 1V20h2.8a2 2 0 0 0 1-.5L15.2 12\"/><path d=\"M13 7.5 15.8 4.7a2.3 2.3 0 0 1 3.3 3.3L16.3 10.8 13 7.5Z\"/>',\n check: '<path d=\"m5 12.5 4.5 4.5L19 7.5\"/>',\n keyboard: '<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2\"/><path d=\"M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M8 14h8\"/>',\n reset: '<path d=\"M4.5 12a7.5 7.5 0 1 0 2.2-5.3L4.5 9\"/><path d=\"M4.5 4.5V9H9\"/>',\n sheet: '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2\"/><path d=\"M3.5 12h17M12 3.5v17\"/>',\n tiles: '<rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1\"/><path d=\"M13.5 17h7M17 13.5v7\"/>',\n zip: '<path d=\"M6 3.5h8l4.5 4.5v11a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 19V5A1.5 1.5 0 0 1 6 3.5Z\"/><path d=\"M10 3.5v2h2v2h-2v2h2v2h-2v3\"/>',\n gif: '<rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"13\" rx=\"2\"/><path d=\"M10 10.5H8.5a1.5 1.5 0 0 0 0 3H10V12M13 10v4M16 14v-4h2M16 12h1.5\"/>',\n more: '<circle cx=\"6\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"18\" cy=\"12\" r=\"1\"/>',\n menu: '<path d=\"M4 7h16M4 12h16M4 17h16\"/>',\n sliders: '<path d=\"M4 7h9M17 7h3M4 17h3M11 17h9\"/><circle cx=\"15\" cy=\"7\" r=\"2\"/><circle cx=\"9\" cy=\"17\" r=\"2\"/>',\n info: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5M12 8h.01\"/>',\n unlink: '<path d=\"M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3\"/><path d=\"M4 4l16 16\"/>',\n arrowUp: '<path d=\"M12 19V5M6 11l6-6 6 6\"/>',\n arrowDown: '<path d=\"M12 5v14M6 13l6 6 6-6\"/>',\n layers: '<path d=\"m12 4 8.5 4.5L12 13 3.5 8.5 12 4Z\"/><path d=\"m3.5 12.5 8.5 4.5 8.5-4.5\"/><path d=\"m3.5 16.5 8.5 4.5 8.5-4.5\"/>',\n frame: '<path d=\"M7 3v14a1 1 0 0 0 1 1h13\"/><path d=\"M3 7h13a1 1 0 0 1 1 1v13\"/>',\n copy: '<rect x=\"8.5\" y=\"8.5\" width=\"11\" height=\"11\" rx=\"1.5\"/><path d=\"M15.5 8.5V6A1.5 1.5 0 0 0 14 4.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5\"/>',\n clipboard: '<rect x=\"5\" y=\"4.5\" width=\"14\" height=\"16\" rx=\"2\"/><path d=\"M9 4.5V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v.5M9 10h6M9 14h4\"/>',\n github: '<path d=\"M9 19c-4 1.3-4-2-5.5-2.5M14.5 21v-3.2c0-1 .1-1.4-.5-2 2.6-.3 5.5-1.3 5.5-5.8a4.5 4.5 0 0 0-1.2-3.1 4.2 4.2 0 0 0-.1-3.1s-1-.3-3.3 1.2a11.4 11.4 0 0 0-6 0C6.6 3.5 5.6 3.8 5.6 3.8a4.2 4.2 0 0 0-.1 3.1A4.5 4.5 0 0 0 4.3 10c0 4.5 2.9 5.5 5.5 5.8-.6.6-.6 1.2-.5 2V21\"/>',\n};\n\n/** SVG markup for an icon name. */\nexport function icon(name, cls = '') {\n return `<svg class=\"i ${cls}\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">${P[name] || ''}</svg>`;\n}\nexport const ICON_NAMES = Object.keys(P);\n", "// Settings store with undo/redo. Rapid edits to the same control (a slider drag) are\n// coalesced into one history step.\n//\n// The store edits one \"target\" at a time: the shared settings, or one file's own settings.\n// Each target keeps its own undo history, so switching files never mixes their histories.\n\nimport { mergeSettings, normalizeSettings } from '../core/settings.js';\n\nexport function createStore(initialSettings) {\n let settings = normalizeSettings(initialSettings);\n let target = 'shared';\n let past = [], future = [];\n const histories = new Map(); // target \u2192 { past, future }\n const subs = new Set();\n let lastKey = null, lastTime = 0;\n const LIMIT = 200;\n\n const emit = (why) => { for (const fn of subs) fn(settings, why); };\n const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);\n\n return {\n get settings() { return settings; },\n /** 'shared' or a file id. */\n get target() { return target; },\n subscribe(fn) { subs.add(fn); return () => subs.delete(fn); },\n\n /**\n * Patch settings ({ dither: { strength: 0.5 } }).\n * @param {object} patch\n * @param {{ key?: string, history?: boolean }} [opts] key: coalesce consecutive edits with the same key\n */\n update(patch, opts = {}) {\n const next = mergeSettings(settings, patch);\n if (same(next, settings)) return;\n const now = Date.now();\n const coalesce = opts.key && opts.key === lastKey && now - lastTime < 1200;\n if (opts.history !== false && !coalesce) {\n past.push(settings); if (past.length > LIMIT) past.shift();\n future.length = 0;\n }\n lastKey = opts.key || null; lastTime = now;\n settings = next;\n emit('update');\n },\n\n /** Replace everything (preset, loaded JSON, share link). One undo step. */\n replace(next, why = 'replace') {\n next = normalizeSettings(next);\n if (same(next, settings)) return;\n past.push(settings); future.length = 0; lastKey = null;\n settings = next;\n emit(why);\n },\n\n /**\n * Switch what is being edited. The current target's history is kept for when it comes back.\n * @param {string} key 'shared' or a file id\n * @param {object} value the settings to edit\n */\n setTarget(key, value) {\n histories.set(target, { past, future });\n target = key;\n const h = histories.get(key) || { past: [], future: [] };\n past = h.past; future = h.future; lastKey = null;\n settings = normalizeSettings(value);\n emit('target');\n },\n\n /** Forget a target's history (its file was removed or relinked). */\n dropTarget(key) { if (key !== target) histories.delete(key); },\n\n /** End the current coalescing group (call on slider release). */\n commit() { lastKey = null; },\n\n undo() { if (!past.length) return false; future.push(settings); settings = past.pop(); lastKey = null; emit('undo'); return true; },\n redo() { if (!future.length) return false; past.push(settings); settings = future.pop(); lastKey = null; emit('redo'); return true; },\n get canUndo() { return past.length > 0; },\n get canRedo() { return future.length > 0; },\n };\n}\n", "// The preview canvas: crisp integer zoom, pan, before/after split, pixel grid, eyedropper.\n\nimport { h } from './dom.js';\nimport { icon } from './icons.js';\n\nexport const ZOOM_STEPS = [0.25, 0.5, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64];\n\nexport function createStage({ onPick, onViewChange } = {}) {\n const screen = h('canvas.screen', { role: 'img', 'aria-label': 'Preview' });\n const splitLeft = h('span.lbl.l', { text: 'Original' });\n const splitRight = h('span.lbl.r', { text: 'Pixel' });\n const handle = h('button', { type: 'button', 'aria-label': 'Drag to compare original and result', html: icon('compare') });\n const split = h('div.itp-split', { hidden: true }, splitLeft, splitRight, handle);\n const el = h('div.itp-view', { tabindex: '0', 'aria-label': 'Canvas. Scroll to zoom, drag to pan.' }, screen, split);\n const ctx = screen.getContext('2d');\n\n const st = {\n result: null, // canvas, output size\n original: null, // drawable, any size\n crop: null, // part of the original shown, as fractions { x, y, w, h }\n w: 0, h: 0,\n x: 0, y: 0, z: 1, // top-left in css px, css px per output pixel\n fitted: true,\n compare: false, splitAt: 0.5,\n grid: false, picking: false,\n };\n let dpr = 1, vw = 0, vh = 0, pattern = null, patternKey = '';\n\n function checker() {\n const css = getComputedStyle(el);\n const a = css.getPropertyValue('--checker-a').trim() || '#1a1b1f', b = css.getPropertyValue('--checker-b').trim() || '#222';\n const key = a + b;\n if (key === patternKey) return pattern;\n const c = document.createElement('canvas'); c.width = c.height = 16;\n const g = c.getContext('2d');\n g.fillStyle = a; g.fillRect(0, 0, 16, 16); g.fillStyle = b; g.fillRect(0, 0, 8, 8); g.fillRect(8, 8, 8, 8);\n patternKey = key; pattern = ctx.createPattern(c, 'repeat');\n return pattern;\n }\n\n function resize() {\n const r = el.getBoundingClientRect();\n const d = Math.min(3, window.devicePixelRatio || 1);\n // ignore resize notifications where nothing actually changed size\n if (Math.abs(r.width - vw) < 0.5 && Math.abs(r.height - vh) < 0.5 && d === dpr && screen.width > 1) { draw(); return; }\n dpr = d; vw = r.width; vh = r.height;\n screen.width = Math.max(1, Math.round(vw * dpr)); screen.height = Math.max(1, Math.round(vh * dpr));\n if (st.fitted) fit(false); else draw();\n }\n\n function fitZoom() {\n if (!st.w) return 1;\n const pad = vw < 600 ? 16 : 48;\n // exact, not rounded: a fitted image always fills the same box, whatever its pixel size\n return Math.max(0.05, Math.min((vw - pad) / st.w, (vh - pad) / st.h));\n }\n\n function fit(notify = true) {\n st.z = fitZoom();\n st.x = (vw - st.w * st.z) / 2; st.y = (vh - st.h * st.z) / 2;\n st.fitted = true;\n draw(); if (notify && onViewChange) onViewChange(view());\n }\n\n function zoomTo(z, cx = vw / 2, cy = vh / 2) {\n z = Math.max(0.05, Math.min(128, z));\n const px = (cx - st.x) / st.z, py = (cy - st.y) / st.z;\n st.z = z; st.x = cx - px * z; st.y = cy - py * z;\n st.fitted = false;\n draw(); if (onViewChange) onViewChange(view());\n }\n\n function zoomStep(dir, cx, cy) {\n const cur = st.z;\n let next;\n if (dir > 0) next = ZOOM_STEPS.find(s => s > cur + 1e-6) || cur * 1.5;\n else next = [...ZOOM_STEPS].reverse().find(s => s < cur - 1e-6) || cur / 1.5;\n zoomTo(next, cx, cy);\n }\n\n function draw() {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, screen.width, screen.height);\n if (!st.result) { split.hidden = true; return; }\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // snap the image rect to device pixels so every output pixel is the same size\n const x = Math.round(st.x * dpr) / dpr, y = Math.round(st.y * dpr) / dpr;\n const w = Math.round(st.w * st.z * dpr) / dpr, hh = Math.round(st.h * st.z * dpr) / dpr;\n ctx.fillStyle = checker();\n ctx.fillRect(x, y, w, hh);\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(st.result, x, y, w, hh);\n\n if (st.compare && st.original) {\n const sx = x + w * st.splitAt;\n ctx.save();\n ctx.beginPath(); ctx.rect(x, y, Math.max(0, sx - x), hh); ctx.clip();\n ctx.fillStyle = checker(); ctx.fillRect(x, y, w, hh);\n ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = 'high';\n try {\n const ow = st.original.naturalWidth || st.original.videoWidth || st.original.width;\n const oh = st.original.naturalHeight || st.original.videoHeight || st.original.height;\n const c = st.crop || { x: 0, y: 0, w: 1, h: 1 };\n ctx.drawImage(st.original, c.x * ow, c.y * oh, c.w * ow, c.h * oh, x, y, w, hh);\n } catch { /* video not ready */ }\n ctx.restore();\n split.hidden = false;\n split.style.left = `${sx}px`;\n split.style.top = `${Math.max(0, y)}px`; split.style.bottom = `${Math.max(0, vh - (y + hh))}px`;\n } else split.hidden = true;\n\n if (st.grid && st.z >= 6) {\n ctx.save();\n ctx.beginPath(); ctx.rect(x, y, w, hh); ctx.clip();\n ctx.strokeStyle = 'rgba(127,127,127,0.35)';\n ctx.lineWidth = 1 / dpr;\n ctx.beginPath();\n const x0 = Math.max(0, Math.floor(-st.x / st.z)), x1 = Math.min(st.w, Math.ceil((vw - st.x) / st.z));\n const y0 = Math.max(0, Math.floor(-st.y / st.z)), y1 = Math.min(st.h, Math.ceil((vh - st.y) / st.z));\n for (let i = x0; i <= x1; i++) { const px = Math.round((x + i * st.z) * dpr) / dpr + 0.5 / dpr; ctx.moveTo(px, Math.max(y, 0)); ctx.lineTo(px, Math.min(y + hh, vh)); }\n for (let j = y0; j <= y1; j++) { const py = Math.round((y + j * st.z) * dpr) / dpr + 0.5 / dpr; ctx.moveTo(Math.max(x, 0), py); ctx.lineTo(Math.min(x + w, vw), py); }\n ctx.stroke();\n ctx.restore();\n }\n }\n\n // ---- input\n let drag = null;\n const pointers = new Map();\n el.addEventListener('pointerdown', e => {\n if (e.target === handle || handle.contains(e.target)) return;\n // overlays inside the view (empty state, floating tools) get normal clicks: only the canvas pans\n if (e.target !== el && e.target !== screen) return;\n el.focus({ preventScroll: true });\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n el.setPointerCapture(e.pointerId);\n if (st.picking && e.button === 0 && pointers.size === 1) {\n const r = el.getBoundingClientRect();\n const u = (e.clientX - r.left - st.x) / (st.w * st.z), v = (e.clientY - r.top - st.y) / (st.h * st.z);\n if (u >= 0 && v >= 0 && u < 1 && v < 1 && onPick) onPick(u, v);\n return;\n }\n drag = { x: e.clientX, y: e.clientY, ox: st.x, oy: st.y };\n el.classList.add('panning');\n });\n el.addEventListener('pointermove', e => {\n if (!pointers.has(e.pointerId)) return;\n const prev = pointers.get(e.pointerId);\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n if (pointers.size === 2) {\n // pinch\n const [a, b] = [...pointers.values()];\n const other = [...pointers.entries()].find(([id]) => id !== e.pointerId)[1];\n const d0 = Math.hypot(prev.x - other.x, prev.y - other.y), d1 = Math.hypot(a.x - b.x, a.y - b.y);\n if (d0 > 0) {\n const r = el.getBoundingClientRect();\n zoomTo(st.z * d1 / d0, (a.x + b.x) / 2 - r.left, (a.y + b.y) / 2 - r.top);\n }\n drag = null;\n return;\n }\n if (!drag) return;\n st.x = drag.ox + e.clientX - drag.x; st.y = drag.oy + e.clientY - drag.y;\n st.fitted = false;\n draw();\n });\n const end = e => { pointers.delete(e.pointerId); if (!pointers.size) { drag = null; el.classList.remove('panning'); if (onViewChange) onViewChange(view()); } };\n el.addEventListener('pointerup', end);\n el.addEventListener('pointercancel', end);\n el.addEventListener('wheel', e => {\n e.preventDefault();\n const r = el.getBoundingClientRect();\n const cx = e.clientX - r.left, cy = e.clientY - r.top;\n const trackpadPan = !e.ctrlKey && e.deltaMode === 0 && Math.abs(e.deltaX) > 0;\n if (trackpadPan) { st.x -= e.deltaX; st.y -= e.deltaY; st.fitted = false; draw(); return; }\n if (e.ctrlKey && e.deltaMode === 0) zoomTo(st.z * Math.exp(-e.deltaY * 0.01), cx, cy); // pinch on trackpads\n else zoomStep(e.deltaY < 0 ? 1 : -1, cx, cy);\n }, { passive: false });\n el.addEventListener('dblclick', () => fit());\n\n // split handle\n handle.addEventListener('pointerdown', e => {\n e.preventDefault(); handle.setPointerCapture(e.pointerId);\n const move = ev => {\n const r = el.getBoundingClientRect();\n st.splitAt = Math.min(1, Math.max(0, (ev.clientX - r.left - st.x) / (st.w * st.z)));\n draw();\n };\n const up = () => { handle.removeEventListener('pointermove', move); handle.removeEventListener('pointerup', up); };\n handle.addEventListener('pointermove', move); handle.addEventListener('pointerup', up);\n });\n handle.addEventListener('keydown', e => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault(); e.stopPropagation();\n st.splitAt = Math.min(1, Math.max(0, st.splitAt + (e.key === 'ArrowLeft' ? -0.05 : 0.05))); draw();\n }\n });\n\n new ResizeObserver(resize).observe(el);\n const view = () => ({ zoom: st.z, fitted: st.fitted, x: st.x, y: st.y });\n\n return {\n el,\n /** Show a result canvas (and the original for compare). */\n show(result, original, crop) {\n const sizeChanged = !st.result || result.width !== st.w || result.height !== st.h;\n const oldRect = { w: st.w * st.z, cx: st.x + st.w * st.z / 2, cy: st.y + st.h * st.z / 2 };\n st.result = result; st.original = original || st.original; st.crop = crop || null;\n if (sizeChanged) {\n st.w = result.width; st.h = result.height;\n if (st.fitted || !oldRect.w) {\n // not zoomed or panned by hand: fit exactly, so the image fills the same box as before\n fit();\n } else {\n // zoomed or panned: keep the same centre and on-screen width\n const z = oldRect.w / st.w;\n st.z = z; st.x = oldRect.cx - st.w * z / 2; st.y = oldRect.cy - st.h * z / 2;\n draw();\n if (onViewChange) onViewChange(view());\n }\n } else draw();\n },\n clear() { st.result = null; st.original = null; st.w = st.h = 0; st.fitted = true; draw(); },\n fit, zoomTo, zoomStep,\n zoomIn() { zoomStep(1); }, zoomOut() { zoomStep(-1); },\n get zoom() { return st.z; },\n get fitted() { return st.fitted; },\n /** Where the image sits on screen (css px), for tests and integrations. */\n get rect() { return { x: st.x, y: st.y, width: st.w * st.z, height: st.h * st.z, zoom: st.z }; },\n setCompare(on) { st.compare = on; draw(); },\n get compare() { return st.compare; },\n setGrid(on) { st.grid = on; draw(); },\n get grid() { return st.grid; },\n setPicking(on) { st.picking = on; el.classList.toggle('picking', on); },\n get picking() { return st.picking; },\n redraw: draw,\n resize,\n };\n}\n", "// Inspector controls. Each returns { el, set(value) } so the inspector can sync from state\n// without rebuilding (which would steal focus mid-drag).\n\nimport { h, nextId } from './dom.js';\nimport { icon } from './icons.js';\n\n/**\n * Collapsible inspector section: a header button (works the same in every browser, unlike\n * <details>) plus an optional reset icon that appears when the section differs from its defaults.\n * @param {string} title\n * @param {{ open?: boolean, onToggle?: (open: boolean) => void, onReset?: () => void, resetLabel?: string }} opts\n */\nexport function section(title, opts = {}, ...children) {\n const id = nextId('sec');\n const hintEl = h('span.hint', {});\n const toggle = h('button.itp-sec-toggle', { type: 'button', 'aria-controls': id },\n h('span.title', { text: title }), hintEl, h('span.chev', { html: icon('chevron') }));\n const reset = opts.onReset ? h('button.itp-btn.small.icon.itp-sec-reset', {\n type: 'button', hidden: true, title: opts.resetLabel || `Reset ${title.toLowerCase()}`, 'aria-label': opts.resetLabel || `Reset ${title.toLowerCase()} to defaults`,\n html: icon('reset'), onclick: () => opts.onReset(),\n }) : null;\n const body = h('div.body', { id }, ...children);\n const el = h('section.itp-sec', {}, h('div.itp-sec-head', {}, toggle, reset), body);\n const setOpen = open => {\n el.dataset.open = String(open);\n toggle.setAttribute('aria-expanded', String(open));\n body.hidden = !open;\n };\n toggle.addEventListener('click', () => { const open = el.dataset.open !== 'true'; setOpen(open); opts.onToggle?.(open); });\n setOpen(opts.open !== false);\n return {\n el, body,\n setHint(t) { hintEl.textContent = t; },\n /** Show the reset icon when the section's settings differ from the defaults. */\n setChanged(changed) { if (reset) reset.hidden = !changed; },\n setOpen,\n get open() { return el.dataset.open === 'true'; },\n };\n}\n\n/** Labelled field wrapper. */\nexport function field(label, control, { help = '', value = null, id } = {}) {\n const lab = h('div.lab', {}, h('label', { for: id || control.id || null, text: label }), value);\n return h('div.itp-field', {}, lab, control, help ? h('div.help', { text: help }) : null);\n}\n\n/**\n * Slider + number box.\n * @param {{ label: string, min: number, max: number, step?: number, value: number, unit?: string,\n * scale?: number, help?: string, onInput: (v:number)=>void, onCommit?: ()=>void }} o\n * scale: display multiplier (0..1 shown as 0..100 with scale 100)\n */\nexport function slider(o) {\n const id = nextId('sl');\n const k = o.scale || 1;\n const step = o.step || 1;\n const range = h('input', { type: 'range', id, min: o.min * k, max: o.max * k, step: step * k, 'aria-label': o.label });\n const num = h('input.itp-input', { type: 'number', min: o.min * k, max: o.max * k, step: step * k, 'aria-label': `${o.label} value` });\n const paint = () => { const p = (range.value - range.min) / (range.max - range.min) * 100; range.style.setProperty('--p', `${p}%`); };\n const set = v => { const d = round(v * k, step * k); range.value = d; num.value = d; paint(); };\n range.addEventListener('input', () => { num.value = range.value; paint(); o.onInput(Number(range.value) / k); });\n range.addEventListener('change', () => o.onCommit && o.onCommit());\n num.addEventListener('change', () => {\n const v = Math.min(o.max * k, Math.max(o.min * k, Number(num.value) || 0));\n set(v / k); o.onInput(v / k); o.onCommit && o.onCommit();\n });\n range.addEventListener('dblclick', () => { if (o.reset != null) { set(o.reset); o.onInput(o.reset); o.onCommit && o.onCommit(); } });\n set(o.value);\n const el = field(o.label, h('div.itp-slider', {}, range, num), { help: o.help, id });\n return { el, set, input: range };\n}\n\nconst round = (v, step) => {\n const d = Math.max(0, -Math.floor(Math.log10(step) + 1e-9));\n return Number((Math.round(v / step) * step).toFixed(d));\n};\n\n/** <select> with options [{ value, label, group? }]. */\nexport function select(o) {\n const id = nextId('se');\n const el = h('select.itp-select', { id, 'aria-label': o.label });\n const groups = new Map();\n for (const opt of o.options) {\n const node = h('option', { value: opt.value, text: opt.label });\n if (opt.group) {\n if (!groups.has(opt.group)) { const g = h('optgroup', { label: opt.group }); groups.set(opt.group, g); el.append(g); }\n groups.get(opt.group).append(node);\n } else el.append(node);\n }\n el.addEventListener('change', () => o.onChange(el.value));\n const wrapped = o.bare ? el : field(o.label, el, { help: o.help, id });\n return { el: wrapped, select: el, set(v) { el.value = v; } };\n}\n\n/** Segmented toggle [{ value, label, icon?, title? }]. */\nexport function segmented(o) {\n const btns = o.options.map(opt => h('button', {\n type: 'button', 'aria-pressed': 'false', title: opt.title || null,\n html: (opt.icon ? icon(opt.icon) : '') + (opt.label ? `<span>${opt.label}</span>` : ''),\n onclick: () => o.onChange(opt.value),\n }));\n const seg = h('div.itp-seg', { role: 'group', 'aria-label': o.label }, ...btns);\n const set = v => btns.forEach((b, i) => b.setAttribute('aria-pressed', String(o.options[i].value === v)));\n set(o.value);\n const el = o.bare ? seg : field(o.label, seg, { help: o.help });\n return { el, set };\n}\n\n/** On/off switch. */\nexport function toggle(o) {\n const input = h('input', { type: 'checkbox', role: 'switch' });\n input.addEventListener('change', () => o.onChange(input.checked));\n const lab = h('label.itp-switch', {}, h('span', { text: o.label }), input);\n const el = o.help ? h('div.itp-field', {}, lab, h('div.help', { text: o.help })) : lab;\n return { el, set(v) { input.checked = !!v; } };\n}\n\n/** Colour input with hex readout. */\nexport function colorInput(o) {\n const input = h('input', { type: 'color', 'aria-label': o.label });\n const hex = h('span.mono', {});\n input.addEventListener('input', () => { hex.textContent = input.value; o.onChange(input.value); });\n const box = h('label.itp-color', {}, input, hex);\n const set = v => { input.value = v; hex.textContent = v; };\n set(o.value || '#000000');\n return { el: o.bare ? box : field(o.label, box), set };\n}\n\n/** Number box (no slider). */\nexport function numberInput(o) {\n const id = nextId('nu');\n const input = h('input.itp-input.num', { type: 'number', id, min: o.min, max: o.max, step: o.step || 1, 'aria-label': o.label });\n input.addEventListener('change', () => {\n const v = Math.min(o.max, Math.max(o.min, Number(input.value) || o.min));\n if (input.value !== '' || !input.placeholder) input.value = v;\n o.onChange(v);\n });\n return { el: o.bare ? input : field(o.label, input, { help: o.help, id }), input, set(v) { input.value = v; } };\n}\n", "// Animated GIF encoder. Pixel art already uses a small palette, so frames are written\n// losslessly with one global colour table whenever the whole animation fits in 256 colours\n// (255 + transparency). Otherwise each frame gets its own table, reduced by median cut if needed.\n\nimport { upscale } from './scale.js';\nimport { extractPalette } from '../palette/extract.js';\nimport { parseColor } from '../color.js';\n\nclass ByteWriter {\n constructor() { this.buf = new Uint8Array(1 << 16); this.n = 0; }\n byte(b) { if (this.n === this.buf.length) { const nb = new Uint8Array(this.buf.length * 2); nb.set(this.buf); this.buf = nb; } this.buf[this.n++] = b; }\n bytes(arr) { for (let i = 0; i < arr.length; i++) this.byte(arr[i]); }\n u16(v) { this.byte(v & 255); this.byte((v >> 8) & 255); }\n str(s) { for (let i = 0; i < s.length; i++) this.byte(s.charCodeAt(i)); }\n result() { return this.buf.slice(0, this.n); }\n}\n\n/** GIF-flavoured LZW for one frame of indices. */\nexport function lzwEncode(indices, minCodeSize, w) {\n const clear = 1 << minCodeSize, eoi = clear + 1;\n let codeSize = minCodeSize + 1, next = eoi + 1;\n let dict = new Map();\n let cur = 0, curBits = 0;\n const sub = [];\n let block = [];\n const emit = code => {\n cur |= code << curBits; curBits += codeSize;\n while (curBits >= 8) { block.push(cur & 255); cur >>>= 8; curBits -= 8; if (block.length === 255) { sub.push(block); block = []; } }\n };\n emit(clear);\n let prefix = indices[0];\n for (let i = 1; i < indices.length; i++) {\n const k = indices[i];\n const key = prefix * 256 + k;\n const hit = dict.get(key);\n if (hit !== undefined) { prefix = hit; continue; }\n emit(prefix);\n if (next < 4096) {\n dict.set(key, next++);\n if (next > (1 << codeSize) && codeSize < 12) codeSize++;\n } else {\n emit(clear); dict = new Map(); codeSize = minCodeSize + 1; next = eoi + 1;\n }\n prefix = k;\n }\n emit(prefix);\n emit(eoi);\n if (curBits > 0) block.push(cur & 255);\n if (block.length) sub.push(block);\n w.byte(minCodeSize);\n for (const b of sub) { w.byte(b.length); w.bytes(b); }\n w.byte(0);\n}\n\nconst keyOf = (d, o) => (d[o + 3] < 128 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\n\nfunction tableFor(colorKeys, transparent) {\n const list = [...colorKeys].filter(k => k !== -1);\n const colors = list.map(k => [k >> 16, (k >> 8) & 255, k & 255]);\n const tIndex = transparent ? colors.length : -1;\n if (transparent) colors.push([0, 0, 0]);\n let bits = 1; while ((1 << bits) < colors.length) bits++;\n while (colors.length < (1 << bits)) colors.push([0, 0, 0]);\n const index = new Map(list.map((k, i) => [k, i]));\n return { colors, bits, tIndex, index };\n}\n\nfunction reduce(frame, max) {\n // > max colours: median-cut palette, then nearest colour per pixel\n const pal = extractPalette(frame, max).map(parseColor);\n const d = new Uint8ClampedArray(frame.data);\n const cache = new Map();\n for (let o = 0; o < d.length; o += 4) {\n if (d[o + 3] < 128) continue;\n const k = (d[o] << 16) | (d[o + 1] << 8) | d[o + 2];\n let best = cache.get(k);\n if (best === undefined) {\n let bd = Infinity; best = 0;\n for (let i = 0; i < pal.length; i++) {\n const dr = d[o] - pal[i][0], dg = d[o + 1] - pal[i][1], db = d[o + 2] - pal[i][2];\n const dist = dr * dr * 3 + dg * dg * 4 + db * db * 2;\n if (dist < bd) { bd = dist; best = i; }\n }\n cache.set(k, best);\n }\n d.set(pal[best], o);\n }\n return { ...frame, data: d };\n}\n\n/**\n * @param {{ width: number, height: number, data: ArrayLike<number>, delay?: number }[]} frames delay in ms\n * @param {{ loop?: number, scale?: number, delay?: number }} [opts] loop: 0 = forever, -1 = play once\n * @returns {Uint8Array}\n */\nexport function encodeGIF(frames, opts = {}) {\n if (!frames.length) throw new Error('No frames');\n const scale = Math.max(1, Math.round(opts.scale || 1));\n const fr = frames.map(f => ({ ...(scale > 1 ? upscale(f, scale) : f), delay: f.delay ?? opts.delay ?? 100 }));\n const W = fr[0].width, H = fr[0].height;\n\n // collect colours\n let transparent = false;\n const all = new Set();\n const perFrame = fr.map(f => {\n const s = new Set();\n for (let o = 0; o < f.data.length; o += 4) { const k = keyOf(f.data, o); if (k === -1) transparent = true; s.add(k); all.add(k); }\n return s;\n });\n const opaqueCount = s => s.size - (s.has(-1) ? 1 : 0);\n const globalOK = opaqueCount(all) + (transparent ? 1 : 0) <= 256;\n const global = globalOK ? tableFor(all, transparent) : null;\n\n const w = new ByteWriter();\n w.str('GIF89a');\n w.u16(W); w.u16(H);\n w.byte(global ? 0xf0 | (global.bits - 1) : 0x00);\n w.byte(0); w.byte(0);\n if (global) for (const c of global.colors) w.bytes(c);\n if (fr.length > 1 && opts.loop !== -1) {\n w.byte(0x21); w.byte(0xff); w.byte(11); w.str('NETSCAPE2.0'); w.byte(3); w.byte(1); w.u16(opts.loop || 0); w.byte(0);\n }\n\n fr.forEach((f0, i) => {\n let f = f0, table = global, set = perFrame[i];\n if (!table) {\n const max = transparent ? 255 : 256;\n if (opaqueCount(set) > max) {\n f = reduce(f0, max);\n set = new Set(); for (let o = 0; o < f.data.length; o += 4) set.add(keyOf(f.data, o));\n }\n table = tableFor(set, set.has(-1));\n }\n // graphic control extension\n w.byte(0x21); w.byte(0xf9); w.byte(4);\n w.byte(((transparent ? 2 : 1) << 2) | (table.tIndex >= 0 ? 1 : 0));\n w.u16(Math.max(2, Math.round(f.delay / 10)));\n w.byte(table.tIndex >= 0 ? table.tIndex : 0);\n w.byte(0);\n // image descriptor\n w.byte(0x2c); w.u16(0); w.u16(0); w.u16(W); w.u16(H);\n w.byte(table === global ? 0 : 0x80 | (table.bits - 1));\n if (table !== global) for (const c of table.colors) w.bytes(c);\n const idx = new Uint8Array(W * H);\n for (let p = 0; p < idx.length; p++) {\n const k = keyOf(f.data, p * 4);\n idx[p] = k === -1 ? table.tIndex : table.index.get(k);\n }\n lzwEncode(idx, Math.max(2, table.bits), w);\n });\n w.byte(0x3b);\n return w.result();\n}\n", "// Store-only zip writer (PNGs and GIFs are already compressed, so deflating again buys little).\n\nimport { crc32 } from './crc32.js';\n\nconst enc = new TextEncoder();\n\n/**\n * @param {{ name: string, data: Uint8Array | string, date?: Date }[]} entries\n * @returns {Uint8Array}\n */\nexport function createZip(entries) {\n const files = [], central = [];\n let offset = 0;\n const used = new Set();\n for (const e of entries) {\n let name = e.name.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n // avoid duplicate names inside one archive\n if (used.has(name)) { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); let i = 2; while (used.has(`${m[1]}-${i}${m[2] || ''}`)) i++; name = `${m[1]}-${i}${m[2] || ''}`; }\n used.add(name);\n const nameBytes = enc.encode(name);\n const data = typeof e.data === 'string' ? enc.encode(e.data) : e.data;\n const crc = crc32(data);\n const d = e.date || new Date();\n const time = (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1);\n const date = ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate();\n\n const local = new Uint8Array(30 + nameBytes.length);\n const lv = new DataView(local.buffer);\n lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); // UTF-8 names\n lv.setUint16(8, 0, true); lv.setUint16(10, time, true); lv.setUint16(12, date, true);\n lv.setUint32(14, crc, true); lv.setUint32(18, data.length, true); lv.setUint32(22, data.length, true);\n lv.setUint16(26, nameBytes.length, true); lv.setUint16(28, 0, true);\n local.set(nameBytes, 30);\n\n const cen = new Uint8Array(46 + nameBytes.length);\n const cv = new DataView(cen.buffer);\n cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true);\n cv.setUint16(10, 0, true); cv.setUint16(12, time, true); cv.setUint16(14, date, true);\n cv.setUint32(16, crc, true); cv.setUint32(20, data.length, true); cv.setUint32(24, data.length, true);\n cv.setUint16(28, nameBytes.length, true); cv.setUint32(42, offset, true);\n cen.set(nameBytes, 46);\n\n files.push(local, data); central.push(cen);\n offset += local.length + data.length;\n }\n const cenSize = central.reduce((s, c) => s + c.length, 0);\n const end = new Uint8Array(22);\n const ev = new DataView(end.buffer);\n ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, entries.length, true); ev.setUint16(10, entries.length, true);\n ev.setUint32(12, cenSize, true); ev.setUint32(16, offset, true);\n const out = new Uint8Array(offset + cenSize + 22);\n let o = 0;\n for (const p of [...files, ...central, end]) { out.set(p, o); o += p.length; }\n return out;\n}\n", "// Sprite sheets (many frames \u2192 one image + atlas JSON) and tilesets (one image \u2192 unique tiles + map).\n\nconst blank = (w, h) => ({ width: w, height: h, data: new Uint8ClampedArray(w * h * 4) });\n\nfunction blit(dst, src, dx, dy, sx = 0, sy = 0, sw = src.width, sh = src.height) {\n for (let y = 0; y < sh; y++) {\n const so = ((sy + y) * src.width + sx) * 4, o = ((dy + y) * dst.width + dx) * 4;\n dst.data.set(src.data.subarray ? src.data.subarray(so, so + sw * 4) : Array.prototype.slice.call(src.data, so, so + sw * 4), o);\n }\n}\n\n/**\n * Pack frames into a grid. Frames may differ in size; cells use the largest frame.\n * @param {{ width: number, height: number, data: ArrayLike<number>, name?: string, delay?: number }[]} frames\n * @param {{ columns?: number, padding?: number, name?: string }} [opts] columns: 0 = roughly square\n * @returns {{ image: { width, height, data }, atlas: object }}\n */\nexport function packSpriteSheet(frames, opts = {}) {\n if (!frames.length) throw new Error('No frames');\n const pad = Math.max(0, opts.padding | 0);\n const cw = Math.max(...frames.map(f => f.width)), ch = Math.max(...frames.map(f => f.height));\n const cols = Math.max(1, Math.min(frames.length, opts.columns || Math.ceil(Math.sqrt(frames.length))));\n const rows = Math.ceil(frames.length / cols);\n const W = cols * cw + (cols - 1) * pad, H = rows * ch + (rows - 1) * pad;\n const image = blank(W, H);\n const out = {};\n frames.forEach((f, i) => {\n const x = (i % cols) * (cw + pad), y = Math.floor(i / cols) * (ch + pad);\n blit(image, f, x, y);\n out[f.name || `frame-${String(i).padStart(3, '0')}`] = {\n frame: { x, y, w: f.width, h: f.height },\n sourceSize: { w: f.width, h: f.height },\n ...(f.delay != null ? { duration: Math.round(f.delay) } : {}),\n };\n });\n // the \"hash\" flavour of the TexturePacker / Aseprite JSON format, which most engines read\n const atlas = { frames: out, meta: { app: 'image-to-pixel', image: (opts.name || 'sheet') + '.png', size: { w: W, h: H }, scale: '1', columns: cols, rows, padding: pad } };\n return { image, atlas };\n}\n\n/**\n * Cut an image into tiles, drop duplicates (optionally counting mirrored tiles as duplicates)\n * and return the tileset image and a tile map.\n * @param {{ width, height, data }} img\n * @param {{ tileWidth?: number, tileHeight?: number, columns?: number, flips?: boolean }} [opts]\n * @returns {{ image, map: { width: number, height: number, tiles: number[], flips?: number[] }, count: number }}\n */\nexport function buildTileset(img, opts = {}) {\n const tw = Math.max(1, opts.tileWidth || 8), th = Math.max(1, opts.tileHeight || tw);\n const mw = Math.ceil(img.width / tw), mh = Math.ceil(img.height / th);\n const tiles = [], keys = new Map(), map = [], flipsOut = [];\n const read = (tx, ty) => {\n const t = blank(tw, th);\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\n const sx = tx * tw + x, sy = ty * th + y;\n if (sx >= img.width || sy >= img.height) continue;\n const so = (sy * img.width + sx) * 4;\n t.data.set([img.data[so], img.data[so + 1], img.data[so + 2], img.data[so + 3]], (y * tw + x) * 4);\n }\n return t;\n };\n const key = t => {\n let s = '';\n for (let i = 0; i < t.data.length; i += 4) s += t.data[i + 3] === 0 ? '.' : String.fromCharCode(t.data[i] + 1, t.data[i + 1] + 1, t.data[i + 2] + 1);\n return s;\n };\n const flip = (t, fx, fy) => {\n const o = blank(tw, th);\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\n const si = ((fy ? th - 1 - y : y) * tw + (fx ? tw - 1 - x : x)) * 4;\n o.data.set(t.data.subarray(si, si + 4), (y * tw + x) * 4);\n }\n return o;\n };\n for (let ty = 0; ty < mh; ty++) {\n for (let tx = 0; tx < mw; tx++) {\n const t = read(tx, ty);\n let id = keys.get(key(t)), f = 0;\n if (id === undefined && opts.flips) {\n for (const [fx, fy, code] of [[1, 0, 1], [0, 1, 2], [1, 1, 3]]) {\n const k = keys.get(key(flip(t, fx, fy)));\n if (k !== undefined) { id = k; f = code; break; }\n }\n }\n if (id === undefined) { id = tiles.length; tiles.push(t); keys.set(key(t), id); }\n map.push(id); flipsOut.push(f);\n }\n }\n const sheet = packSpriteSheet(tiles, { columns: opts.columns || Math.min(16, tiles.length) });\n return {\n image: sheet.image,\n map: { width: mw, height: mh, tileWidth: tw, tileHeight: th, tiles: map, ...(opts.flips ? { flips: flipsOut } : {}) },\n count: tiles.length,\n };\n}\n", "// Every export the editor offers. Long ones show a progress toast that can be cancelled.\n\nimport { encodePNG } from '../core/export/png.js';\nimport { encodeGIF } from '../core/export/gif.js';\nimport { createZip } from '../core/export/zip.js';\nimport { packSpriteSheet, buildTileset } from '../core/export/sheet.js';\nimport { downloadBlob } from '../core/export/canvas.js';\nimport { forEachFrame } from '../core/video/frames.js';\nimport { mergeSettings, settingsToJSON } from '../core/settings.js';\nimport { toast } from './ui.js';\n\nconst base = name => (name || 'image').replace(/\\.[^.]+$/, '').replace(/[^\\w.-]+/g, '-').replace(/^-+|-+$/g, '') || 'image';\nconst pngOpts = s => ({ scale: s.export.scale, grid: s.export.grid, gridColor: s.export.gridColor, indexed: s.export.indexed });\n\n/** Pixel size of an exported image: whole-number scale, or the framed part of the source at full resolution. */\nexport function exportSize(s, r, item) {\n if (s.export.size === 'source' && r && item && r.crop) return { width: Math.max(1, Math.round(r.crop.w * item.width)), height: Math.max(1, Math.round(r.crop.h * item.height)) };\n return { width: r ? r.width * s.export.scale : 0, height: r ? r.height * s.export.scale : 0 };\n}\n/** PNG options for one exported image. */\nconst imageOpts = (s, r, item) => (s.export.size === 'source' && item ? { ...exportSize(s, r, item), indexed: s.export.indexed } : pngOpts(s));\n\nexport function createExporter(app) {\n const S = () => app.store.settings;\n\n async function exportPNG() {\n if (!app.result) return toast('Open an image first', { kind: 'error' });\n const s = S();\n const bytes = await encodePNG(app.result, imageOpts(s, app.result, app.current));\n const out = exportSize(s, app.result, app.current);\n const suffix = s.export.size === 'source' ? `-${out.width}x${out.height}` : s.export.scale > 1 ? `@${s.export.scale}x` : '';\n downloadBlob(bytes, `${base(app.current.name)}-${app.result.width}x${app.result.height}${suffix}.png`, 'image/png');\n toast(`Saved ${out.width} \u00D7 ${out.height} PNG`, { kind: 'ok' });\n }\n\n async function copyImage() {\n if (!app.result) return;\n try {\n const bytes = await encodePNG(app.result, { ...imageOpts(S(), app.result, app.current), indexed: false });\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': new Blob([bytes], { type: 'image/png' }) })]);\n toast('Image copied', { kind: 'ok' });\n } catch (e) { toast(`Couldn't copy: ${e.message}`, { kind: 'error' }); }\n }\n\n /** Run `fn` with a cancellable progress toast. */\n async function task(label, fn) {\n const ctrl = new AbortController();\n const t = toast(label, { progress: true, onCancel: () => ctrl.abort() });\n app.exporting = true;\n try {\n const msg = await fn(ctrl.signal, (p, m) => { t.progress(p); if (m) t.update(m); });\n t.done(msg);\n } catch (e) {\n t.close();\n if (e.name !== 'AbortError') { toast(`Export failed: ${e.message}`, { kind: 'error' }); console.error(e); }\n else toast('Export cancelled');\n } finally {\n app.exporting = false;\n app.schedule();\n }\n }\n\n async function exportZip() {\n const items = app.items.slice();\n if (!items.length) return;\n await task(`Processing ${items.length} files`, async (signal, progress) => {\n const entries = [];\n const own = [];\n for (let i = 0; i < items.length; i++) {\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n const it = items[i];\n const s = app.settingsFor(it); // each file with its own settings, if it has them\n if (it.type === 'video') app.engine.invalidate();\n const r = await app.engine.process(it.source, s);\n entries.push({ name: `${base(it.name)}.png`, data: await encodePNG(r, imageOpts(s, r, it)) });\n if (it.own) own.push({ name: `${base(it.name)}.settings.json`, data: settingsToJSON(s) });\n progress((i + 1) / items.length, `Processed ${i + 1} of ${items.length}`);\n }\n entries.push({ name: 'settings.json', data: settingsToJSON(app.shared) }, ...own);\n downloadBlob(createZip(entries), 'pixel-art.zip', 'application/zip');\n return `Saved ${items.length} images as a ZIP`;\n });\n }\n\n /** Process the frames chosen in the Animation section; calls onFrame(result, i, total). */\n async function frames(opts, signal, progress, onFrame) {\n const s = S();\n if (opts.source === 'files') {\n const items = app.items.filter(i => i.type === 'image');\n let size = null;\n for (let i = 0; i < items.length; i++) {\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n // each file keeps its own look, but every frame must share the first frame's size\n const own = app.settingsFor(items[i]);\n const r = await app.engine.process(items[i].source, size ? mergeSettings(own, { size }) : own);\n if (!size) size = { mode: 'width', width: r.width, height: r.height };\n await onFrame(r, i, items.length, items[i].name);\n progress((i + 1) / items.length, `Frame ${i + 1} of ${items.length}`);\n }\n return items.length;\n }\n const item = app.current;\n if (!item || item.type !== 'video') throw new Error('Open a video first');\n const video = item.source;\n const end = opts.end > opts.start ? opts.end : video.duration;\n return forEachFrame(video, {\n fps: opts.fps, start: opts.start, end, signal,\n onFrame: async ({ index, total }) => {\n app.engine.invalidate();\n const r = await app.engine.process(video, s);\n await onFrame(r, index, total, `${base(item.name)}-${String(index).padStart(4, '0')}`);\n progress((index + 1) / total, `Frame ${index + 1} of ${total}`);\n },\n });\n }\n\n async function exportAnimation(opts) {\n const name = opts.source === 'files' ? 'animation' : base(app.current?.name);\n const s = S();\n const delay = 1000 / opts.fps;\n if (opts.format === 'gif' || opts.format === 'png-seq') {\n await task('Rendering frames', async (signal, progress) => {\n const list = [];\n await frames(opts, signal, progress, async (r, i, total, frameName) => {\n if (opts.format === 'gif') list.push({ width: r.width, height: r.height, data: r.data, delay });\n else list.push({ name: `${frameName}.png`, data: await encodePNG(r, pngOpts(s)) });\n });\n if (opts.format === 'gif') {\n progress(1, 'Encoding GIF');\n await new Promise(r => setTimeout(r, 0));\n const bytes = encodeGIF(list, { scale: s.export.scale, loop: 0 });\n downloadBlob(bytes, `${name}.gif`, 'image/gif');\n return `Saved GIF (${list.length} frames, ${(bytes.length / 1024).toFixed(0)} KB)`;\n }\n downloadBlob(createZip(list), `${name}-frames.zip`, 'application/zip');\n return `Saved ${list.length} PNG frames`;\n });\n return;\n }\n // MP4 / WebM through WebCodecs\n await task(`Encoding ${opts.format.toUpperCase()}`, async (signal, progress) => {\n const { createVideoEncoder } = await import('../video.js');\n let enc = null;\n await frames(opts, signal, progress, async r => {\n enc ||= await createVideoEncoder({ format: opts.format, fps: opts.fps, width: r.width, height: r.height, scale: Math.max(s.export.scale, Math.ceil(240 / r.height)) });\n await enc.add(r);\n });\n const blob = await enc.finish();\n downloadBlob(blob, `${name}.${opts.format}`);\n return `Saved ${opts.format.toUpperCase()} (${(blob.size / 1024 / 1024).toFixed(1)} MB)`;\n });\n }\n\n async function exportSheet(opts) {\n const name = opts.source === 'files' ? 'sheet' : `${base(app.current?.name)}-sheet`;\n const s = S();\n await task('Building sprite sheet', async (signal, progress) => {\n const list = [];\n await frames(opts, signal, progress, (r, i, total, frameName) => { list.push({ width: r.width, height: r.height, data: r.data, name: frameName ? base(frameName) : undefined, delay: 1000 / opts.fps }); });\n const { image, atlas } = packSpriteSheet(list, { columns: opts.columns, padding: opts.padding, name });\n if (s.export.scale > 1) {\n // scale the atlas coordinates with the image\n const k = s.export.scale;\n for (const f of Object.values(atlas.frames)) { for (const key of ['x', 'y', 'w', 'h']) f.frame[key] *= k; f.sourceSize.w *= k; f.sourceSize.h *= k; }\n atlas.meta.size.w *= k; atlas.meta.size.h *= k; atlas.meta.scale = String(k);\n }\n const png = await encodePNG(image, pngOpts(s));\n downloadBlob(createZip([{ name: `${name}.png`, data: png }, { name: `${name}.json`, data: JSON.stringify(atlas, null, 2) }]), `${name}.zip`, 'application/zip');\n return `Saved a ${list.length}-frame sprite sheet`;\n });\n }\n\n async function exportTileset({ tile, flips }) {\n if (!app.result) return toast('Open an image first', { kind: 'error' });\n const s = S();\n const ts = buildTileset(app.result, { tileWidth: tile, tileHeight: tile, flips });\n const name = `${base(app.current.name)}-tiles`;\n const png = await encodePNG(ts.image, pngOpts(s));\n const map = { ...ts.map, image: `${name}.png`, note: 'tiles[] holds one tile index per cell, row by row' + (flips ? '; flips[] is 0 none, 1 horizontal, 2 vertical, 3 both' : '') };\n downloadBlob(createZip([{ name: `${name}.png`, data: png }, { name: `${name}.json`, data: JSON.stringify(map, null, 2) }]), `${name}.zip`, 'application/zip');\n toast(`Saved ${ts.count} unique tiles (${ts.map.width} \u00D7 ${ts.map.height} map)`, { kind: 'ok' });\n }\n\n return { exportPNG, copyImage, exportZip, exportAnimation, exportSheet, exportTileset };\n}\n", "// Menus, dialogs and toasts.\n\nimport { h, render } from './dom.js';\nimport { icon } from './icons.js';\n\nlet toastHost = null;\nconst host = () => (toastHost ||= document.body.appendChild(h('div.itp-toasts.itp', { role: 'status', 'aria-live': 'polite' })));\n\n/**\n * Show a toast. Returns { update(msg), progress(0..1), close() }.\n * @param {string} msg\n * @param {{ kind?: 'info'|'ok'|'error', timeout?: number, action?: { label, onClick }, progress?: boolean, onCancel?: () => void }} [o]\n */\nexport function toast(msg, o = {}) {\n const kind = o.kind || 'info';\n const text = h('div.msg', {}, h('div', { text: msg }));\n const bar = o.progress ? h('div.itp-progress', {}, h('i')) : null;\n if (bar) text.append(bar);\n const el = h(`div.itp-toast.${kind}`, {}, o.progress ? h('div.itp-spinner') : h('span.itp-dot'), text);\n if (o.action) el.append(h('button.itp-btn.small.outline', { type: 'button', text: o.action.label, onclick: () => { o.action.onClick(); close(); } }));\n if (o.onCancel) el.append(h('button.itp-btn.small', { type: 'button', text: 'Cancel', onclick: () => { o.onCancel(); close(); } }));\n else el.append(h('button.itp-btn.small.icon', { type: 'button', 'aria-label': 'Dismiss', html: icon('x'), onclick: () => close() }));\n host().append(el);\n let timer = null;\n const close = () => { clearTimeout(timer); el.remove(); };\n const arm = ms => { clearTimeout(timer); if (ms) timer = setTimeout(close, ms); };\n arm(o.timeout ?? (o.progress ? 0 : kind === 'error' ? 7000 : 3200));\n return {\n update(m) { text.firstChild.textContent = m; },\n progress(p) { if (bar) bar.firstChild.style.width = `${Math.round(p * 100)}%`; },\n close,\n done(m, k = 'ok') { close(); toast(m, { kind: k }); },\n };\n}\n\nlet openMenu = null;\n/**\n * Popover menu anchored to a button.\n * items: [{ label, sub?, icon?, kbd?, onClick, disabled? } | 'sep' | { group: 'Label' }]\n */\nexport function menu(anchor, items, { align = 'end' } = {}) {\n closeMenu();\n const el = h('div.itp-menu.itp', { role: 'menu' });\n for (const it of items) {\n if (it === 'sep') { el.append(h('hr')); continue; }\n if (it.group) { el.append(h('div.mlabel', { text: it.group })); continue; }\n const b = h('button.mi', { type: 'button', role: 'menuitem', disabled: !!it.disabled },\n h('span', { html: it.icon ? icon(it.icon) : '' }),\n h('span', {}, it.label, it.sub ? h('small', { text: it.sub }) : null),\n it.kbd ? h('kbd', { text: it.kbd }) : h('span'));\n b.addEventListener('click', () => { closeMenu(); it.onClick(); });\n el.append(b);\n }\n document.body.append(el);\n const r = anchor.getBoundingClientRect();\n const mw = el.offsetWidth, mh = el.offsetHeight;\n let left = align === 'end' ? r.right - mw : r.left;\n left = Math.max(8, Math.min(left, innerWidth - mw - 8));\n let top = r.bottom + 6;\n if (top + mh > innerHeight - 8) top = Math.max(8, r.top - mh - 6);\n Object.assign(el.style, { left: `${left}px`, top: `${top}px` });\n anchor.setAttribute('aria-expanded', 'true');\n const buttons = [...el.querySelectorAll('button.mi:not(:disabled)')];\n buttons[0]?.focus();\n const onKey = e => {\n const i = buttons.indexOf(document.activeElement);\n if (e.key === 'Escape') { e.preventDefault(); closeMenu(); anchor.focus(); }\n else if (e.key === 'ArrowDown') { e.preventDefault(); buttons[(i + 1) % buttons.length]?.focus(); }\n else if (e.key === 'ArrowUp') { e.preventDefault(); buttons[(i - 1 + buttons.length) % buttons.length]?.focus(); }\n else if (e.key === 'Tab') closeMenu();\n };\n const onDown = e => { if (!el.contains(e.target) && e.target !== anchor && !anchor.contains(e.target)) closeMenu(); };\n el.addEventListener('keydown', onKey);\n setTimeout(() => document.addEventListener('pointerdown', onDown, true));\n openMenu = { el, anchor, cleanup: () => document.removeEventListener('pointerdown', onDown, true) };\n}\nexport function closeMenu() {\n if (!openMenu) return;\n openMenu.cleanup(); openMenu.el.remove(); openMenu.anchor.setAttribute('aria-expanded', 'false');\n openMenu = null;\n}\n\n/** Modal dialog. Returns the <dialog>; content can be updated with render(). */\nexport function dialog(title, content, { actions = [], onClose } = {}) {\n const body = h('div.content', {}, content);\n const d = h('dialog.itp-dialog.itp', { 'aria-label': title },\n h('header', {}, h('h2', { text: title }), h('button.itp-btn.icon', { type: 'button', 'aria-label': 'Close', html: icon('x'), onclick: () => d.close() })),\n body,\n actions.length ? h('footer', {}, ...actions.map(a => h(`button.itp-btn${a.primary ? '.primary' : '.outline'}`, { type: 'button', text: a.label, onclick: async () => { if ((await a.onClick?.()) !== false) d.close(); } }))) : null,\n );\n d.addEventListener('close', () => { d.remove(); onClose?.(); });\n document.body.append(d);\n d.showModal();\n d.body = body;\n d.setContent = (...c) => render(body, ...c);\n return d;\n}\n", "// localStorage wrappers. Every access is guarded: storage may be disabled or full.\n\nconst PREFIX = 'itp:';\n\nexport function load(key, fallback) {\n try {\n const v = localStorage.getItem(PREFIX + key);\n return v == null ? fallback : JSON.parse(v);\n } catch { return fallback; }\n}\n\nexport function save(key, value) {\n try { localStorage.setItem(PREFIX + key, JSON.stringify(value)); return true; } catch { return false; }\n}\n\nexport function remove(key) {\n try { localStorage.removeItem(PREFIX + key); } catch { /* ignore */ }\n}\n", "// Right-hand inspector: Setup (everything that changes the image) and Export.\n\nimport { h, render } from './dom.js';\nimport { icon } from './icons.js';\nimport { section, slider, select, segmented, toggle, colorInput, numberInput, field } from './controls.js';\nimport { exportSize } from './exporter.js';\nimport { DITHER_METHODS, ditherKind, defaultSettings, ASPECTS, cropRect } from '../core/settings.js';\nimport * as persist from './persist.js';\nimport { PALETTES } from '../core/palette/builtin.js';\nimport { parseMatrix } from '../core/dither/matrices.js';\n\nexport function createInspector(app) {\n const { store } = app;\n const up = (patch, key) => store.update(patch, { key });\n const commit = () => store.commit();\n const S = () => store.settings;\n const DEF = defaultSettings();\n const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);\n\n // Sections start collapsed except the first of each tab; the person's choice is remembered.\n const openState = persist.load('sections', {});\n const sec = (key, title, defaultOpen, groups, ...children) => section(title, {\n open: openState[key] ?? defaultOpen,\n onToggle: open => { openState[key] = open; persist.save('sections', openState); },\n onReset: groups ? () => {\n const patch = {};\n for (const g of groups) patch[g] = JSON.parse(JSON.stringify(DEF[g]));\n store.update(patch);\n } : null,\n }, ...children);\n\n // ---- head: stats + tabs\n const statSize = h('div.v', { text: '\u2013' });\n const statColors = h('div.v', { text: '\u2013' });\n const statTime = h('div.v', { text: '\u2013' });\n const stats = h('div.itp-stats', { 'aria-live': 'polite' },\n h('div.itp-stat', {}, h('div.k', { text: 'Output' }), statSize),\n h('div.itp-stat', {}, h('div.k', { text: 'Colours' }), statColors),\n h('div.itp-stat', {}, h('div.k', { text: 'Render' }), statTime));\n\n const tabSetup = h('button', { type: 'button', role: 'tab', 'aria-selected': 'true', id: 'itp-tab-setup', 'aria-controls': 'itp-pane-setup', html: `${icon('sliders')}<span>Setup</span>` });\n const tabExport = h('button', { type: 'button', role: 'tab', 'aria-selected': 'false', id: 'itp-tab-export', 'aria-controls': 'itp-pane-export', html: `${icon('download')}<span>Export</span>` });\n const tabs = h('div.itp-seg', { role: 'tablist', 'aria-label': 'Inspector' }, tabSetup, tabExport);\n\n // ---- which settings am I editing? (only shown with two or more files)\n const scope = segmented({\n label: 'Settings apply to', bare: true,\n options: [{ value: 'shared', label: 'All files', icon: 'layers' }, { value: 'own', label: 'This file', icon: 'unlink' }],\n value: 'shared',\n onChange: v => app.current && app.setOwn(app.current, v === 'own'),\n });\n const scopeNote = h('span.itp-scope-note', {});\n const scopeRow = h('div.itp-scope', { hidden: true }, h('div.lab', {}, h('span', { text: 'Settings apply to' }), scopeNote), scope.el);\n\n // =========================================================== SETUP\n // ---- size\n const sizeMode = segmented({ label: 'Size by', options: [{ value: 'width', label: 'Width' }, { value: 'block', label: 'Pixel size' }], value: 'width', onChange: v => up({ size: { mode: v } }) });\n const width = slider({ label: 'Pixel width', min: 8, max: 512, step: 1, value: 96, reset: 96, onInput: v => up({ size: { width: v } }, 'width'), onCommit: commit });\n const height = numberInput({ label: 'Height', min: 0, max: 2048, help: 'Leave empty to keep the aspect ratio.', onChange: v => up({ size: { height: v } }) });\n height.input.placeholder = 'Auto';\n const block = slider({ label: 'Pixel size', min: 1, max: 64, step: 1, value: 8, reset: 8, help: 'How many source pixels become one output pixel.', onInput: v => up({ size: { block: v } }, 'block'), onCommit: commit });\n const resample = segmented({ label: 'Resample', options: [{ value: 'box', label: 'Average' }, { value: 'nearest', label: 'Nearest' }], value: 'box', help: 'Nearest keeps hard edges; use it for art that is already pixelated.', onChange: v => up({ size: { resample: v } }) });\n const detect = h('button.itp-btn.small.outline', { type: 'button', html: `${icon('grid')}<span>Detect grid</span>`, title: 'Find the pixel size of upscaled pixel art', onclick: () => app.detectGrid() });\n const widthBox = h('div', { style: { display: 'contents' } }, width.el, height.el);\n const blockBox = h('div', { style: { display: 'contents' } }, block.el);\n const secSize = sec('size', 'Size', true, ['size'], sizeMode.el, widthBox, blockBox, resample.el, h('div.itp-row', {}, detect));\n\n // ---- frame (crop to an aspect ratio, zoom in, choose the part)\n const aspectBtns = ASPECTS.map(a => {\n const r = a.ratio || 4 / 3;\n const glyph = h('i', { style: { width: `${Math.round(r >= 1 ? 16 : 16 * r)}px`, height: `${Math.round(r >= 1 ? 16 / r : 16)}px` } });\n if (!a.ratio) glyph.classList.add('orig');\n return h('button', { type: 'button', 'aria-pressed': 'false', title: a.id === 'original' ? 'The source\\'s own shape' : `Crop to ${a.label}`, onclick: () => up({ frame: { aspect: a.id } }) }, glyph, h('span', { text: a.label }));\n });\n const aspects = h('div.itp-aspects', { role: 'group', 'aria-label': 'Aspect ratio' }, ...aspectBtns);\n const fZoom = slider({ label: 'Zoom', min: 1, max: 8, step: 0.05, value: 1, reset: 1, help: 'Crop into the middle of the frame.', onInput: v => up({ frame: { zoom: v } }, 'fz'), onCommit: commit });\n const fX = slider({ label: 'Horizontal position', min: 0, max: 1, step: 0.01, scale: 100, value: 0.5, reset: 0.5, onInput: v => up({ frame: { x: v } }, 'fx'), onCommit: commit });\n const fY = slider({ label: 'Vertical position', min: 0, max: 1, step: 0.01, scale: 100, value: 0.5, reset: 0.5, onInput: v => up({ frame: { y: v } }, 'fy'), onCommit: commit });\n const secFrame = sec('frame', 'Frame', false, ['frame'], field('Aspect ratio', aspects), fZoom.el, fX.el, fY.el);\n\n // ---- palette\n const palSource = select({ label: 'Source', options: [\n { value: 'builtin', label: 'Built-in palette' }, { value: 'custom', label: 'Custom colours' },\n { value: 'extract', label: 'From the image' }, { value: 'none', label: 'None (keep colours)' },\n ], onChange: v => up({ palette: { source: v } }) });\n const palBuiltin = select({ label: 'Palette', options: PALETTES.map(p => ({ value: p.id, label: `${p.name} (${p.colors.length})` })), onChange: v => up({ palette: { source: 'builtin', id: v } }) });\n const palCount = slider({ label: 'Number of colours', min: 2, max: 64, step: 1, value: 16, reset: 16, onInput: v => up({ palette: { count: v } }, 'count'), onCommit: commit });\n const swatches = h('div.itp-swatches', { role: 'list', 'aria-label': 'Palette colours' });\n const swCount = h('span.val.num', {});\n const swatchField = field('Colours', swatches, { value: swCount });\n const palDistance = segmented({ label: 'Colour matching', options: [{ value: 'oklab', label: 'Perceptual' }, { value: 'rgb', label: 'RGB' }], value: 'oklab', onChange: v => up({ palette: { distance: v } }) });\n const palActions = h('div.itp-row', { style: { flexWrap: 'wrap' } },\n h('button.itp-btn.small.outline', { type: 'button', html: `${icon('upload')}<span>Import</span>`, title: '.gpl, .hex, .pal, .txt or .json', onclick: () => app.importPalette() }),\n h('button.itp-btn.small.outline', { type: 'button', html: `${icon('palette')}<span>Lospec</span>`, onclick: () => app.lospecDialog() }),\n h('button.itp-btn.small.outline', { type: 'button', html: `${icon('pipette')}<span>Pick</span>`, title: 'Add colours by clicking the image', 'aria-pressed': 'false', onclick: e => app.togglePicker(e.currentTarget) }),\n h('button.itp-btn.small', { type: 'button', html: `${icon('download')}<span>Save</span>`, title: 'Save to Your palettes', onclick: () => app.savePalette() }));\n const secPal = sec('palette', 'Palette', false, ['palette'], palSource.el, palBuiltin.el, palCount.el, swatchField, palDistance.el, palActions);\n\n // ---- dither\n const groups = { none: 'None', ordered: 'Ordered', diffusion: 'Error diffusion' };\n const dMethod = select({ label: 'Method', options: DITHER_METHODS.map(m => ({ value: m.id, label: m.label, group: groups[m.kind] })), onChange: v => up({ dither: { method: v } }) });\n const dStrength = slider({ label: 'Strength', min: 0, max: 1, step: 0.01, scale: 100, value: 0.6, reset: 0.6, onInput: v => up({ dither: { strength: v } }, 'strength'), onCommit: commit });\n const matrixText = h('textarea.itp-input', { rows: 4, spellcheck: false, 'aria-label': 'Custom threshold matrix', placeholder: '0 8 2 10\\n12 4 14 6\\n3 11 1 9\\n15 7 13 5' });\n const matrixHelp = h('div.help', { text: 'Rows of numbers, up to 16\u00D716. Only their order matters.' });\n matrixText.addEventListener('change', () => {\n try { up({ dither: { method: 'custom', matrix: parseMatrix(matrixText.value) } }); matrixHelp.textContent = 'Rows of numbers, up to 16\u00D716. Only their order matters.'; matrixHelp.style.color = ''; }\n catch (e) { matrixHelp.textContent = e.message; matrixHelp.style.color = 'var(--danger)'; }\n });\n const matrixBox = h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Matrix' })), matrixText, matrixHelp);\n const secDither = sec('dither', 'Dither', false, ['dither'], dMethod.el, dStrength.el, matrixBox);\n\n // ---- adjust\n const pct = { min: -1, max: 1, step: 0.01, scale: 100, value: 0, reset: 0 };\n const aBright = slider({ label: 'Brightness', ...pct, onInput: v => up({ adjust: { brightness: v } }, 'br'), onCommit: commit });\n const aContrast = slider({ label: 'Contrast', ...pct, onInput: v => up({ adjust: { contrast: v } }, 'co'), onCommit: commit });\n const aSat = slider({ label: 'Saturation', ...pct, onInput: v => up({ adjust: { saturation: v } }, 'sa'), onCommit: commit });\n const aHue = slider({ label: 'Hue', min: -180, max: 180, step: 1, value: 0, reset: 0, help: 'Rotates every colour around the colour wheel; greys stay grey.', onInput: v => up({ adjust: { hue: v } }, 'hu'), onCommit: commit });\n const aGamma = slider({ label: 'Gamma', min: 0.2, max: 3, step: 0.05, value: 1, reset: 1, onInput: v => up({ adjust: { gamma: v } }, 'ga'), onCommit: commit });\n const secAdjust = sec('adjust', 'Adjust', false, ['adjust'], aBright.el, aContrast.el, aSat.el, aHue.el, aGamma.el);\n\n // ---- cleanup & outline\n const alphaCut = slider({ label: 'Alpha cutoff', min: 0, max: 1, step: 0.01, scale: 100, value: 0.5, reset: 0.5, help: 'Pixels less opaque than this become transparent.', onInput: v => up({ alpha: { threshold: v } }, 'alpha'), onCommit: commit });\n const orphans = toggle({ label: 'Remove stray pixels', onChange: v => up({ cleanup: { orphans: v } }) });\n const smooth = toggle({ label: 'Smooth small specks', onChange: v => up({ cleanup: { smooth: v } }) });\n const olMode = segmented({ label: 'Outline', options: [{ value: 'none', label: 'None' }, { value: 'outer', label: 'Outside' }, { value: 'inner', label: 'Inside' }], value: 'none', help: 'Follows transparent edges.', onChange: v => up({ outline: { mode: v } }) });\n const olColor = colorInput({ label: 'Outline colour', onChange: v => up({ outline: { color: v } }, 'olc') });\n const olCorners = toggle({ label: 'Include diagonals', onChange: v => up({ outline: { corners: v } }) });\n const secClean = sec('cleanup', 'Cleanup & outline', false, ['cleanup', 'outline', 'alpha'], orphans.el, smooth.el, alphaCut.el, olMode.el, olColor.el, olCorners.el);\n\n const setupPane = h('div', { id: 'itp-pane-setup', role: 'tabpanel', 'aria-labelledby': 'itp-tab-setup' }, secSize.el, secFrame.el, secPal.el, secDither.el, secAdjust.el, secClean.el);\n\n // =========================================================== EXPORT\n const exMode = segmented({ label: 'Size', options: [{ value: 'scale', label: 'Scale' }, { value: 'source', label: 'Source size' }], value: 'scale', help: '', onChange: v => up({ export: { size: v } }) });\n const exScale = slider({ label: 'Scale', min: 1, max: 32, step: 1, value: 4, reset: 4, help: 'Whole-number upscale keeps every pixel square.', onInput: v => up({ export: { scale: v } }, 'scale'), onCommit: commit });\n const exSizeOut = h('span.val.num', {});\n const exGrid = toggle({ label: 'Grid lines', onChange: v => up({ export: { grid: v } }) });\n const exIndexed = toggle({ label: 'Indexed PNG', help: 'Smaller files; up to 256 colours.', onChange: v => up({ export: { indexed: v } }) });\n const btnPNG = h('button.itp-btn.primary.block', { type: 'button', html: `${icon('download')}<span>Download PNG</span>`, onclick: () => app.exportPNG() });\n const btnCopy = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('copy')}<span>Copy image</span>`, onclick: () => app.copyImage() });\n const btnZip = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('zip')}<span>Download all as ZIP</span>`, onclick: () => app.exportZip() });\n const secImage = sec('image', 'Image', true, ['export'], field('Output size', h('div'), { value: exSizeOut }), exMode.el, exScale.el, exGrid.el, exIndexed.el, h('div.itp-grid2', {}, btnPNG, btnCopy), btnZip);\n\n // animation\n const anSource = select({ label: 'Frames from', options: [{ value: 'video', label: 'Current video' }, { value: 'files', label: 'All files, in order' }], onChange: () => syncAnim() });\n const anFormat = select({ label: 'Format', options: [\n { value: 'gif', label: 'GIF' }, { value: 'webm', label: 'WebM video' }, { value: 'mp4', label: 'MP4 video' }, { value: 'png-seq', label: 'PNG sequence (ZIP)' },\n ], onChange: () => syncAnim() });\n const anFps = numberInput({ label: 'Frames per second', min: 1, max: 60, onChange: () => { } });\n const anStart = numberInput({ label: 'Start (s)', min: 0, max: 36000, step: 0.1, onChange: () => { } });\n const anEnd = numberInput({ label: 'End (s)', min: 0, max: 36000, step: 0.1, onChange: () => { } });\n const anNote = h('div.help', {});\n const btnAnim = h('button.itp-btn.primary.block', { type: 'button', html: `${icon('film')}<span>Export animation</span>`, onclick: () => app.exportAnimation(animOpts()) });\n const secAnim = sec('animation', 'Animation', false, null, anSource.el, anFormat.el, anFps.el, h('div.itp-grid2', {}, anStart.el, anEnd.el), anNote, btnAnim);\n anFps.set(12); anStart.set(0); anEnd.set(0);\n const animOpts = () => ({ source: anSource.select.value, format: anFormat.select.value, fps: Number(anFps.input.value) || 12, start: Number(anStart.input.value) || 0, end: Number(anEnd.input.value) || 0 });\n\n // sprite sheet\n const shCols = numberInput({ label: 'Columns', min: 0, max: 256, help: '0 = as square as possible.', onChange: () => { } });\n const shPad = numberInput({ label: 'Padding', min: 0, max: 64, onChange: () => { } });\n shCols.set(0); shPad.set(0);\n const btnSheet = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('sheet')}<span>Download sprite sheet</span>`, onclick: () => app.exportSheet({ ...animOpts(), columns: Number(shCols.input.value) || 0, padding: Number(shPad.input.value) || 0 }) });\n const secSheet = sec('sheet', 'Sprite sheet', false, null, h('div.help', { text: 'Packs the frames chosen under Animation into one PNG with a JSON atlas (TexturePacker hash format).' }), h('div.itp-grid2', {}, shCols.el, shPad.el), btnSheet);\n\n // tileset\n const tsSize = select({ label: 'Tile size', options: [8, 12, 16, 24, 32, 48, 64].map(n => ({ value: String(n), label: `${n} \u00D7 ${n}` })), onChange: () => { } });\n tsSize.set('16');\n const tsFlips = toggle({ label: 'Count mirrored tiles as duplicates', onChange: () => { } });\n const btnTiles = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('tiles')}<span>Download tileset</span>`, onclick: () => app.exportTileset({ tile: Number(tsSize.select.value), flips: tsFlips.el.querySelector('input').checked }) });\n const secTiles = sec('tileset', 'Tileset', false, null, h('div.help', { text: 'Cuts the current result into tiles, keeps one copy of each and writes a tile map.' }), tsSize.el, tsFlips.el, btnTiles);\n\n // settings\n const secSettings = sec('settings', 'Settings', false, null,\n h('div.itp-grid2', {},\n h('button.itp-btn.outline', { type: 'button', html: `${icon('link')}<span>Copy link</span>`, onclick: () => app.copyLink() }),\n h('button.itp-btn.outline', { type: 'button', html: `${icon('braces')}<span>Save JSON</span>`, onclick: () => app.saveSettingsFile() })),\n h('button.itp-btn.outline.block', { type: 'button', html: `${icon('upload')}<span>Load settings file</span>`, onclick: () => app.loadSettingsFile() }));\n\n const exportPane = h('div', { id: 'itp-pane-export', role: 'tabpanel', 'aria-labelledby': 'itp-tab-export', hidden: true }, secImage.el, secAnim.el, secSheet.el, secTiles.el, secSettings.el);\n\n // ---- footer\n const foot = h('div.itp-insp-foot', {},\n h('button.itp-link', { type: 'button', text: 'Reset to defaults', onclick: () => app.resetSettings() }),\n h('span.muted', { style: { fontSize: 'var(--fs-xs)' }, id: 'itp-backend' }));\n\n const body = h('div.itp-panel-body', {}, setupPane, exportPane);\n const el = h('aside.itp-insp', { 'aria-label': 'Inspector' }, h('div.itp-insp-head', {}, stats, scopeRow, tabs), h('div', { style: { height: '8px' } }), body, foot);\n\n function setTab(t) {\n const setup = t === 'setup';\n tabSetup.setAttribute('aria-selected', String(setup)); tabExport.setAttribute('aria-selected', String(!setup));\n setupPane.hidden = !setup; exportPane.hidden = setup;\n if (!setup) syncAnim();\n }\n tabSetup.onclick = () => setTab('setup');\n tabExport.onclick = () => setTab('export');\n tabs.addEventListener('keydown', e => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') { const next = tabSetup.getAttribute('aria-selected') === 'true' ? tabExport : tabSetup; next.click(); next.focus(); }\n });\n\n function syncAnim() {\n const cur = app.current;\n const hasVideo = cur && cur.type === 'video';\n const nImages = app.items.filter(i => i.type === 'image').length;\n if (!hasVideo && anSource.select.value === 'video' && nImages > 1) anSource.set('files');\n if (hasVideo && anSource.select.value === 'files' && nImages < 2) anSource.set('video');\n const src = anSource.select.value;\n const ok = src === 'video' ? hasVideo : nImages > 1;\n anStart.el.hidden = anEnd.el.hidden = src !== 'video';\n btnAnim.disabled = !ok; btnSheet.disabled = !ok;\n if (hasVideo && !Number(anEnd.input.value)) anEnd.set(Math.round((cur.duration || 0) * 10) / 10);\n if (hasVideo && cur.fps && !anFps.input.dataset.touched) anFps.set(Math.min(30, Math.round(cur.fps)));\n const f = anFormat.select.value;\n anNote.textContent = !ok\n ? (src === 'video' ? 'Open a video to export an animation.' : 'Add two or more images to animate them.')\n : (f === 'mp4' || f === 'webm') && !app.videoSupport?.[f] ? `${f.toUpperCase()} encoding isn't available in this browser. GIF and PNG sequence always work.` : '';\n }\n anFps.input.addEventListener('change', () => { anFps.input.dataset.touched = '1'; });\n\n // ---- sync from state\n function renderSwatches(colors, editable) {\n render(swatches, ...colors.map((c, i) => {\n const b = h('button.itp-swatch', { type: 'button', role: 'listitem', title: editable ? `${c}. Click to change, Alt+click to remove` : c, style: { background: c } });\n b.setAttribute('aria-label', editable ? `${c}, edit` : c);\n if (editable) {\n b.addEventListener('click', e => {\n if (e.altKey) { const next = S().palette.colors.filter((_, j) => j !== i); if (next.length) up({ palette: { colors: next } }); return; }\n const inp = h('input', { type: 'color', value: c, style: { position: 'fixed', opacity: 0, pointerEvents: 'none' } });\n document.body.append(inp);\n inp.addEventListener('input', () => { const next = S().palette.colors.slice(); next[i] = inp.value; up({ palette: { colors: next } }, 'sw' + i); });\n inp.addEventListener('change', () => inp.remove());\n inp.click();\n });\n } else {\n b.addEventListener('click', () => { up({ palette: { source: 'custom', colors: S().palette.colors.slice(), name: `${S().palette.name} (edited)` } }); app.toast('Copied to a custom palette you can edit'); });\n }\n return b;\n }), editable ? h('button.itp-swatch.add', { type: 'button', 'aria-label': 'Add colour', title: 'Add colour', html: icon('plus'), onclick: () => up({ palette: { colors: [...S().palette.colors, '#808080'] } }) }) : null);\n }\n\n let lastPaletteKey = '';\n function sync(s, result) {\n sizeMode.set(s.size.mode);\n widthBox.hidden = s.size.mode !== 'width'; blockBox.hidden = s.size.mode !== 'block';\n width.set(s.size.width); height.set(s.size.height || ''); block.set(s.size.block); resample.set(s.size.resample);\n secSize.setHint(result ? `${result.width} \u00D7 ${result.height}` : '');\n\n palSource.set(s.palette.source); palBuiltin.set(s.palette.id);\n palBuiltin.el.hidden = s.palette.source !== 'builtin';\n palCount.el.hidden = s.palette.source !== 'extract';\n palCount.set(s.palette.count);\n palDistance.set(s.palette.distance);\n palDistance.el.hidden = s.palette.source === 'none';\n swatchField.hidden = s.palette.source === 'none';\n const shown = s.palette.source === 'extract' ? (result && result.palette) || [] : s.palette.colors;\n const key = s.palette.source + shown.join();\n if (key !== lastPaletteKey) { lastPaletteKey = key; renderSwatches(shown, s.palette.source === 'custom'); }\n swCount.textContent = String(shown.length);\n secPal.setHint(s.palette.source === 'none' ? 'None' : s.palette.name);\n\n dMethod.set(s.dither.method); dStrength.set(s.dither.strength);\n const kind = ditherKind(s.dither.method);\n dStrength.el.hidden = kind === 'none';\n matrixBox.hidden = s.dither.method !== 'custom';\n if (s.dither.method === 'custom' && document.activeElement !== matrixText) matrixText.value = (s.dither.matrix || []).map(r => r.join(' ')).join('\\n');\n secDither.setHint(s.palette.source === 'none' ? 'Needs a palette' : DITHER_METHODS.find(m => m.id === s.dither.method).label);\n secDither.el.querySelector('select').disabled = s.palette.source === 'none';\n\n aBright.set(s.adjust.brightness); aContrast.set(s.adjust.contrast); aSat.set(s.adjust.saturation); aHue.set(s.adjust.hue); aGamma.set(s.adjust.gamma);\n const adjusted = s.adjust.brightness || s.adjust.contrast || s.adjust.saturation || s.adjust.hue || s.adjust.gamma !== 1;\n\n // frame\n aspectBtns.forEach((b, i) => b.setAttribute('aria-pressed', String(ASPECTS[i].id === s.frame.aspect)));\n fZoom.set(s.frame.zoom); fX.set(s.frame.x); fY.set(s.frame.y);\n const cur = app.current;\n const crop = cur ? cropRect(cur.width, cur.height, s.frame) : null;\n // position sliders only matter when the frame leaves room to move in that direction\n fX.el.hidden = !crop || crop.w >= cur.width;\n fY.el.hidden = !crop || crop.h >= cur.height;\n const framed = s.frame.aspect !== 'original' || s.frame.zoom > 1;\n secFrame.setHint(!framed ? '' : [s.frame.aspect !== 'original' ? s.frame.aspect : '', s.frame.zoom > 1 ? `${Math.round(s.frame.zoom * 100) / 100}\u00D7` : ''].filter(Boolean).join(', '));\n secFrame.setChanged(!same(s.frame, DEF.frame));\n\n // scope\n const many = app.items.length > 1;\n scopeRow.hidden = !(cur && (many || cur.own));\n scope.set(cur && cur.own ? 'own' : 'shared');\n const nShared = app.items.filter(i => !i.own).length;\n scopeNote.textContent = cur && cur.own ? 'Only this file' : `${nShared} ${nShared === 1 ? 'file' : 'files'}`;\n el.dataset.scope = cur && cur.own ? 'own' : 'shared';\n secAdjust.setHint(adjusted ? 'Changed' : '');\n\n alphaCut.set(s.alpha.threshold); orphans.set(s.cleanup.orphans); smooth.set(s.cleanup.smooth);\n olMode.set(s.outline.mode); olColor.set(s.outline.color); olCorners.set(s.outline.corners);\n olColor.el.hidden = olCorners.el.hidden = s.outline.mode === 'none';\n const cl = [s.cleanup.orphans && 'strays', s.cleanup.smooth && 'smooth', s.outline.mode !== 'none' && 'outline'].filter(Boolean);\n secClean.setHint(cl.join(', '));\n\n // reset icons\n secSize.setChanged(!same(s.size, DEF.size));\n secPal.setChanged(!same(s.palette, DEF.palette));\n secDither.setChanged(!same(s.dither, DEF.dither));\n secAdjust.setChanged(!same(s.adjust, DEF.adjust));\n secClean.setChanged(!same([s.cleanup, s.outline, s.alpha], [DEF.cleanup, DEF.outline, DEF.alpha]));\n secImage.setChanged(!same(s.export, DEF.export));\n\n exScale.set(s.export.scale); exGrid.set(s.export.grid); exIndexed.set(s.export.indexed); exMode.set(s.export.size);\n exScale.el.hidden = exGrid.el.hidden = s.export.size === 'source';\n const out = exportSize(s, result, app.current);\n exSizeOut.textContent = result ? `${out.width} \u00D7 ${out.height} px` : '\u2013';\n exMode.el.querySelector('.help')?.remove();\n if (s.export.size === 'source') exMode.el.append(h('div.help', { text: 'The size of the framed part of the source, like a full-resolution download. Pixels can differ by one in size when the ratio isn\\'t a whole number.' }));\n btnZip.hidden = app.items.length < 2;\n btnZip.querySelector('span').textContent = `Download all ${app.items.length} as ZIP`;\n syncAnim();\n }\n\n function setStats(result) {\n if (!result) { statSize.textContent = statColors.textContent = statTime.textContent = '\u2013'; return; }\n statSize.innerHTML = `${result.width}<small>\u00D7 ${result.height}</small>`;\n const used = result.usedColors().length;\n statColors.innerHTML = result.palette ? `${used}<small>/ ${result.palette.length}</small>` : `${used}`;\n statTime.innerHTML = `${result.ms < 10 ? result.ms.toFixed(1) : Math.round(result.ms)}<small>ms</small>`;\n statTime.parentElement.title = result.backend === 'webgl' ? 'Rendered on the GPU (WebGL 2 via ShaderMate)' : 'Rendered on the CPU';\n }\n\n return { el, sync, setStats, setTab, syncAnim };\n}\n\n", "// Left panel: Files (the batch), Presets (live thumbnails) and Palettes.\n\nimport { h, render } from './dom.js';\nimport { menu } from './ui.js';\nimport { icon } from './icons.js';\nimport { PRESETS } from '../core/presets.js';\nimport { PALETTES } from '../core/palette/builtin.js';\nimport { mergeSettings, defaultSettings } from '../core/settings.js';\n\nexport function createLibrary(app) {\n let tab = 'files';\n const tabBtn = (id, label, ic) => h('button', { type: 'button', role: 'tab', 'aria-selected': String(id === tab), html: `${icon(ic)}<span>${label}</span>`, onclick: () => setTab(id) });\n const tFiles = tabBtn('files', 'Files', 'files');\n const tPresets = tabBtn('presets', 'Presets', 'presets');\n const tPalettes = tabBtn('palettes', 'Palettes', 'palette');\n const filesCount = h('span.count', {});\n tFiles.append(filesCount);\n const tabs = h('div.itp-seg', { role: 'tablist', 'aria-label': 'Library' }, tFiles, tPresets, tPalettes);\n\n const search = h('input', { type: 'search', placeholder: 'Search', 'aria-label': 'Search the library' });\n const searchBox = h('div.itp-search', {}, h('span', { html: icon('search') }), search);\n search.addEventListener('input', () => renderTab());\n\n const body = h('div.itp-panel-body', {});\n const el = h('aside.itp-lib', { 'aria-label': 'Library' }, h('div.itp-panel-head', {}, tabs), searchBox, body);\n\n function setTab(t) {\n tab = t;\n for (const [b, id] of [[tFiles, 'files'], [tPresets, 'presets'], [tPalettes, 'palettes']]) b.setAttribute('aria-selected', String(id === t));\n search.value = '';\n renderTab();\n if (t === 'presets' && !thumbs.size) refreshThumbs();\n }\n const q = () => search.value.trim().toLowerCase();\n\n // ---- files\n function fileMenu(it, anchor) {\n const i = app.items.indexOf(it), many = app.items.length > 1;\n menu(anchor, [\n it.own\n ? { label: 'Use shared settings', sub: 'Drop this file\\'s own settings', icon: 'link', onClick: () => app.setOwn(it, false) }\n : { label: 'Give it its own settings', sub: 'Edits stop affecting other files', icon: 'unlink', disabled: !many, onClick: () => app.setOwn(it, true) },\n 'sep',\n { label: 'Copy settings', icon: 'copy', onClick: () => app.copySettings(it) },\n { label: 'Paste settings', sub: app.clipboard ? 'Gives this file its own settings' : 'Copy settings from a file first', icon: 'clipboard', disabled: !app.clipboard, onClick: () => app.pasteSettings(it) },\n { label: 'Apply these settings to all files', icon: 'layers', disabled: !many, onClick: () => app.applyToAll(it) },\n 'sep',\n { label: 'Duplicate', sub: 'A copy with its own settings, to compare looks', icon: 'copy', onClick: () => app.duplicate(it) },\n { label: 'Move up', icon: 'arrowUp', kbd: 'Alt Shift \u2191', disabled: i <= 0, onClick: () => app.move(it, -1) },\n { label: 'Move down', icon: 'arrowDown', kbd: 'Alt Shift \u2193', disabled: i >= app.items.length - 1, onClick: () => app.move(it, 1) },\n 'sep',\n { label: 'Remove', icon: 'trash', kbd: 'Del', onClick: () => app.removeItem(it) },\n ], { align: 'start' });\n }\n\n function renderFiles() {\n const items = app.items.filter(i => !q() || i.name.toLowerCase().includes(q()));\n const list = h('ul.itp-files', { 'aria-label': 'Files' });\n for (const it of items) {\n const more = h('button.itp-btn.small.icon', { type: 'button', 'aria-label': `Options for ${it.name}`, 'aria-haspopup': 'menu', title: 'Settings, duplicate, order', html: icon('more'), onclick: e => { e.stopPropagation(); fileMenu(it, more); } });\n const sub = it.type === 'video' ? `Video, ${fmtTime(it.duration)}` : `${it.width} \u00D7 ${it.height}`;\n const row = h('li.itp-file-row', { tabindex: '0', 'aria-current': String(app.current === it), 'data-own': it.own ? 'true' : null },\n h('img.thumb', { src: it.thumb || '', alt: '' }),\n h('div', { style: { minWidth: 0 } },\n h('div.title', { text: it.name }),\n h('div.sub', {}, sub, it.own ? h('span.itp-own', { title: 'This file has its own settings', html: `${icon('unlink')}<span>Own</span>` }) : null)),\n h('div.actions', {}, more,\n h('button.itp-btn.small.icon.danger', { type: 'button', 'aria-label': `Remove ${it.name}`, title: 'Remove', html: icon('x'), onclick: e => { e.stopPropagation(); app.removeItem(it); } })));\n row.addEventListener('click', () => app.select(it));\n row.addEventListener('contextmenu', e => { e.preventDefault(); app.select(it); fileMenu(it, more); });\n row.addEventListener('keydown', e => {\n if (e.target !== row) return;\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); app.select(it); }\n if (e.key === 'Delete' || e.key === 'Backspace') { e.preventDefault(); app.removeItem(it); }\n if (e.altKey) return; // Alt+arrows are global shortcuts (next file, move file)\n if (e.key === 'ArrowDown') { e.preventDefault(); row.nextElementSibling?.focus(); }\n if (e.key === 'ArrowUp') { e.preventDefault(); row.previousElementSibling?.focus(); }\n if (e.key === 'ContextMenu' || (e.key === 'F10' && e.shiftKey)) { e.preventDefault(); fileMenu(it, more); }\n });\n list.append(row);\n }\n const nOwn = app.items.filter(i => i.own).length;\n const summary = !app.items.length ? 'No files yet'\n : app.items.length === 1 ? '1 file'\n : nOwn ? `${app.items.length} files, ${nOwn} with ${nOwn === 1 ? 'its' : 'their'} own settings`\n : `${app.items.length} files, shared settings`;\n const head = h('div.itp-group', {}, h('span', { text: summary }),\n app.items.length > 1 ? h('button.itp-link', { type: 'button', text: 'Clear', onclick: () => app.clearItems() }) : null);\n const add = h('div', { style: { padding: '4px 12px 12px', display: 'flex', gap: '6px' } },\n h('button.itp-btn.outline.small', { type: 'button', html: `${icon('plus')}<span>Add files</span>`, onclick: () => app.openFiles() }),\n h('button.itp-btn.small', { type: 'button', html: `${icon('clipboard')}<span>Paste</span>`, title: 'Paste an image from the clipboard (Ctrl+V)', onclick: () => app.pasteFromClipboard() }));\n render(body, head, list, add, h('div.itp-group', {}, h('span', { text: 'Drop images or videos anywhere in the window. Files share one set of settings unless you give one its own (\u22EF menu or right-click).' })));\n }\n\n // ---- presets (thumbnails rendered from the current image)\n const thumbs = new Map(); // preset id \u2192 canvas\n let thumbGen = 0;\n function renderPresets() {\n const cur = app.store.settings;\n const list = PRESETS.filter(p => !q() || (p.name + p.description).toLowerCase().includes(q()));\n const grid = h('div.itp-presets', {});\n for (const p of list) {\n const active = app.activePreset === p.id;\n const pic = thumbs.get(p.id) || h('div.ph', {});\n const b = h('button.itp-preset', { type: 'button', 'aria-pressed': String(active), title: p.description, onclick: () => app.applyPreset(p) },\n pic, h('span.t', { text: p.name }), h('span.d', { text: p.description }));\n grid.append(b);\n }\n render(body, h('div.itp-group', {}, h('span', { text: 'Presets replace the current settings. Undo with Ctrl+Z.' })), grid);\n void cur;\n }\n async function refreshThumbs() {\n const gen = ++thumbGen;\n const item = app.current;\n if (!item || !app.engine) return;\n for (const p of PRESETS) {\n if (gen !== thumbGen) return;\n const s = mergeSettings(defaultSettings(), p.settings);\n // small, fast previews: cap the width and skip slow-on-CPU diffusion sizes\n s.size = { ...s.size, mode: 'width', width: Math.min(s.size.width, 72), height: 0 };\n try {\n const r = await app.engine.process(item.source, s);\n if (gen !== thumbGen) return;\n const c = r.toCanvas(1);\n thumbs.set(p.id, c);\n if (tab === 'presets') renderPresets();\n } catch { /* ignore a failed thumbnail */ }\n }\n }\n\n // ---- palettes\n function palRow(p, active, removable) {\n const strip = h('div.itp-strip', {}, ...p.colors.slice(0, 64).map(c => h('i', { style: { background: c.startsWith('#') ? c : '#' + c } })));\n const row = h('li.itp-pal', { tabindex: '0', role: 'button', 'aria-pressed': String(active) },\n h('div.row', {}, h('span', { text: p.name }), h('span.n', { text: String(p.colors.length), title: p.author ? `by ${p.author}` : null })), strip);\n const pick = () => app.usePalette(p);\n row.addEventListener('click', pick);\n row.addEventListener('keydown', e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); pick(); } if (removable && (e.key === 'Delete')) app.deletePalette(p); });\n if (removable) {\n const del = h('button.itp-btn.small.icon.danger', { type: 'button', 'aria-label': `Delete ${p.name}`, title: 'Delete', html: icon('trash'), onclick: e => { e.stopPropagation(); app.deletePalette(p); } });\n row.firstChild.append(del);\n }\n return row;\n }\n function renderPalettes() {\n const s = app.store.settings.palette;\n const match = p => !q() || (p.name + ' ' + (p.author || '')).toLowerCase().includes(q()) || String(p.colors.length) === q();\n const mine = app.userPalettes.filter(match);\n const built = PALETTES.filter(match);\n const actions = h('div', { style: { padding: '0 12px 4px', display: 'flex', gap: '6px', flexWrap: 'wrap' } },\n h('button.itp-btn.outline.small', { type: 'button', html: `${icon('upload')}<span>Import file</span>`, onclick: () => app.importPalette() }),\n h('button.itp-btn.small', { type: 'button', html: `${icon('palette')}<span>From Lospec</span>`, onclick: () => app.lospecDialog() }));\n const yours = mine.length ? [h('div.itp-group', {}, h('span', { text: 'Your palettes' }), h('span.itp-badge', { text: String(mine.length) })),\n h('ul.itp-pal-list', {}, ...mine.map(p => palRow(p, s.source === 'custom' && s.name === p.name, true)))] : [];\n render(body, actions, ...yours,\n h('div.itp-group', {}, h('span', { text: 'Built-in' }), h('span.itp-badge', { text: String(built.length) })),\n h('ul.itp-pal-list', {}, ...built.map(p => palRow({ ...p, colors: p.colors.map(c => '#' + c) }, s.source === 'builtin' && s.id === p.id, false))));\n }\n\n function renderTab() {\n filesCount.textContent = app.items.length ? String(app.items.length) : '';\n if (tab === 'files') renderFiles();\n else if (tab === 'presets') renderPresets();\n else renderPalettes();\n }\n\n return {\n el,\n refresh: renderTab,\n setTab,\n /** Focus a file's row (after it moved). */\n focusFile(item) { if (tab === 'files') body.querySelectorAll('.itp-file-row')[app.items.indexOf(item)]?.focus(); },\n /** The current image changed: rebuild preset thumbnails. */\n sourceChanged() { thumbs.clear(); thumbGen++; if (tab === 'presets') { renderTab(); refreshThumbs(); } },\n get tab() { return tab; },\n };\n}\n\nexport function fmtTime(t = 0) {\n const m = Math.floor(t / 60), s = t - m * 60;\n return `${m}:${s.toFixed(1).padStart(4, '0')}`;\n}\n", "// Sample images drawn for this project (SVG, MIT like the rest of the code).\n\nconst dusk = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"960\" height=\"640\" viewBox=\"0 0 960 640\">\n<defs>\n<linearGradient id=\"sky\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#1d1a3f\"/><stop offset=\".45\" stop-color=\"#6b3f7c\"/><stop offset=\".72\" stop-color=\"#e0766a\"/><stop offset=\".86\" stop-color=\"#f6c27a\"/></linearGradient>\n<radialGradient id=\"sun\" cx=\".5\" cy=\".5\" r=\".5\"><stop offset=\"0\" stop-color=\"#fff4d6\"/><stop offset=\".35\" stop-color=\"#ffd98a\"/><stop offset=\".6\" stop-color=\"#ffb46a\" stop-opacity=\".55\"/><stop offset=\"1\" stop-color=\"#ff9a6a\" stop-opacity=\"0\"/></radialGradient>\n<linearGradient id=\"m1\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#8a4f7d\"/><stop offset=\"1\" stop-color=\"#5a3566\"/></linearGradient>\n<linearGradient id=\"m2\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#4c2f5e\"/><stop offset=\"1\" stop-color=\"#2d2147\"/></linearGradient>\n<linearGradient id=\"m3\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#22193a\"/><stop offset=\"1\" stop-color=\"#140f25\"/></linearGradient>\n<linearGradient id=\"lake\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#f2a873\"/><stop offset=\".35\" stop-color=\"#8d4f78\"/><stop offset=\"1\" stop-color=\"#1b1734\"/></linearGradient>\n</defs>\n<rect width=\"960\" height=\"640\" fill=\"url(#sky)\"/>\n<g fill=\"#fff\" opacity=\".7\"><circle cx=\"90\" cy=\"60\" r=\"1.6\"/><circle cx=\"210\" cy=\"110\" r=\"1.2\"/><circle cx=\"330\" cy=\"40\" r=\"1.4\"/><circle cx=\"700\" cy=\"70\" r=\"1.6\"/><circle cx=\"820\" cy=\"130\" r=\"1.1\"/><circle cx=\"560\" cy=\"30\" r=\"1.2\"/><circle cx=\"880\" cy=\"40\" r=\"1.3\"/></g>\n<circle cx=\"600\" cy=\"400\" r=\"190\" fill=\"url(#sun)\"/>\n<circle cx=\"600\" cy=\"400\" r=\"58\" fill=\"#fff1cf\"/>\n<g fill=\"#f7c9a0\" opacity=\".55\"><ellipse cx=\"220\" cy=\"250\" rx=\"140\" ry=\"12\"/><ellipse cx=\"300\" cy=\"270\" rx=\"90\" ry=\"8\"/><ellipse cx=\"760\" cy=\"230\" rx=\"120\" ry=\"10\"/></g>\n<path d=\"M0 410 L120 330 L190 370 L300 280 L390 350 L470 310 L560 380 L660 300 L760 360 L860 290 L960 340 V470 H0Z\" fill=\"url(#m1)\"/>\n<path d=\"M0 440 L90 390 L170 420 L260 360 L350 425 L450 380 L540 430 L640 375 L740 430 L840 385 L960 420 V480 H0Z\" fill=\"url(#m2)\"/>\n<path d=\"M0 470 L140 430 L260 455 L380 425 L520 462 L660 432 L800 458 L960 436 V500 H0Z\" fill=\"url(#m3)\"/>\n<rect y=\"480\" width=\"960\" height=\"160\" fill=\"url(#lake)\"/>\n<g fill=\"#ffe8bf\" opacity=\".8\"><rect x=\"540\" y=\"492\" width=\"120\" height=\"4\" rx=\"2\"/><rect x=\"560\" y=\"508\" width=\"80\" height=\"3\" rx=\"1.5\"/><rect x=\"520\" y=\"524\" width=\"160\" height=\"3\" rx=\"1.5\"/><rect x=\"575\" y=\"542\" width=\"50\" height=\"3\" rx=\"1.5\"/><rect x=\"548\" y=\"562\" width=\"104\" height=\"2\" rx=\"1\"/></g>\n<path d=\"M0 470 L140 430 L260 455 L380 425 L520 462 L660 432 L800 458 L960 436 V480 H0Z\" fill=\"#120d22\" opacity=\".9\"/>\n<path d=\"M60 640 C120 560 180 560 240 640Z\" fill=\"#0d0a1a\"/><path d=\"M780 640 C840 575 900 560 960 600 V640Z\" fill=\"#0d0a1a\"/>\n<g fill=\"none\" stroke=\"#2a1b38\" stroke-width=\"3\" stroke-linecap=\"round\"><path d=\"M300 170 q10 -10 20 0 q10 -10 20 0\"/><path d=\"M350 200 q7 -7 14 0 q7 -7 14 0\"/><path d=\"M262 210 q6 -6 12 0 q6 -6 12 0\"/></g>\n</svg>`;\n\nconst still = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"900\" height=\"680\" viewBox=\"0 0 900 680\">\n<defs>\n<linearGradient id=\"wall\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#2f3b45\"/><stop offset=\"1\" stop-color=\"#1a2129\"/></linearGradient>\n<linearGradient id=\"table\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#9a6a45\"/><stop offset=\"1\" stop-color=\"#4c2f1f\"/></linearGradient>\n<radialGradient id=\"apple\" cx=\".35\" cy=\".3\" r=\".75\"><stop offset=\"0\" stop-color=\"#ffb3a1\"/><stop offset=\".25\" stop-color=\"#e2453c\"/><stop offset=\".8\" stop-color=\"#7a1622\"/><stop offset=\"1\" stop-color=\"#3d0b14\"/></radialGradient>\n<radialGradient id=\"lemon\" cx=\".35\" cy=\".3\" r=\".75\"><stop offset=\"0\" stop-color=\"#fffbd0\"/><stop offset=\".3\" stop-color=\"#f5d34a\"/><stop offset=\".85\" stop-color=\"#a77d16\"/><stop offset=\"1\" stop-color=\"#5a4008\"/></radialGradient>\n<radialGradient id=\"plum\" cx=\".35\" cy=\".3\" r=\".75\"><stop offset=\"0\" stop-color=\"#c7a6ff\"/><stop offset=\".3\" stop-color=\"#6b3fb8\"/><stop offset=\".85\" stop-color=\"#2b1557\"/><stop offset=\"1\" stop-color=\"#140a2c\"/></radialGradient>\n<linearGradient id=\"vase\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"><stop offset=\"0\" stop-color=\"#1c5a63\"/><stop offset=\".35\" stop-color=\"#5fb7b0\"/><stop offset=\".5\" stop-color=\"#c9f0e6\"/><stop offset=\".65\" stop-color=\"#4aa29d\"/><stop offset=\"1\" stop-color=\"#123c44\"/></linearGradient>\n<radialGradient id=\"light\" cx=\".3\" cy=\".1\" r=\".9\"><stop offset=\"0\" stop-color=\"#ffe9c4\" stop-opacity=\".35\"/><stop offset=\"1\" stop-color=\"#ffe9c4\" stop-opacity=\"0\"/></radialGradient>\n<radialGradient id=\"shadow\" cx=\".5\" cy=\".5\" r=\".5\"><stop offset=\"0\" stop-color=\"#000\" stop-opacity=\".55\"/><stop offset=\"1\" stop-color=\"#000\" stop-opacity=\"0\"/></radialGradient>\n</defs>\n<rect width=\"900\" height=\"680\" fill=\"url(#wall)\"/>\n<rect width=\"900\" height=\"680\" fill=\"url(#light)\"/>\n<rect y=\"450\" width=\"900\" height=\"230\" fill=\"url(#table)\"/>\n<rect y=\"450\" width=\"900\" height=\"8\" fill=\"#c08a5c\" opacity=\".7\"/>\n<ellipse cx=\"520\" cy=\"560\" rx=\"120\" ry=\"18\" fill=\"url(#shadow)\"/>\n<path d=\"M470 250 C440 300 430 360 450 420 C460 470 480 520 520 548 C560 520 580 470 590 420 C610 360 600 300 570 250 C565 230 568 205 580 190 H460 C472 205 475 230 470 250Z\" fill=\"url(#vase)\"/>\n<ellipse cx=\"520\" cy=\"190\" rx=\"60\" ry=\"10\" fill=\"#0e2e34\"/>\n<path d=\"M500 190 C495 130 470 100 430 80 M530 190 C540 120 580 90 620 85 M515 190 C515 140 520 110 515 70\" stroke=\"#3f6b3a\" stroke-width=\"5\" fill=\"none\" stroke-linecap=\"round\"/>\n<circle cx=\"430\" cy=\"78\" r=\"22\" fill=\"#f2e6d0\"/><circle cx=\"430\" cy=\"78\" r=\"8\" fill=\"#e8b23c\"/>\n<circle cx=\"622\" cy=\"84\" r=\"18\" fill=\"#f08aa6\"/><circle cx=\"622\" cy=\"84\" r=\"7\" fill=\"#7a2a4a\"/>\n<circle cx=\"515\" cy=\"66\" r=\"15\" fill=\"#f6d8f0\"/><circle cx=\"515\" cy=\"66\" r=\"6\" fill=\"#d9a03a\"/>\n<ellipse cx=\"250\" cy=\"560\" rx=\"95\" ry=\"16\" fill=\"url(#shadow)\"/>\n<circle cx=\"250\" cy=\"490\" r=\"78\" fill=\"url(#apple)\"/>\n<path d=\"M250 418 q6 -26 18 -34\" stroke=\"#4a2a14\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\"/>\n<path d=\"M262 400 q30 -20 46 2 q-26 14 -46 -2Z\" fill=\"#4f8a3a\"/>\n<ellipse cx=\"700\" cy=\"580\" rx=\"90\" ry=\"14\" fill=\"url(#shadow)\"/>\n<ellipse cx=\"690\" cy=\"530\" rx=\"80\" ry=\"56\" fill=\"url(#lemon)\"/>\n<circle cx=\"370\" cy=\"560\" r=\"44\" fill=\"url(#plum)\"/>\n<circle cx=\"780\" cy=\"585\" r=\"34\" fill=\"url(#plum)\"/>\n</svg>`;\n\nconst potion = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"560\" height=\"560\" viewBox=\"0 0 560 560\">\n<defs>\n<radialGradient id=\"glass\" cx=\".38\" cy=\".35\" r=\".7\"><stop offset=\"0\" stop-color=\"#e8fbff\" stop-opacity=\".9\"/><stop offset=\".5\" stop-color=\"#9fd8f0\" stop-opacity=\".55\"/><stop offset=\"1\" stop-color=\"#3a6f9e\" stop-opacity=\".85\"/></radialGradient>\n<linearGradient id=\"liquid\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#ff7ad1\"/><stop offset=\".6\" stop-color=\"#b8248f\"/><stop offset=\"1\" stop-color=\"#5d0e4c\"/></linearGradient>\n<linearGradient id=\"cork\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"><stop offset=\"0\" stop-color=\"#7a4a24\"/><stop offset=\".5\" stop-color=\"#c78a52\"/><stop offset=\"1\" stop-color=\"#6a3c1a\"/></linearGradient>\n</defs>\n<rect x=\"232\" y=\"64\" width=\"96\" height=\"62\" rx=\"12\" fill=\"url(#cork)\"/>\n<rect x=\"222\" y=\"118\" width=\"116\" height=\"40\" rx=\"10\" fill=\"#bfe8f7\"/>\n<path d=\"M240 156 V210 C150 240 104 310 104 380 C104 470 182 520 280 520 C378 520 456 470 456 380 C456 310 410 240 320 210 V156Z\" fill=\"url(#glass)\"/>\n<path d=\"M118 360 C160 340 220 350 280 362 C340 374 400 370 442 352 C452 370 456 380 456 392 C456 476 378 520 280 520 C182 520 104 476 104 392 C104 382 108 370 118 360Z\" fill=\"url(#liquid)\"/>\n<circle cx=\"220\" cy=\"430\" r=\"16\" fill=\"#ffd1f0\" opacity=\".8\"/><circle cx=\"330\" cy=\"460\" r=\"10\" fill=\"#ffd1f0\" opacity=\".7\"/><circle cx=\"300\" cy=\"402\" r=\"7\" fill=\"#ffd1f0\" opacity=\".7\"/>\n<path d=\"M160 300 C180 262 214 240 250 228\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" opacity=\".75\"/>\n<path d=\"M150 340 v12\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\" opacity=\".6\"/>\n<path d=\"M240 156 V210 C150 240 104 310 104 380 C104 470 182 520 280 520 C378 520 456 470 456 380 C456 310 410 240 320 210 V156Z\" fill=\"none\" stroke=\"#1d3150\" stroke-width=\"10\"/>\n</svg>`;\n\nexport const SAMPLES = [\n { id: 'dusk', name: 'Dusk', svg: dusk },\n { id: 'still-life', name: 'Still life', svg: still },\n { id: 'potion', name: 'Potion (transparent)', svg: potion },\n];\n\n/** Data URL for a sample (for thumbnails and <img>). */\nexport const sampleURL = s => 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(s.svg);\n\n/** Load a sample as an ImageBitmap-compatible <img>. */\nexport async function loadSample(s) {\n const img = new Image();\n img.src = sampleURL(s);\n await img.decode();\n return img;\n}\n"],
5
- "mappings": "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",
6
- "names": ["parseColor", "c", "s", "ch", "isColor", "toHex", "rgb", "v", "oklab", "r", "g", "b", "lin", "l", "m", "paletteSpread", "rgbs", "sum", "i", "best", "j", "dr", "dg", "db", "d", "normHex", "LUMA", "init_color", "__esmMin", "upscale", "img", "k", "opts", "w", "h", "out", "src", "sw", "y", "sy", "x", "so", "o", "r", "g", "b", "parseColor", "a", "sa", "oa", "resizeNearest", "width", "height", "xs", "uniqueColors", "limit", "seen", "d", "v", "toHex", "detectGrid", "tolerance", "same", "gcd", "stepY", "stepX", "run", "init_scale", "__esmMin", "init_color", "parseGPL", "text", "lines", "name", "colors", "raw", "line", "nm", "m", "normHex", "parseHexList", "h", "parseJASC", "l", "parseJSON", "obj", "c", "parseLoose", "re", "parsePalette", "filename", "ext", "trimmed", "out", "dedupe", "toGPL", "rows", "g", "b", "toHexFile", "toPaletteJSON", "init_parse", "__esmMin", "init_color", "list", "lospecSlug", "input", "s", "m", "fetchLospec", "slugOrUrl", "f", "slug", "res", "json", "p", "parseJSON", "init_lospec", "__esmMin", "init_parse", "mediaError", "video", "code", "err", "MEDIA_ERRORS", "videoReady", "timeout", "waitOrFail", "e", "sniffVideoCodec", "file", "buf", "NAMES", "i", "type", "head", "m", "seekTo", "time", "presented", "res", "seeked", "wait", "estimateFps", "fallback", "was", "times", "done", "cb", "_", "meta", "deltas", "d", "b", "fps", "r", "frameTimes", "duration", "start", "end", "maxFrames", "out", "n", "forEachFrame", "opts", "wasPaused", "init_frames", "__esmMin", "el", "ev", "ms", "rej", "t", "ok", "onOk", "onErr", "box", "type", "fill", "w", "Writer", "body", "head", "createMp4Muxer", "width", "height", "timescale", "samples", "description", "chunk", "meta", "d", "data", "key", "timestamp", "duration", "t", "us", "pts", "s", "dts", "a", "b", "lastDur", "durs", "i", "offsets", "p", "hasOffsets", "o", "mediaDur", "movieDur", "stts", "last", "ctts", "keys", "dataSize", "ftyp", "buildMoov", "chunkOffset", "fullBox", "MATRIX", "v", "tr", "md", "mi", "di", "st", "name", "ENC", "c", "n", "k", "moovSize", "offset", "moov", "out", "init_mux_mp4", "__esmMin", "r", "version", "flags", "size8", "n", "b", "v", "i", "idBytes", "id", "out", "concat", "parts", "p", "createWebmMuxer", "width", "height", "codec", "fps", "frames", "codecPrivate", "chunk", "meta", "d", "data", "key", "timestamp", "frameMs", "duration", "info", "master", "ID", "uint", "float64", "str", "tracks", "CODEC_IDS", "el", "clusters", "cur", "f", "t", "head", "clusterBytes", "c", "seekHead", "posInfo", "posTracks", "posCues", "pos", "cuePoints", "cues", "header", "segment", "ENC", "init_mux_webm", "__esmMin", "bytes", "x", "s", "children", "video_exports", "__export", "createMp4Muxer", "createVideoEncoder", "createWebmMuxer", "encodeVideo", "estimateFps", "forEachFrame", "frameTimes", "seekTo", "videoReady", "videoSupport", "width", "height", "out", "codec", "AVC", "VP", "opts", "scale", "W", "even", "H", "fps", "bitrate", "muxCodec", "list", "c", "m", "muxer", "error", "encoder", "chunk", "meta", "e", "canvas", "ctx", "i", "frameUs", "img", "up", "upscale", "frame", "r", "frames", "enc", "f", "init_video", "__esmMin", "init_mux_mp4", "init_mux_webm", "init_scale", "init_frames", "n", "PALETTES", "getPalette", "idOrName", "k", "p", "init_color", "SETTINGS_VERSION", "MAX_SIZE", "DITHER_METHODS", "ditherKind", "id", "m", "DEFAULTS", "SETTINGS_VERSION", "clamp", "v", "lo", "hi", "d", "n", "oneOf", "list", "bool", "defaultSettings", "normalizeSettings", "input", "i", "s", "size", "adj", "pal", "dit", "al", "cl", "ol", "ex", "MAX_SIZE", "fr", "ASPECTS", "a", "source", "p", "getPalette", "c", "isColor", "normHex", "method", "DITHER_METHODS", "m", "normalizeMatrix", "h", "w", "out", "y", "row", "x", "cropRect", "srcW", "srcH", "frame", "zoom", "fx", "fy", "resolveSize", "diff", "b", "k", "va", "vb", "g", "kk", "b64url", "str", "bytes", "bin", "compactSettings", "settings", "encodeSettings", "decodeSettings", "obj", "settingsToJSON", "settingsFromJSON", "text", "mergeSettings", "base", "patch", "init_color", "BLUE_NOISE_B64", "fromB64", "b64", "c", "bayer", "n", "m", "s", "next", "y", "x", "v", "toRanks", "rows", "h", "w", "cells", "a", "b", "out", "r", "clustered", "row", "u", "CLUSTER4", "cache", "thresholdMap", "method", "custom", "map", "sq", "BLUE_NOISE_B64", "parseMatrix", "text", "l", "k", "div", "list", "dx", "dy", "w", "KERNELS", "MAX_KERNEL", "kernelSkew", "kernel", "s", "waveCount", "h", "skew", "init_color", "extractPalette", "img", "count", "opts", "maxSamples", "alphaThreshold", "n", "step", "pts", "i", "o", "boxes", "bi", "bestRange", "bestAxis", "b", "a", "lo", "hi", "p", "r", "q", "mid", "centers", "mean", "iter", "sums", "best", "bd", "c", "dr", "dg", "db", "d", "s", "hexes", "toHex", "lum", "h", "v", "list", "g", "init_color", "resample", "src", "w", "h", "mode", "crop", "ox", "oy", "sw", "sh", "d", "stride", "out", "nx", "ny", "xs", "ys", "x", "i", "j", "r", "g", "b", "a", "row", "o", "al", "adjust", "buf", "brightness", "contrast", "saturation", "hue", "gamma", "f", "ig", "hk", "hq", "M", "l", "LUMA", "k", "r2", "g2", "b2", "clamp01", "alphaCut", "threshold", "v", "paletteSpace", "palette", "distance", "coords", "rgb", "c", "oklab", "W_RGB", "nearest", "sp", "p0", "p1", "p2", "w0", "w1", "w2", "best", "bd", "d0", "d1", "d2", "dist", "quantizeOrdered", "plan", "map", "amt", "y", "t", "quantizeDiffusion", "acc", "strength", "kernel", "p", "er", "eg", "eb", "dx", "dy", "wt", "xx", "yy", "q", "key", "N4", "removeOrphans", "px", "ks", "os", "oo", "bc", "n", "smoothMajority", "outline", "color", "corners", "opaque", "inside", "nb", "me", "hit", "makePlan", "settings", "src", "s", "normalizeSettings", "crop", "cropRect", "width", "height", "resolveSize", "colors", "extractFrom", "quantize", "palette", "parseColor", "kind", "ditherKind", "map", "thresholdMap", "kernel", "KERNELS", "skew", "kernelSkew", "paletteSpread", "waveCount", "k", "w", "h", "prep", "resample", "adjust", "bytes", "i", "extractPalette", "runCPU", "plan", "src", "w", "h", "s", "buf", "resample", "adjust", "alphaCut", "px", "quantizeDiffusion", "quantizeOrdered", "removeOrphans", "smoothMajority", "outline", "VERSION", "MAX_CHANNELS", "DEFAULT_CANVAS_ID", "ShaderMateError", "message", "details", "warned", "warnOnce", "key", "args", "isBrowser", "isArrayLike", "v", "toArray", "isPow2", "n", "parseColor", "c", "_a", "_b", "_c", "_d", "isBrowser", "cv", "x", "d", "isDevHost", "h", "RefPool", "gl", "obj", "type", "id", "it", "createEmitter", "forward", "map", "on", "ev", "fn", "off", "once", "wrapped", "data", "emit", "e", "clear", "EASES", "t", "createTweens", "active", "tween", "key", "get", "set", "to", "opts", "duration", "delay", "ease", "prev", "from", "isArr", "f", "resolve", "tw", "v", "now", "p", "clamp01", "a", "i", "update", "cancel", "normalizePasses", "input", "list", "ShaderMateError", "_e", "names", "dupes", "n", "chans", "MAX_CHANNELS", "normalizeChannel", "isEl", "isBitmap", "isTex", "ch", "passNames", "ownerName", "out", "isInlineSource", "src", "isWebGL2", "createContext", "canvas", "options", "attrs", "want", "getExtensions", "isGL2", "ext", "createQuad", "buf", "program", "loc", "parseShaderLog", "log", "lines", "userStart", "l", "errors", "row", "m", "logical", "physical", "compileShader", "label", "showExpandedOnError", "sh", "stage", "summary", "err", "marks", "numbered", "line", "createProgram", "vsrc", "fsrc", "getUniformInfo", "info", "VERT_GL2", "VERT_GL1", "BUILTIN_MACROS_GL2", "BUILTIN_MACROS_GL1", "MAIN_WRAP_GL2", "MAIN_WRAP_GL1", "FRAG_GL2", "FRAG_GL1", "createBlit", "quad", "r", "uTex", "uSize", "tex", "w", "wrapMode", "wrap", "filterMode", "filter", "chooseFormat", "ifmt", "fmt", "isRenderable", "fbo", "ok", "createTarget", "pool", "wanted", "chosen", "warnOnce", "filterOpt", "depthTex", "status", "deleteTarget", "resolvePassSize", "size", "cw", "BUILTIN_UNIFORMS", "stripComments", "s", "BUILTIN_DEFINES", "declareFragColor", "code", "FRAGCOORD_UNIFORMS", "SAMPLER_BUILTINS", "looksLikeFragCoord", "declareBuiltins", "channelTypes", "declared", "name", "used", "types", "resolveIncludes", "loader", "throwOnError", "warn", "done", "stack", "expand", "re", "last", "path", "raw", "expanded", "defineLines", "defines", "k", "DEFAULT_INJECT", "NO_INJECT", "assembleFragment", "enableDerivatives", "inject", "builtinOpts", "versionLine", "body", "vm", "head", "fragDecl", "userOut", "clean", "needWrap", "makeTexture2D", "source", "params", "env", "dynamic", "flipDefault", "flip", "npotLimited", "isPow2", "mip", "minFilter", "upload", "loadImage", "url", "res", "rej", "img", "FACE_NAMES", "loadCubeMap", "urls", "faces", "loaded", "failed", "u", "playOnGesture", "media", "go", "loadVideo", "video", "wrapper", "loadCamera", "constraints", "stream", "loadAudio", "mic", "spectro", "fftSize", "AC", "ctx", "analyser", "bins", "wave", "H", "rawFFT", "rawAnalyser", "getTime", "cleanup", "finish", "resume", "audio", "owned", "connect", "isCanvas", "el", "isVideo", "loadElement", "live", "base", "wrapTexture", "loadKeyboard", "held", "pressed", "toggle", "target", "onDown", "onUp", "onBlur", "loadChannel", "channelSamplerType", "splitPassBlob", "text", "heads", "bufferType", "num", "parseBracketSettings", "word", "parseUniformComments", "uniforms", "samplers", "init", "comment", "spec", "parseSamplerComment", "nums", "range", "defaults", "comps", "isBool", "value", "ref", "usesMouseVec4", "GL_SAMPLER_2D", "GL_SAMPLER_CUBE", "auxPasses", "passObjs", "resolveSamplerSpecs", "po", "instanceSamplers", "aux", "screen", "byName", "annotated", "mm", "needsMainBackbuffer", "createCamera", "speed", "sensitivity", "pos", "yaw", "pitch", "keys", "dragging", "lastX", "lastY", "dir", "view", "onKey", "down", "kd", "ku", "pd", "pm", "pu", "wh", "blur", "lookAt", "upW", "rl", "dt", "right", "mv", "vec", "ALIASES", "add", "desc", "resolveUniformType", "GL_TYPES", "describeGLType", "glType", "GL_FLOAT", "GL_FLOAT_VEC4", "isUniformSpec", "isArrayLike", "toList", "uploadUniform", "transpose", "applyUniformMap", "strict", "warnMissing", "inf", "createPointer", "getFit", "smooth", "state", "clickPending", "moved", "paintedRect", "fit", "ba", "ra", "toShader", "clientX", "clientY", "toUV", "cx", "cy", "y", "onMove", "onLeave", "onWheel", "parseAspect", "parseSizing", "hasCanvas", "_f", "cfg", "createSizer", "ratio", "styled", "cssBox", "measure", "box", "applyStyle", "pending", "schedule", "ro", "createVisibility", "enabled", "margin", "onChange", "tabVisible", "inView", "notify", "onVis", "io", "entries", "DEFAULT_THEME", "resolveTheme", "createStats", "visible", "position", "theme", "T", "shown", "accDt", "accCpu", "lastDom", "show", "ms", "createErrorOverlay", "place", "esc", "title", "createCapture", "renderNow", "screenshot", "quality", "toBlob", "b", "download", "filename", "blob", "saveBlob", "record", "fps", "mimeType", "bitsPerSecond", "dl", "rec", "chunks", "handle", "finished", "normalizeArgs", "resolveCanvas", "DEFAULT_CANVAS_ID", "setUniformIn", "cur", "readUniform", "createShader", "autoSetup", "globalDefines", "toArray", "commonSrc", "dialect", "includeStore", "strictUniforms", "warnUniforms", "showExpanded", "useOverlay", "givenCanvas", "bg", "emitter", "sizer", "pointer", "tweens", "overlay", "stats", "PASSES", "disposed", "rafId", "removeResize", "lastRender", "frame", "time", "playing", "timeScale", "fixedDelta", "maxFps", "loopLen", "maxDelta", "lastError", "refreshRate", "rafDts", "camera", "blit", "mainBackbuffer", "visibility", "reportError", "clearError", "loadText", "includeLoader", "commonText", "getCommon", "parsed", "buildProgram", "pass", "allPasses", "common", "full", "fc", "samplerNames", "frag", "resizeTargets", "handleResize", "loadPassChannels", "expandPassBlob", "unsupported", "passes", "build", "compiled", "fragcoord", "passTexture", "buffer", "drawPass", "iteration", "set1f", "set1i", "rw", "rh", "ky", "sz", "sw", "chTimes", "chRes", "texObj", "isCube", "chTime", "unit", "bindTex", "units", "frameStep", "advance", "rawDt", "t0", "loop", "startLoop", "stopLoop", "destroy", "onContextLost", "onContextRestored", "teardownPasses", "capture", "passName", "api", "hit", "scheduleRender", "owner", "renderQueued", "setShader", "setChannel", "index", "old", "VERSION", "readyPromise", "width", "height", "float", "COMMON", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "canvasOf", "w", "h", "c", "createGPUBackend", "probe", "dbg", "renderer", "canvas", "source", "palette", "matrix", "nearest", "el", "sm", "createShader", "COMMON", "MAX_KERNEL", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "failure", "e", "passUniforms", "name", "values", "k", "lastSource", "paletteKey", "matrixKey", "setSource", "frame", "ctx", "setPalette", "plan", "key", "img", "i", "setMatrix", "map", "m", "run", "s", "diffusion", "kernel", "_", "v", "data", "out", "row", "y", "hasDOM", "isRGBA", "s", "loadImage", "src", "img", "sizeOf", "el", "unwrap", "toFrame", "source", "opts", "maxSize", "frame", "c", "width", "height", "k", "canvas", "ctx", "cached", "init_scale", "init_scale", "toCanvas", "img", "scale", "opts", "up", "upscale", "c", "downloadBlob", "data", "filename", "type", "blob", "url", "a", "table", "crc32", "bytes", "crc", "c", "k", "i", "init_scale", "SIG", "deflate", "bytes", "cs", "stream", "deflateSync", "chunk", "type", "data", "out", "dv", "crc32", "indexImage", "img", "d", "map", "colors", "idx", "i", "o", "k", "v", "encodePNG", "opts", "resizeNearest", "upscale", "w", "h", "ix", "ihdr", "parts", "raw", "bits", "stride", "y", "row", "x", "bit", "c", "last", "total", "s", "p", "isVideo", "s", "isVideoFrame", "createPixelator", "options", "want", "gpu", "gpuError", "createGPUBackend", "e", "scratch", "last", "queue", "frameFor", "source", "frame", "toFrame", "processNow", "settings", "t0", "plan", "makePlan", "data", "backend", "diffusionOnCPU", "runCPU", "ms", "makeResult", "run", "uniqueColors", "scale", "opts", "toCanvas", "encodePNG", "init_parse", "init_lospec", "init_scale", "init_color", "init_frames", "PRESETS", "h", "tag", "props", "children", "name", "classes", "el", "k", "v", "append", "c", "render", "uid", "nextId", "p", "pickFiles", "accept", "multiple", "res", "input", "h", "P", "icon", "name", "cls", "ICON_NAMES", "createStore", "initialSettings", "settings", "normalizeSettings", "target", "past", "future", "histories", "subs", "lastKey", "lastTime", "LIMIT", "emit", "why", "fn", "same", "a", "b", "patch", "opts", "next", "mergeSettings", "now", "coalesce", "key", "value", "h", "ZOOM_STEPS", "createStage", "onPick", "onViewChange", "screen", "h", "splitLeft", "splitRight", "handle", "icon", "split", "el", "ctx", "st", "dpr", "vw", "vh", "pattern", "patternKey", "checker", "css", "a", "b", "key", "c", "g", "resize", "r", "d", "draw", "fit", "fitZoom", "pad", "notify", "view", "zoomTo", "z", "cx", "cy", "px", "py", "zoomStep", "dir", "cur", "next", "s", "x", "y", "w", "hh", "sx", "ow", "oh", "x0", "x1", "y0", "y1", "i", "j", "drag", "pointers", "e", "u", "v", "prev", "other", "id", "d0", "d1", "end", "move", "ev", "up", "result", "original", "crop", "sizeChanged", "oldRect", "on", "section", "title", "opts", "children", "id", "nextId", "hintEl", "h", "toggle", "icon", "reset", "body", "el", "setOpen", "open", "t", "changed", "field", "label", "control", "help", "value", "lab", "slider", "o", "k", "step", "range", "num", "paint", "p", "set", "v", "round", "d", "select", "groups", "opt", "node", "g", "segmented", "btns", "seg", "b", "i", "input", "colorInput", "hex", "box", "numberInput", "init_scale", "init_color", "ByteWriter", "b", "nb", "arr", "i", "v", "s", "lzwEncode", "indices", "minCodeSize", "w", "clear", "eoi", "codeSize", "next", "dict", "cur", "curBits", "sub", "block", "emit", "code", "prefix", "k", "key", "hit", "keyOf", "d", "o", "tableFor", "colorKeys", "transparent", "list", "colors", "tIndex", "bits", "index", "reduce", "frame", "max", "pal", "extractPalette", "parseColor", "cache", "best", "bd", "dr", "dg", "db", "dist", "encodeGIF", "frames", "opts", "scale", "fr", "f", "upscale", "W", "H", "all", "perFrame", "opaqueCount", "global", "c", "f0", "table", "set", "idx", "p", "enc", "createZip", "entries", "files", "central", "offset", "used", "e", "name", "m", "i", "nameBytes", "data", "crc", "crc32", "d", "time", "date", "local", "lv", "cen", "cv", "cenSize", "s", "c", "end", "ev", "out", "o", "p", "blank", "w", "h", "blit", "dst", "src", "dx", "dy", "sx", "sy", "sw", "sh", "y", "so", "o", "packSpriteSheet", "frames", "opts", "pad", "cw", "f", "ch", "cols", "rows", "W", "H", "image", "out", "i", "atlas", "buildTileset", "img", "tw", "th", "mw", "mh", "tiles", "keys", "map", "flipsOut", "read", "tx", "ty", "t", "x", "key", "s", "flip", "fx", "fy", "si", "id", "code", "k", "init_frames", "toastHost", "host", "h", "toast", "msg", "o", "kind", "text", "bar", "el", "close", "icon", "timer", "ms", "m", "p", "k", "openMenu", "menu", "anchor", "items", "align", "closeMenu", "it", "b", "r", "mw", "mh", "left", "top", "buttons", "onKey", "e", "i", "onDown", "dialog", "title", "content", "actions", "onClose", "body", "d", "c", "render", "base", "name", "pngOpts", "s", "exportSize", "r", "item", "imageOpts", "createExporter", "app", "S", "exportPNG", "toast", "bytes", "encodePNG", "out", "suffix", "downloadBlob", "copyImage", "e", "task", "label", "fn", "ctrl", "t", "msg", "p", "m", "exportZip", "items", "signal", "progress", "entries", "own", "i", "it", "settingsToJSON", "createZip", "frames", "opts", "onFrame", "size", "mergeSettings", "video", "end", "forEachFrame", "index", "total", "exportAnimation", "delay", "list", "frameName", "encodeGIF", "createVideoEncoder", "enc", "blob", "exportSheet", "image", "atlas", "packSpriteSheet", "k", "f", "key", "png", "exportTileset", "tile", "flips", "ts", "buildTileset", "map", "PREFIX", "load", "key", "fallback", "v", "save", "value", "createInspector", "app", "store", "up", "patch", "key", "commit", "S", "DEF", "defaultSettings", "same", "a", "b", "openState", "load", "sec", "title", "defaultOpen", "groups", "children", "section", "open", "save", "g", "statSize", "h", "statColors", "statTime", "stats", "tabSetup", "icon", "tabExport", "tabs", "scope", "segmented", "v", "scopeNote", "scopeRow", "sizeMode", "width", "slider", "height", "numberInput", "block", "resample", "detect", "widthBox", "blockBox", "secSize", "aspectBtns", "ASPECTS", "r", "glyph", "aspects", "fZoom", "fX", "fY", "secFrame", "field", "palSource", "select", "palBuiltin", "PALETTES", "p", "palCount", "swatches", "swCount", "swatchField", "palDistance", "palActions", "e", "secPal", "dMethod", "DITHER_METHODS", "m", "dStrength", "matrixText", "matrixHelp", "parseMatrix", "matrixBox", "secDither", "pct", "aBright", "aContrast", "aSat", "aHue", "aGamma", "secAdjust", "alphaCut", "orphans", "toggle", "smooth", "olMode", "olColor", "colorInput", "olCorners", "secClean", "setupPane", "exMode", "exScale", "exSizeOut", "exGrid", "exIndexed", "btnPNG", "btnCopy", "btnZip", "secImage", "anSource", "syncAnim", "anFormat", "anFps", "anStart", "anEnd", "anNote", "btnAnim", "animOpts", "secAnim", "shCols", "shPad", "btnSheet", "secSheet", "tsSize", "n", "tsFlips", "btnTiles", "secTiles", "secSettings", "exportPane", "foot", "body", "el", "setTab", "t", "setup", "next", "cur", "hasVideo", "nImages", "i", "src", "ok", "f", "renderSwatches", "colors", "editable", "render", "c", "_", "j", "inp", "lastPaletteKey", "sync", "s", "result", "shown", "kind", "ditherKind", "adjusted", "crop", "cropRect", "framed", "many", "nShared", "cl", "out", "exportSize", "setStats", "used", "createLibrary", "app", "tab", "tabBtn", "id", "label", "ic", "h", "icon", "setTab", "tFiles", "tPresets", "tPalettes", "filesCount", "tabs", "search", "searchBox", "renderTab", "body", "el", "t", "b", "thumbs", "refreshThumbs", "q", "fileMenu", "it", "anchor", "i", "many", "menu", "renderFiles", "items", "list", "more", "e", "sub", "fmtTime", "row", "nOwn", "summary", "head", "add", "render", "thumbGen", "renderPresets", "cur", "PRESETS", "p", "grid", "active", "pic", "gen", "item", "s", "mergeSettings", "defaultSettings", "r", "c", "palRow", "removable", "strip", "pick", "del", "renderPalettes", "match", "mine", "built", "PALETTES", "actions", "yours", "m", "dusk", "still", "potion", "SAMPLES", "sampleURL", "s", "loadSample", "img", "IMAGE_TYPES", "VIDEO_TYPES", "PALETTE_EXT", "mountEditor", "root", "options", "usePersist", "narrow", "initial", "load", "defaultSettings", "decodeSettings", "toast", "store", "createStore", "app", "m", "o", "stage", "createStage", "pickAt", "updateZoomLabel", "inspector", "createInspector", "library", "createLibrary", "exporter", "createExporter", "btn", "ic", "label", "onclick", "extra", "h", "icon", "fileName", "fileMeta", "undoBtn", "redoBtn", "compareBtn", "toggleCompare", "gridBtn", "toggleGrid", "zoomBtn", "e", "zoomMenu", "themeBtn", "toggleTheme", "libBtn", "togglePanel", "inspBtn", "helpBtn", "showHelp", "exportBtn", "exportMenu", "brand", "top", "sampleButtons", "SAMPLES", "s", "openSample", "sampleURL", "empty", "openFiles", "pasteFromClipboard", "status", "busy", "viewTools", "playBtn", "togglePlay", "timeLabel", "scrub", "fpsLabel", "transport", "stepFrame", "stageWrap", "shell", "render", "applyTheme", "createPixelator", "v", "dirty", "running", "lastSource", "outCanvas", "schedule", "run", "item", "updateStatus", "slow", "res", "r", "it", "fmtTime", "why", "cur", "saveSoon", "saveT", "save", "makeThumb", "drawable", "w", "hgt", "c", "k", "addImage", "name", "file", "hh", "addVideo", "video", "videoReady", "codec", "sniffVideoCodec", "alt", "err", "seekTo", "estimateFps", "f", "updateTransport", "pumpVideo", "addFiles", "files", "media", "palettes", "settingsFiles", "importPaletteFile", "text", "obj", "settingsFromJSON", "first", "t", "i", "select", "pickFiles", "img", "loadSample", "items", "type", "b", "editTarget", "togglePicker", "removeItem", "settingsFor", "clone", "force", "key", "setOwn", "own", "quiet", "was", "afterScopeChange", "snapshot", "copy", "nameCopy", "dir", "j", "frame", "tick", "on", "anchor", "menu", "z", "which", "open", "dark", "next", "pixelsOf", "maxSize", "ctx", "u", "x", "hex", "toHex", "colors", "pickerBtn", "button", "usePalette", "rememberPalette", "list", "p", "parsePalette", "input", "fmt", "dialog", "slug", "downloadBlob", "toGPL", "toHexFile", "toPaletteJSON", "note", "d", "fetchLospec", "detectGrid", "settingsToJSON", "url", "encodeSettings", "mergeSettings", "images", "animDefaults", "a", "typing", "DITHER_ORDER", "mod", "closeMenu", "dragDepth", "source", "id", "PRESETS"]
3
+ "sources": ["../lib/core/color.js", "../lib/core/export/scale.js", "../lib/core/palette/parse.js", "../lib/core/palette/lospec.js", "../lib/core/video/frames.js", "../lib/core/video/audio.js", "../lib/core/video/mux-mp4.js", "../lib/core/video/mux-webm.js", "../lib/video.js", "../lib/core/palette/builtin.js", "../lib/core/settings.js", "../lib/core/plan.js", "../lib/core/dither/bluenoise-data.js", "../lib/core/dither/matrices.js", "../lib/core/dither/kernels.js", "../lib/core/palette/extract.js", "../lib/core/cpu/stages.js", "../lib/core/cpu/pipeline.js", "../node_modules/shadermate/src/constants.js", "../node_modules/shadermate/src/utils/util.js", "../node_modules/shadermate/src/core/RefPool.js", "../node_modules/shadermate/src/core/events.js", "../node_modules/shadermate/src/core/tween.js", "../node_modules/shadermate/src/core/passes.js", "../node_modules/shadermate/src/gl/context.js", "../node_modules/shadermate/src/gl/quad.js", "../node_modules/shadermate/src/gl/shader.js", "../node_modules/shadermate/src/glsl/templates.js", "../node_modules/shadermate/src/gl/blit.js", "../node_modules/shadermate/src/gl/params.js", "../node_modules/shadermate/src/gl/targets.js", "../node_modules/shadermate/src/glsl/builtins.js", "../node_modules/shadermate/src/glsl/preprocess.js", "../node_modules/shadermate/src/loaders/image.js", "../node_modules/shadermate/src/loaders/cubemap.js", "../node_modules/shadermate/src/loaders/video.js", "../node_modules/shadermate/src/loaders/audio.js", "../node_modules/shadermate/src/loaders/element.js", "../node_modules/shadermate/src/loaders/keyboard.js", "../node_modules/shadermate/src/loaders/index.js", "../node_modules/shadermate/src/glsl/fragcoord.js", "../node_modules/shadermate/src/core/samplers.js", "../node_modules/shadermate/src/input/camera.js", "../node_modules/shadermate/src/uniforms/types.js", "../node_modules/shadermate/src/uniforms/apply.js", "../node_modules/shadermate/src/input/pointer.js", "../node_modules/shadermate/src/view/sizing.js", "../node_modules/shadermate/src/view/visibility.js", "../node_modules/shadermate/src/ui/theme.js", "../node_modules/shadermate/src/ui/stats.js", "../node_modules/shadermate/src/ui/errorOverlay.js", "../node_modules/shadermate/src/capture/capture.js", "../node_modules/shadermate/src/core/create.js", "../lib/core/gpu/shaders.js", "../lib/core/gpu/backend.js", "../lib/core/source.js", "../lib/core/engine.js", "../lib/core/export/canvas.js", "../lib/core/export/crc32.js", "../lib/core/export/png.js", "../lib/editor/index.js", "../lib/core/presets.js", "../lib/editor/dom.js", "../lib/editor/icons.js", "../lib/editor/store.js", "../lib/editor/stage.js", "../lib/editor/controls.js", "../lib/core/export/gif.js", "../lib/core/export/zip.js", "../lib/core/export/sheet.js", "../lib/editor/exporter.js", "../lib/editor/ui.js", "../lib/editor/persist.js", "../lib/editor/inspector.js", "../lib/editor/library.js", "../lib/editor/samples.js", "../lib/editor/workspace.js"],
4
+ "sourcesContent": ["// Colour helpers shared by the CPU path, the GPU uniforms and the editor.\r\n// All channel values are sRGB in 0..1 unless a name says otherwise.\r\n\r\n/** Parse '#rgb', '#rrggbb', '#rrggbbaa', 'rrggbb' or [r,g,b] (0..255) into [r, g, b] bytes. */\r\nexport function parseColor(c) {\r\n if (Array.isArray(c)) return [c[0] | 0, c[1] | 0, c[2] | 0];\r\n let s = String(c).trim().replace(/^#|^0x/i, '');\r\n if (s.length === 3 || s.length === 4) s = s.slice(0, 3).split('').map(ch => ch + ch).join('');\r\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(s)) throw new Error(`Invalid colour \"${c}\"`);\r\n return [parseInt(s.slice(0, 2), 16), parseInt(s.slice(2, 4), 16), parseInt(s.slice(4, 6), 16)];\r\n}\r\n\r\n/** True when `c` parses as a colour. */\r\nexport function isColor(c) {\r\n try { parseColor(c); return true; } catch { return false; }\r\n}\r\n\r\n/** [r, g, b] bytes \u2192 '#rrggbb'. */\r\nexport function toHex(rgb) {\r\n return '#' + rgb.slice(0, 3).map(v => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0')).join('');\r\n}\r\n\r\n/** Normalise any colour to '#rrggbb' (lower case). */\r\nexport const normHex = c => toHex(parseColor(c));\r\n\r\nconst lin = c => (c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4));\r\n\r\n/** sRGB (0..1) \u2192 OKLab [L, a, b]. Same maths as the GLSL `oklab()` in gpu/shaders.js. */\r\nexport function oklab(r, g, b) {\r\n r = lin(r); g = lin(g); b = lin(b);\r\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\r\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\r\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\r\n return [\r\n 0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s,\r\n ];\r\n}\r\n\r\n/** Relative luminance-ish weight used by saturation (Rec. 709). */\r\nexport const LUMA = [0.2126, 0.7152, 0.0722];\r\n\r\n/** Perceived lightness 0..1 of a hex colour; handy for picking text colours on swatches. */\r\nexport function lightness(hex) {\r\n const [r, g, b] = parseColor(hex);\r\n return oklab(r / 255, g / 255, b / 255)[0];\r\n}\r\n\r\n/**\r\n * Average distance (sRGB 0..1) from each palette colour to its nearest neighbour.\r\n * Ordered dithering scales its threshold by this so `strength` means the same thing\r\n * for a 2-colour and a 64-colour palette.\r\n */\r\nexport function paletteSpread(rgbs) {\r\n if (rgbs.length < 2) return 1;\r\n let sum = 0;\r\n for (let i = 0; i < rgbs.length; i++) {\r\n let best = Infinity;\r\n for (let j = 0; j < rgbs.length; j++) {\r\n if (i === j) continue;\r\n const dr = rgbs[i][0] - rgbs[j][0], dg = rgbs[i][1] - rgbs[j][1], db = rgbs[i][2] - rgbs[j][2];\r\n const d = Math.sqrt(dr * dr + dg * dg + db * db);\r\n if (d < best) best = d;\r\n }\r\n sum += best;\r\n }\r\n return Math.max(0.04, Math.min(1, sum / rgbs.length / 255));\r\n}\r\n", "// Pure pixel helpers (no DOM): integer upscaling, grid lines, colour counting.\r\n\r\nimport { parseColor, toHex } from '../color.js';\r\n\r\n/**\r\n * Nearest-neighbour integer upscale.\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {number} k scale factor (integer \u2265 1)\r\n * @param {{ grid?: boolean, gridColor?: string, gridAlpha?: number }} [opts] grid: 1px lines between source pixels\r\n */\r\nexport function upscale(img, k = 1, opts = {}) {\r\n k = Math.max(1, Math.round(k));\r\n const w = img.width * k, h = img.height * k;\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const src = img.data, sw = img.width;\r\n for (let y = 0; y < h; y++) {\r\n const sy = (y / k) | 0;\r\n for (let x = 0; x < w; x++) {\r\n const so = (sy * sw + ((x / k) | 0)) * 4, o = (y * w + x) * 4;\r\n out[o] = src[so]; out[o + 1] = src[so + 1]; out[o + 2] = src[so + 2]; out[o + 3] = src[so + 3];\r\n }\r\n }\r\n if (opts.grid && k >= 3) {\r\n const [r, g, b] = parseColor(opts.gridColor || '#000000');\r\n const a = opts.gridAlpha ?? 0.35;\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) {\r\n if (x % k && y % k) continue;\r\n const o = (y * w + x) * 4;\r\n const sa = out[o + 3] / 255, oa = a + sa * (1 - a);\r\n out[o] = (r * a + out[o] * sa * (1 - a)) / oa;\r\n out[o + 1] = (g * a + out[o + 1] * sa * (1 - a)) / oa;\r\n out[o + 2] = (b * a + out[o + 2] * sa * (1 - a)) / oa;\r\n out[o + 3] = oa * 255;\r\n }\r\n }\r\n return { width: w, height: h, data: out };\r\n}\r\n\r\n/**\r\n * Nearest-neighbour resize to any size (used to export at the source's resolution, like 2.x's\r\n * \"full resolution\" download). Pixels may differ by one in size when the ratio isn't whole.\r\n */\r\nexport function resizeNearest(img, width, height) {\r\n width = Math.max(1, Math.round(width)); height = Math.max(1, Math.round(height));\r\n const out = new Uint8ClampedArray(width * height * 4);\r\n const xs = new Int32Array(width);\r\n for (let x = 0; x < width; x++) xs[x] = Math.min(img.width - 1, Math.floor((x + 0.5) * img.width / width));\r\n for (let y = 0; y < height; y++) {\r\n const sy = Math.min(img.height - 1, Math.floor((y + 0.5) * img.height / height));\r\n for (let x = 0; x < width; x++) {\r\n const so = (sy * img.width + xs[x]) * 4, o = (y * width + x) * 4;\r\n out[o] = img.data[so]; out[o + 1] = img.data[so + 1]; out[o + 2] = img.data[so + 2]; out[o + 3] = img.data[so + 3];\r\n }\r\n }\r\n return { width, height, data: out };\r\n}\r\n\r\n/** Distinct opaque colours in an image ('#rrggbb'), in order of first appearance. */\r\nexport function uniqueColors(img, limit = Infinity) {\r\n const seen = new Set();\r\n const d = img.data;\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] === 0) continue;\r\n seen.add((d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n if (seen.size > limit) break;\r\n }\r\n return [...seen].map(v => toHex([v >> 16, (v >> 8) & 255, v & 255]));\r\n}\r\n\r\n/** True when the image has at least one non-opaque pixel. */\r\nexport function hasTransparency(img) {\r\n for (let o = 3; o < img.data.length; o += 4) if (img.data[o] < 255) return true;\r\n return false;\r\n}\r\n\r\n/**\r\n * Detect the pixel-grid size of an upscaled pixel-art image (e.g. a sprite saved at 4\u00D7).\r\n * Returns the largest block size b such that the image is made of b\u00D7b solid blocks\r\n * (allowing a small tolerance for JPEG noise), or 1.\r\n */\r\nexport function detectGrid(img, tolerance = 8) {\r\n const { width: w, height: h, data: d } = img;\r\n const same = (a, b) => Math.abs(d[a] - d[b]) <= tolerance && Math.abs(d[a + 1] - d[b + 1]) <= tolerance && Math.abs(d[a + 2] - d[b + 2]) <= tolerance && Math.abs(d[a + 3] - d[b + 3]) <= tolerance;\r\n // run lengths along rows and columns; the block size divides all of them (mostly)\r\n const gcd = (a, b) => (b ? gcd(b, a % b) : a);\r\n let g = 0;\r\n const stepY = Math.max(1, Math.floor(h / 64)), stepX = Math.max(1, Math.floor(w / 64));\r\n for (let y = 0; y < h; y += stepY) {\r\n let run = 1;\r\n for (let x = 1; x < w; x++) {\r\n if (same((y * w + x) * 4, (y * w + x - 1) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n for (let x = 0; x < w; x += stepX) {\r\n let run = 1;\r\n for (let y = 1; y < h; y++) {\r\n if (same((y * w + x) * 4, ((y - 1) * w + x) * 4)) run++;\r\n else { g = gcd(g, run); run = 1; if (g === 1) return 1; }\r\n }\r\n }\r\n return g || 1;\r\n}\r\n", "// Palette file formats. Every parser returns { name, colors: ['#rrggbb', \u2026] }.\r\n//\r\n// .gpl GIMP / Aseprite / Krita palette\r\n// .hex one hex colour per line (Lospec \"HEX file\")\r\n// .txt Paint.NET palette (AARRGGBB per line, ';' comments)\r\n// .pal JASC-PAL (Paint Shop Pro, Aseprite export)\r\n// .json Lospec JSON ({ name, colors: ['rrggbb'] }), this tool's own export, or a plain array\r\n// anything else: every #hex / 6-digit token found in the text\r\n\r\nimport { normHex } from '../color.js';\r\n\r\nconst dedupe = list => [...new Set(list)];\r\n\r\nexport function parseGPL(text) {\r\n const lines = text.split(/\\r?\\n/);\r\n if (!/^GIMP Palette/i.test(lines[0] || '')) throw new Error('Not a GIMP palette (missing \"GIMP Palette\" header)');\r\n let name = '';\r\n const colors = [];\r\n for (const raw of lines.slice(1)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith('#')) continue;\r\n const nm = /^Name:\\s*(.*)$/i.exec(line);\r\n if (nm) { name = nm[1].trim(); continue; }\r\n if (/^Columns:/i.test(line)) continue;\r\n const m = /^(\\d{1,3})\\s+(\\d{1,3})\\s+(\\d{1,3})/.exec(line);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name, colors };\r\n}\r\n\r\nexport function parseHexList(text) {\r\n const colors = [];\r\n for (const raw of text.split(/\\r?\\n/)) {\r\n const line = raw.trim();\r\n if (!line || line.startsWith(';') || line.startsWith('//')) continue;\r\n const m = /^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\\b/i.exec(line);\r\n if (!m) continue;\r\n // 8 digits in a .txt palette are AARRGGBB (Paint.NET); in a .hex file they are rare, treat the same\r\n const h = m[1].length === 8 ? m[1].slice(2) : m[1];\r\n colors.push(normHex(h));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJASC(text) {\r\n const lines = text.split(/\\r?\\n/).map(l => l.trim());\r\n if (lines[0] !== 'JASC-PAL') throw new Error('Not a JASC palette');\r\n const n = parseInt(lines[2], 10) || 0;\r\n const colors = [];\r\n for (let i = 3; i < 3 + n && i < lines.length; i++) {\r\n const m = /^(\\d+)\\s+(\\d+)\\s+(\\d+)/.exec(lines[i]);\r\n if (m) colors.push(normHex([+m[1], +m[2], +m[3]]));\r\n }\r\n return { name: '', colors };\r\n}\r\n\r\nexport function parseJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n const list = Array.isArray(obj) ? obj : (obj.colors || obj.palette || []);\r\n const colors = list.map(c => (typeof c === 'object' && c ? (c.hex || c.color) : c)).filter(Boolean).map(normHex);\r\n return { name: (!Array.isArray(obj) && obj.name) || '', colors };\r\n}\r\n\r\n/** Pull every hex-looking token out of free text (pasted CSS, a tweet, a Lospec page). */\r\nexport function parseLoose(text) {\r\n const colors = [];\r\n const re = /#?\\b([0-9a-f]{6})\\b/gi;\r\n let m;\r\n while ((m = re.exec(text))) colors.push(normHex(m[1]));\r\n return { name: '', colors };\r\n}\r\n\r\n/**\r\n * Parse palette text by file name / content sniffing.\r\n * @param {string} text\r\n * @param {string} [filename]\r\n * @returns {{ name: string, colors: string[] }}\r\n */\r\nexport function parsePalette(text, filename = '') {\r\n const ext = (/\\.([a-z0-9]+)$/i.exec(filename) || [])[1]?.toLowerCase() || '';\r\n const t = String(text).replace(/^\uFEFF/, '');\r\n const trimmed = t.trim();\r\n let out;\r\n if (ext === 'gpl' || /^GIMP Palette/i.test(trimmed)) out = parseGPL(trimmed);\r\n else if (ext === 'pal' || trimmed.startsWith('JASC-PAL')) out = parseJASC(trimmed);\r\n else if (ext === 'json' || trimmed.startsWith('{') || trimmed.startsWith('[')) out = parseJSON(trimmed);\r\n else if (ext === 'hex' || ext === 'txt') out = parseHexList(trimmed);\r\n else {\r\n out = parseHexList(trimmed);\r\n if (!out.colors.length) out = parseLoose(trimmed);\r\n }\r\n out.colors = dedupe(out.colors).slice(0, 256);\r\n if (!out.name && filename) out.name = filename.replace(/\\.[^.]+$/, '').replace(/[-_]+/g, ' ');\r\n if (!out.colors.length) throw new Error('No colours found in that palette');\r\n return out;\r\n}\r\n\r\n/** Palette \u2192 .gpl text. */\r\nexport function toGPL(name, colors) {\r\n const rows = colors.map(c => {\r\n const h = normHex(c);\r\n const r = parseInt(h.slice(1, 3), 16), g = parseInt(h.slice(3, 5), 16), b = parseInt(h.slice(5, 7), 16);\r\n return `${String(r).padStart(3)} ${String(g).padStart(3)} ${String(b).padStart(3)}\\t${h.slice(1)}`;\r\n });\r\n return `GIMP Palette\\nName: ${name || 'Palette'}\\nColumns: 8\\n#\\n${rows.join('\\n')}\\n`;\r\n}\r\n\r\n/** Palette \u2192 .hex text. */\r\nexport const toHexFile = colors => colors.map(c => normHex(c).slice(1)).join('\\n') + '\\n';\r\n\r\n/** Palette \u2192 JSON text (Lospec-compatible shape). */\r\nexport const toPaletteJSON = (name, colors) => JSON.stringify({ name: name || 'Palette', colors: colors.map(c => normHex(c).slice(1)) }, null, 2);\r\n", "// Lospec palette lookup by slug, e.g. 'rgbg-36' from https://lospec.com/palette-list/rgbg-36\r\n\r\nimport { parseJSON } from './parse.js';\r\n\r\n/** Turn a slug or a full Lospec URL into a slug. */\r\nexport function lospecSlug(input) {\r\n const s = String(input || '').trim();\r\n const m = /palette-list\\/([a-z0-9-]+)/i.exec(s);\r\n return (m ? m[1] : s).toLowerCase().replace(/\\.(json|hex|gpl)$/, '');\r\n}\r\n\r\n/**\r\n * Fetch a palette from Lospec. Needs network access; the editor caches results.\r\n * @returns {Promise<{ name: string, colors: string[], author?: string, slug: string }>}\r\n */\r\nexport async function fetchLospec(slugOrUrl, { fetch: f = globalThis.fetch } = {}) {\r\n const slug = lospecSlug(slugOrUrl);\r\n if (!/^[a-z0-9-]+$/.test(slug)) throw new Error('That does not look like a Lospec palette slug');\r\n const res = await f(`https://lospec.com/palette-list/${slug}.json`);\r\n if (!res.ok) throw new Error(`Lospec returned ${res.status} for \"${slug}\"`);\r\n const json = await res.json();\r\n const p = parseJSON(json);\r\n return { name: json.name || slug, author: json.author || '', colors: p.colors, slug };\r\n}\r\n", "// Frame-accurate stepping through an HTMLVideoElement by seeking to the middle of each frame.\n// Seeking (instead of playing) means every frame is visited exactly once, regardless of how\n// long processing takes, and the same input always produces the same frames.\n\nconst wait = (el, ev, ms = 4000) => new Promise((res, rej) => {\n const t = setTimeout(() => { el.removeEventListener(ev, ok); rej(new Error(`Timed out waiting for \"${ev}\"`)); }, ms);\n const ok = () => { clearTimeout(t); res(); };\n el.addEventListener(ev, ok, { once: true });\n});\n\nconst MEDIA_ERRORS = {\n 1: 'loading was aborted',\n 2: 'a network error stopped the download',\n 3: 'the browser could not decode it',\n 4: \"this browser can't play this video's format\",\n};\n\n/** Turn a <video>'s MediaError into a readable Error (err.code is the MediaError code). */\nexport function mediaError(video) {\n const code = video.error ? video.error.code : 0;\n const err = new Error(MEDIA_ERRORS[code] || 'the video could not be loaded');\n err.code = code;\n if (video.error && video.error.message) err.detail = video.error.message;\n return err;\n}\n\n/** Resolve on `ok`, reject straight away if the media element reports an error. */\nconst waitOrFail = (video, ok, ms) => new Promise((res, rej) => {\n const done = () => { clearTimeout(t); video.removeEventListener(ok, onOk); video.removeEventListener('error', onErr); };\n const onOk = () => { done(); res(); };\n const onErr = () => { done(); rej(mediaError(video)); };\n const t = setTimeout(() => { done(); rej(new Error(`no response from the video decoder after ${ms / 1000} s`)); }, ms);\n video.addEventListener(ok, onOk, { once: true });\n video.addEventListener('error', onErr, { once: true });\n});\n\n/**\n * Wait until a video's metadata (size, duration) and first frame are available.\n * Rejects immediately with a readable message when the browser can't play the file.\n */\nexport async function videoReady(video, { timeout = 60000 } = {}) {\n if (video.error) throw mediaError(video);\n if (video.readyState < 1) await waitOrFail(video, 'loadedmetadata', timeout);\n if (video.readyState < 2) await waitOrFail(video, 'loadeddata', timeout).catch(e => { if (e.code) throw e; });\n return video;\n}\n\n/**\n * Best-effort codec name for an MP4/MOV/WebM file, read from its bytes. Used to explain playback errors.\n * @param {Blob} file\n * @returns {Promise<string>} e.g. 'H.265 (HEVC)', or '' when unknown\n */\nexport async function sniffVideoCodec(file) {\n const buf = new Uint8Array(await file.arrayBuffer());\n const NAMES = { avc1: 'H.264', avc3: 'H.264', hvc1: 'H.265 (HEVC)', hev1: 'H.265 (HEVC)', av01: 'AV1', vp09: 'VP9', vp08: 'VP8', mp4v: 'MPEG-4 Part 2', apcn: 'ProRes', apch: 'ProRes', apcs: 'ProRes', apco: 'ProRes', ap4h: 'ProRes 4444', dvh1: 'Dolby Vision', dvhe: 'Dolby Vision' };\n // MP4/MOV: the first sample entry of the 'stsd' box names the codec\n for (let i = 0; i + 24 < buf.length; i++) {\n if (buf[i] === 0x73 && buf[i + 1] === 0x74 && buf[i + 2] === 0x73 && buf[i + 3] === 0x64) {\n const type = String.fromCharCode(buf[i + 16], buf[i + 17], buf[i + 18], buf[i + 19]);\n if (NAMES[type]) return NAMES[type];\n }\n }\n // WebM/Matroska: CodecID strings such as V_VP9, V_AV1, V_MPEGH/ISO/HEVC\n const head = new TextDecoder('latin1').decode(buf.subarray(0, Math.min(buf.length, 1 << 20)));\n const m = /V_(VP8|VP9|AV1|MPEG4\\/ISO\\/AVC|MPEGH\\/ISO\\/HEVC)/.exec(head);\n if (m) return { VP8: 'VP8', VP9: 'VP9', AV1: 'AV1', 'MPEG4/ISO/AVC': 'H.264', 'MPEGH/ISO/HEVC': 'H.265 (HEVC)' }[m[1]];\n return '';\n}\n\n/**\n * Does this MP4/MOV/WebM file have an audio track? Reads only the container headers: for MP4/MOV the\n * top-level boxes are walked to 'moov' (which phones often write at the end) and only that box is read.\n * @param {Blob} file\n * @returns {Promise<boolean | null>} null when it can't tell\n */\nexport async function hasAudioTrack(file) {\n try {\n const head = new Uint8Array(await file.slice(0, 12).arrayBuffer());\n if (head[0] === 0x1a && head[1] === 0x45 && head[2] === 0xdf && head[3] === 0xa3) {\n // WebM/Matroska: Tracks sit near the start; audio CodecIDs all begin with A_\n const text = new TextDecoder('latin1').decode(await file.slice(0, 4 << 20).arrayBuffer());\n return /A_(OPUS|VORBIS|AAC|MPEG|AC3|EAC3|FLAC|PCM|DTS|TRUEHD|ALAC)/.test(text);\n }\n for (let o = 0; o + 8 <= file.size;) {\n const dv = new DataView(await file.slice(o, o + 16).arrayBuffer());\n let size = dv.getUint32(0);\n const type = String.fromCharCode(dv.getUint8(4), dv.getUint8(5), dv.getUint8(6), dv.getUint8(7));\n if (size === 1) size = Number(dv.getBigUint64(8));\n else if (size === 0) size = file.size - o;\n if (size < 8) return null;\n if (type === 'moov') {\n const moov = new Uint8Array(await file.slice(o, o + size).arrayBuffer());\n // each track's 'hdlr' box names its kind 12 bytes after the box type: 'vide', 'soun', \u2026\n for (let i = 4; i + 16 <= moov.length; i++) {\n if (moov[i] === 0x68 && moov[i + 1] === 0x64 && moov[i + 2] === 0x6c && moov[i + 3] === 0x72\n && moov[i + 12] === 0x73 && moov[i + 13] === 0x6f && moov[i + 14] === 0x75 && moov[i + 15] === 0x6e) return true;\n }\n return false;\n }\n o += size;\n }\n return null;\n } catch (_) {\n return null;\n }\n}\n\n/** Seek and resolve once the frame at `time` is decoded and paintable. */\nexport async function seekTo(video, time) {\n time = Math.max(0, Math.min(time, (video.duration || 0) - 1e-4));\n if (Math.abs(video.currentTime - time) < 1e-6 && video.readyState >= 2) return;\n const presented = 'requestVideoFrameCallback' in video\n ? new Promise(res => { video.requestVideoFrameCallback(() => res()); setTimeout(res, 500); })\n : null;\n const seeked = wait(video, 'seeked');\n video.currentTime = time;\n await seeked;\n if (presented) await presented;\n}\n\n/**\n * Estimate the frame rate from presented frames (requestVideoFrameCallback), falling back to `fallback`.\n * Plays muted for a moment and restores the position.\n */\nexport async function estimateFps(video, fallback = 30) {\n if (!('requestVideoFrameCallback' in video)) return fallback;\n await videoReady(video);\n const was = { t: video.currentTime, muted: video.muted, paused: video.paused };\n const times = [];\n try {\n video.muted = true;\n await new Promise((res) => {\n const done = setTimeout(res, 1200);\n const cb = (_, meta) => {\n times.push(meta.mediaTime);\n if (times.length >= 12) { clearTimeout(done); res(); } else video.requestVideoFrameCallback(cb);\n };\n video.requestVideoFrameCallback(cb);\n video.play().catch(() => { clearTimeout(done); res(); });\n });\n } finally {\n video.pause();\n video.muted = was.muted;\n await seekTo(video, was.t).catch(() => { });\n }\n const deltas = [];\n for (let i = 1; i < times.length; i++) { const d = times[i] - times[i - 1]; if (d > 0.001) deltas.push(d); }\n if (deltas.length < 3) return fallback;\n deltas.sort((a, b) => a - b);\n const fps = 1 / deltas[Math.floor(deltas.length / 2)];\n // snap to common rates\n for (const r of [12, 15, 23.976, 24, 25, 29.97, 30, 48, 50, 59.94, 60]) if (Math.abs(fps - r) < 0.6) return r;\n return Math.round(fps);\n}\n\n/** Frame times (seconds, middle of each frame) for a clip. */\nexport function frameTimes({ duration, fps, start = 0, end = duration, maxFrames = Infinity }) {\n const out = [];\n const n = Math.min(maxFrames, Math.max(1, Math.floor((end - start) * fps + 1e-6)));\n for (let i = 0; i < n; i++) out.push(start + (i + 0.5) / fps);\n return out;\n}\n\n/**\n * Visit frames one by one.\n * @param {HTMLVideoElement} video\n * @param {{ fps: number, start?: number, end?: number, maxFrames?: number, signal?: AbortSignal,\n * onFrame: (info: { index: number, time: number, total: number }) => any }} opts\n */\nexport async function forEachFrame(video, opts) {\n await videoReady(video);\n const wasPaused = video.paused;\n video.pause();\n const times = frameTimes({ duration: video.duration, ...opts });\n for (let i = 0; i < times.length; i++) {\n if (opts.signal && opts.signal.aborted) throw new DOMException('Aborted', 'AbortError');\n await seekTo(video, times[i]);\n await opts.onFrame({ index: i, time: times[i], total: times.length });\n }\n if (!wasPaused) video.play().catch(() => { });\n return times.length;\n}\n", "// Audio for video export: read a source file's soundtrack as PCM, and encode PCM with WebCodecs.\n// The muxers (mux-mp4.js, mux-webm.js) take the encoded chunks as a second track next to the video.\n\n/** WebCodecs codec strings for the audio formats the muxers can store. */\nexport const AUDIO_CODECS = { aac: 'mp4a.40.2', opus: 'opus' };\n\nconst DEFAULT_RATE = 48000; // Opus only encodes at 48 kHz (and lower); AAC is fine with it too\n\nasync function toArrayBuffer(source) {\n if (source instanceof ArrayBuffer) return source.slice(0);\n if (ArrayBuffer.isView(source)) return source.buffer.slice(source.byteOffset, source.byteOffset + source.byteLength);\n if (typeof Blob !== 'undefined' && source instanceof Blob) return source.arrayBuffer();\n const url = typeof source === 'string' ? source : source && (source.currentSrc || source.src);\n if (!url) throw new TypeError('decodeAudio() takes a File, Blob, ArrayBuffer, URL or <video>/<audio> element');\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Couldn't load the audio: ${res.status} ${res.statusText}`);\n return res.arrayBuffer();\n}\n\n/**\n * Decode the audio track of a video (or audio) file into PCM, resampled and trimmed.\n * Resolves with null when there is no audio track, it can't be decoded, or Web Audio isn't available (Node).\n * More than two channels are mixed down to stereo with the standard Web Audio speaker rules.\n * @param {File|Blob|ArrayBuffer|ArrayBufferView|string|HTMLMediaElement} source\n * @param {{ start?: number, end?: number, sampleRate?: number, channels?: 1 | 2 }} [opts] start/end in seconds\n * @returns {Promise<null | { sampleRate: number, numberOfChannels: number, channels: Float32Array[], duration: number }>}\n */\nexport async function decodeAudio(source, opts = {}) {\n if (typeof OfflineAudioContext === 'undefined') return null;\n const sampleRate = opts.sampleRate || DEFAULT_RATE;\n const bytes = await toArrayBuffer(source);\n let decoded;\n try {\n decoded = await new OfflineAudioContext(1, 1, sampleRate).decodeAudioData(bytes);\n } catch (_) {\n return null; // no audio track, or a codec the browser can't decode\n }\n const start = Math.max(0, opts.start || 0);\n const end = Math.min(decoded.duration, opts.end > start ? opts.end : decoded.duration);\n const length = Math.floor((end - start) * sampleRate);\n if (length < 1) return null;\n const numberOfChannels = Math.min(opts.channels || 2, decoded.numberOfChannels);\n // Rendering the decoded buffer through an offline graph trims it and mixes 5.1 etc. down properly.\n const ctx = new OfflineAudioContext(numberOfChannels, length, sampleRate);\n const node = ctx.createBufferSource();\n node.buffer = decoded;\n node.connect(ctx.destination);\n node.start(0, start, length / sampleRate);\n const out = await ctx.startRendering();\n const channels = [];\n for (let c = 0; c < numberOfChannels; c++) channels.push(out.getChannelData(c));\n return { sampleRate, numberOfChannels, channels, duration: length / sampleRate };\n}\n\n/**\n * Find an AudioEncoder configuration this browser accepts for `codec`, or null.\n * Platform AAC encoders (Windows Media Foundation, macOS AudioToolbox) are picky about sample rate and\n * bitrate, so a few common combinations are tried: the requested rate first, then 48 and 44.1 kHz.\n * @returns {Promise<AudioEncoderConfig | null>} the config to pass to encodeAudio({ config })\n */\nexport async function findAudioConfig(codec, sampleRate = DEFAULT_RATE, numberOfChannels = 2, bitrate = 128000) {\n if (typeof AudioEncoder === 'undefined' || !AUDIO_CODECS[codec]) return null;\n const rates = codec === 'opus' ? [48000] : [...new Set([sampleRate, 48000, 44100])];\n const bitrates = [...new Set([bitrate, 128000, 192000, 160000, 96000, 0])];\n for (const rate of rates) {\n for (const br of bitrates) {\n const config = {\n codec: AUDIO_CODECS[codec], sampleRate: rate, numberOfChannels,\n ...(br ? { bitrate: br } : {}),\n ...(codec === 'aac' ? { aac: { format: 'aac' } } : {}), // raw frames + AudioSpecificConfig, which MP4 needs\n };\n const r = await AudioEncoder.isConfigSupported(config).catch(() => ({}));\n if (r.supported) return config;\n }\n }\n return null;\n}\n\n/** Can this browser encode `codec` ('aac' | 'opus') with these parameters (or a close variant)? */\nexport async function audioCodecSupported(codec, sampleRate = DEFAULT_RATE, numberOfChannels = 2) {\n return !!(await findAudioConfig(codec, sampleRate, numberOfChannels));\n}\n\n/** Resample PCM with Web Audio (browser only). */\nexport async function resamplePcm(pcm, sampleRate) {\n if (pcm.sampleRate === sampleRate) return pcm;\n const { numberOfChannels, channels } = pcm;\n const length = Math.max(1, Math.round(channels[0].length * sampleRate / pcm.sampleRate));\n const ctx = new OfflineAudioContext(numberOfChannels, length, sampleRate);\n const buf = ctx.createBuffer(numberOfChannels, channels[0].length, pcm.sampleRate);\n for (let c = 0; c < numberOfChannels; c++) buf.copyToChannel(channels[c], c);\n const node = ctx.createBufferSource();\n node.buffer = buf;\n node.connect(ctx.destination);\n node.start();\n const out = await ctx.startRendering();\n const res = [];\n for (let c = 0; c < numberOfChannels; c++) res.push(out.getChannelData(c));\n return { sampleRate, numberOfChannels, channels: res, duration: length / sampleRate };\n}\n\n/**\n * Encode PCM (as returned by decodeAudio) with WebCodecs' AudioEncoder.\n * @param {{ sampleRate: number, numberOfChannels: number, channels: Float32Array[] }} pcm\n * @param {{ codec?: 'aac' | 'opus', config?: AudioEncoderConfig, bitrate?: number, maxDuration?: number,\n * onChunk: (chunk: EncodedAudioChunk, meta?: EncodedAudioChunkMetadata) => void }} opts\n * config: from findAudioConfig(); otherwise built from codec + bitrate. PCM at a different rate is resampled.\n * maxDuration: seconds; longer audio is cut (used to match the video's length)\n */\nexport async function encodeAudio(pcm, opts) {\n if (typeof AudioEncoder === 'undefined') throw new Error('This browser has no WebCodecs AudioEncoder');\n const config = opts.config || {\n codec: AUDIO_CODECS[opts.codec], sampleRate: pcm.sampleRate, numberOfChannels: pcm.numberOfChannels,\n bitrate: opts.bitrate || 128000,\n ...(opts.codec === 'aac' ? { aac: { format: 'aac' } } : {}),\n };\n if (config.sampleRate !== pcm.sampleRate) pcm = await resamplePcm(pcm, config.sampleRate);\n const { sampleRate, numberOfChannels, channels } = pcm;\n let error = null;\n const encoder = new AudioEncoder({ output: (chunk, meta) => opts.onChunk(chunk, meta), error: e => { error = e; } });\n encoder.configure(config);\n const limit = Number.isFinite(opts.maxDuration) ? Math.floor(opts.maxDuration * sampleRate) : Infinity;\n const total = Math.min(channels[0].length, limit);\n const BLOCK = Math.round(sampleRate / 10); // 100 ms per AudioData\n for (let o = 0; o < total; o += BLOCK) {\n if (error) break;\n const n = Math.min(BLOCK, total - o);\n const data = new Float32Array(n * numberOfChannels);\n for (let c = 0; c < numberOfChannels; c++) data.set(channels[c].subarray(o, o + n), c * n);\n const frame = new AudioData({ format: 'f32-planar', sampleRate, numberOfFrames: n, numberOfChannels, timestamp: Math.round(o * 1e6 / sampleRate), data });\n encoder.encode(frame);\n frame.close();\n if (encoder.encodeQueueSize > 16) await new Promise(r => setTimeout(r, 0));\n }\n if (!error) await encoder.flush().catch(e => { error = e; });\n if (encoder.state !== 'closed') encoder.close();\n if (error) throw error;\n}\n\n/** OpusHead (RFC 7845), little-endian: what Matroska's CodecPrivate holds for Opus. */\nexport function opusHead(numberOfChannels, sampleRate, preSkip = 312) {\n const b = new Uint8Array(19);\n b.set([0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64]); // 'OpusHead'\n const dv = new DataView(b.buffer);\n dv.setUint8(8, 1);\n dv.setUint8(9, numberOfChannels);\n dv.setUint16(10, preSkip, true);\n dv.setUint32(12, sampleRate, true);\n dv.setInt16(16, 0, true);\n dv.setUint8(18, 0);\n return b;\n}\n\n/** Read { channels, preSkip, sampleRate } from an OpusHead, or null if it isn't one. */\nexport function parseOpusHead(b) {\n if (!b || b.length < 19 || String.fromCharCode(...b.subarray(0, 8)) !== 'OpusHead') return null;\n const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n return { channels: dv.getUint8(9), preSkip: dv.getUint16(10, true), sampleRate: dv.getUint32(12, true) };\n}\n", "// Minimal MP4 (ISO BMFF) muxer for one H.264 video track and, optionally, one AAC or Opus audio track.\n// Everything is buffered in memory and written with the 'moov' box first (\"fast start\"), so the file\n// plays and seeks while downloading.\n// Video input: AVCC samples (length-prefixed NAL units, as WebCodecs' VideoEncoder emits with\n// avc.format 'avc') plus the AVCDecoderConfigurationRecord ('description').\n// Audio input: raw AAC frames plus the AudioSpecificConfig ('description'), as AudioEncoder emits with\n// aac.format 'aac'; or Opus packets.\n\nimport { parseOpusHead } from './audio.js';\n\nconst ENC = new TextEncoder();\n\nclass Writer {\n constructor() { this.parts = []; this.size = 0; }\n u8(v) { return this.bytes([v & 255]); }\n u16(v) { return this.bytes([(v >>> 8) & 255, v & 255]); }\n u32(v) { return this.bytes([(v >>> 24) & 255, (v >>> 16) & 255, (v >>> 8) & 255, v & 255]); }\n str(s) { return this.bytes(ENC.encode(s)); }\n bytes(b) { const a = b instanceof Uint8Array ? b : Uint8Array.from(b); this.parts.push(a); this.size += a.length; return this; }\n zeros(n) { return this.bytes(new Uint8Array(n)); }\n out() { const r = new Uint8Array(this.size); let o = 0; for (const p of this.parts) { r.set(p, o); o += p.length; } return r; }\n}\n\n/** A box: 4-byte size, 4-char type, then the body produced by fill(w). */\nfunction box(type, fill) {\n const w = new Writer();\n fill(w);\n const body = w.out();\n const head = new Writer().u32(body.length + 8).str(type).out();\n const r = new Uint8Array(body.length + 8); r.set(head); r.set(body, 8);\n return r;\n}\nconst fullBox = (type, version, flags, fill) => box(type, w => { w.u8(version).u8(flags >> 16).u8(flags >> 8).u8(flags); fill(w); });\nconst MATRIX = [0x10000, 0, 0, 0, 0x10000, 0, 0, 0, 0x40000000];\n\nconst toBytes = d => new Uint8Array(d instanceof ArrayBuffer ? d : d.buffer.slice(d.byteOffset, d.byteOffset + d.byteLength));\n\n/** MPEG-4 descriptor: tag, one-byte length (every descriptor here is under 128 bytes), body. */\nconst descriptor = (tag, body) => [tag, body.length, ...body];\nconst be32 = v => [(v >>> 24) & 255, (v >>> 16) & 255, (v >>> 8) & 255, v & 255];\n\n/** 'esds' for AAC: ES_Descriptor > DecoderConfigDescriptor > DecoderSpecificInfo (the AudioSpecificConfig). */\nfunction esds(asc, bitrate) {\n const decSpecific = descriptor(0x05, [...asc]);\n // 0x40 = MPEG-4 audio, 0x15 = audio stream type; buffer size 0; max and average bitrate\n const decConfig = descriptor(0x04, [0x40, 0x15, 0, 0, 0, ...be32(bitrate), ...be32(bitrate), ...decSpecific]);\n const sl = descriptor(0x06, [0x02]);\n return fullBox('esds', 0, 0, b => b.bytes(descriptor(0x03, [0x00, 0x02, 0x00, ...decConfig, ...sl]))); // ES_ID 2\n}\n\n// ---- H.264 decoder configuration (avcC)\n// Some encoders hand WebCodecs a malformed avcC: Chrome on Windows (Media Foundation) has been seen\n// repeating each parameter set's NAL header byte, which strict players (Windows Media Player, QuickTime)\n// refuse. The encoder also writes SPS/PPS into the keyframes, so the muxer checks the record and, if it\n// doesn't hold together, rebuilds it from those in-band parameter sets.\n\nconst HIGH_PROFILES = new Set([100, 110, 122, 244, 44, 83, 86, 118, 128, 138, 139, 134, 135]);\n\n/** Is this a well-formed AVCDecoderConfigurationRecord whose SPS agrees with its header? */\nexport function isValidAvcC(d) {\n if (!d || d.length < 7 || d[0] !== 1) return false;\n let o = 5;\n const nSps = d[o++] & 31;\n if (!nSps) return false;\n for (let i = 0; i < nSps; i++) {\n if (o + 2 > d.length) return false;\n const len = (d[o] << 8) | d[o + 1]; o += 2;\n if (len < 4 || o + len > d.length) return false;\n const sps = d.subarray(o, o + len);\n if ((sps[0] & 31) !== 7) return false;\n if (i === 0 && (sps[1] !== d[1] || sps[2] !== d[2] || sps[3] !== d[3])) return false; // profile, constraints, level\n o += len;\n }\n if (o >= d.length) return false;\n const nPps = d[o++];\n if (!nPps) return false;\n for (let i = 0; i < nPps; i++) {\n if (o + 2 > d.length) return false;\n const len = (d[o] << 8) | d[o + 1]; o += 2;\n if (len < 1 || o + len > d.length || (d[o] & 31) !== 8) return false;\n o += len;\n }\n return true;\n}\n\n/** NAL units of an AVCC sample (4-byte lengths). */\nfunction nalUnits(data) {\n const out = [];\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n for (let o = 0; o + 4 <= data.length;) {\n const len = dv.getUint32(o); o += 4;\n if (!len || o + len > data.length) break;\n out.push(data.subarray(o, o + len)); o += len;\n }\n return out;\n}\n\n/** chroma_format_idc and bit depths from an SPS (High profiles), for the avcC extension. */\nfunction spsChroma(sps) {\n const rbsp = [];\n for (let i = 1; i < sps.length; i++) { // skip the NAL header; drop emulation-prevention bytes\n if (i >= 3 && sps[i] === 3 && sps[i - 1] === 0 && sps[i - 2] === 0) continue;\n rbsp.push(sps[i]);\n }\n let bit = 24; // after profile_idc, constraint flags, level_idc\n const u1 = () => { const v = (rbsp[bit >> 3] >> (7 - (bit & 7))) & 1; bit++; return v; };\n const ue = () => { let z = 0; while (bit < rbsp.length * 8 && !u1()) z++; let v = 0; for (let i = 0; i < z; i++) v = v * 2 + u1(); return (2 ** z) - 1 + v; };\n ue(); // seq_parameter_set_id\n const chroma = ue();\n if (chroma === 3) u1(); // separate_colour_plane_flag\n return { chroma, lumaBits: ue(), chromaBits: ue() };\n}\n\n/** Build an avcC from the SPS/PPS carried inside a keyframe, or null if it has none. */\nexport function avcCFromSample(data) {\n const nals = nalUnits(data);\n const sps = nals.filter(n => (n[0] & 31) === 7);\n const pps = nals.filter(n => (n[0] & 31) === 8);\n if (!sps.length || !pps.length || sps[0].length < 4) return null;\n const out = [1, sps[0][1], sps[0][2], sps[0][3], 0xff, 0xe0 | sps.length];\n for (const s of sps) out.push(s.length >> 8, s.length & 255, ...s);\n out.push(pps.length);\n for (const p of pps) out.push(p.length >> 8, p.length & 255, ...p);\n if (HIGH_PROFILES.has(sps[0][1])) {\n const c = spsChroma(sps[0]);\n out.push(0xfc | (c.chroma & 3), 0xf8 | (c.lumaBits & 7), 0xf8 | (c.chromaBits & 7), 0);\n }\n return Uint8Array.from(out);\n}\n\n/** Collapse a list of numbers into [count, value] runs (stts / ctts). */\nfunction runs(list) {\n const out = [];\n for (const v of list) { const last = out[out.length - 1]; if (last && last[1] === v) last[0]++; else out.push([1, v]); }\n return out;\n}\n\n/**\n * @param {{ width: number, height: number, timescale?: number,\n * audio?: { codec: 'aac' | 'opus', sampleRate: number, numberOfChannels: number, bitrate?: number } }} opts\n * audio: add a second track. Feed it with addAudioChunk() (AudioEncoder output) or addAudioSample().\n */\nexport function createMp4Muxer({ width, height, timescale = 90000, audio = null }) {\n const samples = []; // video: { data, key, ts, dur }, ts/dur in microseconds\n const audioSamples = []; // audio: { data, ts, dur }, microseconds\n let description = null;\n let audioDescription = null;\n\n /** Durations, sample entry and length of the audio track; null when there is none. */\n function audioTrack() {\n if (!audio || !audioSamples.length) return null;\n const rate = audio.sampleRate;\n const ch = audio.numberOfChannels;\n const t0 = audioSamples[0].ts;\n const starts = audioSamples.map(s => Math.round((s.ts - t0) * rate / 1e6));\n const lastDur = Math.round(audioSamples[audioSamples.length - 1].dur * rate / 1e6) || (audio.codec === 'aac' ? 1024 : 960);\n const durs = starts.map((s, i) => (i + 1 < starts.length ? Math.max(1, starts[i + 1] - s) : lastDur));\n let entry;\n if (audio.codec === 'aac') {\n if (!audioDescription) throw new Error('The audio encoder gave no AAC decoder configuration (AudioSpecificConfig)');\n entry = box('mp4a', a => {\n a.zeros(6).u16(1).zeros(8).u16(ch).u16(16).u16(0).u16(0).u32(rate <= 0xffff ? rate * 65536 : 0);\n a.bytes(esds(audioDescription, audio.bitrate || 128000));\n });\n } else {\n // Opus in ISO BMFF: an 'Opus' sample entry (always 48 kHz) with a 'dOps' box (big-endian, unlike OpusHead)\n const head = parseOpusHead(audioDescription);\n const preSkip = head ? head.preSkip : 312;\n entry = box('Opus', a => {\n a.zeros(6).u16(1).zeros(8).u16(ch).u16(16).u16(0).u16(0).u32(48000 * 65536);\n a.bytes(box('dOps', d => d.u8(0).u8(ch).u16(preSkip).u32(rate).u16(0).u8(0)));\n });\n }\n return { rate, durs, entry, mediaDur: durs.reduce((a, b) => a + b, 0) };\n }\n\n return {\n /** Use with a VideoEncoder `output` callback. */\n addChunk(chunk, meta) {\n if (meta && meta.decoderConfig && meta.decoderConfig.description && !description) description = toBytes(meta.decoderConfig.description);\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n samples.push({ data, key: chunk.type === 'key', ts: chunk.timestamp, dur: chunk.duration || 0 });\n },\n /** Lower-level: add an AVCC sample directly. ts/dur in microseconds. */\n addSample(data, { key, timestamp, duration }) { samples.push({ data, key: !!key, ts: timestamp, dur: duration || 0 }); },\n /** AVCDecoderConfigurationRecord ('avcC' contents). */\n setDescription(d) { description = d; },\n\n /** Use with an AudioEncoder `output` callback (needs the `audio` option). */\n addAudioChunk(chunk, meta) {\n if (meta && meta.decoderConfig && meta.decoderConfig.description && !audioDescription) audioDescription = toBytes(meta.decoderConfig.description);\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n audioSamples.push({ data, ts: chunk.timestamp, dur: chunk.duration || 0 });\n },\n /** Lower-level: add one encoded audio frame, in order. ts/dur in microseconds. */\n addAudioSample(data, { timestamp, duration }) { audioSamples.push({ data, ts: timestamp, dur: duration || 0 }); },\n /** AAC AudioSpecificConfig (for Opus, an optional OpusHead to take the pre-skip from). */\n setAudioDescription(d) { audioDescription = d; },\n\n /** @returns {Uint8Array} the .mp4 file */\n finish() {\n if (!samples.length) throw new Error('No video frames were encoded');\n // Trust the encoder's avcC only if it holds together; otherwise use the keyframe's own SPS/PPS.\n if (!isValidAvcC(description)) {\n const key = samples.find(s => s.key) || samples[0];\n description = avcCFromSample(key.data) || description;\n }\n if (!description) throw new Error('The encoder gave no H.264 decoder configuration (avcC)');\n // Samples arrive in decode order with presentation timestamps (B-frames make them non-monotonic).\n // Decode times are the sorted presentation times; 'ctts' holds the difference when there is one.\n const t = us => Math.round(us * timescale / 1e6);\n const pts = samples.map(s => t(s.ts));\n const dts = pts.slice().sort((a, b) => a - b);\n const lastDur = t(samples[samples.length - 1].dur) || (dts.length > 1 ? dts[dts.length - 1] - dts[dts.length - 2] : t(33333));\n const durs = dts.map((d, i) => (i + 1 < dts.length ? dts[i + 1] - d : lastDur));\n const offsets = pts.map((p, i) => p - dts[i]);\n const hasOffsets = offsets.some(o => o !== 0);\n const mediaDur = durs.reduce((a, b) => a + b, 0);\n const videoMs = Math.round(mediaDur * 1000 / timescale);\n\n const stts = runs(durs);\n const ctts = runs(offsets);\n const keys = samples.map((s, i) => (s.key ? i + 1 : 0)).filter(Boolean);\n const videoSize = samples.reduce((a, s) => a + s.data.length, 0);\n\n const at = audioTrack();\n const audioMs = at ? Math.round(at.mediaDur * 1000 / at.rate) : 0;\n const audioSize = at ? audioSamples.reduce((a, s) => a + s.data.length, 0) : 0;\n const movieDur = Math.max(videoMs, audioMs);\n const dataSize = videoSize + audioSize;\n\n const ftyp = box('ftyp', w => w.str('isom').u32(512).str('isom').str('iso2').str('avc1').str('mp41'));\n const dinf = () => box('dinf', di => di.bytes(fullBox('dref', 0, 0, b => { b.u32(1); b.bytes(fullBox('url ', 0, 1, () => { })); })));\n // one chunk per track: all video samples, then all audio samples\n const stsc = n => fullBox('stsc', 0, 0, b => b.u32(1).u32(1).u32(n).u32(1));\n const stsz = list => fullBox('stsz', 0, 0, b => { b.u32(0).u32(list.length); for (const s of list) b.u32(s.data.length); });\n const stco = offset => fullBox('stco', 0, 0, b => b.u32(1).u32(offset));\n\n const buildMoov = dataStart => box('moov', w => {\n w.bytes(fullBox('mvhd', 0, 0, b => {\n b.u32(0).u32(0).u32(1000).u32(movieDur).u32(0x00010000).u16(0x0100).zeros(10);\n MATRIX.forEach(v => b.u32(v)); b.zeros(24).u32(at ? 3 : 2); // next track ID\n }));\n // ---- video\n w.bytes(box('trak', tr => {\n tr.bytes(fullBox('tkhd', 0, 3, b => {\n b.u32(0).u32(0).u32(1).u32(0).u32(videoMs).zeros(8).u16(0).u16(0).u16(0).u16(0);\n MATRIX.forEach(v => b.u32(v)); b.u32(width << 16).u32(height << 16);\n }));\n tr.bytes(box('mdia', md => {\n md.bytes(fullBox('mdhd', 0, 0, b => b.u32(0).u32(0).u32(timescale).u32(mediaDur).u16(0x55c4).u16(0)));\n md.bytes(fullBox('hdlr', 0, 0, b => b.u32(0).str('vide').zeros(12).str('VideoHandler').u8(0)));\n md.bytes(box('minf', mi => {\n mi.bytes(fullBox('vmhd', 0, 1, b => b.u16(0).u16(0).u16(0).u16(0)));\n mi.bytes(dinf());\n mi.bytes(box('stbl', st => {\n st.bytes(fullBox('stsd', 0, 0, b => {\n b.u32(1);\n b.bytes(box('avc1', a => {\n a.zeros(6).u16(1).zeros(16).u16(width).u16(height).u32(0x00480000).u32(0x00480000).u32(0).u16(1);\n const name = ENC.encode('image-to-pixel').slice(0, 31);\n a.u8(name.length).bytes(name).zeros(31 - name.length).u16(0x0018).u16(0xffff);\n a.bytes(box('avcC', c => c.bytes(description)));\n }));\n }));\n st.bytes(fullBox('stts', 0, 0, b => { b.u32(stts.length); for (const [n, d] of stts) b.u32(n).u32(d); }));\n // version 1: signed offsets, so negative composition offsets are allowed\n if (hasOffsets) st.bytes(fullBox('ctts', 1, 0, b => { b.u32(ctts.length); for (const [n, o] of ctts) b.u32(n).u32(o >>> 0); }));\n if (keys.length < samples.length) st.bytes(fullBox('stss', 0, 0, b => { b.u32(keys.length); for (const k of keys) b.u32(k); }));\n st.bytes(stsc(samples.length));\n st.bytes(stsz(samples));\n st.bytes(stco(dataStart));\n }));\n }));\n }));\n }));\n // ---- audio\n if (at) w.bytes(box('trak', tr => {\n tr.bytes(fullBox('tkhd', 0, 3, b => {\n // layer 0, alternate group 1, volume 1.0\n b.u32(0).u32(0).u32(2).u32(0).u32(audioMs).zeros(8).u16(0).u16(1).u16(0x0100).u16(0);\n MATRIX.forEach(v => b.u32(v)); b.u32(0).u32(0);\n }));\n tr.bytes(box('mdia', md => {\n md.bytes(fullBox('mdhd', 0, 0, b => b.u32(0).u32(0).u32(at.rate).u32(at.mediaDur).u16(0x55c4).u16(0)));\n md.bytes(fullBox('hdlr', 0, 0, b => b.u32(0).str('soun').zeros(12).str('SoundHandler').u8(0)));\n md.bytes(box('minf', mi => {\n mi.bytes(fullBox('smhd', 0, 0, b => b.u16(0).u16(0)));\n mi.bytes(dinf());\n mi.bytes(box('stbl', st => {\n st.bytes(fullBox('stsd', 0, 0, b => { b.u32(1); b.bytes(at.entry); }));\n const r = runs(at.durs);\n st.bytes(fullBox('stts', 0, 0, b => { b.u32(r.length); for (const [n, d] of r) b.u32(n).u32(d); }));\n st.bytes(stsc(audioSamples.length));\n st.bytes(stsz(audioSamples));\n st.bytes(stco(dataStart + videoSize));\n }));\n }));\n }));\n }));\n });\n // the moov size doesn't depend on the offset values, so measure once and build again\n const moovSize = buildMoov(0).length;\n const offset = ftyp.length + moovSize + 8;\n if (offset + dataSize > 0xffffffff) throw new Error('Video is larger than 4 GB');\n const moov = buildMoov(offset);\n const out = new Uint8Array(offset + dataSize);\n out.set(ftyp, 0); out.set(moov, ftyp.length);\n const dv = new DataView(out.buffer);\n dv.setUint32(ftyp.length + moov.length, dataSize + 8);\n out.set(ENC.encode('mdat'), ftyp.length + moov.length + 4);\n let o = offset;\n for (const s of samples) { out.set(s.data, o); o += s.data.length; }\n if (at) for (const s of audioSamples) { out.set(s.data, o); o += s.data.length; }\n return out;\n },\n };\n}\n", "// Minimal WebM (Matroska) muxer for one VP8/VP9/AV1 video track and, optionally, one Opus audio track.\n// Buffered in memory, written with a SeekHead and Cues so players can seek.\n// Input: encoded frames from WebCodecs' VideoEncoder (and AudioEncoder for the audio).\n\nimport { opusHead, parseOpusHead } from './audio.js';\n\nconst ENC = new TextEncoder();\n\n/** EBML variable-length size, always 8 bytes (simple and valid for any size). */\nfunction size8(n) {\n const b = new Uint8Array(8);\n b[0] = 0x01;\n let v = n;\n for (let i = 7; i >= 1; i--) { b[i] = v % 256; v = Math.floor(v / 256); }\n return b;\n}\nfunction idBytes(id) {\n const out = [];\n for (let v = id; v > 0; v = Math.floor(v / 256)) out.unshift(v % 256);\n return out;\n}\nfunction concat(parts) {\n let n = 0; for (const p of parts) n += p.length;\n const out = new Uint8Array(n); let o = 0;\n for (const p of parts) { out.set(p, o); o += p.length; }\n return out;\n}\n/** An element: id, 8-byte size, data. */\nconst el = (id, data) => concat([Uint8Array.from(idBytes(id)), size8(data.length), data]);\nconst uint = (id, v, bytes = 0) => {\n const b = [];\n for (let x = v; x > 0 || b.length === 0; x = Math.floor(x / 256)) b.unshift(x % 256);\n while (b.length < bytes) b.unshift(0);\n return el(id, Uint8Array.from(b));\n};\nconst str = (id, s) => el(id, ENC.encode(s));\nconst float64 = (id, v) => { const b = new Uint8Array(8); new DataView(b.buffer).setFloat64(0, v); return el(id, b); };\nconst master = (id, children) => el(id, concat(children));\n\nconst ID = {\n EBML: 0x1A45DFA3, EBMLVersion: 0x4286, EBMLReadVersion: 0x42F7, EBMLMaxIDLength: 0x42F2, EBMLMaxSizeLength: 0x42F3,\n DocType: 0x4282, DocTypeVersion: 0x4287, DocTypeReadVersion: 0x4285,\n Segment: 0x18538067, SeekHead: 0x114D9B74, Seek: 0x4DBB, SeekID: 0x53AB, SeekPosition: 0x53AC,\n Info: 0x1549A966, TimestampScale: 0x2AD7B1, Duration: 0x4489, MuxingApp: 0x4D80, WritingApp: 0x5741,\n Tracks: 0x1654AE6B, TrackEntry: 0xAE, TrackNumber: 0xD7, TrackUID: 0x73C5, TrackType: 0x83, FlagLacing: 0x9C,\n CodecID: 0x86, CodecPrivate: 0x63A2, DefaultDuration: 0x23E383, Video: 0xE0, PixelWidth: 0xB0, PixelHeight: 0xBA,\n CodecDelay: 0x56AA, SeekPreRoll: 0x56BB, Audio: 0xE1, SamplingFrequency: 0xB5, Channels: 0x9F,\n Cluster: 0x1F43B675, Timestamp: 0xE7, SimpleBlock: 0xA3,\n Cues: 0x1C53BB6B, CuePoint: 0xBB, CueTime: 0xB3, CueTrackPositions: 0xB7, CueTrack: 0xF7, CueClusterPosition: 0xF1,\n};\n\nconst CODEC_IDS = { vp8: 'V_VP8', vp9: 'V_VP9', av1: 'V_AV1' };\nconst VIDEO = 1, AUDIO = 2; // track numbers\n\nconst toBytes = d => new Uint8Array(d instanceof ArrayBuffer ? d : d.buffer.slice(d.byteOffset, d.byteOffset + d.byteLength));\n\n/**\n * @param {{ width: number, height: number, codec: 'vp8' | 'vp9' | 'av1', fps?: number,\n * audio?: { codec: 'opus', sampleRate: number, numberOfChannels: number } }} opts\n * audio: add an Opus track (WebM holds Opus or Vorbis only). Feed it with addAudioChunk() or addAudioFrame().\n */\nexport function createWebmMuxer({ width, height, codec = 'vp9', fps = 0, audio = null }) {\n if (audio && audio.codec && audio.codec !== 'opus') throw new Error(`WebM audio must be Opus, not ${audio.codec}`);\n const frames = []; // video: { data, key, ms }\n const audioFrames = []; // audio: { data, ms, dms }\n let codecPrivate = null;\n let audioPrivate = null;\n\n return {\n addChunk(chunk, meta) {\n if (meta && meta.decoderConfig && meta.decoderConfig.description && !codecPrivate) codecPrivate = toBytes(meta.decoderConfig.description);\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n frames.push({ data, key: chunk.type === 'key', ms: chunk.timestamp / 1000 });\n },\n /** Lower-level: add one encoded frame. timestamp in microseconds. */\n addFrame(data, { key, timestamp }) { frames.push({ data, key: !!key, ms: timestamp / 1000 }); },\n\n /** Use with an AudioEncoder `output` callback (needs the `audio` option). */\n addAudioChunk(chunk, meta) {\n if (meta && meta.decoderConfig && meta.decoderConfig.description && !audioPrivate) audioPrivate = toBytes(meta.decoderConfig.description);\n const data = new Uint8Array(chunk.byteLength);\n chunk.copyTo(data);\n audioFrames.push({ data, ms: chunk.timestamp / 1000, dms: (chunk.duration || 0) / 1000 });\n },\n /** Lower-level: add one Opus packet, in order. timestamp/duration in microseconds. */\n addAudioFrame(data, { timestamp, duration }) { audioFrames.push({ data, ms: timestamp / 1000, dms: (duration || 0) / 1000 }); },\n\n /** @returns {Uint8Array} the .webm file */\n finish() {\n if (!frames.length) throw new Error('No video frames were encoded');\n const hasAudio = !!(audio && audioFrames.length);\n // VP8/VP9/AV1 frames from WebCodecs arrive in decode order, which is the order they're stored in\n const frameMs = fps ? 1000 / fps : (frames.length > 1 ? (frames[frames.length - 1].ms - frames[0].ms) / (frames.length - 1) : 33.333);\n let duration = frames[frames.length - 1].ms + frameMs;\n if (hasAudio) { const a = audioFrames[audioFrames.length - 1]; duration = Math.max(duration, a.ms + (a.dms || 20)); }\n\n const info = master(ID.Info, [\n uint(ID.TimestampScale, 1000000), // 1 ms\n float64(ID.Duration, duration),\n str(ID.MuxingApp, 'image-to-pixel'), str(ID.WritingApp, 'image-to-pixel'),\n ]);\n const trackEntries = [master(ID.TrackEntry, [\n uint(ID.TrackNumber, VIDEO), uint(ID.TrackUID, VIDEO), uint(ID.TrackType, 1), uint(ID.FlagLacing, 0),\n str(ID.CodecID, CODEC_IDS[codec] || codec),\n ...(codecPrivate ? [el(ID.CodecPrivate, codecPrivate)] : []),\n uint(ID.DefaultDuration, Math.round(frameMs * 1e6)),\n master(ID.Video, [uint(ID.PixelWidth, width), uint(ID.PixelHeight, height)]),\n ])];\n if (hasAudio) {\n // Matroska requires the OpusHead as CodecPrivate; build one when the encoder didn't provide it\n const head = parseOpusHead(audioPrivate) ? audioPrivate : opusHead(audio.numberOfChannels, audio.sampleRate);\n const preSkip = parseOpusHead(head).preSkip;\n trackEntries.push(master(ID.TrackEntry, [\n uint(ID.TrackNumber, AUDIO), uint(ID.TrackUID, AUDIO), uint(ID.TrackType, 2), uint(ID.FlagLacing, 0),\n str(ID.CodecID, 'A_OPUS'),\n el(ID.CodecPrivate, head),\n uint(ID.CodecDelay, Math.round(preSkip * 1e9 / 48000)), // nanoseconds\n uint(ID.SeekPreRoll, 80000000), // 80 ms, as the Opus mapping recommends\n master(ID.Audio, [float64(ID.SamplingFrequency, audio.sampleRate), uint(ID.Channels, audio.numberOfChannels)]),\n ]));\n }\n const tracks = master(ID.Tracks, trackEntries);\n\n // Blocks of both tracks in time order (video first on a tie, so a cluster starts on its keyframe).\n const blocks = frames.map((f, i) => ({ track: VIDEO, data: f.data, key: f.key, ms: f.ms, order: i }));\n if (hasAudio) audioFrames.forEach((f, i) => blocks.push({ track: AUDIO, data: f.data, key: true, ms: f.ms, order: frames.length + i }));\n if (hasAudio) blocks.sort((a, b) => a.ms - b.ms || a.track - b.track || a.order - b.order);\n\n // clusters: a new one at each video keyframe, and before the 16-bit relative timestamp overflows\n const clusters = [];\n let cur = null;\n for (const b of blocks) {\n const t = Math.round(b.ms);\n const videoKey = b.track === VIDEO && b.key;\n if (!cur || videoKey || t - cur.start > 30000) { cur = { start: t, key: videoKey, blocks: [] }; clusters.push(cur); }\n const head = new Uint8Array(4);\n head[0] = 0x80 | b.track; // track number as a 1-byte EBML vint\n new DataView(head.buffer).setInt16(1, t - cur.start);\n head[3] = b.key ? 0x80 : 0x00;\n cur.blocks.push(el(ID.SimpleBlock, concat([head, b.data])));\n }\n const clusterBytes = clusters.map(c => master(ID.Cluster, [uint(ID.Timestamp, c.start), ...c.blocks]));\n\n // SeekHead with fixed-width positions, so its size is known before the positions are\n const seekHead = (posInfo, posTracks, posCues) => master(ID.SeekHead, [\n [ID.Info, posInfo], [ID.Tracks, posTracks], [ID.Cues, posCues],\n ].map(([id, pos]) => master(ID.Seek, [el(ID.SeekID, Uint8Array.from(idBytes(id))), uint(ID.SeekPosition, pos, 8)])));\n const shSize = seekHead(0, 0, 0).length;\n const posInfo = shSize, posTracks = posInfo + info.length;\n let pos = posTracks + tracks.length;\n const cuePoints = [];\n clusters.forEach((c, i) => {\n if (c.key) cuePoints.push(master(ID.CuePoint, [uint(ID.CueTime, c.start), master(ID.CueTrackPositions, [uint(ID.CueTrack, VIDEO), uint(ID.CueClusterPosition, pos)])]));\n pos += clusterBytes[i].length;\n });\n const cues = master(ID.Cues, cuePoints.length ? cuePoints : [master(ID.CuePoint, [uint(ID.CueTime, 0), master(ID.CueTrackPositions, [uint(ID.CueTrack, VIDEO), uint(ID.CueClusterPosition, posTracks + tracks.length)])])]);\n const posCues = pos;\n\n const header = master(ID.EBML, [\n uint(ID.EBMLVersion, 1), uint(ID.EBMLReadVersion, 1), uint(ID.EBMLMaxIDLength, 4), uint(ID.EBMLMaxSizeLength, 8),\n str(ID.DocType, 'webm'), uint(ID.DocTypeVersion, 4), uint(ID.DocTypeReadVersion, 2),\n ]);\n const segment = master(ID.Segment, [seekHead(posInfo, posTracks, posCues), info, tracks, ...clusterBytes, cues]);\n return concat([header, segment]);\n },\n };\n}\n", "// image-to-pixel/video: encode processed frames to MP4 (H.264) or WebM (VP9/VP8) with WebCodecs,\n// optionally with the source's soundtrack (AAC or Opus in MP4, Opus in WebM).\n// The muxers are this project's own (lib/core/video/mux-*.js): MIT, no dependencies.\n\nimport { createMp4Muxer } from './core/video/mux-mp4.js';\nimport { createWebmMuxer } from './core/video/mux-webm.js';\nimport { decodeAudio, encodeAudio, audioCodecSupported, findAudioConfig } from './core/video/audio.js';\nimport { upscale } from './core/export/scale.js';\n\nexport { forEachFrame, estimateFps, seekTo, frameTimes, videoReady } from './core/video/frames.js';\nexport { createMp4Muxer, createWebmMuxer, decodeAudio, encodeAudio, audioCodecSupported, findAudioConfig };\n\nconst AVC = ['avc1.640033', 'avc1.4d0033', 'avc1.42003e', 'avc1.640028', 'avc1.42001f'];\nconst VP = [['vp09.00.10.08', 'vp9'], ['vp8', 'vp8']];\n\n/** Which formats this browser can encode. `aac` / `opus`: audio for MP4 (either) and WebM (Opus). */\nexport async function videoSupport(width = 640, height = 480) {\n const out = { mp4: false, webm: false, webcodecs: typeof VideoEncoder !== 'undefined', aac: false, opus: false };\n if (out.webcodecs) {\n for (const codec of AVC) if ((await VideoEncoder.isConfigSupported({ codec, width, height }).catch(() => ({}))).supported) { out.mp4 = true; break; }\n for (const [codec] of VP) if ((await VideoEncoder.isConfigSupported({ codec, width, height }).catch(() => ({}))).supported) { out.webm = true; break; }\n }\n out.aac = await audioCodecSupported('aac');\n out.opus = await audioCodecSupported('opus');\n return out;\n}\n\nconst even = n => n + (n & 1);\n\n/** The audio codec and encoder config for a container, or null when the browser can't encode a suitable one. */\nasync function pickAudio(format, pcm, bitrate) {\n const order = format === 'mp4' ? ['aac', 'opus'] : ['opus']; // WebM only holds Opus (or Vorbis)\n for (const codec of order) {\n const config = await findAudioConfig(codec, pcm.sampleRate, pcm.numberOfChannels, bitrate);\n if (config) return { codec, config };\n }\n return null;\n}\n\n/**\n * Start an encoder; add frames one at a time (so a long clip never sits in memory), then finish().\n * @param {{ format: 'mp4' | 'webm', fps: number, width: number, height: number, scale?: number, bitrate?: number,\n * audio?: { sampleRate: number, numberOfChannels: number, channels: Float32Array[] } | null,\n * audioBitrate?: number }} opts\n * width/height: size of the frames you will add (before scaling)\n * audio: PCM to add as a soundtrack, e.g. from decodeAudio(file, { start, end }). It is cut to the\n * video's length. When the browser can't encode audio the video is still made, without it\n * (check `encoder.audioCodec`).\n */\nexport async function createVideoEncoder(opts) {\n const scale = Math.max(1, Math.round(opts.scale || 1));\n const W = even(opts.width * scale), H = even(opts.height * scale);\n const fps = opts.fps || 30;\n const bitrate = opts.bitrate || Math.min(20e6, Math.max(2e6, W * H * fps * 0.15));\n if (typeof VideoEncoder === 'undefined') throw new Error('This browser has no WebCodecs VideoEncoder. Export a GIF or PNG sequence instead.');\n\n let codec = null, muxCodec = null;\n const list = opts.format === 'mp4' ? AVC.map(c => [c, 'avc']) : VP;\n for (const [c, m] of list) {\n const ok = await VideoEncoder.isConfigSupported({ codec: c, width: W, height: H, bitrate, framerate: fps }).catch(() => ({}));\n if (ok.supported) { codec = c; muxCodec = m; break; }\n }\n if (!codec) throw new Error(`No ${opts.format.toUpperCase()} encoder available in this browser at ${W}\u00D7${H}.`);\n\n const pcm = opts.audio && opts.audio.channels && opts.audio.channels.length ? opts.audio : null;\n const picked = pcm ? await pickAudio(opts.format, pcm, opts.audioBitrate || 128000) : null;\n const audioCodec = picked ? picked.codec : null;\n const audioTrack = picked ? { codec: audioCodec, sampleRate: picked.config.sampleRate, numberOfChannels: picked.config.numberOfChannels, bitrate: picked.config.bitrate || 128000 } : null;\n\n const muxer = opts.format === 'mp4'\n ? createMp4Muxer({ width: W, height: H, audio: audioTrack })\n : createWebmMuxer({ width: W, height: H, codec: muxCodec, fps, audio: audioTrack });\n\n let error = null;\n const encoder = new VideoEncoder({\n output: (chunk, meta) => muxer.addChunk(chunk, meta),\n error: e => { error = e; },\n });\n // avc.format 'avc': length-prefixed NAL units plus a decoder config record, which MP4 needs\n encoder.configure({ codec, width: W, height: H, bitrate, framerate: fps, latencyMode: 'quality', ...(opts.format === 'mp4' ? { avc: { format: 'avc' } } : {}) });\n\n const canvas = new OffscreenCanvas(W, H);\n const ctx = canvas.getContext('2d');\n let i = 0;\n const frameUs = 1e6 / fps;\n\n return {\n width: W, height: H, codec,\n /** 'aac' or 'opus' when the soundtrack will be included, null otherwise. */\n audioCodec,\n /** @param {{ width, height, data }} img */\n async add(img) {\n if (error) throw error;\n const up = scale > 1 ? upscale(img, scale) : img;\n ctx.fillStyle = '#000'; ctx.fillRect(0, 0, W, H);\n ctx.putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\n const frame = new VideoFrame(canvas, { timestamp: Math.round(i * frameUs), duration: Math.round(frameUs) });\n encoder.encode(frame, { keyFrame: i % Math.max(1, Math.round(fps * 2)) === 0 });\n frame.close();\n i++;\n if (encoder.encodeQueueSize > 8) await new Promise(r => setTimeout(r, 0));\n },\n /** @returns {Promise<Blob>} */\n async finish() {\n await encoder.flush();\n if (error) throw error;\n encoder.close();\n if (audioCodec && i > 0) {\n // the soundtrack ends with the last frame\n await encodeAudio(pcm, { config: picked.config, maxDuration: i / fps, onChunk: (chunk, meta) => muxer.addAudioChunk(chunk, meta) });\n }\n return new Blob([muxer.finish()], { type: opts.format === 'mp4' ? 'video/mp4' : 'video/webm' });\n },\n };\n}\n\n/** Convenience: encode an array of frames in one go. */\nexport async function encodeVideo(frames, opts) {\n const enc = await createVideoEncoder({ ...opts, width: frames[0].width, height: frames[0].height });\n for (const f of frames) await enc.add(f);\n return enc.finish();\n}\n", "// Built-in palettes. Most come from Lospec (https://lospec.com/palette-list); credit to their authors.\r\n// The list matches the classic editor plus a few staples.\r\n\r\n/** @type {{ id: string, name: string, author: string, colors: string[] }[]} */\r\nexport const PALETTES = [\r\n { id: \"1-bit-monitor\", name: \"1-Bit Monitor\", author: \"\", colors: [\"222323\",\"f0f6f0\"] },\r\n { id: \"apollo\", name: \"Apollo\", author: \"AdamCYounis\", colors: [\"172038\",\"253a5e\",\"3c5e8b\",\"4f8fba\",\"73bed3\",\"a4dddb\",\"19332d\",\"25562e\",\"468232\",\"75a743\",\"a8ca58\",\"d0da91\",\"4d2b32\",\"7a4841\",\"ad7757\",\"c09473\",\"d7b594\",\"e7d5b3\",\"341c27\",\"602c2c\",\"884b2b\",\"be772b\",\"de9e41\",\"e8c170\",\"241527\",\"411d31\",\"752438\",\"a53030\",\"cf573c\",\"da863e\",\"1e1d39\",\"402751\",\"7a367b\",\"a23e8c\",\"c65197\",\"df84a5\",\"090a14\",\"10141f\",\"151d28\",\"202e37\",\"394a50\",\"577277\",\"819796\",\"a8b5b2\",\"c7cfcc\",\"ebede9\"] },\r\n { id: \"batpalette\", name: \"Batpalette\", author: \"el Rojaz\", colors: [\"000000\",\"7f7f7f\",\"ffffff\",\"681e99\",\"3f48cc\",\"88ff82\",\"bfa621\",\"cc3d18\"] },\r\n { id: \"beached-boogaloo\", name: \"Beached Boogaloo\", author: \".tomais\", colors: [\"ff0b20\",\"8f0434\",\"500037\",\"a0ff00\",\"57e71e\",\"0ea717\",\"057833\",\"2cdeef\",\"2483e7\",\"153ab7\",\"0d0a87\",\"ff0b88\",\"a60fff\",\"6409cf\",\"eaef30\",\"ff880b\",\"b75308\",\"802202\",\"000000\",\"231940\",\"514378\",\"ffffff\",\"73a3a7\",\"366770\",\"f7b771\",\"c77650\",\"974c38\",\"873939\",\"601e2c\",\"300c1f\"] },\r\n { id: \"cc-29\", name: \"CC-29\", author: \"Alpha6\", colors: [\"f2f0e5\",\"b8b5b9\",\"868188\",\"646365\",\"45444f\",\"3a3858\",\"212123\",\"352b42\",\"43436a\",\"4b80ca\",\"68c2d3\",\"a2dcc7\",\"ede19e\",\"d3a068\",\"b45252\",\"6a536e\",\"4b4158\",\"80493a\",\"a77b5b\",\"e5ceb4\",\"c2d368\",\"8ab060\",\"567b79\",\"4e584a\",\"7b7243\",\"b2b47e\",\"edc8c4\",\"cf8acb\",\"5f556a\"] },\r\n { id: \"cga-16\", name: \"CGA 16\", author: \"\", colors: [\"000000\",\"0000aa\",\"00aa00\",\"00aaaa\",\"aa0000\",\"aa00aa\",\"aa5500\",\"aaaaaa\",\"555555\",\"5555ff\",\"55ff55\",\"55ffff\",\"ff5555\",\"ff55ff\",\"ffff55\",\"ffffff\"] },\r\n { id: \"chaotic-neutral\", name: \"Chaotic neutral\", author: \"Dodecahedron \u2DFD\", colors: [\"e1d4cb\",\"c19f90\",\"a56457\",\"6d504d\",\"484044\",\"392b29\",\"31312f\",\"d8eef0\",\"97999f\",\"81a4c0\",\"6a7f92\",\"415973\",\"43425a\",\"45334b\",\"4b1f40\",\"671087\",\"955ab9\"] },\r\n { id: \"endesga-32\", name: \"Endesga 32\", author: \"ENDESGA\", colors: [\"be4a2f\",\"d77643\",\"ead4aa\",\"e4a672\",\"b86f50\",\"733e39\",\"3e2731\",\"a22633\",\"e43b44\",\"f77622\",\"feae34\",\"fee761\",\"63c74d\",\"3e8948\",\"265c42\",\"193c3e\",\"124e89\",\"0099db\",\"2ce8f5\",\"ffffff\",\"c0cbdc\",\"8b9bb4\",\"5a6988\",\"3a4466\",\"262b44\",\"181425\",\"ff0044\",\"68386c\",\"b55088\",\"f6757a\",\"e8b796\",\"c28569\"] },\r\n { id: \"fantasy-24\", name: \"Fantasy 24\", author: \"\", colors: [\"1f240a\",\"39571c\",\"a58c27\",\"efac28\",\"efd8a1\",\"ab5c1c\",\"183f39\",\"ef692f\",\"efb775\",\"a56243\",\"773421\",\"724113\",\"2a1d0d\",\"392a1c\",\"684c3c\",\"927e6a\",\"276468\",\"ef3a0c\",\"45230d\",\"3c9f9c\",\"9b1a0a\",\"36170c\",\"550f0a\",\"300f0a\"] },\r\n { id: \"game-boy-dmg\", name: \"Game Boy (DMG)\", author: \"\", colors: [\"0f380f\",\"306230\",\"8bac0f\",\"9bbc0f\"] },\r\n { id: \"grayscale-4\", name: \"Grayscale 4\", author: \"\", colors: [\"000000\",\"555555\",\"aaaaaa\",\"ffffff\"] },\r\n { id: \"hidden-library\", name: \"Hidden Library\", author: \"Pixel Hoo\", colors: [\"100b2a\",\"2a213a\",\"314743\",\"65856d\",\"adca9a\",\"ecfeca\",\"582d27\",\"974133\",\"d67654\",\"5d3441\",\"a3685b\",\"ffb379\",\"ffe6a9\",\"ffffff\"] },\r\n { id: \"intacto14\", name: \"Intacto14\", author: \"Anubi\", colors: [\"221529\",\"4b5561\",\"879ba3\",\"cbf5ef\",\"62b4de\",\"5660d6\",\"5b29a6\",\"d64562\",\"f2735c\",\"edbb8e\",\"ab6375\",\"522152\",\"37ada2\",\"8cde8c\"] },\r\n { id: \"journey\", name: \"Journey\", author: \"\uD83C\uDF4DPineappleOnPizza\uD83C\uDF4D\", colors: [\"050914\",\"110524\",\"3b063a\",\"691749\",\"9c3247\",\"d46453\",\"f5a15d\",\"ffcf8e\",\"ff7a7d\",\"ff417d\",\"d61a88\",\"94007a\",\"42004e\",\"220029\",\"100726\",\"25082c\",\"3d1132\",\"73263d\",\"bd4035\",\"ed7b39\",\"ffb84a\",\"fff540\",\"c6d831\",\"77b02a\",\"429058\",\"2c645e\",\"153c4a\",\"052137\",\"0e0421\",\"0c0b42\",\"032769\",\"144491\",\"488bd4\",\"78d7ff\",\"b0fff1\",\"faffff\",\"c7d4e1\",\"928fb8\",\"5b537d\",\"392946\",\"24142c\",\"0e0f2c\",\"132243\",\"1a466b\",\"10908e\",\"28c074\",\"3dff6e\",\"f8ffb8\",\"f0c297\",\"cf968c\",\"8f5765\",\"52294b\",\"0f022e\",\"35003b\",\"64004c\",\"9b0e3e\",\"d41e3c\",\"ed4c40\",\"ff9757\",\"d4662f\",\"9c341a\",\"691b22\",\"450c28\",\"2d002e\"] },\r\n { id: \"lospec500\", name: \"Lospec500\", author: \"\", colors: [\"10121c\",\"2c1e31\",\"6b2643\",\"ac2847\",\"ec273f\",\"94493a\",\"de5d3a\",\"e98537\",\"f3a833\",\"4d3533\",\"6e4c30\",\"a26d3f\",\"ce9248\",\"dab163\",\"e8d282\",\"f7f3b7\",\"1e4044\",\"006554\",\"26854c\",\"5ab552\",\"9de64e\",\"008b8b\",\"62a477\",\"a6cb96\",\"d3eed3\",\"3e3b65\",\"3859b3\",\"3388de\",\"36c5f4\",\"6dead6\",\"5e5b8c\",\"8c78a5\",\"b0a7b8\",\"deceed\",\"9a4d76\",\"c878af\",\"cc99ff\",\"fa6e79\",\"ffa2ac\",\"ffd1d5\",\"f6e8e0\",\"ffffff\"] },\r\n { id: \"nyx8\", name: \"Nyx8\", author: \"Javier Guerrero\", colors: [\"08141e\",\"0f2a3f\",\"20394f\",\"4e495f\",\"816271\",\"997577\",\"c3a38a\",\"f6d6bd\"] },\r\n { id: \"oil-6\", name: \"Oil 6\", author: \"\", colors: [\"fbf5ef\",\"f2d3ab\",\"c69fa5\",\"8b6d9c\",\"494d7e\",\"272744\"] },\r\n { id: \"pico-8\", name: \"PICO-8\", author: \"\", colors: [\"000000\",\"1d2b53\",\"7e2553\",\"008751\",\"ab5236\",\"5f574f\",\"c2c3c7\",\"fff1e8\",\"ff004d\",\"ffa300\",\"ffec27\",\"00e436\",\"29adff\",\"83769c\",\"ff77a8\",\"ffccaa\"] },\r\n { id: \"resurrect-64\", name: \"Resurrect 64\", author: \"Kerrie Lake\", colors: [\"2e222f\",\"3e3546\",\"625565\",\"966c6c\",\"ab947a\",\"694f62\",\"7f708a\",\"9babb2\",\"c7dcd0\",\"ffffff\",\"6e2727\",\"b33831\",\"ea4f36\",\"f57d4a\",\"ae2334\",\"e83b3b\",\"fb6b1d\",\"f79617\",\"f9c22b\",\"7a3045\",\"9e4539\",\"cd683d\",\"e6904e\",\"fbb954\",\"4c3e24\",\"676633\",\"a2a947\",\"d5e04b\",\"fbff86\",\"165a4c\",\"239063\",\"1ebc73\",\"91db69\",\"cddf6c\",\"313638\",\"374e4a\",\"547e64\",\"92a984\",\"b2ba90\",\"0b5e65\",\"0b8a8f\",\"0eaf9b\",\"30e1b9\",\"8ff8e2\",\"323353\",\"484a77\",\"4d65b4\",\"4d9be6\",\"8fd3ff\",\"45293f\",\"6b3e75\",\"905ea9\",\"a884f3\",\"eaaded\",\"753c54\",\"a24b6f\",\"cf657f\",\"ed8099\",\"831c5d\",\"c32454\",\"f04f78\",\"f68181\",\"fca790\",\"fdcbb0\"] },\r\n { id: \"slso8\", name: \"SLSO8\", author: \"Luis Miguel Maldonado\", colors: [\"0d2b45\",\"203c56\",\"544e68\",\"8d697a\",\"d08159\",\"ffaa5e\",\"ffd4a3\",\"ffecd6\"] },\r\n { id: \"sweet-canyon-extended-64\", name: \"Sweet Canyon Extended 64\", author: \"Mr Slime\", colors: [\"0f0e11\",\"2d2c33\",\"40404a\",\"51545c\",\"6b7179\",\"7c8389\",\"a8b2b6\",\"d5d5d5\",\"eeebe0\",\"f1dbb1\",\"eec99f\",\"e1a17e\",\"cc9562\",\"ab7b49\",\"9a643a\",\"86482f\",\"783a29\",\"6a3328\",\"541d29\",\"42192c\",\"512240\",\"782349\",\"8b2e5d\",\"a93e89\",\"d062c8\",\"ec94ea\",\"f2bdfc\",\"eaebff\",\"a2fafa\",\"64e7e7\",\"54cfd8\",\"2fb6c3\",\"2c89af\",\"25739d\",\"2a5684\",\"214574\",\"1f2966\",\"101445\",\"3c0d3b\",\"66164c\",\"901f3d\",\"bb3030\",\"dc473c\",\"ec6a45\",\"fb9b41\",\"f0c04c\",\"f4d66e\",\"fffb76\",\"ccf17a\",\"97d948\",\"6fba3b\",\"229443\",\"1d7e45\",\"116548\",\"0c4f3f\",\"0a3639\",\"251746\",\"48246d\",\"69189c\",\"9f20c0\",\"e527d2\",\"ff51cf\",\"ff7ada\",\"ff9edb\"] },\r\n { id: \"sweetie-16\", name: \"Sweetie 16\", author: \"\", colors: [\"1a1c2c\",\"5d275d\",\"b13e53\",\"ef7d57\",\"ffcd75\",\"a7f070\",\"38b764\",\"257179\",\"29366f\",\"3b5dc9\",\"41a6f6\",\"73eff7\",\"f4f4f4\",\"94b0c2\",\"566c86\",\"333c57\"] },\r\n { id: \"toxic-haze\", name: \"Toxic Haze\", author: \"sillyTheJester\", colors: [\"e5ff00\",\"b8d14a\",\"9ab06e\",\"708763\",\"4c5c52\",\"393e40\",\"242424\"] },\r\n { id: \"vinik24\", name: \"Vinik24\", author: \"Vinik\", colors: [\"000000\",\"6f6776\",\"9a9a97\",\"c5ccb8\",\"8b5580\",\"c38890\",\"a593a5\",\"666092\",\"9a4f50\",\"c28d75\",\"7ca1c0\",\"416aa3\",\"8d6268\",\"be955c\",\"68aca9\",\"387080\",\"6e6962\",\"93a167\",\"6eaa78\",\"557064\",\"9d9f7f\",\"7e9e99\",\"5d6872\",\"433455\"] },\r\n];\r\n\r\n/** Look a built-in palette up by id or name (case-insensitive). */\r\nexport function getPalette(idOrName) {\r\n const k = String(idOrName || \"\").toLowerCase();\r\n return PALETTES.find(p => p.id === k || p.name.toLowerCase() === k) || null;\r\n}\r\n", "// The settings object is the one contract between the engine, the editor, presets,\r\n// share links and saved JSON. Everything goes through normalizeSettings().\r\n\r\nimport { getPalette } from './palette/builtin.js';\r\nimport { normHex, isColor } from './color.js';\r\n\r\nexport const SETTINGS_VERSION = 1;\r\nexport const MAX_SIZE = 2048;\r\n\r\n/** Dither methods. `kind` decides which pipeline runs them. */\r\nexport const DITHER_METHODS = [\r\n { id: 'none', label: 'None', kind: 'none' },\r\n { id: 'bayer2', label: 'Bayer 2\u00D72', kind: 'ordered' },\r\n { id: 'bayer4', label: 'Bayer 4\u00D74', kind: 'ordered' },\r\n { id: 'bayer8', label: 'Bayer 8\u00D78', kind: 'ordered' },\r\n { id: 'bayer16', label: 'Bayer 16\u00D716', kind: 'ordered' },\r\n { id: 'cluster4', label: 'Clustered dot 4\u00D74', kind: 'ordered' },\r\n { id: 'cluster8', label: 'Clustered dot 8\u00D78', kind: 'ordered' },\r\n { id: 'lines', label: 'Horizontal lines', kind: 'ordered' },\r\n { id: 'bluenoise', label: 'Blue noise', kind: 'ordered' },\r\n { id: 'custom', label: 'Custom matrix', kind: 'ordered' },\r\n { id: 'floyd-steinberg', label: 'Floyd\u2013Steinberg', kind: 'diffusion' },\r\n { id: 'atkinson', label: 'Atkinson', kind: 'diffusion' },\r\n { id: 'sierra-lite', label: 'Sierra Lite', kind: 'diffusion' },\r\n { id: 'sierra', label: 'Sierra', kind: 'diffusion' },\r\n { id: 'burkes', label: 'Burkes', kind: 'diffusion' },\r\n { id: 'jarvis', label: 'Jarvis\u2013Judice\u2013Ninke', kind: 'diffusion' },\r\n { id: 'stucki', label: 'Stucki', kind: 'diffusion' },\r\n];\r\nexport const ditherKind = id => (DITHER_METHODS.find(m => m.id === id) || { kind: 'none' }).kind;\r\n\r\n/** Names the classic image-to-pixel.js used, mapped to the new ids. */\r\nexport const LEGACY_DITHER = {\r\n 'none': 'none', 'floyd-steinberg': 'floyd-steinberg', 'atkinson': 'atkinson',\r\n 'ordered': 'bayer8', '2x2 bayer': 'bayer2', '4x4 bayer': 'bayer4', 'clustered 4x4': 'cluster4',\r\n};\r\n\r\nexport const DEFAULTS = Object.freeze({\r\n version: SETTINGS_VERSION,\r\n size: { mode: 'width', width: 96, height: 0, block: 8, resample: 'box' },\r\n adjust: { brightness: 0, contrast: 0, saturation: 0, hue: 0, gamma: 1 },\r\n frame: { aspect: 'original', zoom: 1, x: 0.5, y: 0.5 },\r\n palette: { source: 'builtin', id: 'endesga-32', name: 'Endesga 32', colors: [], count: 16, distance: 'oklab' },\r\n dither: { method: 'bayer4', strength: 0.6, matrix: null },\r\n alpha: { threshold: 0.5 },\r\n cleanup: { orphans: false, smooth: false },\r\n outline: { mode: 'none', color: '#000000', corners: false },\r\n export: { size: 'scale', scale: 4, indexed: true, grid: false, gridColor: '#000000' },\r\n});\r\n\r\nconst clamp = (v, lo, hi, d) => {\r\n const n = Number(v);\r\n return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : d;\r\n};\r\nconst oneOf = (v, list, d) => (list.includes(v) ? v : d);\r\nconst bool = (v, d) => (typeof v === 'boolean' ? v : d);\r\n\r\n/** Deep copy of the defaults (palette colours resolved). */\r\nexport function defaultSettings() {\r\n return normalizeSettings({});\r\n}\r\n\r\n/**\r\n * Fill in defaults, clamp ranges, resolve built-in palette colours and drop unknown keys.\r\n * Never throws on bad values; it falls back to the default for that field.\r\n * @param {object} input partial settings\r\n */\r\nexport function normalizeSettings(input = {}) {\r\n const d = DEFAULTS;\r\n const i = input || {};\r\n const s = {}; const size = i.size || {}; const adj = i.adjust || {}; const pal = i.palette || {};\r\n const dit = i.dither || {}; const al = i.alpha || {}; const cl = i.cleanup || {}; const ol = i.outline || {};\r\n const ex = i.export || {};\r\n\r\n s.version = SETTINGS_VERSION;\r\n s.size = {\r\n mode: oneOf(size.mode, ['width', 'block'], d.size.mode),\r\n width: Math.round(clamp(size.width, 1, MAX_SIZE, d.size.width)),\r\n height: Math.round(clamp(size.height, 0, MAX_SIZE, d.size.height)),\r\n block: clamp(size.block, 1, 256, d.size.block),\r\n resample: oneOf(size.resample, ['box', 'nearest'], d.size.resample),\r\n };\r\n s.adjust = {\r\n brightness: clamp(adj.brightness, -1, 1, 0),\r\n contrast: clamp(adj.contrast, -1, 1, 0),\r\n saturation: clamp(adj.saturation, -1, 1, 0),\r\n hue: clamp(adj.hue, -180, 180, 0),\r\n gamma: clamp(adj.gamma, 0.2, 5, 1),\r\n };\r\n const fr = i.frame || {};\r\n s.frame = {\r\n aspect: oneOf(fr.aspect, ASPECTS.map(a => a.id), 'original'),\r\n zoom: clamp(fr.zoom, 1, 8, 1),\r\n x: clamp(fr.x, 0, 1, 0.5),\r\n y: clamp(fr.y, 0, 1, 0.5),\r\n };\r\n\r\n const source = oneOf(pal.source, ['builtin', 'custom', 'extract', 'none'], d.palette.source);\r\n s.palette = {\r\n source,\r\n id: typeof pal.id === 'string' ? pal.id : (source === 'builtin' ? d.palette.id : ''),\r\n name: typeof pal.name === 'string' ? pal.name : '',\r\n colors: [],\r\n count: Math.round(clamp(pal.count, 2, 256, d.palette.count)),\r\n distance: oneOf(pal.distance, ['oklab', 'rgb'], d.palette.distance),\r\n };\r\n if (source === 'builtin') {\r\n const p = getPalette(s.palette.id) || getPalette(d.palette.id);\r\n s.palette.id = p.id; s.palette.name = p.name; s.palette.colors = p.colors.map(c => '#' + c);\r\n } else if (source === 'custom') {\r\n s.palette.colors = (Array.isArray(pal.colors) ? pal.colors : []).filter(isColor).map(normHex).slice(0, 256);\r\n if (!s.palette.colors.length) s.palette.colors = ['#000000', '#ffffff'];\r\n s.palette.name = s.palette.name || 'Custom';\r\n } else if (source === 'extract') {\r\n s.palette.name = `Extracted (${s.palette.count})`;\r\n } else {\r\n s.palette.name = 'None';\r\n }\r\n\r\n const method = DITHER_METHODS.some(m => m.id === dit.method) ? dit.method : d.dither.method;\r\n s.dither = {\r\n method,\r\n strength: clamp(dit.strength, 0, 1, d.dither.strength),\r\n matrix: normalizeMatrix(dit.matrix),\r\n };\r\n s.alpha = { threshold: clamp(al.threshold, 0, 1, d.alpha.threshold) };\r\n s.cleanup = { orphans: bool(cl.orphans, false), smooth: bool(cl.smooth, false) };\r\n s.outline = {\r\n mode: oneOf(ol.mode, ['none', 'outer', 'inner'], 'none'),\r\n color: isColor(ol.color) ? normHex(ol.color) : d.outline.color,\r\n corners: bool(ol.corners, false),\r\n };\r\n s.export = {\r\n size: oneOf(ex.size, ['scale', 'source'], 'scale'),\r\n scale: Math.round(clamp(ex.scale, 1, 64, d.export.scale)),\r\n indexed: bool(ex.indexed, d.export.indexed),\r\n grid: bool(ex.grid, false),\r\n gridColor: isColor(ex.gridColor) ? normHex(ex.gridColor) : d.export.gridColor,\r\n };\r\n return s;\r\n}\r\n\r\n/** A custom threshold matrix: 2D array of numbers. Ranks are derived from the order of the values. */\r\nexport function normalizeMatrix(m) {\r\n if (!Array.isArray(m) || !m.length || !Array.isArray(m[0])) return null;\r\n const h = Math.min(16, m.length), w = Math.min(16, m[0].length);\r\n const out = [];\r\n for (let y = 0; y < h; y++) {\r\n const row = [];\r\n for (let x = 0; x < w; x++) { const v = Number((m[y] || [])[x]); row.push(Number.isFinite(v) ? v : 0); }\r\n out.push(row);\r\n }\r\n return out;\r\n}\r\n\r\n/** Frame aspect ratios. `ratio` is width / height; null keeps the source's. */\r\nexport const ASPECTS = [\r\n { id: 'original', label: 'Original', ratio: null },\r\n { id: '1:1', label: '1:1', ratio: 1 },\r\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\r\n { id: '3:4', label: '3:4', ratio: 3 / 4 },\r\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\r\n { id: '2:3', label: '2:3', ratio: 2 / 3 },\r\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\r\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\r\n];\r\n\r\n/**\r\n * The part of a srcW \u00D7 srcH source that `frame` keeps, in whole source pixels.\r\n * The largest rectangle of the chosen aspect that fits, divided by zoom, placed by x/y (0 = left/top, 1 = right/bottom).\r\n */\r\nexport function cropRect(srcW, srcH, frame = {}) {\r\n const a = (ASPECTS.find(x => x.id === frame.aspect) || ASPECTS[0]).ratio || srcW / srcH;\r\n let w = srcW, h = srcW / a;\r\n if (h > srcH) { h = srcH; w = srcH * a; }\r\n const zoom = Math.max(1, frame.zoom || 1);\r\n w = Math.max(1, Math.min(srcW, Math.round(w / zoom)));\r\n h = Math.max(1, Math.min(srcH, Math.round(h / zoom)));\r\n const fx = frame.x ?? 0.5, fy = frame.y ?? 0.5;\r\n return { x: Math.round((srcW - w) * fx), y: Math.round((srcH - h) * fy), w, h };\r\n}\r\n\r\n/** Output size in pixels for a source of srcW \u00D7 srcH. */\r\nexport function resolveSize(srcW, srcH, size) {\r\n let w, h;\r\n if (size.mode === 'block') {\r\n w = Math.max(1, Math.round(srcW / size.block));\r\n h = Math.max(1, Math.round(srcH / size.block));\r\n } else {\r\n w = size.width;\r\n h = size.height || Math.max(1, Math.round(w * srcH / srcW));\r\n }\r\n return { width: Math.min(MAX_SIZE, w), height: Math.min(MAX_SIZE, h) };\r\n}\r\n\r\n// ---- sharing ---------------------------------------------------------------\r\n\r\nfunction diff(a, b) {\r\n // keys of `a` whose value differs from `b` (one level deep per group)\r\n const out = {};\r\n for (const k of Object.keys(a)) {\r\n if (k === 'version') continue;\r\n const va = a[k], vb = b[k];\r\n if (va && typeof va === 'object' && !Array.isArray(va)) {\r\n const g = {};\r\n for (const kk of Object.keys(va)) if (JSON.stringify(va[kk]) !== JSON.stringify(vb && vb[kk])) g[kk] = va[kk];\r\n if (Object.keys(g).length) out[k] = g;\r\n } else if (JSON.stringify(va) !== JSON.stringify(vb)) out[k] = va;\r\n }\r\n return out;\r\n}\r\n\r\nconst b64url = {\r\n enc(str) {\r\n const bytes = new TextEncoder().encode(str);\r\n let bin = ''; for (const b of bytes) bin += String.fromCharCode(b);\r\n return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\r\n },\r\n dec(s) {\r\n const bin = atob(s.replace(/-/g, '+').replace(/_/g, '/'));\r\n return new TextDecoder().decode(Uint8Array.from(bin, c => c.charCodeAt(0)));\r\n },\r\n};\r\n\r\n/** Settings \u2192 the smallest JSON that rebuilds them (only what differs from the defaults). */\r\nexport function compactSettings(settings) {\r\n const s = normalizeSettings(settings);\r\n const out = diff(s, defaultSettings());\r\n if (out.palette) {\r\n if (s.palette.source !== 'custom') { delete out.palette.colors; delete out.palette.name; } // a built-in id is enough\r\n if (s.palette.source !== 'builtin') delete out.palette.id;\r\n if (s.palette.source !== 'extract') delete out.palette.count;\r\n }\r\n if (out.palette && !Object.keys(out.palette).length) delete out.palette;\r\n return out;\r\n}\r\n\r\n/** Settings \u2192 URL-safe string for `#s=\u2026`. */\r\nexport function encodeSettings(settings) {\r\n return b64url.enc(JSON.stringify({ v: SETTINGS_VERSION, ...compactSettings(settings) }));\r\n}\r\n\r\n/** `#s=\u2026` string (or a whole URL / hash) \u2192 settings. Throws on garbage. */\r\nexport function decodeSettings(str) {\r\n let s = String(str);\r\n const m = /[#&?]s=([A-Za-z0-9_-]+)/.exec(s);\r\n if (m) s = m[1];\r\n const obj = JSON.parse(b64url.dec(s));\r\n delete obj.v;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Settings \u2192 pretty JSON for saving to a file. */\r\nexport function settingsToJSON(settings) {\r\n return JSON.stringify({ $schema: 'image-to-pixel/settings', version: SETTINGS_VERSION, ...compactSettings(settings) }, null, 2);\r\n}\r\n\r\n/** JSON text \u2192 settings. Accepts a full or partial settings object. */\r\nexport function settingsFromJSON(text) {\r\n const obj = typeof text === 'string' ? JSON.parse(text) : text;\r\n delete obj.$schema;\r\n return normalizeSettings(obj);\r\n}\r\n\r\n/** Apply a partial patch on top of settings (one level deep per group). */\r\nexport function mergeSettings(base, patch) {\r\n const out = JSON.parse(JSON.stringify(base));\r\n for (const k of Object.keys(patch || {})) {\r\n if (patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && out[k] && typeof out[k] === 'object') {\r\n Object.assign(out[k], patch[k]);\r\n } else out[k] = patch[k];\r\n }\r\n return normalizeSettings(out);\r\n}\r\n", "// A \"plan\" is everything both backends need, resolved once from settings + source size:\r\n// output size, palette bytes, threshold map, kernel, and the numbers derived from them.\r\n// Building it in one place keeps the CPU and GPU paths in lock-step.\r\n\r\nimport { normalizeSettings, resolveSize, ditherKind, cropRect } from './settings.js';\r\nimport { parseColor, paletteSpread } from './color.js';\r\nimport { thresholdMap } from './dither/matrices.js';\r\nimport { KERNELS, kernelSkew, waveCount } from './dither/kernels.js';\r\nimport { extractPalette } from './palette/extract.js';\r\nimport { resample, adjust } from './cpu/stages.js';\r\n\r\n/**\r\n * @param {object} settings\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA source (only read for palette extraction)\r\n */\r\nexport function makePlan(settings, src) {\r\n const s = normalizeSettings(settings);\r\n const crop = cropRect(src.width, src.height, s.frame);\r\n const { width, height } = resolveSize(crop.w, crop.h, s.size);\r\n\r\n let colors = s.palette.colors;\r\n if (s.palette.source === 'extract') colors = extractFrom(src, s, width, height, crop);\r\n const quantize = s.palette.source !== 'none' && colors.length > 0;\r\n const palette = quantize ? colors.map(parseColor) : [];\r\n\r\n let kind = quantize ? ditherKind(s.dither.method) : 'none';\r\n if (s.dither.strength <= 0) kind = 'none';\r\n\r\n const map = kind === 'ordered' ? thresholdMap(s.dither.method, s.dither.matrix) : null;\r\n const kernel = kind === 'diffusion' ? KERNELS[s.dither.method] : null;\r\n const skew = kernel ? kernelSkew(kernel) : 1;\r\n\r\n return {\r\n settings: s,\r\n srcWidth: src.width, srcHeight: src.height,\r\n crop, // source pixels kept by the frame settings\r\n width, height,\r\n quantize, kind,\r\n palette, // [[r, g, b] bytes]\r\n paletteHex: quantize ? colors.slice() : null,\r\n distance: s.palette.distance === 'rgb' ? 1 : 0,\r\n spread: quantize ? paletteSpread(palette) : 0,\r\n map, kernel, skew,\r\n waves: kernel ? waveCount(width, height, skew) : 0,\r\n outline: { mode: s.outline.mode, color: parseColor(s.outline.color), corners: s.outline.corners },\r\n };\r\n}\r\n\r\nfunction extractFrom(src, s, width, height, crop) {\r\n // extract from what will actually be quantised: the resized + adjusted image (capped for speed)\r\n const k = Math.min(1, 160 / Math.max(width, height));\r\n const w = Math.max(1, Math.round(width * k)), h = Math.max(1, Math.round(height * k));\r\n const prep = resample(src, w, h, 'box', crop);\r\n adjust(prep, s.adjust);\r\n const bytes = new Uint8ClampedArray(prep.length);\r\n for (let i = 0; i < prep.length; i++) bytes[i] = Math.round(prep[i] * 255);\r\n return extractPalette({ data: bytes, width: w, height: h }, s.palette.count, { alphaThreshold: Math.max(0.01, s.alpha.threshold) });\r\n}\r\n", "// Generated by scripts/gen-bluenoise.mjs: 64\u00D764 void-and-cluster blue noise, one byte per cell (0..255).\r\nexport const BLUE_NOISE_SIZE = 64;\r\nexport const BLUE_NOISE_B64 = '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';\r\n", "// Threshold maps for ordered dithering.\r\n// A map is { w, h, levels, values: Uint8Array } and the threshold of a cell is (value + 0.5) / levels.\r\n// The GPU reads the same bytes from a texture, so CPU and GPU agree exactly.\r\n\r\nimport { BLUE_NOISE_B64, BLUE_NOISE_SIZE } from './bluenoise-data.js';\r\n\r\nfunction fromB64(b64) {\r\n if (typeof atob === 'function') return Uint8Array.from(atob(b64), c => c.charCodeAt(0));\r\n return new Uint8Array(Buffer.from(b64, 'base64'));\r\n}\r\n\r\n/** Bayer index matrix of size n (power of two). */\r\nexport function bayer(n) {\r\n let m = [[0]];\r\n for (let s = 1; s < n; s *= 2) {\r\n const next = [];\r\n for (let y = 0; y < s * 2; y++) next.push(new Array(s * 2));\r\n for (let y = 0; y < s; y++) for (let x = 0; x < s; x++) {\r\n const v = 4 * m[y][x];\r\n next[y][x] = v; next[y][x + s] = v + 2; next[y + s][x] = v + 3; next[y + s][x + s] = v + 1;\r\n }\r\n m = next;\r\n }\r\n return m;\r\n}\r\n\r\n/** Turn arbitrary numbers into ranks 0..n-1 (ties keep reading order). */\r\nexport function toRanks(rows) {\r\n const h = rows.length, w = rows[0].length;\r\n const cells = [];\r\n for (let y = 0; y < h; y++) for (let x = 0; x < w; x++) cells.push({ i: y * w + x, v: rows[y][x] });\r\n cells.sort((a, b) => a.v - b.v || a.i - b.i);\r\n const out = new Uint8Array(w * h);\r\n cells.forEach((c, r) => { out[c.i] = r; });\r\n return out;\r\n}\r\n\r\n/** Clustered-dot screen: cells ranked by a dot function, two dots per tile at 45\u00B0. */\r\nfunction clustered(n) {\r\n const rows = [];\r\n for (let y = 0; y < n; y++) {\r\n const row = [];\r\n for (let x = 0; x < n; x++) {\r\n const u = (x + 0.5) / n * 2 * Math.PI, v = (y + 0.5) / n * 2 * Math.PI;\r\n row.push(-(Math.cos(u) + Math.cos(v)) + (x * n + y) * 1e-9);\r\n }\r\n rows.push(row);\r\n }\r\n return rows;\r\n}\r\n\r\nconst CLUSTER4 = [[7, 13, 11, 4], [12, 16, 14, 8], [10, 15, 6, 2], [5, 9, 3, 1]]; // classic editor's matrix\r\nconst cache = new Map();\r\n\r\n/**\r\n * Threshold map for an ordered method id ('bayer4', 'bluenoise', 'custom' \u2026).\r\n * @param {string} method\r\n * @param {number[][]|null} [custom] matrix for 'custom'\r\n */\r\nexport function thresholdMap(method, custom = null) {\r\n if (method === 'custom') {\r\n const m = custom && custom.length ? custom : bayer(4);\r\n return { w: m[0].length, h: m.length, levels: m.length * m[0].length, values: toRanks(m) };\r\n }\r\n if (cache.has(method)) return cache.get(method);\r\n let map;\r\n const sq = rows => ({ w: rows[0].length, h: rows.length, levels: rows.length * rows[0].length, values: toRanks(rows) });\r\n switch (method) {\r\n case 'bayer2': map = sq(bayer(2)); break;\r\n case 'bayer4': map = sq(bayer(4)); break;\r\n case 'bayer8': map = sq(bayer(8)); break;\r\n case 'bayer16': map = sq(bayer(16)); break;\r\n case 'cluster4': map = sq(CLUSTER4); break;\r\n case 'cluster8': map = sq(clustered(8)); break;\r\n case 'lines': map = sq([[0], [2], [1], [3]]); break;\r\n case 'bluenoise': map = { w: BLUE_NOISE_SIZE, h: BLUE_NOISE_SIZE, levels: 256, values: fromB64(BLUE_NOISE_B64) }; break;\r\n default: map = sq(bayer(4));\r\n }\r\n cache.set(method, map);\r\n return map;\r\n}\r\n\r\n/**\r\n * Parse a custom matrix typed by a person: rows on lines, numbers separated by spaces or commas.\r\n * Accepts an optional \"/ 16\" style divisor line, which is ignored (only the order matters).\r\n */\r\nexport function parseMatrix(text) {\r\n const rows = String(text).split(/\\r?\\n|;/).map(l => l.trim()).filter(l => l && !/^\\//.test(l))\r\n .map(l => l.replace(/[[\\]]/g, '').split(/[\\s,]+/).filter(Boolean).map(Number));\r\n if (!rows.length) throw new Error('Matrix is empty');\r\n const w = rows[0].length;\r\n if (rows.some(r => r.length !== w || r.some(v => !Number.isFinite(v)))) throw new Error('Every row needs the same number of values');\r\n if (w > 16 || rows.length > 16) throw new Error('Matrices are limited to 16\u00D716');\r\n return rows;\r\n}\r\n", "// Error-diffusion kernels as push offsets [dx, dy, weight] (weights already divided).\r\n// `skew` is the wavefront slope the GPU needs: pixels with x + skew*y = k only depend on\r\n// earlier waves, so each wave is one draw (see docs/how-it-works.md).\r\n\r\nconst k = (div, list) => list.map(([dx, dy, w]) => [dx, dy, w / div]);\r\n\r\nexport const KERNELS = {\r\n 'floyd-steinberg': k(16, [[1, 0, 7], [-1, 1, 3], [0, 1, 5], [1, 1, 1]]),\r\n 'atkinson': k(8, [[1, 0, 1], [2, 0, 1], [-1, 1, 1], [0, 1, 1], [1, 1, 1], [0, 2, 1]]),\r\n 'sierra-lite': k(4, [[1, 0, 2], [-1, 1, 1], [0, 1, 1]]),\r\n 'sierra': k(32, [[1, 0, 5], [2, 0, 3], [-2, 1, 2], [-1, 1, 4], [0, 1, 5], [1, 1, 4], [2, 1, 2], [-1, 2, 2], [0, 2, 3], [1, 2, 2]]),\r\n 'burkes': k(32, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2]]),\r\n 'jarvis': k(48, [[1, 0, 7], [2, 0, 5], [-2, 1, 3], [-1, 1, 5], [0, 1, 7], [1, 1, 5], [2, 1, 3], [-2, 2, 1], [-1, 2, 3], [0, 2, 5], [1, 2, 3], [2, 2, 1]]),\r\n 'stucki': k(42, [[1, 0, 8], [2, 0, 4], [-2, 1, 2], [-1, 1, 4], [0, 1, 8], [1, 1, 4], [2, 1, 2], [-2, 2, 1], [-1, 2, 2], [0, 2, 4], [1, 2, 2], [2, 2, 1]]),\r\n};\r\n\r\nexport const MAX_KERNEL = 12;\r\n\r\n/** Smallest integer s so that every push offset lands on a later wave x + s*y. */\r\nexport function kernelSkew(kernel) {\r\n let s = 1;\r\n for (const [dx, dy] of kernel) if (dy > 0) s = Math.max(s, Math.floor(-dx / dy) + 1);\r\n return s;\r\n}\r\n\r\n/** Number of waves (GPU draws) for an image of w \u00D7 h. */\r\nexport const waveCount = (w, h, skew) => (w - 1) + skew * (h - 1) + 1;\r\n", "// Palette extraction: median cut on the image's colours, refined by a few k-means passes.\r\n// Deterministic (no randomness), so the same image always gives the same palette.\r\n\r\nimport { toHex } from '../color.js';\r\n\r\n/**\r\n * @param {{ data: ArrayLike<number>, width: number, height: number }} img RGBA bytes\r\n * @param {number} count number of colours (2..256)\r\n * @param {{ maxSamples?: number, alphaThreshold?: number }} [opts]\r\n * @returns {string[]} '#rrggbb' colours sorted dark \u2192 light\r\n */\r\nexport function extractPalette(img, count = 16, opts = {}) {\r\n const { maxSamples = 40000, alphaThreshold = 0.5 } = opts;\r\n const n = img.width * img.height;\r\n const step = Math.max(1, Math.floor(n / maxSamples));\r\n const pts = [];\r\n for (let i = 0; i < n; i += step) {\r\n const o = i * 4;\r\n if (img.data[o + 3] < alphaThreshold * 255) continue;\r\n pts.push([img.data[o], img.data[o + 1], img.data[o + 2]]);\r\n }\r\n if (!pts.length) return ['#000000', '#ffffff'].slice(0, Math.max(1, count));\r\n\r\n // ---- median cut\r\n let boxes = [pts];\r\n while (boxes.length < count) {\r\n let bi = -1, bestRange = -1, bestAxis = 0;\r\n boxes.forEach((b, i) => {\r\n if (b.length < 2) return;\r\n for (let a = 0; a < 3; a++) {\r\n let lo = 255, hi = 0;\r\n for (const p of b) { if (p[a] < lo) lo = p[a]; if (p[a] > hi) hi = p[a]; }\r\n // weight by population so big flat areas get split before tiny noisy ones\r\n const r = (hi - lo) * Math.sqrt(b.length);\r\n if (r > bestRange) { bestRange = r; bi = i; bestAxis = a; }\r\n }\r\n });\r\n if (bi < 0 || bestRange <= 0) break;\r\n const b = boxes[bi].slice().sort((p, q) => p[bestAxis] - q[bestAxis]);\r\n const mid = b.length >> 1;\r\n boxes.splice(bi, 1, b.slice(0, mid), b.slice(mid));\r\n }\r\n let centers = boxes.map(b => mean(b));\r\n\r\n // ---- k-means refinement\r\n for (let iter = 0; iter < 6; iter++) {\r\n const sums = centers.map(() => [0, 0, 0, 0]);\r\n for (const p of pts) {\r\n let best = 0, bd = Infinity;\r\n for (let c = 0; c < centers.length; c++) {\r\n const dr = p[0] - centers[c][0], dg = p[1] - centers[c][1], db = p[2] - centers[c][2];\r\n const d = dr * dr + dg * dg + db * db;\r\n if (d < bd) { bd = d; best = c; }\r\n }\r\n const s = sums[best]; s[0] += p[0]; s[1] += p[1]; s[2] += p[2]; s[3]++;\r\n }\r\n centers = centers.map((c, i) => (sums[i][3] ? [sums[i][0] / sums[i][3], sums[i][1] / sums[i][3], sums[i][2] / sums[i][3]] : c));\r\n }\r\n\r\n const hexes = [...new Set(centers.map(c => toHex(c)))];\r\n const lum = h => { const v = parseInt(h.slice(1), 16); return 0.2126 * (v >> 16) + 0.7152 * ((v >> 8) & 255) + 0.0722 * (v & 255); };\r\n return hexes.sort((a, b) => lum(a) - lum(b));\r\n}\r\n\r\nfunction mean(list) {\r\n let r = 0, g = 0, b = 0;\r\n for (const p of list) { r += p[0]; g += p[1]; b += p[2]; }\r\n return [r / list.length, g / list.length, b / list.length];\r\n}\r\n", "// CPU reference implementation of every pipeline stage.\r\n// The GLSL in gpu/shaders.js mirrors these functions line for line; tests compare the two.\r\n// Working buffers are Float32Array RGBA, rows top-down, values 0..1.\r\n\r\nimport { oklab, LUMA } from '../color.js';\r\n\r\n/**\r\n * Resample to w \u00D7 h. 'box' averages up to 16\u00D716 evenly spaced source texels per output pixel\r\n * (alpha-weighted); 'nearest' takes the centre texel. Integer maths, identical on the GPU.\r\n */\r\nexport function resample(src, w, h, mode = 'box', crop = null) {\r\n const ox = crop ? crop.x : 0, oy = crop ? crop.y : 0;\r\n const sw = crop ? crop.w : src.width, sh = crop ? crop.h : src.height, d = src.data, stride = src.width;\r\n const out = new Float32Array(w * h * 4);\r\n const nx = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sw / w)));\r\n const ny = mode === 'nearest' ? 1 : Math.min(16, Math.max(1, Math.ceil(sh / h)));\r\n const xs = new Int32Array(w * nx), ys = new Int32Array(h * ny);\r\n for (let x = 0; x < w; x++) for (let i = 0; i < nx; i++) xs[x * nx + i] = ox + Math.min(sw - 1, Math.floor(((2 * (x * nx + i) + 1) * sw) / (2 * w * nx)));\r\n for (let y = 0; y < h; y++) for (let j = 0; j < ny; j++) ys[y * ny + j] = oy + Math.min(sh - 1, Math.floor(((2 * (y * ny + j) + 1) * sh) / (2 * h * ny)));\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n let r = 0, g = 0, b = 0, a = 0;\r\n for (let j = 0; j < ny; j++) {\r\n const row = ys[y * ny + j] * stride;\r\n for (let i = 0; i < nx; i++) {\r\n const o = (row + xs[x * nx + i]) * 4;\r\n const al = d[o + 3] / 255;\r\n r += d[o] / 255 * al; g += d[o + 1] / 255 * al; b += d[o + 2] / 255 * al; a += al;\r\n }\r\n }\r\n const o = (y * w + x) * 4;\r\n if (a > 0) { out[o] = r / a; out[o + 1] = g / a; out[o + 2] = b / a; }\r\n out[o + 3] = a / (nx * ny);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Brightness, contrast, saturation, hue, gamma \u2014 in that order, in place. */\r\nexport function adjust(buf, { brightness = 0, contrast = 0, saturation = 0, hue = 0, gamma = 1 }) {\r\n if (!brightness && !contrast && !saturation && !hue && gamma === 1) return buf;\r\n const f = contrast >= 0 ? 1 / (1 - 0.99 * contrast) : 1 + contrast;\r\n const ig = 1 / gamma;\r\n // luminance-preserving hue rotation: the CSS hue-rotate() matrix (rows sum to 1, so greys stay grey)\r\n const hk = Math.cos(hue * Math.PI / 180), hq = Math.sin(hue * Math.PI / 180);\r\n const M = [\r\n 0.213 + 0.787 * hk - 0.213 * hq, 0.715 - 0.715 * hk - 0.715 * hq, 0.072 - 0.072 * hk + 0.928 * hq,\r\n 0.213 - 0.213 * hk + 0.143 * hq, 0.715 + 0.285 * hk + 0.140 * hq, 0.072 - 0.072 * hk - 0.283 * hq,\r\n 0.213 - 0.213 * hk - 0.787 * hq, 0.715 - 0.715 * hk + 0.715 * hq, 0.072 + 0.928 * hk + 0.072 * hq,\r\n ];\r\n for (let o = 0; o < buf.length; o += 4) {\r\n let r = buf[o] + brightness, g = buf[o + 1] + brightness, b = buf[o + 2] + brightness;\r\n r = (r - 0.5) * f + 0.5; g = (g - 0.5) * f + 0.5; b = (b - 0.5) * f + 0.5;\r\n const l = r * LUMA[0] + g * LUMA[1] + b * LUMA[2];\r\n const k = 1 + saturation;\r\n r = l + (r - l) * k; g = l + (g - l) * k; b = l + (b - l) * k;\r\n if (hue) {\r\n const r2 = M[0] * r + M[1] * g + M[2] * b, g2 = M[3] * r + M[4] * g + M[5] * b, b2 = M[6] * r + M[7] * g + M[8] * b;\r\n r = r2; g = g2; b = b2;\r\n }\r\n buf[o] = Math.pow(clamp01(r), ig); buf[o + 1] = Math.pow(clamp01(g), ig); buf[o + 2] = Math.pow(clamp01(b), ig);\r\n }\r\n return buf;\r\n}\r\n\r\n/** Binary alpha: below the threshold becomes fully transparent, the rest fully opaque. */\r\nexport function alphaCut(buf, threshold) {\r\n for (let o = 3; o < buf.length; o += 4) buf[o] = buf[o] >= threshold && buf[o] > 0 ? 1 : 0;\r\n return buf;\r\n}\r\n\r\nexport const clamp01 = v => (v < 0 ? 0 : v > 1 ? 1 : v);\r\n\r\n/** Precompute what nearest() needs for a palette. */\r\nexport function paletteSpace(palette, distance) {\r\n const n = palette.length;\r\n const coords = new Float64Array(n * 3);\r\n const rgb = new Float64Array(n * 3);\r\n palette.forEach((c, i) => {\r\n rgb.set([c[0] / 255, c[1] / 255, c[2] / 255], i * 3);\r\n coords.set(distance === 1 ? [c[0] / 255, c[1] / 255, c[2] / 255] : oklab(c[0] / 255, c[1] / 255, c[2] / 255), i * 3);\r\n });\r\n return { n, coords, rgb, distance };\r\n}\r\n\r\nconst W_RGB = [0.299, 0.587, 0.114];\r\n\r\n/** Index of the nearest palette colour (ties: lowest index). */\r\nexport function nearest(sp, r, g, b) {\r\n let p0, p1, p2, w0 = 1, w1 = 1, w2 = 1;\r\n if (sp.distance === 1) { p0 = r; p1 = g; p2 = b; w0 = W_RGB[0]; w1 = W_RGB[1]; w2 = W_RGB[2]; }\r\n else [p0, p1, p2] = oklab(r, g, b);\r\n let best = 0, bd = Infinity;\r\n const c = sp.coords;\r\n for (let i = 0; i < sp.n; i++) {\r\n const d0 = p0 - c[i * 3], d1 = p1 - c[i * 3 + 1], d2 = p2 - c[i * 3 + 2];\r\n const dist = w0 * d0 * d0 + w1 * d1 * d1 + w2 * d2 * d2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\n\r\n/** No dithering / ordered dithering \u2192 RGBA bytes. */\r\nexport function quantizeOrdered(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = plan.quantize ? paletteSpace(plan.palette, plan.distance) : null;\r\n const map = plan.kind === 'ordered' ? plan.map : null;\r\n const amt = map ? plan.spread * plan.settings.dither.strength : 0;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4;\r\n if (buf[o + 3] < 0.5) continue; // transparent stays 0,0,0,0\r\n let r = buf[o], g = buf[o + 1], b = buf[o + 2];\r\n if (sp) {\r\n if (map) {\r\n const t = (map.values[(y % map.h) * map.w + (x % map.w)] + 0.5) / map.levels - 0.5;\r\n r = clamp01(r + t * amt); g = clamp01(g + t * amt); b = clamp01(b + t * amt);\r\n }\r\n const i = nearest(sp, r, g, b);\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2];\r\n } else {\r\n out[o] = Math.round(r * 255); out[o + 1] = Math.round(g * 255); out[o + 2] = Math.round(b * 255);\r\n }\r\n out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/** Error diffusion (left \u2192 right, top \u2192 bottom) \u2192 RGBA bytes. */\r\nexport function quantizeDiffusion(buf, w, h, plan) {\r\n const out = new Uint8ClampedArray(w * h * 4);\r\n const sp = paletteSpace(plan.palette, plan.distance);\r\n const acc = new Float32Array(w * h * 3);\r\n const strength = plan.settings.dither.strength;\r\n const kernel = plan.kernel;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const p = y * w + x, o = p * 4;\r\n if (buf[o + 3] < 0.5) continue;\r\n const r = clamp01(buf[o] + acc[p * 3] * strength);\r\n const g = clamp01(buf[o + 1] + acc[p * 3 + 1] * strength);\r\n const b = clamp01(buf[o + 2] + acc[p * 3 + 2] * strength);\r\n const i = nearest(sp, r, g, b);\r\n const er = r - sp.rgb[i * 3], eg = g - sp.rgb[i * 3 + 1], eb = b - sp.rgb[i * 3 + 2];\r\n for (const [dx, dy, wt] of kernel) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || xx >= w || yy >= h) continue;\r\n const q = (yy * w + xx) * 3;\r\n acc[q] += er * wt; acc[q + 1] += eg * wt; acc[q + 2] += eb * wt;\r\n }\r\n out[o] = plan.palette[i][0]; out[o + 1] = plan.palette[i][1]; out[o + 2] = plan.palette[i][2]; out[o + 3] = 255;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nconst key = (d, o) => (d[o + 3] === 0 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\nconst N4 = [[0, -1], [1, 0], [0, 1], [-1, 0]];\r\n\r\n/** Replace pixels that share no colour with any 4-neighbour by their most common neighbour. */\r\nexport function removeOrphans(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (const [dx, dy] of N4) {\r\n const xx = x + dx, yy = y + dy;\r\n if (xx < 0 || yy < 0 || xx >= w || yy >= h) continue;\r\n const oo = (yy * w + xx) * 4;\r\n ks.push(key(src, oo)); os.push(oo);\r\n }\r\n if (ks.length < 2 || ks.includes(c)) continue;\r\n let best = 0, bc = 0;\r\n for (let i = 0; i < ks.length; i++) {\r\n let n = 0; for (let j = 0; j < ks.length; j++) if (ks[j] === ks[i]) n++;\r\n if (n > bc) { bc = n; best = i; }\r\n }\r\n px.set(src.subarray(os[best], os[best] + 4), o);\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** 3\u00D73 majority: a colour that fills at least 5 of the 9 cells wins. */\r\nexport function smoothMajority(px, w, h) {\r\n const src = px.slice();\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const o = (y * w + x) * 4, c = key(src, o);\r\n const ks = [], os = [];\r\n for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) {\r\n const xx = Math.min(w - 1, Math.max(0, x + dx)), yy = Math.min(h - 1, Math.max(0, y + dy));\r\n const oo = (yy * w + xx) * 4; ks.push(key(src, oo)); os.push(oo);\r\n }\r\n for (let i = 0; i < 9; i++) {\r\n if (ks[i] === c) continue;\r\n let n = 0; for (let j = 0; j < 9; j++) if (ks[j] === ks[i]) n++;\r\n if (n >= 5) { px.set(src.subarray(os[i], os[i] + 4), o); break; }\r\n }\r\n }\r\n }\r\n return px;\r\n}\r\n\r\n/** Outline around (outer) or inside (inner) the opaque shape. */\r\nexport function outline(px, w, h, { mode, color, corners }) {\r\n if (mode === 'none') return px;\r\n const src = px.slice();\r\n const opaque = (x, y) => x >= 0 && y >= 0 && x < w && y < h && src[(y * w + x) * 4 + 3] > 0;\r\n const inside = (x, y) => x >= 0 && y >= 0 && x < w && y < h;\r\n const nb = corners ? [[0, -1], [1, 0], [0, 1], [-1, 0], [-1, -1], [1, -1], [1, 1], [-1, 1]] : N4;\r\n for (let y = 0; y < h; y++) {\r\n for (let x = 0; x < w; x++) {\r\n const me = opaque(x, y);\r\n let hit = false;\r\n for (const [dx, dy] of nb) {\r\n const xx = x + dx, yy = y + dy;\r\n if (!inside(xx, yy)) continue;\r\n if (mode === 'outer' ? (!me && opaque(xx, yy)) : (me && !opaque(xx, yy))) { hit = true; break; }\r\n }\r\n if (hit) { const o = (y * w + x) * 4; px[o] = color[0]; px[o + 1] = color[1]; px[o + 2] = color[2]; px[o + 3] = 255; }\r\n }\r\n }\r\n return px;\r\n}\r\n", "// The whole pipeline on the CPU. Used when WebGL 2 is unavailable, in Node, and as the\r\n// reference the GPU output is tested against.\r\n\r\nimport { resample, adjust, alphaCut, quantizeOrdered, quantizeDiffusion, removeOrphans, smoothMajority, outline } from './stages.js';\r\n\r\n/**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} src RGBA bytes, rows top-down\r\n * @returns {Uint8ClampedArray} RGBA bytes, plan.width \u00D7 plan.height\r\n */\r\nexport function runCPU(plan, src) {\r\n const { width: w, height: h, settings: s } = plan;\r\n const buf = resample(src, w, h, s.size.resample, plan.crop);\r\n adjust(buf, s.adjust);\r\n alphaCut(buf, s.alpha.threshold);\r\n const px = plan.kind === 'diffusion' ? quantizeDiffusion(buf, w, h, plan) : quantizeOrdered(buf, w, h, plan);\r\n if (s.cleanup.orphans) removeOrphans(px, w, h);\r\n if (s.cleanup.smooth) smoothMajority(px, w, h);\r\n outline(px, w, h, plan.outline);\r\n return px;\r\n}\r\n", "/* global __VERSION__ */\n// __VERSION__ is injected by esbuild (see esbuild.config.mjs); falls back when running src/ directly.\nexport const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '2.0.0-dev';\nexport const MAX_CHANNELS = 4;\nexport const DEFAULT_CANVAS_ID = 'glcanvas';\n", "export class ShaderMateError extends Error {\n constructor(message, details) {\n super(message);\n this.name = 'ShaderMateError';\n if (details) Object.assign(this, details);\n }\n}\n\nconst warned = new Set();\n/** console.warn once per key. */\nexport function warnOnce(key, ...args) {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn('[ShaderMate]', ...args);\n}\n\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nexport const isArrayLike = v => Array.isArray(v) || (ArrayBuffer.isView(v) && !(v instanceof DataView));\nexport const toArray = v => (v == null ? [] : Array.isArray(v) ? v : [v]);\nexport const isPow2 = n => n > 0 && (n & (n - 1)) === 0;\nexport const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));\n\n/** `glsl` tagged template: no-op, but lets editors syntax-highlight inline shaders. */\nexport const glsl = (strings, ...values) => String.raw({ raw: strings }, ...values);\n\n/** Parse a CSS color ('#f80', 'rgb(\u2026)', 'red') or [r,g,b,a] into [r,g,b,a] 0..1. */\nexport function parseColor(c) {\n if (c == null) return null;\n if (Array.isArray(c)) return [c[0] ?? 0, c[1] ?? 0, c[2] ?? 0, c[3] ?? 1];\n if (typeof c === 'string' && isBrowser) {\n const cv = document.createElement('canvas');\n cv.width = cv.height = 1;\n const x = cv.getContext('2d');\n x.fillStyle = c;\n x.fillRect(0, 0, 1, 1);\n const d = x.getImageData(0, 0, 1, 1).data;\n return [d[0] / 255, d[1] / 255, d[2] / 255, d[3] / 255];\n }\n return null;\n}\n\n/** True when running on localhost / file: \u2014 used for dev-only defaults. */\nexport function isDevHost() {\n if (!isBrowser) return false;\n const h = location.hostname;\n return location.protocol === 'file:' || h === 'localhost' || h === '127.0.0.1' || h === '' || h.endsWith('.local');\n}\n", "/** Reference-counted store for GL objects so shared resources are freed exactly once. */\nexport class RefPool {\n constructor(gl) {\n this.gl = gl;\n this._items = new Map(); // id -> { obj, count, type }\n this._nextId = 1;\n }\n\n add(obj, type) {\n const id = this._nextId++;\n this._items.set(id, { obj, count: 1, type });\n return id;\n }\n\n ref(id) {\n const it = this._items.get(id);\n if (it) it.count++;\n return id;\n }\n\n /** Returns the raw GL object for an id (or null). */\n get(id) {\n const it = this._items.get(id);\n return it ? it.obj : null;\n }\n\n unref(id) {\n const it = this._items.get(id);\n if (!it) return;\n it.count--;\n if (it.count <= 0) this._destroy(id, it);\n }\n\n _destroy(id, it) {\n const { obj, type } = it;\n const gl = this.gl;\n switch (type) {\n case 'texture2D':\n case 'textureCube': gl.deleteTexture(obj); break;\n case 'fbo': gl.deleteFramebuffer(obj); break;\n case 'buffer': gl.deleteBuffer(obj); break;\n case 'program': gl.deleteProgram(obj); break;\n }\n this._items.delete(id);\n }\n\n /** Destroy everything regardless of refcount. */\n dispose() {\n for (const [id, it] of [...this._items]) this._destroy(id, it);\n }\n}\n", "/**\n * Tiny event emitter. `forward(ev, data)` (optional) receives every emitted event,\n * which is how instances feed the global ShaderMate.on() bus.\n */\nexport function createEmitter(forward) {\n const map = new Map();\n\n function on(ev, fn) {\n if (!map.has(ev)) map.set(ev, new Set());\n map.get(ev).add(fn);\n return () => off(ev, fn);\n }\n function off(ev, fn) {\n const s = map.get(ev);\n if (s) s.delete(fn);\n }\n function once(ev, fn) {\n const wrapped = data => { off(ev, wrapped); fn(data); };\n return on(ev, wrapped);\n }\n function emit(ev, data) {\n const s = map.get(ev);\n if (s) {\n for (const fn of [...s]) {\n try { fn(data); } catch (e) { console.error(`[ShaderMate] error in \"${ev}\" listener`, e); }\n }\n }\n if (forward) forward(ev, data);\n }\n function clear() { map.clear(); }\n\n return { on, off, once, emit, clear };\n}\n", "// Tiny tween engine for uniforms: sm.tween('u_hover', 1, { duration: 400, ease: 'outCubic' })\n\nexport const EASES = {\n linear: t => t,\n inQuad: t => t * t,\n outQuad: t => t * (2 - t),\n inOutQuad: t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n inCubic: t => t * t * t,\n outCubic: t => 1 - Math.pow(1 - t, 3),\n inOutCubic: t => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2),\n outExpo: t => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n outBack: t => 1 + 2.70158 * Math.pow(t - 1, 3) + 1.70158 * Math.pow(t - 1, 2),\n outElastic: t => (t === 0 || t === 1 ? t : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI) / 3) + 1),\n};\n\nexport function createTweens() {\n const active = new Map(); // key -> tween\n\n /**\n * getter/setter work on the live uniform value. Resolves when finished (false if interrupted).\n */\n function tween(key, get, set, to, opts = {}) {\n const { duration = 500, delay = 0 } = opts;\n const ease = typeof opts.ease === 'function' ? opts.ease : (EASES[opts.ease] || EASES.outCubic);\n const prev = active.get(key);\n if (prev) prev.resolve(false);\n\n const from = get();\n const isArr = Array.isArray(to) || ArrayBuffer.isView(to);\n const f = isArr ? Array.from(from ?? to) : Number(from ?? 0);\n const t = isArr ? Array.from(to) : Number(to);\n\n return new Promise(resolve => {\n const tw = {\n start: performance.now() + delay,\n resolve: v => { active.delete(key); resolve(v); },\n update(now) {\n const p = duration > 0 ? clamp01((now - this.start) / duration) : 1;\n if (p < 0) return;\n const e = ease(p);\n set(isArr ? f.map((a, i) => a + (t[i] - a) * e) : f + (t - f) * e);\n if (p >= 1) this.resolve(true);\n }\n };\n active.set(key, tw);\n });\n }\n\n function update(now) {\n for (const tw of [...active.values()]) tw.update(now);\n }\n\n function cancel(key) {\n if (key === undefined) { for (const tw of [...active.values()]) tw.resolve(false); return; }\n const tw = active.get(key);\n if (tw) tw.resolve(false);\n }\n\n return { tween, update, cancel, get size() { return active.size; } };\n}\n\nconst clamp01 = v => (v < 0 ? v : v > 1 ? 1 : v);\n", "import { MAX_CHANNELS } from '../constants.js';\nimport { ShaderMateError } from '../utils/util.js';\n\n/**\n * Normalize everything the user may pass as \"the shaders\" into an array of pass configs.\n *\n * 'frag.glsl' | '...glsl source...' -> one screen pass\n * { shader|src, ... } -> one pass\n * [ 'a.glsl', { name, shader, ... }, ... ] -> multipass (last one hits the screen unless `screen` is set)\n *\n * Caller objects are shallow-cloned; `uniforms` is kept by reference so live mutation works.\n */\nexport function normalizePasses(input) {\n let list;\n if (typeof input === 'string') list = [{ src: input }];\n else if (Array.isArray(input)) list = input.map(p => (typeof p === 'string' ? { src: p } : { ...p }));\n else if (input && typeof input === 'object') list = [{ ...input }];\n else throw new ShaderMateError('ShaderMate: expected a shader (string), a pass object, or an array of passes');\n if (!list.length) throw new ShaderMateError('ShaderMate: no passes given');\n\n list.forEach((p, i) => {\n if (p.src == null) p.src = p.shader ?? p.frag ?? p.fragment ?? p.glsl ?? p.url;\n if (p.src == null) throw new ShaderMateError(`Pass ${p.name ?? i} has no shader source (use \"shader\")`);\n if (p.name == null) p.name = list.length === 1 ? 'main' : 'pass' + i;\n if (p.uniforms == null) p.uniforms = {};\n });\n\n if (!list.some(p => p.screen)) list[list.length - 1].screen = true;\n if (list.filter(p => p.screen).length > 1) console.warn('[ShaderMate] Multiple screen:true passes; last drawn wins.');\n\n const names = list.map(p => p.name);\n const dupes = names.filter((n, i) => names.indexOf(n) !== i);\n if (dupes.length) throw new ShaderMateError('Duplicate pass names: ' + [...new Set(dupes)].join(', '));\n\n for (const p of list) {\n const chans = Array.isArray(p.channels) ? p.channels : (p.channels ? [p.channels] : []);\n p.channels = chans.slice(0, MAX_CHANNELS).map(c => normalizeChannel(c, names, p.name));\n while (p.channels.length < MAX_CHANNELS) p.channels.push(null);\n }\n return list;\n}\n\nconst isEl = v => typeof HTMLElement !== 'undefined' && v instanceof HTMLElement;\nconst isBitmap = v => typeof ImageBitmap !== 'undefined' && v instanceof ImageBitmap;\nconst isTex = v => typeof WebGLTexture !== 'undefined' && v instanceof WebGLTexture;\n\n/**\n * Channel shorthand:\n * 'BufferA' -> that pass's output (if a pass has that name), else an image URL\n * { pass:'A' } / { id:'A' } -> pass output (buffer: 'prev' | 'current' for ping-pong passes)\n * { url|image }, { video }, { audio|audioFFT }, { mic:true }, { camera:true }, { cubemap:[6 urls] }\n * { element } or a raw <canvas>/<video>/<img>/ImageBitmap\n * { texture: WebGLTexture, width, height, cube? }\n * common params: wrap, filter, flipY, mipmap\n */\nexport function normalizeChannel(ch, passNames = [], ownerName = '') {\n if (ch == null || ch === false) return null;\n if (typeof ch === 'string') return passNames.includes(ch) ? { pass: ch } : { url: ch };\n if (isEl(ch) || isBitmap(ch)) return { element: ch };\n if (isTex(ch)) return { texture: ch };\n const out = { ...ch };\n if (out.pass == null && out.id != null) out.pass = out.id;\n if (out.url == null && out.image != null) out.url = out.image;\n if (out.element == null && out.canvas != null) out.element = out.canvas;\n if (out.pass == null && out.src != null && out.url == null && out.video == null) out.url = out.src;\n if (out.pass != null && !passNames.includes(out.pass)) {\n console.warn(`[ShaderMate] Pass \"${ownerName}\": channel references unknown pass \"${out.pass}\"`);\n }\n return out;\n}\n\n/** True if `src` is GLSL text rather than a URL/path. */\nexport function isInlineSource(src) {\n return /[\\r\\n]/.test(src) || /^\\s*(void|#|precision|uniform|in |out |\\/\\/|\\/\\*)/.test(src) || /[{};]/.test(src);\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\nexport const isWebGL2 = gl =>\n typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n\n/**\n * options.webgl: 'auto' (default) | 2 | 1\n * options.alpha / premultipliedAlpha / preserveDrawingBuffer / antialias, plus options.contextAttributes.\n */\nexport function createContext(canvas, options = {}) {\n const attrs = Object.assign({\n alpha: options.alpha !== false,\n premultipliedAlpha: options.premultipliedAlpha !== false,\n preserveDrawingBuffer: !!options.preserveDrawingBuffer,\n antialias: !!options.antialias,\n powerPreference: options.powerPreference || 'default',\n }, options.contextAttributes);\n\n const want = options.webgl === undefined ? 'auto' : String(options.webgl);\n let gl = null;\n if (want === 'auto' || want === '2') gl = canvas.getContext('webgl2', attrs);\n if (!gl && (want === 'auto' || want === '1')) {\n gl = canvas.getContext('webgl', attrs) || canvas.getContext('experimental-webgl', attrs);\n }\n if (!gl) throw new ShaderMateError('WebGL not supported');\n return gl;\n}\n\nexport function getExtensions(gl, isGL2) {\n const ext = {};\n if (!isGL2) {\n ext.OES_texture_float = gl.getExtension('OES_texture_float');\n ext.OES_texture_half_float = gl.getExtension('OES_texture_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n ext.OES_texture_half_float_linear = gl.getExtension('OES_texture_half_float_linear');\n ext.OES_standard_derivatives = gl.getExtension('OES_standard_derivatives');\n ext.WEBGL_color_buffer_float = gl.getExtension('WEBGL_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.WEBGL_depth_texture = gl.getExtension('WEBGL_depth_texture');\n ext.EXT_shader_texture_lod = gl.getExtension('EXT_shader_texture_lod');\n } else {\n ext.EXT_color_buffer_float = gl.getExtension('EXT_color_buffer_float');\n ext.EXT_color_buffer_half_float = gl.getExtension('EXT_color_buffer_half_float');\n ext.OES_texture_float_linear = gl.getExtension('OES_texture_float_linear');\n }\n return ext;\n}\n", "/** Full-screen two-triangle quad. One per instance (GL buffers can't be shared across contexts). */\nexport function createQuad(gl) {\n const buf = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([\n -1, -1, 1, -1, -1, 1,\n -1, 1, 1, -1, 1, 1\n ]), gl.STATIC_DRAW);\n\n return {\n /** Bind the quad to `program`'s a_position attribute (call right before drawing). */\n bind(program) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buf);\n const loc = gl.getAttribLocation(program, 'a_position');\n if (loc !== -1) {\n gl.enableVertexAttribArray(loc);\n gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);\n }\n },\n draw() { gl.drawArrays(gl.TRIANGLES, 0, 6); },\n dispose() { gl.deleteBuffer(buf); }\n };\n}\n", "import { ShaderMateError } from '../utils/util.js';\n\n/**\n * Parse a driver info log into [{ line, message }], with `line` relative to the user's\n * source (the injected `#line 1`), so errors point at the file the author wrote.\n */\nexport function parseShaderLog(log, src) {\n const lines = src.split('\\n');\n const userStart = lines.findIndex(l => /^\\s*#line\\s+1\\b/.test(l)) + 1;\n const errors = [];\n for (const row of log.split('\\n')) {\n const m = /ERROR:\\s*\\d+:(\\d+):\\s*(.*)/.exec(row);\n if (!m) continue;\n const logical = parseInt(m[1], 10);\n const physical = userStart > 0 ? userStart + logical - 1 : logical - 1; // 0-based index into `lines`\n errors.push({ line: logical, message: m[2].trim(), source: lines[physical] ?? '', physical });\n }\n return errors;\n}\n\n/**\n * Compile one shader. Returns { shader } or { error: ShaderMateError }.\n */\nexport function compileShader(gl, type, src, { label = '', showExpandedOnError = true } = {}) {\n const sh = gl.createShader(type);\n gl.shaderSource(sh, src);\n gl.compileShader(sh);\n if (gl.getShaderParameter(sh, gl.COMPILE_STATUS)) return { shader: sh };\n\n const log = gl.getShaderInfoLog(sh) || '';\n gl.deleteShader(sh);\n const errors = parseShaderLog(log, src);\n const stage = type === gl.VERTEX_SHADER ? 'Vertex' : 'Fragment';\n const summary = errors.length\n ? errors.map(e => `line ${e.line}: ${e.message}`).join('\\n')\n : log.trim();\n const err = new ShaderMateError(`${stage} shader compile error${label ? ` in pass \"${label}\"` : ''}:\\n${summary}`,\n { pass: label, stage, log, errors, source: src });\n\n if (showExpandedOnError) {\n const marks = new Set(errors.map(e => e.physical));\n const numbered = src.split('\\n').map((line, i) =>\n `${marks.has(i) ? '>>>' : ' '} ${String(i + 1).padStart(4, ' ')} | ${line}`).join('\\n');\n console.error('[ShaderMate] ' + err.message, { COMPILED: '\\n' + numbered });\n } else {\n console.error('[ShaderMate] ' + err.message);\n }\n return { error: err };\n}\n\n/** Link a program. Returns { program } or { error }. */\nexport function createProgram(gl, vsrc, fsrc, opts) {\n const v = compileShader(gl, gl.VERTEX_SHADER, vsrc, opts);\n if (v.error) return v;\n const f = compileShader(gl, gl.FRAGMENT_SHADER, fsrc, opts);\n if (f.error) { gl.deleteShader(v.shader); return f; }\n\n const p = gl.createProgram();\n gl.attachShader(p, v.shader);\n gl.attachShader(p, f.shader);\n gl.linkProgram(p);\n gl.deleteShader(v.shader);\n gl.deleteShader(f.shader);\n\n if (!gl.getProgramParameter(p, gl.LINK_STATUS)) {\n const log = gl.getProgramInfoLog(p) || '';\n gl.deleteProgram(p);\n const err = new ShaderMateError(`Program link error${opts && opts.label ? ` in pass \"${opts.label}\"` : ''}: ${log}`, { pass: opts && opts.label, log });\n console.error('[ShaderMate] ' + err.message);\n return { error: err };\n }\n return { program: p };\n}\n\n/** name -> { loc, type, size } for every active uniform (array names have `[0]` stripped). */\nexport function getUniformInfo(gl, program) {\n const n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n const out = {};\n for (let i = 0; i < n; i++) {\n const info = gl.getActiveUniform(program, i);\n if (!info) continue;\n out[info.name.replace(/\\[0\\]$/, '')] = {\n loc: gl.getUniformLocation(program, info.name),\n type: info.type,\n size: info.size\n };\n }\n return out;\n}\n", "export const VERT_GL2 = `#version 300 es\nlayout(location=0) in vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\nexport const VERT_GL1 = `attribute vec2 a_position;\nvoid main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\n/** Texture-sampling compatibility macros so the same source compiles as GLSL ES 1.00 and 3.00. */\nexport const BUILTIN_MACROS_GL2 = `#define texture2D(s,u) texture(s,u)\n#define textureCube(s,u) texture(s,u)\n#define TEX(s,u) texture(s,u)\n#define TEX_LOD(s,u,l) textureLod(s,u,l)\n`;\n\nexport const BUILTIN_MACROS_GL1 = `#define texture(s,u) texture2D(s,u)\n#define TEX(s,u) texture2D(s,u)\n#define TEX_LOD(s,u,l) texture2D(s,u)\n`;\n\nexport const MAIN_WRAP_GL2 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n outColor = c;\n}`;\n\nexport const MAIN_WRAP_GL1 = `\n#line 100000\nvoid main(){\n vec4 c = vec4(0.0);\n mainImage(c, gl_FragCoord.xy);\n gl_FragColor = c;\n}`;\n", "import { createProgram } from './shader.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\n\nconst FRAG_GL2 = `#version 300 es\nprecision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;\nvoid main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`;\nconst FRAG_GL1 = `precision highp float;\nuniform sampler2D u_tex; uniform vec2 u_size;\nvoid main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;\n\n/** Copies a texture to the default framebuffer (used when the screen pass also needs a readable backbuffer). */\nexport function createBlit(gl, isGL2, quad) {\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, isGL2 ? FRAG_GL2 : FRAG_GL1, { label: 'blit' });\n if (r.error) throw r.error;\n const program = r.program;\n const uTex = gl.getUniformLocation(program, 'u_tex');\n const uSize = gl.getUniformLocation(program, 'u_size');\n return {\n draw(tex, w, h) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.viewport(0, 0, w, h);\n gl.useProgram(program);\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.uniform1i(uTex, 0);\n gl.uniform2f(uSize, w, h);\n quad.bind(program);\n quad.draw();\n },\n dispose() { gl.deleteProgram(program); }\n };\n}\n", "/** 'clamp' (default) | 'repeat' | 'mirror' */\nexport function wrapMode(gl, wrap) {\n if (wrap === 'repeat') return gl.REPEAT;\n if (wrap === 'mirror' || wrap === 'mirrored') return gl.MIRRORED_REPEAT;\n return gl.CLAMP_TO_EDGE;\n}\n\n/** 'linear' (default) | 'nearest' */\nexport function filterMode(gl, filter) {\n return filter === 'nearest' ? gl.NEAREST : gl.LINEAR;\n}\n", "import { wrapMode, filterMode } from './params.js';\nimport { warnOnce } from '../utils/util.js';\n\nfunction chooseFormat(gl, isGL2, ext, opts) {\n let ifmt = isGL2 ? gl.RGBA8 : gl.RGBA;\n const fmt = gl.RGBA;\n let type = gl.UNSIGNED_BYTE;\n\n if (opts.float === 'full' || opts.float === 32) {\n if (isGL2) { ifmt = gl.RGBA32F; type = gl.FLOAT; }\n else if (ext.OES_texture_float) type = gl.FLOAT;\n } else if (opts.float) {\n if (isGL2) { ifmt = gl.RGBA16F; type = gl.HALF_FLOAT; }\n else if (ext.OES_texture_half_float) type = ext.OES_texture_half_float.HALF_FLOAT_OES;\n else if (ext.OES_texture_float) type = gl.FLOAT;\n }\n return { ifmt, fmt, type };\n}\n\nfunction isRenderable(gl, ifmt, fmt, type) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texImage2D(gl.TEXTURE_2D, 0, ifmt, 4, 4, 0, fmt, type, null);\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n const ok = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.deleteFramebuffer(fbo);\n gl.deleteTexture(tex);\n return ok;\n}\n\n/** Create a colour (+ optional depth) render target. Falls back to 8-bit if float isn't renderable. */\nexport function createTarget(gl, pool, w, h, opts, isGL2, ext) {\n const wanted = chooseFormat(gl, isGL2, ext, opts);\n let chosen = wanted;\n if (!isRenderable(gl, wanted.ifmt, wanted.fmt, wanted.type)) {\n warnOnce('fmt-fallback', 'Requested float format not renderable on this device; falling back to 8-bit.');\n chosen = { ifmt: isGL2 ? gl.RGBA8 : gl.RGBA, fmt: gl.RGBA, type: gl.UNSIGNED_BYTE };\n }\n // Linear filtering of float textures needs an extension; silently use nearest when unavailable.\n let filterOpt = opts.filter;\n if (chosen.type !== gl.UNSIGNED_BYTE && filterOpt !== 'nearest') {\n const linearOK = isGL2\n ? (chosen.type === gl.HALF_FLOAT || ext.OES_texture_float_linear)\n : (chosen.type === gl.FLOAT ? ext.OES_texture_float_linear : ext.OES_texture_half_float_linear);\n if (!linearOK) filterOpt = 'nearest';\n }\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n const wrap = wrapMode(gl, opts.wrap);\n const filter = filterMode(gl, filterOpt);\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, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n gl.texImage2D(gl.TEXTURE_2D, 0, chosen.ifmt, w, h, 0, chosen.fmt, chosen.type, null);\n\n let depthTex = null;\n if (opts.depth) {\n if (!isGL2 && !ext.WEBGL_depth_texture) {\n warnOnce('depth-tex', 'depth: true needs WebGL2 or WEBGL_depth_texture; ignoring.');\n } else {\n depthTex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, depthTex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\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 gl.texImage2D(gl.TEXTURE_2D, 0, isGL2 ? gl.DEPTH_COMPONENT16 : gl.DEPTH_COMPONENT,\n w, h, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);\n }\n }\n\n const fbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);\n if (depthTex) gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTex, 0);\n const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n if (status !== gl.FRAMEBUFFER_COMPLETE) console.warn('[ShaderMate] Framebuffer incomplete:', status);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n depthId: depthTex ? pool.add(depthTex, 'texture2D') : null,\n fboId: pool.add(fbo, 'fbo'),\n width: w,\n height: h,\n fmt: chosen\n };\n}\n\nexport function deleteTarget(pool, t) {\n if (!t) return;\n pool.unref(t.texId);\n if (t.depthId) pool.unref(t.depthId);\n pool.unref(t.fboId);\n}\n\n/** Resolve a pass `size` option against the canvas size. */\nexport function resolvePassSize(size, cw, ch) {\n const c = n => Math.max(1, Math.round(n));\n if (size == null || size === 'screen' || size === 'canvas') return [cw, ch];\n if (size === 'half') return [c(cw / 2), c(ch / 2)];\n if (size === 'quarter') return [c(cw / 4), c(ch / 4)];\n if (typeof size === 'number') return [c(cw * size), c(ch * size)]; // scale factor\n if (Array.isArray(size)) return [c(size[0]), c(size[1])];\n if (typeof size === 'object' && size.width && size.height) return [c(size.width), c(size.height)];\n return [cw, ch];\n}\n", "// Built-in uniforms. They are declared automatically when a shader uses them\n// (and not already declared), and uploaded every frame when present in the program.\n//\n// ShaderToy names short names\n// vec3 iResolution vec2 u_resolution\n// float iTime float u_time\n// float iTimeDelta float u_delta\n// int iFrame int u_frame\n// float iFrameRate float u_fps\n// vec4 iMouse (x,y, click.x,click.y) vec2 u_mouse pixels, bottom-left origin\n// vec2 u_mouseUV 0..1\n// float u_mouseDown 0/1\n// vec4 iDate vec4 u_date\n// vec2 iScroll vec2 u_scroll page scroll in px\n// float u_pixelRatio\n// float u_aspect width / height\n// float iChannelTime[4]\n// vec3 iChannelResolution[4]\n// samplerX iChannel0..3\n\nexport const BUILTIN_UNIFORMS = {\n iResolution: 'vec3', iTime: 'float', iTimeDelta: 'float', iFrame: 'int', iFrameRate: 'float',\n iMouse: 'vec4', iDate: 'vec4', iScroll: 'vec2', iSampleRate: 'float',\n iChannelTime: 'float[4]', iChannelResolution: 'vec3[4]',\n u_resolution: 'vec2', u_time: 'float', u_delta: 'float', u_frame: 'int', u_fps: 'float',\n u_mouse: 'vec2', u_mouseUV: 'vec2', u_mouseDown: 'float', u_date: 'vec4', u_scroll: 'vec2',\n u_pixelRatio: 'float', u_aspect: 'float',\n // FragCoord.xyz-style names (declare `uniform vec4 u_mouse;` / `uniform float u_scroll;` yourself to get those shapes)\n u_time_delta: 'float', u_refresh_rate: 'float', u_drag: 'vec2', u_wheel: 'float',\n};\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/** ShaderToy legacy aliases. */\nexport const BUILTIN_DEFINES = '#define iGlobalTime iTime\\n';\n\n/** `out vec4 fragColor` (FragCoord.xyz / GLSL 3 style) when a shader writes to fragColor from its own main(). */\nexport function declareFragColor(src, isGL2) {\n const code = stripComments(src);\n if (!/\\bfragColor\\b/.test(code) || !/\\bvoid\\s+main\\s*\\(/.test(code)) return '';\n if (/\\bout\\s+vec4\\s+fragColor\\b/.test(code) || /#define\\s+fragColor\\b/.test(code)) return '';\n return isGL2 ? 'out vec4 fragColor;\\n' : '#define fragColor gl_FragColor\\n';\n}\n\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n */\n/** FragCoord.xyz-only built-ins (declared when used in a FragCoord-style shader or when dialect: 'fragcoord'). */\nexport const FRAGCOORD_UNIFORMS = {\n u_camera_pos: 'vec3', u_camera_dir: 'vec3', u_camera_view: 'mat4',\n u_recursion: 'int', u_max_recursion: 'int', u_color_gamut: 'int',\n};\n/** Sampler built-ins bound by name (see core/samplers.js). */\nexport const SAMPLER_BUILTINS = ['u_audio', 'u_keyboard', 'u_webcam', 'u_main'];\n\n/**\n * Heuristic: a FragCoord.xyz sketch writes `fragColor` from its own `main()` and never uses mainImage.\n */\nexport function looksLikeFragCoord(src) {\n const code = stripComments(src);\n return /\\bfragColor\\b/.test(code) && /\\bvoid\\s+main\\s*\\(/.test(code) && !/\\bmainImage\\s*\\(/.test(code);\n}\n\n/**\n * Return GLSL declaring every built-in the source uses but doesn't declare itself.\n * channelTypes: ['2D' | 'cube' | null] x4 picks sampler2D / samplerCube for iChannelN.\n * opts.mouseVec4 / opts.scrollFloat switch u_mouse / u_scroll to the FragCoord.xyz shapes.\n * opts.samplerNames: extra sampler2D names to declare when used (pass samplers like u_pass1, u_blur).\n * opts.passCount: size for `u_passes[N]`.\n */\nexport function declareBuiltins(src, channelTypes = [], opts = {}) {\n const code = stripComments(src);\n let out = '';\n const declared = name => new RegExp('uniform\\\\s+(?:\\\\w+\\\\s+)*' + name + '\\\\b').test(code);\n const used = name => new RegExp('\\\\b' + name + '\\\\b').test(code);\n const types = Object.assign({}, BUILTIN_UNIFORMS, opts.fragcoord ? FRAGCOORD_UNIFORMS : null);\n if (opts.mouseVec4) types.u_mouse = 'vec4';\n if (opts.scrollFloat) types.u_scroll = 'float';\n\n for (const name in types) {\n if (!used(name) || declared(name)) continue;\n const t = types[name];\n const m = /^(\\w+)\\[(\\d+)\\]$/.exec(t);\n out += m ? `uniform ${m[1]} ${name}[${m[2]}];\\n` : `uniform ${t} ${name};\\n`;\n }\n for (let i = 0; i < 4; i++) {\n const name = 'iChannel' + i;\n if (!used(name) || declared(name)) continue;\n out += `uniform ${channelTypes[i] === 'cube' ? 'samplerCube' : 'sampler2D'} ${name};\\n`;\n }\n for (const name of new Set([...SAMPLER_BUILTINS, ...(opts.samplerNames || [])])) {\n if (used(name) && !declared(name)) out += `uniform sampler2D ${name};\\n`;\n }\n if (opts.passCount > 0 && /\\bu_passes\\b/.test(code) && !declared('u_passes')) out += `uniform sampler2D u_passes[${opts.passCount}];\\n`;\n return out;\n}\n", "import { BUILTIN_MACROS_GL1, BUILTIN_MACROS_GL2, MAIN_WRAP_GL1, MAIN_WRAP_GL2 } from './templates.js';\nimport { BUILTIN_DEFINES, declareBuiltins, declareFragColor } from './builtins.js';\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Expand `#include \"path\"` / `#include <path>` recursively.\n * Each file is included once (acts like an include guard); real cycles are reported.\n * `loader(path)` returns (a promise of) the file text.\n */\nexport async function resolveIncludes(src, { loader, throwOnError = false, warn = console.warn } = {}) {\n const done = new Set();\n const stack = [];\n\n async function expand(code) {\n const re = /^[ \\t]*#include\\s+[\"<]([^\">]+)[\">]/gm;\n let out = '';\n let last = 0;\n let m;\n while ((m = re.exec(code))) {\n const path = m[1];\n out += code.slice(last, m.index);\n last = re.lastIndex;\n\n if (stack.includes(path)) {\n warn('[ShaderMate] Circular include:', path);\n out += `\\n// skipped include \"${path}\" (circular)\\n`;\n } else if (done.has(path)) {\n out += `\\n// skipped include \"${path}\" (already included)\\n`;\n } else {\n done.add(path);\n stack.push(path);\n try {\n const raw = await loader(path);\n const expanded = await expand(raw);\n out += `\\n// begin include \"${path}\"\\n${expanded}\\n// end include \"${path}\"\\n`;\n } catch (e) {\n warn(`[ShaderMate] Failed to load include \"${path}\"`, e);\n if (throwOnError) throw e;\n out += `\\n// failed include \"${path}\"\\n`;\n } finally {\n stack.pop();\n }\n }\n }\n return out + code.slice(last);\n }\n return expand(src);\n}\n\n/** Turn defines (strings / {KEY: value} objects) into `#define` lines. */\nexport function defineLines(defines) {\n let out = '';\n for (const d of defines) {\n if (typeof d === 'string') out += `#define ${d}\\n`;\n else if (d && typeof d === 'object') {\n for (const k in d) {\n const v = d[k];\n out += (v === true || v === undefined) ? `#define ${k}\\n` : `#define ${k} ${v}\\n`;\n }\n }\n }\n return out;\n}\n\nexport const DEFAULT_INJECT = { header: true, builtins: true, uniforms: true, defines: true, mainWrap: true };\nexport const NO_INJECT = { header: false, builtins: false, uniforms: false, defines: false, mainWrap: false };\n\n/**\n * Wrap user GLSL into a complete fragment shader.\n * inject.header #version (GL2) + precision\n * inject.builtins texture compatibility macros, `out vec4 outColor` (GL2), iGlobalTime alias\n * inject.uniforms auto-declare built-in uniforms the shader uses (iTime, iResolution, iChannel0 \u2026)\n * inject.defines user #defines\n * inject.mainWrap wrap `mainImage(out vec4, in vec2)` in a main()\n */\nexport function assembleFragment(src, { isGL2, defines = [], enableDerivatives = false, inject = DEFAULT_INJECT, channelTypes = [], builtinOpts = {} } = {}) {\n if (!inject || !Object.values(inject).some(Boolean)) return src;\n\n // A user-supplied #version must stay on line 1: hoist it.\n let versionLine = '';\n let body = src;\n const vm = /^[ \\t]*#version[^\\n]*/m.exec(body);\n if (vm) {\n versionLine = vm[0].trim() + '\\n';\n body = body.slice(0, vm.index) + body.slice(vm.index + vm[0].length);\n }\n\n let head = '';\n if (versionLine) head += versionLine;\n else if (inject.header && isGL2) head += '#version 300 es\\n';\n // #extension must precede any non-preprocessor token (incl. precision statements).\n if (inject.builtins && !isGL2 && enableDerivatives) head += '#extension GL_OES_standard_derivatives : enable\\n';\n if (inject.header) head += 'precision highp float;\\nprecision highp int;\\n';\n if (inject.builtins) {\n head += isGL2 ? BUILTIN_MACROS_GL2 : BUILTIN_MACROS_GL1;\n head += BUILTIN_DEFINES;\n // Exactly one fragment output: the user's own `out vec4 \u2026`, a `fragColor` they write to from\n // main() (FragCoord.xyz / GLSL 3 style), or our `outColor` for the mainImage wrapper.\n const fragDecl = declareFragColor(body, isGL2);\n const userOut = /\\bout\\s+(?:\\w+\\s+)*vec4\\s+\\w+\\s*;/.test(stripComments(body)); // a declaration, not a `mainImage(out vec4 c, \u2026)` parameter\n if (fragDecl) head += fragDecl;\n else if (isGL2 && !userOut) head += 'out vec4 outColor;\\n';\n }\n if (inject.uniforms) head += declareBuiltins(body, channelTypes, builtinOpts);\n if (inject.defines) head += defineLines(defines);\n\n const clean = stripComments(body);\n const needWrap = inject.mainWrap && /\\bmainImage\\s*\\(/.test(clean) && !/\\bvoid\\s+main\\s*\\(/.test(clean);\n\n let out = head + '#line 1\\n' + body;\n if (needWrap) out += isGL2 ? MAIN_WRAP_GL2 : MAIN_WRAP_GL1;\n return out;\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\nimport { isPow2, warnOnce } from '../utils/util.js';\n\n/**\n * Upload an image/video/canvas/ImageBitmap to a new 2D texture.\n * Returns a channel wrapper: { texId, width, height, update(), dispose? }.\n */\nexport function makeTexture2D(gl, pool, source, w, h, params = {}, env = {}, { dynamic = false, flipDefault = false } = {}) {\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n\n const flip = params.flipY === undefined ? flipDefault : !!params.flipY;\n // WebGL1 only supports clamp + no mipmaps on non-power-of-two textures\n const npotLimited = !env.isGL2 && !(isPow2(w) && isPow2(h));\n if (npotLimited && params.wrap && params.wrap !== 'clamp') {\n warnOnce('npot-wrap', 'Non-power-of-two texture in WebGL1: forcing wrap to clamp.');\n }\n const wrap = npotLimited ? gl.CLAMP_TO_EDGE : wrapMode(gl, params.wrap);\n const mip = !!params.mipmap && !dynamic && !npotLimited;\n const filter = filterMode(gl, params.filter);\n const minFilter = mip\n ? (params.filter === 'nearest' ? gl.NEAREST_MIPMAP_NEAREST : gl.LINEAR_MIPMAP_LINEAR)\n : filter;\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrap);\n\n const upload = () => {\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flip);\n gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !!params.premultiplyAlpha);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n };\n upload();\n if (mip) gl.generateMipmap(gl.TEXTURE_2D);\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n return {\n texId: pool.add(tex, 'texture2D'),\n width: w,\n height: h,\n source,\n update: dynamic\n ? () => {\n if (source.readyState !== undefined && source.readyState < 2) return; // media not ready\n gl.bindTexture(gl.TEXTURE_2D, tex);\n upload();\n gl.bindTexture(gl.TEXTURE_2D, null);\n }\n : () => { }\n };\n}\n\nexport function loadImage(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const img = new Image();\n img.crossOrigin = params.crossOrigin === undefined ? 'anonymous' : params.crossOrigin;\n img.onload = () => res(makeTexture2D(gl, pool, img, img.naturalWidth, img.naturalHeight, params, env));\n img.onerror = () => rej(new Error(`Failed to load image \"${url}\"`));\n img.src = url;\n });\n}\n", "import { wrapMode, filterMode } from '../gl/params.js';\n\nconst FACE_NAMES = ['+X', '-X', '+Y', '-Y', '+Z', '-Z'];\n\n/** urls: [posx, negx, posy, negy, posz, negz] */\nexport function loadCubeMap(gl, pool, urls, params = {}) {\n return new Promise((res, rej) => {\n if (!Array.isArray(urls) || urls.length !== 6) return rej(new Error('cubemap needs an array of 6 URLs'));\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n const wrap = wrapMode(gl, params.wrap);\n const filter = filterMode(gl, params.filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, filter);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, wrap);\n gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, wrap);\n\n const faces = [\n gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,\n gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z\n ];\n let loaded = 0, w = 0, h = 0, failed = false;\n\n urls.forEach((u, i) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n if (failed) return;\n if (!w) { w = img.width; h = img.height; }\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.texImage2D(faces[i], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);\n if (++loaded === 6) {\n if (params.mipmap) gl.generateMipmap(gl.TEXTURE_CUBE_MAP);\n gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);\n res({ texId: pool.add(tex, 'textureCube'), width: w, height: h, cubemap: true, update() { } });\n }\n };\n img.onerror = () => {\n if (failed) return;\n failed = true;\n gl.deleteTexture(tex);\n rej(new Error(`Failed to load cubemap face ${FACE_NAMES[i]}: \"${u}\"`));\n };\n img.src = u;\n });\n });\n}\n", "import { makeTexture2D } from './image.js';\n\n/** Retry media playback on the first user gesture when autoplay is blocked. */\nexport function playOnGesture(media) {\n const p = media.play && media.play();\n if (p && p.catch) {\n p.catch(() => {\n const go = () => { media.play().catch(() => { }); };\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n });\n }\n}\n\n/** Video file -> live texture. `{ video: 'clip.mp4', muted, loop }` */\nexport function loadVideo(gl, pool, url, params = {}, env = {}) {\n return new Promise((res, rej) => {\n const video = document.createElement('video');\n Object.assign(video, {\n src: url, crossOrigin: 'anonymous',\n loop: params.loop !== false, muted: params.muted !== false, playsInline: true, autoplay: true\n });\n video.addEventListener('error', () => rej(new Error(`Failed to load video \"${url}\"`)), { once: true });\n video.addEventListener('canplay', () => {\n playOnGesture(video);\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.getTime = () => video.currentTime;\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); video.removeAttribute('src'); video.load(); };\n res(wrapper);\n }, { once: true });\n video.load();\n });\n}\n\n/** Webcam -> live texture. `{ camera: true }` or `{ camera: { facingMode: 'user' } }` */\nexport function loadCamera(gl, pool, params = {}, env = {}) {\n const constraints = typeof params.camera === 'object' ? params.camera : { facingMode: 'user' };\n return navigator.mediaDevices.getUserMedia({ video: constraints, audio: false }).then(stream => new Promise(res => {\n const video = document.createElement('video');\n Object.assign(video, { srcObject: stream, muted: true, playsInline: true, autoplay: true });\n video.addEventListener('loadedmetadata', () => {\n video.play().catch(() => { });\n const wrapper = makeTexture2D(gl, pool, video, video.videoWidth, video.videoHeight,\n { ...params, flipY: params.flipY === undefined ? true : params.flipY }, env, { dynamic: true });\n wrapper.media = video;\n wrapper.dispose = () => { video.pause(); stream.getTracks().forEach(t => t.stop()); };\n res(wrapper);\n }, { once: true });\n }));\n}\n", "/**\n * Audio -> spectrum texture (width = fftSize/2, 8-bit, read `.r`).\n * Row 0 = frequency spectrum, row 1 = waveform (ShaderToy layout). Height is 2.\n * { audio: 'song.mp3', fftSize: 1024 } file (loops, starts on first user gesture)\n * { mic: true } microphone input\n * { audio: audioElement } an <audio> element you control yourself\n */\nexport function loadAudio(gl, pool, ch, { mic = false } = {}) {\n const spectro = ch.layout === 'spectrogram'; // FragCoord.xyz u_audio: 512x512, scrolling history\n const fftSize = ch.fftSize || (spectro ? 1024 : 512);\n const AC = window.AudioContext || window.webkitAudioContext;\n\n return new Promise((res, rej) => {\n const ctx = new AC();\n const analyser = ctx.createAnalyser();\n analyser.fftSize = fftSize;\n analyser.smoothingTimeConstant = ch.smoothing ?? 0.8;\n\n const bins = analyser.frequencyBinCount;\n const wave = new Uint8Array(fftSize);\n // ShaderToy layout: bins x 2 (row 0 spectrum, row 1 waveform), LUMINANCE.\n // Spectrogram layout: bins x bins RGB, row 0 = newest (R weighted FFT, G waveform, B raw FFT), older rows above.\n const H = spectro ? bins : 2;\n const chans = spectro ? 3 : 1;\n const data = new Uint8Array(bins * H * chans);\n const rawFFT = spectro ? new Uint8Array(bins) : null;\n let rawAnalyser = null;\n if (spectro) { rawAnalyser = ctx.createAnalyser(); rawAnalyser.fftSize = fftSize; rawAnalyser.smoothingTimeConstant = 0; }\n\n const tex = gl.createTexture();\n const fmt = spectro ? gl.RGB : gl.LUMINANCE;\n const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, fmt, bins, H, 0, fmt, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\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 upload();\n\n let getTime = () => ctx.currentTime;\n let cleanup = () => { };\n\n const finish = () => {\n const resume = () => { if (ctx.state === 'suspended') ctx.resume(); };\n resume();\n window.addEventListener('pointerdown', resume, { once: true });\n window.addEventListener('keydown', resume, { once: true });\n res({\n texId: pool.add(tex, 'texture2D'),\n width: bins, height: H,\n analyser, context: ctx,\n getTime,\n update() {\n if (spectro) {\n const row = bins * 3;\n data.copyWithin(row, 0, data.length - row); // scroll history up one row\n analyser.getByteFrequencyData(rawFFT); // smoothed (\"weighted\") spectrum\n analyser.getByteTimeDomainData(wave);\n for (let i = 0; i < bins; i++) { data[i * 3] = rawFFT[i]; data[i * 3 + 1] = wave[i * 2]; }\n rawAnalyser.getByteFrequencyData(rawFFT); // unsmoothed\n for (let i = 0; i < bins; i++) data[i * 3 + 2] = rawFFT[i];\n } else {\n analyser.getByteFrequencyData(data.subarray(0, bins));\n analyser.getByteTimeDomainData(wave);\n data.set(wave.subarray(0, bins), bins);\n }\n upload();\n },\n dispose() { cleanup(); ctx.close && ctx.close(); }\n });\n };\n\n if (mic) {\n navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(stream => {\n const src = ctx.createMediaStreamSource(stream);\n src.connect(analyser); // not connected to destination: no feedback loop\n if (rawAnalyser) src.connect(rawAnalyser);\n cleanup = () => stream.getTracks().forEach(t => t.stop());\n finish();\n }).catch(rej);\n return;\n }\n\n const url = ch.audio || ch.audioFFT;\n const audio = url instanceof HTMLMediaElement ? url : new Audio();\n const owned = audio !== url;\n if (owned) Object.assign(audio, { src: url, crossOrigin: 'anonymous', loop: ch.loop !== false, autoplay: true });\n getTime = () => audio.currentTime;\n\n const connect = () => {\n const src = ctx.createMediaElementSource(audio);\n src.connect(analyser);\n if (rawAnalyser) src.connect(rawAnalyser);\n analyser.connect(ctx.destination);\n if (owned) {\n const go = () => { if (ctx.state === 'suspended') ctx.resume(); audio.play().catch(() => { }); };\n go();\n window.addEventListener('pointerdown', go, { once: true });\n window.addEventListener('keydown', go, { once: true });\n cleanup = () => { audio.pause(); audio.removeAttribute('src'); audio.load(); };\n }\n finish();\n };\n if (audio.readyState >= 3) connect();\n else {\n audio.addEventListener('canplay', connect, { once: true });\n audio.addEventListener('error', () => rej(new Error(`Failed to load audio \"${url}\"`)), { once: true });\n if (owned) audio.load();\n }\n });\n}\n", "import { makeTexture2D } from './image.js';\n\nconst isCanvas = el => typeof HTMLCanvasElement !== 'undefined' && el instanceof HTMLCanvasElement;\nconst isVideo = el => typeof HTMLVideoElement !== 'undefined' && el instanceof HTMLVideoElement;\n\n/**\n * Use an existing element as a texture: <canvas>, <video>, <img>, ImageBitmap.\n * Canvases and videos are re-uploaded every frame (set `dynamic: false` to upload once).\n * Great for feeding a p5 / three.js / 2D canvas into a shader: channels: [myCanvas]\n */\nexport function loadElement(gl, pool, el, params = {}, env = {}) {\n const w = el.videoWidth || el.naturalWidth || el.width || 1;\n const h = el.videoHeight || el.naturalHeight || el.height || 1;\n const live = isCanvas(el) || isVideo(el);\n const dynamic = params.dynamic === undefined ? live : !!params.dynamic;\n const wrapper = makeTexture2D(gl, pool, el, w, h, params, env, { dynamic, flipDefault: live });\n if (isVideo(el)) wrapper.getTime = () => el.currentTime;\n // keep the reported size in sync with a canvas that is resized later\n if (dynamic) {\n const base = wrapper.update;\n wrapper.update = () => {\n wrapper.width = el.videoWidth || el.naturalWidth || el.width || 1;\n wrapper.height = el.videoHeight || el.naturalHeight || el.height || 1;\n base();\n };\n }\n return Promise.resolve(wrapper);\n}\n\n/** Wrap a WebGLTexture the user created elsewhere (same GL context). */\nexport function wrapTexture(gl, pool, ch) {\n const id = pool.add(ch.texture, ch.cube ? 'textureCube' : 'texture2D');\n pool.ref(id); // never deleted by us: the user owns it\n return Promise.resolve({ texId: id, width: ch.width || 1, height: ch.height || 1, cubemap: !!ch.cube, update() { } });\n}\n", "/**\n * Keyboard state texture, ShaderToy layout (also what FragCoord.xyz's u_keyboard describes):\n * 256 x 3, 8-bit, one column per key code:\n * row 0 key currently held (texelFetch(k, ivec2(code, 0), 0).x)\n * row 1 key pressed this frame\n * row 2 toggle (flips on each press)\n * Key codes follow ShaderToy: JS keyCode (letters are their uppercase ASCII, 32 = space, 37..40 = arrows\u2026).\n * { keyboard: true } or { keyboard: { target: element } }\n */\nexport function loadKeyboard(gl, pool, ch = {}) {\n const W = 256, ROWS = 3;\n const data = new Uint8Array(W * ROWS);\n const held = new Uint8Array(W);\n const pressed = new Uint8Array(W);\n const toggle = new Uint8Array(W);\n const target = (ch.keyboard && typeof ch.keyboard === 'object' && ch.keyboard.target) || window;\n\n const code = e => {\n if (typeof e.keyCode === 'number' && e.keyCode) return e.keyCode & 255;\n const k = e.key || '';\n return k.length === 1 ? k.toUpperCase().charCodeAt(0) & 255 : 0;\n };\n const onDown = e => {\n const c = code(e);\n if (!held[c]) { pressed[c] = 255; toggle[c] = toggle[c] ? 0 : 255; }\n held[c] = 255;\n };\n const onUp = e => { held[code(e)] = 0; };\n const onBlur = () => held.fill(0);\n target.addEventListener('keydown', onDown);\n target.addEventListener('keyup', onUp);\n window.addEventListener('blur', onBlur);\n\n const tex = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\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 const upload = () => {\n gl.bindTexture(gl.TEXTURE_2D, tex);\n gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);\n gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, W, ROWS, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data);\n gl.bindTexture(gl.TEXTURE_2D, null);\n };\n upload();\n\n return Promise.resolve({\n texId: pool.add(tex, 'texture2D'),\n width: W, height: ROWS,\n keyboard: true,\n update() {\n data.set(held, 0);\n data.set(pressed, W);\n data.set(toggle, W * 2);\n upload();\n pressed.fill(0); // \"pressed\" lasts exactly one frame\n },\n dispose() {\n target.removeEventListener('keydown', onDown);\n target.removeEventListener('keyup', onUp);\n window.removeEventListener('blur', onBlur);\n }\n });\n}\n", "import { loadImage } from './image.js';\nimport { loadCubeMap } from './cubemap.js';\nimport { loadVideo, loadCamera } from './video.js';\nimport { loadAudio } from './audio.js';\nimport { loadElement, wrapTexture } from './element.js';\nimport { loadKeyboard } from './keyboard.js';\n\n/**\n * Load one external (non-pass) channel. Resolves to a wrapper\n * { texId, width, height, update(), cubemap?, getTime?, dispose? } or rejects.\n */\nexport function loadChannel(gl, pool, ch, env) {\n if (ch.texture) return wrapTexture(gl, pool, ch);\n if (ch.element) return loadElement(gl, pool, ch.element, ch, env);\n if (ch.url) return loadImage(gl, pool, ch.url, ch, env);\n if (ch.video) return loadVideo(gl, pool, ch.video, ch, env);\n if (ch.camera) return loadCamera(gl, pool, ch, env);\n if (ch.mic) return loadAudio(gl, pool, ch, { mic: true });\n if (ch.keyboard) return loadKeyboard(gl, pool, ch);\n if (ch.audio || ch.audioFFT) return loadAudio(gl, pool, ch);\n if (ch.cubemap) return loadCubeMap(gl, pool, ch.cubemap, ch);\n return Promise.reject(new Error('Unrecognised channel: ' + JSON.stringify(ch)));\n}\n\n/** Sampler type a channel will need in GLSL. */\nexport function channelSamplerType(ch) {\n if (!ch) return null;\n return ch.cubemap || (ch.texture && ch.cube) ? 'cube' : '2D';\n}\n", "// FragCoord.xyz conventions: multi-pass paste blobs and uniform comment annotations.\n// Everything here is plain text processing; the runtime binds the results.\n\nconst stripComments = s => s.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '').replace(/\\/\\/.*$/gm, '');\n\n/**\n * Split a pasted multi-pass blob into passes. Recognised headers (each on its own line):\n * // Pass 1 // Pass 2 \u2014 Horizontal blur // Main\n * // Common // Pass: blur \u2014 Buffer type: 2D\n * // ===== Pass: Name ===== (export style)\n * Returns null when no headers are present (plain single shader).\n */\nexport function splitPassBlob(text) {\n const re = /^[ \\t]*\\/\\/[ \\t]*(?:=+[ \\t]*)?(?:Pass[ \\t]*:?[ \\t]*([^\\n=\u2014\u2013-]+?)|(Main)|(Common))[ \\t]*(?:[\u2014\u2013-]+[^\\n]*)?(?:=+)?[ \\t]*$/gim;\n const heads = [];\n let m;\n while ((m = re.exec(text))) heads.push({ index: m.index, end: m.index + m[0].length, raw: m[0], pass: m[1], main: !!m[2], common: !!m[3] });\n if (!heads.length) return null;\n\n const out = { common: text.slice(0, heads[0].index).trim(), passes: [] };\n heads.forEach((h, i) => {\n const body = text.slice(h.end, i + 1 < heads.length ? heads[i + 1].index : text.length).trim();\n if (h.common) { out.common = (out.common ? out.common + '\\n' : '') + body; return; }\n const label = h.main ? 'main' : String(h.pass).trim();\n const bufferType = /buffer\\s*type\\s*:\\s*(\\w+)/i.exec(h.raw);\n const num = /^(\\d+)$/.exec(label);\n out.passes.push({\n name: h.main ? 'main' : (num ? 'pass' + num[1] : label.replace(/[^\\w]+/g, '_').replace(/^_+|_+$/g, '').toLowerCase()),\n label,\n main: h.main,\n src: body,\n bufferType: bufferType ? bufferType[1].toLowerCase() : '2d',\n });\n });\n\n // Loose #define lines before the first header belong to Common (FragCoord hoists them).\n if (out.common && !/[{};]/.test(stripComments(out.common))) {\n // only defines/comments: fine as common\n }\n return out;\n}\n\n/** `[linear repeat mipmap]` / `[nearest clamp]` bracket settings -> channel params */\nexport function parseBracketSettings(s) {\n const p = {};\n const m = /\\[([^\\]]*)\\]/.exec(s || '');\n if (!m) return p;\n for (const word of m[1].toLowerCase().split(/[\\s,]+/)) {\n if (word === 'nearest' || word === 'linear') p.filter = word;\n else if (word === 'clamp' || word === 'repeat' || word === 'mirror') p.wrap = word;\n else if (word === 'mipmap') p.mipmap = true;\n else if (word === 'flipy' || word === 'flip') p.flipY = true;\n }\n return p;\n}\n\n/**\n * Parse uniform annotations FragCoord users write in comments and strip the (non-GLSL) initializers.\n *\n * uniform float u_speed; //1.0, [0.0, 5.0] -> value 1.0, min 0, max 5\n * uniform float u_x = 0.5; //[0.0, 5.0] -> value 0.5 (initializer removed from source)\n * uniform vec3 u_color; //0.2, 0.55, 1.0, [0, 1] -> value [0.2,0.55,1]\n * uniform sampler2D u_tex; //https://x/y.png [linear repeat]\n * uniform sampler2D u_clip; //https://x/loop.mp4 -> video + u_clip_time\n * uniform sampler2D u_a; // ref:pass1 [nearest clamp] | ref:pass:blur | ref:main | ref:sampler u_tex\n * uniform sampler2D u_audio; // mic | https://x.mp3 | [VIDEO] | [CAM]\n *\n * Returns { source, uniforms: { name: spec }, samplers: { name: channelSpec } }.\n */\nexport function parseUniformComments(src) {\n const uniforms = {};\n const samplers = {};\n const lines = src.split('\\n');\n const re = /^\\s*uniform\\s+(?:(?:lowp|mediump|highp)\\s+)?(\\w+)\\s+(\\w+)(?:\\s*\\[\\s*\\d+\\s*\\])?\\s*(?:=\\s*([^;]+))?;\\s*(?:\\/\\/(.*))?$/;\n\n const outLines = lines.map(line => {\n const m = re.exec(line);\n if (!m) return line;\n const [, type, name, init, comment = ''] = m;\n const c = comment.trim();\n const isSampler = /^sampler/.test(type);\n\n if (isSampler) {\n const spec = parseSamplerComment(name, c, type);\n if (spec) samplers[name] = spec;\n } else {\n const spec = {};\n const nums = s => (s.match(/-?\\d*\\.?\\d+(?:e-?\\d+)?/g) || []).map(Number);\n const range = /\\[([^\\]]*)\\]/.exec(c);\n const defaults = nums(c.replace(/\\[[^\\]]*\\]/, ''));\n const comps = /vec(\\d)/.test(type) ? +type.match(/vec(\\d)/)[1] : 1;\n const isBool = /^bool/.test(type);\n let value;\n if (init) {\n const v = nums(init);\n value = comps === 1 ? (isBool ? /true/.test(init) : (v[0] ?? 0)) : v.slice(0, comps);\n } else if (defaults.length) {\n value = comps === 1 ? defaults[0] : (defaults.length >= comps ? defaults.slice(0, comps) : new Array(comps).fill(defaults[0]));\n }\n if (range) {\n const r = nums(range[1]);\n if (r.length >= 2) { spec.min = r[0]; spec.max = r[1]; if (r.length >= 3) spec.step = r[2]; }\n }\n if (value !== undefined || range) {\n spec.value = value !== undefined ? value : (comps === 1 ? (spec.min ?? 0) : new Array(comps).fill(spec.min ?? 0));\n uniforms[name] = spec;\n }\n }\n // GLSL ES has no uniform initializers: `uniform float x = 0.5;` -> `uniform float x;`\n return init ? line.replace(/\\s*=\\s*[^;]+;/, ';') : line;\n });\n\n return { source: outLines.join('\\n'), uniforms, samplers };\n}\n\nfunction parseSamplerComment(name, c, type) {\n const params = parseBracketSettings(c);\n const text = c.replace(/\\[[^\\]]*\\]/g, '').trim();\n\n const ref = /^ref:\\s*(.+)$/i.exec(text);\n if (ref) {\n const r = ref[1].trim();\n let m;\n if ((m = /^pass\\s*(\\d+)(?::out(\\d+))?$/i.exec(r))) return { pass: 'pass' + m[1], ...params };\n if ((m = /^pass:\\s*(\\S+)/i.exec(r))) return { pass: m[1], ...params };\n if (/^main$/i.test(r)) return { pass: 'main', ...params };\n if ((m = /^sampler\\s+(\\w+)/i.exec(r))) return { sameAs: m[1], ...params };\n return null;\n }\n if (name === 'u_audio' || /audio/i.test(name) && /^(mic|\\[CAM\\]|\\[VIDEO\\])?$/i.test(text)) {\n if (/^https?:|^data:/i.test(text)) return { audio: text, layout: 'spectrogram' };\n return { mic: true, layout: 'spectrogram' };\n }\n if (name === 'u_webcam') return { camera: true, ...params };\n if (name === 'u_keyboard') return { keyboard: true };\n if (/^(https?:|data:)/i.test(text)) {\n const url = text.split(/\\s+/)[0];\n if (/\\.(mp4|webm|mov|ogv|m4v)(\\?|$)/i.test(url)) return { video: url, ...params };\n if (/\\.(mp3|wav|ogg|m4a|aac|flac)(\\?|$)/i.test(url)) return { audio: url, layout: 'spectrogram' };\n return type === 'samplerCube' ? null : { url, ...params };\n }\n return null;\n}\n\n/** Does the source use `u_mouse` as a vec4 (any z/w access)? */\nexport function usesMouseVec4(src) {\n return /\\bu_mouse\\s*\\.\\s*[xyzw]*[zw]/.test(stripComments(src));\n}\n\n/** Does the source reference any of the given identifiers? */\nexport function usesAny(src, names) {\n const code = stripComments(src);\n return names.filter(n => new RegExp('\\\\b' + n.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '\\\\b').test(code));\n}\n", "// Named sampler binding: any `uniform sampler2D u_xxx` that isn't an iChannelN gets a source\n// by name \u2014 a pass (`u_blur`, `u_pass1`, `u_main`), a comment-annotated URL/ref (FragCoord.xyz),\n// or a live input (`u_audio`, `u_keyboard`, `u_webcam`). Explicit `samplers: { name: source }`\n// on the pass or instance wins over everything.\n\nexport const GL_SAMPLER_2D = 35678;\nexport const GL_SAMPLER_CUBE = 35680;\n\n/** Aux (non-screen) passes in order: what FragCoord calls Pass 1, Pass 2\u2026 */\nexport const auxPasses = passObjs => passObjs.filter(p => !p.cfg.screen);\n\n/**\n * Decide where each named sampler of a compiled pass comes from.\n * Returns [{ name, info, spec }] where spec is a channel spec ({ pass } | loader spec) or { array: [passObj\u2026] }.\n */\nexport function resolveSamplerSpecs(po, passObjs, instanceSamplers = {}) {\n const out = [];\n const aux = auxPasses(passObjs);\n const screen = passObjs.find(p => p.cfg.screen);\n const byName = new Map(passObjs.map(p => [p.name, p]));\n const annotated = Object.assign({}, po.cfg.annotatedSamplers, po.cfg.samplers);\n\n for (const name in po.uniformInfo) {\n const info = po.uniformInfo[name];\n if (info.type !== GL_SAMPLER_2D && info.type !== GL_SAMPLER_CUBE) continue;\n if (/^iChannel\\d$/.test(name)) continue;\n\n let spec = instanceSamplers[name] || annotated[name] || null;\n let m;\n if (spec && spec.sameAs) spec = annotated[spec.sameAs] || instanceSamplers[spec.sameAs] || null;\n\n if (!spec) {\n if (name === 'u_passes' && info.size > 1) spec = { array: aux.slice(0, info.size) };\n else if (name === 'u_main') spec = screen ? { pass: screen.name } : null;\n else if ((m = /^u_pass(\\d+)$/.exec(name)) && aux[+m[1] - 1]) spec = { pass: aux[+m[1] - 1].name };\n else if (name.startsWith('u_') && byName.has(name.slice(2))) spec = { pass: name.slice(2) };\n else if (name === 'u_audio') spec = { mic: true, layout: 'spectrogram' };\n else if (name === 'u_keyboard') spec = { keyboard: true };\n else if (name === 'u_webcam') spec = { camera: true };\n }\n if (spec && spec.pass != null && !byName.has(spec.pass)) {\n // \"pass1\" style refs resolve by aux index too\n const mm = /^pass(\\d+)$/.exec(spec.pass);\n if (mm && aux[+mm[1] - 1]) spec = { ...spec, pass: aux[+mm[1] - 1].name };\n else if (spec.pass === 'main' && screen) spec = { ...spec, pass: screen.name };\n }\n if (spec) out.push({ name, info, spec });\n }\n return out;\n}\n\n/** Does any pass sample the screen pass (so it needs a readable backbuffer)? */\nexport function needsMainBackbuffer(passObjs) {\n const screen = passObjs.find(p => p.cfg.screen);\n if (!screen) return false;\n return passObjs.some(po => (po.samplers || []).some(s => s.spec.pass === screen.name) ||\n po.cfg.channels.some(c => c && c.pass === screen.name));\n}\n", "/**\n * Fly camera for `u_camera_pos` / `u_camera_dir` / `u_camera_view` (FragCoord.xyz convention).\n * WASD / arrows move, Q/E (or Space/Shift) down/up, mouse drag looks around, wheel dollies.\n * u_camera_view is the world-to-camera matrix, column-major (OpenGL convention), so\n * mat3(u_camera_view) * dir goes world->camera and transpose goes back.\n */\nexport function createCamera(canvas, { target = window, speed = 1.5, sensitivity = 0.004 } = {}) {\n const pos = [0, 0, 0];\n let yaw = -Math.PI / 2, pitch = 0; // looking down -Z\n const keys = new Set();\n let dragging = false, lastX = 0, lastY = 0;\n const dir = [0, 0, -1];\n const view = new Float32Array(16);\n\n const onKey = (e, down) => {\n const k = e.key.length === 1 ? e.key.toLowerCase() : e.key;\n if (down) keys.add(k); else keys.delete(k);\n };\n const kd = e => onKey(e, true), ku = e => onKey(e, false);\n const pd = e => { if (e.button === 0) { dragging = true; lastX = e.clientX; lastY = e.clientY; } };\n const pm = e => {\n if (!dragging) return;\n yaw += (e.clientX - lastX) * sensitivity;\n pitch -= (e.clientY - lastY) * sensitivity;\n pitch = Math.max(-1.55, Math.min(1.55, pitch));\n lastX = e.clientX; lastY = e.clientY;\n };\n const pu = () => { dragging = false; };\n const wh = e => { const f = dir; const d = -e.deltaY * 0.002 * speed; pos[0] += f[0] * d; pos[1] += f[1] * d; pos[2] += f[2] * d; };\n const blur = () => keys.clear();\n\n target.addEventListener('keydown', kd); target.addEventListener('keyup', ku);\n canvas.addEventListener('pointerdown', pd); window.addEventListener('pointermove', pm); window.addEventListener('pointerup', pu);\n canvas.addEventListener('wheel', wh, { passive: true }); window.addEventListener('blur', blur);\n\n function lookAt() {\n const f = dir;\n // right = normalize(cross(f, up)), up' = cross(right, f)\n const upW = [0, 1, 0];\n let r = [f[1] * upW[2] - f[2] * upW[1], f[2] * upW[0] - f[0] * upW[2], f[0] * upW[1] - f[1] * upW[0]];\n const rl = Math.hypot(r[0], r[1], r[2]) || 1; r = r.map(v => v / rl);\n const u = [r[1] * f[2] - r[2] * f[1], r[2] * f[0] - r[0] * f[2], r[0] * f[1] - r[1] * f[0]];\n // column-major world->camera\n view.set([\n r[0], u[0], -f[0], 0,\n r[1], u[1], -f[1], 0,\n r[2], u[2], -f[2], 0,\n -(r[0] * pos[0] + r[1] * pos[1] + r[2] * pos[2]),\n -(u[0] * pos[0] + u[1] * pos[1] + u[2] * pos[2]),\n (f[0] * pos[0] + f[1] * pos[1] + f[2] * pos[2]),\n 1,\n ]);\n return { right: r, up: u };\n }\n\n return {\n pos, dir, view,\n /** Advance by dt seconds. */\n update(dt) {\n dir[0] = Math.cos(pitch) * Math.cos(yaw); dir[1] = Math.sin(pitch); dir[2] = Math.cos(pitch) * Math.sin(yaw);\n const { right } = lookAt();\n const v = speed * dt * (keys.has('Shift') ? 3 : 1);\n const mv = (vec, s) => { pos[0] += vec[0] * s; pos[1] += vec[1] * s; pos[2] += vec[2] * s; };\n if (keys.has('w') || keys.has('ArrowUp')) mv(dir, v);\n if (keys.has('s') || keys.has('ArrowDown')) mv(dir, -v);\n if (keys.has('d') || keys.has('ArrowRight')) mv(right, v);\n if (keys.has('a') || keys.has('ArrowLeft')) mv(right, -v);\n if (keys.has('e') || keys.has(' ')) pos[1] += v;\n if (keys.has('q') || keys.has('c')) pos[1] -= v;\n lookAt();\n },\n dispose() {\n target.removeEventListener('keydown', kd); target.removeEventListener('keyup', ku);\n canvas.removeEventListener('pointerdown', pd); window.removeEventListener('pointermove', pm); window.removeEventListener('pointerup', pu);\n canvas.removeEventListener('wheel', wh); window.removeEventListener('blur', blur);\n }\n };\n}\n", "// Uniform type resolution.\n//\n// A uniform `type` may be written as the GLSL type ('float', 'vec3', 'mat4', 'int[]', ...)\n// or as the classic WebGL shorthand ('1f', '3f', 'Matrix4fv', ...). Case-insensitive.\n// If no type is given at all, it's inferred from the compiled shader (see describeGLType).\n//\n// Descriptor: { kind: 'f' | 'i' | 'u' | 'm', n } (n = components, or matrix dimension)\n\nconst ALIASES = Object.create(null);\nconst add = (desc, ...names) => names.forEach(n => { ALIASES[n.toLowerCase()] = desc; });\n\n// float family\nadd({ kind: 'f', n: 1 }, 'float', 'number', 'f', '1f', '1fv', 'float[]', 'uniform1f', 'uniform1fv');\nadd({ kind: 'f', n: 2 }, 'vec2', '2f', '2fv', 'vec2[]', 'uniform2f', 'uniform2fv');\nadd({ kind: 'f', n: 3 }, 'vec3', '3f', '3fv', 'vec3[]', 'uniform3f', 'uniform3fv');\nadd({ kind: 'f', n: 4 }, 'vec4', '4f', '4fv', 'vec4[]', 'uniform4f', 'uniform4fv');\n\n// int / bool family (bool uniforms are uploaded as ints)\nadd({ kind: 'i', n: 1 }, 'int', 'bool', 'boolean', 'i', '1i', '1iv', 'int[]', 'bool[]', 'uniform1i', 'uniform1iv');\nadd({ kind: 'i', n: 2 }, 'ivec2', 'bvec2', '2i', '2iv', 'ivec2[]', 'bvec2[]', 'uniform2i', 'uniform2iv');\nadd({ kind: 'i', n: 3 }, 'ivec3', 'bvec3', '3i', '3iv', 'ivec3[]', 'bvec3[]', 'uniform3i', 'uniform3iv');\nadd({ kind: 'i', n: 4 }, 'ivec4', 'bvec4', '4i', '4iv', 'ivec4[]', 'bvec4[]', 'uniform4i', 'uniform4iv');\n\n// unsigned int (WebGL2)\nadd({ kind: 'u', n: 1 }, 'uint', '1ui', '1uiv', 'uint[]');\nadd({ kind: 'u', n: 2 }, 'uvec2', '2ui', '2uiv', 'uvec2[]');\nadd({ kind: 'u', n: 3 }, 'uvec3', '3ui', '3uiv', 'uvec3[]');\nadd({ kind: 'u', n: 4 }, 'uvec4', '4ui', '4uiv', 'uvec4[]');\n\n// matrices\nadd({ kind: 'm', n: 2 }, 'mat2', 'matrix2fv', 'mat2fv', 'uniformmatrix2fv');\nadd({ kind: 'm', n: 3 }, 'mat3', 'matrix3fv', 'mat3fv', 'uniformmatrix3fv');\nadd({ kind: 'm', n: 4 }, 'mat4', 'matrix4fv', 'mat4fv', 'uniformmatrix4fv');\n\n/** 'vec3' | '3f' | 'Matrix4fv' | ... -> descriptor, or null if unknown. */\nexport function resolveUniformType(type) {\n if (typeof type !== 'string') return null;\n return ALIASES[type.trim().toLowerCase()] || null;\n}\n\n// GL enum -> descriptor (numeric constants are identical across contexts)\nconst GL_TYPES = {\n 5126: { kind: 'f', n: 1 }, // FLOAT\n 35664: { kind: 'f', n: 2 }, // FLOAT_VEC2\n 35665: { kind: 'f', n: 3 },\n 35666: { kind: 'f', n: 4 },\n 5124: { kind: 'i', n: 1 }, // INT\n 35667: { kind: 'i', n: 2 }, // INT_VEC2\n 35668: { kind: 'i', n: 3 },\n 35669: { kind: 'i', n: 4 },\n 35670: { kind: 'i', n: 1 }, // BOOL\n 35671: { kind: 'i', n: 2 }, // BOOL_VEC2\n 35672: { kind: 'i', n: 3 },\n 35673: { kind: 'i', n: 4 },\n 5125: { kind: 'u', n: 1 }, // UNSIGNED_INT\n 36294: { kind: 'u', n: 2 }, // UNSIGNED_INT_VEC2\n 36295: { kind: 'u', n: 3 },\n 36296: { kind: 'u', n: 4 },\n 35674: { kind: 'm', n: 2 }, // FLOAT_MAT2\n 35675: { kind: 'm', n: 3 },\n 35676: { kind: 'm', n: 4 },\n};\n\n/** Active-uniform GL type -> descriptor. Samplers etc. return undefined (managed via channels). */\nexport function describeGLType(glType) {\n return GL_TYPES[glType];\n}\n\nexport const GL_FLOAT = 5126;\nexport const GL_FLOAT_VEC2 = 35664;\nexport const GL_FLOAT_VEC4 = 35666;\n", "import { describeGLType, resolveUniformType } from './types.js';\nimport { isArrayLike, ShaderMateError, warnOnce } from '../utils/util.js';\n\n/**\n * A uniform entry is either a plain value (`0.5`, `[1,0,0]`, `true`)\n * or a spec object `{ type?, value, transpose?, ...ui hints }`.\n */\nexport function isUniformSpec(v) {\n return v != null && typeof v === 'object' && !isArrayLike(v) && 'value' in v;\n}\n\nconst num = v => (typeof v === 'boolean' ? (v ? 1 : 0) : v);\n\nfunction toList(value, n) {\n if (typeof value === 'number' || typeof value === 'boolean') return new Array(n).fill(num(value)); // broadcast\n if (ArrayBuffer.isView(value)) return value;\n if (Array.isArray(value) && value.some(x => typeof x === 'boolean')) return value.map(num);\n return value;\n}\n\n/** Upload `value` to `loc` according to a descriptor from types.js. */\nexport function uploadUniform(gl, loc, d, value, transpose) {\n const n = d.n;\n switch (d.kind) {\n case 'f':\n if (n === 1 && typeof value === 'number') return gl.uniform1f(loc, value);\n return gl['uniform' + n + 'fv'](loc, toList(value, n));\n case 'i':\n if (n === 1 && (typeof value === 'number' || typeof value === 'boolean')) return gl.uniform1i(loc, +value);\n return gl['uniform' + n + 'iv'](loc, toList(value, n));\n case 'u':\n if (n === 1 && typeof value === 'number') return gl.uniform1ui(loc, value);\n return gl['uniform' + n + 'uiv'](loc, toList(value, n));\n case 'm':\n return gl['uniformMatrix' + n + 'fv'](loc, !!transpose, value);\n }\n}\n\n/**\n * Apply a name -> entry map using the compiled program's uniform info.\n * Types are optional: when omitted they come from the shader itself.\n */\nexport function applyUniformMap(gl, info, map, { strict = false, warnMissing = false, label = '' } = {}) {\n if (!map) return;\n for (const name in map) {\n const raw = map[name];\n const spec = isUniformSpec(raw) ? raw : null;\n const value = spec ? spec.value : raw;\n if (value === undefined || value === null) continue;\n\n const inf = info[name];\n if (!inf || !inf.loc) {\n if (strict) throw new ShaderMateError('Unknown uniform: ' + name);\n if (warnMissing) warnOnce('missing-uniform:' + label + ':' + name,\n `Uniform \"${name}\" not found in ${label ? `pass \"${label}\"` : 'shader'} (misspelled, undeclared, or optimized out).`);\n continue;\n }\n\n let d;\n if (spec && spec.type != null) {\n d = resolveUniformType(spec.type);\n if (!d) {\n if (strict) throw new ShaderMateError('Unknown uniform type: ' + spec.type + ' for ' + name);\n warnOnce('bad-type:' + name, 'Unknown uniform type', spec.type, name);\n continue;\n }\n } else {\n d = describeGLType(inf.type);\n if (!d) continue; // sampler or unsupported type\n }\n uploadUniform(gl, inf.loc, d, value, spec && spec.transpose);\n }\n}\n", "/**\n * Pointer state (mouse / touch / pen). Coordinates are canvas pixels with the origin at the\n * bottom-left (ShaderToy convention), computed from the canvas's *painted* box so they stay\n * correct with CSS scaling, devicePixelRatio and object-fit letterboxing.\n *\n * options.target: 'window' (default \u2014 hero text overlaying the canvas doesn't block input)\n * | 'canvas' | any Element\n * options.smooth: 0 (off) \u2026 1 exponential smoothing applied per frame\n */\nexport function createPointer(canvas, getFit, options = {}) {\n const target = options.target === 'canvas' ? canvas\n : (options.target && typeof options.target === 'object') ? options.target\n : window;\n const smooth = +options.smooth || 0;\n\n const raw = { x: 0, y: 0, down: false, over: false, dragX: 0, dragY: 0, wheel: 0 };\n const state = { x: 0, y: 0, clickX: 0, clickY: 0, down: false, over: false, uvX: 0, uvY: 0, dragX: 0, dragY: 0, wheel: 0, clicked: false };\n let clickPending = false;\n let lastX = 0, lastY = 0;\n let moved = false;\n\n /** Painted rectangle of the bitmap inside the element box (accounts for object-fit). */\n function paintedRect() {\n const r = canvas.getBoundingClientRect();\n const fit = getFit ? getFit() : 'fill';\n if (!r.width || !r.height || (fit !== 'contain' && fit !== 'cover')) return r;\n const ba = canvas.width / canvas.height, ra = r.width / r.height;\n let w, h;\n if ((ra > ba) === (fit === 'contain')) { h = r.height; w = h * ba; } else { w = r.width; h = w / ba; }\n return { left: r.left + (r.width - w) / 2, top: r.top + (r.height - h) / 2, width: w, height: h, bottom: 0, right: 0 };\n }\n\n /** client (DOM) coords -> canvas pixel coords, bottom-left origin */\n function toShader(clientX, clientY) {\n const r = paintedRect();\n if (!r.width || !r.height) return [0, 0];\n return [\n (clientX - r.left) * (canvas.width / r.width),\n (r.top + r.height - clientY) * (canvas.height / r.height)\n ];\n }\n const toUV = (cx, cy) => { const [x, y] = toShader(cx, cy); return [x / canvas.width, y / canvas.height]; };\n\n const onMove = e => {\n const [x, y] = toShader(e.clientX, e.clientY);\n if (raw.down) { raw.dragX += x - lastX; raw.dragY += y - lastY; } // cumulative click-and-drag offset\n lastX = x; lastY = y;\n raw.x = x; raw.y = y;\n raw.over = x >= 0 && y >= 0 && x <= canvas.width && y <= canvas.height;\n if (!moved) { moved = true; state.x = x; state.y = y; }\n };\n const onDown = e => {\n if (e.button !== undefined && e.button !== 0) return;\n onMove(e);\n if (target === window && !raw.over) return; // clicks outside the canvas don't count as a press\n raw.down = true;\n state.down = true;\n clickPending = true;\n lastX = raw.x; lastY = raw.y;\n state.clickX = raw.x; state.clickY = raw.y;\n if (!smooth) { state.x = raw.x; state.y = raw.y; }\n };\n const onUp = () => { raw.down = false; state.down = false; };\n const onLeave = () => { raw.over = false; };\n const onWheel = e => { raw.wheel += -e.deltaY * 0.002; }; // mouse-wheel accumulator (exp(wheel) makes a nice zoom)\n\n if (options.touch !== false && target === canvas) canvas.style.touchAction = 'none';\n target.addEventListener('pointermove', onMove, { passive: true });\n target.addEventListener('pointerdown', onDown, { passive: true });\n window.addEventListener('pointerup', onUp, { passive: true });\n window.addEventListener('pointercancel', onUp, { passive: true });\n target.addEventListener('pointerleave', onLeave, { passive: true });\n target.addEventListener('wheel', onWheel, { passive: true });\n\n return {\n state,\n toShader,\n toUV,\n /** Call once per frame. */\n update() {\n if (smooth > 0 && smooth < 1) {\n const k = 1 - Math.pow(1 - smooth, 1); // per-frame factor\n state.x += (raw.x - state.x) * k;\n state.y += (raw.y - state.y) * k;\n } else { state.x = raw.x; state.y = raw.y; }\n state.over = raw.over;\n state.clicked = clickPending; clickPending = false; // true for exactly one frame after a press\n state.dragX = raw.dragX; state.dragY = raw.dragY; state.wheel = raw.wheel;\n state.uvX = canvas.width ? state.x / canvas.width : 0;\n state.uvY = canvas.height ? state.y / canvas.height : 0;\n },\n dispose() {\n target.removeEventListener('pointermove', onMove);\n target.removeEventListener('pointerdown', onDown);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n target.removeEventListener('pointerleave', onLeave);\n target.removeEventListener('wheel', onWheel);\n }\n };\n}\n", "// Canvas sizing.\n//\n// size: 'canvas' (default when you pass a canvas) bitmap follows the canvas's CSS box \u2014 style it\n// however you like (width:100%; height:60vh \u2026) and ShaderMate keeps up.\n// size: 'window' (default when no canvas is given) fixed full-window canvas.\n// size: [w, h] fixed internal resolution; CSS box is yours, `fit` decides how it's shown.\n//\n// pixelRatio: 'auto' (default, capped by maxPixelRatio = 2) | number\n// scale: 1 extra render-scale multiplier (0.5 = render at half res, cheap on big heroes)\n// aspect: 16/9 | '16:9' | [16, 9] lock the bitmap aspect; shown with object-fit\n// fit: 'contain' | 'cover' | 'fill' how a fixed/aspect-locked bitmap fills its CSS box\n\nfunction parseAspect(a) {\n if (!a) return 0;\n if (typeof a === 'number') return a;\n if (Array.isArray(a)) return a[0] / a[1];\n if (typeof a === 'string') {\n const m = a.split(/[:/x]/).map(Number);\n return m.length === 2 && m[1] ? m[0] / m[1] : Number(a) || 0;\n }\n return 0;\n}\n\nexport function parseSizing(options = {}, hasCanvas = true) {\n const s = options.size ?? options.sizing;\n const cfg = {\n mode: hasCanvas ? 'canvas' : 'window',\n width: 0, height: 0,\n aspect: parseAspect(options.aspect),\n fit: options.fit || 'contain',\n pixelRatio: options.pixelRatio ?? options.dpr ?? 'auto',\n maxPixelRatio: options.maxPixelRatio ?? 2,\n scale: options.scale ?? options.renderScale ?? 1,\n };\n if (Array.isArray(s)) { cfg.mode = 'fixed'; cfg.width = s[0]; cfg.height = s[1]; }\n else if (typeof s === 'string') cfg.mode = s === 'screen' || s === 'fullscreen' ? 'window' : s === 'element' ? 'canvas' : s;\n else if (s && typeof s === 'object') { cfg.mode = 'fixed'; cfg.width = s.width; cfg.height = s.height; if (s.fit) cfg.fit = s.fit; }\n if (cfg.mode === 'fixed') cfg.aspect = cfg.width / cfg.height;\n return cfg;\n}\n\nexport function createSizer(canvas, options = {}, hasCanvas = true) {\n const cfg = parseSizing(options, hasCanvas);\n const ratio = () => (cfg.pixelRatio === 'auto'\n ? Math.min(window.devicePixelRatio || 1, cfg.maxPixelRatio)\n : (Number(cfg.pixelRatio) || 1));\n let styled = false;\n\n function cssBox() {\n if (cfg.mode === 'window') return { w: window.innerWidth, h: window.innerHeight };\n return { w: canvas.clientWidth || window.innerWidth, h: canvas.clientHeight || window.innerHeight };\n }\n\n function measure() {\n if (cfg.mode === 'fixed') return { w: cfg.width, h: cfg.height };\n const box = cssBox();\n const k = ratio() * cfg.scale;\n let w = box.w, h = box.h;\n if (cfg.aspect) {\n if (w / h > cfg.aspect) w = h * cfg.aspect; else h = w / cfg.aspect;\n }\n return { w: w * k, h: h * k };\n }\n\n function applyStyle() {\n if (styled) return;\n styled = true;\n if (cfg.mode === 'window') {\n canvas.style.cssText += ';display:block;position:fixed;left:0;top:0;width:100%;height:100%;';\n }\n if (cfg.mode === 'fixed' || cfg.aspect) canvas.style.objectFit = cfg.fit;\n }\n\n return {\n cfg,\n /** 'contain' | 'cover' | 'fill' as currently applied (for pointer mapping). */\n fit: () => ((cfg.mode === 'fixed' || cfg.aspect) ? cfg.fit : 'fill'),\n setFixed(w, h) { cfg.mode = 'fixed'; cfg.width = w; cfg.height = h; cfg.aspect = w / h; styled = false; },\n /** Recompute; returns true when the bitmap size changed. */\n update() {\n applyStyle();\n const m = measure();\n const w = Math.max(1, Math.round(m.w)), h = Math.max(1, Math.round(m.h));\n if (canvas.width === w && canvas.height === h) return false;\n canvas.width = w;\n canvas.height = h;\n return true;\n },\n /** Call `fn` on window resize / canvas box changes. Returns a disposer. */\n observe(fn) {\n let pending = false;\n const schedule = () => {\n if (pending) return;\n pending = true;\n requestAnimationFrame(() => { pending = false; fn(); });\n };\n window.addEventListener('resize', schedule);\n let ro = null;\n if (cfg.mode === 'canvas' && typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(schedule);\n ro.observe(canvas);\n }\n return () => { window.removeEventListener('resize', schedule); if (ro) ro.disconnect(); };\n }\n };\n}\n", "/**\n * Tracks whether rendering is worthwhile: tab visible AND canvas in (or near) the viewport.\n * Saves battery on long pages with a hero at the top.\n */\nexport function createVisibility(canvas, { enabled = true, margin = '100px', onChange } = {}) {\n let tabVisible = typeof document === 'undefined' ? true : !document.hidden;\n let inView = true;\n const notify = () => onChange && onChange(tabVisible && inView);\n\n const onVis = () => { tabVisible = !document.hidden; notify(); };\n let io = null;\n if (enabled) {\n document.addEventListener('visibilitychange', onVis);\n if (typeof IntersectionObserver !== 'undefined') {\n io = new IntersectionObserver(entries => {\n for (const e of entries) inView = e.isIntersecting;\n notify();\n }, { rootMargin: margin });\n io.observe(canvas);\n }\n }\n return {\n get visible() { return tabVisible && inView; },\n dispose() {\n if (enabled) document.removeEventListener('visibilitychange', onVis);\n if (io) io.disconnect();\n }\n };\n}\n", "// Shared look for ShaderMate's own UI (stats overlay, error overlay, GUI addon).\n// Dark editor palette: VS Code \"Dark Modern\" tones. Override per instance with options.theme.\nexport const DEFAULT_THEME = {\n font: '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n mono: '\"Geist Mono\", ui-monospace, \"SF Mono\", Menlo, Consolas, monospace',\n bg: '#1f1f1f',\n bgAlt: '#181818',\n raised: '#2a2d2e',\n hover: '#37373d',\n border: '#3c3c3c',\n text: '#cccccc',\n textStrong: '#ececec',\n label: '#9d9d9d',\n accent: '#4daafc',\n number: '#4daafc',\n string: '#d1977f',\n red: '#e46962',\n redSoft: '#4e3534',\n redText: '#f9dedc',\n radius: '8px',\n shadow: '0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)',\n};\n\nexport function resolveTheme(t) {\n return Object.assign({}, DEFAULT_THEME, t && typeof t === 'object' ? t : null);\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Stats overlay (FPS, frame time, CPU time, frame count, resolution).\n * Nothing is installed unless you ask: stats: true (visible) | 'key' (hidden until the key is pressed).\n */\nexport function createStats({ visible = false, key = 'F1', position = 'top-left', theme } = {}) {\n const T = resolveTheme(theme);\n const el = document.createElement('div');\n const [v, h] = position.split('-');\n el.style.cssText =\n `position:fixed;${v === 'bottom' ? 'bottom' : 'top'}:12px;${h === 'right' ? 'right' : 'left'}:12px;` +\n `z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${T.border};border-radius:${T.radius};` +\n `background:${T.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${T.shadow};` +\n `color:${T.text};font:12px/1.5 ${T.mono};pointer-events:none;display:none`;\n document.body.appendChild(el);\n\n const row = (label, value) =>\n `<div style=\"display:flex;justify-content:space-between;gap:14px\"><span style=\"color:${T.label}\">${label}</span><span style=\"color:${T.textStrong}\">${value}</span></div>`;\n\n let shown = false;\n let accDt = 0, accCpu = 0, n = 0, lastDom = 0;\n\n function show(on = true) {\n shown = !!on;\n el.style.display = shown ? 'block' : 'none';\n accDt = accCpu = n = 0;\n }\n const toggle = () => show(!shown);\n const onKey = e => { if (e.key === key) { e.preventDefault(); toggle(); } };\n if (key) window.addEventListener('keydown', onKey);\n show(visible);\n\n return {\n show, toggle,\n isVisible: () => shown,\n update(info) {\n if (!shown) return;\n accDt += info.rawDt; accCpu += info.cpuMs; n++;\n const now = performance.now();\n if (now - lastDom < 250) return;\n lastDom = now;\n const ms = (accDt / n) * 1000;\n el.innerHTML =\n `<div style=\"display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px\"><b style=\"color:${T.accent};font-size:16px;font-weight:600\">${(1000 / ms).toFixed(0)}<span style=\"font-size:11px;color:${T.label};font-weight:400\"> fps</span></b><span style=\"color:${T.label}\">${ms.toFixed(1)} ms</span></div>` +\n row('cpu', (accCpu / n).toFixed(2) + ' ms') +\n row('frame', info.frame) +\n row('time', info.time.toFixed(2) + ' s') +\n row('size', `${info.width}\u00D7${info.height}`) +\n row('passes', info.passes);\n accDt = accCpu = n = 0;\n },\n dispose() {\n if (key) window.removeEventListener('keydown', onKey);\n el.remove();\n }\n };\n}\n", "import { resolveTheme } from './theme.js';\n\n/**\n * Compile-error overlay drawn over the canvas (dev aid). Enabled by default on localhost\n * (errorOverlay: 'auto'); set errorOverlay: true/false to force.\n */\nexport function createErrorOverlay(canvas, theme) {\n const T = resolveTheme(theme);\n let el = null;\n\n function place() {\n if (!el) return;\n const r = canvas.getBoundingClientRect();\n Object.assign(el.style, { left: r.left + 'px', top: r.top + 'px', width: r.width + 'px', height: r.height + 'px' });\n }\n const esc = s => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;');\n\n return {\n show(err) {\n if (!el) {\n el = document.createElement('div');\n el.style.cssText =\n 'position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;' +\n `background:${T.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${T.text};font:13px/1.55 ${T.font}`;\n document.body.appendChild(el);\n window.addEventListener('resize', place);\n }\n const errors = err.errors || [];\n const title = esc(err.message.split('\\n')[0]);\n let body = '';\n if (errors.length) {\n body = errors.map(e =>\n `<div style=\"display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};margin-bottom:8px\">` +\n `<span style=\"color:${T.red};font-family:${T.mono};font-size:12px\">line ${e.line}</span><span style=\"color:${T.textStrong}\">${esc(e.message)}</span>` +\n `<span></span><code style=\"color:${T.label};font-family:${T.mono};font-size:12px;white-space:pre-wrap\">${esc(e.source.trim())}</code></div>`).join('');\n } else if (err.log) {\n body = `<pre style=\"margin:0;padding:10px 12px;border:1px solid ${T.border};border-radius:${T.radius};background:${T.bg};color:${T.label};font:12px/1.5 ${T.mono};white-space:pre-wrap\">${esc(err.log)}</pre>`;\n }\n el.innerHTML =\n `<div style=\"display:flex;align-items:center;gap:10px;margin-bottom:12px\">` +\n `<span style=\"display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${T.redSoft};color:${T.redText};font-size:11.5px;font-weight:500\">Shader error</span>` +\n `<b style=\"color:${T.textStrong};font-weight:600\">${title}</b></div>` + body;\n el.style.display = 'block';\n place();\n },\n hide() { if (el) el.style.display = 'none'; },\n dispose() { if (el) { el.remove(); window.removeEventListener('resize', place); el = null; } }\n };\n}\n", "/**\n * Screenshots and video capture. `renderNow()` draws a fresh frame synchronously, so these\n * work without preserveDrawingBuffer (the pixels are read in the same task as the draw).\n */\nexport function createCapture(canvas, renderNow) {\n function screenshot(type = 'image/png', quality) {\n renderNow();\n return canvas.toDataURL(type, quality);\n }\n\n function toBlob(type = 'image/png', quality) {\n renderNow();\n return new Promise((res, rej) => canvas.toBlob(b => (b ? res(b) : rej(new Error('toBlob failed'))), type, quality));\n }\n\n async function download(filename = 'shadermate.png', type, quality) {\n if (!type) type = /\\.jpe?g$/i.test(filename) ? 'image/jpeg' : /\\.webp$/i.test(filename) ? 'image/webp' : 'image/png';\n const blob = await toBlob(type, quality);\n saveBlob(blob, filename);\n }\n\n /**\n * Record the canvas to a WebM (or whatever the browser supports).\n * const rec = sm.record({ fps: 60 }); \u2026 const blob = await rec.stop();\n * await sm.record({ duration: 5000, download: 'loop.webm' });\n */\n function record({ fps = 60, mimeType, bitsPerSecond = 8_000_000, duration = 0, download: dl } = {}) {\n if (typeof MediaRecorder === 'undefined' || !canvas.captureStream) throw new Error('MediaRecorder not supported');\n const stream = canvas.captureStream(fps);\n const type = mimeType || ['video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm', 'video/mp4']\n .find(t => MediaRecorder.isTypeSupported(t)) || '';\n const rec = new MediaRecorder(stream, { mimeType: type || undefined, videoBitsPerSecond: bitsPerSecond });\n const chunks = [];\n rec.ondataavailable = e => { if (e.data.size) chunks.push(e.data); };\n const done = new Promise(res => { rec.onstop = () => res(new Blob(chunks, { type: rec.mimeType })); });\n rec.start(100);\n\n const handle = {\n recorder: rec,\n stop() { if (rec.state !== 'inactive') rec.stop(); stream.getTracks().forEach(t => t.stop()); return done; },\n done\n };\n if (duration > 0) {\n const finished = new Promise(res => setTimeout(() => res(handle.stop()), duration));\n if (dl) return finished.then(blob => { saveBlob(blob, typeof dl === 'string' ? dl : 'shadermate.webm'); return blob; });\n return finished;\n }\n return handle;\n }\n\n return { screenshot, toBlob, download, record };\n}\n\nexport function saveBlob(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n", "import { MAX_CHANNELS, DEFAULT_CANVAS_ID, VERSION } from '../constants.js';\nimport { ShaderMateError, toArray, warnOnce, isBrowser, parseColor, isDevHost } from '../utils/util.js';\nimport { RefPool } from './RefPool.js';\nimport { createEmitter } from './events.js';\nimport { createTweens } from './tween.js';\nimport { normalizePasses, normalizeChannel, isInlineSource } from './passes.js';\nimport { createContext, getExtensions, isWebGL2 } from '../gl/context.js';\nimport { createQuad } from '../gl/quad.js';\nimport { createBlit } from '../gl/blit.js';\nimport { createProgram, getUniformInfo } from '../gl/shader.js';\nimport { createTarget, deleteTarget, resolvePassSize } from '../gl/targets.js';\nimport { VERT_GL1, VERT_GL2 } from '../glsl/templates.js';\nimport { resolveIncludes, assembleFragment, DEFAULT_INJECT, NO_INJECT } from '../glsl/preprocess.js';\nimport { loadChannel, channelSamplerType } from '../loaders/index.js';\nimport { splitPassBlob, parseUniformComments, usesMouseVec4 } from '../glsl/fragcoord.js';\nimport { looksLikeFragCoord } from '../glsl/builtins.js';\nimport { resolveSamplerSpecs, needsMainBackbuffer, auxPasses } from './samplers.js';\nimport { createCamera } from '../input/camera.js';\nimport { applyUniformMap, isUniformSpec } from '../uniforms/apply.js';\nimport { GL_FLOAT, GL_FLOAT_VEC4, GL_FLOAT_VEC2 } from '../uniforms/types.js';\nimport { createPointer } from '../input/pointer.js';\nimport { createSizer } from '../view/sizing.js';\nimport { createVisibility } from '../view/visibility.js';\nimport { createStats } from '../ui/stats.js';\nimport { createErrorOverlay } from '../ui/errorOverlay.js';\nimport { createCapture } from '../capture/capture.js';\n\n/** Accepts create(options) or create(shaderOrPasses, options). */\nfunction normalizeArgs(a, b) {\n if (typeof a === 'string' || Array.isArray(a)) return { ...(b || {}), passes: a };\n if (a && typeof a === 'object' && (a.shader != null || a.passes != null || a.src != null)) {\n const o = { ...a };\n // Single-shader form: per-pass fields written at the top level belong to that one pass.\n if (o.passes == null) o.passes = { src: o.shader ?? o.src, uniforms: o.passUniforms, channels: o.channels, pingpong: o.pingpong, float: o.float };\n else if (o.channels != null) console.warn('[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead.');\n return o;\n }\n throw new ShaderMateError('createShader: pass a shader string, an array of passes, or { shader | passes, ...options }');\n}\n\nfunction resolveCanvas(c) {\n if (c && typeof c === 'object' && typeof c.getContext === 'function') return { canvas: c, given: true };\n if (typeof c === 'string') {\n let el = document.getElementById(c);\n if (!el) { try { el = document.querySelector(c); } catch { /* invalid selector */ } }\n if (!el) throw new ShaderMateError(`Canvas not found: \"${c}\"`);\n return { canvas: el, given: true };\n }\n let el = document.getElementById(DEFAULT_CANVAS_ID);\n if (el) return { canvas: el, given: true };\n el = document.createElement('canvas');\n el.id = DEFAULT_CANVAS_ID;\n (document.body || document.documentElement).appendChild(el);\n return { canvas: el, given: false };\n}\n\nfunction setUniformIn(map, name, value) {\n const cur = map[name];\n if (isUniformSpec(cur)) cur.value = value;\n else map[name] = value;\n}\nconst readUniform = (map, name) => (isUniformSpec(map[name]) ? map[name].value : map[name]);\n\n/**\n * Create a ShaderMate instance. Returns synchronously; shaders and textures load in the\n * background. `await sm.ready` to know when the first frame can render.\n */\nexport function createShader(a, b) {\n if (!isBrowser) throw new ShaderMateError('ShaderMate needs a browser environment (window/document).');\n const options = normalizeArgs(a, b);\n\n // ---- options ---------------------------------------------------------\n const autoSetup = options.autoSetup !== false;\n const inject = Object.assign({}, autoSetup ? DEFAULT_INJECT : NO_INJECT, options.inject);\n const globalDefines = toArray(options.defines);\n let commonSrc = typeof options.common === 'string' ? options.common : '';\n const dialect = options.dialect || 'auto'; // 'auto' | 'fragcoord' | 'shadertoy' | 'shadermate'\n const instanceSamplers = options.samplers || {};\n const uniforms = options.uniforms || {}; // instance-wide, live\n const includeStore = options.includes || {};\n const strictUniforms = !!options.strictUniforms;\n const warnUniforms = options.warnMissingUniforms !== false;\n const showExpanded = options.showExpandedOnError !== false;\n const useOverlay = options.errorOverlay === undefined || options.errorOverlay === 'auto' ? isDevHost() : !!options.errorOverlay;\n\n // ---- context ---------------------------------------------------------\n let canvas, givenCanvas, gl;\n if (options.gl) {\n gl = options.gl; canvas = gl.canvas; givenCanvas = true;\n } else {\n ({ canvas, given: givenCanvas } = resolveCanvas(options.canvas));\n gl = createContext(canvas, options);\n }\n const isGL2 = isWebGL2(gl);\n const ext = getExtensions(gl, isGL2);\n const env = { isGL2, ext };\n const pool = new RefPool(gl);\n const enableDerivatives = !!(isGL2 || ext.OES_standard_derivatives);\n const bg = parseColor(options.background ?? options.clearColor) || [0, 0, 0, 0];\n gl.clearColor(bg[0], bg[1], bg[2], bg[3]);\n\n const emitter = createEmitter();\n const { emit, on, off, once } = emitter;\n const quad = createQuad(gl);\n const sizer = createSizer(canvas, options, givenCanvas);\n const pointer = createPointer(canvas, sizer.fit, options.pointer === false ? { target: 'canvas', smooth: 0 } : (typeof options.pointer === 'object' ? options.pointer : {}));\n const tweens = createTweens();\n const overlay = useOverlay ? createErrorOverlay(canvas, options.theme) : null;\n let stats = null;\n if (options.stats) {\n stats = createStats({\n visible: options.stats === true || options.stats === 'visible',\n key: options.statsKey === undefined ? 'F1' : options.statsKey,\n position: options.statsPosition,\n theme: options.theme,\n });\n }\n\n // ---- state -----------------------------------------------------------\n const passObjs = [];\n const byName = new Map();\n let PASSES = [];\n let disposed = false;\n let loaded = false;\n let rafId = null;\n let removeResize = () => { };\n let last = performance.now();\n let lastRender = 0;\n let frame = 0;\n let time = options.time || 0;\n let playing = options.autoplay !== false && !options.startPaused && !options.paused;\n let timeScale = options.timeScale ?? 1;\n let fixedDelta = options.fixedDelta || 0;\n let maxFps = options.maxFps || options.fps || 0;\n let loopLen = options.loop || 0;\n const maxDelta = options.maxDelta ?? 0.1;\n let visible = true;\n let lastError = null;\n let refreshRate = 60; // estimated display refresh rate (median of recent rAF intervals)\n const rafDts = [];\n let camera = null; // fly camera, created when a pass uses u_camera_*\n let blit = null; // copies the screen pass' buffer to the canvas when u_main is sampled\n let mainBackbuffer = false;\n\n const visibility = createVisibility(canvas, {\n enabled: options.pauseWhenHidden !== false,\n onChange: v => { visible = v; if (v) last = performance.now(); emit('visibility', v); }\n });\n\n // ---- helpers ---------------------------------------------------------\n function reportError(err) {\n lastError = err;\n if (overlay) overlay.show(err);\n emit('error', err);\n if (options.onError) options.onError(err);\n }\n function clearError() {\n lastError = null;\n if (overlay) overlay.hide();\n }\n\n const loadText = async path => {\n const r = await fetch(path);\n if (!r.ok) throw new ShaderMateError(`Failed to fetch ${path}: ${r.status} ${r.statusText}`);\n return r.text();\n };\n const includeLoader = async path => (includeStore[path] != null ? includeStore[path] : loadText(path));\n\n let commonText = null;\n async function getCommon() {\n if (commonText !== null) return commonText;\n if (!commonSrc) return (commonText = '');\n const raw = isInlineSource(commonSrc) ? commonSrc : await loadText(commonSrc);\n const parsed = parseUniformComments(raw); // Common may declare annotated uniforms too\n for (const n in parsed.uniforms) if (!(n in uniforms)) uniforms[n] = parsed.uniforms[n];\n Object.assign(instanceSamplers, parsed.samplers, instanceSamplers);\n return (commonText = parsed.source);\n }\n\n /** Fetch (if needed), preprocess and compile a pass' fragment shader. */\n async function buildProgram(pass, src, allPasses = PASSES) {\n let text = isInlineSource(src) ? src : await loadText(src);\n const common = await getCommon();\n\n // FragCoord.xyz annotations: `uniform float u_x = 0.5; //[0, 1]`, `uniform sampler2D u_tex; //https://\u2026`\n const parsed = parseUniformComments(text);\n text = parsed.source;\n for (const n in parsed.uniforms) if (!(n in pass.uniforms) && !(n in uniforms)) pass.uniforms[n] = parsed.uniforms[n];\n pass.annotatedSamplers = parsed.samplers;\n\n const full = common ? common + '\\n#line 1\\n' + text : text;\n const expanded = await resolveIncludes(full, { loader: includeLoader });\n\n const fc = dialect === 'fragcoord' || (dialect === 'auto' && looksLikeFragCoord(expanded));\n const samplerNames = [];\n const aux = allPasses.filter(p => !p.screen);\n allPasses.forEach(p => samplerNames.push('u_' + p.name));\n aux.forEach((p, i) => { const n = 'u_pass' + (i + 1); if (!samplerNames.includes(n)) samplerNames.push(n); });\n\n const frag = assembleFragment(expanded, {\n isGL2,\n defines: [...globalDefines, ...toArray(pass.defines)],\n enableDerivatives,\n inject,\n channelTypes: pass.channels.map(channelSamplerType),\n builtinOpts: {\n fragcoord: fc,\n mouseVec4: fc || dialect === 'fragcoord' || usesMouseVec4(expanded),\n scrollFloat: fc || dialect === 'fragcoord',\n samplerNames,\n passCount: aux.length,\n },\n });\n const r = createProgram(gl, isGL2 ? VERT_GL2 : VERT_GL1, frag, { label: pass.name, showExpandedOnError: showExpanded });\n if (r.error) throw r.error;\n return { program: r.program, source: text, compiled: frag, fragcoord: fc };\n }\n\n function resizeTargets() {\n for (const po of passObjs) {\n const cfg = po.cfg;\n if (cfg.screen && !mainBackbuffer) continue;\n const [w, h] = cfg.screen ? [canvas.width, canvas.height] : resolvePassSize(cfg.size, canvas.width, canvas.height);\n if (po.target && po.target.width === w && po.target.height === h) continue;\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.target = createTarget(gl, pool, w, h, cfg, isGL2, ext);\n po.targetPrev = (cfg.pingpong || (cfg.screen && mainBackbuffer)) ? createTarget(gl, pool, w, h, cfg, isGL2, ext) : null;\n }\n }\n\n function handleResize() {\n if (disposed) return;\n if (sizer.update()) {\n gl.viewport(0, 0, canvas.width, canvas.height);\n resizeTargets();\n emit('resize', { width: canvas.width, height: canvas.height });\n if (!playing && loaded) renderNow(); // keep a paused canvas crisp\n }\n }\n\n async function loadPassChannels(po) {\n await Promise.all(po.cfg.channels.map(async (ch, i) => {\n if (!ch || ch.pass != null) return;\n try {\n po.texChannels[i] = await loadChannel(gl, pool, ch, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" channel ${i}: ${e.message}`);\n emit('error', e);\n }\n }));\n // named samplers (u_pass1, u_blur, u_main, u_audio, annotated URLs \u2026)\n po.samplers = resolveSamplerSpecs(po, passObjs, instanceSamplers);\n await Promise.all(po.samplers.map(async s => {\n if (s.spec.pass != null || s.spec.array) return;\n try {\n s.wrap = await loadChannel(gl, pool, s.spec, env);\n } catch (e) {\n console.warn(`[ShaderMate] Pass \"${po.name}\" sampler ${s.name}: ${e.message}`);\n emit('error', e);\n }\n }));\n }\n\n // ---- build -----------------------------------------------------------\n /** A pasted FragCoord.xyz multi-pass blob (`// Pass 1` \u2026 `// Main`) becomes a pass list. */\n function expandPassBlob(input) {\n if (typeof input !== 'string' || !isInlineSource(input)) return input;\n const blob = splitPassBlob(input);\n if (!blob) return input;\n if (blob.common) commonSrc = commonSrc ? commonSrc + '\\n' + blob.common : blob.common;\n const unsupported = blob.passes.find(p => p.bufferType !== '2d');\n if (unsupported) throw new ShaderMateError(`Pass \"${unsupported.label}\" uses a ${unsupported.bufferType} buffer; ShaderMate supports 2D buffers only.`);\n const passes = blob.passes.map(p => p.main\n ? { name: 'main', shader: p.src, screen: true }\n : { name: p.name, shader: p.src, pingpong: true, float: true }); // aux passes keep history (feedback) like FragCoord\n if (!passes.some(p => p.screen)) passes[passes.length - 1].screen = true;\n return passes;\n }\n\n async function build() {\n PASSES = normalizePasses(expandPassBlob(options.passes));\n for (const p of PASSES) if (p.iterations > 1 && !p.screen) p.pingpong = true; // recursion reads the previous iteration\n for (let i = 0; i < PASSES.length; i++) {\n const pass = PASSES[i];\n const { program, source, compiled, fragcoord } = await buildProgram(pass, pass.src);\n if (disposed) { gl.deleteProgram(program); return; }\n const po = {\n cfg: pass, name: pass.name, index: i,\n programId: pool.add(program, 'program'),\n uniformInfo: getUniformInfo(gl, program),\n source, compiled, fragcoord,\n target: null, targetPrev: null,\n texChannels: new Array(MAX_CHANNELS).fill(null),\n samplers: [],\n };\n passObjs.push(po);\n byName.set(po.name, po);\n }\n await Promise.all(passObjs.map(loadPassChannels));\n if (disposed) return;\n mainBackbuffer = needsMainBackbuffer(passObjs);\n if (mainBackbuffer && !blit) blit = createBlit(gl, isGL2, quad);\n if (!camera && passObjs.some(po => po.uniformInfo.u_camera_pos || po.uniformInfo.u_camera_dir || po.uniformInfo.u_camera_view)) {\n camera = createCamera(canvas, typeof options.camera === 'object' ? options.camera : {});\n }\n resizeTargets();\n }\n\n // ---- frame -----------------------------------------------------------\n /** Texture of another pass as seen from `po` (previous frame when reading itself / a later pass). */\n function passTexture(po, src, buffer) {\n let t = null;\n if (src.targetPrev) {\n const prev = buffer === 'prev' || (buffer !== 'current' && src.index >= po.index);\n t = prev ? src.targetPrev : src.target;\n } else if (src === po) {\n warnOnce('self:' + po.name, `Pass \"${po.name}\" reads its own output; add pingpong: true.`);\n } else if (src.cfg.screen) {\n warnOnce('screen:' + src.name, `Pass \"${po.name}\" can't read screen pass \"${src.name}\" (it has no texture).`);\n } else t = src.target;\n return t;\n }\n\n function drawPass(po, f, iteration = 0) {\n const cfg = po.cfg;\n const program = pool.get(po.programId);\n const u = po.uniformInfo;\n const m = pointer.state;\n const set1f = (n, v) => { const i = u[n]; if (i) gl.uniform1f(i.loc, v); };\n const set1i = (n, v) => { const i = u[n]; if (i) gl.uniform1i(i.loc, v); };\n\n if (po.targetPrev) { const t = po.targetPrev; po.targetPrev = po.target; po.target = t; }\n\n let rw, rh;\n if (cfg.screen && !mainBackbuffer) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n rw = canvas.width; rh = canvas.height;\n } else {\n gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n rw = po.target.width; rh = po.target.height;\n }\n const k = cfg.screen ? 1 : rw / canvas.width; // mouse in this pass' pixel space\n const ky = cfg.screen ? 1 : rh / canvas.height;\n gl.viewport(0, 0, rw, rh);\n gl.useProgram(program);\n gl.clear(gl.COLOR_BUFFER_BIT | (po.target && po.target.depthId ? gl.DEPTH_BUFFER_BIT : 0));\n\n // built-ins\n set1f('iTime', f.time); set1f('u_time', f.time);\n set1f('iTimeDelta', f.dt); set1f('u_delta', f.dt); set1f('u_time_delta', f.dt);\n set1i('iFrame', f.frame); set1i('u_frame', f.frame);\n set1f('iFrameRate', f.fps); set1f('u_fps', f.fps); set1f('u_refresh_rate', f.refreshRate);\n set1f('iSampleRate', 44100);\n if (u.iResolution) gl.uniform3f(u.iResolution.loc, rw, rh, 1);\n if (u.u_resolution) gl.uniform2f(u.u_resolution.loc, rw, rh);\n set1f('u_aspect', rw / rh);\n set1f('u_pixelRatio', f.dpr);\n if (u.iDate) gl.uniform4fv(u.iDate.loc, f.date);\n if (u.u_date) gl.uniform4fv(u.u_date.loc, f.date);\n if (u.iScroll) gl.uniform2f(u.iScroll.loc, f.scrollX, f.scrollY);\n if (u.u_scroll) {\n // vec2 = page scroll (ShaderMate); float = mouse-wheel accumulator (FragCoord.xyz convention)\n if (u.u_scroll.type === GL_FLOAT) gl.uniform1f(u.u_scroll.loc, m.wheel); else gl.uniform2f(u.u_scroll.loc, f.scrollX, f.scrollY);\n }\n set1f('u_wheel', m.wheel);\n if (u.u_drag) gl.uniform2f(u.u_drag.loc, m.dragX * k, m.dragY * ky);\n set1i('u_recursion', iteration);\n set1i('u_max_recursion', cfg.iterations || 1);\n set1i('u_color_gamut', 0);\n if (camera) {\n if (u.u_camera_pos) gl.uniform3fv(u.u_camera_pos.loc, camera.pos);\n if (u.u_camera_dir) gl.uniform3fv(u.u_camera_dir.loc, camera.dir);\n if (u.u_camera_view) gl.uniformMatrix4fv(u.u_camera_view.loc, false, camera.view);\n }\n if (u.iMouse) {\n // ShaderToy semantics: z > 0 while the button is held, w > 0 only on the frame of the click; both carry |click pos| otherwise\n const sz = m.down ? 1 : -1, sw = m.clicked ? 1 : -1;\n gl.uniform4f(u.iMouse.loc, m.x * k, m.y * ky, m.clickX * k * sz, m.clickY * ky * sw);\n }\n if (u.u_mouse) {\n // vec2 = position; vec4 = position + click position, zw negative while the button is up (FragCoord.xyz convention)\n if (u.u_mouse.type === GL_FLOAT_VEC4) { const s = m.down ? 1 : -1; gl.uniform4f(u.u_mouse.loc, m.x * k, m.y * ky, m.clickX * k * s, m.clickY * ky * s); }\n else gl.uniform2f(u.u_mouse.loc, m.x * k, m.y * ky);\n }\n if (u.u_mouseUV) gl.uniform2f(u.u_mouseUV.loc, m.uvX, m.uvY);\n set1f('u_mouseDown', m.down ? 1 : 0);\n\n // channels\n const chTimes = [0, 0, 0, 0];\n const chRes = new Float32Array(12);\n for (let i = 0; i < MAX_CHANNELS; i++) {\n const ch = cfg.channels[i];\n if (!ch) continue;\n let texObj = null, w = 0, h = 0, isCube = false, chTime = f.time;\n\n if (ch.pass != null) {\n const src = byName.get(ch.pass);\n const t = src ? passTexture(po, src, ch.buffer) : null;\n if (t) { texObj = pool.get(t.texId); w = t.width; h = t.height; }\n } else {\n const wrap = po.texChannels[i];\n if (wrap) {\n texObj = pool.get(wrap.texId); w = wrap.width; h = wrap.height; isCube = !!wrap.cubemap;\n if (wrap.getTime) chTime = wrap.getTime();\n }\n }\n if (texObj) {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, texObj);\n set1i('iChannel' + i, i);\n chTimes[i] = chTime;\n chRes[i * 3] = w; chRes[i * 3 + 1] = h; chRes[i * 3 + 2] = 1;\n }\n }\n if (u.iChannelTime) (u.iChannelTime.type === GL_FLOAT_VEC4 ? gl.uniform4fv : gl.uniform1fv).call(gl, u.iChannelTime.loc, chTimes);\n if (u.iChannelResolution) gl.uniform3fv(u.iChannelResolution.loc, chRes);\n\n // named samplers on texture units after the four iChannels\n let unit = MAX_CHANNELS;\n for (const s of po.samplers) {\n const bindTex = (tex, isCube) => { gl.activeTexture(gl.TEXTURE0 + unit); gl.bindTexture(isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D, tex); return unit++; };\n if (s.spec.array) {\n const units = s.spec.array.map(src => { const t = passTexture(po, src, s.spec.buffer); return t ? bindTex(pool.get(t.texId), false) : 0; });\n gl.uniform1iv(s.info.loc, units);\n } else if (s.spec.pass != null) {\n const src = byName.get(s.spec.pass);\n const t = src ? passTexture(po, src, s.spec.buffer) : null;\n if (t) gl.uniform1i(s.info.loc, bindTex(pool.get(t.texId), false));\n } else if (s.wrap) {\n gl.uniform1i(s.info.loc, bindTex(pool.get(s.wrap.texId), !!s.wrap.cubemap));\n if (s.wrap.getTime) set1f(s.name + '_time', s.wrap.getTime()); // FragCoord: companion <name>_time for video\n const res = u[s.name + '_resolution']; if (res) gl.uniform2f(res.loc, s.wrap.width, s.wrap.height);\n }\n }\n\n // user uniforms: instance-wide first, then per-pass overrides\n applyUniformMap(gl, u, uniforms, { strict: false });\n applyUniformMap(gl, u, cfg.uniforms, { strict: strictUniforms, warnMissing: warnUniforms, label: po.name });\n\n quad.bind(program);\n quad.draw();\n }\n\n /** Advance the clock (if playing/forced) and draw every pass. */\n function frameStep(now, { advance = playing, rawDt } = {}) {\n const t0 = performance.now();\n if (rawDt === undefined) rawDt = Math.max(0, (now - last) * 0.001);\n last = now;\n if (rawDt > 0.002 && rawDt < 0.1) { rafDts.push(rawDt); if (rafDts.length > 30) rafDts.shift(); if (rafDts.length >= 10) { const s = [...rafDts].sort((a, b) => a - b); refreshRate = Math.round(1 / s[s.length >> 1]); } }\n let dt = fixedDelta > 0 ? fixedDelta : Math.min(rawDt, maxDelta);\n if (advance) {\n time += dt * timeScale;\n if (loopLen > 0) time = ((time % loopLen) + loopLen) % loopLen;\n } else dt = 0;\n frame++;\n const fps = rawDt > 0 ? 1 / rawDt : 0;\n tweens.update(now);\n pointer.update();\n\n const info = { time, frame, dt, fps };\n emit('beforeFrame', info);\n if (options.onFrame) options.onFrame(info);\n\n const d = new Date();\n const f = {\n time, frame, dt, fps,\n dpr: window.devicePixelRatio || 1,\n date: [d.getFullYear(), d.getMonth() + 1, d.getDate(), d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds() + d.getMilliseconds() / 1000],\n scrollX: window.scrollX || 0, scrollY: window.scrollY || 0,\n refreshRate,\n };\n\n if (camera) camera.update(rawDt);\n for (const po of passObjs) {\n for (const w of po.texChannels) if (w && w.update) w.update();\n for (const s of po.samplers) if (s.wrap && s.wrap.update) s.wrap.update();\n }\n for (const po of passObjs) {\n const n = Math.max(1, po.cfg.iterations | 0);\n for (let i = 0; i < n; i++) drawPass(po, f, i);\n if (po.cfg.screen && mainBackbuffer && blit) blit.draw(pool.get(po.target.texId), canvas.width, canvas.height);\n }\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n emit('afterFrame', info);\n if (stats) stats.update({ rawDt, cpuMs: performance.now() - t0, frame, time, width: canvas.width, height: canvas.height, passes: passObjs.length });\n }\n\n function loop(now) {\n rafId = requestAnimationFrame(loop);\n if (!loaded || !visible) { last = now; return; }\n if (!playing && tweens.size === 0 && options.renderWhilePaused !== true) { last = now; return; }\n if (maxFps > 0 && now - lastRender < 1000 / maxFps - 0.5) return;\n lastRender = now;\n frameStep(now);\n }\n\n /** Draw one frame right now without advancing time (used by screenshots, resize while paused\u2026). */\n function renderNow() {\n if (!loaded || disposed) return;\n frameStep(performance.now(), { advance: false, rawDt: 0 });\n }\n\n // ---- lifecycle -------------------------------------------------------\n function startLoop() {\n if (disposed || rafId != null) return;\n last = performance.now();\n rafId = requestAnimationFrame(loop);\n }\n function stopLoop() {\n if (rafId != null) cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n function destroy() {\n if (disposed) return;\n disposed = true;\n stopLoop();\n removeResize();\n pointer.dispose();\n visibility.dispose();\n tweens.cancel();\n if (stats) stats.dispose();\n if (overlay) overlay.dispose();\n if (camera) camera.dispose();\n if (blit) blit.dispose();\n canvas.removeEventListener('webglcontextlost', onContextLost);\n canvas.removeEventListener('webglcontextrestored', onContextRestored);\n teardownPasses();\n quad.dispose();\n emit('destroy');\n emitter.clear();\n if (!givenCanvas && canvas.parentNode) canvas.parentNode.removeChild(canvas);\n }\n\n function teardownPasses() {\n for (const po of passObjs) {\n pool.unref(po.programId);\n deleteTarget(pool, po.target);\n deleteTarget(pool, po.targetPrev);\n po.texChannels.forEach(w => { if (!w) return; if (w.dispose) w.dispose(); pool.unref(w.texId); });\n (po.samplers || []).forEach(s => { if (!s.wrap) return; if (s.wrap.dispose) s.wrap.dispose(); pool.unref(s.wrap.texId); });\n }\n passObjs.length = 0;\n byName.clear();\n }\n\n function onContextLost(e) {\n e.preventDefault();\n stopLoop();\n loaded = false;\n console.warn('[ShaderMate] WebGL context lost.');\n emit('contextlost');\n }\n async function onContextRestored() {\n console.warn('[ShaderMate] WebGL context restored, rebuilding.');\n pool._items.clear();\n passObjs.length = 0; byName.clear();\n try { await build(); loaded = true; startLoop(); emit('contextrestored'); }\n catch (err) { reportError(err); }\n }\n canvas.addEventListener('webglcontextlost', onContextLost);\n canvas.addEventListener('webglcontextrestored', onContextRestored);\n\n // ---- public API ------------------------------------------------------\n const capture = createCapture(canvas, renderNow);\n\n function set(name, value, passName) {\n if (name && typeof name === 'object') { for (const k in name) set(k, name[k], value); return api; }\n tweens.cancel(name);\n let hit = false;\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) { setUniformIn(po.cfg.uniforms, name, value); hit = true; }\n }\n if (!hit) {\n if (passName) {\n const po = byName.get(passName);\n if (!po) throw new ShaderMateError(`set: unknown pass \"${passName}\"`);\n setUniformIn(po.cfg.uniforms, name, value);\n } else setUniformIn(uniforms, name, value);\n }\n if (!playing && loaded) scheduleRender();\n return api;\n }\n function get(name, passName) {\n for (const po of passObjs) {\n if (passName && po.name !== passName) continue;\n if (name in po.cfg.uniforms) return readUniform(po.cfg.uniforms, name);\n }\n return readUniform(uniforms, name);\n }\n function tween(name, to, opts = {}) {\n const passName = opts.pass;\n const owner = () => {\n for (const po of passObjs) if ((!passName || po.name === passName) && name in po.cfg.uniforms) return po.cfg.uniforms;\n return uniforms;\n };\n return tweens.tween(name, () => readUniform(owner(), name), v => setUniformIn(owner(), name, v), to, opts);\n }\n\n let renderQueued = false;\n function scheduleRender() {\n if (renderQueued) return;\n renderQueued = true;\n requestAnimationFrame(() => { renderQueued = false; if (!playing) renderNow(); });\n }\n\n async function setShader(src, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setShader: unknown pass \"${passName}\"`);\n try {\n const { program, source, compiled } = await buildProgram(po.cfg, src, PASSES);\n if (disposed) { gl.deleteProgram(program); return; }\n pool.unref(po.programId);\n po.programId = pool.add(program, 'program');\n po.uniformInfo = getUniformInfo(gl, program);\n po.cfg.src = src; po.source = source; po.compiled = compiled;\n await loadPassChannels(po);\n clearError();\n emit('shader', { pass: po.name });\n if (!playing) scheduleRender();\n } catch (err) {\n reportError(err);\n throw err;\n }\n }\n\n async function setChannel(index, source, passName) {\n const po = passName ? byName.get(passName) : passObjs.find(p => p.cfg.screen) || passObjs[0];\n if (!po) throw new ShaderMateError(`setChannel: unknown pass \"${passName}\"`);\n const ch = normalizeChannel(source, [...byName.keys()], po.name);\n const old = po.texChannels[index];\n if (old) { if (old.dispose) old.dispose(); pool.unref(old.texId); po.texChannels[index] = null; }\n po.cfg.channels[index] = ch;\n if (ch && ch.pass == null) po.texChannels[index] = await loadChannel(gl, pool, ch, env);\n if (!playing) scheduleRender();\n }\n\n const api = {\n version: VERSION,\n canvas, gl, isWebGL2: isGL2,\n theme: options.theme,\n get camera() { return camera; },\n uniforms,\n get passes() { return passObjs; },\n get ready() { return readyPromise; },\n get loaded() { return loaded; },\n get error() { return lastError; },\n\n // playback\n play() { if (!playing) { playing = true; last = performance.now(); emit('play'); } return api; },\n pause() { if (playing) { playing = false; emit('pause'); } return api; },\n toggle() { return playing ? api.pause() : api.play(); },\n get playing() { return playing; },\n step(n = 1) { for (let i = 0; i < n; i++) frameStep(performance.now(), { advance: true, rawDt: fixedDelta || 1 / 60 }); return api; },\n render: renderNow,\n destroy, dispose: destroy,\n\n // time\n get time() { return time; }, set time(t) { time = t; if (!playing) scheduleRender(); },\n get frame() { return frame; },\n get timeScale() { return timeScale; }, set timeScale(s) { timeScale = s; },\n get maxFps() { return maxFps; }, set maxFps(v) { maxFps = v || 0; },\n get loop() { return loopLen; }, set loop(v) { loopLen = v || 0; },\n seek(t) { time = t; if (!playing) scheduleRender(); return api; },\n setFixedDelta(dt) { fixedDelta = dt || 0; return api; },\n\n // uniforms\n set, get, tween,\n setUniform: set, getUniform: get,\n\n // live editing\n setShader, setChannel,\n getPass: name => byName.get(name) || null,\n getTexture(name) {\n const po = name ? byName.get(name) : passObjs.find(p => !p.cfg.screen) || passObjs[0];\n return po && po.target ? pool.get(po.target.texId) : null;\n },\n readPixels({ pass, x = 0, y = 0, width, height, float } = {}) {\n const po = pass ? byName.get(pass) : null;\n renderNow();\n if (po && po.target) gl.bindFramebuffer(gl.FRAMEBUFFER, pool.get(po.target.fboId));\n else gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n const w = width ?? (po && po.target ? po.target.width : canvas.width);\n const h = height ?? (po && po.target ? po.target.height : canvas.height);\n let out = new Uint8Array(w * h * 4);\n const isFloat = po && po.target && po.target.fmt.type !== gl.UNSIGNED_BYTE;\n if (isFloat) {\n // float / half-float targets can only be read back as floats\n const f = new Float32Array(w * h * 4);\n gl.readPixels(x, y, w, h, gl.RGBA, gl.FLOAT, f);\n if (float !== false) out = f;\n else for (let i = 0; i < f.length; i++) out[i] = Math.max(0, Math.min(255, Math.round(f[i] * 255)));\n } else gl.readPixels(x, y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, out);\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n return { data: out, width: w, height: h, float: out instanceof Float32Array };\n },\n\n // sizing / input\n resize: handleResize,\n setSize(w, h) { sizer.setFixed(w, h); handleResize(); return api; },\n get width() { return canvas.width; },\n get height() { return canvas.height; },\n pointer: pointer.state,\n domToShader: pointer.toShader,\n domToUV: pointer.toUV,\n\n // capture\n screenshot: capture.screenshot,\n toBlob: capture.toBlob,\n download: capture.download,\n record: capture.record,\n\n // events\n on, off, once,\n\n // dev\n stats: {\n show: (v = true) => { if (!stats) stats = createStats({ visible: false, key: options.statsKey === undefined ? 'F1' : options.statsKey, theme: options.theme }); stats.show(v); },\n toggle: () => api.stats.show(!(stats && stats.isVisible())),\n },\n };\n\n // ---- go --------------------------------------------------------------\n sizer.update();\n gl.viewport(0, 0, canvas.width, canvas.height);\n removeResize = sizer.observe(handleResize);\n\n const readyPromise = (async () => {\n await build();\n if (disposed) return api;\n loaded = true;\n clearError();\n emit('load', api);\n if (options.onReady) options.onReady(api);\n startLoop();\n if (!playing) renderNow();\n return api;\n })();\n readyPromise.catch(err => { if (!disposed) reportError(err); });\n\n return api;\n}\n", "// GLSL (WebGL 2) for the GPU pipeline. Each pass mirrors a function in cpu/stages.js.\r\n// ShaderMate adds the #version line, precision, fragColor and the built-in uniforms.\r\n//\r\n// prep \u2500\u25B6 quant \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n// \u2514\u2500\u2500\u2500\u25B6 diffuse (N waves) \u2500\u25B6 resolve \u2500\u25B6 orphan \u2500\u25B6 smooth \u2500\u25B6 out (screen)\r\n//\r\n// Note: no trailing comments on uniform lines; ShaderMate reads trailing numbers there as default values.\r\n// All passes address pixels top-down (`P`, row 0 = top) so the maths matches the CPU.\r\n\r\nexport const COMMON = /* glsl */`\r\n// 256\u00D71, palette colours in x = 0..count-1\r\nuniform sampler2D u_palette;\r\nuniform int u_count;\r\n// 0 = OKLab, 1 = weighted RGB\r\nuniform int u_distance;\r\n\r\nivec2 topDown() { return ivec2(int(gl_FragCoord.x), int(u_resolution.y) - 1 - int(gl_FragCoord.y)); }\r\nvec4 at(sampler2D t, ivec2 p) { ivec2 s = textureSize(t, 0); return texelFetch(t, ivec2(p.x, s.y - 1 - p.y), 0); }\r\nbool inside(ivec2 p) { return p.x >= 0 && p.y >= 0 && p.x < int(u_resolution.x) && p.y < int(u_resolution.y); }\r\nvec3 palColor(int i) { return texelFetch(u_palette, ivec2(i, 0), 0).rgb; }\r\n\r\nfloat linear1(float c) { return c <= 0.04045 ? c / 12.92 : pow((c + 0.055) / 1.055, 2.4); }\r\nvec3 oklab(vec3 c) {\r\n c = vec3(linear1(c.r), linear1(c.g), linear1(c.b));\r\n float l = pow(0.4122214708 * c.r + 0.5363325363 * c.g + 0.0514459929 * c.b, 1.0 / 3.0);\r\n float m = pow(0.2119034982 * c.r + 0.6806995451 * c.g + 0.1073969566 * c.b, 1.0 / 3.0);\r\n float s = pow(0.0883024619 * c.r + 0.2817188376 * c.g + 0.6299787005 * c.b, 1.0 / 3.0);\r\n return vec3(0.2104542553 * l + 0.7936177850 * m - 0.0040720468 * s,\r\n 1.9779984951 * l - 2.4285922050 * m + 0.4505937099 * s,\r\n 0.0259040371 * l + 0.7827717662 * m - 0.8086757660 * s);\r\n}\r\nvec3 space(vec3 c) { return u_distance == 1 ? c : oklab(c); }\r\nint nearestIndex(vec3 c) {\r\n vec3 p = space(c);\r\n vec3 w = u_distance == 1 ? vec3(0.299, 0.587, 0.114) : vec3(1.0);\r\n int best = 0; float bd = 1e20;\r\n for (int i = 0; i < 256; i++) {\r\n if (i >= u_count) break;\r\n vec3 d = p - space(palColor(i));\r\n float dist = dot(w * d, d);\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n return best;\r\n}\r\nint colorKey(vec4 c) {\r\n if (c.a < 0.5) return -1;\r\n ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));\r\n return b.r * 65536 + b.g * 256 + b.b;\r\n}\r\n`;\r\n\r\n/** Resample (box / nearest) + adjust + alpha cut. iChannel0 = source image. */\r\nexport const PREP = /* glsl */`\r\n// 0 box, 1 nearest\r\nuniform int u_resample;\r\n// brightness, contrast, saturation, gamma\r\nuniform vec4 u_adjust;\r\n// hue rotation in degrees\r\nuniform float u_hue;\r\nuniform float u_alphaCut;\r\n// source region in texels: x, y (from the top-left), width, height\r\nuniform ivec4 u_crop;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n ivec2 R = ivec2(u_resolution);\r\n ivec2 O = u_crop.xy;\r\n ivec2 S = u_crop.zw;\r\n int nx = u_resample == 1 ? 1 : clamp((S.x + R.x - 1) / R.x, 1, 16);\r\n int ny = u_resample == 1 ? 1 : clamp((S.y + R.y - 1) / R.y, 1, 16);\r\n vec4 acc = vec4(0.0);\r\n for (int j = 0; j < 16; j++) {\r\n if (j >= ny) break;\r\n int sy = min(S.y - 1, ((2 * (P.y * ny + j) + 1) * S.y) / (2 * R.y * ny));\r\n for (int i = 0; i < 16; i++) {\r\n if (i >= nx) break;\r\n int sx = min(S.x - 1, ((2 * (P.x * nx + i) + 1) * S.x) / (2 * R.x * nx));\r\n vec4 c = at(iChannel0, O + ivec2(sx, sy));\r\n acc += vec4(c.rgb * c.a, c.a);\r\n }\r\n }\r\n vec3 c = acc.a > 0.0 ? acc.rgb / acc.a : vec3(0.0);\r\n float a = acc.a / float(nx * ny);\r\n\r\n float br = u_adjust.x, co = u_adjust.y, sa = u_adjust.z, ga = u_adjust.w;\r\n if (br != 0.0 || co != 0.0 || sa != 0.0 || ga != 1.0 || u_hue != 0.0) {\r\n float f = co >= 0.0 ? 1.0 / (1.0 - 0.99 * co) : 1.0 + co;\r\n c = (c + br - 0.5) * f + 0.5;\r\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\r\n c = l + (c - l) * (1.0 + sa);\r\n if (u_hue != 0.0) {\r\n float h = radians(u_hue), k = cos(h), q = sin(h);\r\n c = vec3(\r\n (0.213 + 0.787 * k - 0.213 * q) * c.r + (0.715 - 0.715 * k - 0.715 * q) * c.g + (0.072 - 0.072 * k + 0.928 * q) * c.b,\r\n (0.213 - 0.213 * k + 0.143 * q) * c.r + (0.715 + 0.285 * k + 0.140 * q) * c.g + (0.072 - 0.072 * k - 0.283 * q) * c.b,\r\n (0.213 - 0.213 * k - 0.787 * q) * c.r + (0.715 - 0.715 * k + 0.715 * q) * c.g + (0.072 + 0.928 * k + 0.072 * q) * c.b);\r\n }\r\n c = pow(clamp(c, 0.0, 1.0), vec3(1.0 / ga));\r\n }\r\n a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;\r\n fragColor = vec4(c * a, a);\r\n}\r\n`;\r\n\r\n/** No dither / ordered dither. iChannel0 = prep. */\r\nexport const QUANT = /* glsl */`\r\n// threshold bytes in .r\r\nuniform sampler2D u_matrix;\r\n// 0 pass-through, 1 nearest, 2 ordered\r\nuniform int u_mode;\r\nuniform float u_levels;\r\n// spread \u00D7 strength\r\nuniform float u_amount;\r\n\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0); return; }\r\n vec3 c = p.rgb;\r\n if (u_mode == 0) { fragColor = vec4(floor(c * 255.0 + 0.5) / 255.0, 1.0); return; }\r\n if (u_mode == 2) {\r\n ivec2 ms = textureSize(u_matrix, 0);\r\n float v = floor(at(u_matrix, ivec2(P.x % ms.x, P.y % ms.y)).r * 255.0 + 0.5);\r\n float t = (v + 0.5) / u_levels - 0.5;\r\n c = clamp(c + t * u_amount, 0.0, 1.0);\r\n }\r\n fragColor = vec4(palColor(nearestIndex(c)), 1.0);\r\n}\r\n`;\r\n\r\n/**\r\n * Error diffusion as a wavefront. Iteration r computes every pixel with x + skew*y == r,\r\n * pulling the stored error of already-computed neighbours.\r\n * Output: rgb = quantisation error, a = palette index (-1 not yet computed, -2 transparent).\r\n * iChannel0 = prep, iChannel1 = this pass (previous iteration).\r\n */\r\nexport const DIFFUSE = /* glsl */`\r\n// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)\r\nuniform int u_recursion;\r\nuniform int u_on;\r\nuniform int u_skew;\r\nuniform float u_strength;\r\nuniform int u_kn;\r\n// push offsets (dx, dy) and weight\r\nuniform vec3 u_kernel[12];\r\n\r\nvoid main() {\r\n if (u_on == 0) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n ivec2 P = topDown();\r\n int k = P.x + u_skew * P.y;\r\n int r = u_recursion;\r\n if (k < r) { fragColor = at(iChannel1, P); return; }\r\n if (k > r) { fragColor = vec4(0.0, 0.0, 0.0, -1.0); return; }\r\n vec4 p = at(iChannel0, P);\r\n if (p.a < 0.5) { fragColor = vec4(0.0, 0.0, 0.0, -2.0); return; }\r\n vec3 acc = vec3(0.0);\r\n for (int i = 0; i < 12; i++) {\r\n if (i >= u_kn) break;\r\n ivec2 Q = P - ivec2(u_kernel[i].xy);\r\n if (!inside(Q)) continue;\r\n vec4 e = at(iChannel1, Q);\r\n if (e.a >= 0.0) acc += e.rgb * u_kernel[i].z;\r\n }\r\n vec3 c = clamp(p.rgb + acc * u_strength, 0.0, 1.0);\r\n int idx = nearestIndex(c);\r\n fragColor = vec4(c - palColor(idx), float(idx));\r\n}\r\n`;\r\n\r\n/** Pick the ordered result or turn diffusion indices into colours. iChannel0 = quant, iChannel1 = diffuse. */\r\nexport const RESOLVE = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n if (u_on == 0) { fragColor = at(iChannel0, P); return; }\r\n vec4 d = at(iChannel1, P);\r\n fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);\r\n}\r\n`;\r\n\r\n/** Orphan removal. iChannel0 = resolve. */\r\nexport const ORPHAN = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 off[4] = ivec2[4](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0));\r\n int ks[4]; vec4 cs[4]; int n = 0;\r\n for (int i = 0; i < 4; i++) {\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n cs[n] = at(iChannel0, Q); ks[n] = colorKey(cs[n]);\r\n if (ks[n] == c) return;\r\n n++;\r\n }\r\n if (n < 2) return;\r\n int best = 0, bc = 0;\r\n for (int i = 0; i < 4; i++) {\r\n if (i >= n) break;\r\n int m = 0;\r\n for (int j = 0; j < 4; j++) { if (j >= n) break; if (ks[j] == ks[i]) m++; }\r\n if (m > bc) { bc = m; best = i; }\r\n }\r\n fragColor = cs[best];\r\n}\r\n`;\r\n\r\n/** 3\u00D73 majority smoothing. iChannel0 = orphan. */\r\nexport const SMOOTH = /* glsl */`\r\nuniform int u_on;\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_on == 0) return;\r\n int c = colorKey(me);\r\n ivec2 R = ivec2(u_resolution);\r\n int ks[9]; vec4 cs[9];\r\n for (int j = 0; j < 3; j++) for (int i = 0; i < 3; i++) {\r\n ivec2 Q = clamp(P + ivec2(i - 1, j - 1), ivec2(0), R - 1);\r\n cs[j * 3 + i] = at(iChannel0, Q); ks[j * 3 + i] = colorKey(cs[j * 3 + i]);\r\n }\r\n for (int i = 0; i < 9; i++) {\r\n if (ks[i] == c) continue;\r\n int m = 0;\r\n for (int j = 0; j < 9; j++) if (ks[j] == ks[i]) m++;\r\n if (m >= 5) { fragColor = cs[i]; return; }\r\n }\r\n}\r\n`;\r\n\r\n/** Outline, drawn to the canvas. iChannel0 = smooth. */\r\nexport const OUTLINE = /* glsl */`\r\n// 0 none, 1 outer, 2 inner\r\nuniform int u_outline;\r\nuniform int u_corners;\r\nuniform vec3 u_outlineColor;\r\nbool opaqueAt(ivec2 q) { return inside(q) && at(iChannel0, q).a > 0.5; }\r\nvoid main() {\r\n ivec2 P = topDown();\r\n vec4 me = at(iChannel0, P);\r\n fragColor = me;\r\n if (u_outline == 0) return;\r\n bool o = me.a > 0.5;\r\n ivec2 off[8] = ivec2[8](ivec2(0, -1), ivec2(1, 0), ivec2(0, 1), ivec2(-1, 0), ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1));\r\n int n = u_corners == 1 ? 8 : 4;\r\n for (int i = 0; i < 8; i++) {\r\n if (i >= n) break;\r\n ivec2 Q = P + off[i];\r\n if (!inside(Q)) continue;\r\n bool other = opaqueAt(Q);\r\n if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }\r\n }\r\n}\r\n`;\r\n", "// GPU backend: one ShaderMate instance, six passes, rendered on demand (never animating).\r\n\r\nimport { createShader } from 'shadermate';\r\nimport { COMMON, PREP, QUANT, DIFFUSE, RESOLVE, ORPHAN, SMOOTH, OUTLINE } from './shaders.js';\r\nimport { MAX_KERNEL } from '../dither/kernels.js';\r\n\r\nconst canvasOf = (w, h) => { const c = document.createElement('canvas'); c.width = w; c.height = h; return c; };\r\n\r\n/**\r\n * Create the WebGL 2 backend. Rejects when WebGL 2 or float render targets are missing,\r\n * so the caller can fall back to the CPU.\r\n */\r\nexport async function createGPUBackend() {\r\n if (typeof document === 'undefined') throw new Error('No DOM');\r\n const probe = canvasOf(1, 1).getContext('webgl2');\r\n if (!probe) throw new Error('WebGL 2 is not available');\r\n if (!probe.getExtension('EXT_color_buffer_float')) throw new Error('Float render targets are not available');\r\n const dbg = probe.getExtension('WEBGL_debug_renderer_info');\r\n const renderer = String(dbg ? probe.getParameter(dbg.UNMASKED_RENDERER_WEBGL) : probe.getParameter(probe.RENDERER));\r\n probe.getExtension('WEBGL_lose_context')?.loseContext();\r\n\r\n const canvas = canvasOf(1, 1);\r\n const source = canvasOf(1, 1);\r\n const palette = canvasOf(256, 1);\r\n const matrix = canvasOf(1, 1);\r\n const nearest = el => ({ element: el, filter: 'nearest', wrap: 'clamp' });\r\n\r\n const sm = createShader({\r\n canvas,\r\n webgl: 2,\r\n size: [1, 1],\r\n pixelRatio: 1,\r\n autoplay: false,\r\n pauseWhenHidden: false,\r\n pointer: false,\r\n errorOverlay: false,\r\n warnMissingUniforms: false,\r\n preserveDrawingBuffer: true,\r\n premultipliedAlpha: false,\r\n antialias: false,\r\n dialect: 'shadermate',\r\n common: COMMON,\r\n samplers: { u_palette: nearest(palette), u_matrix: nearest(matrix) },\r\n uniforms: {\r\n u_count: 1, u_distance: 0, u_resample: 0, u_adjust: [0, 0, 0, 1], u_hue: 0, u_crop: [0, 0, 1, 1], u_alphaCut: 0.5,\r\n u_mode: 0, u_levels: 1, u_amount: 0,\r\n u_skew: 1, u_strength: 1, u_kn: 0, u_kernel: new Float32Array(MAX_KERNEL * 3),\r\n u_outline: 0, u_corners: 0, u_outlineColor: [0, 0, 0],\r\n },\r\n passes: [\r\n { name: 'prep', shader: PREP, float: 'full', filter: 'nearest', channels: [{ ...nearest(source), dynamic: false }] },\r\n { name: 'quant', shader: QUANT, filter: 'nearest', channels: ['prep'] },\r\n { name: 'diffuse', shader: DIFFUSE, float: 'full', filter: 'nearest', pingpong: true, iterations: 2, channels: ['prep', 'diffuse'] },\r\n { name: 'resolve', shader: RESOLVE, filter: 'nearest', channels: ['quant', 'diffuse'] },\r\n { name: 'orphan', shader: ORPHAN, filter: 'nearest', channels: ['resolve'] },\r\n { name: 'smooth', shader: SMOOTH, filter: 'nearest', channels: ['orphan'] },\r\n { name: 'out', shader: OUTLINE, screen: true, channels: ['smooth'] },\r\n ],\r\n });\r\n\r\n let failure = null;\r\n sm.on('error', e => { failure = e; });\r\n await sm.ready;\r\n if (failure || sm.error) { sm.destroy(); throw failure || sm.error; }\r\n\r\n // `u_on` is a per-pass switch: same name, different value in each pass\r\n const passUniforms = (name, values) => { for (const k in values) sm.set(k, values[k], name); };\r\n\r\n let lastSource = null;\r\n let paletteKey = '', matrixKey = '';\r\n\r\n async function setSource(frame) {\r\n if (frame.canvas === lastSource && !frame.dirty) return;\r\n source.width = frame.width; source.height = frame.height;\r\n const ctx = source.getContext('2d');\r\n ctx.clearRect(0, 0, source.width, source.height);\r\n ctx.drawImage(frame.canvas, 0, 0);\r\n await sm.setChannel(0, { ...nearest(source), dynamic: false }, 'prep');\r\n lastSource = frame.canvas;\r\n }\r\n\r\n function setPalette(plan) {\r\n const key = plan.palette.map(c => c.join(',')).join(';');\r\n if (key === paletteKey) return;\r\n paletteKey = key;\r\n const ctx = palette.getContext('2d');\r\n const img = ctx.createImageData(256, 1);\r\n plan.palette.forEach((c, i) => img.data.set([c[0], c[1], c[2], 255], i * 4));\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n function setMatrix(map) {\r\n const key = map ? `${map.w}x${map.h}:${map.levels}:${map.values.join(',')}` : 'none';\r\n if (key === matrixKey) return;\r\n matrixKey = key;\r\n const m = map || { w: 1, h: 1, values: [0] };\r\n matrix.width = m.w; matrix.height = m.h;\r\n const ctx = matrix.getContext('2d');\r\n const img = ctx.createImageData(m.w, m.h);\r\n for (let i = 0; i < m.values.length; i++) img.data.set([m.values[i], 0, 0, 255], i * 4);\r\n ctx.putImageData(img, 0, 0);\r\n }\r\n\r\n /**\r\n * @param {ReturnType<import('../plan.js').makePlan>} plan\r\n * @param {{ canvas: HTMLCanvasElement, width: number, height: number, dirty?: boolean }} frame\r\n * @returns {Promise<Uint8ClampedArray>} RGBA bytes, rows top-down\r\n */\r\n async function run(plan, frame) {\r\n const s = plan.settings;\r\n await setSource(frame);\r\n if (plan.quantize) setPalette(plan);\r\n setMatrix(plan.map);\r\n if (sm.width !== plan.width || sm.height !== plan.height) sm.setSize(plan.width, plan.height);\r\n\r\n const diffusion = plan.kind === 'diffusion';\r\n const kernel = new Array(MAX_KERNEL).fill(null).map((_, i) => (plan.kernel && plan.kernel[i]) || [0, 0, 0]);\r\n sm.set({\r\n u_count: plan.palette.length || 1,\r\n u_distance: plan.distance,\r\n u_resample: s.size.resample === 'nearest' ? 1 : 0,\r\n u_adjust: [s.adjust.brightness, s.adjust.contrast, s.adjust.saturation, s.adjust.gamma],\r\n u_hue: s.adjust.hue,\r\n u_crop: [plan.crop.x, plan.crop.y, plan.crop.w, plan.crop.h],\r\n u_alphaCut: s.alpha.threshold,\r\n u_mode: !plan.quantize ? 0 : plan.kind === 'ordered' ? 2 : 1,\r\n u_levels: plan.map ? plan.map.levels : 1,\r\n u_amount: plan.map ? plan.spread * s.dither.strength : 0,\r\n u_skew: plan.skew,\r\n u_strength: s.dither.strength,\r\n u_kn: plan.kernel ? plan.kernel.length : 0,\r\n u_kernel: new Float32Array(kernel.flat()),\r\n u_outline: { none: 0, outer: 1, inner: 2 }[plan.outline.mode],\r\n u_corners: plan.outline.corners ? 1 : 0,\r\n u_outlineColor: plan.outline.color.map(v => v / 255),\r\n });\r\n passUniforms('diffuse', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('resolve', { u_on: diffusion ? 1 : 0 });\r\n passUniforms('orphan', { u_on: s.cleanup.orphans ? 1 : 0 });\r\n passUniforms('smooth', { u_on: s.cleanup.smooth ? 1 : 0 });\r\n sm.getPass('diffuse').cfg.iterations = diffusion ? plan.waves : 1;\r\n\r\n const { data } = sm.readPixels();\r\n // GL rows are bottom-up\r\n const w = plan.width, h = plan.height, out = new Uint8ClampedArray(w * h * 4), row = w * 4;\r\n for (let y = 0; y < h; y++) out.set(data.subarray((h - 1 - y) * row, (h - y) * row), y * row);\r\n return out;\r\n }\r\n\r\n return {\r\n name: 'webgl',\r\n renderer,\r\n /** Software rasterisers (SwiftShader, llvmpipe) are slower than the CPU path for error diffusion. */\r\n software: /swiftshader|llvmpipe|softpipe|software|basic render/i.test(renderer),\r\n run,\r\n shader: sm,\r\n destroy() { sm.destroy(); },\r\n };\r\n}\r\n", "// Turning whatever the caller has into a \"frame\": { width, height, canvas?, data }.\r\n// Accepts URLs, Blobs/Files, <img>, <canvas>, OffscreenCanvas, ImageBitmap, <video> (current frame),\r\n// VideoFrame, ImageData or any { width, height, data } RGBA object, plus p5 / q5 images.\r\n\r\nexport const MAX_SOURCE = 4096;\r\nconst hasDOM = typeof document !== 'undefined';\r\n\r\nconst isRGBA = s => s && typeof s === 'object' && 'data' in s && 'width' in s && 'height' in s && s.data && s.data.length === s.width * s.height * 4;\r\n\r\n/** Load a URL or Blob into something drawable. */\r\nexport async function loadImage(src) {\r\n if (typeof Blob !== 'undefined' && src instanceof Blob) {\r\n if (typeof createImageBitmap === 'function') {\r\n try { return await createImageBitmap(src); } catch { /* fall through (e.g. SVG) */ }\r\n }\r\n src = URL.createObjectURL(src);\r\n }\r\n if (!hasDOM) throw new Error('Loading images by URL needs a browser; pass { width, height, data } in Node.');\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.decoding = 'async';\r\n img.src = src;\r\n await img.decode();\r\n return img;\r\n}\r\n\r\n/** Natural pixel size of a drawable. */\r\nexport function sizeOf(el) {\r\n return {\r\n width: el.naturalWidth || el.videoWidth || el.displayWidth || el.codedWidth || el.width || 0,\r\n height: el.naturalHeight || el.videoHeight || el.displayHeight || el.codedHeight || el.height || 0,\r\n };\r\n}\r\n\r\nfunction unwrap(src) {\r\n // p5.Image / q5 image / p5.Graphics / p5.Renderer\r\n if (src && !isRGBA(src) && typeof src === 'object') {\r\n if (src.canvas && typeof src.canvas === 'object' && 'getContext' in src.canvas) return src.canvas;\r\n if (src.elt && typeof src.elt === 'object' && 'getContext' in src.elt) return src.elt;\r\n }\r\n return src;\r\n}\r\n\r\n/**\r\n * @param {any} source\r\n * @param {{ maxSize?: number, canvas?: HTMLCanvasElement }} [opts] canvas: scratch canvas to reuse\r\n */\r\nexport async function toFrame(source, opts = {}) {\r\n const maxSize = opts.maxSize || MAX_SOURCE;\r\n let src = unwrap(source);\r\n if (typeof src === 'string' || (typeof Blob !== 'undefined' && src instanceof Blob)) src = await loadImage(src);\r\n if (src && typeof src.complete === 'boolean' && !src.complete && src.decode) await src.decode();\r\n\r\n if (isRGBA(src)) {\r\n const frame = { width: src.width, height: src.height, data: src.data, canvas: null };\r\n if (hasDOM) {\r\n Object.defineProperty(frame, 'canvas', {\r\n configurable: true,\r\n get() {\r\n const c = document.createElement('canvas'); c.width = src.width; c.height = src.height;\r\n const img = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\r\n c.getContext('2d').putImageData(img, 0, 0);\r\n Object.defineProperty(frame, 'canvas', { value: c });\r\n return c;\r\n },\r\n });\r\n }\r\n return frame;\r\n }\r\n if (!hasDOM) throw new Error('Unsupported source in a non-browser environment. Pass { width, height, data }.');\r\n\r\n let { width, height } = sizeOf(src);\r\n if (!width || !height) throw new Error('Source has no size yet (is the image or video loaded?)');\r\n const k = Math.min(1, maxSize / Math.max(width, height));\r\n width = Math.max(1, Math.round(width * k)); height = Math.max(1, Math.round(height * k));\r\n\r\n const canvas = opts.canvas || document.createElement('canvas');\r\n canvas.width = width; canvas.height = height;\r\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.imageSmoothingEnabled = k < 1;\r\n ctx.imageSmoothingQuality = 'high';\r\n ctx.drawImage(src, 0, 0, width, height);\r\n let cached = null;\r\n return {\r\n width, height, canvas, dirty: true,\r\n get data() { return (cached ||= ctx.getImageData(0, 0, width, height).data); },\r\n };\r\n}\r\n", "// The public engine: createPixelator() picks a backend and turns sources into pixel art.\r\n\r\nimport { makePlan } from './plan.js';\r\nimport { runCPU } from './cpu/pipeline.js';\r\nimport { createGPUBackend } from './gpu/backend.js';\r\nimport { toFrame } from './source.js';\r\nimport { normalizeSettings, LEGACY_DITHER } from './settings.js';\r\nimport { uniqueColors } from './export/scale.js';\r\nimport { toCanvas } from './export/canvas.js';\r\nimport { encodePNG } from './export/png.js';\r\n\r\nconst isVideo = s => typeof HTMLVideoElement !== 'undefined' && s instanceof HTMLVideoElement;\r\nconst isVideoFrame = s => typeof VideoFrame !== 'undefined' && s instanceof VideoFrame;\r\n\r\n/**\r\n * Create an engine. Reuse one for many images: the GPU backend compiles its shaders once.\r\n * @param {{ backend?: 'auto' | 'webgl' | 'cpu', diffusion?: 'auto' | 'gpu' | 'cpu', maxSourceSize?: number }} [options]\r\n * diffusion: where error diffusion runs. 'auto' uses the GPU unless WebGL is software-rendered.\r\n */\r\nexport async function createPixelator(options = {}) {\r\n const want = options.backend || 'auto';\r\n let gpu = null, gpuError = null;\r\n if (want !== 'cpu' && typeof document !== 'undefined') {\r\n try { gpu = await createGPUBackend(); } catch (e) {\r\n gpuError = e;\r\n if (want === 'webgl') throw e;\r\n }\r\n }\r\n const scratch = typeof document !== 'undefined' ? document.createElement('canvas') : null;\r\n let last = { source: null, frame: null };\r\n let queue = Promise.resolve();\r\n\r\n async function frameFor(source) {\r\n if (source === last.source && last.frame && !isVideo(source) && !isVideoFrame(source)) {\r\n last.frame.dirty = false;\r\n return last.frame;\r\n }\r\n const frame = await toFrame(source, { maxSize: options.maxSourceSize, canvas: scratch });\r\n last = { source, frame };\r\n return frame;\r\n }\r\n\r\n async function processNow(source, settings) {\r\n const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now();\r\n const frame = await frameFor(source);\r\n const plan = makePlan(settings, frame);\r\n let data, backend = 'cpu';\r\n const diffusionOnCPU = plan.kind === 'diffusion' && (options.diffusion === 'cpu' || (options.diffusion !== 'gpu' && gpu && gpu.software));\r\n if (gpu && frame.canvas && !diffusionOnCPU) {\r\n data = await gpu.run(plan, frame);\r\n backend = 'webgl';\r\n } else {\r\n data = runCPU(plan, frame);\r\n }\r\n const ms = (typeof performance !== 'undefined' ? performance.now() : Date.now()) - t0;\r\n return makeResult(plan, data, backend, ms);\r\n }\r\n\r\n return {\r\n /** 'webgl' or 'cpu' */\r\n get backend() { return gpu ? 'webgl' : 'cpu'; },\r\n /** GPU renderer string (WebGL backend only). */\r\n get renderer() { return gpu ? gpu.renderer : ''; },\r\n /** Why the GPU backend is not in use, if it isn't. */\r\n get fallbackReason() { return gpuError ? String(gpuError.message || gpuError) : ''; },\r\n /**\r\n * Process one source. Calls are queued, so it is safe to call from input handlers.\r\n * @returns {Promise<PixelResult>}\r\n */\r\n process(source, settings = {}) {\r\n const run = queue.then(() => processNow(source, settings));\r\n queue = run.catch(() => { });\r\n return run;\r\n },\r\n /** Forget the cached source (call after drawing new content into the same canvas). */\r\n invalidate() { last = { source: null, frame: null }; },\r\n destroy() { if (gpu) gpu.destroy(); gpu = null; },\r\n /** The underlying ShaderMate instance (GPU backend only), for debugging. */\r\n get shader() { return gpu ? gpu.shader : null; },\r\n };\r\n}\r\n\r\n/**\r\n * @typedef {object} PixelResult\r\n * @property {number} width\r\n * @property {number} height\r\n * @property {Uint8ClampedArray} data RGBA, rows top-down\r\n * @property {string[]} palette colours actually available ('#rrggbb')\r\n * @property {object} settings normalised settings used\r\n * @property {'webgl'|'cpu'} backend\r\n * @property {number} ms processing time\r\n */\r\nexport function makeResult(plan, data, backend = 'cpu', ms = 0) {\r\n const result = {\r\n width: plan.width,\r\n height: plan.height,\r\n data,\r\n palette: plan.paletteHex ? plan.paletteHex.slice() : null,\r\n settings: plan.settings,\r\n kind: plan.kind,\r\n waves: plan.waves,\r\n /** The framed part of the source, as fractions of its width and height. */\r\n crop: { x: plan.crop.x / plan.srcWidth, y: plan.crop.y / plan.srcHeight, w: plan.crop.w / plan.srcWidth, h: plan.crop.h / plan.srcHeight },\r\n backend,\r\n ms,\r\n /** Distinct colours actually used in the image. */\r\n usedColors() { return uniqueColors(this); },\r\n toImageData() { return new ImageData(new Uint8ClampedArray(this.data), this.width, this.height); },\r\n /** Canvas at `scale` \u00D7 (nearest-neighbour), optional grid lines. */\r\n toCanvas(scale = 1, opts = {}) { return toCanvas(this, scale, opts); },\r\n /** PNG bytes (indexed when \u2264 256 colours unless `indexed: false`). */\r\n toPNG(opts = {}) { return encodePNG(this, opts); },\r\n async toBlob(opts = {}) { return new Blob([await encodePNG(this, opts)], { type: 'image/png' }); },\r\n };\r\n return result;\r\n}\r\n\r\nlet shared = null;\r\n/** One-shot helper with a shared engine. `pixelate(source, settings)`. */\r\nexport async function pixelate(source, settings) {\r\n // classic API: pixelate({ image, width, dither, strength, palette, resolution }) \u2192 canvas\r\n if (settings === undefined && source && typeof source === 'object' && 'image' in source && 'width' in source) {\r\n return pixelateClassic(source);\r\n }\r\n shared ||= createPixelator();\r\n return (await shared).process(source, settings);\r\n}\r\n\r\n/** Compatibility with image-to-pixel.js 2.x. Returns a canvas like the old function did. */\r\nasync function pixelateClassic(opts) {\r\n const { image, width, dither = 'none', strength = 0, palette = null, resolution = 'original' } = opts;\r\n let pal = { source: 'none' };\r\n if (Array.isArray(palette)) pal = { source: 'custom', colors: palette };\r\n else if (typeof palette === 'string') {\r\n const { fetchLospec } = await import('./palette/lospec.js');\r\n const p = await fetchLospec(palette);\r\n pal = { source: 'custom', colors: p.colors, name: p.name };\r\n }\r\n const settings = normalizeSettings({\r\n size: { width },\r\n palette: pal,\r\n dither: { method: LEGACY_DITHER[String(dither).toLowerCase()] || 'none', strength: strength / 100 },\r\n alpha: { threshold: 0 },\r\n });\r\n shared ||= createPixelator();\r\n const engine = await shared;\r\n const res = await engine.process(image, settings);\r\n if (resolution === 'original') {\r\n const frame = await toFrame(image);\r\n const c = document.createElement('canvas');\r\n c.width = frame.width; c.height = frame.height;\r\n const ctx = c.getContext('2d');\r\n ctx.imageSmoothingEnabled = false;\r\n ctx.drawImage(res.toCanvas(1), 0, 0, c.width, c.height);\r\n return c;\r\n }\r\n return res.toCanvas(1);\r\n}\r\n", "// DOM helpers: canvases and downloads.\r\n\r\nimport { upscale } from './scale.js';\r\n\r\n/** RGBA image \u2192 <canvas>, upscaled by an integer factor with optional grid lines. */\r\nexport function toCanvas(img, scale = 1, opts = {}) {\r\n const up = scale > 1 || opts.grid ? upscale(img, scale, opts) : img;\r\n const c = opts.canvas || document.createElement('canvas');\r\n c.width = up.width; c.height = up.height;\r\n c.getContext('2d').putImageData(new ImageData(new Uint8ClampedArray(up.data), up.width, up.height), 0, 0);\r\n return c;\r\n}\r\n\r\n/** Trigger a browser download for a Blob or bytes. */\r\nexport function downloadBlob(data, filename, type = 'application/octet-stream') {\r\n const blob = data instanceof Blob ? data : new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url; a.download = filename; a.rel = 'noopener';\r\n document.body.appendChild(a); a.click(); a.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 10000);\r\n}\r\n", "// CRC-32 (IEEE), shared by the PNG and zip writers.\r\nlet table = null;\r\nexport function crc32(bytes, crc = 0) {\r\n if (!table) {\r\n table = new Uint32Array(256);\r\n for (let n = 0; n < 256; n++) {\r\n let c = n;\r\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\r\n table[n] = c >>> 0;\r\n }\r\n }\r\n crc = ~crc >>> 0;\r\n for (let i = 0; i < bytes.length; i++) crc = table[(crc ^ bytes[i]) & 255] ^ (crc >>> 8);\r\n return ~crc >>> 0;\r\n}\r\n", "// Minimal PNG encoder: indexed (colour type 3, with tRNS) when the image has \u2264 256 colours,\r\n// otherwise RGBA. Uses CompressionStream('deflate'), so it works in browsers and in Node 18+.\r\n\r\nimport { crc32 } from './crc32.js';\r\nimport { upscale, resizeNearest } from './scale.js';\r\n\r\nconst SIG = [137, 80, 78, 71, 13, 10, 26, 10];\r\n\r\nasync function deflate(bytes) {\r\n if (typeof CompressionStream === 'function') {\r\n const cs = new CompressionStream('deflate');\r\n const stream = new Blob([bytes]).stream().pipeThrough(cs);\r\n return new Uint8Array(await new Response(stream).arrayBuffer());\r\n }\r\n const { deflateSync } = await import('node:zlib');\r\n return new Uint8Array(deflateSync(bytes));\r\n}\r\n\r\nfunction chunk(type, data) {\r\n const out = new Uint8Array(12 + data.length);\r\n const dv = new DataView(out.buffer);\r\n dv.setUint32(0, data.length);\r\n for (let i = 0; i < 4; i++) out[4 + i] = type.charCodeAt(i);\r\n out.set(data, 8);\r\n dv.setUint32(8 + data.length, crc32(out.subarray(4, 8 + data.length)));\r\n return out;\r\n}\r\n\r\n/** Map pixels to palette indices. Returns null when there are more than 256 colours. */\r\nexport function indexImage(img) {\r\n const d = img.data, n = img.width * img.height;\r\n const map = new Map(), colors = [], idx = new Uint8Array(n);\r\n for (let i = 0; i < n; i++) {\r\n const o = i * 4;\r\n const k = d[o + 3] === 0 ? -1 : ((d[o] << 24) | (d[o + 1] << 16) | (d[o + 2] << 8) | d[o + 3]) >>> 0;\r\n let v = map.get(k);\r\n if (v === undefined) {\r\n if (colors.length === 256) return null;\r\n v = colors.length; map.set(k, v);\r\n colors.push(k === -1 ? [0, 0, 0, 0] : [d[o], d[o + 1], d[o + 2], d[o + 3]]);\r\n }\r\n idx[i] = v;\r\n }\r\n return { colors, indices: idx };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number> }} img\r\n * @param {{ scale?: number, grid?: boolean, gridColor?: string, indexed?: boolean, width?: number, height?: number }} [opts]\r\n * width/height: resize to exactly this size (nearest neighbour) instead of scaling\r\n * @returns {Promise<Uint8Array>}\r\n */\r\nexport async function encodePNG(img, opts = {}) {\r\n if (opts.width && opts.height) img = resizeNearest(img, opts.width, opts.height);\r\n else if ((opts.scale && opts.scale > 1) || opts.grid) img = upscale(img, opts.scale || 1, opts);\r\n const { width: w, height: h } = img;\r\n const ix = opts.indexed === false ? null : indexImage(img);\r\n const ihdr = new Uint8Array(13);\r\n const dv = new DataView(ihdr.buffer);\r\n dv.setUint32(0, w); dv.setUint32(4, h);\r\n const parts = [new Uint8Array(SIG)];\r\n let raw;\r\n if (ix) {\r\n const bits = ix.colors.length <= 2 ? 1 : ix.colors.length <= 4 ? 2 : ix.colors.length <= 16 ? 4 : 8;\r\n ihdr.set([bits, 3, 0, 0, 0], 8);\r\n const stride = Math.ceil(w * bits / 8);\r\n raw = new Uint8Array((stride + 1) * h);\r\n for (let y = 0; y < h; y++) {\r\n const row = y * (stride + 1) + 1;\r\n for (let x = 0; x < w; x++) {\r\n const v = ix.indices[y * w + x];\r\n const bit = x * bits;\r\n raw[row + (bit >> 3)] |= v << (8 - bits - (bit & 7));\r\n }\r\n }\r\n parts.push(chunk('IHDR', ihdr));\r\n parts.push(chunk('PLTE', Uint8Array.from(ix.colors.flatMap(c => c.slice(0, 3)))));\r\n if (ix.colors.some(c => c[3] < 255)) {\r\n let last = ix.colors.length; while (last > 0 && ix.colors[last - 1][3] === 255) last--;\r\n parts.push(chunk('tRNS', Uint8Array.from(ix.colors.slice(0, last).map(c => c[3]))));\r\n }\r\n } else {\r\n ihdr.set([8, 6, 0, 0, 0], 8);\r\n raw = new Uint8Array((w * 4 + 1) * h);\r\n for (let y = 0; y < h; y++) raw.set(img.data.subarray ? img.data.subarray(y * w * 4, (y + 1) * w * 4) : Array.prototype.slice.call(img.data, y * w * 4, (y + 1) * w * 4), y * (w * 4 + 1) + 1);\r\n parts.push(chunk('IHDR', ihdr));\r\n }\r\n parts.push(chunk('IDAT', await deflate(raw)));\r\n parts.push(chunk('IEND', new Uint8Array(0)));\r\n const total = parts.reduce((s, p) => s + p.length, 0);\r\n const out = new Uint8Array(total);\r\n let o = 0; for (const p of parts) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// The editor UI. mountEditor(element) builds the whole app inside `element`.\n// The core engine (lib/core) has no idea this file exists.\n\nimport { createPixelator } from '../core/engine.js';\nimport { defaultSettings, decodeSettings, encodeSettings, settingsToJSON, settingsFromJSON, mergeSettings } from '../core/settings.js';\nimport { parsePalette, toGPL, toHexFile, toPaletteJSON } from '../core/palette/parse.js';\nimport { fetchLospec } from '../core/palette/lospec.js';\nimport { detectGrid } from '../core/export/scale.js';\nimport { toHex } from '../core/color.js';\nimport { estimateFps, videoReady, seekTo, sniffVideoCodec, hasAudioTrack } from '../core/video/frames.js';\nimport { downloadBlob } from '../core/export/canvas.js';\nimport { PRESETS } from '../core/presets.js';\nimport { h, render, pickFiles } from './dom.js';\nimport { icon } from './icons.js';\nimport { createStore } from './store.js';\nimport { createStage } from './stage.js';\nimport { createInspector } from './inspector.js';\nimport { createLibrary, fmtTime } from './library.js';\nimport { createExporter } from './exporter.js';\nimport { toast, menu, closeMenu, dialog } from './ui.js';\nimport { SAMPLES, loadSample, sampleURL } from './samples.js';\nimport * as persist from './persist.js';\nimport { saveWorkspace, loadWorkspace, forgetWorkspace, isQuotaError, fmtBytes } from './workspace.js';\n\nconst IMAGE_TYPES = /^image\\//;\nconst VIDEO_TYPES = /^video\\//;\nconst PALETTE_EXT = /\\.(gpl|hex|pal|txt|json)$/i;\n\n/**\n * Mount the editor.\n * @param {HTMLElement} root\n * @param {{ settings?: object, persist?: boolean, samples?: boolean, homeHref?: string, docsHref?: string }} [options]\n */\nexport async function mountEditor(root, options = {}) {\n const usePersist = options.persist !== false;\n const narrow = () => matchMedia('(max-width: 900px)').matches;\n\n // ---- initial settings: share link > saved > defaults\n let initial = options.settings || (usePersist && persist.load('settings', null)) || defaultSettings();\n if (/[#&]s=/.test(location.hash)) {\n try { initial = decodeSettings(location.hash); } catch { toast('That share link could not be read; using your last settings', { kind: 'error' }); }\n }\n const store = createStore(initial);\n\n const app = {\n store,\n engine: null,\n items: [],\n current: null,\n result: null,\n exporting: false,\n activePreset: null,\n userPalettes: usePersist ? persist.load('palettes', []) : [],\n /** Settings shared by every file that doesn't have its own. */\n shared: store.settings,\n /** Settings copied with \"Copy settings\", ready to paste onto another file. */\n clipboard: null,\n videoSupport: { mp4: false, webm: false },\n toast: (m, o) => toast(m, o),\n };\n\n // ================================================================ layout\n const stage = createStage({ onPick: pickAt, onViewChange: () => updateZoomLabel() });\n const inspector = createInspector(app);\n const library = createLibrary(app);\n const exporter = createExporter(app);\n\n const btn = (ic, label, onclick, extra = {}) => h('button.itp-btn.icon', { type: 'button', 'aria-label': label, title: label, html: icon(ic), onclick, ...extra });\n\n const fileName = h('span.name', { text: 'No image' });\n // click the name to rename (F2); the extension stays as it was\n fileName.addEventListener('click', () => { if (app.current) startRename(app.current); });\n const fileMeta = h('span.meta.num', {});\n const undoBtn = btn('undo', 'Undo (Ctrl+Z)', () => store.undo());\n const redoBtn = btn('redo', 'Redo (Ctrl+Shift+Z)', () => store.redo());\n const compareBtn = btn('compare', 'Compare with original (C)', () => toggleCompare(), { 'aria-pressed': 'false' });\n const gridBtn = btn('grid', 'Pixel grid (G)', () => toggleGrid(), { 'aria-pressed': 'false' });\n const zoomBtn = h('button.itp-btn.itp-zoom.num', { type: 'button', 'aria-label': 'Zoom', 'aria-haspopup': 'menu', html: `<span>Fit</span>${icon('chevronDown')}`, onclick: e => zoomMenu(e.currentTarget) });\n const themeBtn = btn('moon', 'Toggle theme (T)', () => toggleTheme());\n const libBtn = btn('sidebarLeft', 'Toggle library (\\\\)', () => togglePanel('lib'));\n const inspBtn = btn('sidebarRight', 'Toggle inspector (/)', () => togglePanel('insp'));\n const helpBtn = btn('keyboard', 'Keyboard shortcuts (?)', () => showHelp());\n const exportBtn = h('button.itp-btn.primary', { type: 'button', 'aria-haspopup': 'menu', html: `${icon('download')}<span>Export</span>`, onclick: e => exportMenu(e.currentTarget) });\n const saveBtn = h('button.itp-btn.outline', { type: 'button', title: 'Save these files and their settings in this browser', html: `${icon('save')}<span class=\"hide-sm\">Save</span>`, onclick: () => saveNow() });\n saveBtn.hidden = !usePersist;\n const brand = h('a.itp-brand', { href: options.homeHref || '#', title: 'Image-to-Pixel' }, h('span.itp-mark', { 'aria-hidden': 'true' }, ...Array.from({ length: 9 }, () => h('i'))), h('span.hide-sm', { text: 'Image-to-Pixel' }));\n if (!options.homeHref) brand.addEventListener('click', e => e.preventDefault());\n\n const top = h('header.itp-top', {},\n libBtn, brand, h('span.sep.hide-sm'),\n h('div.itp-file', {}, fileName, fileMeta),\n h('div.spacer'),\n h('span.hide-sm.contents', {}, undoBtn, redoBtn, h('span.sep')),\n compareBtn, gridBtn, zoomBtn,\n h('span.sep.hide-sm'), h('span.hide-sm.contents', {}, themeBtn, helpBtn), inspBtn,\n h('span', { style: { width: '6px' } }), saveBtn, exportBtn);\n\n // stage extras\n const sampleButtons = options.samples === false ? null : h('div.samples', {}, ...SAMPLES.map(s => h('button', { type: 'button', title: `Try \"${s.name}\"`, 'aria-label': `Open sample: ${s.name}`, onclick: () => openSample(s) }, h('img', { src: sampleURL(s), alt: '' }))));\n const empty = h('div.itp-empty', {}, h('div.itp-drop', {},\n h('h2', { text: 'Drop an image or a video' }),\n h('p', { text: 'PNG, JPG, WebP, GIF, SVG, MP4 or WebM. Add several files to process them as a batch. You can also paste with Ctrl+V.' }),\n h('div.actions', {},\n h('button.itp-btn.primary', { type: 'button', html: `${icon('upload')}<span>Choose files</span>`, onclick: () => openFiles() }),\n h('button.itp-btn.outline', { type: 'button', html: `${icon('clipboard')}<span>Paste</span>`, onclick: () => pasteFromClipboard() })),\n sampleButtons ? h('p', { style: { fontSize: 'var(--fs-xs)', color: 'var(--faint)' }, text: 'Or start from a sample' }) : null,\n sampleButtons));\n const status = h('div.itp-float.bl', { 'aria-live': 'polite' });\n const busy = h('div.itp-busy.itp-float', { hidden: true, style: { padding: '6px 10px', alignItems: 'center', gap: '8px', fontSize: 'var(--fs-xs)', color: 'var(--muted)', display: 'flex' } }, h('span.itp-spinner'), h('span', { text: 'Rendering' }));\n const viewTools = h('div.itp-float.br', {},\n btn('zoomOut', 'Zoom out (-)', () => stage.zoomOut()),\n btn('fit', 'Fit to view (F)', () => stage.fit()),\n btn('zoomIn', 'Zoom in (+)', () => stage.zoomIn()));\n stage.el.append(empty, status, busy, viewTools);\n\n // transport\n const playBtn = btn('play', 'Play (Space)', () => togglePlay());\n const timeLabel = h('span.itp-time', {});\n const scrub = h('input.itp-scrub', { type: 'range', min: 0, max: 1000, value: 0, 'aria-label': 'Video position' });\n const fpsLabel = h('span.muted.num', { style: { fontSize: 'var(--fs-xs)', whiteSpace: 'nowrap' } });\n // sound: muted by default; the choice (and volume) is remembered and applies to every video\n const sound = { muted: persist.load('muted', true) !== false, volume: Number(persist.load('volume', 1)) };\n if (!(sound.volume >= 0 && sound.volume <= 1)) sound.volume = 1;\n // YouTube-style: the speaker button opens a vertical volume slider; all the way down is mute.\n const muteBtn = btn('volumeOff', 'Volume (M mutes)', () => toggleVolPop(), { 'aria-haspopup': 'true', 'aria-expanded': 'false' });\n const volFill = h('div.fill');\n const volThumb = h('div.thumb');\n const volSlider = h('div.itp-vslider', { role: 'slider', tabindex: '0', 'aria-label': 'Volume', 'aria-orientation': 'vertical', 'aria-valuemin': '0', 'aria-valuemax': '100' }, h('div.track', {}, volFill, volThumb));\n const volValue = h('span.num', {});\n const volPop = h('div.itp-volpop', { hidden: true }, volValue, volSlider);\n const soundBox = h('div.itp-sound', { hidden: true }, volPop, muteBtn);\n const setLevel = v => setSound(v <= 0.005 ? { muted: true } : { muted: false, volume: Math.min(1, v) });\n const levelAt = e => { const r = volSlider.querySelector('.track').getBoundingClientRect(); return Math.max(0, Math.min(1, (r.bottom - e.clientY) / r.height)); };\n volSlider.addEventListener('pointerdown', e => {\n e.preventDefault(); volSlider.focus(); volSlider.setPointerCapture(e.pointerId);\n const before = sound.muted ? 0 : sound.volume;\n setLevel(levelAt(e));\n const move = ev => setLevel(levelAt(ev));\n const up = () => {\n volSlider.removeEventListener('pointermove', move); volSlider.removeEventListener('pointerup', up); volSlider.removeEventListener('pointercancel', up);\n // dragged down to mute: M brings back the volume it had before the drag\n if (sound.muted && before > 0) setSound({ muted: true, volume: before });\n };\n volSlider.addEventListener('pointermove', move); volSlider.addEventListener('pointerup', up); volSlider.addEventListener('pointercancel', up);\n });\n volSlider.addEventListener('keydown', e => {\n const cur = sound.muted ? 0 : sound.volume;\n const next = { ArrowUp: cur + 0.05, ArrowRight: cur + 0.05, ArrowDown: cur - 0.05, ArrowLeft: cur - 0.05, PageUp: cur + 0.2, PageDown: cur - 0.2, Home: 0, End: 1 }[e.key];\n if (next === undefined) { if (e.key === 'Escape') { e.preventDefault(); toggleVolPop(false); muteBtn.focus(); } return; }\n e.preventDefault(); e.stopPropagation(); setLevel(next);\n });\n volSlider.addEventListener('wheel', e => { e.preventDefault(); setLevel((sound.muted ? 0 : sound.volume) - Math.sign(e.deltaY) * 0.05); }, { passive: false });\n function toggleVolPop(open = volPop.hidden) {\n volPop.hidden = !open;\n muteBtn.setAttribute('aria-expanded', String(open));\n if (open) {\n const close = e => { if (!soundBox.contains(e.target)) { toggleVolPop(false); document.removeEventListener('pointerdown', close, true); } };\n document.addEventListener('pointerdown', close, true);\n }\n }\n const transport = h('div.itp-transport', { role: 'group', 'aria-label': 'Video' },\n btn('stepBack', 'Previous frame (,)', () => stepFrame(-1)), playBtn, btn('stepForward', 'Next frame (.)', () => stepFrame(1)),\n timeLabel, scrub, soundBox, fpsLabel);\n const stageWrap = h('main.itp-stage', { 'data-video': 'false' }, stage.el, transport);\n\n // on narrow screens the library is a drawer: a tap on the canvas closes it\n stageWrap.addEventListener('pointerdown', () => { if (narrow() && shell.dataset.lib === 'open') togglePanel('lib'); }, true);\n const shell = h('div.itp.itp-app', { 'data-lib': narrow() ? 'closed' : persist.load('lib', 'open'), 'data-insp': persist.load('insp', 'open') }, top, library.el, stageWrap, inspector.el);\n render(root, shell);\n applyTheme(persist.load('theme', null));\n\n // ================================================================ engine\n status.textContent = 'Starting\u2026';\n try {\n app.engine = await createPixelator();\n } catch (e) {\n toast(`Could not start: ${e.message}`, { kind: 'error' });\n throw e;\n }\n inspector.el.querySelector('#itp-backend').textContent = app.engine.backend === 'webgl' ? 'GPU \u00B7 ShaderMate' : 'CPU';\n inspector.el.querySelector('#itp-backend').title = app.engine.backend === 'webgl' ? `WebGL 2: ${app.engine.renderer}` : (app.engine.fallbackReason || 'CPU renderer');\n import('../video.js').then(m => m.videoSupport()).then(v => { app.videoSupport = v; }).catch(() => { });\n\n // ================================================================ rendering\n let dirty = false, running = false, lastSource = null;\n const outCanvas = document.createElement('canvas');\n\n function schedule() {\n dirty = true;\n if (!running) requestAnimationFrame(run);\n }\n app.schedule = schedule;\n\n async function run() {\n if (running || !dirty) return;\n if (app.exporting) return;\n dirty = false;\n const item = app.current;\n if (!item) { app.result = null; stage.clear(); updateStatus(); return; }\n running = true;\n const slow = setTimeout(() => { busy.hidden = false; }, 250);\n try {\n if (item.type === 'video') app.engine.invalidate();\n const res = await app.engine.process(item.source, store.settings);\n if (item !== app.current) return;\n app.result = res;\n res.toCanvas(1, { canvas: outCanvas });\n stage.show(outCanvas, item.source, res.crop);\n inspector.setStats(res);\n inspector.sync(store.settings, res);\n if (lastSource !== item) { lastSource = item; }\n updateStatus();\n } catch (e) {\n console.error(e);\n toast(`Rendering failed: ${e.message}`, { kind: 'error' });\n } finally {\n clearTimeout(slow); busy.hidden = true;\n running = false;\n if (dirty) requestAnimationFrame(run);\n }\n }\n\n function updateStatus() {\n const r = app.result, it = app.current;\n fileName.textContent = it ? it.name : 'No image';\n fileMeta.textContent = it ? (it.type === 'video' ? `${it.width} \u00D7 ${it.height}, ${fmtTime(it.duration)}` : `${it.width} \u00D7 ${it.height}`) : '';\n empty.hidden = !!it;\n viewTools.hidden = !it;\n if (!it || !r) { status.hidden = true; return; }\n status.hidden = false;\n render(status, h('span', {}, h('b', { text: `${r.width} \u00D7 ${r.height}` }), ' px'), h('span', { text: `${Math.round(stage.zoom * 100) / 100}\u00D7 zoom` }));\n undoBtn.disabled = !store.canUndo; redoBtn.disabled = !store.canRedo;\n }\n function updateZoomLabel() {\n zoomBtn.querySelector('span').textContent = !app.current || stage.fitted ? 'Fit' : stage.zoom >= 1 ? `${Math.round(stage.zoom * 10) / 10}\u00D7` : `${Math.round(stage.zoom * 100)}%`;\n if (app.result) updateStatus();\n }\n\n store.subscribe((s, why) => {\n // write the edit back to whatever is being edited: this file's own settings, or the shared ones\n const cur = app.current;\n if (cur && cur.own && store.target === cur.id) cur.own = s;\n else if (store.target === 'shared') app.shared = s;\n inspector.sync(s, app.result);\n undoBtn.disabled = !store.canUndo; redoBtn.disabled = !store.canRedo;\n if (why !== 'preset') app.activePreset = null;\n if (usePersist) saveSoon();\n if (library.tab === 'palettes') library.refresh();\n schedule();\n });\n let saveT = null;\n const saveSoon = () => { clearTimeout(saveT); saveT = setTimeout(() => persist.save('settings', app.shared), 300); };\n\n // ================================================================ files\n async function makeThumb(drawable, w, hgt) {\n const c = document.createElement('canvas');\n const k = 72 / Math.max(w, hgt);\n c.width = Math.max(1, Math.round(w * k)); c.height = Math.max(1, Math.round(hgt * k));\n try { c.getContext('2d').drawImage(drawable, 0, 0, c.width, c.height); } catch { /* not ready */ }\n return c.toDataURL();\n }\n\n async function addImage(name, drawable, file = null) {\n const w = drawable.naturalWidth || drawable.width, hh = drawable.naturalHeight || drawable.height;\n const item = { id: crypto.randomUUID?.() || String(Math.random()), name, type: 'image', source: drawable, width: w, height: hh, file };\n item.thumb = await makeThumb(drawable, w, hh);\n app.items.push(item);\n return item;\n }\n\n async function addVideo(name, file) {\n // No `loop` attribute: looping by hand on 'ended' is more reliable (some MOV/MP4 files stalled at the\n // end and lost their sound after Chrome's built-in loop).\n const video = h('video', { muted: true, playsInline: true, preload: 'auto', crossOrigin: 'anonymous' });\n video.muted = true;\n video.src = URL.createObjectURL(file);\n try {\n await videoReady(video);\n } catch (e) {\n URL.revokeObjectURL(video.src);\n if (e.code === 3 || e.code === 4) {\n const codec = await sniffVideoCodec(file).catch(() => '');\n const alt = codec === 'H.264' ? 'WebM (VP9)' : codec === 'VP9' ? 'H.264 MP4' : 'H.264 MP4 or WebM (VP9)';\n const err = new Error(codec\n ? `it's ${codec}, which this browser can't play. Re-save it as ${alt}, or open the editor in a browser that plays ${codec}.`\n : `this browser can't play this video's format. Re-save it as ${alt}.`);\n err.code = e.code;\n throw err;\n }\n throw e;\n }\n const item = { id: crypto.randomUUID?.() || String(Math.random()), name, type: 'video', source: video, width: video.videoWidth, height: video.videoHeight, duration: video.duration, fps: 30, file };\n await seekTo(video, Math.min(0.05, video.duration / 2)).catch(() => { });\n item.thumb = await makeThumb(video, item.width, item.height);\n app.items.push(item);\n // measuring plays the video muted for a moment; Play waits for it so the two don't fight\n item.fpsReady = estimateFps(video, 30).catch(() => 30).then(f => { item.fps = f; item.fpsReady = null; if (app.current === item) updateTransport(); inspector.syncAnim(); });\n // null = can't tell from the container: the sound controls stay, just in case\n hasAudioTrack(file).then(a => { item.hasAudio = a; if (app.current === item) updateTransport(); });\n video.addEventListener('timeupdate', () => { if (app.current === item) updateTransport(); });\n video.addEventListener('play', () => { if (app.current === item) { updateTransport(); pumpVideo(item); } });\n video.addEventListener('pause', () => { if (app.current === item) { updateTransport(); schedule(); } });\n video.addEventListener('seeked', () => { if (app.current === item && !app.exporting) schedule(); });\n video.addEventListener('ended', () => {\n if (app.current !== item || app.exporting || item.fpsReady) return;\n video.currentTime = 0;\n video.play().catch(() => { });\n });\n return item;\n }\n\n async function addFiles(files) {\n const media = [], palettes = [], settingsFiles = [];\n for (const f of files) {\n if (PALETTE_EXT.test(f.name) && !/^image|^video/.test(f.type)) {\n if (/\\.json$/i.test(f.name)) settingsFiles.push(f); else palettes.push(f);\n } else if (IMAGE_TYPES.test(f.type) || VIDEO_TYPES.test(f.type) || /\\.(png|jpe?g|gif|webp|bmp|svg|avif|mp4|webm|mov)$/i.test(f.name)) media.push(f);\n }\n for (const f of palettes) await importPaletteFile(f);\n for (const f of settingsFiles) {\n const text = await f.text();\n try {\n const obj = JSON.parse(text);\n if (obj.colors || Array.isArray(obj)) await importPaletteFile(f, text);\n else { store.replace(settingsFromJSON(obj)); toast(`Loaded settings from ${f.name}`, { kind: 'ok' }); }\n } catch (e) { toast(`${f.name}: ${e.message}`, { kind: 'error' }); }\n }\n let first = null;\n const t = media.length > 2 ? toast(`Loading ${media.length} files`, { progress: true }) : null;\n for (let i = 0; i < media.length; i++) {\n const f = media[i];\n try {\n let item;\n if (VIDEO_TYPES.test(f.type) || /\\.(mp4|webm|mov)$/i.test(f.name)) item = await addVideo(f.name, f);\n else {\n let drawable;\n try { drawable = await createImageBitmap(f); } catch {\n drawable = new Image(); drawable.src = URL.createObjectURL(f); await drawable.decode();\n }\n item = await addImage(f.name, drawable, f);\n }\n first ||= item;\n } catch (e) { toast(`${f.name} could not be opened: ${e.message}`, { kind: 'error' }); }\n t?.progress((i + 1) / media.length);\n }\n t?.close();\n if (first) select(first);\n library.refresh();\n if (media.length > 1) toast(`Added ${media.length} files. They share one set of settings.`, { kind: 'ok' });\n }\n app.addFiles = addFiles;\n\n async function openFiles() {\n const files = await pickFiles({ accept: 'image/*,video/*,.gpl,.hex,.pal,.txt,.json', multiple: true });\n if (files.length) addFiles(files);\n }\n app.openFiles = openFiles;\n\n async function openSample(s) {\n const img = await loadSample(s);\n const item = await addImage(`${s.name}.svg`, img, new File([s.svg], `${s.name}.svg`, { type: 'image/svg+xml' }));\n select(item);\n library.refresh();\n }\n\n async function pasteFromClipboard() {\n try {\n const items = await navigator.clipboard.read();\n const files = [];\n for (const it of items) for (const type of it.types) if (IMAGE_TYPES.test(type)) {\n const b = await it.getType(type);\n files.push(new File([b], `pasted-${new Date().toISOString().slice(11, 19).replace(/:/g, '')}.${type.split('/')[1]}`, { type }));\n }\n if (files.length) addFiles(files); else toast('The clipboard has no image', { kind: 'error' });\n } catch {\n toast('Press Ctrl+V (\u2318V) to paste. The browser blocked direct clipboard access.');\n }\n }\n app.pasteFromClipboard = pasteFromClipboard;\n\n function select(item) {\n if (app.current && app.current.type === 'video' && app.current !== item) app.current.source.pause();\n app.current = item;\n editTarget(item);\n stageWrap.dataset.video = String(item && item.type === 'video');\n if (item && item.type === 'video') updateTransport();\n stage.clear();\n app.result = null;\n if (stage.picking) togglePicker();\n library.refresh();\n library.sourceChanged();\n schedule();\n updateStatus();\n }\n app.select = select;\n\n function removeItem(item) {\n const i = app.items.indexOf(item);\n if (i < 0) return;\n app.items.splice(i, 1);\n store.dropTarget(item.id);\n if (item.type === 'video') { item.source.pause(); URL.revokeObjectURL(item.source.src); }\n if (item.source.close && !app.items.some(i => i.source === item.source)) item.source.close(); // duplicates share a bitmap\n if (app.current === item) select(app.items[Math.min(i, app.items.length - 1)] || null);\n library.refresh();\n inspector.sync(store.settings, app.result);\n }\n app.removeItem = removeItem;\n app.clearItems = () => { for (const it of app.items.slice()) removeItem(it); };\n\n // ================================================================ per-file settings\n /** The settings a file renders with. */\n const settingsFor = item => (item === app.current ? store.settings : (item && item.own) || app.shared);\n app.settingsFor = settingsFor;\n const clone = v => JSON.parse(JSON.stringify(v));\n\n /** Point the store at the right settings for this file (its own, or the shared ones). */\n function editTarget(item, force = false) {\n const key = item && item.own ? item.id : 'shared';\n if (store.target === key && !force) return;\n store.setTarget(key, key === 'shared' ? app.shared : item.own);\n }\n\n /** Give a file its own settings (a copy of what it uses now), or link it back to the shared ones. */\n function setOwn(item, own, { quiet = false } = {}) {\n if (!item || !!item.own === own) return;\n if (own) {\n item.own = clone(settingsFor(item));\n if (item === app.current) editTarget(item);\n if (!quiet) toast(`${item.name} now has its own settings. Changes no longer affect other files.`);\n } else {\n const was = item.own;\n item.own = null;\n store.dropTarget(item.id);\n if (item === app.current) editTarget(item);\n if (!quiet) toast(`${item.name} uses the shared settings again`, { action: { label: 'Undo', onClick: () => { item.own = was; if (item === app.current) editTarget(item); afterScopeChange(); } } });\n }\n afterScopeChange();\n }\n function afterScopeChange() {\n library.refresh();\n inspector.sync(store.settings, app.result);\n if (app.result) inspector.setStats(app.result);\n schedule();\n }\n app.setOwn = setOwn;\n\n app.copySettings = item => {\n app.clipboard = clone(settingsFor(item));\n toast(`Copied the settings of ${item.name}`, { timeout: 1800 });\n library.refresh();\n };\n app.pasteSettings = item => {\n if (!app.clipboard) return;\n if (!item.own) setOwn(item, true, { quiet: true });\n if (item === app.current) store.replace(app.clipboard, 'paste');\n else item.own = clone(app.clipboard);\n toast(`Pasted settings onto ${item.name}`, { kind: 'ok', timeout: 1800 });\n afterScopeChange();\n };\n /** Make this file's settings the shared ones, and link every file to them. */\n app.applyToAll = item => {\n const snapshot = { shared: app.shared, own: new Map(app.items.map(i => [i, i.own])) };\n app.shared = clone(settingsFor(item));\n for (const it of app.items) { if (it.own) store.dropTarget(it.id); it.own = null; }\n store.setTarget('shared', app.shared);\n if (usePersist) saveSoon();\n toast(`Every file now uses the settings of ${item.name}`, {\n action: { label: 'Undo', onClick: () => {\n app.shared = snapshot.shared;\n for (const [it, own] of snapshot.own) it.own = own;\n editTarget(app.current, true);\n afterScopeChange();\n } },\n });\n afterScopeChange();\n };\n /** A second copy of a file with its own settings, for comparing two looks. */\n app.duplicate = async item => {\n let copy;\n if (item.type === 'video') copy = await addVideo(nameCopy(item.name), item.file);\n else copy = await addImage(nameCopy(item.name), item.source, item.file);\n // place it right after the original\n app.items.splice(app.items.indexOf(copy), 1);\n app.items.splice(app.items.indexOf(item) + 1, 0, copy);\n copy.own = clone(settingsFor(item));\n select(copy);\n toast(`Duplicated ${item.name}. The copy has its own settings.`, { timeout: 2400 });\n };\n const nameCopy = name => { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); return `${m[1]} copy${m[2] || ''}`; };\n app.move = (item, dir) => {\n const i = app.items.indexOf(item), j = i + dir;\n if (i < 0 || j < 0 || j >= app.items.length) return;\n [app.items[i], app.items[j]] = [app.items[j], app.items[i]];\n library.refresh();\n if (document.activeElement === document.body || document.activeElement?.closest?.('.itp-files')) library.focusFile(item);\n };\n\n // ================================================================ rename\n const splitExt = name => { const m = /^(.*?)(\\.[^.\\s]{1,5})?$/.exec(name); return [m[1], m[2] || '']; };\n /** Rename a file. The extension is kept: exports are named after it (\"<name>@4x.png\"). */\n app.rename = (item, next) => {\n const [, ext] = splitExt(item.name);\n let base = String(next || '').trim().replace(/[\\\\/:*?\"<>|]+/g, '-');\n if (ext && base.toLowerCase().endsWith(ext.toLowerCase())) base = base.slice(0, -ext.length);\n if (!base || base + ext === item.name) return;\n item.name = base + ext;\n library.refresh();\n updateStatus();\n };\n /** Edit the name in place in the header, with the name (not the extension) selected. */\n function startRename(item) {\n if (!item || fileName.hidden) return;\n if (app.current !== item) select(item);\n const [base] = splitExt(item.name);\n const input = h('input.itp-name-input', { type: 'text', value: item.name, 'aria-label': 'File name', spellcheck: false });\n input.style.width = `${Math.min(40, Math.max(12, item.name.length + 2))}ch`;\n fileName.hidden = true;\n fileName.after(input);\n input.focus();\n input.setSelectionRange(0, base.length);\n let done = false;\n const finish = commit => {\n if (done) return;\n done = true;\n if (commit) app.rename(item, input.value);\n input.remove();\n fileName.hidden = false;\n };\n input.addEventListener('keydown', e => {\n e.stopPropagation();\n if (e.key === 'Enter') { e.preventDefault(); finish(true); }\n if (e.key === 'Escape') { e.preventDefault(); finish(false); }\n });\n input.addEventListener('blur', () => finish(true));\n }\n app.startRename = startRename;\n\n // ================================================================ saved workspace\n // Files (their bytes), names, per-file settings and the shared settings, in this browser's IndexedDB.\n let savedInfo = null; // { count, bytes, savedAt } of what is saved, or null\n app.savedWorkspace = () => savedInfo;\n\n /** A Blob for a file, for saving: the original bytes, or a PNG of what was added without a file. */\n async function bytesOf(item) {\n if (item.file) return item.file;\n const c = document.createElement('canvas');\n c.width = item.width; c.height = item.height;\n c.getContext('2d').drawImage(item.source, 0, 0);\n return new Promise(res => c.toBlob(b => res(b), 'image/png'));\n }\n\n async function saveNow() {\n if (!usePersist) return;\n if (!app.items.length) {\n if (savedInfo) { await forgetSaved(); return; }\n toast('Add files first, then Save keeps them here for next time.');\n return;\n }\n saveBtn.disabled = true;\n try {\n const items = [];\n for (const it of app.items) items.push({ name: it.name, type: it.type, file: await bytesOf(it), own: it.own ? clone(it.own) : null });\n const bytes = await saveWorkspace({ shared: clone(app.shared), current: Math.max(0, app.items.indexOf(app.current)), items });\n const first = !savedInfo;\n savedInfo = { count: items.length, bytes, savedAt: Date.now() };\n library.refresh();\n toast(first\n ? `Saved ${items.length} file${items.length === 1 ? '' : 's'} (${fmtBytes(bytes)}) in this browser only. They reopen next time; remove them with Forget in the Files list.`\n : `Saved ${items.length} file${items.length === 1 ? '' : 's'} (${fmtBytes(bytes)})`, { kind: 'ok', timeout: first ? 7000 : 2200 });\n } catch (e) {\n console.error(e);\n toast(isQuotaError(e) ? \"Not enough browser storage to save these files. Remove some (videos are large) and try again.\" : `Couldn't save: ${e.message}`, { kind: 'error' });\n } finally {\n saveBtn.disabled = false;\n }\n }\n app.saveWorkspace = saveNow;\n\n async function forgetSaved() {\n try { await forgetWorkspace(); } catch (e) { toast(`Couldn't remove the saved files: ${e.message}`, { kind: 'error' }); return; }\n savedInfo = null;\n library.refresh();\n toast('Removed the saved files from this browser. Files open now stay open.');\n }\n app.forgetWorkspace = forgetSaved;\n\n /** Reopen the saved workspace (on start, when nothing else was opened). */\n async function restoreSaved() {\n const ws = await loadWorkspace();\n if (!ws) return;\n savedInfo = { count: ws.items.length, bytes: ws.items.reduce((a, it) => a + (it.file ? it.file.size : 0), 0), savedAt: ws.savedAt };\n if (app.items.length || !ws.items.length) { library.refresh(); return; }\n if (ws.shared && !/[#&]s=/.test(location.hash)) store.setTarget('shared', ws.shared); // a share link's settings win\n const t = ws.items.length > 2 ? toast(`Opening ${ws.items.length} saved files`, { progress: true }) : null;\n const added = [];\n for (let i = 0; i < ws.items.length; i++) {\n const s = ws.items[i];\n try {\n const file = s.file instanceof File ? s.file : new File([s.file], s.name, { type: s.file.type });\n let item;\n if (s.type === 'video') item = await addVideo(s.name, file);\n else {\n let drawable;\n try { drawable = await createImageBitmap(file); } catch { drawable = new Image(); drawable.src = URL.createObjectURL(file); await drawable.decode(); }\n item = await addImage(s.name, drawable, file);\n }\n item.own = s.own || null;\n added.push(item);\n } catch (e) { console.warn('[workspace] skipped', s.name, e); }\n t?.progress((i + 1) / ws.items.length);\n }\n t?.close();\n const cur = added[Math.min(ws.current || 0, added.length - 1)];\n if (cur) select(cur);\n library.refresh();\n if (added.length) toast(`Reopened your saved files (${added.length})`, { timeout: 2200 });\n }\n\n // ================================================================ video\n function updateTransport() {\n const it = app.current;\n if (!it || it.type !== 'video') return;\n const v = it.source;\n playBtn.innerHTML = icon(v.paused ? 'play' : 'pause');\n playBtn.setAttribute('aria-label', v.paused ? 'Play (Space)' : 'Pause (Space)');\n const frame = Math.floor(v.currentTime * it.fps + 1e-6);\n timeLabel.innerHTML = `${fmtTime(v.currentTime)} <span>/ ${fmtTime(v.duration)}</span>`;\n timeLabel.title = `Frame ${frame}`;\n scrub.value = String(Math.round(v.currentTime / (v.duration || 1) * 1000));\n scrub.style.setProperty('--p', `${scrub.value / 10}%`);\n fpsLabel.textContent = `${it.fps} fps`;\n soundBox.hidden = it.hasAudio === false;\n applySound(v);\n }\n /** Mute/volume on the current video and in the controls. */\n function applySound(v) {\n if (v && !app.exporting && !app.current?.fpsReady) {\n if (v.muted !== sound.muted) v.muted = sound.muted;\n if (v.volume !== sound.volume) v.volume = sound.volume;\n }\n const level = sound.muted ? 0 : sound.volume;\n const pct = Math.round(level * 100);\n muteBtn.innerHTML = icon(level ? 'volume' : 'volumeOff');\n const label = level ? `Volume ${pct}% (M mutes)` : 'Muted (M unmutes)';\n muteBtn.setAttribute('aria-label', label); muteBtn.title = label;\n volSlider.setAttribute('aria-valuenow', String(pct));\n volSlider.setAttribute('aria-valuetext', level ? `${pct}%` : 'Muted');\n volSlider.style.setProperty('--v', `${pct}%`);\n volValue.textContent = level ? String(pct) : 'Off';\n }\n function setSound(patch) {\n Object.assign(sound, patch);\n // unmuting at zero volume brings the volume back up\n if (patch.muted === false && !sound.volume) sound.volume = 1;\n persist.save('muted', sound.muted); persist.save('volume', sound.volume);\n applySound(app.current && app.current.type === 'video' ? app.current.source : null);\n }\n function pumpVideo(item) {\n const v = item.source;\n const tick = () => {\n if (v.paused || app.current !== item) return;\n schedule();\n if ('requestVideoFrameCallback' in v) v.requestVideoFrameCallback(tick); else requestAnimationFrame(tick);\n };\n tick();\n }\n async function togglePlay() {\n const it = app.current;\n if (!it || it.type !== 'video') return;\n if (!it.source.paused) { it.source.pause(); return; }\n if (it.fpsReady) await it.fpsReady; // still measuring the frame rate (plays muted for a moment)\n if (app.current !== it) return;\n applySound(it.source);\n if (it.source.ended) it.source.currentTime = 0;\n it.source.play().catch(e => toast(e.message, { kind: 'error' }));\n }\n function stepFrame(dir) {\n const it = app.current;\n if (!it || it.type !== 'video') return;\n const v = it.source; v.pause();\n const frame = Math.floor(v.currentTime * it.fps + 1e-6) + dir;\n seekTo(v, (Math.max(0, frame) + 0.5) / it.fps).then(() => { updateTransport(); schedule(); });\n }\n scrub.addEventListener('input', () => {\n const it = app.current; if (!it || it.type !== 'video') return;\n it.source.currentTime = scrub.value / 1000 * it.source.duration;\n });\n\n // ================================================================ view\n function toggleCompare(force) {\n const on = force ?? !stage.compare;\n stage.setCompare(on); compareBtn.setAttribute('aria-pressed', String(on));\n }\n function toggleGrid(force) {\n const on = force ?? !stage.grid;\n stage.setGrid(on); gridBtn.setAttribute('aria-pressed', String(on));\n if (on && stage.zoom < 6 && app.result) toast('The grid shows from 6\u00D7 zoom');\n }\n function zoomMenu(anchor) {\n menu(anchor, [\n { label: 'Fit to view', kbd: 'F', icon: 'fit', onClick: () => stage.fit() },\n 'sep',\n ...[1, 2, 4, 8, 16, 32].map(z => ({ label: `${z}\u00D7`, sub: z === 1 ? 'One screen pixel per pixel' : null, onClick: () => stage.zoomTo(z) })),\n 'sep',\n { label: 'Zoom in', kbd: '+', icon: 'zoomIn', onClick: () => stage.zoomIn() },\n { label: 'Zoom out', kbd: '-', icon: 'zoomOut', onClick: () => stage.zoomOut() },\n ]);\n }\n function togglePanel(which) {\n const key = which === 'lib' ? 'lib' : 'insp';\n const open = shell.dataset[key] !== 'open';\n shell.dataset[key] = open ? 'open' : 'closed';\n if (!narrow() || which === 'insp') persist.save(key, shell.dataset[key]);\n requestAnimationFrame(() => stage.resize());\n }\n function applyTheme(t) {\n if (t) document.documentElement.dataset.theme = t; else delete document.documentElement.dataset.theme;\n const dark = t ? t === 'dark' : !matchMedia('(prefers-color-scheme: light)').matches;\n themeBtn.innerHTML = icon(dark ? 'sun' : 'moon');\n themeBtn.setAttribute('aria-label', dark ? 'Switch to light theme (T)' : 'Switch to dark theme (T)');\n stage.redraw();\n }\n function toggleTheme() {\n const cur = document.documentElement.dataset.theme || (matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');\n const next = cur === 'dark' ? 'light' : 'dark';\n persist.save('theme', next);\n applyTheme(next);\n }\n\n // ================================================================ palettes\n function pixelsOf(item, maxSize = 4096) {\n const w = item.width, hh = item.height, k = Math.min(1, maxSize / Math.max(w, hh));\n const c = document.createElement('canvas'); c.width = Math.round(w * k); c.height = Math.round(hh * k);\n const ctx = c.getContext('2d', { willReadFrequently: true });\n ctx.drawImage(item.source, 0, 0, c.width, c.height);\n return ctx.getImageData(0, 0, c.width, c.height);\n }\n function pickAt(u, v) {\n const it = app.current; if (!it) return;\n const img = pixelsOf(it, 1024);\n const c = app.result ? app.result.crop : { x: 0, y: 0, w: 1, h: 1 };\n const x = Math.min(img.width - 1, Math.floor((c.x + u * c.w) * img.width)), y = Math.min(img.height - 1, Math.floor((c.y + v * c.h) * img.height));\n const o = (y * img.width + x) * 4;\n const hex = toHex([img.data[o], img.data[o + 1], img.data[o + 2]]);\n const s = store.settings;\n const colors = s.palette.source === 'custom' ? s.palette.colors : [];\n if (colors.includes(hex)) return toast(`${hex} is already in the palette`);\n store.update({ palette: { source: 'custom', name: s.palette.source === 'custom' ? s.palette.name : 'Picked', colors: [...colors, hex] } });\n toast(`Added ${hex}`, { kind: 'ok', timeout: 1500 });\n }\n let pickerBtn = null;\n function togglePicker(button) {\n if (button) pickerBtn = button;\n const on = !stage.picking;\n stage.setPicking(on);\n pickerBtn?.setAttribute('aria-pressed', String(on));\n if (on) {\n toggleCompare(true);\n toast('Click the image to add colours. Press Esc when done.');\n }\n }\n app.togglePicker = togglePicker;\n\n function usePalette(p) {\n if (p.id && !p.custom) store.update({ palette: { source: 'builtin', id: p.id } });\n else store.update({ palette: { source: 'custom', name: p.name, colors: p.colors } });\n }\n app.usePalette = usePalette;\n\n function rememberPalette(name, colors) {\n const list = app.userPalettes.filter(p => p.name !== name);\n list.unshift({ name, colors, custom: true });\n app.userPalettes = list.slice(0, 100);\n if (usePersist) persist.save('palettes', app.userPalettes);\n if (library.tab === 'palettes') library.refresh();\n }\n async function importPaletteFile(file, text) {\n try {\n const p = parsePalette(text ?? await file.text(), file.name);\n rememberPalette(p.name || 'Imported', p.colors);\n store.update({ palette: { source: 'custom', name: p.name || 'Imported', colors: p.colors } });\n toast(`Imported \"${p.name}\" (${p.colors.length} colours)`, { kind: 'ok' });\n } catch (e) { toast(`${file.name}: ${e.message}`, { kind: 'error' }); }\n }\n app.importPalette = async () => {\n const [f] = await pickFiles({ accept: '.gpl,.hex,.pal,.txt,.json' });\n if (f) importPaletteFile(f);\n };\n app.savePalette = () => {\n const s = store.settings;\n const colors = s.palette.source === 'extract' ? (app.result?.palette || []) : s.palette.colors;\n if (!colors.length) return toast('There is no palette to save', { kind: 'error' });\n const input = h('input.itp-input', { value: s.palette.source === 'custom' ? s.palette.name : `${s.palette.name} copy`, 'aria-label': 'Palette name' });\n const fmt = h('select.itp-select', { 'aria-label': 'Also download as' }, h('option', { value: '', text: \"Don't download\" }), h('option', { value: 'gpl', text: '.gpl (GIMP, Aseprite)' }), h('option', { value: 'hex', text: '.hex (Lospec)' }), h('option', { value: 'json', text: '.json' }));\n dialog('Save palette', [h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Name' })), input), h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Also download as' })), fmt),\n h('div.itp-strip', { style: { height: '18px' } }, ...colors.map(c => h('i', { style: { background: c } })))], {\n actions: [{ label: 'Cancel' }, { label: 'Save', primary: true, onClick: () => {\n const name = input.value.trim() || 'Palette';\n rememberPalette(name, colors);\n store.update({ palette: { source: 'custom', name, colors } });\n const slug = name.replace(/[^\\w-]+/g, '-').toLowerCase();\n if (fmt.value === 'gpl') downloadBlob(toGPL(name, colors), `${slug}.gpl`, 'text/plain');\n if (fmt.value === 'hex') downloadBlob(toHexFile(colors), `${slug}.hex`, 'text/plain');\n if (fmt.value === 'json') downloadBlob(toPaletteJSON(name, colors), `${slug}.json`, 'application/json');\n toast(`Saved \"${name}\" to Your palettes`, { kind: 'ok' });\n } }],\n });\n input.select();\n };\n app.deletePalette = p => {\n app.userPalettes = app.userPalettes.filter(x => x !== p);\n if (usePersist) persist.save('palettes', app.userPalettes);\n library.refresh();\n toast(`Deleted \"${p.name}\"`, { action: { label: 'Undo', onClick: () => rememberPalette(p.name, p.colors) } });\n };\n app.lospecDialog = () => {\n const input = h('input.itp-input', { placeholder: 'e.g. rgbg-36 or a lospec.com palette URL', 'aria-label': 'Lospec slug or URL' });\n const note = h('div.help', { text: 'Looks the palette up on lospec.com. Needs an internet connection.' });\n const d = dialog('Palette from Lospec', [h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Slug or URL' })), input, note)], {\n actions: [{ label: 'Cancel' }, { label: 'Fetch', primary: true, onClick: async () => {\n note.textContent = 'Fetching\u2026'; note.style.color = '';\n try {\n const p = await fetchLospec(input.value);\n rememberPalette(p.name, p.colors);\n store.update({ palette: { source: 'custom', name: p.name, colors: p.colors } });\n toast(`Loaded \"${p.name}\" from Lospec`, { kind: 'ok' });\n return true;\n } catch (e) { note.textContent = e.message; note.style.color = 'var(--danger)'; return false; }\n } }],\n });\n input.addEventListener('keydown', e => { if (e.key === 'Enter') d.querySelector('footer .primary').click(); });\n input.focus();\n };\n\n app.detectGrid = () => {\n const it = app.current; if (!it || it.type !== 'image') return toast('Open an image first', { kind: 'error' });\n const b = detectGrid(pixelsOf(it));\n if (b <= 1) return toast('No pixel grid found. This image doesn\\'t look upscaled.');\n store.update({ size: { mode: 'block', block: b, resample: 'nearest' } });\n toast(`Found ${b} px blocks: switched to pixel size ${b} with nearest sampling`, { kind: 'ok' });\n };\n\n // ================================================================ settings\n app.settingsJSON = () => settingsToJSON(store.settings);\n app.copyLink = async () => {\n const url = `${location.origin}${location.pathname}#s=${encodeSettings(store.settings)}`;\n try { await navigator.clipboard.writeText(url); toast('Link copied. It holds the settings, not the image.', { kind: 'ok' }); }\n catch { dialog('Share link', [h('textarea.itp-input', { rows: 3, readOnly: true, value: url })]); }\n history.replaceState(null, '', `#s=${encodeSettings(store.settings)}`);\n };\n app.saveSettingsFile = () => downloadBlob(settingsToJSON(store.settings), 'image-to-pixel-settings.json', 'application/json');\n app.loadSettingsFile = async () => {\n const [f] = await pickFiles({ accept: '.json,application/json' });\n if (!f) return;\n try { store.replace(settingsFromJSON(await f.text())); toast(`Loaded ${f.name}`, { kind: 'ok' }); } catch (e) { toast(`${f.name}: ${e.message}`, { kind: 'error' }); }\n };\n app.resetSettings = () => { store.replace(defaultSettings()); toast('Settings reset', { action: { label: 'Undo', onClick: () => store.undo() } }); };\n app.applyPreset = p => {\n store.replace(mergeSettings(defaultSettings(), { ...p.settings, export: store.settings.export }), 'preset');\n app.activePreset = p.id;\n library.refresh();\n };\n\n Object.assign(app, exporter);\n\n function exportMenu(anchor) {\n const it = app.current;\n const video = it && it.type === 'video';\n const images = app.items.filter(i => i.type === 'image').length;\n const s = store.settings;\n menu(anchor, [\n { group: 'Image' },\n { label: 'PNG', sub: app.result ? `${app.result.width * s.export.scale} \u00D7 ${app.result.height * s.export.scale}, ${s.export.scale}\u00D7 scale` : 'Open an image first', icon: 'image', kbd: 'Ctrl S', disabled: !app.result, onClick: () => app.exportPNG() },\n { label: 'Copy to clipboard', icon: 'copy', disabled: !app.result, onClick: () => app.copyImage() },\n { label: app.items.length > 1 ? `All ${app.items.length} files as ZIP` : 'All files as ZIP', sub: app.items.length > 1 ? null : 'Add two or more files', icon: 'zip', disabled: app.items.length < 2, onClick: () => app.exportZip() },\n { group: 'Animation' },\n { label: video ? 'GIF from this video' : 'GIF from all images', icon: 'gif', disabled: !video && images < 2, onClick: () => app.exportAnimation({ ...animDefaults(), format: 'gif' }) },\n { label: 'More formats\u2026', sub: 'WebM, MP4, PNG sequence, sprite sheet', icon: 'film', onClick: () => { inspector.setTab('export'); if (shell.dataset.insp !== 'open') togglePanel('insp'); } },\n { group: 'Other' },\n { label: 'Tileset', sub: '16 \u00D7 16 tiles, duplicates removed', icon: 'tiles', disabled: !app.result, onClick: () => app.exportTileset({ tile: 16, flips: false }) },\n { label: 'Copy settings link', icon: 'link', onClick: () => app.copyLink() },\n { label: 'Settings as JSON', icon: 'braces', onClick: () => app.saveSettingsFile() },\n ]);\n }\n const animDefaults = () => {\n const it = app.current;\n const video = it && it.type === 'video';\n return { source: video ? 'video' : 'files', fps: video ? Math.min(30, Math.round(it.fps || 12)) : 8, start: 0, end: video ? it.duration : 0 };\n };\n\n // ================================================================ help\n function showHelp() {\n const keys = [\n ['Open files', 'Ctrl O'], ['Paste image', 'Ctrl V'], ['Export PNG', 'Ctrl S'], ['Undo', 'Ctrl Z'], ['Redo', 'Ctrl Shift Z'],\n ['Compare', 'C'], ['Pixel grid', 'G'], ['Fit', 'F'], ['Zoom in / out', '+ -'], ['Pixel width \u00B11', '[ ]'], ['Pixel width \u00B18', 'Shift [ ]'],\n ['Next / previous dither', 'D Shift D'], ['Play / pause video', 'Space'], ['Mute / unmute video', 'M'], ['Rename file', 'F2'], ['Step one frame', ', .'], ['Library', '\\\\'], ['Inspector', '/'],\n ['Theme', 'T'], ['Next / previous file', 'Alt \u2193 \u2191'], ['Move file down / up', 'Alt Shift \u2193 \u2191'], ['This list', '?'],\n ];\n dialog('Keyboard shortcuts', [h('div.itp-keys', {}, ...keys.map(([a, k]) => h('div', {}, h('span', { text: a }), h('span', {}, ...k.split(' ').filter(Boolean).map(x => h('kbd', { text: x }))))))]);\n }\n\n // ================================================================ input\n const typing = e => e.target.closest('input, select, textarea, [contenteditable=\"true\"]') && !(e.target.type === 'range' || e.target.type === 'checkbox');\n const DITHER_ORDER = ['none', 'bayer4', 'bayer8', 'bluenoise', 'cluster4', 'floyd-steinberg', 'atkinson', 'sierra-lite', 'jarvis'];\n window.addEventListener('keydown', e => {\n if (!shell.isConnected) return;\n if (document.querySelector('dialog[open]')) return;\n const mod = e.ctrlKey || e.metaKey;\n const k = e.key;\n if (mod && k.toLowerCase() === 'z') { if (typing(e)) return; e.preventDefault(); e.shiftKey ? store.redo() : store.undo(); return; }\n if (mod && k.toLowerCase() === 'y') { if (typing(e)) return; e.preventDefault(); store.redo(); return; }\n if (mod && k.toLowerCase() === 's') { e.preventDefault(); app.exportPNG(); return; }\n if (mod && k.toLowerCase() === 'o') { e.preventDefault(); openFiles(); return; }\n if (mod || e.altKey && !['ArrowUp', 'ArrowDown'].includes(k)) return;\n if (typing(e)) { if (k === 'Escape') e.target.blur(); return; }\n const s = store.settings;\n switch (k) {\n case 'c': case 'C': toggleCompare(); break;\n case 'g': case 'G': toggleGrid(); break;\n case 'f': case 'F': stage.fit(); break;\n case '+': case '=': stage.zoomIn(); break;\n case '-': case '_': stage.zoomOut(); break;\n case 't': case 'T': toggleTheme(); break;\n case '\\\\': togglePanel('lib'); break;\n case '/': togglePanel('insp'); break;\n case '?': showHelp(); break;\n case '[': case '{': store.update({ size: { mode: 'width', width: Math.max(8, s.size.width - (e.shiftKey ? 8 : 1)) } }, { key: 'kw' }); break;\n case ']': case '}': store.update({ size: { mode: 'width', width: s.size.width + (e.shiftKey ? 8 : 1) } }, { key: 'kw' }); break;\n case 'd': case 'D': {\n const i = DITHER_ORDER.indexOf(s.dither.method);\n const next = DITHER_ORDER[(i + (e.shiftKey ? -1 : 1) + DITHER_ORDER.length) % DITHER_ORDER.length];\n store.update({ dither: { method: next } });\n toast(next === 'none' ? 'No dither' : next.replace(/-/g, ' '), { timeout: 900 });\n break;\n }\n case ' ': if (app.current?.type === 'video') { e.preventDefault(); togglePlay(); } break;\n case 'F2': if (app.current) { e.preventDefault(); startRename(app.current); } break;\n case 'm': case 'M': if (app.current?.type === 'video' && !soundBox.hidden) { e.preventDefault(); setSound({ muted: !sound.muted }); } break;\n case ',': stepFrame(-1); break;\n case '.': stepFrame(1); break;\n case 'Escape': if (stage.picking) togglePicker(); else closeMenu(); break;\n case 'ArrowDown': case 'ArrowUp':\n if (e.altKey && e.shiftKey && app.current) { e.preventDefault(); app.move(app.current, k === 'ArrowDown' ? 1 : -1); break; }\n if (e.altKey && app.items.length > 1) {\n e.preventDefault();\n const i = app.items.indexOf(app.current);\n select(app.items[(i + (k === 'ArrowDown' ? 1 : -1) + app.items.length) % app.items.length]);\n }\n break;\n default: return;\n }\n });\n\n // drag & drop, paste\n let dragDepth = 0;\n shell.addEventListener('dragenter', e => { if ([...e.dataTransfer.types].includes('Files')) { dragDepth++; shell.classList.add('itp-dragging'); } });\n shell.addEventListener('dragleave', () => { if (--dragDepth <= 0) { dragDepth = 0; shell.classList.remove('itp-dragging'); } });\n shell.addEventListener('dragover', e => { if ([...e.dataTransfer.types].includes('Files')) e.preventDefault(); });\n shell.addEventListener('drop', e => {\n e.preventDefault(); dragDepth = 0; shell.classList.remove('itp-dragging');\n if (e.dataTransfer.files.length) addFiles([...e.dataTransfer.files]);\n });\n window.addEventListener('paste', e => {\n if (!shell.isConnected || typing(e)) return;\n const files = [...(e.clipboardData?.files || [])];\n if (files.length) { e.preventDefault(); addFiles(files); return; }\n const text = e.clipboardData?.getData('text') || '';\n if (/#?[0-9a-f]{6}/i.test(text) && /\\n|,|\\s/.test(text.trim())) {\n try { const p = parsePalette(text); store.update({ palette: { source: 'custom', name: 'Pasted', colors: p.colors } }); toast(`Pasted a ${p.colors.length}-colour palette`, { kind: 'ok' }); } catch { /* not a palette */ }\n }\n });\n window.addEventListener('hashchange', () => {\n if (/[#&]s=/.test(location.hash)) { try { store.replace(decodeSettings(location.hash)); } catch { /* ignore */ } }\n });\n\n // first paint\n inspector.sync(store.settings, null);\n library.refresh();\n updateStatus();\n undoBtn.disabled = redoBtn.disabled = true;\n if (usePersist && options.restore !== false) restoreSaved().catch(e => console.warn('[workspace]', e));\n\n const api = {\n app, store,\n /** Add File objects (images, videos, palettes, settings JSON). */\n addFiles,\n /** Add an image-like source directly. */\n async addImage(source, name = 'image') { const it = await addImage(name, source); select(it); library.refresh(); return it; },\n openSample: id => openSample(SAMPLES.find(s => s.id === id) || SAMPLES[0]),\n applyPreset: id => { const p = PRESETS.find(x => x.id === id); if (p) app.applyPreset(p); },\n setTheme: t => { persist.save('theme', t); applyTheme(t); },\n get result() { return app.result; },\n /** On-screen rectangle of the image in the canvas. */\n get view() { return stage.rect; },\n /** Resolves after pending renders finish. */\n async idle() { for (let i = 0; i < 200 && (dirty || running); i++) await new Promise(r => setTimeout(r, 25)); },\n };\n return api;\n}\n\nexport { SAMPLES };\n", "// Built-in presets: partial settings applied on top of the defaults.\r\n\r\nexport const PRESETS = [\r\n {\r\n id: 'balanced', name: 'Balanced', description: 'Endesga 32, Bayer 4\u00D74. A good first look at most photos.',\r\n settings: { size: { width: 96 }, palette: { source: 'builtin', id: 'endesga-32' }, dither: { method: 'bayer4', strength: 0.6 } },\r\n },\r\n {\r\n id: 'game-boy', name: 'Game Boy', description: 'Four greens, 160 px wide, ordered dither.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'game-boy-dmg' }, dither: { method: 'bayer4', strength: 1 }, adjust: { contrast: 0.15 } },\r\n },\r\n {\r\n id: 'pico-8', name: 'PICO-8', description: '128 px, the PICO-8 palette, blue-noise dither.',\r\n settings: { size: { width: 128 }, palette: { source: 'builtin', id: 'pico-8' }, dither: { method: 'bluenoise', strength: 0.7 } },\r\n },\r\n {\r\n id: 'one-bit', name: '1-bit Atkinson', description: 'Classic Mac look: two colours, Atkinson diffusion.',\r\n settings: { size: { width: 192 }, palette: { source: 'builtin', id: '1-bit-monitor' }, dither: { method: 'atkinson', strength: 1 }, adjust: { contrast: 0.2 } },\r\n },\r\n {\r\n id: 'faithful', name: 'Faithful colour', description: 'Palette extracted from the image, Floyd\u2013Steinberg.',\r\n settings: { size: { width: 128 }, palette: { source: 'extract', count: 24 }, dither: { method: 'floyd-steinberg', strength: 0.75 } },\r\n },\r\n {\r\n id: 'sprite', name: 'Clean sprite', description: 'No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.',\r\n settings: { size: { width: 48, resample: 'nearest' }, palette: { source: 'extract', count: 12 }, dither: { method: 'none' }, cleanup: { orphans: true }, outline: { mode: 'outer', color: '#1a1c2c' } },\r\n },\r\n {\r\n id: 'cga', name: 'CGA', description: '16 hard colours with an 8\u00D78 Bayer pattern.',\r\n settings: { size: { width: 160 }, palette: { source: 'builtin', id: 'cga-16' }, dither: { method: 'bayer8', strength: 1 } },\r\n },\r\n {\r\n id: 'newsprint', name: 'Newsprint', description: 'Grey clustered-dot halftone.',\r\n settings: { size: { width: 220 }, palette: { source: 'builtin', id: 'grayscale-4' }, dither: { method: 'cluster8', strength: 1 }, adjust: { saturation: -1 } },\r\n },\r\n {\r\n id: 'soft', name: 'Soft painterly', description: 'Resurrect 64 with Sierra Lite and a light smooth.',\r\n settings: { size: { width: 112 }, palette: { source: 'builtin', id: 'resurrect-64' }, dither: { method: 'sierra-lite', strength: 0.6 }, cleanup: { smooth: true } },\r\n },\r\n];\r\n\r\nexport const getPreset = id => PRESETS.find(p => p.id === id) || null;\r\n", "// Tiny DOM helpers. No framework: the editor is small enough to wire by hand.\r\n\r\n/** Create an element: h('button.itp-btn.icon', { onclick, title }, child\u2026) */\r\nexport function h(tag, props = {}, ...children) {\r\n const [name, ...classes] = tag.split('.');\r\n const el = document.createElement(name || 'div');\r\n if (classes.length) el.className = classes.join(' ');\r\n for (const [k, v] of Object.entries(props || {})) {\r\n if (v == null || v === false) continue;\r\n if (k.startsWith('on') && typeof v === 'function') el.addEventListener(k.slice(2), v);\r\n else if (k === 'html') el.innerHTML = v;\r\n else if (k === 'text') el.textContent = v;\r\n else if (k === 'style' && typeof v === 'object') Object.assign(el.style, v);\r\n else if (k === 'dataset') Object.assign(el.dataset, v);\r\n else if (k in el && typeof v !== 'string' && k !== 'list') el[k] = v;\r\n else el.setAttribute(k, v === true ? '' : v);\r\n }\r\n append(el, children);\r\n return el;\r\n}\r\n\r\nexport function append(el, children) {\r\n for (const c of children.flat(Infinity)) {\r\n if (c == null || c === false) continue;\r\n el.append(c instanceof Node ? c : document.createTextNode(String(c)));\r\n }\r\n return el;\r\n}\r\n\r\n/** Replace all children. */\r\nexport function render(el, ...children) { el.replaceChildren(); return append(el, children); }\r\n\r\nexport const $ = (sel, root = document) => root.querySelector(sel);\r\n\r\n/** Element from an HTML string (single root). */\r\nexport function html(str) {\r\n const t = document.createElement('template');\r\n t.innerHTML = str.trim();\r\n return t.content.firstElementChild;\r\n}\r\n\r\nexport const esc = s => String(s).replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]));\r\n\r\nlet uid = 0;\r\nexport const nextId = (p = 'itp') => `${p}-${++uid}`;\r\n\r\n/** Debounce helper. */\r\nexport function debounce(fn, ms) {\r\n let t;\r\n return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), ms); };\r\n}\r\n\r\n/** Read a File as text. */\r\nexport const readText = file => file.text();\r\n\r\n/** Open a file picker and resolve with the chosen files. */\r\nexport function pickFiles({ accept = '', multiple = false } = {}) {\r\n return new Promise(res => {\r\n const input = h('input', { type: 'file', accept, multiple, style: { display: 'none' } });\r\n input.addEventListener('change', () => { res([...input.files]); input.remove(); });\r\n input.addEventListener('cancel', () => { res([]); input.remove(); });\r\n document.body.append(input);\r\n input.click();\r\n });\r\n}\r\n", "// Thin line icons drawn for this project on a 24\u00D724 grid (stroke 1.5, round caps).\n\nconst P = {\n upload: '<path d=\"M12 15V4m0 0-4 4m4-4 4 4\"/><path d=\"M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3\"/>',\n download: '<path d=\"M12 4v11m0 0-4-4m4 4 4-4\"/><path d=\"M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3\"/>',\n image: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><circle cx=\"9\" cy=\"10\" r=\"1.6\"/><path d=\"m4 17 5-4.5 4 3.5 3-2.5 4 3.5\"/>',\n film: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M7.5 4.5v15M16.5 4.5v15M3.5 9h4M3.5 15h4M16.5 9h4M16.5 15h4\"/>',\n files: '<path d=\"M8 7V5.5A1.5 1.5 0 0 1 9.5 4H15l4 4v8.5a1.5 1.5 0 0 1-1.5 1.5H16\"/><rect x=\"4.5\" y=\"7\" width=\"11.5\" height=\"13\" rx=\"1.5\"/>',\n presets: '<rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1.5\"/><path d=\"M16.5 13.5v6M13.5 16.5h6\"/>',\n palette: '<path d=\"M12 3.5a8.5 8.5 0 1 0 0 17c1.2 0 1.8-.9 1.4-2l-.3-.8c-.4-1.2.5-2.2 1.7-2.2h1.7a4 4 0 0 0 4-4c0-4.4-3.8-8-8.5-8Z\"/><circle cx=\"8\" cy=\"11\" r=\"1\"/><circle cx=\"11\" cy=\"7.5\" r=\"1\"/><circle cx=\"15.5\" cy=\"8.5\" r=\"1\"/>',\n search: '<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"m20 20-4.5-4.5\"/>',\n x: '<path d=\"M6 6l12 12M18 6 6 18\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\"/>',\n minus: '<path d=\"M5 12h14\"/>',\n chevron: '<path d=\"m9.5 6 6 6-6 6\"/>',\n chevronDown: '<path d=\"m6 9.5 6 6 6-6\"/>',\n undo: '<path d=\"M9 7 4.5 11.5 9 16\"/><path d=\"M5 11.5h9.5a5 5 0 0 1 0 10H11\"/>',\n redo: '<path d=\"m15 7 4.5 4.5L15 16\"/><path d=\"M19 11.5H9.5a5 5 0 0 0 0 10H13\"/>',\n compare: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M12 2.5v19\"/><path d=\"M15 9.5l2 2.5-2 2.5\"/><path d=\"M9 9.5 7 12l2 2.5\"/>',\n grid: '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2\"/><path d=\"M9.2 3.5v17M14.8 3.5v17M3.5 9.2h17M3.5 14.8h17\"/>',\n fit: '<path d=\"M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15\"/>',\n zoomIn: '<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"m20 20-4.5-4.5M11 8.5v5M8.5 11h5\"/>',\n zoomOut: '<circle cx=\"11\" cy=\"11\" r=\"6\"/><path d=\"m20 20-4.5-4.5M8.5 11h5\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"3.5\"/><path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4\"/>',\n moon: '<path d=\"M19.5 14.5A7.5 7.5 0 0 1 9.5 4.5a7.5 7.5 0 1 0 10 10Z\"/>',\n sidebarLeft: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M9.5 4.5v15\"/>',\n sidebarRight: '<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"15\" rx=\"2\"/><path d=\"M14.5 4.5v15\"/>',\n play: '<path d=\"M8 5.5v13l10.5-6.5L8 5.5Z\"/>',\n pause: '<path d=\"M8.5 5.5v13M15.5 5.5v13\"/>',\n stepBack: '<path d=\"M7 5.5v13M18 6l-8 6 8 6V6Z\"/>',\n stepForward: '<path d=\"M17 5.5v13M6 6l8 6-8 6V6Z\"/>',\n save: '<path d=\"M5 4.5h11l3.5 3.5v10A1.5 1.5 0 0 1 18 19.5H6A1.5 1.5 0 0 1 4.5 18V6A1.5 1.5 0 0 1 6 4.5Z\"/><path d=\"M8 4.5v4h7v-4M8 19.5v-6h8v6\"/>',\n rename: '<path d=\"M4 20h4L19 9l-4-4L4 16v4Z\"/><path d=\"m13.5 6.5 4 4\"/>',\n volume: '<path d=\"M4 9.5h3.5L12 6v12l-4.5-3.5H4z\"/><path d=\"M15.5 9.5a3.5 3.5 0 0 1 0 5M18 7a7 7 0 0 1 0 10\"/>',\n volumeOff: '<path d=\"M4 9.5h3.5L12 6v12l-4.5-3.5H4z\"/><path d=\"m16 9.5 5 5M21 9.5l-5 5\"/>',\n trash: '<path d=\"M4.5 7h15M9.5 7V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M6.5 7l1 12a1.5 1.5 0 0 0 1.5 1.4h6a1.5 1.5 0 0 0 1.5-1.4l1-12\"/>',\n link: '<path d=\"M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3\"/>',\n braces: '<path d=\"M8.5 4.5H8A2 2 0 0 0 6 6.5v3A2.5 2.5 0 0 1 3.5 12 2.5 2.5 0 0 1 6 14.5v3a2 2 0 0 0 2 2h.5M15.5 4.5h.5a2 2 0 0 1 2 2v3a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0-2.5 2.5v3a2 2 0 0 1-2 2h-.5\"/>',\n pipette: '<path d=\"m14.5 6.5 3 3M12 9l-7.2 7.2a2 2 0 0 0-.5 1V20h2.8a2 2 0 0 0 1-.5L15.2 12\"/><path d=\"M13 7.5 15.8 4.7a2.3 2.3 0 0 1 3.3 3.3L16.3 10.8 13 7.5Z\"/>',\n check: '<path d=\"m5 12.5 4.5 4.5L19 7.5\"/>',\n keyboard: '<rect x=\"2.5\" y=\"6\" width=\"19\" height=\"12\" rx=\"2\"/><path d=\"M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M8 14h8\"/>',\n reset: '<path d=\"M4.5 12a7.5 7.5 0 1 0 2.2-5.3L4.5 9\"/><path d=\"M4.5 4.5V9H9\"/>',\n sheet: '<rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"2\"/><path d=\"M3.5 12h17M12 3.5v17\"/>',\n tiles: '<rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3.5\" y=\"13.5\" width=\"7\" height=\"7\" rx=\"1\"/><path d=\"M13.5 17h7M17 13.5v7\"/>',\n zip: '<path d=\"M6 3.5h8l4.5 4.5v11a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 19V5A1.5 1.5 0 0 1 6 3.5Z\"/><path d=\"M10 3.5v2h2v2h-2v2h2v2h-2v3\"/>',\n gif: '<rect x=\"3.5\" y=\"5.5\" width=\"17\" height=\"13\" rx=\"2\"/><path d=\"M10 10.5H8.5a1.5 1.5 0 0 0 0 3H10V12M13 10v4M16 14v-4h2M16 12h1.5\"/>',\n more: '<circle cx=\"6\" cy=\"12\" r=\"1\"/><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"18\" cy=\"12\" r=\"1\"/>',\n menu: '<path d=\"M4 7h16M4 12h16M4 17h16\"/>',\n sliders: '<path d=\"M4 7h9M17 7h3M4 17h3M11 17h9\"/><circle cx=\"15\" cy=\"7\" r=\"2\"/><circle cx=\"9\" cy=\"17\" r=\"2\"/>',\n info: '<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M12 11v5M12 8h.01\"/>',\n unlink: '<path d=\"M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8\"/><path d=\"M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3\"/><path d=\"M4 4l16 16\"/>',\n arrowUp: '<path d=\"M12 19V5M6 11l6-6 6 6\"/>',\n arrowDown: '<path d=\"M12 5v14M6 13l6 6 6-6\"/>',\n layers: '<path d=\"m12 4 8.5 4.5L12 13 3.5 8.5 12 4Z\"/><path d=\"m3.5 12.5 8.5 4.5 8.5-4.5\"/><path d=\"m3.5 16.5 8.5 4.5 8.5-4.5\"/>',\n frame: '<path d=\"M7 3v14a1 1 0 0 0 1 1h13\"/><path d=\"M3 7h13a1 1 0 0 1 1 1v13\"/>',\n copy: '<rect x=\"8.5\" y=\"8.5\" width=\"11\" height=\"11\" rx=\"1.5\"/><path d=\"M15.5 8.5V6A1.5 1.5 0 0 0 14 4.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5\"/>',\n clipboard: '<rect x=\"5\" y=\"4.5\" width=\"14\" height=\"16\" rx=\"2\"/><path d=\"M9 4.5V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v.5M9 10h6M9 14h4\"/>',\n github: '<path d=\"M9 19c-4 1.3-4-2-5.5-2.5M14.5 21v-3.2c0-1 .1-1.4-.5-2 2.6-.3 5.5-1.3 5.5-5.8a4.5 4.5 0 0 0-1.2-3.1 4.2 4.2 0 0 0-.1-3.1s-1-.3-3.3 1.2a11.4 11.4 0 0 0-6 0C6.6 3.5 5.6 3.8 5.6 3.8a4.2 4.2 0 0 0-.1 3.1A4.5 4.5 0 0 0 4.3 10c0 4.5 2.9 5.5 5.5 5.8-.6.6-.6 1.2-.5 2V21\"/>',\n};\n\n/** SVG markup for an icon name. */\nexport function icon(name, cls = '') {\n return `<svg class=\"i ${cls}\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">${P[name] || ''}</svg>`;\n}\nexport const ICON_NAMES = Object.keys(P);\n", "// Settings store with undo/redo. Rapid edits to the same control (a slider drag) are\r\n// coalesced into one history step.\r\n//\r\n// The store edits one \"target\" at a time: the shared settings, or one file's own settings.\r\n// Each target keeps its own undo history, so switching files never mixes their histories.\r\n\r\nimport { mergeSettings, normalizeSettings } from '../core/settings.js';\r\n\r\nexport function createStore(initialSettings) {\r\n let settings = normalizeSettings(initialSettings);\r\n let target = 'shared';\r\n let past = [], future = [];\r\n const histories = new Map(); // target \u2192 { past, future }\r\n const subs = new Set();\r\n let lastKey = null, lastTime = 0;\r\n const LIMIT = 200;\r\n\r\n const emit = (why) => { for (const fn of subs) fn(settings, why); };\r\n const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);\r\n\r\n return {\r\n get settings() { return settings; },\r\n /** 'shared' or a file id. */\r\n get target() { return target; },\r\n subscribe(fn) { subs.add(fn); return () => subs.delete(fn); },\r\n\r\n /**\r\n * Patch settings ({ dither: { strength: 0.5 } }).\r\n * @param {object} patch\r\n * @param {{ key?: string, history?: boolean }} [opts] key: coalesce consecutive edits with the same key\r\n */\r\n update(patch, opts = {}) {\r\n const next = mergeSettings(settings, patch);\r\n if (same(next, settings)) return;\r\n const now = Date.now();\r\n const coalesce = opts.key && opts.key === lastKey && now - lastTime < 1200;\r\n if (opts.history !== false && !coalesce) {\r\n past.push(settings); if (past.length > LIMIT) past.shift();\r\n future.length = 0;\r\n }\r\n lastKey = opts.key || null; lastTime = now;\r\n settings = next;\r\n emit('update');\r\n },\r\n\r\n /** Replace everything (preset, loaded JSON, share link). One undo step. */\r\n replace(next, why = 'replace') {\r\n next = normalizeSettings(next);\r\n if (same(next, settings)) return;\r\n past.push(settings); future.length = 0; lastKey = null;\r\n settings = next;\r\n emit(why);\r\n },\r\n\r\n /**\r\n * Switch what is being edited. The current target's history is kept for when it comes back.\r\n * @param {string} key 'shared' or a file id\r\n * @param {object} value the settings to edit\r\n */\r\n setTarget(key, value) {\r\n histories.set(target, { past, future });\r\n target = key;\r\n const h = histories.get(key) || { past: [], future: [] };\r\n past = h.past; future = h.future; lastKey = null;\r\n settings = normalizeSettings(value);\r\n emit('target');\r\n },\r\n\r\n /** Forget a target's history (its file was removed or relinked). */\r\n dropTarget(key) { if (key !== target) histories.delete(key); },\r\n\r\n /** End the current coalescing group (call on slider release). */\r\n commit() { lastKey = null; },\r\n\r\n undo() { if (!past.length) return false; future.push(settings); settings = past.pop(); lastKey = null; emit('undo'); return true; },\r\n redo() { if (!future.length) return false; past.push(settings); settings = future.pop(); lastKey = null; emit('redo'); return true; },\r\n get canUndo() { return past.length > 0; },\r\n get canRedo() { return future.length > 0; },\r\n };\r\n}\r\n", "// The preview canvas: crisp integer zoom, pan, before/after split, pixel grid, eyedropper.\r\n\r\nimport { h } from './dom.js';\r\nimport { icon } from './icons.js';\r\n\r\nexport const ZOOM_STEPS = [0.25, 0.5, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64];\r\n\r\nexport function createStage({ onPick, onViewChange } = {}) {\r\n const screen = h('canvas.screen', { role: 'img', 'aria-label': 'Preview' });\r\n const splitLeft = h('span.lbl.l', { text: 'Original' });\r\n const splitRight = h('span.lbl.r', { text: 'Pixel' });\r\n const handle = h('button', { type: 'button', 'aria-label': 'Drag to compare original and result', html: icon('compare') });\r\n const split = h('div.itp-split', { hidden: true }, splitLeft, splitRight, handle);\r\n const el = h('div.itp-view', { tabindex: '0', 'aria-label': 'Canvas. Scroll to zoom, drag to pan.' }, screen, split);\r\n const ctx = screen.getContext('2d');\r\n\r\n const st = {\r\n result: null, // canvas, output size\r\n original: null, // drawable, any size\r\n crop: null, // part of the original shown, as fractions { x, y, w, h }\r\n w: 0, h: 0,\r\n x: 0, y: 0, z: 1, // top-left in css px, css px per output pixel\r\n fitted: true,\r\n compare: false, splitAt: 0.5,\r\n grid: false, picking: false,\r\n };\r\n let dpr = 1, vw = 0, vh = 0, pattern = null, patternKey = '';\r\n\r\n function checker() {\r\n const css = getComputedStyle(el);\r\n const a = css.getPropertyValue('--checker-a').trim() || '#1a1b1f', b = css.getPropertyValue('--checker-b').trim() || '#222';\r\n const key = a + b;\r\n if (key === patternKey) return pattern;\r\n const c = document.createElement('canvas'); c.width = c.height = 16;\r\n const g = c.getContext('2d');\r\n g.fillStyle = a; g.fillRect(0, 0, 16, 16); g.fillStyle = b; g.fillRect(0, 0, 8, 8); g.fillRect(8, 8, 8, 8);\r\n patternKey = key; pattern = ctx.createPattern(c, 'repeat');\r\n return pattern;\r\n }\r\n\r\n function resize() {\r\n const r = el.getBoundingClientRect();\r\n const d = Math.min(3, window.devicePixelRatio || 1);\r\n // ignore resize notifications where nothing actually changed size\r\n if (Math.abs(r.width - vw) < 0.5 && Math.abs(r.height - vh) < 0.5 && d === dpr && screen.width > 1) { draw(); return; }\r\n dpr = d; vw = r.width; vh = r.height;\r\n screen.width = Math.max(1, Math.round(vw * dpr)); screen.height = Math.max(1, Math.round(vh * dpr));\r\n if (st.fitted) fit(false); else draw();\r\n }\r\n\r\n function fitZoom() {\r\n if (!st.w) return 1;\r\n const pad = vw < 600 ? 16 : 48;\r\n // exact, not rounded: a fitted image always fills the same box, whatever its pixel size\r\n return Math.max(0.05, Math.min((vw - pad) / st.w, (vh - pad) / st.h));\r\n }\r\n\r\n function fit(notify = true) {\r\n st.z = fitZoom();\r\n st.x = (vw - st.w * st.z) / 2; st.y = (vh - st.h * st.z) / 2;\r\n st.fitted = true;\r\n draw(); if (notify && onViewChange) onViewChange(view());\r\n }\r\n\r\n function zoomTo(z, cx = vw / 2, cy = vh / 2) {\r\n z = Math.max(0.05, Math.min(128, z));\r\n const px = (cx - st.x) / st.z, py = (cy - st.y) / st.z;\r\n st.z = z; st.x = cx - px * z; st.y = cy - py * z;\r\n st.fitted = false;\r\n draw(); if (onViewChange) onViewChange(view());\r\n }\r\n\r\n function zoomStep(dir, cx, cy) {\r\n const cur = st.z;\r\n let next;\r\n if (dir > 0) next = ZOOM_STEPS.find(s => s > cur + 1e-6) || cur * 1.5;\r\n else next = [...ZOOM_STEPS].reverse().find(s => s < cur - 1e-6) || cur / 1.5;\r\n zoomTo(next, cx, cy);\r\n }\r\n\r\n function draw() {\r\n ctx.setTransform(1, 0, 0, 1, 0, 0);\r\n ctx.clearRect(0, 0, screen.width, screen.height);\r\n if (!st.result) { split.hidden = true; return; }\r\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\r\n // snap the image rect to device pixels so every output pixel is the same size\r\n const x = Math.round(st.x * dpr) / dpr, y = Math.round(st.y * dpr) / dpr;\r\n const w = Math.round(st.w * st.z * dpr) / dpr, hh = Math.round(st.h * st.z * dpr) / dpr;\r\n ctx.fillStyle = checker();\r\n ctx.fillRect(x, y, w, hh);\r\n ctx.imageSmoothingEnabled = false;\r\n ctx.drawImage(st.result, x, y, w, hh);\r\n\r\n if (st.compare && st.original) {\r\n const sx = x + w * st.splitAt;\r\n ctx.save();\r\n ctx.beginPath(); ctx.rect(x, y, Math.max(0, sx - x), hh); ctx.clip();\r\n ctx.fillStyle = checker(); ctx.fillRect(x, y, w, hh);\r\n ctx.imageSmoothingEnabled = true; ctx.imageSmoothingQuality = 'high';\r\n try {\r\n const ow = st.original.naturalWidth || st.original.videoWidth || st.original.width;\r\n const oh = st.original.naturalHeight || st.original.videoHeight || st.original.height;\r\n const c = st.crop || { x: 0, y: 0, w: 1, h: 1 };\r\n ctx.drawImage(st.original, c.x * ow, c.y * oh, c.w * ow, c.h * oh, x, y, w, hh);\r\n } catch { /* video not ready */ }\r\n ctx.restore();\r\n split.hidden = false;\r\n split.style.left = `${sx}px`;\r\n split.style.top = `${Math.max(0, y)}px`; split.style.bottom = `${Math.max(0, vh - (y + hh))}px`;\r\n } else split.hidden = true;\r\n\r\n if (st.grid && st.z >= 6) {\r\n ctx.save();\r\n ctx.beginPath(); ctx.rect(x, y, w, hh); ctx.clip();\r\n ctx.strokeStyle = 'rgba(127,127,127,0.35)';\r\n ctx.lineWidth = 1 / dpr;\r\n ctx.beginPath();\r\n const x0 = Math.max(0, Math.floor(-st.x / st.z)), x1 = Math.min(st.w, Math.ceil((vw - st.x) / st.z));\r\n const y0 = Math.max(0, Math.floor(-st.y / st.z)), y1 = Math.min(st.h, Math.ceil((vh - st.y) / st.z));\r\n for (let i = x0; i <= x1; i++) { const px = Math.round((x + i * st.z) * dpr) / dpr + 0.5 / dpr; ctx.moveTo(px, Math.max(y, 0)); ctx.lineTo(px, Math.min(y + hh, vh)); }\r\n for (let j = y0; j <= y1; j++) { const py = Math.round((y + j * st.z) * dpr) / dpr + 0.5 / dpr; ctx.moveTo(Math.max(x, 0), py); ctx.lineTo(Math.min(x + w, vw), py); }\r\n ctx.stroke();\r\n ctx.restore();\r\n }\r\n }\r\n\r\n // ---- input\r\n let drag = null;\r\n const pointers = new Map();\r\n el.addEventListener('pointerdown', e => {\r\n if (e.target === handle || handle.contains(e.target)) return;\r\n // overlays inside the view (empty state, floating tools) get normal clicks: only the canvas pans\r\n if (e.target !== el && e.target !== screen) return;\r\n el.focus({ preventScroll: true });\r\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\r\n el.setPointerCapture(e.pointerId);\r\n if (st.picking && e.button === 0 && pointers.size === 1) {\r\n const r = el.getBoundingClientRect();\r\n const u = (e.clientX - r.left - st.x) / (st.w * st.z), v = (e.clientY - r.top - st.y) / (st.h * st.z);\r\n if (u >= 0 && v >= 0 && u < 1 && v < 1 && onPick) onPick(u, v);\r\n return;\r\n }\r\n drag = { x: e.clientX, y: e.clientY, ox: st.x, oy: st.y };\r\n el.classList.add('panning');\r\n });\r\n el.addEventListener('pointermove', e => {\r\n if (!pointers.has(e.pointerId)) return;\r\n const prev = pointers.get(e.pointerId);\r\n pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\r\n if (pointers.size === 2) {\r\n // pinch\r\n const [a, b] = [...pointers.values()];\r\n const other = [...pointers.entries()].find(([id]) => id !== e.pointerId)[1];\r\n const d0 = Math.hypot(prev.x - other.x, prev.y - other.y), d1 = Math.hypot(a.x - b.x, a.y - b.y);\r\n if (d0 > 0) {\r\n const r = el.getBoundingClientRect();\r\n zoomTo(st.z * d1 / d0, (a.x + b.x) / 2 - r.left, (a.y + b.y) / 2 - r.top);\r\n }\r\n drag = null;\r\n return;\r\n }\r\n if (!drag) return;\r\n st.x = drag.ox + e.clientX - drag.x; st.y = drag.oy + e.clientY - drag.y;\r\n st.fitted = false;\r\n draw();\r\n });\r\n const end = e => { pointers.delete(e.pointerId); if (!pointers.size) { drag = null; el.classList.remove('panning'); if (onViewChange) onViewChange(view()); } };\r\n el.addEventListener('pointerup', end);\r\n el.addEventListener('pointercancel', end);\r\n el.addEventListener('wheel', e => {\r\n e.preventDefault();\r\n const r = el.getBoundingClientRect();\r\n const cx = e.clientX - r.left, cy = e.clientY - r.top;\r\n const trackpadPan = !e.ctrlKey && e.deltaMode === 0 && Math.abs(e.deltaX) > 0;\r\n if (trackpadPan) { st.x -= e.deltaX; st.y -= e.deltaY; st.fitted = false; draw(); return; }\r\n if (e.ctrlKey && e.deltaMode === 0) zoomTo(st.z * Math.exp(-e.deltaY * 0.01), cx, cy); // pinch on trackpads\r\n else zoomStep(e.deltaY < 0 ? 1 : -1, cx, cy);\r\n }, { passive: false });\r\n el.addEventListener('dblclick', () => fit());\r\n\r\n // split handle\r\n handle.addEventListener('pointerdown', e => {\r\n e.preventDefault(); handle.setPointerCapture(e.pointerId);\r\n const move = ev => {\r\n const r = el.getBoundingClientRect();\r\n st.splitAt = Math.min(1, Math.max(0, (ev.clientX - r.left - st.x) / (st.w * st.z)));\r\n draw();\r\n };\r\n const up = () => { handle.removeEventListener('pointermove', move); handle.removeEventListener('pointerup', up); };\r\n handle.addEventListener('pointermove', move); handle.addEventListener('pointerup', up);\r\n });\r\n handle.addEventListener('keydown', e => {\r\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\r\n e.preventDefault(); e.stopPropagation();\r\n st.splitAt = Math.min(1, Math.max(0, st.splitAt + (e.key === 'ArrowLeft' ? -0.05 : 0.05))); draw();\r\n }\r\n });\r\n\r\n new ResizeObserver(resize).observe(el);\r\n const view = () => ({ zoom: st.z, fitted: st.fitted, x: st.x, y: st.y });\r\n\r\n return {\r\n el,\r\n /** Show a result canvas (and the original for compare). */\r\n show(result, original, crop) {\r\n const sizeChanged = !st.result || result.width !== st.w || result.height !== st.h;\r\n const oldRect = { w: st.w * st.z, cx: st.x + st.w * st.z / 2, cy: st.y + st.h * st.z / 2 };\r\n st.result = result; st.original = original || st.original; st.crop = crop || null;\r\n if (sizeChanged) {\r\n st.w = result.width; st.h = result.height;\r\n if (st.fitted || !oldRect.w) {\r\n // not zoomed or panned by hand: fit exactly, so the image fills the same box as before\r\n fit();\r\n } else {\r\n // zoomed or panned: keep the same centre and on-screen width\r\n const z = oldRect.w / st.w;\r\n st.z = z; st.x = oldRect.cx - st.w * z / 2; st.y = oldRect.cy - st.h * z / 2;\r\n draw();\r\n if (onViewChange) onViewChange(view());\r\n }\r\n } else draw();\r\n },\r\n clear() { st.result = null; st.original = null; st.w = st.h = 0; st.fitted = true; draw(); },\r\n fit, zoomTo, zoomStep,\r\n zoomIn() { zoomStep(1); }, zoomOut() { zoomStep(-1); },\r\n get zoom() { return st.z; },\r\n get fitted() { return st.fitted; },\r\n /** Where the image sits on screen (css px), for tests and integrations. */\r\n get rect() { return { x: st.x, y: st.y, width: st.w * st.z, height: st.h * st.z, zoom: st.z }; },\r\n setCompare(on) { st.compare = on; draw(); },\r\n get compare() { return st.compare; },\r\n setGrid(on) { st.grid = on; draw(); },\r\n get grid() { return st.grid; },\r\n setPicking(on) { st.picking = on; el.classList.toggle('picking', on); },\r\n get picking() { return st.picking; },\r\n redraw: draw,\r\n resize,\r\n };\r\n}\r\n", "// Inspector controls. Each returns { el, set(value) } so the inspector can sync from state\r\n// without rebuilding (which would steal focus mid-drag).\r\n\r\nimport { h, nextId } from './dom.js';\r\nimport { icon } from './icons.js';\r\n\r\n/**\r\n * Collapsible inspector section: a header button (works the same in every browser, unlike\r\n * <details>) plus an optional reset icon that appears when the section differs from its defaults.\r\n * @param {string} title\r\n * @param {{ open?: boolean, onToggle?: (open: boolean) => void, onReset?: () => void, resetLabel?: string }} opts\r\n */\r\nexport function section(title, opts = {}, ...children) {\r\n const id = nextId('sec');\r\n const hintEl = h('span.hint', {});\r\n const toggle = h('button.itp-sec-toggle', { type: 'button', 'aria-controls': id },\r\n h('span.title', { text: title }), hintEl, h('span.chev', { html: icon('chevron') }));\r\n const reset = opts.onReset ? h('button.itp-btn.small.icon.itp-sec-reset', {\r\n type: 'button', hidden: true, title: opts.resetLabel || `Reset ${title.toLowerCase()}`, 'aria-label': opts.resetLabel || `Reset ${title.toLowerCase()} to defaults`,\r\n html: icon('reset'), onclick: () => opts.onReset(),\r\n }) : null;\r\n const body = h('div.body', { id }, ...children);\r\n const el = h('section.itp-sec', {}, h('div.itp-sec-head', {}, toggle, reset), body);\r\n const setOpen = open => {\r\n el.dataset.open = String(open);\r\n toggle.setAttribute('aria-expanded', String(open));\r\n body.hidden = !open;\r\n };\r\n toggle.addEventListener('click', () => { const open = el.dataset.open !== 'true'; setOpen(open); opts.onToggle?.(open); });\r\n setOpen(opts.open !== false);\r\n return {\r\n el, body,\r\n setHint(t) { hintEl.textContent = t; },\r\n /** Show the reset icon when the section's settings differ from the defaults. */\r\n setChanged(changed) { if (reset) reset.hidden = !changed; },\r\n setOpen,\r\n get open() { return el.dataset.open === 'true'; },\r\n };\r\n}\r\n\r\n/** Labelled field wrapper. */\r\nexport function field(label, control, { help = '', value = null, id } = {}) {\r\n const lab = h('div.lab', {}, h('label', { for: id || control.id || null, text: label }), value);\r\n return h('div.itp-field', {}, lab, control, help ? h('div.help', { text: help }) : null);\r\n}\r\n\r\n/**\r\n * Slider + number box.\r\n * @param {{ label: string, min: number, max: number, step?: number, value: number, unit?: string,\r\n * scale?: number, help?: string, onInput: (v:number)=>void, onCommit?: ()=>void }} o\r\n * scale: display multiplier (0..1 shown as 0..100 with scale 100)\r\n */\r\nexport function slider(o) {\r\n const id = nextId('sl');\r\n const k = o.scale || 1;\r\n const step = o.step || 1;\r\n const range = h('input', { type: 'range', id, min: o.min * k, max: o.max * k, step: step * k, 'aria-label': o.label });\r\n const num = h('input.itp-input', { type: 'number', min: o.min * k, max: o.max * k, step: step * k, 'aria-label': `${o.label} value` });\r\n const paint = () => { const p = (range.value - range.min) / (range.max - range.min) * 100; range.style.setProperty('--p', `${p}%`); };\r\n const set = v => { const d = round(v * k, step * k); range.value = d; num.value = d; paint(); };\r\n range.addEventListener('input', () => { num.value = range.value; paint(); o.onInput(Number(range.value) / k); });\r\n range.addEventListener('change', () => o.onCommit && o.onCommit());\r\n num.addEventListener('change', () => {\r\n const v = Math.min(o.max * k, Math.max(o.min * k, Number(num.value) || 0));\r\n set(v / k); o.onInput(v / k); o.onCommit && o.onCommit();\r\n });\r\n range.addEventListener('dblclick', () => { if (o.reset != null) { set(o.reset); o.onInput(o.reset); o.onCommit && o.onCommit(); } });\r\n set(o.value);\r\n const el = field(o.label, h('div.itp-slider', {}, range, num), { help: o.help, id });\r\n return { el, set, input: range };\r\n}\r\n\r\nconst round = (v, step) => {\r\n const d = Math.max(0, -Math.floor(Math.log10(step) + 1e-9));\r\n return Number((Math.round(v / step) * step).toFixed(d));\r\n};\r\n\r\n/** <select> with options [{ value, label, group? }]. */\r\nexport function select(o) {\r\n const id = nextId('se');\r\n const el = h('select.itp-select', { id, 'aria-label': o.label });\r\n const groups = new Map();\r\n for (const opt of o.options) {\r\n const node = h('option', { value: opt.value, text: opt.label });\r\n if (opt.group) {\r\n if (!groups.has(opt.group)) { const g = h('optgroup', { label: opt.group }); groups.set(opt.group, g); el.append(g); }\r\n groups.get(opt.group).append(node);\r\n } else el.append(node);\r\n }\r\n el.addEventListener('change', () => o.onChange(el.value));\r\n const wrapped = o.bare ? el : field(o.label, el, { help: o.help, id });\r\n return { el: wrapped, select: el, set(v) { el.value = v; } };\r\n}\r\n\r\n/** Segmented toggle [{ value, label, icon?, title? }]. */\r\nexport function segmented(o) {\r\n const btns = o.options.map(opt => h('button', {\r\n type: 'button', 'aria-pressed': 'false', title: opt.title || null,\r\n html: (opt.icon ? icon(opt.icon) : '') + (opt.label ? `<span>${opt.label}</span>` : ''),\r\n onclick: () => o.onChange(opt.value),\r\n }));\r\n const seg = h('div.itp-seg', { role: 'group', 'aria-label': o.label }, ...btns);\r\n const set = v => btns.forEach((b, i) => b.setAttribute('aria-pressed', String(o.options[i].value === v)));\r\n set(o.value);\r\n const el = o.bare ? seg : field(o.label, seg, { help: o.help });\r\n return { el, set };\r\n}\r\n\r\n/** On/off switch. */\r\nexport function toggle(o) {\r\n const input = h('input', { type: 'checkbox', role: 'switch' });\r\n input.addEventListener('change', () => o.onChange(input.checked));\r\n const lab = h('label.itp-switch', {}, h('span', { text: o.label }), input);\r\n const el = o.help ? h('div.itp-field', {}, lab, h('div.help', { text: o.help })) : lab;\r\n return { el, set(v) { input.checked = !!v; } };\r\n}\r\n\r\n/** Colour input with hex readout. */\r\nexport function colorInput(o) {\r\n const input = h('input', { type: 'color', 'aria-label': o.label });\r\n const hex = h('span.mono', {});\r\n input.addEventListener('input', () => { hex.textContent = input.value; o.onChange(input.value); });\r\n const box = h('label.itp-color', {}, input, hex);\r\n const set = v => { input.value = v; hex.textContent = v; };\r\n set(o.value || '#000000');\r\n return { el: o.bare ? box : field(o.label, box), set };\r\n}\r\n\r\n/** Number box (no slider). */\r\nexport function numberInput(o) {\r\n const id = nextId('nu');\r\n const input = h('input.itp-input.num', { type: 'number', id, min: o.min, max: o.max, step: o.step || 1, 'aria-label': o.label });\r\n input.addEventListener('change', () => {\r\n const v = Math.min(o.max, Math.max(o.min, Number(input.value) || o.min));\r\n if (input.value !== '' || !input.placeholder) input.value = v;\r\n o.onChange(v);\r\n });\r\n return { el: o.bare ? input : field(o.label, input, { help: o.help, id }), input, set(v) { input.value = v; } };\r\n}\r\n", "// Animated GIF encoder. Pixel art already uses a small palette, so frames are written\r\n// losslessly with one global colour table whenever the whole animation fits in 256 colours\r\n// (255 + transparency). Otherwise each frame gets its own table, reduced by median cut if needed.\r\n\r\nimport { upscale } from './scale.js';\r\nimport { extractPalette } from '../palette/extract.js';\r\nimport { parseColor } from '../color.js';\r\n\r\nclass ByteWriter {\r\n constructor() { this.buf = new Uint8Array(1 << 16); this.n = 0; }\r\n byte(b) { if (this.n === this.buf.length) { const nb = new Uint8Array(this.buf.length * 2); nb.set(this.buf); this.buf = nb; } this.buf[this.n++] = b; }\r\n bytes(arr) { for (let i = 0; i < arr.length; i++) this.byte(arr[i]); }\r\n u16(v) { this.byte(v & 255); this.byte((v >> 8) & 255); }\r\n str(s) { for (let i = 0; i < s.length; i++) this.byte(s.charCodeAt(i)); }\r\n result() { return this.buf.slice(0, this.n); }\r\n}\r\n\r\n/** GIF-flavoured LZW for one frame of indices. */\r\nexport function lzwEncode(indices, minCodeSize, w) {\r\n const clear = 1 << minCodeSize, eoi = clear + 1;\r\n let codeSize = minCodeSize + 1, next = eoi + 1;\r\n let dict = new Map();\r\n let cur = 0, curBits = 0;\r\n const sub = [];\r\n let block = [];\r\n const emit = code => {\r\n cur |= code << curBits; curBits += codeSize;\r\n while (curBits >= 8) { block.push(cur & 255); cur >>>= 8; curBits -= 8; if (block.length === 255) { sub.push(block); block = []; } }\r\n };\r\n emit(clear);\r\n let prefix = indices[0];\r\n for (let i = 1; i < indices.length; i++) {\r\n const k = indices[i];\r\n const key = prefix * 256 + k;\r\n const hit = dict.get(key);\r\n if (hit !== undefined) { prefix = hit; continue; }\r\n emit(prefix);\r\n if (next < 4096) {\r\n dict.set(key, next++);\r\n if (next > (1 << codeSize) && codeSize < 12) codeSize++;\r\n } else {\r\n emit(clear); dict = new Map(); codeSize = minCodeSize + 1; next = eoi + 1;\r\n }\r\n prefix = k;\r\n }\r\n emit(prefix);\r\n emit(eoi);\r\n if (curBits > 0) block.push(cur & 255);\r\n if (block.length) sub.push(block);\r\n w.byte(minCodeSize);\r\n for (const b of sub) { w.byte(b.length); w.bytes(b); }\r\n w.byte(0);\r\n}\r\n\r\nconst keyOf = (d, o) => (d[o + 3] < 128 ? -1 : (d[o] << 16) | (d[o + 1] << 8) | d[o + 2]);\r\n\r\nfunction tableFor(colorKeys, transparent) {\r\n const list = [...colorKeys].filter(k => k !== -1);\r\n const colors = list.map(k => [k >> 16, (k >> 8) & 255, k & 255]);\r\n const tIndex = transparent ? colors.length : -1;\r\n if (transparent) colors.push([0, 0, 0]);\r\n let bits = 1; while ((1 << bits) < colors.length) bits++;\r\n while (colors.length < (1 << bits)) colors.push([0, 0, 0]);\r\n const index = new Map(list.map((k, i) => [k, i]));\r\n return { colors, bits, tIndex, index };\r\n}\r\n\r\nfunction reduce(frame, max) {\r\n // > max colours: median-cut palette, then nearest colour per pixel\r\n const pal = extractPalette(frame, max).map(parseColor);\r\n const d = new Uint8ClampedArray(frame.data);\r\n const cache = new Map();\r\n for (let o = 0; o < d.length; o += 4) {\r\n if (d[o + 3] < 128) continue;\r\n const k = (d[o] << 16) | (d[o + 1] << 8) | d[o + 2];\r\n let best = cache.get(k);\r\n if (best === undefined) {\r\n let bd = Infinity; best = 0;\r\n for (let i = 0; i < pal.length; i++) {\r\n const dr = d[o] - pal[i][0], dg = d[o + 1] - pal[i][1], db = d[o + 2] - pal[i][2];\r\n const dist = dr * dr * 3 + dg * dg * 4 + db * db * 2;\r\n if (dist < bd) { bd = dist; best = i; }\r\n }\r\n cache.set(k, best);\r\n }\r\n d.set(pal[best], o);\r\n }\r\n return { ...frame, data: d };\r\n}\r\n\r\n/**\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, delay?: number }[]} frames delay in ms\r\n * @param {{ loop?: number, scale?: number, delay?: number }} [opts] loop: 0 = forever, -1 = play once\r\n * @returns {Uint8Array}\r\n */\r\nexport function encodeGIF(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const scale = Math.max(1, Math.round(opts.scale || 1));\r\n const fr = frames.map(f => ({ ...(scale > 1 ? upscale(f, scale) : f), delay: f.delay ?? opts.delay ?? 100 }));\r\n const W = fr[0].width, H = fr[0].height;\r\n\r\n // collect colours\r\n let transparent = false;\r\n const all = new Set();\r\n const perFrame = fr.map(f => {\r\n const s = new Set();\r\n for (let o = 0; o < f.data.length; o += 4) { const k = keyOf(f.data, o); if (k === -1) transparent = true; s.add(k); all.add(k); }\r\n return s;\r\n });\r\n const opaqueCount = s => s.size - (s.has(-1) ? 1 : 0);\r\n const globalOK = opaqueCount(all) + (transparent ? 1 : 0) <= 256;\r\n const global = globalOK ? tableFor(all, transparent) : null;\r\n\r\n const w = new ByteWriter();\r\n w.str('GIF89a');\r\n w.u16(W); w.u16(H);\r\n w.byte(global ? 0xf0 | (global.bits - 1) : 0x00);\r\n w.byte(0); w.byte(0);\r\n if (global) for (const c of global.colors) w.bytes(c);\r\n if (fr.length > 1 && opts.loop !== -1) {\r\n w.byte(0x21); w.byte(0xff); w.byte(11); w.str('NETSCAPE2.0'); w.byte(3); w.byte(1); w.u16(opts.loop || 0); w.byte(0);\r\n }\r\n\r\n fr.forEach((f0, i) => {\r\n let f = f0, table = global, set = perFrame[i];\r\n if (!table) {\r\n const max = transparent ? 255 : 256;\r\n if (opaqueCount(set) > max) {\r\n f = reduce(f0, max);\r\n set = new Set(); for (let o = 0; o < f.data.length; o += 4) set.add(keyOf(f.data, o));\r\n }\r\n table = tableFor(set, set.has(-1));\r\n }\r\n // graphic control extension\r\n w.byte(0x21); w.byte(0xf9); w.byte(4);\r\n w.byte(((transparent ? 2 : 1) << 2) | (table.tIndex >= 0 ? 1 : 0));\r\n w.u16(Math.max(2, Math.round(f.delay / 10)));\r\n w.byte(table.tIndex >= 0 ? table.tIndex : 0);\r\n w.byte(0);\r\n // image descriptor\r\n w.byte(0x2c); w.u16(0); w.u16(0); w.u16(W); w.u16(H);\r\n w.byte(table === global ? 0 : 0x80 | (table.bits - 1));\r\n if (table !== global) for (const c of table.colors) w.bytes(c);\r\n const idx = new Uint8Array(W * H);\r\n for (let p = 0; p < idx.length; p++) {\r\n const k = keyOf(f.data, p * 4);\r\n idx[p] = k === -1 ? table.tIndex : table.index.get(k);\r\n }\r\n lzwEncode(idx, Math.max(2, table.bits), w);\r\n });\r\n w.byte(0x3b);\r\n return w.result();\r\n}\r\n", "// Store-only zip writer (PNGs and GIFs are already compressed, so deflating again buys little).\r\n\r\nimport { crc32 } from './crc32.js';\r\n\r\nconst enc = new TextEncoder();\r\n\r\n/**\r\n * @param {{ name: string, data: Uint8Array | string, date?: Date }[]} entries\r\n * @returns {Uint8Array}\r\n */\r\nexport function createZip(entries) {\r\n const files = [], central = [];\r\n let offset = 0;\r\n const used = new Set();\r\n for (const e of entries) {\r\n let name = e.name.replace(/\\\\/g, '/').replace(/^\\/+/, '');\r\n // avoid duplicate names inside one archive\r\n if (used.has(name)) { const m = /^(.*?)(\\.[^.]*)?$/.exec(name); let i = 2; while (used.has(`${m[1]}-${i}${m[2] || ''}`)) i++; name = `${m[1]}-${i}${m[2] || ''}`; }\r\n used.add(name);\r\n const nameBytes = enc.encode(name);\r\n const data = typeof e.data === 'string' ? enc.encode(e.data) : e.data;\r\n const crc = crc32(data);\r\n const d = e.date || new Date();\r\n const time = (d.getHours() << 11) | (d.getMinutes() << 5) | (d.getSeconds() >> 1);\r\n const date = ((d.getFullYear() - 1980) << 9) | ((d.getMonth() + 1) << 5) | d.getDate();\r\n\r\n const local = new Uint8Array(30 + nameBytes.length);\r\n const lv = new DataView(local.buffer);\r\n lv.setUint32(0, 0x04034b50, true); lv.setUint16(4, 20, true); lv.setUint16(6, 0x0800, true); // UTF-8 names\r\n lv.setUint16(8, 0, true); lv.setUint16(10, time, true); lv.setUint16(12, date, true);\r\n lv.setUint32(14, crc, true); lv.setUint32(18, data.length, true); lv.setUint32(22, data.length, true);\r\n lv.setUint16(26, nameBytes.length, true); lv.setUint16(28, 0, true);\r\n local.set(nameBytes, 30);\r\n\r\n const cen = new Uint8Array(46 + nameBytes.length);\r\n const cv = new DataView(cen.buffer);\r\n cv.setUint32(0, 0x02014b50, true); cv.setUint16(4, 20, true); cv.setUint16(6, 20, true); cv.setUint16(8, 0x0800, true);\r\n cv.setUint16(10, 0, true); cv.setUint16(12, time, true); cv.setUint16(14, date, true);\r\n cv.setUint32(16, crc, true); cv.setUint32(20, data.length, true); cv.setUint32(24, data.length, true);\r\n cv.setUint16(28, nameBytes.length, true); cv.setUint32(42, offset, true);\r\n cen.set(nameBytes, 46);\r\n\r\n files.push(local, data); central.push(cen);\r\n offset += local.length + data.length;\r\n }\r\n const cenSize = central.reduce((s, c) => s + c.length, 0);\r\n const end = new Uint8Array(22);\r\n const ev = new DataView(end.buffer);\r\n ev.setUint32(0, 0x06054b50, true); ev.setUint16(8, entries.length, true); ev.setUint16(10, entries.length, true);\r\n ev.setUint32(12, cenSize, true); ev.setUint32(16, offset, true);\r\n const out = new Uint8Array(offset + cenSize + 22);\r\n let o = 0;\r\n for (const p of [...files, ...central, end]) { out.set(p, o); o += p.length; }\r\n return out;\r\n}\r\n", "// Sprite sheets (many frames \u2192 one image + atlas JSON) and tilesets (one image \u2192 unique tiles + map).\r\n\r\nconst blank = (w, h) => ({ width: w, height: h, data: new Uint8ClampedArray(w * h * 4) });\r\n\r\nfunction blit(dst, src, dx, dy, sx = 0, sy = 0, sw = src.width, sh = src.height) {\r\n for (let y = 0; y < sh; y++) {\r\n const so = ((sy + y) * src.width + sx) * 4, o = ((dy + y) * dst.width + dx) * 4;\r\n dst.data.set(src.data.subarray ? src.data.subarray(so, so + sw * 4) : Array.prototype.slice.call(src.data, so, so + sw * 4), o);\r\n }\r\n}\r\n\r\n/**\r\n * Pack frames into a grid. Frames may differ in size; cells use the largest frame.\r\n * @param {{ width: number, height: number, data: ArrayLike<number>, name?: string, delay?: number }[]} frames\r\n * @param {{ columns?: number, padding?: number, name?: string }} [opts] columns: 0 = roughly square\r\n * @returns {{ image: { width, height, data }, atlas: object }}\r\n */\r\nexport function packSpriteSheet(frames, opts = {}) {\r\n if (!frames.length) throw new Error('No frames');\r\n const pad = Math.max(0, opts.padding | 0);\r\n const cw = Math.max(...frames.map(f => f.width)), ch = Math.max(...frames.map(f => f.height));\r\n const cols = Math.max(1, Math.min(frames.length, opts.columns || Math.ceil(Math.sqrt(frames.length))));\r\n const rows = Math.ceil(frames.length / cols);\r\n const W = cols * cw + (cols - 1) * pad, H = rows * ch + (rows - 1) * pad;\r\n const image = blank(W, H);\r\n const out = {};\r\n frames.forEach((f, i) => {\r\n const x = (i % cols) * (cw + pad), y = Math.floor(i / cols) * (ch + pad);\r\n blit(image, f, x, y);\r\n out[f.name || `frame-${String(i).padStart(3, '0')}`] = {\r\n frame: { x, y, w: f.width, h: f.height },\r\n sourceSize: { w: f.width, h: f.height },\r\n ...(f.delay != null ? { duration: Math.round(f.delay) } : {}),\r\n };\r\n });\r\n // the \"hash\" flavour of the TexturePacker / Aseprite JSON format, which most engines read\r\n const atlas = { frames: out, meta: { app: 'image-to-pixel', image: (opts.name || 'sheet') + '.png', size: { w: W, h: H }, scale: '1', columns: cols, rows, padding: pad } };\r\n return { image, atlas };\r\n}\r\n\r\n/**\r\n * Cut an image into tiles, drop duplicates (optionally counting mirrored tiles as duplicates)\r\n * and return the tileset image and a tile map.\r\n * @param {{ width, height, data }} img\r\n * @param {{ tileWidth?: number, tileHeight?: number, columns?: number, flips?: boolean }} [opts]\r\n * @returns {{ image, map: { width: number, height: number, tiles: number[], flips?: number[] }, count: number }}\r\n */\r\nexport function buildTileset(img, opts = {}) {\r\n const tw = Math.max(1, opts.tileWidth || 8), th = Math.max(1, opts.tileHeight || tw);\r\n const mw = Math.ceil(img.width / tw), mh = Math.ceil(img.height / th);\r\n const tiles = [], keys = new Map(), map = [], flipsOut = [];\r\n const read = (tx, ty) => {\r\n const t = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const sx = tx * tw + x, sy = ty * th + y;\r\n if (sx >= img.width || sy >= img.height) continue;\r\n const so = (sy * img.width + sx) * 4;\r\n t.data.set([img.data[so], img.data[so + 1], img.data[so + 2], img.data[so + 3]], (y * tw + x) * 4);\r\n }\r\n return t;\r\n };\r\n const key = t => {\r\n let s = '';\r\n for (let i = 0; i < t.data.length; i += 4) s += t.data[i + 3] === 0 ? '.' : String.fromCharCode(t.data[i] + 1, t.data[i + 1] + 1, t.data[i + 2] + 1);\r\n return s;\r\n };\r\n const flip = (t, fx, fy) => {\r\n const o = blank(tw, th);\r\n for (let y = 0; y < th; y++) for (let x = 0; x < tw; x++) {\r\n const si = ((fy ? th - 1 - y : y) * tw + (fx ? tw - 1 - x : x)) * 4;\r\n o.data.set(t.data.subarray(si, si + 4), (y * tw + x) * 4);\r\n }\r\n return o;\r\n };\r\n for (let ty = 0; ty < mh; ty++) {\r\n for (let tx = 0; tx < mw; tx++) {\r\n const t = read(tx, ty);\r\n let id = keys.get(key(t)), f = 0;\r\n if (id === undefined && opts.flips) {\r\n for (const [fx, fy, code] of [[1, 0, 1], [0, 1, 2], [1, 1, 3]]) {\r\n const k = keys.get(key(flip(t, fx, fy)));\r\n if (k !== undefined) { id = k; f = code; break; }\r\n }\r\n }\r\n if (id === undefined) { id = tiles.length; tiles.push(t); keys.set(key(t), id); }\r\n map.push(id); flipsOut.push(f);\r\n }\r\n }\r\n const sheet = packSpriteSheet(tiles, { columns: opts.columns || Math.min(16, tiles.length) });\r\n return {\r\n image: sheet.image,\r\n map: { width: mw, height: mh, tileWidth: tw, tileHeight: th, tiles: map, ...(opts.flips ? { flips: flipsOut } : {}) },\r\n count: tiles.length,\r\n };\r\n}\r\n", "// Every export the editor offers. Long ones show a progress toast that can be cancelled.\n\nimport { encodePNG } from '../core/export/png.js';\nimport { encodeGIF } from '../core/export/gif.js';\nimport { createZip } from '../core/export/zip.js';\nimport { packSpriteSheet, buildTileset } from '../core/export/sheet.js';\nimport { downloadBlob } from '../core/export/canvas.js';\nimport { forEachFrame } from '../core/video/frames.js';\nimport { mergeSettings, settingsToJSON } from '../core/settings.js';\nimport { toast } from './ui.js';\n\nconst base = name => (name || 'image').replace(/\\.[^.]+$/, '').replace(/[^\\w.-]+/g, '-').replace(/^-+|-+$/g, '') || 'image';\nconst pngOpts = s => ({ scale: s.export.scale, grid: s.export.grid, gridColor: s.export.gridColor, indexed: s.export.indexed });\n\n/** Pixel size of an exported image: whole-number scale, or the framed part of the source at full resolution. */\nexport function exportSize(s, r, item) {\n if (s.export.size === 'source' && r && item && r.crop) return { width: Math.max(1, Math.round(r.crop.w * item.width)), height: Math.max(1, Math.round(r.crop.h * item.height)) };\n return { width: r ? r.width * s.export.scale : 0, height: r ? r.height * s.export.scale : 0 };\n}\n/** PNG options for one exported image. */\nconst imageOpts = (s, r, item) => (s.export.size === 'source' && item ? { ...exportSize(s, r, item), indexed: s.export.indexed } : pngOpts(s));\n\n/**\n * Whole-number scales to try for a video, best first. 'scale' = the PNG export scale; otherwise a target\n * height ('1080', '720', '2160', measured on the short side), falling back to smaller sizes if the\n * browser's encoder refuses the big one. Never below 240 px tall.\n */\nexport function videoScales(size, r, exportScale = 4) {\n const min = Math.max(1, Math.ceil(240 / Math.min(r.width, r.height)));\n const fit = target => {\n const long = Math.round(target * 16 / 9), portrait = r.height > r.width;\n const W = portrait ? target : long, H = portrait ? long : target;\n return Math.max(min, Math.min(Math.floor(W / r.width), Math.floor(H / r.height)));\n };\n const first = size === 'scale' ? Math.max(min, exportScale) : fit(Number(size) || 1080);\n const list = [first, fit(1080), fit(720), min].filter((v, i, a) => v <= first && a.indexOf(v) === i);\n return list.sort((a, b) => b - a);\n}\n\nexport function createExporter(app) {\n const S = () => app.store.settings;\n\n async function exportPNG() {\n if (!app.result) return toast('Open an image first', { kind: 'error' });\n const s = S();\n const bytes = await encodePNG(app.result, imageOpts(s, app.result, app.current));\n const out = exportSize(s, app.result, app.current);\n const suffix = s.export.size === 'source' ? `-${out.width}x${out.height}` : s.export.scale > 1 ? `@${s.export.scale}x` : '';\n downloadBlob(bytes, `${base(app.current.name)}-${app.result.width}x${app.result.height}${suffix}.png`, 'image/png');\n toast(`Saved ${out.width} \u00D7 ${out.height} PNG`, { kind: 'ok' });\n }\n\n async function copyImage() {\n if (!app.result) return;\n try {\n const bytes = await encodePNG(app.result, { ...imageOpts(S(), app.result, app.current), indexed: false });\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': new Blob([bytes], { type: 'image/png' }) })]);\n toast('Image copied', { kind: 'ok' });\n } catch (e) { toast(`Couldn't copy: ${e.message}`, { kind: 'error' }); }\n }\n\n /** Run `fn` with a cancellable progress toast. */\n async function task(label, fn) {\n const ctrl = new AbortController();\n const t = toast(label, { progress: true, onCancel: () => ctrl.abort() });\n app.exporting = true;\n try {\n const msg = await fn(ctrl.signal, (p, m) => { t.progress(p); if (m) t.update(m); });\n t.done(msg);\n } catch (e) {\n t.close();\n if (e.name !== 'AbortError') { toast(`Export failed: ${e.message}`, { kind: 'error' }); console.error(e); }\n else toast('Export cancelled');\n } finally {\n app.exporting = false;\n app.schedule();\n }\n }\n\n async function exportZip() {\n const items = app.items.slice();\n if (!items.length) return;\n await task(`Processing ${items.length} files`, async (signal, progress) => {\n const entries = [];\n const own = [];\n for (let i = 0; i < items.length; i++) {\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n const it = items[i];\n const s = app.settingsFor(it); // each file with its own settings, if it has them\n if (it.type === 'video') app.engine.invalidate();\n const r = await app.engine.process(it.source, s);\n entries.push({ name: `${base(it.name)}.png`, data: await encodePNG(r, imageOpts(s, r, it)) });\n if (it.own) own.push({ name: `${base(it.name)}.settings.json`, data: settingsToJSON(s) });\n progress((i + 1) / items.length, `Processed ${i + 1} of ${items.length}`);\n }\n entries.push({ name: 'settings.json', data: settingsToJSON(app.shared) }, ...own);\n downloadBlob(createZip(entries), 'pixel-art.zip', 'application/zip');\n return `Saved ${items.length} images as a ZIP`;\n });\n }\n\n /** Process the frames chosen in the Animation section; calls onFrame(result, i, total). */\n async function frames(opts, signal, progress, onFrame) {\n const s = S();\n if (opts.source === 'files') {\n const items = app.items.filter(i => i.type === 'image');\n let size = null;\n for (let i = 0; i < items.length; i++) {\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\n // each file keeps its own look, but every frame must share the first frame's size\n const own = app.settingsFor(items[i]);\n const r = await app.engine.process(items[i].source, size ? mergeSettings(own, { size }) : own);\n if (!size) size = { mode: 'width', width: r.width, height: r.height };\n await onFrame(r, i, items.length, items[i].name);\n progress((i + 1) / items.length, `Frame ${i + 1} of ${items.length}`);\n }\n return items.length;\n }\n const item = app.current;\n if (!item || item.type !== 'video') throw new Error('Open a video first');\n const video = item.source;\n const end = opts.end > opts.start ? opts.end : video.duration;\n return forEachFrame(video, {\n fps: opts.fps, start: opts.start, end, signal,\n onFrame: async ({ index, total }) => {\n app.engine.invalidate();\n const r = await app.engine.process(video, s);\n await onFrame(r, index, total, `${base(item.name)}-${String(index).padStart(4, '0')}`);\n progress((index + 1) / total, `Frame ${index + 1} of ${total}`);\n },\n });\n }\n\n async function exportAnimation(opts) {\n const name = opts.source === 'files' ? 'animation' : base(app.current?.name);\n const s = S();\n const delay = 1000 / opts.fps;\n if (opts.format === 'gif' || opts.format === 'png-seq') {\n await task('Rendering frames', async (signal, progress) => {\n const list = [];\n await frames(opts, signal, progress, async (r, i, total, frameName) => {\n if (opts.format === 'gif') list.push({ width: r.width, height: r.height, data: r.data, delay });\n else list.push({ name: `${frameName}.png`, data: await encodePNG(r, pngOpts(s)) });\n });\n if (opts.format === 'gif') {\n progress(1, 'Encoding GIF');\n await new Promise(r => setTimeout(r, 0));\n const bytes = encodeGIF(list, { scale: s.export.scale, loop: 0 });\n downloadBlob(bytes, `${name}.gif`, 'image/gif');\n return `Saved GIF (${list.length} frames, ${(bytes.length / 1024).toFixed(0)} KB)`;\n }\n downloadBlob(createZip(list), `${name}-frames.zip`, 'application/zip');\n return `Saved ${list.length} PNG frames`;\n });\n return;\n }\n // MP4 / WebM through WebCodecs\n await task(`Encoding ${opts.format.toUpperCase()}`, async (signal, progress) => {\n const { createVideoEncoder, decodeAudio } = await import('../video.js');\n // Keep audio: the video's own soundtrack, cut to the exported range (null when it has none)\n const item = app.current;\n let audio = null;\n if (opts.audio && opts.source === 'video' && item && item.type === 'video' && item.file) {\n progress(0, 'Reading audio');\n const end = opts.end > opts.start ? opts.end : item.source.duration;\n audio = await decodeAudio(item.file, { start: opts.start, end }).catch(e => { console.warn('[export] audio', e); return null; });\n }\n let enc = null;\n await frames(opts, signal, progress, async r => {\n if (!enc) {\n // Players stretch small videos with smoothing, which blurs pixel art. So the frames are upscaled\n // by a whole number to about the chosen size first (and H.264's colour subsampling stays inside each pixel).\n let tries = videoScales(opts.videoSize, r, s.export.scale), err = null;\n for (const scale of tries) {\n try { enc = await createVideoEncoder({ format: opts.format, fps: opts.fps, width: r.width, height: r.height, scale, audio }); break; }\n catch (e) { err = e; if (!/encoder available/.test(e.message)) throw e; }\n }\n if (!enc) throw err;\n }\n await enc.add(r);\n });\n if (audio && enc.audioCodec) progress(1, 'Encoding audio');\n const blob = await enc.finish();\n downloadBlob(blob, `${name}.${opts.format}`);\n const sound = !opts.audio || opts.source !== 'video' ? ''\n : enc.audioCodec === 'opus' && opts.format === 'mp4' ? ', with Opus audio: VLC and browsers play it, Windows Media Player and QuickTime may not'\n : enc.audioCodec ? ', with audio'\n : audio ? \", without audio (this browser can't encode it)\"\n : ', no audio track in the source';\n return `Saved ${opts.format.toUpperCase()} (${(blob.size / 1024 / 1024).toFixed(1)} MB${sound})`;\n });\n }\n\n async function exportSheet(opts) {\n const name = opts.source === 'files' ? 'sheet' : `${base(app.current?.name)}-sheet`;\n const s = S();\n await task('Building sprite sheet', async (signal, progress) => {\n const list = [];\n await frames(opts, signal, progress, (r, i, total, frameName) => { list.push({ width: r.width, height: r.height, data: r.data, name: frameName ? base(frameName) : undefined, delay: 1000 / opts.fps }); });\n const { image, atlas } = packSpriteSheet(list, { columns: opts.columns, padding: opts.padding, name });\n if (s.export.scale > 1) {\n // scale the atlas coordinates with the image\n const k = s.export.scale;\n for (const f of Object.values(atlas.frames)) { for (const key of ['x', 'y', 'w', 'h']) f.frame[key] *= k; f.sourceSize.w *= k; f.sourceSize.h *= k; }\n atlas.meta.size.w *= k; atlas.meta.size.h *= k; atlas.meta.scale = String(k);\n }\n const png = await encodePNG(image, pngOpts(s));\n downloadBlob(createZip([{ name: `${name}.png`, data: png }, { name: `${name}.json`, data: JSON.stringify(atlas, null, 2) }]), `${name}.zip`, 'application/zip');\n return `Saved a ${list.length}-frame sprite sheet`;\n });\n }\n\n async function exportTileset({ tile, flips }) {\n if (!app.result) return toast('Open an image first', { kind: 'error' });\n const s = S();\n const ts = buildTileset(app.result, { tileWidth: tile, tileHeight: tile, flips });\n const name = `${base(app.current.name)}-tiles`;\n const png = await encodePNG(ts.image, pngOpts(s));\n const map = { ...ts.map, image: `${name}.png`, note: 'tiles[] holds one tile index per cell, row by row' + (flips ? '; flips[] is 0 none, 1 horizontal, 2 vertical, 3 both' : '') };\n downloadBlob(createZip([{ name: `${name}.png`, data: png }, { name: `${name}.json`, data: JSON.stringify(map, null, 2) }]), `${name}.zip`, 'application/zip');\n toast(`Saved ${ts.count} unique tiles (${ts.map.width} \u00D7 ${ts.map.height} map)`, { kind: 'ok' });\n }\n\n return { exportPNG, copyImage, exportZip, exportAnimation, exportSheet, exportTileset };\n}\n", "// Menus, dialogs and toasts.\r\n\r\nimport { h, render } from './dom.js';\r\nimport { icon } from './icons.js';\r\n\r\nlet toastHost = null;\r\nconst host = () => (toastHost ||= document.body.appendChild(h('div.itp-toasts.itp', { role: 'status', 'aria-live': 'polite' })));\r\n\r\n/**\r\n * Show a toast. Returns { update(msg), progress(0..1), close() }.\r\n * @param {string} msg\r\n * @param {{ kind?: 'info'|'ok'|'error', timeout?: number, action?: { label, onClick }, progress?: boolean, onCancel?: () => void }} [o]\r\n */\r\nexport function toast(msg, o = {}) {\r\n const kind = o.kind || 'info';\r\n const text = h('div.msg', {}, h('div', { text: msg }));\r\n const bar = o.progress ? h('div.itp-progress', {}, h('i')) : null;\r\n if (bar) text.append(bar);\r\n const el = h(`div.itp-toast.${kind}`, {}, o.progress ? h('div.itp-spinner') : h('span.itp-dot'), text);\r\n if (o.action) el.append(h('button.itp-btn.small.outline', { type: 'button', text: o.action.label, onclick: () => { o.action.onClick(); close(); } }));\r\n if (o.onCancel) el.append(h('button.itp-btn.small', { type: 'button', text: 'Cancel', onclick: () => { o.onCancel(); close(); } }));\r\n else el.append(h('button.itp-btn.small.icon', { type: 'button', 'aria-label': 'Dismiss', html: icon('x'), onclick: () => close() }));\r\n host().append(el);\r\n let timer = null;\r\n const close = () => { clearTimeout(timer); el.remove(); };\r\n const arm = ms => { clearTimeout(timer); if (ms) timer = setTimeout(close, ms); };\r\n arm(o.timeout ?? (o.progress ? 0 : kind === 'error' ? 7000 : 3200));\r\n return {\r\n update(m) { text.firstChild.textContent = m; },\r\n progress(p) { if (bar) bar.firstChild.style.width = `${Math.round(p * 100)}%`; },\r\n close,\r\n done(m, k = 'ok') { close(); toast(m, { kind: k }); },\r\n };\r\n}\r\n\r\nlet openMenu = null;\r\n/**\r\n * Popover menu anchored to a button.\r\n * items: [{ label, sub?, icon?, kbd?, onClick, disabled? } | 'sep' | { group: 'Label' }]\r\n */\r\nexport function menu(anchor, items, { align = 'end' } = {}) {\r\n closeMenu();\r\n const el = h('div.itp-menu.itp', { role: 'menu' });\r\n for (const it of items) {\r\n if (it === 'sep') { el.append(h('hr')); continue; }\r\n if (it.group) { el.append(h('div.mlabel', { text: it.group })); continue; }\r\n const b = h('button.mi', { type: 'button', role: 'menuitem', disabled: !!it.disabled },\r\n h('span', { html: it.icon ? icon(it.icon) : '' }),\r\n h('span', {}, it.label, it.sub ? h('small', { text: it.sub }) : null),\r\n it.kbd ? h('kbd', { text: it.kbd }) : h('span'));\r\n b.addEventListener('click', () => { closeMenu(); it.onClick(); });\r\n el.append(b);\r\n }\r\n document.body.append(el);\r\n const r = anchor.getBoundingClientRect();\r\n const mw = el.offsetWidth, mh = el.offsetHeight;\r\n let left = align === 'end' ? r.right - mw : r.left;\r\n left = Math.max(8, Math.min(left, innerWidth - mw - 8));\r\n let top = r.bottom + 6;\r\n if (top + mh > innerHeight - 8) top = Math.max(8, r.top - mh - 6);\r\n Object.assign(el.style, { left: `${left}px`, top: `${top}px` });\r\n anchor.setAttribute('aria-expanded', 'true');\r\n const buttons = [...el.querySelectorAll('button.mi:not(:disabled)')];\r\n buttons[0]?.focus();\r\n const onKey = e => {\r\n const i = buttons.indexOf(document.activeElement);\r\n if (e.key === 'Escape') { e.preventDefault(); closeMenu(); anchor.focus(); }\r\n else if (e.key === 'ArrowDown') { e.preventDefault(); buttons[(i + 1) % buttons.length]?.focus(); }\r\n else if (e.key === 'ArrowUp') { e.preventDefault(); buttons[(i - 1 + buttons.length) % buttons.length]?.focus(); }\r\n else if (e.key === 'Tab') closeMenu();\r\n };\r\n const onDown = e => { if (!el.contains(e.target) && e.target !== anchor && !anchor.contains(e.target)) closeMenu(); };\r\n el.addEventListener('keydown', onKey);\r\n setTimeout(() => document.addEventListener('pointerdown', onDown, true));\r\n openMenu = { el, anchor, cleanup: () => document.removeEventListener('pointerdown', onDown, true) };\r\n}\r\nexport function closeMenu() {\r\n if (!openMenu) return;\r\n openMenu.cleanup(); openMenu.el.remove(); openMenu.anchor.setAttribute('aria-expanded', 'false');\r\n openMenu = null;\r\n}\r\n\r\n/** Modal dialog. Returns the <dialog>; content can be updated with render(). */\r\nexport function dialog(title, content, { actions = [], onClose } = {}) {\r\n const body = h('div.content', {}, content);\r\n const d = h('dialog.itp-dialog.itp', { 'aria-label': title },\r\n h('header', {}, h('h2', { text: title }), h('button.itp-btn.icon', { type: 'button', 'aria-label': 'Close', html: icon('x'), onclick: () => d.close() })),\r\n body,\r\n actions.length ? h('footer', {}, ...actions.map(a => h(`button.itp-btn${a.primary ? '.primary' : '.outline'}`, { type: 'button', text: a.label, onclick: async () => { if ((await a.onClick?.()) !== false) d.close(); } }))) : null,\r\n );\r\n d.addEventListener('close', () => { d.remove(); onClose?.(); });\r\n document.body.append(d);\r\n d.showModal();\r\n d.body = body;\r\n d.setContent = (...c) => render(body, ...c);\r\n return d;\r\n}\r\n", "// localStorage wrappers. Every access is guarded: storage may be disabled or full.\r\n\r\nconst PREFIX = 'itp:';\r\n\r\nexport function load(key, fallback) {\r\n try {\r\n const v = localStorage.getItem(PREFIX + key);\r\n return v == null ? fallback : JSON.parse(v);\r\n } catch { return fallback; }\r\n}\r\n\r\nexport function save(key, value) {\r\n try { localStorage.setItem(PREFIX + key, JSON.stringify(value)); return true; } catch { return false; }\r\n}\r\n\r\nexport function remove(key) {\r\n try { localStorage.removeItem(PREFIX + key); } catch { /* ignore */ }\r\n}\r\n", "// Right-hand inspector: Setup (everything that changes the image) and Export.\n\nimport { h, render } from './dom.js';\nimport { icon } from './icons.js';\nimport { section, slider, select, segmented, toggle, colorInput, numberInput, field } from './controls.js';\nimport { exportSize } from './exporter.js';\nimport { DITHER_METHODS, ditherKind, defaultSettings, ASPECTS, cropRect } from '../core/settings.js';\nimport * as persist from './persist.js';\nimport { PALETTES } from '../core/palette/builtin.js';\nimport { parseMatrix } from '../core/dither/matrices.js';\n\nexport function createInspector(app) {\n const { store } = app;\n const up = (patch, key) => store.update(patch, { key });\n const commit = () => store.commit();\n const S = () => store.settings;\n const DEF = defaultSettings();\n const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);\n\n // Sections start collapsed except the first of each tab; the person's choice is remembered.\n const openState = persist.load('sections', {});\n const sec = (key, title, defaultOpen, groups, ...children) => section(title, {\n open: openState[key] ?? defaultOpen,\n onToggle: open => { openState[key] = open; persist.save('sections', openState); },\n onReset: groups ? () => {\n const patch = {};\n for (const g of groups) patch[g] = JSON.parse(JSON.stringify(DEF[g]));\n store.update(patch);\n } : null,\n }, ...children);\n\n // ---- head: stats + tabs\n const statSize = h('div.v', { text: '\u2013' });\n const statColors = h('div.v', { text: '\u2013' });\n const statTime = h('div.v', { text: '\u2013' });\n const stats = h('div.itp-stats', { 'aria-live': 'polite' },\n h('div.itp-stat', {}, h('div.k', { text: 'Output' }), statSize),\n h('div.itp-stat', {}, h('div.k', { text: 'Colours' }), statColors),\n h('div.itp-stat', {}, h('div.k', { text: 'Render' }), statTime));\n\n const tabSetup = h('button', { type: 'button', role: 'tab', 'aria-selected': 'true', id: 'itp-tab-setup', 'aria-controls': 'itp-pane-setup', html: `${icon('sliders')}<span>Setup</span>` });\n const tabExport = h('button', { type: 'button', role: 'tab', 'aria-selected': 'false', id: 'itp-tab-export', 'aria-controls': 'itp-pane-export', html: `${icon('download')}<span>Export</span>` });\n const tabs = h('div.itp-seg', { role: 'tablist', 'aria-label': 'Inspector' }, tabSetup, tabExport);\n\n // ---- which settings am I editing? (only shown with two or more files)\n const scope = segmented({\n label: 'Settings apply to', bare: true,\n options: [{ value: 'shared', label: 'All files', icon: 'layers' }, { value: 'own', label: 'This file', icon: 'unlink' }],\n value: 'shared',\n onChange: v => app.current && app.setOwn(app.current, v === 'own'),\n });\n const scopeNote = h('span.itp-scope-note', {});\n const scopeRow = h('div.itp-scope', { hidden: true }, h('div.lab', {}, h('span', { text: 'Settings apply to' }), scopeNote), scope.el);\n\n // =========================================================== SETUP\n // ---- size\n const sizeMode = segmented({ label: 'Size by', options: [{ value: 'width', label: 'Width' }, { value: 'block', label: 'Pixel size' }], value: 'width', onChange: v => up({ size: { mode: v } }) });\n const width = slider({ label: 'Pixel width', min: 8, max: 512, step: 1, value: 96, reset: 96, onInput: v => up({ size: { width: v } }, 'width'), onCommit: commit });\n const height = numberInput({ label: 'Height', min: 0, max: 2048, help: 'Leave empty to keep the aspect ratio.', onChange: v => up({ size: { height: v } }) });\n height.input.placeholder = 'Auto';\n const block = slider({ label: 'Pixel size', min: 1, max: 64, step: 1, value: 8, reset: 8, help: 'How many source pixels become one output pixel.', onInput: v => up({ size: { block: v } }, 'block'), onCommit: commit });\n const resample = segmented({ label: 'Resample', options: [{ value: 'box', label: 'Average' }, { value: 'nearest', label: 'Nearest' }], value: 'box', help: 'Nearest keeps hard edges; use it for art that is already pixelated.', onChange: v => up({ size: { resample: v } }) });\n const detect = h('button.itp-btn.small.outline', { type: 'button', html: `${icon('grid')}<span>Detect grid</span>`, title: 'Find the pixel size of upscaled pixel art', onclick: () => app.detectGrid() });\n const widthBox = h('div', { style: { display: 'contents' } }, width.el, height.el);\n const blockBox = h('div', { style: { display: 'contents' } }, block.el);\n const secSize = sec('size', 'Size', true, ['size'], sizeMode.el, widthBox, blockBox, resample.el, h('div.itp-row', {}, detect));\n\n // ---- frame (crop to an aspect ratio, zoom in, choose the part)\n const aspectBtns = ASPECTS.map(a => {\n const r = a.ratio || 4 / 3;\n const glyph = h('i', { style: { width: `${Math.round(r >= 1 ? 16 : 16 * r)}px`, height: `${Math.round(r >= 1 ? 16 / r : 16)}px` } });\n if (!a.ratio) glyph.classList.add('orig');\n return h('button', { type: 'button', 'aria-pressed': 'false', title: a.id === 'original' ? 'The source\\'s own shape' : `Crop to ${a.label}`, onclick: () => up({ frame: { aspect: a.id } }) }, glyph, h('span', { text: a.label }));\n });\n const aspects = h('div.itp-aspects', { role: 'group', 'aria-label': 'Aspect ratio' }, ...aspectBtns);\n const fZoom = slider({ label: 'Zoom', min: 1, max: 8, step: 0.05, value: 1, reset: 1, help: 'Crop into the middle of the frame.', onInput: v => up({ frame: { zoom: v } }, 'fz'), onCommit: commit });\n const fX = slider({ label: 'Horizontal position', min: 0, max: 1, step: 0.01, scale: 100, value: 0.5, reset: 0.5, onInput: v => up({ frame: { x: v } }, 'fx'), onCommit: commit });\n const fY = slider({ label: 'Vertical position', min: 0, max: 1, step: 0.01, scale: 100, value: 0.5, reset: 0.5, onInput: v => up({ frame: { y: v } }, 'fy'), onCommit: commit });\n const secFrame = sec('frame', 'Frame', false, ['frame'], field('Aspect ratio', aspects), fZoom.el, fX.el, fY.el);\n\n // ---- palette\n const palSource = select({ label: 'Source', options: [\n { value: 'builtin', label: 'Built-in palette' }, { value: 'custom', label: 'Custom colours' },\n { value: 'extract', label: 'From the image' }, { value: 'none', label: 'None (keep colours)' },\n ], onChange: v => up({ palette: { source: v } }) });\n const palBuiltin = select({ label: 'Palette', options: PALETTES.map(p => ({ value: p.id, label: `${p.name} (${p.colors.length})` })), onChange: v => up({ palette: { source: 'builtin', id: v } }) });\n const palCount = slider({ label: 'Number of colours', min: 2, max: 64, step: 1, value: 16, reset: 16, onInput: v => up({ palette: { count: v } }, 'count'), onCommit: commit });\n const swatches = h('div.itp-swatches', { role: 'list', 'aria-label': 'Palette colours' });\n const swCount = h('span.val.num', {});\n const swatchField = field('Colours', swatches, { value: swCount });\n const palDistance = segmented({ label: 'Colour matching', options: [{ value: 'oklab', label: 'Perceptual' }, { value: 'rgb', label: 'RGB' }], value: 'oklab', onChange: v => up({ palette: { distance: v } }) });\n const palActions = h('div.itp-row', { style: { flexWrap: 'wrap' } },\n h('button.itp-btn.small.outline', { type: 'button', html: `${icon('upload')}<span>Import</span>`, title: '.gpl, .hex, .pal, .txt or .json', onclick: () => app.importPalette() }),\n h('button.itp-btn.small.outline', { type: 'button', html: `${icon('palette')}<span>Lospec</span>`, onclick: () => app.lospecDialog() }),\n h('button.itp-btn.small.outline', { type: 'button', html: `${icon('pipette')}<span>Pick</span>`, title: 'Add colours by clicking the image', 'aria-pressed': 'false', onclick: e => app.togglePicker(e.currentTarget) }),\n h('button.itp-btn.small', { type: 'button', html: `${icon('download')}<span>Save</span>`, title: 'Save to Your palettes', onclick: () => app.savePalette() }));\n const secPal = sec('palette', 'Palette', false, ['palette'], palSource.el, palBuiltin.el, palCount.el, swatchField, palDistance.el, palActions);\n\n // ---- dither\n const groups = { none: 'None', ordered: 'Ordered', diffusion: 'Error diffusion' };\n const dMethod = select({ label: 'Method', options: DITHER_METHODS.map(m => ({ value: m.id, label: m.label, group: groups[m.kind] })), onChange: v => up({ dither: { method: v } }) });\n const dStrength = slider({ label: 'Strength', min: 0, max: 1, step: 0.01, scale: 100, value: 0.6, reset: 0.6, onInput: v => up({ dither: { strength: v } }, 'strength'), onCommit: commit });\n const matrixText = h('textarea.itp-input', { rows: 4, spellcheck: false, 'aria-label': 'Custom threshold matrix', placeholder: '0 8 2 10\\n12 4 14 6\\n3 11 1 9\\n15 7 13 5' });\n const matrixHelp = h('div.help', { text: 'Rows of numbers, up to 16\u00D716. Only their order matters.' });\n matrixText.addEventListener('change', () => {\n try { up({ dither: { method: 'custom', matrix: parseMatrix(matrixText.value) } }); matrixHelp.textContent = 'Rows of numbers, up to 16\u00D716. Only their order matters.'; matrixHelp.style.color = ''; }\n catch (e) { matrixHelp.textContent = e.message; matrixHelp.style.color = 'var(--danger)'; }\n });\n const matrixBox = h('div.itp-field', {}, h('div.lab', {}, h('span', { text: 'Matrix' })), matrixText, matrixHelp);\n const secDither = sec('dither', 'Dither', false, ['dither'], dMethod.el, dStrength.el, matrixBox);\n\n // ---- adjust\n const pct = { min: -1, max: 1, step: 0.01, scale: 100, value: 0, reset: 0 };\n const aBright = slider({ label: 'Brightness', ...pct, onInput: v => up({ adjust: { brightness: v } }, 'br'), onCommit: commit });\n const aContrast = slider({ label: 'Contrast', ...pct, onInput: v => up({ adjust: { contrast: v } }, 'co'), onCommit: commit });\n const aSat = slider({ label: 'Saturation', ...pct, onInput: v => up({ adjust: { saturation: v } }, 'sa'), onCommit: commit });\n const aHue = slider({ label: 'Hue', min: -180, max: 180, step: 1, value: 0, reset: 0, help: 'Rotates every colour around the colour wheel; greys stay grey.', onInput: v => up({ adjust: { hue: v } }, 'hu'), onCommit: commit });\n const aGamma = slider({ label: 'Gamma', min: 0.2, max: 3, step: 0.05, value: 1, reset: 1, onInput: v => up({ adjust: { gamma: v } }, 'ga'), onCommit: commit });\n const secAdjust = sec('adjust', 'Adjust', false, ['adjust'], aBright.el, aContrast.el, aSat.el, aHue.el, aGamma.el);\n\n // ---- cleanup & outline\n const alphaCut = slider({ label: 'Alpha cutoff', min: 0, max: 1, step: 0.01, scale: 100, value: 0.5, reset: 0.5, help: 'Pixels less opaque than this become transparent.', onInput: v => up({ alpha: { threshold: v } }, 'alpha'), onCommit: commit });\n const orphans = toggle({ label: 'Remove stray pixels', onChange: v => up({ cleanup: { orphans: v } }) });\n const smooth = toggle({ label: 'Smooth small specks', onChange: v => up({ cleanup: { smooth: v } }) });\n const olMode = segmented({ label: 'Outline', options: [{ value: 'none', label: 'None' }, { value: 'outer', label: 'Outside' }, { value: 'inner', label: 'Inside' }], value: 'none', help: 'Follows transparent edges.', onChange: v => up({ outline: { mode: v } }) });\n const olColor = colorInput({ label: 'Outline colour', onChange: v => up({ outline: { color: v } }, 'olc') });\n const olCorners = toggle({ label: 'Include diagonals', onChange: v => up({ outline: { corners: v } }) });\n const secClean = sec('cleanup', 'Cleanup & outline', false, ['cleanup', 'outline', 'alpha'], orphans.el, smooth.el, alphaCut.el, olMode.el, olColor.el, olCorners.el);\n\n const setupPane = h('div', { id: 'itp-pane-setup', role: 'tabpanel', 'aria-labelledby': 'itp-tab-setup' }, secSize.el, secFrame.el, secPal.el, secDither.el, secAdjust.el, secClean.el);\n\n // =========================================================== EXPORT\n const exMode = segmented({ label: 'Size', options: [{ value: 'scale', label: 'Scale' }, { value: 'source', label: 'Source size' }], value: 'scale', help: '', onChange: v => up({ export: { size: v } }) });\n const exScale = slider({ label: 'Scale', min: 1, max: 32, step: 1, value: 4, reset: 4, help: 'Whole-number upscale keeps every pixel square.', onInput: v => up({ export: { scale: v } }, 'scale'), onCommit: commit });\n const exSizeOut = h('span.val.num', {});\n const exGrid = toggle({ label: 'Grid lines', onChange: v => up({ export: { grid: v } }) });\n const exIndexed = toggle({ label: 'Indexed PNG', help: 'Smaller files; up to 256 colours.', onChange: v => up({ export: { indexed: v } }) });\n const btnPNG = h('button.itp-btn.primary.block', { type: 'button', html: `${icon('download')}<span>Download PNG</span>`, onclick: () => app.exportPNG() });\n const btnCopy = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('copy')}<span>Copy image</span>`, onclick: () => app.copyImage() });\n const btnZip = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('zip')}<span>Download all as ZIP</span>`, onclick: () => app.exportZip() });\n const secImage = sec('image', 'Image', true, ['export'], field('Output size', h('div'), { value: exSizeOut }), exMode.el, exScale.el, exGrid.el, exIndexed.el, h('div.itp-grid2', {}, btnPNG, btnCopy), btnZip);\n\n // animation\n const anSource = select({ label: 'Frames from', options: [{ value: 'video', label: 'Current video' }, { value: 'files', label: 'All files, in order' }], onChange: () => syncAnim() });\n const anFormat = select({ label: 'Format', options: [\n { value: 'gif', label: 'GIF' }, { value: 'webm', label: 'WebM video' }, { value: 'mp4', label: 'MP4 video' }, { value: 'png-seq', label: 'PNG sequence (ZIP)' },\n ], onChange: () => syncAnim() });\n const anFps = numberInput({ label: 'Frames per second', min: 1, max: 60, onChange: () => { } });\n const anStart = numberInput({ label: 'Start (s)', min: 0, max: 36000, step: 0.1, onChange: () => { } });\n const anEnd = numberInput({ label: 'End (s)', min: 0, max: 36000, step: 0.1, onChange: () => { } });\n const anSize = select({ label: 'Video size', options: [\n { value: '1080', label: 'Full HD (sharp in any player)' }, { value: '720', label: '720p' }, { value: '2160', label: '4K' }, { value: 'scale', label: 'Same scale as PNG' },\n ], onChange: () => { } });\n anSize.set('1080');\n const anAudio = toggle({ label: 'Keep audio', help: \"The video's soundtrack, cut to the same start and end. MP4 and WebM only.\", onChange: () => syncAnim() });\n const anAudioInput = anAudio.el.querySelector('input');\n const anNote = h('div.help', {});\n const btnAnim = h('button.itp-btn.primary.block', { type: 'button', html: `${icon('film')}<span>Export animation</span>`, onclick: () => app.exportAnimation(animOpts()) });\n const secAnim = sec('animation', 'Animation', false, null, anSource.el, anFormat.el, anFps.el, h('div.itp-grid2', {}, anStart.el, anEnd.el), anSize.el, anAudio.el, anNote, btnAnim);\n anFps.set(12); anStart.set(0); anEnd.set(0); anAudio.set(true);\n const animOpts = () => ({ source: anSource.select.value, format: anFormat.select.value, fps: Number(anFps.input.value) || 12, start: Number(anStart.input.value) || 0, end: Number(anEnd.input.value) || 0, audio: anAudioInput.checked, videoSize: anSize.select.value });\n\n // sprite sheet\n const shCols = numberInput({ label: 'Columns', min: 0, max: 256, help: '0 = as square as possible.', onChange: () => { } });\n const shPad = numberInput({ label: 'Padding', min: 0, max: 64, onChange: () => { } });\n shCols.set(0); shPad.set(0);\n const btnSheet = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('sheet')}<span>Download sprite sheet</span>`, onclick: () => app.exportSheet({ ...animOpts(), columns: Number(shCols.input.value) || 0, padding: Number(shPad.input.value) || 0 }) });\n const secSheet = sec('sheet', 'Sprite sheet', false, null, h('div.help', { text: 'Packs the frames chosen under Animation into one PNG with a JSON atlas (TexturePacker hash format).' }), h('div.itp-grid2', {}, shCols.el, shPad.el), btnSheet);\n\n // tileset\n const tsSize = select({ label: 'Tile size', options: [8, 12, 16, 24, 32, 48, 64].map(n => ({ value: String(n), label: `${n} \u00D7 ${n}` })), onChange: () => { } });\n tsSize.set('16');\n const tsFlips = toggle({ label: 'Count mirrored tiles as duplicates', onChange: () => { } });\n const btnTiles = h('button.itp-btn.outline.block', { type: 'button', html: `${icon('tiles')}<span>Download tileset</span>`, onclick: () => app.exportTileset({ tile: Number(tsSize.select.value), flips: tsFlips.el.querySelector('input').checked }) });\n const secTiles = sec('tileset', 'Tileset', false, null, h('div.help', { text: 'Cuts the current result into tiles, keeps one copy of each and writes a tile map.' }), tsSize.el, tsFlips.el, btnTiles);\n\n // settings\n const secSettings = sec('settings', 'Settings', false, null,\n h('div.itp-grid2', {},\n h('button.itp-btn.outline', { type: 'button', html: `${icon('link')}<span>Copy link</span>`, onclick: () => app.copyLink() }),\n h('button.itp-btn.outline', { type: 'button', html: `${icon('braces')}<span>Save JSON</span>`, onclick: () => app.saveSettingsFile() })),\n h('button.itp-btn.outline.block', { type: 'button', html: `${icon('upload')}<span>Load settings file</span>`, onclick: () => app.loadSettingsFile() }));\n\n const exportPane = h('div', { id: 'itp-pane-export', role: 'tabpanel', 'aria-labelledby': 'itp-tab-export', hidden: true }, secImage.el, secAnim.el, secSheet.el, secTiles.el, secSettings.el);\n\n // ---- footer\n const foot = h('div.itp-insp-foot', {},\n h('button.itp-link', { type: 'button', text: 'Reset to defaults', onclick: () => app.resetSettings() }),\n h('span.muted', { style: { fontSize: 'var(--fs-xs)' }, id: 'itp-backend' }));\n\n const body = h('div.itp-panel-body', {}, setupPane, exportPane);\n const el = h('aside.itp-insp', { 'aria-label': 'Inspector' }, h('div.itp-insp-head', {}, stats, scopeRow, tabs), h('div', { style: { height: '8px' } }), body, foot);\n\n function setTab(t) {\n const setup = t === 'setup';\n tabSetup.setAttribute('aria-selected', String(setup)); tabExport.setAttribute('aria-selected', String(!setup));\n setupPane.hidden = !setup; exportPane.hidden = setup;\n if (!setup) syncAnim();\n }\n tabSetup.onclick = () => setTab('setup');\n tabExport.onclick = () => setTab('export');\n tabs.addEventListener('keydown', e => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') { const next = tabSetup.getAttribute('aria-selected') === 'true' ? tabExport : tabSetup; next.click(); next.focus(); }\n });\n\n function syncAnim() {\n const cur = app.current;\n const hasVideo = cur && cur.type === 'video';\n const nImages = app.items.filter(i => i.type === 'image').length;\n if (!hasVideo && anSource.select.value === 'video' && nImages > 1) anSource.set('files');\n if (hasVideo && anSource.select.value === 'files' && nImages < 2) anSource.set('video');\n const src = anSource.select.value;\n const ok = src === 'video' ? hasVideo : nImages > 1;\n anStart.el.hidden = anEnd.el.hidden = src !== 'video';\n btnAnim.disabled = !ok; btnSheet.disabled = !ok;\n if (hasVideo && !Number(anEnd.input.value)) anEnd.set(Math.round((cur.duration || 0) * 10) / 10);\n if (hasVideo && cur.fps && !anFps.input.dataset.touched) anFps.set(Math.min(30, Math.round(cur.fps)));\n const f = anFormat.select.value;\n const isVideo = f === 'mp4' || f === 'webm';\n anAudio.el.hidden = !(src === 'video' && isVideo);\n anSize.el.hidden = !isVideo;\n const vs = app.videoSupport;\n const noAudio = vs && 'opus' in vs && anAudioInput.checked && !anAudio.el.hidden && !(f === 'mp4' ? vs.aac || vs.opus : vs.opus);\n anNote.textContent = !ok\n ? (src === 'video' ? 'Open a video to export an animation.' : 'Add two or more images to animate them.')\n : isVideo && !vs?.[f] ? `${f.toUpperCase()} encoding isn't available in this browser. GIF and PNG sequence always work.`\n : noAudio ? \"This browser can't encode audio, so the video will be silent.\"\n : f === 'mp4' && vs && 'aac' in vs && !vs.aac && vs.opus && anAudioInput.checked && !anAudio.el.hidden\n ? \"This browser can't encode AAC, so the MP4's sound will be Opus, which Windows Media Player and QuickTime may not play. WebM, or Chrome/Edge on Windows or macOS, avoids that.\"\n : '';\n }\n anFps.input.addEventListener('change', () => { anFps.input.dataset.touched = '1'; });\n\n // ---- sync from state\n function renderSwatches(colors, editable) {\n render(swatches, ...colors.map((c, i) => {\n const b = h('button.itp-swatch', { type: 'button', role: 'listitem', title: editable ? `${c}. Click to change, Alt+click to remove` : c, style: { background: c } });\n b.setAttribute('aria-label', editable ? `${c}, edit` : c);\n if (editable) {\n b.addEventListener('click', e => {\n if (e.altKey) { const next = S().palette.colors.filter((_, j) => j !== i); if (next.length) up({ palette: { colors: next } }); return; }\n const inp = h('input', { type: 'color', value: c, style: { position: 'fixed', opacity: 0, pointerEvents: 'none' } });\n document.body.append(inp);\n inp.addEventListener('input', () => { const next = S().palette.colors.slice(); next[i] = inp.value; up({ palette: { colors: next } }, 'sw' + i); });\n inp.addEventListener('change', () => inp.remove());\n inp.click();\n });\n } else {\n b.addEventListener('click', () => { up({ palette: { source: 'custom', colors: S().palette.colors.slice(), name: `${S().palette.name} (edited)` } }); app.toast('Copied to a custom palette you can edit'); });\n }\n return b;\n }), editable ? h('button.itp-swatch.add', { type: 'button', 'aria-label': 'Add colour', title: 'Add colour', html: icon('plus'), onclick: () => up({ palette: { colors: [...S().palette.colors, '#808080'] } }) }) : null);\n }\n\n let lastPaletteKey = '';\n function sync(s, result) {\n sizeMode.set(s.size.mode);\n widthBox.hidden = s.size.mode !== 'width'; blockBox.hidden = s.size.mode !== 'block';\n width.set(s.size.width); height.set(s.size.height || ''); block.set(s.size.block); resample.set(s.size.resample);\n secSize.setHint(result ? `${result.width} \u00D7 ${result.height}` : '');\n\n palSource.set(s.palette.source); palBuiltin.set(s.palette.id);\n palBuiltin.el.hidden = s.palette.source !== 'builtin';\n palCount.el.hidden = s.palette.source !== 'extract';\n palCount.set(s.palette.count);\n palDistance.set(s.palette.distance);\n palDistance.el.hidden = s.palette.source === 'none';\n swatchField.hidden = s.palette.source === 'none';\n const shown = s.palette.source === 'extract' ? (result && result.palette) || [] : s.palette.colors;\n const key = s.palette.source + shown.join();\n if (key !== lastPaletteKey) { lastPaletteKey = key; renderSwatches(shown, s.palette.source === 'custom'); }\n swCount.textContent = String(shown.length);\n secPal.setHint(s.palette.source === 'none' ? 'None' : s.palette.name);\n\n dMethod.set(s.dither.method); dStrength.set(s.dither.strength);\n const kind = ditherKind(s.dither.method);\n dStrength.el.hidden = kind === 'none';\n matrixBox.hidden = s.dither.method !== 'custom';\n if (s.dither.method === 'custom' && document.activeElement !== matrixText) matrixText.value = (s.dither.matrix || []).map(r => r.join(' ')).join('\\n');\n secDither.setHint(s.palette.source === 'none' ? 'Needs a palette' : DITHER_METHODS.find(m => m.id === s.dither.method).label);\n secDither.el.querySelector('select').disabled = s.palette.source === 'none';\n\n aBright.set(s.adjust.brightness); aContrast.set(s.adjust.contrast); aSat.set(s.adjust.saturation); aHue.set(s.adjust.hue); aGamma.set(s.adjust.gamma);\n const adjusted = s.adjust.brightness || s.adjust.contrast || s.adjust.saturation || s.adjust.hue || s.adjust.gamma !== 1;\n\n // frame\n aspectBtns.forEach((b, i) => b.setAttribute('aria-pressed', String(ASPECTS[i].id === s.frame.aspect)));\n fZoom.set(s.frame.zoom); fX.set(s.frame.x); fY.set(s.frame.y);\n const cur = app.current;\n const crop = cur ? cropRect(cur.width, cur.height, s.frame) : null;\n // position sliders only matter when the frame leaves room to move in that direction\n fX.el.hidden = !crop || crop.w >= cur.width;\n fY.el.hidden = !crop || crop.h >= cur.height;\n const framed = s.frame.aspect !== 'original' || s.frame.zoom > 1;\n secFrame.setHint(!framed ? '' : [s.frame.aspect !== 'original' ? s.frame.aspect : '', s.frame.zoom > 1 ? `${Math.round(s.frame.zoom * 100) / 100}\u00D7` : ''].filter(Boolean).join(', '));\n secFrame.setChanged(!same(s.frame, DEF.frame));\n\n // scope\n const many = app.items.length > 1;\n scopeRow.hidden = !(cur && (many || cur.own));\n scope.set(cur && cur.own ? 'own' : 'shared');\n const nShared = app.items.filter(i => !i.own).length;\n scopeNote.textContent = cur && cur.own ? 'Only this file' : `${nShared} ${nShared === 1 ? 'file' : 'files'}`;\n el.dataset.scope = cur && cur.own ? 'own' : 'shared';\n secAdjust.setHint(adjusted ? 'Changed' : '');\n\n alphaCut.set(s.alpha.threshold); orphans.set(s.cleanup.orphans); smooth.set(s.cleanup.smooth);\n olMode.set(s.outline.mode); olColor.set(s.outline.color); olCorners.set(s.outline.corners);\n olColor.el.hidden = olCorners.el.hidden = s.outline.mode === 'none';\n const cl = [s.cleanup.orphans && 'strays', s.cleanup.smooth && 'smooth', s.outline.mode !== 'none' && 'outline'].filter(Boolean);\n secClean.setHint(cl.join(', '));\n\n // reset icons\n secSize.setChanged(!same(s.size, DEF.size));\n secPal.setChanged(!same(s.palette, DEF.palette));\n secDither.setChanged(!same(s.dither, DEF.dither));\n secAdjust.setChanged(!same(s.adjust, DEF.adjust));\n secClean.setChanged(!same([s.cleanup, s.outline, s.alpha], [DEF.cleanup, DEF.outline, DEF.alpha]));\n secImage.setChanged(!same(s.export, DEF.export));\n\n exScale.set(s.export.scale); exGrid.set(s.export.grid); exIndexed.set(s.export.indexed); exMode.set(s.export.size);\n exScale.el.hidden = exGrid.el.hidden = s.export.size === 'source';\n const out = exportSize(s, result, app.current);\n exSizeOut.textContent = result ? `${out.width} \u00D7 ${out.height} px` : '\u2013';\n exMode.el.querySelector('.help')?.remove();\n if (s.export.size === 'source') exMode.el.append(h('div.help', { text: 'The size of the framed part of the source, like a full-resolution download. Pixels can differ by one in size when the ratio isn\\'t a whole number.' }));\n btnZip.hidden = app.items.length < 2;\n btnZip.querySelector('span').textContent = `Download all ${app.items.length} as ZIP`;\n syncAnim();\n }\n\n function setStats(result) {\n if (!result) { statSize.textContent = statColors.textContent = statTime.textContent = '\u2013'; return; }\n statSize.innerHTML = `${result.width}<small>\u00D7 ${result.height}</small>`;\n const used = result.usedColors().length;\n statColors.innerHTML = result.palette ? `${used}<small>/ ${result.palette.length}</small>` : `${used}`;\n statTime.innerHTML = `${result.ms < 10 ? result.ms.toFixed(1) : Math.round(result.ms)}<small>ms</small>`;\n statTime.parentElement.title = result.backend === 'webgl' ? 'Rendered on the GPU (WebGL 2 via ShaderMate)' : 'Rendered on the CPU';\n }\n\n return { el, sync, setStats, setTab, syncAnim };\n}\n\n", "// Left panel: Files (the batch), Presets (live thumbnails) and Palettes.\n\nimport { h, render } from './dom.js';\nimport { menu } from './ui.js';\nimport { icon } from './icons.js';\nimport { PRESETS } from '../core/presets.js';\nimport { PALETTES } from '../core/palette/builtin.js';\nimport { mergeSettings, defaultSettings } from '../core/settings.js';\n\nexport function createLibrary(app) {\n let tab = 'files';\n const tabBtn = (id, label, ic) => h('button', { type: 'button', role: 'tab', title: label, 'aria-selected': String(id === tab), html: `${icon(ic)}<span>${label}</span>`, onclick: () => setTab(id) });\n const tFiles = tabBtn('files', 'Files', 'files');\n const tPresets = tabBtn('presets', 'Presets', 'presets');\n const tPalettes = tabBtn('palettes', 'Palettes', 'palette');\n const filesCount = h('span.count', {});\n tFiles.append(filesCount);\n const tabs = h('div.itp-seg', { role: 'tablist', 'aria-label': 'Library' }, tFiles, tPresets, tPalettes);\n\n const search = h('input', { type: 'search', placeholder: 'Search', 'aria-label': 'Search the library' });\n const searchBox = h('div.itp-search', {}, h('span', { html: icon('search') }), search);\n search.addEventListener('input', () => renderTab());\n\n const body = h('div.itp-panel-body', {});\n const el = h('aside.itp-lib', { 'aria-label': 'Library' }, h('div.itp-panel-head', {}, tabs), searchBox, body);\n\n function setTab(t) {\n tab = t;\n for (const [b, id] of [[tFiles, 'files'], [tPresets, 'presets'], [tPalettes, 'palettes']]) b.setAttribute('aria-selected', String(id === t));\n search.value = '';\n renderTab();\n if (t === 'presets' && !thumbs.size) refreshThumbs();\n }\n const q = () => search.value.trim().toLowerCase();\n\n // ---- files\n function fileMenu(it, anchor) {\n const i = app.items.indexOf(it), many = app.items.length > 1;\n menu(anchor, [\n it.own\n ? { label: 'Use shared settings', sub: 'Drop this file\\'s own settings', icon: 'link', onClick: () => app.setOwn(it, false) }\n : { label: 'Give it its own settings', sub: 'Edits stop affecting other files', icon: 'unlink', disabled: !many, onClick: () => app.setOwn(it, true) },\n 'sep',\n { label: 'Copy settings', icon: 'copy', onClick: () => app.copySettings(it) },\n { label: 'Paste settings', sub: app.clipboard ? 'Gives this file its own settings' : 'Copy settings from a file first', icon: 'clipboard', disabled: !app.clipboard, onClick: () => app.pasteSettings(it) },\n { label: 'Apply these settings to all files', icon: 'layers', disabled: !many, onClick: () => app.applyToAll(it) },\n 'sep',\n { label: 'Rename', sub: 'Exports are named after it', icon: 'rename', kbd: 'F2', onClick: () => app.startRename(it) },\n { label: 'Duplicate', sub: 'A copy with its own settings, to compare looks', icon: 'copy', onClick: () => app.duplicate(it) },\n { label: 'Move up', icon: 'arrowUp', kbd: 'Alt Shift \u2191', disabled: i <= 0, onClick: () => app.move(it, -1) },\n { label: 'Move down', icon: 'arrowDown', kbd: 'Alt Shift \u2193', disabled: i >= app.items.length - 1, onClick: () => app.move(it, 1) },\n 'sep',\n { label: 'Remove', icon: 'trash', kbd: 'Del', onClick: () => app.removeItem(it) },\n ], { align: 'start' });\n }\n\n function renderFiles() {\n const items = app.items.filter(i => !q() || i.name.toLowerCase().includes(q()));\n const list = h('ul.itp-files', { 'aria-label': 'Files' });\n for (const it of items) {\n const more = h('button.itp-btn.small.icon', { type: 'button', 'aria-label': `Options for ${it.name}`, 'aria-haspopup': 'menu', title: 'Settings, duplicate, order', html: icon('more'), onclick: e => { e.stopPropagation(); fileMenu(it, more); } });\n const sub = it.type === 'video' ? `Video, ${fmtTime(it.duration)}` : `${it.width} \u00D7 ${it.height}`;\n const row = h('li.itp-file-row', { tabindex: '0', 'aria-current': String(app.current === it), 'data-own': it.own ? 'true' : null },\n h('img.thumb', { src: it.thumb || '', alt: '' }),\n h('div', { style: { minWidth: 0 } },\n h('div.title', { text: it.name }),\n h('div.sub', {}, sub, it.own ? h('span.itp-own', { title: 'This file has its own settings', html: `${icon('unlink')}<span>Own</span>` }) : null)),\n h('div.actions', {}, more,\n h('button.itp-btn.small.icon.danger', { type: 'button', 'aria-label': `Remove ${it.name}`, title: 'Remove', html: icon('x'), onclick: e => { e.stopPropagation(); app.removeItem(it); } })));\n row.addEventListener('click', () => app.select(it));\n row.addEventListener('dblclick', e => { if (e.target.closest('.title')) app.startRename(it); });\n row.addEventListener('contextmenu', e => { e.preventDefault(); app.select(it); fileMenu(it, more); });\n row.addEventListener('keydown', e => {\n if (e.target !== row) return;\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); app.select(it); }\n if (e.key === 'Delete' || e.key === 'Backspace') { e.preventDefault(); app.removeItem(it); }\n if (e.altKey) return; // Alt+arrows are global shortcuts (next file, move file)\n if (e.key === 'ArrowDown') { e.preventDefault(); row.nextElementSibling?.focus(); }\n if (e.key === 'ArrowUp') { e.preventDefault(); row.previousElementSibling?.focus(); }\n if (e.key === 'ContextMenu' || (e.key === 'F10' && e.shiftKey)) { e.preventDefault(); fileMenu(it, more); }\n });\n list.append(row);\n }\n const nOwn = app.items.filter(i => i.own).length;\n const summary = !app.items.length ? 'No files yet'\n : app.items.length === 1 ? '1 file'\n : nOwn ? `${app.items.length} files, ${nOwn} with ${nOwn === 1 ? 'its' : 'their'} own settings`\n : `${app.items.length} files, shared settings`;\n const head = h('div.itp-group', {}, h('span', { text: summary }),\n app.items.length > 1 ? h('button.itp-link', { type: 'button', text: 'Clear', onclick: () => app.clearItems() }) : null);\n const add = h('div', { style: { padding: '4px 12px 12px', display: 'flex', gap: '6px' } },\n h('button.itp-btn.outline.small', { type: 'button', html: `${icon('plus')}<span>Add files</span>`, onclick: () => app.openFiles() }),\n h('button.itp-btn.small', { type: 'button', html: `${icon('clipboard')}<span>Paste</span>`, title: 'Paste an image from the clipboard (Ctrl+V)', onclick: () => app.pasteFromClipboard() }));\n const saved = app.savedWorkspace && app.savedWorkspace();\n const savedNote = saved ? h('div.itp-group.itp-saved', {},\n h('span', { text: `Saved in this browser: ${saved.count} file${saved.count === 1 ? '' : 's'}`, title: 'Kept in this browser\\'s storage, never uploaded. Clearing the site\\'s data also removes it.' }),\n h('button.itp-link', { type: 'button', text: 'Forget', title: 'Remove the saved files from this browser', onclick: () => app.forgetWorkspace() })) : null;\n render(body, head, list, add, savedNote, h('div.itp-group', {}, h('span', { text: 'Drop images or videos anywhere in the window. Files share one set of settings unless you give one its own (\u22EF menu or right-click). Save keeps them in this browser for next time.' })));\n }\n\n // ---- presets (thumbnails rendered from the current image)\n const thumbs = new Map(); // preset id \u2192 canvas\n let thumbGen = 0;\n function renderPresets() {\n const cur = app.store.settings;\n const list = PRESETS.filter(p => !q() || (p.name + p.description).toLowerCase().includes(q()));\n const grid = h('div.itp-presets', {});\n for (const p of list) {\n const active = app.activePreset === p.id;\n const pic = thumbs.get(p.id) || h('div.ph', {});\n const b = h('button.itp-preset', { type: 'button', 'aria-pressed': String(active), title: p.description, onclick: () => app.applyPreset(p) },\n pic, h('span.t', { text: p.name }), h('span.d', { text: p.description }));\n grid.append(b);\n }\n render(body, h('div.itp-group', {}, h('span', { text: 'Presets replace the current settings. Undo with Ctrl+Z.' })), grid);\n void cur;\n }\n async function refreshThumbs() {\n const gen = ++thumbGen;\n const item = app.current;\n if (!item || !app.engine) return;\n for (const p of PRESETS) {\n if (gen !== thumbGen) return;\n const s = mergeSettings(defaultSettings(), p.settings);\n // small, fast previews: cap the width and skip slow-on-CPU diffusion sizes\n s.size = { ...s.size, mode: 'width', width: Math.min(s.size.width, 72), height: 0 };\n try {\n const r = await app.engine.process(item.source, s);\n if (gen !== thumbGen) return;\n const c = r.toCanvas(1);\n thumbs.set(p.id, c);\n if (tab === 'presets') renderPresets();\n } catch { /* ignore a failed thumbnail */ }\n }\n }\n\n // ---- palettes\n function palRow(p, active, removable) {\n const strip = h('div.itp-strip', {}, ...p.colors.slice(0, 64).map(c => h('i', { style: { background: c.startsWith('#') ? c : '#' + c } })));\n const row = h('li.itp-pal', { tabindex: '0', role: 'button', 'aria-pressed': String(active) },\n h('div.row', {}, h('span', { text: p.name }), h('span.n', { text: String(p.colors.length), title: p.author ? `by ${p.author}` : null })), strip);\n const pick = () => app.usePalette(p);\n row.addEventListener('click', pick);\n row.addEventListener('keydown', e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); pick(); } if (removable && (e.key === 'Delete')) app.deletePalette(p); });\n if (removable) {\n const del = h('button.itp-btn.small.icon.danger', { type: 'button', 'aria-label': `Delete ${p.name}`, title: 'Delete', html: icon('trash'), onclick: e => { e.stopPropagation(); app.deletePalette(p); } });\n row.firstChild.append(del);\n }\n return row;\n }\n function renderPalettes() {\n const s = app.store.settings.palette;\n const match = p => !q() || (p.name + ' ' + (p.author || '')).toLowerCase().includes(q()) || String(p.colors.length) === q();\n const mine = app.userPalettes.filter(match);\n const built = PALETTES.filter(match);\n const actions = h('div', { style: { padding: '0 12px 4px', display: 'flex', gap: '6px', flexWrap: 'wrap' } },\n h('button.itp-btn.outline.small', { type: 'button', html: `${icon('upload')}<span>Import file</span>`, onclick: () => app.importPalette() }),\n h('button.itp-btn.small', { type: 'button', html: `${icon('palette')}<span>From Lospec</span>`, onclick: () => app.lospecDialog() }));\n const yours = mine.length ? [h('div.itp-group', {}, h('span', { text: 'Your palettes' }), h('span.itp-badge', { text: String(mine.length) })),\n h('ul.itp-pal-list', {}, ...mine.map(p => palRow(p, s.source === 'custom' && s.name === p.name, true)))] : [];\n render(body, actions, ...yours,\n h('div.itp-group', {}, h('span', { text: 'Built-in' }), h('span.itp-badge', { text: String(built.length) })),\n h('ul.itp-pal-list', {}, ...built.map(p => palRow({ ...p, colors: p.colors.map(c => '#' + c) }, s.source === 'builtin' && s.id === p.id, false))));\n }\n\n function renderTab() {\n filesCount.textContent = app.items.length ? String(app.items.length) : '';\n if (tab === 'files') renderFiles();\n else if (tab === 'presets') renderPresets();\n else renderPalettes();\n }\n\n return {\n el,\n refresh: renderTab,\n setTab,\n /** Focus a file's row (after it moved). */\n focusFile(item) { if (tab === 'files') body.querySelectorAll('.itp-file-row')[app.items.indexOf(item)]?.focus(); },\n /** The current image changed: rebuild preset thumbnails. */\n sourceChanged() { thumbs.clear(); thumbGen++; if (tab === 'presets') { renderTab(); refreshThumbs(); } },\n get tab() { return tab; },\n };\n}\n\nexport function fmtTime(t = 0) {\n const m = Math.floor(t / 60), s = t - m * 60;\n return `${m}:${s.toFixed(1).padStart(4, '0')}`;\n}\n", "// Sample images drawn for this project (SVG, MIT like the rest of the code).\r\n\r\nconst dusk = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"960\" height=\"640\" viewBox=\"0 0 960 640\">\r\n<defs>\r\n<linearGradient id=\"sky\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#1d1a3f\"/><stop offset=\".45\" stop-color=\"#6b3f7c\"/><stop offset=\".72\" stop-color=\"#e0766a\"/><stop offset=\".86\" stop-color=\"#f6c27a\"/></linearGradient>\r\n<radialGradient id=\"sun\" cx=\".5\" cy=\".5\" r=\".5\"><stop offset=\"0\" stop-color=\"#fff4d6\"/><stop offset=\".35\" stop-color=\"#ffd98a\"/><stop offset=\".6\" stop-color=\"#ffb46a\" stop-opacity=\".55\"/><stop offset=\"1\" stop-color=\"#ff9a6a\" stop-opacity=\"0\"/></radialGradient>\r\n<linearGradient id=\"m1\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#8a4f7d\"/><stop offset=\"1\" stop-color=\"#5a3566\"/></linearGradient>\r\n<linearGradient id=\"m2\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#4c2f5e\"/><stop offset=\"1\" stop-color=\"#2d2147\"/></linearGradient>\r\n<linearGradient id=\"m3\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#22193a\"/><stop offset=\"1\" stop-color=\"#140f25\"/></linearGradient>\r\n<linearGradient id=\"lake\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#f2a873\"/><stop offset=\".35\" stop-color=\"#8d4f78\"/><stop offset=\"1\" stop-color=\"#1b1734\"/></linearGradient>\r\n</defs>\r\n<rect width=\"960\" height=\"640\" fill=\"url(#sky)\"/>\r\n<g fill=\"#fff\" opacity=\".7\"><circle cx=\"90\" cy=\"60\" r=\"1.6\"/><circle cx=\"210\" cy=\"110\" r=\"1.2\"/><circle cx=\"330\" cy=\"40\" r=\"1.4\"/><circle cx=\"700\" cy=\"70\" r=\"1.6\"/><circle cx=\"820\" cy=\"130\" r=\"1.1\"/><circle cx=\"560\" cy=\"30\" r=\"1.2\"/><circle cx=\"880\" cy=\"40\" r=\"1.3\"/></g>\r\n<circle cx=\"600\" cy=\"400\" r=\"190\" fill=\"url(#sun)\"/>\r\n<circle cx=\"600\" cy=\"400\" r=\"58\" fill=\"#fff1cf\"/>\r\n<g fill=\"#f7c9a0\" opacity=\".55\"><ellipse cx=\"220\" cy=\"250\" rx=\"140\" ry=\"12\"/><ellipse cx=\"300\" cy=\"270\" rx=\"90\" ry=\"8\"/><ellipse cx=\"760\" cy=\"230\" rx=\"120\" ry=\"10\"/></g>\r\n<path d=\"M0 410 L120 330 L190 370 L300 280 L390 350 L470 310 L560 380 L660 300 L760 360 L860 290 L960 340 V470 H0Z\" fill=\"url(#m1)\"/>\r\n<path d=\"M0 440 L90 390 L170 420 L260 360 L350 425 L450 380 L540 430 L640 375 L740 430 L840 385 L960 420 V480 H0Z\" fill=\"url(#m2)\"/>\r\n<path d=\"M0 470 L140 430 L260 455 L380 425 L520 462 L660 432 L800 458 L960 436 V500 H0Z\" fill=\"url(#m3)\"/>\r\n<rect y=\"480\" width=\"960\" height=\"160\" fill=\"url(#lake)\"/>\r\n<g fill=\"#ffe8bf\" opacity=\".8\"><rect x=\"540\" y=\"492\" width=\"120\" height=\"4\" rx=\"2\"/><rect x=\"560\" y=\"508\" width=\"80\" height=\"3\" rx=\"1.5\"/><rect x=\"520\" y=\"524\" width=\"160\" height=\"3\" rx=\"1.5\"/><rect x=\"575\" y=\"542\" width=\"50\" height=\"3\" rx=\"1.5\"/><rect x=\"548\" y=\"562\" width=\"104\" height=\"2\" rx=\"1\"/></g>\r\n<path d=\"M0 470 L140 430 L260 455 L380 425 L520 462 L660 432 L800 458 L960 436 V480 H0Z\" fill=\"#120d22\" opacity=\".9\"/>\r\n<path d=\"M60 640 C120 560 180 560 240 640Z\" fill=\"#0d0a1a\"/><path d=\"M780 640 C840 575 900 560 960 600 V640Z\" fill=\"#0d0a1a\"/>\r\n<g fill=\"none\" stroke=\"#2a1b38\" stroke-width=\"3\" stroke-linecap=\"round\"><path d=\"M300 170 q10 -10 20 0 q10 -10 20 0\"/><path d=\"M350 200 q7 -7 14 0 q7 -7 14 0\"/><path d=\"M262 210 q6 -6 12 0 q6 -6 12 0\"/></g>\r\n</svg>`;\r\n\r\nconst still = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"900\" height=\"680\" viewBox=\"0 0 900 680\">\r\n<defs>\r\n<linearGradient id=\"wall\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"><stop offset=\"0\" stop-color=\"#2f3b45\"/><stop offset=\"1\" stop-color=\"#1a2129\"/></linearGradient>\r\n<linearGradient id=\"table\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#9a6a45\"/><stop offset=\"1\" stop-color=\"#4c2f1f\"/></linearGradient>\r\n<radialGradient id=\"apple\" cx=\".35\" cy=\".3\" r=\".75\"><stop offset=\"0\" stop-color=\"#ffb3a1\"/><stop offset=\".25\" stop-color=\"#e2453c\"/><stop offset=\".8\" stop-color=\"#7a1622\"/><stop offset=\"1\" stop-color=\"#3d0b14\"/></radialGradient>\r\n<radialGradient id=\"lemon\" cx=\".35\" cy=\".3\" r=\".75\"><stop offset=\"0\" stop-color=\"#fffbd0\"/><stop offset=\".3\" stop-color=\"#f5d34a\"/><stop offset=\".85\" stop-color=\"#a77d16\"/><stop offset=\"1\" stop-color=\"#5a4008\"/></radialGradient>\r\n<radialGradient id=\"plum\" cx=\".35\" cy=\".3\" r=\".75\"><stop offset=\"0\" stop-color=\"#c7a6ff\"/><stop offset=\".3\" stop-color=\"#6b3fb8\"/><stop offset=\".85\" stop-color=\"#2b1557\"/><stop offset=\"1\" stop-color=\"#140a2c\"/></radialGradient>\r\n<linearGradient id=\"vase\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"><stop offset=\"0\" stop-color=\"#1c5a63\"/><stop offset=\".35\" stop-color=\"#5fb7b0\"/><stop offset=\".5\" stop-color=\"#c9f0e6\"/><stop offset=\".65\" stop-color=\"#4aa29d\"/><stop offset=\"1\" stop-color=\"#123c44\"/></linearGradient>\r\n<radialGradient id=\"light\" cx=\".3\" cy=\".1\" r=\".9\"><stop offset=\"0\" stop-color=\"#ffe9c4\" stop-opacity=\".35\"/><stop offset=\"1\" stop-color=\"#ffe9c4\" stop-opacity=\"0\"/></radialGradient>\r\n<radialGradient id=\"shadow\" cx=\".5\" cy=\".5\" r=\".5\"><stop offset=\"0\" stop-color=\"#000\" stop-opacity=\".55\"/><stop offset=\"1\" stop-color=\"#000\" stop-opacity=\"0\"/></radialGradient>\r\n</defs>\r\n<rect width=\"900\" height=\"680\" fill=\"url(#wall)\"/>\r\n<rect width=\"900\" height=\"680\" fill=\"url(#light)\"/>\r\n<rect y=\"450\" width=\"900\" height=\"230\" fill=\"url(#table)\"/>\r\n<rect y=\"450\" width=\"900\" height=\"8\" fill=\"#c08a5c\" opacity=\".7\"/>\r\n<ellipse cx=\"520\" cy=\"560\" rx=\"120\" ry=\"18\" fill=\"url(#shadow)\"/>\r\n<path d=\"M470 250 C440 300 430 360 450 420 C460 470 480 520 520 548 C560 520 580 470 590 420 C610 360 600 300 570 250 C565 230 568 205 580 190 H460 C472 205 475 230 470 250Z\" fill=\"url(#vase)\"/>\r\n<ellipse cx=\"520\" cy=\"190\" rx=\"60\" ry=\"10\" fill=\"#0e2e34\"/>\r\n<path d=\"M500 190 C495 130 470 100 430 80 M530 190 C540 120 580 90 620 85 M515 190 C515 140 520 110 515 70\" stroke=\"#3f6b3a\" stroke-width=\"5\" fill=\"none\" stroke-linecap=\"round\"/>\r\n<circle cx=\"430\" cy=\"78\" r=\"22\" fill=\"#f2e6d0\"/><circle cx=\"430\" cy=\"78\" r=\"8\" fill=\"#e8b23c\"/>\r\n<circle cx=\"622\" cy=\"84\" r=\"18\" fill=\"#f08aa6\"/><circle cx=\"622\" cy=\"84\" r=\"7\" fill=\"#7a2a4a\"/>\r\n<circle cx=\"515\" cy=\"66\" r=\"15\" fill=\"#f6d8f0\"/><circle cx=\"515\" cy=\"66\" r=\"6\" fill=\"#d9a03a\"/>\r\n<ellipse cx=\"250\" cy=\"560\" rx=\"95\" ry=\"16\" fill=\"url(#shadow)\"/>\r\n<circle cx=\"250\" cy=\"490\" r=\"78\" fill=\"url(#apple)\"/>\r\n<path d=\"M250 418 q6 -26 18 -34\" stroke=\"#4a2a14\" stroke-width=\"6\" fill=\"none\" stroke-linecap=\"round\"/>\r\n<path d=\"M262 400 q30 -20 46 2 q-26 14 -46 -2Z\" fill=\"#4f8a3a\"/>\r\n<ellipse cx=\"700\" cy=\"580\" rx=\"90\" ry=\"14\" fill=\"url(#shadow)\"/>\r\n<ellipse cx=\"690\" cy=\"530\" rx=\"80\" ry=\"56\" fill=\"url(#lemon)\"/>\r\n<circle cx=\"370\" cy=\"560\" r=\"44\" fill=\"url(#plum)\"/>\r\n<circle cx=\"780\" cy=\"585\" r=\"34\" fill=\"url(#plum)\"/>\r\n</svg>`;\r\n\r\nconst potion = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"560\" height=\"560\" viewBox=\"0 0 560 560\">\r\n<defs>\r\n<radialGradient id=\"glass\" cx=\".38\" cy=\".35\" r=\".7\"><stop offset=\"0\" stop-color=\"#e8fbff\" stop-opacity=\".9\"/><stop offset=\".5\" stop-color=\"#9fd8f0\" stop-opacity=\".55\"/><stop offset=\"1\" stop-color=\"#3a6f9e\" stop-opacity=\".85\"/></radialGradient>\r\n<linearGradient id=\"liquid\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\"><stop offset=\"0\" stop-color=\"#ff7ad1\"/><stop offset=\".6\" stop-color=\"#b8248f\"/><stop offset=\"1\" stop-color=\"#5d0e4c\"/></linearGradient>\r\n<linearGradient id=\"cork\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\"><stop offset=\"0\" stop-color=\"#7a4a24\"/><stop offset=\".5\" stop-color=\"#c78a52\"/><stop offset=\"1\" stop-color=\"#6a3c1a\"/></linearGradient>\r\n</defs>\r\n<rect x=\"232\" y=\"64\" width=\"96\" height=\"62\" rx=\"12\" fill=\"url(#cork)\"/>\r\n<rect x=\"222\" y=\"118\" width=\"116\" height=\"40\" rx=\"10\" fill=\"#bfe8f7\"/>\r\n<path d=\"M240 156 V210 C150 240 104 310 104 380 C104 470 182 520 280 520 C378 520 456 470 456 380 C456 310 410 240 320 210 V156Z\" fill=\"url(#glass)\"/>\r\n<path d=\"M118 360 C160 340 220 350 280 362 C340 374 400 370 442 352 C452 370 456 380 456 392 C456 476 378 520 280 520 C182 520 104 476 104 392 C104 382 108 370 118 360Z\" fill=\"url(#liquid)\"/>\r\n<circle cx=\"220\" cy=\"430\" r=\"16\" fill=\"#ffd1f0\" opacity=\".8\"/><circle cx=\"330\" cy=\"460\" r=\"10\" fill=\"#ffd1f0\" opacity=\".7\"/><circle cx=\"300\" cy=\"402\" r=\"7\" fill=\"#ffd1f0\" opacity=\".7\"/>\r\n<path d=\"M160 300 C180 262 214 240 250 228\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\" fill=\"none\" opacity=\".75\"/>\r\n<path d=\"M150 340 v12\" stroke=\"#ffffff\" stroke-width=\"16\" stroke-linecap=\"round\" opacity=\".6\"/>\r\n<path d=\"M240 156 V210 C150 240 104 310 104 380 C104 470 182 520 280 520 C378 520 456 470 456 380 C456 310 410 240 320 210 V156Z\" fill=\"none\" stroke=\"#1d3150\" stroke-width=\"10\"/>\r\n</svg>`;\r\n\r\nexport const SAMPLES = [\r\n { id: 'dusk', name: 'Dusk', svg: dusk },\r\n { id: 'still-life', name: 'Still life', svg: still },\r\n { id: 'potion', name: 'Potion (transparent)', svg: potion },\r\n];\r\n\r\n/** Data URL for a sample (for thumbnails and <img>). */\r\nexport const sampleURL = s => 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(s.svg);\r\n\r\n/** Load a sample as an ImageBitmap-compatible <img>. */\r\nexport async function loadSample(s) {\r\n const img = new Image();\r\n img.src = sampleURL(s);\r\n await img.decode();\r\n return img;\r\n}\r\n", "// The saved workspace: every open file (its bytes, name and own settings) plus the shared settings,\n// kept in this browser's IndexedDB. Nothing is uploaded. One workspace per browser profile.\n\nconst DB = 'image-to-pixel';\nconst STORE = 'workspace';\nconst KEY = 'current';\nconst VERSION = 1;\n\nfunction open() {\n return new Promise((resolve, reject) => {\n if (typeof indexedDB === 'undefined') { reject(new Error('This browser has no IndexedDB')); return; }\n const req = indexedDB.open(DB, 1);\n req.onupgradeneeded = () => { if (!req.result.objectStoreNames.contains(STORE)) req.result.createObjectStore(STORE); };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function run(mode, fn) {\n const db = await open();\n try {\n return await new Promise((resolve, reject) => {\n const tx = db.transaction(STORE, mode);\n const req = fn(tx.objectStore(STORE));\n tx.oncomplete = () => resolve(req && req.result);\n tx.onerror = () => reject(tx.error || (req && req.error));\n tx.onabort = () => reject(tx.error || new Error('Saving was cancelled'));\n });\n } finally {\n db.close();\n }\n}\n\n/**\n * Save the workspace.\n * @param {{ shared: object, current: number, items: { name: string, type: 'image'|'video', file: Blob, own: object|null }[] }} ws\n * @returns {Promise<number>} total bytes of the saved files\n */\nexport async function saveWorkspace(ws) {\n const record = { version: VERSION, savedAt: Date.now(), ...ws };\n await run('readwrite', s => s.put(record, KEY));\n return ws.items.reduce((a, it) => a + (it.file ? it.file.size : 0), 0);\n}\n\n/** The saved workspace, or null. */\nexport async function loadWorkspace() {\n try {\n const rec = await run('readonly', s => s.get(KEY));\n return rec && rec.version === VERSION && Array.isArray(rec.items) ? rec : null;\n } catch (_) {\n return null;\n }\n}\n\nexport async function forgetWorkspace() {\n await run('readwrite', s => s.delete(KEY));\n}\n\n/** True when the error means the browser ran out of storage for us. */\nexport const isQuotaError = e => !!e && (e.name === 'QuotaExceededError' || /quota|space/i.test(e.message || ''));\n\nexport const fmtBytes = n => (n >= 1e9 ? `${(n / 1e9).toFixed(1)} GB` : n >= 1e6 ? `${(n / 1e6).toFixed(1)} MB` : `${Math.max(1, Math.round(n / 1e3))} KB`);\n"],
5
+ "mappings": "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",
6
+ "names": ["parseColor", "c", "s", "ch", "isColor", "toHex", "rgb", "v", "oklab", "r", "g", "b", "lin", "l", "m", "paletteSpread", "rgbs", "sum", "i", "best", "j", "dr", "dg", "db", "d", "normHex", "LUMA", "init_color", "__esmMin", "upscale", "img", "k", "opts", "w", "h", "out", "src", "sw", "y", "sy", "x", "so", "o", "r", "g", "b", "parseColor", "a", "sa", "oa", "resizeNearest", "width", "height", "xs", "uniqueColors", "limit", "seen", "d", "v", "toHex", "detectGrid", "tolerance", "same", "gcd", "stepY", "stepX", "run", "init_scale", "__esmMin", "init_color", "parseGPL", "text", "lines", "name", "colors", "raw", "line", "nm", "m", "normHex", "parseHexList", "h", "parseJASC", "l", "parseJSON", "obj", "c", "parseLoose", "re", "parsePalette", "filename", "ext", "trimmed", "out", "dedupe", "toGPL", "rows", "g", "b", "toHexFile", "toPaletteJSON", "init_parse", "__esmMin", "init_color", "list", "lospecSlug", "input", "s", "m", "fetchLospec", "slugOrUrl", "f", "slug", "res", "json", "p", "parseJSON", "init_lospec", "__esmMin", "init_parse", "mediaError", "video", "code", "err", "MEDIA_ERRORS", "videoReady", "timeout", "waitOrFail", "e", "sniffVideoCodec", "file", "buf", "NAMES", "i", "type", "head", "m", "hasAudioTrack", "text", "o", "dv", "size", "moov", "seekTo", "time", "presented", "res", "seeked", "wait", "estimateFps", "fallback", "was", "times", "done", "cb", "_", "meta", "deltas", "d", "b", "fps", "r", "frameTimes", "duration", "start", "end", "maxFrames", "out", "n", "forEachFrame", "opts", "wasPaused", "init_frames", "__esmMin", "el", "ev", "ms", "rej", "t", "ok", "onOk", "onErr", "toArrayBuffer", "source", "url", "res", "decodeAudio", "opts", "sampleRate", "DEFAULT_RATE", "bytes", "decoded", "start", "end", "length", "numberOfChannels", "ctx", "node", "out", "channels", "c", "findAudioConfig", "codec", "bitrate", "AUDIO_CODECS", "rates", "bitrates", "rate", "br", "config", "audioCodecSupported", "resamplePcm", "pcm", "buf", "encodeAudio", "error", "encoder", "chunk", "meta", "e", "limit", "total", "BLOCK", "o", "n", "data", "frame", "r", "opusHead", "preSkip", "b", "dv", "parseOpusHead", "init_audio", "__esmMin", "box", "type", "fill", "w", "Writer", "body", "head", "esds", "asc", "bitrate", "decSpecific", "descriptor", "decConfig", "be32", "sl", "fullBox", "b", "isValidAvcC", "d", "o", "nSps", "len", "sps", "nPps", "nalUnits", "data", "out", "dv", "spsChroma", "rbsp", "i", "bit", "u1", "v", "ue", "z", "chroma", "avcCFromSample", "nals", "n", "pps", "s", "p", "HIGH_PROFILES", "c", "runs", "list", "last", "createMp4Muxer", "width", "height", "timescale", "audio", "samples", "audioSamples", "description", "audioDescription", "audioTrack", "rate", "ch", "t0", "starts", "lastDur", "durs", "entry", "a", "parseOpusHead", "preSkip", "chunk", "meta", "toBytes", "key", "timestamp", "duration", "t", "us", "pts", "dts", "offsets", "hasOffsets", "mediaDur", "videoMs", "stts", "ctts", "keys", "videoSize", "at", "audioMs", "audioSize", "movieDur", "dataSize", "ftyp", "dinf", "di", "stsc", "stsz", "stco", "offset", "buildMoov", "dataStart", "MATRIX", "tr", "md", "mi", "st", "name", "ENC", "k", "r", "moovSize", "moov", "init_mux_mp4", "__esmMin", "init_audio", "version", "flags", "tag", "size8", "n", "b", "v", "i", "idBytes", "id", "out", "concat", "parts", "p", "createWebmMuxer", "width", "height", "codec", "fps", "audio", "frames", "audioFrames", "codecPrivate", "audioPrivate", "chunk", "meta", "toBytes", "data", "key", "timestamp", "duration", "hasAudio", "frameMs", "a", "info", "master", "ID", "uint", "float64", "str", "trackEntries", "VIDEO", "CODEC_IDS", "el", "head", "parseOpusHead", "opusHead", "preSkip", "AUDIO", "tracks", "blocks", "f", "clusters", "cur", "t", "videoKey", "clusterBytes", "c", "seekHead", "posInfo", "posTracks", "posCues", "pos", "cuePoints", "cues", "header", "segment", "ENC", "init_mux_webm", "__esmMin", "init_audio", "bytes", "x", "s", "children", "d", "video_exports", "__export", "audioCodecSupported", "createMp4Muxer", "createVideoEncoder", "createWebmMuxer", "decodeAudio", "encodeAudio", "encodeVideo", "estimateFps", "findAudioConfig", "forEachFrame", "frameTimes", "seekTo", "videoReady", "videoSupport", "width", "height", "out", "codec", "AVC", "VP", "pickAudio", "format", "pcm", "bitrate", "order", "config", "opts", "scale", "W", "even", "H", "fps", "muxCodec", "list", "c", "m", "picked", "audioCodec", "audioTrack", "muxer", "error", "encoder", "chunk", "meta", "e", "canvas", "ctx", "i", "frameUs", "img", "up", "upscale", "frame", "r", "frames", "enc", "f", "init_video", "__esmMin", "init_mux_mp4", "init_mux_webm", "init_audio", "init_scale", "init_frames", "n", "PALETTES", "getPalette", "idOrName", "k", "p", "init_color", "SETTINGS_VERSION", "MAX_SIZE", "DITHER_METHODS", "ditherKind", "id", "m", "DEFAULTS", "SETTINGS_VERSION", "clamp", "v", "lo", "hi", "d", "n", "oneOf", "list", "bool", "defaultSettings", "normalizeSettings", "input", "i", "s", "size", "adj", "pal", "dit", "al", "cl", "ol", "ex", "MAX_SIZE", "fr", "ASPECTS", "a", "source", "p", "getPalette", "c", "isColor", "normHex", "method", "DITHER_METHODS", "m", "normalizeMatrix", "h", "w", "out", "y", "row", "x", "cropRect", "srcW", "srcH", "frame", "zoom", "fx", "fy", "resolveSize", "diff", "b", "k", "va", "vb", "g", "kk", "b64url", "str", "bytes", "bin", "compactSettings", "settings", "encodeSettings", "decodeSettings", "obj", "settingsToJSON", "settingsFromJSON", "text", "mergeSettings", "base", "patch", "init_color", "BLUE_NOISE_B64", "fromB64", "b64", "c", "bayer", "n", "m", "s", "next", "y", "x", "v", "toRanks", "rows", "h", "w", "cells", "a", "b", "out", "r", "clustered", "row", "u", "CLUSTER4", "cache", "thresholdMap", "method", "custom", "map", "sq", "BLUE_NOISE_B64", "parseMatrix", "text", "l", "k", "div", "list", "dx", "dy", "w", "KERNELS", "MAX_KERNEL", "kernelSkew", "kernel", "s", "waveCount", "h", "skew", "init_color", "extractPalette", "img", "count", "opts", "maxSamples", "alphaThreshold", "n", "step", "pts", "i", "o", "boxes", "bi", "bestRange", "bestAxis", "b", "a", "lo", "hi", "p", "r", "q", "mid", "centers", "mean", "iter", "sums", "best", "bd", "c", "dr", "dg", "db", "d", "s", "hexes", "toHex", "lum", "h", "v", "list", "g", "init_color", "resample", "src", "w", "h", "mode", "crop", "ox", "oy", "sw", "sh", "d", "stride", "out", "nx", "ny", "xs", "ys", "x", "i", "y", "j", "r", "g", "a", "row", "o", "al", "adjust", "buf", "brightness", "contrast", "saturation", "hue", "gamma", "f", "ig", "hk", "hq", "M", "b", "l", "LUMA", "k", "r2", "g2", "b2", "clamp01", "alphaCut", "threshold", "v", "paletteSpace", "palette", "distance", "coords", "rgb", "c", "oklab", "W_RGB", "nearest", "sp", "p0", "p1", "p2", "w0", "w1", "w2", "best", "bd", "d0", "d1", "d2", "dist", "quantizeOrdered", "plan", "map", "amt", "t", "quantizeDiffusion", "acc", "strength", "kernel", "er", "eg", "eb", "dx", "dy", "wt", "xx", "yy", "q", "key", "N4", "removeOrphans", "px", "ks", "os", "oo", "bc", "n", "smoothMajority", "outline", "color", "corners", "opaque", "inside", "nb", "me", "hit", "makePlan", "settings", "src", "s", "normalizeSettings", "crop", "cropRect", "width", "height", "resolveSize", "colors", "extractFrom", "quantize", "palette", "parseColor", "kind", "ditherKind", "map", "thresholdMap", "kernel", "KERNELS", "skew", "kernelSkew", "paletteSpread", "waveCount", "k", "w", "h", "prep", "resample", "adjust", "bytes", "i", "extractPalette", "runCPU", "plan", "src", "w", "h", "s", "buf", "resample", "adjust", "alphaCut", "px", "quantizeDiffusion", "quantizeOrdered", "removeOrphans", "smoothMajority", "outline", "VERSION", "MAX_CHANNELS", "DEFAULT_CANVAS_ID", "ShaderMateError", "message", "details", "warned", "warnOnce", "key", "args", "isBrowser", "isArrayLike", "v", "toArray", "isPow2", "n", "parseColor", "c", "_a", "_b", "_c", "_d", "isBrowser", "cv", "x", "d", "isDevHost", "h", "RefPool", "gl", "obj", "type", "id", "it", "createEmitter", "forward", "map", "on", "ev", "fn", "off", "once", "wrapped", "data", "emit", "e", "clear", "EASES", "t", "createTweens", "active", "tween", "key", "get", "set", "to", "opts", "duration", "delay", "ease", "prev", "from", "isArr", "f", "resolve", "tw", "v", "now", "p", "clamp01", "a", "i", "update", "cancel", "normalizePasses", "input", "list", "ShaderMateError", "_e", "names", "dupes", "n", "chans", "MAX_CHANNELS", "normalizeChannel", "isEl", "isBitmap", "isTex", "ch", "passNames", "ownerName", "out", "isInlineSource", "src", "isWebGL2", "createContext", "canvas", "options", "attrs", "want", "getExtensions", "isGL2", "ext", "createQuad", "buf", "program", "loc", "parseShaderLog", "log", "lines", "userStart", "l", "errors", "row", "m", "logical", "physical", "compileShader", "label", "showExpandedOnError", "sh", "stage", "summary", "err", "marks", "numbered", "line", "createProgram", "vsrc", "fsrc", "getUniformInfo", "info", "VERT_GL2", "VERT_GL1", "BUILTIN_MACROS_GL2", "BUILTIN_MACROS_GL1", "MAIN_WRAP_GL2", "MAIN_WRAP_GL1", "FRAG_GL2", "FRAG_GL1", "createBlit", "quad", "r", "uTex", "uSize", "tex", "w", "wrapMode", "wrap", "filterMode", "filter", "chooseFormat", "ifmt", "fmt", "isRenderable", "fbo", "ok", "createTarget", "pool", "wanted", "chosen", "warnOnce", "filterOpt", "depthTex", "status", "deleteTarget", "resolvePassSize", "size", "cw", "BUILTIN_UNIFORMS", "stripComments", "s", "BUILTIN_DEFINES", "declareFragColor", "code", "FRAGCOORD_UNIFORMS", "SAMPLER_BUILTINS", "looksLikeFragCoord", "declareBuiltins", "channelTypes", "declared", "name", "used", "types", "resolveIncludes", "loader", "throwOnError", "warn", "done", "stack", "expand", "re", "last", "path", "raw", "expanded", "defineLines", "defines", "k", "DEFAULT_INJECT", "NO_INJECT", "assembleFragment", "enableDerivatives", "inject", "builtinOpts", "versionLine", "body", "vm", "head", "fragDecl", "userOut", "clean", "needWrap", "makeTexture2D", "source", "params", "env", "dynamic", "flipDefault", "flip", "npotLimited", "isPow2", "mip", "minFilter", "upload", "loadImage", "url", "res", "rej", "img", "FACE_NAMES", "loadCubeMap", "urls", "faces", "loaded", "failed", "u", "playOnGesture", "media", "go", "loadVideo", "video", "wrapper", "loadCamera", "constraints", "stream", "loadAudio", "mic", "spectro", "fftSize", "AC", "ctx", "analyser", "bins", "wave", "H", "rawFFT", "rawAnalyser", "getTime", "cleanup", "finish", "resume", "audio", "owned", "connect", "isCanvas", "el", "isVideo", "loadElement", "live", "base", "wrapTexture", "loadKeyboard", "held", "pressed", "toggle", "target", "onDown", "onUp", "onBlur", "loadChannel", "channelSamplerType", "splitPassBlob", "text", "heads", "bufferType", "num", "parseBracketSettings", "word", "parseUniformComments", "uniforms", "samplers", "init", "comment", "spec", "parseSamplerComment", "nums", "range", "defaults", "comps", "isBool", "value", "ref", "usesMouseVec4", "GL_SAMPLER_2D", "GL_SAMPLER_CUBE", "auxPasses", "passObjs", "resolveSamplerSpecs", "po", "instanceSamplers", "aux", "screen", "byName", "annotated", "mm", "needsMainBackbuffer", "createCamera", "speed", "sensitivity", "pos", "yaw", "pitch", "keys", "dragging", "lastX", "lastY", "dir", "view", "onKey", "down", "kd", "ku", "pd", "pm", "pu", "wh", "blur", "lookAt", "upW", "rl", "dt", "right", "mv", "vec", "ALIASES", "add", "desc", "resolveUniformType", "GL_TYPES", "describeGLType", "glType", "GL_FLOAT", "GL_FLOAT_VEC4", "isUniformSpec", "isArrayLike", "toList", "uploadUniform", "transpose", "applyUniformMap", "strict", "warnMissing", "inf", "createPointer", "getFit", "smooth", "state", "clickPending", "moved", "paintedRect", "fit", "ba", "ra", "toShader", "clientX", "clientY", "toUV", "cx", "cy", "y", "onMove", "onLeave", "onWheel", "parseAspect", "parseSizing", "hasCanvas", "_f", "cfg", "createSizer", "ratio", "styled", "cssBox", "measure", "box", "applyStyle", "pending", "schedule", "ro", "createVisibility", "enabled", "margin", "onChange", "tabVisible", "inView", "notify", "onVis", "io", "entries", "DEFAULT_THEME", "resolveTheme", "createStats", "visible", "position", "theme", "T", "shown", "accDt", "accCpu", "lastDom", "show", "ms", "createErrorOverlay", "place", "esc", "title", "createCapture", "renderNow", "screenshot", "quality", "toBlob", "b", "download", "filename", "blob", "saveBlob", "record", "fps", "mimeType", "bitsPerSecond", "dl", "rec", "chunks", "handle", "finished", "normalizeArgs", "resolveCanvas", "DEFAULT_CANVAS_ID", "setUniformIn", "cur", "readUniform", "createShader", "autoSetup", "globalDefines", "toArray", "commonSrc", "dialect", "includeStore", "strictUniforms", "warnUniforms", "showExpanded", "useOverlay", "givenCanvas", "bg", "emitter", "sizer", "pointer", "tweens", "overlay", "stats", "PASSES", "disposed", "rafId", "removeResize", "lastRender", "frame", "time", "playing", "timeScale", "fixedDelta", "maxFps", "loopLen", "maxDelta", "lastError", "refreshRate", "rafDts", "camera", "blit", "mainBackbuffer", "visibility", "reportError", "clearError", "loadText", "includeLoader", "commonText", "getCommon", "parsed", "buildProgram", "pass", "allPasses", "common", "full", "fc", "samplerNames", "frag", "resizeTargets", "handleResize", "loadPassChannels", "expandPassBlob", "unsupported", "passes", "build", "compiled", "fragcoord", "passTexture", "buffer", "drawPass", "iteration", "set1f", "set1i", "rw", "rh", "ky", "sz", "sw", "chTimes", "chRes", "texObj", "isCube", "chTime", "unit", "bindTex", "units", "frameStep", "advance", "rawDt", "t0", "loop", "startLoop", "stopLoop", "destroy", "onContextLost", "onContextRestored", "teardownPasses", "capture", "passName", "api", "hit", "scheduleRender", "owner", "renderQueued", "setShader", "setChannel", "index", "old", "VERSION", "readyPromise", "width", "height", "float", "COMMON", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "canvasOf", "w", "h", "c", "createGPUBackend", "probe", "dbg", "renderer", "canvas", "source", "palette", "matrix", "nearest", "el", "sm", "createShader", "COMMON", "MAX_KERNEL", "PREP", "QUANT", "DIFFUSE", "RESOLVE", "ORPHAN", "SMOOTH", "OUTLINE", "failure", "e", "passUniforms", "name", "values", "k", "lastSource", "paletteKey", "matrixKey", "setSource", "frame", "ctx", "setPalette", "plan", "key", "img", "i", "setMatrix", "map", "m", "run", "s", "diffusion", "kernel", "_", "v", "data", "out", "row", "y", "hasDOM", "isRGBA", "s", "loadImage", "src", "img", "sizeOf", "el", "unwrap", "toFrame", "source", "opts", "maxSize", "frame", "c", "width", "height", "k", "canvas", "ctx", "cached", "init_scale", "init_scale", "toCanvas", "img", "scale", "opts", "up", "upscale", "c", "downloadBlob", "data", "filename", "type", "blob", "url", "a", "table", "crc32", "bytes", "crc", "c", "k", "i", "init_scale", "SIG", "deflate", "bytes", "cs", "stream", "deflateSync", "chunk", "type", "data", "out", "dv", "crc32", "indexImage", "img", "d", "map", "colors", "idx", "i", "o", "k", "v", "encodePNG", "opts", "resizeNearest", "upscale", "w", "h", "ix", "ihdr", "parts", "raw", "bits", "stride", "row", "x", "bit", "c", "last", "y", "total", "s", "p", "isVideo", "s", "isVideoFrame", "createPixelator", "options", "want", "gpu", "gpuError", "createGPUBackend", "e", "scratch", "last", "queue", "frameFor", "source", "frame", "toFrame", "processNow", "settings", "t0", "plan", "makePlan", "data", "backend", "diffusionOnCPU", "runCPU", "ms", "makeResult", "run", "uniqueColors", "scale", "opts", "toCanvas", "encodePNG", "init_parse", "init_lospec", "init_scale", "init_color", "init_frames", "PRESETS", "h", "tag", "props", "children", "name", "classes", "el", "k", "v", "append", "c", "render", "uid", "nextId", "p", "pickFiles", "accept", "multiple", "res", "input", "h", "P", "icon", "name", "cls", "ICON_NAMES", "createStore", "initialSettings", "settings", "normalizeSettings", "target", "past", "future", "histories", "subs", "lastKey", "lastTime", "LIMIT", "emit", "why", "fn", "same", "a", "b", "patch", "opts", "next", "mergeSettings", "now", "coalesce", "key", "value", "h", "ZOOM_STEPS", "createStage", "onPick", "onViewChange", "screen", "h", "splitLeft", "splitRight", "handle", "icon", "split", "el", "ctx", "st", "dpr", "vw", "vh", "pattern", "patternKey", "checker", "css", "a", "b", "key", "c", "g", "resize", "r", "d", "draw", "fit", "fitZoom", "pad", "notify", "view", "zoomTo", "z", "cx", "cy", "px", "py", "zoomStep", "dir", "cur", "next", "s", "x", "y", "w", "hh", "sx", "ow", "oh", "x0", "x1", "y0", "y1", "i", "j", "drag", "pointers", "e", "u", "v", "prev", "other", "id", "d0", "d1", "end", "move", "ev", "up", "result", "original", "crop", "sizeChanged", "oldRect", "on", "section", "title", "opts", "children", "id", "nextId", "hintEl", "h", "toggle", "icon", "reset", "body", "el", "setOpen", "open", "t", "changed", "field", "label", "control", "help", "value", "lab", "slider", "o", "k", "step", "range", "num", "paint", "p", "set", "v", "d", "round", "select", "groups", "opt", "node", "g", "segmented", "btns", "seg", "b", "i", "input", "colorInput", "hex", "box", "numberInput", "init_scale", "init_color", "ByteWriter", "b", "nb", "arr", "i", "v", "s", "lzwEncode", "indices", "minCodeSize", "w", "clear", "eoi", "codeSize", "next", "dict", "cur", "curBits", "sub", "block", "emit", "code", "prefix", "k", "key", "hit", "keyOf", "d", "o", "tableFor", "colorKeys", "transparent", "list", "colors", "tIndex", "bits", "index", "reduce", "frame", "max", "pal", "extractPalette", "parseColor", "cache", "best", "bd", "dr", "dg", "db", "dist", "encodeGIF", "frames", "opts", "scale", "fr", "f", "upscale", "W", "H", "all", "perFrame", "opaqueCount", "global", "c", "f0", "table", "set", "idx", "p", "enc", "createZip", "entries", "files", "central", "offset", "used", "e", "name", "m", "i", "nameBytes", "data", "crc", "crc32", "d", "time", "date", "local", "lv", "cen", "cv", "cenSize", "s", "c", "end", "ev", "out", "o", "p", "blank", "w", "h", "blit", "dst", "src", "dx", "dy", "sx", "sy", "sw", "sh", "y", "so", "o", "packSpriteSheet", "frames", "opts", "pad", "cw", "ch", "cols", "rows", "W", "H", "image", "out", "i", "x", "atlas", "buildTileset", "img", "tw", "th", "mw", "mh", "tiles", "keys", "map", "flipsOut", "read", "tx", "ty", "t", "key", "s", "flip", "fx", "fy", "si", "id", "f", "code", "k", "init_frames", "toastHost", "host", "h", "toast", "msg", "o", "kind", "text", "bar", "el", "close", "icon", "timer", "ms", "m", "p", "k", "openMenu", "menu", "anchor", "items", "align", "closeMenu", "it", "b", "r", "mw", "mh", "left", "top", "buttons", "onKey", "e", "i", "onDown", "dialog", "title", "content", "actions", "onClose", "body", "d", "c", "render", "base", "name", "pngOpts", "s", "exportSize", "r", "item", "imageOpts", "videoScales", "size", "exportScale", "min", "fit", "target", "long", "portrait", "W", "H", "first", "v", "i", "a", "b", "createExporter", "app", "S", "exportPNG", "toast", "bytes", "encodePNG", "out", "suffix", "downloadBlob", "copyImage", "e", "task", "label", "fn", "ctrl", "t", "msg", "p", "m", "exportZip", "items", "signal", "progress", "entries", "own", "it", "settingsToJSON", "createZip", "frames", "opts", "onFrame", "mergeSettings", "video", "end", "forEachFrame", "index", "total", "exportAnimation", "delay", "list", "frameName", "encodeGIF", "createVideoEncoder", "decodeAudio", "audio", "enc", "tries", "err", "scale", "blob", "sound", "exportSheet", "image", "atlas", "packSpriteSheet", "k", "f", "key", "png", "exportTileset", "tile", "flips", "ts", "buildTileset", "map", "PREFIX", "load", "key", "fallback", "v", "save", "value", "createInspector", "app", "store", "up", "patch", "key", "commit", "S", "DEF", "defaultSettings", "same", "a", "b", "openState", "load", "sec", "title", "defaultOpen", "groups", "children", "section", "open", "save", "g", "statSize", "h", "statColors", "statTime", "stats", "tabSetup", "icon", "tabExport", "tabs", "scope", "segmented", "v", "scopeNote", "scopeRow", "sizeMode", "width", "slider", "height", "numberInput", "block", "resample", "detect", "widthBox", "blockBox", "secSize", "aspectBtns", "ASPECTS", "r", "glyph", "aspects", "fZoom", "fX", "fY", "secFrame", "field", "palSource", "select", "palBuiltin", "PALETTES", "p", "palCount", "swatches", "swCount", "swatchField", "palDistance", "palActions", "e", "secPal", "dMethod", "DITHER_METHODS", "m", "dStrength", "matrixText", "matrixHelp", "parseMatrix", "matrixBox", "secDither", "pct", "aBright", "aContrast", "aSat", "aHue", "aGamma", "secAdjust", "alphaCut", "orphans", "toggle", "smooth", "olMode", "olColor", "colorInput", "olCorners", "secClean", "setupPane", "exMode", "exScale", "exSizeOut", "exGrid", "exIndexed", "btnPNG", "btnCopy", "btnZip", "secImage", "anSource", "syncAnim", "anFormat", "anFps", "anStart", "anEnd", "anSize", "anAudio", "anAudioInput", "anNote", "btnAnim", "animOpts", "secAnim", "shCols", "shPad", "btnSheet", "secSheet", "tsSize", "n", "tsFlips", "btnTiles", "secTiles", "secSettings", "exportPane", "foot", "body", "el", "setTab", "t", "setup", "next", "cur", "hasVideo", "nImages", "i", "src", "ok", "f", "isVideo", "vs", "noAudio", "renderSwatches", "colors", "editable", "render", "c", "_", "j", "inp", "lastPaletteKey", "sync", "s", "result", "shown", "kind", "ditherKind", "adjusted", "crop", "cropRect", "framed", "many", "nShared", "cl", "out", "exportSize", "setStats", "used", "createLibrary", "app", "tab", "tabBtn", "id", "label", "ic", "h", "icon", "setTab", "tFiles", "tPresets", "tPalettes", "filesCount", "tabs", "search", "searchBox", "renderTab", "body", "el", "t", "b", "thumbs", "refreshThumbs", "q", "fileMenu", "it", "anchor", "i", "many", "menu", "renderFiles", "items", "list", "more", "e", "sub", "fmtTime", "row", "nOwn", "summary", "head", "add", "saved", "savedNote", "render", "thumbGen", "renderPresets", "cur", "PRESETS", "p", "grid", "active", "pic", "gen", "item", "s", "mergeSettings", "defaultSettings", "r", "c", "palRow", "removable", "strip", "pick", "del", "renderPalettes", "match", "mine", "built", "PALETTES", "actions", "yours", "m", "dusk", "still", "potion", "SAMPLES", "sampleURL", "s", "loadSample", "img", "DB", "STORE", "KEY", "open", "resolve", "reject", "req", "DB", "STORE", "run", "mode", "fn", "db", "tx", "saveWorkspace", "ws", "record", "s", "KEY", "a", "it", "loadWorkspace", "rec", "forgetWorkspace", "isQuotaError", "fmtBytes", "n", "IMAGE_TYPES", "VIDEO_TYPES", "PALETTE_EXT", "mountEditor", "root", "options", "usePersist", "narrow", "initial", "load", "defaultSettings", "decodeSettings", "toast", "store", "createStore", "app", "m", "o", "stage", "createStage", "pickAt", "updateZoomLabel", "inspector", "createInspector", "library", "createLibrary", "exporter", "createExporter", "btn", "ic", "label", "onclick", "extra", "h", "icon", "fileName", "startRename", "fileMeta", "undoBtn", "redoBtn", "compareBtn", "toggleCompare", "gridBtn", "toggleGrid", "zoomBtn", "e", "zoomMenu", "themeBtn", "toggleTheme", "libBtn", "togglePanel", "inspBtn", "helpBtn", "showHelp", "exportBtn", "exportMenu", "saveBtn", "saveNow", "brand", "top", "sampleButtons", "SAMPLES", "s", "openSample", "sampleURL", "empty", "openFiles", "pasteFromClipboard", "status", "busy", "viewTools", "playBtn", "togglePlay", "timeLabel", "scrub", "fpsLabel", "sound", "muteBtn", "toggleVolPop", "volFill", "volThumb", "volSlider", "volValue", "volPop", "soundBox", "setLevel", "v", "setSound", "levelAt", "r", "before", "move", "ev", "up", "cur", "next", "open", "close", "transport", "stepFrame", "stageWrap", "shell", "render", "applyTheme", "createPixelator", "dirty", "running", "lastSource", "outCanvas", "schedule", "run", "item", "updateStatus", "slow", "res", "it", "fmtTime", "why", "saveSoon", "saveT", "save", "makeThumb", "drawable", "w", "hgt", "c", "k", "addImage", "name", "file", "hh", "addVideo", "video", "videoReady", "codec", "sniffVideoCodec", "alt", "err", "seekTo", "estimateFps", "f", "updateTransport", "hasAudioTrack", "a", "pumpVideo", "addFiles", "files", "media", "palettes", "settingsFiles", "importPaletteFile", "text", "obj", "settingsFromJSON", "first", "t", "i", "select", "pickFiles", "img", "loadSample", "items", "type", "b", "editTarget", "togglePicker", "removeItem", "settingsFor", "clone", "force", "key", "setOwn", "own", "quiet", "was", "afterScopeChange", "snapshot", "copy", "nameCopy", "dir", "j", "splitExt", "ext", "base", "input", "done", "finish", "commit", "savedInfo", "bytesOf", "forgetSaved", "bytes", "saveWorkspace", "fmtBytes", "isQuotaError", "forgetWorkspace", "restoreSaved", "ws", "loadWorkspace", "added", "frame", "applySound", "level", "pct", "patch", "tick", "on", "anchor", "menu", "z", "which", "dark", "pixelsOf", "maxSize", "ctx", "u", "x", "hex", "toHex", "colors", "pickerBtn", "button", "usePalette", "p", "rememberPalette", "list", "parsePalette", "fmt", "dialog", "slug", "downloadBlob", "toGPL", "toHexFile", "toPaletteJSON", "note", "d", "fetchLospec", "detectGrid", "settingsToJSON", "url", "encodeSettings", "mergeSettings", "images", "animDefaults", "typing", "DITHER_ORDER", "mod", "closeMenu", "dragDepth", "source", "id", "PRESETS"]
7
7
  }