{"version":3,"file":"liquid-glass.umd.cjs","sources":["../lib/liquid-glass.js"],"sourcesContent":["/**\n * Liquid Glass Component - Simple & Elegant\n * Pure functions for applying glass morphism effects\n */\n\nlet svgFiltersInjected = false;\nlet desktopClassAdded = false;\n\n/**\n * Set SVG filter capability via CSS custom property (SSR-safe)\n */\nfunction setSVGFilterCapability() {\n  // Only run once and only in browser environment\n  if (desktopClassAdded || typeof document === 'undefined') {\n    return;\n  }\n  \n  // Detect desktop browsers that can handle SVG filters reliably\n  const isDesktop = !/Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n  \n  // Set CSS custom property for progressive enhancement\n  document.documentElement.style.setProperty('--svg-filters-enabled', isDesktop ? '1' : '0');\n  \n  console.log('SVG filters capability:', isDesktop ? 'enabled' : 'disabled');\n  desktopClassAdded = true;\n}\n\n\n/**\n * Apply liquid glass effect to an element\n * @param {HTMLElement} element - The element to apply the effect to\n * @param {Object} options - Configuration options\n * @param {string} options.intensity - 'subtle', 'normal', 'strong'\n * @returns {Object} Effect object with remove() method\n */\nexport function applyLiquidGlass(element, options = {}) {\n  const { intensity = 'normal' } = options;\n  \n  // Set SVG filter capability for CSS enhancement\n  setSVGFilterCapability();\n  \n  ensureSVGFilters();\n  \n  // Store original state\n  const originalStyles = storeOriginalStyles(element);\n  \n  // Use the same approach for all elements - simple overlay\n  const cleanupFn = applyGlassOverlay(element, intensity, originalStyles);\n  return { remove: cleanupFn };\n}\n\n/**\n * Apply glass overlay to any element - unified bulletproof approach\n */\nfunction applyGlassOverlay(element, intensity, originalStyles) {\n  // Universal approach: create overlay positioned over the element\n  // This works for ALL element types and avoids any DOM manipulation issues\n  \n  // Ensure parent has positioning context\n  const computedStyle = getComputedStyle(element);\n  if (computedStyle.position === 'static') {\n    element.style.position = 'relative';\n  }\n  if (computedStyle.zIndex === 'auto') {\n    element.style.zIndex = '0';\n  }\n  \n  // Check element type first\n  const isVoidElement = ['INPUT', 'IMG', 'BR', 'HR', 'AREA', 'BASE', 'COL', 'EMBED', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR'].includes(element.tagName);\n  \n  let overlay = null;\n  \n  if (isVoidElement) {\n    // For void elements (inputs), apply glass effect directly to avoid text blurring\n    element.classList.add('liquid-glass-direct');\n    if (intensity !== 'normal') {\n      element.classList.add(`intensity-${intensity}`);\n    }\n    \n  } else {\n    // For non-void elements, create and use overlay approach\n    overlay = document.createElement('div');\n    overlay.className = `liquid-glass ${intensity !== 'normal' ? `intensity-${intensity}` : ''}`;\n    element.appendChild(overlay);\n    \n  }\n  \n  return () => restoreElement(element, overlay, originalStyles);\n}\n\n/**\n * Store original element styles for cleanup\n */\nfunction storeOriginalStyles(element) {\n  return {\n    position: element.style.position,\n    zIndex: element.style.zIndex\n  };\n}\n\n/**\n * Restore element to original state - unified cleanup\n */\nfunction restoreElement(element, overlay, originalStyles) {\n  if (overlay && overlay.parentNode) {\n    overlay.remove();\n  }\n  \n  // Remove direct glass classes for void elements\n  element.classList.remove('liquid-glass-direct', 'intensity-subtle', 'intensity-strong');\n  \n  // Restore original styles\n  ['position', 'zIndex'].forEach(prop => {\n    element.style[prop] = originalStyles[prop];\n  });\n}\n\n/**\n * Ensure SVG filters are injected into the document\n */\nfunction ensureSVGFilters() {\n  if (svgFiltersInjected || document.getElementById('liquidGlassFilter')) {\n    return;\n  }\n\n  // Set SVG filter capability for CSS enhancement\n  setSVGFilterCapability();\n\n  const svg = createSVGFilters();\n  document.body.appendChild(svg);\n  svgFiltersInjected = true;\n}\n\n/**\n * Create optimized SVG filters with element-specific parameters\n */\nfunction createSVGFilters() {\n  const svgNS = 'http://www.w3.org/2000/svg';\n  const svg = document.createElementNS(svgNS, 'svg');\n  \n  svg.setAttribute('width', '0');\n  svg.setAttribute('height', '0');\n  svg.style.display = 'none';\n\n  const defs = document.createElementNS(svgNS, 'defs');\n  \n  // Default filter for most elements\n  const defaultFilter = createFilter(svgNS, 'liquidGlassFilter', {\n    baseFrequency: '0.0005',\n    numOctaves: '4',\n    scale: '25'\n  });\n  \n  // Button-specific filter with reduced scale to avoid border artifacts\n  const buttonFilter = createFilter(svgNS, 'liquidGlassFilterButton', {\n    baseFrequency: '0.0005',\n    numOctaves: '4',\n    scale: '5'\n  });\n  \n  defs.appendChild(defaultFilter);\n  defs.appendChild(buttonFilter);\n  svg.appendChild(defs);\n  \n  return svg;\n}\n\n/**\n * Create individual SVG filter with specified parameters\n */\nfunction createFilter(svgNS, id, params) {\n  const filter = document.createElementNS(svgNS, 'filter');\n  \n  filter.setAttribute('id', id);\n  filter.setAttribute('x', '-20%');\n  filter.setAttribute('y', '-20%');\n  filter.setAttribute('width', '140%');\n  filter.setAttribute('height', '140%');\n\n  // Turbulence with specified values\n  const turbulence = document.createElementNS(svgNS, 'feTurbulence');\n  turbulence.setAttribute('baseFrequency', params.baseFrequency);\n  turbulence.setAttribute('numOctaves', params.numOctaves);\n  turbulence.setAttribute('result', 'noise');\n  filter.appendChild(turbulence);\n\n  // Displacement with specified scale\n  const displacement = document.createElementNS(svgNS, 'feDisplacementMap');\n  displacement.setAttribute('in', 'SourceGraphic');\n  displacement.setAttribute('in2', 'noise');\n  displacement.setAttribute('scale', params.scale);\n  displacement.setAttribute('result', 'displaced');\n  filter.appendChild(displacement);\n\n  // Chromatic aberration effect\n  createChromaticAberration(filter, svgNS);\n  \n  return filter;\n}\n\n/**\n * Create chromatic aberration effect\n */\nfunction createChromaticAberration(filter, svgNS) {\n  // Red channel\n  const redMatrix = document.createElementNS(svgNS, 'feColorMatrix');\n  redMatrix.setAttribute('in', 'displaced');\n  redMatrix.setAttribute('values', '1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0');\n  redMatrix.setAttribute('result', 'red');\n  filter.appendChild(redMatrix);\n\n  // Green channel  \n  const greenMatrix = document.createElementNS(svgNS, 'feColorMatrix');\n  greenMatrix.setAttribute('in', 'displaced');\n  greenMatrix.setAttribute('values', '0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0');\n  greenMatrix.setAttribute('result', 'green');\n  filter.appendChild(greenMatrix);\n\n  // Blue channel\n  const blueMatrix = document.createElementNS(svgNS, 'feColorMatrix');\n  blueMatrix.setAttribute('in', 'displaced');\n  blueMatrix.setAttribute('values', '0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0');\n  blueMatrix.setAttribute('result', 'blue');\n  filter.appendChild(blueMatrix);\n\n  // Blend channels\n  const blend1 = document.createElementNS(svgNS, 'feBlend');\n  blend1.setAttribute('in', 'red');\n  blend1.setAttribute('in2', 'green');\n  blend1.setAttribute('mode', 'screen');\n  blend1.setAttribute('result', 'comp1');\n  filter.appendChild(blend1);\n\n  const blend2 = document.createElementNS(svgNS, 'feBlend');\n  blend2.setAttribute('in', 'blue');\n  blend2.setAttribute('in2', 'comp1');\n  blend2.setAttribute('mode', 'screen');\n  blend2.setAttribute('result', 'comp2');\n  filter.appendChild(blend2);\n\n  // Final blend\n  const finalBlend = document.createElementNS(svgNS, 'feBlend');\n  finalBlend.setAttribute('in', 'displaced');\n  finalBlend.setAttribute('in2', 'comp2');\n  finalBlend.setAttribute('mode', 'lighten');\n  filter.appendChild(finalBlend);\n}\n\n/**\n * Apply to multiple elements\n * @param {NodeList|Array} elements - Elements to apply effect to\n * @param {Object} options - Configuration options\n * @returns {Array} Array of effect objects with remove() methods\n */\nexport function applyToMultiple(elements, options = {}) {\n  return Array.from(elements).map(el => applyLiquidGlass(el, options));\n}\n\n/**\n * Clean up all effects and remove SVG filters\n */\nexport function cleanupAll() {\n  const svg = document.getElementById('liquidGlassFilter')?.parentElement;\n  if (svg) svg.remove();\n  svgFiltersInjected = false;\n}"],"names":["svgFiltersInjected","desktopClassAdded","setSVGFilterCapability","isDesktop","applyLiquidGlass","element","options","intensity","ensureSVGFilters","originalStyles","storeOriginalStyles","applyGlassOverlay","computedStyle","isVoidElement","overlay","restoreElement","prop","svg","createSVGFilters","svgNS","defs","defaultFilter","createFilter","buttonFilter","id","params","filter","turbulence","displacement","createChromaticAberration","redMatrix","greenMatrix","blueMatrix","blend1","blend2","finalBlend","applyToMultiple","elements","el","cleanupAll","_a"],"mappings":"qPAKA,IAAIA,EAAqB,GACrBC,EAAoB,GAKxB,SAASC,GAAyB,CAEhC,GAAID,GAAqB,OAAO,UAAa,YAC3C,OAIF,MAAME,EAAY,CAAC,2DAA2D,KAAK,UAAU,SAAS,EAGtG,SAAS,gBAAgB,MAAM,YAAY,wBAAyBA,EAAY,IAAM,GAAG,EAEzF,QAAQ,IAAI,0BAA2BA,EAAY,UAAY,UAAU,EACzEF,EAAoB,EACtB,CAUO,SAASG,EAAiBC,EAASC,EAAU,GAAI,CACtD,KAAM,CAAE,UAAAC,EAAY,QAAQ,EAAKD,EAGjCJ,EAAsB,EAEtBM,EAAgB,EAGhB,MAAMC,EAAiBC,EAAoBL,CAAO,EAIlD,MAAO,CAAE,OADSM,EAAkBN,EAASE,EAAWE,CAAc,CAC5C,CAC5B,CAKA,SAASE,EAAkBN,EAASE,EAAWE,EAAgB,CAK7D,MAAMG,EAAgB,iBAAiBP,CAAO,EAC1CO,EAAc,WAAa,WAC7BP,EAAQ,MAAM,SAAW,YAEvBO,EAAc,SAAW,SAC3BP,EAAQ,MAAM,OAAS,KAIzB,MAAMQ,EAAgB,CAAC,QAAS,MAAO,KAAM,KAAM,OAAQ,OAAQ,MAAO,QAAS,OAAQ,OAAQ,QAAS,SAAU,QAAS,KAAK,EAAE,SAASR,EAAQ,OAAO,EAE9J,IAAIS,EAAU,KAEd,OAAID,GAEFR,EAAQ,UAAU,IAAI,qBAAqB,EACvCE,IAAc,UAChBF,EAAQ,UAAU,IAAI,aAAa,OAAAE,EAAW,IAKhDO,EAAU,SAAS,cAAc,KAAK,EACtCA,EAAQ,UAAY,gBAAgB,OAAAP,IAAc,SAAW,aAAa,OAAAA,GAAc,IACxFF,EAAQ,YAAYS,CAAO,GAItB,IAAMC,EAAeV,EAASS,EAASL,CAAc,CAC9D,CAKA,SAASC,EAAoBL,EAAS,CACpC,MAAO,CACL,SAAUA,EAAQ,MAAM,SACxB,OAAQA,EAAQ,MAAM,MAC1B,CACA,CAKA,SAASU,EAAeV,EAASS,EAASL,EAAgB,CACpDK,GAAWA,EAAQ,YACrBA,EAAQ,OAAM,EAIhBT,EAAQ,UAAU,OAAO,sBAAuB,mBAAoB,kBAAkB,EAGtF,CAAC,WAAY,QAAQ,EAAE,QAAQW,GAAQ,CACrCX,EAAQ,MAAMW,CAAI,EAAIP,EAAeO,CAAI,CAC3C,CAAC,CACH,CAKA,SAASR,GAAmB,CAC1B,GAAIR,GAAsB,SAAS,eAAe,mBAAmB,EACnE,OAIFE,EAAsB,EAEtB,MAAMe,EAAMC,EAAgB,EAC5B,SAAS,KAAK,YAAYD,CAAG,EAC7BjB,EAAqB,EACvB,CAKA,SAASkB,GAAmB,CAC1B,MAAMC,EAAQ,6BACRF,EAAM,SAAS,gBAAgBE,EAAO,KAAK,EAEjDF,EAAI,aAAa,QAAS,GAAG,EAC7BA,EAAI,aAAa,SAAU,GAAG,EAC9BA,EAAI,MAAM,QAAU,OAEpB,MAAMG,EAAO,SAAS,gBAAgBD,EAAO,MAAM,EAG7CE,EAAgBC,EAAaH,EAAO,oBAAqB,CAC7D,cAAe,SACf,WAAY,IACZ,MAAO,IACX,CAAG,EAGKI,EAAeD,EAAaH,EAAO,0BAA2B,CAClE,cAAe,SACf,WAAY,IACZ,MAAO,GACX,CAAG,EAED,OAAAC,EAAK,YAAYC,CAAa,EAC9BD,EAAK,YAAYG,CAAY,EAC7BN,EAAI,YAAYG,CAAI,EAEbH,CACT,CAKA,SAASK,EAAaH,EAAOK,EAAIC,EAAQ,CACvC,MAAMC,EAAS,SAAS,gBAAgBP,EAAO,QAAQ,EAEvDO,EAAO,aAAa,KAAMF,CAAE,EAC5BE,EAAO,aAAa,IAAK,MAAM,EAC/BA,EAAO,aAAa,IAAK,MAAM,EAC/BA,EAAO,aAAa,QAAS,MAAM,EACnCA,EAAO,aAAa,SAAU,MAAM,EAGpC,MAAMC,EAAa,SAAS,gBAAgBR,EAAO,cAAc,EACjEQ,EAAW,aAAa,gBAAiBF,EAAO,aAAa,EAC7DE,EAAW,aAAa,aAAcF,EAAO,UAAU,EACvDE,EAAW,aAAa,SAAU,OAAO,EACzCD,EAAO,YAAYC,CAAU,EAG7B,MAAMC,EAAe,SAAS,gBAAgBT,EAAO,mBAAmB,EACxE,OAAAS,EAAa,aAAa,KAAM,eAAe,EAC/CA,EAAa,aAAa,MAAO,OAAO,EACxCA,EAAa,aAAa,QAASH,EAAO,KAAK,EAC/CG,EAAa,aAAa,SAAU,WAAW,EAC/CF,EAAO,YAAYE,CAAY,EAG/BC,EAA0BH,EAAQP,CAAK,EAEhCO,CACT,CAKA,SAASG,EAA0BH,EAAQP,EAAO,CAEhD,MAAMW,EAAY,SAAS,gBAAgBX,EAAO,eAAe,EACjEW,EAAU,aAAa,KAAM,WAAW,EACxCA,EAAU,aAAa,SAAU,yCAAyC,EAC1EA,EAAU,aAAa,SAAU,KAAK,EACtCJ,EAAO,YAAYI,CAAS,EAG5B,MAAMC,EAAc,SAAS,gBAAgBZ,EAAO,eAAe,EACnEY,EAAY,aAAa,KAAM,WAAW,EAC1CA,EAAY,aAAa,SAAU,yCAAyC,EAC5EA,EAAY,aAAa,SAAU,OAAO,EAC1CL,EAAO,YAAYK,CAAW,EAG9B,MAAMC,EAAa,SAAS,gBAAgBb,EAAO,eAAe,EAClEa,EAAW,aAAa,KAAM,WAAW,EACzCA,EAAW,aAAa,SAAU,yCAAyC,EAC3EA,EAAW,aAAa,SAAU,MAAM,EACxCN,EAAO,YAAYM,CAAU,EAG7B,MAAMC,EAAS,SAAS,gBAAgBd,EAAO,SAAS,EACxDc,EAAO,aAAa,KAAM,KAAK,EAC/BA,EAAO,aAAa,MAAO,OAAO,EAClCA,EAAO,aAAa,OAAQ,QAAQ,EACpCA,EAAO,aAAa,SAAU,OAAO,EACrCP,EAAO,YAAYO,CAAM,EAEzB,MAAMC,EAAS,SAAS,gBAAgBf,EAAO,SAAS,EACxDe,EAAO,aAAa,KAAM,MAAM,EAChCA,EAAO,aAAa,MAAO,OAAO,EAClCA,EAAO,aAAa,OAAQ,QAAQ,EACpCA,EAAO,aAAa,SAAU,OAAO,EACrCR,EAAO,YAAYQ,CAAM,EAGzB,MAAMC,EAAa,SAAS,gBAAgBhB,EAAO,SAAS,EAC5DgB,EAAW,aAAa,KAAM,WAAW,EACzCA,EAAW,aAAa,MAAO,OAAO,EACtCA,EAAW,aAAa,OAAQ,SAAS,EACzCT,EAAO,YAAYS,CAAU,CAC/B,CAQO,SAASC,EAAgBC,EAAU/B,EAAU,GAAI,CACtD,OAAO,MAAM,KAAK+B,CAAQ,EAAE,IAAIC,GAAMlC,EAAiBkC,EAAIhC,CAAO,CAAC,CACrE,CAKO,SAASiC,GAAa,OAC3B,MAAMtB,GAAMuB,EAAA,SAAS,eAAe,mBAAmB,IAA3C,YAAAA,EAA8C,cACtDvB,GAAKA,EAAI,OAAM,EACnBjB,EAAqB,EACvB"}