@omerdlw/base-framework 1.0.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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-3MSK4XGK.js +9888 -0
- package/dist/chunk-3MSK4XGK.js.map +1 -0
- package/dist/chunk-4GMQKD6F.js +353 -0
- package/dist/chunk-4GMQKD6F.js.map +1 -0
- package/dist/chunk-65ZB4QTQ.js +888 -0
- package/dist/chunk-65ZB4QTQ.js.map +1 -0
- package/dist/chunk-6SG7V77J.js +577 -0
- package/dist/chunk-6SG7V77J.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-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-KKQT46TP.js +26 -0
- package/dist/chunk-KKQT46TP.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-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 -20019
- 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 +12 -4
- 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 -753
- 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 +708 -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 -12130
- package/dist/modules/dock/index.js.map +1 -1
- package/dist/modules/dock/module.d.ts +1 -1
- package/dist/modules/dock/motion.d.ts +41 -915
- package/dist/modules/dock/motion.d.ts.map +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/context.d.ts.map +1 -1
- package/dist/modules/dock/surface/hooks.d.ts +10 -23
- 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/types.d.ts +158 -3
- package/dist/modules/dock/types.d.ts.map +1 -1
- package/dist/modules/index.js +16 -17873
- 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 +8 -5
- 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 -16
- package/dist/modules/ambient/color.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/ambient/oklab.ts","../src/modules/ambient/settings.ts","../src/modules/ambient/quantize.ts","../src/modules/ambient/analyze.ts"],"names":["round","share"],"mappings":"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","file":"chunk-6SG7V77J.js","sourcesContent":["import type { OklchColor } from \"./types\";\n\n// Pure OKLab / OKLCH math shared by the client, the worker and the server.\n// Nothing here touches the DOM or React.\n\nexport type Lab = [l: number, a: number, b: number];\nexport type Rgb = [r: number, g: number, b: number];\n\nconst DEG = Math.PI / 180;\n\nconst LINEAR_LUT = new Float32Array(256);\nfor (let i = 0; i < 256; i++) {\n const v = i / 255;\n LINEAR_LUT[i] = v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function smoothstep(edge0: number, edge1: number, value: number): number {\n const t = clamp((value - edge0) / (edge1 - edge0), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\n/** 8-bit sRGB channels → OKLab. */\nexport function srgbToOklab(r: number, g: number, b: number): Lab {\n const lr = LINEAR_LUT[r & 255];\n const lg = LINEAR_LUT[g & 255];\n const lb = LINEAR_LUT[b & 255];\n\n const l = Math.cbrt(0.4122214708 * lr + 0.5363325363 * lg + 0.0514459929 * lb);\n const m = Math.cbrt(0.2119034982 * lr + 0.6806995451 * lg + 0.1073969566 * lb);\n const s = Math.cbrt(0.0883024619 * lr + 0.2817188376 * lg + 0.6299787005 * lb);\n\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n ];\n}\n\n/** OKLCH → linear sRGB; channels outside 0–1 mean the colour is out of gamut. */\nexport function oklchToLinearSrgb(l: number, c: number, h: number): Rgb {\n const a = c * Math.cos(h * DEG);\n const b = c * Math.sin(h * DEG);\n const l_ = (l + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m_ = (l - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s_ = (l - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l_ - 3.3077115913 * m_ + 0.2309699292 * s_,\n -1.2684380046 * l_ + 2.6097574011 * m_ - 0.3413193965 * s_,\n -0.0041960863 * l_ - 0.7034186147 * m_ + 1.707614701 * s_,\n ];\n}\n\nexport function labToLch([l, a, b]: Lab): OklchColor {\n const c = Math.sqrt(a * a + b * b);\n const h = c < 1e-6 ? 0 : (Math.atan2(b, a) / DEG + 360) % 360;\n return { c, h, l };\n}\n\nconst inGamut = (rgb: Rgb) => rgb.every((v) => v >= -1e-5 && v <= 1 + 1e-5);\n\n/**\n * The most chroma sRGB can show at this lightness and hue (binary search on\n * the gamut boundary). Dark blues and purples have far more room than dark\n * greens or yellows, which is why one fixed chroma never looks right.\n */\nexport function maxChroma(l: number, h: number): number {\n if (l <= 0 || l >= 1) return 0;\n let low = 0;\n let high = 0.4;\n for (let step = 0; step < 18; step++) {\n const middle = (low + high) / 2;\n if (inGamut(oklchToLinearSrgb(l, middle, h))) low = middle;\n else high = middle;\n }\n return low;\n}\n\n/** Share of the available chroma a colour uses (0 grey … 1 on the gamut edge). */\nexport function relativeChroma({ c, h, l }: OklchColor): number {\n const room = maxChroma(l, h);\n return room <= 0 ? 0 : clamp(c / room, 0, 1);\n}\n\nexport function hueDistance(a: number, b: number): number {\n const d = Math.abs(a - b) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/** WCAG 2 relative luminance of an OKLCH colour (gamut-clipped). */\nexport function luminance({ c, h, l }: OklchColor): number {\n const [r, g, b] = oklchToLinearSrgb(l, c, h).map((v) => clamp(v, 0, 1));\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\nexport function contrastRatio(a: OklchColor, b: OklchColor): number {\n const la = luminance(a);\n const lb = luminance(b);\n return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);\n}\n\nconst round = (value: number, digits: number) => {\n const factor = 10 ** digits;\n return Math.round(value * factor) / factor;\n};\n\nexport function formatOklch({ c, h, l }: OklchColor): string {\n const chroma = c < 0.0005 ? 0 : c;\n return `oklch(${round(clamp(l, 0, 1), 3).toFixed(3)} ${round(chroma, 3).toFixed(3)} ${round(chroma === 0 ? 0 : h, 1).toFixed(1)})`;\n}\n\n/**\n * A tone of a hue at lightness `l`, using `rel` of the chroma sRGB allows\n * there (never more than `cap`). This keeps a hue's character across a whole\n * ramp: dark tones of blue stay blue instead of collapsing to grey.\n */\nexport function toneOf(\n h: number,\n l: number,\n rel: number,\n cap = 0.3,\n): OklchColor {\n const room = maxChroma(l, h) * 0.96;\n return { c: Math.min(cap, clamp(rel, 0, 1) * room), h, l };\n}\n\n/**\n * Text colour for a background: a near-white or near-black carrying a hint of\n * the background's hue, pushed toward pure white / black until it reaches\n * `minContrast` (WCAG 2 ratio).\n */\nexport function onColorFor(\n background: OklchColor,\n minContrast = 4.5,\n): OklchColor {\n const light = (l: number) => toneOf(background.h, l, 0.12, 0.012);\n const dark = (l: number) => toneOf(background.h, l, 0.35, 0.03);\n const towardLight = contrastRatio(light(0.985), background);\n const towardDark = contrastRatio(dark(0.18), background);\n const useLight = towardLight >= minContrast || towardLight >= towardDark;\n\n for (let step = 0; step <= 12; step++) {\n const candidate = useLight\n ? light(Math.min(1, 0.985 + step * 0.0025))\n : dark(Math.max(0, 0.18 - step * 0.015));\n if (contrastRatio(candidate, background) >= minContrast) return candidate;\n }\n return useLight ? { c: 0, h: 0, l: 1 } : { c: 0, h: 0, l: 0 };\n}\n","import type {\n AmbientAnalysisOptions,\n AmbientCssVarNames,\n AmbientProxy,\n AmbientSettings,\n AmbientSettingsInput,\n AmbientTone,\n} from \"./types\";\n\nexport const AMBIENT_TONES = Object.freeze([\n 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 95,\n] as const) satisfies readonly AmbientTone[];\n\nexport const AMBIENT_ROLES = Object.freeze([\n \"dominant\",\n \"vibrant\",\n \"muted\",\n \"accent\",\n] as const);\n\nexport const AMBIENT_REGIONS = Object.freeze([\n \"top\",\n \"bottom\",\n \"left\",\n \"right\",\n \"center\",\n] as const);\n\nexport const DEFAULT_ANALYSIS: Readonly<AmbientAnalysisOptions> = Object.freeze({\n centerWeight: 0.5,\n clusters: 7,\n letterbox: true,\n minContrast: 4.5,\n minHueDistance: 40,\n sampleSize: 128,\n shadowLightness: 0.16,\n});\n\nexport const DEFAULT_CSS_VAR_NAMES: Readonly<AmbientCssVarNames> = Object.freeze({\n on: \"--ambient-on-{role}\",\n region: \"--ambient-{region}\",\n role: \"--ambient-{role}\",\n shadow: \"--ambient-shadow\",\n tone: \"--ambient-{role}-{tone}\",\n});\n\nexport const DEFAULT_PROXY = \"/api/ambient/proxy?url=\";\n\nconst createDefaults = (): AmbientSettings => ({\n analysis: { ...DEFAULT_ANALYSIS },\n cacheLimit: 100,\n cssVars: { ...DEFAULT_CSS_VAR_NAMES, tones: AMBIENT_TONES },\n proxy: DEFAULT_PROXY,\n strategy: \"auto\",\n worker: null,\n});\n\n// Kept on globalThis so every bundled copy of this module (one per package\n// entry) shares one configuration.\nconst SETTINGS_KEY = Symbol.for(\"@omerdlw/base-framework/ambient/settings\");\ntype GlobalWithSettings = typeof globalThis & {\n [SETTINGS_KEY]?: AmbientSettings;\n};\nconst scope = globalThis as GlobalWithSettings;\n\nexport function getAmbientSettings(): AmbientSettings {\n return (scope[SETTINGS_KEY] ??= createDefaults());\n}\n\nexport function mergeAmbientSettings(\n base: AmbientSettings,\n input: AmbientSettingsInput,\n): AmbientSettings {\n return {\n analysis: { ...base.analysis, ...input.analysis },\n cacheLimit: input.cacheLimit ?? base.cacheLimit,\n cssVars: { ...base.cssVars, ...input.cssVars },\n proxy: input.proxy === undefined ? base.proxy : input.proxy,\n strategy: input.strategy ?? base.strategy,\n worker: input.worker === undefined ? base.worker : input.worker,\n };\n}\n\n/**\n * Sets the proxy, CSS variable names, extraction strategy, worker and analysis\n * defaults for every ambient theme. Returns a function that restores the\n * previous settings.\n */\nexport function configureAmbient(input: AmbientSettingsInput): () => void {\n const previous = getAmbientSettings();\n const next = mergeAmbientSettings(previous, input);\n scope[SETTINGS_KEY] = next;\n return () => {\n if (scope[SETTINGS_KEY] === next) scope[SETTINGS_KEY] = previous;\n };\n}\n\nexport function resolveAnalysis(\n overrides?: Partial<AmbientAnalysisOptions> | null,\n): AmbientAnalysisOptions {\n return { ...getAmbientSettings().analysis, ...overrides };\n}\n\n/** The URL to retry through, or `null` when no proxy applies. */\nexport function resolveProxyUrl(proxy: AmbientProxy, src: string): string | null {\n if (!proxy || !/^https?:\\/\\//i.test(src)) return null;\n if (typeof proxy === \"function\") return proxy(src);\n const encoded = encodeURIComponent(src);\n return proxy.includes(\"{url}\")\n ? proxy.replace(\"{url}\", encoded)\n : `${proxy}${encoded}`;\n}\n","export interface KMeansResult {\n /** Index of the cluster each point belongs to. */\n assignment: Int32Array;\n /** `k × 3` OKLab centroids. */\n centroids: Float64Array;\n /** Number of clusters actually found (≤ the requested k). */\n k: number;\n}\n\nexport interface KMeansOptions {\n iterations?: number;\n /** Weight of ΔL² against Δa² + Δb²; below 1 favours hue over lightness. */\n lightnessWeight?: number;\n}\n\n/**\n * Weighted k-means in OKLab with deterministic seeding (the heaviest point,\n * then repeatedly the point that is heaviest × furthest from every seed), so\n * the same pixels always give the same palette on the server and the client.\n *\n * `points` holds `n × 3` OKLab values and `weights` one weight per point.\n */\nexport function kmeans(\n points: Float64Array,\n weights: Float64Array,\n requested: number,\n { iterations = 16, lightnessWeight = 0.45 }: KMeansOptions = {},\n): KMeansResult {\n const n = weights.length;\n const assignment = new Int32Array(n);\n const k = Math.max(0, Math.min(requested, n));\n const centroids = new Float64Array(k * 3);\n if (k === 0) return { assignment, centroids, k };\n\n const distance = (i: number, j: number) => {\n const dl = points[i * 3] - centroids[j * 3];\n const da = points[i * 3 + 1] - centroids[j * 3 + 1];\n const db = points[i * 3 + 2] - centroids[j * 3 + 2];\n return lightnessWeight * dl * dl + da * da + db * db;\n };\n\n let first = 0;\n for (let i = 1; i < n; i++) if (weights[i] > weights[first]) first = i;\n centroids.set(points.subarray(first * 3, first * 3 + 3), 0);\n\n const nearest = new Float64Array(n).fill(Infinity);\n let found = 1;\n for (; found < k; found++) {\n let best = -1;\n let bestScore = 0;\n for (let i = 0; i < n; i++) {\n const d = distance(i, found - 1);\n if (d < nearest[i]) nearest[i] = d;\n const score = weights[i] * nearest[i];\n if (score > bestScore) {\n bestScore = score;\n best = i;\n }\n }\n if (best < 0) break; // every remaining point sits on a seed\n centroids.set(points.subarray(best * 3, best * 3 + 3), found * 3);\n }\n\n const sums = new Float64Array(found * 4);\n for (let round = 0; round < iterations; round++) {\n let moved = round === 0;\n for (let i = 0; i < n; i++) {\n let best = 0;\n let bestDistance = Infinity;\n for (let j = 0; j < found; j++) {\n const d = distance(i, j);\n if (d < bestDistance) {\n bestDistance = d;\n best = j;\n }\n }\n if (assignment[i] !== best) {\n assignment[i] = best;\n moved = true;\n }\n }\n if (!moved) break;\n\n sums.fill(0);\n for (let i = 0; i < n; i++) {\n const j = assignment[i] * 4;\n const w = weights[i];\n sums[j] += points[i * 3] * w;\n sums[j + 1] += points[i * 3 + 1] * w;\n sums[j + 2] += points[i * 3 + 2] * w;\n sums[j + 3] += w;\n }\n for (let j = 0; j < found; j++) {\n const w = sums[j * 4 + 3];\n if (w <= 0) continue; // an empty cluster keeps its seed\n centroids[j * 3] = sums[j * 4] / w;\n centroids[j * 3 + 1] = sums[j * 4 + 1] / w;\n centroids[j * 3 + 2] = sums[j * 4 + 2] / w;\n }\n }\n\n return { assignment, centroids: centroids.slice(0, found * 3), k: found };\n}\n","import {\n clamp,\n formatOklch,\n hueDistance,\n labToLch,\n maxChroma,\n onColorFor,\n smoothstep,\n srgbToOklab,\n toneOf,\n} from \"./oklab\";\nimport { kmeans } from \"./quantize\";\nimport { AMBIENT_REGIONS, AMBIENT_TONES, DEFAULT_ANALYSIS } from \"./settings\";\nimport type {\n AmbientAnalysisOptions,\n AmbientPalette,\n AmbientPixels,\n AmbientRamp,\n AmbientRegion,\n AmbientRegionColor,\n AmbientRole,\n AmbientSwatch,\n OklchColor,\n} from \"./types\";\n\n// Below this chroma a colour reads as grey; its hue is noise.\nconst MIN_CHROMA = 0.022;\n// Below this share of coloured pixels an image is treated as neutral.\nconst MIN_PRESENCE = 0.03;\n// A colour this small still counts as a role when it is vivid enough.\nconst MIN_POPULATION = 0.004;\n\nconst REGION_BITS: Record<AmbientRegion, number> = {\n top: 1,\n bottom: 2,\n left: 4,\n right: 8,\n center: 16,\n};\n\nexport interface Cluster extends OklchColor {\n /** Share of the (centre-weighted) image. */\n pop: number;\n /** Share of the chroma sRGB allows at this lightness and hue. */\n rel: number;\n /** How far the hue can be trusted at this lightness (0–1). */\n rely: number;\n}\n\ninterface Bounds {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\nconst lightnessAt = (data: ArrayLike<number>, index: number) =>\n srgbToOklab(data[index], data[index + 1], data[index + 2])[0];\n\n/**\n * Finds black bars along the edges (letterbox / pillarbox): rows or columns\n * that are uniformly near-black. At most 22% of each side is cut.\n */\nexport function findContentBounds({ data, height, width }: AmbientPixels): Bounds {\n const isBar = (count: number, at: (step: number) => number) => {\n let sum = 0;\n let max = 0;\n let seen = 0;\n for (let step = 0; step < count; step++) {\n const index = at(step);\n if (data[index + 3] < 128) continue;\n const l = lightnessAt(data, index);\n sum += l;\n if (l > max) max = l;\n seen++;\n }\n return seen > 0 && sum / seen < 0.12 && max < 0.2;\n };\n const row = (y: number) => isBar(width, (x) => (y * width + x) * 4);\n const maxRows = Math.floor(height * 0.22);\n const maxColumns = Math.floor(width * 0.22);\n\n let top = 0;\n while (top < maxRows && row(top)) top++;\n let bottom = height;\n while (height - bottom < maxRows && bottom - 1 > top && row(bottom - 1)) bottom--;\n\n const column = (x: number) =>\n isBar(bottom - top, (step) => ((top + step) * width + x) * 4);\n let left = 0;\n while (left < maxColumns && column(left)) left++;\n let right = width;\n while (width - right < maxColumns && right - 1 > left && column(right - 1)) right--;\n\n return { bottom, left, right, top };\n}\n\nconst reliability = (l: number) =>\n smoothstep(0.1, 0.28, l) * (1 - smoothstep(0.9, 0.98, l));\n\nconst colorfulness = (c: number) => smoothstep(MIN_CHROMA, 0.06, c);\n\nconst isChromatic = (cluster: Cluster) =>\n cluster.c >= MIN_CHROMA && cluster.rely > 0;\n\nfunction pickBest<T>(items: T[], score: (item: T) => number): T | null {\n let best: T | null = null;\n let bestScore = 0;\n for (const item of items) {\n const value = score(item);\n if (value > bestScore) {\n bestScore = value;\n best = item;\n }\n }\n return best;\n}\n\nconst round3 = (value: number) => Math.round(value * 1000) / 1000;\n\ninterface ToneSpec {\n cap: number;\n max: number;\n min: number;\n rel: number;\n}\n\nfunction buildSwatch(\n source: Cluster | null,\n { cap, max, min, rel }: ToneSpec,\n fallback: { h: number; l: number },\n fromImage: boolean,\n minContrast: number,\n): AmbientSwatch {\n const h = source?.h ?? fallback.h;\n const l = clamp(source?.l ?? fallback.l, min, max);\n const tone = toneOf(h, l, rel, cap);\n const ramp = {} as AmbientRamp;\n for (const step of AMBIENT_TONES) {\n ramp[step] = formatOklch(toneOf(h, step / 100, rel, cap));\n }\n return {\n c: round3(tone.c),\n color: formatOklch(tone),\n fromImage,\n h: Math.round(h * 10) / 10,\n l: round3(tone.l),\n on: formatOklch(onColorFor(tone, minContrast)),\n population: round3(source?.pop ?? 0),\n ramp,\n };\n}\n\n// How much of the gamut each role uses, from the source colour's own share.\nconst lift = (rel: number, base: number, gain: number, ceiling: number) =>\n clamp(base + gain * rel, 0, ceiling);\n\nexport interface AmbientClustering {\n clusters: Cluster[];\n /** Centre-weighted mean lightness. */\n meanL: number;\n /** Per region, the pixel count of each cluster. */\n regionWeights: Float64Array[];\n}\n\n/**\n * Step one of the analysis: the image's colours as OKLab k-means clusters,\n * with each cluster's share of the frame and of each region.\n */\nexport function clusterAmbientPixels(\n pixels: AmbientPixels,\n options: AmbientAnalysisOptions,\n): AmbientClustering {\n const { data, width, height } = pixels;\n const bounds = options.letterbox\n ? findContentBounds(pixels)\n : { bottom: height, left: 0, right: width, top: 0 };\n const boxWidth = Math.max(1, bounds.right - bounds.left);\n const boxHeight = Math.max(1, bounds.bottom - bounds.top);\n\n // 1. Bin pixels by 15-bit RGB, averaging their OKLab values per bin.\n const binOf = new Int32Array(32768).fill(-1);\n const binSums: number[] = [];\n const pixelBins = new Int32Array(boxWidth * boxHeight).fill(-1);\n const pixelRegions = new Uint8Array(boxWidth * boxHeight);\n const sigma2 = 2 * 0.35 * 0.35;\n let total = 0;\n let sumL = 0;\n\n for (let y = bounds.top; y < bounds.bottom; y++) {\n const v = (y - bounds.top + 0.5) / boxHeight;\n for (let x = bounds.left; x < bounds.right; x++) {\n const index = (y * width + x) * 4;\n if (data[index + 3] < 128) continue;\n const r = data[index];\n const g = data[index + 1];\n const b = data[index + 2];\n const [l, a, bb] = srgbToOklab(r, g, b);\n const u = (x - bounds.left + 0.5) / boxWidth;\n const du = (u - 0.5) * 2;\n const dv = (v - 0.5) * 2;\n const weight =\n 1 -\n options.centerWeight +\n 2 * options.centerWeight * Math.exp(-(du * du + dv * dv) / sigma2);\n\n const key = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);\n let bin = binOf[key];\n if (bin < 0) {\n bin = binSums.length / 4;\n binOf[key] = bin;\n binSums.push(0, 0, 0, 0);\n }\n binSums[bin * 4] += l * weight;\n binSums[bin * 4 + 1] += a * weight;\n binSums[bin * 4 + 2] += bb * weight;\n binSums[bin * 4 + 3] += weight;\n total += weight;\n sumL += l * weight;\n\n const local = (y - bounds.top) * boxWidth + (x - bounds.left);\n pixelBins[local] = bin;\n pixelRegions[local] =\n (v < 1 / 3 ? REGION_BITS.top : 0) |\n (v > 2 / 3 ? REGION_BITS.bottom : 0) |\n (u < 1 / 3 ? REGION_BITS.left : 0) |\n (u > 2 / 3 ? REGION_BITS.right : 0) |\n (Math.abs(u - 0.5) < 0.25 && Math.abs(v - 0.5) < 0.25\n ? REGION_BITS.center\n : 0);\n }\n }\n\n const meanL = total > 0 ? sumL / total : 0.5;\n const bins = binSums.length / 4;\n\n // 2. Cluster coloured and grey bins apart, so the greys of a mostly dark\n // poster cannot use up every cluster and swallow its one red coat.\n const groups: [number[], number[]] = [[], []];\n for (let i = 0; i < bins; i++) {\n const w = binSums[i * 4 + 3];\n const a = binSums[i * 4 + 1] / w;\n const b = binSums[i * 4 + 2] / w;\n const coloured =\n Math.sqrt(a * a + b * b) >= MIN_CHROMA && binSums[i * 4] / w >= 0.06;\n groups[coloured ? 0 : 1].push(i);\n }\n const requested = clamp(Math.round(options.clusters), 2, 16);\n const greyClusters =\n groups[0].length === 0 ? requested : groups[1].length === 0 ? 0 : requested >= 8 ? 3 : 2;\n const budgets = [requested - greyClusters, greyClusters];\n\n const clusters: Cluster[] = [];\n const clusterOfBin = new Int32Array(bins).fill(-1);\n groups.forEach((members, group) => {\n if (members.length === 0 || budgets[group] <= 0) return;\n const points = new Float64Array(members.length * 3);\n const weights = new Float64Array(members.length);\n members.forEach((bin, i) => {\n const w = binSums[bin * 4 + 3];\n const a = binSums[bin * 4 + 1] / w;\n const b = binSums[bin * 4 + 2] / w;\n points[i * 3] = binSums[bin * 4] / w;\n points[i * 3 + 1] = a;\n points[i * 3 + 2] = b;\n // Vivid colours pull harder, so a small saturated area keeps its own cluster.\n weights[i] = w * (1 + 5 * Math.sqrt(a * a + b * b));\n });\n const { assignment, centroids, k } = kmeans(points, weights, budgets[group]);\n const pop = new Float64Array(k);\n members.forEach((bin, i) => (pop[assignment[i]] += binSums[bin * 4 + 3]));\n const index = new Int32Array(k).fill(-1);\n for (let j = 0; j < k; j++) {\n if (pop[j] <= 0) continue;\n const lch = labToLch([centroids[j * 3], centroids[j * 3 + 1], centroids[j * 3 + 2]]);\n const room = maxChroma(lch.l, lch.h);\n index[j] = clusters.length;\n clusters.push({\n ...lch,\n pop: pop[j] / total,\n rel: room > 0 ? clamp(lch.c / room, 0, 1) : 0,\n rely: reliability(lch.l),\n });\n }\n members.forEach((bin, i) => (clusterOfBin[bin] = index[assignment[i]]));\n });\n\n // 3. Region shares per cluster.\n const regionWeights = AMBIENT_REGIONS.map(() => new Float64Array(clusters.length));\n for (let i = 0; i < pixelBins.length; i++) {\n const bin = pixelBins[i];\n if (bin < 0) continue;\n const cluster = clusterOfBin[bin];\n const bits = pixelRegions[i];\n AMBIENT_REGIONS.forEach((region, r) => {\n if (bits & REGION_BITS[region]) regionWeights[r][cluster] += 1;\n });\n }\n\n return { clusters, meanL, regionWeights };\n}\n\n/**\n * The palette of an image: OKLab k-means clusters scored by population ×\n * chroma, turned into four roles (each with a gamut-aware tonal ramp and a\n * contrast-safe text colour), five region colours, and the deep `shadow`\n * tone.\n */\nexport function analyzeAmbientPixels(\n pixels: AmbientPixels,\n overrides: Partial<AmbientAnalysisOptions> = {},\n): AmbientPalette {\n const options = { ...DEFAULT_ANALYSIS, ...overrides };\n const { clusters, meanL, regionWeights } = clusterAmbientPixels(pixels, options);\n\n // 4. Roles.\n const chromatic = clusters.filter(isChromatic);\n const presence = chromatic.reduce(\n (sum, cluster) => sum + cluster.pop * colorfulness(cluster.c) * cluster.rely,\n 0,\n );\n const neutral = presence < MIN_PRESENCE;\n // A coloured detail on an almost grey image is kept, but quieter.\n const dilution = 0.55 + 0.45 * Math.min(1, presence / 0.25);\n const { minContrast, minHueDistance } = options;\n const grey = { h: 0, l: clamp(meanL, 0.3, 0.8) };\n\n // k-means splits one hue into several lightness levels; a hue's share is\n // that of its whole family (clusters within 20°), so it is not undercounted.\n const family = new Map<Cluster, number>();\n for (const cluster of chromatic) {\n let share = 0;\n for (const other of chromatic) {\n if (hueDistance(cluster.h, other.h) <= 20) share += other.pop;\n }\n family.set(cluster, share);\n }\n const share = (cluster: Cluster) => family.get(cluster) ?? cluster.pop;\n const withShare = (cluster: Cluster | null) =>\n cluster ? { ...cluster, pop: share(cluster) } : null;\n\n const dominantPick = neutral\n ? null\n : pickBest(chromatic, (cluster) => share(cluster) * cluster.c * cluster.rely);\n // A grey image keeps a grey `vibrant`: no hue is invented.\n const vividPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => share(cluster) >= MIN_POPULATION),\n (cluster) =>\n cluster.c * cluster.c * Math.pow(share(cluster), 0.3) * cluster.rely,\n );\n // …but a coloured detail on it (the red coat) becomes the accent.\n const accentPick = pickBest(\n chromatic.filter((cluster) =>\n neutral\n ? share(cluster) >= 0.006 && cluster.c >= 0.06\n : share(cluster) >= MIN_POPULATION &&\n cluster.c >= 0.035 &&\n (!dominantPick || hueDistance(cluster.h, dominantPick.h) >= minHueDistance),\n ),\n (cluster) => Math.pow(share(cluster), 0.6) * cluster.c * cluster.rely,\n );\n const mutedPick = neutral\n ? null\n : pickBest(\n chromatic.filter((cluster) => cluster.c <= 0.09),\n (cluster) => share(cluster) * cluster.rely * (1 - cluster.c / 0.12),\n );\n\n const dominantHue = dominantPick?.h ?? vividPick?.h ?? 0;\n const roles: Record<AmbientRole, AmbientSwatch> = {\n dominant: buildSwatch(\n withShare(dominantPick),\n {\n cap: 0.22,\n max: 0.74,\n min: 0.42,\n rel: dominantPick ? lift(dominantPick.rel, 0.25, 0.85, 0.9) : 0,\n },\n grey,\n true,\n minContrast,\n ),\n vibrant: buildSwatch(\n withShare(vividPick),\n {\n cap: 0.24,\n max: 0.84,\n min: 0.62,\n rel: vividPick ? lift(vividPick.rel, 0.4, 0.75, 0.95) * dilution : 0,\n },\n { h: dominantHue, l: 0.78 },\n true,\n minContrast,\n ),\n muted: buildSwatch(\n withShare(mutedPick),\n {\n cap: 0.08,\n max: 0.66,\n min: 0.38,\n rel: mutedPick\n ? clamp(mutedPick.rel, 0.1, 0.3)\n : dominantPick\n ? 0.2\n : 0,\n },\n { h: dominantHue, l: clamp(meanL, 0.38, 0.66) },\n Boolean(mutedPick) || neutral,\n minContrast,\n ),\n accent: buildSwatch(\n withShare(accentPick ?? vividPick),\n {\n cap: 0.24,\n max: 0.8,\n min: 0.55,\n rel: (accentPick ?? vividPick)\n ? lift((accentPick ?? vividPick)!.rel, 0.35, 0.75, 0.92) * dilution\n : 0,\n },\n { h: dominantHue, l: 0.72 },\n Boolean(accentPick),\n minContrast,\n ),\n };\n\n // 5. `shadow`: the shadows' own hue when they have one, else the dominant's.\n // In the dark, relative chroma says more than chroma: a navy at L 0.14\n // uses most of what sRGB has there.\n const shadowPick = neutral\n ? null\n : pickBest(\n clusters.filter(\n (cluster) => cluster.l <= 0.5 && cluster.c >= 0.02 && cluster.pop >= 0.02,\n ),\n (cluster) => cluster.pop * cluster.rel * smoothstep(0.05, 0.14, cluster.l),\n );\n const deepSource = shadowPick ?? dominantPick;\n const shadowL = clamp(\n options.shadowLightness + (meanL - 0.45) * 0.06,\n options.shadowLightness - 0.02,\n options.shadowLightness + 0.02,\n );\n const shadow = deepSource\n ? toneOf(deepSource.h, shadowL, lift(deepSource.rel, 0.3, 0.7, 0.85), 0.1)\n : { c: 0, h: 0, l: shadowL };\n\n // 6. Regions: the most telling cluster in each part of the frame.\n const regions = {} as Record<AmbientRegion, AmbientRegionColor>;\n AMBIENT_REGIONS.forEach((region, r) => {\n const weights = regionWeights[r];\n let regionTotal = 0;\n let regionL = 0;\n clusters.forEach((cluster, j) => {\n regionTotal += weights[j];\n regionL += cluster.l * weights[j];\n });\n const share = (j: number) => (regionTotal > 0 ? weights[j] / regionTotal : 0);\n let strength = 0;\n let pick: Cluster | null = null;\n let pickScore = 0;\n clusters.forEach((cluster, j) => {\n if (!isChromatic(cluster)) return;\n strength += share(j) * colorfulness(cluster.c) * cluster.rely;\n const score = share(j) * cluster.c * cluster.rely;\n if (score > pickScore) {\n pickScore = score;\n pick = cluster;\n }\n });\n const chosen = neutral || strength < MIN_PRESENCE ? null : (pick as Cluster | null);\n const tone = chosen\n ? toneOf(\n chosen.h,\n clamp(chosen.l, 0.42, 0.72),\n lift(chosen.rel, 0.25, 0.85, 0.9),\n 0.22,\n )\n : {\n c: 0,\n h: 0,\n l: clamp(regionTotal > 0 ? regionL / regionTotal : meanL, 0.3, 0.7),\n };\n regions[region] = {\n c: round3(tone.c),\n color: formatOklch(tone),\n h: Math.round(tone.h * 10) / 10,\n l: round3(tone.l),\n strength: round3(chosen ? clamp(strength, 0, 1) : 0),\n };\n });\n\n return {\n neutral,\n regions,\n roles,\n shadow: formatOklch(shadow),\n };\n}\n\n/** Width and height that fit `width × height` inside `size` on the long side. */\nexport function fitSample(width: number, height: number, size: number) {\n const scale = Math.min(1, size / Math.max(width, height, 1));\n return {\n height: Math.max(1, Math.round(height * scale)),\n width: Math.max(1, Math.round(width * scale)),\n };\n}\n"]}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { Z_INDEX } from './chunk-QI3ALLIB.js';
|
|
2
|
+
import { defineThemeSpec, useTheme } from './chunk-7TAVYJ3A.js';
|
|
3
|
+
import { getOrCreateGlobalContext, useModuleRegistration, useRegistryEntries } from './chunk-GF7TUX5I.js';
|
|
4
|
+
import { isPlainObject, createStore, report, useRequiredContext, useStore, acquireGlobalScrollLock } from './chunk-TV3WEF5G.js';
|
|
5
|
+
import { useState, useRef, useCallback, useMemo, useEffect, useSyncExternalStore, useLayoutEffect } from 'react';
|
|
6
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
// src/modules/modal/constants.ts
|
|
9
|
+
var MODAL_POSITIONS = Object.freeze({
|
|
10
|
+
BOTTOM: "bottom",
|
|
11
|
+
CENTER: "center",
|
|
12
|
+
LEFT: "left",
|
|
13
|
+
RIGHT: "right",
|
|
14
|
+
TOP: "top"
|
|
15
|
+
});
|
|
16
|
+
var MODAL_CHROME = Object.freeze({
|
|
17
|
+
BARE: "bare",
|
|
18
|
+
PANEL: "panel"
|
|
19
|
+
});
|
|
20
|
+
var MODAL_BREAKPOINTS = Object.freeze({
|
|
21
|
+
MOBILE_MAX_WIDTH: 639
|
|
22
|
+
});
|
|
23
|
+
var SMOOTH_SCROLL_LOCK_EVENT = "modal:smooth-scroll-lock";
|
|
24
|
+
var FOCUSABLE_SELECTOR = 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable="true"], [tabindex]:not([tabindex="-1"])';
|
|
25
|
+
var HEIGHT_CONSTRAINT_PATTERN = /(\s|^)(?:[\w-]+:)*(?:h|max-h)-/;
|
|
26
|
+
var modalTheme = defineThemeSpec("modal");
|
|
27
|
+
|
|
28
|
+
// src/modules/modal/state.ts
|
|
29
|
+
function createModalState(modalStack = []) {
|
|
30
|
+
const activeModal = modalStack[modalStack.length - 1] || null;
|
|
31
|
+
return {
|
|
32
|
+
activeModalId: activeModal?.id || null,
|
|
33
|
+
chrome: activeModal?.chrome || MODAL_CHROME.PANEL,
|
|
34
|
+
headerActions: activeModal?.headerActions || null,
|
|
35
|
+
isOpen: modalStack.length > 0,
|
|
36
|
+
modalStack,
|
|
37
|
+
modalType: activeModal?.modalType || null,
|
|
38
|
+
position: activeModal?.position || MODAL_POSITIONS.CENTER,
|
|
39
|
+
props: activeModal?.props || {},
|
|
40
|
+
responsivePosition: activeModal?.responsivePosition || null,
|
|
41
|
+
showClose: activeModal?.showClose ?? true,
|
|
42
|
+
title: activeModal?.title || null
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
var INITIAL_MODAL_STATE = createModalState([]);
|
|
46
|
+
|
|
47
|
+
// src/modules/modal/identity.ts
|
|
48
|
+
function getModalIdentity(input) {
|
|
49
|
+
if (typeof input === "string") return { component: null, type: input };
|
|
50
|
+
const options = typeof input === "function" ? { component: input } : input;
|
|
51
|
+
const component = options.component ?? null;
|
|
52
|
+
return {
|
|
53
|
+
component,
|
|
54
|
+
type: "type" in options && options.type || "id" in options && options.id || component?.displayName || component?.name || "modal"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function getModalLabel(modalType) {
|
|
58
|
+
if (typeof modalType !== "string" || !modalType.trim()) return "Modal";
|
|
59
|
+
return modalType.trim().toLowerCase().split(/[_-]+/).map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`).join(" ");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// src/modules/modal/layout.ts
|
|
63
|
+
function hasHeightConstraint(className) {
|
|
64
|
+
return typeof className === "string" && HEIGHT_CONSTRAINT_PATTERN.test(className);
|
|
65
|
+
}
|
|
66
|
+
function isSidePosition(position) {
|
|
67
|
+
return position === MODAL_POSITIONS.LEFT || position === MODAL_POSITIONS.RIGHT;
|
|
68
|
+
}
|
|
69
|
+
function isVerticalEdgePosition(position) {
|
|
70
|
+
return position === MODAL_POSITIONS.TOP || position === MODAL_POSITIONS.BOTTOM;
|
|
71
|
+
}
|
|
72
|
+
function getModalPosition(position) {
|
|
73
|
+
return position === MODAL_POSITIONS.TOP || position === MODAL_POSITIONS.BOTTOM || position === MODAL_POSITIONS.LEFT || position === MODAL_POSITIONS.RIGHT ? position : MODAL_POSITIONS.CENTER;
|
|
74
|
+
}
|
|
75
|
+
function getModalLayout(position, isMobile) {
|
|
76
|
+
const resolved = getModalPosition(position);
|
|
77
|
+
if (!isMobile) return resolved;
|
|
78
|
+
if (resolved === MODAL_POSITIONS.TOP || resolved === MODAL_POSITIONS.BOTTOM)
|
|
79
|
+
return `${resolved}-mobile`;
|
|
80
|
+
if (resolved === MODAL_POSITIONS.LEFT || resolved === MODAL_POSITIONS.RIGHT)
|
|
81
|
+
return "side-mobile";
|
|
82
|
+
return resolved;
|
|
83
|
+
}
|
|
84
|
+
function getViewportIsMobile() {
|
|
85
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return window.matchMedia(
|
|
89
|
+
`(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`
|
|
90
|
+
).matches;
|
|
91
|
+
}
|
|
92
|
+
function resolveActivePosition(position, responsivePosition, isMobileViewport) {
|
|
93
|
+
if (!isPlainObject(responsivePosition)) return position;
|
|
94
|
+
const responsive = isMobileViewport ? responsivePosition.mobile : responsivePosition.desktop;
|
|
95
|
+
return responsive || position;
|
|
96
|
+
}
|
|
97
|
+
function normalizePosition(input) {
|
|
98
|
+
if (typeof input === "string") {
|
|
99
|
+
return { position: input, responsivePosition: null };
|
|
100
|
+
}
|
|
101
|
+
if (!isPlainObject(input)) {
|
|
102
|
+
return { position: MODAL_POSITIONS.CENTER, responsivePosition: null };
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
position: resolveActivePosition(
|
|
106
|
+
MODAL_POSITIONS.CENTER,
|
|
107
|
+
input,
|
|
108
|
+
getViewportIsMobile()
|
|
109
|
+
),
|
|
110
|
+
responsivePosition: input
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
var ModalContext = getOrCreateGlobalContext(
|
|
114
|
+
"ModalContext",
|
|
115
|
+
null
|
|
116
|
+
);
|
|
117
|
+
function ModalProvider({
|
|
118
|
+
children,
|
|
119
|
+
modalRenderer: ModalRenderer = null
|
|
120
|
+
}) {
|
|
121
|
+
const [store] = useState(
|
|
122
|
+
() => createStore(INITIAL_MODAL_STATE, { freezeSnapshots: false })
|
|
123
|
+
);
|
|
124
|
+
const modalStackRef = useRef([]);
|
|
125
|
+
const pendingRef = useRef(/* @__PURE__ */ new Map());
|
|
126
|
+
const modalIdRef = useRef(0);
|
|
127
|
+
const syncModalStack = useCallback(
|
|
128
|
+
(nextStack) => {
|
|
129
|
+
modalStackRef.current = nextStack;
|
|
130
|
+
store.publish(createModalState(nextStack));
|
|
131
|
+
},
|
|
132
|
+
[store]
|
|
133
|
+
);
|
|
134
|
+
const settleModal = useCallback((modalId, result) => {
|
|
135
|
+
const pending = pendingRef.current.get(modalId);
|
|
136
|
+
if (!pending) return;
|
|
137
|
+
pendingRef.current.delete(modalId);
|
|
138
|
+
try {
|
|
139
|
+
const outcome = pending.onClose?.(result);
|
|
140
|
+
if (outcome instanceof Promise) {
|
|
141
|
+
outcome.catch((error) => report("Modal onClose", error));
|
|
142
|
+
}
|
|
143
|
+
} catch (error) {
|
|
144
|
+
report("Modal onClose", error);
|
|
145
|
+
}
|
|
146
|
+
pending.resolve(result);
|
|
147
|
+
}, []);
|
|
148
|
+
const openModal = useCallback(
|
|
149
|
+
(modalInput, options = {}) => {
|
|
150
|
+
if (!modalInput) return Promise.resolve(null);
|
|
151
|
+
const stack = modalStackRef.current;
|
|
152
|
+
const { component, type } = getModalIdentity(modalInput);
|
|
153
|
+
const topEntry = stack[stack.length - 1];
|
|
154
|
+
if (topEntry && (topEntry.modalType === type || component && topEntry.component === component)) {
|
|
155
|
+
return Promise.resolve(null);
|
|
156
|
+
}
|
|
157
|
+
const definition = typeof modalInput === "object" ? modalInput : void 0;
|
|
158
|
+
const merged = {
|
|
159
|
+
...definition,
|
|
160
|
+
...options
|
|
161
|
+
};
|
|
162
|
+
const data = { ...definition?.defaultData, ...options.data };
|
|
163
|
+
const modalId = ++modalIdRef.current;
|
|
164
|
+
const entry = {
|
|
165
|
+
chrome: merged.chrome || MODAL_CHROME.PANEL,
|
|
166
|
+
component,
|
|
167
|
+
headerActions: merged.actions || null,
|
|
168
|
+
id: modalId,
|
|
169
|
+
modalType: type,
|
|
170
|
+
props: data,
|
|
171
|
+
showClose: merged.showClose ?? true,
|
|
172
|
+
title: typeof merged.title === "function" ? merged.title(data) : merged.title ?? null,
|
|
173
|
+
...normalizePosition(merged.position)
|
|
174
|
+
};
|
|
175
|
+
return new Promise((resolve) => {
|
|
176
|
+
pendingRef.current.set(modalId, { onClose: merged.onClose, resolve });
|
|
177
|
+
syncModalStack([...stack, entry]);
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
[syncModalStack]
|
|
181
|
+
);
|
|
182
|
+
const closeModal = useCallback(
|
|
183
|
+
(result = null, targetModalId = null) => {
|
|
184
|
+
const stack = modalStackRef.current;
|
|
185
|
+
const modalId = targetModalId || stack[stack.length - 1]?.id;
|
|
186
|
+
if (!modalId || !stack.some((entry) => entry.id === modalId)) return;
|
|
187
|
+
syncModalStack(stack.filter((entry) => entry.id !== modalId));
|
|
188
|
+
settleModal(modalId, result);
|
|
189
|
+
},
|
|
190
|
+
[settleModal, syncModalStack]
|
|
191
|
+
);
|
|
192
|
+
const closeAllModals = useCallback(
|
|
193
|
+
(result = null) => {
|
|
194
|
+
const stack = modalStackRef.current;
|
|
195
|
+
if (stack.length === 0) return;
|
|
196
|
+
syncModalStack([]);
|
|
197
|
+
stack.forEach((entry) => settleModal(entry.id, result));
|
|
198
|
+
},
|
|
199
|
+
[settleModal, syncModalStack]
|
|
200
|
+
);
|
|
201
|
+
const actionsValue = useMemo(
|
|
202
|
+
() => ({ closeAllModals, closeModal, openModal }),
|
|
203
|
+
[openModal, closeModal, closeAllModals]
|
|
204
|
+
);
|
|
205
|
+
const contextValue = useMemo(
|
|
206
|
+
() => ({ actions: actionsValue, store }),
|
|
207
|
+
[actionsValue, store]
|
|
208
|
+
);
|
|
209
|
+
return /* @__PURE__ */ jsxs(ModalContext, { value: contextValue, children: [
|
|
210
|
+
ModalRenderer && /* @__PURE__ */ jsx(ModalRenderer, {}),
|
|
211
|
+
children
|
|
212
|
+
] });
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// src/modules/modal/dom.ts
|
|
216
|
+
function dispatchSmoothScrollLock(locked) {
|
|
217
|
+
if (typeof window === "undefined") return;
|
|
218
|
+
window.dispatchEvent(
|
|
219
|
+
new CustomEvent(SMOOTH_SCROLL_LOCK_EVENT, {
|
|
220
|
+
detail: { locked, source: "modal" }
|
|
221
|
+
})
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
function getFocusableElements(container) {
|
|
225
|
+
if (!container || typeof container.querySelectorAll !== "function") return [];
|
|
226
|
+
return Array.from(
|
|
227
|
+
container.querySelectorAll(FOCUSABLE_SELECTOR)
|
|
228
|
+
).filter(
|
|
229
|
+
(element) => !element.hasAttribute("disabled") && element.getAttribute("aria-hidden") !== "true"
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
function trapFocus(event, container) {
|
|
233
|
+
if (event.key !== "Tab" || !container) return;
|
|
234
|
+
const elements = getFocusableElements(container);
|
|
235
|
+
if (elements.length === 0) return;
|
|
236
|
+
const firstElement = elements[0];
|
|
237
|
+
const lastElement = elements[elements.length - 1];
|
|
238
|
+
if (event.shiftKey) {
|
|
239
|
+
if (document.activeElement === firstElement) {
|
|
240
|
+
event.preventDefault();
|
|
241
|
+
lastElement?.focus();
|
|
242
|
+
}
|
|
243
|
+
} else {
|
|
244
|
+
if (document.activeElement === lastElement) {
|
|
245
|
+
event.preventDefault();
|
|
246
|
+
firstElement?.focus();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
function useModalRegistration(config, options) {
|
|
251
|
+
useModuleRegistration("modal", config, options);
|
|
252
|
+
}
|
|
253
|
+
function useModalRegistryEntries() {
|
|
254
|
+
const entries = useRegistryEntries("modal");
|
|
255
|
+
return useMemo(() => ({ get: (type) => entries[type] }), [entries]);
|
|
256
|
+
}
|
|
257
|
+
function useModalActions() {
|
|
258
|
+
return useRequiredContext(ModalContext, "useModalActions", "ModalProvider").actions;
|
|
259
|
+
}
|
|
260
|
+
function useModalState() {
|
|
261
|
+
const { store } = useRequiredContext(
|
|
262
|
+
ModalContext,
|
|
263
|
+
"useModalState",
|
|
264
|
+
"ModalProvider"
|
|
265
|
+
);
|
|
266
|
+
return useStore(store);
|
|
267
|
+
}
|
|
268
|
+
function useModal(modalInput) {
|
|
269
|
+
const actions = useModalActions();
|
|
270
|
+
const state = useModalState();
|
|
271
|
+
return useMemo(() => {
|
|
272
|
+
if (!modalInput) return { ...actions, ...state };
|
|
273
|
+
const { component, type } = getModalIdentity(modalInput);
|
|
274
|
+
const isOpen = state.modalStack.some(
|
|
275
|
+
(entry) => entry.modalType === type || component && entry.component === component
|
|
276
|
+
);
|
|
277
|
+
const open = (data, overrides) => actions.openModal(modalInput, { ...overrides, data });
|
|
278
|
+
const controls = {
|
|
279
|
+
close: actions.closeModal,
|
|
280
|
+
closeAll: actions.closeAllModals,
|
|
281
|
+
isOpen,
|
|
282
|
+
state
|
|
283
|
+
};
|
|
284
|
+
return Object.assign([open, controls], controls, { open });
|
|
285
|
+
}, [actions, modalInput, state]);
|
|
286
|
+
}
|
|
287
|
+
var emptySubscribe = () => () => {
|
|
288
|
+
};
|
|
289
|
+
function useModalLayerModel({
|
|
290
|
+
closeModal,
|
|
291
|
+
entry,
|
|
292
|
+
isMobileViewport,
|
|
293
|
+
isTopModal,
|
|
294
|
+
modalStack,
|
|
295
|
+
registry,
|
|
296
|
+
stackIndex
|
|
297
|
+
}) {
|
|
298
|
+
const modalRef = useRef(null);
|
|
299
|
+
const activePosition = useMemo(
|
|
300
|
+
() => resolveActivePosition(
|
|
301
|
+
entry.position,
|
|
302
|
+
entry.responsivePosition,
|
|
303
|
+
isMobileViewport
|
|
304
|
+
),
|
|
305
|
+
[entry.position, entry.responsivePosition, isMobileViewport]
|
|
306
|
+
);
|
|
307
|
+
const ActiveModalComponent = entry.component || registry.get(entry.modalType);
|
|
308
|
+
const isPanelChrome = entry.chrome !== MODAL_CHROME.BARE;
|
|
309
|
+
const isLeftModal = activePosition === MODAL_POSITIONS.LEFT;
|
|
310
|
+
const isSide = isSidePosition(activePosition);
|
|
311
|
+
const isVerticalEdge = isVerticalEdgePosition(activePosition);
|
|
312
|
+
const previousEntry = modalStack[stackIndex - 1] || null;
|
|
313
|
+
const baseZIndex = Z_INDEX.MODAL;
|
|
314
|
+
useEffect(() => {
|
|
315
|
+
if (!isTopModal || !modalRef.current) return;
|
|
316
|
+
const previouslyFocusedElement = document.activeElement;
|
|
317
|
+
const initialElements = getFocusableElements(modalRef.current);
|
|
318
|
+
if (initialElements.length > 0) initialElements[0].focus();
|
|
319
|
+
const handleKeyDown = (event) => {
|
|
320
|
+
if (event.key === "Escape") closeModal(null, entry.id);
|
|
321
|
+
else trapFocus(event, modalRef.current);
|
|
322
|
+
};
|
|
323
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
324
|
+
return () => {
|
|
325
|
+
window.removeEventListener("keydown", handleKeyDown);
|
|
326
|
+
if (previouslyFocusedElement?.isConnected)
|
|
327
|
+
previouslyFocusedElement.focus();
|
|
328
|
+
};
|
|
329
|
+
}, [closeModal, entry.id, isTopModal]);
|
|
330
|
+
return {
|
|
331
|
+
modalRef,
|
|
332
|
+
activePosition,
|
|
333
|
+
ActiveModalComponent,
|
|
334
|
+
isPanelChrome,
|
|
335
|
+
isLeftModal,
|
|
336
|
+
isSide,
|
|
337
|
+
isVerticalEdge,
|
|
338
|
+
previousEntry,
|
|
339
|
+
baseZIndex
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
function useModalContainerModel() {
|
|
343
|
+
return { theme: useTheme(modalTheme) };
|
|
344
|
+
}
|
|
345
|
+
function useModalModel() {
|
|
346
|
+
const { modalStack = [], isOpen, closeModal } = useModal();
|
|
347
|
+
const registry = useModalRegistryEntries();
|
|
348
|
+
const visibleModalStack = useMemo(
|
|
349
|
+
() => modalStack.filter(
|
|
350
|
+
(entry) => Boolean(entry.component || registry.get(entry.modalType))
|
|
351
|
+
),
|
|
352
|
+
[modalStack, registry]
|
|
353
|
+
);
|
|
354
|
+
const topModalEntry = visibleModalStack[visibleModalStack.length - 1] || null;
|
|
355
|
+
const isModalVisible = Boolean(isOpen && topModalEntry);
|
|
356
|
+
const mounted = useSyncExternalStore(
|
|
357
|
+
emptySubscribe,
|
|
358
|
+
() => true,
|
|
359
|
+
() => false
|
|
360
|
+
);
|
|
361
|
+
const [isMobileViewport, setIsMobileViewport] = useState(getViewportIsMobile);
|
|
362
|
+
const [isTopExitSettling, setIsTopExitSettling] = useState(false);
|
|
363
|
+
const previousTopModalIdRef = useRef(null);
|
|
364
|
+
const releaseScrollLockRef = useRef(null);
|
|
365
|
+
useLayoutEffect(() => {
|
|
366
|
+
const currentTopModalId = topModalEntry?.id || null;
|
|
367
|
+
const previousTopModalId = previousTopModalIdRef.current;
|
|
368
|
+
const previousTopStillMounted = visibleModalStack.some(
|
|
369
|
+
(entry) => entry.id === previousTopModalId
|
|
370
|
+
);
|
|
371
|
+
if (previousTopModalId && previousTopModalId !== currentTopModalId && !previousTopStillMounted) {
|
|
372
|
+
setIsTopExitSettling(true);
|
|
373
|
+
}
|
|
374
|
+
previousTopModalIdRef.current = currentTopModalId;
|
|
375
|
+
}, [topModalEntry?.id, visibleModalStack]);
|
|
376
|
+
useEffect(() => {
|
|
377
|
+
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
378
|
+
const mediaQuery = window.matchMedia(
|
|
379
|
+
`(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`
|
|
380
|
+
);
|
|
381
|
+
const handleViewportChange = (e) => setIsMobileViewport(e.matches);
|
|
382
|
+
mediaQuery.addEventListener("change", handleViewportChange);
|
|
383
|
+
return () => mediaQuery.removeEventListener("change", handleViewportChange);
|
|
384
|
+
}, []);
|
|
385
|
+
useEffect(() => {
|
|
386
|
+
if (typeof document === "undefined") return;
|
|
387
|
+
if (isModalVisible) {
|
|
388
|
+
releaseScrollLockRef.current ??= acquireGlobalScrollLock();
|
|
389
|
+
} else if (releaseScrollLockRef.current) {
|
|
390
|
+
releaseScrollLockRef.current();
|
|
391
|
+
releaseScrollLockRef.current = null;
|
|
392
|
+
}
|
|
393
|
+
dispatchSmoothScrollLock(isModalVisible);
|
|
394
|
+
}, [isModalVisible]);
|
|
395
|
+
useEffect(() => {
|
|
396
|
+
return () => {
|
|
397
|
+
releaseScrollLockRef.current?.();
|
|
398
|
+
releaseScrollLockRef.current = null;
|
|
399
|
+
dispatchSmoothScrollLock(false);
|
|
400
|
+
};
|
|
401
|
+
}, []);
|
|
402
|
+
return {
|
|
403
|
+
modalStack,
|
|
404
|
+
closeModal,
|
|
405
|
+
registry,
|
|
406
|
+
visibleModalStack,
|
|
407
|
+
topModalEntry,
|
|
408
|
+
isModalVisible,
|
|
409
|
+
mounted,
|
|
410
|
+
isMobileViewport,
|
|
411
|
+
isTopExitSettling,
|
|
412
|
+
setIsTopExitSettling,
|
|
413
|
+
theme: useTheme(modalTheme)
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
export { INITIAL_MODAL_STATE, MODAL_BREAKPOINTS, MODAL_CHROME, MODAL_POSITIONS, ModalContext, ModalProvider, SMOOTH_SCROLL_LOCK_EVENT, createModalState, dispatchSmoothScrollLock, getFocusableElements, getModalIdentity, getModalLabel, getModalLayout, getModalPosition, getViewportIsMobile, hasHeightConstraint, isSidePosition, isVerticalEdgePosition, modalTheme, normalizePosition, resolveActivePosition, trapFocus, useModal, useModalActions, useModalContainerModel, useModalLayerModel, useModalModel, useModalRegistration, useModalRegistryEntries, useModalState };
|
|
418
|
+
//# sourceMappingURL=chunk-7HQMXTNP.js.map
|
|
419
|
+
//# sourceMappingURL=chunk-7HQMXTNP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/modal/constants.ts","../src/modules/modal/state.ts","../src/modules/modal/identity.ts","../src/modules/modal/layout.ts","../src/modules/modal/context.tsx","../src/modules/modal/dom.ts","../src/modules/modal/hooks.ts"],"names":["useMemo","useRef","useState"],"mappings":"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","file":"chunk-7HQMXTNP.js","sourcesContent":["import { defineThemeSpec } from \"@/theme\";\nimport { type ModalMotion, type ModalThemeSlot } from \"./types\";\n\nexport const MODAL_POSITIONS = Object.freeze({\n BOTTOM: \"bottom\",\n CENTER: \"center\",\n LEFT: \"left\",\n RIGHT: \"right\",\n TOP: \"top\",\n} as const);\n\nexport const MODAL_CHROME = Object.freeze({\n BARE: \"bare\",\n PANEL: \"panel\",\n} as const);\n\nexport const MODAL_BREAKPOINTS = Object.freeze({\n MOBILE_MAX_WIDTH: 639,\n} as const);\n\nexport const SMOOTH_SCROLL_LOCK_EVENT = \"modal:smooth-scroll-lock\";\n\nexport const FOCUSABLE_SELECTOR =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [contenteditable=\"true\"], [tabindex]:not([tabindex=\"-1\"])';\n\nexport const HEIGHT_CONSTRAINT_PATTERN = /(\\s|^)(?:[\\w-]+:)*(?:h|max-h)-/;\n\nexport const modalTheme = defineThemeSpec<ModalThemeSlot, ModalMotion>(\"modal\");\n","import { MODAL_CHROME, MODAL_POSITIONS } from \"./constants\";\nimport { type ModalEntry, type ModalState } from \"./types\";\n\nexport function createModalState(modalStack: ModalEntry[] = []): ModalState {\n const activeModal = modalStack[modalStack.length - 1] || null;\n return {\n activeModalId: activeModal?.id || null,\n chrome: activeModal?.chrome || MODAL_CHROME.PANEL,\n headerActions: activeModal?.headerActions || null,\n isOpen: modalStack.length > 0,\n modalStack,\n modalType: activeModal?.modalType || null,\n position: activeModal?.position || MODAL_POSITIONS.CENTER,\n props: activeModal?.props || {},\n responsivePosition: activeModal?.responsivePosition || null,\n showClose: activeModal?.showClose ?? true,\n title: activeModal?.title || null,\n };\n}\n\nexport const INITIAL_MODAL_STATE = createModalState([]);\n","import {\n type DefineModalOptions,\n type ModalComponent,\n type ModalInput,\n} from \"./types\";\n\nexport function getModalIdentity(input: ModalInput | DefineModalOptions): {\n component: ModalComponent | null;\n type: string;\n} {\n if (typeof input === \"string\") return { component: null, type: input };\n const options = typeof input === \"function\" ? { component: input } : input;\n const component = options.component ?? null;\n return {\n component,\n type:\n (\"type\" in options && options.type) ||\n (\"id\" in options && options.id) ||\n component?.displayName ||\n component?.name ||\n \"modal\",\n };\n}\n\nexport function getModalLabel(modalType?: string | null): string {\n if (typeof modalType !== \"string\" || !modalType.trim()) return \"Modal\";\n return modalType\n .trim()\n .toLowerCase()\n .split(/[_-]+/)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n","import { isPlainObject } from \"@/utils\";\nimport {\n HEIGHT_CONSTRAINT_PATTERN,\n MODAL_BREAKPOINTS,\n MODAL_POSITIONS,\n} from \"./constants\";\nimport {\n type ModalLayout,\n type ModalPosition,\n type ResponsiveModalPosition,\n} from \"./types\";\n\nexport function hasHeightConstraint(className?: string): boolean {\n return (\n typeof className === \"string\" && HEIGHT_CONSTRAINT_PATTERN.test(className)\n );\n}\n\nexport function isSidePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.LEFT || position === MODAL_POSITIONS.RIGHT\n );\n}\n\nexport function isVerticalEdgePosition(\n position: ModalPosition | null | undefined,\n): boolean {\n return (\n position === MODAL_POSITIONS.TOP || position === MODAL_POSITIONS.BOTTOM\n );\n}\n\nexport function getModalPosition(position: ModalPosition): ModalPosition {\n return position === MODAL_POSITIONS.TOP ||\n position === MODAL_POSITIONS.BOTTOM ||\n position === MODAL_POSITIONS.LEFT ||\n position === MODAL_POSITIONS.RIGHT\n ? position\n : MODAL_POSITIONS.CENTER;\n}\nexport function getModalLayout(\n position: ModalPosition,\n isMobile: boolean,\n): ModalLayout {\n const resolved = getModalPosition(position);\n if (!isMobile) return resolved;\n if (resolved === MODAL_POSITIONS.TOP || resolved === MODAL_POSITIONS.BOTTOM)\n return `${resolved}-mobile`;\n if (resolved === MODAL_POSITIONS.LEFT || resolved === MODAL_POSITIONS.RIGHT)\n return \"side-mobile\";\n return resolved;\n}\n\nexport function getViewportIsMobile(): boolean {\n if (\n typeof window === \"undefined\" ||\n typeof window.matchMedia !== \"function\"\n ) {\n return false;\n }\n return window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n ).matches;\n}\n\nexport function resolveActivePosition(\n position: ModalPosition,\n responsivePosition: ResponsiveModalPosition | null | undefined,\n isMobileViewport: boolean,\n): ModalPosition {\n if (!isPlainObject(responsivePosition)) return position;\n const responsive = isMobileViewport\n ? responsivePosition.mobile\n : responsivePosition.desktop;\n return (responsive || position) as ModalPosition;\n}\n\nexport function normalizePosition(\n input: ModalPosition | ResponsiveModalPosition | undefined,\n): {\n position: ModalPosition;\n responsivePosition: ResponsiveModalPosition | null;\n} {\n if (typeof input === \"string\") {\n return { position: input, responsivePosition: null };\n }\n if (!isPlainObject(input)) {\n return { position: MODAL_POSITIONS.CENTER, responsivePosition: null };\n }\n return {\n position: resolveActivePosition(\n MODAL_POSITIONS.CENTER,\n input,\n getViewportIsMobile(),\n ),\n responsivePosition: input,\n };\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { getOrCreateGlobalContext } from \"@/kernel\";\nimport { createStore, report, type ExternalStore } from \"@/utils\";\nimport { MODAL_CHROME } from \"./constants\";\nimport {\n type ModalActions,\n type ModalEntry,\n type ModalOptions,\n type ModalProviderProps,\n type ModalState,\n} from \"./types\";\nimport { INITIAL_MODAL_STATE, createModalState } from \"./state\";\nimport { getModalIdentity } from \"./identity\";\nimport { normalizePosition } from \"./layout\";\n\nexport interface ModalContextValue {\n actions: ModalActions;\n store: ExternalStore<ModalState>;\n}\n\nexport const ModalContext = getOrCreateGlobalContext<ModalContextValue | null>(\n \"ModalContext\",\n null,\n);\n\ninterface PendingModal {\n onClose?: ModalOptions[\"onClose\"];\n resolve: (result?: unknown) => void;\n}\n\nexport function ModalProvider({\n children,\n modalRenderer: ModalRenderer = null,\n}: ModalProviderProps) {\n const [store] = useState(() =>\n createStore<ModalState>(INITIAL_MODAL_STATE, { freezeSnapshots: false }),\n );\n\n const modalStackRef = useRef<ModalEntry[]>([]);\n const pendingRef = useRef<Map<number, PendingModal>>(new Map());\n const modalIdRef = useRef(0);\n\n const syncModalStack = useCallback(\n (nextStack: ModalEntry[]) => {\n modalStackRef.current = nextStack;\n store.publish(createModalState(nextStack));\n },\n [store],\n );\n\n const settleModal = useCallback((modalId: number, result: unknown) => {\n const pending = pendingRef.current.get(modalId);\n if (!pending) return;\n pendingRef.current.delete(modalId);\n\n try {\n const outcome = pending.onClose?.(result);\n if (outcome instanceof Promise) {\n outcome.catch((error) => report(\"Modal onClose\", error));\n }\n } catch (error) {\n report(\"Modal onClose\", error);\n }\n pending.resolve(result);\n }, []);\n\n const openModal = useCallback<ModalActions[\"openModal\"]>(\n (modalInput, options = {}) => {\n if (!modalInput) return Promise.resolve(null);\n\n const stack = modalStackRef.current;\n const { component, type } = getModalIdentity(modalInput);\n const topEntry = stack[stack.length - 1];\n if (\n topEntry &&\n (topEntry.modalType === type ||\n (component && topEntry.component === component))\n ) {\n return Promise.resolve(null);\n }\n\n const definition =\n typeof modalInput === \"object\" ? modalInput : undefined;\n const merged: ModalOptions & { defaultData?: Record<string, unknown> } = {\n ...definition,\n ...options,\n };\n const data = { ...definition?.defaultData, ...options.data };\n const modalId = ++modalIdRef.current;\n\n const entry: ModalEntry = {\n chrome: merged.chrome || MODAL_CHROME.PANEL,\n component,\n headerActions: merged.actions || null,\n id: modalId,\n modalType: type,\n props: data,\n showClose: merged.showClose ?? true,\n title:\n typeof merged.title === \"function\"\n ? merged.title(data)\n : (merged.title ?? null),\n ...normalizePosition(merged.position),\n };\n\n return new Promise((resolve) => {\n pendingRef.current.set(modalId, { onClose: merged.onClose, resolve });\n syncModalStack([...stack, entry]);\n });\n },\n [syncModalStack],\n );\n\n const closeModal = useCallback<ModalActions[\"closeModal\"]>(\n (result = null, targetModalId = null) => {\n const stack = modalStackRef.current;\n const modalId = targetModalId || stack[stack.length - 1]?.id;\n if (!modalId || !stack.some((entry) => entry.id === modalId)) return;\n\n syncModalStack(stack.filter((entry) => entry.id !== modalId));\n settleModal(modalId, result);\n },\n [settleModal, syncModalStack],\n );\n\n const closeAllModals = useCallback<ModalActions[\"closeAllModals\"]>(\n (result = null) => {\n const stack = modalStackRef.current;\n if (stack.length === 0) return;\n\n syncModalStack([]);\n stack.forEach((entry) => settleModal(entry.id, result));\n },\n [settleModal, syncModalStack],\n );\n\n const actionsValue = useMemo<ModalActions>(\n () => ({ closeAllModals, closeModal, openModal }),\n [openModal, closeModal, closeAllModals],\n );\n\n const contextValue = useMemo<ModalContextValue>(\n () => ({ actions: actionsValue, store }),\n [actionsValue, store],\n );\n\n return (\n <ModalContext value={contextValue}>\n {ModalRenderer && <ModalRenderer />}\n {children}\n </ModalContext>\n );\n}\n\n","import {\n FOCUSABLE_SELECTOR,\n SMOOTH_SCROLL_LOCK_EVENT,\n} from \"./constants\";\n\nexport function dispatchSmoothScrollLock(locked: boolean): void {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(SMOOTH_SCROLL_LOCK_EVENT, {\n detail: { locked, source: \"modal\" },\n }),\n );\n}\n\nexport function getFocusableElements(\n container: HTMLElement | null,\n): HTMLElement[] {\n if (!container || typeof container.querySelectorAll !== \"function\") return [];\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter(\n (element) =>\n !element.hasAttribute(\"disabled\") &&\n element.getAttribute(\"aria-hidden\") !== \"true\",\n );\n}\n\nexport function trapFocus(\n event: KeyboardEvent,\n container: HTMLElement | null,\n): void {\n if (event.key !== \"Tab\" || !container) return;\n const elements = getFocusableElements(container);\n if (elements.length === 0) return;\n\n const firstElement = elements[0];\n const lastElement = elements[elements.length - 1];\n\n if (event.shiftKey) {\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n}\n","\"use client\";\n\nimport {\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport { useRequiredContext, useStore } from \"@/hooks\";\nimport {\n useModuleRegistration,\n useRegistryEntries,\n type RegistryMetadata,\n} from \"@/kernel\";\nimport { Z_INDEX } from \"@/tokens\";\nimport { acquireGlobalScrollLock } from \"@/utils\";\nimport { useModuleTheme } from \"@/theme\";\nimport {\n MODAL_BREAKPOINTS,\n MODAL_CHROME,\n MODAL_POSITIONS,\n modalTheme,\n} from \"./constants\";\nimport { ModalContext } from \"./context\";\nimport { getModalIdentity } from \"./identity\";\nimport {\n type ModalActions,\n type ModalComponent,\n type ModalEntry,\n type ModalHookBinding,\n type ModalHookControls,\n type ModalInput,\n type ModalOpenFn,\n type ModalPageConfig,\n type ModalState,\n} from \"./types\";\nimport {\n dispatchSmoothScrollLock,\n getFocusableElements,\n trapFocus,\n} from \"./dom\";\nimport {\n getViewportIsMobile,\n isSidePosition,\n isVerticalEdgePosition,\n resolveActivePosition,\n} from \"./layout\";\n\nexport function useModalRegistration(\n config: ModalPageConfig | null | undefined,\n options?: RegistryMetadata & { enabled?: boolean },\n): void {\n useModuleRegistration(\"modal\", config, options);\n}\n\nexport function useModalRegistryEntries(): {\n get: (type: string) => ModalComponent | undefined;\n} {\n const entries = useRegistryEntries<\"modal\", ModalComponent>(\"modal\");\n return useMemo(() => ({ get: (type: string) => entries[type] }), [entries]);\n}\n\nexport function useModalActions(): ModalActions {\n return useRequiredContext(ModalContext, \"useModalActions\", \"ModalProvider\")\n .actions;\n}\n\nexport function useModalState(): ModalState {\n const { store } = useRequiredContext(\n ModalContext,\n \"useModalState\",\n \"ModalProvider\",\n );\n return useStore(store);\n}\n\nexport function useModal(): ModalState & ModalActions;\nexport function useModal(modalInput: ModalInput): ModalHookBinding;\nexport function useModal(\n modalInput?: ModalInput | null,\n): (ModalState & ModalActions) | ModalHookBinding {\n const actions = useModalActions();\n const state = useModalState();\n\n return useMemo(() => {\n if (!modalInput) return { ...actions, ...state };\n\n const { component, type } = getModalIdentity(modalInput);\n const isOpen = state.modalStack.some(\n (entry) =>\n entry.modalType === type ||\n (component && entry.component === component),\n );\n const open: ModalOpenFn = (data, overrides) =>\n actions.openModal(modalInput, { ...overrides, data });\n const controls: ModalHookControls = {\n close: actions.closeModal,\n closeAll: actions.closeAllModals,\n isOpen,\n state,\n };\n\n return Object.assign([open, controls], controls, { open });\n }, [actions, modalInput, state]) as\n (ModalState & ModalActions) | ModalHookBinding;\n}\n\nconst emptySubscribe = () => () => {};\n\nexport function useModalLayerModel({\n closeModal,\n entry,\n isMobileViewport,\n isTopModal,\n modalStack,\n registry,\n stackIndex,\n}: {\n closeModal: (result?: unknown, targetModalId?: number | null) => void;\n entry: ModalEntry;\n isMobileViewport: boolean;\n isTopModal: boolean;\n modalStack: ModalEntry[];\n registry: { get: (key: string) => ModalComponent | undefined };\n stackIndex: number;\n}) {\n const modalRef = useRef<HTMLDivElement | null>(null);\n const activePosition = useMemo(\n () =>\n resolveActivePosition(\n entry.position,\n entry.responsivePosition,\n isMobileViewport,\n ),\n [entry.position, entry.responsivePosition, isMobileViewport],\n );\n const ActiveModalComponent = entry.component || registry.get(entry.modalType);\n const isPanelChrome = entry.chrome !== MODAL_CHROME.BARE;\n const isLeftModal = activePosition === MODAL_POSITIONS.LEFT;\n const isSide = isSidePosition(activePosition);\n const isVerticalEdge = isVerticalEdgePosition(activePosition);\n const previousEntry = modalStack[stackIndex - 1] || null;\n const baseZIndex = Z_INDEX.MODAL;\n useEffect(() => {\n if (!isTopModal || !modalRef.current) return;\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n const initialElements = getFocusableElements(modalRef.current);\n if (initialElements.length > 0) initialElements[0].focus();\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") closeModal(null, entry.id);\n else trapFocus(event, modalRef.current);\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n if (previouslyFocusedElement?.isConnected)\n previouslyFocusedElement.focus();\n };\n }, [closeModal, entry.id, isTopModal]);\n\n return {\n modalRef,\n activePosition,\n ActiveModalComponent,\n isPanelChrome,\n isLeftModal,\n isSide,\n isVerticalEdge,\n previousEntry,\n baseZIndex,\n };\n}\n\nexport function useModalContainerModel() {\n return { theme: useModuleTheme(modalTheme) };\n}\n\nexport function useModalModel() {\n const { modalStack = [], isOpen, closeModal } = useModal();\n const registry = useModalRegistryEntries();\n const visibleModalStack = useMemo(\n () =>\n modalStack.filter((entry: ModalEntry) =>\n Boolean(entry.component || registry.get(entry.modalType)),\n ),\n [modalStack, registry],\n );\n const topModalEntry = visibleModalStack[visibleModalStack.length - 1] || null;\n const isModalVisible = Boolean(isOpen && topModalEntry);\n const mounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false,\n );\n const [isMobileViewport, setIsMobileViewport] = useState(getViewportIsMobile);\n const [isTopExitSettling, setIsTopExitSettling] = useState(false);\n const previousTopModalIdRef = useRef<number | null>(null);\n const releaseScrollLockRef = useRef<(() => void) | null>(null);\n useLayoutEffect(() => {\n const currentTopModalId = topModalEntry?.id || null;\n const previousTopModalId = previousTopModalIdRef.current;\n const previousTopStillMounted = visibleModalStack.some(\n (entry: ModalEntry) => entry.id === previousTopModalId,\n );\n\n if (\n previousTopModalId &&\n previousTopModalId !== currentTopModalId &&\n !previousTopStillMounted\n ) {\n setIsTopExitSettling(true);\n }\n previousTopModalIdRef.current = currentTopModalId;\n }, [topModalEntry?.id, visibleModalStack]);\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n\n const mediaQuery = window.matchMedia(\n `(max-width: ${MODAL_BREAKPOINTS.MOBILE_MAX_WIDTH}px)`,\n );\n const handleViewportChange = (e: MediaQueryListEvent) =>\n setIsMobileViewport(e.matches);\n\n mediaQuery.addEventListener(\"change\", handleViewportChange);\n return () => mediaQuery.removeEventListener(\"change\", handleViewportChange);\n }, []);\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n\n if (isModalVisible) {\n releaseScrollLockRef.current ??= acquireGlobalScrollLock();\n } else if (releaseScrollLockRef.current) {\n releaseScrollLockRef.current();\n releaseScrollLockRef.current = null;\n }\n dispatchSmoothScrollLock(isModalVisible);\n }, [isModalVisible]);\n useEffect(() => {\n return () => {\n releaseScrollLockRef.current?.();\n releaseScrollLockRef.current = null;\n dispatchSmoothScrollLock(false);\n };\n }, []);\n\n return {\n modalStack,\n closeModal,\n registry,\n visibleModalStack,\n topModalEntry,\n isModalVisible,\n mounted,\n isMobileViewport,\n isTopExitSettling,\n setIsTopExitSettling,\n theme: useModuleTheme(modalTheme),\n };\n}\n"]}
|