@johnfmorton/some-shade 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [Unreleased]
4
+
5
+ ## [1.2.0] - 2026-04-16
6
+
7
+ ### Changed
8
+
9
+ - Render at display size instead of full natural resolution — a 4000 px image shown at 800 CSS px now renders at ≤1600 px (at 2× DPR) instead of 8000 px
10
+ - Replace PNG blob round-trip with direct canvas copy (`drawImage`) — eliminates PNG encoding and decoding overhead entirely
11
+
3
12
  ## 1.1.0 - 2026-03-01
4
13
 
5
14
  - Add `reference-width` attribute (default 1024) — normalizes `u_gridSize` and `u_dotRadius` by source image width so the dot pattern looks visually consistent regardless of image resolution
@@ -69,3 +78,5 @@
69
78
  - WebGL fallback to plain `<img>` when unavailable
70
79
  - React playground with live controls and code export
71
80
  - GitHub Pages deployment for playground
81
+
82
+ [1.2.0]: https://github.com/johnfmorton/some-shade-web-component/releases/tag/v1.2.0
package/dist/index.d.ts CHANGED
@@ -44,10 +44,8 @@ export declare class SomeShadeImage extends LitElement {
44
44
  coolColor: string;
45
45
  blendMode: number;
46
46
  referenceWidth: number;
47
- loadingBlur: number;
48
47
  private _webglAvailable;
49
- private _snapshotUrl;
50
- private _snapshotLoaded;
48
+ private _snapshotReady;
51
49
  private _image;
52
50
  private _observer;
53
51
  private _visible;
@@ -59,11 +57,9 @@ export declare class SomeShadeImage extends LitElement {
59
57
  private _loadImage;
60
58
  private _scheduleRender;
61
59
  private _renderEffect;
62
- private _onSnapshotLoad;
63
60
  /** Hide the rendered snapshot momentarily, then fade it back in.
64
61
  * Useful for previewing the loading-blur transition. */
65
62
  replayTransition(delay?: number): void;
66
- private _revokeSnapshot;
67
63
  private _getUniformValues;
68
64
  private _parseHexColor;
69
65
  }
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("lit"),s=require("lit/decorators.js");function U(e){return e.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0})}function S(e,o,a){const t=e.createShader(o);if(!t)throw new Error("Failed to create shader");if(e.shaderSource(t,a),e.compileShader(t),!e.getShaderParameter(t,e.COMPILE_STATUS)){const u=e.getShaderInfoLog(t);throw e.deleteShader(t),new Error(`Shader compile error: ${u}`)}return t}function K(e,o,a){const t=S(e,e.VERTEX_SHADER,o),u=S(e,e.FRAGMENT_SHADER,a),n=e.createProgram();if(!n)throw new Error("Failed to create program");if(e.attachShader(n,t),e.attachShader(n,u),e.linkProgram(n),!e.getProgramParameter(n,e.LINK_STATUS)){const d=e.getProgramInfoLog(n);throw e.deleteProgram(n),new Error(`Program link error: ${d}`)}e.deleteShader(t),e.deleteShader(u);const r=new Map,g=e.getProgramParameter(n,e.ACTIVE_ATTRIBUTES);for(let d=0;d<g;d++){const f=e.getActiveAttrib(n,d);f&&r.set(f.name,e.getAttribLocation(n,f.name))}const c=new Map,m=e.getProgramParameter(n,e.ACTIVE_UNIFORMS);for(let d=0;d<m;d++){const f=e.getActiveUniform(n,d);if(f){const h=e.getUniformLocation(n,f.name);h&&c.set(f.name,h)}}return{program:n,attribLocations:r,uniformLocations:c}}function k(e,o,a){for(const[t,u]of Object.entries(a)){const n=o.uniformLocations.get(t);if(n){if(typeof u=="number")e.uniform1f(n,u);else if(Array.isArray(u))switch(u.length){case 2:e.uniform2fv(n,u);break;case 3:e.uniform3fv(n,u);break;case 4:e.uniform4fv(n,u);break}}}}function D(e,o){const a=e.createTexture();if(!a)throw new Error("Failed to create texture");return e.bindTexture(e.TEXTURE_2D,a),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),{texture:a,width:o.naturalWidth,height:o.naturalHeight}}function L(e,o){const a=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),t=e.createBuffer();if(!t)throw new Error("Failed to create buffer");e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,a,e.STATIC_DRAW);const u=4*Float32Array.BYTES_PER_ELEMENT,n=o.attribLocations.get("a_position");n!==void 0&&n!==-1&&(e.enableVertexAttribArray(n),e.vertexAttribPointer(n,2,e.FLOAT,!1,u,0));const r=o.attribLocations.get("a_texCoord");return r!==void 0&&r!==-1&&(e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,u,2*Float32Array.BYTES_PER_ELEMENT)),t}function M(e){e.drawArrays(e.TRIANGLE_STRIP,0,4)}const z=`precision mediump float;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("lit"),l=require("lit/decorators.js");function M(e){return e.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0})}function K(e,o,n){const i=e.createShader(o);if(!i)throw new Error("Failed to create shader");if(e.shaderSource(i,n),e.compileShader(i),!e.getShaderParameter(i,e.COMPILE_STATUS)){const t=e.getShaderInfoLog(i);throw e.deleteShader(i),new Error(`Shader compile error: ${t}`)}return i}function U(e,o,n){const i=K(e,e.VERTEX_SHADER,o),t=K(e,e.FRAGMENT_SHADER,n),r=e.createProgram();if(!r)throw new Error("Failed to create program");if(e.attachShader(r,i),e.attachShader(r,t),e.linkProgram(r),!e.getProgramParameter(r,e.LINK_STATUS)){const f=e.getProgramInfoLog(r);throw e.deleteProgram(r),new Error(`Program link error: ${f}`)}e.deleteShader(i),e.deleteShader(t);const d=new Map,h=e.getProgramParameter(r,e.ACTIVE_ATTRIBUTES);for(let f=0;f<h;f++){const c=e.getActiveAttrib(r,f);c&&d.set(c.name,e.getAttribLocation(r,c.name))}const m=new Map,s=e.getProgramParameter(r,e.ACTIVE_UNIFORMS);for(let f=0;f<s;f++){const c=e.getActiveUniform(r,f);if(c){const p=e.getUniformLocation(r,c.name);p&&m.set(c.name,p)}}return{program:r,attribLocations:d,uniformLocations:m}}function z(e,o,n){for(const[i,t]of Object.entries(n)){const r=o.uniformLocations.get(i);if(r){if(typeof t=="number")e.uniform1f(r,t);else if(Array.isArray(t))switch(t.length){case 2:e.uniform2fv(r,t);break;case 3:e.uniform3fv(r,t);break;case 4:e.uniform4fv(r,t);break}}}}function P(e,o){const n=e.createTexture();if(!n)throw new Error("Failed to create texture");return e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),{texture:n,width:o.naturalWidth,height:o.naturalHeight}}function I(e,o){const n=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),i=e.createBuffer();if(!i)throw new Error("Failed to create buffer");e.bindBuffer(e.ARRAY_BUFFER,i),e.bufferData(e.ARRAY_BUFFER,n,e.STATIC_DRAW);const t=4*Float32Array.BYTES_PER_ELEMENT,r=o.attribLocations.get("a_position");r!==void 0&&r!==-1&&(e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,t,0));const d=o.attribLocations.get("a_texCoord");return d!==void 0&&d!==-1&&(e.enableVertexAttribArray(d),e.vertexAttribPointer(d,2,e.FLOAT,!1,t,2*Float32Array.BYTES_PER_ELEMENT)),i}function L(e){e.drawArrays(e.TRIANGLE_STRIP,0,4)}const V=`precision mediump float;
2
2
 
3
3
  varying vec2 v_texCoord;
4
4
 
@@ -84,7 +84,7 @@ void main() {
84
84
 
85
85
  gl_FragColor = vec4(outR, outG, outB, texture2D(u_image, v_texCoord).a);
86
86
  }
87
- `,y=`attribute vec2 a_position;
87
+ `,w=`attribute vec2 a_position;
88
88
  attribute vec2 a_texCoord;
89
89
  varying vec2 v_texCoord;
90
90
 
@@ -92,7 +92,7 @@ void main() {
92
92
  gl_Position = vec4(a_position, 0.0, 1.0);
93
93
  v_texCoord = a_texCoord;
94
94
  }
95
- `,P={name:"halftone-cmyk",fragmentShader:z,vertexShader:y,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_angleC",type:"float",default:15,attribute:"angle-c"},{name:"u_angleM",type:"float",default:75,attribute:"angle-m"},{name:"u_angleY",type:"float",default:0,attribute:"angle-y"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showC",type:"float",default:1,attribute:"show-c"},{name:"u_showM",type:"float",default:1,attribute:"show-m"},{name:"u_showY",type:"float",default:1,attribute:"show-y"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},I=`precision mediump float;
95
+ `,N={name:"halftone-cmyk",fragmentShader:V,vertexShader:w,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_angleC",type:"float",default:15,attribute:"angle-c"},{name:"u_angleM",type:"float",default:75,attribute:"angle-m"},{name:"u_angleY",type:"float",default:0,attribute:"angle-y"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showC",type:"float",default:1,attribute:"show-c"},{name:"u_showM",type:"float",default:1,attribute:"show-m"},{name:"u_showY",type:"float",default:1,attribute:"show-y"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},W=`precision mediump float;
96
96
 
97
97
  varying vec2 v_texCoord;
98
98
 
@@ -134,7 +134,7 @@ void main() {
134
134
 
135
135
  gl_FragColor = vec4(result, color.a);
136
136
  }
137
- `,V={name:"halftone-duotone",fragmentShader:I,vertexShader:y,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_duotoneColor",type:"vec3",default:[0,.6,.8],attribute:"duotone-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},N=`precision mediump float;
137
+ `,O={name:"halftone-duotone",fragmentShader:W,vertexShader:w,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_duotoneColor",type:"vec3",default:[0,.6,.8],attribute:"duotone-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},F=`precision mediump float;
138
138
 
139
139
  varying vec2 v_texCoord;
140
140
 
@@ -190,7 +190,7 @@ void main() {
190
190
 
191
191
  gl_FragColor = vec4(result, 1.0);
192
192
  }
193
- `,O={name:"dot-grid",fragmentShader:N,vertexShader:y,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_dotOffset",type:"vec2",default:[.5,.5],attribute:"dot-offset"},{name:"u_bgColor",type:"vec3",default:[1,1,1],attribute:"bg-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},F=`precision mediump float;
193
+ `,Y={name:"dot-grid",fragmentShader:F,vertexShader:w,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_dotOffset",type:"vec2",default:[.5,.5],attribute:"dot-offset"},{name:"u_bgColor",type:"vec3",default:[1,1,1],attribute:"bg-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},B=`precision mediump float;
194
194
 
195
195
  varying vec2 v_texCoord;
196
196
 
@@ -273,14 +273,12 @@ void main() {
273
273
 
274
274
  gl_FragColor = vec4(clamp(result, 0.0, 1.0), color.a);
275
275
  }
