@johnfmorton/some-shade 1.1.2 → 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
@@ -45,8 +45,7 @@ export declare class SomeShadeImage extends LitElement {
45
45
  blendMode: number;
46
46
  referenceWidth: number;
47
47
  private _webglAvailable;
48
- private _snapshotUrl;
49
- private _snapshotLoaded;
48
+ private _snapshotReady;
50
49
  private _image;
51
50
  private _observer;
52
51
  private _visible;
@@ -58,11 +57,9 @@ export declare class SomeShadeImage extends LitElement {
58
57
  private _loadImage;
59
58
  private _scheduleRender;
60
59
  private _renderEffect;
61
- private _onSnapshotLoad;
62
60
  /** Hide the rendered snapshot momentarily, then fade it back in.
63
61
  * Useful for previewing the loading-blur transition. */
64
62
  replayTransition(delay?: number): void;
65
- private _revokeSnapshot;
66
63
  private _getUniformValues;
67
64
  private _parseHexColor;
68
65
  }
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("lit"),l=require("lit/decorators.js");function U(e){return e.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0})}function E(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 s=e.getShaderInfoLog(t);throw e.deleteShader(t),new Error(`Shader compile error: ${s}`)}return t}function K(e,o,a){const t=E(e,e.VERTEX_SHADER,o),s=E(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,s),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(s);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,h=e.getProgramParameter(n,e.ACTIVE_UNIFORMS);for(let d=0;d<h;d++){const f=e.getActiveUniform(n,d);if(f){const m=e.getUniformLocation(n,f.name);m&&c.set(f.name,m)}}return{program:n,attribLocations:r,uniformLocations:c}}function k(e,o,a){for(const[t,s]of Object.entries(a)){const n=o.uniformLocations.get(t);if(n){if(typeof s=="number")e.uniform1f(n,s);else if(Array.isArray(s))switch(s.length){case 2:e.uniform2fv(n,s);break;case 3:e.uniform3fv(n,s);break;case 4:e.uniform4fv(n,s);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 s=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,s,0));const r=o.attribLocations.get("a_texCoord");return r!==void 0&&r!==-1&&(e.enableVertexAttribArray(r),e.vertexAttribPointer(r,2,e.FLOAT,!1,s,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"}]},V=`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
- `,I={name:"halftone-duotone",fragmentShader:V,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"}]},O=`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
- `,N={name:"dot-grid",fragmentShader:O,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"}]},C=new Map;function _(e){C.set(e.name,e)}function T(e){return C.get(e)}function Y(){return Array.from(C.keys())}_(P);_(I);_(N);_(W);var B=Object.defineProperty,u=(e,o,a,t)=>{for(var s=void 0,n=e.length-1,r;n>=0;n--)(r=e[n])&&(s=r(o,a,s)||s);return s&&B(o,a,s),s};const X=2;let x=Promise.resolve();function w(e){const o=x.then(e,e);return x=o,o}const G=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 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._snapshotUrl="",this._snapshotLoaded=!1,this._image=null,this._observer=null,this._visible=!1,this._needsRender=!1}render(){return this._webglAvailable?p.html`
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
277
  <img class="base" src=${this.src} alt="" />
278
- ${this._snapshotUrl?p.html`<img
279
- class="snapshot${this._snapshotLoaded?" loaded":""}"
280
- src=${this._snapshotUrl}
281
- @load=${this._onSnapshotLoad}
282
- alt="" />`:""}
283
- `:p.html`<img src=${this.src} alt="" />`}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._image&&!this._snapshotUrl)&&(this._needsRender=!1,w(()=>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=>G.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?w(()=>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,w(()=>this._renderEffect()))}}))}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,s=this._image.naturalHeight,n=document.createElement("canvas");n.width=t*a,n.height=s*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 h=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,h.texture);const f=c.uniformLocations.get("u_image");f&&r.uniform1i(f,0),k(r,c,this._getUniformValues(h,a)),r.bindBuffer(r.ARRAY_BUFFER,d);const m=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,m,0));const v=c.attribLocations.get("a_texCoord");v!==void 0&&v!==-1&&(r.enableVertexAttribArray(v),r.vertexAttribPointer(v,2,r.FLOAT,!1,m,2*Float32Array.BYTES_PER_ELEMENT)),M(r);const S=await new Promise(A=>n.toBlob(A));r.deleteTexture(h.texture),r.deleteProgram(c.program),r.deleteBuffer(d),S&&(this._snapshotLoaded=!1,this._revokeSnapshot(),this._snapshotUrl=URL.createObjectURL(S))}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 s=o.width/this.referenceWidth;return t.u_dotRadius=this.dotRadius*s,t.u_gridSize=this.gridSize*s,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,s=parseInt(a.substring(2,4),16)/255,n=parseInt(a.substring(4,6),16)/255;return[t,s,n]}};R.styles=p.css`
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;
@@ -295,7 +293,7 @@ void main() {
295
293
  img.base {
296
294
  opacity: 0;
297
295
  }
298
- img.snapshot {
296
+ canvas.snapshot {
299
297
  position: absolute;
300
298
  inset: 0;
301
299
  width: 100%;
@@ -303,7 +301,7 @@ void main() {
303
301
  opacity: 0;
304
302
  transition: opacity 0.3s ease;
305
303
  }
306
- img.snapshot.loaded {
304
+ canvas.snapshot.ready {
307
305
  opacity: 1;
308
306
  }
309
- `;let i=R;u([l.property()],i.prototype,"src");u([l.property()],i.prototype,"effect");u([l.property({type:Number,attribute:"dot-radius"})],i.prototype,"dotRadius");u([l.property({type:Number,attribute:"grid-size"})],i.prototype,"gridSize");u([l.property({type:Number,attribute:"angle-c"})],i.prototype,"angleC");u([l.property({type:Number,attribute:"angle-m"})],i.prototype,"angleM");u([l.property({type:Number,attribute:"angle-y"})],i.prototype,"angleY");u([l.property({type:Number,attribute:"angle-k"})],i.prototype,"angleK");u([l.property({type:Number,attribute:"show-c"})],i.prototype,"showC");u([l.property({type:Number,attribute:"show-m"})],i.prototype,"showM");u([l.property({type:Number,attribute:"show-y"})],i.prototype,"showY");u([l.property({type:Number,attribute:"show-k"})],i.prototype,"showK");u([l.property({type:Number,attribute:"intensity-k"})],i.prototype,"intensityK");u([l.property({attribute:"duotone-color"})],i.prototype,"duotoneColor");u([l.property({type:Number})],i.prototype,"angle");u([l.property({type:Number,attribute:"dot-offset-x"})],i.prototype,"dotOffsetX");u([l.property({type:Number,attribute:"dot-offset-y"})],i.prototype,"dotOffsetY");u([l.property({attribute:"bg-color"})],i.prototype,"bgColor");u([l.property({type:Number,attribute:"angle-warm"})],i.prototype,"angleWarm");u([l.property({type:Number,attribute:"angle-cool"})],i.prototype,"angleCool");u([l.property({type:Number,attribute:"show-warm"})],i.prototype,"showWarm");u([l.property({type:Number,attribute:"show-cool"})],i.prototype,"showCool");u([l.property({attribute:"warm-color"})],i.prototype,"warmColor");u([l.property({attribute:"cool-color"})],i.prototype,"coolColor");u([l.property({type:Number,attribute:"blend-mode"})],i.prototype,"blendMode");u([l.property({type:Number,attribute:"reference-width"})],i.prototype,"referenceWidth");u([l.state()],i.prototype,"_webglAvailable");u([l.state()],i.prototype,"_snapshotUrl");u([l.state()],i.prototype,"_snapshotLoaded");customElements.get("some-shade-image")||customElements.define("some-shade-image",i);exports.SomeShadeImage=i;exports.get=T;exports.list=Y;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 C } 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 s = e.getShaderInfoLog(t);
15
- throw e.deleteShader(t), new Error(`Shader compile error: ${s}`);
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), s = 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, s), 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(s);
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, s] of Object.entries(a)) {
44
- const r = o.uniformLocations.get(t);
45
- if (r) {
46
- if (typeof s == "number")
47
- e.uniform1f(r, s);
48
- else if (Array.isArray(s))
49
- switch (s.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, s);
51
+ e.uniform2fv(n, t);
52
52
  break;
53
53
  case 3:
54
- e.uniform3fv(r, s);
54
+ e.uniform3fv(n, t);
55
55
  break;
56
56
  case 4:
57
- e.uniform4fv(r, s);
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 s = 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, s, 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, s, 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 V = `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
- `, I = {
192
+ `, F = {
193
193
  name: "halftone-cmyk",
194
- fragmentShader: V,
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
- }, Y = `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
- `, B = {
411
+ `, H = {
412
412
  name: "technicolor-2strip",
413
- fragmentShader: Y,
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" },
@@ -426,32 +426,32 @@ void main() {
426
426
  { name: "u_blendMode", type: "float", default: 1, attribute: "blend-mode" },
427
427
  { name: "u_intensityK", type: "float", default: 1, attribute: "intensity-k" }
428
428
  ]
429
- }, R = /* @__PURE__ */ new Map();
430
- function v(e) {
431
- R.set(e.name, e);
429
+ }, C = /* @__PURE__ */ new Map();
430
+ function y(e) {
431
+ C.set(e.name, e);
432
432
  }
433
- function X(e) {
434
- return R.get(e);
433
+ function $(e) {
434
+ return C.get(e);
435
435
  }
436
- function Q() {
437
- return Array.from(R.keys());
436
+ function ee() {
437
+ return Array.from(C.keys());
438
438
  }
439
- v(I);
440
- v(O);
441
- v(W);
442
- v(B);
443
- var G = Object.defineProperty, l = (e, o, a, t) => {
444
- for (var s = void 0, r = e.length - 1, n; r >= 0; r--)
445
- (n = e[r]) && (s = n(o, a, s) || s);
446
- return s && G(o, a, s), s;
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 $ = 2;
449
- let T = Promise.resolve();
448
+ const Q = 2;
449
+ let k = Promise.resolve();
450
450
  function w(e) {
451
- const o = T.then(e, e);
452
- return T = o, o;
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",
@@ -477,26 +477,24 @@ const H = /* @__PURE__ */ new Set([
477
477
  "coolColor",
478
478
  "blendMode",
479
479
  "referenceWidth"
480
- ]), S = class S extends U {
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._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
- return this._webglAvailable ? y`
485
+ return this._webglAvailable ? A`
486
486
  <img class="base" src=${this.src} alt="" />
487
- ${this._snapshotUrl ? y`<img
488
- class="snapshot${this._snapshotLoaded ? " loaded" : ""}"
489
- src=${this._snapshotUrl}
490
- @load=${this._onSnapshotLoad}
491
- alt="" />` : ""}
492
- ` : y`<img src=${this.src} alt="" />`;
487
+ <canvas
488
+ class="snapshot${this._snapshotReady ? " ready" : ""}"
489
+ ></canvas>
490
+ ` : A`<img src=${this.src} alt="" />`;
493
491
  }
494
492
  connectedCallback() {
495
493
  super.connectedCallback(), this._observer = new IntersectionObserver(
496
494
  (o) => {
497
- var t;
498
- const a = this._visible;
499
- this._visible = ((t = o[0]) == null ? void 0 : t.isIntersecting) ?? !1, this._visible && !a && (this._needsRender || this._image && !this._snapshotUrl) && (this._needsRender = !1, w(() => 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()));
500
498
  },
501
499
  // Start rendering slightly before the element scrolls into view.
502
500
  { rootMargin: "200px" }
@@ -509,23 +507,23 @@ const H = /* @__PURE__ */ new Set([
509
507
  }
510
508
  if (!this._image) return;
511
509
  [...o.keys()].some(
512
- (t) => H.has(t)
510
+ (i) => j.has(i)
513
511
  ) && this._scheduleRender();
514
512
  }
515
513
  disconnectedCallback() {
516
514
  var o;
517
- super.disconnectedCallback(), (o = this._observer) == null || o.disconnect(), this._revokeSnapshot();
515
+ super.disconnectedCallback(), (o = this._observer) == null || o.disconnect();
518
516
  }
519
517
  // ---------------------------------------------------------------------------
520
518
  // Image loading
521
519
  // ---------------------------------------------------------------------------
522
520
  _loadImage(o) {
523
- const a = new Image();
524
- a.crossOrigin = "anonymous", a.onload = () => {
525
- this._image = a, this._scheduleRender();
526
- }, a.onerror = () => {
521
+ const r = new Image();
522
+ r.crossOrigin = "anonymous", r.onload = () => {
523
+ this._image = r, this._scheduleRender();
524
+ }, r.onerror = () => {
527
525
  console.warn(`[some-shade] Failed to load image: ${o}`);
528
- }, a.src = o;
526
+ }, r.src = o;
529
527
  }
530
528
  // ---------------------------------------------------------------------------
531
529
  // Render scheduling
@@ -542,87 +540,82 @@ const H = /* @__PURE__ */ new Set([
542
540
  // WebGL render → snapshot → tear-down
543
541
  // ---------------------------------------------------------------------------
544
542
  async _renderEffect() {
545
- var _;
543
+ var f;
546
544
  if (!this._image) return;
547
- const o = X(this.effect);
545
+ const o = $(this.effect);
548
546
  if (!o) {
549
547
  console.warn(`[some-shade] Unknown effect: ${this.effect}`);
550
548
  return;
551
549
  }
552
- const a = Math.min(window.devicePixelRatio || 1, $), t = this._image.naturalWidth, s = this._image.naturalHeight, r = document.createElement("canvas");
553
- r.width = t * a, r.height = s * a;
554
- const n = k(r);
555
- 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) {
556
555
  this._webglAvailable = !1;
557
556
  return;
558
557
  }
559
558
  try {
560
- const f = D(
561
- n,
559
+ const c = P(
560
+ s,
562
561
  o.vertexShader,
563
562
  o.fragmentShader
564
563
  );
565
- n.useProgram(f.program);
566
- const m = M(n, this._image), d = z(n, f);
567
- 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);
568
- const c = f.uniformLocations.get("u_image");
569
- c && n.uniform1i(c, 0), L(
570
- n,
571
- f,
572
- this._getUniformValues(m, a)
573
- ), n.bindBuffer(n.ARRAY_BUFFER, d);
574
- const h = 4 * Float32Array.BYTES_PER_ELEMENT, g = f.attribLocations.get("a_position");
575
- g !== void 0 && g !== -1 && (n.enableVertexAttribArray(g), n.vertexAttribPointer(g, 2, n.FLOAT, !1, h, 0));
576
- const p = f.attribLocations.get("a_texCoord");
577
- 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(
578
577
  p,
579
578
  2,
580
- n.FLOAT,
579
+ s.FLOAT,
581
580
  !1,
582
- h,
581
+ E,
583
582
  2 * Float32Array.BYTES_PER_ELEMENT
584
- )), P(n);
585
- const E = await new Promise(
586
- (A) => r.toBlob(A)
587
- );
588
- n.deleteTexture(m.texture), n.deleteProgram(f.program), n.deleteBuffer(d), E && (this._snapshotLoaded = !1, this._revokeSnapshot(), this._snapshotUrl = URL.createObjectURL(E));
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);
589
591
  } finally {
590
- (_ = n.getExtension("WEBGL_lose_context")) == null || _.loseContext();
592
+ (f = s.getExtension("WEBGL_lose_context")) == null || f.loseContext();
591
593
  }
592
594
  }
593
595
  // ---------------------------------------------------------------------------
594
596
  // Helpers
595
597
  // ---------------------------------------------------------------------------
596
- _onSnapshotLoad() {
597
- this._snapshotLoaded = !0;
598
- }
599
598
  /** Hide the rendered snapshot momentarily, then fade it back in.
600
599
  * Useful for previewing the loading-blur transition. */
601
600
  replayTransition(o = 500) {
602
- this._snapshotUrl && (this._snapshotLoaded = !1, this.updateComplete.then(() => {
601
+ this._snapshotReady && (this._snapshotReady = !1, this.updateComplete.then(() => {
603
602
  setTimeout(() => {
604
- this._snapshotLoaded = !0;
603
+ this._snapshotReady = !0;
605
604
  }, o);
606
605
  }));
607
606
  }
608
- _revokeSnapshot() {
609
- this._snapshotUrl && (URL.revokeObjectURL(this._snapshotUrl), this._snapshotUrl = "");
610
- }
611
- _getUniformValues(o, a) {
607
+ _getUniformValues(o, r, i) {
612
608
  const t = {};
613
- t.u_resolution = [
614
- o.width * a,
615
- o.height * a
616
- ];
617
- const s = o.width / this.referenceWidth;
618
- return t.u_dotRadius = this.dotRadius * s, t.u_gridSize = this.gridSize * s, 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;
619
612
  }
620
613
  _parseHexColor(o) {
621
- const a = o.replace("#", ""), t = parseInt(a.substring(0, 2), 16) / 255, s = parseInt(a.substring(2, 4), 16) / 255, r = parseInt(a.substring(4, 6), 16) / 255;
622
- return [t, s, 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];
623
616
  }
624
617
  };
625
- S.styles = K`
618
+ R.styles = M`
626
619
  :host {
627
620
  display: block;
628
621
  position: relative;
@@ -637,7 +630,7 @@ S.styles = K`
637
630
  img.base {
638
631
  opacity: 0;
639
632
  }
640
- img.snapshot {
633
+ canvas.snapshot {
641
634
  position: absolute;
642
635
  inset: 0;
643
636
  width: 100%;
@@ -645,102 +638,99 @@ S.styles = K`
645
638
  opacity: 0;
646
639
  transition: opacity 0.3s ease;
647
640
  }
648
- img.snapshot.loaded {
641
+ canvas.snapshot.ready {
649
642
  opacity: 1;
650
643
  }
651
644
  `;
652
- let i = S;
645
+ let a = R;
653
646
  l([
654
647
  u()
655
- ], i.prototype, "src");
648
+ ], a.prototype, "src");
656
649
  l([
657
650
  u()
658
- ], i.prototype, "effect");
651
+ ], a.prototype, "effect");
659
652
  l([
660
653
  u({ type: Number, attribute: "dot-radius" })
661
- ], i.prototype, "dotRadius");
654
+ ], a.prototype, "dotRadius");
662
655
  l([
663
656
  u({ type: Number, attribute: "grid-size" })
664
- ], i.prototype, "gridSize");
657
+ ], a.prototype, "gridSize");
665
658
  l([
666
659
  u({ type: Number, attribute: "angle-c" })
667
- ], i.prototype, "angleC");
660
+ ], a.prototype, "angleC");
668
661
  l([
669
662
  u({ type: Number, attribute: "angle-m" })
670
- ], i.prototype, "angleM");
663
+ ], a.prototype, "angleM");
671
664
  l([
672
665
  u({ type: Number, attribute: "angle-y" })
673
- ], i.prototype, "angleY");
666
+ ], a.prototype, "angleY");
674
667
  l([
675
668
  u({ type: Number, attribute: "angle-k" })
676
- ], i.prototype, "angleK");
669
+ ], a.prototype, "angleK");
677
670
  l([
678
671
  u({ type: Number, attribute: "show-c" })
679
- ], i.prototype, "showC");
672
+ ], a.prototype, "showC");
680
673
  l([
681
674
  u({ type: Number, attribute: "show-m" })
682
- ], i.prototype, "showM");
675
+ ], a.prototype, "showM");
683
676
  l([
684
677
  u({ type: Number, attribute: "show-y" })
685
- ], i.prototype, "showY");
678
+ ], a.prototype, "showY");
686
679
  l([
687
680
  u({ type: Number, attribute: "show-k" })
688
- ], i.prototype, "showK");
681
+ ], a.prototype, "showK");
689
682
  l([
690
683
  u({ type: Number, attribute: "intensity-k" })
691
- ], i.prototype, "intensityK");
684
+ ], a.prototype, "intensityK");
692
685
  l([
693
686
  u({ attribute: "duotone-color" })
694
- ], i.prototype, "duotoneColor");
687
+ ], a.prototype, "duotoneColor");
695
688
  l([
696
689
  u({ type: Number })
697
- ], i.prototype, "angle");
690
+ ], a.prototype, "angle");
698
691
  l([
699
692
  u({ type: Number, attribute: "dot-offset-x" })
700
- ], i.prototype, "dotOffsetX");
693
+ ], a.prototype, "dotOffsetX");
701
694
  l([
702
695
  u({ type: Number, attribute: "dot-offset-y" })
703
- ], i.prototype, "dotOffsetY");
696
+ ], a.prototype, "dotOffsetY");
704
697
  l([
705
698
  u({ attribute: "bg-color" })
706
- ], i.prototype, "bgColor");
699
+ ], a.prototype, "bgColor");
707
700
  l([
708
701
  u({ type: Number, attribute: "angle-warm" })
709
- ], i.prototype, "angleWarm");
702
+ ], a.prototype, "angleWarm");
710
703
  l([
711
704
  u({ type: Number, attribute: "angle-cool" })
712
- ], i.prototype, "angleCool");
705
+ ], a.prototype, "angleCool");
713
706
  l([
714
707
  u({ type: Number, attribute: "show-warm" })
715
- ], i.prototype, "showWarm");
708
+ ], a.prototype, "showWarm");
716
709
  l([
717
710
  u({ type: Number, attribute: "show-cool" })
718
- ], i.prototype, "showCool");
711
+ ], a.prototype, "showCool");
719
712
  l([
720
713
  u({ attribute: "warm-color" })
721
- ], i.prototype, "warmColor");
714
+ ], a.prototype, "warmColor");
722
715
  l([
723
716
  u({ attribute: "cool-color" })
724
- ], i.prototype, "coolColor");
717
+ ], a.prototype, "coolColor");
725
718
  l([
726
719
  u({ type: Number, attribute: "blend-mode" })
727
- ], i.prototype, "blendMode");
720
+ ], a.prototype, "blendMode");
728
721
  l([
729
722
  u({ type: Number, attribute: "reference-width" })
730
- ], i.prototype, "referenceWidth");
731
- l([
732
- C()
733
- ], i.prototype, "_webglAvailable");
723
+ ], a.prototype, "referenceWidth");
734
724
  l([
735
- C()
736
- ], i.prototype, "_snapshotUrl");
725
+ D()
726
+ ], a.prototype, "_webglAvailable");
737
727
  l([
738
- C()
739
- ], i.prototype, "_snapshotLoaded");
740
- customElements.get("some-shade-image") || customElements.define("some-shade-image", i);
728
+ D()
729
+ ], a.prototype, "_snapshotReady");
730
+ customElements.get("some-shade-image") || customElements.define("some-shade-image", a);
741
731
  export {
742
- i as SomeShadeImage,
743
- X as get,
744
- Q as list,
745
- v as register
732
+ a as SomeShadeImage,
733
+ $ as get,
734
+ ee as list,
735
+ y as register
746
736
  };
