{"_id":"liquid-gl","_rev":"18-c0a7077a3ba34607a88e227390124984","name":"liquid-gl","dist-tags":{"latest":"2.2.4"},"versions":{"1.0.0":{"name":"liquid-gl","version":"1.0.0","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.0","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"a7fce996aafab77cb75ea71bd796163d7f4c8b1f","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.0.tgz","fileCount":4,"integrity":"sha512-yoKvr3d0smPMhhlSpsERz4Nn+6vtFlrYMie/XiV9brrgJM2bSR1N4A5HSmkTUEvC1ssPGdp3NbwEeVm+2wKkhQ==","signatures":[{"sig":"MEUCIExv1XEdrJ8iofXXzm75zV2Dlz8//kr/e9mKZnCbmbUNAiEA+A48h3V/nbK6NizedX4hzwFiS1LpzC4f7ai20K4sDNE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69829},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"b01a7a23e2818f42446bfb9f07b246af8cbbf299","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.0_1783460775166_0.9001537730437339","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"liquid-gl","version":"1.0.1","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.1","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"aa2f1524d33d377898f8eca1db096213030d22b7","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.1.tgz","fileCount":4,"integrity":"sha512-qkxEAOHEMUwyXZnJCGQ/ce0LavzQfkxXCsG9nUOV4szXYdG3a2+TN1gty4dflGK86etGsrQ+Sy0Cnxs4KF8drA==","signatures":[{"sig":"MEUCIQCq84B5+VJcVfCcUW2M6tcPzVOjX85BzVhQk7JY81wPbQIgU+KRMZraXxa/CNpkyCuxOIymxiEyo+u3/8IEHHnxKJc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86182},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"fdd293c7b46af2fa2ec4445081c076506657b8f3","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.1_1783461155287_0.11374239707020695","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"liquid-gl","version":"1.0.2","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.2","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"5612d1660317a8d3993f5441e7283c1a227256c4","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.2.tgz","fileCount":4,"integrity":"sha512-qsGEIXao+B88VdA4RsYrG0v0pae+EDiGpnze/6Kiwzxa/4fVoF6A55HYjgzz5hWdx3oAGIZlmWeLQi0DP1JQWA==","signatures":[{"sig":"MEUCIQDlJCNLn3pIiyXCS7B/QztF9bIWYK7eAdOBhaqDCjZoUQIgFla5MDXPGUMdfYQ86hkzIgZEa/nj+rRr3ayp+OXrQmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86209},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"9a9fe8b5134485c6fc9a4e8c92f1854d6da5d8d0","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.2_1783462832234_0.3528184721649179","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"liquid-gl","version":"1.0.3","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.3","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"7c579cdb5b3d1da5868e2d9af5bfd272ceb5f580","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.3.tgz","fileCount":6,"integrity":"sha512-ZIiBhtnSyLM4Vnm7GIGDM/MGCLXJCgnzOdqxVo17/C5uL+qbVoB9C2gedWHr8AgrhNbe6doFP+JhKq4FnqAVuA==","signatures":[{"sig":"MEQCIGCyvtAvcI2oJaO8RZ8/Pw/JRT/PYhbFrY10ww3cOuEIAiB8YxaIsOsFlDUVFmLsJlbiwJD0gQP4KOLe/LTYyUmaMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":907298},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"2df0d07f84ebd8a7ffebfd0a7625d8b08d043ecd","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.3_1783463573889_0.5133845866461839","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"liquid-gl","version":"1.0.4","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.4","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"5a7993cfb9434ca0aaa7b61c93e3bfbb9b94dd6b","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.4.tgz","fileCount":4,"integrity":"sha512-vk8W/CIln5Eqi5tU3I9EHwHWr3auIEFz0DHr4rrAry5Oq8ok3DQKWot4euaMW20yLQHtbS3gaJEGsJZrUJ5F1g==","signatures":[{"sig":"MEQCIDZVZqXjC0Yme54t4YC4WvdgW9VdCCcQJvIPIPz7L5PcAiAlTGjeAJAR/Xs1h4PJsPM38M5F5egPUdzaMS4HMlR/0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86310},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"ef2330444c36c87ddaa535d32a148da832f54cb6","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.4_1783463922351_0.9121181082387573","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"liquid-gl","version":"1.0.5","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.5","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"e03fee9bd6119780d998c5ce120262e28b57820f","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.5.tgz","fileCount":4,"integrity":"sha512-MiJcC7F3od996yXljpn775IE0MCZOMOzgp+LL7c5xMcKHLNOWJHAZqy5EmBwmyXzllpGKaA+qijR+TIA4GcAqw==","signatures":[{"sig":"MEYCIQDQttuFuKrtRtZ2BMvQFYIksmUaZlQOERB2hRjm5ITzwgIhAODODQVCTFPYgqyjTrUMNK5l+OrlmQv/pK2+nIznJw0s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86273},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"ef2330444c36c87ddaa535d32a148da832f54cb6","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.5_1783464392952_0.15196041939707117","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"liquid-gl","version":"1.0.6","keywords":["glassmorphism","liquid-glass","webgl","canvas","three"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@1.0.6","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"988dc68c1d9d7cc622883d10bbbf37b3e87c599e","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-1.0.6.tgz","fileCount":4,"integrity":"sha512-QNLfuqzL/65QuDUHaedTC1IlrBhDP6oFJfK8trimwq5MKuyO0Q48pgEhUmJZ4fk56+F2zU2laUK8/USXGsIZTQ==","signatures":[{"sig":"MEUCIQCICCg6hZDCDkfZ/Mh3qkQRx4vf7lYK494eWwke0nw+xQIgbOUCtQ1ggoeQPnPUWchVgHqfKF5Sae3LPRwzWxX17Yk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86273},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"6f1ad9e821af119471cc85089de66068a980ff7c","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"peerDependencies":{"three":">=0.150.0"},"peerDependenciesMeta":{"three":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_1.0.6_1783465859834_0.9656532872205417","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"liquid-gl","version":"2.0.0","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.0.0","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"2603a6c74f7002e163403c7ef15bbddb53c4c429","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.0.0.tgz","fileCount":4,"integrity":"sha512-X5dtJR0kCpSs5pVYFn+qiK1XbguJ3lk788/t7DYgHtWEMRVeCrEZ70NAVx62NnADqwA5eEozFpHf7rYwhqENuQ==","signatures":[{"sig":"MEUCIQCOzkXbmsjhrTsA9h/03777EYraO6jtq9SZ/0U98gB1ZgIgEKSzpkmDRo8rcb4MsRTV641Rq0O99lr1i8oL9nu3pOw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107804},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"a0d543114821da0d121f54ee5247c135a885ca2a","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","dependencies":{"html2canvas":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.0.0_1785357377273_0.1591383419802077","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"liquid-gl","version":"2.0.1","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.0.1","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"7a41eedf4249b34a443fe6580c22907fe829474d","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.0.1.tgz","fileCount":4,"integrity":"sha512-4HTE7uwAeTlT3VZe6gUSHrGpfIb8SivqQAG9TAel9HJp776rqHbEpgviFoaGsgf1KAsrIkQ/uyOuVxqixOWMZg==","signatures":[{"sig":"MEUCIQCd6vodu4HRsBIYaIasbxwpk3v1/XIYkGLq1OSjGbTJvwIgAojREETI8A6PFw1MIXGFGie56DtQwlGiwn2kVfrKlh4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161639},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"28e7c1a64a96c46449e9f494acee98c8490d9824","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.0.1_1785616825125_0.8287909881098576","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"liquid-gl","version":"2.0.2","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.0.2","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"a4d1f28c95faf12539e577cdd0e043da2f481719","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.0.2.tgz","fileCount":4,"integrity":"sha512-ZzOd83l32hJv5QnCC9SraQW1Sqtb6j0KpWnOscGuUPyMdeNW6+NTi81k8dr/1qP7ZFdynu2EfzQ/x8Ev4K3k0A==","signatures":[{"sig":"MEUCIChUI/tQGdg2uc345nQL0CoNdv2vx4I00GKBcgAXtyopAiEA7jIcram1yV+StP5wThdHIgkI7Y5aQuutRpAX87ReGAs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159815},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"b79845de77299c3fad3f05c470997719d31fbc9c","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Ultra-light glassmorphism for the web.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.0.2_1788745009509_0.500460334988599","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"liquid-gl","version":"2.0.3","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.0.3","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"f514c2aa37429d990ec2fa4b19a4a8b3fe872462","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.0.3.tgz","fileCount":4,"integrity":"sha512-uN0h4pKd/rAGyx/um8ZlB4PG5cNIT1L0CckrfYI6O+DixSjfkNmol8lrOdLt5Yi6a3CYfSKf4wce5LOvzKEkug==","signatures":[{"sig":"MEYCIQDFg1PBA2wxOvuIBEuoHji5h3IqwrD/jfJX+Q5xmqaHUwIhAIkEsbo6ngooJiKyh8dkkdXIfUvs4cn2fth64mYvcdq7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159728},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"14cce72b9272c374483ef19603398620d4646e55","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.0.3_1788887417778_0.4834482639114517","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"liquid-gl","version":"2.1.0","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.1.0","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"2786825b69fbc05f80ebc012a8c1e5933db2ae40","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.1.0.tgz","fileCount":4,"integrity":"sha512-Q/A0X10mNY4veZ0XkzW2uGtQqvDvsf8L/QIKAYh+3hKj+FMBPF2KdIzYiMWxH5At1F2lWGpYX6/NjzS7X3c6nQ==","signatures":[{"sig":"MEUCIDI1zoFDHq3I7oAPJg5FFjeR6f4nPrMJ49YeG/dInqvLAiEAlxzR7NpmmHUU+rnJ+4imp2KM/gu0PZM3RfqV1W1Yuf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170736},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"d54f2c0b242a20cbde373f3a9538765104cd429b","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.1.0_1788892741258_0.21525942458534675","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"liquid-gl","version":"2.1.1","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.1.1","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"6c4245de12bc4657a08aa73898461e821762ff0b","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.1.1.tgz","fileCount":4,"integrity":"sha512-ZumFLwLk3MWP4amEVOWKLit2260tgMkxdNRF8C1kRzbnz7GOOp3Pk8MyzSSxVdf2Sf01TfpRXUBp+iI0Onq6fg==","signatures":[{"sig":"MEUCIQDTN2MA67REzReaAlqwqFLfhy10BhyO7WNK4fRrsHDgwAIgfZfd+GX22bP8xLQHGs0Uv4X85AsPt2tVvoRNWkt2Sz8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171130},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"}},"gitHead":"17ccba9d2660289dba5a3dedb047868a505eeedf","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.1.1_1789176897186_0.14375014025837118","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"liquid-gl","version":"2.2.0","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.2.0","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"51c2b0996f7e63ca09ee3107b436e3ba3988b6e5","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.2.0.tgz","fileCount":5,"integrity":"sha512-RITpO5uvhQ9xwIZLSdnKRUh42lOnXGgCYnO4Oyr21z1wKIqK1LaxfWjz2T7FWD9WYl9ZlEgWF5r0IVx2ShmANg==","signatures":[{"sig":"MEYCIQC5wjvhEPlal5muBKxlYzQB0nuHVyd4V50sWGuc+pSJfgIhAIiq8AkIh81UqaypUYEkB6BY0PcgUfJm0ZVxYYTAEdbW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":197286},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"},"./liquidGL-helper.js":{"import":"./liquidGL-helper.js","default":"./liquidGL-helper.js"}},"gitHead":"ed8878cbf7c0fc15d47ec2e15572b72b22d26ee9","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGPU/WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.2.0_1789231456571_0.2230806128254197","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"liquid-gl","version":"2.2.1","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.2.1","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"cd35bdeb671674fabc7737bf1e5a4e5d7879555f","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.2.1.tgz","fileCount":5,"integrity":"sha512-bT0oGm7geMcoThYRC60DMrmyOeWdmrM0OwUcWITNDkUFepJ4X1maEC5Tkvzh12g87LadqSZRSF7SKtbY3Hdupw==","signatures":[{"sig":"MEQCIEv3CAu7rJrQFK17R1STQM2p7pnvbtXhDfnV733dI9qhAiA7KLekkIbrLEKOQFgpWl2gC/j7aWy8bOD6sUrCSbD5pQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198453},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"},"./liquidGL-helper.js":{"import":"./liquidGL-helper.js","default":"./liquidGL-helper.js"}},"gitHead":"84e1a2593ece5b0eec58a25308c390b095628e8f","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGPU/WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.2.1_1789231738214_0.3177083955568685","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"liquid-gl","version":"2.2.2","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.2.2","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"ea0cd1eac83e5e2a43dc7d901b0d123bd6ca67a3","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.2.2.tgz","fileCount":5,"integrity":"sha512-UjskUEQKumy3SMugfzl4QqONvfG1D2aPDINcU0CbUsvbdn3xlKK/Bz3+9Pgf97meaKEHWEinys7FhxmGNDJu9A==","signatures":[{"sig":"MEQCIFhlaGTZxEBjIgy8peyY2AQWRqYnfw2EZCHw7esI8nyrAiBt/M9dOrVcj5fXe988uW0fVJsAoTZoU+RQ6KNppI5e6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198453},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"},"./liquidGL-helper.js":{"import":"./liquidGL-helper.js","default":"./liquidGL-helper.js"}},"gitHead":"669a2cfe18f7984d2cc538fed06b348630278965","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGPU/WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.2.2_1789231933257_0.537144595300254","host":"s3://npm-registry-packages-npm-production"}},"2.2.3":{"name":"liquid-gl","version":"2.2.3","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","_id":"liquid-gl@2.2.3","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"homepage":"https://liquidgl.naughtyduk.com","dist":{"shasum":"28c548640f6c6e03844a804706d04a0a3e11077a","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.2.3.tgz","fileCount":5,"integrity":"sha512-XS+dDPLSQL3rwdT9xAQhKCzjJopfEw48rczqdAa17JFchj240lrS3aswFSrU4TMpoQA80GvoXEdYAIWFqGSjPA==","signatures":[{"sig":"MEUCIGGrbhUAwY2cuSNAc7tfeCGExa4l6+VvZYzNxzSthoEpAiEA8iUa0y+YyC2e9FAinR3+3/K1ney5tSnlF/Jy89Pv684=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199044},"main":"./liquidGL.js","type":"module","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"},"./liquidGL-helper.js":{"import":"./liquidGL-helper.js","default":"./liquidGL-helper.js"}},"gitHead":"2f835503fdc23e7d84836052e403d7c9082254d7","_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"_npmVersion":"11.6.2","description":"Liquid Glass - Powered by WebGPU/WebGL.","directories":{},"_nodeVersion":"22.15.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/liquid-gl_2.2.3_1789326209332_0.40880040896552305","host":"s3://npm-registry-packages-npm-production"}},"2.2.4":{"name":"liquid-gl","version":"2.2.4","description":"Liquid Glass - Powered by WebGPU/WebGL.","type":"module","main":"./liquidGL.js","module":"./liquidGL.js","exports":{".":{"import":"./liquidGL.js","default":"./liquidGL.js"},"./liquidGL-helper.js":{"import":"./liquidGL-helper.js","default":"./liquidGL-helper.js"}},"keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"author":{"name":"NaughtyDuk"},"license":"MIT","homepage":"https://liquidgl.naughtyduk.com","publishConfig":{"access":"public"},"gitHead":"fd2c5447fbc0edd3e6f00df1d9ff09c4fd9e20f0","_id":"liquid-gl@2.2.4","_nodeVersion":"22.15.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-gtDfkx5ZJ+wGaRh9FzMSR3aRww6Nf3NTqVfnVhbcGFfxNf1O8C5k/yCGAk0axr2azXfRHrEyOZ2xf6xwFZfLgw==","shasum":"61bd30284deb1a9c63d6876e5b26ea4d4f4816a9","tarball":"https://registry.npmjs.org/liquid-gl/-/liquid-gl-2.2.4.tgz","fileCount":5,"unpackedSize":199582,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDh5kpIc4mZOL+slpYnlQ7XBhwoNPgmSgcDZ7Ff9MfhuwIgbjy7P6DvjuZpi8EnuTAMB+VAWUiEVCwDT33ee97HeDA="}]},"_npmUser":{"name":"naughtyduk","email":"jack@naughtyduk.com"},"directories":{},"maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/liquid-gl_2.2.4_1789331634726_0.16071324954361188"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-07T21:46:15.040Z","modified":"2026-09-13T20:33:54.994Z","1.0.0":"2026-07-07T21:46:15.285Z","1.0.1":"2026-07-07T21:52:35.442Z","1.0.2":"2026-07-07T22:20:32.375Z","1.0.3":"2026-07-07T22:32:54.075Z","1.0.4":"2026-07-07T22:38:42.489Z","1.0.5":"2026-07-07T22:46:33.101Z","1.0.6":"2026-07-07T23:10:59.967Z","2.0.0":"2026-07-29T20:36:17.427Z","2.0.1":"2026-08-01T20:40:25.315Z","2.0.2":"2026-09-07T01:36:49.685Z","2.0.3":"2026-09-08T17:10:17.911Z","2.1.0":"2026-09-08T18:39:01.408Z","2.1.1":"2026-09-12T01:34:57.329Z","2.2.0":"2026-09-12T16:44:16.706Z","2.2.1":"2026-09-12T16:48:58.367Z","2.2.2":"2026-09-12T16:52:13.403Z","2.2.3":"2026-09-13T19:03:29.474Z","2.2.4":"2026-09-13T20:33:54.858Z"},"author":{"name":"NaughtyDuk"},"license":"MIT","homepage":"https://liquidgl.naughtyduk.com","keywords":["glassmorphism","liquid-glass","webgl","canvas","refraction","shader"],"description":"Liquid Glass - Powered by WebGPU/WebGL.","maintainers":[{"name":"naughtyduk","email":"jack@naughtyduk.com"}],"readme":"# liquidGL – Liquid Glass - Powered by WebGPU/WebGL\n\n<a href=\"https://liquidgl.naughtyduk.com\"><img src=\"https://raw.githubusercontent.com/naughtyduk/liquidGL/main/assets/liquidGL-npm-preview.gif\" alt=\"liquidGL\" width=\"100%\" height=\"auto\"/></a>\n\n### v2.2.4\n\n> **NOTE**\n> `liquidGL` is free to use for both non-commercial and commercial purposes.\n\n> **WARNING**\n> **v2.0.1 changed snapshot capture.** `liquidGL` now snapshots the page with its own built-in rasteriser, so `html2canvas` is no longer a dependency. Nothing needs to change in your code.\n>\n> | Rasteriser    | Median  | Min     | Max      | Worst single stall |\n> | :------------ | :------ | :------ | :------- | :----------------- |\n> | NaughtyDOM    | 55.5 ms | 54.1 ms | 57.5 ms  | 37.8 ms            |\n> | `html2canvas` | 86.3 ms | 85.3 ms | 134.8 ms | 16.2 ms            |\n>\n> Measured over 7 alternating runs of the full home page at `resolution: 2` (2880×10036 output), Chrome 150.\n\n`liquidGL` turns any fixed or sticky-positioned element into a perfectly refracted, glossy \"glass pane\" rendered in WebGPU (with automatic fallback to WebGL).\n\n<a href=\"https://liquidgl.naughtyduk.com\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"https://raw.githubusercontent.com/naughtyduk/liquidGL/main/assets/try-it-out-npm.png\" alt=\"Try It Out\" width=\"120\"></a>\n\n<a href=\"https://liquidgl.naughtyduk.com/demos/demo-1.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>DEMO 1</strong></a> | <a href=\"https://liquidgl.naughtyduk.com/demos/demo-2.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>DEMO 2</strong></a> | <a href=\"https://liquidgl.naughtyduk.com/demos/demo-3.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>DEMO 3</strong></a> | <a href=\"https://liquidgl.naughtyduk.com/demos/demo-4.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>DEMO 4</strong></a> | <a href=\"https://liquidgl.naughtyduk.com/demos/demo-5.html\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>DEMO 5</strong></a>\n\n---\n\n## What's New\n\n**Features**\n\n- **2.2.4 - HD Glass on Mobile** — Snapshot capture is no longer hard capped by the device's screen resolution, and is instead capped by the GPU texture limit set by the browser, allowing for higher quality glass on mobile devices.\n\n- **2.2.0 - WebGPU rendering** — `liquidGL` now renders with WebGPU where available, with an automatic fallback chain of WebGPU → WebGL2 → WebGL1 → CSS `backdrop-filter`. Nothing to configure, the chain is fully automatic. Choose where the chain starts with the new `engine` option (`'auto'`, `'webgpu'`, `'webgl2'`, `'webgl'`), or test quickly via the URL parameter `?liquidGL-engine=webgl2`.\n\n- **2.2.0 - Helper GUI is now a separate file** — the dev GUI no longer ships in the main bundle. Import `liquid-gl/liquidGL-helper.js` in development to keep using `helper: true`. If the module is missing you'll get a console error and everything else works as normal.\n\n- **2.1.0 - Helper GUI** — A helper GUI is now available to adjust the liquidGL options in real-time during development, helping you to achieve the perfect aesthetic. To enable it, set `helper: true` in the options object when calling `liquidGL()`.\n\n- **Sticky positioning support** — `position: sticky` elements can now be glassified. Sticky lenses are measured every animation frame, so the glass pane tracks the element through its flowing and stuck phases, then releases with it at the end of its containing block — inside nested scroll containers as well as the main document.\n\n- **Built-in DOM snapshotter** — the `html2canvas` dependency has been replaced with an integrated rasteriser. Capture no longer depends on a third-party library.\n\n- **Chromatic aberration** — the new `aberration` option disperses the red and blue channels either side of the refraction vector, blue displaced further than red, matching the way real glass disperses shorter wavelengths more strongly. Dispersion scales with the refraction offset, so it concentrates at the bevelled edge and vanishes at the flat centre. Defaults to `0` (off).\n\n- **Configurable tilt easing** — the new `tiltEase` option sets the settle duration, in milliseconds, of the tilt on both hover-in and hover-out.\n\n---\n\n**Bug fixes**\n\n- **Refraction drift caused by ignored elements** — elements marked `data-liquid-ignore` were removed from the snapshot entirely, collapsing them out of layout and shifting every element below them. Ignored elements now retain their layout box, so the refraction stays aligned with the live page.\n\n- **Lens and content diverging during tilt** — the pane could separate from its content mid-tilt because the element was being measured while transformed. Metrics are now taken from the untilted box.\n\n- **Tilt snapping on hover** — the refraction jumped straight to its new angle on hover-in while easing on hover-out. Both directions now share a single curve and duration, and cursor movement during entry retargets the in-flight ease rather than snapping.\n\n- **Displacement while pinch-zoomed** — the pane drifted diagonally away from its element when the page was pinch-zoomed, because `visualViewport` offsets were applied twice. Offset compensation is now correctly gated.\n\n---\n\n**Performance**\n\n- Video frames are no longer re-composited or re-uploaded when neither the frame time nor the destination region has changed. Paused, ended and unmoved videos now cost nothing per frame.\n\n- The snapshot bounding box is read once per frame and shared across every lens, instead of twice per lens per frame, removing repeated forced layout from the render loop.\n\n---\n\n## Install from npm\n\n```sh\nnpm install liquid-gl\n```\n\n```js\nimport liquidGL from \"liquid-gl\";\n\nconst glassEffect = liquidGL({\n  target: \".liquidGL\",\n  snapshot: \"body\",\n});\n```\n\nOptional dev helper GUI (only needed when using `helper: true`):\n\n```js\n// Vite / modern bundlers – tree-shaken out of production builds\nif (import.meta.env.DEV) await import(\"liquid-gl/liquidGL-helper.js\");\n\n// or webpack flavour:\n// if (process.env.NODE_ENV !== \"production\") await import(\"liquid-gl/liquidGL-helper.js\");\n```\n\n> `liquidGL` renders with WebGPU (falling back automatically to WebGL2 → WebGL1) and snapshots the page with its own built-in rasteriser, so it has no runtime dependencies.\n\n---\n\n## Overview\n\n`liquidGL` recreates Apple's \"Liquid Glass\" aesthetic in the browser with an ultra-light WebGPU/WebGL shader. It turns any DOM element into a beautiful, refracting glass pane. To overcome WebGL's security limitations on reading live screen pixels, `liquidGL` uses an innovative offscreen rendering technique. This allows it to refract dynamic content like videos, text animations, and more in real-time, delivering a smooth and interactive experience.\n\n### Key Features\n\n| Feature                                | Supported | Feature                          | Supported |\n| :------------------------------------- | :-------: | :------------------------------- | :-------: |\n| WebGPU Rendering `[NEW]`               |    ✅     | Helper GUI `[NEW]`               |    ✅     |\n| Real-time Refraction (static content)  |    ✅     | Magnification Control            |    ✅     |\n| Real-time Refraction (video)           |    ✅     | Dynamic Element Support          |    ✅     |\n| Real-time Refraction (text animations) |    ✅     | GSAP-Ready Animations            |    ✅     |\n| Real-time Refraction (CSS animations)  |    ❌     | Lightweight & Performant         |    ✅     |\n| Adjustable Bevel                       |    ✅     | Seamless Scroll Sync             |    ✅     |\n| Frosted Glass Effect                   |    ✅     | Auto-Resize Handling             |    ✅     |\n| Dynamic Shadows                        |    ✅     | Auto Video Refraction            |    ✅     |\n| Specular Highlights                    |    ✅     | Animate Lenses                   |    ✅     |\n| Interactive Tilt Effect `[UPDATED]`    |    ✅     | `on.init` Callback               |    ✅     |\n| Chromatic Aberration `[NEW]`           |    ✅     | Configurable Tilt Easing `[NEW]` |    ✅     |\n\n---\n\n## Quick start\n\nSet up your HTML structure first. You will have a `target` element that will receive the glass effect, and a child element for your content (excluded from glass effect).\n\n```html\n<body>\n  <div class=\"liquidGL\">\n    <div class=\"content\">\n      <img src=\"example.svg\" alt=\"Alt Text\" />\n      <p>This example text content will appear on top of the glass.</p>\n    </div>\n  </div>\n</body>\n```\n\n> Make sure that your `target` element has a high z-index so that it sits over your page content. Any content with a higher z-index than the `target` will be excluded from the lens, i.e a modal video player that you don't want to stain the lens.\n\nNext, initialise the library with the selector for your target element.\n\n```js\nimport liquidGL from \"liquid-gl\";\n\nconst glassEffect = liquidGL({\n  engine: \"auto\", // Renderer chain: \"auto\" tries WebGPU then WebGL; force with \"webgpu\", \"webgl2\" or \"webgl\"\n  snapshot: \"body\", // The area used for refraction, <body> recommended and default\n  target: \".liquidGL\", // CSS selector for the element(s) to glass-ify\n  resolution: 2.0, // The quality of the snapshot\n  refraction: 0.01, // Base refraction strength (0–1)\n  aberration: 0, // Chromatic aberration strength (0–1). 0 = off\n  bevelDepth: 0.08, // Intensity of the edge bevel (0–1)\n  bevelWidth: 0.15, // Width of the bevel as a proportion of the element (0–1)\n  frost: 0, // Subtle blur radius in px. 0 = crystal clear\n  shadow: true, // Adds a soft drop-shadow under the pane\n  specular: true, // Animated light highlights (slightly more GPU)\n  reveal: \"fade\", // Reveal animation\n  tilt: false, // Whether tilt on hover is enabled\n  tiltFactor: 5, // If tilt is enabled, how much tilt\n  tiltEase: 400, // Tilt settle duration in ms, on hover in and out\n  magnify: 1, // Magnification of lens content\n  helper: false, // Show debug helper - note requires liquidGL-helper.js module\n  on: {\n    init(instance) {\n      // The `init` callback fires once liquidGL has taken its snapshot\n      // and rendered the first frame. It's the ideal place to hide or\n      // prepare elements for reveal animations (e.g. with GSAP, ScrollTrigger)\n      // because it ensures the content is visible to the snapshot before\n      // you hide it from the user.\n      console.log(\"liquidGL ready!\", instance);\n    },\n  },\n});\n```\n\n---\n\n## Dynamic Rendering\n\n`liquidGL` can refract dynamic content like animations in real-time. To make this work, you must \"register\" any dynamic elements that will intersect with your glass pane. This tells `liquidGL` to monitor them and update the texture when they change.\n\n> **Note:** Videos are automatically detected and do not need to be registered.\n\nRegister dynamic elements _after_ initialising `liquidGL()` but _before_ calling `liquidGL.syncWith()` (if used). You can register elements using a CSS selector string or by passing an array of DOM elements.\n\n```js\nconst glassEffect = liquidGL({\n  target: \".liquidGL\",\n});\n\nliquidGL.registerDynamic(\".my-animated-element\");\n\nconst mySplitText = SplitText.create(\".my-text\", { type: \"lines\" });\nliquidGL.registerDynamic(mySplitText.lines);\n```\n\n---\n\n## Optionally sync with Smooth Scrolling Libraries\n\n`liquidGL` includes a `syncWith()` helper to automatically integrate with popular smooth-scrolling libraries like Lenis and Locomotive Scroll. It handles the render loop synchronization for you.\n\n> Simply call `liquidGL.syncWith()` after initialising `liquidGL`.\n\nWhen installed from npm, pass your libraries in directly. Imported modules are not attached to `window`, so the helper cannot auto-detect them the way it does with browser script tags.\n\n```js\nimport liquidGL from \"liquid-gl\";\nimport Lenis from \"lenis\";\nimport gsap from \"gsap\";\nimport ScrollTrigger from \"gsap/ScrollTrigger\";\n\ngsap.registerPlugin(ScrollTrigger);\n\nconst glassEffect = liquidGL({\n  target: \".liquidGL\",\n});\n\nconst lenis = new Lenis();\n\nliquidGL.syncWith({ gsap, lenis });\n```\n\nPassing `gsap` lets `liquidGL` drive its render loop from the GSAP ticker and keep `ScrollTrigger` updating on scroll. `ScrollTrigger` is read from the `gsap` object once registered, or you can pass it explicitly as `ScrollTrigger`.\n\n| Option             | Type   | Description                                                                            |\n| ------------------ | ------ | -------------------------------------------------------------------------------------- |\n| `gsap`             | object | The `gsap` module. Enables ticker-driven rendering and `ScrollTrigger` sync.           |\n| `ScrollTrigger`    | object | Optional. Only needed if `ScrollTrigger` has not been registered on the `gsap` object. |\n| `lenis`            | object | An existing `Lenis` instance.                                                          |\n| `locomotiveScroll` | object | An existing `LocomotiveScroll` instance.                                               |\n\n> `syncWith()` must be called **after** `liquidGL()`. Passing `gsap: false` opts out of the GSAP ticker and uses a `requestAnimationFrame` loop instead.\n\n---\n\n## Parameters\n\n| Option       | Type     | Default       | Description                                                                                                                                                           |\n| ------------ | -------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `engine`     | string   | `'auto'`      | Render backend chain: `'auto'` (WebGPU → WebGL2 → WebGL1 → CSS), `'webgpu'` (WebGPU → CSS), `'webgl2'` (WebGL2 → WebGL1 → CSS) or `'webgl'` (WebGL1 → CSS).           |\n| `snapshot`   | string   | `'body'`      | CSS selector for the element to snapshot.                                                                                                                             |\n| `target`     | string   | `'.liquidGL'` | **Required.** CSS selector for the element(s) to glassify.                                                                                                            |\n| `resolution` | number   | `2.0`         | Resolution of the background snapshot (clamped 0.1–3.0). Higher is sharper but uses more memory.                                                                      |\n| `refraction` | number   | `0.01`        | Base refraction offset applied across the pane (0–1).                                                                                                                 |\n| `aberration` | number   | `0`           | Chromatic aberration strength (0–1). Scales with the refraction offset, so dispersion is strongest at the bevel. `0` disables it and skips the extra texture samples. |\n| `bevelDepth` | number   | `0.08`        | Additional refraction on the edge to simulate depth (0–1).                                                                                                            |\n| `bevelWidth` | number   | `0.15`        | Width of the bevel zone as a fraction of the shortest side (0–1).                                                                                                     |\n| `frost`      | number   | `0`           | Blur radius in pixels for a frosted look. `0` is clear.                                                                                                               |\n| `shadow`     | boolean  | `true`        | Toggles a subtle drop-shadow under the pane.                                                                                                                          |\n| `specular`   | boolean  | `true`        | Enables animated specular highlights that move with time.                                                                                                             |\n| `reveal`     | string   | `'fade'`      | Reveal animation.<br>- `'none'`: Renders immediately.<br>- `'fade'`: Smoothly fades in.                                                                               |\n| `tilt`       | boolean  | `false`       | Enables 3D tilt interaction on cursor movement.                                                                                                                       |\n| `tiltFactor` | number   | `5`           | Depth of the tilt in degrees (0–25 recommended).                                                                                                                      |\n| `tiltEase`   | number   | `400`         | Duration in ms for the tilt to settle, applied symmetrically on hover-in and hover-out. `0` applies the tilt instantly.                                               |\n| `magnify`    | number   | `1`           | Magnification factor of the lens (clamped 0.001–3.0). `1` is no magnification.                                                                                        |\n| `helper`     | boolean  | `false`       | Loads the helper GUI for live tweaking of the liquidGL options. Requires `liquid-gl/liquidGL-helper.js` to be imported; logs a console error if missing.              |\n| `on.init`    | function | `—`           | Callback that runs once the first render completes. Receives the lens instance.                                                                                       |\n\n> The `target` parameter is required; all others are optional.\n\n---\n\n## Presets\n\n| Name        | Settings                                                                                               | Purpose                                                 |\n| ----------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------- |\n| **Default** | `{ refraction: 0, bevelDepth: 0.052, bevelWidth: 0.211, frost: 2, shadow: true, specular: true }`      | Balanced default used in the demo.                      |\n| **Alien**   | `{ refraction: 0.073, bevelDepth: 0.2, bevelWidth: 0.156, frost: 2, shadow: true, specular: false }`   | Strong refraction & deep bevel for a sci-fi look.       |\n| **Pulse**   | `{ refraction: 0.03, bevelDepth: 0, bevelWidth: 0.273, frost: 0, shadow: false, specular: false }`     | Flat pane with wide bevel—great for pulsing UI effects. |\n| **Frost**   | `{ refraction: 0, bevelDepth: 0.035, bevelWidth: 0.119, frost: 0.9, shadow: true, specular: true }`    | Softly diffused, privacy-glass style.                   |\n| **Edge**    | `{ refraction: 0.047, bevelDepth: 0.136, bevelWidth: 0.076, frost: 2, shadow: true, specular: false }` | Thin bevel and bright rim highlights.                   |\n\n---\n\n## FAQ\n\n| Question                                                                 | Answer                                                                                                                                                                                                                                                                                                                                                                                                         |\n| :----------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Is there a resize handler?                                               | Yes resize is handled in the library and debounced to 250ms for performance.                                                                                                                                                                                                                                                                                                                                   |\n| Does the effect work on mobile?                                          | Yes the library uses WebGPU where available, falls back through WebGL2 and WebGL1, and provides a frosted CSS `backdrop-filter` as a backup for older devices.                                                                                                                                                                                                                                                 |\n| I have a preloader, how should I initialise `liquidGL()`?                | Add the `data-liquid-ignore` attribute to your preloader's top-level container to exclude it from the snapshot. You can then call `liquidGL()` inside a `DOMContentLoaded` listener as you normally would.                                                                                                                                                                                                     |\n| What is the correct way to use `liquidGL` with page animations?          | Lets say you have a preloader, above the fold intro animations and scroll animations on your page. You would:<br><br>1) set the `data-liquid-ignore` attribute on your preloader<br>2) animate your preloader and set up your initial animation states<br>3) then call `liquidGL();`<br>4) optionally, in the `on.init();` callback, you can run post snapshot scripts, such as animating the `target` element |\n| Can I use `liquidGL` on multiple elements?                               | Yes, any element which has the class declared as your `target` will be glassified. Note **all elements must use the same `z-index`** due to shared canvas optimisations, if you use different `z-index` values for multiple targets, the highest value will be used by `liquidGL`.                                                                                                                             |\n| Will the library exceed WebGL contexts or have other performance issues? | No, the library uses a shared canvas for all instances, we have tested up to 30 elements on one page and we were not able to cause performance problems or crashes.                                                                                                                                                                                                                                            |\n| Are there any animation limitations?                                     | It depends on what you're trying to do, rotation and scale are expensive CPU/GPU processes, additionally `shadow` `specular` and `tilt` should be used with care when you have lots of instances or complex animations as they can clog the render pipeline.                                                                                                                                                   |\n\n---\n\n## Important Notes\n\n- For dynamic content to be refracted in real-time, you must register the element(s) with `liquidGL.registerDynamic()`. It is crucial to set the initial state of your animations **before** calling `liquidGL()` to ensure they are captured correctly.\n- The library ignores `fixed` position elements, this is to prevent a known snapshotting bug on mobile browsers from surfacing which can prevent the snapshot from running. This is a safety net that shouldn't interfere with your use of the library.\n- You can have multiple instances on one page **but they must share the same `z-index` value**. If you specify different `z-index` values, `liquidGL` will use the highest `z-index` for all elements with the `target` selector. This is because the effect uses a shared canvas to prevent WebGL context issues, there is no work around to this unfortunately.\n- To improve performance on complex pages, you can snapshot a smaller, specific element like a background container instead of the whole page. Use the `snapshot` option with a CSS selector (e.g., `snapshot: '.my-background'`). This reduces texture memory and improves performance.\n- The initial capture is asynchronous. Call `liquidGL()` inside a `DOMContentLoaded` or `load` handler to ensure content is available to the snapshot.\n- Extremely long documents can exceed GPU texture limits, causing memory or performance issues. Consider segmenting very long pages (see source) or reducing the `resolution` parameter.\n- The `shadow` and `tilt` effects create new stacking layers behind the `target` element. The `shadow` is placed at `z-index - 2` and the `tilt` helper canvas is placed at `z-index - 1`. Ensure your `z-index` values leave room for these layers to prevent clipping or overflow issues.\n- As with all WebGL effects, any **image** content inside the `target` element must have permissive `Access-Control-Allow-Origin` headers set to prevent CORS issues.\n\n---\n\n## Browser Support\n\nThe `liquidGL` library is compatible with all WebGL enabled browsers on desktop, tablet and mobile devices.\n\n> [!NOTE]  \n> Performance varies between browsers, specifically Safari can be unstable when the liquid element(s) are more than 50% of the viewport width or height. Practical use issues are rare, but make sure to test on your target devices thoroughly.\n\n| Browser        | Supported |\n| :------------- | :-------: |\n| Google Chrome  |    Yes    |\n| Safari         |    Yes    |\n| Firefox        |    Yes    |\n| Microsoft Edge |    Yes    |\n\n---\n\n## Other\n\n**Exclude elements**\n\n> You can set elements to be ignored by the refraction using `data-liquid-ignore`. Add this attribute on the parent container of the element you wish to exclude.\n\n**Content Visibility**\n\n> It is recommended to use `z-index: 3;` on the content inside your target element to make it sit on top of the lens. You can also combine this with `mix-blend-mode: difference;` for better legibility.\n\n**Border-radius**\n\n> `liquidGL` automatically inherits the `border-radius` of the `target` element, ensuring the refraction respects rounded corners without any extra configuration. If you animate the `border-radius` of your `target` element i.e on scroll, the bevel will animate in real time to remain in sync.\n\n---\n\n## Contributors\n\nThank you to the following people for their contributions to `liquidGL`.\n\n<table>\n  <tr>\n    <td align=\"center\" width=\"140\">\n      <a href=\"https://github.com/codedgar\">\n        <img src=\"https://github.com/codedgar.png?size=100\" width=\"100\" height=\"100\" alt=\"Edgar Pérez\" /><br />\n        <sub><b>Edgar Pérez</b></sub><br />\n        <sub>@codedgar</sub>\n      </a>\n    </td>\n    <td align=\"center\" width=\"140\">\n      <a href=\"https://github.com/AbhinavRobinson\">\n        <img src=\"https://github.com/AbhinavRobinson.png?size=100\" width=\"100\" height=\"100\" alt=\"Abhinav Robinson\" /><br />\n        <sub><b>Abhinav Robinson</b></sub><br />\n        <sub>@AbhinavRobinson</sub>\n      </a>\n    </td>\n  </tr>\n</table>\n\n---\n\n## License\n\nMIT © NaughtyDuk\n","readmeFilename":"README.md"}