1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="295dd961-ef4c-4110-9280-3bfcadc647cc",e._sentryDebugIdIdentifier="sentry-dbid-295dd961-ef4c-4110-9280-3bfcadc647cc")}catch(e){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[64560],{64560:(e,t,n)=>{n.r(t),n.d(t,{SLEEVE_FRAME_3D:()=>W,default:()=>j,normalizeGarment3DType:()=>F,pickGarment3DType:()=>R,resolveSleeveFrameFracs:()=>T});var a=n(95155),r=n(12115),l=n(87548),o=n(19323),i=n(35833),s=n(96319),u=n(78710),c=n(52006),d=n(53789),f=n(26451),m=n(60846),h=n(8608);function p(e){return new Promise((t,n)=>{let a=new Image;a.crossOrigin="anonymous",a.onload=()=>t(a),a.onerror=()=>n(Error("photo-atlas: failed to load ".concat(e))),a.src=e})}function g(e){let t=document.createElement("canvas");t.width=e.naturalWidth,t.height=e.naturalHeight;let n=t.getContext("2d",{willReadFrequently:!0});if(!n)return null;n.drawImage(e,0,0);let a=n.getImageData(0,0,t.width,t.height);return!function(e,t,n){let a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:3,r=t*n,l=new Uint8Array(r);for(let t=0;t<r;t++)l[t]=+(e[4*t+3]>10);let o=new Uint8Array(r),i=new Uint8Array(r);for(let e=0;e<n;e++)for(let n=0;n<t;n++){let r=1;for(let o=-a;o<=a&&r;o++){let a=n+o;(a<0||a>=t||!l[e*t+a])&&(r=0)}o[e*t+n]=r}for(let e=0;e<n;e++)for(let r=0;r<t;r++){let l=1;for(let i=-a;i<=a&&l;i++){let a=e+i;(a<0||a>=n||!o[a*t+r])&&(l=0)}i[e*t+r]=l}let s=0,u=0,c=0,d=0;for(let t=0;t<r;t++){let n=4*t,a=e[n+3]/255;e[n]=Math.round(e[n]*a+243*(1-a)),e[n+1]=Math.round(e[n+1]*a+240*(1-a)),e[n+2]=Math.round(e[n+2]*a+234*(1-a)),e[n+3]=255,i[t]&&(s+=e[n],u+=e[n+1],c+=e[n+2],d+=1)}if(0===d)return!1;let f=Math.round(s/d),m=Math.round(u/d),h=Math.round(c/d);for(let t=0;t<r;t++){if(i[t])continue;let n=4*t;e[n]=f,e[n+1]=m,e[n+2]=h}return!0}(a.data,t.width,t.height)?null:(n.putImageData(a,0,0),t)}async function v(e,t){let[n,a]=await Promise.all([p(e),p(t)]),r=g
1(n),l=g(a);if(!r||!l)return null;let o=document.createElement("canvas");o.width=2048,o.height=1024;let i=o.getContext("2d");return i?(i.drawImage(r,0,0,1024,1024),i.drawImage(l,1024,0,1024,1024),o):null}var w=n(23464),b=n(35299),y=n(16140);let x={tshirt:1,"oversized-tshirt":1,polo:1,hoodie:1,"zipper-hoodie":1},D={tshirt:1,"oversized-tshirt":1,polo:1,hoodie:1,"zipper-hoodie":1};function M(e,t,n){let a=Math.tan(l.cj9.degToRad(e.fov)/2)||1;return Math.max(t.y/2/a,t.x/2/(a*(e.aspect||1)))*function(e){var t;let n=null==(t=e.userData)?void 0:t.canvasEl;if(!n)return 1.32;let a=Math.min(n.clientWidth,n.clientHeight);return a>0&&a<560?1.14:1.32}(e)*n}let C={tshirt:-.02,"oversized-tshirt":-.03,polo:-.02,hoodie:.05,"zipper-hoodie":.05},S={tshirt:0,"oversized-tshirt":0,polo:0,hoodie:0,"zipper-hoodie":0};function P(e){return{center:"#f5f3ee",mid:"#ecebe4",edge:"#d9d7cf"}}let z=new l.Q1f(0xffffff),k=/^[a-z0-9][a-z0-9-]{0,39}$/;function F(e){let t=(0,h.SX)((null!=e?e:"").toLowerCase()).replace(/_/g,"-");return k.test(t)?t:null}function R(e,t){let n=(0,h.XB)(e,t).model3d;if(n)return F(n);if(t&&"object"==typeof t&&!Array.isArray(t)&&Object.keys(t).length>0||!e)return null;let a=e.toLowerCase().trim();if(a.includes("zip")&&a.includes("hood"))return"zipper-hoodie";if(a.includes("hood"))return"hoodie";if(a.includes("polo"))return"polo";if(a.includes("oversized"))return"oversized-tshirt";if("tee"===a||/(^|[^a-z])t-?shirt/.test(a))return"tshirt";let r=F(a);return r&&r in E?r:null}let E={tshirt:{decalChestY:.08,decalSize:.3},"oversized-tshirt":{decalChestY:.08,decalSize:.3},polo:{decalChestY:.06,decalSize:.27},hoodie:{decalChestY:.04,decalSize:.32},"zipper-hoodie":{decalChestY:.04,decalSize:.22}},A={decalChestY:.06,decalSize:.3};function N(e,t){return"number"==typeof e&&Number.isFinite(e)?e:t}function _(e,t){var n,a,r,l,o,i;let s=null!=(n=F(e))?n:"",u=t&&"object"==typeof t&&!Array.isArray(t)?t.preview_3d:void 0,c=u&&"object"==typeof u?u:{},d=null!=(a=E[s])?a:A;return{printScale:N(c.print_scale,null!=(r=x[s])?r:1),cameraZoom:N(c.camera_zoom,null!=(l=D[s])?l:1),offsetY:N(c.print_offset_y,null!=(o=C[s])?o:0),offsetX:N(c.print_offset_x,null!=(i=S[s])?i:0),decalChestY:N(c.decal_chest_y,d.decalChestY),decalSize:N(c.decal_size,d.decalSize),sleeve:T(t)}}function T(e){let t=e&&"object"==typeof e&&!Array.isArray(e)?e.preview_3d:void 0,n=t&&"object"==typeof t?t:{},a=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t;return{centerXFrac:a(n.sleeve_center_x_frac,W.centerXFrac),centerYFrac:a(n.sleeve_center_y_frac,W.centerYFrac),spanFrac:a(n.sleeve_span_frac,W.spanFrac),cubeDepthFrac:a(n.sleeve_depth_frac,W.cubeDepthFrac)}}let W={centerXFrac:.38,centerYFrac:.08,spanFrac:.55,cubeDepthFrac:.35};async function U(e){return new Promise(t=>{let n=new Image;n.crossOrigin="anonymous",n.onload=()=>{try{let e=document.createElement("canvas");e.width=64,e.height=64;let a=e.getContext("2d");if(!a)return t(null);a.drawImage(n,0,0,64,64);let r=a.getImageData(0,0,64,64).data,l=0,o=0,i=0,s=0;for(let e=0;e<64;e+=1){let t=e<6||e>=58;for(let n=0;n<64;n+=1){if(!t&&n>=6&&n<58)continue;let a=(64*e+n)*4;if(r[a+3]<200)continue;let u=r[a],c=r[a+1],d=r[a+2];u>248&&c>248&&d>248||(l+=u,o+=c,i+=d,s+=1)}}if(0===s){let e=new Uint32Array(256),n=new Uint32Array(256),a=new Uint32Array(256),l=0;for(let t=0;t<r.length;t+=4)!(r[t+3]<200)&&(e[r[t]]++,n[r[t+1]]++,a[r[t+2]]++,l++);if(0===l)return t(null);let o=e=>{let t=0;for(let n=0;n<256;n++)if(t+=e[n],2*t>=l)return n;return 255},i=e=>e.toString(16).padStart(2,"0");return t("#".concat(i(o(e))).concat(i(o(n))).concat(i(o(a))))}let u=Math.round(l/s),c=Math.round(o/s),d=Math.round(i/s);t("#".concat(u.toString(16).padStart(2,"0")).concat(c.toString(16).padStart(2,"0")).concat(d.toString(16).padStart(2,"0")))}catch(e){t(null)}},n.onerror=()=>t(null),n.src=e})}function j(e){var t,n,h,p;let{designImageUrl:g,productType:x="tshirt",garmentConfig:D,productColor:C,className:S,decalChestY:k,decalSize:R,autoRotate:E=!0,hideBadge:A=!1,autoRotateRangeDeg:N,onSceneReady:T,autoRotatePaused:W=!1,onControlsChange:j,designPlacement:q,secondaryPlacement:I,extraPlacements:Y,colorSourceImageUrl:B,photoTextureUrls:L,lightweight:O=!1,forceCameraSide:H,templatePlacement3d:X,templateSecondaryPlacement3d:G,printScaleOverride:V,onLoadError:Z,suppressErrorUI:$}=e,Q=(0,r.useRef)(null),J=(0,r.useRef)(null),K=(0,r.useRef)({autoRotatePaused:W,autoRotate:E,autoRotateRangeDeg:N,onControlsChange:j});(0,r.useEffect)(()=>{K.current.autoRotatePaused=W,K.current.autoRotate=E,K.current.autoRotateRangeDeg=N,K.current.onControlsChange=j,ea.current&&(ea.current.autoRotate=E&&!W)},[W,E,j]);let ee=(0,r.useRef)(null),et=(0,r.useRef)(null),en=(0,r.useRef)(null),ea=(0,r.useRef)(null),er=(0,r.useRef)(1),el=(0,r.useRef)(new l.Pq0(1,1,1)),eo=(0,r.useRef)(0),ei=(0,r.useRef)([]),es=(0,r.useRef)(null),eu=(0,r.useRef)(null),[ec,ed]=(0,r.useState)(null!=C?C:null),[ef,em]=(0,r.useState)(null),[eh,ep]=(0,r.useState)(!1),eg=(0,r.useRef)(!1),ev=(()=>{var e;let t=D&&"object"==typeof D&&!Array.isArray(D)?null==(e=D.preview_3d)?void 0:e.model_by_colour:void 0,n=t&&C?t[C.toLowerCase()]:void 0;return"string"==typeof n&&n?n:void 0})(),ew=(0,r.useRef)(!1);ew.current=!!ev;let eb=!!(D&&"object"==typeof D&&!Array.isArray(D)&&(null==(t=D.preview_3d)?void 0:t.orientation)==="authored"),ey=!!(D&&"object"==typeof D&&!Array.isArray(D)&&(null==(n=D.preview_3d)?void 0:n.photo_texture)===!0),ex=ey&&null!=(h=null==L?void 0:L.front)?h:null,eD=ey&&null!=(p=null==L?void 0:L.back)?p:null;(0,r.useEffect)(()=>
1{if(!eh||!ex||!eD){eg.current=!1;return}let e=!1,t=null;return v(ex,eD).then(n=>{if(!e&&n){for(let e of((t=new l.GOR(n)).colorSpace=l.er$,t.flipY=!1,t.anisotropy=4,ei.current)){let n=e.map;e.map=t,e.color.copy(z),e.needsUpdate=!0,n&&n instanceof l.GOR&&n.dispose()}eg.current=!0}}).catch(()=>{}),()=>{e=!0}},[eh,ex,eD]);let eM=(0,r.useRef)(Z);(0,r.useEffect)(()=>{eM.current=Z},[Z]),(0,r.useEffect)(()=>{var e;ef&&(null==(e=eM.current)||e.call(eM,ef.kind,ef.detail))},[ef]);let[eC,eS]=(0,r.useState)(0);(0,r.useEffect)(()=>{let e=!1;if((ed(null!=C?C:null),!(C&&/^#?[0-9a-f]{6}$/i.test(C)))&&B)return U(B).then(t=>{!e&&t&&ed(t)}),()=>{e=!0}},[C,B]);let eP=(0,r.useRef)(_(x,D));(0,r.useEffect)(()=>{eP.current=_(x,D)},[x,D]),(0,r.useEffect)(()=>{var e,t;let n=Q.current;if(!n)return;em(null),ep(!1);let a=F(x),r=a?function(e,t){let n=F(e);return n?{url:"/3d-models/".concat(n,".glb"),decalChestY:t.decalChestY,decalSize:t.decalSize}:null}(null!=ev?ev:a,eP.current):null;if(!r)return void em({kind:"unsupported",detail:x});let h=null!=k?k:r.decalChestY,p=null!=R?R:r.decalSize,v=null!=(e=null==q?void 0:q.imageUrl)?e:g,b=!1,y=n.clientWidth||600,D=n.clientHeight||600,C=window.matchMedia("(max-width: 768px)").matches,S=new l.JeP({antialias:!0,alpha:!0});S.setPixelRatio(Math.min(window.devicePixelRatio,2)),S.setSize(y,D),S.outputColorSpace=l.er$;{let e=new URLSearchParams(window.location.search);S.toneMapping="aces"===e.get("tm")?l.FV:"neutral"===e.get("tm")?l.aJ8:l.y_p;let n=parseFloat(null!=(t=e.get("exp"))?t:"");S.toneMappingExposure=Number.isFinite(n)?n:1}S.setClearColor(0,0),S.shadowMap.enabled=!0,S.shadowMap.type=l.Wk7,n.appendChild(S.domElement);let E=new l.Z58,A=P(null!=ec?ec:null),N=e=>{let t=new l.Q1f;return t.set(e),t},_={uTime:{value:0},uMouse:{value:new l.I9Y(.5,.45)},uAspect:{value:1},uColorCenter:{value:N(A.center)},uColorMid:{value:N(A.mid)},uColorEdge:{value:N(A.edge)}};es.current={uColorCenter:_.uColorCenter,uColorMid:_.uColorMid,uColorEdge:_.uColorEdge},eu.current=S;let W=new l.eaF(new l.bdM(2,2),new l.BKk({uniforms:_,depthTest:!1,depthWrite:!1,vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n // Pin to the far plane regardless of camera transform â\n // gives us a true fullscreen quad in NDC space.\n gl_Position = vec4(position.xy, 1.0, 1.0);\n }\n ",fragmentShader:'\n precision highp float;\n varying vec2 vUv;\n uniform float uTime;\n uniform vec2 uMouse;\n uniform float uAspect;\n uniform vec3 uColorCenter;\n uniform vec3 uColorMid;\n uniform vec3 uColorEdge;\n\n // Pseudo-random hash for film grain.\n float hash(vec2 p) {\n return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);\n }\n\n // 3-stop radial gradient by distance from a point.\n vec3 radial(vec2 uv, vec2 center, float scale) {\n vec2 d = (uv - center);\n d.x *= uAspect;\n float r = length(d) / scale;\n // Smooth stops at 0, 0.55, 1.\n vec3 mid = mix(uColorCenter, uColorMid, smoothstep(0.0, 0.55, r));\n return mix(mid, uColorEdge, smoothstep(0.55, 1.0, r));\n }\n\n void main() {\n vec2 uv = vUv;\n // Three drifting orbs â each has its own slow sinusoid orbit.\n // They overlap the radial gradient to give a "lava lamp"\n // breathing motion without ever revealing hard edges.\n vec2 orb0 = vec2(0.5 + 0.06 * sin(uTime * 0.27), 0.50 + 0.05 * cos(uTime * 0.19));\n vec2 orb1 = vec2(0.5 + 0.10 * sin(uTime * 0.13 + 1.7), 0.52 + 0.07 * cos(uTime * 0.21 + 0.9));\n vec2 orb2 = vec2(0.5 + 0.04 * sin(uTime * 0.31 + 3.1), 0.55 + 0.06 * cos(uTime * 0.17 + 2.3));\n\n vec3 c0 = radial(uv, orb0, 0.85);\n vec3 c1 = radial(uv, orb1, 1.00);\n vec3 c2 = radial(uv, orb2, 0.75);\n vec3 col = (c0 * 0.45 + c1 * 0.35 + c2 * 0.25);\n\n // Mouse halo â a small bright spot following cursor with mild\n // intensity. Adds the "alive" interactive feel.\n float md = distance(uv * vec2(uAspect, 1.0), uMouse * vec2(uAspect, 1.0));\n float halo = exp(-md * 5.0) * 0.10;\n col += halo * uColorCenter;\n\n // Slow brightness breath (8s loop).\n float breath = 1.0 + 0.06 * sin(uTime * 0.78);\n col *= breath;\n\n // Subtle film grain â modulated by time so it shimmers.\n float grain = hash(gl_FragCoord.xy + uTime * 60.0);\n col += (grain - 0.5) * 0.022;\n\n gl_FragColor = vec4(col, 1.0);\n }\n '}));W.renderOrder=-1,W.frustumCulled=!1,E.add(W);let U=new l.BdL(S);U.compileEquirectangularShader(),E.environment=U.fromScene(new s.l,.04).texture;let j="hdr"===new URLSearchParams(window.location.search).get("bg");"1"===new URLSearchParams(window.location.search).get("hdr")&&new u.Y(
1).load("https://dl.polyhaven.org/file/ph-assets/HDRIs/hdr/1k/studio_small_09_1k.hdr",e=>{if(b)return;e.mapping=l.wfO;let t=U.fromEquirectangular(e).texture;E.environment=t,j&&(E.background=t,E.backgroundBlurriness=.5,E.backgroundIntensity=.7),e.dispose()},void 0,()=>{});let B=new URLSearchParams(window.location.search),L=(e,t)=>{var n;let a=parseFloat(null!=(n=B.get(e))?n:"");return Number.isFinite(a)?a:t};E.environmentIntensity=L("env",.4);let Z=new l.ubm(30,y/D,.1,1e3);Z.position.set(0,0,2),Z.userData.canvasEl=S.domElement,E.add(new l.$p8(0xffffff,L("amb",.1)));let $=new l.nCl(0xffffff,L("key",1.4),0,Math.PI/7,.6,1);$.position.set(1.8,2.4,2.2),$.target.position.set(0,0,0),$.castShadow=!0,$.shadow.mapSize.set(C?512:1024,C?512:1024),$.shadow.bias=-5e-4,$.shadow.radius=4,E.add($,$.target);let ed=new l.nCl(0xffffff,L("fill",1.3),0,Math.PI/5,.8,1);ed.position.set(-1.8,.8,1.6),ed.target.position.set(0,0,0),E.add(ed,ed.target);let ef=new l.nCl(0xffffff,L("rim",1.5),0,Math.PI/8,.4,1);ef.position.set(-.4,2.2,-2.6),ef.target.position.set(0,.3,0),E.add(ef,ef.target);let eh=new l.ZyN(0xffffff,.1);eh.position.set(0,-2,1),E.add(eh);let eg=new i.N(Z,S.domElement);eg.enablePan=!1,eg.enableZoom=!0,eg.autoRotate=K.current.autoRotate&&!K.current.autoRotatePaused,eg.autoRotateSpeed=1.2,eg.update();let ey=0,ex=()=>{var e,t;eg.autoRotate=K.current.autoRotate&&!K.current.autoRotatePaused;let n=K.current.autoRotateRangeDeg;if(null!=n&&eg.autoRotate){let e=l.cj9.degToRad(n),t=eo.current,a=eg.getAzimuthalAngle()-t;Math.abs(a=Math.atan2(Math.sin(a),Math.cos(a)))>e&&Math.abs(a)>Math.abs(ey)&&(eg.autoRotateSpeed=-eg.autoRotateSpeed),ey=a}null==(e=(t=K.current).onControlsChange)||e.call(t)};eg.addEventListener("change",ex);let eD=C?.25:.5,eM=new f.C(new l.I9Y(Math.max(128,Math.round(S.domElement.width*eD)),Math.max(128,Math.round(S.domElement.height*eD))),C?.08:.12,.6,1.5),eC=new c.s(S);eC.setPixelRatio(S.getPixelRatio()),eC.setSize(y,D),eC.addPass(new d.A(E,Z)),O||eC.addPass(eM),eC.addPass(new w.X);let eS=new o.B,ez=null,ek=null,eF=!1,eR=window.setTimeout(()=>{b||eF||(eF=!0,console.warn("[Tee3DPreview] glb load exceeded 15s timeout",r.url),em({kind:"timeout",detail:r.url}))},15e3);eS.load(r.url,e=>{var t,n,r;let o,i;if(b)return;eF=!0,window.clearTimeout(eR),(ez=e.scene).traverse(e=>{var t,n;e.isMesh&&(null==(n=e.geometry)||null==(t=n.attributes)?void 0:t.position)&&e.geometry.computeVertexNormals()}),function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];e.updateMatrixWorld(!0);let n=new l.NRn().setFromObject(e),a=n.getSize(new l.Pq0);if(t){e.position.sub(n.getCenter(new l.Pq0)),e.updateMatrixWorld(!0);return}let r=Math.min(a.x,a.y),o=Math.min(a.y,a.z),i=Math.min(a.x,a.z);a.x<=r&&a.x<=i?e.rotation.y=-Math.PI/2:a.y<=o&&a.y<=r&&(e.rotation.x=Math.PI/2),e.updateMatrixWorld(!0);let s=new l.NRn().setFromObject(e),u=s.getCenter(new l.Pq0);e.position.sub(u),e.updateMatrixWorld(!0);let c=0;e.traverse(e=>{var t,n;e.isMesh&&(null==(n=e.geometry)||null==(t=n.attributes)?void 0:t.position)&&(c+=function(e){let t=e.geometry,n=t.attributes.position;if(!n)return 0;let a=t.index,r=a?a.count/3:n.count/3;if(0===r)return 0;let o=e.matrixWorld,i=new l.Pq0,s=new l.Pq0,u=new l.Pq0,c=new l.Pq0,d=new l.Pq0,f=new l.Pq0,m=Math.max(1,Math.floor(r/1e3)),h=0;for(let e=0;e<r;e+=m){let t,r,l;a?(t=a.getX(3*e),r=a.getX(3*e+1),l=a.getX(3*e+2)):(t=3*e,r=3*e+1,l=3*e+2),i.fromBufferAttribute(n,t).applyMatrix4(o),s.fromBufferAttribute(n,r).applyMatrix4(o),u.fromBufferAttribute(n,l).applyMatrix4(o),c.subVectors(s,i),d.subVectors(u,i),f.crossVectors(c,d),h+=f.z}return h}(e))}),c<0&&(e.rotateOnWorldAxis(new l.Pq0(0,1,0),Math.PI),e.updateMatrixWorld(!0),u=(s=new l.NRn().setFromObject(e)).getCenter(new l.Pq0),e.position.sub(u),e.updateMatrixWorld(!0))}(ez,eb);let s=new l.NRn().setFromObject(ez),u=s.getSize(new l.Pq0),c=Math.max(u.x,u.y,u.z)||1,d=null!=H?H:null==q?void 0:q.view,f="left"===d||"right"===d,g="back"===d?-1:1,w="left"===d?1:-1,y=parseFloat(null!=(r=new URLSearchParams(window.location.search).get("zoom"))?r:""),x=M(Z,u,Number.isFinite(y)&&y>=.5&&y<=6?y:eP.current.cameraZoom),D=.04*u.y;f?Z.position.set(w*x,.1*u.y+D,0):Z.position.set(0,D,g*x),eg.target.set(0,D,0),eg.update(
1),eo.current=eg.getAzimuthalAngle(),eg.minDistance=.6*x,eg.maxDistance=2.5*x,eg.update(),en.current=Z,ea.current=eg,er.current=c,el.current=u.clone(),o=null,i=0,ez.traverse(e=>{var t,n;if(e.isMesh&&(null==(n=e.geometry)||null==(t=n.attributes)?void 0:t.position)){let t=e.geometry.index?e.geometry.index.count/3:e.geometry.attributes.position.count/3;t>i&&(i=t,o=e)}});let C=(ek=o)&&(Array.isArray(ek.material)?null==(t=ek.material[0])?void 0:t.name:null==(n=ek.material)?void 0:n.name)||"",P=function(e){var t,n,a,r;let o=null!=(t=null==e?void 0:e.size)?t:512,i=null!=(n=null==e?void 0:e.threadPx)?n:4,s=null!=(a=null==e?void 0:e.repeat)?a:16,u=null!=(r=null==e?void 0:e.strength)?r:1,c=document.createElement("canvas");c.width=o,c.height=o;let d=c.getContext("2d"),f=new Float32Array(o*o);for(let e=0;e<o;e++)for(let t=0;t<o;t++){let n=Math.sin(t/i*Math.PI*2),a=Math.sin(e/i*Math.PI*2);f[e*o+t]=(n+a)*.5}let m=d.createImageData(o,o);for(let e=0;e<o;e++)for(let t=0;t<o;t++){let n=(t-1+o)%o,a=(t+1)%o,r=(e-1+o)%o,l=(e+1)%o,i=(f[e*o+a]-f[e*o+n])*u,s=(f[l*o+t]-f[r*o+t])*u,c=Math.sqrt(i*i+s*s+1),d=-i/c,h=-s/c,p=1/c,g=(e*o+t)*4;m.data[g+0]=Math.round((.5*d+.5)*255),m.data[g+1]=Math.round((.5*h+.5)*255),m.data[g+2]=Math.round((.5*p+.5)*255),m.data[g+3]=255}d.putImageData(m,0,0);let h=new l.GOR(c);return h.wrapS=l.GJx,h.wrapT=l.GJx,h.repeat.set(s,s),h.anisotropy=4,h.needsUpdate=!0,h}({repeat:16}),k=new l.Q1f(ec||0xffffff),F=k.clone().lerp(new l.Q1f(0xffffff),.6),R=[];ez.traverse(e=>{if(!e.isMesh||!e.material)return;let t=Array.isArray(e.material)?e.material:[e.material];for(let o=0;o<t.length;o++){var n,a,r;let i=t[o],s=(i.name||"").toLowerCase(),u=(e.name||"").toLowerCase(),c=e=>e.includes("cotton")||e.includes("fabric")||e.includes("canvas")||e.includes("fleece")||e.includes("cloth")||e.includes("jersey")||e.includes("knit");if(!(c(s)||c(u)||e===ek||C.length>0&&i.name===C)){ec&&i.color&&i.color.copy(k);continue}let d=null!=(a=i.normalMap)?a:null,f=new l.uSd({color:ew.current?z:k,map:null!=(r=i.map)?r:null,normalMap:null!=d?d:P,normalScale:d?i.normalScale.clone():new l.I9Y(.2,.2),roughness:.95,metalness:0,sheen:.04,sheenColor:F,sheenRoughness:.7});f.name=i.name;let m={uDecalMap0:{value:null},uDecalNDCMatrix0:{value:new l.kn4},uDecalForwardWorld0:{value:new l.Pq0(0,0,-1)},uHasDecal0:{value:0},uDecalMap1:{value:null},uDecalNDCMatrix1:{value:new l.kn4},uDecalForwardWorld1:{value:new l.Pq0(0,0,-1)},uHasDecal1:{value:0},uDecalMap2:{value:null},uDecalNDCMatrix2:{value:new l.kn4},uDecalForwardWorld2:{value:new l.Pq0(0,0,-1)},uHasDecal2:{value:0},uDecalMap3:{value:null},uDecalNDCMatrix3:{value:new l.kn4},uDecalForwardWorld3:{value:new l.Pq0(0,0,-1)},uHasDecal3:{value:0}};f.userData.decalUniforms=m,f.onBeforeCompile=e=>{Object.assign(e.uniforms,m),e.vertexShader=e.vertexShader.replace("#include <common>","\n#include <common>\nvarying vec3 vDecalWorldPos;\nvarying vec3 vDecalWorldNormal;\n ").replace("#include <worldpos_vertex>","\n#include <worldpos_vertex>\nvDecalWorldPos = worldPosition.xyz;\nvDecalWorldNormal = normalize(mat3(modelMatrix) * normal);\n "),e.fragmentShader=e.fragmentShader.replace("#include <common>","\n#include <common>\nuniform sampler2D uDecalMap0;\nuniform mat4 uDecalNDCMatrix0;\nuniform vec3 uDecalForwardWorld0;\nuniform float uHasDecal0;\nuniform sampler2D uDecalMap1;\nuniform mat4 uDecalNDCMatrix1;\nuniform vec3 uDecalForwardWorld1;\nuniform float uHasDecal1;\nuniform sampler2D uDecalMap2;\nuniform mat4 uDecalNDCMatrix2;\nuniform vec3 uDecalForwardWorld2;\nuniform float uHasDecal2;\nuniform sampler2D uDecalMap3;\nuniform mat4 uDecalNDCMatrix3;\nuniform vec3 uDecalForwardWorld3;\nuniform float uHasDecal3;\nvarying vec3 vDecalWorldPos;\nvarying vec3 vDecalWorldNormal;\n// Helper used by both the diffuse-stage and output-stage shader-chunk\n// injections, parameterised by the slot's uniforms so we can call it\n// twice without duplicating ~12 lines of NDC + facing maths.\nvec4 czSampleSlot(sampler2D map, mat4 ndcM, vec3 fwd, float hasDecal) {\n if (hasDecal < 0.5) return vec4(0.0);\n float facing = dot(normalize(vDecalWorldNormal), -fwd);\n // Fade out on surfaces turning away from the projector. The old hard\n // cut at 0.3 (~72 deg) let a chest print smear round the rounded sides\n // of a boxy garment and read sideways from a side view (2026-09-25).\n if (facing <= 0.45) return vec4(0.0);\n float facingFade = smoothstep(0.45, 0.62, facing);\n vec4 projPos = ndcM * vec4(vDecalWorldPos, 1.0);\n vec3 ndc = projPos.xyz / max(projPos.w, 1e-5);\n if (!all(lessThanEqual(abs(ndc), vec3(1.0)))) return vec4(0.0);\n vec2 uv = ndc.xy * 0.5 + 0.5;\n // Mild LOD bias (-1.0) trades a touch of orbit-shimmer for visible\n // sharpness on poster detail. Anisotropic filtering on the texture\n // handles the oblique-angle aliasing.\n vec4 s = texture2D(map, uv, -1.0);\n // Chromakey-green residue killer (2026-06-06 user report on World Cup tee).\n // bg-api's HSV chroma filter cat
1ches pure #00FF00 but lets through\n // anti-aliased near-green pixels (sub-threshold saturation, hue still\n // near 120\xb0). These render as bright green dots on the rendered tee\n // even though the listing thumbnail / 2D mockup looks clean. Drop\n // alpha for pixels that read as 'green-dominant + high value'.\n // Threshold tuned to spare forest / olive / muted-grass greens; vivid\n // lime designs lose some saturation but residue is way more visible\n // than the rare lime-heavy design getting slightly dulled.\n // 2026-06-14 (late) â shader chromakey REDUCED to safe-minimum after the\n // hue-discriminator round destroyed intentional green in a real listing\n // (World Cup heart-ball, RGB(37,90,49) swirls â same pixel signature as\n // Anime-tee chromakey residue RGB(44,81,49)). Pixel-level discrimination\n // is fundamentally impossible: residue and design-intent share identical\n // RGB. The only differentiator is CONTEXT â residue forms isolated\n // <=20px components, design forms 5000+ px connected regions.\n // That distinction can only be made via connected-component analysis,\n // which runs server-side in compose_mockup.py (cleanup pass before\n // composition). The shader now catches ONLY near-pure-chromakey leaks\n // (>0.7 greenDom, >0.8 green brightness) â these are unambiguous\n // chromakey artifacts and rarely occur as legitimate design pixels.\n // The server pass handles the dimmer residue interior pixels safely.\n float greenDom = s.g - max(s.r, s.b);\n float chromaCut = smoothstep(0.70, 0.90, greenDom) * step(0.80, s.g);\n s.a *= 1.0 - chromaCut;\n // 2026-06-14 â gamma crush REMOVED. The tunable pow() curve had\n // gone through aggressiveâgentleâgentler iterations without ever\n // matching the 2D back-view mockup (compose_mockup.py) which is\n // the customer-facing source of truth. The texture is already\n // sRGBâlinear converted by Three.js (tex.colorSpace = SRGBColorSpace\n // at the loader), so the design's RGB values land in the diffuse\n // stage in physically-correct linear space. A manual pow() on top\n // is redundant darkening â exactly what crushed the dragon's grey\n // body detail to black on dark fabric. PBR + ACES tonemapping\n // handles tonal range from here on.\n // User-visible faint-rectangle fix (2026-06-06): bg-removed PNGs ship\n // with anti-aliased edges whose alpha can sit around 0.05-0.15 with\n // dark RGB (chromakey artifacts or the artist's edge stroke). The\n // diffuse-stage mix(diffuseColor, s.rgb, s.a) blends 5-15% of that\n // dark colour onto the cyan body, producing the visible printable-\n // area rectangle outline the user reported on the Fiery Gaze back.\n // Sharpen alpha with smoothstep so anything < 0.30 reads as fully\n // transparent and anything > 0.60 reads as fully opaque. The wide\n // band catches both bg-removed PNG anti-alias halos and the dark\n // pixels that chromakey leaves at the silhouette edge, while still\n // preserving intentional 30-60% alpha glow/shadow strokes.\n s.a = smoothstep(0.30, 0.60, s.a) * facingFade;\n return s;\n}\n ").replace("#include <map_fragment>","\n#include <map_fragment>\nvec4 czDecalDiffuse0 = czSampleSlot(uDecalMap0, uDecalNDCMatrix0, uDecalForwardWorld0, uHasDecal0);\ndiffuseColor.rgb = mix(diffuseColor.rgb, czDecalDiffuse0.rgb, czDecalDiffuse0.a);\nvec4 czDecalDiffuse1 = czSampleSlot(uDecalMap1, uDecalNDCMatrix1, uDecalForwardWorld1, uHasDecal1);\ndiffuseColor.rgb = mix(diffuseColor.rgb, czDecalDiffuse1.rgb, czDecalDiffuse1.a);\nvec4 czDecalDiffuse2 = czSampleSlot(uDecalMap2, uDecalNDCMatrix2, uDecalForwardWorld2, uHasDecal2);\ndiffuseColor.rgb = mix(diffuseColor.rgb, czDecalDiffuse2.rgb, czDecalDiffuse2.a);\nvec4 czDecalDiffuse3 = czSampleSlot(uDecalMap3, uDecalNDCMatrix3, uDecalForwardWorld3, uHasDecal3);\ndiffuseColor.rgb = mix(diffuseColor.rgb, czDecalDiffuse3.rgb, czDecalDiffuse3.a);\n ")},f.needsUpdate=!0,R.push(f),t[o]=f,null==(n=i.dispose)||n.call(i)}e.material=Array.isArray(e.material)?t:t[0]}),ei.current=R,E.add(ez),ep(!0),ez.traverse(e=>{e.isMesh&&(e.castShadow=!0)});let A=4*Math.max(u.x,u.z),N=new l.eaF(new l.bdM(A,A),new l.q2({opacity:.45,transparent:!0}));if(N.rotation.x=-Math.PI/2,N.position.y=-u.y/2-.01,N.receiveShadow=!0,E.add(N),"1"===new URLSearchParams(window.location.search).get("debug3d")){let e=window,t=new l.NRn().setFromObject(ez),n=t.getCenter(new l.Pq0),a=t.getSize(new l.Pq0);e.__r3d={scene:E,camera:Z,modelGroup:ez,bodyMesh:ek,finalBbox:{min:t.min.toArray(),max:t.max.toArray(),center:n.toArray(),size:a.toArray()},groupPosition:ez.position.toArray(),groupRotationEuler:ez.rotation.toArray()}}
1if(ek?0===R.length&&em({kind:"fabric",detail:"no fabric material matched â ".concat(a)}):em({kind:"body",detail:"model has no body mesh â ".concat(a)}),ek&&R.length>0){let e=.3*u.z,t=u.z,n=[];ez.traverse(e=>{e.isMesh&&R.includes(e.material)&&n.push(e)});let a=function(e,t,n){if(0===e.length)return t.x;let a=new l.Pq0,r=new l.Pq0,o=[],i=.06*t.y;for(let t of e){t.updateWorldMatrix(!0,!0);let e=t.geometry.attributes.position,s=t.geometry.attributes.normal;if(!e||!s)continue;let u=new l.dwI().getNormalMatrix(t.matrixWorld),c=Math.max(1,Math.floor(e.count/4e3));for(let l=0;l<e.count;l+=c)a.fromBufferAttribute(e,l).applyMatrix4(t.matrixWorld),!(Math.abs(a.y-n.y)>i)&&(r.fromBufferAttribute(s,l).applyMatrix3(u).normalize(),.92>Math.abs(r.z)||o.push(a.x))}if(0===o.length||o.length<8)return t.x;o.sort((e,t)=>e-t);let s=o[Math.floor(.05*o.length)],u=o[Math.floor(.95*o.length)]-s;return u<.2*t.x?t.x:u}(n,u,s.getCenter(new l.Pq0)),r=(()=>{let e=s.min.y+.25*u.y,t=.02*u.y,a=1/0,r=-1/0,o=new l.Pq0;for(let l of n){let n=l.geometry.attributes.position;if(!n)continue;let i=Math.max(1,Math.floor(n.count/2e4));for(let s=0;s<n.count;s+=i)o.fromBufferAttribute(n,s).applyMatrix4(l.matrixWorld),!(Math.abs(o.y-e)>t)&&(o.x<a&&(a=o.x),o.x>r&&(r=o.x))}return r>a?r-a:0})();T&&T({camera:Z,modelRoot:ez,bbox:u.clone(),facingZ:"back"===d?-1:1,view:"back"===d||"left"===d||"right"===d?d:"front",torsoWidth:a>0?a:u.x});let o=new l.Tap;o.setCrossOrigin("anonymous");let i=S.capabilities.getMaxAnisotropy(),c=(n,s,c)=>{var d;let f=null!=(d=null==n?void 0:n.imageUrl)?d:c;f&&o.load(f,o=>{let c,d,f;if(b||!ek)return;
1if(o.colorSpace=l.er$,o.wrapS=l.ghU,o.wrapT=l.ghU,o.anisotropy=i,o.minFilter=l.$_I,o.magFilter=l.k6q,o.generateMipmaps=!0,o.needsUpdate=!0,o.image instanceof HTMLImageElement){let e=function(e){let t=document.createElement("canvas");t.width=e.naturalWidth,t.height=e.naturalHeight;let n=t.getContext("2d");if(!n)return{offsetU:0,offsetV:0,scaleU:1,scaleV:1};n.drawImage(e,0,0);let{data:a}=n.getImageData(0,0,t.width,t.height),r=t.width,l=t.height,o=0,i=0,s=!1,u=4*t.width;for(let e=0;e<t.height;e++)for(let n=0;n<t.width;n++)a[e*u+4*n+3]>16&&(s?(n<r&&(r=n),n>o&&(o=n),e<l&&(l=e),e>i&&(i=e)):(r=n,l=e,o=n,i=e,s=!0));if(!s)return{offsetU:0,offsetV:0,scaleU:1,scaleV:1};let c=o-r+1,d=i-l+1;return{offsetU:r/t.width,offsetV:1-(i+1)/t.height,scaleU:c/t.width,scaleV:d/t.height}}(o.image);o.offset.set(e.offsetU,e.offsetV),o.repeat.set(e.scaleU,e.scaleV),o.needsUpdate=!0}let g=(null==n?void 0:n.view)==="left"||(null==n?void 0:n.view)==="right",v=(null==n?void 0:n.view)==="back"?-1:1;if(n&&g){let e=(e=>{let t="left"===e?1:-1,n=eP.current.sleeve,a=u.x*(n.centerXFrac-n.cubeDepthFrac/2),l=.56*u.x;return r>0&&(a=Math.max(a,r/2*1.08)),{sign:t,centerXWorld:t*(a+l)/2,centerYWorld:u.y*n.centerYFrac,span:u.y*n.spanFrac,cubeDepth:Math.max(l-a,.05*u.x)}})(n.view),t=(n.centerX-.5)*e.span,a=(.5-n.centerY)*e.span+e.centerYWorld,o=Math.max(0,Math.min(n.widthFraction,3)),i=Math.max(0,Math.min(n.heightFraction,3));c=new l.Pq0(e.centerXWorld,a,-e.sign*t),d=new l.O9p(0,e.sign*(Math.PI/2),l.cj9.degToRad(-(n.rotationDeg||0)),"YXZ"),f=new l.Pq0(o*e.span,i*e.span*m.SK,e.cubeDepth)}else if(n){var w,y,x;let o=parseFloat(null!=(w=new URLSearchParams(window.location.search).get("size"))?w:""),i=Number.isFinite(o)&&o>0&&o<3?o:1,h=eP.current.printScale,p="number"==typeof V&&V>0&&V<3?V:null,g=!0===n.isAuthoritative3D,b=parseFloat(null!=(y=new URLSearchParams(window.location.search).get("offsetY"))?y:""),D=Number.isFinite(b)&&b>=-.5&&b<=.5?b:0,M=eP.current.offsetY,C=g?0:(D+M)*u.y,S=parseFloat(null!=(x=new URLSearchParams(window.location.search).get("offsetX"))?x:""),P=Number.isFinite(S)&&S>=-.5&&S<=.5?S:0,z=eP.current.offsetX,k=g?0:(P+z)*u.x,F=(n.centerX-.5)*u.x+k,R=(.5-n.centerY)*u.y+C,E=(a>0?a:u.x)*(null!=p?p:i*h),A=0===s?null==X?void 0:X.widthFraction:null==G?void 0:G.widthFraction,N=0===s?null==X?void 0:X.heightFraction:null==G?void 0:G.heightFraction,_="number"==typeof A&&A>0?Math.min(n.widthFraction,A):n.widthFraction,T="number"==typeof N&&N>0?Math.min(n.heightFraction,N):n.heightFraction,W=Math.max(0,Math.min(_,3))*E,U=Math.max(0,Math.min(T,3))*E*m.SK,j=F,q=R,I=n.garmentFrame;if(I&&!g){let e=null!=p?p:i;if(j=I.cx*u.y,q=(.5-I.cy)*u.y,W=Math.min(I.w,3)*u.y*e,U=Math.min(I.h,3)*u.y*e,I.bw&&void 0!==I.bcx&&r>0){let t=Math.min(I.bw,1.2)*r*e,n=t/Math.max(W,1e-6);W=t,U*=n,j=I.bcx*r}}c=new l.Pq0(1===v?j:-j,q,v*e),d=new l.O9p(0,1===v?0:Math.PI,l.cj9.degToRad(-(n.rotationDeg||0))),f=new l.Pq0(W,U,t)}else{let n=u.y*h,a=u.x*p;c=new l.Pq0(0,n,e),d=new l.O9p(0,0,0),f=new l.Pq0(a,a,t)}for(let e of R)!function(e,t,n,a,r,o){let i=e.userData.decalUniforms;if(!i)return;let s=new l.kn4().makeRotationFromEuler(r).setPosition(a).clone().invert(),u=new l.kn4().makeScale(2/o.x,2/o.y,2/o.z),c=new l.kn4().multiplyMatrices(u,s),d=new l.Pq0(0,0,-1).applyEuler(r).normalize();i["uDecalMap".concat(t)].value=n,i["uDecalNDCMatrix".concat(t)].value.copy(c),i["uDecalForwardWorld".concat(t)].value.copy(d),i["uHasDecal".concat(t)].value=1}(e,s,o,c,d,f)},void 0,e=>{console.error("[Tee3DPreview] slot ".concat(s," texture load failed"),e),em({kind:"texture",detail:"design image failed to load (slot ".concat(s,")")})})};c(null!=q?q:null,0,v),I&&c(I,1,null),(null!=Y?Y:[]).slice(0,2).forEach((e,t)=>{c(e,2+t,null)}),ee.current=c,et.current=e=>{for(let n of R){var t;let a=null==(t=n.userData)?void 0:t.decalUniforms;if(!a)continue;let r=a["uHasDecal".concat(e)];r&&(r.value=0)}}}},void 0,e=>{eF=!0,window.clearTimeout(eR),console.error("[Tee3DPreview] glb load failed",e),em({kind:"glb",detail:r.url})});let eE=new l.I9Y(.5,.45),eA=e=>{let t=S.domElement.getBoundingClientRect();eE.set((e.clientX-t.left)/t.width,(e.clientY-t.top)/t.height)},eN=()=>{eE.set(.5,.45)};S.domElement.addEventListener("pointermove",eA),S.domElement.addEventListener("pointerleave",eN);let e_=0,eT=new l.zD7,eW=()=>
1{b||(ex(),e_=requestAnimationFrame(eW),eg.update(),_.uTime.value=eT.getElapsedTime(),_.uMouse.value.lerp(eE,.06),_.uAspect.value=S.domElement.width/S.domElement.height,eC.render())};eW();let eU=new ResizeObserver(()=>{if(!n)return;let e=n.clientWidth,t=n.clientHeight;S.setSize(e,t,!1),eC.setSize(e,t),eM.resolution.set(Math.max(128,Math.round(e*eD)),Math.max(128,Math.round(t*eD))),eM.setSize(e*eD,t*eD),Z.aspect=e/t,Z.updateProjectionMatrix(),_.uAspect.value=e/t});return eU.observe(n),J.current=()=>{b=!0,cancelAnimationFrame(e_),eU.disconnect(),eg.dispose(),S.domElement.removeEventListener("pointermove",eA),S.domElement.removeEventListener("pointerleave",eN),S.dispose(),U.dispose(),n.contains(S.domElement)&&n.removeChild(S.domElement),E.traverse(e=>{var t,n;if((null==(t=e.geometry)?void 0:t.dispose)&&e.geometry.dispose(),e.material)for(let t of Array.isArray(e.material)?e.material:[e.material])t.map&&t.map.dispose(),null==(n=t.dispose)||n.call(t)})},()=>{var e;window.clearTimeout(eR),null==(e=J.current)||e.call(J),J.current=null}},[x,k,R,ev,eC]),(0,r.useEffect)(()=>{let e=ei.current,t=es.current;if(0===e.length&&!t)return;let n=new l.Q1f(ec||0xffffff),a=n.clone().lerp(new l.Q1f(0xffffff),.6);for(let t of e)t.color.copy(eg.current||ew.current?z:n),t.sheenColor&&t.sheenColor.copy(a),t.needsUpdate=!0;if(t){let e=P(null!=ec?ec:null);t.uColorCenter.value.set(e.center),t.uColorMid.value.set(e.mid),t.uColorEdge.value.set(e.edge)}},[ec]),(0,r.useEffect)(()=>{var e;let t=en.current,n=ea.current,a=el.current;if(!t||!n)return;let r=null!=H?H:null==q?void 0:q.view,l=parseFloat(null!=(e=new URLSearchParams(window.location.search).get("zoom"))?e:""),o=M(t,a,Number.isFinite(l)&&l>=.5&&l<=6?l:eP.current.cameraZoom),i=.04*a.y;"left"===r||"right"===r?t.position.set(("left"===r?1:-1)*o,.1*a.y+i,0):t.position.set(0,i,("back"===r?-1:1)*o),n.target.set(0,i,0),n.update(),eo.current=n.getAzimuthalAngle(),n.autoRotateSpeed=Math.abs(n.autoRotateSpeed)},[H,null==q?void 0:q.view,x]),(0,r.useEffect)(()=>{let e=ee.current,t=et.current;if(!e)return;(null==q?void 0:q.imageUrl)||g?e(null!=q?q:null,0,g):t&&t(0),I?e(I,1,null):t&&t(1);let n=(null!=Y?Y:[]).slice(0,2);[2,3].forEach((a,r)=>{let l=n[r];l?e(l,a,null):t&&t(a)})},[g,q,I,Y]);let ez=function(e){var t,n,a;let r=new URLSearchParams(e).get("bg");if(!r)return null;let l=r.split(",").map(e=>e.trim()).filter(Boolean);if(0===l.length)return null;let o=l[0];return{center:o,mid:null!=(t=l[1])?t:l[0],edge:null!=(a=null!=(n=l[2])?n:l[1])?a:l[0]}}(window.location.search)||P(null!=ec?ec:null),ek=(0,r.useRef)(null);return(0,a.jsxs)("div",{ref:ek,className:"tee-cinematic-bg relative w-full h-full overflow-hidden ".concat(null!=S?S:""),onMouseMove:e=>{let t=e.currentTarget.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*100,a=(e.clientY-t.top)/t.height*100,r=ek.current;r&&(r.style.setProperty("--mx","".concat(n.toFixed(1),"%")),r.style.setProperty("--my","".concat(a.toFixed(1),"%")))},onMouseLeave:()=>{let e=ek.current;e&&(e.style.setProperty("--mx","50%"),e.style.setProperty("--my","55%"))},style:{"--bg-center":ez.center,"--bg-mid":ez.mid,"--bg-edge":ez.edge},children:[(0,a.jsx)("div",{ref:Q,className:"w-full h-full relative z-[1]"}),!eh&&!ef&&(0,a.jsx)("div",{className:"absolute inset-0 z-20 flex items-center justify-center pointer-events-none",children:(0,a.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-full bg-background/85 backdrop-blur-sm border border-border/40 text-xs font-medium text-muted-foreground",children:[(0,a.jsx)(b.A,{className:"w-3.5 h-3.5 animate-spin"}),"Loading 3D previewâ¦"]})}),!A&&(0,a.jsxs)("div",{className:"absolute top-3 left-3 inline-flex items-center gap-1.5 px-2 py-1 rounded-full text-[11px] font-medium bg-background/85 backdrop-blur-sm border border-border/40 z-10 pointer-events-none",children:[(0,a.jsx)(y.A,{className:"w-3 h-3"})," 3D"]}),ef&&!$&&(0,a.jsx)("div",{className:"absolute inset-0 z-20 flex items-center justify-center p-6 pointer-events-none",children:(0,a.jsxs)("div",{className:"pointer-events-auto max-w-sm rounded-xl bg-background/95 backdrop-blur border border-destructive/40 px-4 py-3 text-center shadow-lg",children:[(0,a.jsx)("div",{className:"text-sm font-medium text-destructive mb-1",children:"3D preview couldn't load"}),(0,a.jsxs)("div",{className:"text-xs text-muted-foreground",children:["glb"===ef.kind&&"3D model file failed to download. Check your connection and try again.","texture"===ef.kind&&"Design image failed to load onto the model. Try Add to canvas again.","fabric"===ef.kind&&"Fabric material missing from model. This garment may need a 3D model update.","body"===ef.kind&&"Body mesh missing from model. This garment may need a 3D model update.","timeout"===ef.kind&&"3D model didnât respond in time. Slow connection?","unsupported"===ef.kind&&"No 3D model exists for this garment yet. Set garment_config.model_3d on its template once one is added."]}),ef.detail&&(0,a.jsx)("div",{className:"text-[10px] text-muted-foreground
1/70 mt-1.5 font-mono",children:ef.detail}),("glb"===ef.kind||"timeout"===ef.kind)&&(0,a.jsx)("button",{type:"button",onClick:()=>{em(null),eS(e=>e+1)},className:"mt-2 inline-flex items-center gap-1 px-2.5 py-1 rounded-md border border-border bg-background hover:bg-muted text-xs font-medium",children:"Retry"})]})}),(0,a.jsx)("style",{children:"\n @property --mx { syntax: '<percentage>'; initial-value: 50%; inherits: false; }\n @property --my { syntax: '<percentage>'; initial-value: 55%; inherits: false; }\n @property --pulse { syntax: '<number>'; initial-value: 1; inherits: false; }\n .tee-cinematic-bg {\n --mx: 50%;\n --my: 55%;\n --pulse: 1;\n background: radial-gradient(\n ellipse at var(--mx) var(--my),\n var(--bg-center) 0%,\n var(--bg-mid) 55%,\n var(--bg-edge) 100%\n );\n transition: --mx 0.5s ease-out, --my 0.5s ease-out;\n animation: teeCinematicBreathe 11s ease-in-out infinite;\n }\n @keyframes teeCinematicBreathe {\n 0%, 100% { filter: brightness(1) saturate(1); }\n 50% { filter: brightness(1.08) saturate(1.18); }\n }\n /* (B) film-grain shimmer â SVG fractalNoise tiled at 5% opacity,\n jittered with steps() for a flickering \"premium\" texture.\n Pointer-events:none so it never blocks the orbit controls. */\n .tee-cinematic-bg::after {\n content: '';\n position: absolute;\n inset: -10%;\n z-index: 2;\n pointer-events: none;\n background-image: url(\"data:image/svg+xml;utf8,%3Csvg viewBox='0 0 220 220' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\");\n background-size: 200px 200px;\n opacity: 0.07;\n mix-blend-mode: overlay;\n animation: teeCinematicGrain 0.55s steps(6) infinite;\n }\n @keyframes teeCinematicGrain {\n 0% { transform: translate(0, 0); }\n 16% { transform: translate(-3%, -4%); }\n 33% { transform: translate(-5%, 2%); }\n 50% { transform: translate(2%, -3%); }\n 66% { transform: translate(4%, 3%); }\n 83% { transform: translate(-2%, 4%); }\n 100% { transform: translate(0, 0); }\n }\n "})]})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.