@@ -1,4 +1,4 @@
1
- (function(d,m){typeof exports=="object"&&typeof module<"u"?m(exports,require("lit"),require("lit/decorators.js")):typeof define=="function"&&define.amd?define(["exports","lit","lit/decorators.js"],m):(d=typeof globalThis<"u"?globalThis:d||self,m(d.SomeShade={},d.Lit,d.LitDecorators))})(this,(function(d,m,s){"use strict";function U(e){return e.getContext("webgl",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0})}function E(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=E(e,e.VERTEX_SHADER,o),u=E(e,e.FRAGMENT_SHADER,a),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 f=e.getProgramInfoLog(r);throw e.deleteProgram(r),new Error(`Program link error: ${f}`)}e.deleteShader(t),e.deleteShader(u);const n=new Map,v=e.getProgramParameter(r,e.ACTIVE_ATTRIBUTES);for(let f=0;f<v;f++){const h=e.getActiveAttrib(r,f);h&&n.set(h.name,e.getAttribLocation(r,h.name))}const c=new Map,_=e.getProgramParameter(r,e.ACTIVE_UNIFORMS);for(let f=0;f<_;f++){const h=e.getActiveUniform(r,f);if(h){const g=e.getUniformLocation(r,h.name);g&&c.set(h.name,g)}}return{program:r,attribLocations:n,uniformLocations:c}}function k(e,o,a){for(const[t,u]of Object.entries(a)){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 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,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"}]},V={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"}]},I={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"}]},O={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 x(e){return C.get(e)}function N(){return Array.from(C.keys())}p(P),p(V),p(I),p(O);var F=Object.defineProperty,l=(e,o,a,t)=>{for(var u=void 0,r=e.length-1,n;r>=0;r--)(n=e[r])&&(u=n(o,a,u)||u);return u&&F(o,a,u),u};const W=2;let T=Promise.resolve();function R(e){const o=T.then(e,e);return T=o,o}const Y=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 m.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._snapshotUrl="",this._snapshotLoaded=!1,this._image=null,this._observer=null,this._visible=!1,this._needsRender=!1}render(){return this._webglAvailable?m.html`
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
277
  <img class="base" src=${this.src} alt="" />
278
- ${this._snapshotUrl?m.html`<img
279
- class="snapshot${this._snapshotLoaded?" loaded":""}"
280
- src=${this._snapshotUrl}
281
- @load=${this._onSnapshotLoad}
282
- alt="" />`:""}
283
- `:m.html`<img src=${this.src} alt="" />`}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._image&&!this._snapshotUrl)&&(this._needsRender=!1,R(()=>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=>Y.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?R(()=>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,R(()=>this._renderEffect()))}}))}async _renderEffect(){var v;if(!this._image)return;const o=x(this.effect);if(!o){console.warn(`[some-shade] Unknown effect: ${this.effect}`);return}const a=Math.min(window.devicePixelRatio||1,W),t=this._image.naturalWidth,u=this._image.naturalHeight,r=document.createElement("canvas");r.width=t*a,r.height=u*a;const n=U(r);if(!n){this._webglAvailable=!1;return}try{const c=K(n,o.vertexShader,o.fragmentShader);n.useProgram(c.program);const _=D(n,this._image),f=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,_.texture);const h=c.uniformLocations.get("u_image");h&&n.uniform1i(h,0),k(n,c,this._getUniformValues(_,a)),n.bindBuffer(n.ARRAY_BUFFER,f);const g=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,g,0));const w=c.attribLocations.get("a_texCoord");w!==void 0&&w!==-1&&(n.enableVertexAttribArray(w),n.vertexAttribPointer(w,2,n.FLOAT,!1,g,2*Float32Array.BYTES_PER_ELEMENT)),M(n);const A=await new Promise(B=>r.toBlob(B));n.deleteTexture(_.texture),n.deleteProgram(c.program),n.deleteBuffer(f),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,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,r=parseInt(a.substring(4,6),16)/255;return[t,u,r]}};S.styles=m.css`
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;
@@ -295,7 +293,7 @@ void main() {
295
293
  img.base {
296
294
  opacity: 0;
297
295
  }
298
- img.snapshot {
296
+ canvas.snapshot {
299
297
  position: absolute;
300
298
  inset: 0;
301
299
  width: 100%;
@@ -303,7 +301,7 @@ void main() {
303
301
  opacity: 0;
304
302
  transition: opacity 0.3s ease;
305
303
  }
306
- img.snapshot.loaded {
304
+ canvas.snapshot.ready {
307
305
  opacity: 1;
308
306
  }
309
- `;let i=S;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.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),d.SomeShadeImage=i,d.get=x,d.list=N,d.register=p,Object.defineProperty(d,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.2",
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
+ }