import { useId, useRef, type ComponentProps, type CSSProperties, type PointerEvent as ReactPointerEvent, type Ref, type ReactNode, } from "react"; export type LiquidGlassMode = "standard" | "polar" | "prominent"; interface LiquidGlassEffectProps { children: ReactNode; mode?: LiquidGlassMode; displacementScale?: number; blurAmount?: number; saturation?: number; aberrationIntensity?: number; elasticity?: number; cornerRadius?: number | string; padding?: string; overLight?: boolean; } export interface LiquidGlassProps extends LiquidGlassEffectProps, Omit, keyof LiquidGlassEffectProps> {} export interface LiquidGlassButtonProps extends LiquidGlassEffectProps, Omit, keyof LiquidGlassEffectProps> {} interface EffectFrameProps { children: ReactNode; filterId: string; mode?: LiquidGlassMode; displacementScale?: number; overLight?: boolean; } function clamp(value: number, minimum: number, maximum: number) { return Math.min(maximum, Math.max(minimum, value)); } function modeSettings(mode: LiquidGlassMode) { if (mode === "polar") return { frequency: "0.018 0.012", octaves: 2, multiplier: 0.82 }; if (mode === "prominent") return { frequency: "0.008 0.02", octaves: 3, multiplier: 1.35 }; return { frequency: "0.012 0.024", octaves: 2, multiplier: 1 }; } function effectVariables({ blurAmount, saturation, aberrationIntensity, cornerRadius, padding, }: Pick< LiquidGlassEffectProps, | "blurAmount" | "saturation" | "aberrationIntensity" | "cornerRadius" | "padding" >) { const variables: Record = {}; if (cornerRadius !== undefined) variables["--liquid-glass-radius"] = typeof cornerRadius === "number" ? `${cornerRadius}px` : cornerRadius; if (padding !== undefined) variables["--liquid-glass-padding"] = padding; if (blurAmount !== undefined) variables["--liquid-glass-blur"] = `${clamp(blurAmount, 0, 40)}px`; if (saturation !== undefined) variables["--liquid-glass-saturation"] = `${clamp(saturation, 0, 300)}%`; if (aberrationIntensity !== undefined) variables["--liquid-glass-aberration"] = clamp(aberrationIntensity, 0, 12); return variables as CSSProperties; } function EffectFrame({ children, filterId, mode = "standard", displacementScale = 36, overLight = false, }: EffectFrameProps) { const settings = modeSettings(mode); return ( <>