@omerdlw/base-framework 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/dist/{chunk-XASQT4CQ.js → chunk-66EYJBIP.js} +47 -27
- package/dist/chunk-66EYJBIP.js.map +1 -0
- package/dist/{chunk-65ZB4QTQ.js → chunk-CYU6SGAL.js} +3 -3
- package/dist/{chunk-65ZB4QTQ.js.map → chunk-CYU6SGAL.js.map} +1 -1
- package/dist/{chunk-6SG7V77J.js → chunk-HHWRTQKQ.js} +100 -67
- package/dist/chunk-HHWRTQKQ.js.map +1 -0
- package/dist/chunk-HLL5EHXC.js +485 -0
- package/dist/chunk-HLL5EHXC.js.map +1 -0
- package/dist/{chunk-3MSK4XGK.js → chunk-JIXBFFRD.js} +258 -405
- package/dist/chunk-JIXBFFRD.js.map +1 -0
- package/dist/{chunk-KKQT46TP.js → chunk-M57SNWXK.js} +8 -6
- package/dist/chunk-M57SNWXK.js.map +1 -0
- package/dist/chunk-RIOKLMYM.js +145 -0
- package/dist/chunk-RIOKLMYM.js.map +1 -0
- package/dist/{chunk-QXR55VVS.js → chunk-TG6NMHXI.js} +241 -162
- package/dist/chunk-TG6NMHXI.js.map +1 -0
- package/dist/index.js +7 -5
- package/dist/modules/ambient/analyze.d.ts +18 -3
- package/dist/modules/ambient/analyze.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +14 -1
- package/dist/modules/ambient/dom.d.ts.map +1 -1
- package/dist/modules/ambient/hooks.d.ts.map +1 -1
- package/dist/modules/ambient/index.d.ts +2 -2
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +1 -1
- package/dist/modules/ambient/server/index.d.ts +1 -1
- package/dist/modules/ambient/server/index.d.ts.map +1 -1
- package/dist/modules/ambient/server/index.js +2 -2
- package/dist/modules/ambient/server/index.js.map +1 -1
- package/dist/modules/ambient/settings.d.ts +1 -0
- package/dist/modules/ambient/settings.d.ts.map +1 -1
- package/dist/modules/ambient/types.d.ts +13 -0
- package/dist/modules/ambient/types.d.ts.map +1 -1
- package/dist/modules/ambient/worker/index.js +1 -1
- package/dist/modules/context-menu/index.js +4 -3
- package/dist/modules/dock/cards.d.ts +3 -0
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/constants.d.ts +1 -20
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/index.js +3 -2
- package/dist/modules/dock/layout.d.ts.map +1 -1
- package/dist/modules/dock/motion.d.ts +6 -0
- package/dist/modules/dock/motion.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/routing/guards.d.ts +1 -1
- package/dist/modules/dock/routing/navigation.d.ts +7 -4
- package/dist/modules/dock/routing/navigation.d.ts.map +1 -1
- package/dist/modules/dock/runtime/display.d.ts +31 -2
- package/dist/modules/dock/runtime/display.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts +2 -2
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +9 -27
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.d.ts +3 -2
- package/dist/modules/index.d.ts.map +1 -1
- package/dist/modules/index.js +7 -5
- package/dist/modules/loading/context.d.ts.map +1 -1
- package/dist/modules/loading/index.js +1 -1
- package/dist/modules/navigation/constants.d.ts +37 -0
- package/dist/modules/navigation/constants.d.ts.map +1 -0
- package/dist/modules/navigation/context.d.ts +10 -0
- package/dist/modules/navigation/context.d.ts.map +1 -0
- package/dist/modules/navigation/hooks.d.ts +29 -0
- package/dist/modules/navigation/hooks.d.ts.map +1 -0
- package/dist/modules/navigation/index.d.ts +10 -0
- package/dist/modules/navigation/index.d.ts.map +1 -0
- package/dist/modules/navigation/index.js +81 -0
- package/dist/modules/navigation/index.js.map +1 -0
- package/dist/modules/navigation/listeners.d.ts +15 -0
- package/dist/modules/navigation/listeners.d.ts.map +1 -0
- package/dist/modules/navigation/module.d.ts +25 -0
- package/dist/modules/navigation/module.d.ts.map +1 -0
- package/dist/modules/navigation/navigator.d.ts +8 -0
- package/dist/modules/navigation/navigator.d.ts.map +1 -0
- package/dist/modules/navigation/settings.d.ts +10 -0
- package/dist/modules/navigation/settings.d.ts.map +1 -0
- package/dist/modules/navigation/state.d.ts +20 -0
- package/dist/modules/navigation/state.d.ts.map +1 -0
- package/dist/modules/navigation/types.d.ts +168 -0
- package/dist/modules/navigation/types.d.ts.map +1 -0
- package/dist/modules/navigation/utils.d.ts +11 -0
- package/dist/modules/navigation/utils.d.ts.map +1 -0
- package/docs/getting-started.md +2 -0
- package/docs/modules/README.md +5 -1
- package/docs/modules/ambient.md +9 -6
- package/docs/modules/dock.md +13 -11
- package/docs/modules/loading.md +2 -2
- package/docs/modules/navigation.md +216 -0
- package/docs/proposals/navigation.md +209 -0
- package/package.json +6 -1
- package/templates/AGENTS.md +2 -0
- package/dist/chunk-3MSK4XGK.js.map +0 -1
- package/dist/chunk-6SG7V77J.js.map +0 -1
- package/dist/chunk-KKQT46TP.js.map +0 -1
- package/dist/chunk-QXR55VVS.js.map +0 -1
- package/dist/chunk-XASQT4CQ.js.map +0 -1
- package/dist/modules/dock/routing/transactions.d.ts +0 -21
- package/dist/modules/dock/routing/transactions.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/ambient/oklab.ts","../src/modules/ambient/settings.ts","../src/modules/ambient/quantize.ts","../src/modules/ambient/analyze.ts"],"names":["round","share"],"mappings":"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","file":"chunk-6SG7V77J.js","sourcesContent":["import type { OklchColor } from \"./types\";\n\n// Pure OKLab / OKLCH math shared by the client, the worker and the server.\n// Nothing here touches the DOM or React.\n\nexport type Lab = [l: number, a: number, b: number];\nexport type Rgb = [r: number, g: number, b: number];\n\nconst DEG = Math.PI / 180;\n\nconst LINEAR_LUT = new Float32Array(256);\nfor (let i = 0; i < 256; i++) {\n const v = i / 255;\n LINEAR_LUT[i] = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function smoothstep(edge0: number, edge1: number, value: number): number {\n const t = clamp((value - edge0) / (edge1 - edge0), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** 8-bit sRGB channels → OKLab. */\nexport function srgbToOklab(r: number, g: number, b: number): Lab {\n const lr = LINEAR_LUT[r & 255];\n const lg = LINEAR_LUT[g & 255];\n const lb = LINEAR_LUT[b & 255];\n\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\n/** OKLCH → linear sRGB; channels outside 0–1 mean the colour is out of gamut. */\nexport function oklchToLinearSrgb(l: number, c: number, h: number): Rgb {\n const a = c * Math.cos(h * DEG);\n const b = c * Math.sin(h * DEG);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n ];\n}\n\nexport function labToLch([l, a, b]: Lab): OklchColor {\n const c = Math.sqrt(a * a + b * b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) / DEG + 360) % 360;\n return { c, h, l };\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-5 && v <= 1 + 1e-5);\n\n/**\n * The most chroma sRGB can show at this lightness and hue (binary search on\n * the gamut boundary). Dark blues and purples have far more room than dark\n * greens or yellows, which is why one fixed chroma never looks right.\n */\nexport function maxChroma(l: number, h: number): number {\n if (l <= 0 || l >= 1) return 0;\n let low = 0;\n let high = 0.4;\n for (let step = 0; step < 18; step++) {\n const middle = (low + high) / 2;\n if (inGamut(oklchToLinearSrgb(l, middle, h))) low = middle;\n else high = middle;\n }\n return low;\n}\n\n/** Share of the available chroma a colour uses (0 grey … 1 on the gamut edge). */\nexport function relativeChroma({ c, h, l }: OklchColor): number {\n const room = maxChroma(l, h);\n return room <= 0 ? 0 : clamp(c / room, 0, 1);\n}\n\nexport function hueDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** WCAG 2 relative luminance of an OKLCH colour (gamut-clipped). */\nexport function luminance({ c, h, l }: OklchColor): number {\n const [r, g, b] = oklchToLinearSrgb(l, c, h).map((v) => clamp(v, 0, 1));\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\nexport function contrastRatio(a: OklchColor, b: OklchColor): number {\n const la = luminance(a);\n const lb = luminance(b);\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\nconst round = (value: number, digits: number) => {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n};\n\nexport function formatOklch({ c, h, l }: OklchColor): string {\n const chroma = c < 0.0005 ? 0 : c;\n return `oklch(${round(clamp(l, 0, 1), 3).toFixed(3)} ${round(chroma, 3).toFixed(3)} ${round(chroma === 0 ? 0 : h, 1).toFixed(1)})`;\n}\n\n/**\n * A tone of a hue at lightness `l`, using `rel` of the chroma sRGB allows\n * there (never more than `cap`). This keeps a hue's character across a whole\n * ramp: dark tones of blue stay blue instead of collapsing to grey.\n */\nexport function toneOf(\n h: number,\n l: number,\n rel: number,\n cap = 0.3,\n): OklchColor {\n const room = maxChroma(l, h) * 0.96;\n return { c: Math.min(cap, clamp(rel, 0, 1) * room), h, l };\n}\n\n/**\n * Text colour for a background: a near-white or near-black carrying a hint of\n * the background's hue, pushed toward pure white / black until it reaches\n * `minContrast` (WCAG 2 ratio).\n */\nexport function onColorFor(\n background: OklchColor,\n minContrast = 4.5,\n): OklchColor {\n const light = (l: number) => toneOf(background.h, l, 0.12, 0.012);\n const dark = (l: number) => toneOf(background.h, l, 0.35, 0.03);\n const towardLight = contrastRatio(light(0.985), background);\n const towardDark = contrastRatio(dark(0.18), background);\n const useLight = towardLight >= minContrast || towardLight >= towardDark;\n\n for (let step = 0; step <= 12; step++) {\n const candidate = useLight\n ? light(Math.min(1, 0.985 + step * 0.0025))\n : dark(Math.max(0, 0.18 - step * 0.015));\n if (contrastRatio(candidate, background) >= minContrast) return candidate;\n }\n return useLight ? { c: 0, h: 0, l: 1 } : { c: 0, h: 0, l: 0 };\n}\n","import type {\n AmbientAnalysisOptions,\n AmbientCssVarNames,\n AmbientProxy,\n AmbientSettings,\n AmbientSettingsInput,\n AmbientTone,\n} from \"./types\";\n\nexport const AMBIENT_TONES = Object.freeze([\n 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 95,\n] as const) satisfies readonly AmbientTone[];\n\nexport const AMBIENT_ROLES = Object.freeze([\n \"dominant\",\n \"vibrant\",\n \"muted\",\n \"accent\",\n] as const);\n\nexport const AMBIENT_REGIONS = Object.freeze([\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"center\",\n] as const);\n\nexport const DEFAULT_ANALYSIS: Readonly<AmbientAnalysisOptions> = Object.freeze({\n centerWeight: 0.5,\n clusters: 7,\n letterbox: true,\n minContrast: 4.5,\n minHueDistance: 40,\n sampleSize: 128,\n shadowLightness: 0.16,\n});\n\nexport const DEFAULT_CSS_VAR_NAMES: Readonly<AmbientCssVarNames> = Object.freeze({\n on: \"--ambient-on-{role}\",\n region: \"--ambient-{region}\",\n role: \"--ambient-{role}\",\n shadow: \"--ambient-shadow\",\n tone: \"--ambient-{role}-{tone}\",\n});\n\nexport const DEFAULT_PROXY = \"/api/ambient/proxy?url=\";\n\nconst createDefaults = (): AmbientSettings => ({\n analysis: { ...DEFAULT_ANALYSIS },\n cacheLimit: 100,\n cssVars: { ...DEFAULT_CSS_VAR_NAMES, tones: AMBIENT_TONES },\n proxy: DEFAULT_PROXY,\n strategy: \"auto\",\n worker: null,\n});\n\n// Kept on globalThis so every bundled copy of this module (one per package\n// entry) shares one configuration.\nconst SETTINGS_KEY = Symbol.for(\"@omerdlw/base-framework/ambient/settings\");\ntype GlobalWithSettings = typeof globalThis & {\n [SETTINGS_KEY]?: AmbientSettings;\n};\nconst scope = globalThis as GlobalWithSettings;\n\nexport function getAmbientSettings(): AmbientSettings {\n return (scope[SETTINGS_KEY] ??= createDefaults());\n}\n\nexport function mergeAmbientSettings(\n base: AmbientSettings,\n input: AmbientSettingsInput,\n): AmbientSettings {\n return {\n analysis: { ...base.analysis, ...input.analysis },\n cacheLimit: input.cacheLimit ?? base.cacheLimit,\n cssVars: { ...base.cssVars, ...input.cssVars },\n proxy: input.proxy === undefined ? base.proxy : input.proxy,\n strategy: input.strategy ?? base.strategy,\n worker: input.worker === undefined ? base.worker : input.worker,\n };\n}\n\n/**\n * Sets the proxy, CSS variable names, extraction strategy, worker and analysis\n * defaults for every ambient theme. Returns a function that restores the\n * previous settings.\n */\nexport function configureAmbient(input: AmbientSettingsInput): () => void {\n const previous = getAmbientSettings();\n const next = mergeAmbientSettings(previous, input);\n scope[SETTINGS_KEY] = next;\n return () => {\n if (scope[SETTINGS_KEY] === next) scope[SETTINGS_KEY] = previous;\n };\n}\n\nexport function resolveAnalysis(\n overrides?: Partial<AmbientAnalysisOptions> | null,\n): AmbientAnalysisOptions {\n return { ...getAmbientSettings().analysis, ...overrides };\n}\n\n/** The URL to retry through, or `null` when no proxy applies. */\nexport function resolveProxyUrl(proxy: AmbientProxy, src: string): string | null {\n if (!proxy || !/^https?:\\/\\//i.test(src)) return null;\n if (typeof proxy === \"function\") return proxy(src);\n const encoded = encodeURIComponent(src);\n return proxy.includes(\"{url}\")\n ? proxy.replace(\"{url}\", encoded)\n : `${proxy}${encoded}`;\n}\n","export interface KMeansResult {\n /** Index of the cluster each point belongs to. */\n assignment: Int32Array;\n /** `k × 3` OKLab centroids. */\n centroids: Float64Array;\n /** Number of clusters actually found (≤ the requested k). */\n k: number;\n}\n\nexport interface KMeansOptions {\n iterations?: number;\n /** Weight of ΔL² against Δa² + Δb²; below 1 favours hue over lightness. */\n lightnessWeight?: number;\n}\n\n/**\n * Weighted k-means in OKLab with deterministic seeding (the heaviest point,\n * then repeatedly the point that is heaviest × furthest from every seed), so\n * the same pixels always give the same palette on the server and the client.\n *\n * `points` holds `n × 3` OKLab values and `weights` one weight per point.\n */\nexport function kmeans(\n points: Float64Array,\n weights: Float64Array,\n requested: number,\n { iterations = 16, lightnessWeight = 0.45 }: KMeansOptions = {},\n): KMeansResult {\n const n = weights.length;\n const assignment = new Int32Array(n);\n const k = Math.max(0, Math.min(requested, n));\n const centroids = new Float64Array(k * 3);\n if (k === 0) return { assignment, centroids, k };\n\n const distance = (i: number, j: number) => {\n const dl = points[i * 3] - centroids[j * 3];\n const da = points[i * 3 + 1] - centroids[j * 3 + 1];\n const db = points[i * 3 + 2] - centroids[j * 3 + 2];\n return lightnessWeight * dl * dl + da * da + db * db;\n };\n\n let first = 0;\n for (let i = 1; i < n; i++) if (weights[i] > weights[first]) first = i;\n centroids.set(points.subarray(first * 3, first * 3 + 3), 0);\n\n const nearest = new Float64Array(n).fill(Infinity);\n let found = 1;\n for (; found < k; found++) {\n let best = -1;\n let bestScore = 0;\n for (let i = 0; i < n; i++) {\n const d = distance(i, found - 1);\n if (d < nearest[i]) nearest[i] = d;\n const score = weights[i] * nearest[i];\n if (score > bestScore) {\n bestScore = score;\n best = i;\n }\n }\n if (best < 0) break; // every remaining point sits on a seed\n centroids.set(points.subarray(best * 3, best * 3 + 3), found * 3);\n }\n\n const sums = new Float64Array(found * 4);\n for (let round = 0; round < iterations; round++) {\n let moved = round === 0;\n for (let i = 0; i < n; i++) {\n let best = 0;\n let bestDistance = Infinity;\n for (let j = 0; j < found; j++) {\n const d = distance(i, j);\n if (d < bestDistance) {\n bestDistance = d;\n best = j;\n }\n }\n if (assignment[i] !== best) {\n assignment[i] = best;\n moved = true;\n }\n }\n if (!moved) break;\n\n sums.fill(0);\n for (let i = 0; i < n; i++) {\n const j = assignment[i] * 4;\n const w = weights[i];\n sums[j] += points[i * 3] * w;\n sums[j + 1] += points[i * 3 + 1] * w;\n sums[j + 2] += points[i * 3 + 2] * w;\n sums[j + 3] += w;\n }\n for (let j = 0; j < found; j++) {\n const w = sums[j * 4 + 3];\n if (w <= 0) continue; // an empty cluster keeps its seed\n centroids[j * 3] = sums[j * 4] / w;\n centroids[j * 3 + 1] = sums[j * 4 + 1] / w;\n centroids[j * 3 + 2] = sums[j * 4 + 2] / w;\n }\n }\n\n return { assignment, centroids: centroids.slice(0, found * 3), k: found };\n}\n","import {\n clamp,\n formatOklch,\n hueDistance,\n labToLch,\n maxChroma,\n onColorFor,\n smoothstep,\n srgbToOklab,\n toneOf,\n} from \"./oklab\";\nimport { kmeans } from \"./quantize\";\nimport { AMBIENT_REGIONS, AMBIENT_TONES, DEFAULT_ANALYSIS } from \"./settings\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n AmbientRamp,\n AmbientRegion,\n AmbientRegionColor,\n AmbientRole,\n AmbientSwatch,\n OklchColor,\n} from \"./types\";\n\n// Below this chroma a colour reads as grey; its hue is noise.\nconst MIN_CHROMA = 0.022;\n// Below this share of coloured pixels an image is treated as neutral.\nconst MIN_PRESENCE = 0.03;\n// A colour this small still counts as a role when it is vivid enough.\nconst MIN_POPULATION = 0.004;\n\nconst REGION_BITS: Record<AmbientRegion, number> = {\n top: 1,\n bottom: 2,\n left: 4,\n right: 8,\n center: 16,\n};\n\nexport interface Cluster extends OklchColor {\n /** Share of the (centre-weighted) image. */\n pop: number;\n /** Share of the chroma sRGB allows at this lightness and hue. */\n rel: number;\n /** How far the hue can be trusted at this lightness (0–1). */\n rely: number;\n}\n\ninterface Bounds {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\nconst lightnessAt = (data: ArrayLike<number>, index: number) =>\n srgbToOklab(data[index], data[index + 1], data[index + 2])[0];\n\n/**\n * Finds black bars along the edges (letterbox / pillarbox): rows or columns\n * that are uniformly near-black. At most 22% of each side is cut.\n */\nexport function findContentBounds({ data, height, width }: AmbientPixels): Bounds {\n const isBar = (count: number, at: (step: number) => number) => {\n let sum = 0;\n let max = 0;\n let seen = 0;\n for (let step = 0; step < count; step++) {\n const index = at(step);\n if (data[index + 3] < 128) continue;\n const l = lightnessAt(data, index);\n sum += l;\n if (l > max) max = l;\n seen++;\n }\n return seen > 0 && sum / seen < 0.12 && max < 0.2;\n };\n const row = (y: number) => isBar(width, (x) => (y * width + x) * 4);\n const maxRows = Math.floor(height * 0.22);\n const maxColumns = Math.floor(width * 0.22);\n\n let top = 0;\n while (top < maxRows && row(top)) top++;\n let bottom = height;\n while (height - bottom < maxRows && bottom - 1 > top && row(bottom - 1)) bottom--;\n\n const column = (x: number) =>\n isBar(bottom - top, (step) => ((top + step) * width + x) * 4);\n let left = 0;\n while (left < maxColumns && column(left)) left++;\n let right = width;\n while (width - right < maxColumns && right - 1 > left && column(right - 1)) right--;\n\n return { bottom, left, right, top };\n}\n\nconst reliability = (l: number) =>\n smoothstep(0.1, 0.28, l) * (1 - smoothstep(0.9, 0.98, l));\n\nconst colorfulness = (c: number) => smoothstep(MIN_CHROMA, 0.06, c);\n\nconst isChromatic = (cluster: Cluster) =>\n cluster.c >= MIN_CHROMA && cluster.rely > 0;\n\nfunction pickBest<T>(items: T[], score: (item: T) => number): T | null {\n let best: T | null = null;\n let bestScore = 0;\n for (const item of items) {\n const value = score(item);\n if (value > bestScore) {\n bestScore = value;\n best = item;\n }\n }\n return best;\n}\n\nconst round3 = (value: number) => Math.round(value * 1000) / 1000;\n\ninterface ToneSpec {\n cap: number;\n max: number;\n min: number;\n rel: number;\n}\n\nfunction buildSwatch(\n source: Cluster | null,\n { cap, max, min, rel }: ToneSpec,\n fallback: { h: number; l: number },\n fromImage: boolean,\n minContrast: number,\n): AmbientSwatch {\n const h = source?.h ?? fallback.h;\n const l = clamp(source?.l ?? fallback.l, min, max);\n const tone = toneOf(h, l, rel, cap);\n const ramp = {} as AmbientRamp;\n for (const step of AMBIENT_TONES) {\n ramp[step] = formatOklch(toneOf(h, step / 100, rel, cap));\n }\n return {\n c: round3(tone.c),\n color: formatOklch(tone),\n fromImage,\n h: Math.round(h * 10) / 10,\n l: round3(tone.l),\n on: formatOklch(onColorFor(tone, minContrast)),\n population: round3(source?.pop ?? 0),\n ramp,\n };\n}\n\n// How much of the gamut each role uses, from the source colour's own share.\nconst lift = (rel: number, base: number, gain: number, ceiling: number) =>\n clamp(base + gain * rel, 0, ceiling);\n\nexport interface AmbientClustering {\n clusters: Cluster[];\n /** Centre-weighted mean lightness. */\n meanL: number;\n /** Per region, the pixel count of each cluster. */\n regionWeights: Float64Array[];\n}\n\n/**\n * Step one of the analysis: the image's colours as OKLab k-means clusters,\n * with each cluster's share of the frame and of each region.\n */\nexport function clusterAmbientPixels(\n pixels: AmbientPixels,\n options: AmbientAnalysisOptions,\n): AmbientClustering {\n const { data, width, height } = pixels;\n const bounds = options.letterbox\n ? findContentBounds(pixels)\n : { bottom: height, left: 0, right: width, top: 0 };\n const boxWidth = Math.max(1, bounds.right - bounds.left);\n const boxHeight = Math.max(1, bounds.bottom - bounds.top);\n\n // 1. Bin pixels by 15-bit RGB, averaging their OKLab values per bin.\n const binOf = new Int32Array(32768).fill(-1);\n const binSums: number[] = [];\n const pixelBins = new Int32Array(boxWidth * boxHeight).fill(-1);\n const pixelRegions = new Uint8Array(boxWidth * boxHeight);\n const sigma2 = 2 * 0.35 * 0.35;\n let total = 0;\n let sumL = 0;\n\n for (let y = bounds.top; y < bounds.bottom; y++) {\n const v = (y - bounds.top + 0.5) / boxHeight;\n for (let x = bounds.left; x < bounds.right; x++) {\n const index = (y * width + x) * 4;\n if (data[index + 3] < 128) continue;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const [l, a, bb] = srgbToOklab(r, g, b);\n const u = (x - bounds.left + 0.5) / boxWidth;\n const du = (u - 0.5) * 2;\n const dv = (v - 0.5) * 2;\n const weight =\n 1 -\n options.centerWeight +\n 2 * options.centerWeight * Math.exp(-(du * du + dv * dv) / sigma2);\n\n const key = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);\n let bin = binOf[key];\n if (bin < 0) {\n bin = binSums.length / 4;\n binOf[key] = bin;\n binSums.push(0, 0, 0, 0);\n }\n binSums[bin * 4] += l * weight;\n binSums[bin * 4 + 1] += a * weight;\n binSums[bin * 4 + 2] += bb * weight;\n binSums[bin * 4 + 3] += weight;\n total += weight;\n sumL += l * weight;\n\n const local = (y - bounds.top) * boxWidth + (x - bounds.left);\n pixelBins[local] = bin;\n pixelRegions[local] =\n (v < 1 / 3 ? REGION_BITS.top : 0) |\n (v > 2 / 3 ? REGION_BITS.bottom : 0) |\n (u < 1 / 3 ? REGION_BITS.left : 0) |\n (u > 2 / 3 ? REGION_BITS.right : 0) |\n (Math.abs(u - 0.5) < 0.25 && Math.abs(v - 0.5) < 0.25\n ? REGION_BITS.center\n : 0);\n }\n }\n\n const meanL = total > 0 ? sumL / total : 0.5;\n const bins = binSums.length / 4;\n\n // 2. Cluster coloured and grey bins apart, so the greys of a mostly dark\n // poster cannot use up every cluster and swallow its one red coat.\n const groups: [number[], number[]] = [[], []];\n for (let i = 0; i < bins; i++) {\n const w = binSums[i * 4 + 3];\n const a = binSums[i * 4 + 1] / w;\n const b = binSums[i * 4 + 2] / w;\n const coloured =\n Math.sqrt(a * a + b * b) >= MIN_CHROMA && binSums[i * 4] / w >= 0.06;\n groups[coloured ? 0 : 1].push(i);\n }\n const requested = clamp(Math.round(options.clusters), 2, 16);\n const greyClusters =\n groups[0].length === 0 ? requested : groups[1].length === 0 ? 0 : requested >= 8 ? 3 : 2;\n const budgets = [requested - greyClusters, greyClusters];\n\n const clusters: Cluster[] = [];\n const clusterOfBin = new Int32Array(bins).fill(-1);\n groups.forEach((members, group) => {\n if (members.length === 0 || budgets[group] <= 0) return;\n const points = new Float64Array(members.length * 3);\n const weights = new Float64Array(members.length);\n members.forEach((bin, i) => {\n const w = binSums[bin * 4 + 3];\n const a = binSums[bin * 4 + 1] / w;\n const b = binSums[bin * 4 + 2] / w;\n points[i * 3] = binSums[bin * 4] / w;\n points[i * 3 + 1] = a;\n points[i * 3 + 2] = b;\n // Vivid colours pull harder, so a small saturated area keeps its own cluster.\n weights[i] = w * (1 + 5 * Math.sqrt(a * a + b * b));\n });\n const { assignment, centroids, k } = kmeans(points, weights, budgets[group]);\n const pop = new Float64Array(k);\n members.forEach((bin, i) => (pop[assignment[i]] += binSums[bin * 4 + 3]));\n const index = new Int32Array(k).fill(-1);\n for (let j = 0; j < k; j++) {\n if (pop[j] <= 0) continue;\n const lch = labToLch([centroids[j * 3], centroids[j * 3 + 1], centroids[j * 3 + 2]]);\n const room = maxChroma(lch.l, lch.h);\n index[j] = clusters.length;\n clusters.push({\n ...lch,\n pop: pop[j] / total,\n rel: room > 0 ? clamp(lch.c / room, 0, 1) : 0,\n rely: reliability(lch.l),\n });\n }\n members.forEach((bin, i) => (clusterOfBin[bin] = index[assignment[i]]));\n });\n\n // 3. Region shares per cluster.\n const regionWeights = AMBIENT_REGIONS.map(() => new Float64Array(clusters.length));\n for (let i = 0; i < pixelBins.length; i++) {\n const bin = pixelBins[i];\n if (bin < 0) continue;\n const cluster = clusterOfBin[bin];\n const bits = pixelRegions[i];\n AMBIENT_REGIONS.forEach((region, r) => {\n if (bits & REGION_BITS[region]) regionWeights[r][cluster] += 1;\n });\n }\n\n return { clusters, meanL, regionWeights };\n}\n\n/**\n * The palette of an image: OKLab k-means clusters scored by population ×\n * chroma, turned into four roles (each with a gamut-aware tonal ramp and a\n * contrast-safe text colour), five region colours, and the deep `shadow`\n * tone.\n */\nexport function analyzeAmbientPixels(\n pixels: AmbientPixels,\n overrides: Partial<AmbientAnalysisOptions> = {},\n): AmbientPalette {\n const options = { ...DEFAULT_ANALYSIS, ...overrides };\n const { clusters, meanL, regionWeights } = clusterAmbientPixels(pixels, options);\n\n // 4. Roles.\n const chromatic = clusters.filter(isChromatic);\n const presence = chromatic.reduce(\n (sum, cluster) => sum + cluster.pop * colorfulness(cluster.c) * cluster.rely,\n 0,\n );\n const neutral = presence < MIN_PRESENCE;\n // A coloured detail on an almost grey image is kept, but quieter.\n const dilution = 0.55 + 0.45 * Math.min(1, presence / 0.25);\n const { minContrast, minHueDistance } = options;\n const grey = { h: 0, l: clamp(meanL, 0.3, 0.8) };\n\n // k-means splits one hue into several lightness levels; a hue's share is\n // that of its whole family (clusters within 20°), so it is not undercounted.\n const family = new Map<Cluster, number>();\n for (const cluster of chromatic) {\n let share = 0;\n for (const other of chromatic) {\n if (hueDistance(cluster.h, other.h) <= 20) share += other.pop;\n }\n family.set(cluster, share);\n }\n const share = (cluster: Cluster) => family.get(cluster) ?? cluster.pop;\n const withShare = (cluster: Cluster | null) =>\n cluster ? { ...cluster, pop: share(cluster) } : null;\n\n const dominantPick = neutral\n ? null\n : pickBest(chromatic, (cluster) => share(cluster) * cluster.c * cluster.rely);\n // A grey image keeps a grey `vibrant`: no hue is invented.\n const vividPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => share(cluster) >= MIN_POPULATION),\n (cluster) =>\n cluster.c * cluster.c * Math.pow(share(cluster), 0.3) * cluster.rely,\n );\n // …but a coloured detail on it (the red coat) becomes the accent.\n const accentPick = pickBest(\n chromatic.filter((cluster) =>\n neutral\n ? share(cluster) >= 0.006 && cluster.c >= 0.06\n : share(cluster) >= MIN_POPULATION &&\n cluster.c >= 0.035 &&\n (!dominantPick || hueDistance(cluster.h, dominantPick.h) >= minHueDistance),\n ),\n (cluster) => Math.pow(share(cluster), 0.6) * cluster.c * cluster.rely,\n );\n const mutedPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => cluster.c <= 0.09),\n (cluster) => share(cluster) * cluster.rely * (1 - cluster.c / 0.12),\n );\n\n const dominantHue = dominantPick?.h ?? vividPick?.h ?? 0;\n const roles: Record<AmbientRole, AmbientSwatch> = {\n dominant: buildSwatch(\n withShare(dominantPick),\n {\n cap: 0.22,\n max: 0.74,\n min: 0.42,\n rel: dominantPick ? lift(dominantPick.rel, 0.25, 0.85, 0.9) : 0,\n },\n grey,\n true,\n minContrast,\n ),\n vibrant: buildSwatch(\n withShare(vividPick),\n {\n cap: 0.24,\n max: 0.84,\n min: 0.62,\n rel: vividPick ? lift(vividPick.rel, 0.4, 0.75, 0.95) * dilution : 0,\n },\n { h: dominantHue, l: 0.78 },\n true,\n minContrast,\n ),\n muted: buildSwatch(\n withShare(mutedPick),\n {\n cap: 0.08,\n max: 0.66,\n min: 0.38,\n rel: mutedPick\n ? clamp(mutedPick.rel, 0.1, 0.3)\n : dominantPick\n ? 0.2\n : 0,\n },\n { h: dominantHue, l: clamp(meanL, 0.38, 0.66) },\n Boolean(mutedPick) || neutral,\n minContrast,\n ),\n accent: buildSwatch(\n withShare(accentPick ?? vividPick),\n {\n cap: 0.24,\n max: 0.8,\n min: 0.55,\n rel: (accentPick ?? vividPick)\n ? lift((accentPick ?? vividPick)!.rel, 0.35, 0.75, 0.92) * dilution\n : 0,\n },\n { h: dominantHue, l: 0.72 },\n Boolean(accentPick),\n minContrast,\n ),\n };\n\n // 5. `shadow`: the shadows' own hue when they have one, else the dominant's.\n // In the dark, relative chroma says more than chroma: a navy at L 0.14\n // uses most of what sRGB has there.\n const shadowPick = neutral\n ? null\n : pickBest(\n clusters.filter(\n (cluster) => cluster.l <= 0.5 && cluster.c >= 0.02 && cluster.pop >= 0.02,\n ),\n (cluster) => cluster.pop * cluster.rel * smoothstep(0.05, 0.14, cluster.l),\n );\n const deepSource = shadowPick ?? dominantPick;\n const shadowL = clamp(\n options.shadowLightness + (meanL - 0.45) * 0.06,\n options.shadowLightness - 0.02,\n options.shadowLightness + 0.02,\n );\n const shadow = deepSource\n ? toneOf(deepSource.h, shadowL, lift(deepSource.rel, 0.3, 0.7, 0.85), 0.1)\n : { c: 0, h: 0, l: shadowL };\n\n // 6. Regions: the most telling cluster in each part of the frame.\n const regions = {} as Record<AmbientRegion, AmbientRegionColor>;\n AMBIENT_REGIONS.forEach((region, r) => {\n const weights = regionWeights[r];\n let regionTotal = 0;\n let regionL = 0;\n clusters.forEach((cluster, j) => {\n regionTotal += weights[j];\n regionL += cluster.l * weights[j];\n });\n const share = (j: number) => (regionTotal > 0 ? weights[j] / regionTotal : 0);\n let strength = 0;\n let pick: Cluster | null = null;\n let pickScore = 0;\n clusters.forEach((cluster, j) => {\n if (!isChromatic(cluster)) return;\n strength += share(j) * colorfulness(cluster.c) * cluster.rely;\n const score = share(j) * cluster.c * cluster.rely;\n if (score > pickScore) {\n pickScore = score;\n pick = cluster;\n }\n });\n const chosen = neutral || strength < MIN_PRESENCE ? null : (pick as Cluster | null);\n const tone = chosen\n ? toneOf(\n chosen.h,\n clamp(chosen.l, 0.42, 0.72),\n lift(chosen.rel, 0.25, 0.85, 0.9),\n 0.22,\n )\n : {\n c: 0,\n h: 0,\n l: clamp(regionTotal > 0 ? regionL / regionTotal : meanL, 0.3, 0.7),\n };\n regions[region] = {\n c: round3(tone.c),\n color: formatOklch(tone),\n h: Math.round(tone.h * 10) / 10,\n l: round3(tone.l),\n strength: round3(chosen ? clamp(strength, 0, 1) : 0),\n };\n });\n\n return {\n neutral,\n regions,\n roles,\n shadow: formatOklch(shadow),\n };\n}\n\n/** Width and height that fit `width × height` inside `size` on the long side. */\nexport function fitSample(width: number, height: number, size: number) {\n const scale = Math.min(1, size / Math.max(width, height, 1));\n return {\n height: Math.max(1, Math.round(height * scale)),\n width: Math.max(1, Math.round(width * scale)),\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAsBO,IAAM,cAAA,GAAiB,OAAO,MAAA,CAAO;AAAA,EAC1C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAU","file":"chunk-KKQT46TP.js","sourcesContent":["import { ambientModule } from \"./ambient/module\";\nimport { backgroundModule } from \"./background/module\";\nimport { contextMenuModule } from \"./context-menu/module\";\nimport { controlsModule } from \"./controls/module\";\nimport { dockModule } from \"./dock/module\";\nimport { loadingModule } from \"./loading/module\";\nimport { mediaModule } from \"./media/module\";\nimport { modalModule } from \"./modal/module\";\nimport { notificationModule } from \"./notification/module\";\n\nexport {\n ambientModule,\n backgroundModule,\n contextMenuModule,\n controlsModule,\n dockModule,\n loadingModule,\n mediaModule,\n modalModule,\n notificationModule,\n};\n\nexport const defaultModules = Object.freeze([\n backgroundModule,\n ambientModule,\n dockModule,\n controlsModule,\n contextMenuModule,\n loadingModule,\n mediaModule,\n modalModule,\n notificationModule,\n] as const);\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/ambient/context.tsx","../src/modules/ambient/constants.ts","../src/modules/ambient/oklab.ts","../src/modules/ambient/settings.ts","../src/modules/ambient/quantize.ts","../src/modules/ambient/analyze.ts","../src/modules/ambient/pipeline.ts","../src/modules/ambient/worker/index.ts","../src/modules/ambient/extractor.ts","../src/modules/ambient/dom.ts","../src/modules/ambient/hooks.ts","../src/modules/ambient/module.tsx"],"names":["round","share","isCrossOrigin","useState","palette","scope","useMemo"],"mappings":"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","file":"chunk-QXR55VVS.js","sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { createStore } from \"@/utils\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport type {\n AmbientProviderProps,\n AmbientProviderValue,\n AmbientState,\n} from \"./types\";\n\nexport const AmbientContext =\n getOrCreateGlobalContext<AmbientProviderValue | null>(\"AmbientContext\", null);\n\nexport function AmbientProvider({\n children,\n initialPalette = null,\n}: AmbientProviderProps) {\n const [store] = useState(() =>\n createStore<AmbientState>(\n { isExtracting: false, palette: initialPalette },\n { freezeSnapshots: false },\n ),\n );\n\n const value = useMemo<AmbientProviderValue>(\n () => ({\n actions: {\n setIsExtracting: (next) =>\n store.publish((state) => {\n const isExtracting =\n typeof next === \"function\" ? next(state.isExtracting) : next;\n return isExtracting === state.isExtracting\n ? state\n : { ...state, isExtracting };\n }),\n setPalette: (next) =>\n store.publish((state) => {\n const palette =\n typeof next === \"function\" ? next(state.palette) : next;\n return palette === state.palette ? state : { ...state, palette };\n }),\n },\n store,\n }),\n [store],\n );\n\n return <AmbientContext value={value}>{children}</AmbientContext>;\n}\n","import { defineThemeSpec } from \"@/theme\";\nimport type { AmbientThemeSlot } from \"./types\";\n\nexport const ambientTheme = defineThemeSpec<AmbientThemeSlot>(\"ambient\");\n","import type { OklchColor } from \"./types\";\n\n// Pure OKLab / OKLCH math shared by the client, the worker and the server.\n// Nothing here touches the DOM or React.\n\nexport type Lab = [l: number, a: number, b: number];\nexport type Rgb = [r: number, g: number, b: number];\n\nconst DEG = Math.PI / 180;\n\nconst LINEAR_LUT = new Float32Array(256);\nfor (let i = 0; i < 256; i++) {\n const v = i / 255;\n LINEAR_LUT[i] = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function smoothstep(edge0: number, edge1: number, value: number): number {\n const t = clamp((value - edge0) / (edge1 - edge0), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** 8-bit sRGB channels → OKLab. */\nexport function srgbToOklab(r: number, g: number, b: number): Lab {\n const lr = LINEAR_LUT[r & 255];\n const lg = LINEAR_LUT[g & 255];\n const lb = LINEAR_LUT[b & 255];\n\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\n/** OKLCH → linear sRGB; channels outside 0–1 mean the colour is out of gamut. */\nexport function oklchToLinearSrgb(l: number, c: number, h: number): Rgb {\n const a = c * Math.cos(h * DEG);\n const b = c * Math.sin(h * DEG);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n ];\n}\n\nexport function labToLch([l, a, b]: Lab): OklchColor {\n const c = Math.sqrt(a * a + b * b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) / DEG + 360) % 360;\n return { c, h, l };\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-5 && v <= 1 + 1e-5);\n\n/**\n * The most chroma sRGB can show at this lightness and hue (binary search on\n * the gamut boundary). Dark blues and purples have far more room than dark\n * greens or yellows, which is why one fixed chroma never looks right.\n */\nexport function maxChroma(l: number, h: number): number {\n if (l <= 0 || l >= 1) return 0;\n let low = 0;\n let high = 0.4;\n for (let step = 0; step < 18; step++) {\n const middle = (low + high) / 2;\n if (inGamut(oklchToLinearSrgb(l, middle, h))) low = middle;\n else high = middle;\n }\n return low;\n}\n\n/** Share of the available chroma a colour uses (0 grey … 1 on the gamut edge). */\nexport function relativeChroma({ c, h, l }: OklchColor): number {\n const room = maxChroma(l, h);\n return room <= 0 ? 0 : clamp(c / room, 0, 1);\n}\n\nexport function hueDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** WCAG 2 relative luminance of an OKLCH colour (gamut-clipped). */\nexport function luminance({ c, h, l }: OklchColor): number {\n const [r, g, b] = oklchToLinearSrgb(l, c, h).map((v) => clamp(v, 0, 1));\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\nexport function contrastRatio(a: OklchColor, b: OklchColor): number {\n const la = luminance(a);\n const lb = luminance(b);\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\nconst round = (value: number, digits: number) => {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n};\n\nexport function formatOklch({ c, h, l }: OklchColor): string {\n const chroma = c < 0.0005 ? 0 : c;\n return `oklch(${round(clamp(l, 0, 1), 3).toFixed(3)} ${round(chroma, 3).toFixed(3)} ${round(chroma === 0 ? 0 : h, 1).toFixed(1)})`;\n}\n\n/**\n * A tone of a hue at lightness `l`, using `rel` of the chroma sRGB allows\n * there (never more than `cap`). This keeps a hue's character across a whole\n * ramp: dark tones of blue stay blue instead of collapsing to grey.\n */\nexport function toneOf(\n h: number,\n l: number,\n rel: number,\n cap = 0.3,\n): OklchColor {\n const room = maxChroma(l, h) * 0.96;\n return { c: Math.min(cap, clamp(rel, 0, 1) * room), h, l };\n}\n\n/**\n * Text colour for a background: a near-white or near-black carrying a hint of\n * the background's hue, pushed toward pure white / black until it reaches\n * `minContrast` (WCAG 2 ratio).\n */\nexport function onColorFor(\n background: OklchColor,\n minContrast = 4.5,\n): OklchColor {\n const light = (l: number) => toneOf(background.h, l, 0.12, 0.012);\n const dark = (l: number) => toneOf(background.h, l, 0.35, 0.03);\n const towardLight = contrastRatio(light(0.985), background);\n const towardDark = contrastRatio(dark(0.18), background);\n const useLight = towardLight >= minContrast || towardLight >= towardDark;\n\n for (let step = 0; step <= 12; step++) {\n const candidate = useLight\n ? light(Math.min(1, 0.985 + step * 0.0025))\n : dark(Math.max(0, 0.18 - step * 0.015));\n if (contrastRatio(candidate, background) >= minContrast) return candidate;\n }\n return useLight ? { c: 0, h: 0, l: 1 } : { c: 0, h: 0, l: 0 };\n}\n","import type {\n AmbientAnalysisOptions,\n AmbientCssVarNames,\n AmbientProxy,\n AmbientSettings,\n AmbientSettingsInput,\n AmbientTone,\n} from \"./types\";\n\nexport const AMBIENT_TONES = Object.freeze([\n 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 95,\n] as const) satisfies readonly AmbientTone[];\n\nexport const AMBIENT_ROLES = Object.freeze([\n \"dominant\",\n \"vibrant\",\n \"muted\",\n \"accent\",\n] as const);\n\nexport const AMBIENT_REGIONS = Object.freeze([\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"center\",\n] as const);\n\nexport const DEFAULT_ANALYSIS: Readonly<AmbientAnalysisOptions> = Object.freeze({\n centerWeight: 0.5,\n clusters: 7,\n letterbox: true,\n minContrast: 4.5,\n minHueDistance: 40,\n sampleSize: 128,\n shadowLightness: 0.16,\n});\n\nexport const DEFAULT_CSS_VAR_NAMES: Readonly<AmbientCssVarNames> = Object.freeze({\n on: \"--ambient-on-{role}\",\n region: \"--ambient-{region}\",\n role: \"--ambient-{role}\",\n shadow: \"--ambient-shadow\",\n tone: \"--ambient-{role}-{tone}\",\n});\n\nexport const DEFAULT_PROXY = \"/api/ambient/proxy?url=\";\n\nconst createDefaults = (): AmbientSettings => ({\n analysis: { ...DEFAULT_ANALYSIS },\n cacheLimit: 100,\n cssVars: { ...DEFAULT_CSS_VAR_NAMES, tones: AMBIENT_TONES },\n proxy: DEFAULT_PROXY,\n strategy: \"auto\",\n worker: null,\n});\n\n// Kept on globalThis so every bundled copy of this module (one per package\n// entry) shares one configuration.\nconst SETTINGS_KEY = Symbol.for(\"@omerdlw/base-framework/ambient/settings\");\ntype GlobalWithSettings = typeof globalThis & {\n [SETTINGS_KEY]?: AmbientSettings;\n};\nconst scope = globalThis as GlobalWithSettings;\n\nexport function getAmbientSettings(): AmbientSettings {\n return (scope[SETTINGS_KEY] ??= createDefaults());\n}\n\nexport function mergeAmbientSettings(\n base: AmbientSettings,\n input: AmbientSettingsInput,\n): AmbientSettings {\n return {\n analysis: { ...base.analysis, ...input.analysis },\n cacheLimit: input.cacheLimit ?? base.cacheLimit,\n cssVars: { ...base.cssVars, ...input.cssVars },\n proxy: input.proxy === undefined ? base.proxy : input.proxy,\n strategy: input.strategy ?? base.strategy,\n worker: input.worker === undefined ? base.worker : input.worker,\n };\n}\n\n/**\n * Sets the proxy, CSS variable names, extraction strategy, worker and analysis\n * defaults for every ambient theme. Returns a function that restores the\n * previous settings.\n */\nexport function configureAmbient(input: AmbientSettingsInput): () => void {\n const previous = getAmbientSettings();\n const next = mergeAmbientSettings(previous, input);\n scope[SETTINGS_KEY] = next;\n return () => {\n if (scope[SETTINGS_KEY] === next) scope[SETTINGS_KEY] = previous;\n };\n}\n\nexport function resolveAnalysis(\n overrides?: Partial<AmbientAnalysisOptions> | null,\n): AmbientAnalysisOptions {\n return { ...getAmbientSettings().analysis, ...overrides };\n}\n\n/** The URL to retry through, or `null` when no proxy applies. */\nexport function resolveProxyUrl(proxy: AmbientProxy, src: string): string | null {\n if (!proxy || !/^https?:\\/\\//i.test(src)) return null;\n if (typeof proxy === \"function\") return proxy(src);\n const encoded = encodeURIComponent(src);\n return proxy.includes(\"{url}\")\n ? proxy.replace(\"{url}\", encoded)\n : `${proxy}${encoded}`;\n}\n","export interface KMeansResult {\n /** Index of the cluster each point belongs to. */\n assignment: Int32Array;\n /** `k × 3` OKLab centroids. */\n centroids: Float64Array;\n /** Number of clusters actually found (≤ the requested k). */\n k: number;\n}\n\nexport interface KMeansOptions {\n iterations?: number;\n /** Weight of ΔL² against Δa² + Δb²; below 1 favours hue over lightness. */\n lightnessWeight?: number;\n}\n\n/**\n * Weighted k-means in OKLab with deterministic seeding (the heaviest point,\n * then repeatedly the point that is heaviest × furthest from every seed), so\n * the same pixels always give the same palette on the server and the client.\n *\n * `points` holds `n × 3` OKLab values and `weights` one weight per point.\n */\nexport function kmeans(\n points: Float64Array,\n weights: Float64Array,\n requested: number,\n { iterations = 16, lightnessWeight = 0.45 }: KMeansOptions = {},\n): KMeansResult {\n const n = weights.length;\n const assignment = new Int32Array(n);\n const k = Math.max(0, Math.min(requested, n));\n const centroids = new Float64Array(k * 3);\n if (k === 0) return { assignment, centroids, k };\n\n const distance = (i: number, j: number) => {\n const dl = points[i * 3] - centroids[j * 3];\n const da = points[i * 3 + 1] - centroids[j * 3 + 1];\n const db = points[i * 3 + 2] - centroids[j * 3 + 2];\n return lightnessWeight * dl * dl + da * da + db * db;\n };\n\n let first = 0;\n for (let i = 1; i < n; i++) if (weights[i] > weights[first]) first = i;\n centroids.set(points.subarray(first * 3, first * 3 + 3), 0);\n\n const nearest = new Float64Array(n).fill(Infinity);\n let found = 1;\n for (; found < k; found++) {\n let best = -1;\n let bestScore = 0;\n for (let i = 0; i < n; i++) {\n const d = distance(i, found - 1);\n if (d < nearest[i]) nearest[i] = d;\n const score = weights[i] * nearest[i];\n if (score > bestScore) {\n bestScore = score;\n best = i;\n }\n }\n if (best < 0) break; // every remaining point sits on a seed\n centroids.set(points.subarray(best * 3, best * 3 + 3), found * 3);\n }\n\n const sums = new Float64Array(found * 4);\n for (let round = 0; round < iterations; round++) {\n let moved = round === 0;\n for (let i = 0; i < n; i++) {\n let best = 0;\n let bestDistance = Infinity;\n for (let j = 0; j < found; j++) {\n const d = distance(i, j);\n if (d < bestDistance) {\n bestDistance = d;\n best = j;\n }\n }\n if (assignment[i] !== best) {\n assignment[i] = best;\n moved = true;\n }\n }\n if (!moved) break;\n\n sums.fill(0);\n for (let i = 0; i < n; i++) {\n const j = assignment[i] * 4;\n const w = weights[i];\n sums[j] += points[i * 3] * w;\n sums[j + 1] += points[i * 3 + 1] * w;\n sums[j + 2] += points[i * 3 + 2] * w;\n sums[j + 3] += w;\n }\n for (let j = 0; j < found; j++) {\n const w = sums[j * 4 + 3];\n if (w <= 0) continue; // an empty cluster keeps its seed\n centroids[j * 3] = sums[j * 4] / w;\n centroids[j * 3 + 1] = sums[j * 4 + 1] / w;\n centroids[j * 3 + 2] = sums[j * 4 + 2] / w;\n }\n }\n\n return { assignment, centroids: centroids.slice(0, found * 3), k: found };\n}\n","import {\n clamp,\n formatOklch,\n hueDistance,\n labToLch,\n maxChroma,\n onColorFor,\n smoothstep,\n srgbToOklab,\n toneOf,\n} from \"./oklab\";\nimport { kmeans } from \"./quantize\";\nimport { AMBIENT_REGIONS, AMBIENT_TONES, DEFAULT_ANALYSIS } from \"./settings\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n AmbientRamp,\n AmbientRegion,\n AmbientRegionColor,\n AmbientRole,\n AmbientSwatch,\n OklchColor,\n} from \"./types\";\n\n// Below this chroma a colour reads as grey; its hue is noise.\nconst MIN_CHROMA = 0.022;\n// Below this share of coloured pixels an image is treated as neutral.\nconst MIN_PRESENCE = 0.03;\n// A colour this small still counts as a role when it is vivid enough.\nconst MIN_POPULATION = 0.004;\n\nconst REGION_BITS: Record<AmbientRegion, number> = {\n top: 1,\n bottom: 2,\n left: 4,\n right: 8,\n center: 16,\n};\n\nexport interface Cluster extends OklchColor {\n /** Share of the (centre-weighted) image. */\n pop: number;\n /** Share of the chroma sRGB allows at this lightness and hue. */\n rel: number;\n /** How far the hue can be trusted at this lightness (0–1). */\n rely: number;\n}\n\ninterface Bounds {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\nconst lightnessAt = (data: ArrayLike<number>, index: number) =>\n srgbToOklab(data[index], data[index + 1], data[index + 2])[0];\n\n/**\n * Finds black bars along the edges (letterbox / pillarbox): rows or columns\n * that are uniformly near-black. At most 22% of each side is cut.\n */\nexport function findContentBounds({ data, height, width }: AmbientPixels): Bounds {\n const isBar = (count: number, at: (step: number) => number) => {\n let sum = 0;\n let max = 0;\n let seen = 0;\n for (let step = 0; step < count; step++) {\n const index = at(step);\n if (data[index + 3] < 128) continue;\n const l = lightnessAt(data, index);\n sum += l;\n if (l > max) max = l;\n seen++;\n }\n return seen > 0 && sum / seen < 0.12 && max < 0.2;\n };\n const row = (y: number) => isBar(width, (x) => (y * width + x) * 4);\n const maxRows = Math.floor(height * 0.22);\n const maxColumns = Math.floor(width * 0.22);\n\n let top = 0;\n while (top < maxRows && row(top)) top++;\n let bottom = height;\n while (height - bottom < maxRows && bottom - 1 > top && row(bottom - 1)) bottom--;\n\n const column = (x: number) =>\n isBar(bottom - top, (step) => ((top + step) * width + x) * 4);\n let left = 0;\n while (left < maxColumns && column(left)) left++;\n let right = width;\n while (width - right < maxColumns && right - 1 > left && column(right - 1)) right--;\n\n return { bottom, left, right, top };\n}\n\nconst reliability = (l: number) =>\n smoothstep(0.1, 0.28, l) * (1 - smoothstep(0.9, 0.98, l));\n\nconst colorfulness = (c: number) => smoothstep(MIN_CHROMA, 0.06, c);\n\nconst isChromatic = (cluster: Cluster) =>\n cluster.c >= MIN_CHROMA && cluster.rely > 0;\n\nfunction pickBest<T>(items: T[], score: (item: T) => number): T | null {\n let best: T | null = null;\n let bestScore = 0;\n for (const item of items) {\n const value = score(item);\n if (value > bestScore) {\n bestScore = value;\n best = item;\n }\n }\n return best;\n}\n\nconst round3 = (value: number) => Math.round(value * 1000) / 1000;\n\ninterface ToneSpec {\n cap: number;\n max: number;\n min: number;\n rel: number;\n}\n\nfunction buildSwatch(\n source: Cluster | null,\n { cap, max, min, rel }: ToneSpec,\n fallback: { h: number; l: number },\n fromImage: boolean,\n minContrast: number,\n): AmbientSwatch {\n const h = source?.h ?? fallback.h;\n const l = clamp(source?.l ?? fallback.l, min, max);\n const tone = toneOf(h, l, rel, cap);\n const ramp = {} as AmbientRamp;\n for (const step of AMBIENT_TONES) {\n ramp[step] = formatOklch(toneOf(h, step / 100, rel, cap));\n }\n return {\n c: round3(tone.c),\n color: formatOklch(tone),\n fromImage,\n h: Math.round(h * 10) / 10,\n l: round3(tone.l),\n on: formatOklch(onColorFor(tone, minContrast)),\n population: round3(source?.pop ?? 0),\n ramp,\n };\n}\n\n// How much of the gamut each role uses, from the source colour's own share.\nconst lift = (rel: number, base: number, gain: number, ceiling: number) =>\n clamp(base + gain * rel, 0, ceiling);\n\nexport interface AmbientClustering {\n clusters: Cluster[];\n /** Centre-weighted mean lightness. */\n meanL: number;\n /** Per region, the pixel count of each cluster. */\n regionWeights: Float64Array[];\n}\n\n/**\n * Step one of the analysis: the image's colours as OKLab k-means clusters,\n * with each cluster's share of the frame and of each region.\n */\nexport function clusterAmbientPixels(\n pixels: AmbientPixels,\n options: AmbientAnalysisOptions,\n): AmbientClustering {\n const { data, width, height } = pixels;\n const bounds = options.letterbox\n ? findContentBounds(pixels)\n : { bottom: height, left: 0, right: width, top: 0 };\n const boxWidth = Math.max(1, bounds.right - bounds.left);\n const boxHeight = Math.max(1, bounds.bottom - bounds.top);\n\n // 1. Bin pixels by 15-bit RGB, averaging their OKLab values per bin.\n const binOf = new Int32Array(32768).fill(-1);\n const binSums: number[] = [];\n const pixelBins = new Int32Array(boxWidth * boxHeight).fill(-1);\n const pixelRegions = new Uint8Array(boxWidth * boxHeight);\n const sigma2 = 2 * 0.35 * 0.35;\n let total = 0;\n let sumL = 0;\n\n for (let y = bounds.top; y < bounds.bottom; y++) {\n const v = (y - bounds.top + 0.5) / boxHeight;\n for (let x = bounds.left; x < bounds.right; x++) {\n const index = (y * width + x) * 4;\n if (data[index + 3] < 128) continue;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const [l, a, bb] = srgbToOklab(r, g, b);\n const u = (x - bounds.left + 0.5) / boxWidth;\n const du = (u - 0.5) * 2;\n const dv = (v - 0.5) * 2;\n const weight =\n 1 -\n options.centerWeight +\n 2 * options.centerWeight * Math.exp(-(du * du + dv * dv) / sigma2);\n\n const key = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);\n let bin = binOf[key];\n if (bin < 0) {\n bin = binSums.length / 4;\n binOf[key] = bin;\n binSums.push(0, 0, 0, 0);\n }\n binSums[bin * 4] += l * weight;\n binSums[bin * 4 + 1] += a * weight;\n binSums[bin * 4 + 2] += bb * weight;\n binSums[bin * 4 + 3] += weight;\n total += weight;\n sumL += l * weight;\n\n const local = (y - bounds.top) * boxWidth + (x - bounds.left);\n pixelBins[local] = bin;\n pixelRegions[local] =\n (v < 1 / 3 ? REGION_BITS.top : 0) |\n (v > 2 / 3 ? REGION_BITS.bottom : 0) |\n (u < 1 / 3 ? REGION_BITS.left : 0) |\n (u > 2 / 3 ? REGION_BITS.right : 0) |\n (Math.abs(u - 0.5) < 0.25 && Math.abs(v - 0.5) < 0.25\n ? REGION_BITS.center\n : 0);\n }\n }\n\n const meanL = total > 0 ? sumL / total : 0.5;\n const bins = binSums.length / 4;\n\n // 2. Cluster coloured and grey bins apart, so the greys of a mostly dark\n // poster cannot use up every cluster and swallow its one red coat.\n const groups: [number[], number[]] = [[], []];\n for (let i = 0; i < bins; i++) {\n const w = binSums[i * 4 + 3];\n const a = binSums[i * 4 + 1] / w;\n const b = binSums[i * 4 + 2] / w;\n const coloured =\n Math.sqrt(a * a + b * b) >= MIN_CHROMA && binSums[i * 4] / w >= 0.06;\n groups[coloured ? 0 : 1].push(i);\n }\n const requested = clamp(Math.round(options.clusters), 2, 16);\n const greyClusters =\n groups[0].length === 0 ? requested : groups[1].length === 0 ? 0 : requested >= 8 ? 3 : 2;\n const budgets = [requested - greyClusters, greyClusters];\n\n const clusters: Cluster[] = [];\n const clusterOfBin = new Int32Array(bins).fill(-1);\n groups.forEach((members, group) => {\n if (members.length === 0 || budgets[group] <= 0) return;\n const points = new Float64Array(members.length * 3);\n const weights = new Float64Array(members.length);\n members.forEach((bin, i) => {\n const w = binSums[bin * 4 + 3];\n const a = binSums[bin * 4 + 1] / w;\n const b = binSums[bin * 4 + 2] / w;\n points[i * 3] = binSums[bin * 4] / w;\n points[i * 3 + 1] = a;\n points[i * 3 + 2] = b;\n // Vivid colours pull harder, so a small saturated area keeps its own cluster.\n weights[i] = w * (1 + 5 * Math.sqrt(a * a + b * b));\n });\n const { assignment, centroids, k } = kmeans(points, weights, budgets[group]);\n const pop = new Float64Array(k);\n members.forEach((bin, i) => (pop[assignment[i]] += binSums[bin * 4 + 3]));\n const index = new Int32Array(k).fill(-1);\n for (let j = 0; j < k; j++) {\n if (pop[j] <= 0) continue;\n const lch = labToLch([centroids[j * 3], centroids[j * 3 + 1], centroids[j * 3 + 2]]);\n const room = maxChroma(lch.l, lch.h);\n index[j] = clusters.length;\n clusters.push({\n ...lch,\n pop: pop[j] / total,\n rel: room > 0 ? clamp(lch.c / room, 0, 1) : 0,\n rely: reliability(lch.l),\n });\n }\n members.forEach((bin, i) => (clusterOfBin[bin] = index[assignment[i]]));\n });\n\n // 3. Region shares per cluster.\n const regionWeights = AMBIENT_REGIONS.map(() => new Float64Array(clusters.length));\n for (let i = 0; i < pixelBins.length; i++) {\n const bin = pixelBins[i];\n if (bin < 0) continue;\n const cluster = clusterOfBin[bin];\n const bits = pixelRegions[i];\n AMBIENT_REGIONS.forEach((region, r) => {\n if (bits & REGION_BITS[region]) regionWeights[r][cluster] += 1;\n });\n }\n\n return { clusters, meanL, regionWeights };\n}\n\n/**\n * The palette of an image: OKLab k-means clusters scored by population ×\n * chroma, turned into four roles (each with a gamut-aware tonal ramp and a\n * contrast-safe text colour), five region colours, and the deep `shadow`\n * tone.\n */\nexport function analyzeAmbientPixels(\n pixels: AmbientPixels,\n overrides: Partial<AmbientAnalysisOptions> = {},\n): AmbientPalette {\n const options = { ...DEFAULT_ANALYSIS, ...overrides };\n const { clusters, meanL, regionWeights } = clusterAmbientPixels(pixels, options);\n\n // 4. Roles.\n const chromatic = clusters.filter(isChromatic);\n const presence = chromatic.reduce(\n (sum, cluster) => sum + cluster.pop * colorfulness(cluster.c) * cluster.rely,\n 0,\n );\n const neutral = presence < MIN_PRESENCE;\n // A coloured detail on an almost grey image is kept, but quieter.\n const dilution = 0.55 + 0.45 * Math.min(1, presence / 0.25);\n const { minContrast, minHueDistance } = options;\n const grey = { h: 0, l: clamp(meanL, 0.3, 0.8) };\n\n // k-means splits one hue into several lightness levels; a hue's share is\n // that of its whole family (clusters within 20°), so it is not undercounted.\n const family = new Map<Cluster, number>();\n for (const cluster of chromatic) {\n let share = 0;\n for (const other of chromatic) {\n if (hueDistance(cluster.h, other.h) <= 20) share += other.pop;\n }\n family.set(cluster, share);\n }\n const share = (cluster: Cluster) => family.get(cluster) ?? cluster.pop;\n const withShare = (cluster: Cluster | null) =>\n cluster ? { ...cluster, pop: share(cluster) } : null;\n\n const dominantPick = neutral\n ? null\n : pickBest(chromatic, (cluster) => share(cluster) * cluster.c * cluster.rely);\n // A grey image keeps a grey `vibrant`: no hue is invented.\n const vividPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => share(cluster) >= MIN_POPULATION),\n (cluster) =>\n cluster.c * cluster.c * Math.pow(share(cluster), 0.3) * cluster.rely,\n );\n // …but a coloured detail on it (the red coat) becomes the accent.\n const accentPick = pickBest(\n chromatic.filter((cluster) =>\n neutral\n ? share(cluster) >= 0.006 && cluster.c >= 0.06\n : share(cluster) >= MIN_POPULATION &&\n cluster.c >= 0.035 &&\n (!dominantPick || hueDistance(cluster.h, dominantPick.h) >= minHueDistance),\n ),\n (cluster) => Math.pow(share(cluster), 0.6) * cluster.c * cluster.rely,\n );\n const mutedPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => cluster.c <= 0.09),\n (cluster) => share(cluster) * cluster.rely * (1 - cluster.c / 0.12),\n );\n\n const dominantHue = dominantPick?.h ?? vividPick?.h ?? 0;\n const roles: Record<AmbientRole, AmbientSwatch> = {\n dominant: buildSwatch(\n withShare(dominantPick),\n {\n cap: 0.22,\n max: 0.74,\n min: 0.42,\n rel: dominantPick ? lift(dominantPick.rel, 0.25, 0.85, 0.9) : 0,\n },\n grey,\n true,\n minContrast,\n ),\n vibrant: buildSwatch(\n withShare(vividPick),\n {\n cap: 0.24,\n max: 0.84,\n min: 0.62,\n rel: vividPick ? lift(vividPick.rel, 0.4, 0.75, 0.95) * dilution : 0,\n },\n { h: dominantHue, l: 0.78 },\n true,\n minContrast,\n ),\n muted: buildSwatch(\n withShare(mutedPick),\n {\n cap: 0.08,\n max: 0.66,\n min: 0.38,\n rel: mutedPick\n ? clamp(mutedPick.rel, 0.1, 0.3)\n : dominantPick\n ? 0.2\n : 0,\n },\n { h: dominantHue, l: clamp(meanL, 0.38, 0.66) },\n Boolean(mutedPick) || neutral,\n minContrast,\n ),\n accent: buildSwatch(\n withShare(accentPick ?? vividPick),\n {\n cap: 0.24,\n max: 0.8,\n min: 0.55,\n rel: (accentPick ?? vividPick)\n ? lift((accentPick ?? vividPick)!.rel, 0.35, 0.75, 0.92) * dilution\n : 0,\n },\n { h: dominantHue, l: 0.72 },\n Boolean(accentPick),\n minContrast,\n ),\n };\n\n // 5. `shadow`: the shadows' own hue when they have one, else the dominant's.\n // In the dark, relative chroma says more than chroma: a navy at L 0.14\n // uses most of what sRGB has there.\n const shadowPick = neutral\n ? null\n : pickBest(\n clusters.filter(\n (cluster) => cluster.l <= 0.5 && cluster.c >= 0.02 && cluster.pop >= 0.02,\n ),\n (cluster) => cluster.pop * cluster.rel * smoothstep(0.05, 0.14, cluster.l),\n );\n const deepSource = shadowPick ?? dominantPick;\n const shadowL = clamp(\n options.shadowLightness + (meanL - 0.45) * 0.06,\n options.shadowLightness - 0.02,\n options.shadowLightness + 0.02,\n );\n const shadow = deepSource\n ? toneOf(deepSource.h, shadowL, lift(deepSource.rel, 0.3, 0.7, 0.85), 0.1)\n : { c: 0, h: 0, l: shadowL };\n\n // 6. Regions: the most telling cluster in each part of the frame.\n const regions = {} as Record<AmbientRegion, AmbientRegionColor>;\n AMBIENT_REGIONS.forEach((region, r) => {\n const weights = regionWeights[r];\n let regionTotal = 0;\n let regionL = 0;\n clusters.forEach((cluster, j) => {\n regionTotal += weights[j];\n regionL += cluster.l * weights[j];\n });\n const share = (j: number) => (regionTotal > 0 ? weights[j] / regionTotal : 0);\n let strength = 0;\n let pick: Cluster | null = null;\n let pickScore = 0;\n clusters.forEach((cluster, j) => {\n if (!isChromatic(cluster)) return;\n strength += share(j) * colorfulness(cluster.c) * cluster.rely;\n const score = share(j) * cluster.c * cluster.rely;\n if (score > pickScore) {\n pickScore = score;\n pick = cluster;\n }\n });\n const chosen = neutral || strength < MIN_PRESENCE ? null : (pick as Cluster | null);\n const tone = chosen\n ? toneOf(\n chosen.h,\n clamp(chosen.l, 0.42, 0.72),\n lift(chosen.rel, 0.25, 0.85, 0.9),\n 0.22,\n )\n : {\n c: 0,\n h: 0,\n l: clamp(regionTotal > 0 ? regionL / regionTotal : meanL, 0.3, 0.7),\n };\n regions[region] = {\n c: round3(tone.c),\n color: formatOklch(tone),\n h: Math.round(tone.h * 10) / 10,\n l: round3(tone.l),\n strength: round3(chosen ? clamp(strength, 0, 1) : 0),\n };\n });\n\n return {\n neutral,\n regions,\n roles,\n shadow: formatOklch(shadow),\n };\n}\n\n/** Width and height that fit `width × height` inside `size` on the long side. */\nexport function fitSample(width: number, height: number, size: number) {\n const scale = Math.min(1, size / Math.max(width, height, 1));\n return {\n height: Math.max(1, Math.round(height * scale)),\n width: Math.max(1, Math.round(width * scale)),\n };\n}\n","import { analyzeAmbientPixels, fitSample } from \"./analyze\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n} from \"./types\";\n\n// Fetch → decode → analyze, written against what both a window and a worker\n// have (fetch, createImageBitmap, OffscreenCanvas), so the same code runs in\n// either.\n\nexport interface AmbientExtractRequest {\n analysis: AmbientAnalysisOptions;\n /** Absolute URL of a proxy to retry through, if any. */\n proxyUrl: string | null;\n /** Absolute image URL. */\n src: string;\n}\n\nexport type AmbientExtractResult =\n | { palette: AmbientPalette | null; supported: true }\n | { supported: false };\n\ntype Context2D = OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\nexport async function fetchImageBlob(\n src: string,\n proxyUrl: string | null,\n): Promise<Blob | null> {\n if (typeof fetch !== \"function\") return null;\n\n const read = async (url: string, init?: RequestInit) => {\n const response = await fetch(url, { ...init, mode: \"cors\" });\n if (!response.ok) return null;\n const blob = await response.blob();\n // An HTML error page served with 200 is not an image.\n return blob.type.startsWith(\"text/\") ? null : blob;\n };\n\n // 1. The image itself: a CORS request for the URL the page already shows is\n // answered from the HTTP cache, so nothing is downloaded twice.\n try {\n const blob = await read(src);\n if (blob) return blob;\n } catch {\n // 2. Blocked. Some CDNs (TMDB's among them) send CORS headers only when\n // asked and do not `Vary: Origin`, so the copy an <img> cached has none.\n // Fetching past the cache gets one that has them, once.\n if (isCrossOrigin(src)) {\n try {\n const blob = await read(src, { cache: \"reload\" });\n if (blob) return blob;\n } catch {}\n }\n }\n\n // 3. Through the proxy.\n if (proxyUrl) {\n try {\n return await read(proxyUrl);\n } catch {}\n }\n return null;\n}\n\nfunction isCrossOrigin(url: string): boolean {\n try {\n return new URL(url).origin !== globalThis.location?.origin;\n } catch {\n return false;\n }\n}\n\nexport function createContext2D(width: number, height: number): Context2D | null {\n if (typeof OffscreenCanvas === \"function\") {\n return new OffscreenCanvas(width, height).getContext(\"2d\", {\n willReadFrequently: true,\n });\n }\n if (typeof document !== \"undefined\") {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n return null;\n}\n\nexport function readPixels(\n image: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n size: number,\n): AmbientPixels | null {\n const { height, width } = fitSample(sourceWidth, sourceHeight, size);\n const context = createContext2D(width, height);\n if (!context) return null;\n context.drawImage(image, 0, 0, width, height);\n return { data: context.getImageData(0, 0, width, height).data, height, width };\n}\n\n/**\n * Decodes off the main thread: `createImageBitmap` decodes (and, where\n * supported, downscales) in the browser's image pipeline, so only a small\n * bitmap is ever drawn.\n */\nexport async function decodeBlob(\n blob: Blob,\n size: number,\n): Promise<AmbientPixels | null> {\n if (typeof createImageBitmap !== \"function\") return null;\n let bitmap: ImageBitmap;\n try {\n bitmap = await createImageBitmap(blob, {\n resizeQuality: \"medium\",\n resizeWidth: size,\n });\n } catch {\n bitmap = await createImageBitmap(blob);\n }\n try {\n return readPixels(bitmap, bitmap.width, bitmap.height, size);\n } finally {\n bitmap.close();\n }\n}\n\nexport const canDecodeHere = () =>\n typeof createImageBitmap === \"function\" &&\n (typeof OffscreenCanvas === \"function\" || typeof document !== \"undefined\");\n\nexport async function extractHere(\n request: AmbientExtractRequest,\n): Promise<AmbientExtractResult> {\n if (!canDecodeHere()) return { supported: false };\n const blob = await fetchImageBlob(request.src, request.proxyUrl);\n if (!blob) return { palette: null, supported: true };\n try {\n const pixels = await decodeBlob(blob, request.analysis.sampleSize);\n return {\n palette: pixels ? analyzeAmbientPixels(pixels, request.analysis) : null,\n supported: true,\n };\n } catch {\n return { palette: null, supported: true };\n }\n}\n","import { extractHere, type AmbientExtractRequest } from \"../pipeline\";\n\n// `@omerdlw/base-framework/ambient/worker`: runs extraction off the main thread.\n//\n// // ambient.worker.ts (in the app)\n// import { serveAmbientWorker } from \"@omerdlw/base-framework/ambient/worker\";\n// serveAmbientWorker();\n//\n// // once, on the client\n// configureAmbient({\n// worker: () =>\n// new Worker(new URL(\"./ambient.worker.ts\", import.meta.url), { type: \"module\" }),\n// });\n\nexport const AMBIENT_WORKER_REQUEST = \"ambient:extract\";\nexport const AMBIENT_WORKER_RESPONSE = \"ambient:palette\";\n\nexport interface AmbientWorkerRequest extends AmbientExtractRequest {\n id: number;\n type: typeof AMBIENT_WORKER_REQUEST;\n}\n\nexport interface AmbientWorkerScope {\n addEventListener(type: \"message\", listener: (event: MessageEvent) => void): void;\n postMessage(message: unknown): void;\n removeEventListener(type: \"message\", listener: (event: MessageEvent) => void): void;\n}\n\n/** Answers extraction requests in a worker. Returns a function that stops it. */\nexport function serveAmbientWorker(\n scope: AmbientWorkerScope = globalThis as unknown as AmbientWorkerScope,\n): () => void {\n const onMessage = async (event: MessageEvent) => {\n const request = event.data as AmbientWorkerRequest | null;\n if (request?.type !== AMBIENT_WORKER_REQUEST) return;\n let result: Awaited<ReturnType<typeof extractHere>>;\n try {\n result = await extractHere(request);\n } catch {\n result = { palette: null, supported: true };\n }\n scope.postMessage({ ...result, id: request.id, type: AMBIENT_WORKER_RESPONSE });\n };\n scope.addEventListener(\"message\", onMessage);\n return () => scope.removeEventListener(\"message\", onMessage);\n}\n","import { analyzeAmbientPixels } from \"./analyze\";\nimport {\n extractHere,\n fetchImageBlob,\n readPixels,\n type AmbientExtractRequest,\n type AmbientExtractResult,\n} from \"./pipeline\";\nimport {\n getAmbientSettings,\n resolveAnalysis,\n resolveProxyUrl,\n} from \"./settings\";\nimport {\n AMBIENT_WORKER_REQUEST,\n AMBIENT_WORKER_RESPONSE,\n} from \"./worker/index\";\nimport type {\n AmbientExtractOptions,\n AmbientImageSource,\n AmbientPalette,\n} from \"./types\";\n\nconst WORKER_PATIENCE = 15_000;\n\nconst paletteCache = new Map<string, AmbientPalette>();\nconst inFlight = new Map<string, Promise<AmbientPalette | null>>();\n\nfunction cachePalette(key: string, palette: AmbientPalette): void {\n paletteCache.delete(key);\n const limit = Math.max(1, getAmbientSettings().cacheLimit);\n while (paletteCache.size >= limit) {\n const oldest = paletteCache.keys().next().value;\n if (oldest === undefined) break;\n paletteCache.delete(oldest);\n }\n paletteCache.set(key, palette);\n}\n\n/**\n * Seeds the client cache with a palette computed elsewhere (usually on the\n * server), so the same image is never extracted again in this tab.\n */\nexport function primeAmbientPalette(src: string, palette: AmbientPalette): void {\n if (src && palette) cachePalette(src, { ...palette, source: src });\n}\n\nexport function getCachedAmbientPalette(src: string): AmbientPalette | null {\n return paletteCache.get(src) ?? null;\n}\n\n// ─── Worker ──────────────────────────────────────────────────────────────\n\ninterface WorkerSlot {\n factory: () => Worker;\n next: number;\n pending: Map<number, (result: AmbientExtractResult | null) => void>;\n worker: Worker;\n}\n\nlet slot: WorkerSlot | null = null;\nconst brokenFactories = new WeakSet<() => Worker>();\n\nfunction dropWorker(target: WorkerSlot): void {\n if (slot === target) slot = null;\n target.worker.terminate();\n for (const resolve of target.pending.values()) resolve(null);\n target.pending.clear();\n}\n\nfunction workerSlot(factory: () => Worker): WorkerSlot | null {\n if (slot?.factory === factory) return slot;\n if (slot) dropWorker(slot);\n if (brokenFactories.has(factory)) return null;\n let worker: Worker;\n try {\n worker = factory();\n } catch {\n brokenFactories.add(factory);\n return null;\n }\n const created: WorkerSlot = { factory, next: 1, pending: new Map(), worker };\n worker.addEventListener(\"message\", (event: MessageEvent) => {\n const message = event.data as (AmbientExtractResult & { id: number; type: string }) | null;\n if (message?.type !== AMBIENT_WORKER_RESPONSE) return;\n created.pending.get(message.id)?.(message);\n created.pending.delete(message.id);\n });\n worker.addEventListener(\"error\", () => {\n brokenFactories.add(factory);\n dropWorker(created);\n });\n slot = created;\n return created;\n}\n\nfunction extractInWorker(\n factory: () => Worker,\n request: AmbientExtractRequest,\n): Promise<AmbientExtractResult | null> {\n const target = workerSlot(factory);\n if (!target) return Promise.resolve(null);\n const id = target.next++;\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n target.pending.delete(id);\n resolve(null);\n }, WORKER_PATIENCE);\n target.pending.set(id, (result) => {\n clearTimeout(timer);\n resolve(result);\n });\n target.worker.postMessage({ ...request, id, type: AMBIENT_WORKER_REQUEST });\n });\n}\n\n// ─── Main thread ─────────────────────────────────────────────────────────\n\nfunction loadImageElement(url: string): Promise<HTMLImageElement | null> {\n return new Promise((resolve) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => resolve(null);\n image.src = url;\n });\n}\n\nasync function extractOnMainThread(\n request: AmbientExtractRequest,\n): Promise<AmbientPalette | null> {\n const result = await extractHere(request);\n if (result.supported) return result.palette;\n\n // No createImageBitmap: decode through an <img> instead.\n const blob = await fetchImageBlob(request.src, request.proxyUrl);\n if (!blob || typeof URL.createObjectURL !== \"function\") return null;\n const objectUrl = URL.createObjectURL(blob);\n try {\n const image = await loadImageElement(objectUrl);\n const pixels =\n image &&\n readPixels(\n image,\n image.naturalWidth,\n image.naturalHeight,\n request.analysis.sampleSize,\n );\n return pixels ? analyzeAmbientPixels(pixels, request.analysis) : null;\n } catch {\n return null;\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\n// ─── Public ──────────────────────────────────────────────────────────────\n\nfunction absoluteUrl(src: string): string {\n try {\n return new URL(src, globalThis.location?.href).href;\n } catch {\n return src;\n }\n}\n\nconst isCrossOrigin = (url: string) => {\n try {\n return new URL(url).origin !== globalThis.location?.origin;\n } catch {\n return false;\n }\n};\n\nasync function extractPalette(\n src: string,\n options: AmbientExtractOptions,\n): Promise<AmbientPalette | null> {\n const settings = getAmbientSettings();\n const strategy = options.strategy ?? settings.strategy;\n const absolute = absoluteUrl(src);\n const proxy = options.proxy === undefined ? settings.proxy : options.proxy;\n const request: AmbientExtractRequest = {\n analysis: resolveAnalysis(options.analysis),\n proxyUrl: isCrossOrigin(absolute)\n ? (() => {\n const proxied = resolveProxyUrl(proxy, absolute);\n return proxied ? absoluteUrl(proxied) : null;\n })()\n : null,\n src: absolute,\n };\n\n if (strategy !== \"main\" && settings.worker && typeof Worker === \"function\") {\n const result = await extractInWorker(settings.worker, request);\n if (result?.supported) return result.palette;\n }\n if (strategy === \"worker\") return null;\n return extractOnMainThread(request);\n}\n\n/**\n * Extracts the palette of an image (cached, with concurrent requests for the\n * same image shared). Resolves `null` on any failure and never throws.\n */\nexport async function extractPaletteFromImage(\n imageSource: AmbientImageSource,\n options: AmbientExtractOptions = {},\n): Promise<AmbientPalette | null> {\n const src = typeof imageSource === \"string\" ? imageSource : imageSource?.src;\n if (!src || typeof window === \"undefined\") return null;\n\n const strategy = options.strategy ?? getAmbientSettings().strategy;\n if (strategy === \"none\") return getCachedAmbientPalette(src);\n\n const key = options.analysis ? `${src}#${JSON.stringify(options.analysis)}` : src;\n const cached = paletteCache.get(key);\n if (cached) return cached;\n\n let pending = inFlight.get(key);\n if (!pending) {\n pending = extractPalette(src, options)\n .catch(() => null)\n .then((palette) => {\n if (!palette) return null;\n const sourced = { ...palette, source: src };\n cachePalette(key, sourced);\n return sourced;\n })\n .finally(() => inFlight.delete(key));\n inFlight.set(key, pending);\n }\n return pending;\n}\n","import { AMBIENT_REGIONS, AMBIENT_ROLES, getAmbientSettings } from \"./settings\";\nimport type {\n AmbientCssVarConfig,\n AmbientCssVarNames,\n AmbientImageSource,\n AmbientPalette,\n AmbientTarget,\n AmbientTone,\n} from \"./types\";\n\nexport type ResolvedCssVars = AmbientCssVarNames & {\n tones: readonly AmbientTone[] | false;\n};\n\nexport function resolveCssVarNames(\n overrides?: AmbientCssVarConfig | null,\n): ResolvedCssVars {\n const base = getAmbientSettings().cssVars;\n return overrides ? { ...base, ...overrides } : base;\n}\n\nconst fill = (template: string, values: Record<string, string | number>) =>\n template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n\nexport function resolveTargetElement(\n target: AmbientTarget,\n): HTMLElement | null {\n if (typeof document === \"undefined\") return null;\n if (!target) return document.documentElement;\n if (typeof target === \"string\") {\n return document.querySelector<HTMLElement>(target);\n }\n return \"current\" in target ? target.current : target;\n}\n\n/** `colors` keys are custom property names; a bare name gets `--color-`. */\nexport function normalizeColorMap(\n colors: Record<string, string>,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(colors)) {\n if (!value) continue;\n result[key.startsWith(\"--\") ? key : `--color-${key}`] = value;\n }\n return result;\n}\n\nexport function applyScopedCssVariables(\n element: HTMLElement,\n varMap: Record<string, string>,\n): () => void {\n const previous = new Map<string, { priority: string; value: string }>();\n for (const [name, value] of Object.entries(varMap)) {\n if (!name || !value) continue;\n previous.set(name, {\n priority: element.style.getPropertyPriority(name),\n value: element.style.getPropertyValue(name),\n });\n element.style.setProperty(name, value);\n }\n\n return () => {\n for (const [name, { priority, value }] of previous) {\n if (value) element.style.setProperty(name, value, priority);\n else element.style.removeProperty(name);\n }\n };\n}\n\n/** Every variable a palette writes: shadow, roles, `on` colours, ramps, regions. */\nexport function paletteVarMap(\n palette: AmbientPalette | null | undefined,\n names: ResolvedCssVars = resolveCssVarNames(),\n): Record<string, string> {\n const varMap: Record<string, string> = {};\n if (!palette) return varMap;\n if (names.shadow) varMap[names.shadow] = palette.shadow;\n for (const role of AMBIENT_ROLES) {\n const swatch = palette.roles[role];\n if (names.role) varMap[fill(names.role, { role })] = swatch.color;\n if (names.on) varMap[fill(names.on, { role })] = swatch.on;\n if (names.tone && names.tones) {\n for (const tone of names.tones) {\n varMap[fill(names.tone, { role, tone })] = swatch.ramp[tone];\n }\n }\n }\n if (names.region) {\n for (const region of AMBIENT_REGIONS) {\n varMap[fill(names.region, { region })] = palette.regions[region].color;\n }\n }\n return varMap;\n}\n\nexport function resolveAmbientVarMap({\n colors = null,\n cssVars = null,\n image = null,\n palette = null,\n}: {\n colors?: Record<string, string> | null;\n cssVars?: AmbientCssVarConfig | null;\n image?: AmbientImageSource;\n palette?: AmbientPalette | null;\n}): Record<string, string> {\n const varMap: Record<string, string> = image\n ? paletteVarMap(palette, resolveCssVarNames(cssVars))\n : {};\n if (colors) Object.assign(varMap, normalizeColorMap(colors));\n return varMap;\n}\n","\"use client\";\n\nimport { use, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { shallowEqual } from \"@/utils\";\nimport { useModuleTheme } from \"@/theme\";\nimport { ambientTheme } from \"./constants\";\nimport { AmbientContext } from \"./context\";\nimport { extractPaletteFromImage, primeAmbientPalette } from \"./extractor\";\nimport {\n applyScopedCssVariables,\n resolveAmbientVarMap,\n resolveTargetElement,\n} from \"./dom\";\nimport type {\n AmbientConfig,\n AmbientContextValue,\n AmbientExtractOptions,\n AmbientImageSource,\n AmbientPalette,\n AmbientState,\n} from \"./types\";\n\nexport function useStableObject<T extends object | null | undefined>(value: T): T {\n const ref = useRef<T>(value);\n if (!shallowEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n\nexport function useAmbientColor(\n imageSource: AmbientImageSource,\n options: AmbientExtractOptions | null = null,\n): { isExtracting: boolean; palette: AmbientPalette | null } {\n const stableOptions = useStableObject(options);\n const initialPalette = useStableObject(options?.initialPalette ?? null);\n\n const srcKey =\n typeof imageSource === \"string\" ? imageSource : imageSource?.src;\n\n // A palette made for this very image (on the server, say) is used as is.\n const seeded =\n srcKey && initialPalette?.source === srcKey ? initialPalette : null;\n\n // The outcome of the last extraction: `palette` is null when it failed.\n const [result, setResult] = useState<{\n palette: AmbientPalette | null;\n source: string;\n } | null>(null);\n\n const settled = result?.source === srcKey ? result : null;\n const isExtracting = Boolean(imageSource && !seeded && !settled);\n\n useEffect(() => {\n if (seeded && srcKey) primeAmbientPalette(srcKey, seeded);\n }, [seeded, srcKey]);\n\n useEffect(() => {\n if (!imageSource || !srcKey || seeded) return;\n\n let active = true;\n\n void extractPaletteFromImage(imageSource, stableOptions ?? {})\n .catch(() => null)\n .then((palette) => {\n if (active) setResult({ palette, source: srcKey });\n });\n\n return () => {\n active = false;\n };\n }, [imageSource, seeded, srcKey, stableOptions]);\n\n const palette = imageSource\n ? (seeded ?? settled?.palette ?? initialPalette)\n : initialPalette;\n\n return { isExtracting, palette };\n}\n\nexport function useAmbientTheme(\n config: AmbientConfig | string | null = null,\n): AmbientState {\n const ambientActions = use(AmbientContext)?.actions ?? null;\n const normalizedConfig: AmbientConfig =\n typeof config === \"string\" ? { image: config } : config || {};\n\n const {\n colors = null,\n cssVars = null,\n image = null,\n initialPalette = null,\n options = null,\n scope = null,\n transition = true,\n } = normalizedConfig;\n\n const stableInitialPalette = useStableObject(initialPalette);\n const stableOptions = useStableObject(options);\n const stableColors = useStableObject(colors);\n const stableCssVars = useStableObject(cssVars);\n\n const resolvedOptions = useMemo<AmbientExtractOptions>(\n () => ({\n ...(stableOptions || {}),\n ...(stableInitialPalette ? { initialPalette: stableInitialPalette } : {}),\n }),\n [stableInitialPalette, stableOptions],\n );\n\n const { palette: extractedPalette, isExtracting } = useAmbientColor(\n image,\n resolvedOptions,\n );\n\n const hasActiveConfig = Boolean(image || stableColors);\n\n useEffect(() => {\n if (!hasActiveConfig || !ambientActions) return;\n ambientActions.setIsExtracting(isExtracting);\n ambientActions.setPalette((prev) =>\n shallowEqual(prev, extractedPalette) ? prev : extractedPalette,\n );\n }, [ambientActions, extractedPalette, hasActiveConfig, isExtracting]);\n\n const transitionClasses = useModuleTheme(ambientTheme)\n .slots.transition.split(/\\s+/)\n .filter(Boolean);\n const transitionKey = transitionClasses.join(\" \");\n\n const resolvedVarMap = useMemo(\n () =>\n resolveAmbientVarMap({\n colors: stableColors,\n cssVars: stableCssVars,\n image,\n palette: extractedPalette,\n }),\n [extractedPalette, image, stableColors, stableCssVars],\n );\n\n useEffect(() => {\n if (Object.keys(resolvedVarMap).length === 0) return;\n\n const targetEl = resolveTargetElement(scope);\n if (!targetEl) return;\n\n if (transition) {\n targetEl.classList.add(...transitionKey.split(\" \").filter(Boolean));\n }\n\n const restoreVariables = applyScopedCssVariables(targetEl, resolvedVarMap);\n\n return () => {\n restoreVariables();\n if (transition && scope) {\n targetEl.classList.remove(...transitionKey.split(\" \").filter(Boolean));\n }\n };\n }, [resolvedVarMap, scope, transition, transitionKey]);\n\n return { isExtracting, palette: extractedPalette };\n}\n\nexport function useAmbient(\n configOrImage?: AmbientConfig | string | null,\n): AmbientContextValue {\n const { actions, store } = useRequiredContext(\n AmbientContext,\n \"useAmbient\",\n \"AmbientProvider\",\n );\n const shared = useStore(store);\n const ctx = useMemo<AmbientContextValue>(\n () => ({ ...shared, ...actions }),\n [actions, shared],\n );\n const { isExtracting, palette } = useAmbientTheme(configOrImage ?? null);\n const themeState = useMemo(\n () => ({ isExtracting, palette }),\n [isExtracting, palette],\n );\n\n return useMemo(\n () => (configOrImage ? { ...ctx, ...themeState } : ctx),\n [configOrImage, ctx, themeState],\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport { useOptionalBackgroundState } from \"../background\";\nimport { AmbientContext, AmbientProvider } from \"./context\";\nimport { useAmbientTheme } from \"./hooks\";\nimport type {\n AmbientConfig,\n AmbientDescriptor,\n AmbientOverrides,\n AmbientPageApi,\n AmbientPageConfig,\n AmbientPageSlice,\n DefineAmbientOptions,\n DefinedAmbient,\n} from \"./types\";\n\nconst firstString = (...values: unknown[]): string | null =>\n (values.find((value) => typeof value === \"string\" && value) as string) ??\n null;\n\nexport function resolvePageAmbientTheme(\n slice: AmbientPageSlice | null,\n posterUrl: string | null,\n): Partial<AmbientConfig> | null {\n const ambient = slice?.ambient;\n const banner = slice?.banner ?? null;\n const defaultImage = banner ?? posterUrl;\n\n if (ambient === false) return null;\n if (ambient === true || typeof ambient === \"string\") {\n return { image: typeof ambient === \"string\" ? ambient : defaultImage };\n }\n if (ambient && typeof ambient === \"object\") {\n return { image: ambient.image ?? defaultImage, ...ambient };\n }\n if (banner && !posterUrl) return { image: banner };\n return null;\n}\n\nexport function selectPageAmbient(config: PageConfig): AmbientPageSlice {\n return {\n ambient: config.ambient,\n banner: firstString(config.dock?.banner, config.dock?.bannerUrl),\n };\n}\n\nexport function useAmbientPage(\n slice: AmbientPageSlice | null,\n page: PageModuleApi,\n): AmbientPageApi {\n const posterUrl = useOptionalBackgroundState(\n (background) => background.posterUrl,\n );\n const theme = useMemo(\n () => resolvePageAmbientTheme(slice, posterUrl),\n [posterUrl, slice],\n );\n useAmbientTheme(theme);\n return useMemo(\n () => ({ set: (ambient: AmbientPageConfig) => page.set({ ambient }) }),\n [page],\n );\n}\n\nexport const ambientModule = defineModule({\n id: \"ambient\",\n context: AmbientContext,\n Provider: AmbientProvider,\n uses: [\"background\"],\n page: {\n select: selectPageAmbient,\n use: useAmbientPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n ambient: typeof ambientModule;\n }\n interface PageConfig {\n ambient?: AmbientPageConfig;\n }\n}\n\nfunction resolveValue<T, P>(value: T | ((props: P) => T), props: P): T {\n return typeof value === \"function\"\n ? (value as (props: P) => T)(props)\n : value;\n}\n\nexport function defineAmbient(\n definition: DefineAmbientOptions = {},\n): DefinedAmbient {\n const { defaultProps, id = \"ambient-theme\", ...config } = definition;\n\n const create = (\n props: Record<string, unknown> = {},\n { id: overrideId, ...overrides }: AmbientOverrides = {},\n ): AmbientDescriptor => {\n const mergedProps = { ...defaultProps, ...props };\n const merged = { ...config, ...overrides };\n\n return {\n ...merged,\n colors: resolveValue(merged.colors ?? null, mergedProps) ?? null,\n id: overrideId ?? id,\n image: resolveValue(merged.image ?? null, mergedProps),\n initialPalette: merged.initialPalette ?? null,\n options: { ...config.options, ...overrides.options },\n props: mergedProps,\n scope: merged.scope ?? null,\n transition: merged.transition ?? true,\n };\n };\n\n return Object.freeze({\n config: definition,\n create,\n id,\n use: function useDefinedAmbient(\n props?: Record<string, unknown>,\n overrides?: AmbientOverrides,\n ) {\n return useAmbientTheme(create(props, overrides));\n },\n });\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/loading/constants.ts","../src/modules/loading/state.ts","../src/modules/loading/context.tsx","../src/modules/loading/hooks.ts","../src/modules/loading/overlay.tsx","../src/modules/loading/module.tsx"],"names":["value","useMemo","jsx"],"mappings":"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","file":"chunk-XASQT4CQ.js","sourcesContent":["import { defineThemeSpec } from \"@/theme\";\nimport {\n type LoadingActions,\n type LoadingState,\n type LoadingStateWithPage,\n type LoadingThemeSlot,\n} from \"./types\";\n\nexport const DEFAULT_LOADING_STATE: LoadingState = Object.freeze({\n isLoading: false,\n skeleton: null,\n minDuration: 0,\n showOverlay: true,\n message: null,\n});\n\nexport const DEFAULT_LOADING_STATE_WITH_PAGE: LoadingStateWithPage = Object.freeze({\n ...DEFAULT_LOADING_STATE,\n isPageLoading: false,\n});\n\nexport const INERT_LOADING_ACTIONS: LoadingActions = Object.freeze({\n setLoading: () => {},\n setSkeleton: () => {},\n startLoading: () => {},\n stopLoading: () => {},\n withLoading: async <T,>(task: Promise<T> | (() => Promise<T>)) =>\n typeof task === \"function\" ? task() : task,\n});\n\nexport const LOADING_REGISTRY_KEY = \"page-loading\";\n\nexport const loadingTheme = defineThemeSpec<LoadingThemeSlot>(\"loading\");\n","import {\n type LoadingOptions,\n type LoadingPageConfig,\n type LoadingState,\n type LoadingStateWithPage,\n} from \"./types\";\n\nexport function normalizeLoadingOptions(\n options: LoadingOptions = {},\n): Omit<LoadingState, \"isLoading\"> {\n const minDuration = Number(options.minDuration);\n return {\n message: typeof options.message === \"string\" ? options.message : null,\n minDuration:\n Number.isFinite(minDuration) && minDuration > 0 ? minDuration : 0,\n showOverlay: options.showOverlay !== false,\n skeleton: options.skeleton ?? null,\n };\n}\n\nexport function selectPageLoading(\n loading: LoadingPageConfig | null | undefined,\n): LoadingOptions | null {\n if (loading === undefined || loading === null) return null;\n if (typeof loading === \"boolean\") return { isLoading: loading };\n if (typeof loading === \"string\") return { isLoading: true, message: loading };\n return loading;\n}\n\nexport function resolveLoadingState(\n manualState: LoadingState,\n registryLoading?: LoadingOptions | null,\n): LoadingStateWithPage {\n if (registryLoading?.isLoading) {\n const normalized = normalizeLoadingOptions(registryLoading);\n return {\n ...normalized,\n isLoading: true,\n isPageLoading: true,\n };\n }\n return {\n ...manualState,\n isPageLoading: manualState.isLoading,\n };\n}\n\nexport function calculateRemainingMinDuration(\n startTime: number | null,\n minDuration: number,\n now = Date.now(),\n): number {\n if (startTime === null || minDuration <= 0) return 0;\n const elapsed = now - startTime;\n const remaining = minDuration - elapsed;\n return remaining > 0 ? remaining : 0;\n}\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"@/hooks\";\nimport {\n getOrCreateGlobalContext,\n useRegistryValue,\n} from \"@/kernel\";\nimport { createStore } from \"@/utils\";\nimport {\n DEFAULT_LOADING_STATE,\n DEFAULT_LOADING_STATE_WITH_PAGE,\n LOADING_REGISTRY_KEY,\n} from \"./constants\";\nimport {\n calculateRemainingMinDuration,\n normalizeLoadingOptions,\n resolveLoadingState,\n} from \"./state\";\nimport {\n type LoadingActions,\n type LoadingContextValue,\n type LoadingOptions,\n type LoadingProviderProps,\n type LoadingState,\n type LoadingStateWithPage,\n type SkeletonValue,\n} from \"./types\";\n\nexport const LoadingContext =\n getOrCreateGlobalContext<LoadingContextValue | null>(\"LoadingContext\", null);\n\nexport const NOOP_LOADING_STORE = createStore<LoadingStateWithPage>(\n DEFAULT_LOADING_STATE_WITH_PAGE,\n);\n\nexport function LoadingProvider({ children }: LoadingProviderProps) {\n const [manualState, setManualState] = useState<LoadingState>(\n DEFAULT_LOADING_STATE,\n );\n\n const startTimeRef = useRef<number | null>(null);\n const minDurationRef = useRef<number>(0);\n const stopTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const registryLoading = useRegistryValue<\"loading\", LoadingOptions>(\n \"loading\",\n LOADING_REGISTRY_KEY,\n );\n\n const clearStopTimer = useCallback(() => {\n if (stopTimerRef.current !== null) {\n clearTimeout(stopTimerRef.current);\n stopTimerRef.current = null;\n }\n }, []);\n\n const resetState = useCallback(() => {\n clearStopTimer();\n minDurationRef.current = 0;\n startTimeRef.current = null;\n setManualState(DEFAULT_LOADING_STATE);\n }, [clearStopTimer]);\n\n const startLoading = useCallback(\n (options: LoadingOptions = {}) => {\n clearStopTimer();\n const nextState = normalizeLoadingOptions(options);\n startTimeRef.current = Date.now();\n minDurationRef.current = nextState.minDuration;\n setManualState({\n ...nextState,\n isLoading: true,\n });\n },\n [clearStopTimer],\n );\n\n const stopLoading = useCallback(() => {\n const remaining = calculateRemainingMinDuration(\n startTimeRef.current,\n minDurationRef.current,\n );\n\n if (remaining <= 0) {\n resetState();\n return;\n }\n\n clearStopTimer();\n stopTimerRef.current = setTimeout(resetState, remaining);\n }, [clearStopTimer, resetState]);\n\n const setLoading = useCallback(\n (value: boolean) => {\n if (value) startLoading();\n else stopLoading();\n },\n [startLoading, stopLoading],\n );\n\n const setSkeleton = useCallback((nextSkeleton: SkeletonValue) => {\n setManualState((currentState) => {\n const skeleton =\n typeof nextSkeleton === \"function\"\n ? nextSkeleton(currentState.skeleton)\n : nextSkeleton;\n\n return currentState.skeleton === skeleton\n ? currentState\n : { ...currentState, skeleton };\n });\n }, []);\n\n const withLoading = useCallback(\n async <T,>(\n task: Promise<T> | (() => Promise<T>),\n options: LoadingOptions | string = {},\n ): Promise<T> => {\n startLoading(\n typeof options === \"string\" ? { message: options } : options,\n );\n try {\n return typeof task === \"function\" ? await task() : await task;\n } finally {\n stopLoading();\n }\n },\n [startLoading, stopLoading],\n );\n\n useEffect(() => clearStopTimer, [clearStopTimer]);\n\n const state = useMemo<LoadingStateWithPage>(\n () => resolveLoadingState(manualState, registryLoading),\n [manualState, registryLoading],\n );\n\n const actions = useMemo<LoadingActions>(\n () => ({\n setLoading,\n setSkeleton,\n startLoading,\n stopLoading,\n withLoading,\n }),\n [setLoading, setSkeleton, startLoading, stopLoading, withLoading],\n );\n\n const [store] = useState(() =>\n createStore<LoadingStateWithPage>(state, { freezeSnapshots: false }),\n );\n useIsomorphicLayoutEffect(() => {\n store.publish(state);\n }, [state, store]);\n\n const value = useMemo<LoadingContextValue>(\n () => ({ actions, store }),\n [actions, store],\n );\n\n return <LoadingContext value={value}>{children}</LoadingContext>;\n}\n","\"use client\";\n\nimport { useContext, useMemo } from \"react\";\nimport {\n useIsFullscreenStateActive,\n useRequiredContext,\n useStore,\n} from \"@/hooks\";\nimport {\n useModuleRegistration,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { useModuleTheme } from \"@/theme\";\nimport {\n INERT_LOADING_ACTIONS,\n loadingTheme,\n} from \"./constants\";\nimport {\n LoadingContext,\n NOOP_LOADING_STORE,\n} from \"./context\";\nimport {\n type LoadingActions,\n type LoadingPageConfig,\n type LoadingStateWithPage,\n type LoadingTheme,\n} from \"./types\";\n\nexport function useLoadingRegistration(\n config: LoadingPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"loading\", config, options);\n}\n\nexport function useLoadingState(): LoadingStateWithPage {\n const { store } = useRequiredContext(\n LoadingContext,\n \"useLoadingState\",\n \"LoadingProvider\",\n );\n return useStore(store);\n}\n\nexport function useLoadingActions(): LoadingActions {\n return useRequiredContext(\n LoadingContext,\n \"useLoadingActions\",\n \"LoadingProvider\",\n ).actions;\n}\n\nexport function useLoading(\n config?: LoadingPageConfig | null,\n options?: RegistryMetadata & { enabled?: boolean },\n): LoadingStateWithPage & LoadingActions {\n useLoadingRegistration(config, options);\n\n const actions = useLoadingActions();\n const state = useLoadingState();\n\n return useMemo(() => ({ ...state, ...actions }), [actions, state]);\n}\n\nexport function useOptionalLoadingState(): LoadingStateWithPage;\nexport function useOptionalLoadingState<T>(\n selector: (state: LoadingStateWithPage) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T;\nexport function useOptionalLoadingState<T = LoadingStateWithPage>(\n selector?: (state: LoadingStateWithPage) => T,\n isEqual?: (a: T, b: T) => boolean,\n): T {\n const ctx = useContext(LoadingContext);\n return useStore(\n ctx?.store ?? NOOP_LOADING_STORE,\n selector as (state: LoadingStateWithPage) => T,\n isEqual,\n );\n}\n\nexport function useOptionalLoadingActions(): LoadingActions {\n const ctx = useContext(LoadingContext);\n return ctx?.actions ?? INERT_LOADING_ACTIONS;\n}\n\nexport function useLoadingOverlayModel(): {\n skeleton: React.ReactNode | null;\n isVisible: boolean;\n theme: LoadingTheme;\n} {\n const { isLoading, skeleton, showOverlay } = useLoadingState();\n const isFullscreenStateActive = useIsFullscreenStateActive();\n const isVisible = isLoading && showOverlay && !isFullscreenStateActive;\n\n const theme = useModuleTheme(loadingTheme);\n\n return { skeleton, isVisible, theme };\n}\n","\"use client\";\n\nimport { Spinner } from \"@/atoms\";\nimport { useLoadingOverlayModel } from \"./hooks\";\n\nexport function LoadingOverlay() {\n const { skeleton, isVisible, theme } = useLoadingOverlayModel();\n if (!isVisible) return null;\n return (\n <div\n className={theme.slots.overlay}\n aria-label=\"Loading\"\n aria-busy=\"true\"\n role=\"status\"\n style={theme.styles.overlay}\n >\n {skeleton || <Spinner size={30} />}\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { defineModule, type PageModuleApi } from \"@/kernel\";\nimport { LOADING_REGISTRY_KEY } from \"./constants\";\nimport {\n LoadingContext,\n LoadingProvider,\n} from \"./context\";\nimport {\n useLoading,\n useLoadingActions,\n} from \"./hooks\";\nimport { selectPageLoading } from \"./state\";\nimport { LoadingOverlay } from \"./overlay\";\nimport {\n type DefinedLoading,\n type LoadingOptions,\n type LoadingPageApi,\n type LoadingPageConfig,\n} from \"./types\";\n\nfunction useLoadingPage(\n _slice: LoadingOptions | null,\n page: PageModuleApi,\n): LoadingPageApi {\n const actions = useLoadingActions();\n return useMemo(\n () => ({\n ...actions,\n set: (loading: LoadingPageConfig) => page.set({ loading }),\n }),\n [actions, page],\n );\n}\n\nexport function defineLoading(\n definition: (LoadingOptions & { id?: string }) | string = {},\n): DefinedLoading {\n const { id = \"loading\", ...config }: LoadingOptions & { id?: string } =\n selectPageLoading(definition) ?? {};\n\n return Object.freeze({\n config,\n id,\n use: function useDefinedLoading(overrides = {}, options = {}) {\n return useLoading(\n { ...config, ...selectPageLoading(overrides) },\n options,\n );\n },\n });\n}\n\nexport const loadingModule = defineModule({\n id: \"loading\",\n context: LoadingContext,\n Provider: LoadingProvider,\n Overlay: LoadingOverlay,\n registry: {\n cleanupDelayMs: 600,\n keyPolicy: \"singleton\",\n lifecycle: \"graceful\",\n singletonKey: LOADING_REGISTRY_KEY,\n },\n page: {\n select: (config) => selectPageLoading(config.loading),\n entries: (slice: LoadingOptions) => [\n { key: LOADING_REGISTRY_KEY, value: slice },\n ],\n use: useLoadingPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n loading: typeof loadingModule;\n }\n interface PageConfig {\n loading?: LoadingPageConfig;\n }\n}\n"]}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type DockTransaction, type DockTransactionEvent } from "../types";
|
|
2
|
-
export declare function useDockTransactions({ onTransactionEvent, onTimeout, timeoutMs, }?: {
|
|
3
|
-
onTransactionEvent?: ((event: DockTransactionEvent) => void) | null;
|
|
4
|
-
onTimeout?: ((transaction: DockTransaction) => void) | null;
|
|
5
|
-
timeoutMs?: number;
|
|
6
|
-
}): {
|
|
7
|
-
activeTransaction: DockTransaction | null;
|
|
8
|
-
beginTransaction: ({ from, source, to, }?: {
|
|
9
|
-
from?: string;
|
|
10
|
-
source?: string;
|
|
11
|
-
to?: string;
|
|
12
|
-
}) => DockTransaction;
|
|
13
|
-
cancelActiveTransaction: (reason?: string | null) => boolean;
|
|
14
|
-
cancelTransaction: (id: number, reason?: string | null) => boolean;
|
|
15
|
-
completeTransaction: (id: number) => boolean;
|
|
16
|
-
completeTransactionForPath: (pathname: string) => boolean;
|
|
17
|
-
failTransaction: (id: number, error: unknown) => boolean;
|
|
18
|
-
isTransactionCurrent: (id: number) => boolean;
|
|
19
|
-
lastTransaction: DockTransaction | null;
|
|
20
|
-
};
|
|
21
|
-
//# sourceMappingURL=transactions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../../../src/modules/dock/routing/transactions.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,oBAAoB,EAE1B,MAAM,UAAU,CAAC;AAgFlB,wBAAgB,mBAAmB,CAAC,EAClC,kBAAyB,EACzB,SAAgB,EAChB,SAAuC,GACxC,GAAE;IACD,kBAAkB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,SAAS,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACf;;+CA8DC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE;uCAqDzC,MAAM,GAAG,IAAI;4BALjB,MAAM,WAAU,MAAM,GAAG,IAAI;8BAJ7B,MAAM;2CAsBA,MAAM;0BANZ,MAAM,SAAS,OAAO;+BAgBtB,MAAM;;EAmCd"}
|