glass-pulse-fx 0.1.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/LICENSE +21 -0
- package/README.md +224 -0
- package/dist/chunk-GF5DSI6Z.js +1360 -0
- package/dist/chunk-GF5DSI6Z.js.map +1 -0
- package/dist/core.cjs +1371 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +49 -0
- package/dist/core.d.ts +49 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +1492 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +32 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/presets.cjs +326 -0
- package/dist/presets.cjs.map +1 -0
- package/dist/presets.d.cts +28 -0
- package/dist/presets.d.ts +28 -0
- package/dist/presets.js +313 -0
- package/dist/presets.js.map +1 -0
- package/dist/types-qQT95c-N.d.cts +157 -0
- package/dist/types-qQT95c-N.d.ts +157 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/perf.ts","../src/engine/color.ts","../src/engine/effects/common.ts","../src/engine/effects/panes.ts","../src/engine/effects/index.ts","../src/engine/renderer/context.ts","../src/engine/renderer/loop.ts","../src/styles.ts","../src/engine/renderer/compositor.ts","../src/engine/settings.ts","../src/core.ts","../src/GlassFx.tsx"],"names":["srcW","srcH","rim","renderer","React","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["// Performance / sizing constants for the shared renderer and per-instance crop.\n// Pulled out so the frame rate and GL resolution are a single source of truth.\n\nimport type { FpsMode, Kind } from '../types';\n\n/** Offscreen GL canvas edge in CSS px (squared, then DPR-scaled). This is the resolution\n * of the *shared* shader field every instance crops from — one render for all instances,\n * so it's cheap to keep high. Too low and large components (cards) visibly upscale: a\n * card samples a slice of this field and stretches it across its whole surface. */\nexport const GL_SIZE = 384;\n\n/** Device pixel ratio, capped at 2. Guarded for SSR (only read in the browser). */\nexport const DPR =\n typeof window !== 'undefined' ? Math.min(2, window.devicePixelRatio || 1) : 1;\n\n/** Shared loop default frame rate. Lower (e.g. 15) for lighter GPU load. */\nexport const DEFAULT_FPS: FpsMode = 30;\n\nexport function frameMsForFps(fps: FpsMode = DEFAULT_FPS): number {\n return 1000 / fps;\n}\n\n// Resolution-independent crop divisors (DPR cancels): srcW = cssW * glW / CROP_W / shaderScale\nexport const CROP_W = 140;\nexport const CROP_H = 40;\n\n/** Small controls sample at least this normalized span, so they keep the shared light phase. */\nexport const MIN_SAMPLE_SPAN = 0.9;\n\n/** Per-kind shader crop scale — how much of the shader field a shape samples. */\nexport const SHADER_SCALE: Record<Kind, number> = {\n pill: 1.6,\n circle: 1.3,\n rect: 1.7,\n tag: 1.25,\n card: 2.4,\n icon: 1.15,\n};\n\n/** Max raster edge for a bloom canvas (keeps the soft glow cheap). */\nexport const BLOOM_MAX = 240;\n","// Tiny color helpers. Hex in, GL/CSS out.\n\nconst HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\nexport function isHexColor(c: string): boolean {\n return HEX.test(c.trim());\n}\n\nfunction expand(h: string): number {\n let s = h.slice(1);\n if (s.length === 3) s = s[0] + s[0] + s[1] + s[1] + s[2] + s[2];\n return parseInt(s, 16);\n}\n\n/** '#rrggbb' -> [r, g, b] in 0..1, for GL uniforms. */\nexport function hexToRgb(h: string): [number, number, number] {\n const n = expand(h);\n return [((n >> 16) & 255) / 255, ((n >> 8) & 255) / 255, (n & 255) / 255];\n}\n\n/** '#rrggbb' + alpha -> 'rgba(r,g,b,a)', for CSS. */\nexport function hexToRgba(h: string, a: number): string {\n const n = expand(h);\n return `rgba(${(n >> 16) & 255},${(n >> 8) & 255},${n & 255},${a})`;\n}\n\n/** Fold an alpha into any CSS color when it's hex; otherwise return it unchanged. */\nexport function withAlpha(color: string, a: number): string {\n return isHexColor(color) ? hexToRgba(color, a) : color;\n}\n\nexport interface RGBA {\n /** r,g,b in 0..255, a in 0..1 */\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/** Parse a CSS color (hex or rgb()/rgba(), incl. computed `rgb(...)`) to RGBA. */\nexport function parseColor(c: string): RGBA {\n const s = c.trim();\n if (isHexColor(s)) {\n const n = expand(s);\n return { r: (n >> 16) & 255, g: (n >> 8) & 255, b: n & 255, a: 1 };\n }\n const m = s.match(/^rgba?\\(([^)]+)\\)$/i);\n if (!m) return { r: 0, g: 0, b: 0, a: 0 };\n const parts = m[1].split(/[,/]/).map((p) => parseFloat(p.trim()));\n return { r: parts[0] || 0, g: parts[1] || 0, b: parts[2] || 0, a: parts[3] == null ? 1 : parts[3] };\n}\n\n/** Porter-Duff source-over: paint `fg` onto `bg` (the eyedropper composite). */\nexport function compositeOver(fg: RGBA, bg: RGBA): RGBA {\n const a = fg.a + bg.a * (1 - fg.a);\n if (a === 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / a,\n g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / a,\n b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / a,\n a,\n };\n}\n\n/** RGBA -> '#rrggbb' (alpha dropped — caller should composite to opaque first). */\nexport function rgbToHex(c: RGBA): string {\n const h = (n: number) => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0');\n return `#${h(c.r)}${h(c.g)}${h(c.b)}`;\n}\n","// Shared GLSL + uniform plumbing for the base shaders. Each effect renders a full-frame\n// colour field into the shared GL canvas; the glass compositor takes it from there.\n//\n// `paneColor(i)` is the shared vocabulary: select one of up to 5 palette stops by index.\n\nimport { hexToRgb } from '../color';\nimport type { EffectParams } from '../../types';\n\nexport type UniformMap = Record<string, WebGLUniformLocation | null>;\n\nexport const VERT = `attribute vec2 a_position; void main(){ gl_Position = vec4(a_position,0.0,1.0); }`;\n\n// Uniforms every effect declares + the palette helper.\nexport const COMMON_GLSL = `\nprecision highp float;\nuniform vec2 u_resolution;\nuniform float u_time;\nuniform vec3 u_color1,u_color2,u_color3,u_color4,u_color5;\nuniform float u_count,u_speed,u_scale,u_bright;\n\nvec3 paneColor(int i){\n if(i<=0) return u_color1;\n else if(i==1) return u_color2;\n else if(i==2) return u_color3;\n else if(i==3) return u_color4;\n return u_color5;\n}\n`;\n\nexport const COMMON_UNIFORMS = [\n 'u_resolution', 'u_time',\n 'u_color1', 'u_color2', 'u_color3', 'u_color4', 'u_color5',\n 'u_count', 'u_speed', 'u_scale', 'u_bright',\n];\n\n/** Push the shared palette + scalar uniforms. Each effect calls this, then adds its own. */\nexport function uploadCommon(gl: WebGLRenderingContext, U: UniformMap, p: EffectParams): void {\n for (let i = 0; i < 5; i++) {\n const c = hexToRgb(p.colors[i] ?? '#000000');\n gl.uniform3f(U[`u_color${i + 1}`], c[0], c[1], c[2]);\n }\n // the colour gradient cycles through however many stops the array holds (1..5)\n gl.uniform1f(U.u_count, Math.min(5, Math.max(1, p.colors.length)));\n gl.uniform1f(U.u_speed, p.speed);\n gl.uniform1f(U.u_scale, p.scale);\n gl.uniform1f(U.u_bright, p.bright);\n}\n","// Panes: discrete colored bands moving along a 1D coordinate. Each band fades in\n// (leading), holds at full, fades out (trailing) via ALPHA — so the gaps are transparent\n// (glass shows through), not black — then a transparent interval before the next band.\n//\n// The motion modes are different parameterizations of that coordinate:\n// 0 (linear): position along the axis — bands sweep across; speed sign sets direction.\n// 1 (center): the axis mirrored about the element center — bands emanate or converge.\n// 2 (radial): distance from center — concentric rings ripple outward (or inward).\n// 3 (orbit): angle around center — spokes sweep like a radar; `scale` rounds to the\n// spoke count so a whole number of cycles wraps the ring without a seam.\n\nimport { COMMON_GLSL, COMMON_UNIFORMS, uploadCommon, type UniformMap } from './common';\nimport type { EffectDef } from './index';\nimport type { EffectParams } from '../../types';\n\nconst WARP_N = 24;\n\n// Velocity presets: how band speed varies across the element. Each bakes a cubic-bezier\n// speed curve [velStart, velEnd, c0x, c0y, c1x, c1y] — speed at each end of the axis plus\n// two tangent handles. `EffectParams.velocity` is an index into this list.\nexport const VELOCITY_PRESETS: { label: string; curve: readonly [number, number, number, number, number, number] }[] = [\n { label: 'Uniform', curve: [1, 1, 0.33, 1, 0.67, 1] },\n { label: 'Ease out', curve: [0.8, 0.35, 0.33, 0.72, 0.67, 0.45] },\n { label: 'Ease out+', curve: [1, 0.15, 0.25, 0.55, 0.6, 0.2] },\n { label: 'Ease in', curve: [0.35, 0.8, 0.33, 0.45, 0.67, 0.72] },\n { label: 'Slow middle', curve: [1, 1, 0.33, 0.35, 0.67, 0.35] },\n { label: 'Fast middle', curve: [0.45, 0.45, 0.33, 1, 0.67, 1] },\n];\n\n// Build the position-remap lookup table on the CPU: invert the cubic-bezier speed curve\n// and integrate 1/speed, sampled to WARP_N points. Cached by preset index, so it only\n// recomputes when the preset changes — not per frame, not per pixel.\nlet lutKey = -1;\nconst lut = new Float32Array(WARP_N);\nfunction warpLUT(p: EffectParams): Float32Array {\n const key = VELOCITY_PRESETS[Math.round(p.velocity)] ? Math.round(p.velocity) : 0;\n if (key === lutKey) return lut;\n lutKey = key;\n const [a, b, c0x, c0y, c1x, c1y] = VELOCITY_PRESETS[key].curve;\n const bx = (t: number) => { const it = 1 - t; return 3 * it * it * t * c0x + 3 * it * t * t * c1x + t * t * t; };\n const by = (t: number) => { const it = 1 - t; return it * it * it * a + 3 * it * it * t * c0y + 3 * it * t * t * c1y + t * t * t * b; };\n const bdx = (t: number) => { const it = 1 - t; return 3 * it * it * c0x + 6 * it * t * (c1x - c0x) + 3 * t * t * (1 - c1x); };\n const clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n const speed = (s: number) => {\n let t = clamp01(s);\n for (let i = 0; i < 6; i++) {\n const d = bdx(t);\n if (Math.abs(d) < 1e-5) break;\n t = clamp01(t - (bx(t) - s) / d);\n }\n return Math.max(by(t), 0.05);\n };\n const M = 128;\n const cum = new Float64Array(M + 1);\n let prev = 1 / speed(0);\n for (let i = 1; i <= M; i++) {\n const cur = 1 / speed(i / M);\n cum[i] = cum[i - 1] + ((prev + cur) * 0.5) / M;\n prev = cur;\n }\n const total = cum[M] || 1;\n for (let j = 0; j < WARP_N; j++) {\n const fi = (j / (WARP_N - 1)) * M;\n const i0 = Math.min(M - 1, Math.floor(fi));\n lut[j] = (cum[i0] + (cum[i0 + 1] - cum[i0]) * (fi - i0)) / total;\n }\n return lut;\n}\n\nconst FRAG =\n COMMON_GLSL +\n `\nuniform float u_angle, u_rampIn, u_rampOut, u_interval, u_motion;\n// Precomputed position-remap (the integral of 1/speed) as a 24-point lookup table. The\n// velocity curve is the same for every pixel and only changes when the handles move, so\n// the CPU bakes this once per change — the shader just reads it (no per-pixel solve).\nuniform float u_warp[24];\nuniform vec3 u_color; // colorSpread (along), colorSkew (perpendicular), colorDrift (time)\n\n// smooth cyclic gradient through the palette stops (u_count = colors.length)\nvec3 paletteSmooth(float gc){\n int count = int(u_count + 0.5);\n float x = fract(gc) * float(count);\n float fi = floor(x);\n int i0 = int(fi);\n int i1 = i0 + 1; if(i1 >= count) i1 = 0;\n return mix(paneColor(i0), paneColor(i1), x - fi);\n}\n\nfloat sampleWarp(float s){\n float fi = clamp(s, 0.0, 1.0) * 23.0;\n float i0 = floor(fi);\n float fr = fi - i0;\n int idx = int(i0);\n float lo = u_warp[0];\n float hi = u_warp[23];\n for(int k = 0; k < 24; k++){ // constant-index read (portable on WebGL1)\n if(k == idx) lo = u_warp[k];\n if(k == idx + 1) hi = u_warp[k];\n }\n return mix(lo, hi, fr);\n}\n\nvoid main(){\n vec2 uv = gl_FragCoord.xy / u_resolution;\n vec2 p = uv - 0.5;\n vec2 dir = vec2(cos(u_angle), sin(u_angle));\n\n // The pane is always one unit wide; interval expands the pane+gap cycle instead of\n // stealing width from the pane. So increasing interval adds transparent space after\n // each pane while the pane's ramp/hold/ramp shape stays the same.\n float interval = clamp(u_interval, 0.0, 0.95);\n float gap = interval / max(1.0 - interval, 0.05);\n float cycle = 1.0 + gap;\n\n // Radial/orbit need no aspect correction here: the EffectDef declares 'isotropic'\n // sampling for those modes, so the compositor crops an aspect-true window and\n // field-space circles/angles render screen-true on every shape.\n\n // band position along the mode's 1D coordinate, remapped through the velocity warp,\n // plus the colour-field coords: ca along the motion, cp perpendicular to it\n float pos; float ca; float cp;\n if(u_motion < 1.5){\n float u = dot(p, dir);\n float s = (u_motion > 0.5) ? clamp(abs(u) * 2.0, 0.0, 1.0) : clamp(u + 0.5, 0.0, 1.0);\n float w01 = sampleWarp(s);\n pos = ((u_motion > 0.5) ? w01 * 0.5 : w01 - 0.5) * u_scale - u_time * u_speed;\n ca = u + 0.5;\n cp = dot(p, vec2(-dir.y, dir.x)) + 0.5;\n } else if(u_motion < 2.5){\n float r = length(p) * 2.0;\n pos = sampleWarp(clamp(r, 0.0, 1.0)) * 0.5 * u_scale - u_time * u_speed;\n ca = r;\n cp = fract((atan(p.y, p.x) - u_angle) / 6.2831853);\n } else {\n float theta = fract((atan(p.y, p.x) - u_angle) / 6.2831853);\n float spokes = max(1.0, floor(u_scale + 0.5)); // whole cycles -> no seam at the wrap\n pos = sampleWarp(theta) * spokes * cycle - u_time * u_speed;\n ca = theta;\n cp = length(p) * 2.0;\n }\n\n // color field — sampled independently of the band index, so colour can vary within and\n // across a band: along the motion (spread), perpendicular (skew), and over time (drift)\n vec3 c = paletteSmooth(ca * u_color.x + cp * u_color.y + u_time * u_color.z);\n\n float f = mod(pos, cycle);\n float ri = clamp(u_rampIn, 0.001, 1.0);\n float ro = clamp(u_rampOut, 0.001, 1.0);\n float env = 0.0;\n if(f < 1.0){\n env = smoothstep(0.0, ri, f) * (1.0 - smoothstep(1.0 - ro, 1.0, f));\n }\n gl_FragColor = vec4(c * u_bright, env);\n}`;\n\nconst DEFAULT_PANE_COLORS = ['#FF2D9B', '#7A5CFF', '#19C3FF', '#15E6A4', '#FFD23F'];\n\nconst dark: EffectParams = {\n colors: [...DEFAULT_PANE_COLORS],\n speed: 0.25, scale: 1.6, bright: 1.0,\n colorSpread: 2.0, colorSkew: 0, colorDrift: 0,\n velocity: 1, // Ease out\n rampIn: 0.25, rampOut: 0.5, interval: 0.4, angle: 0, motion: 0,\n};\nconst light: EffectParams = {\n colors: [...DEFAULT_PANE_COLORS],\n speed: 0.25, scale: 1.6, bright: 1.0,\n colorSpread: 2.0, colorSkew: 0, colorDrift: 0,\n velocity: 1, // Ease out\n rampIn: 0.25, rampOut: 0.5, interval: 0.4, angle: 0, motion: 0,\n};\n\nexport const panes: EffectDef = {\n id: 'panes',\n label: 'Panes',\n frag: FRAG,\n uniforms: [\n ...COMMON_UNIFORMS,\n 'u_angle', 'u_warp[0]', 'u_color', 'u_rampIn', 'u_rampOut', 'u_interval', 'u_motion',\n ],\n defaults: { dark, light },\n upload(gl: WebGLRenderingContext, U: UniformMap, p: EffectParams) {\n uploadCommon(gl, U, p);\n gl.uniform1f(U.u_angle, (p.angle * Math.PI) / 180);\n gl.uniform1fv(U['u_warp[0]'], warpLUT(p));\n // The angular coordinate is a closed loop (orbit runs the gradient along it, radial\n // across it), so its gradient must complete whole cycles or the colour field seams\n // at the wrap — snap that component to an integer in those modes.\n const motion = Math.round(p.motion);\n const spread = motion === 3 ? Math.round(p.colorSpread) : p.colorSpread;\n const skew = motion === 2 ? Math.round(p.colorSkew) : p.colorSkew;\n gl.uniform3f(U.u_color, spread, skew, p.colorDrift);\n gl.uniform1f(U.u_rampIn, p.rampIn);\n gl.uniform1f(U.u_rampOut, p.rampOut);\n gl.uniform1f(U.u_interval, p.interval);\n gl.uniform1f(U.u_motion, p.motion);\n },\n // radial/orbit draw circles and angles — crop aspect-true so they render screen-true\n sampling(p: EffectParams) {\n return Math.round(p.motion) >= 2 ? 'isotropic' : 'banded';\n },\n controls: [\n { kind: 'colors', label: 'Palette' },\n { kind: 'slider', key: 'colorSpread', label: 'Color spread', min: 0, max: 6, step: 0.1 },\n { kind: 'slider', key: 'colorSkew', label: 'Color skew', min: 0, max: 6, step: 0.1 },\n { kind: 'slider', key: 'colorDrift', label: 'Color drift', min: -1, max: 1, step: 0.01 },\n {\n kind: 'select', key: 'motion', label: 'Motion',\n options: [\n { label: 'Linear', value: 0 },\n { label: 'Center', value: 1 },\n { label: 'Radial', value: 2 },\n { label: 'Orbit', value: 3 },\n ],\n },\n { kind: 'slider', key: 'speed', label: 'Speed', min: -2, max: 2, step: 0.01 },\n {\n kind: 'select', key: 'velocity', label: 'Velocity',\n options: VELOCITY_PRESETS.map((v, i) => ({ label: v.label, value: i })),\n },\n { kind: 'slider', key: 'scale', label: 'Band density', min: 0.1, max: 4, step: 0.05 },\n { kind: 'slider', key: 'interval', label: 'Interval', min: 0, max: 0.9, step: 0.02 },\n { kind: 'slider', key: 'rampIn', label: 'Ramp out', min: 0.01, max: 1, step: 0.02 },\n { kind: 'slider', key: 'rampOut', label: 'Ramp in', min: 0.01, max: 1, step: 0.02 },\n { kind: 'slider', key: 'angle', label: 'Angle', min: 0, max: 360, step: 1, unit: '°' },\n { kind: 'slider', key: 'bright', label: 'Brightness', min: 0, max: 2, step: 0.05 },\n ],\n};\n","// Effect registry. Add a shader by writing its EffectDef and listing it here.\n\nimport type { EffectId, EffectParams, Theme, ControlSpec } from '../../types';\nimport type { UniformMap } from './common';\nimport { panes } from './panes';\n\nexport { VELOCITY_PRESETS } from './panes';\n\n/**\n * How the compositor crops the shared field for an instance:\n * 'banded' (default) — the wide CROP_W:CROP_H window, tuned for sweeping bands;\n * 'isotropic' — an aspect-true window, so circles and angles render screen-true.\n */\nexport type EffectSampling = 'banded' | 'isotropic';\n\nexport interface EffectDef {\n id: EffectId;\n label: string;\n /** fragment shader source (COMMON_GLSL + the effect's main) */\n frag: string;\n /** every uniform name the program declares */\n uniforms: string[];\n /** default params per theme */\n defaults: Record<Theme, EffectParams>;\n /** push params into the program's uniforms (resolution + time are set by the renderer) */\n upload(gl: WebGLRenderingContext, U: UniformMap, p: EffectParams): void;\n /** crop hint for the given params (absent = 'banded') */\n sampling?(p: EffectParams): EffectSampling;\n /** demo control metadata */\n controls: ControlSpec[];\n}\n\nexport const EFFECTS: Record<EffectId, EffectDef> = { panes };\n\nexport const EFFECT_IDS = Object.keys(EFFECTS) as EffectId[];\n\n/** Merge a partial patch onto base params, replacing the colors array wholesale. */\nexport function mergeEffectParams(\n base: EffectParams,\n patch?: Partial<EffectParams>,\n): EffectParams {\n if (!patch) return { ...base, colors: [...base.colors] };\n return {\n ...base,\n ...patch,\n colors: patch.colors ? [...patch.colors] : [...base.colors],\n };\n}\n","// Shared WebGL renderer: one offscreen canvas, one program per effect, ref-counted.\n// Compiles every registered effect once; renderEffect() selects one, uploads its params,\n// and draws a frame. Rebuilds on context loss. Released when the last instance unmounts.\n\nimport { GL_SIZE, DPR } from '../perf';\nimport { VERT, type UniformMap } from '../effects/common';\nimport { EFFECTS, EFFECT_IDS, type EffectDef } from '../effects';\nimport type { EffectId, EffectParams } from '../../types';\n\nexport interface SharedRenderer {\n readonly glCanvas: HTMLCanvasElement;\n readonly available: boolean;\n /** select an effect, upload its params + time, and draw one frame to glCanvas */\n renderEffect(effectId: EffectId, params: EffectParams, timeSec: number): void;\n destroy(): void;\n}\n\ninterface Compiled {\n program: WebGLProgram;\n U: UniformMap;\n posLoc: number;\n def: EffectDef;\n}\n\nlet shared: SharedRenderer | null = null;\nlet refs = 0;\n\nexport function acquireRenderer(): SharedRenderer {\n refs++;\n if (!shared) shared = createSharedRenderer();\n return shared;\n}\n\nexport function releaseRenderer(): void {\n refs = Math.max(0, refs - 1);\n if (refs === 0 && shared) {\n shared.destroy();\n shared = null;\n }\n}\n\nfunction compile(gl: WebGLRenderingContext, type: number, src: string): WebGLShader {\n const s = gl.createShader(type)!;\n gl.shaderSource(s, src);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(s);\n gl.deleteShader(s);\n throw new Error('glass-pulse-fx: shader compile failed: ' + log);\n }\n return s;\n}\n\nfunction createSharedRenderer(): SharedRenderer {\n const glCanvas = document.createElement('canvas');\n glCanvas.width = Math.round(GL_SIZE * DPR);\n glCanvas.height = Math.round(GL_SIZE * DPR);\n\n const gl = glCanvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n antialias: false,\n preserveDrawingBuffer: true,\n });\n if (!gl) throw new Error('glass-pulse-fx: WebGL not available');\n\n let compiled: Record<string, Compiled> = {};\n let vbuf: WebGLBuffer | null = null;\n let lost = false;\n\n function build(): void {\n // Each effect is a single full-frame pass over a cleared buffer, so no blending is\n // needed. Disabling it lets effects write straight (non-premultiplied) alpha — bands\n // can fade to transparent (glass shows through) instead of multiplying toward black.\n gl!.disable(gl!.BLEND);\n\n vbuf = gl!.createBuffer();\n gl!.bindBuffer(gl!.ARRAY_BUFFER, vbuf);\n gl!.bufferData(\n gl!.ARRAY_BUFFER,\n new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]),\n gl!.STATIC_DRAW,\n );\n\n compiled = {};\n const vert = compile(gl!, gl!.VERTEX_SHADER, VERT);\n for (const id of EFFECT_IDS) {\n const def = EFFECTS[id];\n const program = gl!.createProgram()!;\n gl!.attachShader(program, vert);\n gl!.attachShader(program, compile(gl!, gl!.FRAGMENT_SHADER, def.frag));\n gl!.linkProgram(program);\n if (!gl!.getProgramParameter(program, gl!.LINK_STATUS)) {\n throw new Error(`glass-pulse-fx: link failed (${id}): ` + gl!.getProgramInfoLog(program));\n }\n const U: UniformMap = {};\n for (const n of def.uniforms) U[n] = gl!.getUniformLocation(program, n);\n compiled[id] = { program, U, posLoc: gl!.getAttribLocation(program, 'a_position'), def };\n }\n }\n\n build();\n\n const onLost = (e: Event) => {\n e.preventDefault();\n lost = true;\n };\n const onRestored = () => {\n lost = false;\n build();\n };\n glCanvas.addEventListener('webglcontextlost', onLost as EventListener);\n glCanvas.addEventListener('webglcontextrestored', onRestored);\n\n return {\n glCanvas,\n get available() {\n return !lost;\n },\n renderEffect(effectId, params, timeSec) {\n if (lost) return;\n const ce = compiled[effectId];\n if (!ce) return;\n gl.useProgram(ce.program);\n gl.bindBuffer(gl.ARRAY_BUFFER, vbuf);\n gl.enableVertexAttribArray(ce.posLoc);\n gl.vertexAttribPointer(ce.posLoc, 2, gl.FLOAT, false, 0, 0);\n gl.uniform2f(ce.U.u_resolution, glCanvas.width, glCanvas.height);\n gl.uniform1f(ce.U.u_time, timeSec);\n ce.def.upload(gl, ce.U, params);\n gl.viewport(0, 0, glCanvas.width, glCanvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.drawArrays(gl.TRIANGLES, 0, 6);\n },\n destroy() {\n glCanvas.removeEventListener('webglcontextlost', onLost as EventListener);\n glCanvas.removeEventListener('webglcontextrestored', onRestored);\n gl.getExtension('WEBGL_lose_context')?.loseContext();\n },\n };\n}\n","// The single shared RAF loop driving every glass instance.\n//\n// Cost model: one GL render per distinct (preset, theme) group per frame, plus one\n// cheap canvas copy per visible instance. With all instances sharing a palette this\n// collapses to the spec's \"one shader render + N copies\"; with mixed palettes it is\n// \"one render per distinct palette + N copies\".\n//\n// Gating: pauses GL work when the tab is hidden, when prefers-reduced-motion is set\n// (renders one frozen frame), and skips offscreen / paused instances.\n\nimport type { SharedRenderer } from './context';\nimport type { EffectId, EffectParams } from '../../types';\n\nexport interface Runtime {\n /** `${effectId}:${JSON(params)}` — the grouping key; core updates it on any change. */\n key: string;\n effectId: EffectId;\n params: EffectParams;\n /** minimum milliseconds between animated paints for this runtime */\n frameMs: number;\n /** last animated paint timestamp, in requestAnimationFrame time */\n lastPaintMs: number;\n paused: boolean;\n visible: boolean;\n /** set when geometry/style/effect changed so a frozen instance repaints once */\n needsPaint: boolean;\n /** copy the current shared frame into this instance's layers */\n paint(): void;\n}\n\nconst registry = new Set<Runtime>();\nlet renderer: SharedRenderer | null = null;\n\nlet rafId = 0;\nlet dirty = false;\n\n// Pausable animation clock (the shaders' u_time). It only advances while something is\n// animating; while parked, frozen repaints reuse the same time and resuming (tab shown,\n// reduced-motion lifted, unpause) continues where it left off instead of jumping by the\n// wall-clock gap.\nlet clockSec = 0;\nlet lastClockMs = 0; // last RAF timestamp the clock advanced; 0 = parked\n\nlet motionAllowed = true;\nlet hidden = false;\nlet gatesBound = false;\nlet motionMql: MediaQueryList | null = null;\n\nfunction advanceClock(now: number, animate: boolean): number {\n if (animate) {\n if (lastClockMs) clockSec += (now - lastClockMs) / 1000;\n lastClockMs = now;\n } else {\n lastClockMs = 0;\n }\n return clockSec;\n}\n\nexport function markDirty(): void {\n dirty = true;\n}\n\nexport function addRuntime(rt: Runtime, r: SharedRenderer): void {\n renderer = r;\n registry.add(rt);\n rt.needsPaint = true;\n dirty = true;\n ensureLoop();\n}\n\nexport function removeRuntime(rt: Runtime): void {\n registry.delete(rt);\n if (registry.size === 0) stopLoop();\n}\n\nfunction shouldAnimate(): boolean {\n if (!motionAllowed || hidden) return false;\n for (const rt of registry) if (rt.visible && !rt.paused) return true;\n return false;\n}\n\nfunction ensureLoop(): void {\n if (rafId) return;\n bindGates();\n rafId = requestAnimationFrame(tick);\n}\n\nfunction stopLoop(): void {\n if (rafId) cancelAnimationFrame(rafId);\n rafId = 0;\n lastClockMs = 0;\n unbindGates();\n}\n\nfunction tick(now: number): void {\n rafId = requestAnimationFrame(tick);\n\n const animate = shouldAnimate();\n const t = advanceClock(now, animate);\n let anyNeedsPaint = false;\n let anyDue = false;\n for (const rt of registry) {\n if (rt.needsPaint) anyNeedsPaint = true;\n if (animate && rt.visible && !rt.paused && (rt.lastPaintMs === 0 || now - rt.lastPaintMs >= rt.frameMs)) {\n anyDue = true;\n }\n if (anyNeedsPaint && anyDue) {\n break;\n }\n }\n if (!anyDue && !dirty && !anyNeedsPaint) return;\n\n // group visible instances by palette key\n const groups = new Map<string, Runtime[]>();\n for (const rt of registry) {\n if (!rt.visible) continue;\n const due =\n rt.needsPaint ||\n (animate && !rt.paused && (rt.lastPaintMs === 0 || now - rt.lastPaintMs >= rt.frameMs));\n if (!due) continue;\n let g = groups.get(rt.key);\n if (!g) groups.set(rt.key, (g = []));\n g.push(rt);\n }\n\n if (!groups.size) {\n dirty = false;\n return;\n }\n\n for (const group of groups.values()) {\n if (renderer) {\n renderer.renderEffect(group[0].effectId, group[0].params, t);\n }\n for (const rt of group) {\n rt.paint();\n rt.needsPaint = false;\n if (animate && !rt.paused) rt.lastPaintMs = now;\n }\n }\n dirty = false;\n}\n\n// ── gates ────────────────────────────────────────────────────────────────────\n\nfunction onMotion(): void {\n motionAllowed = !(motionMql && motionMql.matches);\n dirty = true;\n}\nfunction onVisibility(): void {\n hidden = document.hidden;\n if (hidden) {\n // RAF stops firing while the tab is hidden, so park the clock here — the next\n // tick would otherwise fold the whole hidden interval into the animation time.\n lastClockMs = 0;\n } else {\n for (const rt of registry) rt.lastPaintMs = 0;\n }\n dirty = true;\n}\n\nfunction bindGates(): void {\n if (gatesBound || typeof window === 'undefined') return;\n gatesBound = true;\n motionMql = window.matchMedia('(prefers-reduced-motion: reduce)');\n motionAllowed = !motionMql.matches;\n motionMql.addEventListener('change', onMotion);\n hidden = document.hidden;\n document.addEventListener('visibilitychange', onVisibility);\n}\n\nfunction unbindGates(): void {\n if (!gatesBound) return;\n gatesBound = false;\n motionMql?.removeEventListener('change', onMotion);\n document.removeEventListener('visibilitychange', onVisibility);\n motionMql = null;\n}\n","// Layer class names + the static structural styles for each layer.\n// The library applies these inline so consumers don't need to import a CSS file;\n// the class names exist as styling/debugging hooks.\n\nexport const PREFIX = 'gpfx';\n\nexport const CLASS = {\n bloomOut: `${PREFIX}-bloom-out`,\n bloomIn: `${PREFIX}-bloom-in`,\n surfaceClip: `${PREFIX}-surface-clip`,\n base: `${PREFIX}-base`,\n shader: `${PREFIX}-shader`,\n frost: `${PREFIX}-frost`,\n rim: `${PREFIX}-rim`,\n coreClip: `${PREFIX}-core-clip`,\n core: `${PREFIX}-core`,\n border: `${PREFIX}-border`,\n} as const;\n\ntype Style = Partial<CSSStyleDeclaration>;\n\n// z-order, bottom -> top: blooms, masked surface, border, then content (the children).\nexport const STRUCT: Record<keyof typeof CLASS, Style> = {\n bloomOut: { position: 'absolute', pointerEvents: 'none', zIndex: '0' },\n bloomIn: { position: 'absolute', pointerEvents: 'none', zIndex: '1' },\n surfaceClip: {\n position: 'absolute', inset: '0', pointerEvents: 'none',\n zIndex: '2', overflow: 'hidden',\n },\n base: { position: 'absolute', inset: '0', pointerEvents: 'none', zIndex: '0' },\n shader: {\n position: 'absolute', inset: '0', width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: '1',\n },\n frost: { position: 'absolute', inset: '0', pointerEvents: 'none', zIndex: '2' },\n rim: {\n position: 'absolute', inset: '0', width: '100%', height: '100%',\n pointerEvents: 'none', zIndex: '3',\n },\n coreClip: {\n position: 'absolute', inset: '0', pointerEvents: 'none',\n zIndex: '3', overflow: 'hidden',\n },\n core: { position: 'absolute' },\n border: { position: 'absolute', inset: '0', pointerEvents: 'none', zIndex: '5' },\n};\n\nexport function assign(el: HTMLElement, s: Style): void {\n Object.assign(el.style, s);\n}\n","// Per-instance layer stack + painting. Builds the DOM layers behind the content,\n// measures geometry, applies the frost/core/border styles, and copies crops of the\n// shared GL canvas into the shader + bloom canvases each frame.\n//\n// In degraded mode (no WebGL) the shader + bloom canvases are skipped: the frost\n// becomes a flat translucent fill and only the core + border render.\n\nimport { DPR, CROP_W, CROP_H, SHADER_SCALE, BLOOM_MAX, MIN_SAMPLE_SPAN } from '../perf';\nimport { withAlpha } from '../color';\nimport { CLASS, STRUCT, assign } from '../../styles';\nimport type { BloomConfig, BorderConfig, GlassSettings, Kind } from '../../types';\n\nconst supportsBackdrop =\n typeof CSS !== 'undefined' &&\n typeof CSS.supports === 'function' &&\n (CSS.supports('backdrop-filter', 'blur(1px)') ||\n CSS.supports('-webkit-backdrop-filter', 'blur(1px)'));\n\nconst supportsMask =\n typeof CSS !== 'undefined' &&\n typeof CSS.supports === 'function' &&\n (CSS.supports('mask-image', 'linear-gradient(#000, #000)') ||\n CSS.supports('-webkit-mask-image', 'linear-gradient(#000, #000)'));\n\ninterface Crop {\n sx: number;\n sy: number;\n srcW: number;\n srcH: number;\n}\n\ninterface Bloom {\n el: HTMLCanvasElement;\n ctx: CanvasRenderingContext2D;\n spread: number;\n scale: number;\n blur: number;\n enabled: boolean;\n}\n\nconst MASK_AA_SCALE = 2;\nconst RIM_AA_SCALE = 2;\n\nexport interface Compositor {\n measure(): void;\n applyStyle(settings: GlassSettings, fill: string, borderCfg: BorderConfig): void;\n /** isotropic = crop an aspect-true window (circles/angles render screen-true) */\n setSampling(isotropic: boolean): void;\n setBloomClip(clip: boolean): void;\n paint(glCanvas: HTMLCanvasElement): void;\n destroy(): void;\n}\n\nexport interface CompositorOptions {\n radius?: number | string;\n degraded?: boolean;\n bloomClip?: boolean;\n}\n\nfunction mk<K extends keyof typeof CLASS>(\n tag: string,\n key: K,\n): HTMLElement {\n const e = document.createElement(tag);\n e.className = CLASS[key];\n assign(e, STRUCT[key]);\n return e;\n}\n\nfunction svgMaskUrl(width: number, height: number, body: string): string {\n const rasterW = Math.max(1, Math.ceil(width * DPR * MASK_AA_SCALE));\n const rasterH = Math.max(1, Math.ceil(height * DPR * MASK_AA_SCALE));\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${rasterW}\" height=\"${rasterH}\" viewBox=\"0 0 ${width} ${height}\" preserveAspectRatio=\"none\" shape-rendering=\"geometricPrecision\">${body}</svg>`;\n return `url(\"data:image/svg+xml,${encodeURIComponent(svg)}\")`;\n}\n\nfunction roundedRectMaskUrl(width: number, height: number, radius: number, inset = 0): string {\n const x = Math.max(0, inset);\n const y = Math.max(0, inset);\n const w = Math.max(1, width - x * 2);\n const h = Math.max(1, height - y * 2);\n const r = Math.max(0, radius - inset);\n return svgMaskUrl(width, height, `<rect x=\"${x}\" y=\"${y}\" width=\"${w}\" height=\"${h}\" rx=\"${r}\" ry=\"${r}\" fill=\"white\"/>`);\n}\n\nfunction applyMask(el: HTMLElement, mask: string): void {\n const webkitStyle = el.style as unknown as Record<string, string>;\n el.style.maskImage = mask;\n el.style.maskSize = '100% 100%';\n el.style.maskRepeat = 'no-repeat';\n webkitStyle.webkitMaskImage = mask;\n webkitStyle.webkitMaskSize = '100% 100%';\n webkitStyle.webkitMaskRepeat = 'no-repeat';\n}\n\nfunction clearMask(el: HTMLElement): void {\n const webkitStyle = el.style as unknown as Record<string, string>;\n el.style.maskImage = '';\n el.style.maskSize = '';\n el.style.maskRepeat = '';\n webkitStyle.webkitMaskImage = '';\n webkitStyle.webkitMaskSize = '';\n webkitStyle.webkitMaskRepeat = '';\n}\n\nfunction bloomEnabled(size: number, level: number): boolean {\n return size > 0 && level > 0;\n}\n\ninterface LayerRect {\n x: number;\n y: number;\n width: number;\n height: number;\n radius: number;\n}\n\nexport function createCompositor(\n el: HTMLElement,\n kind: Kind,\n opts: CompositorOptions = {},\n): Compositor {\n const degraded = !!opts.degraded;\n let bloomClip = !!opts.bloomClip;\n const shaderScale = SHADER_SCALE[kind];\n\n // wrapper baseline: contained backdrop-filter, positioned, blooms may overflow\n const cs = getComputedStyle(el);\n if (cs.position === 'static') el.style.position = 'relative';\n el.style.isolation = 'isolate';\n\n const surfaceClip = mk('div', 'surfaceClip');\n const base = mk('div', 'base');\n const frost = mk('div', 'frost');\n const coreClip = mk('div', 'coreClip');\n const core = mk('div', 'core');\n coreClip.appendChild(core);\n const border = mk('div', 'border');\n\n let plasma: HTMLCanvasElement | null = null;\n let pctx: CanvasRenderingContext2D | null = null;\n let rim: HTMLCanvasElement | null = null;\n let rctx: CanvasRenderingContext2D | null = null;\n let bIn: Bloom | null = null;\n let bOut: Bloom | null = null;\n\n const nodes: HTMLElement[] = [];\n surfaceClip.appendChild(base);\n if (!degraded) {\n const bloomOut = mk('canvas', 'bloomOut') as HTMLCanvasElement;\n const bloomIn = mk('canvas', 'bloomIn') as HTMLCanvasElement;\n plasma = mk('canvas', 'shader') as HTMLCanvasElement;\n rim = mk('canvas', 'rim') as HTMLCanvasElement;\n pctx = plasma.getContext('2d');\n rctx = rim.getContext('2d');\n bOut = { el: bloomOut, ctx: bloomOut.getContext('2d')!, spread: 0, scale: 1, blur: 0, enabled: false };\n bIn = { el: bloomIn, ctx: bloomIn.getContext('2d')!, spread: 0, scale: 1, blur: 0, enabled: false };\n surfaceClip.appendChild(plasma);\n nodes.push(bloomOut, bloomIn);\n }\n surfaceClip.append(frost, coreClip);\n nodes.push(surfaceClip);\n if (rim) nodes.push(rim);\n nodes.push(border);\n\n const first = el.firstChild;\n for (const n of nodes) el.insertBefore(n, first);\n\n let cssW = 1;\n let cssH = 1;\n // exact (unrounded) layout size — the mask must match it, or its corner arcs\n // stretch subtly off the true curve and hairline rims (small frostInset) go uneven\n let exactW = 1;\n let exactH = 1;\n let layerX = 0;\n let layerY = 0;\n let cornerRadius = 0;\n let settings: GlassSettings | null = null;\n let fill = '#000000';\n let borderCfg: BorderConfig | null = null;\n let isotropic = false;\n\n function clampRadius(value: number): number {\n const min = Math.min(cssW, cssH);\n return Math.max(0, Math.min(value, min / 2));\n }\n\n function radiusFromCssToken(token: string, percentBasis: number): number | null {\n const value = parseFloat(token);\n if (Number.isNaN(value)) return null;\n return token.trim().endsWith('%') ? (percentBasis * value) / 100 : value;\n }\n\n function radiusFromCssValue(value: string): number | null {\n const trimmed = value.trim();\n if (!trimmed || trimmed === '0px') return 0;\n\n const [horizontalPart, verticalPart = horizontalPart] = trimmed.split('/').map((part) => part.trim());\n const horizontal = horizontalPart.split(/\\s+/)[0];\n const vertical = verticalPart.split(/\\s+/)[0];\n const rx = radiusFromCssToken(horizontal, cssW);\n const ry = radiusFromCssToken(vertical, cssH);\n if (rx == null && ry == null) return null;\n if (rx == null) return ry;\n if (ry == null) return rx;\n return Math.min(rx, ry);\n }\n\n function resolveRadius(): number {\n const min = Math.min(cssW, cssH);\n const r = opts.radius;\n if (r != null) {\n if (typeof r === 'number') return clampRadius(r);\n const s = r.trim();\n if (s === '50%') return min / 2;\n if (s.endsWith('%')) {\n const pct = parseFloat(s);\n return Number.isNaN(pct) ? 0 : clampRadius((min * pct) / 100);\n }\n const px = parseFloat(s);\n if (!Number.isNaN(px)) return clampRadius(px);\n }\n if (kind === 'circle') return min / 2;\n return clampRadius(radiusFromCssValue(getComputedStyle(el).borderRadius) ?? 0);\n }\n\n function maxLayerInset(): number {\n return Math.max(0, Math.min(cssW, cssH) / 2 - 0.5);\n }\n\n function clampLayerInset(value: number): number {\n return Math.min(Math.max(0, value), maxLayerInset());\n }\n\n function frostInset(): number {\n return settings ? clampLayerInset(settings.frostInset ?? 0) : 0;\n }\n\n function shaderInset(): number {\n return settings ? clampLayerInset(settings.shaderInset ?? 0) : 0;\n }\n\n function rimVisible(): boolean {\n return !!rim && supportsMask && frostInset() > shaderInset();\n }\n\n function mainShaderInset(): number {\n return rimVisible() ? frostInset() : shaderInset();\n }\n\n function layerRect(inset: number, scaleX: number, scaleY: number, ox = 0, oy = 0): LayerRect {\n const i = clampLayerInset(inset);\n return {\n x: ox + i * scaleX,\n y: oy + i * scaleY,\n width: Math.max(1, (cssW - i * 2) * scaleX),\n height: Math.max(1, (cssH - i * 2) * scaleY),\n radius: Math.max(0, cornerRadius - i) * Math.min(scaleX, scaleY),\n };\n }\n\n function addRoundedRect(ctx: CanvasRenderingContext2D, rect: LayerRect): void {\n ctx.roundRect(rect.x, rect.y, rect.width, rect.height, rect.radius);\n }\n\n // When clipping is on, restrict the bloom canvas to the component's rounded box\n // (the canvas sits `spread` px outside every edge, so inset by that much).\n function bloomClipPath(sp: number): string {\n return bloomClip\n ? `inset(${sp - layerY}px ${sp + layerX}px ${sp + layerY}px ${sp - layerX}px round ${cornerRadius}px)`\n : 'none';\n }\n\n function layoutBloom(b: Bloom, cfg: BloomConfig): void {\n const { size, level } = cfg;\n b.enabled = bloomEnabled(size, level);\n if (!b.enabled) {\n assign(b.el, {\n display: 'none',\n filter: 'none',\n opacity: '0',\n });\n b.el.width = 1;\n b.el.height = 1;\n b.spread = 0;\n b.scale = 1;\n b.blur = 0;\n return;\n }\n\n const spread = Math.ceil(size * 2.2) + 5;\n const cw = cssW + spread * 2;\n const ch = cssH + spread * 2;\n assign(b.el, {\n display: 'block',\n left: layerX - spread + 'px',\n top: layerY - spread + 'px',\n width: cw + 'px',\n height: ch + 'px',\n filter: `blur(${size}px)`,\n opacity: String(level),\n });\n const scale = Math.min(DPR, BLOOM_MAX / Math.max(cw, ch));\n b.el.width = Math.max(1, Math.round(cw * scale));\n b.el.height = Math.max(1, Math.round(ch * scale));\n b.spread = spread;\n b.scale = scale;\n b.blur = size;\n b.el.style.clipPath = bloomClipPath(spread);\n }\n\n function applyGlassStyle(): void {\n if (!settings) return;\n // No opaque `base` fill — the component's own background shows through as the\n // backdrop. We only tint the frost/core with the (composite) fill, painted on top.\n frost.style.background = withAlpha(fill, settings.frost);\n // insetting the frost exposes a raw (un-veiled, un-blurred) shader rim at the edge.\n const fi = frostInset();\n if (plasma) {\n plasma.style.inset = '0';\n plasma.style.borderRadius = '0';\n clearMask(plasma);\n }\n if (fi <= 0) {\n // Flush frost should be clipped only by surfaceClip. A second rounded clip\n // antialiases independently from the outer mask and can leak shader pixels\n // at the corners when the frost is fully opaque.\n frost.style.inset = '0';\n frost.style.borderRadius = '0';\n clearMask(frost);\n if (rim) {\n rim.style.display = 'none';\n clearMask(rim);\n }\n } else if (supportsMask) {\n // Keep frost in the same layout box as surfaceClip and draw the inset rect\n // inside the SVG mask. The raw rim is clipped in its own canvas so the thin\n // outline doesn't pick up a second, independently-rasterized CSS mask edge.\n frost.style.inset = '0';\n frost.style.borderRadius = '0';\n const innerMask = roundedRectMaskUrl(exactW, exactH, cornerRadius, fi);\n applyMask(frost, innerMask);\n if (rim) {\n rim.style.display = rimVisible() ? 'block' : 'none';\n clearMask(rim);\n }\n } else {\n frost.style.inset = fi + 'px';\n clearMask(frost);\n if (rim) {\n rim.style.display = 'none';\n clearMask(rim);\n }\n frost.style.borderRadius = Math.max(0, cornerRadius - fi) + 'px';\n }\n if (supportsBackdrop && !degraded) {\n const shouldFilter = settings.bgBlur > 0 || Math.abs(settings.saturate - 1) > 0.001;\n const bf = shouldFilter ? `saturate(${settings.saturate}) blur(${settings.bgBlur}px)` : 'none';\n frost.style.backdropFilter = bf;\n (frost.style as unknown as Record<string, string>).webkitBackdropFilter = bf;\n }\n // optionally scale inset + blur with element size (reference = 52px button height)\n const k = settings.coreProportional ? Math.min(cssW, cssH) / 52 : 1;\n const inset = settings.coreInset * k;\n core.style.inset = inset + 'px';\n core.style.borderRadius = Math.max(0, cornerRadius - inset) + 'px';\n core.style.background = fill;\n core.style.filter = `blur(${settings.coreBlur * k}px)`;\n core.style.opacity = String(settings.coreOpacity);\n }\n\n function applyBorder(): void {\n if (!borderCfg) return;\n border.style.borderRadius = cornerRadius + 'px';\n border.style.boxSizing = 'border-box';\n border.style.border = `${borderCfg.width}px solid ${withAlpha(\n borderCfg.color,\n borderCfg.opacity,\n )}`;\n }\n\n function applySurfaceClip(): void {\n if (!supportsMask) {\n surfaceClip.style.overflow = 'hidden';\n surfaceClip.style.borderRadius = cornerRadius + 'px';\n return;\n }\n\n const mask = roundedRectMaskUrl(exactW, exactH, cornerRadius);\n const webkitStyle = surfaceClip.style as unknown as Record<string, string>;\n surfaceClip.style.overflow = 'visible';\n surfaceClip.style.borderRadius = '0';\n surfaceClip.style.maskImage = mask;\n surfaceClip.style.maskSize = '100% 100%';\n surfaceClip.style.maskRepeat = 'no-repeat';\n webkitStyle.webkitMaskImage = mask;\n webkitStyle.webkitMaskSize = '100% 100%';\n webkitStyle.webkitMaskRepeat = 'no-repeat';\n }\n\n function measure(): void {\n const r = el.getBoundingClientRect();\n // The layers are absolutely positioned, so their origin is the host's *padding* box,\n // but getBoundingClientRect measures the *border* box. Offset by the host's border so\n // the glass aligns to the full component (otherwise a top/left border shifts it).\n const mcs = getComputedStyle(el);\n const borderL = parseFloat(mcs.borderLeftWidth) || 0;\n const borderT = parseFloat(mcs.borderTopWidth) || 0;\n const snappedLeft = Math.round(r.left * DPR) / DPR;\n const snappedTop = Math.round(r.top * DPR) / DPR;\n const snappedRight = Math.round(r.right * DPR) / DPR;\n const snappedBottom = Math.round(r.bottom * DPR) / DPR;\n layerX = snappedLeft - r.left - borderL;\n layerY = snappedTop - r.top - borderT;\n exactW = Math.max(1, snappedRight - snappedLeft);\n exactH = Math.max(1, snappedBottom - snappedTop);\n cssW = exactW;\n cssH = exactH;\n cornerRadius = resolveRadius();\n // When a radius is given as a prop, round the component itself to match the glass\n // clip so its own background/border follow the same corners. (If the component sets\n // its radius in CSS instead, we leave it untouched.)\n if (opts.radius != null) el.style.borderRadius = cornerRadius + 'px';\n\n assign(surfaceClip, {\n inset: 'auto',\n left: layerX + 'px',\n top: layerY + 'px',\n width: exactW + 'px',\n height: exactH + 'px',\n });\n assign(border, {\n inset: 'auto',\n left: layerX + 'px',\n top: layerY + 'px',\n width: exactW + 'px',\n height: exactH + 'px',\n });\n if (rim) {\n assign(rim, {\n inset: 'auto',\n left: layerX + 'px',\n top: layerY + 'px',\n width: exactW + 'px',\n height: exactH + 'px',\n });\n }\n\n if (plasma) {\n plasma.width = Math.round(exactW * DPR);\n plasma.height = Math.round(exactH * DPR);\n }\n if (rim) {\n rim.width = Math.round(exactW * DPR * RIM_AA_SCALE);\n rim.height = Math.round(exactH * DPR * RIM_AA_SCALE);\n }\n applySurfaceClip();\n\n if (!settings) return;\n if (bOut) layoutBloom(bOut, settings.outerBloom);\n if (bIn) layoutBloom(bIn, settings.innerBloom);\n applyGlassStyle();\n applyBorder();\n }\n\n function cropForSize(glCanvas: HTMLCanvasElement, targetW: number, targetH: number): Crop {\n const cw = glCanvas.width;\n const ch = glCanvas.height;\n const safeW = Math.max(1, targetW);\n const safeH = Math.max(1, targetH);\n if (isotropic) {\n // largest centered window matching the element's aspect: x and y magnification\n // come out equal, so field-space circles and angles render screen-true\n let srcW = cw;\n let srcH = (cw * safeH) / safeW;\n if (srcH > ch) {\n srcW = (ch * safeW) / safeH;\n srcH = ch;\n }\n return { sx: (cw - srcW) / 2, sy: (ch - srcH) / 2, srcW, srcH };\n }\n const sampleW = Math.max(safeW, CROP_W * shaderScale * MIN_SAMPLE_SPAN);\n const sampleH = Math.max(safeH, CROP_H * shaderScale * MIN_SAMPLE_SPAN);\n let srcW = (sampleW * cw) / CROP_W / shaderScale;\n let srcH = (sampleH * ch) / CROP_H / shaderScale;\n if (srcW > cw) srcW = cw;\n if (srcH > ch) srcH = ch;\n return { sx: Math.max(0, (cw - srcW) / 2), sy: Math.max(0, (ch - srcH) / 2), srcW, srcH };\n }\n\n function bloomSourceInset(b: Bloom): number {\n if (!settings) return 0;\n if (b.blur <= 0) return 0;\n const rim = settings.coreInset + Math.max(settings.coreBlur, b.blur) * 0.5;\n const sourceInset = Math.max(2, b.blur, rim);\n const source = layerRect(shaderInset(), 1, 1);\n const maxInset = Math.max(0, Math.min(source.width, source.height) / 2 - 0.5);\n return Math.min(sourceInset, maxInset);\n }\n\n // Two perpendicular edges' blur overlaps near a corner (~2x energy at the corner\n // point, falling off with distance), so the counter-correction is a radial falloff\n // centred on each corner — a flat rect reads as a visible dip + seam in the glow.\n function attenuateBloomCorners(\n ctx: CanvasRenderingContext2D,\n b: Bloom,\n x: number,\n y: number,\n w: number,\n h: number,\n radius: number,\n ): void {\n const min = Math.min(w, h);\n if (b.blur <= 0) return;\n if (radius <= 0 || radius >= min / 2 - 0.5) return;\n\n const zone = Math.min(min / 2, radius + b.blur * b.scale * 1.25);\n const amount = Math.min(0.55, 0.14 + b.blur / 45);\n ctx.globalCompositeOperation = 'destination-out';\n for (const [cx, cy] of [[x, y], [x + w, y], [x, y + h], [x + w, y + h]] as const) {\n const g = ctx.createRadialGradient(cx, cy, 0, cx, cy, zone);\n g.addColorStop(0, `rgba(0, 0, 0, ${amount})`);\n g.addColorStop(1, 'rgba(0, 0, 0, 0)');\n ctx.fillStyle = g;\n ctx.fillRect(cx - zone, cy - zone, zone * 2, zone * 2);\n }\n }\n\n function drawShaderField(\n ctx: CanvasRenderingContext2D,\n crop: Crop,\n glCanvas: HTMLCanvasElement,\n rect: LayerRect,\n ): void {\n ctx.drawImage(glCanvas, crop.sx, crop.sy, crop.srcW, crop.srcH, rect.x, rect.y, rect.width, rect.height);\n }\n\n function paintBloom(b: Bloom, crop: Crop, glCanvas: HTMLCanvasElement): void {\n if (!b.enabled) return;\n const ctx = b.ctx;\n const s = b.scale;\n const sp = b.spread;\n ctx.clearRect(0, 0, b.el.width, b.el.height);\n const sourceInset = bloomSourceInset(b);\n if (sourceInset <= 0) return;\n const outer = layerRect(shaderInset(), s, s, sp * s, sp * s);\n\n ctx.save();\n ctx.beginPath();\n addRoundedRect(ctx, outer);\n ctx.clip();\n drawShaderField(ctx, crop, glCanvas, outer);\n\n const inset = sourceInset * s;\n const inner: LayerRect = {\n x: outer.x + inset,\n y: outer.y + inset,\n width: outer.width - inset * 2,\n height: outer.height - inset * 2,\n radius: Math.max(0, outer.radius - inset),\n };\n if (inner.width > 0 && inner.height > 0) {\n ctx.globalCompositeOperation = 'destination-out';\n ctx.beginPath();\n addRoundedRect(ctx, inner);\n ctx.fill();\n }\n attenuateBloomCorners(ctx, b, outer.x, outer.y, outer.width, outer.height, outer.radius);\n ctx.restore();\n }\n\n function paintMainShader(crop: Crop, glCanvas: HTMLCanvasElement): void {\n if (!plasma || !pctx) return;\n const dw = plasma.width;\n const dh = plasma.height;\n if (dw < 1 || dh < 1) return;\n\n const sx = dw / exactW;\n const sy = dh / exactH;\n const source = layerRect(shaderInset(), sx, sy);\n const visible = layerRect(mainShaderInset(), sx, sy);\n\n pctx.clearRect(0, 0, dw, dh);\n pctx.save();\n pctx.beginPath();\n addRoundedRect(pctx, visible);\n pctx.clip();\n drawShaderField(pctx, crop, glCanvas, source);\n pctx.restore();\n }\n\n function paintRim(crop: Crop, glCanvas: HTMLCanvasElement): void {\n if (!rim || !rctx || !settings) return;\n const dw = rim.width;\n const dh = rim.height;\n if (dw < 1 || dh < 1) return;\n rctx.clearRect(0, 0, dw, dh);\n if (rim.style.display === 'none' || !rimVisible()) return;\n\n const sx = dw / exactW;\n const sy = dh / exactH;\n const outer = layerRect(shaderInset(), sx, sy);\n const inner = layerRect(frostInset(), sx, sy);\n rctx.save();\n rctx.imageSmoothingEnabled = true;\n rctx.imageSmoothingQuality = 'high';\n rctx.beginPath();\n addRoundedRect(rctx, outer);\n addRoundedRect(rctx, inner);\n rctx.clip('evenodd');\n drawShaderField(rctx, crop, glCanvas, outer);\n rctx.restore();\n }\n\n function paint(glCanvas: HTMLCanvasElement): void {\n if (!plasma || !pctx) return;\n const source = layerRect(shaderInset(), 1, 1);\n const crop = cropForSize(glCanvas, source.width, source.height);\n if (bOut?.enabled) paintBloom(bOut, crop, glCanvas);\n if (bIn?.enabled) paintBloom(bIn, crop, glCanvas);\n paintMainShader(crop, glCanvas);\n paintRim(crop, glCanvas);\n }\n\n return {\n measure,\n applyStyle(s, f, b) {\n settings = s;\n fill = f;\n borderCfg = b;\n measure();\n },\n setSampling(v) {\n isotropic = v;\n },\n setBloomClip(v) {\n bloomClip = v;\n if (bOut?.enabled) bOut.el.style.clipPath = bloomClipPath(bOut.spread);\n if (bIn?.enabled) bIn.el.style.clipPath = bloomClipPath(bIn.spread);\n },\n paint,\n destroy() {\n for (const n of nodes) n.remove();\n },\n };\n}\n","// Settings presets: the slider configuration per theme.\n// These match the foundational material tokens from Paper.\n\nimport type { BorderConfig, GlassSettings, GlassSettingsPatch, Theme } from '../types';\n\nexport const DEFAULT_SETTINGS: Record<Theme, GlassSettings> = {\n dark: {\n bgBlur: 6,\n frost: 0.66,\n frostInset: 0,\n shaderInset: 0,\n coreInset: 8,\n coreBlur: 8,\n coreOpacity: 1,\n coreProportional: false,\n saturate: 1.3,\n innerBloom: { size: 2, level: 1.0 },\n outerBloom: { size: 16, level: 0.45 },\n },\n light: {\n bgBlur: 6,\n frost: 0.42,\n frostInset: 0,\n shaderInset: 0,\n coreInset: 8,\n coreBlur: 8,\n coreOpacity: 1,\n coreProportional: false,\n saturate: 1.55,\n innerBloom: { size: 2, level: 1.0 },\n outerBloom: { size: 18, level: 0.5 },\n },\n};\n\n/** Lit-rim border per theme — component styling (like DEFAULT_FILL), not part of presets. */\nexport const DEFAULT_BORDER: Record<Theme, BorderConfig> = {\n dark: { width: 1, opacity: 0.3, color: '#808080' }, // hsl(0 0% 50%)\n light: { width: 1, opacity: 0.3, color: '#6A6A72' },\n};\n\nexport function mergeBorder(base: BorderConfig, patch?: Partial<BorderConfig>): BorderConfig {\n return patch ? { ...base, ...patch } : { ...base };\n}\n\n/** Surface color per theme — a CSS background the glass derives from, separate from settings. */\nexport const DEFAULT_FILL: Record<Theme, string> = {\n dark: '#0D0D12',\n light: '#EEF0F3',\n};\n\n/** Merge a partial patch onto a base, deep-merging the two bloom configs. */\nexport function mergeSettings(\n base: GlassSettings,\n patch?: GlassSettingsPatch,\n): GlassSettings {\n if (!patch) {\n return {\n ...base,\n innerBloom: { ...base.innerBloom },\n outerBloom: { ...base.outerBloom },\n };\n }\n return {\n ...base,\n ...patch,\n innerBloom: { ...base.innerBloom, ...patch.innerBloom },\n outerBloom: { ...base.outerBloom, ...patch.outerBloom },\n };\n}\n","// Public vanilla API: createGlass(target, opts) -> GlassInstance.\n// Wraps the shared renderer + per-instance compositor and wires up sizing\n// (ResizeObserver), offscreen skipping (IntersectionObserver), and effect/theme/fill\n// updates. This is `glass-pulse-fx/core` — usable with no framework.\n\nimport { acquireRenderer, releaseRenderer, type SharedRenderer } from './engine/renderer/context';\nimport { addRuntime, removeRuntime, markDirty, type Runtime } from './engine/renderer/loop';\nimport { createCompositor, type Compositor } from './engine/renderer/compositor';\nimport { EFFECTS, mergeEffectParams } from './engine/effects';\nimport { DEFAULT_SETTINGS, DEFAULT_FILL, DEFAULT_BORDER, mergeSettings, mergeBorder } from './engine/settings';\nimport { parseColor, compositeOver, rgbToHex, type RGBA } from './engine/color';\nimport { frameMsForFps } from './engine/perf';\nimport type {\n BorderConfig,\n CreateGlassOptions,\n EffectId,\n EffectParams,\n FpsMode,\n GlassInstance,\n GlassSettings,\n GlassSettingsPatch,\n Kind,\n Theme,\n} from './types';\n\nexport * from './types';\nexport { DEFAULT_SETTINGS, DEFAULT_FILL, DEFAULT_BORDER, mergeSettings, mergeBorder } from './engine/settings';\nexport { EFFECTS, EFFECT_IDS, VELOCITY_PRESETS, mergeEffectParams } from './engine/effects';\n\nconst keyFor = (id: EffectId, params: EffectParams) => id + ':' + JSON.stringify(params);\n\nfunction inferKind(el: HTMLElement, radius?: number | string): Kind {\n if (radius === '50%') return 'circle';\n const br = getComputedStyle(el).borderRadius;\n if (br && br.includes('%') && parseFloat(br) >= 50) return 'circle';\n return 'rect';\n}\n\n// The opaque color seen *through* an element — its ancestor backgrounds flattened\n// (the eyedropper backdrop a translucent component surface sits on).\nfunction backdropOf(el: HTMLElement): RGBA {\n const layers: RGBA[] = [];\n for (let n = el.parentElement; n; n = n.parentElement) {\n const c = parseColor(getComputedStyle(n).backgroundColor);\n if (c.a > 0) layers.push(c);\n if (c.a >= 1) break; // opaque ancestor — stop\n }\n let out: RGBA =\n layers.length && layers[layers.length - 1].a >= 1 ? layers.pop()! : { r: 0, g: 0, b: 0, a: 1 };\n for (let i = layers.length - 1; i >= 0; i--) out = compositeOver(layers[i], out);\n return out;\n}\n\n// The component GlassPulse wraps *is* the surface: read its own background and flatten\n// any translucency against the backdrop, so the glass gets an opaque tint (and the\n// frost/core opacity settings don't double-count the component's alpha). null when the\n// host is transparent — caller falls back to the theme default.\nfunction readHostFill(el: HTMLElement): string | null {\n const own = parseColor(getComputedStyle(el).backgroundColor);\n if (own.a <= 0) return null;\n if (own.a >= 1) return rgbToHex(own);\n return rgbToHex(compositeOver(own, backdropOf(el)));\n}\n\n// Combine two settings patches (b wins), deep-merging the bloom configs.\nfunction combinePatches(\n a?: GlassSettingsPatch,\n b?: GlassSettingsPatch,\n): GlassSettingsPatch | undefined {\n if (!a || !b) return a ?? b;\n const out: GlassSettingsPatch = { ...a, ...b };\n if (a.innerBloom && b.innerBloom) out.innerBloom = { ...a.innerBloom, ...b.innerBloom };\n if (a.outerBloom && b.outerBloom) out.outerBloom = { ...a.outerBloom, ...b.outerBloom };\n return out;\n}\n\nexport function createGlass(target: HTMLElement, opts: CreateGlassOptions = {}): GlassInstance {\n const preset = opts.preset;\n let theme: Theme = opts.theme ?? 'dark';\n let effect: EffectId = opts.effect ?? preset?.effect ?? 'panes';\n\n // Explicit param overrides (incl. the preset's) accumulate here and stay constant\n // across themes; setTheme re-bases them onto the new theme's effect defaults, so\n // anything a preset doesn't pin still adapts per theme.\n let userParams: Partial<EffectParams> = {};\n function rememberParams(patch?: Partial<EffectParams>): void {\n if (!patch) return;\n userParams = { ...userParams, ...patch };\n if (patch.colors) userParams.colors = [...patch.colors];\n }\n rememberParams(preset?.effectParams);\n rememberParams(opts.effectParams);\n let params: EffectParams = mergeEffectParams(EFFECTS[effect].defaults[theme], userParams);\n\n // The glass is painted ON TOP of the component — we never touch its background,\n // border, radius, or shadow. With no explicit fill we read the component's own\n // background and flatten it to an opaque tint for the frost/core (so their opacity\n // settings don't double-count the component's alpha); the component's surface stays\n // as the backdrop underneath.\n const fillPinned = opts.fill != null;\n let fill = opts.fill ?? readHostFill(target) ?? DEFAULT_FILL[theme];\n\n // creation-time overrides (preset's beneath explicit), re-applied on theme switch\n const basePatch = combinePatches(preset?.settings, opts.settings);\n let settings: GlassSettings = mergeSettings(DEFAULT_SETTINGS[theme], basePatch);\n\n // The component keeps its own CSS border. The glass only adds a lit rim when one is\n // explicitly requested via the `border` prop.\n const noRim: BorderConfig = { width: 0, opacity: 0, color: 'transparent' };\n let borderPatch: Partial<BorderConfig> = { ...opts.border };\n let border: BorderConfig = opts.border ? mergeBorder(DEFAULT_BORDER[theme], borderPatch) : noRim;\n\n const kind: Kind = opts.kind ?? inferKind(target, opts.radius);\n\n let renderer: SharedRenderer | null = null;\n let degraded = false;\n try {\n renderer = acquireRenderer();\n } catch {\n degraded = true; // no WebGL -> flat fill + border fallback\n }\n\n const comp: Compositor = createCompositor(target, kind, {\n radius: opts.radius,\n degraded,\n bloomClip: opts.bloomClip,\n });\n comp.setSampling(EFFECTS[effect].sampling?.(params) === 'isotropic');\n comp.applyStyle(settings, fill, border);\n\n const rt: Runtime = {\n key: keyFor(effect, params),\n effectId: effect,\n params,\n frameMs: frameMsForFps(opts.fps),\n lastPaintMs: 0,\n paused: opts.paused ?? false,\n visible: true,\n needsPaint: true,\n paint() {\n if (renderer) comp.paint(renderer.glCanvas);\n },\n };\n\n let ro: ResizeObserver | null = null;\n let io: IntersectionObserver | null = null;\n\n if (!degraded && renderer) {\n addRuntime(rt, renderer);\n let rafScheduled = false;\n ro = new ResizeObserver(() => {\n if (rafScheduled) return;\n rafScheduled = true;\n requestAnimationFrame(() => {\n rafScheduled = false;\n comp.measure();\n rt.needsPaint = true;\n markDirty();\n });\n });\n ro.observe(target);\n io = new IntersectionObserver((entries) => {\n for (const e of entries) rt.visible = e.isIntersecting;\n markDirty();\n });\n io.observe(target);\n }\n\n function restyle(): void {\n comp.applyStyle(settings, fill, border);\n rt.needsPaint = true;\n markDirty();\n }\n function syncEffect(): void {\n rt.effectId = effect;\n rt.params = params;\n rt.key = keyFor(effect, params);\n comp.setSampling(EFFECTS[effect].sampling?.(params) === 'isotropic');\n rt.needsPaint = true;\n markDirty();\n }\n function setRuntimeFps(fps: FpsMode): void {\n rt.frameMs = frameMsForFps(fps);\n rt.lastPaintMs = 0;\n rt.needsPaint = true;\n markDirty();\n }\n\n return {\n update(patch) {\n settings = mergeSettings(settings, patch);\n restyle();\n },\n setEffect(id) {\n effect = id;\n userParams = {};\n params = mergeEffectParams(EFFECTS[id].defaults[theme]);\n syncEffect();\n },\n setEffectParams(patch) {\n rememberParams(patch);\n params = mergeEffectParams(params, patch);\n syncEffect();\n },\n setTheme(t) {\n theme = t;\n settings = mergeSettings(DEFAULT_SETTINGS[theme], basePatch);\n if (!fillPinned) fill = readHostFill(target) ?? DEFAULT_FILL[theme];\n border = opts.border ? mergeBorder(DEFAULT_BORDER[theme], borderPatch) : noRim;\n params = mergeEffectParams(EFFECTS[effect].defaults[theme], userParams);\n syncEffect();\n restyle();\n },\n setFill(color) {\n fill = color;\n restyle();\n },\n setBorder(patch) {\n borderPatch = { ...borderPatch, ...patch };\n border = mergeBorder(border, patch);\n restyle();\n },\n setFps(fps) {\n setRuntimeFps(fps);\n },\n setBloomClip(clip) {\n comp.setBloomClip(clip);\n },\n setPaused(paused) {\n rt.paused = paused;\n rt.needsPaint = true;\n markDirty();\n },\n destroy() {\n ro?.disconnect();\n io?.disconnect();\n removeRuntime(rt);\n comp.destroy();\n if (!degraded) releaseRenderer();\n },\n };\n}\n","// React wrapper over the vanilla core. SSR-safe: the WebGL instance is only created\n// in a layout effect (client-only); the server renders a plain wrapper + children.\n\nimport * as React from 'react';\nimport { createGlass } from './core';\nimport { DEFAULT_SETTINGS, mergeSettings } from './engine/settings';\nimport type {\n BorderConfig,\n EffectId,\n EffectParams,\n FpsMode,\n GlassInstance,\n GlassPreset,\n GlassSettings,\n GlassSettingsPatch,\n Kind,\n Theme,\n} from './types';\n\nexport interface GlassFxProps {\n children?: React.ReactNode;\n /** a shareable look (shader + params + glass material, per theme); explicit props win */\n preset?: GlassPreset;\n /** base shader. default 'panes' (or the preset's effect) */\n effect?: EffectId;\n /** shader params, merged onto the preset's params and the effect's theme defaults */\n effectParams?: Partial<EffectParams>;\n /** 'dark' | 'light' | 'auto' (follows prefers-color-scheme). default 'auto' */\n theme?: Theme | 'auto';\n /** component styling — yours, not part of presets */\n fill?: string;\n border?: Partial<BorderConfig>;\n radius?: number | string;\n kind?: Kind;\n fps?: FpsMode;\n paused?: boolean;\n /** clip the bloom to the component's rounded box (no outward spill). default false */\n bloomClip?: boolean;\n settings?: GlassSettingsPatch;\n settingsByTheme?: Partial<Record<Theme, GlassSettingsPatch>>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction useResolvedTheme(theme: Theme | 'auto'): Theme {\n const get = React.useCallback((): Theme => {\n if (theme !== 'auto') return theme;\n if (typeof window === 'undefined') return 'dark';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }, [theme]);\n\n const [resolved, setResolved] = React.useState<Theme>(get);\n\n React.useEffect(() => {\n setResolved(get());\n if (theme !== 'auto' || typeof window === 'undefined') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = () => setResolved(mql.matches ? 'dark' : 'light');\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n }, [theme, get]);\n\n return resolved;\n}\n\nexport function GlassFx({\n children,\n preset,\n effect,\n effectParams,\n theme = 'auto',\n fill,\n border,\n radius,\n kind,\n fps = 30,\n paused = false,\n bloomClip = false,\n settings,\n settingsByTheme,\n className,\n style,\n}: GlassFxProps): React.JSX.Element {\n const ref = React.useRef<HTMLDivElement>(null);\n const inst = React.useRef<GlassInstance | null>(null);\n const resolvedTheme = useResolvedTheme(theme);\n\n // resolution order: explicit props > preset > effect/theme defaults\n const resolvedEffect: EffectId = effect ?? preset?.effect ?? 'panes';\n const mergedParams: Partial<EffectParams> | undefined =\n preset?.effectParams || effectParams\n ? { ...preset?.effectParams, ...effectParams }\n : undefined;\n const effSettings = (t: Theme): GlassSettings =>\n mergeSettings(\n mergeSettings(mergeSettings(DEFAULT_SETTINGS[t], preset?.settings), settings),\n settingsByTheme?.[t],\n );\n\n React.useLayoutEffect(() => {\n if (!ref.current) return;\n const g = createGlass(ref.current, {\n effect: resolvedEffect,\n effectParams: mergedParams,\n theme: resolvedTheme,\n fill,\n border,\n radius,\n kind,\n fps,\n paused,\n bloomClip,\n settings: effSettings(resolvedTheme),\n });\n inst.current = g;\n return () => {\n g.destroy();\n inst.current = null;\n };\n // create once; prop changes are synced by the effects below\n }, []);\n\n React.useEffect(() => {\n // setEffect resets to the effect's theme defaults; re-apply the resolved overrides\n inst.current?.setEffect(resolvedEffect);\n if (mergedParams) inst.current?.setEffectParams(mergedParams);\n }, [resolvedEffect]);\n\n React.useEffect(() => {\n if (mergedParams) inst.current?.setEffectParams(mergedParams);\n }, [JSON.stringify(mergedParams)]);\n\n React.useEffect(() => {\n // the preset's params persist through this automatically (overrides are\n // constant across themes); only the merged settings need re-deriving\n inst.current?.setTheme(resolvedTheme);\n inst.current?.update(effSettings(resolvedTheme));\n if (fill != null) inst.current?.setFill(fill);\n }, [resolvedTheme]);\n\n React.useEffect(() => {\n if (fill != null) inst.current?.setFill(fill);\n }, [fill]);\n\n React.useEffect(() => {\n if (border) inst.current?.setBorder(border);\n }, [JSON.stringify(border)]);\n\n React.useEffect(() => {\n inst.current?.setPaused(paused);\n }, [paused]);\n\n React.useEffect(() => {\n inst.current?.setFps(fps);\n }, [fps]);\n\n React.useEffect(() => {\n inst.current?.setBloomClip(bloomClip);\n }, [bloomClip]);\n\n React.useEffect(() => {\n inst.current?.update(effSettings(resolvedTheme));\n }, [JSON.stringify(settings), JSON.stringify(settingsByTheme), JSON.stringify(preset?.settings)]);\n\n return (\n <div ref={ref} className={className} style={style}>\n {children}\n </div>\n );\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { DEFAULT_BORDER, DEFAULT_FILL, DEFAULT_SETTINGS, EFFECTS, EFFECT_IDS, VELOCITY_PRESETS, createGlass, mergeBorder, mergeEffectParams, mergeSettings } from './core.cjs';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { G as GlassPreset, E as EffectId, a as EffectParams, T as Theme, B as BorderConfig, K as Kind, F as FpsMode, b as GlassSettingsPatch } from './types-qQT95c-N.cjs';
|
|
4
|
+
export { c as BloomConfig, C as ColorsControl, d as ControlSpec, e as CreateGlassOptions, f as GlassInstance, g as GlassSettings, S as SelectControl, h as SliderControl } from './types-qQT95c-N.cjs';
|
|
5
|
+
|
|
6
|
+
interface GlassFxProps {
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
/** a shareable look (shader + params + glass material, per theme); explicit props win */
|
|
9
|
+
preset?: GlassPreset;
|
|
10
|
+
/** base shader. default 'panes' (or the preset's effect) */
|
|
11
|
+
effect?: EffectId;
|
|
12
|
+
/** shader params, merged onto the preset's params and the effect's theme defaults */
|
|
13
|
+
effectParams?: Partial<EffectParams>;
|
|
14
|
+
/** 'dark' | 'light' | 'auto' (follows prefers-color-scheme). default 'auto' */
|
|
15
|
+
theme?: Theme | 'auto';
|
|
16
|
+
/** component styling — yours, not part of presets */
|
|
17
|
+
fill?: string;
|
|
18
|
+
border?: Partial<BorderConfig>;
|
|
19
|
+
radius?: number | string;
|
|
20
|
+
kind?: Kind;
|
|
21
|
+
fps?: FpsMode;
|
|
22
|
+
paused?: boolean;
|
|
23
|
+
/** clip the bloom to the component's rounded box (no outward spill). default false */
|
|
24
|
+
bloomClip?: boolean;
|
|
25
|
+
settings?: GlassSettingsPatch;
|
|
26
|
+
settingsByTheme?: Partial<Record<Theme, GlassSettingsPatch>>;
|
|
27
|
+
className?: string;
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
declare function GlassFx({ children, preset, effect, effectParams, theme, fill, border, radius, kind, fps, paused, bloomClip, settings, settingsByTheme, className, style, }: GlassFxProps): React.JSX.Element;
|
|
31
|
+
|
|
32
|
+
export { BorderConfig, EffectId, EffectParams, FpsMode, GlassFx, type GlassFxProps, GlassPreset, GlassSettingsPatch, Kind, Theme };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { DEFAULT_BORDER, DEFAULT_FILL, DEFAULT_SETTINGS, EFFECTS, EFFECT_IDS, VELOCITY_PRESETS, createGlass, mergeBorder, mergeEffectParams, mergeSettings } from './core.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { G as GlassPreset, E as EffectId, a as EffectParams, T as Theme, B as BorderConfig, K as Kind, F as FpsMode, b as GlassSettingsPatch } from './types-qQT95c-N.js';
|
|
4
|
+
export { c as BloomConfig, C as ColorsControl, d as ControlSpec, e as CreateGlassOptions, f as GlassInstance, g as GlassSettings, S as SelectControl, h as SliderControl } from './types-qQT95c-N.js';
|
|
5
|
+
|
|
6
|
+
interface GlassFxProps {
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
/** a shareable look (shader + params + glass material, per theme); explicit props win */
|
|
9
|
+
preset?: GlassPreset;
|
|
10
|
+
/** base shader. default 'panes' (or the preset's effect) */
|
|
11
|
+
effect?: EffectId;
|
|
12
|
+
/** shader params, merged onto the preset's params and the effect's theme defaults */
|
|
13
|
+
effectParams?: Partial<EffectParams>;
|
|
14
|
+
/** 'dark' | 'light' | 'auto' (follows prefers-color-scheme). default 'auto' */
|
|
15
|
+
theme?: Theme | 'auto';
|
|
16
|
+
/** component styling — yours, not part of presets */
|
|
17
|
+
fill?: string;
|
|
18
|
+
border?: Partial<BorderConfig>;
|
|
19
|
+
radius?: number | string;
|
|
20
|
+
kind?: Kind;
|
|
21
|
+
fps?: FpsMode;
|
|
22
|
+
paused?: boolean;
|
|
23
|
+
/** clip the bloom to the component's rounded box (no outward spill). default false */
|
|
24
|
+
bloomClip?: boolean;
|
|
25
|
+
settings?: GlassSettingsPatch;
|
|
26
|
+
settingsByTheme?: Partial<Record<Theme, GlassSettingsPatch>>;
|
|
27
|
+
className?: string;
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
declare function GlassFx({ children, preset, effect, effectParams, theme, fill, border, radius, kind, fps, paused, bloomClip, settings, settingsByTheme, className, style, }: GlassFxProps): React.JSX.Element;
|
|
31
|
+
|
|
32
|
+
export { BorderConfig, EffectId, EffectParams, FpsMode, GlassFx, type GlassFxProps, GlassPreset, GlassSettingsPatch, Kind, Theme };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { createGlass, mergeSettings, DEFAULT_SETTINGS } from './chunk-GF5DSI6Z.js';
|
|
2
|
+
export { DEFAULT_BORDER, DEFAULT_FILL, DEFAULT_SETTINGS, EFFECTS, EFFECT_IDS, VELOCITY_PRESETS, createGlass, mergeBorder, mergeEffectParams, mergeSettings } from './chunk-GF5DSI6Z.js';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function useResolvedTheme(theme) {
|
|
7
|
+
const get = React.useCallback(() => {
|
|
8
|
+
if (theme !== "auto") return theme;
|
|
9
|
+
if (typeof window === "undefined") return "dark";
|
|
10
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
11
|
+
}, [theme]);
|
|
12
|
+
const [resolved, setResolved] = React.useState(get);
|
|
13
|
+
React.useEffect(() => {
|
|
14
|
+
setResolved(get());
|
|
15
|
+
if (theme !== "auto" || typeof window === "undefined") return;
|
|
16
|
+
const mql = window.matchMedia("(prefers-color-scheme: dark)");
|
|
17
|
+
const onChange = () => setResolved(mql.matches ? "dark" : "light");
|
|
18
|
+
mql.addEventListener("change", onChange);
|
|
19
|
+
return () => mql.removeEventListener("change", onChange);
|
|
20
|
+
}, [theme, get]);
|
|
21
|
+
return resolved;
|
|
22
|
+
}
|
|
23
|
+
function GlassFx({
|
|
24
|
+
children,
|
|
25
|
+
preset,
|
|
26
|
+
effect,
|
|
27
|
+
effectParams,
|
|
28
|
+
theme = "auto",
|
|
29
|
+
fill,
|
|
30
|
+
border,
|
|
31
|
+
radius,
|
|
32
|
+
kind,
|
|
33
|
+
fps = 30,
|
|
34
|
+
paused = false,
|
|
35
|
+
bloomClip = false,
|
|
36
|
+
settings,
|
|
37
|
+
settingsByTheme,
|
|
38
|
+
className,
|
|
39
|
+
style
|
|
40
|
+
}) {
|
|
41
|
+
const ref = React.useRef(null);
|
|
42
|
+
const inst = React.useRef(null);
|
|
43
|
+
const resolvedTheme = useResolvedTheme(theme);
|
|
44
|
+
const resolvedEffect = effect ?? preset?.effect ?? "panes";
|
|
45
|
+
const mergedParams = preset?.effectParams || effectParams ? { ...preset?.effectParams, ...effectParams } : void 0;
|
|
46
|
+
const effSettings = (t) => mergeSettings(
|
|
47
|
+
mergeSettings(mergeSettings(DEFAULT_SETTINGS[t], preset?.settings), settings),
|
|
48
|
+
settingsByTheme?.[t]
|
|
49
|
+
);
|
|
50
|
+
React.useLayoutEffect(() => {
|
|
51
|
+
if (!ref.current) return;
|
|
52
|
+
const g = createGlass(ref.current, {
|
|
53
|
+
effect: resolvedEffect,
|
|
54
|
+
effectParams: mergedParams,
|
|
55
|
+
theme: resolvedTheme,
|
|
56
|
+
fill,
|
|
57
|
+
border,
|
|
58
|
+
radius,
|
|
59
|
+
kind,
|
|
60
|
+
fps,
|
|
61
|
+
paused,
|
|
62
|
+
bloomClip,
|
|
63
|
+
settings: effSettings(resolvedTheme)
|
|
64
|
+
});
|
|
65
|
+
inst.current = g;
|
|
66
|
+
return () => {
|
|
67
|
+
g.destroy();
|
|
68
|
+
inst.current = null;
|
|
69
|
+
};
|
|
70
|
+
}, []);
|
|
71
|
+
React.useEffect(() => {
|
|
72
|
+
inst.current?.setEffect(resolvedEffect);
|
|
73
|
+
if (mergedParams) inst.current?.setEffectParams(mergedParams);
|
|
74
|
+
}, [resolvedEffect]);
|
|
75
|
+
React.useEffect(() => {
|
|
76
|
+
if (mergedParams) inst.current?.setEffectParams(mergedParams);
|
|
77
|
+
}, [JSON.stringify(mergedParams)]);
|
|
78
|
+
React.useEffect(() => {
|
|
79
|
+
inst.current?.setTheme(resolvedTheme);
|
|
80
|
+
inst.current?.update(effSettings(resolvedTheme));
|
|
81
|
+
if (fill != null) inst.current?.setFill(fill);
|
|
82
|
+
}, [resolvedTheme]);
|
|
83
|
+
React.useEffect(() => {
|
|
84
|
+
if (fill != null) inst.current?.setFill(fill);
|
|
85
|
+
}, [fill]);
|
|
86
|
+
React.useEffect(() => {
|
|
87
|
+
if (border) inst.current?.setBorder(border);
|
|
88
|
+
}, [JSON.stringify(border)]);
|
|
89
|
+
React.useEffect(() => {
|
|
90
|
+
inst.current?.setPaused(paused);
|
|
91
|
+
}, [paused]);
|
|
92
|
+
React.useEffect(() => {
|
|
93
|
+
inst.current?.setFps(fps);
|
|
94
|
+
}, [fps]);
|
|
95
|
+
React.useEffect(() => {
|
|
96
|
+
inst.current?.setBloomClip(bloomClip);
|
|
97
|
+
}, [bloomClip]);
|
|
98
|
+
React.useEffect(() => {
|
|
99
|
+
inst.current?.update(effSettings(resolvedTheme));
|
|
100
|
+
}, [JSON.stringify(settings), JSON.stringify(settingsByTheme), JSON.stringify(preset?.settings)]);
|
|
101
|
+
return /* @__PURE__ */ jsx("div", { ref, className, style, children });
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { GlassFx };
|
|
105
|
+
//# sourceMappingURL=index.js.map
|
|
106
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/GlassFx.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// React wrapper over the vanilla core. SSR-safe: the WebGL instance is only created\n// in a layout effect (client-only); the server renders a plain wrapper + children.\n\nimport * as React from 'react';\nimport { createGlass } from './core';\nimport { DEFAULT_SETTINGS, mergeSettings } from './engine/settings';\nimport type {\n BorderConfig,\n EffectId,\n EffectParams,\n FpsMode,\n GlassInstance,\n GlassPreset,\n GlassSettings,\n GlassSettingsPatch,\n Kind,\n Theme,\n} from './types';\n\nexport interface GlassFxProps {\n children?: React.ReactNode;\n /** a shareable look (shader + params + glass material, per theme); explicit props win */\n preset?: GlassPreset;\n /** base shader. default 'panes' (or the preset's effect) */\n effect?: EffectId;\n /** shader params, merged onto the preset's params and the effect's theme defaults */\n effectParams?: Partial<EffectParams>;\n /** 'dark' | 'light' | 'auto' (follows prefers-color-scheme). default 'auto' */\n theme?: Theme | 'auto';\n /** component styling — yours, not part of presets */\n fill?: string;\n border?: Partial<BorderConfig>;\n radius?: number | string;\n kind?: Kind;\n fps?: FpsMode;\n paused?: boolean;\n /** clip the bloom to the component's rounded box (no outward spill). default false */\n bloomClip?: boolean;\n settings?: GlassSettingsPatch;\n settingsByTheme?: Partial<Record<Theme, GlassSettingsPatch>>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction useResolvedTheme(theme: Theme | 'auto'): Theme {\n const get = React.useCallback((): Theme => {\n if (theme !== 'auto') return theme;\n if (typeof window === 'undefined') return 'dark';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }, [theme]);\n\n const [resolved, setResolved] = React.useState<Theme>(get);\n\n React.useEffect(() => {\n setResolved(get());\n if (theme !== 'auto' || typeof window === 'undefined') return;\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = () => setResolved(mql.matches ? 'dark' : 'light');\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n }, [theme, get]);\n\n return resolved;\n}\n\nexport function GlassFx({\n children,\n preset,\n effect,\n effectParams,\n theme = 'auto',\n fill,\n border,\n radius,\n kind,\n fps = 30,\n paused = false,\n bloomClip = false,\n settings,\n settingsByTheme,\n className,\n style,\n}: GlassFxProps): React.JSX.Element {\n const ref = React.useRef<HTMLDivElement>(null);\n const inst = React.useRef<GlassInstance | null>(null);\n const resolvedTheme = useResolvedTheme(theme);\n\n // resolution order: explicit props > preset > effect/theme defaults\n const resolvedEffect: EffectId = effect ?? preset?.effect ?? 'panes';\n const mergedParams: Partial<EffectParams> | undefined =\n preset?.effectParams || effectParams\n ? { ...preset?.effectParams, ...effectParams }\n : undefined;\n const effSettings = (t: Theme): GlassSettings =>\n mergeSettings(\n mergeSettings(mergeSettings(DEFAULT_SETTINGS[t], preset?.settings), settings),\n settingsByTheme?.[t],\n );\n\n React.useLayoutEffect(() => {\n if (!ref.current) return;\n const g = createGlass(ref.current, {\n effect: resolvedEffect,\n effectParams: mergedParams,\n theme: resolvedTheme,\n fill,\n border,\n radius,\n kind,\n fps,\n paused,\n bloomClip,\n settings: effSettings(resolvedTheme),\n });\n inst.current = g;\n return () => {\n g.destroy();\n inst.current = null;\n };\n // create once; prop changes are synced by the effects below\n }, []);\n\n React.useEffect(() => {\n // setEffect resets to the effect's theme defaults; re-apply the resolved overrides\n inst.current?.setEffect(resolvedEffect);\n if (mergedParams) inst.current?.setEffectParams(mergedParams);\n }, [resolvedEffect]);\n\n React.useEffect(() => {\n if (mergedParams) inst.current?.setEffectParams(mergedParams);\n }, [JSON.stringify(mergedParams)]);\n\n React.useEffect(() => {\n // the preset's params persist through this automatically (overrides are\n // constant across themes); only the merged settings need re-deriving\n inst.current?.setTheme(resolvedTheme);\n inst.current?.update(effSettings(resolvedTheme));\n if (fill != null) inst.current?.setFill(fill);\n }, [resolvedTheme]);\n\n React.useEffect(() => {\n if (fill != null) inst.current?.setFill(fill);\n }, [fill]);\n\n React.useEffect(() => {\n if (border) inst.current?.setBorder(border);\n }, [JSON.stringify(border)]);\n\n React.useEffect(() => {\n inst.current?.setPaused(paused);\n }, [paused]);\n\n React.useEffect(() => {\n inst.current?.setFps(fps);\n }, [fps]);\n\n React.useEffect(() => {\n inst.current?.setBloomClip(bloomClip);\n }, [bloomClip]);\n\n React.useEffect(() => {\n inst.current?.update(effSettings(resolvedTheme));\n }, [JSON.stringify(settings), JSON.stringify(settingsByTheme), JSON.stringify(preset?.settings)]);\n\n return (\n <div ref={ref} className={className} style={style}>\n {children}\n </div>\n );\n}\n"]}
|