@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.
Files changed (101) hide show
  1. package/README.md +4 -1
  2. package/dist/{chunk-XASQT4CQ.js → chunk-66EYJBIP.js} +47 -27
  3. package/dist/chunk-66EYJBIP.js.map +1 -0
  4. package/dist/{chunk-65ZB4QTQ.js → chunk-CYU6SGAL.js} +3 -3
  5. package/dist/{chunk-65ZB4QTQ.js.map → chunk-CYU6SGAL.js.map} +1 -1
  6. package/dist/{chunk-6SG7V77J.js → chunk-HHWRTQKQ.js} +100 -67
  7. package/dist/chunk-HHWRTQKQ.js.map +1 -0
  8. package/dist/chunk-HLL5EHXC.js +485 -0
  9. package/dist/chunk-HLL5EHXC.js.map +1 -0
  10. package/dist/{chunk-3MSK4XGK.js → chunk-JIXBFFRD.js} +258 -405
  11. package/dist/chunk-JIXBFFRD.js.map +1 -0
  12. package/dist/{chunk-KKQT46TP.js → chunk-M57SNWXK.js} +8 -6
  13. package/dist/chunk-M57SNWXK.js.map +1 -0
  14. package/dist/chunk-RIOKLMYM.js +145 -0
  15. package/dist/chunk-RIOKLMYM.js.map +1 -0
  16. package/dist/{chunk-QXR55VVS.js → chunk-TG6NMHXI.js} +241 -162
  17. package/dist/chunk-TG6NMHXI.js.map +1 -0
  18. package/dist/index.js +7 -5
  19. package/dist/modules/ambient/analyze.d.ts +18 -3
  20. package/dist/modules/ambient/analyze.d.ts.map +1 -1
  21. package/dist/modules/ambient/dom.d.ts +14 -1
  22. package/dist/modules/ambient/dom.d.ts.map +1 -1
  23. package/dist/modules/ambient/hooks.d.ts.map +1 -1
  24. package/dist/modules/ambient/index.d.ts +2 -2
  25. package/dist/modules/ambient/index.d.ts.map +1 -1
  26. package/dist/modules/ambient/index.js +1 -1
  27. package/dist/modules/ambient/server/index.d.ts +1 -1
  28. package/dist/modules/ambient/server/index.d.ts.map +1 -1
  29. package/dist/modules/ambient/server/index.js +2 -2
  30. package/dist/modules/ambient/server/index.js.map +1 -1
  31. package/dist/modules/ambient/settings.d.ts +1 -0
  32. package/dist/modules/ambient/settings.d.ts.map +1 -1
  33. package/dist/modules/ambient/types.d.ts +13 -0
  34. package/dist/modules/ambient/types.d.ts.map +1 -1
  35. package/dist/modules/ambient/worker/index.js +1 -1
  36. package/dist/modules/context-menu/index.js +4 -3
  37. package/dist/modules/dock/cards.d.ts +3 -0
  38. package/dist/modules/dock/cards.d.ts.map +1 -1
  39. package/dist/modules/dock/constants.d.ts +1 -20
  40. package/dist/modules/dock/constants.d.ts.map +1 -1
  41. package/dist/modules/dock/index.js +3 -2
  42. package/dist/modules/dock/layout.d.ts.map +1 -1
  43. package/dist/modules/dock/motion.d.ts +6 -0
  44. package/dist/modules/dock/motion.d.ts.map +1 -1
  45. package/dist/modules/dock/overlay.d.ts +1 -1
  46. package/dist/modules/dock/overlay.d.ts.map +1 -1
  47. package/dist/modules/dock/routing/guards.d.ts +1 -1
  48. package/dist/modules/dock/routing/navigation.d.ts +7 -4
  49. package/dist/modules/dock/routing/navigation.d.ts.map +1 -1
  50. package/dist/modules/dock/runtime/display.d.ts +31 -2
  51. package/dist/modules/dock/runtime/display.d.ts.map +1 -1
  52. package/dist/modules/dock/runtime/dock.d.ts +2 -2
  53. package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
  54. package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
  55. package/dist/modules/dock/types.d.ts +9 -27
  56. package/dist/modules/dock/types.d.ts.map +1 -1
  57. package/dist/modules/index.d.ts +3 -2
  58. package/dist/modules/index.d.ts.map +1 -1
  59. package/dist/modules/index.js +7 -5
  60. package/dist/modules/loading/context.d.ts.map +1 -1
  61. package/dist/modules/loading/index.js +1 -1
  62. package/dist/modules/navigation/constants.d.ts +37 -0
  63. package/dist/modules/navigation/constants.d.ts.map +1 -0
  64. package/dist/modules/navigation/context.d.ts +10 -0
  65. package/dist/modules/navigation/context.d.ts.map +1 -0
  66. package/dist/modules/navigation/hooks.d.ts +29 -0
  67. package/dist/modules/navigation/hooks.d.ts.map +1 -0
  68. package/dist/modules/navigation/index.d.ts +10 -0
  69. package/dist/modules/navigation/index.d.ts.map +1 -0
  70. package/dist/modules/navigation/index.js +81 -0
  71. package/dist/modules/navigation/index.js.map +1 -0
  72. package/dist/modules/navigation/listeners.d.ts +15 -0
  73. package/dist/modules/navigation/listeners.d.ts.map +1 -0
  74. package/dist/modules/navigation/module.d.ts +25 -0
  75. package/dist/modules/navigation/module.d.ts.map +1 -0
  76. package/dist/modules/navigation/navigator.d.ts +8 -0
  77. package/dist/modules/navigation/navigator.d.ts.map +1 -0
  78. package/dist/modules/navigation/settings.d.ts +10 -0
  79. package/dist/modules/navigation/settings.d.ts.map +1 -0
  80. package/dist/modules/navigation/state.d.ts +20 -0
  81. package/dist/modules/navigation/state.d.ts.map +1 -0
  82. package/dist/modules/navigation/types.d.ts +168 -0
  83. package/dist/modules/navigation/types.d.ts.map +1 -0
  84. package/dist/modules/navigation/utils.d.ts +11 -0
  85. package/dist/modules/navigation/utils.d.ts.map +1 -0
  86. package/docs/getting-started.md +2 -0
  87. package/docs/modules/README.md +5 -1
  88. package/docs/modules/ambient.md +9 -6
  89. package/docs/modules/dock.md +13 -11
  90. package/docs/modules/loading.md +2 -2
  91. package/docs/modules/navigation.md +216 -0
  92. package/docs/proposals/navigation.md +209 -0
  93. package/package.json +6 -1
  94. package/templates/AGENTS.md +2 -0
  95. package/dist/chunk-3MSK4XGK.js.map +0 -1
  96. package/dist/chunk-6SG7V77J.js.map +0 -1
  97. package/dist/chunk-KKQT46TP.js.map +0 -1
  98. package/dist/chunk-QXR55VVS.js.map +0 -1
  99. package/dist/chunk-XASQT4CQ.js.map +0 -1
  100. package/dist/modules/dock/routing/transactions.d.ts +0 -21
  101. package/dist/modules/dock/routing/transactions.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/ambient/context.tsx","../src/modules/ambient/constants.ts","../src/modules/ambient/settings.ts","../src/modules/ambient/oklab.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","layer","useState","palette","scope","useMemo"],"mappings":"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","file":"chunk-TG6NMHXI.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 {\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\nexport const DEFAULT_LINGER_MS = 3_000;\n\nconst createDefaults = (): AmbientSettings => ({\n analysis: { ...DEFAULT_ANALYSIS },\n cacheLimit: 100,\n cssVars: { ...DEFAULT_CSS_VAR_NAMES, tones: AMBIENT_TONES },\n linger: DEFAULT_LINGER_MS,\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 linger: input.linger ?? base.linger,\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","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","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/**\n * Bumped whenever the same pixels would give a different palette. Put it in\n * the key of any palette cache that outlives a deploy (`unstable_cache`, a\n * database), so stored palettes are computed again.\n */\nexport const AMBIENT_ANALYSIS_VERSION = 2;\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\n/**\n * How much a colour looks like skin, hair, wood or a tungsten-lit wall: the\n * warm, low-chroma band most film frames are full of. It is what a frame\n * shows, rarely its mood.\n */\nexport function skinLikeness({ c, h, l }: OklchColor): number {\n return (\n (1 - smoothstep(12, 26, hueDistance(h, 54))) *\n smoothstep(0.02, 0.035, c) *\n (1 - smoothstep(0.11, 0.15, c)) *\n smoothstep(0.26, 0.38, l) *\n (1 - smoothstep(0.88, 0.95, l))\n );\n}\n\n// Reds and oranges read louder than blues or greens at the same chroma\n// (Helmholtz–Kohlrausch), so they are given less of it.\nconst warmth = (h: number) => 1 - smoothstep(22, 50, hueDistance(h, 42));\n\n// Weight of a colour in the role and region picks: skin still counts, less.\nconst salience = (color: OklchColor) => 1 - 0.65 * skinLikeness(color);\n\ninterface ChromaSpec {\n cap: number;\n gain: number;\n}\n\n/**\n * The chroma a role carries: its source's own, raised by `gain`, held back\n * for skin and warm hues, never above `cap`. Chroma, not a share of the\n * gamut: at mid lightness orange has twice the room teal has, so carrying\n * the share would turn a pale face into a loud orange.\n */\nconst roleChroma = (source: OklchColor, { cap, gain }: ChromaSpec) =>\n Math.min(\n cap * (1 - 0.3 * warmth(source.h)),\n // A faint tint is raised further, so it still reads as a colour.\n Math.max(source.c * gain, Math.min(0.05, source.c * 1.6)) *\n (1 - 0.3 * skinLikeness(source)),\n );\n\n/** `c` at hue `h` and lightness `l`, inside sRGB. */\nconst fitTone = (h: number, l: number, c: number): OklchColor => ({\n c: Math.max(0, Math.min(c, maxChroma(l, h) * 0.96)),\n h,\n l,\n});\n\nfunction buildSwatch(\n tone: OklchColor,\n population: number,\n fromImage: boolean,\n minContrast: number,\n): AmbientSwatch {\n // The ramp keeps the swatch's share of the gamut, so its dark tones stay\n // hued instead of collapsing to grey.\n const room = maxChroma(tone.l, tone.h) * 0.96;\n const rel = room > 0 ? tone.c / room : 0;\n const ramp = {} as AmbientRamp;\n for (const step of AMBIENT_TONES) {\n ramp[step] = formatOklch(toneOf(tone.h, step / 100, rel, Math.max(tone.c, 0.04)));\n }\n return {\n c: round3(tone.c),\n color: formatOklch(tone),\n fromImage,\n h: Math.round(tone.h * 10) / 10,\n l: round3(tone.l),\n on: formatOklch(onColorFor(tone, minContrast)),\n population: round3(population),\n ramp,\n };\n}\n\ninterface RoleSpec extends ChromaSpec {\n max: number;\n min: number;\n}\n\n/** A role's tone from its source cluster, or `fallback` when there is none. */\nfunction roleTone(\n source: Cluster | null,\n spec: RoleSpec,\n fallback: OklchColor,\n dilution = 1,\n): OklchColor {\n if (!source) return fitTone(fallback.h, clamp(fallback.l, spec.min, spec.max), fallback.c);\n return fitTone(\n source.h,\n clamp(source.l, spec.min, spec.max),\n roleChroma(source, spec) * dilution,\n );\n}\n\nexport interface AmbientClustering {\n clusters: Cluster[];\n /** Centre-weighted mean lightness. */\n meanL: number;\n /** Per region, the OKLab sum (`L, a, b` per cluster) of each cluster's pixels. */\n regionLab: Float64Array[];\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, k } = kmeans(points, weights, budgets[group]);\n // A cluster's colour is the plain mean of its pixels: the vivid pull that\n // shaped the clusters would tint a face toward the red title beside it.\n const sums = new Float64Array(k * 4);\n members.forEach((bin, i) => {\n for (let channel = 0; channel < 4; channel++) {\n sums[assignment[i] * 4 + channel] += binSums[bin * 4 + channel];\n }\n });\n const index = new Int32Array(k).fill(-1);\n for (let j = 0; j < k; j++) {\n const pop = sums[j * 4 + 3];\n if (pop <= 0) continue;\n const lch = labToLch([sums[j * 4] / pop, sums[j * 4 + 1] / pop, sums[j * 4 + 2] / pop]);\n const room = maxChroma(lch.l, lch.h);\n index[j] = clusters.length;\n clusters.push({\n ...lch,\n pop: pop / 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, and the OKLab sum of each cluster's pixels\n // in each region: a cluster spanning the frame looks different in parts.\n const regionWeights = AMBIENT_REGIONS.map(() => new Float64Array(clusters.length));\n const regionLab = AMBIENT_REGIONS.map(() => new Float64Array(clusters.length * 3));\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 const w = binSums[bin * 4 + 3];\n AMBIENT_REGIONS.forEach((region, r) => {\n if (!(bits & REGION_BITS[region])) return;\n regionWeights[r][cluster] += 1;\n for (let channel = 0; channel < 3; channel++) {\n regionLab[r][cluster * 3 + channel] += binSums[bin * 4 + channel] / w;\n }\n });\n }\n\n return { clusters, meanL, regionLab, regionWeights };\n}\n\n/**\n * The palette of an image: OKLab k-means clusters scored by population ×\n * chroma (skin tones counted less), turned into four roles (each with a tonal\n * ramp and a contrast-safe text colour), five region colours, and the deep\n * `shadow` tone. Roles keep about their source's chroma rather than its share\n * of the gamut, so warm hues are not inflated.\n */\nexport function analyzeAmbientPixels(\n pixels: AmbientPixels,\n overrides: Partial<AmbientAnalysisOptions> = {},\n): AmbientPalette {\n const options = { ...DEFAULT_ANALYSIS, ...overrides };\n const { clusters, meanL, regionLab, 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 = { c: 0, 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\n const dominantPick = neutral\n ? null\n : pickBest(\n chromatic,\n (cluster) => share(cluster) * cluster.c * cluster.rely * salience(cluster),\n );\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 *\n cluster.c *\n Math.pow(share(cluster), 0.3) *\n cluster.rely *\n salience(cluster),\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) =>\n Math.pow(share(cluster), 0.6) * cluster.c * cluster.rely * salience(cluster),\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 accentSource = accentPick ?? vividPick;\n const roles: Record<AmbientRole, AmbientSwatch> = {\n dominant: buildSwatch(\n roleTone(dominantPick, { cap: 0.2, gain: 1.15, max: 0.74, min: 0.42 }, grey),\n dominantPick ? share(dominantPick) : 0,\n true,\n minContrast,\n ),\n vibrant: buildSwatch(\n roleTone(\n vividPick,\n { cap: 0.22, gain: 1.35, max: 0.84, min: 0.62 },\n { c: 0, h: dominantHue, l: 0.78 },\n dilution,\n ),\n vividPick ? share(vividPick) : 0,\n true,\n minContrast,\n ),\n muted: buildSwatch(\n roleTone(\n mutedPick,\n { cap: 0.07, gain: 1, max: 0.66, min: 0.38 },\n { c: dominantPick ? 0.035 : 0, h: dominantHue, l: clamp(meanL, 0.38, 0.66) },\n ),\n mutedPick ? share(mutedPick) : 0,\n Boolean(mutedPick) || neutral,\n minContrast,\n ),\n accent: buildSwatch(\n roleTone(\n accentSource,\n { cap: 0.22, gain: 1.3, max: 0.8, min: 0.55 },\n { c: 0, h: dominantHue, l: 0.72 },\n dilution,\n ),\n accentSource ? share(accentSource) : 0,\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, clamp(0.3 + 0.7 * deepSource.rel, 0, 0.85), 0.1)\n : { c: 0, h: 0, l: shadowL };\n\n // 6. Regions: the most telling colour in each part of the frame, as that\n // part shows it (a cluster's own pixels there, not its frame-wide mean).\n const regions = {} as Record<AmbientRegion, AmbientRegionColor>;\n AMBIENT_REGIONS.forEach((region, r) => {\n const weights = regionWeights[r];\n const lab = regionLab[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 let strength = 0;\n let pick: OklchColor | null = null;\n let pickScore = 0;\n clusters.forEach((_, j) => {\n const count = weights[j];\n if (count <= 0) return;\n const local = labToLch([lab[j * 3] / count, lab[j * 3 + 1] / count, lab[j * 3 + 2] / count]);\n const rely = reliability(local.l);\n if (local.c < MIN_CHROMA || rely <= 0) return;\n const part = count / regionTotal;\n strength += part * colorfulness(local.c) * rely;\n const score = part * local.c * rely * salience(local);\n if (score > pickScore) {\n pickScore = score;\n pick = local;\n }\n });\n const chosen = neutral || strength < MIN_PRESENCE ? null : (pick as OklchColor | null);\n const tone = chosen\n ? fitTone(\n chosen.h,\n clamp(chosen.l, 0.42, 0.72),\n roleChroma(chosen, { cap: 0.18, gain: 1.15 }),\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\ninterface InlineValue {\n priority: string;\n value: string;\n}\n\ninterface VariableLayer {\n vars: Record<string, string>;\n /** Set while the layer lingers after its owner let go. */\n leaving: ReturnType<typeof setTimeout> | null;\n}\n\ninterface ElementLayers {\n /** Each variable's inline value before any layer touched it. */\n base: Map<string, InlineValue>;\n /** Oldest first; a later layer wins a variable both define. */\n layers: VariableLayer[];\n}\n\nconst layersOf = new WeakMap<HTMLElement, ElementLayers>();\n\nfunction paint(element: HTMLElement, state: ElementLayers, names: Iterable<string>) {\n for (const name of names) {\n let value: string | undefined;\n for (let i = state.layers.length - 1; i >= 0 && value === undefined; i--) {\n value = state.layers[i].vars[name];\n }\n if (value !== undefined) {\n element.style.setProperty(name, value);\n continue;\n }\n const base = state.base.get(name);\n if (base?.value) element.style.setProperty(name, base.value, base.priority);\n else element.style.removeProperty(name);\n }\n}\n\nfunction removeLayer(element: HTMLElement, state: ElementLayers, layer: VariableLayer) {\n const index = state.layers.indexOf(layer);\n if (index < 0) return;\n if (layer.leaving) clearTimeout(layer.leaving);\n state.layers.splice(index, 1);\n paint(element, state, Object.keys(layer.vars));\n if (state.layers.length === 0) layersOf.delete(element);\n}\n\nexport interface ScopedCssVariableOptions {\n /**\n * How long (ms) the variables stay after the returned function is called,\n * unless another call on the same element takes over first. Bridges the\n * gap between one page's theme and the next (a loading boundary between).\n */\n linger?: number;\n}\n\n/**\n * Sets custom properties on `element`; the returned function takes them off\n * again, restoring the inline values from before. Calls stack: the latest\n * wins each variable, and taking one off reveals what lies beneath it.\n */\nexport function applyScopedCssVariables(\n element: HTMLElement,\n varMap: Record<string, string>,\n { linger = 0 }: ScopedCssVariableOptions = {},\n): () => void {\n const vars: Record<string, string> = {};\n for (const [name, value] of Object.entries(varMap)) {\n if (name && value) vars[name] = value;\n }\n let state = layersOf.get(element);\n if (!state) {\n state = { base: new Map(), layers: [] };\n layersOf.set(element, state);\n }\n // A new theme takes over from any that was only lingering.\n for (const layer of state.layers.filter((layer) => layer.leaving)) {\n removeLayer(element, state, layer);\n }\n if (!layersOf.has(element)) layersOf.set(element, state);\n for (const name of Object.keys(vars)) {\n if (state.base.has(name)) continue;\n state.base.set(name, {\n priority: element.style.getPropertyPriority(name),\n value: element.style.getPropertyValue(name),\n });\n }\n const layer: VariableLayer = { leaving: null, vars };\n state.layers.push(layer);\n paint(element, state, Object.keys(vars));\n\n const owner = state;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n if (linger > 0 && element.isConnected) {\n layer.leaving = setTimeout(() => removeLayer(element, owner, layer), linger);\n } else {\n removeLayer(element, owner, layer);\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 { getAmbientSettings } from \"./settings\";\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 linger,\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 linger: linger ?? (scope ? 0 : getAmbientSettings().linger),\n });\n\n return () => {\n restoreVariables();\n if (transition && scope) {\n targetEl.classList.remove(...transitionKey.split(\" \").filter(Boolean));\n }\n };\n }, [linger, 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"]}
package/dist/index.js CHANGED
@@ -1,18 +1,20 @@
1
1
  "use client";
2
2
  export { CoreProvider } from './chunk-K676GL7Z.js';
3
3
  export { ComponentError, DEFAULT_DEDUPE_WINDOW, ERROR_LISTENER_CONFIG, ERROR_MESSAGES, ErrorBoundaryCore, GlobalError, GlobalErrorListener, MAX_CONTEXT, MAX_FINGERPRINTS, ModuleError, createConsoleHandler, createErrorContext, createReport, createSentryHandler, errorTheme, fingerprint, getBrowserEnvironment, getErrorMessage, getErrorReporter, getRuntimePath, getUserAgent, normalizeDedupeWindow, normalizeSampleRate, shouldIgnoreError } from './chunk-JELG4JLT.js';
4
- export { defaultModules } from './chunk-KKQT46TP.js';
4
+ export { defaultModules } from './chunk-M57SNWXK.js';
5
+ export { navigationModule } from './chunk-RIOKLMYM.js';
5
6
  export { modalModule } from './chunk-FIMPHODX.js';
6
7
  import './chunk-7HQMXTNP.js';
7
- export { ambientModule } from './chunk-QXR55VVS.js';
8
+ export { ambientModule } from './chunk-TG6NMHXI.js';
8
9
  export { backgroundModule } from './chunk-CGHZSSFR.js';
9
- export { contextMenuModule } from './chunk-65ZB4QTQ.js';
10
- export { dockModule } from './chunk-3MSK4XGK.js';
10
+ export { contextMenuModule } from './chunk-CYU6SGAL.js';
11
+ export { dockModule } from './chunk-JIXBFFRD.js';
12
+ import './chunk-HLL5EHXC.js';
11
13
  export { ACTION_TONE_CLASS, SURFACE_CLASSES, Z_INDEX } from './chunk-QI3ALLIB.js';
12
14
  export { createSafeAction, err, isErr, isOk, isResult, map, mapErr, match, notificationModule, ok, tryCatch, unwrap, unwrapOr } from './chunk-SYAVGTOX.js';
13
15
  export { mediaModule } from './chunk-R2YGFJDJ.js';
14
16
  export { controlsModule } from './chunk-4GMQKD6F.js';
15
- export { loadingModule } from './chunk-XASQT4CQ.js';
17
+ export { loadingModule } from './chunk-66EYJBIP.js';
16
18
  export { ModuleMotionConfig, REDUCED_MOTION_TRANSITION, ThemeProvider, chip, contentSwap, contentSwapTransitions, cssEasing, cssTransition, defineMotion, defineTheme, defineThemeSpec, durationForDistance, gpuTransform, overlaySurface, press, retime, retimeModuleMotion, staggerDelay, surfaceResizeTransition, useModuleMotion, useTheme as useModuleTheme, useMotionTokens, useOptionalModuleMotion, useTheme } from './chunk-7TAVYJ3A.js';
17
19
  export { Compose, ModuleBoundary, ModuleHost, PageControllerProvider, REGISTRY_SOURCES, RegistryProvider, applyRegistryConfig, createModuleRegistryDefinitions, createRegistryApplyContext, createRegistryOperations, createRegistryStore, defineModule, definePeer, getOrCreateGlobalContext, hasOwnProperty, sortModules, useIsModuleInstalled, useModule, useModuleRegistration, useModuleState, usePage, usePageController, useRegistryEntries, useRegistryValue } from './chunk-GF7TUX5I.js';
18
20
  export { EVENT_TYPES, EventEmitter, USER_MESSAGES, UserError, acquireGlobalScrollLock, clamp, cn, createScheduler, createStore, debounce, getCurrentPath, getSiteUrl, globalEvents, isBrowser, isImageIconSource, isObject, isPlainObject, normalizePath, report, setReportSink, shallowEqual, stripTrailingSlash, throttle, toArray, toFiniteNumber, toUserMessage, trimToNull, useClickOutside, useControllableState, useEscapeKey, useGlobalEvent, useHotkey, useIsFullscreenStateActive, useIsomorphicLayoutEffect, useRequiredContext, useStore } from './chunk-TV3WEF5G.js';
@@ -1,4 +1,10 @@
1
1
  import type { AmbientAnalysisOptions, AmbientPalette, AmbientPixels, OklchColor } from "./types";
2
+ /**
3
+ * Bumped whenever the same pixels would give a different palette. Put it in
4
+ * the key of any palette cache that outlives a deploy (`unstable_cache`, a
5
+ * database), so stored palettes are computed again.
6
+ */
7
+ export declare const AMBIENT_ANALYSIS_VERSION = 2;
2
8
  export interface Cluster extends OklchColor {
3
9
  /** Share of the (centre-weighted) image. */
4
10
  pop: number;
@@ -18,10 +24,18 @@ interface Bounds {
18
24
  * that are uniformly near-black. At most 22% of each side is cut.
19
25
  */
20
26
  export declare function findContentBounds({ data, height, width }: AmbientPixels): Bounds;
27
+ /**
28
+ * How much a colour looks like skin, hair, wood or a tungsten-lit wall: the
29
+ * warm, low-chroma band most film frames are full of. It is what a frame
30
+ * shows, rarely its mood.
31
+ */
32
+ export declare function skinLikeness({ c, h, l }: OklchColor): number;
21
33
  export interface AmbientClustering {
22
34
  clusters: Cluster[];
23
35
  /** Centre-weighted mean lightness. */
24
36
  meanL: number;
37
+ /** Per region, the OKLab sum (`L, a, b` per cluster) of each cluster's pixels. */
38
+ regionLab: Float64Array[];
25
39
  /** Per region, the pixel count of each cluster. */
26
40
  regionWeights: Float64Array[];
27
41
  }
@@ -32,9 +46,10 @@ export interface AmbientClustering {
32
46
  export declare function clusterAmbientPixels(pixels: AmbientPixels, options: AmbientAnalysisOptions): AmbientClustering;
33
47
  /**
34
48
  * The palette of an image: OKLab k-means clusters scored by population ×
35
- * chroma, turned into four roles (each with a gamut-aware tonal ramp and a
36
- * contrast-safe text colour), five region colours, and the deep `shadow`
37
- * tone.
49
+ * chroma (skin tones counted less), turned into four roles (each with a tonal
50
+ * ramp and a contrast-safe text colour), five region colours, and the deep
51
+ * `shadow` tone. Roles keep about their source's chroma rather than its share
52
+ * of the gamut, so warm hues are not inflated.
38
53
  */
39
54
  export declare function analyzeAmbientPixels(pixels: AmbientPixels, overrides?: Partial<AmbientAnalysisOptions>): AmbientPalette;
40
55
  /** Width and height that fit `width × height` inside `size` on the long side. */
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/analyze.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EAMb,UAAU,EACX,MAAM,SAAS,CAAC;AAiBjB,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,MAAM,CAgChF;AA8DD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAgInB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAC9C,cAAc,CA6LhB;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;EAMpE"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/analyze.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EAMb,UAAU,EACX,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAiB1C,MAAM,WAAW,OAAQ,SAAQ,UAAU;IACzC,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,MAAM;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAKD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,MAAM,CAgChF;AAyBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAQ5D;AAiFD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,mDAAmD;IACnD,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CA8InB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,OAAO,CAAC,sBAAsB,CAAM,GAC9C,cAAc,CAyLhB;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;EAMpE"}
@@ -6,7 +6,20 @@ export declare function resolveCssVarNames(overrides?: AmbientCssVarConfig | nul
6
6
  export declare function resolveTargetElement(target: AmbientTarget): HTMLElement | null;
7
7
  /** `colors` keys are custom property names; a bare name gets `--color-`. */
8
8
  export declare function normalizeColorMap(colors: Record<string, string>): Record<string, string>;
9
- export declare function applyScopedCssVariables(element: HTMLElement, varMap: Record<string, string>): () => void;
9
+ export interface ScopedCssVariableOptions {
10
+ /**
11
+ * How long (ms) the variables stay after the returned function is called,
12
+ * unless another call on the same element takes over first. Bridges the
13
+ * gap between one page's theme and the next (a loading boundary between).
14
+ */
15
+ linger?: number;
16
+ }
17
+ /**
18
+ * Sets custom properties on `element`; the returned function takes them off
19
+ * again, restoring the inline values from before. Calls stack: the latest
20
+ * wins each variable, and taking one off reveals what lies beneath it.
21
+ */
22
+ export declare function applyScopedCssVariables(element: HTMLElement, varMap: Record<string, string>, { linger }?: ScopedCssVariableOptions): () => void;
10
23
  /** Every variable a palette writes: shadow, roles, `on` colours, ramps, regions. */
11
24
  export declare function paletteVarMap(palette: AmbientPalette | null | undefined, names?: ResolvedCssVars): Record<string, string>;
12
25
  export declare function resolveAmbientVarMap({ colors, cssVars, image, palette, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/dom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG;IACjD,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAAC;CACvC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,GACrC,eAAe,CAGjB;AAOD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,GACpB,WAAW,GAAG,IAAI,CAOpB;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,IAAI,CAiBZ;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EAC1C,KAAK,GAAE,eAAsC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,MAAa,EACb,OAAc,EACd,KAAY,EACZ,OAAc,GACf,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMzB"}
1
+ {"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/dom.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG;IACjD,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAAC;CACvC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,GACrC,eAAe,CAGjB;AAOD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,GACpB,WAAW,GAAG,IAAI,CAOpB;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB;AA+CD,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,EAAE,MAAU,EAAE,GAAE,wBAA6B,GAC5C,MAAM,IAAI,CAqCZ;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EAC1C,KAAK,GAAE,eAAsC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,MAAa,EACb,OAAc,EACd,KAAY,EACZ,OAAc,GACf,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;CACjC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/hooks.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAMhF;AAED,wBAAgB,eAAe,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,OAAO,GAAE,qBAAqB,GAAG,IAAW,GAC3C;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CA6C3D;AAED,wBAAgB,eAAe,CAC7B,MAAM,GAAE,aAAa,GAAG,MAAM,GAAG,IAAW,GAC3C,YAAY,CAgFd;AAED,wBAAgB,UAAU,CACxB,aAAa,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,GAC5C,mBAAmB,CAqBrB"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/hooks.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAMhF;AAED,wBAAgB,eAAe,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,OAAO,GAAE,qBAAqB,GAAG,IAAW,GAC3C;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE,CA6C3D;AAED,wBAAgB,eAAe,CAC7B,MAAM,GAAE,aAAa,GAAG,MAAM,GAAG,IAAW,GAC3C,YAAY,CAmFd;AAED,wBAAgB,UAAU,CACxB,aAAa,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,GAC5C,mBAAmB,CAqBrB"}
@@ -1,7 +1,7 @@
1
1
  export { ambientTheme } from "./constants";
2
- export { AMBIENT_REGIONS, AMBIENT_ROLES, AMBIENT_TONES, DEFAULT_ANALYSIS, DEFAULT_CSS_VAR_NAMES, configureAmbient, getAmbientSettings, } from "./settings";
2
+ export { AMBIENT_REGIONS, AMBIENT_ROLES, AMBIENT_TONES, DEFAULT_ANALYSIS, DEFAULT_CSS_VAR_NAMES, DEFAULT_LINGER_MS, configureAmbient, getAmbientSettings, } from "./settings";
3
3
  export { contrastRatio, formatOklch, maxChroma, onColorFor, srgbToOklab, toneOf, } from "./oklab";
4
- export { analyzeAmbientPixels, findContentBounds } from "./analyze";
4
+ export { AMBIENT_ANALYSIS_VERSION, analyzeAmbientPixels, findContentBounds, skinLikeness, } from "./analyze";
5
5
  export { extractPaletteFromImage, getCachedAmbientPalette, primeAmbientPalette, } from "./extractor";
6
6
  export { applyScopedCssVariables, normalizeColorMap, paletteVarMap, resolveAmbientVarMap, resolveCssVarNames, resolveTargetElement, } from "./dom";
7
7
  export { ambientModule, defineAmbient, resolvePageAmbientTheme, } from "./module";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,MAAM,GACP,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEpE,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,mBAAmB,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/ambient/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,MAAM,GACP,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,OAAO,CAAC;AAEf,OAAO,EACL,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,UAAU,EACV,eAAe,EACf,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,mBAAmB,SAAS,CAAC"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { AMBIENT_REGIONS, AMBIENT_ROLES, AMBIENT_TONES, AmbientContext, AmbientProvider, DEFAULT_ANALYSIS, DEFAULT_CSS_VAR_NAMES, ambientModule, ambientTheme, analyzeAmbientPixels, applyScopedCssVariables, configureAmbient, contrastRatio, defineAmbient, extractPaletteFromImage, findContentBounds, formatOklch, getAmbientSettings, getCachedAmbientPalette, maxChroma, normalizeColorMap, onColorFor, paletteVarMap, primeAmbientPalette, resolveAmbientVarMap, resolveCssVarNames, resolvePageAmbientTheme, resolveTargetElement, srgbToOklab, toneOf, useAmbient, useAmbientColor, useAmbientTheme } from '../../chunk-QXR55VVS.js';
2
+ export { AMBIENT_ANALYSIS_VERSION, AMBIENT_REGIONS, AMBIENT_ROLES, AMBIENT_TONES, AmbientContext, AmbientProvider, DEFAULT_ANALYSIS, DEFAULT_CSS_VAR_NAMES, DEFAULT_LINGER_MS, ambientModule, ambientTheme, analyzeAmbientPixels, applyScopedCssVariables, configureAmbient, contrastRatio, defineAmbient, extractPaletteFromImage, findContentBounds, formatOklch, getAmbientSettings, getCachedAmbientPalette, maxChroma, normalizeColorMap, onColorFor, paletteVarMap, primeAmbientPalette, resolveAmbientVarMap, resolveCssVarNames, resolvePageAmbientTheme, resolveTargetElement, skinLikeness, srgbToOklab, toneOf, useAmbient, useAmbientColor, useAmbientTheme } from '../../chunk-TG6NMHXI.js';
3
3
  import '../../chunk-CGHZSSFR.js';
4
4
  import '../../chunk-R2YGFJDJ.js';
5
5
  import '../../chunk-7TAVYJ3A.js';
@@ -1,5 +1,5 @@
1
1
  import type { AmbientAnalysisOptions, AmbientPalette, AmbientPixels } from "../types";
2
- export { analyzeAmbientPixels, findContentBounds, fitSample } from "../analyze";
2
+ export { AMBIENT_ANALYSIS_VERSION, analyzeAmbientPixels, findContentBounds, fitSample, } from "../analyze";
3
3
  export { isPrivateAddress, isPrivateHostname } from "./address";
4
4
  export { configureAmbient, getAmbientSettings } from "../settings";
5
5
  export { contrastRatio, formatOklch, maxChroma, onColorFor, srgbToOklab, toneOf, } from "../oklab";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/ambient/server/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACd,MAAM,UAAU,CAAC;AAMlB,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,MAAM,GACP,MAAM,UAAU,CAAC;AAClB,mBAAmB,UAAU,CAAC;AAE9B,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3C,qEAAqE;IACrE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;IAC9B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,mEAAmE;IACnE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAOlD;AAqCD,2FAA2F;AAC3F,qBAAa,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,SAAgC;CAC9C;AAkBD,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,cAS1B,CAAC;AA6BF,sFAAsF;AACtF,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,QAAQ,CAAM,GAC9D,OAAO,CAAC,cAAc,CAAC,CAIzB;AAoDD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgChC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/ambient/server/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,aAAa,EACd,MAAM,UAAU,CAAC;AAMlB,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,UAAU,EACV,WAAW,EACX,MAAM,GACP,MAAM,UAAU,CAAC;AAClB,mBAAmB,UAAU,CAAC;AAE9B,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC3C,qEAAqE;IACrE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC;IAC9B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,mEAAmE;IACnE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAOlD;AAqCD,2FAA2F;AAC3F,qBAAa,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,SAAgC;CAC9C;AAkBD,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,cAS1B,CAAC;AA6BF,sFAAsF;AACtF,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,QAAQ,CAAM,GAC9D,OAAO,CAAC,cAAc,CAAC,CAIzB;AAoDD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgChC"}
@@ -1,5 +1,5 @@
1
- import { resolveAnalysis, analyzeAmbientPixels } from '../../../chunk-6SG7V77J.js';
2
- export { analyzeAmbientPixels, configureAmbient, contrastRatio, findContentBounds, fitSample, formatOklch, getAmbientSettings, maxChroma, onColorFor, srgbToOklab, toneOf } from '../../../chunk-6SG7V77J.js';
1
+ import { resolveAnalysis, analyzeAmbientPixels } from '../../../chunk-HHWRTQKQ.js';
2
+ export { AMBIENT_ANALYSIS_VERSION, analyzeAmbientPixels, configureAmbient, contrastRatio, findContentBounds, fitSample, formatOklch, getAmbientSettings, maxChroma, onColorFor, srgbToOklab, toneOf } from '../../../chunk-HHWRTQKQ.js';
3
3
 
4
4
  // src/modules/ambient/server/address.ts
5
5
  var PRIVATE_NAMES = /(^|\.)(localhost|local|internal|intranet|lan|home\.arpa|localdomain)$/;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/ambient/server/address.ts","../../../../src/modules/ambient/server/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Which hosts and addresses the server entry refuses to fetch from: anything\n// that is not plainly on the public internet.\n\nconst PRIVATE_NAMES = /(^|\\.)(localhost|local|internal|intranet|lan|home\\.arpa|localdomain)$/;\n\n/** Lower-cased, without the trailing dot(s) and IPv6 brackets. */\nexport function normalizeHost(hostname: string): string {\n return hostname.toLowerCase().replace(/\\.+$/, \"\").replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction parseIPv4(value: string): number[] | null {\n const parts = value.split(\".\");\n if (parts.length !== 4) return null;\n const bytes = parts.map((part) => (/^\\d{1,3}$/.test(part) ? Number(part) : NaN));\n return bytes.every((byte) => byte >= 0 && byte <= 255) ? bytes : null;\n}\n\nfunction isPrivateIPv4([a, b, c]: number[]): boolean {\n return (\n a === 0 || // \"this network\"\n a === 10 ||\n a === 127 ||\n (a === 100 && b >= 64 && b <= 127) || // CGNAT\n (a === 169 && b === 254) || // link-local, cloud metadata\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 192 && b === 0 && c === 0) || // IETF protocol assignments\n (a === 198 && (b === 18 || b === 19)) || // benchmarking\n a >= 224 // multicast, reserved, broadcast\n );\n}\n\n/** Eight 16-bit groups, or `null` when `value` is not an IPv6 address. */\nfunction parseIPv6(value: string): number[] | null {\n let text = value.split(\"%\")[0]; // zone id\n const tail = text.match(/^(.*:)(\\d+\\.\\d+\\.\\d+\\.\\d+)$/);\n if (tail) {\n const v4 = parseIPv4(tail[2]);\n if (!v4) return null;\n text = `${tail[1]}${((v4[0] << 8) | v4[1]).toString(16)}:${((v4[2] << 8) | v4[3]).toString(16)}`;\n }\n const halves = text.split(\"::\");\n if (halves.length > 2) return null;\n const read = (part: string) => (part ? part.split(\":\") : []);\n const head = read(halves[0]);\n const rest = halves.length === 2 ? read(halves[1]) : [];\n const missing = 8 - head.length - rest.length;\n if (halves.length === 1 ? missing !== 0 : missing < 1) return null;\n const groups = [...head, ...Array(halves.length === 2 ? missing : 0).fill(\"0\"), ...rest];\n const words = groups.map((group) => (/^[0-9a-f]{1,4}$/.test(group) ? parseInt(group, 16) : NaN));\n return words.length === 8 && words.every((word) => word >= 0) ? words : null;\n}\n\nfunction isPrivateIPv6(words: number[]): boolean {\n const [w0, w1, w2, w3, w4, w5, w6, w7] = words;\n const embedded = () => [w6 >> 8, w6 & 255, w7 >> 8, w7 & 255];\n if (words.slice(0, 7).every((word) => word === 0)) return w7 <= 1; // :: and ::1\n // IPv4-mapped (::ffff:a.b.c.d), IPv4-compatible (::a.b.c.d), NAT64 (64:ff9b::a.b.c.d)\n if (w0 === 0 && w1 === 0 && w2 === 0 && w3 === 0 && w4 === 0 && (w5 === 0xffff || w5 === 0)) {\n return isPrivateIPv4(embedded());\n }\n if (w0 === 0x64 && w1 === 0xff9b) return isPrivateIPv4(embedded());\n if (w0 === 0x2002) return isPrivateIPv4([w1 >> 8, w1 & 255, w2 >> 8, w2 & 255]); // 6to4\n return (\n (w0 & 0xfe00) === 0xfc00 || // unique local\n (w0 & 0xffc0) === 0xfe80 || // link-local\n (w0 & 0xff00) === 0xff00 || // multicast\n (w0 === 0x2001 && w1 === 0xdb8) // documentation\n );\n}\n\n/** `true` for loopback, private, link-local, CGNAT, multicast and reserved IPs. */\nexport function isPrivateAddress(address: string): boolean {\n const host = normalizeHost(address);\n const v4 = parseIPv4(host);\n if (v4) return isPrivateIPv4(v4);\n const v6 = parseIPv6(host);\n return v6 ? isPrivateIPv6(v6) : false;\n}\n\nexport const isIpLiteral = (hostname: string) => {\n const host = normalizeHost(hostname);\n return parseIPv4(host) !== null || parseIPv6(host) !== null;\n};\n\n/** A host name that only means something on a private network. */\nexport function isPrivateHostname(hostname: string): boolean {\n const host = normalizeHost(hostname);\n if (!host) return true;\n if (isIpLiteral(host)) return isPrivateAddress(host);\n return PRIVATE_NAMES.test(host) || !host.includes(\".\");\n}\n","import { analyzeAmbientPixels } from \"../analyze\";\nimport { isIpLiteral, isPrivateAddress, isPrivateHostname, normalizeHost } from \"./address\";\nimport { resolveAnalysis } from \"../settings\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n} from \"../types\";\n\n// `@omerdlw/base-framework/ambient/server`: palettes computed in Node (RSC,\n// route handlers, build scripts), to be cached and handed to the client as\n// `initialPalette`. Nothing here is client code.\n\nexport { analyzeAmbientPixels, findContentBounds, fitSample } from \"../analyze\";\nexport { isPrivateAddress, isPrivateHostname } from \"./address\";\nexport { configureAmbient, getAmbientSettings } from \"../settings\";\nexport {\n contrastRatio,\n formatOklch,\n maxChroma,\n onColorFor,\n srgbToOklab,\n toneOf,\n} from \"../oklab\";\nexport type * from \"../types\";\n\n/** Decodes image bytes into RGBA pixels no larger than `size` on the long side. */\nexport type AmbientDecoder = (\n bytes: Uint8Array,\n size: number,\n) => Promise<AmbientPixels>;\n\nexport interface AmbientServerOptions {\n analysis?: Partial<AmbientAnalysisOptions>;\n /** Which URLs may be fetched. Default: public http(s) hosts only. */\n allow?: (url: URL) => boolean;\n /** Keep results in an in-process cache (default `true`). */\n cache?: boolean;\n /** Default: `sharp` (loaded on first use; it ships with Next.js). */\n decode?: AmbientDecoder;\n fetch?: typeof fetch;\n /** Extra fetch options, e.g. `{ next: { revalidate: 86400 } }`. */\n init?: RequestInit;\n maxBytes?: number;\n /**\n * Resolves a host name to its IP addresses, checked before every request\n * (redirects included): a request whose host resolves to any loopback,\n * private, link-local or reserved address is refused. Default: `node:dns`.\n * `false` skips the check (only do that behind an `allow` list).\n */\n resolve?: ((hostname: string) => Promise<string[]>) | false;\n timeoutMs?: number;\n}\n\nconst MAX_BYTES = 12 * 1024 * 1024;\nconst TIMEOUT_MS = 8_000;\nconst CACHE_LIMIT = 500;\n\n/**\n * Public http(s) URLs only: no credentials, no localhost / private / link-local\n * names or IP literals (in any spelling the URL parser accepts). Host names\n * are also resolved and checked before fetching (`resolve`).\n */\nexport function isPublicImageUrl(url: URL): boolean {\n return (\n (url.protocol === \"https:\" || url.protocol === \"http:\") &&\n !url.username &&\n !url.password &&\n !isPrivateHostname(url.hostname)\n );\n}\n\nasync function lookupAll(hostname: string): Promise<string[]> {\n const { lookup } = await import(\"node:dns/promises\");\n return (await lookup(hostname, { all: true, verbatim: true })).map(\n (entry) => entry.address,\n );\n}\n\nasync function reachesOnlyPublic(\n url: URL,\n resolve: AmbientServerOptions[\"resolve\"],\n): Promise<boolean> {\n if (resolve === false) return true;\n const host = normalizeHost(url.hostname);\n try {\n const addresses = isIpLiteral(host) ? [host] : await (resolve ?? lookupAll)(host);\n return addresses.length > 0 && !addresses.some(isPrivateAddress);\n } catch {\n return false;\n }\n}\n\ninterface SharpLike {\n (input: Uint8Array, options?: Record<string, unknown>): SharpPipeline;\n}\ninterface SharpPipeline {\n ensureAlpha(): SharpPipeline;\n raw(): SharpPipeline;\n resize(width: number, height: number, options: Record<string, unknown>): SharpPipeline;\n rotate(): SharpPipeline;\n toBuffer(options: { resolveWithObject: true }): Promise<{\n data: Uint8Array;\n info: { height: number; width: number };\n }>;\n}\n\n/** Thrown (not swallowed) when no decoder is available: a setup error, not a bad image. */\nexport class AmbientDecoderMissingError extends Error {\n override name = \"AmbientDecoderMissingError\";\n}\n\nlet sharpModule: Promise<SharpLike> | null = null;\nconst SHARP = \"sharp\";\n\nfunction loadSharp(): Promise<SharpLike> {\n sharpModule ??= import(/* webpackIgnore: true */ /* turbopackIgnore: true */ SHARP)\n .then((mod: { default?: SharpLike }) => (mod.default ?? mod) as SharpLike)\n .catch((error: unknown) => {\n sharpModule = null;\n throw new AmbientDecoderMissingError(\n \"ambient/server: `sharp` is not installed. Install it or pass `decode`.\",\n { cause: error },\n );\n });\n return sharpModule;\n}\n\n/** The default decoder: `sharp`, resized inside libvips. */\nexport const sharpDecoder: AmbientDecoder = async (bytes, size) => {\n const sharp = await loadSharp();\n const { data, info } = await sharp(bytes, { failOn: \"none\" })\n .rotate()\n .resize(size, size, { fit: \"inside\", withoutEnlargement: true })\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n return { data, height: info.height, width: info.width };\n};\n\nasync function readLimited(response: Response, maxBytes: number): Promise<Uint8Array> {\n const declared = Number(response.headers.get(\"content-length\"));\n if (declared > maxBytes) throw new Error(\"ambient/server: image too large\");\n if (!response.body) return new Uint8Array(await response.arrayBuffer());\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n length += value.byteLength;\n if (length > maxBytes) {\n await reader.cancel();\n throw new Error(\"ambient/server: image too large\");\n }\n chunks.push(value);\n }\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\n/** The palette of image bytes (JPEG, PNG, WebP, AVIF… whatever the decoder reads). */\nexport async function extractAmbientPaletteFromBytes(\n bytes: Uint8Array,\n options: Pick<AmbientServerOptions, \"analysis\" | \"decode\"> = {},\n): Promise<AmbientPalette> {\n const analysis = resolveAnalysis(options.analysis);\n const pixels = await (options.decode ?? sharpDecoder)(bytes, analysis.sampleSize);\n return analyzeAmbientPixels(pixels, analysis);\n}\n\nconst cache = new Map<string, AmbientPalette>();\nconst inFlight = new Map<string, Promise<AmbientPalette | null>>();\n\nfunction remember(key: string, palette: AmbientPalette): void {\n cache.delete(key);\n while (cache.size >= CACHE_LIMIT) {\n const oldest = cache.keys().next().value;\n if (oldest === undefined) break;\n cache.delete(oldest);\n }\n cache.set(key, palette);\n}\n\nasync function fetchAndExtract(\n url: URL,\n options: AmbientServerOptions,\n): Promise<AmbientPalette | null> {\n const allow = options.allow ?? isPublicImageUrl;\n const doFetch = options.fetch ?? fetch;\n const signal = AbortSignal.timeout(options.timeoutMs ?? TIMEOUT_MS);\n\n let current = url;\n for (let hop = 0; hop <= 5; hop++) {\n if (!allow(current)) return null;\n // Checked on every hop. The fetch resolves the name again, so a host that\n // changes its answer in between (DNS rebinding) is only ruled out by an\n // `allow` list of hosts you trust.\n if (!(await reachesOnlyPublic(current, options.resolve))) return null;\n const response = await doFetch(current, {\n ...options.init,\n redirect: \"manual\",\n signal,\n });\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"location\");\n await response.body?.cancel();\n if (!location) return null;\n current = new URL(location, current);\n continue;\n }\n if (!response.ok) return null;\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (type && !type.toLowerCase().startsWith(\"image/\")) return null;\n const bytes = await readLimited(response, options.maxBytes ?? MAX_BYTES);\n const palette = await extractAmbientPaletteFromBytes(bytes, options);\n return { ...palette, source: url.href };\n }\n return null;\n}\n\n/**\n * Fetches an image and returns its palette, or `null` when it cannot be\n * fetched or decoded. `source` is the URL, so a client theme given the same\n * image and this palette as `initialPalette` does not extract it again.\n *\n * Wrap it in the app's cache (`\"use cache\"`, `unstable_cache`…) to keep\n * palettes across requests; an in-process cache is kept as well.\n */\nexport async function extractAmbientPalette(\n src: string | URL,\n options: AmbientServerOptions = {},\n): Promise<AmbientPalette | null> {\n let url: URL;\n try {\n url = new URL(src);\n } catch {\n return null;\n }\n const useCache = options.cache !== false;\n const key = options.analysis\n ? `${url.href}#${JSON.stringify(options.analysis)}`\n : url.href;\n if (useCache) {\n const hit = cache.get(key);\n if (hit) return hit;\n const pending = inFlight.get(key);\n if (pending) return pending;\n }\n\n const task = fetchAndExtract(url, options).catch((error: unknown) => {\n if (error instanceof AmbientDecoderMissingError) throw error;\n return null;\n });\n if (!useCache) return task;\n\n const shared = task\n .then((palette) => {\n if (palette) remember(key, palette);\n return palette;\n })\n .finally(() => inFlight.delete(key));\n inFlight.set(key, shared);\n return shared;\n}\n"]}
1
+ {"version":3,"sources":["../../../../src/modules/ambient/server/address.ts","../../../../src/modules/ambient/server/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Which hosts and addresses the server entry refuses to fetch from: anything\n// that is not plainly on the public internet.\n\nconst PRIVATE_NAMES = /(^|\\.)(localhost|local|internal|intranet|lan|home\\.arpa|localdomain)$/;\n\n/** Lower-cased, without the trailing dot(s) and IPv6 brackets. */\nexport function normalizeHost(hostname: string): string {\n return hostname.toLowerCase().replace(/\\.+$/, \"\").replace(/^\\[|\\]$/g, \"\");\n}\n\nfunction parseIPv4(value: string): number[] | null {\n const parts = value.split(\".\");\n if (parts.length !== 4) return null;\n const bytes = parts.map((part) => (/^\\d{1,3}$/.test(part) ? Number(part) : NaN));\n return bytes.every((byte) => byte >= 0 && byte <= 255) ? bytes : null;\n}\n\nfunction isPrivateIPv4([a, b, c]: number[]): boolean {\n return (\n a === 0 || // \"this network\"\n a === 10 ||\n a === 127 ||\n (a === 100 && b >= 64 && b <= 127) || // CGNAT\n (a === 169 && b === 254) || // link-local, cloud metadata\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 192 && b === 0 && c === 0) || // IETF protocol assignments\n (a === 198 && (b === 18 || b === 19)) || // benchmarking\n a >= 224 // multicast, reserved, broadcast\n );\n}\n\n/** Eight 16-bit groups, or `null` when `value` is not an IPv6 address. */\nfunction parseIPv6(value: string): number[] | null {\n let text = value.split(\"%\")[0]; // zone id\n const tail = text.match(/^(.*:)(\\d+\\.\\d+\\.\\d+\\.\\d+)$/);\n if (tail) {\n const v4 = parseIPv4(tail[2]);\n if (!v4) return null;\n text = `${tail[1]}${((v4[0] << 8) | v4[1]).toString(16)}:${((v4[2] << 8) | v4[3]).toString(16)}`;\n }\n const halves = text.split(\"::\");\n if (halves.length > 2) return null;\n const read = (part: string) => (part ? part.split(\":\") : []);\n const head = read(halves[0]);\n const rest = halves.length === 2 ? read(halves[1]) : [];\n const missing = 8 - head.length - rest.length;\n if (halves.length === 1 ? missing !== 0 : missing < 1) return null;\n const groups = [...head, ...Array(halves.length === 2 ? missing : 0).fill(\"0\"), ...rest];\n const words = groups.map((group) => (/^[0-9a-f]{1,4}$/.test(group) ? parseInt(group, 16) : NaN));\n return words.length === 8 && words.every((word) => word >= 0) ? words : null;\n}\n\nfunction isPrivateIPv6(words: number[]): boolean {\n const [w0, w1, w2, w3, w4, w5, w6, w7] = words;\n const embedded = () => [w6 >> 8, w6 & 255, w7 >> 8, w7 & 255];\n if (words.slice(0, 7).every((word) => word === 0)) return w7 <= 1; // :: and ::1\n // IPv4-mapped (::ffff:a.b.c.d), IPv4-compatible (::a.b.c.d), NAT64 (64:ff9b::a.b.c.d)\n if (w0 === 0 && w1 === 0 && w2 === 0 && w3 === 0 && w4 === 0 && (w5 === 0xffff || w5 === 0)) {\n return isPrivateIPv4(embedded());\n }\n if (w0 === 0x64 && w1 === 0xff9b) return isPrivateIPv4(embedded());\n if (w0 === 0x2002) return isPrivateIPv4([w1 >> 8, w1 & 255, w2 >> 8, w2 & 255]); // 6to4\n return (\n (w0 & 0xfe00) === 0xfc00 || // unique local\n (w0 & 0xffc0) === 0xfe80 || // link-local\n (w0 & 0xff00) === 0xff00 || // multicast\n (w0 === 0x2001 && w1 === 0xdb8) // documentation\n );\n}\n\n/** `true` for loopback, private, link-local, CGNAT, multicast and reserved IPs. */\nexport function isPrivateAddress(address: string): boolean {\n const host = normalizeHost(address);\n const v4 = parseIPv4(host);\n if (v4) return isPrivateIPv4(v4);\n const v6 = parseIPv6(host);\n return v6 ? isPrivateIPv6(v6) : false;\n}\n\nexport const isIpLiteral = (hostname: string) => {\n const host = normalizeHost(hostname);\n return parseIPv4(host) !== null || parseIPv6(host) !== null;\n};\n\n/** A host name that only means something on a private network. */\nexport function isPrivateHostname(hostname: string): boolean {\n const host = normalizeHost(hostname);\n if (!host) return true;\n if (isIpLiteral(host)) return isPrivateAddress(host);\n return PRIVATE_NAMES.test(host) || !host.includes(\".\");\n}\n","import { analyzeAmbientPixels } from \"../analyze\";\nimport { isIpLiteral, isPrivateAddress, isPrivateHostname, normalizeHost } from \"./address\";\nimport { resolveAnalysis } from \"../settings\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n} from \"../types\";\n\n// `@omerdlw/base-framework/ambient/server`: palettes computed in Node (RSC,\n// route handlers, build scripts), to be cached and handed to the client as\n// `initialPalette`. Nothing here is client code.\n\nexport {\n AMBIENT_ANALYSIS_VERSION,\n analyzeAmbientPixels,\n findContentBounds,\n fitSample,\n} from \"../analyze\";\nexport { isPrivateAddress, isPrivateHostname } from \"./address\";\nexport { configureAmbient, getAmbientSettings } from \"../settings\";\nexport {\n contrastRatio,\n formatOklch,\n maxChroma,\n onColorFor,\n srgbToOklab,\n toneOf,\n} from \"../oklab\";\nexport type * from \"../types\";\n\n/** Decodes image bytes into RGBA pixels no larger than `size` on the long side. */\nexport type AmbientDecoder = (\n bytes: Uint8Array,\n size: number,\n) => Promise<AmbientPixels>;\n\nexport interface AmbientServerOptions {\n analysis?: Partial<AmbientAnalysisOptions>;\n /** Which URLs may be fetched. Default: public http(s) hosts only. */\n allow?: (url: URL) => boolean;\n /** Keep results in an in-process cache (default `true`). */\n cache?: boolean;\n /** Default: `sharp` (loaded on first use; it ships with Next.js). */\n decode?: AmbientDecoder;\n fetch?: typeof fetch;\n /** Extra fetch options, e.g. `{ next: { revalidate: 86400 } }`. */\n init?: RequestInit;\n maxBytes?: number;\n /**\n * Resolves a host name to its IP addresses, checked before every request\n * (redirects included): a request whose host resolves to any loopback,\n * private, link-local or reserved address is refused. Default: `node:dns`.\n * `false` skips the check (only do that behind an `allow` list).\n */\n resolve?: ((hostname: string) => Promise<string[]>) | false;\n timeoutMs?: number;\n}\n\nconst MAX_BYTES = 12 * 1024 * 1024;\nconst TIMEOUT_MS = 8_000;\nconst CACHE_LIMIT = 500;\n\n/**\n * Public http(s) URLs only: no credentials, no localhost / private / link-local\n * names or IP literals (in any spelling the URL parser accepts). Host names\n * are also resolved and checked before fetching (`resolve`).\n */\nexport function isPublicImageUrl(url: URL): boolean {\n return (\n (url.protocol === \"https:\" || url.protocol === \"http:\") &&\n !url.username &&\n !url.password &&\n !isPrivateHostname(url.hostname)\n );\n}\n\nasync function lookupAll(hostname: string): Promise<string[]> {\n const { lookup } = await import(\"node:dns/promises\");\n return (await lookup(hostname, { all: true, verbatim: true })).map(\n (entry) => entry.address,\n );\n}\n\nasync function reachesOnlyPublic(\n url: URL,\n resolve: AmbientServerOptions[\"resolve\"],\n): Promise<boolean> {\n if (resolve === false) return true;\n const host = normalizeHost(url.hostname);\n try {\n const addresses = isIpLiteral(host) ? [host] : await (resolve ?? lookupAll)(host);\n return addresses.length > 0 && !addresses.some(isPrivateAddress);\n } catch {\n return false;\n }\n}\n\ninterface SharpLike {\n (input: Uint8Array, options?: Record<string, unknown>): SharpPipeline;\n}\ninterface SharpPipeline {\n ensureAlpha(): SharpPipeline;\n raw(): SharpPipeline;\n resize(width: number, height: number, options: Record<string, unknown>): SharpPipeline;\n rotate(): SharpPipeline;\n toBuffer(options: { resolveWithObject: true }): Promise<{\n data: Uint8Array;\n info: { height: number; width: number };\n }>;\n}\n\n/** Thrown (not swallowed) when no decoder is available: a setup error, not a bad image. */\nexport class AmbientDecoderMissingError extends Error {\n override name = \"AmbientDecoderMissingError\";\n}\n\nlet sharpModule: Promise<SharpLike> | null = null;\nconst SHARP = \"sharp\";\n\nfunction loadSharp(): Promise<SharpLike> {\n sharpModule ??= import(/* webpackIgnore: true */ /* turbopackIgnore: true */ SHARP)\n .then((mod: { default?: SharpLike }) => (mod.default ?? mod) as SharpLike)\n .catch((error: unknown) => {\n sharpModule = null;\n throw new AmbientDecoderMissingError(\n \"ambient/server: `sharp` is not installed. Install it or pass `decode`.\",\n { cause: error },\n );\n });\n return sharpModule;\n}\n\n/** The default decoder: `sharp`, resized inside libvips. */\nexport const sharpDecoder: AmbientDecoder = async (bytes, size) => {\n const sharp = await loadSharp();\n const { data, info } = await sharp(bytes, { failOn: \"none\" })\n .rotate()\n .resize(size, size, { fit: \"inside\", withoutEnlargement: true })\n .ensureAlpha()\n .raw()\n .toBuffer({ resolveWithObject: true });\n return { data, height: info.height, width: info.width };\n};\n\nasync function readLimited(response: Response, maxBytes: number): Promise<Uint8Array> {\n const declared = Number(response.headers.get(\"content-length\"));\n if (declared > maxBytes) throw new Error(\"ambient/server: image too large\");\n if (!response.body) return new Uint8Array(await response.arrayBuffer());\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n length += value.byteLength;\n if (length > maxBytes) {\n await reader.cancel();\n throw new Error(\"ambient/server: image too large\");\n }\n chunks.push(value);\n }\n const bytes = new Uint8Array(length);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n}\n\n/** The palette of image bytes (JPEG, PNG, WebP, AVIF… whatever the decoder reads). */\nexport async function extractAmbientPaletteFromBytes(\n bytes: Uint8Array,\n options: Pick<AmbientServerOptions, \"analysis\" | \"decode\"> = {},\n): Promise<AmbientPalette> {\n const analysis = resolveAnalysis(options.analysis);\n const pixels = await (options.decode ?? sharpDecoder)(bytes, analysis.sampleSize);\n return analyzeAmbientPixels(pixels, analysis);\n}\n\nconst cache = new Map<string, AmbientPalette>();\nconst inFlight = new Map<string, Promise<AmbientPalette | null>>();\n\nfunction remember(key: string, palette: AmbientPalette): void {\n cache.delete(key);\n while (cache.size >= CACHE_LIMIT) {\n const oldest = cache.keys().next().value;\n if (oldest === undefined) break;\n cache.delete(oldest);\n }\n cache.set(key, palette);\n}\n\nasync function fetchAndExtract(\n url: URL,\n options: AmbientServerOptions,\n): Promise<AmbientPalette | null> {\n const allow = options.allow ?? isPublicImageUrl;\n const doFetch = options.fetch ?? fetch;\n const signal = AbortSignal.timeout(options.timeoutMs ?? TIMEOUT_MS);\n\n let current = url;\n for (let hop = 0; hop <= 5; hop++) {\n if (!allow(current)) return null;\n // Checked on every hop. The fetch resolves the name again, so a host that\n // changes its answer in between (DNS rebinding) is only ruled out by an\n // `allow` list of hosts you trust.\n if (!(await reachesOnlyPublic(current, options.resolve))) return null;\n const response = await doFetch(current, {\n ...options.init,\n redirect: \"manual\",\n signal,\n });\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get(\"location\");\n await response.body?.cancel();\n if (!location) return null;\n current = new URL(location, current);\n continue;\n }\n if (!response.ok) return null;\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (type && !type.toLowerCase().startsWith(\"image/\")) return null;\n const bytes = await readLimited(response, options.maxBytes ?? MAX_BYTES);\n const palette = await extractAmbientPaletteFromBytes(bytes, options);\n return { ...palette, source: url.href };\n }\n return null;\n}\n\n/**\n * Fetches an image and returns its palette, or `null` when it cannot be\n * fetched or decoded. `source` is the URL, so a client theme given the same\n * image and this palette as `initialPalette` does not extract it again.\n *\n * Wrap it in the app's cache (`\"use cache\"`, `unstable_cache`…) to keep\n * palettes across requests; an in-process cache is kept as well.\n */\nexport async function extractAmbientPalette(\n src: string | URL,\n options: AmbientServerOptions = {},\n): Promise<AmbientPalette | null> {\n let url: URL;\n try {\n url = new URL(src);\n } catch {\n return null;\n }\n const useCache = options.cache !== false;\n const key = options.analysis\n ? `${url.href}#${JSON.stringify(options.analysis)}`\n : url.href;\n if (useCache) {\n const hit = cache.get(key);\n if (hit) return hit;\n const pending = inFlight.get(key);\n if (pending) return pending;\n }\n\n const task = fetchAndExtract(url, options).catch((error: unknown) => {\n if (error instanceof AmbientDecoderMissingError) throw error;\n return null;\n });\n if (!useCache) return task;\n\n const shared = task\n .then((palette) => {\n if (palette) remember(key, palette);\n return palette;\n })\n .finally(() => inFlight.delete(key));\n inFlight.set(key, shared);\n return shared;\n}\n"]}
@@ -5,6 +5,7 @@ export declare const AMBIENT_REGIONS: readonly ["top", "bottom", "left", "right"
5
5
  export declare const DEFAULT_ANALYSIS: Readonly<AmbientAnalysisOptions>;
6
6
  export declare const DEFAULT_CSS_VAR_NAMES: Readonly<AmbientCssVarNames>;
7
7
  export declare const DEFAULT_PROXY = "/api/ambient/proxy?url=";
8
+ export declare const DEFAULT_LINGER_MS = 3000;
8
9
  export declare function getAmbientSettings(): AmbientSettings;
9
10
  export declare function mergeAmbientSettings(base: AmbientSettings, input: AmbientSettingsInput): AmbientSettings;
10
11
  /**