@omerdlw/base-framework 1.0.6 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/atoms/index.js +1 -103
- package/dist/atoms/index.js.map +1 -1
- package/dist/chunk-3BUP64Q6.js +105 -0
- package/dist/chunk-3BUP64Q6.js.map +1 -0
- package/dist/chunk-4GMQKD6F.js +353 -0
- package/dist/chunk-4GMQKD6F.js.map +1 -0
- package/dist/chunk-6SG7V77J.js +577 -0
- package/dist/chunk-6SG7V77J.js.map +1 -0
- package/dist/chunk-6ZJVLUBE.js +26 -0
- package/dist/chunk-6ZJVLUBE.js.map +1 -0
- package/dist/chunk-7HQMXTNP.js +419 -0
- package/dist/chunk-7HQMXTNP.js.map +1 -0
- package/dist/chunk-7TAVYJ3A.js +371 -0
- package/dist/chunk-7TAVYJ3A.js.map +1 -0
- package/dist/chunk-A5RE3F6O.js +9905 -0
- package/dist/chunk-A5RE3F6O.js.map +1 -0
- package/dist/chunk-AQ4BNXA2.js +349 -0
- package/dist/chunk-AQ4BNXA2.js.map +1 -0
- package/dist/chunk-CGHZSSFR.js +2166 -0
- package/dist/chunk-CGHZSSFR.js.map +1 -0
- package/dist/chunk-DGCQWQLZ.js +61 -0
- package/dist/chunk-DGCQWQLZ.js.map +1 -0
- package/dist/chunk-FIMPHODX.js +67 -0
- package/dist/chunk-FIMPHODX.js.map +1 -0
- package/dist/chunk-GF7TUX5I.js +1889 -0
- package/dist/chunk-GF7TUX5I.js.map +1 -0
- package/dist/chunk-JELG4JLT.js +454 -0
- package/dist/chunk-JELG4JLT.js.map +1 -0
- package/dist/chunk-K676GL7Z.js +51 -0
- package/dist/chunk-K676GL7Z.js.map +1 -0
- package/dist/chunk-QI3ALLIB.js +38 -0
- package/dist/chunk-QI3ALLIB.js.map +1 -0
- package/dist/chunk-QXR55VVS.js +1139 -0
- package/dist/chunk-QXR55VVS.js.map +1 -0
- package/dist/chunk-R2YGFJDJ.js +408 -0
- package/dist/chunk-R2YGFJDJ.js.map +1 -0
- package/dist/chunk-RFZQWLC5.js +27 -0
- package/dist/chunk-RFZQWLC5.js.map +1 -0
- package/dist/chunk-SKBITB5X.js +888 -0
- package/dist/chunk-SKBITB5X.js.map +1 -0
- package/dist/chunk-SYAVGTOX.js +521 -0
- package/dist/chunk-SYAVGTOX.js.map +1 -0
- package/dist/chunk-TV3WEF5G.js +784 -0
- package/dist/chunk-TV3WEF5G.js.map +1 -0
- package/dist/chunk-XASQT4CQ.js +280 -0
- package/dist/chunk-XASQT4CQ.js.map +1 -0
- package/dist/error/index.js +5 -682
- package/dist/error/index.js.map +1 -1
- package/dist/error/reporter.d.ts.map +1 -1
- package/dist/error/theme.d.ts +1 -1
- package/dist/error/theme.d.ts.map +1 -1
- package/dist/events.js +1 -7
- package/dist/events.js.map +1 -1
- package/dist/hooks/index.js +1 -358
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-global-event.d.ts +1 -1
- package/dist/index.js +18 -20029
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.js +2 -2035
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/modules/ambient/analyze.d.ts +46 -0
- package/dist/modules/ambient/analyze.d.ts.map +1 -0
- package/dist/modules/ambient/constants.d.ts +1 -5
- package/dist/modules/ambient/constants.d.ts.map +1 -1
- package/dist/modules/ambient/context.d.ts.map +1 -1
- package/dist/modules/ambient/dom.d.ts +11 -12
- package/dist/modules/ambient/dom.d.ts.map +1 -1
- package/dist/modules/ambient/extractor.d.ts +10 -10
- package/dist/modules/ambient/extractor.d.ts.map +1 -1
- package/dist/modules/ambient/hooks.d.ts +1 -1
- package/dist/modules/ambient/hooks.d.ts.map +1 -1
- package/dist/modules/ambient/index.d.ts +6 -4
- package/dist/modules/ambient/index.d.ts.map +1 -1
- package/dist/modules/ambient/index.js +7 -762
- package/dist/modules/ambient/index.js.map +1 -1
- package/dist/modules/ambient/module.d.ts +1 -1
- package/dist/modules/ambient/module.d.ts.map +1 -1
- package/dist/modules/ambient/oklab.d.ts +36 -0
- package/dist/modules/ambient/oklab.d.ts.map +1 -0
- package/dist/modules/ambient/pipeline.d.ts +28 -0
- package/dist/modules/ambient/pipeline.d.ts.map +1 -0
- package/dist/modules/ambient/quantize.d.ts +22 -0
- package/dist/modules/ambient/quantize.d.ts.map +1 -0
- package/dist/modules/ambient/server/address.d.ts +8 -0
- package/dist/modules/ambient/server/address.d.ts.map +1 -0
- package/dist/modules/ambient/server/index.d.ts +53 -0
- package/dist/modules/ambient/server/index.d.ts.map +1 -0
- package/dist/modules/ambient/server/index.js +221 -0
- package/dist/modules/ambient/server/index.js.map +1 -0
- package/dist/modules/ambient/settings.d.ts +19 -0
- package/dist/modules/ambient/settings.d.ts.map +1 -0
- package/dist/modules/ambient/types.d.ts +105 -9
- package/dist/modules/ambient/types.d.ts.map +1 -1
- package/dist/modules/ambient/worker/index.d.ts +15 -0
- package/dist/modules/ambient/worker/index.d.ts.map +1 -0
- package/dist/modules/ambient/worker/index.js +114 -0
- package/dist/modules/ambient/worker/index.js.map +1 -0
- package/dist/modules/background/constants.d.ts +2 -2
- package/dist/modules/background/constants.d.ts.map +1 -1
- package/dist/modules/background/hooks.d.ts +1 -1
- package/dist/modules/background/index.js +6 -3078
- package/dist/modules/background/index.js.map +1 -1
- package/dist/modules/background/motion.d.ts +9 -7
- package/dist/modules/background/motion.d.ts.map +1 -1
- package/dist/modules/background/overlay.d.ts +3 -8
- package/dist/modules/background/overlay.d.ts.map +1 -1
- package/dist/modules/background/types.d.ts +16 -2
- package/dist/modules/background/types.d.ts.map +1 -1
- package/dist/modules/context-menu/constants.d.ts +2 -2
- package/dist/modules/context-menu/constants.d.ts.map +1 -1
- package/dist/modules/context-menu/hooks.d.ts +1 -1
- package/dist/modules/context-menu/index.js +10 -1896
- package/dist/modules/context-menu/index.js.map +1 -1
- package/dist/modules/context-menu/motion.d.ts +1 -8
- package/dist/modules/context-menu/motion.d.ts.map +1 -1
- package/dist/modules/context-menu/overlay.d.ts.map +1 -1
- package/dist/modules/context-menu/types.d.ts +16 -2
- package/dist/modules/context-menu/types.d.ts.map +1 -1
- package/dist/modules/controls/constants.d.ts +1 -1
- package/dist/modules/controls/constants.d.ts.map +1 -1
- package/dist/modules/controls/entries.d.ts +1 -1
- package/dist/modules/controls/hooks.d.ts +1 -1
- package/dist/modules/controls/index.js +4 -1110
- package/dist/modules/controls/index.js.map +1 -1
- package/dist/modules/controls/overlay.d.ts +1 -1
- package/dist/modules/controls/types.d.ts +2 -2
- package/dist/modules/dock/cards.d.ts +711 -24
- package/dist/modules/dock/cards.d.ts.map +1 -1
- package/dist/modules/dock/constants.d.ts +2 -2
- package/dist/modules/dock/constants.d.ts.map +1 -1
- package/dist/modules/dock/helpers.d.ts +2 -2
- package/dist/modules/dock/hooks.d.ts +2 -2
- package/dist/modules/dock/index.d.ts +1 -1
- package/dist/modules/dock/index.d.ts.map +1 -1
- package/dist/modules/dock/index.js +9 -12132
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/layout.d.ts.map +1 -1
- package/dist/modules/dock/module.d.ts +1 -1
- package/dist/modules/dock/motion.d.ts +44 -912
- package/dist/modules/dock/motion.d.ts.map +1 -1
- package/dist/modules/dock/overlay.d.ts +1 -1
- package/dist/modules/dock/overlay.d.ts.map +1 -1
- package/dist/modules/dock/runtime/dock.d.ts +1 -23
- package/dist/modules/dock/runtime/dock.d.ts.map +1 -1
- package/dist/modules/dock/styles.d.ts +4 -4
- package/dist/modules/dock/surface/hooks.d.ts +5 -20
- package/dist/modules/dock/surface/hooks.d.ts.map +1 -1
- package/dist/modules/dock/surface/machine.d.ts +4 -3
- package/dist/modules/dock/surface/machine.d.ts.map +1 -1
- package/dist/modules/dock/surface/stack.d.ts.map +1 -1
- package/dist/modules/dock/surface/view-model.d.ts.map +1 -1
- package/dist/modules/dock/types.d.ts +162 -3
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +16 -17883
- package/dist/modules/index.js.map +1 -1
- package/dist/modules/loading/constants.d.ts +1 -1
- package/dist/modules/loading/constants.d.ts.map +1 -1
- package/dist/modules/loading/context.d.ts +1 -1
- package/dist/modules/loading/hooks.d.ts +1 -1
- package/dist/modules/loading/index.js +5 -1153
- package/dist/modules/loading/index.js.map +1 -1
- package/dist/modules/loading/types.d.ts +2 -2
- package/dist/modules/media/context.d.ts +1 -1
- package/dist/modules/media/index.js +3 -570
- package/dist/modules/media/index.js.map +1 -1
- package/dist/modules/media/types.d.ts +2 -2
- package/dist/modules/modal/constants.d.ts +2 -2
- package/dist/modules/modal/constants.d.ts.map +1 -1
- package/dist/modules/modal/context.d.ts +1 -1
- package/dist/modules/modal/hooks.d.ts +3 -3
- package/dist/modules/modal/index.js +8 -2355
- package/dist/modules/modal/index.js.map +1 -1
- package/dist/modules/modal/motion.d.ts +3 -8
- package/dist/modules/modal/motion.d.ts.map +1 -1
- package/dist/modules/modal/overlay.d.ts.map +1 -1
- package/dist/modules/modal/types.d.ts +21 -0
- package/dist/modules/modal/types.d.ts.map +1 -1
- package/dist/modules/notification/constants.d.ts +2 -2
- package/dist/modules/notification/constants.d.ts.map +1 -1
- package/dist/modules/notification/context.d.ts +1 -1
- package/dist/modules/notification/hooks.d.ts +1 -1
- package/dist/modules/notification/index.js +4 -828
- package/dist/modules/notification/index.js.map +1 -1
- package/dist/modules/notification/motion.d.ts +1 -7
- package/dist/modules/notification/motion.d.ts.map +1 -1
- package/dist/modules/notification/overlay.d.ts.map +1 -1
- package/dist/modules/notification/types.d.ts +9 -1
- package/dist/modules/notification/types.d.ts.map +1 -1
- package/dist/overlay-TZ6L52A5.js +9 -0
- package/dist/overlay-TZ6L52A5.js.map +1 -0
- package/dist/provider.d.ts +1 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +6 -1968
- package/dist/provider.js.map +1 -1
- package/dist/result.js +2 -63
- package/dist/result.js.map +1 -1
- package/dist/theme.d.ts +45 -8
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +3 -41
- package/dist/theme.js.map +1 -1
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +126 -155
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/motion-config.d.ts +44 -0
- package/dist/tokens/motion-config.d.ts.map +1 -0
- package/dist/tokens/motion.d.ts +23 -174
- package/dist/tokens/motion.d.ts.map +1 -1
- package/dist/utils/index.js +4 -82
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/report.d.ts.map +1 -1
- package/docs/README.md +1 -0
- package/docs/architecture-and-rules.md +4 -3
- package/docs/core-engine.md +7 -10
- package/docs/getting-started.md +4 -2
- package/docs/modules/ambient.md +194 -80
- package/docs/modules/background.md +3 -3
- package/docs/modules/context-menu.md +2 -2
- package/docs/modules/dock.md +9 -6
- package/docs/modules/modal.md +2 -2
- package/docs/modules/notification.md +2 -2
- package/docs/theming.md +81 -9
- package/package.json +22 -5
- package/templates/AGENTS.md +1 -1
- package/templates/motion/background.ts +17 -0
- package/templates/motion/context-menu.ts +63 -0
- package/templates/motion/dock.ts +327 -0
- package/templates/motion/modal.ts +79 -0
- package/templates/motion/notification.ts +27 -0
- package/templates/motion/tokens.ts +47 -0
- package/templates/tsconfig.json +7 -0
- package/dist/modules/ambient/color.d.ts +0 -21
- package/dist/modules/ambient/color.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/oklab.ts","../src/modules/ambient/settings.ts","../src/modules/ambient/quantize.ts","../src/modules/ambient/analyze.ts","../src/modules/ambient/pipeline.ts","../src/modules/ambient/worker/index.ts","../src/modules/ambient/extractor.ts","../src/modules/ambient/dom.ts","../src/modules/ambient/hooks.ts","../src/modules/ambient/module.tsx"],"names":["round","share","isCrossOrigin","useState","palette","scope","useMemo"],"mappings":"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","file":"chunk-QXR55VVS.js","sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { createStore } from \"@/utils\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport type {\n AmbientProviderProps,\n AmbientProviderValue,\n AmbientState,\n} from \"./types\";\n\nexport const AmbientContext =\n getOrCreateGlobalContext<AmbientProviderValue | null>(\"AmbientContext\", null);\n\nexport function AmbientProvider({\n children,\n initialPalette = null,\n}: AmbientProviderProps) {\n const [store] = useState(() =>\n createStore<AmbientState>(\n { isExtracting: false, palette: initialPalette },\n { freezeSnapshots: false },\n ),\n );\n\n const value = useMemo<AmbientProviderValue>(\n () => ({\n actions: {\n setIsExtracting: (next) =>\n store.publish((state) => {\n const isExtracting =\n typeof next === \"function\" ? next(state.isExtracting) : next;\n return isExtracting === state.isExtracting\n ? state\n : { ...state, isExtracting };\n }),\n setPalette: (next) =>\n store.publish((state) => {\n const palette =\n typeof next === \"function\" ? next(state.palette) : next;\n return palette === state.palette ? state : { ...state, palette };\n }),\n },\n store,\n }),\n [store],\n );\n\n return <AmbientContext value={value}>{children}</AmbientContext>;\n}\n","import { defineThemeSpec } from \"@/theme\";\nimport type { AmbientThemeSlot } from \"./types\";\n\nexport const ambientTheme = defineThemeSpec<AmbientThemeSlot>(\"ambient\");\n","import type { OklchColor } from \"./types\";\n\n// Pure OKLab / OKLCH math shared by the client, the worker and the server.\n// Nothing here touches the DOM or React.\n\nexport type Lab = [l: number, a: number, b: number];\nexport type Rgb = [r: number, g: number, b: number];\n\nconst DEG = Math.PI / 180;\n\nconst LINEAR_LUT = new Float32Array(256);\nfor (let i = 0; i < 256; i++) {\n const v = i / 255;\n LINEAR_LUT[i] = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function smoothstep(edge0: number, edge1: number, value: number): number {\n const t = clamp((value - edge0) / (edge1 - edge0), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** 8-bit sRGB channels → OKLab. */\nexport function srgbToOklab(r: number, g: number, b: number): Lab {\n const lr = LINEAR_LUT[r & 255];\n const lg = LINEAR_LUT[g & 255];\n const lb = LINEAR_LUT[b & 255];\n\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\n/** OKLCH → linear sRGB; channels outside 0–1 mean the colour is out of gamut. */\nexport function oklchToLinearSrgb(l: number, c: number, h: number): Rgb {\n const a = c * Math.cos(h * DEG);\n const b = c * Math.sin(h * DEG);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n ];\n}\n\nexport function labToLch([l, a, b]: Lab): OklchColor {\n const c = Math.sqrt(a * a + b * b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) / DEG + 360) % 360;\n return { c, h, l };\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-5 && v <= 1 + 1e-5);\n\n/**\n * The most chroma sRGB can show at this lightness and hue (binary search on\n * the gamut boundary). Dark blues and purples have far more room than dark\n * greens or yellows, which is why one fixed chroma never looks right.\n */\nexport function maxChroma(l: number, h: number): number {\n if (l <= 0 || l >= 1) return 0;\n let low = 0;\n let high = 0.4;\n for (let step = 0; step < 18; step++) {\n const middle = (low + high) / 2;\n if (inGamut(oklchToLinearSrgb(l, middle, h))) low = middle;\n else high = middle;\n }\n return low;\n}\n\n/** Share of the available chroma a colour uses (0 grey … 1 on the gamut edge). */\nexport function relativeChroma({ c, h, l }: OklchColor): number {\n const room = maxChroma(l, h);\n return room <= 0 ? 0 : clamp(c / room, 0, 1);\n}\n\nexport function hueDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** WCAG 2 relative luminance of an OKLCH colour (gamut-clipped). */\nexport function luminance({ c, h, l }: OklchColor): number {\n const [r, g, b] = oklchToLinearSrgb(l, c, h).map((v) => clamp(v, 0, 1));\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\nexport function contrastRatio(a: OklchColor, b: OklchColor): number {\n const la = luminance(a);\n const lb = luminance(b);\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\nconst round = (value: number, digits: number) => {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n};\n\nexport function formatOklch({ c, h, l }: OklchColor): string {\n const chroma = c < 0.0005 ? 0 : c;\n return `oklch(${round(clamp(l, 0, 1), 3).toFixed(3)} ${round(chroma, 3).toFixed(3)} ${round(chroma === 0 ? 0 : h, 1).toFixed(1)})`;\n}\n\n/**\n * A tone of a hue at lightness `l`, using `rel` of the chroma sRGB allows\n * there (never more than `cap`). This keeps a hue's character across a whole\n * ramp: dark tones of blue stay blue instead of collapsing to grey.\n */\nexport function toneOf(\n h: number,\n l: number,\n rel: number,\n cap = 0.3,\n): OklchColor {\n const room = maxChroma(l, h) * 0.96;\n return { c: Math.min(cap, clamp(rel, 0, 1) * room), h, l };\n}\n\n/**\n * Text colour for a background: a near-white or near-black carrying a hint of\n * the background's hue, pushed toward pure white / black until it reaches\n * `minContrast` (WCAG 2 ratio).\n */\nexport function onColorFor(\n background: OklchColor,\n minContrast = 4.5,\n): OklchColor {\n const light = (l: number) => toneOf(background.h, l, 0.12, 0.012);\n const dark = (l: number) => toneOf(background.h, l, 0.35, 0.03);\n const towardLight = contrastRatio(light(0.985), background);\n const towardDark = contrastRatio(dark(0.18), background);\n const useLight = towardLight >= minContrast || towardLight >= towardDark;\n\n for (let step = 0; step <= 12; step++) {\n const candidate = useLight\n ? light(Math.min(1, 0.985 + step * 0.0025))\n : dark(Math.max(0, 0.18 - step * 0.015));\n if (contrastRatio(candidate, background) >= minContrast) return candidate;\n }\n return useLight ? { c: 0, h: 0, l: 1 } : { c: 0, h: 0, l: 0 };\n}\n","import type {\n AmbientAnalysisOptions,\n AmbientCssVarNames,\n AmbientProxy,\n AmbientSettings,\n AmbientSettingsInput,\n AmbientTone,\n} from \"./types\";\n\nexport const AMBIENT_TONES = Object.freeze([\n 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 95,\n] as const) satisfies readonly AmbientTone[];\n\nexport const AMBIENT_ROLES = Object.freeze([\n \"dominant\",\n \"vibrant\",\n \"muted\",\n \"accent\",\n] as const);\n\nexport const AMBIENT_REGIONS = Object.freeze([\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"center\",\n] as const);\n\nexport const DEFAULT_ANALYSIS: Readonly<AmbientAnalysisOptions> = Object.freeze({\n centerWeight: 0.5,\n clusters: 7,\n letterbox: true,\n minContrast: 4.5,\n minHueDistance: 40,\n sampleSize: 128,\n shadowLightness: 0.16,\n});\n\nexport const DEFAULT_CSS_VAR_NAMES: Readonly<AmbientCssVarNames> = Object.freeze({\n on: \"--ambient-on-{role}\",\n region: \"--ambient-{region}\",\n role: \"--ambient-{role}\",\n shadow: \"--ambient-shadow\",\n tone: \"--ambient-{role}-{tone}\",\n});\n\nexport const DEFAULT_PROXY = \"/api/ambient/proxy?url=\";\n\nconst createDefaults = (): AmbientSettings => ({\n analysis: { ...DEFAULT_ANALYSIS },\n cacheLimit: 100,\n cssVars: { ...DEFAULT_CSS_VAR_NAMES, tones: AMBIENT_TONES },\n proxy: DEFAULT_PROXY,\n strategy: \"auto\",\n worker: null,\n});\n\n// Kept on globalThis so every bundled copy of this module (one per package\n// entry) shares one configuration.\nconst SETTINGS_KEY = Symbol.for(\"@omerdlw/base-framework/ambient/settings\");\ntype GlobalWithSettings = typeof globalThis & {\n [SETTINGS_KEY]?: AmbientSettings;\n};\nconst scope = globalThis as GlobalWithSettings;\n\nexport function getAmbientSettings(): AmbientSettings {\n return (scope[SETTINGS_KEY] ??= createDefaults());\n}\n\nexport function mergeAmbientSettings(\n base: AmbientSettings,\n input: AmbientSettingsInput,\n): AmbientSettings {\n return {\n analysis: { ...base.analysis, ...input.analysis },\n cacheLimit: input.cacheLimit ?? base.cacheLimit,\n cssVars: { ...base.cssVars, ...input.cssVars },\n proxy: input.proxy === undefined ? base.proxy : input.proxy,\n strategy: input.strategy ?? base.strategy,\n worker: input.worker === undefined ? base.worker : input.worker,\n };\n}\n\n/**\n * Sets the proxy, CSS variable names, extraction strategy, worker and analysis\n * defaults for every ambient theme. Returns a function that restores the\n * previous settings.\n */\nexport function configureAmbient(input: AmbientSettingsInput): () => void {\n const previous = getAmbientSettings();\n const next = mergeAmbientSettings(previous, input);\n scope[SETTINGS_KEY] = next;\n return () => {\n if (scope[SETTINGS_KEY] === next) scope[SETTINGS_KEY] = previous;\n };\n}\n\nexport function resolveAnalysis(\n overrides?: Partial<AmbientAnalysisOptions> | null,\n): AmbientAnalysisOptions {\n return { ...getAmbientSettings().analysis, ...overrides };\n}\n\n/** The URL to retry through, or `null` when no proxy applies. */\nexport function resolveProxyUrl(proxy: AmbientProxy, src: string): string | null {\n if (!proxy || !/^https?:\\/\\//i.test(src)) return null;\n if (typeof proxy === \"function\") return proxy(src);\n const encoded = encodeURIComponent(src);\n return proxy.includes(\"{url}\")\n ? proxy.replace(\"{url}\", encoded)\n : `${proxy}${encoded}`;\n}\n","export interface KMeansResult {\n /** Index of the cluster each point belongs to. */\n assignment: Int32Array;\n /** `k × 3` OKLab centroids. */\n centroids: Float64Array;\n /** Number of clusters actually found (≤ the requested k). */\n k: number;\n}\n\nexport interface KMeansOptions {\n iterations?: number;\n /** Weight of ΔL² against Δa² + Δb²; below 1 favours hue over lightness. */\n lightnessWeight?: number;\n}\n\n/**\n * Weighted k-means in OKLab with deterministic seeding (the heaviest point,\n * then repeatedly the point that is heaviest × furthest from every seed), so\n * the same pixels always give the same palette on the server and the client.\n *\n * `points` holds `n × 3` OKLab values and `weights` one weight per point.\n */\nexport function kmeans(\n points: Float64Array,\n weights: Float64Array,\n requested: number,\n { iterations = 16, lightnessWeight = 0.45 }: KMeansOptions = {},\n): KMeansResult {\n const n = weights.length;\n const assignment = new Int32Array(n);\n const k = Math.max(0, Math.min(requested, n));\n const centroids = new Float64Array(k * 3);\n if (k === 0) return { assignment, centroids, k };\n\n const distance = (i: number, j: number) => {\n const dl = points[i * 3] - centroids[j * 3];\n const da = points[i * 3 + 1] - centroids[j * 3 + 1];\n const db = points[i * 3 + 2] - centroids[j * 3 + 2];\n return lightnessWeight * dl * dl + da * da + db * db;\n };\n\n let first = 0;\n for (let i = 1; i < n; i++) if (weights[i] > weights[first]) first = i;\n centroids.set(points.subarray(first * 3, first * 3 + 3), 0);\n\n const nearest = new Float64Array(n).fill(Infinity);\n let found = 1;\n for (; found < k; found++) {\n let best = -1;\n let bestScore = 0;\n for (let i = 0; i < n; i++) {\n const d = distance(i, found - 1);\n if (d < nearest[i]) nearest[i] = d;\n const score = weights[i] * nearest[i];\n if (score > bestScore) {\n bestScore = score;\n best = i;\n }\n }\n if (best < 0) break; // every remaining point sits on a seed\n centroids.set(points.subarray(best * 3, best * 3 + 3), found * 3);\n }\n\n const sums = new Float64Array(found * 4);\n for (let round = 0; round < iterations; round++) {\n let moved = round === 0;\n for (let i = 0; i < n; i++) {\n let best = 0;\n let bestDistance = Infinity;\n for (let j = 0; j < found; j++) {\n const d = distance(i, j);\n if (d < bestDistance) {\n bestDistance = d;\n best = j;\n }\n }\n if (assignment[i] !== best) {\n assignment[i] = best;\n moved = true;\n }\n }\n if (!moved) break;\n\n sums.fill(0);\n for (let i = 0; i < n; i++) {\n const j = assignment[i] * 4;\n const w = weights[i];\n sums[j] += points[i * 3] * w;\n sums[j + 1] += points[i * 3 + 1] * w;\n sums[j + 2] += points[i * 3 + 2] * w;\n sums[j + 3] += w;\n }\n for (let j = 0; j < found; j++) {\n const w = sums[j * 4 + 3];\n if (w <= 0) continue; // an empty cluster keeps its seed\n centroids[j * 3] = sums[j * 4] / w;\n centroids[j * 3 + 1] = sums[j * 4 + 1] / w;\n centroids[j * 3 + 2] = sums[j * 4 + 2] / w;\n }\n }\n\n return { assignment, centroids: centroids.slice(0, found * 3), k: found };\n}\n","import {\n clamp,\n formatOklch,\n hueDistance,\n labToLch,\n maxChroma,\n onColorFor,\n smoothstep,\n srgbToOklab,\n toneOf,\n} from \"./oklab\";\nimport { kmeans } from \"./quantize\";\nimport { AMBIENT_REGIONS, AMBIENT_TONES, DEFAULT_ANALYSIS } from \"./settings\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n AmbientRamp,\n AmbientRegion,\n AmbientRegionColor,\n AmbientRole,\n AmbientSwatch,\n OklchColor,\n} from \"./types\";\n\n// Below this chroma a colour reads as grey; its hue is noise.\nconst MIN_CHROMA = 0.022;\n// Below this share of coloured pixels an image is treated as neutral.\nconst MIN_PRESENCE = 0.03;\n// A colour this small still counts as a role when it is vivid enough.\nconst MIN_POPULATION = 0.004;\n\nconst REGION_BITS: Record<AmbientRegion, number> = {\n top: 1,\n bottom: 2,\n left: 4,\n right: 8,\n center: 16,\n};\n\nexport interface Cluster extends OklchColor {\n /** Share of the (centre-weighted) image. */\n pop: number;\n /** Share of the chroma sRGB allows at this lightness and hue. */\n rel: number;\n /** How far the hue can be trusted at this lightness (0–1). */\n rely: number;\n}\n\ninterface Bounds {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\nconst lightnessAt = (data: ArrayLike<number>, index: number) =>\n srgbToOklab(data[index], data[index + 1], data[index + 2])[0];\n\n/**\n * Finds black bars along the edges (letterbox / pillarbox): rows or columns\n * that are uniformly near-black. At most 22% of each side is cut.\n */\nexport function findContentBounds({ data, height, width }: AmbientPixels): Bounds {\n const isBar = (count: number, at: (step: number) => number) => {\n let sum = 0;\n let max = 0;\n let seen = 0;\n for (let step = 0; step < count; step++) {\n const index = at(step);\n if (data[index + 3] < 128) continue;\n const l = lightnessAt(data, index);\n sum += l;\n if (l > max) max = l;\n seen++;\n }\n return seen > 0 && sum / seen < 0.12 && max < 0.2;\n };\n const row = (y: number) => isBar(width, (x) => (y * width + x) * 4);\n const maxRows = Math.floor(height * 0.22);\n const maxColumns = Math.floor(width * 0.22);\n\n let top = 0;\n while (top < maxRows && row(top)) top++;\n let bottom = height;\n while (height - bottom < maxRows && bottom - 1 > top && row(bottom - 1)) bottom--;\n\n const column = (x: number) =>\n isBar(bottom - top, (step) => ((top + step) * width + x) * 4);\n let left = 0;\n while (left < maxColumns && column(left)) left++;\n let right = width;\n while (width - right < maxColumns && right - 1 > left && column(right - 1)) right--;\n\n return { bottom, left, right, top };\n}\n\nconst reliability = (l: number) =>\n smoothstep(0.1, 0.28, l) * (1 - smoothstep(0.9, 0.98, l));\n\nconst colorfulness = (c: number) => smoothstep(MIN_CHROMA, 0.06, c);\n\nconst isChromatic = (cluster: Cluster) =>\n cluster.c >= MIN_CHROMA && cluster.rely > 0;\n\nfunction pickBest<T>(items: T[], score: (item: T) => number): T | null {\n let best: T | null = null;\n let bestScore = 0;\n for (const item of items) {\n const value = score(item);\n if (value > bestScore) {\n bestScore = value;\n best = item;\n }\n }\n return best;\n}\n\nconst round3 = (value: number) => Math.round(value * 1000) / 1000;\n\ninterface ToneSpec {\n cap: number;\n max: number;\n min: number;\n rel: number;\n}\n\nfunction buildSwatch(\n source: Cluster | null,\n { cap, max, min, rel }: ToneSpec,\n fallback: { h: number; l: number },\n fromImage: boolean,\n minContrast: number,\n): AmbientSwatch {\n const h = source?.h ?? fallback.h;\n const l = clamp(source?.l ?? fallback.l, min, max);\n const tone = toneOf(h, l, rel, cap);\n const ramp = {} as AmbientRamp;\n for (const step of AMBIENT_TONES) {\n ramp[step] = formatOklch(toneOf(h, step / 100, rel, cap));\n }\n return {\n c: round3(tone.c),\n color: formatOklch(tone),\n fromImage,\n h: Math.round(h * 10) / 10,\n l: round3(tone.l),\n on: formatOklch(onColorFor(tone, minContrast)),\n population: round3(source?.pop ?? 0),\n ramp,\n };\n}\n\n// How much of the gamut each role uses, from the source colour's own share.\nconst lift = (rel: number, base: number, gain: number, ceiling: number) =>\n clamp(base + gain * rel, 0, ceiling);\n\nexport interface AmbientClustering {\n clusters: Cluster[];\n /** Centre-weighted mean lightness. */\n meanL: number;\n /** Per region, the pixel count of each cluster. */\n regionWeights: Float64Array[];\n}\n\n/**\n * Step one of the analysis: the image's colours as OKLab k-means clusters,\n * with each cluster's share of the frame and of each region.\n */\nexport function clusterAmbientPixels(\n pixels: AmbientPixels,\n options: AmbientAnalysisOptions,\n): AmbientClustering {\n const { data, width, height } = pixels;\n const bounds = options.letterbox\n ? findContentBounds(pixels)\n : { bottom: height, left: 0, right: width, top: 0 };\n const boxWidth = Math.max(1, bounds.right - bounds.left);\n const boxHeight = Math.max(1, bounds.bottom - bounds.top);\n\n // 1. Bin pixels by 15-bit RGB, averaging their OKLab values per bin.\n const binOf = new Int32Array(32768).fill(-1);\n const binSums: number[] = [];\n const pixelBins = new Int32Array(boxWidth * boxHeight).fill(-1);\n const pixelRegions = new Uint8Array(boxWidth * boxHeight);\n const sigma2 = 2 * 0.35 * 0.35;\n let total = 0;\n let sumL = 0;\n\n for (let y = bounds.top; y < bounds.bottom; y++) {\n const v = (y - bounds.top + 0.5) / boxHeight;\n for (let x = bounds.left; x < bounds.right; x++) {\n const index = (y * width + x) * 4;\n if (data[index + 3] < 128) continue;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const [l, a, bb] = srgbToOklab(r, g, b);\n const u = (x - bounds.left + 0.5) / boxWidth;\n const du = (u - 0.5) * 2;\n const dv = (v - 0.5) * 2;\n const weight =\n 1 -\n options.centerWeight +\n 2 * options.centerWeight * Math.exp(-(du * du + dv * dv) / sigma2);\n\n const key = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);\n let bin = binOf[key];\n if (bin < 0) {\n bin = binSums.length / 4;\n binOf[key] = bin;\n binSums.push(0, 0, 0, 0);\n }\n binSums[bin * 4] += l * weight;\n binSums[bin * 4 + 1] += a * weight;\n binSums[bin * 4 + 2] += bb * weight;\n binSums[bin * 4 + 3] += weight;\n total += weight;\n sumL += l * weight;\n\n const local = (y - bounds.top) * boxWidth + (x - bounds.left);\n pixelBins[local] = bin;\n pixelRegions[local] =\n (v < 1 / 3 ? REGION_BITS.top : 0) |\n (v > 2 / 3 ? REGION_BITS.bottom : 0) |\n (u < 1 / 3 ? REGION_BITS.left : 0) |\n (u > 2 / 3 ? REGION_BITS.right : 0) |\n (Math.abs(u - 0.5) < 0.25 && Math.abs(v - 0.5) < 0.25\n ? REGION_BITS.center\n : 0);\n }\n }\n\n const meanL = total > 0 ? sumL / total : 0.5;\n const bins = binSums.length / 4;\n\n // 2. Cluster coloured and grey bins apart, so the greys of a mostly dark\n // poster cannot use up every cluster and swallow its one red coat.\n const groups: [number[], number[]] = [[], []];\n for (let i = 0; i < bins; i++) {\n const w = binSums[i * 4 + 3];\n const a = binSums[i * 4 + 1] / w;\n const b = binSums[i * 4 + 2] / w;\n const coloured =\n Math.sqrt(a * a + b * b) >= MIN_CHROMA && binSums[i * 4] / w >= 0.06;\n groups[coloured ? 0 : 1].push(i);\n }\n const requested = clamp(Math.round(options.clusters), 2, 16);\n const greyClusters =\n groups[0].length === 0 ? requested : groups[1].length === 0 ? 0 : requested >= 8 ? 3 : 2;\n const budgets = [requested - greyClusters, greyClusters];\n\n const clusters: Cluster[] = [];\n const clusterOfBin = new Int32Array(bins).fill(-1);\n groups.forEach((members, group) => {\n if (members.length === 0 || budgets[group] <= 0) return;\n const points = new Float64Array(members.length * 3);\n const weights = new Float64Array(members.length);\n members.forEach((bin, i) => {\n const w = binSums[bin * 4 + 3];\n const a = binSums[bin * 4 + 1] / w;\n const b = binSums[bin * 4 + 2] / w;\n points[i * 3] = binSums[bin * 4] / w;\n points[i * 3 + 1] = a;\n points[i * 3 + 2] = b;\n // Vivid colours pull harder, so a small saturated area keeps its own cluster.\n weights[i] = w * (1 + 5 * Math.sqrt(a * a + b * b));\n });\n const { assignment, centroids, k } = kmeans(points, weights, budgets[group]);\n const pop = new Float64Array(k);\n members.forEach((bin, i) => (pop[assignment[i]] += binSums[bin * 4 + 3]));\n const index = new Int32Array(k).fill(-1);\n for (let j = 0; j < k; j++) {\n if (pop[j] <= 0) continue;\n const lch = labToLch([centroids[j * 3], centroids[j * 3 + 1], centroids[j * 3 + 2]]);\n const room = maxChroma(lch.l, lch.h);\n index[j] = clusters.length;\n clusters.push({\n ...lch,\n pop: pop[j] / total,\n rel: room > 0 ? clamp(lch.c / room, 0, 1) : 0,\n rely: reliability(lch.l),\n });\n }\n members.forEach((bin, i) => (clusterOfBin[bin] = index[assignment[i]]));\n });\n\n // 3. Region shares per cluster.\n const regionWeights = AMBIENT_REGIONS.map(() => new Float64Array(clusters.length));\n for (let i = 0; i < pixelBins.length; i++) {\n const bin = pixelBins[i];\n if (bin < 0) continue;\n const cluster = clusterOfBin[bin];\n const bits = pixelRegions[i];\n AMBIENT_REGIONS.forEach((region, r) => {\n if (bits & REGION_BITS[region]) regionWeights[r][cluster] += 1;\n });\n }\n\n return { clusters, meanL, regionWeights };\n}\n\n/**\n * The palette of an image: OKLab k-means clusters scored by population ×\n * chroma, turned into four roles (each with a gamut-aware tonal ramp and a\n * contrast-safe text colour), five region colours, and the deep `shadow`\n * tone.\n */\nexport function analyzeAmbientPixels(\n pixels: AmbientPixels,\n overrides: Partial<AmbientAnalysisOptions> = {},\n): AmbientPalette {\n const options = { ...DEFAULT_ANALYSIS, ...overrides };\n const { clusters, meanL, regionWeights } = clusterAmbientPixels(pixels, options);\n\n // 4. Roles.\n const chromatic = clusters.filter(isChromatic);\n const presence = chromatic.reduce(\n (sum, cluster) => sum + cluster.pop * colorfulness(cluster.c) * cluster.rely,\n 0,\n );\n const neutral = presence < MIN_PRESENCE;\n // A coloured detail on an almost grey image is kept, but quieter.\n const dilution = 0.55 + 0.45 * Math.min(1, presence / 0.25);\n const { minContrast, minHueDistance } = options;\n const grey = { h: 0, l: clamp(meanL, 0.3, 0.8) };\n\n // k-means splits one hue into several lightness levels; a hue's share is\n // that of its whole family (clusters within 20°), so it is not undercounted.\n const family = new Map<Cluster, number>();\n for (const cluster of chromatic) {\n let share = 0;\n for (const other of chromatic) {\n if (hueDistance(cluster.h, other.h) <= 20) share += other.pop;\n }\n family.set(cluster, share);\n }\n const share = (cluster: Cluster) => family.get(cluster) ?? cluster.pop;\n const withShare = (cluster: Cluster | null) =>\n cluster ? { ...cluster, pop: share(cluster) } : null;\n\n const dominantPick = neutral\n ? null\n : pickBest(chromatic, (cluster) => share(cluster) * cluster.c * cluster.rely);\n // A grey image keeps a grey `vibrant`: no hue is invented.\n const vividPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => share(cluster) >= MIN_POPULATION),\n (cluster) =>\n cluster.c * cluster.c * Math.pow(share(cluster), 0.3) * cluster.rely,\n );\n // …but a coloured detail on it (the red coat) becomes the accent.\n const accentPick = pickBest(\n chromatic.filter((cluster) =>\n neutral\n ? share(cluster) >= 0.006 && cluster.c >= 0.06\n : share(cluster) >= MIN_POPULATION &&\n cluster.c >= 0.035 &&\n (!dominantPick || hueDistance(cluster.h, dominantPick.h) >= minHueDistance),\n ),\n (cluster) => Math.pow(share(cluster), 0.6) * cluster.c * cluster.rely,\n );\n const mutedPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => cluster.c <= 0.09),\n (cluster) => share(cluster) * cluster.rely * (1 - cluster.c / 0.12),\n );\n\n const dominantHue = dominantPick?.h ?? vividPick?.h ?? 0;\n const roles: Record<AmbientRole, AmbientSwatch> = {\n dominant: buildSwatch(\n withShare(dominantPick),\n {\n cap: 0.22,\n max: 0.74,\n min: 0.42,\n rel: dominantPick ? lift(dominantPick.rel, 0.25, 0.85, 0.9) : 0,\n },\n grey,\n true,\n minContrast,\n ),\n vibrant: buildSwatch(\n withShare(vividPick),\n {\n cap: 0.24,\n max: 0.84,\n min: 0.62,\n rel: vividPick ? lift(vividPick.rel, 0.4, 0.75, 0.95) * dilution : 0,\n },\n { h: dominantHue, l: 0.78 },\n true,\n minContrast,\n ),\n muted: buildSwatch(\n withShare(mutedPick),\n {\n cap: 0.08,\n max: 0.66,\n min: 0.38,\n rel: mutedPick\n ? clamp(mutedPick.rel, 0.1, 0.3)\n : dominantPick\n ? 0.2\n : 0,\n },\n { h: dominantHue, l: clamp(meanL, 0.38, 0.66) },\n Boolean(mutedPick) || neutral,\n minContrast,\n ),\n accent: buildSwatch(\n withShare(accentPick ?? vividPick),\n {\n cap: 0.24,\n max: 0.8,\n min: 0.55,\n rel: (accentPick ?? vividPick)\n ? lift((accentPick ?? vividPick)!.rel, 0.35, 0.75, 0.92) * dilution\n : 0,\n },\n { h: dominantHue, l: 0.72 },\n Boolean(accentPick),\n minContrast,\n ),\n };\n\n // 5. `shadow`: the shadows' own hue when they have one, else the dominant's.\n // In the dark, relative chroma says more than chroma: a navy at L 0.14\n // uses most of what sRGB has there.\n const shadowPick = neutral\n ? null\n : pickBest(\n clusters.filter(\n (cluster) => cluster.l <= 0.5 && cluster.c >= 0.02 && cluster.pop >= 0.02,\n ),\n (cluster) => cluster.pop * cluster.rel * smoothstep(0.05, 0.14, cluster.l),\n );\n const deepSource = shadowPick ?? dominantPick;\n const shadowL = clamp(\n options.shadowLightness + (meanL - 0.45) * 0.06,\n options.shadowLightness - 0.02,\n options.shadowLightness + 0.02,\n );\n const shadow = deepSource\n ? toneOf(deepSource.h, shadowL, lift(deepSource.rel, 0.3, 0.7, 0.85), 0.1)\n : { c: 0, h: 0, l: shadowL };\n\n // 6. Regions: the most telling cluster in each part of the frame.\n const regions = {} as Record<AmbientRegion, AmbientRegionColor>;\n AMBIENT_REGIONS.forEach((region, r) => {\n const weights = regionWeights[r];\n let regionTotal = 0;\n let regionL = 0;\n clusters.forEach((cluster, j) => {\n regionTotal += weights[j];\n regionL += cluster.l * weights[j];\n });\n const share = (j: number) => (regionTotal > 0 ? weights[j] / regionTotal : 0);\n let strength = 0;\n let pick: Cluster | null = null;\n let pickScore = 0;\n clusters.forEach((cluster, j) => {\n if (!isChromatic(cluster)) return;\n strength += share(j) * colorfulness(cluster.c) * cluster.rely;\n const score = share(j) * cluster.c * cluster.rely;\n if (score > pickScore) {\n pickScore = score;\n pick = cluster;\n }\n });\n const chosen = neutral || strength < MIN_PRESENCE ? null : (pick as Cluster | null);\n const tone = chosen\n ? toneOf(\n chosen.h,\n clamp(chosen.l, 0.42, 0.72),\n lift(chosen.rel, 0.25, 0.85, 0.9),\n 0.22,\n )\n : {\n c: 0,\n h: 0,\n l: clamp(regionTotal > 0 ? regionL / regionTotal : meanL, 0.3, 0.7),\n };\n regions[region] = {\n c: round3(tone.c),\n color: formatOklch(tone),\n h: Math.round(tone.h * 10) / 10,\n l: round3(tone.l),\n strength: round3(chosen ? clamp(strength, 0, 1) : 0),\n };\n });\n\n return {\n neutral,\n regions,\n roles,\n shadow: formatOklch(shadow),\n };\n}\n\n/** Width and height that fit `width × height` inside `size` on the long side. */\nexport function fitSample(width: number, height: number, size: number) {\n const scale = Math.min(1, size / Math.max(width, height, 1));\n return {\n height: Math.max(1, Math.round(height * scale)),\n width: Math.max(1, Math.round(width * scale)),\n };\n}\n","import { analyzeAmbientPixels, fitSample } from \"./analyze\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n} from \"./types\";\n\n// Fetch → decode → analyze, written against what both a window and a worker\n// have (fetch, createImageBitmap, OffscreenCanvas), so the same code runs in\n// either.\n\nexport interface AmbientExtractRequest {\n analysis: AmbientAnalysisOptions;\n /** Absolute URL of a proxy to retry through, if any. */\n proxyUrl: string | null;\n /** Absolute image URL. */\n src: string;\n}\n\nexport type AmbientExtractResult =\n | { palette: AmbientPalette | null; supported: true }\n | { supported: false };\n\ntype Context2D = OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\nexport async function fetchImageBlob(\n src: string,\n proxyUrl: string | null,\n): Promise<Blob | null> {\n if (typeof fetch !== \"function\") return null;\n\n const read = async (url: string, init?: RequestInit) => {\n const response = await fetch(url, { ...init, mode: \"cors\" });\n if (!response.ok) return null;\n const blob = await response.blob();\n // An HTML error page served with 200 is not an image.\n return blob.type.startsWith(\"text/\") ? null : blob;\n };\n\n // 1. The image itself: a CORS request for the URL the page already shows is\n // answered from the HTTP cache, so nothing is downloaded twice.\n try {\n const blob = await read(src);\n if (blob) return blob;\n } catch {\n // 2. Blocked. Some CDNs (TMDB's among them) send CORS headers only when\n // asked and do not `Vary: Origin`, so the copy an <img> cached has none.\n // Fetching past the cache gets one that has them, once.\n if (isCrossOrigin(src)) {\n try {\n const blob = await read(src, { cache: \"reload\" });\n if (blob) return blob;\n } catch {}\n }\n }\n\n // 3. Through the proxy.\n if (proxyUrl) {\n try {\n return await read(proxyUrl);\n } catch {}\n }\n return null;\n}\n\nfunction isCrossOrigin(url: string): boolean {\n try {\n return new URL(url).origin !== globalThis.location?.origin;\n } catch {\n return false;\n }\n}\n\nexport function createContext2D(width: number, height: number): Context2D | null {\n if (typeof OffscreenCanvas === \"function\") {\n return new OffscreenCanvas(width, height).getContext(\"2d\", {\n willReadFrequently: true,\n });\n }\n if (typeof document !== \"undefined\") {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n return null;\n}\n\nexport function readPixels(\n image: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n size: number,\n): AmbientPixels | null {\n const { height, width } = fitSample(sourceWidth, sourceHeight, size);\n const context = createContext2D(width, height);\n if (!context) return null;\n context.drawImage(image, 0, 0, width, height);\n return { data: context.getImageData(0, 0, width, height).data, height, width };\n}\n\n/**\n * Decodes off the main thread: `createImageBitmap` decodes (and, where\n * supported, downscales) in the browser's image pipeline, so only a small\n * bitmap is ever drawn.\n */\nexport async function decodeBlob(\n blob: Blob,\n size: number,\n): Promise<AmbientPixels | null> {\n if (typeof createImageBitmap !== \"function\") return null;\n let bitmap: ImageBitmap;\n try {\n bitmap = await createImageBitmap(blob, {\n resizeQuality: \"medium\",\n resizeWidth: size,\n });\n } catch {\n bitmap = await createImageBitmap(blob);\n }\n try {\n return readPixels(bitmap, bitmap.width, bitmap.height, size);\n } finally {\n bitmap.close();\n }\n}\n\nexport const canDecodeHere = () =>\n typeof createImageBitmap === \"function\" &&\n (typeof OffscreenCanvas === \"function\" || typeof document !== \"undefined\");\n\nexport async function extractHere(\n request: AmbientExtractRequest,\n): Promise<AmbientExtractResult> {\n if (!canDecodeHere()) return { supported: false };\n const blob = await fetchImageBlob(request.src, request.proxyUrl);\n if (!blob) return { palette: null, supported: true };\n try {\n const pixels = await decodeBlob(blob, request.analysis.sampleSize);\n return {\n palette: pixels ? analyzeAmbientPixels(pixels, request.analysis) : null,\n supported: true,\n };\n } catch {\n return { palette: null, supported: true };\n }\n}\n","import { extractHere, type AmbientExtractRequest } from \"../pipeline\";\n\n// `@omerdlw/base-framework/ambient/worker`: runs extraction off the main thread.\n//\n// // ambient.worker.ts (in the app)\n// import { serveAmbientWorker } from \"@omerdlw/base-framework/ambient/worker\";\n// serveAmbientWorker();\n//\n// // once, on the client\n// configureAmbient({\n// worker: () =>\n// new Worker(new URL(\"./ambient.worker.ts\", import.meta.url), { type: \"module\" }),\n// });\n\nexport const AMBIENT_WORKER_REQUEST = \"ambient:extract\";\nexport const AMBIENT_WORKER_RESPONSE = \"ambient:palette\";\n\nexport interface AmbientWorkerRequest extends AmbientExtractRequest {\n id: number;\n type: typeof AMBIENT_WORKER_REQUEST;\n}\n\nexport interface AmbientWorkerScope {\n addEventListener(type: \"message\", listener: (event: MessageEvent) => void): void;\n postMessage(message: unknown): void;\n removeEventListener(type: \"message\", listener: (event: MessageEvent) => void): void;\n}\n\n/** Answers extraction requests in a worker. Returns a function that stops it. */\nexport function serveAmbientWorker(\n scope: AmbientWorkerScope = globalThis as unknown as AmbientWorkerScope,\n): () => void {\n const onMessage = async (event: MessageEvent) => {\n const request = event.data as AmbientWorkerRequest | null;\n if (request?.type !== AMBIENT_WORKER_REQUEST) return;\n let result: Awaited<ReturnType<typeof extractHere>>;\n try {\n result = await extractHere(request);\n } catch {\n result = { palette: null, supported: true };\n }\n scope.postMessage({ ...result, id: request.id, type: AMBIENT_WORKER_RESPONSE });\n };\n scope.addEventListener(\"message\", onMessage);\n return () => scope.removeEventListener(\"message\", onMessage);\n}\n","import { analyzeAmbientPixels } from \"./analyze\";\nimport {\n extractHere,\n fetchImageBlob,\n readPixels,\n type AmbientExtractRequest,\n type AmbientExtractResult,\n} from \"./pipeline\";\nimport {\n getAmbientSettings,\n resolveAnalysis,\n resolveProxyUrl,\n} from \"./settings\";\nimport {\n AMBIENT_WORKER_REQUEST,\n AMBIENT_WORKER_RESPONSE,\n} from \"./worker/index\";\nimport type {\n AmbientExtractOptions,\n AmbientImageSource,\n AmbientPalette,\n} from \"./types\";\n\nconst WORKER_PATIENCE = 15_000;\n\nconst paletteCache = new Map<string, AmbientPalette>();\nconst inFlight = new Map<string, Promise<AmbientPalette | null>>();\n\nfunction cachePalette(key: string, palette: AmbientPalette): void {\n paletteCache.delete(key);\n const limit = Math.max(1, getAmbientSettings().cacheLimit);\n while (paletteCache.size >= limit) {\n const oldest = paletteCache.keys().next().value;\n if (oldest === undefined) break;\n paletteCache.delete(oldest);\n }\n paletteCache.set(key, palette);\n}\n\n/**\n * Seeds the client cache with a palette computed elsewhere (usually on the\n * server), so the same image is never extracted again in this tab.\n */\nexport function primeAmbientPalette(src: string, palette: AmbientPalette): void {\n if (src && palette) cachePalette(src, { ...palette, source: src });\n}\n\nexport function getCachedAmbientPalette(src: string): AmbientPalette | null {\n return paletteCache.get(src) ?? null;\n}\n\n// ─── Worker ──────────────────────────────────────────────────────────────\n\ninterface WorkerSlot {\n factory: () => Worker;\n next: number;\n pending: Map<number, (result: AmbientExtractResult | null) => void>;\n worker: Worker;\n}\n\nlet slot: WorkerSlot | null = null;\nconst brokenFactories = new WeakSet<() => Worker>();\n\nfunction dropWorker(target: WorkerSlot): void {\n if (slot === target) slot = null;\n target.worker.terminate();\n for (const resolve of target.pending.values()) resolve(null);\n target.pending.clear();\n}\n\nfunction workerSlot(factory: () => Worker): WorkerSlot | null {\n if (slot?.factory === factory) return slot;\n if (slot) dropWorker(slot);\n if (brokenFactories.has(factory)) return null;\n let worker: Worker;\n try {\n worker = factory();\n } catch {\n brokenFactories.add(factory);\n return null;\n }\n const created: WorkerSlot = { factory, next: 1, pending: new Map(), worker };\n worker.addEventListener(\"message\", (event: MessageEvent) => {\n const message = event.data as (AmbientExtractResult & { id: number; type: string }) | null;\n if (message?.type !== AMBIENT_WORKER_RESPONSE) return;\n created.pending.get(message.id)?.(message);\n created.pending.delete(message.id);\n });\n worker.addEventListener(\"error\", () => {\n brokenFactories.add(factory);\n dropWorker(created);\n });\n slot = created;\n return created;\n}\n\nfunction extractInWorker(\n factory: () => Worker,\n request: AmbientExtractRequest,\n): Promise<AmbientExtractResult | null> {\n const target = workerSlot(factory);\n if (!target) return Promise.resolve(null);\n const id = target.next++;\n return new Promise((resolve) => {\n const timer = setTimeout(() => {\n target.pending.delete(id);\n resolve(null);\n }, WORKER_PATIENCE);\n target.pending.set(id, (result) => {\n clearTimeout(timer);\n resolve(result);\n });\n target.worker.postMessage({ ...request, id, type: AMBIENT_WORKER_REQUEST });\n });\n}\n\n// ─── Main thread ─────────────────────────────────────────────────────────\n\nfunction loadImageElement(url: string): Promise<HTMLImageElement | null> {\n return new Promise((resolve) => {\n const image = new Image();\n image.onload = () => resolve(image);\n image.onerror = () => resolve(null);\n image.src = url;\n });\n}\n\nasync function extractOnMainThread(\n request: AmbientExtractRequest,\n): Promise<AmbientPalette | null> {\n const result = await extractHere(request);\n if (result.supported) return result.palette;\n\n // No createImageBitmap: decode through an <img> instead.\n const blob = await fetchImageBlob(request.src, request.proxyUrl);\n if (!blob || typeof URL.createObjectURL !== \"function\") return null;\n const objectUrl = URL.createObjectURL(blob);\n try {\n const image = await loadImageElement(objectUrl);\n const pixels =\n image &&\n readPixels(\n image,\n image.naturalWidth,\n image.naturalHeight,\n request.analysis.sampleSize,\n );\n return pixels ? analyzeAmbientPixels(pixels, request.analysis) : null;\n } catch {\n return null;\n } finally {\n URL.revokeObjectURL(objectUrl);\n }\n}\n\n// ─── Public ──────────────────────────────────────────────────────────────\n\nfunction absoluteUrl(src: string): string {\n try {\n return new URL(src, globalThis.location?.href).href;\n } catch {\n return src;\n }\n}\n\nconst isCrossOrigin = (url: string) => {\n try {\n return new URL(url).origin !== globalThis.location?.origin;\n } catch {\n return false;\n }\n};\n\nasync function extractPalette(\n src: string,\n options: AmbientExtractOptions,\n): Promise<AmbientPalette | null> {\n const settings = getAmbientSettings();\n const strategy = options.strategy ?? settings.strategy;\n const absolute = absoluteUrl(src);\n const proxy = options.proxy === undefined ? settings.proxy : options.proxy;\n const request: AmbientExtractRequest = {\n analysis: resolveAnalysis(options.analysis),\n proxyUrl: isCrossOrigin(absolute)\n ? (() => {\n const proxied = resolveProxyUrl(proxy, absolute);\n return proxied ? absoluteUrl(proxied) : null;\n })()\n : null,\n src: absolute,\n };\n\n if (strategy !== \"main\" && settings.worker && typeof Worker === \"function\") {\n const result = await extractInWorker(settings.worker, request);\n if (result?.supported) return result.palette;\n }\n if (strategy === \"worker\") return null;\n return extractOnMainThread(request);\n}\n\n/**\n * Extracts the palette of an image (cached, with concurrent requests for the\n * same image shared). Resolves `null` on any failure and never throws.\n */\nexport async function extractPaletteFromImage(\n imageSource: AmbientImageSource,\n options: AmbientExtractOptions = {},\n): Promise<AmbientPalette | null> {\n const src = typeof imageSource === \"string\" ? imageSource : imageSource?.src;\n if (!src || typeof window === \"undefined\") return null;\n\n const strategy = options.strategy ?? getAmbientSettings().strategy;\n if (strategy === \"none\") return getCachedAmbientPalette(src);\n\n const key = options.analysis ? `${src}#${JSON.stringify(options.analysis)}` : src;\n const cached = paletteCache.get(key);\n if (cached) return cached;\n\n let pending = inFlight.get(key);\n if (!pending) {\n pending = extractPalette(src, options)\n .catch(() => null)\n .then((palette) => {\n if (!palette) return null;\n const sourced = { ...palette, source: src };\n cachePalette(key, sourced);\n return sourced;\n })\n .finally(() => inFlight.delete(key));\n inFlight.set(key, pending);\n }\n return pending;\n}\n","import { AMBIENT_REGIONS, AMBIENT_ROLES, getAmbientSettings } from \"./settings\";\nimport type {\n AmbientCssVarConfig,\n AmbientCssVarNames,\n AmbientImageSource,\n AmbientPalette,\n AmbientTarget,\n AmbientTone,\n} from \"./types\";\n\nexport type ResolvedCssVars = AmbientCssVarNames & {\n tones: readonly AmbientTone[] | false;\n};\n\nexport function resolveCssVarNames(\n overrides?: AmbientCssVarConfig | null,\n): ResolvedCssVars {\n const base = getAmbientSettings().cssVars;\n return overrides ? { ...base, ...overrides } : base;\n}\n\nconst fill = (template: string, values: Record<string, string | number>) =>\n template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n key in values ? String(values[key]) : match,\n );\n\nexport function resolveTargetElement(\n target: AmbientTarget,\n): HTMLElement | null {\n if (typeof document === \"undefined\") return null;\n if (!target) return document.documentElement;\n if (typeof target === \"string\") {\n return document.querySelector<HTMLElement>(target);\n }\n return \"current\" in target ? target.current : target;\n}\n\n/** `colors` keys are custom property names; a bare name gets `--color-`. */\nexport function normalizeColorMap(\n colors: Record<string, string>,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(colors)) {\n if (!value) continue;\n result[key.startsWith(\"--\") ? key : `--color-${key}`] = value;\n }\n return result;\n}\n\nexport function applyScopedCssVariables(\n element: HTMLElement,\n varMap: Record<string, string>,\n): () => void {\n const previous = new Map<string, { priority: string; value: string }>();\n for (const [name, value] of Object.entries(varMap)) {\n if (!name || !value) continue;\n previous.set(name, {\n priority: element.style.getPropertyPriority(name),\n value: element.style.getPropertyValue(name),\n });\n element.style.setProperty(name, value);\n }\n\n return () => {\n for (const [name, { priority, value }] of previous) {\n if (value) element.style.setProperty(name, value, priority);\n else element.style.removeProperty(name);\n }\n };\n}\n\n/** Every variable a palette writes: shadow, roles, `on` colours, ramps, regions. */\nexport function paletteVarMap(\n palette: AmbientPalette | null | undefined,\n names: ResolvedCssVars = resolveCssVarNames(),\n): Record<string, string> {\n const varMap: Record<string, string> = {};\n if (!palette) return varMap;\n if (names.shadow) varMap[names.shadow] = palette.shadow;\n for (const role of AMBIENT_ROLES) {\n const swatch = palette.roles[role];\n if (names.role) varMap[fill(names.role, { role })] = swatch.color;\n if (names.on) varMap[fill(names.on, { role })] = swatch.on;\n if (names.tone && names.tones) {\n for (const tone of names.tones) {\n varMap[fill(names.tone, { role, tone })] = swatch.ramp[tone];\n }\n }\n }\n if (names.region) {\n for (const region of AMBIENT_REGIONS) {\n varMap[fill(names.region, { region })] = palette.regions[region].color;\n }\n }\n return varMap;\n}\n\nexport function resolveAmbientVarMap({\n colors = null,\n cssVars = null,\n image = null,\n palette = null,\n}: {\n colors?: Record<string, string> | null;\n cssVars?: AmbientCssVarConfig | null;\n image?: AmbientImageSource;\n palette?: AmbientPalette | null;\n}): Record<string, string> {\n const varMap: Record<string, string> = image\n ? paletteVarMap(palette, resolveCssVarNames(cssVars))\n : {};\n if (colors) Object.assign(varMap, normalizeColorMap(colors));\n return varMap;\n}\n","\"use client\";\n\nimport { use, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport { shallowEqual } from \"@/utils\";\nimport { useModuleTheme } from \"@/theme\";\nimport { ambientTheme } from \"./constants\";\nimport { AmbientContext } from \"./context\";\nimport { extractPaletteFromImage, primeAmbientPalette } from \"./extractor\";\nimport {\n applyScopedCssVariables,\n resolveAmbientVarMap,\n resolveTargetElement,\n} from \"./dom\";\nimport type {\n AmbientConfig,\n AmbientContextValue,\n AmbientExtractOptions,\n AmbientImageSource,\n AmbientPalette,\n AmbientState,\n} from \"./types\";\n\nexport function useStableObject<T extends object | null | undefined>(value: T): T {\n const ref = useRef<T>(value);\n if (!shallowEqual(ref.current, value)) {\n ref.current = value;\n }\n return ref.current;\n}\n\nexport function useAmbientColor(\n imageSource: AmbientImageSource,\n options: AmbientExtractOptions | null = null,\n): { isExtracting: boolean; palette: AmbientPalette | null } {\n const stableOptions = useStableObject(options);\n const initialPalette = useStableObject(options?.initialPalette ?? null);\n\n const srcKey =\n typeof imageSource === \"string\" ? imageSource : imageSource?.src;\n\n // A palette made for this very image (on the server, say) is used as is.\n const seeded =\n srcKey && initialPalette?.source === srcKey ? initialPalette : null;\n\n // The outcome of the last extraction: `palette` is null when it failed.\n const [result, setResult] = useState<{\n palette: AmbientPalette | null;\n source: string;\n } | null>(null);\n\n const settled = result?.source === srcKey ? result : null;\n const isExtracting = Boolean(imageSource && !seeded && !settled);\n\n useEffect(() => {\n if (seeded && srcKey) primeAmbientPalette(srcKey, seeded);\n }, [seeded, srcKey]);\n\n useEffect(() => {\n if (!imageSource || !srcKey || seeded) return;\n\n let active = true;\n\n void extractPaletteFromImage(imageSource, stableOptions ?? {})\n .catch(() => null)\n .then((palette) => {\n if (active) setResult({ palette, source: srcKey });\n });\n\n return () => {\n active = false;\n };\n }, [imageSource, seeded, srcKey, stableOptions]);\n\n const palette = imageSource\n ? (seeded ?? settled?.palette ?? initialPalette)\n : initialPalette;\n\n return { isExtracting, palette };\n}\n\nexport function useAmbientTheme(\n config: AmbientConfig | string | null = null,\n): AmbientState {\n const ambientActions = use(AmbientContext)?.actions ?? null;\n const normalizedConfig: AmbientConfig =\n typeof config === \"string\" ? { image: config } : config || {};\n\n const {\n colors = null,\n cssVars = null,\n image = null,\n initialPalette = null,\n options = null,\n scope = null,\n transition = true,\n } = normalizedConfig;\n\n const stableInitialPalette = useStableObject(initialPalette);\n const stableOptions = useStableObject(options);\n const stableColors = useStableObject(colors);\n const stableCssVars = useStableObject(cssVars);\n\n const resolvedOptions = useMemo<AmbientExtractOptions>(\n () => ({\n ...(stableOptions || {}),\n ...(stableInitialPalette ? { initialPalette: stableInitialPalette } : {}),\n }),\n [stableInitialPalette, stableOptions],\n );\n\n const { palette: extractedPalette, isExtracting } = useAmbientColor(\n image,\n resolvedOptions,\n );\n\n const hasActiveConfig = Boolean(image || stableColors);\n\n useEffect(() => {\n if (!hasActiveConfig || !ambientActions) return;\n ambientActions.setIsExtracting(isExtracting);\n ambientActions.setPalette((prev) =>\n shallowEqual(prev, extractedPalette) ? prev : extractedPalette,\n );\n }, [ambientActions, extractedPalette, hasActiveConfig, isExtracting]);\n\n const transitionClasses = useModuleTheme(ambientTheme)\n .slots.transition.split(/\\s+/)\n .filter(Boolean);\n const transitionKey = transitionClasses.join(\" \");\n\n const resolvedVarMap = useMemo(\n () =>\n resolveAmbientVarMap({\n colors: stableColors,\n cssVars: stableCssVars,\n image,\n palette: extractedPalette,\n }),\n [extractedPalette, image, stableColors, stableCssVars],\n );\n\n useEffect(() => {\n if (Object.keys(resolvedVarMap).length === 0) return;\n\n const targetEl = resolveTargetElement(scope);\n if (!targetEl) return;\n\n if (transition) {\n targetEl.classList.add(...transitionKey.split(\" \").filter(Boolean));\n }\n\n const restoreVariables = applyScopedCssVariables(targetEl, resolvedVarMap);\n\n return () => {\n restoreVariables();\n if (transition && scope) {\n targetEl.classList.remove(...transitionKey.split(\" \").filter(Boolean));\n }\n };\n }, [resolvedVarMap, scope, transition, transitionKey]);\n\n return { isExtracting, palette: extractedPalette };\n}\n\nexport function useAmbient(\n configOrImage?: AmbientConfig | string | null,\n): AmbientContextValue {\n const { actions, store } = useRequiredContext(\n AmbientContext,\n \"useAmbient\",\n \"AmbientProvider\",\n );\n const shared = useStore(store);\n const ctx = useMemo<AmbientContextValue>(\n () => ({ ...shared, ...actions }),\n [actions, shared],\n );\n const { isExtracting, palette } = useAmbientTheme(configOrImage ?? null);\n const themeState = useMemo(\n () => ({ isExtracting, palette }),\n [isExtracting, palette],\n );\n\n return useMemo(\n () => (configOrImage ? { ...ctx, ...themeState } : ctx),\n [configOrImage, ctx, themeState],\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n defineModule,\n type PageConfig,\n type PageModuleApi,\n} from \"@/kernel\";\nimport { useOptionalBackgroundState } from \"../background\";\nimport { AmbientContext, AmbientProvider } from \"./context\";\nimport { useAmbientTheme } from \"./hooks\";\nimport type {\n AmbientConfig,\n AmbientDescriptor,\n AmbientOverrides,\n AmbientPageApi,\n AmbientPageConfig,\n AmbientPageSlice,\n DefineAmbientOptions,\n DefinedAmbient,\n} from \"./types\";\n\nconst firstString = (...values: unknown[]): string | null =>\n (values.find((value) => typeof value === \"string\" && value) as string) ??\n null;\n\nexport function resolvePageAmbientTheme(\n slice: AmbientPageSlice | null,\n posterUrl: string | null,\n): Partial<AmbientConfig> | null {\n const ambient = slice?.ambient;\n const banner = slice?.banner ?? null;\n const defaultImage = banner ?? posterUrl;\n\n if (ambient === false) return null;\n if (ambient === true || typeof ambient === \"string\") {\n return { image: typeof ambient === \"string\" ? ambient : defaultImage };\n }\n if (ambient && typeof ambient === \"object\") {\n return { image: ambient.image ?? defaultImage, ...ambient };\n }\n if (banner && !posterUrl) return { image: banner };\n return null;\n}\n\nexport function selectPageAmbient(config: PageConfig): AmbientPageSlice {\n return {\n ambient: config.ambient,\n banner: firstString(config.dock?.banner, config.dock?.bannerUrl),\n };\n}\n\nexport function useAmbientPage(\n slice: AmbientPageSlice | null,\n page: PageModuleApi,\n): AmbientPageApi {\n const posterUrl = useOptionalBackgroundState(\n (background) => background.posterUrl,\n );\n const theme = useMemo(\n () => resolvePageAmbientTheme(slice, posterUrl),\n [posterUrl, slice],\n );\n useAmbientTheme(theme);\n return useMemo(\n () => ({ set: (ambient: AmbientPageConfig) => page.set({ ambient }) }),\n [page],\n );\n}\n\nexport const ambientModule = defineModule({\n id: \"ambient\",\n context: AmbientContext,\n Provider: AmbientProvider,\n uses: [\"background\"],\n page: {\n select: selectPageAmbient,\n use: useAmbientPage,\n },\n});\n\ndeclare module \"@omerdlw/base-framework/kernel\" {\n interface CoreModules {\n ambient: typeof ambientModule;\n }\n interface PageConfig {\n ambient?: AmbientPageConfig;\n }\n}\n\nfunction resolveValue<T, P>(value: T | ((props: P) => T), props: P): T {\n return typeof value === \"function\"\n ? (value as (props: P) => T)(props)\n : value;\n}\n\nexport function defineAmbient(\n definition: DefineAmbientOptions = {},\n): DefinedAmbient {\n const { defaultProps, id = \"ambient-theme\", ...config } = definition;\n\n const create = (\n props: Record<string, unknown> = {},\n { id: overrideId, ...overrides }: AmbientOverrides = {},\n ): AmbientDescriptor => {\n const mergedProps = { ...defaultProps, ...props };\n const merged = { ...config, ...overrides };\n\n return {\n ...merged,\n colors: resolveValue(merged.colors ?? null, mergedProps) ?? null,\n id: overrideId ?? id,\n image: resolveValue(merged.image ?? null, mergedProps),\n initialPalette: merged.initialPalette ?? null,\n options: { ...config.options, ...overrides.options },\n props: mergedProps,\n scope: merged.scope ?? null,\n transition: merged.transition ?? true,\n };\n };\n\n return Object.freeze({\n config: definition,\n create,\n id,\n use: function useDefinedAmbient(\n props?: Record<string, unknown>,\n overrides?: AmbientOverrides,\n ) {\n return useAmbientTheme(create(props, overrides));\n },\n });\n}\n"]}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { getOrCreateGlobalContext, defineModule, useRegistryValue } from './chunk-GF7TUX5I.js';
|
|
2
|
+
import { createStore, useRequiredContext, shallowEqual, useStore } from './chunk-TV3WEF5G.js';
|
|
3
|
+
import { useMemo, useState, useRef, useEffect, useId, useCallback, useContext } from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/modules/media/constants.ts
|
|
7
|
+
var DEFAULT_MEDIA_STATE = Object.freeze({
|
|
8
|
+
audibleElement: null,
|
|
9
|
+
element: null,
|
|
10
|
+
hasMedia: false,
|
|
11
|
+
isPlaying: false,
|
|
12
|
+
kind: null,
|
|
13
|
+
loop: false,
|
|
14
|
+
sourceId: null
|
|
15
|
+
});
|
|
16
|
+
var INERT_MEDIA_ACTIONS = Object.freeze({
|
|
17
|
+
removeSource: () => {
|
|
18
|
+
},
|
|
19
|
+
setMuted: () => {
|
|
20
|
+
},
|
|
21
|
+
toggle: () => {
|
|
22
|
+
},
|
|
23
|
+
toggleLoop: () => {
|
|
24
|
+
},
|
|
25
|
+
upsertSource: () => {
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
var MEDIA_SYNC_DRIFT_SECONDS = 0.3;
|
|
29
|
+
var MEDIA_REGISTRY_KEY = "page-media";
|
|
30
|
+
var PAGE_MEDIA_ID = "page";
|
|
31
|
+
|
|
32
|
+
// src/modules/media/playback.ts
|
|
33
|
+
var noop = () => {
|
|
34
|
+
};
|
|
35
|
+
function toggleElement(element) {
|
|
36
|
+
if (!element) return;
|
|
37
|
+
if (element.paused || element.ended) {
|
|
38
|
+
void Promise.resolve(element.play()).catch(noop);
|
|
39
|
+
} else {
|
|
40
|
+
element.pause();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function safePlay(element) {
|
|
44
|
+
try {
|
|
45
|
+
void Promise.resolve(element.play()).catch(noop);
|
|
46
|
+
} catch {
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function sameElements(a, b) {
|
|
50
|
+
return a.length === b.length && a.every((element, index) => element === b[index]);
|
|
51
|
+
}
|
|
52
|
+
function bindFollowers(transport, followers) {
|
|
53
|
+
const ownLoops = followers.map((follower) => follower.loop);
|
|
54
|
+
const align = (hard) => {
|
|
55
|
+
const time = Number(transport.currentTime) || 0;
|
|
56
|
+
for (const follower of followers) {
|
|
57
|
+
follower.loop = false;
|
|
58
|
+
if (follower.playbackRate !== transport.playbackRate) {
|
|
59
|
+
follower.playbackRate = transport.playbackRate;
|
|
60
|
+
}
|
|
61
|
+
const drift = Math.abs((Number(follower.currentTime) || 0) - time);
|
|
62
|
+
if (hard || drift > MEDIA_SYNC_DRIFT_SECONDS) follower.currentTime = time;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const play = () => {
|
|
66
|
+
align(false);
|
|
67
|
+
followers.forEach(safePlay);
|
|
68
|
+
};
|
|
69
|
+
const pause = () => followers.forEach((follower) => follower.pause());
|
|
70
|
+
const hardAlign = () => align(true);
|
|
71
|
+
const softAlign = () => align(false);
|
|
72
|
+
const listeners = [
|
|
73
|
+
["play", play],
|
|
74
|
+
["playing", play],
|
|
75
|
+
["pause", pause],
|
|
76
|
+
["waiting", pause],
|
|
77
|
+
["ended", pause],
|
|
78
|
+
["seeking", hardAlign],
|
|
79
|
+
["seeked", hardAlign],
|
|
80
|
+
["ratechange", softAlign],
|
|
81
|
+
["timeupdate", softAlign]
|
|
82
|
+
];
|
|
83
|
+
for (const [type, listener] of listeners) {
|
|
84
|
+
transport.addEventListener(type, listener);
|
|
85
|
+
}
|
|
86
|
+
hardAlign();
|
|
87
|
+
if (!transport.paused && !transport.ended) play();
|
|
88
|
+
return () => {
|
|
89
|
+
for (const [type, listener] of listeners) {
|
|
90
|
+
transport.removeEventListener(type, listener);
|
|
91
|
+
}
|
|
92
|
+
followers.forEach((follower, index) => {
|
|
93
|
+
follower.loop = ownLoops[index];
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/modules/media/session.ts
|
|
99
|
+
function newest(sources) {
|
|
100
|
+
return sources.reduce((a, b) => b.order > a.order ? b : a);
|
|
101
|
+
}
|
|
102
|
+
function resolveMediaSession(sources) {
|
|
103
|
+
if (sources.length === 0) return null;
|
|
104
|
+
const ids = new Set(sources.map((source) => source.id));
|
|
105
|
+
const wantsFollow = (source) => Boolean(source.follow) && source.follow !== source.id && ids.has(source.follow);
|
|
106
|
+
const rootIds = new Set(
|
|
107
|
+
sources.filter((source) => !wantsFollow(source)).map((source) => source.id)
|
|
108
|
+
);
|
|
109
|
+
const isFollower = (source) => wantsFollow(source) && rootIds.has(source.follow);
|
|
110
|
+
const transport = newest(sources.filter((source) => !isFollower(source)));
|
|
111
|
+
const followers = sources.filter((source) => isFollower(source) && source.follow === transport.id).sort((a, b) => a.order - b.order);
|
|
112
|
+
const audioFollowers = followers.filter((source) => source.kind === "audio");
|
|
113
|
+
return {
|
|
114
|
+
audible: audioFollowers.length > 0 ? newest(audioFollowers) : transport,
|
|
115
|
+
followers,
|
|
116
|
+
transport
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function createMediaState(session) {
|
|
120
|
+
if (!session) return DEFAULT_MEDIA_STATE;
|
|
121
|
+
const { audible, transport } = session;
|
|
122
|
+
return {
|
|
123
|
+
audibleElement: audible.element,
|
|
124
|
+
element: transport.element,
|
|
125
|
+
hasMedia: true,
|
|
126
|
+
isPlaying: transport.isPlaying,
|
|
127
|
+
kind: transport.kind,
|
|
128
|
+
loop: transport.loop,
|
|
129
|
+
sourceId: transport.id
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function mediaStatesEqual(a, b) {
|
|
133
|
+
return shallowEqual(a, b);
|
|
134
|
+
}
|
|
135
|
+
function mergeMediaSource(current, input, order) {
|
|
136
|
+
return {
|
|
137
|
+
controls: void 0,
|
|
138
|
+
element: null,
|
|
139
|
+
follow: null,
|
|
140
|
+
isPlaying: false,
|
|
141
|
+
kind: "audio",
|
|
142
|
+
loop: false,
|
|
143
|
+
...current,
|
|
144
|
+
...input,
|
|
145
|
+
order: current?.order ?? order
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function selectPageMedia(media) {
|
|
149
|
+
if (!media) return null;
|
|
150
|
+
if (typeof media === "string") return { src: media };
|
|
151
|
+
return media.src ? media : null;
|
|
152
|
+
}
|
|
153
|
+
function findDisplacedAudio(entries, session, newId) {
|
|
154
|
+
if (!session || session.transport.id !== newId) return [];
|
|
155
|
+
const followerIds = new Set(session.followers.map((entry) => entry.id));
|
|
156
|
+
return entries.filter(
|
|
157
|
+
(entry) => entry.id !== newId && !followerIds.has(entry.id) && entry.kind === "audio" && entry.element !== null && !entry.element.paused
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
var MediaContext = getOrCreateGlobalContext(
|
|
161
|
+
"MediaContext",
|
|
162
|
+
null
|
|
163
|
+
);
|
|
164
|
+
var NOOP_MEDIA_STORE = createStore(DEFAULT_MEDIA_STATE);
|
|
165
|
+
function MediaProvider({ children }) {
|
|
166
|
+
const [store] = useState(
|
|
167
|
+
() => createStore(DEFAULT_MEDIA_STATE, { freezeSnapshots: false })
|
|
168
|
+
);
|
|
169
|
+
const sourcesRef = useRef(/* @__PURE__ */ new Map());
|
|
170
|
+
const sessionRef = useRef(null);
|
|
171
|
+
const orderRef = useRef(0);
|
|
172
|
+
const bindingRef = useRef(null);
|
|
173
|
+
const actions = useMemo(() => {
|
|
174
|
+
const unbind = () => {
|
|
175
|
+
bindingRef.current?.cleanup();
|
|
176
|
+
bindingRef.current = null;
|
|
177
|
+
};
|
|
178
|
+
const rebind = (session) => {
|
|
179
|
+
const transport = session?.transport.element ?? null;
|
|
180
|
+
const followers = (session?.followers ?? []).map(
|
|
181
|
+
(source) => source.element
|
|
182
|
+
);
|
|
183
|
+
const current = bindingRef.current;
|
|
184
|
+
if (current && current.transport === transport && sameElements(current.followers, followers)) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
unbind();
|
|
188
|
+
const live = followers.filter(
|
|
189
|
+
(element) => element !== null
|
|
190
|
+
);
|
|
191
|
+
if (!transport || live.length === 0) return;
|
|
192
|
+
bindingRef.current = {
|
|
193
|
+
cleanup: bindFollowers(transport, live),
|
|
194
|
+
followers,
|
|
195
|
+
transport
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
const commit = () => {
|
|
199
|
+
const session = resolveMediaSession([...sourcesRef.current.values()]);
|
|
200
|
+
sessionRef.current = session;
|
|
201
|
+
rebind(session);
|
|
202
|
+
const next = createMediaState(session);
|
|
203
|
+
store.publish((prev) => mediaStatesEqual(prev, next) ? prev : next);
|
|
204
|
+
};
|
|
205
|
+
const patch = (id, changes) => {
|
|
206
|
+
const current = sourcesRef.current.get(id);
|
|
207
|
+
if (!current) return;
|
|
208
|
+
sourcesRef.current.set(id, { ...current, ...changes });
|
|
209
|
+
commit();
|
|
210
|
+
};
|
|
211
|
+
return {
|
|
212
|
+
removeSource: (id) => {
|
|
213
|
+
if (sourcesRef.current.delete(id)) commit();
|
|
214
|
+
},
|
|
215
|
+
setMuted: (muted) => {
|
|
216
|
+
const audible = sessionRef.current?.audible;
|
|
217
|
+
if (!audible) return;
|
|
218
|
+
if (audible.controls?.setMuted) audible.controls.setMuted(muted);
|
|
219
|
+
else if (audible.element) audible.element.muted = muted;
|
|
220
|
+
},
|
|
221
|
+
toggle: () => {
|
|
222
|
+
const transport = sessionRef.current?.transport;
|
|
223
|
+
if (!transport) return;
|
|
224
|
+
if (transport.controls?.toggle) transport.controls.toggle();
|
|
225
|
+
else toggleElement(transport.element);
|
|
226
|
+
},
|
|
227
|
+
toggleLoop: () => {
|
|
228
|
+
const transport = sessionRef.current?.transport;
|
|
229
|
+
if (!transport) return;
|
|
230
|
+
if (transport.controls?.toggleLoop) {
|
|
231
|
+
transport.controls.toggleLoop();
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const loop = !transport.loop;
|
|
235
|
+
if (transport.element) transport.element.loop = loop;
|
|
236
|
+
patch(transport.id, { loop });
|
|
237
|
+
},
|
|
238
|
+
upsertSource: (input) => {
|
|
239
|
+
const current = sourcesRef.current.get(input.id);
|
|
240
|
+
if (!current) orderRef.current += 1;
|
|
241
|
+
sourcesRef.current.set(
|
|
242
|
+
input.id,
|
|
243
|
+
mergeMediaSource(current, input, orderRef.current)
|
|
244
|
+
);
|
|
245
|
+
commit();
|
|
246
|
+
if (!current) {
|
|
247
|
+
findDisplacedAudio(
|
|
248
|
+
[...sourcesRef.current.values()],
|
|
249
|
+
sessionRef.current,
|
|
250
|
+
input.id
|
|
251
|
+
).forEach((entry) => entry.element?.pause());
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}, [store]);
|
|
256
|
+
useEffect(
|
|
257
|
+
() => () => {
|
|
258
|
+
bindingRef.current?.cleanup();
|
|
259
|
+
bindingRef.current = null;
|
|
260
|
+
},
|
|
261
|
+
[]
|
|
262
|
+
);
|
|
263
|
+
const value = useMemo(
|
|
264
|
+
() => ({ actions, store }),
|
|
265
|
+
[actions, store]
|
|
266
|
+
);
|
|
267
|
+
return /* @__PURE__ */ jsx(MediaContext, { value, children });
|
|
268
|
+
}
|
|
269
|
+
function useMediaState() {
|
|
270
|
+
const { store } = useRequiredContext(
|
|
271
|
+
MediaContext,
|
|
272
|
+
"useMediaState",
|
|
273
|
+
"MediaProvider"
|
|
274
|
+
);
|
|
275
|
+
return useStore(store);
|
|
276
|
+
}
|
|
277
|
+
function useMediaActions() {
|
|
278
|
+
return useRequiredContext(MediaContext, "useMediaActions", "MediaProvider").actions;
|
|
279
|
+
}
|
|
280
|
+
function useOptionalMediaState(selector, isEqual) {
|
|
281
|
+
const ctx = useContext(MediaContext);
|
|
282
|
+
return useStore(
|
|
283
|
+
ctx?.store ?? NOOP_MEDIA_STORE,
|
|
284
|
+
selector,
|
|
285
|
+
isEqual
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
function useOptionalMediaActions() {
|
|
289
|
+
const ctx = useContext(MediaContext);
|
|
290
|
+
return ctx?.actions ?? INERT_MEDIA_ACTIONS;
|
|
291
|
+
}
|
|
292
|
+
function useMedia(options) {
|
|
293
|
+
const generatedId = useId();
|
|
294
|
+
const id = options.id ?? `media-${generatedId}`;
|
|
295
|
+
const { removeSource, upsertSource } = useMediaActions();
|
|
296
|
+
const audioRef = useRef(null);
|
|
297
|
+
const optionsRef = useRef(options);
|
|
298
|
+
const { src, enabled = true } = options;
|
|
299
|
+
const isEnabled = enabled && Boolean(src);
|
|
300
|
+
useEffect(() => {
|
|
301
|
+
optionsRef.current = options;
|
|
302
|
+
});
|
|
303
|
+
useEffect(() => {
|
|
304
|
+
if (!isEnabled || !src) return void 0;
|
|
305
|
+
const audio = new Audio();
|
|
306
|
+
audio.preload = "auto";
|
|
307
|
+
audio.src = src;
|
|
308
|
+
audioRef.current = audio;
|
|
309
|
+
const initial = optionsRef.current;
|
|
310
|
+
audio.loop = Boolean(initial.loop);
|
|
311
|
+
audio.muted = Boolean(initial.muted);
|
|
312
|
+
if (typeof initial.volume === "number") {
|
|
313
|
+
audio.volume = Math.min(1, Math.max(0, initial.volume));
|
|
314
|
+
}
|
|
315
|
+
upsertSource({
|
|
316
|
+
element: audio,
|
|
317
|
+
follow: initial.follow ?? null,
|
|
318
|
+
id,
|
|
319
|
+
isPlaying: false,
|
|
320
|
+
kind: "audio",
|
|
321
|
+
loop: audio.loop
|
|
322
|
+
});
|
|
323
|
+
const syncPlaying = () => upsertSource({ id, isPlaying: !audio.paused && !audio.ended });
|
|
324
|
+
const events = ["play", "playing", "pause", "ended"];
|
|
325
|
+
events.forEach((type) => audio.addEventListener(type, syncPlaying));
|
|
326
|
+
if (!initial.follow && initial.autoplay !== false) {
|
|
327
|
+
void Promise.resolve(audio.play()).catch(() => {
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
return () => {
|
|
331
|
+
events.forEach((type) => audio.removeEventListener(type, syncPlaying));
|
|
332
|
+
audio.pause();
|
|
333
|
+
audio.removeAttribute("src");
|
|
334
|
+
audio.load();
|
|
335
|
+
audioRef.current = null;
|
|
336
|
+
removeSource(id);
|
|
337
|
+
};
|
|
338
|
+
}, [id, isEnabled, removeSource, src, upsertSource]);
|
|
339
|
+
const { follow = null, loop, muted, volume } = options;
|
|
340
|
+
useEffect(() => {
|
|
341
|
+
const audio = audioRef.current;
|
|
342
|
+
if (!audio) return;
|
|
343
|
+
if (loop !== void 0 && !follow) audio.loop = loop;
|
|
344
|
+
if (muted !== void 0) audio.muted = muted;
|
|
345
|
+
if (volume !== void 0) audio.volume = Math.min(1, Math.max(0, volume));
|
|
346
|
+
upsertSource({ follow, id, ...follow ? {} : { loop: audio.loop } });
|
|
347
|
+
}, [follow, id, isEnabled, loop, muted, src, upsertSource, volume]);
|
|
348
|
+
const play = useCallback(() => {
|
|
349
|
+
const audio = audioRef.current;
|
|
350
|
+
if (audio) void Promise.resolve(audio.play()).catch(() => {
|
|
351
|
+
});
|
|
352
|
+
}, []);
|
|
353
|
+
const pause = useCallback(() => audioRef.current?.pause(), []);
|
|
354
|
+
const toggle = useCallback(() => toggleElement(audioRef.current), []);
|
|
355
|
+
return useMemo(
|
|
356
|
+
() => ({ id, pause, play, toggle }),
|
|
357
|
+
[id, pause, play, toggle]
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// src/modules/media/overlay.tsx
|
|
362
|
+
function MediaSource(props) {
|
|
363
|
+
useMedia(props);
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
function MediaOverlay() {
|
|
367
|
+
const page = useRegistryValue(
|
|
368
|
+
"media",
|
|
369
|
+
MEDIA_REGISTRY_KEY
|
|
370
|
+
);
|
|
371
|
+
useMedia({ ...page, id: PAGE_MEDIA_ID, src: page?.src });
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// src/modules/media/module.tsx
|
|
376
|
+
function useMediaPage(_slice, page) {
|
|
377
|
+
const actions = useMediaActions();
|
|
378
|
+
return useMemo(
|
|
379
|
+
() => ({
|
|
380
|
+
...actions,
|
|
381
|
+
set: (media) => page.set({ media })
|
|
382
|
+
}),
|
|
383
|
+
[actions, page]
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
var mediaModule = defineModule({
|
|
387
|
+
id: "media",
|
|
388
|
+
context: MediaContext,
|
|
389
|
+
Provider: MediaProvider,
|
|
390
|
+
Overlay: MediaOverlay,
|
|
391
|
+
registry: {
|
|
392
|
+
cleanupDelayMs: 600,
|
|
393
|
+
keyPolicy: "singleton",
|
|
394
|
+
lifecycle: "immediate",
|
|
395
|
+
singletonKey: MEDIA_REGISTRY_KEY
|
|
396
|
+
},
|
|
397
|
+
page: {
|
|
398
|
+
select: (config) => selectPageMedia(config.media),
|
|
399
|
+
entries: (slice) => [
|
|
400
|
+
{ key: MEDIA_REGISTRY_KEY, value: slice }
|
|
401
|
+
],
|
|
402
|
+
use: useMediaPage
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
export { DEFAULT_MEDIA_STATE, INERT_MEDIA_ACTIONS, MEDIA_REGISTRY_KEY, MEDIA_SYNC_DRIFT_SECONDS, MediaContext, MediaOverlay, MediaProvider, MediaSource, NOOP_MEDIA_STORE, PAGE_MEDIA_ID, bindFollowers, createMediaState, findDisplacedAudio, mediaModule, mediaStatesEqual, mergeMediaSource, resolveMediaSession, safePlay, sameElements, selectPageMedia, toggleElement, useMedia, useMediaActions, useMediaState, useOptionalMediaActions, useOptionalMediaState };
|
|
407
|
+
//# sourceMappingURL=chunk-R2YGFJDJ.js.map
|
|
408
|
+
//# sourceMappingURL=chunk-R2YGFJDJ.js.map
|