276
- `,W={name:"technicolor-2strip",fragmentShader:F,vertexShader:y,uniforms:[{name:"u_dotRadius",type:"float",default:7,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:10,attribute:"grid-size"},{name:"u_angleWarm",type:"float",default:15,attribute:"angle-warm"},{name:"u_angleCool",type:"float",default:75,attribute:"angle-cool"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showWarm",type:"float",default:1,attribute:"show-warm"},{name:"u_showCool",type:"float",default:1,attribute:"show-cool"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_warmColor",type:"vec3",default:[.85,.25,.06],attribute:"warm-color"},{name:"u_coolColor",type:"vec3",default:[.05,.65,.6],attribute:"cool-color"},{name:"u_blendMode",type:"float",default:1,attribute:"blend-mode"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},w=new Map;function _(e){w.set(e.name,e)}function T(e){return w.get(e)}function B(){return Array.from(w.keys())}_(P);_(V);_(O);_(W);var Y=Object.defineProperty,l=(e,o,a,t)=>{for(var u=void 0,n=e.length-1,r;n>=0;n--)(r=e[n])&&(u=r(o,a,u)||u);return u&&Y(o,a,u),u};const X=2;let E=Promise.resolve();function x(e){const o=E.then(e,e);return E=o,o}const $=new Set(["effect","dotRadius","gridSize","angleC","angleM","angleY","angleK","showC","showM","showY","showK","intensityK","duotoneColor","angle","dotOffsetX","dotOffsetY","bgColor","angleWarm","angleCool","showWarm","showCool","warmColor","coolColor","blendMode","referenceWidth"]),C=class C extends p.LitElement{constructor(){super(...arguments),this.src="",this.effect="halftone-cmyk",this.dotRadius=4,this.gridSize=8,this.angleC=15,this.angleM=75,this.angleY=0,this.angleK=45,this.showC=1,this.showM=1,this.showY=1,this.showK=1,this.intensityK=1,this.duotoneColor="#0099cc",this.angle=0,this.dotOffsetX=.5,this.dotOffsetY=.5,this.bgColor="#ffffff",this.angleWarm=15,this.angleCool=75,this.showWarm=1,this.showCool=1,this.warmColor="#d94010",this.coolColor="#0da699",this.blendMode=1,this.referenceWidth=1024,this.loadingBlur=0,this._webglAvailable=!0,this._snapshotUrl="",this._snapshotLoaded=!1,this._image=null,this._observer=null,this._visible=!1,this._needsRender=!1}render(){if(!this._webglAvailable)return p.html`<img src=${this.src} alt="" />`;const o=this.loadingBlur>0?`filter: blur(${this.loadingBlur}px)`:"";return p.html`
277
- <img src=${this.src} alt="" style=${o} />
278
- ${this._snapshotUrl?p.html`<img
279
- class="snapshot${this._snapshotLoaded?" loaded":""}"
280
- src=${this._snapshotUrl}
281
- @load=${this._onSnapshotLoad}
282
- alt="" />`:""}
283
- `}connectedCallback(){super.connectedCallback(),this._observer=new IntersectionObserver(o=>{var t;const a=this._visible;this._visible=((t=o[0])==null?void 0:t.isIntersecting)??!1,this._visible&&!a&&this._needsRender&&(this._needsRender=!1,x(()=>this._renderEffect()))},{rootMargin:"200px"}),this._observer.observe(this)}updated(o){if(o.has("src")&&this.src){this._loadImage(this.src);return}if(!this._image)return;[...o.keys()].some(t=>$.has(t))&&this._scheduleRender()}disconnectedCallback(){var o;super.disconnectedCallback(),(o=this._observer)==null||o.disconnect(),this._revokeSnapshot()}_loadImage(o){const a=new Image;a.crossOrigin="anonymous",a.onload=()=>{this._image=a,this._scheduleRender()},a.onerror=()=>{console.warn(`[some-shade] Failed to load image: ${o}`)},a.src=o}_scheduleRender(){this._visible?x(()=>this._renderEffect()):this._needsRender=!0}async _renderEffect(){var g;if(!this._image)return;const o=T(this.effect);if(!o){console.warn(`[some-shade] Unknown effect: ${this.effect}`);return}const a=Math.min(window.devicePixelRatio||1,X),t=this._image.naturalWidth,u=this._image.naturalHeight,n=document.createElement("canvas");n.width=t*a,n.height=u*a;const r=U(n);if(!r){this._webglAvailable=!1;return}try{const c=K(r,o.vertexShader,o.fragmentShader);r.useProgram(c.program);const m=D(r,this._image),d=L(r,c);r.viewport(0,0,n.width,n.height),r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT),r.activeTexture(r.TEXTURE0),r.bindTexture(r.TEXTURE_2D,m.texture);const f=c.uniformLocations.get("u_image");f&&r.uniform1i(f,0),k(r,c,this._getUniformValues(m,a)),r.bindBuffer(r.ARRAY_BUFFER,d);const h=4*Float32Array.BYTES_PER_ELEMENT,b=c.attribLocations.get("a_position");b!==void 0&&b!==-1&&(r.enableVertexAttribArray(b),r.vertexAttribPointer(b,2,r.FLOAT,!1,h,0));const v=c.attribLocations.get("a_texCoord");v!==void 0&&v!==-1&&(r.enableVertexAttribArray(v),r.vertexAttribPointer(v,2,r.FLOAT,!1,h,2*Float32Array.BYTES_PER_ELEMENT)),M(r);const R=await new Promise(A=>n.toBlob(A));r.deleteTexture(m.texture),r.deleteProgram(c.program),r.deleteBuffer(d),R&&(this._snapshotLoaded=!1,this._revokeSnapshot(),this._snapshotUrl=URL.createObjectURL(R))}finally{(g=r.getExtension("WEBGL_lose_context"))==null||g.loseContext()}}_onSnapshotLoad(){this._snapshotLoaded=!0}replayTransition(o=500){this._snapshotUrl&&(this._snapshotLoaded=!1,this.updateComplete.then(()=>{setTimeout(()=>{this._snapshotLoaded=!0},o)}))}_revokeSnapshot(){this._snapshotUrl&&(URL.revokeObjectURL(this._snapshotUrl),this._snapshotUrl="")}_getUniformValues(o,a){const t={};t.u_resolution=[o.width*a,o.height*a];const u=o.width/this.referenceWidth;return t.u_dotRadius=this.dotRadius*u,t.u_gridSize=this.gridSize*u,this.effect==="halftone-cmyk"?(t.u_angleC=this.angleC,t.u_angleM=this.angleM,t.u_angleY=this.angleY,t.u_angleK=this.angleK,t.u_showC=this.showC,t.u_showM=this.showM,t.u_showY=this.showY,t.u_showK=this.showK,t.u_intensityK=this.intensityK):this.effect==="halftone-duotone"?(t.u_duotoneColor=this._parseHexColor(this.duotoneColor),t.u_angle=this.angle):this.effect==="dot-grid"?(t.u_dotOffset=[this.dotOffsetX,this.dotOffsetY],t.u_bgColor=this._parseHexColor(this.bgColor),t.u_angle=this.angle):this.effect==="technicolor-2strip"&&(t.u_angleWarm=this.angleWarm,t.u_angleCool=this.angleCool,t.u_angleK=this.angleK,t.u_showWarm=this.showWarm,t.u_showCool=this.showCool,t.u_showK=this.showK,t.u_warmColor=this._parseHexColor(this.warmColor),t.u_coolColor=this._parseHexColor(this.coolColor),t.u_blendMode=this.blendMode,t.u_intensityK=this.intensityK),t}_parseHexColor(o){const a=o.replace("#",""),t=parseInt(a.substring(0,2),16)/255,u=parseInt(a.substring(2,4),16)/255,n=parseInt(a.substring(4,6),16)/255;return[t,u,n]}};C.styles=p.css`
276
+ `,X={name:"technicolor-2strip",fragmentShader:B,vertexShader:w,uniforms:[{name:"u_dotRadius",type:"float",default:7,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:10,attribute:"grid-size"},{name:"u_angleWarm",type:"float",default:15,attribute:"angle-warm"},{name:"u_angleCool",type:"float",default:75,attribute:"angle-cool"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showWarm",type:"float",default:1,attribute:"show-warm"},{name:"u_showCool",type:"float",default:1,attribute:"show-cool"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_warmColor",type:"vec3",default:[.85,.25,.06],attribute:"warm-color"},{name:"u_coolColor",type:"vec3",default:[.05,.65,.6],attribute:"cool-color"},{name:"u_blendMode",type:"float",default:1,attribute:"blend-mode"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},R=new Map;function _(e){R.set(e.name,e)}function D(e){return R.get(e)}function G(){return Array.from(R.keys())}_(N);_(O);_(Y);_(X);var H=Object.defineProperty,u=(e,o,n,i)=>{for(var t=void 0,r=e.length-1,d;r>=0;r--)(d=e[r])&&(t=d(o,n,t)||t);return t&&H(o,n,t),t};const $=2;let k=Promise.resolve();function C(e){const o=k.then(e,e);return k=o,o}const q=new Set(["effect","dotRadius","gridSize","angleC","angleM","angleY","angleK","showC","showM","showY","showK","intensityK","duotoneColor","angle","dotOffsetX","dotOffsetY","bgColor","angleWarm","angleCool","showWarm","showCool","warmColor","coolColor","blendMode","referenceWidth"]),S=class S extends y.LitElement{constructor(){super(...arguments),this.src="",this.effect="halftone-cmyk",this.dotRadius=4,this.gridSize=8,this.angleC=15,this.angleM=75,this.angleY=0,this.angleK=45,this.showC=1,this.showM=1,this.showY=1,this.showK=1,this.intensityK=1,this.duotoneColor="#0099cc",this.angle=0,this.dotOffsetX=.5,this.dotOffsetY=.5,this.bgColor="#ffffff",this.angleWarm=15,this.angleCool=75,this.showWarm=1,this.showCool=1,this.warmColor="#d94010",this.coolColor="#0da699",this.blendMode=1,this.referenceWidth=1024,this._webglAvailable=!0,this._snapshotReady=!1,this._image=null,this._observer=null,this._visible=!1,this._needsRender=!1}render(){return this._webglAvailable?y.html`
277
+ <img class="base" src=${this.src} alt="" />
278
+ <canvas
279
+ class="snapshot${this._snapshotReady?" ready":""}"
280
+ ></canvas>
281
+ `:y.html`<img src=${this.src} alt="" />`}connectedCallback(){super.connectedCallback(),this._observer=new IntersectionObserver(o=>{var i;const n=this._visible;this._visible=((i=o[0])==null?void 0:i.isIntersecting)??!1,this._visible&&!n&&(this._needsRender||this._image&&!this._snapshotReady)&&(this._needsRender=!1,C(()=>this._renderEffect()))},{rootMargin:"200px"}),this._observer.observe(this)}updated(o){if(o.has("src")&&this.src){this._loadImage(this.src);return}if(!this._image)return;[...o.keys()].some(i=>q.has(i))&&this._scheduleRender()}disconnectedCallback(){var o;super.disconnectedCallback(),(o=this._observer)==null||o.disconnect()}_loadImage(o){const n=new Image;n.crossOrigin="anonymous",n.onload=()=>{this._image=n,this._scheduleRender()},n.onerror=()=>{console.warn(`[some-shade] Failed to load image: ${o}`)},n.src=o}_scheduleRender(){this._visible?C(()=>this._renderEffect()):(this._needsRender=!0,requestAnimationFrame(()=>{if(this._needsRender&&!this._visible){const o=this.getBoundingClientRect();o.bottom>=0&&o.top<window.innerHeight&&(this._visible=!0,this._needsRender=!1,C(()=>this._renderEffect()))}}))}async _renderEffect(){var f;if(!this._image)return;const o=D(this.effect);if(!o){console.warn(`[some-shade] Unknown effect: ${this.effect}`);return}this._snapshotReady=!1;const n=Math.min(window.devicePixelRatio||1,$),i=this._image.naturalWidth,t=this._image.naturalHeight,r=this.clientWidth||i,d=Math.min(Math.round(r*n),i),h=Math.round(d*(t/i)),m=document.createElement("canvas");m.width=d,m.height=h;const s=M(m);if(!s){this._webglAvailable=!1;return}try{const c=U(s,o.vertexShader,o.fragmentShader);s.useProgram(c.program);const p=P(s,this._image),x=I(s,c);s.viewport(0,0,m.width,m.height),s.clearColor(0,0,0,0),s.clear(s.COLOR_BUFFER_BIT),s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,p.texture);const E=c.uniformLocations.get("u_image");E&&s.uniform1i(E,0),z(s,c,this._getUniformValues(d,h,n)),s.bindBuffer(s.ARRAY_BUFFER,x);const T=4*Float32Array.BYTES_PER_ELEMENT,g=c.attribLocations.get("a_position");g!==void 0&&g!==-1&&(s.enableVertexAttribArray(g),s.vertexAttribPointer(g,2,s.FLOAT,!1,T,0));const b=c.attribLocations.get("a_texCoord");b!==void 0&&b!==-1&&(s.enableVertexAttribArray(b),s.vertexAttribPointer(b,2,s.FLOAT,!1,T,2*Float32Array.BYTES_PER_ELEMENT)),L(s);const v=this.renderRoot.querySelector(".snapshot");if(v){v.width=d,v.height=h;const A=v.getContext("2d");A&&(A.drawImage(m,0,0),this._snapshotReady=!0)}s.deleteTexture(p.texture),s.deleteProgram(c.program),s.deleteBuffer(x)}finally{(f=s.getExtension("WEBGL_lose_context"))==null||f.loseContext()}}replayTransition(o=500){this._snapshotReady&&(this._snapshotReady=!1,this.updateComplete.then(()=>{setTimeout(()=>{this._snapshotReady=!0},o)}))}_getUniformValues(o,n,i){const t={};t.u_resolution=[o,n];const r=o/(this.referenceWidth*i);return t.u_dotRadius=this.dotRadius*r,t.u_gridSize=this.gridSize*r,this.effect==="halftone-cmyk"?(t.u_angleC=this.angleC,t.u_angleM=this.angleM,t.u_angleY=this.angleY,t.u_angleK=this.angleK,t.u_showC=this.showC,t.u_showM=this.showM,t.u_showY=this.showY,t.u_showK=this.showK,t.u_intensityK=this.intensityK):this.effect==="halftone-duotone"?(t.u_duotoneColor=this._parseHexColor(this.duotoneColor),t.u_angle=this.angle):this.effect==="dot-grid"?(t.u_dotOffset=[this.dotOffsetX,this.dotOffsetY],t.u_bgColor=this._parseHexColor(this.bgColor),t.u_angle=this.angle):this.effect==="technicolor-2strip"&&(t.u_angleWarm=this.angleWarm,t.u_angleCool=this.angleCool,t.u_angleK=this.angleK,t.u_showWarm=this.showWarm,t.u_showCool=this.showCool,t.u_showK=this.showK,t.u_warmColor=this._parseHexColor(this.warmColor),t.u_coolColor=this._parseHexColor(this.coolColor),t.u_blendMode=this.blendMode,t.u_intensityK=this.intensityK),t}_parseHexColor(o){const n=o.replace("#",""),i=parseInt(n.substring(0,2),16)/255,t=parseInt(n.substring(2,4),16)/255,r=parseInt(n.substring(4,6),16)/255;return[i,t,r]}};S.styles=y.css`
284
282
  :host {
285
283
  display: block;
286
284
  position: relative;
@@ -292,7 +290,10 @@ void main() {
292
290
  width: 100%;
293
291
  height: auto;
294
292
  }
295
- img.snapshot {
293
+ img.base {
294
+ opacity: 0;
295
+ }
296
+ canvas.snapshot {
296
297
  position: absolute;
297
298
  inset: 0;
298
299
  width: 100%;
@@ -300,7 +301,7 @@ void main() {
300
301
  opacity: 0;
301
302
  transition: opacity 0.3s ease;
302
303
  }
303
- img.snapshot.loaded {
304
+ canvas.snapshot.ready {
304
305
  opacity: 1;
305
306
  }
306
- `;let i=C;l([s.property()],i.prototype,"src");l([s.property()],i.prototype,"effect");l([s.property({type:Number,attribute:"dot-radius"})],i.prototype,"dotRadius");l([s.property({type:Number,attribute:"grid-size"})],i.prototype,"gridSize");l([s.property({type:Number,attribute:"angle-c"})],i.prototype,"angleC");l([s.property({type:Number,attribute:"angle-m"})],i.prototype,"angleM");l([s.property({type:Number,attribute:"angle-y"})],i.prototype,"angleY");l([s.property({type:Number,attribute:"angle-k"})],i.prototype,"angleK");l([s.property({type:Number,attribute:"show-c"})],i.prototype,"showC");l([s.property({type:Number,attribute:"show-m"})],i.prototype,"showM");l([s.property({type:Number,attribute:"show-y"})],i.prototype,"showY");l([s.property({type:Number,attribute:"show-k"})],i.prototype,"showK");l([s.property({type:Number,attribute:"intensity-k"})],i.prototype,"intensityK");l([s.property({attribute:"duotone-color"})],i.prototype,"duotoneColor");l([s.property({type:Number})],i.prototype,"angle");l([s.property({type:Number,attribute:"dot-offset-x"})],i.prototype,"dotOffsetX");l([s.property({type:Number,attribute:"dot-offset-y"})],i.prototype,"dotOffsetY");l([s.property({attribute:"bg-color"})],i.prototype,"bgColor");l([s.property({type:Number,attribute:"angle-warm"})],i.prototype,"angleWarm");l([s.property({type:Number,attribute:"angle-cool"})],i.prototype,"angleCool");l([s.property({type:Number,attribute:"show-warm"})],i.prototype,"showWarm");l([s.property({type:Number,attribute:"show-cool"})],i.prototype,"showCool");l([s.property({attribute:"warm-color"})],i.prototype,"warmColor");l([s.property({attribute:"cool-color"})],i.prototype,"coolColor");l([s.property({type:Number,attribute:"blend-mode"})],i.prototype,"blendMode");l([s.property({type:Number,attribute:"reference-width"})],i.prototype,"referenceWidth");l([s.property({type:Number,attribute:"loading-blur"})],i.prototype,"loadingBlur");l([s.state()],i.prototype,"_webglAvailable");l([s.state()],i.prototype,"_snapshotUrl");l([s.state()],i.prototype,"_snapshotLoaded");customElements.get("some-shade-image")||customElements.define("some-shade-image",i);exports.SomeShadeImage=i;exports.get=T;exports.list=B;exports.register=_;
307
+ `;let a=S;u([l.property()],a.prototype,"src");u([l.property()],a.prototype,"effect");u([l.property({type:Number,attribute:"dot-radius"})],a.prototype,"dotRadius");u([l.property({type:Number,attribute:"grid-size"})],a.prototype,"gridSize");u([l.property({type:Number,attribute:"angle-c"})],a.prototype,"angleC");u([l.property({type:Number,attribute:"angle-m"})],a.prototype,"angleM");u([l.property({type:Number,attribute:"angle-y"})],a.prototype,"angleY");u([l.property({type:Number,attribute:"angle-k"})],a.prototype,"angleK");u([l.property({type:Number,attribute:"show-c"})],a.prototype,"showC");u([l.property({type:Number,attribute:"show-m"})],a.prototype,"showM");u([l.property({type:Number,attribute:"show-y"})],a.prototype,"showY");u([l.property({type:Number,attribute:"show-k"})],a.prototype,"showK");u([l.property({type:Number,attribute:"intensity-k"})],a.prototype,"intensityK");u([l.property({attribute:"duotone-color"})],a.prototype,"duotoneColor");u([l.property({type:Number})],a.prototype,"angle");u([l.property({type:Number,attribute:"dot-offset-x"})],a.prototype,"dotOffsetX");u([l.property({type:Number,attribute:"dot-offset-y"})],a.prototype,"dotOffsetY");u([l.property({attribute:"bg-color"})],a.prototype,"bgColor");u([l.property({type:Number,attribute:"angle-warm"})],a.prototype,"angleWarm");u([l.property({type:Number,attribute:"angle-cool"})],a.prototype,"angleCool");u([l.property({type:Number,attribute:"show-warm"})],a.prototype,"showWarm");u([l.property({type:Number,attribute:"show-cool"})],a.prototype,"showCool");u([l.property({attribute:"warm-color"})],a.prototype,"warmColor");u([l.property({attribute:"cool-color"})],a.prototype,"coolColor");u([l.property({type:Number,attribute:"blend-mode"})],a.prototype,"blendMode");u([l.property({type:Number,attribute:"reference-width"})],a.prototype,"referenceWidth");u([l.state()],a.prototype,"_webglAvailable");u([l.state()],a.prototype,"_snapshotReady");customElements.get("some-shade-image")||customElements.define("some-shade-image",a);exports.SomeShadeImage=a;exports.get=D;exports.list=G;exports.register=_;
@@ -1,72 +1,72 @@
1
- import { LitElement as U, css as K, html as y } from "lit";
2
- import { property as u, state as w } from "lit/decorators.js";
3
- function k(e) {
1
+ import { LitElement as U, css as M, html as A } from "lit";
2
+ import { property as u, state as D } from "lit/decorators.js";
3
+ function z(e) {
4
4
  return e.getContext("webgl", {
5
5
  alpha: !0,
6
6
  premultipliedAlpha: !1,
7
7
  preserveDrawingBuffer: !0
8
8
  });
9
9
  }
10
- function x(e, o, a) {
11
- const t = e.createShader(o);
12
- if (!t) throw new Error("Failed to create shader");
13
- if (e.shaderSource(t, a), e.compileShader(t), !e.getShaderParameter(t, e.COMPILE_STATUS)) {
14
- const l = e.getShaderInfoLog(t);
15
- throw e.deleteShader(t), new Error(`Shader compile error: ${l}`);
10
+ function K(e, o, r) {
11
+ const i = e.createShader(o);
12
+ if (!i) throw new Error("Failed to create shader");
13
+ if (e.shaderSource(i, r), e.compileShader(i), !e.getShaderParameter(i, e.COMPILE_STATUS)) {
14
+ const t = e.getShaderInfoLog(i);
15
+ throw e.deleteShader(i), new Error(`Shader compile error: ${t}`);
16
16
  }
17
- return t;
17
+ return i;
18
18
  }
19
- function D(e, o, a) {
20
- const t = x(e, e.VERTEX_SHADER, o), l = x(e, e.FRAGMENT_SHADER, a), r = e.createProgram();
21
- if (!r) throw new Error("Failed to create program");
22
- if (e.attachShader(r, t), e.attachShader(r, l), e.linkProgram(r), !e.getProgramParameter(r, e.LINK_STATUS)) {
23
- const d = e.getProgramInfoLog(r);
24
- throw e.deleteProgram(r), new Error(`Program link error: ${d}`);
19
+ function P(e, o, r) {
20
+ const i = K(e, e.VERTEX_SHADER, o), t = K(e, e.FRAGMENT_SHADER, r), n = e.createProgram();
21
+ if (!n) throw new Error("Failed to create program");
22
+ if (e.attachShader(n, i), e.attachShader(n, t), e.linkProgram(n), !e.getProgramParameter(n, e.LINK_STATUS)) {
23
+ const f = e.getProgramInfoLog(n);
24
+ throw e.deleteProgram(n), new Error(`Program link error: ${f}`);
25
25
  }
26
- e.deleteShader(t), e.deleteShader(l);
27
- const n = /* @__PURE__ */ new Map(), _ = e.getProgramParameter(r, e.ACTIVE_ATTRIBUTES);
28
- for (let d = 0; d < _; d++) {
29
- const c = e.getActiveAttrib(r, d);
30
- c && n.set(c.name, e.getAttribLocation(r, c.name));
26
+ e.deleteShader(i), e.deleteShader(t);
27
+ const d = /* @__PURE__ */ new Map(), h = e.getProgramParameter(n, e.ACTIVE_ATTRIBUTES);
28
+ for (let f = 0; f < h; f++) {
29
+ const c = e.getActiveAttrib(n, f);
30
+ c && d.set(c.name, e.getAttribLocation(n, c.name));
31
31
  }
32
- const f = /* @__PURE__ */ new Map(), m = e.getProgramParameter(r, e.ACTIVE_UNIFORMS);
33
- for (let d = 0; d < m; d++) {
34
- const c = e.getActiveUniform(r, d);
32
+ const m = /* @__PURE__ */ new Map(), s = e.getProgramParameter(n, e.ACTIVE_UNIFORMS);
33
+ for (let f = 0; f < s; f++) {
34
+ const c = e.getActiveUniform(n, f);
35
35
  if (c) {
36
- const h = e.getUniformLocation(r, c.name);
37
- h && f.set(c.name, h);
36
+ const _ = e.getUniformLocation(n, c.name);
37
+ _ && m.set(c.name, _);
38
38
  }
39
39
  }
40
- return { program: r, attribLocations: n, uniformLocations: f };
40
+ return { program: n, attribLocations: d, uniformLocations: m };
41
41
  }
42
- function L(e, o, a) {
43
- for (const [t, l] of Object.entries(a)) {
44
- const r = o.uniformLocations.get(t);
45
- if (r) {
46
- if (typeof l == "number")
47
- e.uniform1f(r, l);
48
- else if (Array.isArray(l))
49
- switch (l.length) {
42
+ function I(e, o, r) {
43
+ for (const [i, t] of Object.entries(r)) {
44
+ const n = o.uniformLocations.get(i);
45
+ if (n) {
46
+ if (typeof t == "number")
47
+ e.uniform1f(n, t);
48
+ else if (Array.isArray(t))
49
+ switch (t.length) {
50
50
  case 2:
51
- e.uniform2fv(r, l);
51
+ e.uniform2fv(n, t);
52
52
  break;
53
53
  case 3:
54
- e.uniform3fv(r, l);
54
+ e.uniform3fv(n, t);
55
55
  break;
56
56
  case 4:
57
- e.uniform4fv(r, l);
57
+ e.uniform4fv(n, t);
58
58
  break;
59
59
  }
60
60
  }
61
61
  }
62
62
  }
63
- function M(e, o) {
64
- const a = e.createTexture();
65
- if (!a) throw new Error("Failed to create texture");
66
- return e.bindTexture(e.TEXTURE_2D, a), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, o), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR), { texture: a, width: o.naturalWidth, height: o.naturalHeight };
63
+ function L(e, o) {
64
+ const r = e.createTexture();
65
+ if (!r) throw new Error("Failed to create texture");
66
+ return e.bindTexture(e.TEXTURE_2D, r), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, o), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR), { texture: r, width: o.naturalWidth, height: o.naturalHeight };
67
67
  }
68
- function z(e, o) {
69
- const a = new Float32Array([
68
+ function V(e, o) {
69
+ const r = new Float32Array([
70
70
  // pos.x pos.y tex.s tex.t
71
71
  -1,
72
72
  -1,
@@ -84,18 +84,18 @@ function z(e, o) {
84
84
  1,
85
85
  1,
86
86
  0
87
- ]), t = e.createBuffer();
88
- if (!t) throw new Error("Failed to create buffer");
89
- e.bindBuffer(e.ARRAY_BUFFER, t), e.bufferData(e.ARRAY_BUFFER, a, e.STATIC_DRAW);
90
- const l = 4 * Float32Array.BYTES_PER_ELEMENT, r = o.attribLocations.get("a_position");
91
- r !== void 0 && r !== -1 && (e.enableVertexAttribArray(r), e.vertexAttribPointer(r, 2, e.FLOAT, !1, l, 0));
92
- const n = o.attribLocations.get("a_texCoord");
93
- return n !== void 0 && n !== -1 && (e.enableVertexAttribArray(n), e.vertexAttribPointer(n, 2, e.FLOAT, !1, l, 2 * Float32Array.BYTES_PER_ELEMENT)), t;
87
+ ]), i = e.createBuffer();
88
+ if (!i) throw new Error("Failed to create buffer");
89
+ e.bindBuffer(e.ARRAY_BUFFER, i), e.bufferData(e.ARRAY_BUFFER, r, e.STATIC_DRAW);
90
+ const t = 4 * Float32Array.BYTES_PER_ELEMENT, n = o.attribLocations.get("a_position");
91
+ n !== void 0 && n !== -1 && (e.enableVertexAttribArray(n), e.vertexAttribPointer(n, 2, e.FLOAT, !1, t, 0));
92
+ const d = o.attribLocations.get("a_texCoord");
93
+ return d !== void 0 && d !== -1 && (e.enableVertexAttribArray(d), e.vertexAttribPointer(d, 2, e.FLOAT, !1, t, 2 * Float32Array.BYTES_PER_ELEMENT)), i;
94
94
  }
95
- function P(e) {
95
+ function N(e) {
96
96
  e.drawArrays(e.TRIANGLE_STRIP, 0, 4);
97
97
  }
98
- const I = `precision mediump float;
98
+ const W = `precision mediump float;
99
99
 
100
100
  varying vec2 v_texCoord;
101
101
 
@@ -181,7 +181,7 @@ void main() {
181
181
 
182
182
  gl_FragColor = vec4(outR, outG, outB, texture2D(u_image, v_texCoord).a);
183
183
  }
184
- `, b = `attribute vec2 a_position;
184
+ `, v = `attribute vec2 a_position;
185
185
  attribute vec2 a_texCoord;
186
186
  varying vec2 v_texCoord;
187
187
 
@@ -189,10 +189,10 @@ void main() {
189
189
  gl_Position = vec4(a_position, 0.0, 1.0);
190
190
  v_texCoord = a_texCoord;
191
191
  }
192
- `, V = {
192
+ `, F = {
193
193
  name: "halftone-cmyk",
194
- fragmentShader: I,
195
- vertexShader: b,
194
+ fragmentShader: W,
195
+ vertexShader: v,
196
196
  uniforms: [
197
197
  { name: "u_dotRadius", type: "float", default: 4, attribute: "dot-radius" },
198
198
  { name: "u_gridSize", type: "float", default: 8, attribute: "grid-size" },
@@ -206,7 +206,7 @@ void main() {
206
206
  { name: "u_showK", type: "float", default: 1, attribute: "show-k" },
207
207
  { name: "u_intensityK", type: "float", default: 1, attribute: "intensity-k" }
208
208
  ]
209
- }, N = `precision mediump float;
209
+ }, O = `precision mediump float;
210
210
 
211
211
  varying vec2 v_texCoord;
212
212
 
@@ -248,17 +248,17 @@ void main() {
248
248
 
249
249
  gl_FragColor = vec4(result, color.a);
250
250
  }
251
- `, O = {
251
+ `, Y = {
252
252
  name: "halftone-duotone",
253
- fragmentShader: N,
254
- vertexShader: b,
253
+ fragmentShader: O,
254
+ vertexShader: v,
255
255
  uniforms: [
256
256
  { name: "u_dotRadius", type: "float", default: 4, attribute: "dot-radius" },
257
257
  { name: "u_gridSize", type: "float", default: 8, attribute: "grid-size" },
258
258
  { name: "u_duotoneColor", type: "vec3", default: [0, 0.6, 0.8], attribute: "duotone-color" },
259
259
  { name: "u_angle", type: "float", default: 0, attribute: "angle" }
260
260
  ]
261
- }, F = `precision mediump float;
261
+ }, B = `precision mediump float;
262
262
 
263
263
  varying vec2 v_texCoord;
264
264
 
@@ -314,10 +314,10 @@ void main() {
314
314
 
315
315
  gl_FragColor = vec4(result, 1.0);
316
316
  }
317
- `, W = {
317
+ `, X = {
318
318
  name: "dot-grid",
319
- fragmentShader: F,
320
- vertexShader: b,
319
+ fragmentShader: B,
320
+ vertexShader: v,
321
321
  uniforms: [
322
322
  { name: "u_dotRadius", type: "float", default: 4, attribute: "dot-radius" },
323
323
  { name: "u_gridSize", type: "float", default: 8, attribute: "grid-size" },
@@ -325,7 +325,7 @@ void main() {
325
325
  { name: "u_bgColor", type: "vec3", default: [1, 1, 1], attribute: "bg-color" },
326
326
  { name: "u_angle", type: "float", default: 0, attribute: "angle" }
327
327
  ]
328
- }, B = `precision mediump float;
328
+ }, G = `precision mediump float;
329
329
 
330
330
  varying vec2 v_texCoord;
331
331
 
@@ -408,10 +408,10 @@ void main() {
408
408
 
409
409
  gl_FragColor = vec4(clamp(result, 0.0, 1.0), color.a);
410
410
  }
411
- `, Y = {
411
+ `, H = {
412
412
  name: "technicolor-2strip",
413
- fragmentShader: B,
414
- vertexShader: b,
413
+ fragmentShader: G,
414
+ vertexShader: v,
415
415
  uniforms: [
416
416
  { name: "u_dotRadius", type: "float", default: 7, attribute: "dot-radius" },
417
417
  { name: "u_gridSize", type: "float", default: 10, attribute: "grid-size" },
@@ -427,31 +427,31 @@ void main() {
427
427
  { name: "u_intensityK", type: "float", default: 1, attribute: "intensity-k" }
428
428
  ]
429
429
  }, C = /* @__PURE__ */ new Map();
430
- function v(e) {
430
+ function y(e) {
431
431
  C.set(e.name, e);
432
432
  }
433
- function X(e) {
433
+ function $(e) {
434
434
  return C.get(e);
435
435
  }
436
- function Q() {
436
+ function ee() {
437
437
  return Array.from(C.keys());
438
438
  }
439
- v(V);
440
- v(O);
441
- v(W);
442
- v(Y);
443
- var $ = Object.defineProperty, s = (e, o, a, t) => {
444
- for (var l = void 0, r = e.length - 1, n; r >= 0; r--)
445
- (n = e[r]) && (l = n(o, a, l) || l);
446
- return l && $(o, a, l), l;
439
+ y(F);
440
+ y(Y);
441
+ y(X);
442
+ y(H);
443
+ var q = Object.defineProperty, l = (e, o, r, i) => {
444
+ for (var t = void 0, n = e.length - 1, d; n >= 0; n--)
445
+ (d = e[n]) && (t = d(o, r, t) || t);
446
+ return t && q(o, r, t), t;
447
447
  };
448
- const G = 2;
449
- let E = Promise.resolve();
450
- function T(e) {
451
- const o = E.then(e, e);
452
- return E = o, o;
448
+ const Q = 2;
449
+ let k = Promise.resolve();
450
+ function w(e) {
451
+ const o = k.then(e, e);
452
+ return k = o, o;
453
453
  }
454
- const H = /* @__PURE__ */ new Set([
454
+ const j = /* @__PURE__ */ new Set([
455
455
  "effect",
456
456
  "dotRadius",
457
457
  "gridSize",
@@ -479,27 +479,22 @@ const H = /* @__PURE__ */ new Set([
479
479
  "referenceWidth"
480
480
  ]), R = class R extends U {
481
481
  constructor() {
482
- super(...arguments), this.src = "", this.effect = "halftone-cmyk", this.dotRadius = 4, this.gridSize = 8, this.angleC = 15, this.angleM = 75, this.angleY = 0, this.angleK = 45, this.showC = 1, this.showM = 1, this.showY = 1, this.showK = 1, this.intensityK = 1, this.duotoneColor = "#0099cc", this.angle = 0, this.dotOffsetX = 0.5, this.dotOffsetY = 0.5, this.bgColor = "#ffffff", this.angleWarm = 15, this.angleCool = 75, this.showWarm = 1, this.showCool = 1, this.warmColor = "#d94010", this.coolColor = "#0da699", this.blendMode = 1, this.referenceWidth = 1024, this.loadingBlur = 0, this._webglAvailable = !0, this._snapshotUrl = "", this._snapshotLoaded = !1, this._image = null, this._observer = null, this._visible = !1, this._needsRender = !1;
482
+ super(...arguments), this.src = "", this.effect = "halftone-cmyk", this.dotRadius = 4, this.gridSize = 8, this.angleC = 15, this.angleM = 75, this.angleY = 0, this.angleK = 45, this.showC = 1, this.showM = 1, this.showY = 1, this.showK = 1, this.intensityK = 1, this.duotoneColor = "#0099cc", this.angle = 0, this.dotOffsetX = 0.5, this.dotOffsetY = 0.5, this.bgColor = "#ffffff", this.angleWarm = 15, this.angleCool = 75, this.showWarm = 1, this.showCool = 1, this.warmColor = "#d94010", this.coolColor = "#0da699", this.blendMode = 1, this.referenceWidth = 1024, this._webglAvailable = !0, this._snapshotReady = !1, this._image = null, this._observer = null, this._visible = !1, this._needsRender = !1;
483
483
  }
484
484
  render() {
485
- if (!this._webglAvailable)
486
- return y`<img src=${this.src} alt="" />`;
487
- const o = this.loadingBlur > 0 ? `filter: blur(${this.loadingBlur}px)` : "";
488
- return y`
489
- <img src=${this.src} alt="" style=${o} />
490
- ${this._snapshotUrl ? y`<img
491
- class="snapshot${this._snapshotLoaded ? " loaded" : ""}"
492
- src=${this._snapshotUrl}
493
- @load=${this._onSnapshotLoad}
494
- alt="" />` : ""}
495
- `;
485
+ return this._webglAvailable ? A`
486
+ <img class="base" src=${this.src} alt="" />
487
+ <canvas
488
+ class="snapshot${this._snapshotReady ? " ready" : ""}"
489
+ ></canvas>
490
+ ` : A`<img src=${this.src} alt="" />`;
496
491
  }
497
492
  connectedCallback() {
498
493
  super.connectedCallback(), this._observer = new IntersectionObserver(
499
494
  (o) => {
500
- var t;
501
- const a = this._visible;
502
- this._visible = ((t = o[0]) == null ? void 0 : t.isIntersecting) ?? !1, this._visible && !a && this._needsRender && (this._needsRender = !1, T(() => this._renderEffect()));
495
+ var i;
496
+ const r = this._visible;
497
+ this._visible = ((i = o[0]) == null ? void 0 : i.isIntersecting) ?? !1, this._visible && !r && (this._needsRender || this._image && !this._snapshotReady) && (this._needsRender = !1, w(() => this._renderEffect()));
503
498
  },
504
499
  // Start rendering slightly before the element scrolls into view.
505
500
  { rootMargin: "200px" }
@@ -512,115 +507,115 @@ const H = /* @__PURE__ */ new Set([
512
507
  }
513
508
  if (!this._image) return;
514
509
  [...o.keys()].some(
515
- (t) => H.has(t)
510
+ (i) => j.has(i)
516
511
  ) && this._scheduleRender();
517
512
  }
518
513
  disconnectedCallback() {
519
514
  var o;
520
- super.disconnectedCallback(), (o = this._observer) == null || o.disconnect(), this._revokeSnapshot();
515
+ super.disconnectedCallback(), (o = this._observer) == null || o.disconnect();
521
516
  }
522
517
  // ---------------------------------------------------------------------------
523
518
  // Image loading
524
519
  // ---------------------------------------------------------------------------
525
520
  _loadImage(o) {
526
- const a = new Image();
527
- a.crossOrigin = "anonymous", a.onload = () => {
528
- this._image = a, this._scheduleRender();
529
- }, a.onerror = () => {
521
+ const r = new Image();
522
+ r.crossOrigin = "anonymous", r.onload = () => {
523
+ this._image = r, this._scheduleRender();
524
+ }, r.onerror = () => {
530
525
  console.warn(`[some-shade] Failed to load image: ${o}`);
531
- }, a.src = o;
526
+ }, r.src = o;
532
527
  }
533
528
  // ---------------------------------------------------------------------------
534
529
  // Render scheduling
535
530
  // ---------------------------------------------------------------------------
536
531
  _scheduleRender() {
537
- this._visible ? T(() => this._renderEffect()) : this._needsRender = !0;
532
+ this._visible ? w(() => this._renderEffect()) : (this._needsRender = !0, requestAnimationFrame(() => {
533
+ if (this._needsRender && !this._visible) {
534
+ const o = this.getBoundingClientRect();
535
+ o.bottom >= 0 && o.top < window.innerHeight && (this._visible = !0, this._needsRender = !1, w(() => this._renderEffect()));
536
+ }
537
+ }));
538
538
  }
539
539
  // ---------------------------------------------------------------------------
540
540
  // WebGL render → snapshot → tear-down
541
541
  // ---------------------------------------------------------------------------
542
542
  async _renderEffect() {
543
- var _;
543
+ var f;
544
544
  if (!this._image) return;
545
- const o = X(this.effect);
545
+ const o = $(this.effect);
546
546
  if (!o) {
547
547
  console.warn(`[some-shade] Unknown effect: ${this.effect}`);
548
548
  return;
549
549
  }
550
- const a = Math.min(window.devicePixelRatio || 1, G), t = this._image.naturalWidth, l = this._image.naturalHeight, r = document.createElement("canvas");
551
- r.width = t * a, r.height = l * a;
552
- const n = k(r);
553
- if (!n) {
550
+ this._snapshotReady = !1;
551
+ const r = Math.min(window.devicePixelRatio || 1, Q), i = this._image.naturalWidth, t = this._image.naturalHeight, n = this.clientWidth || i, d = Math.min(Math.round(n * r), i), h = Math.round(d * (t / i)), m = document.createElement("canvas");
552
+ m.width = d, m.height = h;
553
+ const s = z(m);
554
+ if (!s) {
554
555
  this._webglAvailable = !1;
555
556
  return;
556
557
  }
557
558
  try {
558
- const f = D(
559
- n,
559
+ const c = P(
560
+ s,
560
561
  o.vertexShader,
561
562
  o.fragmentShader
562
563
  );
563
- n.useProgram(f.program);
564
- const m = M(n, this._image), d = z(n, f);
565
- n.viewport(0, 0, r.width, r.height), n.clearColor(0, 0, 0, 0), n.clear(n.COLOR_BUFFER_BIT), n.activeTexture(n.TEXTURE0), n.bindTexture(n.TEXTURE_2D, m.texture);
566
- const c = f.uniformLocations.get("u_image");
567
- c && n.uniform1i(c, 0), L(
568
- n,
569
- f,
570
- this._getUniformValues(m, a)
571
- ), n.bindBuffer(n.ARRAY_BUFFER, d);
572
- const h = 4 * Float32Array.BYTES_PER_ELEMENT, g = f.attribLocations.get("a_position");
573
- g !== void 0 && g !== -1 && (n.enableVertexAttribArray(g), n.vertexAttribPointer(g, 2, n.FLOAT, !1, h, 0));
574
- const p = f.attribLocations.get("a_texCoord");
575
- p !== void 0 && p !== -1 && (n.enableVertexAttribArray(p), n.vertexAttribPointer(
564
+ s.useProgram(c.program);
565
+ const _ = L(s, this._image), x = V(s, c);
566
+ s.viewport(0, 0, m.width, m.height), s.clearColor(0, 0, 0, 0), s.clear(s.COLOR_BUFFER_BIT), s.activeTexture(s.TEXTURE0), s.bindTexture(s.TEXTURE_2D, _.texture);
567
+ const S = c.uniformLocations.get("u_image");
568
+ S && s.uniform1i(S, 0), I(
569
+ s,
570
+ c,
571
+ this._getUniformValues(d, h, r)
572
+ ), s.bindBuffer(s.ARRAY_BUFFER, x);
573
+ const E = 4 * Float32Array.BYTES_PER_ELEMENT, g = c.attribLocations.get("a_position");
574
+ g !== void 0 && g !== -1 && (s.enableVertexAttribArray(g), s.vertexAttribPointer(g, 2, s.FLOAT, !1, E, 0));
575
+ const p = c.attribLocations.get("a_texCoord");
576
+ p !== void 0 && p !== -1 && (s.enableVertexAttribArray(p), s.vertexAttribPointer(
576
577
  p,
577
578
  2,
578
- n.FLOAT,
579
+ s.FLOAT,
579
580
  !1,
580
- h,
581
+ E,
581
582
  2 * Float32Array.BYTES_PER_ELEMENT
582
- )), P(n);
583
- const S = await new Promise(
584
- (A) => r.toBlob(A)
585
- );
586
- n.deleteTexture(m.texture), n.deleteProgram(f.program), n.deleteBuffer(d), S && (this._snapshotLoaded = !1, this._revokeSnapshot(), this._snapshotUrl = URL.createObjectURL(S));
583
+ )), N(s);
584
+ const b = this.renderRoot.querySelector(".snapshot");
585
+ if (b) {
586
+ b.width = d, b.height = h;
587
+ const T = b.getContext("2d");
588
+ T && (T.drawImage(m, 0, 0), this._snapshotReady = !0);
589
+ }
590
+ s.deleteTexture(_.texture), s.deleteProgram(c.program), s.deleteBuffer(x);
587
591
  } finally {
588
- (_ = n.getExtension("WEBGL_lose_context")) == null || _.loseContext();
592
+ (f = s.getExtension("WEBGL_lose_context")) == null || f.loseContext();
589
593
  }
590
594
  }
591
595
  // ---------------------------------------------------------------------------
592
596
  // Helpers
593
597
  // ---------------------------------------------------------------------------
594
- _onSnapshotLoad() {
595
- this._snapshotLoaded = !0;
596
- }
597
598
  /** Hide the rendered snapshot momentarily, then fade it back in.
598
599
  * Useful for previewing the loading-blur transition. */
599
600
  replayTransition(o = 500) {
600
- this._snapshotUrl && (this._snapshotLoaded = !1, this.updateComplete.then(() => {
601
+ this._snapshotReady && (this._snapshotReady = !1, this.updateComplete.then(() => {
601
602
  setTimeout(() => {
602
- this._snapshotLoaded = !0;
603
+ this._snapshotReady = !0;
603
604
  }, o);
604
605
  }));
605
606
  }
606
- _revokeSnapshot() {
607
- this._snapshotUrl && (URL.revokeObjectURL(this._snapshotUrl), this._snapshotUrl = "");
608
- }
609
- _getUniformValues(o, a) {
607
+ _getUniformValues(o, r, i) {
610
608
  const t = {};
611
- t.u_resolution = [
612
- o.width * a,
613
- o.height * a
614
- ];
615
- const l = o.width / this.referenceWidth;
616
- return t.u_dotRadius = this.dotRadius * l, t.u_gridSize = this.gridSize * l, this.effect === "halftone-cmyk" ? (t.u_angleC = this.angleC, t.u_angleM = this.angleM, t.u_angleY = this.angleY, t.u_angleK = this.angleK, t.u_showC = this.showC, t.u_showM = this.showM, t.u_showY = this.showY, t.u_showK = this.showK, t.u_intensityK = this.intensityK) : this.effect === "halftone-duotone" ? (t.u_duotoneColor = this._parseHexColor(this.duotoneColor), t.u_angle = this.angle) : this.effect === "dot-grid" ? (t.u_dotOffset = [this.dotOffsetX, this.dotOffsetY], t.u_bgColor = this._parseHexColor(this.bgColor), t.u_angle = this.angle) : this.effect === "technicolor-2strip" && (t.u_angleWarm = this.angleWarm, t.u_angleCool = this.angleCool, t.u_angleK = this.angleK, t.u_showWarm = this.showWarm, t.u_showCool = this.showCool, t.u_showK = this.showK, t.u_warmColor = this._parseHexColor(this.warmColor), t.u_coolColor = this._parseHexColor(this.coolColor), t.u_blendMode = this.blendMode, t.u_intensityK = this.intensityK), t;
609
+ t.u_resolution = [o, r];
610
+ const n = o / (this.referenceWidth * i);
611
+ return t.u_dotRadius = this.dotRadius * n, t.u_gridSize = this.gridSize * n, this.effect === "halftone-cmyk" ? (t.u_angleC = this.angleC, t.u_angleM = this.angleM, t.u_angleY = this.angleY, t.u_angleK = this.angleK, t.u_showC = this.showC, t.u_showM = this.showM, t.u_showY = this.showY, t.u_showK = this.showK, t.u_intensityK = this.intensityK) : this.effect === "halftone-duotone" ? (t.u_duotoneColor = this._parseHexColor(this.duotoneColor), t.u_angle = this.angle) : this.effect === "dot-grid" ? (t.u_dotOffset = [this.dotOffsetX, this.dotOffsetY], t.u_bgColor = this._parseHexColor(this.bgColor), t.u_angle = this.angle) : this.effect === "technicolor-2strip" && (t.u_angleWarm = this.angleWarm, t.u_angleCool = this.angleCool, t.u_angleK = this.angleK, t.u_showWarm = this.showWarm, t.u_showCool = this.showCool, t.u_showK = this.showK, t.u_warmColor = this._parseHexColor(this.warmColor), t.u_coolColor = this._parseHexColor(this.coolColor), t.u_blendMode = this.blendMode, t.u_intensityK = this.intensityK), t;
617
612
  }
618
613
  _parseHexColor(o) {
619
- const a = o.replace("#", ""), t = parseInt(a.substring(0, 2), 16) / 255, l = parseInt(a.substring(2, 4), 16) / 255, r = parseInt(a.substring(4, 6), 16) / 255;
620
- return [t, l, r];
614
+ const r = o.replace("#", ""), i = parseInt(r.substring(0, 2), 16) / 255, t = parseInt(r.substring(2, 4), 16) / 255, n = parseInt(r.substring(4, 6), 16) / 255;
615
+ return [i, t, n];
621
616
  }
622
617
  };
623
- R.styles = K`
618
+ R.styles = M`
624
619
  :host {
625
620
  display: block;
626
621
  position: relative;
@@ -632,7 +627,10 @@ R.styles = K`
632
627
  width: 100%;
633
628
  height: auto;
634
629
  }
635
- img.snapshot {
630
+ img.base {
631
+ opacity: 0;
632
+ }
633
+ canvas.snapshot {
636
634
  position: absolute;
637
635
  inset: 0;
638
636
  width: 100%;
@@ -640,105 +638,99 @@ R.styles = K`
640
638
  opacity: 0;
641
639
  transition: opacity 0.3s ease;
642
640
  }
643
- img.snapshot.loaded {
641
+ canvas.snapshot.ready {
644
642
  opacity: 1;
645
643
  }
646
644
  `;
647
- let i = R;
648
- s([
645
+ let a = R;
646
+ l([
649
647
  u()
650
- ], i.prototype, "src");
651
- s([
648
+ ], a.prototype, "src");
649
+ l([
652
650
  u()
653
- ], i.prototype, "effect");
654
- s([
651
+ ], a.prototype, "effect");
652
+ l([
655
653
  u({ type: Number, attribute: "dot-radius" })
656
- ], i.prototype, "dotRadius");
657
- s([
654
+ ], a.prototype, "dotRadius");
655
+ l([
658
656
  u({ type: Number, attribute: "grid-size" })
659
- ], i.prototype, "gridSize");
660
- s([
657
+ ], a.prototype, "gridSize");
658
+ l([
661
659
  u({ type: Number, attribute: "angle-c" })
662
- ], i.prototype, "angleC");
663
- s([
660
+ ], a.prototype, "angleC");
661
+ l([
664
662
  u({ type: Number, attribute: "angle-m" })
665
- ], i.prototype, "angleM");
666
- s([
663
+ ], a.prototype, "angleM");
664
+ l([
667
665
  u({ type: Number, attribute: "angle-y" })
668
- ], i.prototype, "angleY");
669
- s([
666
+ ], a.prototype, "angleY");
667
+ l([
670
668
  u({ type: Number, attribute: "angle-k" })
671
- ], i.prototype, "angleK");
672
- s([
669
+ ], a.prototype, "angleK");
670
+ l([
673
671
  u({ type: Number, attribute: "show-c" })
674
- ], i.prototype, "showC");
675
- s([
672
+ ], a.prototype, "showC");
673
+ l([
676
674
  u({ type: Number, attribute: "show-m" })
677
- ], i.prototype, "showM");
678
- s([
675
+ ], a.prototype, "showM");
676
+ l([
679
677
  u({ type: Number, attribute: "show-y" })
680
- ], i.prototype, "showY");
681
- s([
678
+ ], a.prototype, "showY");
679
+ l([
682
680
  u({ type: Number, attribute: "show-k" })
683
- ], i.prototype, "showK");
684
- s([
681
+ ], a.prototype, "showK");
682
+ l([
685
683
  u({ type: Number, attribute: "intensity-k" })
686
- ], i.prototype, "intensityK");
687
- s([
684
+ ], a.prototype, "intensityK");
685
+ l([
688
686
  u({ attribute: "duotone-color" })
689
- ], i.prototype, "duotoneColor");
690
- s([
687
+ ], a.prototype, "duotoneColor");
688
+ l([
691
689
  u({ type: Number })
692
- ], i.prototype, "angle");
693
- s([
690
+ ], a.prototype, "angle");
691
+ l([
694
692
  u({ type: Number, attribute: "dot-offset-x" })
695
- ], i.prototype, "dotOffsetX");
696
- s([
693
+ ], a.prototype, "dotOffsetX");
694
+ l([
697
695
  u({ type: Number, attribute: "dot-offset-y" })
698
- ], i.prototype, "dotOffsetY");
699
- s([
696
+ ], a.prototype, "dotOffsetY");
697
+ l([
700
698
  u({ attribute: "bg-color" })
701
- ], i.prototype, "bgColor");
702
- s([
699
+ ], a.prototype, "bgColor");
700
+ l([
703
701
  u({ type: Number, attribute: "angle-warm" })
704
- ], i.prototype, "angleWarm");
705
- s([
702
+ ], a.prototype, "angleWarm");
703
+ l([
706
704
  u({ type: Number, attribute: "angle-cool" })
707
- ], i.prototype, "angleCool");
708
- s([
705
+ ], a.prototype, "angleCool");
706
+ l([
709
707
  u({ type: Number, attribute: "show-warm" })
710
- ], i.prototype, "showWarm");
711
- s([
708
+ ], a.prototype, "showWarm");
709
+ l([
712
710
  u({ type: Number, attribute: "show-cool" })
713
- ], i.prototype, "showCool");
714
- s([
711
+ ], a.prototype, "showCool");
712
+ l([
715
713
  u({ attribute: "warm-color" })
716
- ], i.prototype, "warmColor");
717
- s([
714
+ ], a.prototype, "warmColor");
715
+ l([
718
716
  u({ attribute: "cool-color" })
719
- ], i.prototype, "coolColor");
720
- s([
717
+ ], a.prototype, "coolColor");
718
+ l([
721
719
  u({ type: Number, attribute: "blend-mode" })
722
- ], i.prototype, "blendMode");
723
- s([
720
+ ], a.prototype, "blendMode");
721
+ l([
724
722
  u({ type: Number, attribute: "reference-width" })
725
- ], i.prototype, "referenceWidth");
726
- s([
727
- u({ type: Number, attribute: "loading-blur" })
728
- ], i.prototype, "loadingBlur");
729
- s([
730
- w()
731
- ], i.prototype, "_webglAvailable");
732
- s([
733
- w()
734
- ], i.prototype, "_snapshotUrl");
735
- s([
736
- w()
737
- ], i.prototype, "_snapshotLoaded");
738
- customElements.get("some-shade-image") || customElements.define("some-shade-image", i);
723
+ ], a.prototype, "referenceWidth");
724
+ l([
725
+ D()
726
+ ], a.prototype, "_webglAvailable");
727
+ l([
728
+ D()
729
+ ], a.prototype, "_snapshotReady");
730
+ customElements.get("some-shade-image") || customElements.define("some-shade-image", a);
739
731
  export {
740
- i as SomeShadeImage,
741
- X as get,
742
- Q as list,
743
- v as register
732
+ a as SomeShadeImage,
733
+ $ as get,
734
+ ee as list,
735
+ y as register
744
736
  };
@@ -1,4 +1,4 @@
1
- (function(f,h){typeof exports=="object"&&typeof module<"u"?h(exports,require("lit"),require("lit/decorators.js")):typeof define=="function"&&define.amd?define(["exports","lit","lit/decorators.js"],h):(f=typeof globalThis<"u"?globalThis:f||self,h(f.SomeShade={},f.Lit,f.LitDecorators))})(this,(function(f,h,l){"use strict";function U(e){return e.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0})}function S(e,o,i){const t=e.createShader(o);if(!t)throw new Error("Failed to create shader");if(e.shaderSource(t,i),e.compileShader(t),!e.getShaderParameter(t,e.COMPILE_STATUS)){const u=e.getShaderInfoLog(t);throw e.deleteShader(t),new Error(`Shader compile error: ${u}`)}return t}function K(e,o,i){const t=S(e,e.VERTEX_SHADER,o),u=S(e,e.FRAGMENT_SHADER,i),r=e.createProgram();if(!r)throw new Error("Failed to create program");if(e.attachShader(r,t),e.attachShader(r,u),e.linkProgram(r),!e.getProgramParameter(r,e.LINK_STATUS)){const d=e.getProgramInfoLog(r);throw e.deleteProgram(r),new Error(`Program link error: ${d}`)}e.deleteShader(t),e.deleteShader(u);const n=new Map,v=e.getProgramParameter(r,e.ACTIVE_ATTRIBUTES);for(let d=0;d<v;d++){const m=e.getActiveAttrib(r,d);m&&n.set(m.name,e.getAttribLocation(r,m.name))}const c=new Map,g=e.getProgramParameter(r,e.ACTIVE_UNIFORMS);for(let d=0;d<g;d++){const m=e.getActiveUniform(r,d);if(m){const _=e.getUniformLocation(r,m.name);_&&c.set(m.name,_)}}return{program:r,attribLocations:n,uniformLocations:c}}function k(e,o,i){for(const[t,u]of Object.entries(i)){const r=o.uniformLocations.get(t);if(r){if(typeof u=="number")e.uniform1f(r,u);else if(Array.isArray(u))switch(u.length){case 2:e.uniform2fv(r,u);break;case 3:e.uniform3fv(r,u);break;case 4:e.uniform4fv(r,u);break}}}}function D(e,o){const i=e.createTexture();if(!i)throw new Error("Failed to create texture");return e.bindTexture(e.TEXTURE_2D,i),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),{texture:i,width:o.naturalWidth,height:o.naturalHeight}}function L(e,o){const i=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),t=e.createBuffer();if(!t)throw new Error("Failed to create buffer");e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,i,e.STATIC_DRAW);const u=4*Float32Array.BYTES_PER_ELEMENT,r=o.attribLocations.get("a_position");r!==void 0&&r!==-1&&(e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,u,0));const n=o.attribLocations.get("a_texCoord");return n!==void 0&&n!==-1&&(e.enableVertexAttribArray(n),e.vertexAttribPointer(n,2,e.FLOAT,!1,u,2*Float32Array.BYTES_PER_ELEMENT)),t}function M(e){e.drawArrays(e.TRIANGLE_STRIP,0,4)}const z=`precision mediump float;
1
+ (function(m,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("lit"),require("lit/decorators.js")):typeof define=="function"&&define.amd?define(["exports","lit","lit/decorators.js"],p):(m=typeof globalThis<"u"?globalThis:m||self,p(m.SomeShade={},m.Lit,m.LitDecorators))})(this,(function(m,p,l){"use strict";function U(e){return e.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0})}function E(e,o,r){const i=e.createShader(o);if(!i)throw new Error("Failed to create shader");if(e.shaderSource(i,r),e.compileShader(i),!e.getShaderParameter(i,e.COMPILE_STATUS)){const t=e.getShaderInfoLog(i);throw e.deleteShader(i),new Error(`Shader compile error: ${t}`)}return i}function z(e,o,r){const i=E(e,e.VERTEX_SHADER,o),t=E(e,e.FRAGMENT_SHADER,r),n=e.createProgram();if(!n)throw new Error("Failed to create program");if(e.attachShader(n,i),e.attachShader(n,t),e.linkProgram(n),!e.getProgramParameter(n,e.LINK_STATUS)){const c=e.getProgramInfoLog(n);throw e.deleteProgram(n),new Error(`Program link error: ${c}`)}e.deleteShader(i),e.deleteShader(t);const f=new Map,_=e.getProgramParameter(n,e.ACTIVE_ATTRIBUTES);for(let c=0;c<_;c++){const d=e.getActiveAttrib(n,c);d&&f.set(d.name,e.getAttribLocation(n,d.name))}const h=new Map,s=e.getProgramParameter(n,e.ACTIVE_UNIFORMS);for(let c=0;c<s;c++){const d=e.getActiveUniform(n,c);if(d){const b=e.getUniformLocation(n,d.name);b&&h.set(d.name,b)}}return{program:n,attribLocations:f,uniformLocations:h}}function P(e,o,r){for(const[i,t]of Object.entries(r)){const n=o.uniformLocations.get(i);if(n){if(typeof t=="number")e.uniform1f(n,t);else if(Array.isArray(t))switch(t.length){case 2:e.uniform2fv(n,t);break;case 3:e.uniform3fv(n,t);break;case 4:e.uniform4fv(n,t);break}}}}function I(e,o){const r=e.createTexture();if(!r)throw new Error("Failed to create texture");return e.bindTexture(e.TEXTURE_2D,r),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,o),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),{texture:r,width:o.naturalWidth,height:o.naturalHeight}}function L(e,o){const r=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,1,1,1,0]),i=e.createBuffer();if(!i)throw new Error("Failed to create buffer");e.bindBuffer(e.ARRAY_BUFFER,i),e.bufferData(e.ARRAY_BUFFER,r,e.STATIC_DRAW);const t=4*Float32Array.BYTES_PER_ELEMENT,n=o.attribLocations.get("a_position");n!==void 0&&n!==-1&&(e.enableVertexAttribArray(n),e.vertexAttribPointer(n,2,e.FLOAT,!1,t,0));const f=o.attribLocations.get("a_texCoord");return f!==void 0&&f!==-1&&(e.enableVertexAttribArray(f),e.vertexAttribPointer(f,2,e.FLOAT,!1,t,2*Float32Array.BYTES_PER_ELEMENT)),i}function V(e){e.drawArrays(e.TRIANGLE_STRIP,0,4)}const N=`precision mediump float;
2
2
 
3
3
  varying vec2 v_texCoord;
4
4
 
@@ -84,7 +84,7 @@ void main() {
84
84
 
85
85
  gl_FragColor = vec4(outR, outG, outB, texture2D(u_image, v_texCoord).a);
86
86
  }
87
- `,b=`attribute vec2 a_position;
87
+ `,v=`attribute vec2 a_position;
88
88
  attribute vec2 a_texCoord;
89
89
  varying vec2 v_texCoord;
90
90
 
@@ -92,7 +92,7 @@ void main() {
92
92
  gl_Position = vec4(a_position, 0.0, 1.0);
93
93
  v_texCoord = a_texCoord;
94
94
  }
95
- `,P={name:"halftone-cmyk",fragmentShader:z,vertexShader:b,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_angleC",type:"float",default:15,attribute:"angle-c"},{name:"u_angleM",type:"float",default:75,attribute:"angle-m"},{name:"u_angleY",type:"float",default:0,attribute:"angle-y"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showC",type:"float",default:1,attribute:"show-c"},{name:"u_showM",type:"float",default:1,attribute:"show-m"},{name:"u_showY",type:"float",default:1,attribute:"show-y"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},I={name:"halftone-duotone",fragmentShader:`precision mediump float;
95
+ `,W={name:"halftone-cmyk",fragmentShader:N,vertexShader:v,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_angleC",type:"float",default:15,attribute:"angle-c"},{name:"u_angleM",type:"float",default:75,attribute:"angle-m"},{name:"u_angleY",type:"float",default:0,attribute:"angle-y"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showC",type:"float",default:1,attribute:"show-c"},{name:"u_showM",type:"float",default:1,attribute:"show-m"},{name:"u_showY",type:"float",default:1,attribute:"show-y"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},O={name:"halftone-duotone",fragmentShader:`precision mediump float;
96
96
 
97
97
  varying vec2 v_texCoord;
98
98
 
@@ -134,7 +134,7 @@ void main() {
134
134
 
135
135
  gl_FragColor = vec4(result, color.a);
136
136
  }
137
- `,vertexShader:b,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_duotoneColor",type:"vec3",default:[0,.6,.8],attribute:"duotone-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},V={name:"dot-grid",fragmentShader:`precision mediump float;
137
+ `,vertexShader:v,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_duotoneColor",type:"vec3",default:[0,.6,.8],attribute:"duotone-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},F={name:"dot-grid",fragmentShader:`precision mediump float;
138
138
 
139
139
  varying vec2 v_texCoord;
140
140
 
@@ -190,7 +190,7 @@ void main() {
190
190
 
191
191
  gl_FragColor = vec4(result, 1.0);
192
192
  }
193
- `,vertexShader:b,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_dotOffset",type:"vec2",default:[.5,.5],attribute:"dot-offset"},{name:"u_bgColor",type:"vec3",default:[1,1,1],attribute:"bg-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},N={name:"technicolor-2strip",fragmentShader:`precision mediump float;
193
+ `,vertexShader:v,uniforms:[{name:"u_dotRadius",type:"float",default:4,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:8,attribute:"grid-size"},{name:"u_dotOffset",type:"vec2",default:[.5,.5],attribute:"dot-offset"},{name:"u_bgColor",type:"vec3",default:[1,1,1],attribute:"bg-color"},{name:"u_angle",type:"float",default:0,attribute:"angle"}]},Y={name:"technicolor-2strip",fragmentShader:`precision mediump float;
194
194
 
195
195
  varying vec2 v_texCoord;
196
196
 
@@ -273,14 +273,12 @@ void main() {
273
273
 
274
274
  gl_FragColor = vec4(clamp(result, 0.0, 1.0), color.a);
275
275
  }
276
- `,vertexShader:b,uniforms:[{name:"u_dotRadius",type:"float",default:7,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:10,attribute:"grid-size"},{name:"u_angleWarm",type:"float",default:15,attribute:"angle-warm"},{name:"u_angleCool",type:"float",default:75,attribute:"angle-cool"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showWarm",type:"float",default:1,attribute:"show-warm"},{name:"u_showCool",type:"float",default:1,attribute:"show-cool"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_warmColor",type:"vec3",default:[.85,.25,.06],attribute:"warm-color"},{name:"u_coolColor",type:"vec3",default:[.05,.65,.6],attribute:"cool-color"},{name:"u_blendMode",type:"float",default:1,attribute:"blend-mode"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},C=new Map;function p(e){C.set(e.name,e)}function E(e){return C.get(e)}function O(){return Array.from(C.keys())}p(P),p(I),p(V),p(N);var F=Object.defineProperty,s=(e,o,i,t)=>{for(var u=void 0,r=e.length-1,n;r>=0;r--)(n=e[r])&&(u=n(o,i,u)||u);return u&&F(o,i,u),u};const W=2;let x=Promise.resolve();function T(e){const o=x.then(e,e);return x=o,o}const B=new Set(["effect","dotRadius","gridSize","angleC","angleM","angleY","angleK","showC","showM","showY","showK","intensityK","duotoneColor","angle","dotOffsetX","dotOffsetY","bgColor","angleWarm","angleCool","showWarm","showCool","warmColor","coolColor","blendMode","referenceWidth"]),R=class R extends h.LitElement{constructor(){super(...arguments),this.src="",this.effect="halftone-cmyk",this.dotRadius=4,this.gridSize=8,this.angleC=15,this.angleM=75,this.angleY=0,this.angleK=45,this.showC=1,this.showM=1,this.showY=1,this.showK=1,this.intensityK=1,this.duotoneColor="#0099cc",this.angle=0,this.dotOffsetX=.5,this.dotOffsetY=.5,this.bgColor="#ffffff",this.angleWarm=15,this.angleCool=75,this.showWarm=1,this.showCool=1,this.warmColor="#d94010",this.coolColor="#0da699",this.blendMode=1,this.referenceWidth=1024,this.loadingBlur=0,this._webglAvailable=!0,this._snapshotUrl="",this._snapshotLoaded=!1,this._image=null,this._observer=null,this._visible=!1,this._needsRender=!1}render(){if(!this._webglAvailable)return h.html`<img src=${this.src} alt="" />`;const o=this.loadingBlur>0?`filter: blur(${this.loadingBlur}px)`:"";return h.html`
277
- <img src=${this.src} alt="" style=${o} />
278
- ${this._snapshotUrl?h.html`<img
279
- class="snapshot${this._snapshotLoaded?" loaded":""}"
280
- src=${this._snapshotUrl}
281
- @load=${this._onSnapshotLoad}
282
- alt="" />`:""}
283
- `}connectedCallback(){super.connectedCallback(),this._observer=new IntersectionObserver(o=>{var t;const i=this._visible;this._visible=((t=o[0])==null?void 0:t.isIntersecting)??!1,this._visible&&!i&&this._needsRender&&(this._needsRender=!1,T(()=>this._renderEffect()))},{rootMargin:"200px"}),this._observer.observe(this)}updated(o){if(o.has("src")&&this.src){this._loadImage(this.src);return}if(!this._image)return;[...o.keys()].some(t=>B.has(t))&&this._scheduleRender()}disconnectedCallback(){var o;super.disconnectedCallback(),(o=this._observer)==null||o.disconnect(),this._revokeSnapshot()}_loadImage(o){const i=new Image;i.crossOrigin="anonymous",i.onload=()=>{this._image=i,this._scheduleRender()},i.onerror=()=>{console.warn(`[some-shade] Failed to load image: ${o}`)},i.src=o}_scheduleRender(){this._visible?T(()=>this._renderEffect()):this._needsRender=!0}async _renderEffect(){var v;if(!this._image)return;const o=E(this.effect);if(!o){console.warn(`[some-shade] Unknown effect: ${this.effect}`);return}const i=Math.min(window.devicePixelRatio||1,W),t=this._image.naturalWidth,u=this._image.naturalHeight,r=document.createElement("canvas");r.width=t*i,r.height=u*i;const n=U(r);if(!n){this._webglAvailable=!1;return}try{const c=K(n,o.vertexShader,o.fragmentShader);n.useProgram(c.program);const g=D(n,this._image),d=L(n,c);n.viewport(0,0,r.width,r.height),n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT),n.activeTexture(n.TEXTURE0),n.bindTexture(n.TEXTURE_2D,g.texture);const m=c.uniformLocations.get("u_image");m&&n.uniform1i(m,0),k(n,c,this._getUniformValues(g,i)),n.bindBuffer(n.ARRAY_BUFFER,d);const _=4*Float32Array.BYTES_PER_ELEMENT,y=c.attribLocations.get("a_position");y!==void 0&&y!==-1&&(n.enableVertexAttribArray(y),n.vertexAttribPointer(y,2,n.FLOAT,!1,_,0));const w=c.attribLocations.get("a_texCoord");w!==void 0&&w!==-1&&(n.enableVertexAttribArray(w),n.vertexAttribPointer(w,2,n.FLOAT,!1,_,2*Float32Array.BYTES_PER_ELEMENT)),M(n);const A=await new Promise(Y=>r.toBlob(Y));n.deleteTexture(g.texture),n.deleteProgram(c.program),n.deleteBuffer(d),A&&(this._snapshotLoaded=!1,this._revokeSnapshot(),this._snapshotUrl=URL.createObjectURL(A))}finally{(v=n.getExtension("WEBGL_lose_context"))==null||v.loseContext()}}_onSnapshotLoad(){this._snapshotLoaded=!0}replayTransition(o=500){this._snapshotUrl&&(this._snapshotLoaded=!1,this.updateComplete.then(()=>{setTimeout(()=>{this._snapshotLoaded=!0},o)}))}_revokeSnapshot(){this._snapshotUrl&&(URL.revokeObjectURL(this._snapshotUrl),this._snapshotUrl="")}_getUniformValues(o,i){const t={};t.u_resolution=[o.width*i,o.height*i];const u=o.width/this.referenceWidth;return t.u_dotRadius=this.dotRadius*u,t.u_gridSize=this.gridSize*u,this.effect==="halftone-cmyk"?(t.u_angleC=this.angleC,t.u_angleM=this.angleM,t.u_angleY=this.angleY,t.u_angleK=this.angleK,t.u_showC=this.showC,t.u_showM=this.showM,t.u_showY=this.showY,t.u_showK=this.showK,t.u_intensityK=this.intensityK):this.effect==="halftone-duotone"?(t.u_duotoneColor=this._parseHexColor(this.duotoneColor),t.u_angle=this.angle):this.effect==="dot-grid"?(t.u_dotOffset=[this.dotOffsetX,this.dotOffsetY],t.u_bgColor=this._parseHexColor(this.bgColor),t.u_angle=this.angle):this.effect==="technicolor-2strip"&&(t.u_angleWarm=this.angleWarm,t.u_angleCool=this.angleCool,t.u_angleK=this.angleK,t.u_showWarm=this.showWarm,t.u_showCool=this.showCool,t.u_showK=this.showK,t.u_warmColor=this._parseHexColor(this.warmColor),t.u_coolColor=this._parseHexColor(this.coolColor),t.u_blendMode=this.blendMode,t.u_intensityK=this.intensityK),t}_parseHexColor(o){const i=o.replace("#",""),t=parseInt(i.substring(0,2),16)/255,u=parseInt(i.substring(2,4),16)/255,r=parseInt(i.substring(4,6),16)/255;return[t,u,r]}};R.styles=h.css`
276
+ `,vertexShader:v,uniforms:[{name:"u_dotRadius",type:"float",default:7,attribute:"dot-radius"},{name:"u_gridSize",type:"float",default:10,attribute:"grid-size"},{name:"u_angleWarm",type:"float",default:15,attribute:"angle-warm"},{name:"u_angleCool",type:"float",default:75,attribute:"angle-cool"},{name:"u_angleK",type:"float",default:45,attribute:"angle-k"},{name:"u_showWarm",type:"float",default:1,attribute:"show-warm"},{name:"u_showCool",type:"float",default:1,attribute:"show-cool"},{name:"u_showK",type:"float",default:1,attribute:"show-k"},{name:"u_warmColor",type:"vec3",default:[.85,.25,.06],attribute:"warm-color"},{name:"u_coolColor",type:"vec3",default:[.05,.65,.6],attribute:"cool-color"},{name:"u_blendMode",type:"float",default:1,attribute:"blend-mode"},{name:"u_intensityK",type:"float",default:1,attribute:"intensity-k"}]},R=new Map;function g(e){R.set(e.name,e)}function T(e){return R.get(e)}function B(){return Array.from(R.keys())}g(W),g(O),g(F),g(Y);var X=Object.defineProperty,u=(e,o,r,i)=>{for(var t=void 0,n=e.length-1,f;n>=0;n--)(f=e[n])&&(t=f(o,r,t)||t);return t&&X(o,r,t),t};const G=2;let A=Promise.resolve();function S(e){const o=A.then(e,e);return A=o,o}const H=new Set(["effect","dotRadius","gridSize","angleC","angleM","angleY","angleK","showC","showM","showY","showK","intensityK","duotoneColor","angle","dotOffsetX","dotOffsetY","bgColor","angleWarm","angleCool","showWarm","showCool","warmColor","coolColor","blendMode","referenceWidth"]),x=class x extends p.LitElement{constructor(){super(...arguments),this.src="",this.effect="halftone-cmyk",this.dotRadius=4,this.gridSize=8,this.angleC=15,this.angleM=75,this.angleY=0,this.angleK=45,this.showC=1,this.showM=1,this.showY=1,this.showK=1,this.intensityK=1,this.duotoneColor="#0099cc",this.angle=0,this.dotOffsetX=.5,this.dotOffsetY=.5,this.bgColor="#ffffff",this.angleWarm=15,this.angleCool=75,this.showWarm=1,this.showCool=1,this.warmColor="#d94010",this.coolColor="#0da699",this.blendMode=1,this.referenceWidth=1024,this._webglAvailable=!0,this._snapshotReady=!1,this._image=null,this._observer=null,this._visible=!1,this._needsRender=!1}render(){return this._webglAvailable?p.html`
277
+ <img class="base" src=${this.src} alt="" />
278
+ <canvas
279
+ class="snapshot${this._snapshotReady?" ready":""}"
280
+ ></canvas>
281
+ `:p.html`<img src=${this.src} alt="" />`}connectedCallback(){super.connectedCallback(),this._observer=new IntersectionObserver(o=>{var i;const r=this._visible;this._visible=((i=o[0])==null?void 0:i.isIntersecting)??!1,this._visible&&!r&&(this._needsRender||this._image&&!this._snapshotReady)&&(this._needsRender=!1,S(()=>this._renderEffect()))},{rootMargin:"200px"}),this._observer.observe(this)}updated(o){if(o.has("src")&&this.src){this._loadImage(this.src);return}if(!this._image)return;[...o.keys()].some(i=>H.has(i))&&this._scheduleRender()}disconnectedCallback(){var o;super.disconnectedCallback(),(o=this._observer)==null||o.disconnect()}_loadImage(o){const r=new Image;r.crossOrigin="anonymous",r.onload=()=>{this._image=r,this._scheduleRender()},r.onerror=()=>{console.warn(`[some-shade] Failed to load image: ${o}`)},r.src=o}_scheduleRender(){this._visible?S(()=>this._renderEffect()):(this._needsRender=!0,requestAnimationFrame(()=>{if(this._needsRender&&!this._visible){const o=this.getBoundingClientRect();o.bottom>=0&&o.top<window.innerHeight&&(this._visible=!0,this._needsRender=!1,S(()=>this._renderEffect()))}}))}async _renderEffect(){var c;if(!this._image)return;const o=T(this.effect);if(!o){console.warn(`[some-shade] Unknown effect: ${this.effect}`);return}this._snapshotReady=!1;const r=Math.min(window.devicePixelRatio||1,G),i=this._image.naturalWidth,t=this._image.naturalHeight,n=this.clientWidth||i,f=Math.min(Math.round(n*r),i),_=Math.round(f*(t/i)),h=document.createElement("canvas");h.width=f,h.height=_;const s=U(h);if(!s){this._webglAvailable=!1;return}try{const d=z(s,o.vertexShader,o.fragmentShader);s.useProgram(d.program);const b=I(s,this._image),K=L(s,d);s.viewport(0,0,h.width,h.height),s.clearColor(0,0,0,0),s.clear(s.COLOR_BUFFER_BIT),s.activeTexture(s.TEXTURE0),s.bindTexture(s.TEXTURE_2D,b.texture);const D=d.uniformLocations.get("u_image");D&&s.uniform1i(D,0),P(s,d,this._getUniformValues(f,_,r)),s.bindBuffer(s.ARRAY_BUFFER,K);const k=4*Float32Array.BYTES_PER_ELEMENT,y=d.attribLocations.get("a_position");y!==void 0&&y!==-1&&(s.enableVertexAttribArray(y),s.vertexAttribPointer(y,2,s.FLOAT,!1,k,0));const w=d.attribLocations.get("a_texCoord");w!==void 0&&w!==-1&&(s.enableVertexAttribArray(w),s.vertexAttribPointer(w,2,s.FLOAT,!1,k,2*Float32Array.BYTES_PER_ELEMENT)),V(s);const C=this.renderRoot.querySelector(".snapshot");if(C){C.width=f,C.height=_;const M=C.getContext("2d");M&&(M.drawImage(h,0,0),this._snapshotReady=!0)}s.deleteTexture(b.texture),s.deleteProgram(d.program),s.deleteBuffer(K)}finally{(c=s.getExtension("WEBGL_lose_context"))==null||c.loseContext()}}replayTransition(o=500){this._snapshotReady&&(this._snapshotReady=!1,this.updateComplete.then(()=>{setTimeout(()=>{this._snapshotReady=!0},o)}))}_getUniformValues(o,r,i){const t={};t.u_resolution=[o,r];const n=o/(this.referenceWidth*i);return t.u_dotRadius=this.dotRadius*n,t.u_gridSize=this.gridSize*n,this.effect==="halftone-cmyk"?(t.u_angleC=this.angleC,t.u_angleM=this.angleM,t.u_angleY=this.angleY,t.u_angleK=this.angleK,t.u_showC=this.showC,t.u_showM=this.showM,t.u_showY=this.showY,t.u_showK=this.showK,t.u_intensityK=this.intensityK):this.effect==="halftone-duotone"?(t.u_duotoneColor=this._parseHexColor(this.duotoneColor),t.u_angle=this.angle):this.effect==="dot-grid"?(t.u_dotOffset=[this.dotOffsetX,this.dotOffsetY],t.u_bgColor=this._parseHexColor(this.bgColor),t.u_angle=this.angle):this.effect==="technicolor-2strip"&&(t.u_angleWarm=this.angleWarm,t.u_angleCool=this.angleCool,t.u_angleK=this.angleK,t.u_showWarm=this.showWarm,t.u_showCool=this.showCool,t.u_showK=this.showK,t.u_warmColor=this._parseHexColor(this.warmColor),t.u_coolColor=this._parseHexColor(this.coolColor),t.u_blendMode=this.blendMode,t.u_intensityK=this.intensityK),t}_parseHexColor(o){const r=o.replace("#",""),i=parseInt(r.substring(0,2),16)/255,t=parseInt(r.substring(2,4),16)/255,n=parseInt(r.substring(4,6),16)/255;return[i,t,n]}};x.styles=p.css`
284
282
  :host {
285
283
  display: block;
286
284
  position: relative;
@@ -292,7 +290,10 @@ void main() {
292
290
  width: 100%;
293
291
  height: auto;
294
292
  }
295
- img.snapshot {
293
+ img.base {
294
+ opacity: 0;
295
+ }
296
+ canvas.snapshot {
296
297
  position: absolute;
297
298
  inset: 0;
298
299
  width: 100%;
@@ -300,7 +301,7 @@ void main() {
300
301
  opacity: 0;
301
302
  transition: opacity 0.3s ease;
302
303
  }
303
- img.snapshot.loaded {
304
+ canvas.snapshot.ready {
304
305
  opacity: 1;
305
306
  }
306
- `;let a=R;s([l.property()],a.prototype,"src"),s([l.property()],a.prototype,"effect"),s([l.property({type:Number,attribute:"dot-radius"})],a.prototype,"dotRadius"),s([l.property({type:Number,attribute:"grid-size"})],a.prototype,"gridSize"),s([l.property({type:Number,attribute:"angle-c"})],a.prototype,"angleC"),s([l.property({type:Number,attribute:"angle-m"})],a.prototype,"angleM"),s([l.property({type:Number,attribute:"angle-y"})],a.prototype,"angleY"),s([l.property({type:Number,attribute:"angle-k"})],a.prototype,"angleK"),s([l.property({type:Number,attribute:"show-c"})],a.prototype,"showC"),s([l.property({type:Number,attribute:"show-m"})],a.prototype,"showM"),s([l.property({type:Number,attribute:"show-y"})],a.prototype,"showY"),s([l.property({type:Number,attribute:"show-k"})],a.prototype,"showK"),s([l.property({type:Number,attribute:"intensity-k"})],a.prototype,"intensityK"),s([l.property({attribute:"duotone-color"})],a.prototype,"duotoneColor"),s([l.property({type:Number})],a.prototype,"angle"),s([l.property({type:Number,attribute:"dot-offset-x"})],a.prototype,"dotOffsetX"),s([l.property({type:Number,attribute:"dot-offset-y"})],a.prototype,"dotOffsetY"),s([l.property({attribute:"bg-color"})],a.prototype,"bgColor"),s([l.property({type:Number,attribute:"angle-warm"})],a.prototype,"angleWarm"),s([l.property({type:Number,attribute:"angle-cool"})],a.prototype,"angleCool"),s([l.property({type:Number,attribute:"show-warm"})],a.prototype,"showWarm"),s([l.property({type:Number,attribute:"show-cool"})],a.prototype,"showCool"),s([l.property({attribute:"warm-color"})],a.prototype,"warmColor"),s([l.property({attribute:"cool-color"})],a.prototype,"coolColor"),s([l.property({type:Number,attribute:"blend-mode"})],a.prototype,"blendMode"),s([l.property({type:Number,attribute:"reference-width"})],a.prototype,"referenceWidth"),s([l.property({type:Number,attribute:"loading-blur"})],a.prototype,"loadingBlur"),s([l.state()],a.prototype,"_webglAvailable"),s([l.state()],a.prototype,"_snapshotUrl"),s([l.state()],a.prototype,"_snapshotLoaded"),customElements.get("some-shade-image")||customElements.define("some-shade-image",a),f.SomeShadeImage=a,f.get=E,f.list=O,f.register=p,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})}));
307
+ `;let a=x;u([l.property()],a.prototype,"src"),u([l.property()],a.prototype,"effect"),u([l.property({type:Number,attribute:"dot-radius"})],a.prototype,"dotRadius"),u([l.property({type:Number,attribute:"grid-size"})],a.prototype,"gridSize"),u([l.property({type:Number,attribute:"angle-c"})],a.prototype,"angleC"),u([l.property({type:Number,attribute:"angle-m"})],a.prototype,"angleM"),u([l.property({type:Number,attribute:"angle-y"})],a.prototype,"angleY"),u([l.property({type:Number,attribute:"angle-k"})],a.prototype,"angleK"),u([l.property({type:Number,attribute:"show-c"})],a.prototype,"showC"),u([l.property({type:Number,attribute:"show-m"})],a.prototype,"showM"),u([l.property({type:Number,attribute:"show-y"})],a.prototype,"showY"),u([l.property({type:Number,attribute:"show-k"})],a.prototype,"showK"),u([l.property({type:Number,attribute:"intensity-k"})],a.prototype,"intensityK"),u([l.property({attribute:"duotone-color"})],a.prototype,"duotoneColor"),u([l.property({type:Number})],a.prototype,"angle"),u([l.property({type:Number,attribute:"dot-offset-x"})],a.prototype,"dotOffsetX"),u([l.property({type:Number,attribute:"dot-offset-y"})],a.prototype,"dotOffsetY"),u([l.property({attribute:"bg-color"})],a.prototype,"bgColor"),u([l.property({type:Number,attribute:"angle-warm"})],a.prototype,"angleWarm"),u([l.property({type:Number,attribute:"angle-cool"})],a.prototype,"angleCool"),u([l.property({type:Number,attribute:"show-warm"})],a.prototype,"showWarm"),u([l.property({type:Number,attribute:"show-cool"})],a.prototype,"showCool"),u([l.property({attribute:"warm-color"})],a.prototype,"warmColor"),u([l.property({attribute:"cool-color"})],a.prototype,"coolColor"),u([l.property({type:Number,attribute:"blend-mode"})],a.prototype,"blendMode"),u([l.property({type:Number,attribute:"reference-width"})],a.prototype,"referenceWidth"),u([l.state()],a.prototype,"_webglAvailable"),u([l.state()],a.prototype,"_snapshotReady"),customElements.get("some-shade-image")||customElements.define("some-shade-image",a),m.SomeShadeImage=a,m.get=T,m.list=B,m.register=g,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@johnfmorton/some-shade",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "license": "ISC",
5
5
  "homepage": "https://johnfmorton.github.io/some-shade-web-component/",
6
6
  "repository": {
@@ -27,16 +27,16 @@
27
27
  "README.md",
28
28
  "CHANGELOG.md"
29
29
  ],
30
+ "scripts": {
31
+ "dev": "vite build --watch",
32
+ "build": "vite build"
33
+ },
30
34
  "dependencies": {
31
35
  "lit": "^3.2.0"
32
36
  },
33
37
  "devDependencies": {
34
38
  "typescript": "^5.5.0",
35
- "vite": "^6.0.0",
39
+ "vite": "^6.4.2",
36
40
  "vite-plugin-dts": "^4.0.0"
37
- },
38
- "scripts": {
39
- "dev": "vite build --watch",
40
- "build": "vite build"
41
41
  }
42
- }
42
+ }