@blameitonyourisp/blurrid
Version:
Generate and render blurred placeholders for lazy loaded images.
5 lines (4 loc) • 21.7 kB
JavaScript
!function(){let e;function t(e){return e&&e.__esModule?e.default:e}var r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},i={},a={},s=r.parcelRequire97b5;null==s&&((s=function(e){if(e in i)return i[e].exports;if(e in a){var t=a[e];delete a[e];var r={id:e,exports:{}};return i[e]=r,t.call(r.exports,r,r.exports),r.exports}var s=Error("Cannot find module '"+e+"'");throw s.code="MODULE_NOT_FOUND",s}).register=function(e,t){a[e]=t},r.parcelRequire97b5=s),s.register;class n extends Error{constructor(e){super();let t="";for(let r in e)switch(r){case"name":this.name=e[r];break;case"message":t=`${e[r]}
${t}`;break;default:{let i=`${r}: ${e[r]}`;t=`${t}${l(i,"gray",1)}
`}}this.message=t||""}}let o=(e,{modifiers:t=[],tabs:r=0,tabSize:i=4}={})=>{let a="";for(let e of t)a=`${a}${e}`;let s=h.decorations.reset,n=" ".repeat(r*i);return`${a}${n}${e}${s}`},l=(e,t,r=0)=>{let i=h.fgColors[t];return i?o(e,{modifiers:[i],tabs:r}):o(e,{tabs:r})},h={fgColors:{black:"\x1b[30m",red:"\x1b[31m",green:"\x1b[32m",yellow:"\x1b[33m",blue:"\x1b[34m",magenta:"\x1b[35m",cyan:"\x1b[36m",white:"\x1b[37m",gray:"\x1b[90m"},decorations:{reset:"\x1b[0m",bright:"\x1b[1m",dim:"\x1b[2m",underline:"\x1b[4m",blink:"\x1b[5m",reverse:"\x1b[7m",hidden:"\x1b[8m"}},d=e=>{let t=e.map(e=>u(e)),r=t[0].length,i=Array.from({length:t.length*r}).fill(0);for(let[e,a]of t.entries()){if(a.length!==r)throw new n({name:"ChannelError",message:"Sample channels not of same length","default-length":r,"channel-length":a.length});for(let[r,s]of a.entries())i[t.length*r+e]=s}return i},u=e=>{let t=e[0].length,r=[];for(let i of e){if(i.length!==t)throw new n({name:"ChannelError",message:"Channel row width does not match sample width","sample-width":length,"row-width":i.length});r.push(...i)}return r};class f{#e;#t;constructor({image:e,sample:t}){this.#e=e,this.#t={...t,max:Math.max(t.width,t.height)}}resize(e){this.#e.height=Math.round(this.#e.height*e/this.#e.width),this.#e.width=e}get image(){return this.#e}get sample(){return this.#t}}class c{#r;#i;#a;#s;#n;constructor({length:e=16,size:t=Math.floor(6*e/8),buffer:r=new ArrayBuffer(t)}={}){this.#r=r,this.#i=0,this.#a=0,this.#s=0,this.#n=0}write(e,{size:t=c.#o(e),offset:r=this.#s,signed:i=!1}={}){return this.#l().append(e,{size:t,offset:r,signed:i}).isWriteable?this.#h(e,{size:t,offset:r,signed:i}):NaN}writeAbsolute(e,{offset:t=this.#s,signed:r=!1}={}){let i={value:c.#o(e),size:5};return this.#l().append(i.value,{...i,offset:t}).append(e,{signed:r}).isWriteable?(this.#h(i.value,{...i,offset:t}),this.#h(e,{signed:r})):NaN}writeRelative(e,{offset:t=this.#s,signed:r=!1}={}){0===e&&(e=1);let i=c.#o(e)-this.#n,a={value:i>0?1<<i>>>0:0,size:Math.abs(i)+1};return this.#l().append(a.value,{...a,offset:t}).append(e,{signed:r}).isWriteable?(this.#h(a.value,{...a,offset:t}),this.#h(e,{signed:r})):NaN}writeString(e,{offset:t=this.#s}={}){let r={value:c.#o(e.length),size:5},i=this.#l().append(r.value,{...r}).append(e.length);for(let t=0;t<e.length;t++)i=i.append(0,{size:8});if(!i.isWriteable)return"";for(let i of(this.#h(r.value,{...r,offset:t}),this.#h(e.length),e))this.#h(i.charCodeAt(0),{size:8});return e}read(e,{offset:t=this.#i,signed:r=!1}={}){return this.#d().append(e,{offset:t,signed:r}).isReadable?this.#u(e,{offset:t,signed:r}):NaN}readAbsolute({offset:e=this.#i,signed:t=!1}={}){let r=this.#i,i=this.#a,a=this.#d().append(5,{offset:e}),s=0;return(a.isReadable&&(s=this.#u(5,{offset:e}),a.append(s,{signed:t})),a.isReadable&&s)?this.#u(s,{signed:t}):(this.#i=r,this.#a=i,NaN)}readRelative({offset:e=this.#i,signed:t=!1}={}){let r=this.#i,i=this.#a,a=1,s=this.#d().append(1,{offset:e});s.isReadable&&(a=this.#u(1,{offset:e})?1:-1);let n=0;for(;s.append(1).isReadable&&!this.#u(1);)n++;let o=i+a*n;return(s.append(o,{signed:t}),s.isReadable&&o)?(this.#i--,this.#u(o,{signed:t})):(this.#i=r,this.#a=i,NaN)}readString({offset:e=this.#i}={}){let t=this.#i,r=this.#a,i=this.#d().append(5,{offset:e}),a=0;i.isReadable&&(a=this.#u(5,{offset:e})),i.append(a);let s=0;if(i.isReadable&&(s=this.#u(a)),!i.isReadable||!s)return this.#i=t,this.#a=r,"";let n="";for(let e=0;e<s;e++){if(i.append(8),!i.isReadable)return this.#i=t,this.#a=r,"";n+=String.fromCharCode(this.#u(8))}return n}copy({target:e,targetStart:t=e?.writePointer||0,sourceStart:r=0,sourceEnd:i=this.bitLength}={}){if(r<0||i>this.bitLength)throw new n({name:"BitBufferError",message:"Requested bits out of source buffer range","source-start":r,"source-end":i,"source-bit-length":this.bitLength});let a=i-r,s=(e??=new c({size:Math.ceil((a+t)/8)})).bitLength-t;if(a>s)throw new n({name:"BitBufferError",message:"Source bits exceed bits available in target buffer","source-bits":a,"target-bits":s});for(let i=0;i<a;i++)e.write(this.#u(1,{offset:r+i}),{size:1,offset:t+i});return e}toString(){let e="",t=0,r=0,i=new Uint8Array(this.#r);for(let a=0;a<3*Math.ceil(this.byteLength/3);a++)r=(r|(i[a]||0)<<16-8*t)>>>0,(t=++t%3)||(e+=c.#f(r),r=0);return e}#l(){let e={writeable:!0,offset:this.#s},t=(r,{size:i=c.#o(r),offset:a=e.offset,signed:s=!1}={})=>{if(e.writeable){let t=Math.abs(r),n=this.bitLength-a;e.writeable=(!!s||!(r<0))&&!(c.#o(t)>i)&&!!Number.isInteger(t)&&!(i<0)&&!(i>32)&&!(i+(s?1:0)>n)}return e.offset+=i,{append:t,get isWriteable(){return e.writeable}}};return{append:t,get isWriteable(){return e.writeable}}}#h(e,{size:t=c.#o(e),offset:r=this.#s,signed:i=!1}={}){let a=Math.abs(e),{view:s,byteLength:n,subBit:o}=this.#c(t,r);for(let e=0;e<n;e++){let r=s.getUint8(e),i=0;for(let s=0;s<8;s++){let n=8*e+s;i|=(n<o||n>o+t?r<<24+s>>>31:a<<32-t+(n-o)>>>31)<<7-s}s.setUint8(e,i)}return this.#s=r+t,i&&this.#h(e>=0?1:0,{size:1}),this.#n=t,e}#d(){let e={readable:!0,offset:this.#i},t=(r,{offset:i=e.offset,signed:a=!1}={})=>{if(e.readable){let t=this.bitLength-i;e.readable=!(r<0)&&!(r>32)&&!(r+(a?1:0)>t)}return e.offset+=r,{append:t,get isReadable(){return e.readable}}};return{append:t,get isReadable(){return e.readable}}}#u(e,{offset:t=this.#i,signed:r=!1}={}){let{view:i,byteLength:a,subBit:s}=this.#c(e,t),n=0;for(let e=0;e<a;e++){let t=24+s-8*e;n=t>=0?(n|i.getUint8(e)<<t)>>>0:(n|i.getUint8(e)>>>-t)>>>0}this.#i=t+e;let o=r&&0===this.#u(1)?-1:1;return this.#a=e,o*(n>>>32-e)}#c(e,t){let r=Math.floor(t/8),i=t-8*r,a=Math.ceil((i+e)/8);return this.byteLength,{view:new DataView(this.#r,r,a),byteLength:a,subBit:i}}get bitLength(){return this.byteLength<<3}get byteLength(){return this.#r.byteLength}get readPointer(){return this.#i}set readPointer(e){e<0||e>this.bitLength||(this.#i=e)}get lastReadSize(){return this.#a}set lastReadSize(e){e<0||e>32||(this.#a=e)}get writePointer(){return this.#s}set writePointer(e){e<0||e>this.bitLength||(this.#s=e)}get lastWriteSize(){return this.#n}set lastWriteSize(e){e<0||e>32||(this.#n=e)}static from(e){if(!e.match(/^[A-Za-z0-9\-_]*$/))throw new n({name:"BitBufferError",message:"Encoded string is not url-safe base 64 encoded","encoded-string":e});let t=new c({size:Math.ceil(3*e.length/4)});for(let r of e.match(/[A-Za-z0-9\-_]{1,4}/g)||[]){let e=c.#m(r.padEnd(4,"A"));t.write(e,{size:24})}return t.writePointer=0,t.readPointer=0,t}static #m(e){let t=0;for(let[r,i]of e.split("").entries())t=(t|c.#g.indexOf(i)<<18-6*r)>>>0;return t}static #f(e){let t="";for(let r=0;r<4;r++){let i=e>>>18-6*r<<26>>>26;t+=c.#g[i]}return t}static #o(e){return Math.abs(e).toString(2).length}static get #g(){return"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"}}class m{#b=[];#p=new Map;#w;#v;constructor(e,{limit:t=4}={}){this.#w=e,this.#v=t}addWorker(){let e=this.#w();return this.#p.set(e,NaN),e}postWorker(e,t,r){this.#p.set(e,NaN),e.onmessage=t=>{this.#A(e),r(t)},e.postMessage(t)}enqueue(e,t){let r;for(let[e,t]of this.#p)if(t){r=e;break}r?this.postWorker(r,e,t):this.#p.size<this.#v?(r=this.addWorker(),this.postWorker(r,e,t)):this.#b.push({message:e,callback:t})}#A(e){let{message:t,callback:r}=this.#b.shift()||{};t&&r?this.postWorker(e,t,r):(this.#p.set(e,Date.now()),setTimeout(()=>{let t=this.#p.get(e);Date.now()-t>1e3&&(e.terminate(),this.#p.delete(e))},1050))}}class g{#y;#L;#R;#S;constructor(e){let{luma:t,chromaBlue:r,chromaRed:i}=e.match(/^(?<luma>[0-7]):(?<chromaBlue>[0-7]):(?<chromaRed>[0-7])$/)?.groups||{};if(!t||!r||!i)throw new n({name:"SubsamplingError",message:'Must be of form "x:y:z", digits from 0-7 inclusive',"subsampling-string":e});this.#y=parseInt(t),this.#L=parseInt(r),this.#R=parseInt(i),this.#S=this.#y+this.#L+this.#R}key(e){let t=e%this.#S;return t<this.#y?"luma":t<this.#y+this.#L?"chromaBlue":"chromaRed"}get luma(){return this.#y}get chromaBlue(){return this.#L}get chromaRed(){return this.#R}}function*b(e,t){let r=Array.from(Array.from({length:e}),()=>Array.from({length:t}).fill(0)),[i,a]=[0,0];for(;;)if(r[i][a]=yield r,0===a||i===e-1){let r=i+a+1;if(r>e+t-1)break;i=r-(a=i>=t-1?t-1:i+1)}else a--,i++}let p=(e,t=0,r=255,i=!0)=>(i&&(e=Math.round(e),t=Math.ceil(t),r=Math.floor(r)),Math.max(t,Math.min(r,e))),w=(e,t,r)=>(e=p(e),t=p(t),r=p(r),t-=128,{red:p(e+1.4*(r-=128)),green:p(e-.34*t-.71*r),blue:p(e+1.77*t)}),v=(e,t=255)=>{let r=[];for(let i=0;i<e.length;i+=3){let{red:a,green:s,blue:n}=w(e[i],e[i+1],e[i+2]);r.push(a,s,n,t)}return r},A=(e,t)=>{let[r,i,a]=e,s=()=>Array.from(Array.from({length:t.image.height}),()=>Array.from({length:t.image.width}).fill(0)),n=[s(),s(),s()],[o,l,h]=n;for(let e=0;e<t.image.height;e++)for(let s=0;s<t.image.width;s++){let n={x:s/t.image.width*t.sample.width,y:e/t.image.height*t.sample.height};o[e][s]=y(r,n,t),l[e][s]=y(i,n,t),h[e][s]=y(a,n,t)}return n},y=(e,t,r)=>{let i=[];for(let a=0;a<r.sample.width;a++){let r=e[a];i.push(R(r,t.y))}return R(i,t.x)},L=e=>{for(;e>=2*Math.PI;)e-=2*Math.PI;return(e>Math.PI&&(e=2*Math.PI-e),e>Math.PI/2)?5*(e=(e-Math.PI)*(e-Math.PI))/(e+Math.PI*Math.PI)-1:1-5*(e*=e)/(e+Math.PI*Math.PI)},R=(e,t)=>{let r=0;for(let i=0;i<e.length;i++){let a=e[i]*L((2*t+1)*Math.PI*i/(2*e.length));a*=0===i?Math.SQRT1_2:1,r+=a}return r*=Math.sqrt(2/e.length),r=Math.round(r)};class S{#P;#r;#M;#x;constructor(e){if(!e.match(/^[A-Za-z0-9\-_]{16,}$/))throw new n({name:"BlurridDecoderError",message:"String minimum 16 url-safe base 64 encoded chars","serialized-dct":e});this.#P=e,this.#r=c.from(e),this.#M=new f(this.#_()),this.#x=this.#E()}toImageData(){let{luma:e,chromaBlue:t,chromaRed:r}=this.#x;return v(d(A([e,t,r],this.#M)))}#_(){return this.#r.readPointer=0,{image:{width:this.#r.read(16),height:this.#r.read(16)},sample:{width:this.#r.read(8),height:this.#r.read(8)}}}#z(){this.#r.readPointer=48;let e=this.#r.read(3),t=this.#r.read(3),r=this.#r.read(3);return new g(`${e}:${t}:${r}`)}#E(){let e=this.#I(),[t,r,i]=e.next().value;for(this.#r.readPointer=57,this.#r.lastReadSize=8;;){let a=this.#r.readRelative({signed:!0});if(isNaN(a))break;[t,r,i]=e.next(a).value}return{luma:t,chromaBlue:r,chromaRed:i}}#I(){return function*(e,t,r){let i={luma:b(e,t),chromaBlue:b(e,t),chromaRed:b(e,t)},a=[i.luma.next().value,i.chromaBlue.next().value,i.chromaRed.next().value],s=0;do{let e=yield a,t=r.key(s),n=i[t].next(e);if(n.done)break;"luma"===t?a[0]=n.value:"chromaBlue"===t?a[1]=n.value:a[2]=n.value}while(++s)}(this.#M.sample.width,this.#M.sample.height,this.#z())}get serializedDct(){return this.#P}get metadata(){return this.#M}get coefficients(){return this.#x}}var P={};P="#define GLSLIFY 1\nattribute vec4 a_position;\n\nvoid main() {\n gl_Position = a_position;\n}\n";var M={};M="precision mediump float;\n#define GLSLIFY 1\n\nuniform vec4 u_color;\nuniform float u_image_width;\nuniform float u_image_height;\n\nuniform float u_lumaDct[{{SAMPLE_NORMALIZED_TOTAL}}];\nuniform float u_chromaBlueDct[{{SAMPLE_NORMALIZED_TOTAL}}];\nuniform float u_chromaRedDct[{{SAMPLE_NORMALIZED_TOTAL}}];\n\nfloat kFactor(int x) {\n if (x == 0) { return 0.7071; }\n else { return 1.0; }\n}\n\nfloat decode1D(float array1D[{{SAMPLE_MAX}}], float point, int samples) {\n float float_samples = float(samples);\n\n float result = 0.0;\n\n for (int i = 0; i < {{SAMPLE_MAX}}; i ++) {\n if (float(array1D[i]) == 0.0 || i >= samples) { break; }\n\n float partial = float(array1D[i]) * cos(\n ((2.0 * point + 1.0) * 3.14 * float(i)) / (2.0 * float_samples)\n );\n\n partial *= kFactor(i);\n result += partial;\n }\n\n result *= sqrt(2.0 / float_samples);\n\n return result;\n}\n\nfloat decode2D(float array2D[{{SAMPLE_NORMALIZED_TOTAL}}], vec2 uv) {\n float row[{{SAMPLE_MAX}}];\n\n float x = uv.x * {{SAMPLE_WIDTH}}.0;\n float y = (1.0 - uv.y) * {{SAMPLE_HEIGHT}}.0;\n\n for (int i = 0; i < {{SAMPLE_MAX}}; i ++) {\n float column[{{SAMPLE_MAX}}];\n for (int j = 0; j < {{SAMPLE_MAX}}; j ++) {\n column[j] = array2D[i * {{SAMPLE_MAX}} + j];\n }\n row[i] = decode1D(column, y, {{SAMPLE_HEIGHT}});\n }\n\n float result = decode1D(row, x, {{SAMPLE_WIDTH}});\n\n return result;\n}\n\nvec4 yCbCrToRgb(float luma, float chromaBlue, float chromaRed) {\n //\n float red = luma + 1.40 * (chromaRed - 128.0);\n float green = luma - 0.34 * (chromaBlue - 128.0) - 0.71 * (chromaRed - 128.0);\n float blue = luma + 1.77 * (chromaBlue - 128.0);\n\n //\n red = floor(clamp(red, 0.0, 255.0) + 0.5) / 255.0;\n green = floor(clamp(green, 0.0, 255.0) + 0.5) / 255.0;\n blue = floor(clamp(blue, 0.0, 255.0) + 0.5) / 255.0;\n\n return vec4(red, green, blue, 1.0);\n}\n\nvoid main() {\n //\n vec2 uv = gl_FragCoord.xy;\n uv.x /= u_image_width;\n uv.y /= u_image_height;\n\n //\n gl_FragColor = yCbCrToRgb(\n decode2D(u_lumaDct, uv),\n decode2D(u_chromaBlueDct, uv),\n decode2D(u_chromaRedDct, uv)\n );\n}\n";let x=e=>{let r=document.createElement("canvas");r.width=e.image.width,r.height=e.image.height;let i=r.getContext("webgl"),a={vertex:z(i,i.VERTEX_SHADER,t(P)),fragment:z(i,i.FRAGMENT_SHADER,t(M),{SAMPLE_WIDTH:e.sample.width,SAMPLE_HEIGHT:e.sample.height,SAMPLE_MAX:e.sample.max,SAMPLE_NORMALIZED_TOTAL:e.sample.max**2})},s=E(i,a),n={index:i.getAttribLocation(s,"a_position"),size:2,type:i.FLOAT,normalize:!1,stride:0,offset:0},o=i.createBuffer();i.bindBuffer(i.ARRAY_BUFFER,o),i.bufferData(i.ARRAY_BUFFER,new Float32Array([-1,1,1,1,1,-1,1,-1,-1,-1,-1,1]),i.STATIC_DRAW),i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT),i.useProgram(s),i.enableVertexAttribArray(n.index);let{index:l,size:h,type:d,normalize:u,stride:f,offset:c}=n;return i.vertexAttribPointer(l,h,d,u,f,c),{canvas:r,context:i,program:s}},_=e=>{let t=document.createElement("canvas");t.width=e.image.width,t.height=e.image.height;let r=t.getContext("2d");return{canvas:t,context:r}},E=(e,t)=>{let r=e.createProgram();return e.attachShader(r,t.vertex),e.attachShader(r,t.fragment),e.linkProgram(r),e.getProgramParameter(r,e.LINK_STATUS)||(console.warn(e.getProgramInfoLog(r)),e.deleteProgram(r)),r},z=(e,t,r,i={})=>{for(let e in i){let t=RegExp(`{{${e}}}`,"g");r=r.replaceAll(t,`${i[e]}`)}let a=e.createShader(t);return e.shaderSource(a,r),e.compileShader(a),e.getShaderParameter(a,e.COMPILE_STATUS)||(console.warn(e.getShaderInfoLog(a)),e.deleteShader(a)),a},I=e=>{let{metadata:t,coefficients:r}=e,{canvas:i,context:a,program:s}=x(t),n={u_color:{type:"uniform4fv",data:[1,0,0,1]},u_image_width:{type:"uniform1f",data:t.image.width},u_image_height:{type:"uniform1f",data:t.image.height},u_lumaDct:{type:"uniform1fv",data:k(r.luma,t)},u_chromaBlueDct:{type:"uniform1fv",data:k(r.chromaBlue,t)},u_chromaRedDct:{type:"uniform1fv",data:k(r.chromaRed,t)}};for(let e in n){let t=a.getUniformLocation(s,e);a[n[e].type](t,n[e].data)}let{primitiveType:o,offset:l,count:h}={primitiveType:a.TRIANGLES,offset:0,count:6};return a.drawArrays(o,l,h),i.toDataURL()},k=(e,t)=>{let r=t.sample.max;return Array.from({length:r**2},(t,i)=>e.flatMap(e=>Array.from({length:r},(t,r)=>e[r]||0))[i]||0)},D=(e,t,r)=>new Promise(i=>{let a=document.createElement("img"),s=()=>{let{width:t,height:r}=e.canvas;e.context.drawImage(a,0,0,t,r),a.removeEventListener("load",s),a.remove(),i(e.canvas.toDataURL())};a.addEventListener("load",s),r.metadata.resize(t.width);let{canvas:n,context:o}=_(r.metadata);o.putImageData(t,0,0),a.src=n.toDataURL()});var B={},T={};T=function(e,t,r){if(t===self.location.origin)return e;var i=r?"import "+JSON.stringify(e)+";":"importScripts("+JSON.stringify(e)+");";return URL.createObjectURL(new Blob([i],{type:"application/javascript"}))};var W=s("6yZRJ");let N=W.getBundleURL("eRVXn")+"worker.234ccd80.js";B=T(N,W.getOrigin(N),!1);let C=()=>new Worker(B);class O extends HTMLImageElement{decoder=new S(this.dataset.blurrid||"A".repeat(10));constructor(){super();let e=()=>{this.removeEventListener("load",e),this.blur(),"onclick"===this.dataset.loading?this.loadOnClick():"lazy"===this.dataset.loading?this.loadOnIntersection():this.loadImage()};this.addEventListener("load",e),this.#k&&this.decoder.metadata.resize(this.#k);let{canvas:t}=_(this.decoder.metadata);this.src=t.toDataURL()}blur(){let e=this.decoder.metadata.sample.max;!window.WebGLRenderingContext||e>16?this.dataset.loading="eager":this.src=I(this.decoder)}loadImage(){let e=document.createElement("img");for(let t of this.attributes){let{name:r,value:i}=t;this.#D.includes(r)||e.setAttribute(r,i)}let t=()=>{e.removeEventListener("load",t);let{width:r,height:i}=this.getBoundingClientRect();e.style.width=`${r}px`,e.style.height=`${i}px`;let a=[{opacity:1},{opacity:0}],s={easing:"ease-out",duration:500},n=e.cloneNode();n.style.opacity="0",n.style.position="absolute",this.before(n),this.animate(a,s),n.animate(a,{...s,direction:"reverse"}).addEventListener("finish",()=>{this.replaceWith(e),n.remove()})};e.addEventListener("load",t),this.dataset.srcset&&e.setAttribute("srcset",this.dataset.srcset),e.setAttribute("src",this.dataset.src||"")}loadOnClick(){let e=()=>{this.removeEventListener("click",e),this.loadImage()};this.addEventListener("click",e)}loadOnIntersection(){let e=new IntersectionObserver(t=>{t[0].isIntersecting&&(e.disconnect(),this.loadImage())},{threshold:.5});e.observe(this)}get #k(){let e;if(this.dataset.size)return parseInt(this.dataset.size);if(!this.sizes||!this.dataset.srcset)return;let t={sizes:/(?<query>\(.*\))[\s\n]*(?<width>\d*)(?<unit>px|vw),/g,sizesFallback:/(?<width>\d*)(?<unit>px|vw)[\s\n]*$/,srcset:/[\s\n](?<srcsetWidth>\d*)w,?/g};for(let r of this.sizes.matchAll(t.sizes)){let{query:t,width:i,unit:a}=r?.groups||{};if(matchMedia(t).matches){e={width:i,unit:a};break}}if(!e){let{width:r,unit:i}=this.sizes.match(t.sizesFallback)?.groups||{};e={width:r,unit:i}}let r=e?.unit==="vw"?parseInt(e?.width||"0")/100*window.innerWidth:parseInt(e?.width||"0");for(let e of this.dataset.srcset.matchAll(t.srcset)){let{srcsetWidth:t}=e?.groups||{};if(parseInt(t)>=r)return parseInt(t)}}get #D(){return["is","src","data-src","data-srcset","data-loading","data-blurrid","data-worker-start","data-worker-steps"]}}class $ extends O{#B=parseInt(this.dataset.workerStart||"16");#T=parseInt(this.dataset.workerSteps||"2");constructor(){super()}blur(){let t=this.decoder.metadata.sample.max;if(!window.WebGLRenderingContext||t>16){e||(e=new m(C));let t=_(this.decoder.metadata);this.stepWorker(t.canvas.toDataURL(),t)}else this.src=I(this.decoder)}stepWorker(t,r,i){if(this.src=t,(i??=this.#B)<this.#B*2**this.#T){let t={serializedDct:this.decoder.serializedDct,width:2*i};e?.enqueue(t,e=>{let{imageData:t,imageData:{width:i}}=e.data;D(r,t,this.decoder).then(e=>{this.stepWorker(e,r,i)})})}}}let U=(e,t,r=[])=>{let i=document.createElementNS("http://www.w3.org/2000/svg",e);return Object.keys(t).forEach(e=>{i.setAttribute(e,String(t[e]))}),r.length&&r.forEach(e=>{let t=U(...e);i.appendChild(t)}),i};var F=([e,t,r])=>U(e,t,r);let j=e=>Array.from(e.attributes).reduce((e,t)=>(e[t.name]=t.value,e),{}),H=e=>"string"==typeof e?e:e&&e.class?e.class&&"string"==typeof e.class?e.class.split(" "):e.class&&Array.isArray(e.class)?e.class:"":"",q=e=>e.flatMap(H).map(e=>e.trim()).filter(Boolean).filter((e,t,r)=>r.indexOf(e)===t).join(" "),X=e=>e.replace(/(\w)(\w*)(_|-|\s*)/g,(e,t,r)=>t.toUpperCase()+r.toLowerCase()),G=(e,{nameAttr:t,icons:r,attrs:i})=>{let a=e.getAttribute(t);if(null==a)return;let s=r[X(a)];if(!s)return console.warn(`${e.outerHTML} icon name was not found in the provided icons object.`);let n=j(e),[o,l,h]=s,d={...l,"data-lucide":a,...i,...n},u=q(["lucide",`lucide-${a}`,n,i]);u&&Object.assign(d,{class:u});let f=F([o,d,h]);return e.parentNode?.replaceChild(f,e)};(({icons:e={},nameAttr:t="data-lucide",attrs:r={}}={})=>{if(!Object.values(e).length)throw Error("Please provide an icons object.\nIf you want to use all the icons you can import it like:\n `import { createIcons, icons } from 'lucide';\nlucide.createIcons({icons});`");if("undefined"==typeof document)throw Error("`createIcons()` only works in a browser environment.");if(Array.from(document.querySelectorAll(`[${t}]`)).forEach(i=>G(i,{nameAttr:t,icons:e,attrs:r})),"data-lucide"===t){let t=document.querySelectorAll("[icon-name]");t.length>0&&(console.warn("[Lucide] Some icons were found with the now deprecated icon-name attribute. These will still be replaced for backwards compatibility, but will no longer be supported in v1.0 and you should switch to data-lucide"),Array.from(t).forEach(t=>G(t,{nameAttr:"icon-name",icons:e,attrs:r})))}})({icons:{Info:["svg",{xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"},[["circle",{cx:"12",cy:"12",r:"10"}],["path",{d:"M12 16v-4"}],["path",{d:"M12 8h.01"}]]]}}),customElements.define("blurrid-image",$,{extends:"img"})}();
//# sourceMappingURL=index.3c1c5c61.js.map