{"version":3,"file":"index.cjs","names":["vertexShaderSource","fragmentShaderSource"],"sources":["../src/math.ts","../src/lens.ts","../src/media.ts","../src/lens-filter.ts","../src/elastic.ts","../src/renderer.ts","../src/spring.ts","../src/motion.ts","../src/tokens.ts"],"sourcesContent":["export const clamp = (value: number, minimum = 0, maximum = 1): number => {\n  return Math.min(Math.max(value, minimum), maximum)\n}\n\nexport const lerp = (from: number, to: number, progress: number): number => {\n  return from + (to - from) * progress\n}\n\nexport const mapRange = (\n  value: number,\n  inputMinimum: number,\n  inputMaximum: number,\n  outputMinimum: number,\n  outputMaximum: number,\n): number => {\n  if (inputMaximum === inputMinimum) return outputMinimum\n\n  const progress = (value - inputMinimum) / (inputMaximum - inputMinimum)\n  return lerp(outputMinimum, outputMaximum, progress)\n}\n\nexport const hexToRgb = (hex: string): readonly [number, number, number] => {\n  const normalized = hex.trim().replace('#', '')\n  const expanded = normalized.length === 3\n    ? normalized.split('').map((character) => character + character).join('')\n    : normalized\n\n  if (!/^[0-9a-f]{6}$/i.test(expanded)) return [0.58, 0.78, 1]\n\n  return [\n    Number.parseInt(expanded.slice(0, 2), 16) / 255,\n    Number.parseInt(expanded.slice(2, 4), 16) / 255,\n    Number.parseInt(expanded.slice(4, 6), 16) / 255,\n  ]\n}\n","import { clamp } from './math'\nimport type { LensMap, LensMapOptions } from './types'\n\nconst maximumMapDimension = 640\n\n/**\n * Exponent of the bezel cross-section. Tuned by measuring a rendered pill\n * against a hard-edged backdrop: below this the rim reads as a soft vignette\n * rather than glass, and above it the bend piles up against the rim and the\n * rounded ends stop looking like one continuous surface.\n */\nconst defaultBezelCurve = 2\n\n/**\n * Ceiling on how much the rim may squeeze the backdrop. Held below 1 so the\n * sample mapping stays one-to-one, with the margin covering the extra scale the\n * red channel carries when dispersion is on.\n */\nconst maximumCompression = 0.88\n\nconst vertexShaderSource = `#version 300 es\nin vec2 a_position;\nout vec2 v_uv;\n\nvoid main() {\n  v_uv = a_position * 0.5 + 0.5;\n  gl_Position = vec4(a_position, 0.0, 1.0);\n}\n`\n\n// Renders an feDisplacementMap texture for a rounded-rect lens: neutral (0.5)\n// in the optically-flat center, bending samples toward the center inside the\n// bezel band so the backdrop gathers and compresses around the rim like the\n// edge of thick glass. Red encodes X displacement, green encodes Y (y-down,\n// SVG space).\n//\n// Because the field is cut from the rounded-rect SDF it is already neutral\n// everywhere outside the band, so the clean centre costs nothing: there is no\n// mask restoring it afterwards, and the bend follows the real silhouette\n// instead of an axis-aligned approximation of it.\n//\n// The bezel cross-section is `t ^ curve` over the band, and the exponent is the\n// whole reason the family is written this way. A true spherical cap is\n// `1 - sqrt(1 - t*t)`, which is the honest shape of a lens but has an infinite\n// slope where it meets the rim: displacement jumps from nothing to its maximum\n// within a pixel, and the backdrop visibly folds back on itself at the rounded\n// ends. A power curve keeps the slope finite everywhere, so `curve` trades the\n// deep magnification of a thick lens (high) against a smooth, even bend that\n// reads as one continuous surface (low, near 1).\nconst fragmentShaderSource = `#version 300 es\nprecision highp float;\n\nin vec2 v_uv;\nout vec4 outColor;\n\nuniform vec2 u_size;\nuniform float u_radius;\nuniform float u_bezel;\nuniform float u_curve;\n\nfloat sdRoundedRect(vec2 point, vec2 halfSize, float radius) {\n  vec2 q = abs(point) - halfSize + radius;\n  return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n}\n\nvoid main() {\n  vec2 pixel = vec2(v_uv.x, 1.0 - v_uv.y) * u_size;\n  vec2 p = pixel - u_size * 0.5;\n  vec2 halfSize = u_size * 0.5 - 0.5;\n  float radius = min(u_radius, min(halfSize.x, halfSize.y));\n  float d = sdRoundedRect(p, halfSize, radius);\n\n  if (d > 0.0) {\n    outColor = vec4(0.5, 0.5, 0.5, 1.0);\n    return;\n  }\n\n  float t = clamp(1.0 + d / u_bezel, 0.0, 1.0);\n  float profile = pow(t, u_curve);\n\n  float epsilon = 1.0;\n  vec2 gradient = vec2(\n    sdRoundedRect(p + vec2(epsilon, 0.0), halfSize, radius) - sdRoundedRect(p - vec2(epsilon, 0.0), halfSize, radius),\n    sdRoundedRect(p + vec2(0.0, epsilon), halfSize, radius) - sdRoundedRect(p - vec2(0.0, epsilon), halfSize, radius)\n  );\n  vec2 outwardNormal = gradient / max(length(gradient), 0.0001);\n\n  vec2 displacement = -outwardNormal * profile;\n  outColor = vec4(displacement * 0.5 + 0.5, 0.5, 1.0);\n}\n`\n\ntype LensContext = {\n  canvas: HTMLCanvasElement\n  gl: WebGL2RenderingContext\n  uniforms: {\n    bezel: WebGLUniformLocation | null\n    curve: WebGLUniformLocation | null\n    radius: WebGLUniformLocation | null\n    size: WebGLUniformLocation | null\n  }\n}\n\nlet sharedContext: LensContext | null | undefined\n\nconst getLensContext = (): LensContext | null => {\n  if (sharedContext !== undefined) return sharedContext\n  if (typeof document === 'undefined') {\n    sharedContext = null\n    return sharedContext\n  }\n\n  const canvas = document.createElement('canvas')\n  const gl = canvas.getContext('webgl2', {\n    alpha: false,\n    antialias: false,\n    depth: false,\n    preserveDrawingBuffer: true,\n    stencil: false,\n  })\n\n  if (!gl) {\n    sharedContext = null\n    return sharedContext\n  }\n\n  const compile = (type: number, source: string): WebGLShader | null => {\n    const shader = gl.createShader(type)\n    if (!shader) return null\n    gl.shaderSource(shader, source)\n    gl.compileShader(shader)\n    if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) return shader\n    gl.deleteShader(shader)\n    return null\n  }\n\n  const vertexShader = compile(gl.VERTEX_SHADER, vertexShaderSource)\n  const fragmentShader = compile(gl.FRAGMENT_SHADER, fragmentShaderSource)\n  const program = vertexShader && fragmentShader ? gl.createProgram() : null\n  if (!vertexShader || !fragmentShader || !program) {\n    sharedContext = null\n    return sharedContext\n  }\n\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n  gl.deleteShader(vertexShader)\n  gl.deleteShader(fragmentShader)\n  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n    gl.deleteProgram(program)\n    sharedContext = null\n    return sharedContext\n  }\n\n  gl.useProgram(program)\n  const buffer = gl.createBuffer()\n  gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW)\n  const position = gl.getAttribLocation(program, 'a_position')\n  gl.enableVertexAttribArray(position)\n  gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0)\n\n  sharedContext = {\n    canvas,\n    gl,\n    uniforms: {\n      bezel: gl.getUniformLocation(program, 'u_bezel'),\n      curve: gl.getUniformLocation(program, 'u_curve'),\n      radius: gl.getUniformLocation(program, 'u_radius'),\n      size: gl.getUniformLocation(program, 'u_size'),\n    },\n  }\n  return sharedContext\n}\n\nexport const isLensRenderingSupported = (): boolean => getLensContext() !== null\n\nexport const createLensMap = (options: LensMapOptions): LensMap | null => {\n  const context = getLensContext()\n  const width = Math.max(2, Math.round(options.width))\n  const height = Math.max(2, Math.round(options.height))\n  if (!context || width < 4 || height < 4) return null\n\n  const minimumSide = Math.min(width, height)\n  const radius = clamp(options.radius, 0, minimumSide / 2)\n  const bezel = clamp(options.bezel ?? Math.max(10, minimumSide * 0.22), 4, minimumSide / 2)\n  const curve = clamp(options.curve ?? defaultBezelCurve, 0.5, 4)\n  const strength = clamp(options.strength ?? 1, 0, 1)\n\n  // Walking inward from the rim by one pixel moves the sampled point by\n  // `1 - maximumDisplacement * profile'(t) / bezel`. Once that goes negative the\n  // mapping stops being one-to-one and the backdrop folds back on itself — the\n  // mirrored sliver that used to sit at the rounded ends. `profile'` peaks at\n  // `curve`, so solving the expression for the displacement that leaves a\n  // chosen positive margin makes folding structurally impossible instead of\n  // something every change to `curve` or `strength` has to be re-checked for.\n  // What is left, `compression`, is the honest knob: how hard the rim squeezes,\n  // where 1 would be a fold and 0 is flat glass. `strength` is then simply the\n  // fraction of that safe range to spend, which is why it reads 0..1 and why\n  // turning it up can never produce the mirrored sliver.\n  const compression = strength * maximumCompression\n  const maximumDisplacement = (bezel * compression) / curve\n\n  const downscale = Math.min(1, maximumMapDimension / Math.max(width, height))\n  const mapWidth = Math.max(4, Math.round(width * downscale))\n  const mapHeight = Math.max(4, Math.round(height * downscale))\n\n  const { canvas, gl, uniforms } = context\n  if (canvas.width !== mapWidth || canvas.height !== mapHeight) {\n    canvas.width = mapWidth\n    canvas.height = mapHeight\n  }\n\n  gl.viewport(0, 0, mapWidth, mapHeight)\n  gl.uniform2f(uniforms.size, mapWidth, mapHeight)\n  gl.uniform1f(uniforms.radius, radius * downscale)\n  gl.uniform1f(uniforms.bezel, bezel * downscale)\n  gl.uniform1f(uniforms.curve, curve)\n  gl.drawArrays(gl.TRIANGLES, 0, 6)\n\n  return {\n    height,\n    scale: maximumDisplacement * 2,\n    url: canvas.toDataURL('image/png'),\n    width,\n  }\n}\n","/**\n * Not every DOM implementation ships `matchMedia` — jsdom is the one you hit\n * first, but any partial DOM counts. Reading a preference should never be the\n * thing that throws, so an unavailable query reads as \"no preference stated\".\n */\nexport const mediaQuery = (query: string): Pick<MediaQueryList, 'matches'> =>\n  typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n    ? window.matchMedia(query)\n    : { matches: false }\n","import { clamp } from './math'\nimport { createLensMap } from './lens'\nimport { mediaQuery } from './media'\nimport type { LensFilterController, LensFilterOptions } from './types'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nlet filterCount = 0\nlet defsRoot: SVGSVGElement | null = null\nlet lensSupport: boolean | undefined\n\n// True refraction of the live backdrop needs an SVG filter inside\n// backdrop-filter, which only Chromium renders. WebKit and Gecko parse the\n// syntax but silently drop the displacement, so they get the CSS material.\nexport const isLensSupported = (): boolean => {\n  if (lensSupport !== undefined) return lensSupport\n  if (typeof window === 'undefined' || typeof CSS === 'undefined' || typeof document === 'undefined') {\n    return false\n  }\n\n  const parses = CSS.supports('backdrop-filter', 'url(#lq-probe)')\n    || CSS.supports('-webkit-backdrop-filter', 'url(#lq-probe)')\n  const chromium = 'userAgentData' in navigator || 'chrome' in window\n  lensSupport = parses && chromium\n  return lensSupport\n}\n\nconst getDefsRoot = (): SVGSVGElement => {\n  if (defsRoot?.isConnected) return defsRoot\n\n  defsRoot = document.createElementNS(SVG_NS, 'svg')\n  defsRoot.setAttribute('aria-hidden', 'true')\n  defsRoot.setAttribute('width', '0')\n  defsRoot.setAttribute('height', '0')\n  defsRoot.style.position = 'absolute'\n  defsRoot.style.overflow = 'hidden'\n  document.body.appendChild(defsRoot)\n  return defsRoot\n}\n\nconst createElement = <Tag extends keyof SVGElementTagNameMap>(\n  tag: Tag,\n  attributes: Record<string, string>,\n): SVGElementTagNameMap[Tag] => {\n  const element = document.createElementNS(SVG_NS, tag)\n  for (const [name, value] of Object.entries(attributes)) element.setAttribute(name, value)\n  return element\n}\n\nconst keepChannelMatrix = (channel: 0 | 1 | 2): string => {\n  const passthrough = channel === 0 ? '1 0 0 0 0' : channel === 1 ? '0 1 0 0 0' : '0 0 1 0 0'\n  const zero = '0 0 0 0 0'\n  return [\n    channel === 0 ? passthrough : zero,\n    channel === 1 ? passthrough : zero,\n    channel === 2 ? passthrough : zero,\n    '0 0 0 1 0',\n  ].join(' ')\n}\n\nexport const attachLiquidLens = (\n  element: HTMLElement,\n  options: LensFilterOptions = {},\n): LensFilterController | null => {\n  if (!isLensSupported()) return null\n  if (\n    options.respectReducedTransparency === true\n    && mediaQuery('(prefers-reduced-transparency: reduce)').matches\n  ) return null\n\n  const dispersion = clamp(options.dispersion ?? 0, 0, 1)\n  const blur = clamp(options.blur ?? 0.6, 0, 24)\n  const saturation = clamp(options.saturation ?? 1.24, 0, 3)\n  const strength = clamp(options.strength ?? 1, 0, 1)\n\n  const id = `lq-lens-${(filterCount += 1)}`\n  const filter = createElement('filter', {\n    'color-interpolation-filters': 'sRGB',\n    filterUnits: 'userSpaceOnUse',\n    id,\n    x: '0',\n    y: '0',\n  })\n\n  const map = createElement('feImage', {\n    preserveAspectRatio: 'none',\n    result: 'lq-map',\n    x: '0',\n    y: '0',\n  })\n  filter.appendChild(map)\n\n  const displacements: SVGFEDisplacementMapElement[] = []\n  if (dispersion > 0) {\n    const makeBranch = (channel: 0 | 1 | 2): string => {\n      const displacement = createElement('feDisplacementMap', {\n        in: 'SourceGraphic',\n        in2: 'lq-map',\n        result: `lq-d${channel}`,\n        xChannelSelector: 'R',\n        yChannelSelector: 'G',\n      })\n      const isolate = createElement('feColorMatrix', {\n        in: `lq-d${channel}`,\n        result: `lq-c${channel}`,\n        type: 'matrix',\n        values: keepChannelMatrix(channel),\n      })\n      filter.appendChild(displacement)\n      filter.appendChild(isolate)\n      displacements.push(displacement)\n      return `lq-c${channel}`\n    }\n    const red = makeBranch(0)\n    const green = makeBranch(1)\n    const blue = makeBranch(2)\n    filter.appendChild(createElement('feComposite', {\n      in: red, in2: green, k1: '0', k2: '1', k3: '1', k4: '0', operator: 'arithmetic', result: 'lq-rg',\n    }))\n    filter.appendChild(createElement('feComposite', {\n      in: 'lq-rg', in2: blue, k1: '0', k2: '1', k3: '1', k4: '0', operator: 'arithmetic', result: 'lq-rgb',\n    }))\n  } else {\n    const displacement = createElement('feDisplacementMap', {\n      in: 'SourceGraphic',\n      in2: 'lq-map',\n      result: 'lq-rgb',\n      xChannelSelector: 'R',\n      yChannelSelector: 'G',\n    })\n    filter.appendChild(displacement)\n    displacements.push(displacement)\n  }\n\n  filter.appendChild(createElement('feGaussianBlur', {\n    in: 'lq-rgb',\n    result: 'lq-soft',\n    stdDeviation: String(blur),\n  }))\n  filter.appendChild(createElement('feColorMatrix', {\n    in: 'lq-soft',\n    type: 'saturate',\n    values: String(saturation),\n  }))\n\n  getDefsRoot().appendChild(filter)\n\n  let destroyed = false\n  let refreshFrame = 0\n\n  const refresh = (): void => {\n    if (destroyed || !element.isConnected) return\n\n    const width = element.offsetWidth\n    const height = element.offsetHeight\n    if (width < 8 || height < 8) return\n\n    const computed = getComputedStyle(element)\n    const parsedRadius = Number.parseFloat(computed.borderTopLeftRadius)\n    const radius = options.radius ?? (Number.isFinite(parsedRadius) ? parsedRadius : 16)\n\n    const lensMap = createLensMap({\n      bezel: options.bezel,\n      curve: options.curve,\n      height,\n      radius,\n      strength,\n      width,\n    })\n    if (!lensMap) return\n\n    filter.setAttribute('width', String(width))\n    filter.setAttribute('height', String(height))\n    map.setAttribute('width', String(width))\n    map.setAttribute('height', String(height))\n    map.setAttribute('href', lensMap.url)\n\n    const spread = dispersion * 0.08\n    displacements.forEach((displacement, index) => {\n      const factor = displacements.length === 3 ? 1 + spread * (1 - index) : 1\n      displacement.setAttribute('scale', String(lensMap.scale * factor))\n    })\n\n    // Published as a custom property rather than written to `backdrop-filter`\n    // directly. The stylesheet ends every one of its own backdrop-filter\n    // declarations with `var(--lq-lens, )`, so the refraction joins the blur,\n    // the saturation and the brightness the material already asked for instead\n    // of replacing the lot — an inline `backdrop-filter` is one declaration,\n    // and setting it here used to throw the frost away the moment a lens\n    // attached.\n    element.style.setProperty('--lq-lens', `url(#${id})`)\n    element.dataset.liquidLens = 'true'\n  }\n\n  const scheduleRefresh = (): void => {\n    cancelAnimationFrame(refreshFrame)\n    refreshFrame = requestAnimationFrame(refresh)\n  }\n\n  const resizeObserver = typeof ResizeObserver === 'undefined'\n    ? null\n    : new ResizeObserver(scheduleRefresh)\n  resizeObserver?.observe(element)\n  scheduleRefresh()\n\n  return {\n    destroy: () => {\n      destroyed = true\n      cancelAnimationFrame(refreshFrame)\n      resizeObserver?.disconnect()\n      filter.remove()\n      element.style.removeProperty('--lq-lens')\n      delete element.dataset.liquidLens\n    },\n    refresh: scheduleRefresh,\n  }\n}\n","import { clamp } from './math'\nimport type { ElasticOptions, ElasticPull, ElasticSubscriber } from './types'\n\nconst atRest: ElasticPull = { offsetX: 0, offsetY: 0, stretchX: 0, stretchY: 0 }\n\n/**\n * How a surface leans toward a pointer that has not reached it yet.\n *\n * The falloff is measured from the element's *edge* rather than its centre, so\n * a wide card starts to lean when the pointer nears its side instead of waiting\n * for it to near the middle — which is what makes a dock of different-sized\n * things respond as one row. Squaring it keeps the pull from switching on at\n * the boundary of the reach.\n *\n * The stretch splits the lean between the two axes by the square of the\n * direction, and takes half of it back on the other axis, so a surface pulled\n * sideways goes wide and slightly flat instead of simply getting bigger.\n */\nexport const elasticPull = (\n  bounds: DOMRect,\n  pointerX: number,\n  pointerY: number,\n  options: ElasticOptions = {},\n): ElasticPull => {\n  const elasticity = clamp(options.elasticity ?? 0, 0, 1)\n  const reach = Math.max(1, options.reach ?? 180)\n  if (elasticity === 0 || bounds.width < 1 || bounds.height < 1) return atRest\n\n  const deltaX = pointerX - (bounds.left + bounds.width / 2)\n  const deltaY = pointerY - (bounds.top + bounds.height / 2)\n\n  const gapX = Math.max(0, Math.abs(deltaX) - bounds.width / 2)\n  const gapY = Math.max(0, Math.abs(deltaY) - bounds.height / 2)\n  const gap = Math.hypot(gapX, gapY)\n  if (gap >= reach) return atRest\n\n  const falloff = (1 - gap / reach) ** 2\n  const distance = Math.hypot(deltaX, deltaY)\n  if (distance < 0.001) return atRest\n\n  const directionX = deltaX / distance\n  const directionY = deltaY / distance\n  const lean = elasticity * falloff\n  const travel = Math.min(distance, reach) * lean\n\n  const axisX = directionX * directionX\n  const axisY = directionY * directionY\n  const stretch = lean * 0.4\n\n  return {\n    offsetX: directionX * travel * 0.22,\n    offsetY: directionY * travel * 0.22,\n    stretchX: stretch * (axisX - axisY * 0.5),\n    stretchY: stretch * (axisY - axisX * 0.5),\n  }\n}\n\ntype Registration = {\n  element: HTMLElement\n  notify: ElasticSubscriber\n  rect: DOMRect | null\n}\n\nconst registrations = new Set<Registration>()\nlet listening = false\nlet frame = 0\nlet pointerX = 0\nlet pointerY = 0\nlet pointerSeen = false\n\nconst invalidate = (): void => {\n  for (const registration of registrations) registration.rect = null\n}\n\nconst dispatch = (): void => {\n  frame = 0\n  for (const registration of registrations) {\n    if (!registration.element.isConnected) continue\n    registration.rect ??= registration.element.getBoundingClientRect()\n    registration.notify(registration.rect, pointerX, pointerY)\n  }\n}\n\nconst schedule = (): void => {\n  if (frame) return\n  frame = requestAnimationFrame(dispatch)\n}\n\nconst handlePointer = (event: PointerEvent): void => {\n  pointerX = event.clientX\n  pointerY = event.clientY\n  pointerSeen = true\n  schedule()\n}\n\nconst stopListening = (): void => {\n  if (!listening) return\n  listening = false\n  cancelAnimationFrame(frame)\n  frame = 0\n  window.removeEventListener('pointermove', handlePointer)\n  window.removeEventListener('scroll', invalidate, true)\n  window.removeEventListener('resize', invalidate)\n}\n\n/**\n * Subscribes an element to the pointer, wherever the pointer is on the page.\n *\n * One window listener serves every surface, because the alternative — a\n * listener per component — measures the same pointer dozens of times per move\n * and lays out the whole page doing it. Rects are cached until something that\n * can move them happens, and the fan-out runs on an animation frame, so a fast\n * sweep across the page costs one measurement pass per frame no matter how many\n * surfaces are mounted.\n */\nexport const observeElasticPointer = (\n  element: HTMLElement,\n  notify: ElasticSubscriber,\n): (() => void) => {\n  if (typeof window === 'undefined') return () => {}\n\n  const registration: Registration = { element, notify, rect: null }\n  registrations.add(registration)\n\n  if (!listening) {\n    listening = true\n    window.addEventListener('pointermove', handlePointer, { passive: true })\n    window.addEventListener('scroll', invalidate, { capture: true, passive: true })\n    window.addEventListener('resize', invalidate, { passive: true })\n  }\n  if (pointerSeen) schedule()\n\n  return () => {\n    registrations.delete(registration)\n    if (registrations.size === 0) stopListening()\n  }\n}\n","import { clamp, hexToRgb } from './math'\nimport type { LiquidRendererOptions } from './types'\n\nconst vertexShaderSource = `#version 300 es\nin vec2 a_position;\nout vec2 v_uv;\n\nvoid main() {\n  v_uv = a_position * 0.5 + 0.5;\n  gl_Position = vec4(a_position, 0.0, 1.0);\n}\n`\n\n// The glass body itself: everything is shaped by the rounded-rect SDF of the\n// component, so highlights hug the true silhouette. The SDF domain is warped\n// by traveling waves while `u_wobble` carries jelly energy, which makes the\n// rim and bezel physically wiggle instead of merely translating.\nconst fragmentShaderSource = `#version 300 es\nprecision highp float;\n\nin vec2 v_uv;\nout vec4 outColor;\n\nuniform vec2 u_resolution;\nuniform float u_dpr;\nuniform float u_radius;\nuniform vec2 u_pointer;\nuniform vec3 u_tint;\nuniform float u_time;\nuniform float u_active;\nuniform float u_intensity;\nuniform float u_wobble;\nuniform vec2 u_stretch;\nuniform vec4 u_ripple;\nuniform float u_press;\n// x glow, y ripple, z sparkle, w shimmer — each 0 or 1, so a surface can be\n// stripped back to the plain refracting material one ornament at a time.\nuniform vec4 u_ornaments;\n\nconst float TAU = 6.28318530718;\n\nfloat sdRoundedRect(vec2 point, vec2 halfSize, float radius) {\n  vec2 q = abs(point) - halfSize + radius;\n  return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0) - radius;\n}\n\nvec3 iridescence(float phase) {\n  return 0.5 + 0.5 * cos(TAU * (phase + vec3(0.0, 0.33, 0.67)));\n}\n\nvoid main() {\n  vec2 sizePx = u_resolution / u_dpr;\n  vec2 p = (v_uv - 0.5) * sizePx;\n  float minSide = min(sizePx.x, sizePx.y);\n  float radius = min(u_radius, minSide * 0.5);\n\n  float angle = atan(p.y, p.x);\n  float wobbleAmp = u_wobble * minSide * 0.05;\n  float wobble = sin(angle * 3.0 + u_time * 15.0) * 0.62\n    + sin(angle * 5.0 - u_time * 10.0 + 1.7) * 0.38;\n\n  vec2 halfSize = sizePx * 0.5 - 1.0;\n  halfSize *= vec2(1.0 + u_stretch.x * 0.4, 1.0 + u_stretch.y * 0.4);\n  float d = sdRoundedRect(p, halfSize, radius) + wobble * wobbleAmp;\n  float edgeDist = -d;\n\n  float inside = smoothstep(0.9, -0.9, d);\n\n  float rimWidth = 2.1 + u_active * 1.7 + u_press * 1.2;\n  float rimR = exp(-pow(max(edgeDist - 0.4, 0.0) / (rimWidth * 1.3), 1.5));\n  float rimG = exp(-pow(max(edgeDist - 1.0, 0.0) / rimWidth, 1.5));\n  float rimB = exp(-pow(max(edgeDist - 1.7, 0.0) / (rimWidth * 0.85), 1.5));\n  float topBias = smoothstep(-0.25, 0.95, v_uv.y);\n\n  float bezelWidth = clamp(minSide * 0.16, 6.0, 26.0);\n  float bezel = smoothstep(bezelWidth, 0.0, edgeDist) * (1.0 - max(max(rimR, rimG), rimB));\n\n  vec2 pointerPx = (u_pointer - 0.5) * sizePx;\n  float pointerDist = length(p - pointerPx);\n  float glowSigma = minSide * 0.42 + 30.0 * u_active;\n  float glow = exp(-pointerDist * pointerDist / (2.0 * glowSigma * glowSigma)) * u_active;\n  float core = exp(-pointerDist * pointerDist / (2.0 * 240.0)) * u_active;\n\n  float ripple = 0.0;\n  if (u_ripple.w > 0.001) {\n    vec2 ripplePx = (u_ripple.xy - 0.5) * sizePx;\n    float rippleDist = length(p - ripplePx);\n    float front = rippleDist - u_ripple.z * 320.0;\n    float ringWidth = 11.0 + u_ripple.z * 46.0;\n    float ring = exp(-front * front / (2.0 * ringWidth * ringWidth));\n    ripple = ring * exp(-u_ripple.z * 3.4) * u_ripple.w;\n  }\n\n  float sheenAxis = p.x / sizePx.x * 0.55 - p.y / sizePx.y + 0.34 - (u_pointer.x - 0.5) * 0.22;\n  float sheen = exp(-sheenAxis * sheenAxis * 30.0) * (0.05 + u_active * 0.1);\n\n  float sparklePhase = sin((p.x + p.y * 1.3) * 0.11 + u_time * 1.1) * sin(p.x * 0.07 - u_time * 0.8);\n  float sparkle = max(0.0, sparklePhase) * 0.05 * u_active;\n\n  // Shimmer owns every bit of colour the material adds on its own: the cool\n  // cast on the highlight and the red/green/blue split across the rim, as well\n  // as the iridescent band. With it off the rim is one neutral line, so the\n  // only hue on a surface is the tint it was given.\n  vec3 white = mix(vec3(0.985), vec3(0.97, 0.985, 1.0), u_ornaments.w);\n  vec3 rimTint = mix(u_tint * 0.8 + vec3(0.2), white, topBias);\n  vec3 rim = mix(vec3(rimG), vec3(rimR, rimG, rimB), u_ornaments.w) * rimTint;\n  vec3 shimmer = iridescence(angle / TAU + u_time * 0.04 + u_wobble * 0.3) * rimG * (0.08 + u_wobble * 0.16);\n\n  float rimStrength = (0.38 + 0.62 * u_active + 0.45 * u_wobble) * u_intensity;\n\n  vec3 color = vec3(0.0);\n  color += rim * rimStrength;\n  color += shimmer * u_intensity * u_ornaments.w;\n  color += mix(white, u_tint, 0.35) * bezel * (0.015 + u_active * 0.02) * u_intensity;\n  color += white * (glow * 0.13 + core * 0.22) * u_intensity * u_ornaments.x;\n  color += (white * 0.75 + u_tint * 0.25) * ripple * 0.4 * u_intensity * u_ornaments.y;\n  color += white * sheen * u_intensity;\n  color += white * sparkle * u_intensity * u_ornaments.z;\n\n  color *= inside;\n  float alpha = clamp(max(color.r, max(color.g, color.b)), 0.0, 0.85);\n  outColor = vec4(color, alpha);\n}\n`\n\ntype FrameState = {\n  active: number\n  ornaments: readonly [number, number, number, number]\n  dpr: number\n  height: number\n  intensity: number\n  pointer: readonly [number, number]\n  press: number\n  radius: number\n  ripple: readonly [number, number, number, number]\n  stretch: readonly [number, number]\n  time: number\n  tint: readonly [number, number, number]\n  width: number\n}\n\n// Browsers hard-cap live WebGL contexts (~16 per page), so a canvas per\n// component silently kills its siblings. All components instead share one\n// hidden WebGL canvas: each frame is drawn there, then blitted into the\n// component's own cheap 2D canvas.\nclass SharedGlassContext {\n  private static instance: SharedGlassContext | undefined\n\n  public readonly canvas: HTMLCanvasElement\n  public gl: WebGL2RenderingContext | null = null\n  private program: WebGLProgram | null = null\n  private uniforms: Record<string, WebGLUniformLocation | null> = {}\n\n  public static get(): SharedGlassContext {\n    if (!SharedGlassContext.instance) SharedGlassContext.instance = new SharedGlassContext()\n    return SharedGlassContext.instance\n  }\n\n  private constructor() {\n    this.canvas = document.createElement('canvas')\n    const gl = this.canvas.getContext('webgl2', {\n      alpha: true,\n      antialias: true,\n      depth: false,\n      premultipliedAlpha: true,\n      preserveDrawingBuffer: true,\n      stencil: false,\n    })\n    if (!gl) return\n\n    const program = createProgram(gl, vertexShaderSource, fragmentShaderSource)\n    if (!program) return\n\n    this.gl = gl\n    this.program = program\n    for (const name of [\n      'active', 'dpr', 'intensity', 'ornaments', 'pointer', 'press', 'radius',\n      'resolution', 'ripple', 'stretch', 'time', 'tint', 'wobble',\n    ]) {\n      this.uniforms[name] = gl.getUniformLocation(program, `u_${name}`)\n    }\n\n    const buffer = gl.createBuffer()\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer)\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1]), gl.STATIC_DRAW)\n    const position = gl.getAttribLocation(program, 'a_position')\n    gl.enableVertexAttribArray(position)\n    gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0)\n    gl.enable(gl.BLEND)\n    gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)\n    gl.enable(gl.SCISSOR_TEST)\n  }\n\n  public draw(state: FrameState, wobble: number): boolean {\n    const gl = this.gl\n    if (!gl || !this.program) return false\n\n    if (this.canvas.width < state.width || this.canvas.height < state.height) {\n      this.canvas.width = Math.max(this.canvas.width, state.width)\n      this.canvas.height = Math.max(this.canvas.height, state.height)\n    }\n\n    gl.viewport(0, 0, state.width, state.height)\n    gl.scissor(0, 0, state.width, state.height)\n    gl.clearColor(0, 0, 0, 0)\n    gl.clear(gl.COLOR_BUFFER_BIT)\n    gl.useProgram(this.program)\n    gl.uniform2f(this.uniforms.resolution ?? null, state.width, state.height)\n    gl.uniform1f(this.uniforms.dpr ?? null, state.dpr)\n    gl.uniform1f(this.uniforms.radius ?? null, state.radius)\n    gl.uniform2f(this.uniforms.pointer ?? null, state.pointer[0], state.pointer[1])\n    gl.uniform3f(this.uniforms.tint ?? null, state.tint[0], state.tint[1], state.tint[2])\n    gl.uniform1f(this.uniforms.time ?? null, state.time)\n    gl.uniform1f(this.uniforms.active ?? null, state.active)\n    gl.uniform1f(this.uniforms.intensity ?? null, state.intensity)\n    gl.uniform1f(this.uniforms.wobble ?? null, wobble)\n    gl.uniform2f(this.uniforms.stretch ?? null, state.stretch[0], state.stretch[1])\n    gl.uniform1f(this.uniforms.press ?? null, state.press)\n    gl.uniform4f(this.uniforms.ripple ?? null, state.ripple[0], state.ripple[1], state.ripple[2], state.ripple[3])\n    gl.uniform4f(\n      this.uniforms.ornaments ?? null,\n      state.ornaments[0], state.ornaments[1], state.ornaments[2], state.ornaments[3],\n    )\n    gl.drawArrays(gl.TRIANGLES, 0, 6)\n    return true\n  }\n}\n\nexport class LiquidRenderer {\n  private active = 0\n  private animationFrame = 0\n  private blitContext: CanvasRenderingContext2D | null = null\n  private destroyed = false\n  private hovering = false\n  private intensity: number\n  private lastTime = 0\n  private readonly ornaments: readonly [number, number, number, number]\n  private pointer: readonly [number, number] = [0.5, 0.5]\n  private press = 0\n  private pressTarget = 0\n  private radius: number\n  private readonly resizeObserver: ResizeObserver | null\n  private rippleAge = -1\n  private rippleOrigin: readonly [number, number] = [0.5, 0.5]\n  private rippleStrength = 0\n  private stretch: readonly [number, number] = [0, 0]\n  private supported = false\n  private tint: readonly [number, number, number]\n  private wobble = 0\n\n  public constructor(private readonly canvas: HTMLCanvasElement, options: LiquidRendererOptions = {}) {\n    this.intensity = clamp(options.intensity ?? 1.2, 0, 1.4)\n    this.ornaments = [\n      options.glow === false ? 0 : 1,\n      options.ripple === false ? 0 : 1,\n      options.sparkle === false ? 0 : 1,\n      options.shimmer === true ? 1 : 0,\n    ]\n    this.radius = options.radius ?? 16\n    this.tint = hexToRgb(options.tint ?? '#8f8f8f')\n    this.resizeObserver = typeof ResizeObserver === 'undefined'\n      ? null\n      : new ResizeObserver(() => this.resize())\n\n    this.supported = SharedGlassContext.get().gl !== null\n    this.blitContext = this.supported ? canvas.getContext('2d') : null\n    if (!this.supported || !this.blitContext) {\n      this.supported = false\n      this.canvas.dataset.fallback = 'true'\n      return\n    }\n\n    this.resizeObserver?.observe(this.canvas)\n    this.resize()\n    this.render(performance.now())\n  }\n\n  public destroy(): void {\n    this.destroyed = true\n    cancelAnimationFrame(this.animationFrame)\n    this.resizeObserver?.disconnect()\n  }\n\n  public isSupported(): boolean {\n    return this.supported\n  }\n\n  public pulse(strength = 1): void {\n    this.ripple(this.pointer[0], 1 - this.pointer[1], strength)\n  }\n\n  public ripple(x: number, y: number, strength = 1): void {\n    this.rippleOrigin = [clamp(x), clamp(1 - y)]\n    this.rippleAge = 0\n    this.rippleStrength = clamp(strength, 0, 1.5)\n    this.start()\n  }\n\n  public setActive(active: boolean): void {\n    this.hovering = active\n    this.start()\n  }\n\n  public setIntensity(intensity: number): void {\n    this.intensity = clamp(intensity, 0, 1.4)\n    this.start()\n  }\n\n  public setPointer(x: number, y: number): void {\n    this.pointer = [clamp(x), clamp(1 - y)]\n    this.start()\n  }\n\n  public setPress(pressed: boolean): void {\n    this.pressTarget = pressed ? 1 : 0\n    this.start()\n  }\n\n  public setRadius(radius: number): void {\n    this.radius = Math.max(0, radius)\n    this.start()\n  }\n\n  public setStretch(x: number, y: number): void {\n    this.stretch = [clamp(x, -1, 1), clamp(y, -1, 1)]\n  }\n\n  public setTint(tint: string): void {\n    this.tint = hexToRgb(tint)\n    this.start()\n  }\n\n  public setWobble(energy: number): void {\n    this.wobble = clamp(energy, 0, 1)\n    if (this.wobble > 0.003) this.start()\n  }\n\n  private get pixelRatio(): number {\n    return Math.min(window.devicePixelRatio || 1, 2)\n  }\n\n  private resize(): void {\n    const width = Math.max(1, Math.round(this.canvas.clientWidth * this.pixelRatio))\n    const height = Math.max(1, Math.round(this.canvas.clientHeight * this.pixelRatio))\n    if (this.canvas.width === width && this.canvas.height === height) return\n\n    this.canvas.width = width\n    this.canvas.height = height\n    this.render(performance.now())\n  }\n\n  private render(time: number): void {\n    if (!this.supported || this.destroyed || !this.blitContext) return\n\n    const shared = SharedGlassContext.get()\n    const width = this.canvas.width\n    const height = this.canvas.height\n    const drawn = shared.draw({\n      active: this.active,\n      dpr: this.pixelRatio,\n      height,\n      intensity: this.intensity,\n      ornaments: this.ornaments,\n      pointer: this.pointer,\n      press: this.press,\n      radius: this.radius,\n      ripple: [\n        this.rippleOrigin[0],\n        this.rippleOrigin[1],\n        Math.max(this.rippleAge, 0),\n        this.rippleAge >= 0 ? this.rippleStrength : 0,\n      ],\n      stretch: this.stretch,\n      time: time / 1000,\n      tint: this.tint,\n      width,\n    }, this.wobble)\n    if (!drawn) return\n\n    this.blitContext.clearRect(0, 0, width, height)\n    this.blitContext.drawImage(\n      shared.canvas,\n      0,\n      shared.canvas.height - height,\n      width,\n      height,\n      0,\n      0,\n      width,\n      height,\n    )\n  }\n\n  private start(): void {\n    if (this.animationFrame || this.destroyed || !this.supported) return\n\n    this.lastTime = performance.now()\n    const tick = (time: number): void => {\n      const delta = Math.min((time - this.lastTime) / 1000, 0.05)\n      this.lastTime = time\n\n      const activeTarget = this.hovering ? 1 : 0\n      this.active += (activeTarget - this.active) * Math.min(1, delta * (this.hovering ? 9 : 4.5))\n      this.press += (this.pressTarget - this.press) * Math.min(1, delta * 14)\n      if (this.rippleAge >= 0) {\n        this.rippleAge += delta\n        if (this.rippleAge > 1.4) this.rippleAge = -1\n      }\n\n      this.render(time)\n\n      const settled = Math.abs(this.active - activeTarget) < 0.004\n        && Math.abs(this.press - this.pressTarget) < 0.004\n        && this.rippleAge < 0\n        && this.wobble < 0.004\n        && !this.hovering\n\n      if (!settled) {\n        this.animationFrame = requestAnimationFrame(tick)\n        return\n      }\n\n      this.active = activeTarget\n      this.press = this.pressTarget\n      this.render(time)\n      this.animationFrame = 0\n    }\n\n    this.animationFrame = requestAnimationFrame(tick)\n  }\n}\n\nconst compileShader = (gl: WebGL2RenderingContext, type: number, source: string): WebGLShader | null => {\n  const shader = gl.createShader(type)\n  if (!shader) return null\n\n  gl.shaderSource(shader, source)\n  gl.compileShader(shader)\n  if (gl.getShaderParameter(shader, gl.COMPILE_STATUS)) return shader\n\n  gl.deleteShader(shader)\n  return null\n}\n\nconst createProgram = (gl: WebGL2RenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | null => {\n  const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource)\n  const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource)\n  if (!vertexShader || !fragmentShader) return null\n\n  const program = gl.createProgram()\n  if (!program) return null\n\n  gl.attachShader(program, vertexShader)\n  gl.attachShader(program, fragmentShader)\n  gl.linkProgram(program)\n  gl.deleteShader(vertexShader)\n  gl.deleteShader(fragmentShader)\n\n  if (gl.getProgramParameter(program, gl.LINK_STATUS)) return program\n\n  gl.deleteProgram(program)\n  return null\n}\n","export type SpringOptions = {\n  damping?: number\n  mass?: number\n  stiffness?: number\n}\n\nexport class SpringValue {\n  public current: number\n  public target: number\n  public velocity = 0\n\n  private readonly damping: number\n  private readonly mass: number\n  private readonly stiffness: number\n\n  public constructor(initialValue = 0, options: SpringOptions = {}) {\n    this.current = initialValue\n    this.target = initialValue\n    this.damping = options.damping ?? 21\n    this.mass = options.mass ?? 1\n    this.stiffness = options.stiffness ?? 210\n  }\n\n  public set(value: number): void {\n    this.current = value\n    this.target = value\n    this.velocity = 0\n  }\n\n  public setTarget(value: number): void {\n    this.target = value\n  }\n\n  public step(deltaSeconds: number): boolean {\n    const frameDelta = clampDelta(deltaSeconds)\n    const stepCount = Math.max(1, Math.ceil(frameDelta / (1 / 120)))\n    const delta = frameDelta / stepCount\n\n    for (let index = 0; index < stepCount; index += 1) {\n      const displacement = this.current - this.target\n      const springForce = -this.stiffness * displacement\n      const dampingForce = -this.damping * this.velocity\n      const acceleration = (springForce + dampingForce) / this.mass\n\n      this.velocity += acceleration * delta\n      this.current += this.velocity * delta\n    }\n\n    const remainingDistance = this.current - this.target\n    if (Math.abs(this.velocity) > 0.001 || Math.abs(remainingDistance) > 0.001) return true\n\n    this.current = this.target\n    this.velocity = 0\n    return false\n  }\n}\n\nconst clampDelta = (deltaSeconds: number): number => {\n  if (!Number.isFinite(deltaSeconds)) return 1 / 60\n  return Math.min(Math.max(deltaSeconds, 1 / 240), 1 / 15)\n}\n","import { clamp } from './math'\nimport { elasticPull, observeElasticPointer } from './elastic'\nimport { mediaQuery } from './media'\nimport { LiquidRenderer } from './renderer'\nimport { SpringValue } from './spring'\nimport type { LiquidMotionController, LiquidMotionOptions } from './types'\n\nconst readRadius = (element: HTMLElement): number => {\n  const parsed = Number.parseFloat(getComputedStyle(element).borderTopLeftRadius)\n  return Number.isFinite(parsed) ? parsed : 16\n}\n\nexport const attachLiquidMotion = (\n  element: HTMLElement,\n  canvas: HTMLCanvasElement | null,\n  options: LiquidMotionOptions = {},\n): LiquidMotionController => {\n  let disabled = options.disabled ?? false\n  let frame = 0\n  let lastTime = performance.now()\n  let lastPointerTime = 0\n  let lastPointerX = 0\n  let lastPointerY = 0\n  let releaseTimeout = 0\n  // Effects run regardless of OS accessibility settings unless the caller\n  // explicitly opts in to respecting prefers-reduced-motion.\n  const prefersReducedMotion = mediaQuery('(prefers-reduced-motion: reduce)')\n  const reducedMotion = (): boolean => options.respectReducedMotion === true && prefersReducedMotion.matches\n\n  const wobbliness = clamp(options.wobbliness ?? 0.1, 0, 1.5)\n  const bounce = clamp(options.bounce ?? 0.05, 0, 0.16)\n  const tilt = clamp(options.tilt ?? 3.5, 0, 12)\n\n  // The squish is a ratio, which is the right unit for a 36px button and the\n  // wrong one for a 900px panel: the same 9% takes an edge 1.6px on the button\n  // and 40px on the panel. An edge that travels that far while a press is held\n  // slides out from under the pointer, and the browser then dispatches the\n  // click on whatever the pointerup landed on instead. The scale is capped so\n  // no edge moves further than this, whatever the element's size.\n  const maxEdgeShift = 6\n  let boxWidth = 0\n  let boxHeight = 0\n  let pressed = false\n\n  const measure = (): void => {\n    // offset* rather than getBoundingClientRect: the rect is the transformed\n    // box, so capping against it would feed the cap back into itself.\n    boxWidth = element.offsetWidth\n    boxHeight = element.offsetHeight\n  }\n\n  const capScale = (value: number, extent: number): number => {\n    if (!(extent > 0)) return value\n    const limit = (maxEdgeShift * 2) / extent\n    return clamp(value, 1 - limit, 1 + limit)\n  }\n\n  // A press belongs to the innermost liquid element under the pointer. Pressing\n  // a dialog's close button used to squash the dialog's own surface as well,\n  // because the event bubbles — and the surface is tall enough that its squish\n  // carried the button out from under the finger holding it.\n  const ownsPress = (event: PointerEvent): boolean => {\n    const target = event.target\n    if (!(target instanceof Element)) return true\n    const owner = target.closest('[data-liquid-motion]')\n    return owner === null || owner === element\n  }\n\n  // Deliberately underdamped: the visible jiggle after presses and fast\n  // pointer sweeps is the point. Damping rises as wobbliness drops.\n  const jellyDamping = 26 - wobbliness * 16.5\n  const pointerX = new SpringValue(0.5, { damping: 30, stiffness: 320 })\n  const pointerY = new SpringValue(0.5, { damping: 30, stiffness: 320 })\n  const scaleX = new SpringValue(1, { damping: jellyDamping, mass: 0.9, stiffness: 330 })\n  const scaleY = new SpringValue(1, { damping: jellyDamping, mass: 0.9, stiffness: 330 })\n  const skew = new SpringValue(0, { damping: jellyDamping * 1.15, mass: 0.9, stiffness: 260 })\n  const tiltX = new SpringValue(0, { damping: 13, stiffness: 190 })\n  const tiltY = new SpringValue(0, { damping: 13, stiffness: 190 })\n  const lift = new SpringValue(0, { damping: 20, mass: 0.8, stiffness: 230 })\n  const presence = new SpringValue(0, { damping: 24, stiffness: 210 })\n\n  // The lean toward an approaching pointer. Held in springs rather than applied\n  // straight from the pointer position: the target is where the surface wants to\n  // be, and letting it arrive under the same underdamped springs as everything\n  // else is what makes it overshoot and settle like set jelly instead of\n  // gliding there on a transition.\n  const elasticity = clamp(options.elasticity ?? 0, 0, 1)\n  const elasticX = new SpringValue(0, { damping: jellyDamping * 1.1, mass: 1.1, stiffness: 190 })\n  const elasticY = new SpringValue(0, { damping: jellyDamping * 1.1, mass: 1.1, stiffness: 190 })\n  const elasticStretchX = new SpringValue(0, { damping: jellyDamping, mass: 1, stiffness: 210 })\n  const elasticStretchY = new SpringValue(0, { damping: jellyDamping, mass: 1, stiffness: 210 })\n\n  const renderer = canvas && options.webgl !== false && !reducedMotion()\n    ? new LiquidRenderer(canvas, {\n      glow: options.glow,\n      intensity: options.intensity,\n      radius: readRadius(element),\n      ripple: options.ripple,\n      shimmer: options.shimmer,\n      sparkle: options.sparkle,\n      tint: options.tint,\n    })\n    : null\n\n  const inject = (spring: SpringValue, amount: number, cap: number): void => {\n    spring.velocity = clamp(spring.velocity + amount, -cap, cap)\n  }\n\n  const render = (time: number): void => {\n    const delta = (time - lastTime) / 1000\n    lastTime = time\n    let moving = false\n    for (const spring of [\n      pointerX, pointerY, scaleX, scaleY, skew, tiltX, tiltY, lift, presence,\n      elasticX, elasticY, elasticStretchX, elasticStretchY,\n    ]) {\n      if (spring.step(delta)) moving = true\n    }\n\n    const normalizedX = pointerX.current * 2 - 1\n    const normalizedY = pointerY.current * 2 - 1\n    const magnetStrength = presence.current * 1.65\n    const wobbleEnergy = clamp(\n      (Math.abs(scaleX.velocity) + Math.abs(scaleY.velocity)) * 1.4 + Math.abs(skew.velocity) * 0.04,\n      0,\n      1,\n    ) * clamp(wobbliness, 0, 1)\n    const squish = clamp((Math.abs(scaleX.current - 1) + Math.abs(scaleY.current - 1)) * 6, 0, 1)\n\n    element.style.setProperty('--lq-pointer-x', `${(pointerX.current * 100).toFixed(3)}%`)\n    element.style.setProperty('--lq-pointer-y', `${(pointerY.current * 100).toFixed(3)}%`)\n    element.style.setProperty('--lq-rotate-x', `${tiltX.current.toFixed(3)}deg`)\n    element.style.setProperty('--lq-rotate-y', `${tiltY.current.toFixed(3)}deg`)\n    // The lean multiplies the gesture scales rather than replacing them, so a\n    // press still squashes while the surface is leaning.\n    const appliedScaleX = capScale(scaleX.current * (1 + elasticStretchX.current), boxWidth)\n    const appliedScaleY = capScale(scaleY.current * (1 + elasticStretchY.current), boxHeight)\n    element.style.setProperty('--lq-scale-x', appliedScaleX.toFixed(4))\n    element.style.setProperty('--lq-scale-y', appliedScaleY.toFixed(4))\n    element.style.setProperty('--lq-elastic-x', `${elasticX.current.toFixed(3)}px`)\n    element.style.setProperty('--lq-elastic-y', `${elasticY.current.toFixed(3)}px`)\n    // Swing the lit quarter of the rim toward the pointer, so the highlight\n    // reads as one light source the surface is turning under.\n    element.style.setProperty(\n      '--lq-edge-angle',\n      `${(145 + normalizedX * 38 + normalizedY * 16).toFixed(2)}deg`,\n    )\n    element.style.setProperty('--lq-skew-x', `${skew.current.toFixed(3)}deg`)\n    element.style.setProperty('--lq-lift', `${lift.current.toFixed(3)}px`)\n    element.style.setProperty('--lq-magnet-x', `${(normalizedX * magnetStrength).toFixed(3)}px`)\n    element.style.setProperty('--lq-magnet-y', `${(normalizedY * magnetStrength).toFixed(3)}px`)\n    element.style.setProperty('--lq-shine-opacity', presence.current.toFixed(4))\n    element.style.setProperty('--lq-squish', squish.toFixed(4))\n\n    if (renderer) {\n      renderer.setPointer(pointerX.current, pointerY.current)\n      renderer.setStretch(appliedScaleX - 1, appliedScaleY - 1)\n      renderer.setWobble(wobbleEnergy)\n    }\n\n    if (moving) {\n      frame = requestAnimationFrame(render)\n      return\n    }\n\n    frame = 0\n  }\n\n  const start = (): void => {\n    if (frame || reducedMotion()) return\n    lastTime = performance.now()\n    frame = requestAnimationFrame(render)\n  }\n\n  const updatePointer = (event: PointerEvent): void => {\n    if (disabled) return\n\n    const bounds = element.getBoundingClientRect()\n    const width = Math.max(bounds.width, 1)\n    const height = Math.max(bounds.height, 1)\n    const localX = clamp((event.clientX - bounds.left) / width)\n    const localY = clamp((event.clientY - bounds.top) / height)\n    pointerX.setTarget(localX)\n    pointerY.setTarget(localY)\n    tiltX.setTarget(-(localY * 2 - 1) * tilt)\n    tiltY.setTarget((localX * 2 - 1) * tilt)\n\n    // Fast sweeps shove the surface sideways so it sways like set jelly.\n    const now = event.timeStamp\n    if (lastPointerTime > 0 && now > lastPointerTime) {\n      const deltaSeconds = Math.min((now - lastPointerTime) / 1000, 0.05)\n      const velocityX = (event.clientX - lastPointerX) / width / Math.max(deltaSeconds, 0.004)\n      const velocityY = (event.clientY - lastPointerY) / height / Math.max(deltaSeconds, 0.004)\n      inject(skew, velocityX * 3.4 * wobbliness, 42)\n      inject(scaleX, Math.abs(velocityX) * 0.09 * wobbliness, 1.6)\n      inject(scaleY, Math.abs(velocityY) * 0.09 * wobbliness, 1.6)\n    }\n    lastPointerTime = now\n    lastPointerX = event.clientX\n    lastPointerY = event.clientY\n\n    if (reducedMotion()) {\n      pointerX.set(localX)\n      pointerY.set(localY)\n      element.style.setProperty('--lq-pointer-x', `${(localX * 100).toFixed(2)}%`)\n      element.style.setProperty('--lq-pointer-y', `${(localY * 100).toFixed(2)}%`)\n    }\n\n    start()\n  }\n\n  const enter = (event: PointerEvent): void => {\n    if (disabled) return\n    measure()\n    element.dataset.liquidActive = 'true'\n    presence.setTarget(1)\n    scaleX.setTarget(1.01)\n    scaleY.setTarget(1.01)\n    lift.setTarget(-1.5)\n    lastPointerTime = 0\n    renderer?.setActive(true)\n    renderer?.setRadius(readRadius(element))\n    updatePointer(event)\n  }\n\n  const leave = (): void => {\n    pressed = false\n    element.dataset.liquidActive = 'false'\n    pointerX.setTarget(0.5)\n    pointerY.setTarget(0.5)\n    scaleX.setTarget(1)\n    scaleY.setTarget(1)\n    skew.setTarget(0)\n    tiltX.setTarget(0)\n    tiltY.setTarget(0)\n    lift.setTarget(0)\n    presence.setTarget(0)\n    lastPointerTime = 0\n    renderer?.setActive(false)\n    renderer?.setPress(false)\n    start()\n  }\n\n  const down = (event: PointerEvent): void => {\n    if (disabled || !ownsPress(event)) return\n    measure()\n    pressed = true\n    window.clearTimeout(releaseTimeout)\n    scaleX.setTarget(1 + bounce * 0.55)\n    scaleY.setTarget(1 - bounce * 1.15)\n    skew.setTarget((pointerX.current * 2 - 1) * -2.4)\n    lift.setTarget(1)\n    renderer?.setPress(true)\n    renderer?.ripple(pointerX.current, pointerY.current, 0.7)\n    start()\n  }\n\n  const up = (): void => {\n    // Paired with `down`: a surface that let the press through to a control\n    // inside it has nothing to release, and must not kick on the way back up.\n    if (!pressed) return\n    pressed = false\n    // Release: spring targets return to rest while a velocity kick sends the\n    // shape through several visible overshoots — the pull-back \"purun\".\n    scaleX.setTarget(1.01)\n    scaleY.setTarget(1.01)\n    skew.setTarget(0)\n    lift.setTarget(-2)\n    inject(scaleY, bounce * (9 + wobbliness * 13), 4)\n    inject(scaleX, -bounce * (5 + wobbliness * 7), 4)\n    renderer?.setPress(false)\n    renderer?.ripple(pointerX.current, pointerY.current, 1)\n    start()\n    releaseTimeout = window.setTimeout(() => {\n      lift.setTarget(element.dataset.liquidActive === 'true' ? -1.5 : 0)\n      start()\n    }, 140)\n  }\n\n  // Pointer movement anywhere on the page, not just over the element: leaning\n  // toward a pointer that has not arrived yet is the whole point of the effect.\n  const releaseElastic = elasticity > 0\n    ? observeElasticPointer(element, (bounds, clientX, clientY) => {\n      if (disabled || reducedMotion()) return\n      const pull = elasticPull(bounds, clientX, clientY, { elasticity, reach: options.reach })\n      elasticX.setTarget(pull.offsetX)\n      elasticY.setTarget(pull.offsetY)\n      elasticStretchX.setTarget(pull.stretchX)\n      elasticStretchY.setTarget(pull.stretchY)\n      start()\n    })\n    : null\n\n  measure()\n  element.dataset.liquidMotion = ''\n  element.addEventListener('pointerenter', enter)\n  element.addEventListener('pointermove', updatePointer)\n  element.addEventListener('pointerleave', leave)\n  element.addEventListener('pointerdown', down)\n  element.addEventListener('pointerup', up)\n  element.addEventListener('pointercancel', leave)\n\n  return {\n    destroy: () => {\n      cancelAnimationFrame(frame)\n      window.clearTimeout(releaseTimeout)\n      releaseElastic?.()\n      renderer?.destroy()\n      delete element.dataset.liquidMotion\n      element.removeEventListener('pointerenter', enter)\n      element.removeEventListener('pointermove', updatePointer)\n      element.removeEventListener('pointerleave', leave)\n      element.removeEventListener('pointerdown', down)\n      element.removeEventListener('pointerup', up)\n      element.removeEventListener('pointercancel', leave)\n    },\n    pulse: (strength = 1) => {\n      const pulseStrength = clamp(strength, 0, 1.5)\n      renderer?.ripple(pointerX.current, pointerY.current, pulseStrength)\n      inject(scaleY, bounce * pulseStrength * (8 + wobbliness * 10), 4)\n      inject(scaleX, -bounce * pulseStrength * 5, 4)\n      start()\n    },\n    setDisabled: (nextDisabled: boolean) => {\n      disabled = nextDisabled\n      element.dataset.liquidDisabled = String(nextDisabled)\n      if (nextDisabled) leave()\n    },\n  }\n}\n","import type { LiquefyTokens } from './types'\n\nexport const defaultTokens: Readonly<LiquefyTokens> = {\n  accent: '#86a8ff',\n  border: 'rgba(255, 255, 255, 0.38)',\n  duration: '420ms',\n  easing: 'cubic-bezier(0.22, 1, 0.36, 1)',\n  radius: '28px',\n  shadow: '0 18px 48px rgba(8, 12, 28, 0.18)',\n  text: '#f7f9ff',\n}\n"],"mappings":"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"}