{"version":3,"sources":["../src/color-space.ts","../src/color.ts","../src/pipeline.ts","../src/loaders/browser.ts","../src/loaders/node.ts","../src/worker/worker-script.ts","../src/worker/manager.ts","../src/index.ts","../src/api.ts","../src/progressive.ts","../src/swatches.ts","../src/quantizers/mmcq.ts","../src/resolve-loader.ts","../src/sync.ts","../src/observe.ts"],"sourcesContent":["import type { OKLCH } from './types.js';\n\n// ---------------------------------------------------------------------------\n// sRGB ↔ Linear\n// ---------------------------------------------------------------------------\n\n/** Convert a single sRGB channel (0–255) to linear (0–1). */\nexport function srgbToLinear(c: number): number {\n    const s = c / 255;\n    return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n}\n\n/** Convert a linear channel (0–1) back to sRGB (0–255). */\nexport function linearToSrgb(c: number): number {\n    const s = c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n    return Math.round(Math.max(0, Math.min(255, s * 255)));\n}\n\n// ---------------------------------------------------------------------------\n// RGB → OKLab → OKLCH\n// ---------------------------------------------------------------------------\n\n/** Convert sRGB (0–255 each) to OKLCH. */\nexport function rgbToOklch(r: number, g: number, b: number): OKLCH {\n    // sRGB → linear\n    const lr = srgbToLinear(r);\n    const lg = srgbToLinear(g);\n    const lb = srgbToLinear(b);\n\n    // Linear sRGB → LMS (using Oklab M1 matrix)\n    const l_ = 0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb;\n    const m_ = 0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb;\n    const s_ = 0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb;\n\n    // Cube root (LMS → Lab cone response)\n    const l3 = Math.cbrt(l_);\n    const m3 = Math.cbrt(m_);\n    const s3 = Math.cbrt(s_);\n\n    // LMS cone response → OKLab\n    const L = 0.2104542553 * l3 + 0.7936177850 * m3 - 0.0040720468 * s3;\n    const a = 1.9779984951 * l3 - 2.4285922050 * m3 + 0.4505937099 * s3;\n    const bLab = 0.0259040371 * l3 + 0.7827717662 * m3 - 0.8086757660 * s3;\n\n    // OKLab → OKLCH\n    const C = Math.sqrt(a * a + bLab * bLab);\n    let H = Math.atan2(bLab, a) * (180 / Math.PI);\n    if (H < 0) H += 360;\n\n    return { l: L, c: C, h: H };\n}\n\n// ---------------------------------------------------------------------------\n// OKLCH → OKLab → RGB\n// ---------------------------------------------------------------------------\n\n/** Convert OKLCH back to sRGB (0–255 each). Clamps out-of-gamut values. */\nexport function oklchToRgb(l: number, c: number, h: number): [number, number, number] {\n    // OKLCH → OKLab\n    const hRad = h * (Math.PI / 180);\n    const a = c * Math.cos(hRad);\n    const bLab = c * Math.sin(hRad);\n\n    // OKLab → LMS cone response\n    const l3 = l + 0.3963377774 * a + 0.2158037573 * bLab;\n    const m3 = l - 0.1055613458 * a - 0.0638541728 * bLab;\n    const s3 = l - 0.0894841775 * a - 1.2914855480 * bLab;\n\n    // Cube (cone response → LMS)\n    const l_ = l3 * l3 * l3;\n    const m_ = m3 * m3 * m3;\n    const s_ = s3 * s3 * s3;\n\n    // LMS → linear sRGB (inverse of M1)\n    const lr = +4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_;\n    const lg = -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_;\n    const lb = -0.0041960863 * l_ - 0.7034186147 * m_ + 1.7076147010 * s_;\n\n    return [linearToSrgb(lr), linearToSrgb(lg), linearToSrgb(lb)];\n}\n\n// ---------------------------------------------------------------------------\n// Batch conversion helpers for OKLCH quantization pipeline\n// ---------------------------------------------------------------------------\n\n/**\n * Convert an array of RGB pixel triplets to OKLCH, scaled to 0–255 for\n * compatibility with the MMCQ quantizer (which expects integer ranges).\n *\n * Scaling: L (0–1) → 0–255, C (0–0.4) → 0–255, H (0–360) → 0–255\n */\nexport function pixelsRgbToOklchScaled(\n    pixels: Array<[number, number, number]>,\n): Array<[number, number, number]> {\n    const out: Array<[number, number, number]> = new Array(pixels.length);\n    for (let i = 0; i < pixels.length; i++) {\n        const [r, g, b] = pixels[i];\n        const { l, c, h } = rgbToOklch(r, g, b);\n        out[i] = [\n            Math.round(l * 255),\n            Math.round((c / 0.4) * 255),\n            Math.round((h / 360) * 255),\n        ];\n    }\n    return out;\n}\n\n/**\n * Convert scaled OKLCH palette entries back to RGB.\n */\nexport function paletteOklchScaledToRgb(\n    colors: Array<{ color: [number, number, number]; population: number }>,\n): Array<{ color: [number, number, number]; population: number }> {\n    return colors.map(({ color: [ls, cs, hs], population }) => {\n        const l = ls / 255;\n        const c = (cs / 255) * 0.4;\n        const h = (hs / 255) * 360;\n        return { color: oklchToRgb(l, c, h), population };\n    });\n}\n","import type { RGB, HSL, OKLCH, Color, ContrastInfo, CssColorFormat } from './types.js';\nimport { rgbToOklch } from './color-space.js';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction rgbToHsl(r: number, g: number, b: number): HSL {\n    const r1 = r / 255;\n    const g1 = g / 255;\n    const b1 = b / 255;\n    const max = Math.max(r1, g1, b1);\n    const min = Math.min(r1, g1, b1);\n    const l = (max + min) / 2;\n    let h = 0;\n    let s = 0;\n\n    if (max !== min) {\n        const d = max - min;\n        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n        if (max === r1) {\n            h = ((g1 - b1) / d + (g1 < b1 ? 6 : 0)) / 6;\n        } else if (max === g1) {\n            h = ((b1 - r1) / d + 2) / 6;\n        } else {\n            h = ((r1 - g1) / d + 4) / 6;\n        }\n    }\n\n    return {\n        h: Math.round(h * 360),\n        s: Math.round(s * 100),\n        l: Math.round(l * 100),\n    };\n}\n\n/** WCAG relative luminance from sRGB 0–255. */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n    const toLinear = (c: number) => {\n        const s = c / 255;\n        return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n    };\n    return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);\n}\n\n/** WCAG contrast ratio between two luminances (always ≥ 1). */\nfunction contrastRatio(l1: number, l2: number): number {\n    const lighter = Math.max(l1, l2);\n    const darker = Math.min(l1, l2);\n    return (lighter + 0.05) / (darker + 0.05);\n}\n\n// ---------------------------------------------------------------------------\n// ColorImpl\n// ---------------------------------------------------------------------------\n\nclass ColorImpl implements Color {\n    private readonly _r: number;\n    private readonly _g: number;\n    private readonly _b: number;\n    readonly population: number;\n    readonly proportion: number;\n\n    private _hsl: HSL | undefined;\n    private _oklch: OKLCH | undefined;\n    private _luminance: number | undefined;\n    private _contrast: ContrastInfo | undefined;\n\n    constructor(r: number, g: number, b: number, population: number, proportion: number) {\n        this._r = r;\n        this._g = g;\n        this._b = b;\n        this.population = population;\n        this.proportion = proportion;\n    }\n\n    rgb(): RGB {\n        return { r: this._r, g: this._g, b: this._b };\n    }\n\n    hex(): string {\n        const toHex = (n: number) => n.toString(16).padStart(2, '0');\n        return `#${toHex(this._r)}${toHex(this._g)}${toHex(this._b)}`;\n    }\n\n    hsl(): HSL {\n        if (!this._hsl) {\n            this._hsl = rgbToHsl(this._r, this._g, this._b);\n        }\n        return this._hsl;\n    }\n\n    oklch(): OKLCH {\n        if (!this._oklch) {\n            this._oklch = rgbToOklch(this._r, this._g, this._b);\n        }\n        return this._oklch;\n    }\n\n    css(format: CssColorFormat = 'rgb'): string {\n        switch (format) {\n            case 'hsl': {\n                const { h, s, l } = this.hsl();\n                return `hsl(${h}, ${s}%, ${l}%)`;\n            }\n            case 'oklch': {\n                const { l, c, h } = this.oklch();\n                return `oklch(${l.toFixed(3)} ${c.toFixed(3)} ${h.toFixed(1)})`;\n            }\n            case 'rgb':\n            default:\n                return `rgb(${this._r}, ${this._g}, ${this._b})`;\n        }\n    }\n\n    array(): [number, number, number] {\n        return [this._r, this._g, this._b];\n    }\n\n    toString(): string {\n        return this.hex();\n    }\n\n    get textColor(): string {\n        return this.isDark ? '#ffffff' : '#000000';\n    }\n\n    private get luminance(): number {\n        if (this._luminance === undefined) {\n            this._luminance = relativeLuminance(this._r, this._g, this._b);\n        }\n        return this._luminance;\n    }\n\n    get isDark(): boolean {\n        return this.luminance <= 0.179;\n    }\n\n    get isLight(): boolean {\n        return !this.isDark;\n    }\n\n    get contrast(): ContrastInfo {\n        if (!this._contrast) {\n            const lum = this.luminance;\n            const white = contrastRatio(lum, 1); // white luminance = 1\n            const black = contrastRatio(lum, 0); // black luminance = 0\n            const foreground = this.isDark\n                ? createColor(255, 255, 255, 0, 0)\n                : createColor(0, 0, 0, 0, 0);\n            this._contrast = {\n                white: Math.round(white * 100) / 100,\n                black: Math.round(black * 100) / 100,\n                foreground,\n            };\n        }\n        return this._contrast;\n    }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/** Create a Color object from RGB components, population count, and proportion. */\nexport function createColor(\n    r: number,\n    g: number,\n    b: number,\n    population: number,\n    proportion: number = 0,\n): Color {\n    return new ColorImpl(r, g, b, population, proportion);\n}\n","import type {\n    Color,\n    ExtractionOptions,\n    FilterOptions,\n    PixelBuffer,\n    Quantizer,\n} from './types.js';\nimport { createColor } from './color.js';\nimport {\n    pixelsRgbToOklchScaled,\n    paletteOklchScaledToRgb,\n} from './color-space.js';\n\n// ---------------------------------------------------------------------------\n// Validate & normalize options\n// ---------------------------------------------------------------------------\n\nexport interface ValidatedOptions {\n    colorCount: number;\n    quality: number;\n    ignoreWhite: boolean;\n    whiteThreshold: number;\n    alphaThreshold: number;\n    minSaturation: number;\n    colorSpace: 'rgb' | 'oklch';\n}\n\nexport function validateOptions(options: ExtractionOptions): ValidatedOptions {\n    let { colorCount, quality } = options;\n\n    if (typeof colorCount === 'undefined' || !Number.isInteger(colorCount)) {\n        colorCount = 10;\n    } else if (colorCount === 1) {\n        throw new Error(\n            'colorCount should be between 2 and 20. To get one color, call getColor() instead of getPalette()',\n        );\n    } else {\n        colorCount = Math.max(colorCount, 2);\n        colorCount = Math.min(colorCount, 20);\n    }\n\n    if (\n        typeof quality === 'undefined' ||\n        !Number.isInteger(quality) ||\n        quality < 1\n    ) {\n        quality = 10;\n    }\n\n    const ignoreWhite =\n        options.ignoreWhite !== undefined ? !!options.ignoreWhite : true;\n    const whiteThreshold =\n        typeof options.whiteThreshold === 'number' ? options.whiteThreshold : 250;\n    const alphaThreshold =\n        typeof options.alphaThreshold === 'number' ? options.alphaThreshold : 125;\n    const minSaturation =\n        typeof options.minSaturation === 'number'\n            ? Math.max(0, Math.min(1, options.minSaturation))\n            : 0;\n    const colorSpace = options.colorSpace ?? 'oklch';\n\n    return {\n        colorCount,\n        quality,\n        ignoreWhite,\n        whiteThreshold,\n        alphaThreshold,\n        minSaturation,\n        colorSpace,\n    };\n}\n\n// ---------------------------------------------------------------------------\n// Pixel sampling\n// ---------------------------------------------------------------------------\n\nexport function createPixelArray(\n    data: PixelBuffer,\n    pixelCount: number,\n    quality: number,\n    filterOptions: FilterOptions,\n): Array<[number, number, number]> {\n    const {\n        ignoreWhite = true,\n        whiteThreshold = 250,\n        alphaThreshold = 125,\n        minSaturation = 0,\n    } = filterOptions;\n\n    const pixelArray: Array<[number, number, number]> = [];\n\n    for (let i = 0; i < pixelCount; i += quality) {\n        const offset = i * 4;\n        const r = data[offset];\n        const g = data[offset + 1];\n        const b = data[offset + 2];\n        const a = data[offset + 3];\n\n        // Skip transparent pixels\n        if (a !== undefined && a < alphaThreshold) continue;\n\n        // Skip white pixels\n        if (\n            ignoreWhite &&\n            r > whiteThreshold &&\n            g > whiteThreshold &&\n            b > whiteThreshold\n        )\n            continue;\n\n        // Skip low-saturation pixels\n        if (minSaturation > 0) {\n            const max = Math.max(r, g, b);\n            if (max === 0 || (max - Math.min(r, g, b)) / max < minSaturation)\n                continue;\n        }\n\n        pixelArray.push([r, g, b]);\n    }\n\n    return pixelArray;\n}\n\n// ---------------------------------------------------------------------------\n// Fallback color (average)\n// ---------------------------------------------------------------------------\n\nexport function computeFallbackColor(\n    data: PixelBuffer,\n    pixelCount: number,\n    quality: number,\n): [number, number, number] | null {\n    let rTotal = 0;\n    let gTotal = 0;\n    let bTotal = 0;\n    let count = 0;\n\n    for (let i = 0; i < pixelCount; i += quality) {\n        const offset = i * 4;\n        rTotal += data[offset];\n        gTotal += data[offset + 1];\n        bTotal += data[offset + 2];\n        count++;\n    }\n\n    if (count === 0) return null;\n\n    return [\n        Math.round(rTotal / count),\n        Math.round(gTotal / count),\n        Math.round(bTotal / count),\n    ];\n}\n\n// ---------------------------------------------------------------------------\n// Main extraction pipeline\n// ---------------------------------------------------------------------------\n\nexport function extractPalette(\n    data: PixelBuffer,\n    width: number,\n    height: number,\n    opts: ValidatedOptions,\n    quantizer: Quantizer,\n): Color[] | null {\n    const pixelCount = width * height;\n    const filterOptions: FilterOptions = {\n        ignoreWhite: opts.ignoreWhite,\n        whiteThreshold: opts.whiteThreshold,\n        alphaThreshold: opts.alphaThreshold,\n        minSaturation: opts.minSaturation,\n    };\n\n    let pixelArray = createPixelArray(data, pixelCount, opts.quality, filterOptions);\n\n    // Progressively relax filters if all pixels were excluded\n    if (pixelArray.length === 0) {\n        pixelArray = createPixelArray(data, pixelCount, opts.quality, {\n            ...filterOptions,\n            ignoreWhite: false,\n        });\n    }\n    if (pixelArray.length === 0) {\n        pixelArray = createPixelArray(data, pixelCount, opts.quality, {\n            ...filterOptions,\n            ignoreWhite: false,\n            alphaThreshold: 0,\n        });\n    }\n\n    // OKLCH quantization path\n    let quantized: Array<{ color: [number, number, number]; population: number }>;\n    if (opts.colorSpace === 'oklch') {\n        const scaled = pixelsRgbToOklchScaled(pixelArray);\n        quantized = paletteOklchScaledToRgb(\n            quantizer.quantize(scaled, opts.colorCount),\n        );\n    } else {\n        quantized = quantizer.quantize(pixelArray, opts.colorCount);\n    }\n\n    if (quantized.length > 0) {\n        const totalPopulation = quantized.reduce((sum, q) => sum + q.population, 0);\n        return quantized.map(({ color: [r, g, b], population }) =>\n            createColor(r, g, b, population, totalPopulation > 0 ? population / totalPopulation : 0),\n        );\n    }\n\n    // Fallback: average all pixels\n    const fallback = computeFallbackColor(data, pixelCount, opts.quality);\n    return fallback ? [createColor(fallback[0], fallback[1], fallback[2], 1, 1)] : null;\n}\n","import type { BrowserSource, PixelData, PixelLoader } from '../types.js';\n\n/**\n * Browser pixel loader. Extracts RGBA pixel data from DOM image sources\n * using an off-screen canvas.\n */\nexport class BrowserPixelLoader implements PixelLoader<BrowserSource> {\n    async load(source: BrowserSource): Promise<PixelData> {\n        if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {\n            return this.loadFromImage(source);\n        }\n        if (typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement) {\n            return this.loadFromCanvas(source);\n        }\n        if (typeof ImageData !== 'undefined' && source instanceof ImageData) {\n            return {\n                data: source.data,\n                width: source.width,\n                height: source.height,\n            };\n        }\n        if (typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement) {\n            return this.loadFromVideo(source);\n        }\n        if (typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap) {\n            return this.loadFromImageBitmap(source);\n        }\n        if (typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas) {\n            return this.loadFromOffscreenCanvas(source);\n        }\n        throw new Error(\n            'Unsupported source type. Expected HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap, or OffscreenCanvas.',\n        );\n    }\n\n    private loadFromImage(img: HTMLImageElement): PixelData {\n        if (!img.complete) {\n            throw new Error(\n                'Image has not finished loading. Wait for the \"load\" event before calling getColor/getPalette.',\n            );\n        }\n        if (!img.naturalWidth) {\n            throw new Error(\n                'Image has no dimensions. It may not have loaded successfully.',\n            );\n        }\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d')!;\n        const width = (canvas.width = img.naturalWidth);\n        const height = (canvas.height = img.naturalHeight);\n        ctx.drawImage(img, 0, 0, width, height);\n        try {\n            const imageData = ctx.getImageData(0, 0, width, height);\n            return { data: imageData.data, width, height };\n        } catch (e: unknown) {\n            if (e instanceof DOMException && e.name === 'SecurityError') {\n                const err = new Error(\n                    'Image is tainted by cross-origin data. Add crossorigin=\"anonymous\" to the <img> tag and ensure the server sends appropriate CORS headers.',\n                );\n                err.cause = e;\n                throw err;\n            }\n            throw e;\n        }\n    }\n\n    private loadFromCanvas(canvas: HTMLCanvasElement): PixelData {\n        const ctx = canvas.getContext('2d')!;\n        const { width, height } = canvas;\n        const imageData = ctx.getImageData(0, 0, width, height);\n        return { data: imageData.data, width, height };\n    }\n\n    private loadFromVideo(video: HTMLVideoElement): PixelData {\n        if (video.readyState < 2) {\n            throw new Error(\n                'Video is not ready. Wait for the \"loadeddata\" or \"canplay\" event before calling getColor/getPalette.',\n            );\n        }\n        const width = video.videoWidth;\n        const height = video.videoHeight;\n        if (!width || !height) {\n            throw new Error(\n                'Video has no dimensions. It may not have loaded successfully.',\n            );\n        }\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d')!;\n        canvas.width = width;\n        canvas.height = height;\n        ctx.drawImage(video, 0, 0, width, height);\n        const imageData = ctx.getImageData(0, 0, width, height);\n        return { data: imageData.data, width, height };\n    }\n\n    private loadFromOffscreenCanvas(canvas: OffscreenCanvas): PixelData {\n        const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n        if (!ctx) {\n            throw new Error(\n                'Could not get 2D context from OffscreenCanvas.',\n            );\n        }\n        const { width, height } = canvas;\n        const imageData = ctx.getImageData(0, 0, width, height);\n        return { data: imageData.data, width, height };\n    }\n\n    private loadFromImageBitmap(bitmap: ImageBitmap): PixelData {\n        const canvas = document.createElement('canvas');\n        const ctx = canvas.getContext('2d')!;\n        canvas.width = bitmap.width;\n        canvas.height = bitmap.height;\n        ctx.drawImage(bitmap, 0, 0);\n        const imageData = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n        return { data: imageData.data, width: bitmap.width, height: bitmap.height };\n    }\n}\n","import type { NodeSource, PixelData, PixelLoader } from '../types.js';\n\n/** Custom decoder signature for pluggable Node decoders. */\nexport type NodeImageDecoder = (\n    input: string | Buffer,\n) => Promise<{ data: Uint8Array; width: number; height: number }>;\n\ninterface NodeLoaderOptions {\n    /** Override the default sharp-based decoder. */\n    decoder?: NodeImageDecoder;\n}\n\n/**\n * Node.js pixel loader. Uses `sharp` (dynamically imported) to decode images\n * into raw RGBA pixel buffers. Accepts file paths or Buffers.\n *\n * The sharp dependency is optional — use `createNodeLoader({ decoder })`\n * to supply a custom decoder if sharp is not available.\n */\nexport class NodePixelLoader implements PixelLoader<NodeSource> {\n    private readonly decoder: NodeImageDecoder;\n\n    constructor(options?: NodeLoaderOptions) {\n        this.decoder = options?.decoder ?? defaultSharpDecoder;\n    }\n\n    async load(source: NodeSource): Promise<PixelData> {\n        const result = await this.decoder(source);\n        return {\n            data: result.data,\n            width: result.width,\n            height: result.height,\n        };\n    }\n}\n\n/** Default decoder using sharp. Dynamically imports sharp so it stays optional. */\nasync function defaultSharpDecoder(\n    input: string | Buffer,\n): Promise<{ data: Uint8Array; width: number; height: number }> {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let sharpFn: any;\n    try {\n        const mod = await import('sharp');\n        sharpFn = mod.default ?? mod;\n    } catch {\n        throw new Error(\n            'sharp is required for Node.js image loading. Install it with: npm install sharp',\n        );\n    }\n    const image = sharpFn(input).ensureAlpha();\n    const { width, height } = await image.metadata();\n    if (!width || !height) {\n        throw new Error('Could not determine image dimensions.');\n    }\n    const { data } = await image.raw().toBuffer({ resolveWithObject: true });\n    return { data: new Uint8Array(data.buffer, data.byteOffset, data.byteLength), width, height };\n}\n\n/** Factory to create a NodePixelLoader with optional custom decoder. */\nexport function createNodeLoader(options?: NodeLoaderOptions): NodePixelLoader {\n    return new NodePixelLoader(options);\n}\n","/**\n * Self-contained worker script that receives pixel data, runs quantization,\n * and returns the serialized palette.\n *\n * Message protocol:\n *   Request:  { id: number, pixels: number[][], maxColors: number }\n *   Response: { id: number, palette: Array<{ color: [r,g,b], population: number }> }\n *   Error:    { id: number, error: string }\n */\n\n// This entire string is turned into a Blob URL by the worker manager.\n// It must be fully self-contained — no imports, no external dependencies.\nexport const WORKER_SOURCE = /* js */ `\n'use strict';\n\n// -------------------------------------------------------------------------\n// Inlined MMCQ (Modified Median Cut Quantization)\n// -------------------------------------------------------------------------\n\nvar SIGBITS = 5;\nvar RSHIFT = 3;\nvar MAX_ITER = 1000;\nvar FRACT_POP = 0.75;\nvar HISTO_SIZE = 32768;\n\nfunction colorIndex(r, g, b) {\n    return (r << 10) + (g << 5) + b;\n}\n\nfunction getHisto(pixels) {\n    var h = new Uint32Array(HISTO_SIZE);\n    for (var i = 0; i < pixels.length; i++) {\n        var p = pixels[i];\n        h[colorIndex(p[0] >> RSHIFT, p[1] >> RSHIFT, p[2] >> RSHIFT)]++;\n    }\n    return h;\n}\n\nfunction VBox(r1, r2, g1, g2, b1, b2, histo) {\n    this.r1 = r1; this.r2 = r2;\n    this.g1 = g1; this.g2 = g2;\n    this.b1 = b1; this.b2 = b2;\n    this.histo = histo;\n    this._count = -1;\n    this._volume = -1;\n    this._avg = null;\n}\n\nVBox.prototype.volume = function(force) {\n    if (this._volume < 0 || force) {\n        this._volume = (this.r2 - this.r1 + 1) * (this.g2 - this.g1 + 1) * (this.b2 - this.b1 + 1);\n    }\n    return this._volume;\n};\n\nVBox.prototype.count = function(force) {\n    if (this._count < 0 || force) {\n        var n = 0;\n        for (var i = this.r1; i <= this.r2; i++)\n            for (var j = this.g1; j <= this.g2; j++)\n                for (var k = this.b1; k <= this.b2; k++)\n                    n += this.histo[colorIndex(i, j, k)] || 0;\n        this._count = n;\n    }\n    return this._count;\n};\n\nVBox.prototype.copy = function() {\n    return new VBox(this.r1, this.r2, this.g1, this.g2, this.b1, this.b2, this.histo);\n};\n\nVBox.prototype.avg = function(force) {\n    if (!this._avg || force) {\n        var mult = 1 << RSHIFT;\n        if (this.r1 === this.r2 && this.g1 === this.g2 && this.b1 === this.b2) {\n            this._avg = [this.r1 << RSHIFT, this.g1 << RSHIFT, this.b1 << RSHIFT];\n        } else {\n            var ntot = 0, rsum = 0, gsum = 0, bsum = 0;\n            for (var i = this.r1; i <= this.r2; i++)\n                for (var j = this.g1; j <= this.g2; j++)\n                    for (var k = this.b1; k <= this.b2; k++) {\n                        var hval = this.histo[colorIndex(i, j, k)] || 0;\n                        ntot += hval;\n                        rsum += hval * (i + 0.5) * mult;\n                        gsum += hval * (j + 0.5) * mult;\n                        bsum += hval * (k + 0.5) * mult;\n                    }\n            this._avg = ntot\n                ? [~~(rsum / ntot), ~~(gsum / ntot), ~~(bsum / ntot)]\n                : [~~(mult * (this.r1 + this.r2 + 1) / 2), ~~(mult * (this.g1 + this.g2 + 1) / 2), ~~(mult * (this.b1 + this.b2 + 1) / 2)];\n        }\n    }\n    return this._avg;\n};\n\nfunction PQueue(comparator) {\n    this.contents = [];\n    this.sorted = false;\n    this.comparator = comparator;\n}\n\nPQueue.prototype.push = function(item) { this.contents.push(item); this.sorted = false; };\nPQueue.prototype.pop = function() {\n    if (!this.sorted) { this.contents.sort(this.comparator); this.sorted = true; }\n    return this.contents.pop();\n};\nPQueue.prototype.size = function() { return this.contents.length; };\n\nfunction vboxFromPixels(pixels, histo) {\n    var rmin = 1e6, rmax = 0, gmin = 1e6, gmax = 0, bmin = 1e6, bmax = 0;\n    for (var i = 0; i < pixels.length; i++) {\n        var p = pixels[i];\n        var rv = p[0] >> RSHIFT, gv = p[1] >> RSHIFT, bv = p[2] >> RSHIFT;\n        if (rv < rmin) rmin = rv; if (rv > rmax) rmax = rv;\n        if (gv < gmin) gmin = gv; if (gv > gmax) gmax = gv;\n        if (bv < bmin) bmin = bv; if (bv > bmax) bmax = bv;\n    }\n    return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n}\n\nfunction medianCutApply(histo, vbox) {\n    if (!vbox.count()) return undefined;\n    if (vbox.count() === 1) return [vbox.copy(), null];\n\n    var rw = vbox.r2 - vbox.r1 + 1;\n    var gw = vbox.g2 - vbox.g1 + 1;\n    var bw = vbox.b2 - vbox.b1 + 1;\n    var maxw = Math.max(rw, gw, bw);\n    var total = 0;\n    var partialsum = [];\n    var lookaheadsum = [];\n    var i, j, k, sum;\n\n    if (maxw === rw) {\n        for (i = vbox.r1; i <= vbox.r2; i++) {\n            sum = 0;\n            for (j = vbox.g1; j <= vbox.g2; j++)\n                for (k = vbox.b1; k <= vbox.b2; k++)\n                    sum += histo[colorIndex(i, j, k)] || 0;\n            total += sum; partialsum[i] = total;\n        }\n    } else if (maxw === gw) {\n        for (i = vbox.g1; i <= vbox.g2; i++) {\n            sum = 0;\n            for (j = vbox.r1; j <= vbox.r2; j++)\n                for (k = vbox.b1; k <= vbox.b2; k++)\n                    sum += histo[colorIndex(j, i, k)] || 0;\n            total += sum; partialsum[i] = total;\n        }\n    } else {\n        for (i = vbox.b1; i <= vbox.b2; i++) {\n            sum = 0;\n            for (j = vbox.r1; j <= vbox.r2; j++)\n                for (k = vbox.g1; k <= vbox.g2; k++)\n                    sum += histo[colorIndex(j, k, i)] || 0;\n            total += sum; partialsum[i] = total;\n        }\n    }\n\n    partialsum.forEach(function(d, idx) { lookaheadsum[idx] = total - d; });\n\n    function doCut(color) {\n        var dim1 = color + '1', dim2 = color + '2';\n        for (var i = vbox[dim1]; i <= vbox[dim2]; i++) {\n            if (partialsum[i] > total / 2) {\n                var vbox1 = vbox.copy(), vbox2 = vbox.copy();\n                var left = i - vbox[dim1], right = vbox[dim2] - i;\n                var d2 = left <= right\n                    ? Math.min(vbox[dim2] - 1, ~~(i + right / 2))\n                    : Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n                while (!partialsum[d2]) d2++;\n                var count2 = lookaheadsum[d2];\n                while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n                vbox1[dim2] = d2;\n                vbox2[dim1] = d2 + 1;\n                return [vbox1, vbox2];\n            }\n        }\n    }\n\n    if (maxw === rw) return doCut('r');\n    if (maxw === gw) return doCut('g');\n    return doCut('b');\n}\n\nfunction iterate(pq, target, histo) {\n    var ncolors = pq.size(), niters = 0;\n    while (niters < MAX_ITER) {\n        if (ncolors >= target) return;\n        niters++;\n        var vbox = pq.pop();\n        if (!vbox.count()) { pq.push(vbox); continue; }\n        var result = medianCutApply(histo, vbox);\n        if (!result || !result[0]) return;\n        pq.push(result[0]);\n        if (result[1]) { pq.push(result[1]); ncolors++; }\n    }\n}\n\nfunction quantize(pixels, maxColors) {\n    if (!pixels.length || maxColors < 2 || maxColors > 256) return [];\n\n    var histo = getHisto(pixels);\n    var vbox = vboxFromPixels(pixels, histo);\n    var pq = new PQueue(function(a, b) { return a.count() - b.count(); });\n    pq.push(vbox);\n    iterate(pq, FRACT_POP * maxColors, histo);\n\n    var pq2 = new PQueue(function(a, b) { return a.count() * a.volume() - b.count() * b.volume(); });\n    while (pq.size()) pq2.push(pq.pop());\n    iterate(pq2, maxColors, histo);\n\n    var results = [];\n    while (pq2.size()) {\n        var box = pq2.pop();\n        results.push({ color: box.avg(), population: box.count() });\n    }\n    return results;\n}\n\n// -------------------------------------------------------------------------\n// Worker message handler\n// -------------------------------------------------------------------------\n\nself.onmessage = function (e) {\n    var data = e.data;\n    var id = data.id;\n    try {\n        var palette = quantize(data.pixels, data.maxColors);\n        self.postMessage({ id: id, palette: palette });\n    } catch (err) {\n        self.postMessage({ id: id, error: err.message || 'Unknown worker error' });\n    }\n};\n`;\n","import type { Color } from '../types.js';\nimport { createColor } from '../color.js';\nimport { WORKER_SOURCE } from './worker-script.js';\n\nlet worker: Worker | null = null;\nlet blobUrl: string | null = null;\nlet nextId = 0;\nconst pending = new Map<\n    number,\n    { resolve: (value: Color[]) => void; reject: (reason: unknown) => void }\n>();\n\n/** Check whether the current environment supports Web Workers. */\nexport function isWorkerSupported(): boolean {\n    return typeof Worker !== 'undefined';\n}\n\nfunction getOrCreateWorker(): Worker {\n    if (worker) return worker;\n    if (!isWorkerSupported()) {\n        throw new Error('Web Workers are not supported in this environment.');\n    }\n    blobUrl = URL.createObjectURL(\n        new Blob([WORKER_SOURCE], { type: 'application/javascript' }),\n    );\n    worker = new Worker(blobUrl);\n    worker.onmessage = (e: MessageEvent) => {\n        const { id, palette, error } = e.data;\n        const entry = pending.get(id);\n        if (!entry) return;\n        pending.delete(id);\n        if (error) {\n            entry.reject(new Error(error));\n        } else {\n            const raw = palette as Array<{ color: [number, number, number]; population: number }>;\n            const totalPopulation = raw.reduce((sum: number, q: { population: number }) => sum + q.population, 0);\n            const colors = raw.map(({ color: [r, g, b], population }) =>\n                createColor(r, g, b, population, totalPopulation > 0 ? population / totalPopulation : 0));\n            entry.resolve(colors);\n        }\n    };\n    worker.onerror = (e) => {\n        // Reject all pending\n        for (const [, entry] of pending) {\n            entry.reject(new Error(e.message));\n        }\n        pending.clear();\n    };\n    return worker;\n}\n\n/**\n * Run quantization in a Web Worker.\n * @param pixels - Sampled pixel array (RGB triplets).\n * @param maxColors - Maximum palette size.\n * @param signal - Optional AbortSignal.\n */\nexport function extractInWorker(\n    pixels: Array<[number, number, number]>,\n    maxColors: number,\n    signal?: AbortSignal,\n): Promise<Color[]> {\n    return new Promise<Color[]>((resolve, reject) => {\n        if (signal?.aborted) {\n            reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));\n            return;\n        }\n\n        const id = nextId++;\n        pending.set(id, { resolve, reject });\n\n        const onAbort = () => {\n            pending.delete(id);\n            reject(signal!.reason ?? new DOMException('Aborted', 'AbortError'));\n        };\n\n        signal?.addEventListener('abort', onAbort, { once: true });\n\n        try {\n            const w = getOrCreateWorker();\n            w.postMessage({ id, pixels, maxColors });\n        } catch (err) {\n            pending.delete(id);\n            signal?.removeEventListener('abort', onAbort);\n            reject(err);\n        }\n    });\n}\n\n/** Terminate the worker and release the Blob URL. */\nexport function terminateWorker(): void {\n    if (worker) {\n        worker.terminate();\n        worker = null;\n    }\n    if (blobUrl) {\n        URL.revokeObjectURL(blobUrl);\n        blobUrl = null;\n    }\n    // Reject any outstanding requests\n    for (const [, entry] of pending) {\n        entry.reject(new Error('Worker terminated'));\n    }\n    pending.clear();\n}\n","// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\nexport {\n    getColor,\n    getPalette,\n    getSwatches,\n    getPaletteProgressive,\n    configure,\n} from './api.js';\n\n// ---------------------------------------------------------------------------\n// Sync browser API\n// ---------------------------------------------------------------------------\nexport {\n    getColorSync,\n    getPaletteSync,\n    getSwatchesSync,\n} from './sync.js';\n\n// ---------------------------------------------------------------------------\n// Live extraction (browser only)\n// ---------------------------------------------------------------------------\nexport { observe } from './observe.js';\nexport type { ObservableSource, ObserveOptions, ObserveController } from './observe.js';\n\n// ---------------------------------------------------------------------------\n// Color factory\n// ---------------------------------------------------------------------------\nexport { createColor } from './color.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\nexport type {\n    RGB,\n    HSL,\n    OKLCH,\n    FilterOptions,\n    ColorSpace,\n    ExtractionOptions,\n    ContrastInfo,\n    Color,\n    CssColorFormat,\n    SwatchRole,\n    Swatch,\n    SwatchMap,\n    BrowserSource,\n    NodeSource,\n    ImageSource,\n    ProgressiveResult,\n} from './types.js';\n\nexport type { SyncExtractionOptions } from './sync.js';\n","import type {\n    Color,\n    ExtractionOptions,\n    ImageSource,\n    PixelData,\n    PixelLoader,\n    ProgressiveResult,\n    Quantizer,\n    SwatchMap,\n} from './types.js';\nimport { validateOptions, extractPalette } from './pipeline.js';\nimport { extractProgressive } from './progressive.js';\nimport { classifySwatches } from './swatches.js';\nimport { MmcqQuantizer } from './quantizers/mmcq.js';\nimport { resolveDefaultLoader } from './resolve-loader.js';\n\n// ---------------------------------------------------------------------------\n// Global configuration\n// ---------------------------------------------------------------------------\n\nlet globalLoader: PixelLoader<ImageSource> | null = null;\nlet globalQuantizer: Quantizer | null = null;\n\n/**\n * Override the default pixel loader and/or quantizer.\n *\n * ```ts\n * import { configure } from 'colorthief';\n * import { WasmQuantizer } from 'colorthief/internals';\n * const q = new WasmQuantizer();\n * await q.init();\n * configure({ quantizer: q });\n * ```\n */\nexport function configure(opts: {\n    loader?: PixelLoader<ImageSource>;\n    quantizer?: Quantizer;\n}): void {\n    if (opts.loader) globalLoader = opts.loader;\n    if (opts.quantizer) globalQuantizer = opts.quantizer;\n}\n\n// ---------------------------------------------------------------------------\n// Lazy environment detection\n// ---------------------------------------------------------------------------\n\nasync function getLoader(perCall?: PixelLoader<ImageSource>): Promise<PixelLoader<ImageSource>> {\n    if (perCall) return perCall;\n    if (globalLoader) return globalLoader;\n    globalLoader = await resolveDefaultLoader();\n    return globalLoader;\n}\n\nasync function getQuantizer(perCall?: Quantizer): Promise<Quantizer> {\n    if (perCall) {\n        await perCall.init();\n        return perCall;\n    }\n    if (globalQuantizer) return globalQuantizer;\n    const q = new MmcqQuantizer();\n    await q.init();\n    globalQuantizer = q;\n    return q;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction checkAborted(signal?: AbortSignal): void {\n    if (signal?.aborted) {\n        throw signal.reason ?? new DOMException('Aborted', 'AbortError');\n    }\n}\n\nasync function loadPixels(\n    source: ImageSource,\n    options?: ExtractionOptions,\n): Promise<PixelData> {\n    checkAborted(options?.signal);\n    const loader = await getLoader(options?.loader);\n    return loader.load(source, options?.signal);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Get the single dominant color from an image.\n *\n * ```ts\n * const color = await getColor(imgElement);\n * console.log(color.hex()); // '#e84393'\n * ```\n */\nexport async function getColor(\n    source: ImageSource,\n    options?: ExtractionOptions,\n): Promise<Color | null> {\n    const palette = await getPalette(source, {\n        colorCount: 5,\n        ...options,\n    });\n    return palette ? palette[0] : null;\n}\n\n/**\n * Get a color palette from an image.\n *\n * ```ts\n * const palette = await getPalette(imgElement, { colorCount: 5 });\n * palette.forEach(c => console.log(c.hex()));\n * ```\n */\nexport async function getPalette(\n    source: ImageSource,\n    options?: ExtractionOptions,\n): Promise<Color[] | null> {\n    const opts = validateOptions(options ?? {});\n\n    checkAborted(options?.signal);\n\n    // Worker path (browser only)\n    if (options?.worker) {\n        const { isWorkerSupported, extractInWorker } = await import(\n            './worker/manager.js'\n        );\n        if (isWorkerSupported()) {\n            const { data, width, height } = await loadPixels(source, options);\n            const { createPixelArray } = await import('./pipeline.js');\n            const pixelArray = createPixelArray(data, width * height, opts.quality, {\n                ignoreWhite: opts.ignoreWhite,\n                whiteThreshold: opts.whiteThreshold,\n                alphaThreshold: opts.alphaThreshold,\n                minSaturation: opts.minSaturation,\n            });\n            return extractInWorker(pixelArray, opts.colorCount, options?.signal);\n        }\n        // Fall through to main thread if workers not supported\n    }\n\n    const [pixels, quantizer] = await Promise.all([\n        loadPixels(source, options),\n        getQuantizer(options?.quantizer),\n    ]);\n\n    checkAborted(options?.signal);\n\n    return extractPalette(\n        pixels.data,\n        pixels.width,\n        pixels.height,\n        opts,\n        quantizer,\n    );\n}\n\n/**\n * Get semantic swatches (Vibrant, Muted, etc.) from an image.\n *\n * ```ts\n * const swatches = await getSwatches(imgElement);\n * console.log(swatches.Vibrant?.color.hex());\n * ```\n */\nexport async function getSwatches(\n    source: ImageSource,\n    options?: ExtractionOptions,\n): Promise<SwatchMap> {\n    const palette = await getPalette(source, {\n        colorCount: 16,\n        ...options,\n    });\n    return classifySwatches(palette ?? []);\n}\n\n/**\n * Progressively extract a palette with increasing quality.\n * Yields intermediate results so the UI can update incrementally.\n *\n * ```ts\n * for await (const { palette, progress, done } of getPaletteProgressive(img)) {\n *   updateUI(palette, progress);\n * }\n * ```\n */\nexport async function* getPaletteProgressive(\n    source: ImageSource,\n    options?: ExtractionOptions,\n): AsyncGenerator<ProgressiveResult> {\n    const opts = validateOptions(options ?? {});\n\n    const [pixels, quantizer] = await Promise.all([\n        loadPixels(source, options),\n        getQuantizer(options?.quantizer),\n    ]);\n\n    yield* extractProgressive(\n        pixels.data,\n        pixels.width,\n        pixels.height,\n        opts,\n        quantizer,\n        options?.signal,\n    );\n}\n","import type {\n    Color,\n    PixelBuffer,\n    ProgressiveResult,\n    Quantizer,\n} from './types.js';\nimport { extractPalette, type ValidatedOptions } from './pipeline.js';\n\n/** Quality divisors for the 3 progressive passes. */\nconst PASSES = [\n    { divisor: 16, progress: 0.06 },\n    { divisor: 4, progress: 0.25 },\n    { divisor: 1, progress: 1.0 },\n];\n\n/** Yield between passes so the UI can repaint. */\nfunction yieldToMain(): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/**\n * Progressive palette extraction. Runs 3 passes with increasing quality\n * (16x skip → 4x skip → full quality), yielding intermediate results.\n */\nexport async function* extractProgressive(\n    data: PixelBuffer,\n    width: number,\n    height: number,\n    opts: ValidatedOptions,\n    quantizer: Quantizer,\n    signal?: AbortSignal,\n): AsyncGenerator<ProgressiveResult> {\n    for (let i = 0; i < PASSES.length; i++) {\n        if (signal?.aborted) {\n            throw signal.reason ?? new DOMException('Aborted', 'AbortError');\n        }\n\n        const pass = PASSES[i];\n        const passOpts: ValidatedOptions = {\n            ...opts,\n            quality: opts.quality * pass.divisor,\n        };\n\n        const palette = extractPalette(data, width, height, passOpts, quantizer);\n        const done = i === PASSES.length - 1;\n\n        yield {\n            palette: palette ?? [],\n            progress: pass.progress,\n            done,\n        };\n\n        if (!done) {\n            await yieldToMain();\n        }\n    }\n}\n","import type { Color, Swatch, SwatchMap, SwatchRole } from './types.js';\nimport { createColor } from './color.js';\n\n// ---------------------------------------------------------------------------\n// OKLCH target ranges for each swatch role\n// ---------------------------------------------------------------------------\n\ninterface SwatchTarget {\n    role: SwatchRole;\n    /** Target OKLCH lightness (0–1). */\n    targetL: number;\n    /** Min / max lightness. */\n    minL: number;\n    maxL: number;\n    /** Target chroma (0–0.4). */\n    targetC: number;\n    /** Min chroma. */\n    minC: number;\n}\n\nconst TARGETS: SwatchTarget[] = [\n    { role: 'Vibrant',      targetL: 0.65, minL: 0.40, maxL: 0.85, targetC: 0.20, minC: 0.08 },\n    { role: 'Muted',        targetL: 0.65, minL: 0.40, maxL: 0.85, targetC: 0.04, minC: 0.00 },\n    { role: 'DarkVibrant',  targetL: 0.30, minL: 0.00, maxL: 0.45, targetC: 0.20, minC: 0.08 },\n    { role: 'DarkMuted',    targetL: 0.30, minL: 0.00, maxL: 0.45, targetC: 0.04, minC: 0.00 },\n    { role: 'LightVibrant', targetL: 0.85, minL: 0.70, maxL: 1.00, targetC: 0.20, minC: 0.08 },\n    { role: 'LightMuted',   targetL: 0.85, minL: 0.70, maxL: 1.00, targetC: 0.04, minC: 0.00 },\n];\n\n// ---------------------------------------------------------------------------\n// Scoring\n// ---------------------------------------------------------------------------\n\nconst WEIGHT_L = 6;\nconst WEIGHT_C = 3;\nconst WEIGHT_POP = 1;\n\nfunction score(\n    color: Color,\n    target: SwatchTarget,\n    maxPopulation: number,\n): number {\n    const { l, c } = color.oklch();\n\n    // Out of lightness range → disqualified\n    if (l < target.minL || l > target.maxL) return -Infinity;\n    // Below minimum chroma → disqualified\n    if (c < target.minC) return -Infinity;\n\n    const lDist = 1 - Math.abs(l - target.targetL);\n    const cDist = 1 - Math.min(Math.abs(c - target.targetC) / 0.2, 1);\n    const pop = maxPopulation > 0 ? color.population / maxPopulation : 0;\n\n    return lDist * WEIGHT_L + cDist * WEIGHT_C + pop * WEIGHT_POP;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nconst WHITE = createColor(255, 255, 255, 0);\nconst BLACK = createColor(0, 0, 0, 0);\n\nfunction textColors(color: Color): { title: Color; body: Color } {\n    return {\n        title: color.isDark ? WHITE : BLACK,\n        body: color.isDark ? WHITE : BLACK,\n    };\n}\n\n/**\n * Classify a palette into semantic swatch roles using OKLCH distance scoring.\n * Each role is matched to the best-scoring palette color. A color can only\n * be assigned to one role (the one where it scores highest).\n */\nexport function classifySwatches(palette: Color[]): SwatchMap {\n    const maxPopulation = Math.max(...palette.map((c) => c.population), 1);\n\n    // Score every (color, target) pair\n    const assignments: Array<{\n        role: SwatchRole;\n        color: Color;\n        score: number;\n    }> = [];\n\n    for (const target of TARGETS) {\n        let bestColor: Color | null = null;\n        let bestScore = -Infinity;\n\n        for (const color of palette) {\n            const s = score(color, target, maxPopulation);\n            if (s > bestScore) {\n                bestScore = s;\n                bestColor = color;\n            }\n        }\n\n        if (bestColor && bestScore > -Infinity) {\n            assignments.push({ role: target.role, color: bestColor, score: bestScore });\n        }\n    }\n\n    // Resolve conflicts: if the same color is best for multiple roles,\n    // keep the role where it scored highest; re-pick the loser.\n    const used = new Set<Color>();\n    const result: Partial<SwatchMap> = {};\n\n    // Sort assignments by score descending so highest-scoring role wins\n    assignments.sort((a, b) => b.score - a.score);\n\n    for (const assignment of assignments) {\n        if (used.has(assignment.color)) {\n            // Try to find next best unused color for this role\n            const target = TARGETS.find((t) => t.role === assignment.role)!;\n            let fallback: Color | null = null;\n            let fallbackScore = -Infinity;\n            for (const color of palette) {\n                if (used.has(color)) continue;\n                const s = score(color, target, maxPopulation);\n                if (s > fallbackScore) {\n                    fallbackScore = s;\n                    fallback = color;\n                }\n            }\n            if (fallback && fallbackScore > -Infinity) {\n                used.add(fallback);\n                const { title, body } = textColors(fallback);\n                result[assignment.role] = {\n                    color: fallback,\n                    role: assignment.role,\n                    titleTextColor: title,\n                    bodyTextColor: body,\n                };\n            } else {\n                result[assignment.role] = null;\n            }\n        } else {\n            used.add(assignment.color);\n            const { title, body } = textColors(assignment.color);\n            result[assignment.role] = {\n                color: assignment.color,\n                role: assignment.role,\n                titleTextColor: title,\n                bodyTextColor: body,\n            };\n        }\n    }\n\n    // Fill any unassigned roles with null\n    for (const target of TARGETS) {\n        if (!(target.role in result)) {\n            result[target.role] = null;\n        }\n    }\n\n    return result as SwatchMap;\n}\n","import type { Quantizer } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Constants (match original quantize library)\n// ---------------------------------------------------------------------------\n\nconst SIGBITS = 5;\nconst RSHIFT = 8 - SIGBITS;\nconst MAX_ITERATIONS = 1000;\nconst FRACT_BY_POPULATIONS = 0.75;\nconst HISTO_SIZE = 1 << (3 * SIGBITS);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColorIndex(r: number, g: number, b: number): number {\n    return (r << (2 * SIGBITS)) + (g << SIGBITS) + b;\n}\n\n// ---------------------------------------------------------------------------\n// VBox — a 3-D box in reduced (5-bit) RGB color space\n// ---------------------------------------------------------------------------\n\nclass VBox {\n    r1: number;\n    r2: number;\n    g1: number;\n    g2: number;\n    b1: number;\n    b2: number;\n\n    private readonly histo: Uint32Array;\n    private _volume: number | undefined;\n    private _count: number | undefined;\n    private _avg: [number, number, number] | undefined;\n\n    constructor(\n        r1: number,\n        r2: number,\n        g1: number,\n        g2: number,\n        b1: number,\n        b2: number,\n        histo: Uint32Array,\n    ) {\n        this.r1 = r1;\n        this.r2 = r2;\n        this.g1 = g1;\n        this.g2 = g2;\n        this.b1 = b1;\n        this.b2 = b2;\n        this.histo = histo;\n    }\n\n    volume(force = false): number {\n        if (this._volume === undefined || force) {\n            this._volume =\n                (this.r2 - this.r1 + 1) *\n                (this.g2 - this.g1 + 1) *\n                (this.b2 - this.b1 + 1);\n        }\n        return this._volume;\n    }\n\n    count(force = false): number {\n        if (this._count === undefined || force) {\n            let npix = 0;\n            for (let i = this.r1; i <= this.r2; i++) {\n                for (let j = this.g1; j <= this.g2; j++) {\n                    for (let k = this.b1; k <= this.b2; k++) {\n                        npix += this.histo[getColorIndex(i, j, k)] || 0;\n                    }\n                }\n            }\n            this._count = npix;\n        }\n        return this._count;\n    }\n\n    copy(): VBox {\n        return new VBox(this.r1, this.r2, this.g1, this.g2, this.b1, this.b2, this.histo);\n    }\n\n    avg(force = false): [number, number, number] {\n        if (this._avg === undefined || force) {\n            const mult = 1 << RSHIFT;\n\n            // Single-color box: return exact color\n            if (this.r1 === this.r2 && this.g1 === this.g2 && this.b1 === this.b2) {\n                this._avg = [\n                    this.r1 << RSHIFT,\n                    this.g1 << RSHIFT,\n                    this.b1 << RSHIFT,\n                ];\n            } else {\n                let ntot = 0;\n                let rsum = 0;\n                let gsum = 0;\n                let bsum = 0;\n\n                for (let i = this.r1; i <= this.r2; i++) {\n                    for (let j = this.g1; j <= this.g2; j++) {\n                        for (let k = this.b1; k <= this.b2; k++) {\n                            const hval = this.histo[getColorIndex(i, j, k)] || 0;\n                            ntot += hval;\n                            rsum += hval * (i + 0.5) * mult;\n                            gsum += hval * (j + 0.5) * mult;\n                            bsum += hval * (k + 0.5) * mult;\n                        }\n                    }\n                }\n\n                if (ntot) {\n                    this._avg = [\n                        ~~(rsum / ntot),\n                        ~~(gsum / ntot),\n                        ~~(bsum / ntot),\n                    ];\n                } else {\n                    this._avg = [\n                        ~~((mult * (this.r1 + this.r2 + 1)) / 2),\n                        ~~((mult * (this.g1 + this.g2 + 1)) / 2),\n                        ~~((mult * (this.b1 + this.b2 + 1)) / 2),\n                    ];\n                }\n            }\n        }\n        return this._avg;\n    }\n}\n\n// ---------------------------------------------------------------------------\n// PQueue — lazy-sorted priority queue\n// ---------------------------------------------------------------------------\n\nclass PQueue<T> {\n    private contents: T[] = [];\n    private sorted = false;\n\n    constructor(private comparator: (a: T, b: T) => number) {}\n\n    private sort(): void {\n        this.contents.sort(this.comparator);\n        this.sorted = true;\n    }\n\n    push(item: T): void {\n        this.contents.push(item);\n        this.sorted = false;\n    }\n\n    peek(index?: number): T {\n        if (!this.sorted) this.sort();\n        return this.contents[index ?? this.contents.length - 1];\n    }\n\n    pop(): T {\n        if (!this.sorted) this.sort();\n        return this.contents.pop()!;\n    }\n\n    size(): number {\n        return this.contents.length;\n    }\n\n    map<U>(fn: (item: T) => U): U[] {\n        return this.contents.map(fn);\n    }\n}\n\n// ---------------------------------------------------------------------------\n// Histogram & initial VBox\n// ---------------------------------------------------------------------------\n\nfunction getHisto(pixels: Array<[number, number, number]>): Uint32Array {\n    const histo = new Uint32Array(HISTO_SIZE);\n    for (const pixel of pixels) {\n        const rval = pixel[0] >> RSHIFT;\n        const gval = pixel[1] >> RSHIFT;\n        const bval = pixel[2] >> RSHIFT;\n        histo[getColorIndex(rval, gval, bval)]++;\n    }\n    return histo;\n}\n\nfunction vboxFromPixels(\n    pixels: Array<[number, number, number]>,\n    histo: Uint32Array,\n): VBox {\n    let rmin = 1000000;\n    let rmax = 0;\n    let gmin = 1000000;\n    let gmax = 0;\n    let bmin = 1000000;\n    let bmax = 0;\n\n    for (const pixel of pixels) {\n        const rval = pixel[0] >> RSHIFT;\n        const gval = pixel[1] >> RSHIFT;\n        const bval = pixel[2] >> RSHIFT;\n        if (rval < rmin) rmin = rval;\n        else if (rval > rmax) rmax = rval;\n        if (gval < gmin) gmin = gval;\n        else if (gval > gmax) gmax = gval;\n        if (bval < bmin) bmin = bval;\n        else if (bval > bmax) bmax = bval;\n    }\n\n    return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);\n}\n\n// ---------------------------------------------------------------------------\n// Median-cut split\n// ---------------------------------------------------------------------------\n\nfunction medianCutApply(histo: Uint32Array, vbox: VBox): [VBox, VBox | null] | undefined {\n    if (!vbox.count()) return undefined;\n\n    // Only one pixel — no split possible\n    if (vbox.count() === 1) return [vbox.copy(), null];\n\n    const rw = vbox.r2 - vbox.r1 + 1;\n    const gw = vbox.g2 - vbox.g1 + 1;\n    const bw = vbox.b2 - vbox.b1 + 1;\n    const maxw = Math.max(rw, gw, bw);\n\n    let total = 0;\n    const partialsum: number[] = [];\n    const lookaheadsum: number[] = [];\n\n    if (maxw === rw) {\n        for (let i = vbox.r1; i <= vbox.r2; i++) {\n            let sum = 0;\n            for (let j = vbox.g1; j <= vbox.g2; j++) {\n                for (let k = vbox.b1; k <= vbox.b2; k++) {\n                    sum += histo[getColorIndex(i, j, k)] || 0;\n                }\n            }\n            total += sum;\n            partialsum[i] = total;\n        }\n    } else if (maxw === gw) {\n        for (let i = vbox.g1; i <= vbox.g2; i++) {\n            let sum = 0;\n            for (let j = vbox.r1; j <= vbox.r2; j++) {\n                for (let k = vbox.b1; k <= vbox.b2; k++) {\n                    sum += histo[getColorIndex(j, i, k)] || 0;\n                }\n            }\n            total += sum;\n            partialsum[i] = total;\n        }\n    } else {\n        for (let i = vbox.b1; i <= vbox.b2; i++) {\n            let sum = 0;\n            for (let j = vbox.r1; j <= vbox.r2; j++) {\n                for (let k = vbox.g1; k <= vbox.g2; k++) {\n                    sum += histo[getColorIndex(j, k, i)] || 0;\n                }\n            }\n            total += sum;\n            partialsum[i] = total;\n        }\n    }\n\n    partialsum.forEach((d, i) => {\n        lookaheadsum[i] = total - d;\n    });\n\n    function doCut(color: 'r' | 'g' | 'b'): [VBox, VBox] | undefined {\n        const dim1 = (color + '1') as 'r1' | 'g1' | 'b1';\n        const dim2 = (color + '2') as 'r2' | 'g2' | 'b2';\n\n        for (let i = vbox[dim1]; i <= vbox[dim2]; i++) {\n            if (partialsum[i] > total / 2) {\n                const vbox1 = vbox.copy();\n                const vbox2 = vbox.copy();\n                const left = i - vbox[dim1];\n                const right = vbox[dim2] - i;\n\n                let d2: number;\n                if (left <= right) {\n                    d2 = Math.min(vbox[dim2] - 1, ~~(i + right / 2));\n                } else {\n                    d2 = Math.max(vbox[dim1], ~~(i - 1 - left / 2));\n                }\n\n                // Avoid 0-count boxes\n                while (!partialsum[d2]) d2++;\n                let count2 = lookaheadsum[d2];\n                while (!count2 && partialsum[d2 - 1]) count2 = lookaheadsum[--d2];\n\n                // Set dimensions\n                vbox1[dim2] = d2;\n                vbox2[dim1] = vbox1[dim2] + 1;\n\n                return [vbox1, vbox2];\n            }\n        }\n        return undefined;\n    }\n\n    if (maxw === rw) return doCut('r');\n    if (maxw === gw) return doCut('g');\n    return doCut('b');\n}\n\n// ---------------------------------------------------------------------------\n// Iterative splitting\n// ---------------------------------------------------------------------------\n\nfunction iterate(pq: PQueue<VBox>, target: number, histo: Uint32Array): void {\n    let ncolors = pq.size();\n    let niters = 0;\n\n    while (niters < MAX_ITERATIONS) {\n        if (ncolors >= target) return;\n        niters++;\n\n        const vbox = pq.pop();\n\n        if (!vbox.count()) {\n            pq.push(vbox);\n            continue;\n        }\n\n        const result = medianCutApply(histo, vbox);\n        if (!result || !result[0]) return;\n\n        pq.push(result[0]);\n        if (result[1]) {\n            pq.push(result[1]);\n            ncolors++;\n        }\n    }\n}\n\n// ---------------------------------------------------------------------------\n// Main quantize function\n// ---------------------------------------------------------------------------\n\nfunction quantize(\n    pixels: Array<[number, number, number]>,\n    maxColors: number,\n): Array<{ color: [number, number, number]; population: number }> {\n    if (!pixels.length || maxColors < 2 || maxColors > 256) return [];\n\n    // Short-circuit: if unique colors <= maxColors, return them directly\n    const seenColors = new Set<string>();\n    const uniqueColors: Array<[number, number, number]> = [];\n    for (const color of pixels) {\n        const key = color.join(',');\n        if (!seenColors.has(key)) {\n            seenColors.add(key);\n            uniqueColors.push(color);\n        }\n    }\n    if (uniqueColors.length <= maxColors) {\n        // Count populations for unique colors\n        const countMap = new Map<string, number>();\n        for (const color of pixels) {\n            const key = color.join(',');\n            countMap.set(key, (countMap.get(key) || 0) + 1);\n        }\n        return uniqueColors.map((color) => ({\n            color,\n            population: countMap.get(color.join(','))!,\n        }));\n    }\n\n    const histo = getHisto(pixels);\n\n    // Get the initial vbox from the pixels\n    const vbox = vboxFromPixels(pixels, histo);\n    const pq = new PQueue<VBox>((a, b) => a.count() - b.count());\n    pq.push(vbox);\n\n    // Phase 1: split by population until FRACT_BY_POPULATIONS * maxColors\n    iterate(pq, FRACT_BY_POPULATIONS * maxColors, histo);\n\n    // Phase 2: re-sort by count * volume, continue splitting\n    const pq2 = new PQueue<VBox>((a, b) => a.count() * a.volume() - b.count() * b.volume());\n    while (pq.size()) {\n        pq2.push(pq.pop());\n    }\n    iterate(pq2, maxColors, histo);\n\n    // Extract palette with population counts\n    const results: Array<{ color: [number, number, number]; population: number }> = [];\n    while (pq2.size()) {\n        const box = pq2.pop();\n        results.push({\n            color: box.avg(),\n            population: box.count(),\n        });\n    }\n\n    return results;\n}\n\n// ---------------------------------------------------------------------------\n// Quantizer adapter\n// ---------------------------------------------------------------------------\n\n/**\n * MMCQ (Modified Median Cut Quantization) — inlined TypeScript implementation.\n * Port of the @lokesh.dhakar/quantize algorithm with population tracking.\n */\nexport class MmcqQuantizer implements Quantizer {\n    async init(): Promise<void> {\n        // No-op — pure TypeScript, ready to use.\n    }\n\n    quantize(\n        pixels: Array<[number, number, number]>,\n        maxColors: number,\n    ): Array<{ color: [number, number, number]; population: number }> {\n        return quantize(pixels, maxColors);\n    }\n}\n","import type { ImageSource, PixelLoader } from './types.js';\n\n/**\n * Resolve the default pixel loader based on the current environment.\n * This universal version supports both browser and Node.js.\n *\n * The browser build swaps this module for resolve-loader.browser.ts\n * which only includes the browser loader (no sharp dependency).\n */\nexport async function resolveDefaultLoader(): Promise<PixelLoader<ImageSource>> {\n    const isBrowser =\n        typeof window !== 'undefined' && typeof document !== 'undefined';\n\n    if (isBrowser) {\n        const { BrowserPixelLoader } = await import('./loaders/browser.js');\n        return new BrowserPixelLoader() as PixelLoader<ImageSource>;\n    } else {\n        const { NodePixelLoader } = await import('./loaders/node.js');\n        return new NodePixelLoader() as PixelLoader<ImageSource>;\n    }\n}\n","/**\n * Synchronous browser-only API.\n *\n * These functions accept only BrowserSource (HTMLImageElement, HTMLCanvasElement,\n * ImageData, ImageBitmap) and run entirely on the main thread with no async overhead.\n *\n * For Node.js sources (file paths, Buffers) or features like Web Workers and\n * AbortSignal, use the async API (getColor, getPalette, getSwatches).\n */\nimport type {\n    BrowserSource,\n    Color,\n    FilterOptions,\n    ColorSpace,\n    Quantizer,\n    SwatchMap,\n} from './types.js';\nimport { BrowserPixelLoader } from './loaders/browser.js';\nimport { MmcqQuantizer } from './quantizers/mmcq.js';\nimport { validateOptions, extractPalette } from './pipeline.js';\nimport { classifySwatches } from './swatches.js';\n\n// ---------------------------------------------------------------------------\n// Sync-specific options (subset — no worker, no signal, no loader)\n// ---------------------------------------------------------------------------\n\nexport interface SyncExtractionOptions extends FilterOptions {\n    /** Number of colors in the palette (2–20). @default 10 */\n    colorCount?: number;\n    /** Sampling quality (1 = highest). @default 10 */\n    quality?: number;\n    /** Color space for quantization. @default 'rgb' */\n    colorSpace?: ColorSpace;\n    /** Override the quantizer for this call. Must already be init()'d. */\n    quantizer?: Quantizer;\n}\n\n// ---------------------------------------------------------------------------\n// Shared singletons\n// ---------------------------------------------------------------------------\n\nconst loader = new BrowserPixelLoader();\nconst defaultQuantizer = new MmcqQuantizer();\n\n// ---------------------------------------------------------------------------\n// Public sync API\n// ---------------------------------------------------------------------------\n\n/**\n * Synchronously get the dominant color from a browser image source.\n *\n * ```ts\n * const color = getColorSync(imgElement);\n * console.log(color.hex()); // '#e84393'\n * ```\n */\nexport function getColorSync(\n    source: BrowserSource,\n    options?: SyncExtractionOptions,\n): Color | null {\n    const palette = getPaletteSync(source, { colorCount: 5, ...options });\n    return palette ? palette[0] : null;\n}\n\n/**\n * Synchronously get a color palette from a browser image source.\n *\n * ```ts\n * const palette = getPaletteSync(imgElement, { colorCount: 5 });\n * palette.forEach(c => console.log(c.hex()));\n * ```\n */\nexport function getPaletteSync(\n    source: BrowserSource,\n    options?: SyncExtractionOptions,\n): Color[] | null {\n    const opts = validateOptions(options ?? {});\n    const quantizer = options?.quantizer ?? defaultQuantizer;\n\n    // BrowserPixelLoader.load is async in signature but synchronous in practice\n    // for HTMLImageElement/Canvas/ImageData/ImageBitmap. We call the internal\n    // methods directly to avoid the Promise wrapper.\n    const pixels = loadPixelsSync(source);\n\n    return extractPalette(\n        pixels.data,\n        pixels.width,\n        pixels.height,\n        opts,\n        quantizer,\n    );\n}\n\n/**\n * Synchronously get semantic swatches from a browser image source.\n *\n * ```ts\n * const swatches = getSwatchesSync(imgElement);\n * console.log(swatches.Vibrant?.color.hex());\n * ```\n */\nexport function getSwatchesSync(\n    source: BrowserSource,\n    options?: SyncExtractionOptions,\n): SwatchMap {\n    const palette = getPaletteSync(source, { colorCount: 16, ...options });\n    return classifySwatches(palette ?? []);\n}\n\n// ---------------------------------------------------------------------------\n// Internal sync pixel loading\n// ---------------------------------------------------------------------------\n\nfunction loadPixelsSync(source: BrowserSource) {\n    if (typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement) {\n        return loadFromImage(source);\n    }\n    if (typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement) {\n        return loadFromCanvas(source);\n    }\n    if (typeof ImageData !== 'undefined' && source instanceof ImageData) {\n        return { data: source.data, width: source.width, height: source.height };\n    }\n    if (typeof HTMLVideoElement !== 'undefined' && source instanceof HTMLVideoElement) {\n        return loadFromVideo(source);\n    }\n    if (typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap) {\n        return loadFromImageBitmap(source);\n    }\n    if (typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas) {\n        return loadFromOffscreenCanvas(source);\n    }\n    throw new Error(\n        'Unsupported source type. Expected HTMLImageElement, HTMLCanvasElement, HTMLVideoElement, ImageData, ImageBitmap, or OffscreenCanvas.',\n    );\n}\n\nfunction loadFromImage(img: HTMLImageElement) {\n    if (!img.complete) {\n        throw new Error(\n            'Image has not finished loading. Wait for the \"load\" event before calling getColorSync/getPaletteSync.',\n        );\n    }\n    if (!img.naturalWidth) {\n        throw new Error(\n            'Image has no dimensions. It may not have loaded successfully.',\n        );\n    }\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d')!;\n    const width = (canvas.width = img.naturalWidth);\n    const height = (canvas.height = img.naturalHeight);\n    ctx.drawImage(img, 0, 0, width, height);\n    try {\n        const imageData = ctx.getImageData(0, 0, width, height);\n        return { data: imageData.data, width, height };\n    } catch (e: unknown) {\n        if (e instanceof DOMException && e.name === 'SecurityError') {\n            const err = new Error(\n                'Image is tainted by cross-origin data. Add crossorigin=\"anonymous\" to the <img> tag and ensure the server sends appropriate CORS headers.',\n            );\n            err.cause = e;\n            throw err;\n        }\n        throw e;\n    }\n}\n\nfunction loadFromCanvas(canvas: HTMLCanvasElement) {\n    const ctx = canvas.getContext('2d')!;\n    const { width, height } = canvas;\n    const imageData = ctx.getImageData(0, 0, width, height);\n    return { data: imageData.data, width, height };\n}\n\nfunction loadFromVideo(video: HTMLVideoElement) {\n    if (video.readyState < 2) {\n        throw new Error(\n            'Video is not ready. Wait for the \"loadeddata\" or \"canplay\" event before calling getColorSync/getPaletteSync.',\n        );\n    }\n    const width = video.videoWidth;\n    const height = video.videoHeight;\n    if (!width || !height) {\n        throw new Error(\n            'Video has no dimensions. It may not have loaded successfully.',\n        );\n    }\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d')!;\n    canvas.width = width;\n    canvas.height = height;\n    ctx.drawImage(video, 0, 0, width, height);\n    const imageData = ctx.getImageData(0, 0, width, height);\n    return { data: imageData.data, width, height };\n}\n\nfunction loadFromOffscreenCanvas(canvas: OffscreenCanvas) {\n    const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n    if (!ctx) {\n        throw new Error(\n            'Could not get 2D context from OffscreenCanvas.',\n        );\n    }\n    const { width, height } = canvas;\n    const imageData = ctx.getImageData(0, 0, width, height);\n    return { data: imageData.data, width, height };\n}\n\nfunction loadFromImageBitmap(bitmap: ImageBitmap) {\n    const canvas = document.createElement('canvas');\n    const ctx = canvas.getContext('2d')!;\n    canvas.width = bitmap.width;\n    canvas.height = bitmap.height;\n    ctx.drawImage(bitmap, 0, 0);\n    const imageData = ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n    return { data: imageData.data, width: bitmap.width, height: bitmap.height };\n}\n","/**\n * Live extraction mode — observe() with reactive updates.\n *\n * Watches a source element (video, canvas, or img) and emits palette\n * updates via an onChange callback. Uses requestAnimationFrame with\n * throttle for video/canvas, and MutationObserver for img src changes.\n *\n * Browser-only — relies on DOM APIs.\n */\nimport type { Color, ColorSpace, FilterOptions } from './types.js';\nimport { getPaletteSync } from './sync.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Element types that can be observed for live palette updates. */\nexport type ObservableSource =\n    | HTMLVideoElement\n    | HTMLCanvasElement\n    | HTMLImageElement;\n\n/** Options for observe(). */\nexport interface ObserveOptions extends FilterOptions {\n    /** Minimum milliseconds between palette updates. @default 200 */\n    throttle?: number;\n    /** Number of colors in the palette (2–20). @default 5 */\n    colorCount?: number;\n    /** Sampling quality (1 = highest). @default 10 */\n    quality?: number;\n    /** Color space for quantization. @default 'oklch' */\n    colorSpace?: ColorSpace;\n    /** Called whenever a new palette is extracted. */\n    onChange: (palette: Color[]) => void;\n}\n\n/** Controller returned by observe() to stop watching. */\nexport interface ObserveController {\n    /** Stop observing and clean up all listeners/timers. */\n    stop(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Watch a source element and reactively extract palettes as it changes.\n *\n * - **HTMLVideoElement** — extracts from the current frame on each animation\n *   frame (throttled). Only runs while the video is playing.\n * - **HTMLCanvasElement** — polls on each animation frame (throttled).\n * - **HTMLImageElement** — extracts immediately, then watches for `src`/`srcset`\n *   attribute changes via MutationObserver.\n *\n * ```ts\n * const controller = observe(videoElement, {\n *     throttle: 200,\n *     colorCount: 5,\n *     onChange(palette) {\n *         updateAmbientBackground(palette);\n *     },\n * });\n *\n * // Later\n * controller.stop();\n * ```\n */\nexport function observe(\n    source: ObservableSource,\n    options: ObserveOptions,\n): ObserveController {\n    const {\n        throttle = 200,\n        onChange,\n        ...extractionOptions\n    } = options;\n\n    let stopped = false;\n    let rafId: number | null = null;\n    let mutationObserver: MutationObserver | null = null;\n    let lastExtractTime = 0;\n\n    // Cleanup handles for event listeners\n    const cleanups: Array<() => void> = [];\n\n    function extract(): void {\n        try {\n            const palette = getPaletteSync(source, extractionOptions);\n            if (palette && palette.length > 0) {\n                onChange(palette);\n            }\n        } catch {\n            // Skip this frame on error (CORS, not loaded, etc.)\n        }\n    }\n\n    function tick(): void {\n        if (stopped) return;\n\n        const now = performance.now();\n        if (now - lastExtractTime >= throttle) {\n            if (source instanceof HTMLVideoElement) {\n                // Only extract when the video has data and is playing\n                if (source.readyState >= 2 && !source.paused && !source.ended) {\n                    extract();\n                    lastExtractTime = now;\n                }\n            } else {\n                // Canvas — always extract\n                extract();\n                lastExtractTime = now;\n            }\n        }\n\n        rafId = requestAnimationFrame(tick);\n    }\n\n    // ----- HTMLImageElement: MutationObserver-based -----\n    if (source instanceof HTMLImageElement) {\n        // Extract immediately if already loaded\n        if (source.complete && source.naturalWidth) {\n            extract();\n        } else {\n            const onLoad = (): void => {\n                extract();\n                source.removeEventListener('load', onLoad);\n            };\n            source.addEventListener('load', onLoad);\n            cleanups.push(() => source.removeEventListener('load', onLoad));\n        }\n\n        // Watch for src / srcset attribute changes\n        mutationObserver = new MutationObserver(() => {\n            if (source.complete && source.naturalWidth) {\n                extract();\n            } else {\n                const onLoad = (): void => {\n                    extract();\n                    source.removeEventListener('load', onLoad);\n                };\n                source.addEventListener('load', onLoad);\n            }\n        });\n        mutationObserver.observe(source, {\n            attributes: true,\n            attributeFilter: ['src', 'srcset'],\n        });\n\n    // ----- HTMLVideoElement: rAF + play/pause awareness -----\n    } else if (source instanceof HTMLVideoElement) {\n        // Start the rAF loop — it checks readyState/paused internally\n        rafId = requestAnimationFrame(tick);\n\n        // Also extract on seeked so scrubbing works\n        const onSeeked = (): void => {\n            if (!stopped) extract();\n        };\n        source.addEventListener('seeked', onSeeked);\n        cleanups.push(() => source.removeEventListener('seeked', onSeeked));\n\n    // ----- HTMLCanvasElement: rAF polling -----\n    } else {\n        rafId = requestAnimationFrame(tick);\n    }\n\n    return {\n        stop(): void {\n            stopped = true;\n            if (rafId !== null) {\n                cancelAnimationFrame(rafId);\n                rafId = null;\n            }\n            if (mutationObserver) {\n                mutationObserver.disconnect();\n                mutationObserver = null;\n            }\n            for (const fn of cleanups) fn();\n            cleanups.length = 0;\n        },\n    };\n}\n"],"mappings":"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","names":["BrowserPixelLoader","NodePixelLoader","loader","isWorkerSupported","extractInWorker","createPixelArray"]}