@layoutit/polycss 0.2.0 → 0.2.2

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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as gs,cameraCullVisibleSignature as ys,computeSceneBbox as bs,findOverlappingPolygonDuplicates as xs,inverseRotateVec3 as uo,isVoxelCameraCullableNormalGroups as vs,mergePolygons as Ps,normalFacesCamera as Es,parseHexColor as Zt,polygonCssSurfaceNormal as mo}from"@layoutit/polycss-core";import{parsePureColor as _n}from"@layoutit/polycss-core";var Tt=50,_t=[.4,-.7,.59],kt="#ffffff",Rt=1,Ot="#ffffff",Dt=.4,He=4096,gn=1,ko=.1,Ro=1,kn=He*He,Oo=kn*3,Mt=2048,Do=4*1024*1024,Ho=16*1024*1024,Io=.995,Vo=12,Oe=new Map,St=new WeakMap,se=.001,de=1e-9,Fo=1e-4,zo=.1,yn=.01,Bo=.75,No=1,Yo=250,bn=1.5,Xo=.75,$o=3,Uo=2,Go=4,Lt=64,Le=64,Ee=64,jo=128,xn=50,vn=1e-7,Pn=16,Ct=.9,Wo=.05,Zo=Number.POSITIVE_INFINITY,qo=.6;function Qo(e){let n=Oe.get(e);return n||(n=new Promise((t,o)=>{let r=new Image;r.decoding="async",r.onload=()=>t(r),r.onerror=()=>o(new Error(`texture load failed: ${e}`)),r.src=e}),Oe.set(e,n),n.then(()=>{Oe.get(e)===n&&Oe.delete(e)},()=>{Oe.get(e)===n&&Oe.delete(e)})),n}function ot(e){let n=typeof e=="string"?Number(e):e;return n===void 0||!Number.isFinite(n)?1:Math.min(Ro,Math.max(ko,n))}function Ht(e,n){let t=e.toFixed(n).replace(/\.?0+$/,"");return Object.is(Number(t),-0)?"0":t}function Ie(e,n=Go){let t=Ht(e,n);return Number(t)===0||Object.is(Number(t),-0)?"0":`${t}px`}function Ae(e,n=$o){return e.map(t=>Ht(t,n)).join(",")}function Rn(e){if(e.length<3)return!1;let n=0;for(let t=0;t<e.length;t++){let o=e[t],r=e[(t+1)%e.length],s=e[(t+2)%e.length],i=(r[0]-o[0])*(s[1]-r[1])-(r[1]-o[1])*(s[0]-r[0]);if(Math.abs(i)<=de)return!1;let a=Math.sign(i);if(n===0)n=a;else if(a!==n)return!1}return!0}function Ko(e){let n=0;for(let t=0;t<e.length;t++){let o=e[t],r=e[(t+1)%e.length];n+=o[0]*r[1]-o[1]*r[0]}return n/2}function Jo(e,n,t,o){let r=n[0]-e[0],s=n[1]-e[1],i=o[0]-t[0],a=o[1]-t[1],l=r*a-s*i;if(Math.abs(l)<=de)return null;let u=t[0]-e[0],p=t[1]-e[1],d=(u*a-p*i)/l;return[e[0]+d*r,e[1]+d*s]}function It(e,n){if(e.length<6||e.length%2!==0||n<=0)return e;let t=[];for(let l=0;l<e.length;l+=2)t.push([e[l],e[l+1]]);if(!Rn(t))return $e(e,n);let o=Ko(t);if(Math.abs(o)<=de)return $e(e,n);let r=o>0?1:-1,s=[];for(let l=0;l<t.length;l++){let u=t[l],p=t[(l+1)%t.length],d=p[0]-u[0],f=p[1]-u[1],g=Math.hypot(d,f);if(g<=de)return $e(e,n);let m=r*(f/g)*n,h=r*(-d/g)*n;s.push({a:[u[0]+m,u[1]+h],b:[p[0]+m,p[1]+h]})}let i=[],a=Math.max(2,n*4);for(let l=0;l<t.length;l++){let u=s[(l+t.length-1)%t.length],p=s[l],d=Jo(u.a,u.b,p.a,p.b);if(!d)return $e(e,n);let f=t[l],g=d[0]-f[0],m=d[1]-f[1],h=Math.hypot(g,m);h>a?i.push(f[0]+g/h*a,f[1]+m/h*a):i.push(d[0],d[1])}return i}function En(e,n){return typeof e=="number"&&Number.isFinite(e)?e:n}function Vt(e){let t=e?.defaultView?.__polycssProjectiveQuadGuards,o=t?.maxWeightRatio,r=Math.max(0,En(t?.denomEps,Wo)),s=typeof o=="number"&&Number.isFinite(o)&&o>0?Math.max(1,o):Zo,i=Math.max(0,En(t?.bleed,qo));return{denomEps:r,maxWeightRatio:s,bleed:i,disableGuards:t?.disableGuards===!0}}function Cn(e,n){if(e.length!==4||!Rn(e))return null;let[t,o,r,s]=e,i=t[0]-o[0]+r[0]-s[0],a=t[1]-o[1]+r[1]-s[1],l=o[0]-r[0],u=s[0]-r[0],p=o[1]-r[1],d=s[1]-r[1],f=l*d-p*u;if(Math.abs(f)<=de)return null;let g=(i*d-a*u)/f,m=(l*a-p*i)/f,h=[1,1+g,1+g+m,1+m];if(h.some(E=>!Number.isFinite(E)))return null;let y=Math.min(...h),v=Math.max(...h);return!n.disableGuards&&(y<=n.denomEps||v/y>n.maxWeightRatio)?null:{g,h:m,w1:1+g,w3:1+m}}function er(e,n,t,o,r,s,i,a){if(e.length!==8)return null;let l=[[e[0],e[1]],[e[2],e[3]],[e[4],e[5]],[e[6],e[7]]];if(!Cn(l,a))return null;let u=It(e,a.bleed),p=[[u[0],u[1]],[u[2],u[3]],[u[4],u[5]],[u[6],u[7]]],d=Cn(p,a);if(!d)return null;let{g:f,h:g,w1:m,w3:h}=d,[y,v,,E]=p,A=[r+y[0]*n[0]+y[1]*t[0],s+y[0]*n[1]+y[1]*t[1],i+y[0]*n[2]+y[1]*t[2]],x=([O,M],P)=>[(P-1)*r+(P*O-y[0])*n[0]+(P*M-y[1])*t[0],(P-1)*s+(P*O-y[0])*n[1]+(P*M-y[1])*t[1],(P-1)*i+(P*O-y[0])*n[2]+(P*M-y[1])*t[2]],C=[...x(v,m),f,...x(E,h),g,o[0],o[1],o[2],0,A[0],A[1],A[2],1];for(let O=0;O<8;O+=1)C[O]/=Lt;return Ae(C,6)}function Je(e,n=Uo){let t=Ht(e,n);return Number(t)===0?"0":`${t}%`}function tr(e,n,t,o,r,s){let i=(e-t)*(s-o)-(n-o)*(r-t);return Math.abs(i)>vn?!1:(e-t)*(e-r)+(n-o)*(n-s)<=vn}function nr(e,n=xn,t=xn){let o=!1;for(let r=0,s=e.length-1;r<e.length;s=r++){let[i,a]=e[r],[l,u]=e[s];if(tr(n,t,i,a,l,u))return!0;a>t!=u>t&&n<(l-i)*(t-a)/(u-a)+i&&(o=!o)}return o}function On(e){return e.reduce((n,t)=>n+t.width*t.height,0)}function or(e,n){let t=On(e);if(t<=0)return 1;let o=Math.max(1,...e.map(i=>Math.max(i.width,i.height))),r=Mt/o,s=Math.sqrt(n/(t*4));return ot(Math.min(r,s))}function rr(e,n){let t=On(e),o=.5;return t<=kn?o=1:t<=Oo&&(o=.75),ot(Math.min(o,or(e,n)))}function sr(e,n){return e.reduce((t,o)=>Math.max(t,Math.ceil(o.width*n),Math.ceil(o.height*n)),0)}function ir(e,n){return e.reduce((t,o)=>t+Math.ceil(o.width*n)*Math.ceil(o.height*n)*4,0)}function ar(e,n,t){let o=sr(e,n),r=ir(e,n),s=o>Mt?Mt/o:1,i=r>t?Math.sqrt(t/r):1;return Math.min(s,i)}function lr(e,n,t){let o=rr(n.pages,t),r=o===1?n:tt(e,o);for(let s=0;s<4;s++){let i=ar(r.pages,o,t);if(i>=1)break;let a=ot(o*i*Io);if(a>=o)break;o=a,r=tt(e,o)}return{packed:r,atlasScale:o}}function cr(e){return Dn(e)?Do:Ho}function Dn(e){if(!e)return!1;let t=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return t?t("(pointer: coarse)").matches||t("(hover: none)").matches:!1}function ur(e,n){return e!==void 0&&e!=="auto"||Dn(n)?Ee:jo}function dr(e,n){let t=e.matrix.split(",").map(o=>Number(o));return t.length!==16||t.some(o=>!Number.isFinite(o))?e.canonicalMatrix:(t[0]*=e.canvasW/n,t[1]*=e.canvasW/n,t[2]*=e.canvasW/n,t[4]*=e.canvasH/n,t[5]*=e.canvasH/n,t[6]*=e.canvasH/n,Ae(t))}function An(e,n){for(let t of e.entries)t&&(t.atlasCanonicalSize=n,t.atlasMatrix=dr(t,n));return e}function Ce(e){return e.atlasCanonicalSize??Ee}function Hn(e,n,t){let o=ur(n,t);if(n!==void 0&&n!=="auto"){let i=ot(n);return{packed:An(tt(e,i),o),atlasScale:i,atlasCanonicalSize:o}}let r=tt(e,1),s=lr(e,r,cr(t));return{packed:An(s.packed,o),atlasScale:s.atlasScale,atlasCanonicalSize:o}}function mr(e){return Math.max(gn,Math.ceil(gn/e))}function ve(e,n,t=1,o=0,r=0,s=1,i=0,a=0){e.setTransform(t*n,o*n,r*n,s*n,i*n,a*n)}function Me(e){let n=_n(e);return n?{r:n.rgb[0],g:n.rgb[1],b:n.rgb[2]}:{r:255,g:255,b:255}}function Ft({r:e,g:n,b:t}){return`${e},${n},${t}`}function pr(e){return _n(e)?.alpha??1}function fr({r:e,g:n,b:t}){let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(n)}${o(t)}`}function ee(e,n,t){let o=e.getAttribute("style")??"",r=`${n}:${t}`,s=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(^|;)\\s*${s}\\s*:[^;]*`,"i"),a=i.test(o)?o.replace(i,(l,u)=>`${u}${r}`):`${o}${o.trim()&&!o.trim().endsWith(";")?";":""}${r}`;a!==o&&e.setAttribute("style",a)}function pe(e,n){let t=e.getAttribute("style")??"";if(!t)return;let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=new RegExp(`^\\s*${o}\\s*:`,"i"),s=t.split(";").map(i=>i.trim()).filter(i=>i&&!r.test(i)).join(";");s?e.setAttribute("style",s):e.removeAttribute("style")}function In(e,n,t,o,r){let s=Me(e),i=Me(t),a=Me(o),l=a.r/255*r+i.r/255*n,u=a.g/255*r+i.g/255*n,p=a.b/255*r+i.b/255*n,d=Math.max(0,Math.min(255,Math.round(s.r*l))),f=Math.max(0,Math.min(255,Math.round(s.g*u))),g=Math.max(0,Math.min(255,Math.round(s.b*p))),m=pr(e);return m<1?`rgba(${d}, ${f}, ${g}, ${m})`:fr({r:d,g:f,b:g})}function Vn(e,n,t,o){let r=Me(n),s=Me(t);return{r:s.r/255*o+r.r/255*e,g:s.g/255*o+r.g/255*e,b:s.b/255*o+r.b/255*e}}function hr({r:e,g:n,b:t}){let o=r=>Math.round(Math.max(0,Math.min(1,r))*255);return`rgb(${o(e)} ${o(n)} ${o(t)})`}function gr(e,n,t,o,r,s,i){Math.abs(s.r-1)<.001&&Math.abs(s.g-1)<.001&&Math.abs(s.b-1)<.001||(e.save(),ve(e,i),e.globalCompositeOperation="multiply",e.fillStyle=hr(s),e.fillRect(n,t,o,r),e.restore())}function yr(e,n,t,o,r,s,i){let a=n.naturalWidth||n.width||1,l=n.naturalHeight||n.height||1,u=Math.max(r/a,s/l),p=a*u,d=l*u;ve(e,i),e.drawImage(n,t+(r-p)/2,o+(s-d)/2,p,d)}function et(e){return`${e[0]},${e[1]},${e[2]}`}function br(e,n){let t=et(e),o=et(n);return t<o?`${t}|${o}`:`${o}|${t}`}function Fn(e,n){return et(e)<et(n)?[n[0]-e[0],n[1]-e[1],n[2]-e[2]]:[e[0]-n[0],e[1]-n[1],e[2]-n[2]]}function xr(e){return!e.texture}function Ge(e,n,t){return e.map(o=>[o[1]*n,o[0]*n,o[2]*t])}function rt(e){if(e.length<3)return null;let n=e[0],t=0,o=0,r=0;for(let i=1;i+1<e.length;i++){let a=e[i],l=e[i+1],u=[a[0]-n[0],a[1]-n[1],a[2]-n[2]],p=[l[0]-n[0],l[1]-n[1],l[2]-n[2]];t-=u[1]*p[2]-u[2]*p[1],o-=u[2]*p[0]-u[0]*p[2],r-=u[0]*p[1]-u[1]*p[0]}let s=Math.hypot(t,o,r);return s<=de?null:(t/=s,o/=s,r/=s,[t,o,r])}function Ve(e,n){return e[0]*n[0]+e[1]*n[1]+e[2]*n[2]}function vr(e,n){return[e[1]*n[2]-e[2]*n[1],e[2]*n[0]-e[0]*n[2],e[0]*n[1]-e[1]*n[0]]}function Pr(e,n,t){if(!e.vertices||e.vertices.length<3)return null;let o=Ge(e.vertices,n,t),r=rt(o);return r?{pts:o,normal:r,planeD:Ve(r,o[0]),optimizable:xr(e)}:null}function Er(e,n){return!e||!n||!e.optimizable||!n.optimizable?!1:zn(e,n)}function zn(e,n){return!e||!n||Ve(e.normal,n.normal)<1-Fo?!1:Math.abs(e.planeD-n.planeD)<=zo}function Mn(e,n){if(!e)return null;let t=n.directionalLight,o=n.ambientLight,r=t?.direction??_t,s=t?.color??kt,i=Math.max(0,t?.intensity??Rt),a=o?.color??Ot,l=Math.max(0,o?.intensity??Dt),u=Math.hypot(r[0],r[1],r[2])||1,p=r[0]/u,d=r[1]/u,f=r[2]/u,g=i*Math.max(0,e.normal[0]*p+e.normal[1]*d+e.normal[2]*f),m=Vn(g,s,a,l);return m.r*.2126+m.g*.7152+m.b*.0722}function Cr(e){let n=[...e],t=Math.abs(n[0])>de?0:Math.abs(n[1])>de?1:2;return n[t]<0&&(n[0]*=-1,n[1]*=-1,n[2]*=-1),`${n[0].toFixed(6)},${n[1].toFixed(6)},${n[2].toFixed(6)}`}function Ue(e,n,t,o,r={}){let s=Ve(o,t),i=[o[0]-s*t[0],o[1]-s*t[1],o[2]-s*t[2]],a=Math.hypot(i[0],i[1],i[2]);if(a<=de)return null;let l=[i[0]/a,i[1]/a,i[2]/a],u=[t[1]*l[2]-t[2]*l[1],t[2]*l[0]-t[0]*l[2],t[0]*l[1]-t[1]*l[0]],p=Math.hypot(u[0],u[1],u[2]);if(p<=de)return null;let d=[u[0]/p,u[1]/p,u[2]/p],f=e.map(w=>{let I=w[0]-n[0],F=w[1]-n[1],B=w[2]-n[2];return[I*l[0]+F*l[1]+B*l[2],I*d[0]+F*d[1]+B*d[2]]}),g=r.boundsOrigin??n,m=n[0]-g[0],h=n[1]-g[1],y=n[2]-g[2],v=m*l[0]+h*l[1]+y*l[2],E=m*d[0]+h*d[1]+y*d[2],A=1/0,x=1/0,C=-1/0,O=-1/0;for(let[w,I]of f){let F=w+v,B=I+E;F<A&&(A=F),F>C&&(C=F),B<x&&(x=B),B>O&&(O=B)}let M=C-A,P=O-x;if(!Number.isFinite(M)||!Number.isFinite(P))return null;let X=r.snapBounds?Math.floor(A+se):A,$=r.snapBounds?Math.floor(x+se):x,W=r.snapBounds?Math.ceil(C-se):C,te=r.snapBounds?Math.ceil(O-se):O,S=Math.max(1,r.snapBounds?W-X:Math.ceil(M)),U=Math.max(1,r.snapBounds?te-$:Math.ceil(P));return{xAxis:l,yAxis:d,local2D:f,shiftX:v-X,shiftY:E-$,canvasW:S,canvasH:U,pixelArea:S*U,rawArea:M*P}}function Ar(e,n,t,o){let r=0,s=0;for(let i of e){let a=n[i];if(!a)return null;let l=Ue(a.pts,a.pts[0],a.normal,t,{boundsOrigin:o,snapBounds:!0});if(!l)return null;r+=l.pixelArea,s+=l.rawArea}return{pixelArea:r,rawArea:s}}function Mr(e,n){let t=n[e[0]]?.pts[0];if(!t)return null;let o={pixelArea:0,rawArea:0},r=null,s=new Set;for(let i of e){let a=n[i];if(!a)continue;let l=[a.pts[1][0]-a.pts[0][0],a.pts[1][1]-a.pts[0][1],a.pts[1][2]-a.pts[0][2]],u=Ue(a.pts,a.pts[0],a.normal,l);o&&u?(o.pixelArea+=u.pixelArea,o.rawArea+=u.rawArea):o=null;for(let p=0;p<a.pts.length;p++){let d=Fn(a.pts[p],a.pts[(p+1)%a.pts.length]),f=Ue(a.pts,a.pts[0],a.normal,d);if(!f)continue;let g=Cr(f.xAxis);if(s.has(g))continue;s.add(g);let m=Ar(e,n,f.xAxis,t);m&&(!r||m.pixelArea<r.pixelArea||m.pixelArea===r.pixelArea&&m.rawArea<r.rawArea-se)&&(r={xAxis:f.xAxis,...m})}}return r&&o&&(r.pixelArea<o.pixelArea||r.pixelArea===o.pixelArea&&r.rawArea<=o.rawArea+se)?{xAxis:r.xAxis,boundsOrigin:t,seamEdges:new Set}:null}function zt(e,n){let t=n.tileSize??Tt,o=n.layerElevation??t,r=e.map(d=>Pr(d,t,o)),s=new Map,i=e.map(()=>new Set),a=e.map(()=>new Set);for(let d=0;d<e.length;d++){let f=e[d].vertices;if(!(!f||f.length<3))for(let g=0;g<f.length;g++){let m=br(f[g],f[(g+1)%f.length]),h=s.get(m),y={polygon:d,edge:g};h?h.push(y):s.set(m,[y])}}let l=e.map(()=>new Set);for(let d of s.values())if(!(d.length<2))for(let f=0;f<d.length;f++)for(let g=f+1;g<d.length;g++){let m=d[f],h=d[g],y=m.polygon,v=h.polygon;if(e[y].texture&&e[v].texture&&(a[m.polygon].add(m.edge),a[h.polygon].add(h.edge)),zn(r[y],r[v]))i[m.polygon].add(m.edge),i[h.polygon].add(h.edge);else{let E=Mn(r[y],n),A=Mn(r[v],n);E!==null&&A!==null&&(E<=A+yn&&i[m.polygon].add(m.edge),A<=E+yn&&i[h.polygon].add(h.edge))}Er(r[y],r[v])&&(l[y].add(v),l[v].add(y))}let u=Array(e.length).fill(void 0),p=new Set;for(let d=0;d<e.length;d++){if(p.has(d)||!r[d]?.optimizable)continue;let f=[],g=[d];for(p.add(d);g.length>0;){let h=g.pop();f.push(h);for(let y of l[h])p.has(y)||(p.add(y),g.push(y))}if(f.length<2)continue;let m=Mr(f,r);if(m)for(let h of f)u[h]={xAxis:m.xAxis,boundsOrigin:m.boundsOrigin,seamEdges:i[h],textureEdgeRepairEdges:a[h]}}for(let d=0;d<e.length;d++)!u[d]&&(i[d].size>0||a[d].size>0)&&(u[d]={seamEdges:i[d],textureEdgeRepairEdges:a[d]});return u}function Sr(e){if(typeof e.toBlob=="function")return new Promise(n=>{e.toBlob(t=>{n(t?URL.createObjectURL(t):null)},"image/png")});try{return Promise.resolve(e.toDataURL("image/png"))}catch{return Promise.resolve(null)}}function Sn(e,n,t,o){if(o.optimize&&o.fixedXAxis)return Ue(e,n,t,o.fixedXAxis,{boundsOrigin:o.boundsOrigin,snapBounds:o.snapBounds});let r=null,s=o.optimize&&o.seamEdges&&o.seamEdges.size>0?Array.from(o.seamEdges):null,i=s??(o.optimize?e.map((a,l)=>l):[0]);for(let a of i){let l=(a+1)%e.length,u=s?Fn(e[a],e[l]):[e[l][0]-e[a][0],e[l][1]-e[a][1],e[l][2]-e[a][2]],p=Ue(e,n,t,u,{boundsOrigin:o.boundsOrigin,snapBounds:o.snapBounds});p&&(!r||p.pixelArea<r.pixelArea||p.pixelArea===r.pixelArea&&p.rawArea<r.rawArea-se)&&(r=p)}return r}function Lr(e){if(e.local2D.length!==4)return!1;let n=[],t=[],o=(r,s)=>{for(let i of r)if(Math.abs(i-s)<=se)return;r.push(s)};for(let[r,s]of e.local2D)o(n,r+e.shiftX),o(t,s+e.shiftY);if(n.length!==2||t.length!==2||(n.sort((r,s)=>r-s),t.sort((r,s)=>r-s),Math.abs(n[0])>se||Math.abs(t[0])>se||n[1]-n[0]<=se||t[1]-t[0]<=se))return!1;for(let[r,s]of e.local2D){let i=r+e.shiftX,a=s+e.shiftY,l=Math.abs(i-n[0])<=se||Math.abs(i-n[1])<=se,u=Math.abs(a-t[0])<=se||Math.abs(a-t[1])<=se;if(!l||!u)return!1}return!0}function Bn(e,n){if(e.length<3||n.length<3)return null;let[t,o,r]=e,[s,i,a]=n,l=t[0],u=t[1],p=o[0],d=o[1],f=r[0],g=r[1],m=s[0],h=1-s[1],y=i[0],v=1-i[1],E=a[0],A=1-a[1],x=y-m,C=v-h,O=E-m,M=A-h,P=x*M-O*C;if(Math.abs(P)<=1e-9)return null;let X=p-l,$=f-l,W=d-u,te=g-u,S={a:(X*M-$*C)/P,b:(x*$-O*X)/P,c:(W*M-te*C)/P,d:(x*te-O*W)/P,e:0,f:0};return S.e=l-S.a*m-S.b*h,S.f=u-S.c*m-S.d*h,S}function Nn(e){if(e.length===0)return null;let n=1/0,t=1/0,o=-1/0,r=-1/0;for(let s of e){let i=s[0],a=1-s[1];if(!Number.isFinite(i)||!Number.isFinite(a))return null;n=Math.min(n,i),o=Math.max(o,i),t=Math.min(t,a),r=Math.max(r,a)}return{minU:n,minV:t,maxU:o,maxV:r}}function wr(e,n,t,o,r,s,i,a){let u=Ge(e.vertices,n,t).map(f=>{let g=f[0]-o[0],m=f[1]-o[1],h=f[2]-o[2];return[g*r[0]+m*r[1]+h*r[2]+i,g*s[0]+m*s[1]+h*s[2]+a]}),p=Bn(u,e.uvs),d=Nn(e.uvs);return!p&&!d?null:{screenPts:u.flatMap(([f,g])=>[f,g]),uvAffine:p,uvSampleRect:d}}function $e(e,n){if(e.length<6||n<=0)return e;let t=0,o=0,r=e.length/2;for(let i=0;i<e.length;i+=2)t+=e[i],o+=e[i+1];t/=r,o/=r;let s=e.slice();for(let i=0;i<s.length;i+=2){let a=s[i]-t,l=s[i+1]-o,u=Math.hypot(a,l);u<=se||(s[i]+=a/u*n,s[i+1]+=l/u*n)}return s}function wt(e,n,t,o){for(let r=0;r<o.length;r+=2){let s=n+o[r],i=t+o[r+1];r===0?e.moveTo(s,i):e.lineTo(s,i)}e.closePath()}function Bt(e,n,t,o,r){let{vertices:s,texture:i,uvs:a}=e;if(!s||s.length<3)return null;let l=t.tileSize??Tt,u=t.layerElevation??l,p=Ge(s,l,u),d=p[0],f=p[1],g=[f[0]-d[0],f[1]-d[1],f[2]-d[2]];if(Math.hypot(g[0],g[1],g[2])===0)return null;let h=rt(p);if(!h)return null;let y=Sn(p,d,h,{optimize:!1}),v=i||y&&Lr(y)?y:Sn(p,d,h,{optimize:!0,fixedXAxis:r?.xAxis,boundsOrigin:r?.boundsOrigin,snapBounds:!!r,seamEdges:r?.seamEdges});if(!v)return null;let{xAxis:E,yAxis:A,local2D:x}=v,C=i&&r?.textureEdgeRepairEdges?.size?r.textureEdgeRepairEdges:null,O=!!(i&&C),M=v.shiftX,P=v.shiftY,X=v.canvasW,$=v.canvasH,W=[];for(let[V,D]of x)W.push(V+M,D+P);let te=d[0]-M*E[0]-P*A[0],S=d[1]-M*E[1]-P*A[1],U=d[2]-M*E[2]-P*A[2],w=Ae([E[0],E[1],E[2],0,A[0],A[1],A[2],0,h[0],h[1],h[2],0,te,S,U,1]),I=Ae([E[0]*X,E[1]*X,E[2]*X,0,A[0]*$,A[1]*$,A[2]*$,0,h[0],h[1],h[2],0,te,S,U,1]),F=Ae([E[0]*X/Ee,E[1]*X/Ee,E[2]*X/Ee,0,A[0]*$/Ee,A[1]*$/Ee,A[2]*$/Ee,0,h[0],h[1],h[2],0,te,S,U,1]),B=!i&&s.length===4?er(W,E,A,h,te,S,U,o):null,J=t.directionalLight,ae=t.ambientLight,k=J?.direction??_t,j=J?.color??kt,Z=Math.max(0,J?.intensity??Rt),re=ae?.color??Ot,ne=Math.max(0,ae?.intensity??Dt),ce=Math.hypot(k[0],k[1],k[2])||1,me=k[0]/ce,ue=k[1]/ce,le=k[2]/ce,fe=Z*Math.max(0,h[0]*me+h[1]*ue+h[2]*le),he=Vn(fe,j,re,ne),c=In(e.color??"#cccccc",fe,j,re,ne),b=null,R=null;i&&a&&a.length>=3&&a.length===s.length&&(R=Nn(a),b=Bn(x.map(([V,D])=>[V+M,D+P]),a));let _=i&&e.textureTriangles?.length?e.textureTriangles.map(V=>wr(V,l,u,d,E,A,M,P)).filter(V=>!!V):null;return{index:n,polygon:e,texture:i,tileSize:l,layerElevation:u,matrix:w,canonicalMatrix:I,atlasMatrix:F,projectiveMatrix:B,canvasW:X,canvasH:$,screenPts:W,uvAffine:b,uvSampleRect:R,textureTriangles:_,textureEdgeRepairEdges:C,textureEdgeRepair:O,normal:h,textureTint:he,shadedColor:c}}function st(e,n,t){if(e.texture||e.vertices.length!==3)return null;let o=t.tileSize??Tt,r=t.layerElevation??o,s=Ge(e.vertices,o,r),i=rt(s);if(!i)return null;let a=[{a:0,b:1,c:2},{a:1,b:2,c:0},{a:2,b:0,c:1}].map(Q=>{let H=s[Q.a],q=s[Q.b];return{...Q,length:Math.hypot(q[0]-H[0],q[1]-H[1],q[2]-H[2])}}).sort((Q,H)=>H.length-Q.length),l=a[0].a,u=a[0].b,p=a[0].c,d=s[l],f=s[u],g=s[p],m=a[0].length;if(m<=de)return null;let h=[(f[0]-d[0])/m,(f[1]-d[1])/m,(f[2]-d[2])/m],y=[g[0]-d[0],g[1]-d[1],g[2]-d[2]],v=Ve(y,h),E=[d[0]+h[0]*v,d[1]+h[1]*v,d[2]+h[2]*v],A=[E[0]-g[0],E[1]-g[1],E[2]-g[2]],x=Math.hypot(A[0],A[1],A[2]);if(x<=de)return null;let C=[A[0]/x,A[1]/x,A[2]/x];if(Ve(vr(h,C),i)<0){let Q=u;if(u=l,l=Q,d=s[l],f=s[u],m=Math.hypot(f[0]-d[0],f[1]-d[1],f[2]-d[2]),m<=de)return null;h=[(f[0]-d[0])/m,(f[1]-d[1])/m,(f[2]-d[2])/m];let H=[g[0]-d[0],g[1]-d[1],g[2]-d[2]];v=Ve(H,h),E=[d[0]+h[0]*v,d[1]+h[1]*v,d[2]+h[2]*v],A=[E[0]-g[0],E[1]-g[1],E[2]-g[2]];let q=Math.hypot(A[0],A[1],A[2]);if(q<=de)return null;C=[A[0]/q,A[1]/q,A[2]/q]}let O=Math.max(0,Math.min(m,v)),M=Math.max(0,m-O),P=It([O,0,0,x,O+M,x],Xo),X=[P[0],P[1]],$=[P[2],P[3]],W=[P[4],P[5]],te=($[1]+W[1])/2,S=X[0]-$[0],U=W[0]-X[0],w=te-X[1];if(S<=de||U<=de||w<=de||!Number.isFinite(S+U+w))return null;let I=t.directionalLight,F=t.ambientLight,B=I?.direction??_t,J=I?.color??kt,ae=Math.max(0,I?.intensity??Rt),k=F?.color??Ot,j=Math.max(0,F?.intensity??Dt),Z=Math.hypot(B[0],B[1],B[2])||1,re=B[0]/Z,ne=B[1]/Z,ce=B[2]/Z,me=ae*Math.max(0,i[0]*re+i[1]*ne+i[2]*ce),ue=In(e.color??"#cccccc",me,J,k,j),le=t.textureLighting??"baked",fe=Me(e.color??"#cccccc"),he=ue===t.solidPaintDefaults?.paintColor,c=le==="dynamic"&&Ft(fe)===t.solidPaintDefaults?.dynamicColorKey,b=le==="dynamic"||he?"":`color:${ue};`,R=le==="dynamic"?`--pnx:${i[0].toFixed(4)};--pny:${i[1].toFixed(4)};--pnz:${i[2].toFixed(4)};`+(c?"":`--psr:${(fe.r/255).toFixed(4)};--psg:${(fe.g/255).toFixed(4)};--psb:${(fe.b/255).toFixed(4)};`):"",_=([Q,H])=>[g[0]+(Q-O)*h[0]+H*C[0],g[1]+(Q-O)*h[1]+H*C[1],g[2]+(Q-O)*h[2]+H*C[2]],V=_(X),D=_([$[0],te]),Y=_([W[0],te]),L=Le/2,N=[(Y[0]-D[0])/Le,(Y[1]-D[1])/Le,(Y[2]-D[2])/Le],z=[V[0]-N[0]*L,V[1]-N[1]*L,V[2]-N[2]*L],G=[(D[0]-z[0])/Le,(D[1]-z[1])/Le,(D[2]-z[2])/Le],T=`transform:matrix3d(${Ae([N[0],N[1],N[2],0,G[0],G[1],G[2],0,i[0],i[1],i[2],0,z[0],z[1],z[2],1])});`+b+R;return{index:n,polygon:e,styleText:T}}function tt(e,n=1){let t=Array(e.length).fill(null),o=[],r=mr(n),s=e.filter(l=>!!l).sort((l,u)=>u.canvasH-l.canvasH||u.canvasW-l.canvasW||l.index-u.index),i=()=>({width:r,height:r,entries:[],shelves:[]}),a=(l,u,p)=>{if(l.sealed)return null;for(let g of l.shelves)if(u.canvasH<=g.height&&g.x+u.canvasW+r<=He){let m={...u,pageIndex:p,x:g.x,y:g.y};return g.x+=u.canvasW+r*2,l.entries.push(m),l.width=Math.max(l.width,m.x+u.canvasW+r),m}let d=l.shelves.length===0?r:l.height+r;if(d+u.canvasH+r>He)return null;let f={...u,pageIndex:p,x:r,y:d};return l.shelves.push({x:r+u.canvasW+r*2,y:d,height:u.canvasH}),l.entries.push(f),l.width=Math.max(l.width,f.x+u.canvasW+r),l.height=Math.max(l.height,d+u.canvasH+r),f};for(let l of s){if(l.canvasW+r*2>He||l.canvasH+r*2>He){let d=o.length,f={...l,pageIndex:d,x:r,y:r};t[l.index]=f,o.push({width:l.canvasW+r*2,height:l.canvasH+r*2,entries:[f],shelves:[],sealed:!0});continue}let p=null;for(let d=0;d<o.length&&(p=a(o[d],l,d),!p);d++);if(!p){let d=i(),f=o.length;o.push(d),p=a(d,l,f)}p&&(t[l.index]=p)}return{entries:t,pages:o.map(({width:l,height:u,entries:p})=>({width:l,height:u,entries:p}))}}function Tr(e,n,t,o){ve(e,o),e.beginPath(),wt(e,n.x,n.y,n.screenPts),e.clip(),ve(e,o),e.fillStyle=t==="dynamic"?n.polygon.color??"#cccccc":n.shadedColor,e.fillRect(n.x,n.y,n.canvasW,n.canvasH)}function De(e,n){return Math.max(0,Math.min(n,e))}function Ln(e,n,t,o,r,s,i,a){let l=n.naturalWidth||n.width||1,u=n.naturalHeight||n.height||1,p=De(Math.min(t.minU,t.maxU)*l,l),d=De(Math.max(t.minU,t.maxU)*l,l),f=De(Math.min(t.minV,t.maxV)*u,u),g=De(Math.max(t.minV,t.maxV)*u,u),m=Math.floor(p),h=Math.floor(f),y=Math.ceil(d)-m,v=Math.ceil(g)-h;y<1&&(m=Math.floor(De((t.minU+t.maxU)/2*l,l-1)),y=1),v<1&&(h=Math.floor(De((t.minV+t.maxV)/2*u,u-1)),v=1),m=Math.max(0,Math.min(l-1,m)),h=Math.max(0,Math.min(u-1,h)),y=Math.max(1,Math.min(l-m,y)),v=Math.max(1,Math.min(u-h,v)),ve(e,a),e.drawImage(n,m,h,y,v,o,r,s,i)}function _r(e,n,t,o,r,s){for(let i=0;i<o.length;i+=2){let a=n+o[i]+r,l=t+o[i+1]+s;i===0?e.moveTo(a,l):e.lineTo(a,l)}e.closePath()}function kr(e,n,t,o,r=0,s=0){if(n.textureTriangles?.length){let i=t.naturalWidth||t.width||1,a=t.naturalHeight||t.height||1;for(let l of n.textureTriangles){let u=$e(l.screenPts,Bo);e.save(),ve(e,o),e.beginPath(),_r(e,n.x,n.y,u,r,s),e.clip(),l.uvAffine?(ve(e,o,l.uvAffine.a/i,l.uvAffine.c/i,l.uvAffine.b/a,l.uvAffine.d/a,n.x+l.uvAffine.e+r,n.y+l.uvAffine.f+s),e.drawImage(t,0,0)):l.uvSampleRect&&Ln(e,t,l.uvSampleRect,n.x+r,n.y+s,n.canvasW,n.canvasH,o),e.restore()}}else if(n.uvAffine){let i=t.naturalWidth||t.width||1,a=t.naturalHeight||t.height||1;ve(e,o,n.uvAffine.a/i,n.uvAffine.c/i,n.uvAffine.b/a,n.uvAffine.d/a,n.x+n.uvAffine.e+r,n.y+n.uvAffine.f+s),e.drawImage(t,0,0)}else n.uvSampleRect?Ln(e,t,n.uvSampleRect,n.x+r,n.y+s,n.canvasW,n.canvasH,o):yr(e,t,n.x+r,n.y+s,n.canvasW,n.canvasH,o)}function Rr(e,n,t,o,r,s){let i=r-t,a=s-o,l=i*i+a*a;if(l<=de)return Math.hypot(e-t,n-o);let u=Math.max(0,Math.min(1,((e-t)*i+(n-o)*a)/l));return Math.hypot(e-(t+i*u),n-(o+a*u))}function Or(e,n,t,o){let r=1/0,s=t.length/2;for(let i of o){if(i<0||i>=s)continue;let a=i*2,l=(i+1)%s*2;r=Math.min(r,Rr(e,n,t[a],t[a+1],t[l],t[l+1]))}return r}function Dr(e,n,t,o,r,s){let i=Math.max(0,o-s),a=Math.min(n-1,o+s),l=Math.max(0,r-s),u=Math.min(t-1,r+s),p=null,d=1/0;for(let f=l;f<=u;f++)for(let g=i;g<=a;g++){if(g===o&&f===r)continue;let m=g-o,h=f-r,y=m*m+h*h;if(y>s*s||y>=d)continue;let v=(f*n+g)*4;e[v+3]<Yo||(p=v,d=y)}return p}function Hr(e,n,t){if(!n.textureEdgeRepair||!n.texture||!n.textureEdgeRepairEdges||n.textureEdgeRepairEdges.size===0)return;let o=e.canvas;if(!o)return;let r=Math.max(0,Math.floor(n.x*t)),s=Math.max(0,Math.floor(n.y*t)),i=Math.max(1,Math.min(o.width-r,Math.ceil(n.canvasW*t))),a=Math.max(1,Math.min(o.height-s,Math.ceil(n.canvasH*t)));if(i<=0||a<=0)return;let l;try{l=e.getImageData(r,s,i,a)}catch{return}let u=l.data,p=new Uint8ClampedArray(u),d=Math.max(bn,bn/t),f=Math.max(2,Math.ceil(d*t)+1),g=!1;for(let m=0;m<a;m++)for(let h=0;h<i;h++){let y=(m*i+h)*4,v=u[y+3];if(v<No||v===255)continue;let E=(r+h+.5)/t-n.x,A=(s+m+.5)/t-n.y;if(Or(E,A,n.screenPts,n.textureEdgeRepairEdges)>d)continue;let x=Dr(p,i,a,h,m,f);x!==null&&(u[y]=p[x],u[y+1]=p[x+1],u[y+2]=p[x+2],u[y+3]=255,g=!0)}g&&e.putImageData(l,r,s)}async function Ir(e,n,t,o){let r=t.createElement("canvas");r.width=Math.max(1,Math.ceil(e.width*o)),r.height=Math.max(1,Math.ceil(e.height*o));let s=e.entries.some(p=>p.textureEdgeRepair&&p.texture&&p.textureEdgeRepairEdges&&p.textureEdgeRepairEdges.size>0),i=r.getContext("2d",s?{willReadFrequently:!0}:void 0);if(!i)return{width:e.width,height:e.height,url:null};let a=Array.from(new Set(e.entries.flatMap(p=>p.texture?[p.texture]:[]))),l=new Map;await Promise.all(a.map(async p=>{l.set(p,await Qo(p))}));for(let p of e.entries){let d=p.texture?l.get(p.texture):null;if(!p.texture){i.save(),Tr(i,p,n,o),i.restore();continue}d&&(i.save(),ve(i,o),i.beginPath(),wt(i,p.x,p.y,p.screenPts),i.clip(),kr(i,p,d,o),i.restore()),p.texture&&n==="baked"&&(i.save(),ve(i,o),i.beginPath(),wt(i,p.x,p.y,p.screenPts),i.clip(),gr(i,p.x,p.y,p.canvasW,p.canvasH,p.textureTint,o),i.restore()),Hr(i,p,o)}let u=await Sr(r);return r.width=1,r.height=1,{width:e.width,height:e.height,url:u}}async function Yn(e,n,t,o,r){let s=[];for(let i of e){if(r())break;s.push(await Ir(i,n,t,o))}return s}function Xn(e,n,t,o){if(!n.url)return;let r=`url(${n.url})`,s=o.canvasW||1,i=o.canvasH||1,a=Ce(o),l=`${Ie(-o.x/s*a)} ${Ie(-o.y/i*a)}`,u=`${Ie(n.width/s*a)} ${Ie(n.height/i*a)}`;t==="dynamic"?(ee(e,"background-image",r),ee(e,"background-position",l),ee(e,"background-size",u)):ee(e,"background",`${r} ${l} / ${u} no-repeat`),t==="dynamic"?(ee(e,"mask-image",r),ee(e,"mask-mode","alpha"),ee(e,"mask-position",l),ee(e,"mask-size",u),ee(e,"mask-repeat","no-repeat"),ee(e,"-webkit-mask-image",r),ee(e,"-webkit-mask-position",l),ee(e,"-webkit-mask-size",u),ee(e,"-webkit-mask-repeat","no-repeat")):(pe(e,"mask-image"),pe(e,"mask-mode"),pe(e,"mask-position"),pe(e,"mask-size"),pe(e,"mask-repeat"),pe(e,"-webkit-mask-image"),pe(e,"-webkit-mask-position"),pe(e,"-webkit-mask-size"),pe(e,"-webkit-mask-repeat"))}function Te(e,n){let t=St.get(e);if(t)for(let r of t)e.removeAttribute(`data-${r}`);let o=[];if(n.data)for(let[r,s]of Object.entries(n.data))e.setAttribute(`data-${r}`,String(s)),o.push(r);St.set(e,o)}function $n(e,n,t,o=0,r=0){let s=e.matrix.split(",").map(f=>Number(f));if(s.length!==16||s.some(f=>!Number.isFinite(f)))return e.matrix;let i=s[0],a=s[1],l=s[2],u=s[4],p=s[5],d=s[6];return s[0]*=n,s[1]*=n,s[2]*=n,s[4]*=t,s[5]*=t,s[6]*=t,s[12]+=o*i+r*u,s[13]+=o*a+r*p,s[14]+=o*l+r*d,Ae(s)}function Vr(e,n){return $n(e,n.width/Pn,n.height/Pn,n.minX,n.minY)}function Fr(e){return $n(e,(e.canvasW||1)/Lt,(e.canvasH||1)/Lt)}function zr(e){let n=Wn(e);return[`transform:matrix3d(${Vr(e,n.bounds)})`,`border-shape:${Zn(n.points)}`].join(";")}function Br(e,n){if(e.screenPts.length<6||n.vertices.length<3)return null;let t=e.tileSize,o=e.layerElevation,r=Ge(n.vertices,t,o),s=rt(r);if(!s)return null;let i=e.screenPts[0],a=e.screenPts[1],l=e.screenPts[2],u=e.screenPts[3],p=e.screenPts[4],d=e.screenPts[5],f=l-i,g=u-a,m=p-i,h=d-a,y=f*h-g*m;if(Math.abs(y)<=de)return null;let v=r[0],E=r[1],A=r[2],x=[E[0]-v[0],E[1]-v[1],E[2]-v[2]],C=[A[0]-v[0],A[1]-v[1],A[2]-v[2]],O=[(x[0]*h-g*C[0])/y,(x[1]*h-g*C[1])/y,(x[2]*h-g*C[2])/y],M=[(f*C[0]-x[0]*m)/y,(f*C[1]-x[1]*m)/y,(f*C[2]-x[2]*m)/y],P=v[0]-O[0]*i-M[0]*a,X=v[1]-O[1]*i-M[1]*a,$=v[2]-O[2]*i-M[2]*a;return{normal:s,matrix:Ae([O[0]*e.canvasW/Ce(e),O[1]*e.canvasW/Ce(e),O[2]*e.canvasW/Ce(e),0,M[0]*e.canvasH/Ce(e),M[1]*e.canvasH/Ce(e),M[2]*e.canvasH/Ce(e),0,s[0],s[1],s[2],0,P,X,$,1])}}function Nr(e,n,t,o){if(!n.texture||!t.texture||n.texture!==t.texture)return!1;let r=Br(n,t);return r?(ee(e,"transform",`matrix3d(${r.matrix})`),o==="dynamic"&&(ee(e,"--pnx",r.normal[0].toFixed(4)),ee(e,"--pny",r.normal[1].toFixed(4)),ee(e,"--pnz",r.normal[2].toFixed(4))),Te(e,t),!0):!1}function Un(e,n){ee(e,"--pnx",n.normal[0].toFixed(4)),ee(e,"--pny",n.normal[1].toFixed(4)),ee(e,"--pnz",n.normal[2].toFixed(4))}function Yr(e){if(e.screenPts.length!==8)return null;let n=[],t=[],o=(r,s)=>{for(let i of r)if(Math.abs(i-s)<=se)return;r.push(s)};for(let r=0;r<e.screenPts.length;r+=2)o(n,e.screenPts[r]),o(t,e.screenPts[r+1]);if(n.length!==2||t.length!==2||(n.sort((r,s)=>r-s),t.sort((r,s)=>r-s),Math.abs(n[0])>se||Math.abs(t[0])>se||n[1]-n[0]<=se||t[1]-t[0]<=se))return null;for(let r=0;r<e.screenPts.length;r+=2){let s=e.screenPts[r],i=e.screenPts[r+1],a=Math.abs(s-n[0])<=se||Math.abs(s-n[1])<=se,l=Math.abs(i-t[0])<=se||Math.abs(i-t[1])<=se;if(!a||!l)return null}return{left:n[0],top:t[0],width:n[1]-n[0],height:t[1]-t[0]}}function we(e){return!!Yr(e)}function nt(e){return!e.texture&&e.polygon.vertices.length===3}function Fe(e){return!e.texture&&!!e.projectiveMatrix&&!we(e)}function Nt(e){if(!!!(e.defaultView?.CSS??(typeof CSS<"u"?CSS:void 0))?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let r=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return r?r("(pointer: fine)").matches&&r("(hover: hover)").matches:!0}function it(e){let t=(e.defaultView??(typeof window<"u"?window:void 0))?.navigator?.userAgent??"";if(!t)return!0;let o=/\b(?:Chrome|HeadlessChrome|Chromium|Edg|OPR)\//.test(t);return!/\bVersion\/[\d.]+.*\bSafari\//.test(t)||o}function wn(e,n){e.set(n,(e.get(n)??0)+1)}function Tn(e){let n,t=1;for(let[o,r]of e)r>t&&(n=o,t=r);return n}function Gn(e,n,t,o){let r=new Map,s=new Map,i=new Map,a=!o.has("b"),l=a,u=!o.has("u")&&it(t),p=!o.has("i")&&Nt(t);for(let g of e)if(!(!g||g.texture)){if(n==="dynamic"){if(!(u&&nt(g))&&!(a&&we(g))&&!(l&&Fe(g))&&!p)continue;let m=Me(g.polygon.color??"#cccccc"),h=Ft(m);wn(s,h),i.has(h)||i.set(h,m);continue}!(u&&nt(g))&&!(a&&we(g))&&!(l&&Fe(g))&&!p||wn(r,g.shadedColor)}let d=Tn(r),f=Tn(s);return{paintColor:d,dynamicColorKey:f,dynamicColor:f?i.get(f):void 0}}function jn(){return new Promise(e=>setTimeout(e,0))}async function At(e){return performance.now()-e<Vo?e:(await jn(),performance.now())}function at(e,n={}){let t=n.doc??(typeof document<"u"?document:null);if(!t)return{};let o=new Set(n.strategies?.disable??[]),r=zt(e,n),s=Vt(t),i=e.map((a,l)=>Bt(a,l,n,s,r[l]));return Gn(i,n.textureLighting??"baked",t,o)}function Xr(e,n,t){let o=Number.POSITIVE_INFINITY,r=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,i=Number.NEGATIVE_INFINITY;for(let u=0;u<e.length;u+=2){let p=e[u],d=e[u+1];!Number.isFinite(p)||!Number.isFinite(d)||(o=Math.min(o,p),r=Math.min(r,d),s=Math.max(s,p),i=Math.max(i,d))}let a=s-o,l=i-r;return!Number.isFinite(o)||!Number.isFinite(r)||!Number.isFinite(a)||!Number.isFinite(l)||a<=de||l<=de?{minX:0,minY:0,width:n,height:t}:{minX:o,minY:r,width:a,height:l}}function Wn(e){let n=e.canvasW||1,t=e.canvasH||1,o=Ct>0?It(e.screenPts,Ct):e.screenPts,r=Ct>0?Xr(o,n,t):{minX:0,minY:0,width:n,height:t},s=[];for(let i=0;i<o.length;i+=2){let a=Math.max(0,Math.min(100,(o[i]-r.minX)/r.width*100)),l=Math.max(0,Math.min(100,(o[i+1]-r.minY)/r.height*100));s.push([a,l])}return{bounds:r,points:s}}function $r([e,n]){return`${Je(e)} ${Je(n)}`}function Ur(e){return`polygon(${e.map($r).join(",")})`}function Gr(e){if(nr(e))return"circle(0)";let n=0,t=0,o=Math.max(1,e.length);for(let[i,a]of e)n+=i,t+=a;let r=Je(Math.max(0,Math.min(100,n/o))),s=Je(Math.max(0,Math.min(100,t/o)));return`circle(0 at ${r} ${s})`}function Zn(e){return`${Ur(e)} ${Gr(e)}`}function qn(e){return Zn(Wn(e).points)}function Yt(e,n,t,o){if(t==="dynamic"){pe(e,"color"),pe(e,"background"),Un(e,n);let r=Me(n.polygon.color??"#cccccc");Ft(r)===o?.dynamicColorKey?(pe(e,"--psr"),pe(e,"--psg"),pe(e,"--psb")):(ee(e,"--psr",(r.r/255).toFixed(4)),ee(e,"--psg",(r.g/255).toFixed(4)),ee(e,"--psb",(r.b/255).toFixed(4)))}else n.shadedColor!==o?.paintColor?(pe(e,"background"),ee(e,"color",n.shadedColor)):(pe(e,"background"),pe(e,"color"))}function Qn(e,n,t,o){let r=t.createElement("b");return r.setAttribute("style",`transform:matrix3d(${Fr(e)})`),Te(r,e.polygon),Yt(r,e,n,o),r}function Kn(e,n,t,o){let r=t.createElement("i");return r.setAttribute("style",zr(e)),Te(r,e.polygon),Yt(r,e,n,o),r}function Jn(e,n,t,o){let r=t.createElement("b");return r.setAttribute("style",`transform:matrix3d(${e.projectiveMatrix})`),Te(r,e.polygon),Yt(r,e,n,o),r}function eo(e,n,t){let o=t.createElement("s");o.setAttribute("style",`transform:matrix3d(${e.atlasMatrix})`),Te(o,e.polygon);let r=e.canvasW||1,s=e.canvasH||1,i=Ce(e);return ee(o,"--polycss-atlas-size",`${i}px`),ee(o,"background-position",`${Ie(-e.x/r*i)} ${Ie(-e.y/s*i)}`),ee(o,"opacity","0"),n==="dynamic"&&Un(o,e),o}function to(e,n={}){let t=n.doc??(typeof document<"u"?document:null);if(!t)return{rendered:[],dispose:()=>{}};let o=n.textureLighting??"baked",r=new Set(n.strategies?.disable??[]),s=!r.has("b"),i=s,a=!r.has("u")&&it(t),l=!r.has("i")&&Nt(t),u=zt(e,n),p=Vt(t),d=e.map((x,C)=>Bt(x,C,n,p,u[C])),f=d.map(x=>x&&a&&nt(x)?st(x.polygon,x.index,n):null),g=d.map((x,C)=>x&&(x.texture||!(s&&we(x))&&!f[C]&&!(i&&Fe(x))&&!l?x:null)),{packed:m,atlasScale:h}=Hn(g,n.textureQuality,t),y=new Map,v=[],E=!1,A=[];for(let x=0;x<e.length;x++){let C=d[x],O=f[x];if(!C)continue;let M=m.entries[x];if(M){let P=eo(M,o,t);y.set(x,P),v.push({polygonIndex:x,element:P,kind:"atlas",plan:M,dispose:()=>{}})}else if(!C.texture&&s&&we(C)){let P=Qn(C,o,t,n.solidPaintDefaults);v.push({polygonIndex:x,element:P,kind:"solid",plan:C,dispose:()=>{}})}else if(!C.texture&&O){let P=Xt(O,t);v.push({polygonIndex:x,element:P,kind:"triangle",plan:C,dispose:()=>{}})}else if(!C.texture&&i&&Fe(C)){let P=Jn(C,o,t,n.solidPaintDefaults);v.push({polygonIndex:x,element:P,kind:"solid",plan:C,dispose:()=>{}})}else if(!C.texture&&l){let P=Kn(C,o,t,n.solidPaintDefaults);v.push({polygonIndex:x,element:P,kind:"border",plan:C,dispose:()=>{}})}}return v.sort((x,C)=>x.polygonIndex-C.polygonIndex),Yn(m.pages,o,t,h,()=>E).then(x=>{if(E){for(let C of x)C.url?.startsWith("blob:")&&URL.revokeObjectURL(C.url);return}A=x.flatMap(C=>C.url?.startsWith("blob:")?[C.url]:[]);for(let C=0;C<m.pages.length;C++){let O=m.pages[C],M=x[C];if(M)for(let P of O.entries){let X=y.get(P.index);!X||!M.url||(Xn(X,M,o,P),pe(X,"opacity"))}}}).catch(()=>{if(!E)for(let x of y.values())ee(x,"opacity","0.5"),ee(x,"outline","1px dashed rgba(255, 0, 0, 0.6)")}),{rendered:v,dispose(){E=!0;for(let x of A)URL.revokeObjectURL(x);A=[]}}}async function no(e,n={},t=()=>!1){let o=n.doc??(typeof document<"u"?document:null);if(!o||t())return{rendered:[],solidPaintDefaults:{},dispose:()=>{}};let r=n.textureLighting??"baked",s=new Set(n.strategies?.disable??[]),i=!s.has("b"),a=i,l=!s.has("u")&&it(o),u=!s.has("i")&&Nt(o);if(await jn(),t())return{rendered:[],solidPaintDefaults:{},dispose:()=>{}};let p=zt(e,n),d=Vt(o),f=performance.now(),g=new Array(e.length);for(let M=0;M<e.length;M++)if(g[M]=Bt(e[M],M,n,d,p[M]),f=await At(f),t())return{rendered:[],solidPaintDefaults:{},dispose:()=>{}};let m=n.solidPaintDefaults??Gn(g,r,o,s),h=new Array(g.length),y=new Array(g.length);for(let M=0;M<g.length;M++){let P=g[M],X=P&&l&&nt(P)?st(P.polygon,P.index,{...n,solidPaintDefaults:m}):null;if(h[M]=X,y[M]=P&&(P.texture||!(i&&we(P))&&!X&&!(a&&Fe(P))&&!u?P:null),f=await At(f),t())return{rendered:[],solidPaintDefaults:m,dispose:()=>{}}}let{packed:v,atlasScale:E}=Hn(y,n.textureQuality,o),A=new Map,x=[],C=!1,O=[];for(let M=0;M<e.length;M++){let P=g[M],X=h[M];if(!P)continue;let $=v.entries[M];if($){let W=eo($,r,o);A.set(M,W),x.push({polygonIndex:M,element:W,kind:"atlas",plan:$,dispose:()=>{}})}else if(!P.texture&&i&&we(P)){let W=Qn(P,r,o,m);x.push({polygonIndex:M,element:W,kind:"solid",plan:P,dispose:()=>{}})}else if(!P.texture&&X){let W=Xt(X,o);x.push({polygonIndex:M,element:W,kind:"triangle",plan:P,dispose:()=>{}})}else if(!P.texture&&a&&Fe(P)){let W=Jn(P,r,o,m);x.push({polygonIndex:M,element:W,kind:"solid",plan:P,dispose:()=>{}})}else if(!P.texture&&u){let W=Kn(P,r,o,m);x.push({polygonIndex:M,element:W,kind:"border",plan:P,dispose:()=>{}})}if(f=await At(f),t()){for(let W of x)W.dispose();return{rendered:[],solidPaintDefaults:m,dispose:()=>{}}}}return x.sort((M,P)=>M.polygonIndex-P.polygonIndex),Yn(v.pages,r,o,E,()=>C||t()).then(M=>{if(C||t()){for(let P of M)P.url?.startsWith("blob:")&&URL.revokeObjectURL(P.url);return}O=M.flatMap(P=>P.url?.startsWith("blob:")?[P.url]:[]);for(let P=0;P<v.pages.length;P++){let X=v.pages[P],$=M[P];if($)for(let W of X.entries){let te=A.get(W.index);!te||!$.url||(Xn(te,$,r,W),pe(te,"opacity"))}}}).catch(()=>{if(!(C||t()))for(let M of A.values())ee(M,"opacity","0.5"),ee(M,"outline","1px dashed rgba(255, 0, 0, 0.6)")}),{rendered:x,solidPaintDefaults:m,dispose(){C=!0;for(let M of O)URL.revokeObjectURL(M);O=[]}}}function jr(e,n){let t=e.map((o,r)=>st(o,r,n));return t.some(o=>!o)?null:t}function Wr(e){e.style.backgroundImage="",e.style.backgroundPosition="",e.style.backgroundSize="",e.style.maskImage="",e.style.maskMode="",e.style.maskPosition="",e.style.maskSize="",e.style.maskRepeat="",e.style.removeProperty("-webkit-mask-image"),e.style.removeProperty("-webkit-mask-position"),e.style.removeProperty("-webkit-mask-size"),e.style.removeProperty("-webkit-mask-repeat")}function oo(e,n){e.setAttribute("style",n.styleText),(n.polygon.data||St.get(e)?.length)&&Te(e,n.polygon)}function Xt(e,n){let t=n.createElement("u");return Wr(t),oo(t,e),Te(t,e.polygon),t}function $t(e,n={}){let t=n.doc??(typeof document<"u"?document:null);if(!t)return{rendered:[],dispose:()=>{}};if(!it(t))return null;let o=jr(e,n);if(!o)return null;let r=[];for(let s of o){let i=Xt(s,t);r.push({polygonIndex:s.index,element:i,kind:"triangle",dispose:()=>{}})}return r.sort((s,i)=>s.polygonIndex-i.polygonIndex),{rendered:r,dispose(){}}}function ro(e,n,t={}){if(e.length!==n.length)return!1;let o=t.textureLighting??"baked",r=[];for(let s=0;s<e.length;s++){let i=e[s];if(i.polygonIndex!==s)return!1;let a=n[s];if(!a)return!1;if(i.kind==="atlas"){if(!i.plan||!Nr(i.element,i.plan,a,o))return!1;continue}if(i.kind==="triangle"){let l=st(a,s,t);if(!l)return!1;r[s]=l;continue}return!1}for(let s=0;s<e.length;s++){let i=e[s];if(i.kind==="triangle"){let a=r[s];if(!a)return!1;oo(i.element,a)}}return!0}import{BASE_TILE as ye,normalFacesCamera as Zr,parsePureColor as qr,rotateVec3 as so}from"@layoutit/polycss-core";var Qr=[.4,-.7,.59],Kr="#ffffff",Jr=1,es="#ffffff",ts=.4,ao={t:[0,0,1],b:[0,0,-1],fl:[0,1,0],br:[0,-1,0],fr:[1,0,0],bl:[-1,0,0]},ns=["t","b","bl","br","fr","fl"],os=new Map([["0,0,1","t"],["0,0,-1","b"],["0,1,0","fl"],["0,-1,0","br"],["1,0,0","fr"],["-1,0,0","bl"]]);function io(e){let n=[];for(let t of ns)Zr(ao[t],e)&&n.push(t);return n.join("|")}function rs(e,n,t){let o=e.__polycssVoxelBrushState??(e.__polycssVoxelBrushState={});o.color!==n&&(e.style.color=n,o.color=n),o.transform!==t&&(e.style.transform=t,o.transform=t)}function ss(e){let n=e.vertices;if(n.length<3)return null;let t=n[0],o=0,r=0,s=0;for(let a=1;a+1<n.length;a+=1){let l=n[a],u=n[a+1],p=l[1]-t[1],d=l[0]-t[0],f=l[2]-t[2],g=u[1]-t[1],m=u[0]-t[0],h=u[2]-t[2];o-=d*h-f*m,r-=f*g-p*h,s-=p*m-d*g}let i=Math.hypot(o,r,s);return i<=1e-9?null:[Math.round(o/i),Math.round(r/i),Math.round(s/i)]}function is(e){if(e.texture||e.material||e.uvs||e.textureTriangles||e.vertices.length!==4)return null;let n=ss(e),t=n?os.get(n.join(",")):void 0;if(!t)return null;let o=1/0,r=1/0,s=1/0,i=-1/0,a=-1/0,l=-1/0;for(let d of e.vertices)o=Math.min(o,d[0]),r=Math.min(r,d[1]),s=Math.min(s,d[2]),i=Math.max(i,d[0]),a=Math.max(a,d[1]),l=Math.max(l,d[2]);let u=1e-6,p=e.color||"#cccccc";return Math.abs(l-s)<=u?{axis:"z",face:t,left:r*ye,top:o*ye,width:Math.max(0,(a-r)*ye),height:Math.max(0,(i-o)*ye),z:s*ye,baseColor:p}:Math.abs(i-o)<=u?{axis:"x",face:t,left:r*ye,top:s*ye,width:Math.max(0,(a-r)*ye),height:Math.max(0,(l-s)*ye),z:-o*ye,baseColor:p}:Math.abs(a-r)<=u?{axis:"y",face:t,left:s*ye,top:o*ye,width:Math.max(0,(l-s)*ye),height:Math.max(0,(i-o)*ye),z:-r*ye,baseColor:p}:null}function Ut(e){let n=qr(e);return n?{r:n.rgb[0],g:n.rgb[1],b:n.rgb[2],alpha:n.alpha}:{r:255,g:255,b:255,alpha:1}}function as({r:e,g:n,b:t}){let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(n)}${o(t)}`}function Gt(e){return Math.round(Math.max(0,Math.min(255,e)))}function ls(e,n,t,o){let r=Ut(n),s=Ut(t?.color??Kr),i=Ut(o?.color??es),a=t?.direction??Qr,l=Math.hypot(a[0],a[1],a[2])||1,u=a[0]/l,p=a[1]/l,d=a[2]/l,f=Math.max(0,t?.intensity??Jr)*Math.max(0,e[0]*u+e[1]*p+e[2]*d),g=Math.max(0,o?.intensity??ts),m=i.r/255*g+s.r/255*f,h=i.g/255*g+s.g/255*f,y=i.b/255*g+s.b/255*f,v={r:r.r*m,g:r.g*h,b:r.b*y,alpha:r.alpha};return v.alpha<1?`rgba(${Gt(v.r)}, ${Gt(v.g)}, ${Gt(v.b)}, ${v.alpha})`:as(v)}function cs(e){if(!e?.length)return[];let n=[];for(let t=0;t<e.length;t+=1){let o=e[t],r=is(o);if(!r||r.width<=0||r.height<=0)return[];n.push({...r,sourceIndex:t})}return n}function us(e,n,t,o,r,s){return`matrix3d(${(e==="x"?[o,0,0,0,0,0,r,0,0,-1,0,0,n,-s,t,1]:e==="y"?[0,0,o,0,0,r,0,0,-1,0,0,0,-s,t,n,1]:[o,0,0,0,0,r,0,0,0,0,1,0,n,t,s,1]).map(a=>Number(a.toFixed(6))).join(",")})`}function ds(e){return e.axis==="x"?[e.left+e.width/2,-e.z,e.top+e.height/2]:e.axis==="y"?[-e.z,e.top+e.height/2,e.left+e.width/2]:[e.left+e.width/2,e.top+e.height/2,e.z]}function ms(e,n){let t=ds(e),o=n.meshRotation;o&&(t=so(t,o[0]??0,o[1]??0,o[2]??0));let[r,s]=so(t,n.rotX,0,n.rotY);return{x:r,y:s}}function ps(e,n,t){let o=e.filter(f=>n.has(f.face)).map(f=>({item:f,...ms(f,t)}));if(o.length===0)return[];let r=1/0,s=-1/0,i=1/0,a=-1/0;for(let f of o)r=Math.min(r,f.x),s=Math.max(s,f.x),i=Math.min(i,f.y),a=Math.max(a,f.y);let l=4,u=Math.max(1e-6,s-r),p=Math.max(1e-6,a-i),d=new Map;for(let f of o){let g=Math.min(l-1,Math.max(0,Math.floor((f.x-r)/u*l))),m=Math.min(l-1,Math.max(0,Math.floor((f.y-i)/p*l))),h=`${g}:${m}`,y=d.get(h);y||(y={tx:g,ty:m,sourceIndex:f.item.sourceIndex,items:[]},d.set(h,y)),y.items.push(f.item),y.sourceIndex=Math.min(y.sourceIndex,f.item.sourceIndex)}return Array.from(d.values()).sort((f,g)=>f.ty-g.ty||f.tx-g.tx||f.sourceIndex-g.sourceIndex).flatMap(f=>f.items)}function lo(e){let{doc:n,wrapper:t,polygons:o,directionalLight:r,ambientLight:s}=e,i=cs(o);if(i.length===0)return null;t.classList.add("polycss-voxel-mesh");let a=new Map,l=(m,h)=>{let y=`${m}|${h}`,v=a.get(y);if(v)return v;let E=ls(ao[m],h,r,s);return a.set(y,E),E},u=[],p="",d=0,f=m=>{let h=u[m];return h||(h=n.createElement("b"),u[m]=h),h.parentElement!==t&&t.appendChild(h),h},g=(m,h)=>{let y=new Set(m.split("|").filter(Boolean)),v=ps(i,y,h);d=0;for(let E of v){let A=f(d);rs(A,l(E.face,E.baseColor),us(E.axis,E.left,E.top,E.width,E.height,E.z)),d+=1}for(let E=d;E<u.length;E+=1)u[E]?.remove()};return{element:t,get brushCount(){return d},render(m){p=io(m),g(p,m)},syncCamera(m){let h=io(m);h!==p&&(p=h,g(h,m))},dispose(){for(let m of u)m.remove();t.classList.remove("polycss-voxel-mesh"),u.length=0,d=0,p=""}}}var co="polycss-styles";function jt(e){let n=e??(typeof document<"u"?document:void 0);if(!n||n.getElementById(co))return;let t=n.createElement("style");t.id=co,t.textContent=fs,n.head.appendChild(t)}var fs=`
1
+ import{CAMERA_BACKFACE_CULL_EPS as Eo,DEFAULT_SEAM_BLEED as zs,VOXEL_CAMERA_CULL_NORMAL_LIMIT as wl,cameraCullNormalKey as Ml,cameraCullVisibleSignature as Ll,computeSceneBbox as _l,computeLightVisibility as Rl,findOverlappingPolygonDuplicates as Hs,inverseRotateVec3 as To,isAxisAlignedSurfaceNormal as kl,isVoxelCameraCullableNormalGroups as Ol,normalFacesCamera as Dl,optimizeMeshPolygons as Il,parseHexColor as Hl,polygonCssSurfaceNormal as Fs}from"@layoutit/polycss-core";import{packTextureAtlasPlansWithScaleCore as bi}from"@layoutit/polycss-core";function vi(e){if(!e)return!1;let t=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return t?t("(pointer: coarse)").matches||t("(hover: none)").matches:!1}function xt(e,n,t){return bi(e,n,vi(t))}import{buildTextureEdgeRepairSets as Ur,buildSeamBleedPolygonEdges as ba,buildSeamBleedPolygonSet as va}from"@layoutit/polycss-core";import{TEXTURE_TRIANGLE_BLEED as xi,TEXTURE_EDGE_REPAIR_ALPHA_MIN as Pi,TEXTURE_EDGE_REPAIR_SOURCE_ALPHA_MIN as Si,TEXTURE_EDGE_REPAIR_RADIUS as mr}from"@layoutit/polycss-core";import{expandClipPoints as Ci}from"@layoutit/polycss-core";import{BASIS_EPS as Ei}from"@layoutit/polycss-core";var Pt=new Map;function Ti(e){let n=Pt.get(e);return n||(n=new Promise((t,o)=>{let r=new Image;r.decoding="async",r.crossOrigin="anonymous",r.onload=()=>t(r),r.onerror=()=>o(new Error(`texture load failed: ${e}`)),r.src=e}),Pt.set(e,n),n.then(()=>{Pt.get(e)===n&&Pt.delete(e)},()=>{Pt.get(e)===n&&Pt.delete(e)})),n}function _e(e,n,t=1,o=0,r=0,s=1,i=0,c=0){e.setTransform(t*n,o*n,r*n,s*n,i*n,c*n)}function Nn(e){let n=e/255;return n<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function $n(e){let n=e<=.0031308?e*12.92:1.055*Math.pow(e,.4166666666666667)-.055;return Math.max(0,Math.min(255,Math.round(n*255)))}function Ai(e,n,t,o,r,s,i){let c=Math.round(n*i),l=Math.round(t*i),u=Math.max(1,Math.round(o*i)),d=Math.max(1,Math.round(r*i)),x=e.getImageData(c,l,u,d),h=x.data,b=s.r,v=s.g,P=s.b;for(let g=0;g<h.length;g+=4)h[g+3]!==0&&(h[g]=$n(Nn(h[g])*b),h[g+1]=$n(Nn(h[g+1])*v),h[g+2]=$n(Nn(h[g+2])*P));e.putImageData(x,c,l)}function wi(e,n,t,o,r,s,i){let c=n.naturalWidth||n.width||1,l=n.naturalHeight||n.height||1,u=Math.max(r/c,s/l),d=c*u,x=l*u;_e(e,i),e.drawImage(n,t+(r-d)/2,o+(s-x)/2,d,x)}function St(e,n){return Math.max(0,Math.min(n,e))}function fr(e,n,t,o,r,s,i,c){let l=n.naturalWidth||n.width||1,u=n.naturalHeight||n.height||1,d=St(Math.min(t.minU,t.maxU)*l,l),x=St(Math.max(t.minU,t.maxU)*l,l),h=St(Math.min(t.minV,t.maxV)*u,u),b=St(Math.max(t.minV,t.maxV)*u,u),v=Math.floor(d),P=Math.floor(h),g=Math.ceil(x)-v,C=Math.ceil(b)-P;g<1&&(v=Math.floor(St((t.minU+t.maxU)/2*l,l-1)),g=1),C<1&&(P=Math.floor(St((t.minV+t.maxV)/2*u,u-1)),C=1),v=Math.max(0,Math.min(l-1,v)),P=Math.max(0,Math.min(u-1,P)),g=Math.max(1,Math.min(l-v,g)),C=Math.max(1,Math.min(u-P,C)),_e(e,c),e.drawImage(n,v,P,g,C,o,r,s,i)}function vr(e){return e==="repeat"||e==="mirrored-repeat"}function hr(e,n){return vr(e)?Math.floor(n):0}function gr(e,n){return vr(e)?Math.ceil(n)-1:0}function yr(e,n){return e==="mirrored-repeat"&&Math.abs(n%2)===1}function br(e,n,t,o,r,s,i){let c=r?hr(s,r.minU):0,l=r?gr(s,r.maxU):0,u=r?hr(i,r.minV):0,d=r?gr(i,r.maxV):0;for(let x=c;x<=l;x++)for(let h=u;h<=d;h++){let b=yr(s,x),v=yr(i,h);if(!b&&!v){e.drawImage(n,x*t,h*o);continue}e.save(),e.translate((b?x+1:x)*t,(v?h+1:h)*o),e.scale(b?-1:1,v?-1:1),e.drawImage(n,0,0),e.restore()}}function Un(e,n,t,o){for(let r=0;r<o.length;r+=2){let s=n+o[r],i=t+o[r+1];r===0?e.moveTo(s,i):e.lineTo(s,i)}e.closePath()}function dn(e,n,t,o,r,s){for(let i=0;i<o.length;i+=2){let c=n+o[i]+r,l=t+o[i+1]+s;i===0?e.moveTo(c,l):e.lineTo(c,l)}e.closePath()}function Mi(e,n,t,o){_e(e,o),e.beginPath(),Un(e,n.x,n.y,n.screenPts),e.clip(),_e(e,o),e.fillStyle=t==="dynamic"?n.polygon.color??"#cccccc":n.shadedColor,e.fillRect(n.x,n.y,n.canvasW,n.canvasH)}function pn(e,n,t,o,r){n.polygon.textureAlphaMode==="opaque"&&(_e(e,t),e.fillStyle=n.polygon.color??"#cccccc",e.fillRect(n.x+o,n.y+r,n.canvasW,n.canvasH))}function Li(e,n,t,o,r=0,s=0){if(n.textureTriangles?.length){let i=t.naturalWidth||t.width||1,c=t.naturalHeight||t.height||1;for(let l of n.textureTriangles){let u=Ci(l.screenPts,xi*(n.bleedRatio??1));e.save(),_e(e,o),e.beginPath(),dn(e,n.x,n.y,u,r,s),e.clip(),pn(e,n,o,r,s),l.uvAffine?(_e(e,o,l.uvAffine.a/i,l.uvAffine.c/i,l.uvAffine.b/c,l.uvAffine.d/c,n.x+l.uvAffine.e+r,n.y+l.uvAffine.f+s),br(e,t,i,c,l.uvSampleRect,n.polygon.textureWrap?.s,n.polygon.textureWrap?.t)):l.uvSampleRect&&fr(e,t,l.uvSampleRect,n.x+r,n.y+s,n.canvasW,n.canvasH,o),e.restore()}}else if(n.uvAffine){let i=t.naturalWidth||t.width||1,c=t.naturalHeight||t.height||1,l=n.polygon.textureAlphaMode==="opaque";l&&(e.save(),_e(e,o),e.beginPath(),dn(e,n.x,n.y,n.screenPts,r,s),e.clip(),pn(e,n,o,r,s)),_e(e,o,n.uvAffine.a/i,n.uvAffine.c/i,n.uvAffine.b/c,n.uvAffine.d/c,n.x+n.uvAffine.e+r,n.y+n.uvAffine.f+s),br(e,t,i,c,n.uvSampleRect,n.polygon.textureWrap?.s,n.polygon.textureWrap?.t),l&&e.restore()}else if(n.uvSampleRect){let i=n.polygon.textureAlphaMode==="opaque";i&&(e.save(),_e(e,o),e.beginPath(),dn(e,n.x,n.y,n.screenPts,r,s),e.clip(),pn(e,n,o,r,s)),fr(e,t,n.uvSampleRect,n.x+r,n.y+s,n.canvasW,n.canvasH,o),i&&e.restore()}else{let i=n.polygon.textureAlphaMode==="opaque";i&&(e.save(),_e(e,o),e.beginPath(),dn(e,n.x,n.y,n.screenPts,r,s),e.clip(),pn(e,n,o,r,s)),wi(e,t,n.x+r,n.y+s,n.canvasW,n.canvasH,o),i&&e.restore()}}function _i(e,n,t,o,r,s){let i=r-t,c=s-o,l=i*i+c*c;if(l<=Ei)return Math.hypot(e-t,n-o);let u=Math.max(0,Math.min(1,((e-t)*i+(n-o)*c)/l));return Math.hypot(e-(t+i*u),n-(o+c*u))}function Ri(e,n,t,o){let r=1/0,s=t.length/2;for(let i of o){if(i<0||i>=s)continue;let c=i*2,l=(i+1)%s*2;r=Math.min(r,_i(e,n,t[c],t[c+1],t[l],t[l+1]))}return r}function ki(e,n,t,o,r,s){let i=Math.max(0,o-s),c=Math.min(n-1,o+s),l=Math.max(0,r-s),u=Math.min(t-1,r+s),d=null,x=1/0;for(let h=l;h<=u;h++)for(let b=i;b<=c;b++){if(b===o&&h===r)continue;let v=b-o,P=h-r,g=v*v+P*P;if(g>s*s||g>=x)continue;let C=(h*n+b)*4;e[C+3]<Si||(d=C,x=g)}return d}function Oi(e,n,t){if(!n.textureEdgeRepair||!n.texture||!n.textureEdgeRepairEdges||n.textureEdgeRepairEdges.size===0)return;let o=e.canvas;if(!o)return;let r=Math.max(0,Math.floor(n.x*t)),s=Math.max(0,Math.floor(n.y*t)),i=Math.max(1,Math.min(o.width-r,Math.ceil(n.canvasW*t))),c=Math.max(1,Math.min(o.height-s,Math.ceil(n.canvasH*t)));if(i<=0||c<=0)return;let l;try{l=e.getImageData(r,s,i,c)}catch{return}let u=l.data,d=new Uint8ClampedArray(u),x=Math.max(mr,mr/t),h=Math.max(2,Math.ceil(x*t)+1),b=!1;for(let v=0;v<c;v++)for(let P=0;P<i;P++){let g=(v*i+P)*4,C=u[g+3];if(C<Pi||C===255)continue;let D=(r+P+.5)/t-n.x,k=(s+v+.5)/t-n.y;if(Ri(D,k,n.screenPts,n.textureEdgeRepairEdges)>x)continue;let z=ki(d,i,c,P,v,h);z!==null&&(u[g]=d[z],u[g+1]=d[z+1],u[g+2]=d[z+2],u[g+3]=255,b=!0)}b&&e.putImageData(l,r,s)}function Di(e){if(typeof e.toBlob=="function")return new Promise(n=>{e.toBlob(t=>{n(t?URL.createObjectURL(t):null)},"image/png")});try{return Promise.resolve(e.toDataURL("image/png"))}catch{return Promise.resolve(null)}}async function Ii(e,n,t,o){let r=t.createElement("canvas");r.width=Math.max(1,Math.ceil(e.width*o)),r.height=Math.max(1,Math.ceil(e.height*o));let s=e.entries.some(d=>d.textureEdgeRepair&&d.texture&&d.textureEdgeRepairEdges&&d.textureEdgeRepairEdges.size>0),i=r.getContext("2d",s?{willReadFrequently:!0}:void 0);if(!i)return{width:e.width,height:e.height,url:null};let c=Array.from(new Set(e.entries.flatMap(d=>d.texture?[d.texture]:[]))),l=new Map;await Promise.all(c.map(async d=>{l.set(d,await Ti(d))}));for(let d of e.entries){let x=d.texture?l.get(d.texture):null;if(!d.texture){i.save(),Mi(i,d,n,o),i.restore();continue}x&&(i.save(),_e(i,o),i.beginPath(),Un(i,d.x,d.y,d.screenPts),i.clip(),Li(i,d,x,o),i.restore()),d.texture&&n==="baked"&&(i.save(),_e(i,o),i.beginPath(),Un(i,d.x,d.y,d.screenPts),i.clip(),Ai(i,d.x,d.y,d.canvasW,d.canvasH,d.textureTint,o),i.restore()),Oi(i,d,o)}let u=await Di(r);return r.width=1,r.height=1,{width:e.width,height:e.height,url:u}}async function Ct(e,n,t,o,r){let s=[];for(let i of e){if(r())break;s.push(await Ii(i,n,t,o))}return s}import{isFullRectSolid as Ve,isSolidTrianglePlan as Je,isProjectiveQuadPlan as Be,fullRectBounds as Cd,safariCssProjectiveUnsupported as xr,incrementCount as Ed,dominantCountKey as Td,filterAtlasPlans as Fi,getSolidPaintDefaultsForPlansCore as Vi}from"@layoutit/polycss-core";import{parseHex as Bi,rgbKey as zi}from"@layoutit/polycss-core";import{computeTextureAtlasPlan as Ld,buildBasisHints as _d}from"@layoutit/polycss-core";import{resolveProjectiveQuadGuards as Hi}from"@layoutit/polycss-core";function Et(e,n){let o=e?.defaultView?.__polycssProjectiveQuadGuards,r=n&&o?{...n,...o}:o??n;return Hi(r)}function Tt(e){if(!!!(e.defaultView?.CSS??(typeof CSS<"u"?CSS:void 0))?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let r=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return r?r("(pointer: fine)").matches&&r("(hover: hover)").matches:!0}function Gn(e){if(Pr(e))return!0;let t=(e.defaultView??(typeof window<"u"?window:void 0))?.navigator?.userAgent??"";return t?!xr(t):!0}function Gt(e){let n=e.defaultView?.CSS??(typeof CSS<"u"?CSS:void 0);return!!n?.supports?.("corner-top-left-shape","bevel")&&!!n.supports("corner-top-right-shape","bevel")&&!!n.supports("corner-bottom-right-shape","bevel")&&!!n.supports("corner-bottom-left-shape","bevel")}function Pr(e){let n=e.defaultView?.CSS??(typeof CSS<"u"?CSS:void 0);return!!n?.supports?.("corner-top-left-shape","bevel")&&!!n.supports("corner-top-right-shape","bevel")}function Ni(e){let t=(e.defaultView??(typeof window<"u"?window:void 0))?.navigator?.userAgent??"";return/\bFirefox\//.test(t)}function ze(e,n){return n?.disable?.includes("u")?null:Pr(e)?"corner-bevel":Gn(e)?Ni(e)?"border-large":"border":null}function At(e){let t=(e.defaultView??(typeof window<"u"?window:void 0))?.navigator?.userAgent??"";return t?!xr(t):!0}function jt(e,n,t,o,r){let s=new Set(o?.disable??[]);return Vi(e,n,s,{solidTriangleSupported:Gn(t),projectiveQuadSupported:At(t),cornerShapeSupported:Gt(t),borderShapeSupported:Tt(t)},Bi,zi,r)}function jn(e,n,t=new Set,o){let r=o??(typeof document<"u"?document:null);if(!r)return{};let s=t.size>0?{disable:Array.from(t)}:void 0;return jt(e,n,r,s)}function mn(e){let n=e??(typeof document<"u"?document:null);if(!n){if(!!!(typeof CSS<"u"?CSS:void 0)?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let r=typeof matchMedia<"u"?matchMedia:void 0;return r?r("(pointer: fine)").matches&&r("(hover: hover)").matches:!0}return Tt(n)}function fn(e){let n=e??(typeof document<"u"?document:null);if(!n){let t=typeof CSS<"u"?CSS:void 0;if(t?.supports?.("corner-top-left-shape","bevel")&&t.supports("corner-top-right-shape","bevel"))return!0;let o=(typeof navigator<"u"?navigator:globalThis.navigator)?.userAgent??"";if(!o)return!0;let r=/\b(?:Chrome|HeadlessChrome|Chromium|Edg|OPR)\//.test(o);return!/\bVersion\/[\d.]+.*\bSafari\//.test(o)||r}return Gn(n)}function Wn(e,n,t,o){let r=o??(typeof document<"u"?document:null);return Fi(e,n,t,{solidTriangleSupported:fn(o),projectiveQuadSupported:r?At(r):!0,borderShapeSupported:mn(o)})}import{ASYNC_RENDER_BUDGET_MS as pa,DEFAULT_SEAM_BLEED as Fr,DEFAULT_TILE as ma,PROJECTIVE_QUAD_DENOM_EPS as fa,PROJECTIVE_QUAD_MAX_WEIGHT_RATIO as ha,PROJECTIVE_QUAD_BLEED as Hr,resolveBleedRatio as mo}from"@layoutit/polycss-core";import{buildBasisHints as fo,buildSeamBleedPolygonEdges as ga,computeTextureAtlasPlan as Qt}from"@layoutit/polycss-core";import{cornerShapeGeometryForPlan as qt}from"@layoutit/polycss-core";import{formatCssLength as hn,formatMatrix3dValues as Ui,formatSolidQuadMatrix as Gi}from"@layoutit/polycss-core";import{shadePolygon as ji}from"@layoutit/polycss-core";import{parseHex as Sr,rgbKey as Cr}from"@layoutit/polycss-core";function xe(e,n,t){let o=e.getAttribute("style")??"",r=`${n}:${t}`,s=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`(^|;)\\s*${s}\\s*:[^;]*`,"i"),c=i.test(o)?o.replace(i,(l,u)=>`${u}${r}`):`${o}${o.trim()&&!o.trim().endsWith(";")?";":""}${r}`;c!==o&&e.setAttribute("style",c)}function ot(e,n){let t=e.getAttribute("style")??"";if(!t||!t.toLowerCase().includes(n.toLowerCase()))return;let o=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=new RegExp(`^\\s*${o}\\s*:`,"i"),s=t.split(";").map(i=>i.trim()).filter(i=>i&&!r.test(i)).join(";");s?e.setAttribute("style",s):e.removeAttribute("style")}function Wt(e,n,t,o=!1){if(n==="dynamic"){let r=Sr(e.polygon.color??"#cccccc"),s=o?"":`;--pnx:${e.normal[0].toFixed(4)};--pny:${e.normal[1].toFixed(4)};--pnz:${e.normal[2].toFixed(4)}`;return Cr(r)!==t?.dynamicColorKey&&(s+=`;--psr:${(r.r/255).toFixed(4)};--psg:${(r.g/255).toFixed(4)};--psb:${(r.b/255).toFixed(4)}`),s}return e.shadedColor?`;color:${e.shadedColor}`:""}function $i(e,n){xe(e,"--pnx",n.normal[0].toFixed(4)),xe(e,"--pny",n.normal[1].toFixed(4)),xe(e,"--pnz",n.normal[2].toFixed(4))}function wt(e,n,t,o){if(t==="dynamic"){ot(e,"color"),ot(e,"background"),$i(e,n);let r=Sr(n.polygon.color??"#cccccc");Cr(r)===o?.dynamicColorKey?(ot(e,"--psr"),ot(e,"--psg"),ot(e,"--psb")):(xe(e,"--psr",(r.r/255).toFixed(4)),xe(e,"--psg",(r.g/255).toFixed(4)),xe(e,"--psb",(r.b/255).toFixed(4)))}else n.shadedColor!==o?.paintColor?(ot(e,"background"),xe(e,"color",n.shadedColor)):(ot(e,"background"),ot(e,"color"))}import{formatBorderShapeElementStyle as Er,formatCornerShapeElementStyle as Tr}from"@layoutit/polycss-core";import{atlasCanonicalSizeForEntry as rt}from"@layoutit/polycss-core";import{computeProjectiveQuadMatrix as Wi,stableBasisFromPlan as Yi}from"@layoutit/polycss-core";import{DEFAULT_LIGHT_DIR as Xi,DEFAULT_LIGHT_COLOR as Zi,DEFAULT_LIGHT_INTENSITY as qi,DEFAULT_AMBIENT_COLOR as Qi,DEFAULT_AMBIENT_INTENSITY as Ki}from"@layoutit/polycss-core";var Ar="polycss-corner-shape-solid",Yn=new WeakMap,Xn=new WeakMap;function ye(e,n,t){let o=Yn.get(e),r=Xn.get(e),s=typeof t=="number";if(!n.data&&!s&&(!o||o.length===0)){e.__polycssHasDataAttrs=!1;return}let i=new Map;if(n.data)for(let[l,u]of Object.entries(n.data))i.set(l,String(u));if(s&&i.set("poly-index",String(t)),o)for(let l of o)i.has(l)||e.removeAttribute(`data-${l}`);for(let[l,u]of i)r?.get(l)!==u&&e.setAttribute(`data-${l}`,u);let c=Array.from(i.keys());c.length>0?Yn.set(e,c):Yn.delete(e),i.size>0?Xn.set(e,i):Xn.delete(e),e.__polycssHasDataAttrs=c.length>0}function Mt(e){return e.__polycssHasDataAttrs===!0}function Zn(e,n,t,o,r=t==="dynamic"){if(!n.url)return;let s=`url(${n.url})`,i=o.canvasW||1,c=o.canvasH||1,l=rt(o),u=`${hn(-o.x/i*l)} ${hn(-o.y/c*l)}`,d=`${hn(n.width/i*l)} ${hn(n.height/c*l)}`,x=`transform:matrix3d(${o.atlasMatrix});--polycss-atlas-size:${l}px`,h=`${x};--polycss-atlas-position:${u};--polycss-atlas-image-size:${d}`;if(t==="dynamic"){let b=r?`;--pnx:${o.normal[0].toFixed(4)};--pny:${o.normal[1].toFixed(4)};--pnz:${o.normal[2].toFixed(4)}`:"";e.setAttribute("style",h+`;--polycss-atlas-url:${s}`+b)}else e.setAttribute("style",x+`;background-image:${s};background-position:${u};background-size:${d};background-repeat:no-repeat;--pnx:${o.normal[0].toFixed(4)};--pny:${o.normal[1].toFixed(4)};--pnz:${o.normal[2].toFixed(4)}`)}function wr(e,n,t,o){if(n.texture){if(!t.texture||n.texture!==t.texture)return!1}else if(t.texture)return!1;let r=Mr(n,t);return r?(e.style.visibility="",xe(e,"transform",`matrix3d(${r.matrix})`),o==="dynamic"&&(xe(e,"--pnx",r.normal[0].toFixed(4)),xe(e,"--pny",r.normal[1].toFixed(4)),xe(e,"--pnz",r.normal[2].toFixed(4))),ye(e,t,n.index),!0):(e.style.visibility="hidden",ye(e,t,n.index),!0)}function qn(e,n,t,o,r){if(o!=="baked")return{...e,polygon:n,normal:t};let s=r.directionalLight,i=r.ambientLight,c=s?.direction??Xi,l=s?.color??Zi,u=Math.max(0,s?.intensity??qi),d=i?.color??Qi,x=Math.max(0,i?.intensity??Ki),h=Math.hypot(c[0],c[1],c[2])||1,b=c[0]/h,v=c[1]/h,P=c[2]/h,C=r.lightOccludedPolyIndices?.has(e.index)??!1?0:u*Math.max(0,t[0]*b+t[1]*v+t[2]*P);return{...e,polygon:n,normal:t,shadedColor:ji(n.color??"#cccccc",C,l,d,x)}}function Mr(e,n){let t=Lr(e,n);if(!t)return null;let{normal:o,xAxis:r,yAxis:s,tx:i,ty:c,tz:l}=t;return{normal:o,matrix:Ui([r[0]*e.canvasW/rt(e),r[1]*e.canvasW/rt(e),r[2]*e.canvasW/rt(e),0,s[0]*e.canvasH/rt(e),s[1]*e.canvasH/rt(e),s[2]*e.canvasH/rt(e),0,o[0],o[1],o[2],0,i,c,l,1])}}var Lr=Yi;function Ji(e,n,t){if(e.screenPts.length!==8||n.vertices.length!==4)return null;let o=Lr(e,n);if(!o)return null;let r=Wi(e.screenPts,o.xAxis,o.yAxis,o.normal,o.tx,o.ty,o.tz,t);return r?{matrix:r,normal:o.normal}:null}function Qn(e,n,t,o,r=!1){let s=t.createElement("b");return s.setAttribute("style",`transform:matrix3d(${Gi(e)})`+Wt(e,n,o,r)),ye(s,e.polygon,e.index),s}function Kn(e,n,t,o,r=!1){let s=t.createElement("i");return s.setAttribute("style",Er(e)+Wt(e,n,o,r)),ye(s,e.polygon,e.index),s}function Jn(e,n,t,o,r,s=!1){let i=o.createElement("u");return i.className=Ar,i.setAttribute("style",Tr(e,n)+Wt(e,t,r,s)),ye(i,e.polygon,e.index),i}function eo(e,n,t,o,r=!1){let s=t.createElement("b");return s.setAttribute("style",`transform:matrix3d(${e.projectiveMatrix})`+Wt(e,n,o,r)),ye(s,e.polygon,e.index),s}function _r(e,n,t,o,r,s,i){let c=n.projectiveMatrix?Ji(n,t,s):Mr(n,t);if(!c)return!1;let l=qn(n,t,c.normal,o,r);return e.style.visibility="",e.style.transform=`matrix3d(${c.matrix})`,wt(e,l,o,i),ye(e,l.polygon,l.index),!0}function Rr(e,n,t,o){e.style.visibility="",e.setAttribute("style",Er(n)),wt(e,n,t,o),ye(e,n.polygon,n.index)}function kr(e,n,t,o,r){e.style.visibility="",e.className=Ar,e.setAttribute("style",Tr(n,t)),wt(e,n,o,r),xe(e,"background","currentColor"),ye(e,n.polygon,n.index)}function to(e,n,t,o=!1){let r=t.createElement("s"),s=rt(e),i=o?"":`;--pnx:${e.normal[0].toFixed(4)};--pny:${e.normal[1].toFixed(4)};--pnz:${e.normal[2].toFixed(4)}`;return r.setAttribute("style",`transform:matrix3d(${e.atlasMatrix});--polycss-atlas-size:${s}px;opacity:0`+i),ye(r,e.polygon,e.index),r}import{computeSolidTriangleColorPlan as ya}from"@layoutit/polycss-core";import{computeSolidTrianglePlanFromCssPoints as ea,computeSolidTrianglePlan as ta}from"@layoutit/polycss-core";function st(e,n,t,o={}){let r=o.primitive!=null?void 0:(()=>{let s=t.doc??(typeof document<"u"?document:null);return s?ze(s,t.strategies)??"border":"border"})();return ta(e,n,t,{...o,resolvedPrimitive:o.resolvedPrimitive??r})}function no(e,n,t,o,r,s,i,c,l,u,d,x,h){let b=o.primitive!=null?void 0:(()=>{let v=t.doc??(typeof document<"u"?document:null);return v?ze(v,t.strategies)??"border":"border"})();return ea(e,n,t,{...o,resolvedPrimitive:o.resolvedPrimitive??b},r,s,i,c,l,u,d,x,h)}import{buildSeamBleedPolygonEdges as na,DEFAULT_SEAM_BLEED as oa,DEFAULT_TILE as Yd,resolveBleedRatio as ra}from"@layoutit/polycss-core";import{rgbEqual as sa,stepRgbToward as ia,rgbToCss as aa,colorErrorScore as la}from"@layoutit/polycss-core";import{computeSolidTriangleColorPlan as Or}from"@layoutit/polycss-core";import{stableTriangleMatrixDecimals as oo}from"@layoutit/polycss-core";var ca="0 48px 96px 48px";function ro(e,n){return na(e,{tileSize:n.tileSize,layerElevation:n.layerElevation,directionalLight:n.directionalLight,ambientLight:n.ambientLight})}function so(e,n,t){let o=ra(t.seamBleed),r=oa*o,s={...t,bleedRatio:o};return n&&r>0?{...s,seamBleed:n.has(e)?r:void 0,seamEdges:n.get(e)}:s}function gn(e){return{updatesDisabled:e.stableTriangleColorFreezeFrames===0,freezeFrames:Math.max(1,Math.floor(e.stableTriangleColorFreezeFrames??1)),colorFrame:Math.max(0,Math.floor(e.stableTriangleColorFrame??0)),maxStep:Math.max(0,Math.floor(e.stableTriangleColorMaxStep??0))}}function Dr(e,n){return!n.updatesDisabled&&(n.freezeFrames<=1||(n.colorFrame+e)%n.freezeFrames===0)}function it(e,n,t,o,r,s){return t?s.updatesDisabled||o==="plan-only"||o==="transform-only"?!1:r==="adaptive"||e.__polycssSolidTriangleColor===void 0?!0:Dr(n,s):!0}function io(e,n){let t=e;t.__polycssSolidTrianglePrimitive!==n&&(n==="corner-bevel"?(e.style.width="",e.style.height="",e.style.backgroundColor="",e.style.borderWidth="",e.style.borderTopLeftRadius="",e.style.borderTopRightRadius="",e.style.removeProperty("corner-top-left-shape"),e.style.removeProperty("corner-top-right-shape")):(e.style.width="",e.style.height="",e.style.backgroundColor="",e.style.borderTopLeftRadius="",e.style.borderTopRightRadius="",e.style.removeProperty("corner-top-left-shape"),e.style.removeProperty("corner-top-right-shape"),e.style.borderWidth=n==="border-large"?ca:""),t.__polycssSolidTrianglePrimitive=n)}function ao(e){let n=e;n.__polycssSolidTriangleHidden&&(e.style.visibility="",n.__polycssSolidTriangleHidden=!1)}function Lt(e){let n=e;n.__polycssSolidTriangleHidden||(e.style.visibility="hidden",n.__polycssSolidTriangleHidden=!0)}function Yt(e,n){e.setAttribute("style",n.styleText),io(e,n.primitive);let t=e;t.__polycssSolidTriangleBasis=n.basis,t.__polycssSolidTriangleHidden=!1,n.colorComputed&&(t.__polycssSolidTriangleColor=n.bakedColor??"",t.__polycssSolidTriangleColorRgb=n.bakedRgb,t.__polycssSolidTriangleColorAlpha=n.bakedAlpha),t.__polycssSolidTriangleColorFrame=void 0,(n.polygon.data||Mt(e))&&ye(e,n.polygon)}function Ir(e,n,t,o){if(!n.colorComputed){(n.polygon.data||Mt(e))&&ye(e,n.polygon);return}let r=e,s=n.bakedColor??"",i=n.bakedRgb,c=n.bakedAlpha??1,l=r.__polycssSolidTriangleColor,u=r.__polycssSolidTriangleColorRgb,d=r.__polycssSolidTriangleColorAlpha??1,x=o??Dr(n.index,t);if(!t.updatesDisabled&&l!==s&&(l===void 0||x)){let h=s,b=i;if(t.maxStep>0&&u&&i&&d===c){let v=ia(u,i,t.maxStep);b=v,h=aa(v,c)}(h!==l||!sa(b,u))&&(e.style.color=h),r.__polycssSolidTriangleColor=h,r.__polycssSolidTriangleColorRgb=b,r.__polycssSolidTriangleColorAlpha=c,r.__polycssSolidTriangleColorFrame=t.colorFrame}(n.polygon.data||Mt(e))&&ye(e,n.polygon)}function Xt(e,n,t,o){let r=e;io(e,n.primitive),r.__polycssSolidTriangleBasis!==n.basis&&(r.__polycssSolidTriangleBasis=n.basis),ao(e),e.style.transform=n.transformText,(n.colorComputed||n.polygon.data||Mt(e))&&Ir(e,n,t,o)}function yn(e,n,t,o){ao(e),Ir(e,n,t,o)}function Zt(e,n){let t=e;io(e,n.primitive),t.__polycssSolidTriangleBasis!==n.basis&&(t.__polycssSolidTriangleBasis=n.basis),ao(e),e.style.transform=n.transformText,(n.polygon.data||Mt(e))&&ye(e,n.polygon)}function ua(e,n){let t=n.stableTriangleColorBudget;if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t<=1?Math.max(1,Math.ceil(e*t)):Math.max(1,Math.floor(t));let o=Math.max(1,Math.floor(n.stableTriangleColorFreezeFrames??1));return Math.max(1,Math.ceil(e/o))}function lo(e,n,t){if(t.stableTriangleColorPolicy!=="adaptive")return null;if(t.stableTriangleColorFreezeFrames===0)return new Set;let o=Math.max(0,Math.floor(t.stableTriangleColorFrame??0)),r=Math.max(1,Math.floor(t.stableTriangleColorFreezeFrames??1));if(r<=1&&!Number.isFinite(t.stableTriangleColorBudget))return null;let s=ua(e.length,t),i=Math.max(1,Math.floor(t.stableTriangleColorMaxAge??Math.max(2,r*2))),c=[];for(let l=0;l<e.length;l++){let u=e[l],d=n[l];if(u.kind!=="triangle"||!d)continue;let x=u.element,h=x.__polycssSolidTriangleColor,b=d.bakedColor??"";if(h===b)continue;let v=x.__polycssSolidTriangleColorFrame??0,P=Math.max(0,o-v),g=la(h,b);c.push({index:l,score:(P>=i?1e6:0)+g*1e4+P})}return c.length===0?new Set:(c.sort((l,u)=>u.score-l.score),new Set(c.slice(0,s).map(l=>l.index)))}function bn(e,n){let t=n.createElement("u");return Yt(t,e),ye(t,e.polygon,e.index),t}function da(e,n,t){let o=t.createElement("u");return Lt(o),ye(o,e,n),o}function co(e,n,t,o,r,s){let i=t,c=i.stableTriangleDebug,l=o&&r==="color-only";if(i.stableTriangleColorPolicy==="adaptive"||e.length!==n.length)return!1;let u=oo(i.stableTriangleMatrixDecimals),d=t.doc??(typeof document<"u"?document:null),x=d?ze(d,t.strategies)??"border":"border";for(let b=0;b<e.length;b++){let v=e[b];if(v.kind!=="triangle"||v.polygonIndex!==b||!n[b])return!1}let h=ro(n,t);for(let b=0;b<e.length;b++){let v=e[b].element,P=n[b];if(l){if(it(v,b,o,c,i.stableTriangleColorPolicy,s)){let C=Or(P,b,t);if(!C)continue;yn(v,C,s)}continue}let g=st(P,b,so(b,h,t),{basis:v.__polycssSolidTriangleBasis,matrixDecimals:u,primitive:x,includeColor:r!=="plan-only"&&r!=="transform-only"&&it(v,b,o,c,i.stableTriangleColorPolicy,s)});if(!g){Lt(v);continue}o&&r==="plan-only"||(o&&r==="transform-only"?Zt(v,g):o?Xt(v,g,s):Yt(v,g))}return!0}function _t(e,n={}){let t=n.doc??(typeof document<"u"?document:null);if(!t)return{rendered:[],dispose:()=>{}};let o=ze(t,n.strategies);if(!o||e.some(c=>c.texture||c.vertices.length!==3))return null;let r=oo(n.stableTriangleMatrixDecimals),s=[],i=ro(e,n);for(let c=0;c<e.length;c+=1){let l=e[c],u=st(l,c,so(c,i,n),{matrixDecimals:r,primitive:o}),d=u?bn(u,t):da(l,c,t);s.push({polygonIndex:c,element:d,kind:"triangle",dispose:()=>{}})}return{rendered:s,dispose(){}}}function uo(e,n,t={}){let o=t.doc??(typeof document<"u"?document:null);if(!o)return{rendered:e,dispose:()=>{}};let r=ze(o,t.strategies);if(!r||e.some(g=>g.kind!=="triangle")||n.length!==e.length)return null;for(let g=0;g<e.length;g++)if(e[g].polygonIndex!==g)return null;let s=t.optimizeStableTriangleStyle===!0&&(t.textureLighting??"baked")==="baked",i=t,c=i.stableTriangleDebug,l=i.stableTriangleUpdateMode??(c==="plan-only"||c==="transform-only"?c:"full"),u=s&&l==="color-only",d=gn(i),x=oo(i.stableTriangleMatrixDecimals);if(co(e,n,t,s,l,d))return{rendered:e,dispose(){}};let h=new Array(e.length),b=new Array(e.length),v=ro(n,t);for(let g=0;g<e.length;g++){let C=e[g].element;if(u){let D=i.stableTriangleColorPolicy==="adaptive"||it(C,g,s,c,i.stableTriangleColorPolicy,d);b[g]=D?Or(n[g],g,t):null;continue}h[g]=st(n[g],g,so(g,v,t),{basis:C.__polycssSolidTriangleBasis,matrixDecimals:x,primitive:r,includeColor:l!=="plan-only"&&l!=="transform-only"&&it(C,g,s,c,i.stableTriangleColorPolicy,d)})}let P=s&&l!=="plan-only"&&l!=="transform-only"?lo(e,u?b:h,i):null;for(let g=0;g<e.length;g++){if(u){let D=b[g];D&&yn(e[g].element,D,d,P?.has(g));continue}let C=h[g];if(!C){Lt(e[g].element);continue}s&&l==="plan-only"||(s&&l==="transform-only"?Zt(e[g].element,C):s?Xt(e[g].element,C,d,P?.has(g)):Yt(e[g].element,C))}return{rendered:e,dispose(){}}}import{stableTriangleMatrixDecimals as Vr}from"@layoutit/polycss-core";function Br(){return new Promise(e=>setTimeout(e,0))}async function po(e){return performance.now()-e<pa?e:(await Br(),performance.now())}function zr(e,n){let t=mo(n.seamBleed),o=Fr*t,r={...n,bleedRatio:t};return e.seamBleedEdges?.size&&o>0?{...r,seamBleed:o,seamEdges:e.seamBleedEdges}:{...r,seamBleed:void 0,seamEdges:void 0}}function Nr(e,n){return ga(e,{tileSize:n.tileSize,layerElevation:n.layerElevation,directionalLight:n.directionalLight,ambientLight:n.ambientLight})}function $r(e,n,t){let o=mo(t.seamBleed),r=Fr*o,s={...t,bleedRatio:o};return n&&r>0?{...s,seamBleed:n.has(e)?r:void 0,seamEdges:n.get(e)}:s}function dt(e,n={}){let t=n.doc??(typeof document<"u"?document:null);if(!t)return{};let o=fo(e,n),r=Et(t),s=e.map((i,c)=>Qt(i,c,n,r,o[c]));return jt(s,n.textureLighting??"baked",t,n.strategies)}function pt(e,n={}){let t=n.doc??(typeof document<"u"?document:null);if(!t)return{rendered:[],dispose:()=>{}};let o=n.textureLighting??"baked",r=n,s=o==="dynamic"&&r.skipDynamicNormalVars===!0,i=new Set(n.strategies?.disable??[]),c=!i.has("b"),l=c&&At(t),u=ze(t,n.strategies),d=u!==null,x=!i.has("i")&&Gt(t),h=!i.has("i")&&Tt(t),b=fo(e,n),v=Et(t),P=Nr(e,n),g=e.map((m,p)=>Qt(m,p,$r(p,P,n),v,b[p]));if(typeof window<"u"){let m=window,p=g[1];m.__vanillaPlan1={matrix:p?.matrix,canvasW:p?.canvasW,canvasH:p?.canvasH,vertexCount:e[1]?.vertices.length}}let C=n.solidPaintDefaults??(r.computeSolidPaintDefaults?jt(g,o,t,n.strategies):void 0),D=C?{...n,solidPaintDefaults:C}:n,k=g.map(m=>m&&d&&Je(m)?st(m.polygon,m.index,zr(m,D),{primitive:u??void 0}):null),z=g.map(m=>m&&x&&!Je(m)&&!(c&&Ve(m))&&!(l&&Be(m))?qt(m):null),I=g.map((m,p)=>m&&(m.texture||!(c&&Ve(m))&&!k[p]&&!(l&&Be(m))&&!z[p]&&!h?m:null)),{packed:Z,atlasScale:Q}=xt(I,n.textureQuality,t),O=new Map,H=[],V=!1,$=[];for(let m=0;m<e.length;m++){let p=g[m],T=k[m],M=z[m];if(!p)continue;let R=Z.entries[m];if(R){let L=to(R,o,t,s);O.set(m,L),H.push({polygonIndex:m,element:L,kind:"atlas",plan:R,dispose:()=>{}})}else if(!p.texture&&c&&Ve(p)){let L=Qn(p,o,t,C,s);H.push({polygonIndex:m,element:L,kind:"solid",plan:p,dispose:()=>{}})}else if(!p.texture&&T){let L=bn(T,t);H.push({polygonIndex:m,element:L,kind:"triangle",plan:p,dispose:()=>{}})}else if(!p.texture&&l&&Be(p)){let L=eo(p,o,t,C,s);H.push({polygonIndex:m,element:L,kind:"solid",plan:p,dispose:()=>{}})}else if(!p.texture&&M){let L=Jn(p,M,o,t,C,s);H.push({polygonIndex:m,element:L,kind:"corner",plan:p,dispose:()=>{}})}else if(!p.texture&&h){let L=Kn(p,o,t,C,s);H.push({polygonIndex:m,element:L,kind:"border",plan:p,dispose:()=>{}})}}H.sort((m,p)=>m.polygonIndex-p.polygonIndex);let A=Ct(Z.pages,o,t,Q,()=>V).then(m=>{if(V){for(let p of m)p.url?.startsWith("blob:")&&URL.revokeObjectURL(p.url);return}$=m.flatMap(p=>p.url?.startsWith("blob:")?[p.url]:[]);for(let p=0;p<Z.pages.length;p++){let T=Z.pages[p],M=m[p];if(M)for(let R of T.entries){let L=O.get(R.index);!L||!M.url||Zn(L,M,o,R,!0)}}}).catch(()=>{if(!V)for(let m of O.values())xe(m,"opacity","0.5"),xe(m,"outline","1px dashed rgba(255, 0, 0, 0.6)")});return{rendered:H,solidPaintDefaults:C??{},pagesReady:A,dispose(){V=!0;for(let m of $)URL.revokeObjectURL(m);$=[]}}}async function Kt(e,n={},t=()=>!1){let o=n.doc??(typeof document<"u"?document:null);if(!o||t())return{rendered:[],solidPaintDefaults:{},dispose:()=>{}};let r=n.textureLighting??"baked",i=r==="dynamic"&&n.skipDynamicNormalVars===!0,c=new Set(n.strategies?.disable??[]),l=!c.has("b"),u=l&&At(o),d=ze(o,n.strategies),x=d!==null,h=!c.has("i")&&Gt(o),b=!c.has("i")&&Tt(o);if(await Br(),t())return{rendered:[],solidPaintDefaults:{},dispose:()=>{}};let v=fo(e,n),P=Et(o),g=Nr(e,n),C=performance.now(),D=new Array(e.length);for(let m=0;m<e.length;m++)if(D[m]=Qt(e[m],m,$r(m,g,n),P,v[m]),C=await po(C),t())return{rendered:[],solidPaintDefaults:{},dispose:()=>{}};let k=n.solidPaintDefaults??jt(D,r,o,n.strategies),z=new Array(D.length),I=new Array(D.length),Z=new Array(D.length);for(let m=0;m<D.length;m++){let p=D[m],T=p&&x&&Je(p)?st(p.polygon,p.index,zr(p,{...n,solidPaintDefaults:k}),{primitive:d??void 0}):null;z[m]=T;let M=p&&h&&!Je(p)&&!(l&&Ve(p))&&!(u&&Be(p))?qt(p):null;if(I[m]=M,Z[m]=p&&(p.texture||!(l&&Ve(p))&&!T&&!(u&&Be(p))&&!M&&!b?p:null),C=await po(C),t())return{rendered:[],solidPaintDefaults:k,dispose:()=>{}}}let{packed:Q,atlasScale:O}=xt(Z,n.textureQuality,o),H=new Map,V=[],$=!1,A=[];for(let m=0;m<e.length;m++){let p=D[m],T=z[m],M=I[m];if(!p)continue;let R=Q.entries[m];if(R){let L=to(R,r,o,i);H.set(m,L),V.push({polygonIndex:m,element:L,kind:"atlas",plan:R,dispose:()=>{}})}else if(!p.texture&&l&&Ve(p)){let L=Qn(p,r,o,k,i);V.push({polygonIndex:m,element:L,kind:"solid",plan:p,dispose:()=>{}})}else if(!p.texture&&T){let L=bn(T,o);V.push({polygonIndex:m,element:L,kind:"triangle",plan:p,dispose:()=>{}})}else if(!p.texture&&u&&Be(p)){let L=eo(p,r,o,k,i);V.push({polygonIndex:m,element:L,kind:"solid",plan:p,dispose:()=>{}})}else if(!p.texture&&M){let L=Jn(p,M,r,o,k,i);V.push({polygonIndex:m,element:L,kind:"corner",plan:p,dispose:()=>{}})}else if(!p.texture&&b){let L=Kn(p,r,o,k,i);V.push({polygonIndex:m,element:L,kind:"border",plan:p,dispose:()=>{}})}if(C=await po(C),t()){for(let L of V)L.dispose();return{rendered:[],solidPaintDefaults:k,dispose:()=>{}}}}V.sort((m,p)=>m.polygonIndex-p.polygonIndex);let y=Ct(Q.pages,r,o,O,()=>$||t()).then(m=>{if($||t()){for(let p of m)p.url?.startsWith("blob:")&&URL.revokeObjectURL(p.url);return}A=m.flatMap(p=>p.url?.startsWith("blob:")?[p.url]:[]);for(let p=0;p<Q.pages.length;p++){let T=Q.pages[p],M=m[p];if(M)for(let R of T.entries){let L=H.get(R.index);!L||!M.url||Zn(L,M,r,R,!0)}}}).catch(()=>{if(!($||t()))for(let m of H.values())xe(m,"opacity","0.5"),xe(m,"outline","1px dashed rgba(255, 0, 0, 0.6)")});return{rendered:V,solidPaintDefaults:k,pagesReady:y,dispose(){$=!0;for(let m of A)URL.revokeObjectURL(m);A=[]}}}function Jt(e,n,t,o={}){let r=o.textureLighting??"baked",s=o,i=s.optimizeStableTriangleStyle===!0&&r==="baked";if(!i||s.stableTriangleColorPolicy==="adaptive"||e.length!==t.polygonCount||n.length!==t.polygonCount||t.vertices.length<t.polygonCount*9)return!1;let c=s.stableTriangleDebug,l=s.stableTriangleUpdateMode??(c==="plan-only"||c==="transform-only"?c:"full");if(l==="color-only")return!1;let u=Vr(s.stableTriangleMatrixDecimals),d=gn(s),x=o.tileSize??ma,h=o.layerElevation??x,b=o.doc??(typeof document<"u"?document:null),v=b?ze(b,o.strategies)??"border":"border";for(let g=0;g<e.length;g++){let C=e[g],D=n[g];if(C.kind!=="triangle"||C.polygonIndex!==g||!D||D.vertices.length!==3||D.texture||D.material?.texture)return!1}let P=t.vertices;for(let g=0;g<e.length;g++){let C=e[g].element,D=n[g],k=g*9,z=P[k+1]*x,I=P[k]*x,Z=P[k+2]*h,Q=P[k+4]*x,O=P[k+3]*x,H=P[k+5]*h,V=P[k+7]*x,$=P[k+6]*x,A=P[k+8]*h,y=no(D,g,o,{basis:C.__polycssSolidTriangleBasis,matrixDecimals:u,primitive:v,color:t.colors?.[g],includeColor:l!=="plan-only"&&l!=="transform-only"&&it(C,g,i,c,s.stableTriangleColorPolicy,d)},z,I,Z,Q,O,H,V,$,A);if(!y){Lt(C);continue}l!=="plan-only"&&(l==="transform-only"?Zt(C,y):Xt(C,y,d))}return!0}function en(e,n,t={}){if(e.length!==n.length)return!1;let o=t,r=t.doc??(typeof document<"u"?document:null),s=t.textureLighting??"baked",i=new Set(t.strategies?.disable??[]),c=!i.has("b"),l=!!r&&c&&At(r),u=!!r&&!i.has("i")&&Gt(r),d=!!r&&!i.has("i")&&Tt(r),x=mo(o.seamBleed),h=r?Et(r,{bleed:Hr*x}):{denomEps:fa,maxWeightRatio:ha,bleed:Hr*x,disableGuards:!1},b=o.optimizeStableTriangleStyle===!0&&s==="baked",v=o.stableTriangleDebug,P=o.stableTriangleUpdateMode??(v==="plan-only"||v==="transform-only"?v:"full"),g=b&&P==="color-only",C=gn(o),D=Vr(o.stableTriangleMatrixDecimals),k=r?ze(r,t.strategies)??"border":"border";if(co(e,n,t,b,P,C))return!0;let z=[],I=[],Z=[];for(let O=0;O<e.length;O++){let H=e[O];if(H.polygonIndex!==O)return!1;let V=n[O];if(!V||g&&H.kind!=="triangle")return!1;if(H.kind==="atlas"){if(!H.plan||!wr(H.element,H.plan,V,s))return!1;continue}if(H.kind==="triangle"){let $=H.element;if(g){let y=o.stableTriangleColorPolicy==="adaptive"||it($,O,b,v,o.stableTriangleColorPolicy,C);I[O]=y?ya(V,O,t):null;continue}let A=st(V,O,t,{basis:$.__polycssSolidTriangleBasis,matrixDecimals:D,primitive:k,includeColor:P!=="plan-only"&&P!=="transform-only"&&it($,O,b,v,o.stableTriangleColorPolicy,C)});if(!A){z[O]=null;continue}z[O]=A;continue}if(H.kind==="solid"){if(!H.plan||V.texture||V.vertices.length!==H.plan.polygon.vertices.length)return!1;Z[O]=H.plan;continue}if(H.kind==="border"){let $=Qt(V,O,t,h);if(!$||$.texture||!d||c&&Ve($)||l&&Be($)||u&&qt($))return!1;Z[O]=$;continue}if(H.kind==="corner"){let $=Qt(V,O,t,h);if(!$||$.texture||!u||Je($)||c&&Ve($)||l&&Be($)||!qt($))return!1;Z[O]=$;continue}return!1}let Q=b&&P!=="plan-only"&&P!=="transform-only"?lo(e,g?I:z,o):null;for(let O=0;O<e.length;O++){let H=e[O];if(H.kind==="triangle"){if(g){let $=I[O];$&&yn(H.element,$,C,Q?.has(O));continue}let V=z[O];if(!V){Lt(H.element);continue}if(b&&P==="plan-only")continue;b&&P==="transform-only"?Zt(H.element,V):b?Xt(H.element,V,C,Q?.has(O)):Yt(H.element,V)}else if(H.kind==="solid"){let V=Z[O];if(!V||!_r(H.element,V,n[O],s,t,h,o.solidPaintDefaults))return!1}else if(H.kind==="border"){let V=Z[O];if(!V)return!1;Rr(H.element,V,s,o.solidPaintDefaults)}else if(H.kind==="corner"){let V=Z[O],$=V?qt(V):null;if(!V||!$)return!1;kr(H.element,V,$,s,o.solidPaintDefaults)}}return!0}import{computeTextureAtlasPlanPublic as Gr}from"@layoutit/polycss-core";import{formatMatrix3d as jr,formatCssLengthPx as Wr,formatSolidQuadEntryMatrix as Yr}from"@layoutit/polycss-core";import{formatBorderShapeEntryMatrix as Xr,cssBorderShapeForPlan as Zr}from"@layoutit/polycss-core";import{BASE_TILE as Pe,computeProjectiveQuadMatrix as xa,normalFacesCamera as Pa,parsePureColor as ts,PROJECTIVE_QUAD_BLEED as Sa,resolveProjectiveQuadGuards as Ca,rotateVec3 as Ea,rotateVec3InWrapperCssFrame as Ta,shadePolygon as Aa,SOLID_QUAD_CANONICAL_SIZE as wa}from"@layoutit/polycss-core";var Ma=[.4,-.7,.59],La="#ffffff",_a=1,Ra="#ffffff",ka=.4,ns=1,Oa=8,Da=Sa,et=1e-6,Ia=Ca({bleed:0}),os={t:[0,0,1],b:[0,0,-1],fl:[0,1,0],br:[0,-1,0],fr:[1,0,0],bl:[-1,0,0]},yo=["t","b","bl","br","fr","fl"],Ha=new Map([["0,0,1","t"],["0,0,-1","b"],["0,1,0","fl"],["0,-1,0","br"],["1,0,0","fr"],["-1,0,0","bl"]]);function qr(e){let n=[];for(let t of yo)Pa(os[t],e)&&n.push(t);return n.join("|")}function Fa(e,n,t){let o=e.__polycssVoxelBrushState??(e.__polycssVoxelBrushState={});o.color!==n&&(e.style.color=n,o.color=n),o.transform!==t&&(e.style.transform=t,o.transform=t)}function Va(e){let n=e.vertices;if(n.length<3)return null;let t=n[0],o=0,r=0,s=0;for(let c=1;c+1<n.length;c+=1){let l=n[c],u=n[c+1],d=l[1]-t[1],x=l[0]-t[0],h=l[2]-t[2],b=u[1]-t[1],v=u[0]-t[0],P=u[2]-t[2];o-=x*P-h*v,r-=h*b-d*P,s-=d*v-x*b}let i=Math.hypot(o,r,s);return i<=1e-9?null:[Math.round(o/i),Math.round(r/i),Math.round(s/i)]}function Ba(e){if(e.texture||e.material||e.uvs||e.textureTriangles||e.vertices.length!==4)return null;let n=Va(e),t=n?Ha.get(n.join(",")):void 0;if(!t)return null;let o=1/0,r=1/0,s=1/0,i=-1/0,c=-1/0,l=-1/0;for(let x of e.vertices)o=Math.min(o,x[0]),r=Math.min(r,x[1]),s=Math.min(s,x[2]),i=Math.max(i,x[0]),c=Math.max(c,x[1]),l=Math.max(l,x[2]);let u=1e-6,d=Wa(e.color);return Math.abs(l-s)<=u?{axis:"z",face:t,left:r*Pe,top:o*Pe,width:Math.max(0,(c-r)*Pe),height:Math.max(0,(i-o)*Pe),z:s*Pe,baseColor:d,bleed:ho()}:Math.abs(i-o)<=u?{axis:"x",face:t,left:r*Pe,top:s*Pe,width:Math.max(0,(c-r)*Pe),height:Math.max(0,(l-s)*Pe),z:-o*Pe,baseColor:d,bleed:ho()}:Math.abs(c-r)<=u?{axis:"y",face:t,left:s*Pe,top:o*Pe,width:Math.max(0,(l-s)*Pe),height:Math.max(0,(i-o)*Pe),z:-r*Pe,baseColor:d,bleed:ho()}:null}function ho(){return{left:0,right:0,top:0,bottom:0}}function za(e){let n=o=>String(Number(o.toFixed(6))),t=`${e.item.baseColor}|${e.variableAxis}`;for(let o=0;o<3;o+=1)o!==e.variableAxis&&(t+=`|${o}:${n(e.fixed[o])}`);return t}function Qr(e){return[e[1]*Pe,e[0]*Pe,e[2]*Pe]}function Kr(e,n){return e.axis==="x"?[n[0],n[2]]:e.axis==="y"?[n[2],n[1]]:[n[0],n[1]]}function Na(e,n,t){let o=e.left,r=e.left+e.width,s=e.top,i=e.top+e.height;if(Math.abs(n[0]-t[0])<=et){if(Math.abs(n[0]-o)<=et)return"left";if(Math.abs(n[0]-r)<=et)return"right"}if(Math.abs(n[1]-t[1])<=et){if(Math.abs(n[1]-s)<=et)return"top";if(Math.abs(n[1]-i)<=et)return"bottom"}return null}function $a(e,n){let t=null;for(let o=0;o<3;o+=1)if(!(Math.abs(e[o]-n[o])<=et)){if(t!==null)return null;t=o}return t}function Ua(e,n,t){let o=n.vertices,r=Qr(o[t]),s=Qr(o[(t+1)%o.length]),i=Na(e,Kr(e,r),Kr(e,s));if(!i)return null;let c=$a(r,s);if(c===null)return null;let l=Math.min(r[c],s[c]),u=Math.max(r[c],s[c]);return u-l>et?{item:e,side:i,variableAxis:c,fixed:r,start:l,end:u}:null}function Jr(e){e.item.bleed[e.side]=Math.max(e.item.bleed[e.side],Da)}function Ga(e,n){let t=new Map;for(let o of n){let r=e[o.sourceIndex];if(r)for(let s=0;s<r.vertices.length;s+=1){let i=Ua(o,r,s);if(!i)continue;let c=za(i),l=t.get(c);l?l.push(i):t.set(c,[i])}}for(let o of t.values()){if(o.length<2)continue;o.sort((s,i)=>s.start-i.start||s.end-i.end);let r=[];for(let s of o){r=r.filter(i=>i.end>s.start+et);for(let i of r)i.item.sourceIndex!==s.item.sourceIndex&&(Jr(i),Jr(s));r.push(s)}}}function ja(e){let n=ts(e);return n?{r:n.rgb[0],g:n.rgb[1],b:n.rgb[2],alpha:n.alpha}:{r:255,g:255,b:255,alpha:1}}function Wa(e){if(!e)return"#cccccc";let n=ts(e);if(!n)return e;let t={r:n.rgb[0],g:n.rgb[1],b:n.rgb[2],alpha:n.alpha};if(t.alpha<1){let o=Math.round(Math.max(0,t.alpha)*1e3)/1e3;return`rgba(${go(t.r)}, ${go(t.g)}, ${go(t.b)}, ${o})`}return Ya(t)}function Ya({r:e,g:n,b:t}){let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(n)}${o(t)}`}function go(e){return Math.round(Math.max(0,Math.min(255,e)))}function Xa(e,n,t,o){let r=t?.direction??Ma,s=Math.hypot(r[0],r[1],r[2])||1,i=r[0]/s,c=r[1]/s,l=r[2]/s,u=Math.max(0,t?.intensity??_a)*Math.max(0,e[0]*i+e[1]*c+e[2]*l),d=Math.max(0,o?.intensity??ka),x=t?.color??La,h=o?.color??Ra,b=Aa(n,u,x,h,d),v=ja(n);if(v.alpha>=1)return b;let P=parseInt(b.slice(1,3),16),g=parseInt(b.slice(3,5),16),C=parseInt(b.slice(5,7),16);return`rgba(${P}, ${g}, ${C}, ${v.alpha})`}function Za(e){if(!e?.length)return[];let n=[];for(let t=0;t<e.length;t+=1){let o=e[t],r=Ba(o);if(!r||r.width<=0||r.height<=0)return[];n.push({...r,sourceIndex:t})}return Ga(e,n),n}function qa(e){return e.axis==="x"?{xAxis:[1,0,0],yAxis:[0,0,1],normal:[0,-1,0],tx:0,ty:-e.z,tz:0}:e.axis==="y"?{xAxis:[0,0,1],yAxis:[0,1,0],normal:[-1,0,0],tx:-e.z,ty:0,tz:0}:{xAxis:[1,0,0],yAxis:[0,1,0],normal:[0,0,1],tx:0,ty:0,tz:e.z}}function Qa(e){let n=e.left,t=e.top,o=e.left+e.width,r=e.top+e.height;return[n,t,o,t,o,r,n,r]}function Ka(e){return new Map([[0,e.bleed.top],[1,e.bleed.right],[2,e.bleed.bottom],[3,e.bleed.left]])}function Ja(e,n){let t=e.split(",").map(Number);if(t.length!==16||t.some(r=>!Number.isFinite(r)))return null;let o=wa/n;for(let r=0;r<8;r+=1)t[r]*=o;return`matrix3d(${t.map(r=>Number(r.toFixed(6))).join(",")})`}function es(e,n){let t=e.left-e.bleed.left,o=e.top-e.bleed.top,r=e.width+e.bleed.left+e.bleed.right,s=e.height+e.bleed.top+e.bleed.bottom,i=e.z,c=r/n,l=s/n;return`matrix3d(${(e.axis==="x"?[c,0,0,0,0,0,l,0,0,-1,0,0,t,-i,o,1]:e.axis==="y"?[0,0,c,0,0,l,0,0,-1,0,0,0,-i,o,t,1]:[c,0,0,0,0,l,0,0,0,0,1,0,t,o,i,1]).map(d=>Number(d.toFixed(6))).join(",")})`}function el(e,n){let{xAxis:t,yAxis:o,normal:r,tx:s,ty:i,tz:c}=qa(e),l=xa(Qa(e),t,o,r,s,i,c,Ia,Ka(e));return l?Ja(l,n)??es(e,n):es(e,n)}function tl(e){let n=e.defaultView?.matchMedia;return n?n("(pointer: coarse)").matches||n("(hover: none)").matches:!1}function nl(e){return tl(e)?Oa:ns}function ol(e){return e.axis==="x"?[e.left+e.width/2,-e.z,e.top+e.height/2]:e.axis==="y"?[-e.z,e.top+e.height/2,e.left+e.width/2]:[e.left+e.width/2,e.top+e.height/2,e.z]}function rl(e,n){let t=ol(e),o=n.meshRotation;o&&(t=Ta(t,o));let[r,s]=Ea(t,n.rotX,0,n.rotY);return{x:r,y:s}}function sl(e,n,t){let o=e.filter(h=>n.has(h.face)).map(h=>({item:h,...rl(h,t)}));if(o.length===0)return[];let r=1/0,s=-1/0,i=1/0,c=-1/0;for(let h of o)r=Math.min(r,h.x),s=Math.max(s,h.x),i=Math.min(i,h.y),c=Math.max(c,h.y);let l=4,u=Math.max(1e-6,s-r),d=Math.max(1e-6,c-i),x=new Map;for(let h of o){let b=Math.min(l-1,Math.max(0,Math.floor((h.x-r)/u*l))),v=Math.min(l-1,Math.max(0,Math.floor((h.y-i)/d*l))),P=`${b}:${v}`,g=x.get(P);g||(g={tx:b,ty:v,sourceIndex:h.item.sourceIndex,items:[]},x.set(P,g)),g.items.push(h.item),g.sourceIndex=Math.min(g.sourceIndex,h.item.sourceIndex)}return Array.from(x.values()).sort((h,b)=>h.ty-b.ty||h.tx-b.tx||h.sourceIndex-b.sourceIndex).flatMap(h=>h.items)}function rs(e){let{doc:n,wrapper:t,polygons:o,directionalLight:r,ambientLight:s}=e,i=Za(o);if(i.length===0)return null;let c=new Set(i.map(y=>y.face));t.classList.add("polycss-voxel-mesh");let l=nl(n);l!==ns&&t.style.setProperty("--polycss-voxel-primitive",`${l}px`);let u=new Map,d=(y,m)=>{let p=`${y}|${m}`,T=u.get(p);if(T)return T;let M=Xa(os[y],m,r,s);return u.set(p,M),M},x=new Map,h=new Map,b=new Map,v=new Map;for(let y of i){let m=v.get(y.face);m||(m=[],v.set(y.face,m)),m.push(y)}let P="",g=0,C=new Set,D=y=>{let m=x.get(y.sourceIndex);return m||(m=n.createElement("b"),x.set(y.sourceIndex,m),Fa(m,d(y.face,y.baseColor),el(y,l))),m},k=y=>{let m=h.get(y);return m||(m=n.createElement("span"),m.className=`polycss-voxel-face polycss-voxel-face-${y}`,m.dataset.polycssVoxelFace=y,m.__polycssVoxelFaceHost=!0,h.set(y,m)),m},z=()=>{for(let y of Array.from(t.childNodes))if(!y.__polycssVoxelFaceHost)return y;return null},I=(y,m)=>{let p=m.map(R=>R.sourceIndex).join(",");if(b.get(y)===p)return;let T=k(y),M=n.createDocumentFragment();for(let R of m)M.appendChild(D(R));T.replaceChildren(M),b.set(y,p)},Z=()=>{for(let y of yo)c.has(y)&&I(y,v.get(y)??[])},Q=y=>new Set(y.split("|").filter(Boolean)),O=y=>{let m=Q(y);return yo.filter(p=>m.has(p)&&c.has(p))},H=y=>{let m=0;for(let p of y)m+=v.get(p)?.length??0;return m},V=y=>{let m=new Set,p=[],T=new Map;for(let M of y){m.has(M.face)||(m.add(M.face),p.push(M.face));let R=T.get(M.face);R||(R=[],T.set(M.face,R)),R.push(M)}return{orderedFaces:p,itemsByFace:T}},$=(y,m)=>{let p=new Set(y);for(let T of C){if(p.has(T))continue;let M=h.get(T);M?.parentNode===t&&t.removeChild(M)}if(m){let T=n.createDocumentFragment();for(let M of y)T.appendChild(k(M));t.insertBefore(T,z()),C=p;return}for(let T=0;T<y.length;T+=1){let M=y[T],R=k(M);if(R.parentNode===t)continue;let L=null;for(let te=T+1;te<y.length;te+=1){let _=h.get(y[te]);if(_?.parentNode===t){L=_;break}}t.insertBefore(R,L??z())}C=p},A=(y,m,p)=>{if(!p){let te=O(y);$(te,!1),g=H(te);return}let T=new Set(y.split("|").filter(Boolean)),M=sl(i,T,m),{orderedFaces:R,itemsByFace:L}=V(M);for(let te of R)I(te,L.get(te)??[]);$(R,!0),g=M.length};return Z(),{get brushCount(){return g},render(y){P=qr(y),A(P,y,!0)},syncCamera(y){let m=qr(y);m!==P&&(P=m,A(m,y,!1))},dispose(){for(let y of h.values())y.remove();t.classList.remove("polycss-voxel-mesh"),t.style.removeProperty("--polycss-voxel-primitive"),x.clear(),h.clear(),b.clear(),g=0,C=new Set,P=""}}}var ss="polycss-styles";function bo(e){let n=e??(typeof document<"u"?document:void 0);if(!n||n.getElementById(ss))return;let t=n.createElement("style");t.id=ss,t.textContent=il,n.head.appendChild(t)}var il=`
2
2
  /* \u2500\u2500 Scene container \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3
3
 
4
4
  .polycss-scene,
@@ -8,6 +8,18 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
8
8
  box-sizing: border-box;
9
9
  }
10
10
 
11
+ /* Camera wrapper (mounted by createPolyCamera / PolyPerspectiveCamera /
12
+ PolyOrthographicCamera). Fills its parent so the scene inside has a
13
+ positioned, sized layout context for its top: 50% / left: 50% pin to
14
+ resolve against. Inline styles win on specificity if the user sizes
15
+ the camera explicitly. */
16
+ .polycss-camera {
17
+ position: relative;
18
+ display: block;
19
+ width: 100%;
20
+ height: 100%;
21
+ }
22
+
11
23
  .polycss-scene {
12
24
  position: absolute;
13
25
  top: 50%;
@@ -15,7 +27,6 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
15
27
  width: 0;
16
28
  height: 0;
17
29
  transform-style: preserve-3d;
18
- perspective: 8000px;
19
30
  /* Pin the scene as a composited layer. Without this, mobile Chrome
20
31
  re-rasterizes every descendant tile when the scene transform changes
21
32
  each animation frame, which overruns the raster budget on textured
@@ -26,8 +37,8 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
26
37
 
27
38
  /* \u2500\u2500 First-person controls perspective context \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
28
39
 
29
- /* PolyFirstPersonControls toggles this class on its host element (vanilla:
30
- scene.host; react/vue: the camera wrapper). FPV needs a real perspective
40
+ /* PolyFirstPersonControls toggles this class on the camera wrapper
41
+ (scene.cameraEl in vanilla; the camera wrapper div in react/vue). FPV needs a real perspective
31
42
  context so scene Z translation produces visible depth motion - without
32
43
  it, walking forward looks like a planar pan. The class wins over inline
33
44
  perspective styles (e.g. PolyOrthographicCamera's perspective: none)
@@ -40,12 +51,32 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
40
51
  transform-style: preserve-3d !important;
41
52
  }
42
53
 
54
+ /* \u2500\u2500 Shadow root wrapper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
55
+
56
+ /* Single 0\xD70 preserve-3d container that owns every shadow SVG (ground +
57
+ per-face receiver). Children composite via their own absolute matrix3d
58
+ transforms exactly as if mounted on .polycss-scene directly. The wrapper
59
+ exists so the DOM has one obvious "shadows live here" node and so
60
+ future toggles (clip-region, hide-all-shadows) flip a single ancestor. */
61
+ .polycss-shadows {
62
+ position: absolute;
63
+ top: 0;
64
+ left: 0;
65
+ width: 0;
66
+ height: 0;
67
+ transform-style: preserve-3d;
68
+ pointer-events: none;
69
+ }
70
+
43
71
  /* \u2500\u2500 Mesh wrapper \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
44
72
 
45
73
  .polycss-mesh {
46
74
  position: absolute;
47
75
  transform-style: preserve-3d;
48
- transform-origin: var(--origin);
76
+ /* Pivot at wrapper local (0,0,0) for three.js mesh.position/rotation/scale
77
+ parity. Geometry is positioned by the parser (bbox-min-at-origin by
78
+ default, or pre-centered via parseGltf/parseObj { center: true }). */
79
+ transform-origin: 0 0 0;
49
80
  }
50
81
 
51
82
  /* \u2500\u2500 Polygon leaf element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -81,11 +112,27 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
81
112
  height: 64px;
82
113
  }
83
114
 
84
- .polycss-mesh.polycss-voxel-mesh > b {
115
+ .polycss-mesh.polycss-voxel-mesh > .polycss-voxel-face {
116
+ position: absolute;
117
+ display: block;
85
118
  top: 0;
86
119
  left: 0;
87
- width: 1px;
88
- height: 1px;
120
+ width: 0;
121
+ height: 0;
122
+ transform-style: preserve-3d;
123
+ transform-origin: 0 0;
124
+ margin: 0;
125
+ padding: 0;
126
+ font: inherit;
127
+ line-height: 0;
128
+ pointer-events: none;
129
+ }
130
+
131
+ .polycss-mesh.polycss-voxel-mesh > .polycss-voxel-face > b {
132
+ top: 0;
133
+ left: 0;
134
+ width: var(--polycss-voxel-primitive, 1px);
135
+ height: var(--polycss-voxel-primitive, 1px);
89
136
  backface-visibility: visible;
90
137
  pointer-events: none;
91
138
  }
@@ -108,18 +155,42 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
108
155
  box-sizing: content-box;
109
156
  border: 0 solid transparent;
110
157
  border-color: transparent transparent currentColor transparent;
111
- border-width: 0 32px 64px 32px;
112
- }
113
-
114
- /* <q> \u2014 dedicated shadow leaf. Same border-shape rendering trick as <i>
115
- (border-color: currentColor fills the polygon outline) but with its
116
- own tag so we don't have to thread :not(.polycss-shadow) exclusions
117
- through every dynamic-mode color rule. backface-visibility must be
118
- visible because the projection matrix is near-rank-deficient and the
119
- resulting plane's normal can read as back-facing under some camera
120
- angles; the leaf is intentionally always painted. Strip the UA's
121
- default ::before/::after open-/close-quote so the element is just a
122
- styled box. */
158
+ border-width: 0 16px 32px 16px;
159
+ }
160
+
161
+ @supports (corner-top-left-shape: bevel) and (corner-top-right-shape: bevel) {
162
+ .polycss-scene > u,
163
+ .polycss-mesh > u,
164
+ .polycss-bucket > u {
165
+ border-width: 0;
166
+ width: 32px;
167
+ height: 32px;
168
+ background-color: currentColor;
169
+ border-top-left-radius: 50% 100%;
170
+ border-top-right-radius: 50% 100%;
171
+ corner-top-left-shape: bevel;
172
+ corner-top-right-shape: bevel;
173
+ }
174
+
175
+ .polycss-scene > u.polycss-corner-shape-solid,
176
+ .polycss-mesh > u.polycss-corner-shape-solid,
177
+ .polycss-bucket > u.polycss-corner-shape-solid {
178
+ width: 16px;
179
+ height: 16px;
180
+ box-sizing: border-box;
181
+ border: 0;
182
+ background: currentColor;
183
+ border-radius: 0;
184
+ corner-top-left-shape: initial;
185
+ corner-top-right-shape: initial;
186
+ corner-bottom-right-shape: initial;
187
+ corner-bottom-left-shape: initial;
188
+ }
189
+ }
190
+
191
+ /* Reserved internal <q> shadow element rules. Current shadow emission uses SVG
192
+ surfaces; these rules keep any retained <q> markup styled as a plain
193
+ border-shape leaf instead of inheriting UA quote styling. */
123
194
  .polycss-scene q {
124
195
  position: absolute;
125
196
  display: block;
@@ -213,7 +284,7 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
213
284
  @property --clz { syntax: "<number>"; inherits: true; initial-value: 1; }
214
285
 
215
286
  /* Ground-plane position in CSS pixels along the CSS-Z axis (= world-Z, the
216
- up axis in polycss's world convention). Stored as a <number> so it can be
287
+ up axis in PolyCSS's world convention). Stored as a <number> so it can be
217
288
  used directly inside matrix3d() calc() expressions (matrix3d requires
218
289
  dimensionless entries \u2014 no px units).
219
290
  Set by recomputeShadowGround() from the min world-Z of casting meshes. */
@@ -302,37 +373,105 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
302
373
  leaves, so there's nothing inside a leaf that needs to participate
303
374
  in 3D compositing across the contain boundary. */
304
375
  contain: strict;
376
+ /*
377
+ * Three.js MeshLambertMaterial parity for textured surfaces:
378
+ *
379
+ * target = sRGB_encode(albedo_linear \xD7 irradiance_linear / \u03C0)
380
+ *
381
+ * background-blend-mode: multiply produces (bitmap \xD7 tint) in sRGB
382
+ * \u2014 approximately sRGB(albedo_linear \xD7 tint_linear) when bitmap \u2248
383
+ * sRGB(albedo_linear). So we want tint = sRGB_encode(irradiance /\u03C0).
384
+ *
385
+ * Each light/ambient colour channel is sRGB-to-linearised
386
+ * via pow((c + 0.055) / 1.055, 2.4) before the dot product so the
387
+ * irradiance accumulates in linear space; final encode is
388
+ * 1.055 \xD7 pow(c, 1/2.4) - 0.055. min(1, \u2026) clamps inside the encode
389
+ * domain. Matches the solid <b>/<i>/<u> pipeline below.
390
+ */
305
391
  background-color: rgb(
306
- calc(255 * (var(--par) * var(--pai)
307
- + var(--plr) * var(--pli) * var(--plam)))
308
- calc(255 * (var(--pag) * var(--pai)
309
- + var(--plg) * var(--pli) * var(--plam)))
310
- calc(255 * (var(--pab) * var(--pai)
311
- + var(--plb) * var(--pli) * var(--plam)))
392
+ calc(255 * max(0, 1.055 * pow(min(1, (
393
+ pow((var(--par) + 0.055) / 1.055, 2.4) * var(--pai) +
394
+ pow((var(--plr) + 0.055) / 1.055, 2.4) * var(--pli) * var(--plam)
395
+ ) / 3.14159265), 0.4167) - 0.055))
396
+ calc(255 * max(0, 1.055 * pow(min(1, (
397
+ pow((var(--pag) + 0.055) / 1.055, 2.4) * var(--pai) +
398
+ pow((var(--plg) + 0.055) / 1.055, 2.4) * var(--pli) * var(--plam)
399
+ ) / 3.14159265), 0.4167) - 0.055))
400
+ calc(255 * max(0, 1.055 * pow(min(1, (
401
+ pow((var(--pab) + 0.055) / 1.055, 2.4) * var(--pai) +
402
+ pow((var(--plb) + 0.055) / 1.055, 2.4) * var(--pli) * var(--plam)
403
+ ) / 3.14159265), 0.4167) - 0.055))
312
404
  );
313
405
  background-blend-mode: multiply;
406
+ background-image: var(--polycss-atlas-url);
407
+ background-position: var(--polycss-atlas-position);
408
+ background-repeat: no-repeat;
409
+ background-size: var(--polycss-atlas-image-size);
410
+ mask-image: var(--polycss-atlas-url);
411
+ mask-mode: alpha;
412
+ mask-position: var(--polycss-atlas-position);
413
+ mask-repeat: no-repeat;
414
+ mask-size: var(--polycss-atlas-image-size);
415
+ -webkit-mask-image: var(--polycss-atlas-url);
416
+ -webkit-mask-position: var(--polycss-atlas-position);
417
+ -webkit-mask-repeat: no-repeat;
418
+ -webkit-mask-size: var(--polycss-atlas-image-size);
314
419
  }
315
420
 
316
421
  .polycss-scene[data-polycss-lighting="dynamic"] b,
317
422
  .polycss-scene[data-polycss-lighting="dynamic"] i,
318
423
  .polycss-scene[data-polycss-lighting="dynamic"] u {
424
+ /*
425
+ * Three.js MeshLambertMaterial parity (default useLegacyLights=false,
426
+ * physically-correct pipeline):
427
+ *
428
+ * lit_linear = albedo_linear \xD7 (lightColor_linear \xD7 intensity \xD7 lambert
429
+ * + ambient_linear \xD7 ambientIntensity) / \u03C0
430
+ * output = 255 \xD7 sRGB_encode(min(1, lit_linear))
431
+ *
432
+ * sRGB\u2192linear: pow((c + 0.055) / 1.055, 2.4) for c > 0.04045
433
+ * 12.92 \xD7 c otherwise (skipped \u2014 tiny)
434
+ * linear\u2192sRGB: 1.055 \xD7 pow(c, 1/2.4) - 0.055 for c > 0.0031308
435
+ * 12.92 \xD7 c otherwise (skipped \u2014 tiny)
436
+ *
437
+ * The naive pow(c, 2.4) shortcut undershoots by ~2x for small c
438
+ * (dark channels of a saturated colour) \u2014 the +0.055/1.055 offset
439
+ * is load-bearing for the G/B drift on saturated fixtures.
440
+ *
441
+ * Verified against per-pixel screenshots in bench/three-parity.html
442
+ * (cube #dc2626 top face): drift <3 per channel across i=0.5..3,
443
+ * ambient=0..0.3, lambert=0..1.
444
+ */
319
445
  color: rgb(
320
- calc(255 * var(--psr) * (var(--par) * var(--pai)
321
- + var(--plr) * var(--pli) * var(--plam)))
322
- calc(255 * var(--psg) * (var(--pag) * var(--pai)
323
- + var(--plg) * var(--pli) * var(--plam)))
324
- calc(255 * var(--psb) * (var(--pab) * var(--pai)
325
- + var(--plb) * var(--pli) * var(--plam)))
446
+ calc(255 * max(0, 1.055 * pow(min(1,
447
+ pow((var(--psr) + 0.055) / 1.055, 2.4) * (
448
+ pow((var(--par) + 0.055) / 1.055, 2.4) * var(--pai) +
449
+ pow((var(--plr) + 0.055) / 1.055, 2.4) * var(--pli) * var(--plam)
450
+ ) / 3.14159265
451
+ ), 0.4167) - 0.055))
452
+ calc(255 * max(0, 1.055 * pow(min(1,
453
+ pow((var(--psg) + 0.055) / 1.055, 2.4) * (
454
+ pow((var(--pag) + 0.055) / 1.055, 2.4) * var(--pai) +
455
+ pow((var(--plg) + 0.055) / 1.055, 2.4) * var(--pli) * var(--plam)
456
+ ) / 3.14159265
457
+ ), 0.4167) - 0.055))
458
+ calc(255 * max(0, 1.055 * pow(min(1,
459
+ pow((var(--psb) + 0.055) / 1.055, 2.4) * (
460
+ pow((var(--pab) + 0.055) / 1.055, 2.4) * var(--pai) +
461
+ pow((var(--plb) + 0.055) / 1.055, 2.4) * var(--pli) * var(--plam)
462
+ ) / 3.14159265
463
+ ), 0.4167) - 0.055))
326
464
  );
327
465
  }
328
466
 
329
- /* \u2500\u2500 Cast shadows (dynamic mode only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
467
+ /* \u2500\u2500 Retained <q> shadow projection (dynamic-mode CSS path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
330
468
 
331
469
  /*
332
- * Shadow projection matrix. Projects any 3D point P onto the horizontal
333
- * ground plane (cssZ \u2248 G) along the CSS-space light direction (--clx/y/z).
470
+ * Projection matrix for retained internal <q> shadow leaves. Projects any
471
+ * 3D point P onto the horizontal ground plane (cssZ \u2248 G) along the CSS-space
472
+ * light direction (--clx/y/z).
334
473
  *
335
- * In polycss's world convention world Z is up (red-green plane is the
474
+ * In PolyCSS's world convention world Z is up (red-green plane is the
336
475
  * floor in the axes helper). After the world\u2192CSS swap (Y\u2194X), world Z stays
337
476
  * as CSS Z, so the ground plane normal in CSS space is +cssZ.
338
477
  *
@@ -343,7 +482,7 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
343
482
  * has a valid layout box. The fix: collapse along z by a near-zero
344
483
  * scale (Z_SQUASH = 0.01) instead of exactly zero \u2014 output.z is then
345
484
  * approximately G with ~1% drift from the input, full-rank and renderable.
346
- * The shadow still looks flat to the eye (the drift is sub-pixel for
485
+ * The result still looks flat to the eye (the drift is sub-pixel for
347
486
  * any realistic scene size).
348
487
  *
349
488
  * out.cssX = P.cssX - (--clx/--clz) * (P.cssZ - G)
@@ -371,18 +510,290 @@ import{BASE_TILE as hs,CAMERA_BACKFACE_CULL_EPS as Wt,cameraCullNormalGroups as
371
510
  );
372
511
  }
373
512
 
374
- /* <q> shadow leaf \u2014 Lambert-gated opacity. Polygons facing the light cast
375
- full shadow; polygons facing away cast zero shadow (their projection
376
- would stack inside the silhouette and produce ugly overdraw). The
377
- * 10 multiplier sharpens the cutoff so small positive Lambert values
378
- jump quickly to 1, giving a near-binary visibility decision with a
379
- smooth edge transition. Pure CSS calc \u2014 no JS at light-change time.
513
+ /* Retained <q> opacity gate. Polygons facing the light cast full shadow;
514
+ polygons facing away cast zero shadow. The * 10 multiplier sharpens the
515
+ cutoff so small positive Lambert values jump quickly to 1. */
516
+ .polycss-scene[data-polycss-lighting="dynamic"] q {
517
+ opacity: clamp(0, calc((var(--pnx) * var(--clx) + var(--pny) * var(--cly) + var(--pnz) * var(--clz)) * 10), 1);
518
+ }
519
+ `;import{BASE_TILE as al}from"@layoutit/polycss-core";var ll=1,Ne=al,cl=.1;function ul(e){return[e[1]*Ne,e[0]*Ne,e[2]*Ne]}function Rt(e){return[e[1],e[0],e[2]]}function at(e){return e?.direction?{...e,direction:Rt(e.direction)}:e}function vn(e){let n=typeof e.scale=="number"?e.scale:e.scale?.[0]??1,t=typeof e.scale=="number"?e.scale:e.scale?.[1]??1,o=typeof e.scale=="number"?e.scale:e.scale?.[2]??1,r=n!==1||t!==1||o!==1,s=!!e.rotation&&(!!e.rotation[0]||!!e.rotation[1]||!!e.rotation[2]),i=e.position?ul(e.position):[0,0,0],c=[];return(i[0]!==0||i[1]!==0||i[2]!==0)&&c.push(`translate3d(${i[0]}px, ${i[1]}px, ${i[2]}px)`),s&&(e.rotation[0]&&c.push(`rotateY(${-e.rotation[0]}deg)`),e.rotation[1]&&c.push(`rotateX(${-e.rotation[1]}deg)`),e.rotation[2]&&c.push(`rotateZ(${-e.rotation[2]}deg)`)),r&&c.push(`scale3d(${n}, ${t}, ${o})`),c.length>0?c.join(" "):void 0}function vo(e,n=[0,0,0],t=1){let o=e.state,r=o.rotX,s=o.rotY,c=(o.zoom??ll)/Ne*t,l=(o.distance??0)*t,u=o.target??[0,0,0],d=u[0]+n[0],x=u[1]+n[1],h=u[2]+n[2],b=x*Ne,v=d*Ne,P=h*Ne;return`${l!==0?`translateZ(${-l}px) `:""}scale(${c}) rotateX(${r}deg) rotate(${s}deg) translate3d(${-b}px, ${-v}px, ${-P}px)`}function dl(e){let n=e.trim();if(!n||n==="normal")return 1;let t=n.endsWith("%")?Number(n.slice(0,-1))/100:Number(n);return Number.isFinite(t)&&t>0?t:1}function is(e){let n=e.ownerDocument?.defaultView;if(!n)return 1;let t=1;for(let o=e;o;o=o.parentElement)t*=dl(n.getComputedStyle(o).getPropertyValue("zoom"));return Number.isFinite(t)&&t>0?t:1}function as(e,n){Math.abs(n-1)<1e-6?e.style.removeProperty("zoom"):e.style.setProperty("zoom",String(1/n))}function ls(e){if(e.vertices.length<3)return null;let n=e.vertices[0],t=0,o=0,r=0;for(let x=1;x+1<e.vertices.length;x++){let h=e.vertices[x],b=e.vertices[x+1],v=h[1]-n[1],P=h[0]-n[0],g=h[2]-n[2],C=b[1]-n[1],D=b[0]-n[0],k=b[2]-n[2];t-=P*k-g*D,o-=g*C-v*k,r-=v*D-P*C}let s=Math.hypot(t,o,r);if(s<1e-9)return null;t/=s,o/=s,r/=s;let i=1/cl,c=Math.round(t*i)/i,l=Math.round(o*i)/i,u=Math.round(r*i)/i,d=Math.hypot(c,l,u);return d<1e-9?null:{key:c+","+l+","+u,vec:[c/d,l/d,u/d]}}function cs(e,n){let t=e?.disable??[],o=n?.disable??[];if(t.length!==o.length)return!1;for(let r of t)if(!o.includes(r))return!1;return!0}function us(e,n){return e===n?!0:!e||!n?!1:e[0]===n[0]&&e[1]===n[1]&&e[2]===n[2]}function ds(e,n){return e===n?!0:(e?.color??"#000000")===(n?.color??"#000000")&&(e?.opacity??.25)===(n?.opacity??.25)&&(e?.lift??.05)===(n?.lift??.05)&&(e?.maxExtend??2e3)===(n?.maxExtend??2e3)}import{parseHex as fs,parseHexColor as ps,parsePureColor as pl}from"@layoutit/polycss-core";var ml=["--plx","--ply","--plz","--plr","--plg","--plb","--pli","--par","--pag","--pab","--pai","--clx","--cly","--clz"],kt="--polycss-light-preview-active",ms=`var(${kt}, 0)`,fl="max(0, calc(var(--pnx, 0) * var(--plx, 0) + var(--pny, 0) * var(--ply, 0) + var(--pnz, 1) * var(--plz, 1)))",xo=(e,n,t)=>`calc(255 * max(0, 1.055 * pow(min(1, pow((var(${e}, 1) + 0.055) / 1.055, 2.4) * (pow((var(${n}, 1) + 0.055) / 1.055, 2.4) * var(--pai, 0.4) + pow((var(${t}, 1) + 0.055) / 1.055, 2.4) * var(--pli, 1) * var(--plam, 0)) / 3.14159265), 0.4167) - 0.055))`,hl=xo("--psr","--par","--plr"),gl=xo("--psg","--pag","--plg"),yl=xo("--psb","--pab","--plb");function ue(e,n,t){return e.style.getPropertyValue(n)===t?!1:(e.style.setProperty(n,t),!0)}function mt(e){for(let n of ml)e.style.getPropertyValue(n)&&e.style.removeProperty(n)}function xn(e,n){let t=n.directionalLight?.direction??[.4,-.7,.59],o=Rt(t),r=Math.hypot(o[0],o[1],o[2])||1,s=o[0]/r,i=o[1]/r,c=o[2]/r,l=ps(n.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],u=ps(n.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],d=n.directionalLight?.intensity??1,x=n.ambientLight?.intensity??.4,h=P=>(P/255).toFixed(4);ue(e,"--plx",s.toFixed(2)),ue(e,"--ply",i.toFixed(2)),ue(e,"--plz",c.toFixed(2)),ue(e,"--plr",h(l[0])),ue(e,"--plg",h(l[1])),ue(e,"--plb",h(l[2])),ue(e,"--pli",d.toFixed(4)),ue(e,"--par",h(u[0])),ue(e,"--pag",h(u[1])),ue(e,"--pab",h(u[2])),ue(e,"--pai",x.toFixed(4));let b=c,v=Math.sign(b||1)*Math.max(Math.abs(b),.01);ue(e,"--clx",s.toFixed(2)),ue(e,"--cly",i.toFixed(2)),ue(e,"--clz",v.toFixed(2))}function hs(e,n){let t=n.textureLighting==="dynamic";if(e.dataset.polycssLighting=n.textureLighting??"baked",!t){mt(e);return}xn(e,n)}function ft(e,n){n.paintColor?e.style.setProperty("--polycss-paint",n.paintColor):e.style.getPropertyValue("--polycss-paint")&&e.style.removeProperty("--polycss-paint"),n.dynamicColor?(e.style.setProperty("--psr",(n.dynamicColor.r/255).toFixed(4)),e.style.setProperty("--psg",(n.dynamicColor.g/255).toFixed(4)),e.style.setProperty("--psb",(n.dynamicColor.b/255).toFixed(4))):(e.style.getPropertyValue("--psr")||e.style.getPropertyValue("--psg")||e.style.getPropertyValue("--psb"))&&(e.style.removeProperty("--psr"),e.style.removeProperty("--psg"),e.style.removeProperty("--psb"))}function gs(e,n){let t=fs(n??"#cccccc");e.style.setProperty("--psr",(t.r/255).toFixed(4)),e.style.setProperty("--psg",(t.g/255).toFixed(4)),e.style.setProperty("--psb",(t.b/255).toFixed(4))}function Po(e,n,t){if(!e.plan||e.kind==="atlas"||e.plan.texture)return!1;let o=t.textureLighting??"baked",r={directionalLight:at(t.directionalLight),ambientLight:t.ambientLight,textureLighting:o,textureQuality:t.textureQuality,seamBleed:t.seamBleed,strategies:t.strategies},s=qn(e.plan,n,e.plan.normal,o,r);return wt(e.element,s,o),o==="baked"&&vl(e.element),!0}function bl(e){let n=pl(e)??{rgb:[255,255,255],alpha:1},[t,o,r]=n.rgb,s=(c,l)=>`calc(${c} * (1 - ${ms}) + var(${l}, ${c}) * ${ms})`,i=n.alpha<1?` / ${n.alpha}`:"";return`rgb(${s(t,"--polycss-preview-r")} ${s(o,"--polycss-preview-g")} ${s(r,"--polycss-preview-b")}${i})`}function ys(e,n,t){if(!e.plan||e.kind==="atlas"||e.plan.texture)return!1;let o=e.element,r=e.plan.normal,s=fs(n.color??"#cccccc"),i=!1;return i=ue(o,"--pnx",r[0].toFixed(4))||i,i=ue(o,"--pny",r[1].toFixed(4))||i,i=ue(o,"--pnz",r[2].toFixed(4))||i,i=ue(o,"--psr",(s.r/255).toFixed(4))||i,i=ue(o,"--psg",(s.g/255).toFixed(4))||i,i=ue(o,"--psb",(s.b/255).toFixed(4))||i,i=ue(o,"--plam",fl)||i,i=ue(o,"--polycss-preview-r",hl)||i,i=ue(o,"--polycss-preview-g",gl)||i,i=ue(o,"--polycss-preview-b",yl)||i,i=ue(o,"--polycss-paint",bl(t))||i,o.style.getPropertyValue("color")&&(o.style.removeProperty("color"),i=!0),i}function vl(e){e.style.removeProperty("--pnx"),e.style.removeProperty("--pny"),e.style.removeProperty("--pnz"),e.style.removeProperty("--psr"),e.style.removeProperty("--psg"),e.style.removeProperty("--psb"),e.style.removeProperty("--plam"),e.style.removeProperty("--polycss-preview-r"),e.style.removeProperty("--polycss-preview-g"),e.style.removeProperty("--polycss-preview-b"),e.style.removeProperty("--polycss-paint")}var xl="http://www.w3.org/2000/svg",Pn=class{constructor(){this.groundSvg=null;this.groundVisible=!1;this.currentGroundCssZ=null;this.shadowRoot=null}};function bs(e,n,t){let o=e.shadowRoot;if(o||(o=n.createElement("div"),o.setAttribute("class","polycss-shadows"),o.style.position="absolute",o.style.top="0",o.style.left="0",o.style.width="0",o.style.height="0",o.style.transformStyle="preserve-3d",o.style.pointerEvents="none",e.shadowRoot=o),o.parentNode!==t){let r=t.firstChild;r?t.insertBefore(o,r):t.appendChild(o)}return o}function vs(e){e.groundSvg?.parentNode&&e.groundSvg.parentNode.removeChild(e.groundSvg),e.groundSvg=null,e.groundVisible=!1}function xs(e){e.groundSvg&&e.groundVisible&&(e.groundSvg.style.display="none",e.groundVisible=!1)}function Ps(e,n,t,o){let r=[],s=e.firstChild;for(let i=0;i<t;i++){let c=s;c&&c.tagName==="path"?s=c.nextSibling:(c=n.createElementNS(xl,"path"),c.setAttribute("fill-rule","nonzero"),o&&(c.setAttribute("stroke-width","0.5"),c.setAttribute("stroke-linejoin","round")),e.insertBefore(c,s)),r.push(c)}for(;s;){let i=s.nextSibling;e.removeChild(s),s=i}return r}function Ss(e){return{host:e.host,doc:e.doc,cameraEl:e.cameraEl,sceneEl:e.sceneEl,camera:e.camera,layoutScale:e.layoutScale,options:{current:e.options},meshes:new Set,meshAutoCounter:{next:0},autoCenter:{offset:[0,0,0]},bboxCenterCssCache:{value:null},shadowSvgState:new Pn,receiverShadowCache:new Map,receiverShadowCacheKey:new Map,casterItemsCache:new Map,casterItemsCacheKey:new Map}}import{buildSharedEdgeMap as Pl,computeReceiverShadowFaces as Sl,meshScaleVec3 as Ms,prepareCasterEdgeOwners as Cl,prepareCasterPolyItems as El,prepareReceiverFacePlanes as Tl}from"@layoutit/polycss-core";function Cs(e){for(let n of e)n.svg&&n.svg.parentNode&&n.svg.parentNode.removeChild(n.svg),n.svg=null}function Es(e,n){if(n){let t=e.receiverShadowCache.get(n);t&&Cs(t),e.receiverShadowCache.delete(n),e.receiverShadowCacheKey.delete(n)}else{for(let t of e.receiverShadowCache.values())Cs(t);e.receiverShadowCache.clear(),e.receiverShadowCacheKey.clear()}}function Ts(e,n){n?(e.casterItemsCache.delete(n),e.casterItemsCacheKey.delete(n)):(e.casterItemsCache.clear(),e.casterItemsCacheKey.clear())}function As(e){vs(e.shadowSvgState),ws(e)}function So(e){return e.handle.id??e.autoMeshId}var Al="http://www.w3.org/2000/svg",Sn=new WeakMap,Ls=new WeakMap,_s=new WeakMap,Rs=new WeakMap,ks=new WeakMap;function Os(e){let n=Sn.get(e);return n||(n=new Map,Sn.set(e,n)),n}function Co(e){let n=Sn.get(e);if(n){for(let t of n.values())t.svg&&t.svg.parentNode&&t.svg.parentNode.removeChild(t.svg);n.clear(),Sn.delete(e)}}function ws(e){for(let n of e.meshes)Co(n)}function Ds(e,n,t,o,r,s,i,c,l,u){let d=e.options.current,{receiverShadowCache:x,receiverShadowCacheKey:h,casterItemsCache:b,casterItemsCacheKey:v}=e,P=o.handle.transform.position??[0,0,0],g=o.handle.transform.rotation??[0,0,0],C=o.polygons.some(A=>A.texture!==void 0),D=Ms(o.handle.transform.scale),k=o.bboxCenterCss,z=d.shadow?.lift??.001,I=`${o.polygons.length}|${r.size}|${P.join(",")}|${g.join(",")}|${D.join(",")}|${k?k.join(","):"n"}|${z}`,Z=x.get(o);if(Z===void 0||h.get(o)!==I){Z=Tl(o.polygons,P,o.handle.transform.scale,r,z,g),x.set(o,Z),h.set(o,I);let A=Os(o);for(let y of A.values())y.svg&&y.svg.parentNode&&y.svg.parentNode.removeChild(y.svg);A.clear()}let Q=[];for(let A of n){let y=A.handle.transform.position??[0,0,0],m=A.handle.transform.rotation??[0,0,0],p=Ms(A.handle.transform.scale),T=A.bboxCenterCss,M=`${A.polygons.length}|${y.join(",")}|${m.join(",")}|${p.join(",")}|${T?T.join(","):"n"}`,R=b.get(A);if(R===void 0||v.get(A)!==M){let _=t.get(A),j=new Set;for(let q of A.rendered)q.plan&&!_.has(q.polygonIndex)&&j.add(q.polygonIndex);R=El(A.polygons,y,A.handle.transform.scale,q=>j.has(q),m),b.set(A,R),v.set(A,M)}let L;if(A===o){let _=Ls.get(A);(_===void 0||_s.get(A)!==A.polygons)&&(_=Pl(A.polygons),Ls.set(A,_),_s.set(A,A.polygons)),L=_}let te;if(A!==o&&A.polygons.length>=40){let _=Rs.get(A);(_===void 0||ks.get(A)!==M)&&(_=Cl(A.polygons,y,A.handle.transform.scale,m),Rs.set(A,_),ks.set(A,M)),te=_}Q.push({id:A,items:R,selfShadowEdgeMap:L,edgeOwners:te,casterPolygonCount:A.polygons.length})}let O={rotX:e.camera.state.rotX,rotY:e.camera.state.rotY,meshRotation:o.handle.transform.rotation},H=Sl({receiverPlanes:Z,receiverPolygons:o.polygons,receiverHasTexture:C,casters:Q,lightDir:s,cameraRot:O,ambientLight:d.ambientLight,directionalLight:d.directionalLight,shadow:{color:d.shadow?.color,opacity:u,maxExtend:d.shadow?.maxExtend}}),V=Os(o),$=new Set;for(let A of H){$.add(A.faceIndex);let y=V.get(A.faceIndex);y||(y={svg:null,visible:!1,width:-1,height:-1,matrixCss:""},V.set(A.faceIndex,y));let m=y.svg;m?(y.visible||(m.style.display="block"),(y.width!==A.width||y.height!==A.height)&&(m.setAttribute("width",String(A.width)),m.setAttribute("height",String(A.height)),m.setAttribute("viewBox",`0 0 ${A.width} ${A.height}`),y.width=A.width,y.height=A.height),y.matrixCss!==A.matrixCss&&(m.style.transform=A.matrixCss,y.matrixCss=A.matrixCss)):(m=e.doc.createElementNS(Al,"svg"),m.setAttribute("class","polycss-shadow polycss-shadow-svg polycss-shadow-receiver"),d.debugShadowAttrs&&(m.setAttribute("data-poly-shadow-type","receiver"),m.setAttribute("data-poly-shadow-receiver",So(o)),m.setAttribute("data-poly-shadow-receiver-face",String(A.faceIndex)),m.setAttribute("data-poly-shadow-receiver-polys",JSON.stringify(A.memberPolyIndices))),m.setAttribute("width",String(A.width)),m.setAttribute("height",String(A.height)),m.setAttribute("viewBox",`0 0 ${A.width} ${A.height}`),m.setAttribute("style",`position:absolute;top:0;left:0;display:block;overflow:hidden;transform-origin:0 0;pointer-events:none;will-change:transform;transform:${A.matrixCss}`),bs(e.shadowSvgState,e.doc,e.sceneEl).appendChild(m),y.svg=m,y.width=A.width,y.height=A.height,y.matrixCss=A.matrixCss),y.visible=!0;let p=Ps(m,e.doc,A.paths.length,!0),T=A.opacity.toFixed(4),M=[],R=!!d.debugShadowAttrs;for(let L=0;L<A.paths.length;L++){let te=A.paths[L],_=R?So(te.casterId):"";R&&M.push(_);let j=p[L];if(j.setAttribute("d",te.d),j.getAttribute("fill")!==A.fill&&j.setAttribute("fill",A.fill),j.getAttribute("stroke")!==A.fill&&j.setAttribute("stroke",A.fill),j.getAttribute("opacity")!==T&&j.setAttribute("opacity",T),R){j.getAttribute("data-poly-shadow-caster")!==_&&j.setAttribute("data-poly-shadow-caster",_);let q=JSON.stringify(te.casterPolygonIndices);j.getAttribute("data-poly-shadow-caster-polys")!==q&&j.setAttribute("data-poly-shadow-caster-polys",q)}}if(R){let L=M.join(" ");m.getAttribute("data-poly-shadow-casters")!==L&&m.setAttribute("data-poly-shadow-casters",L)}}for(let[A,y]of V)$.has(A)||y.svg&&y.visible&&(y.svg.style.display="none",y.visible=!1)}var Is=Symbol.for("polycss.animation.triangleFrameTarget");var Fl=750;function Vs(e){return!Object.prototype.hasOwnProperty.call(e,"seamBleed")||e.seamBleed!==void 0?e:{...e,seamBleed:zs}}var Vl={key:"non-cullable",normal:[1,1,0]};function Bs(){return[Vl]}function Ao(e,n){if(!e||typeof e.appendChild!="function")throw new Error("createPolyScene: host must be an HTMLElement");if(!n?.camera)throw new Error("createPolyScene: a camera handle is required. Use createPolyCamera({...}) or createPolyPerspectiveCamera({...}) and pass as { camera }.");let t=n.camera;e.ownerDocument&&bo(e.ownerDocument),e.ownerDocument?.defaultView&&e.ownerDocument.defaultView.getComputedStyle(e).position==="static"&&(e.style.position="relative");let{camera:o,...r}=n,s=Vs({seamBleed:zs,...r}),i=is(e),c=[0,0,0],l=e.ownerDocument??document,u=l.createElement("div");u.className="polycss-camera",Z(u,s),e.appendChild(u);let d=l.createElement("div");d.className="polycss-scene",d.setAttribute("aria-hidden","true"),Q(d,s),u.appendChild(d);let x=Ss({host:e,doc:l,cameraEl:u,sceneEl:d,camera:t,layoutScale:i,options:s}),h=x.meshes,b=new WeakMap,v=x.shadowSvgState,P=()=>xs(v),g=()=>As(x),C=null;function D(a){if(!a)return null;let f=Math.hypot(a[0],a[1],a[2]);if(!Number.isFinite(f)||f<=0)return null;let S=Math.round(a[0]/f*100)/100,E=Math.round(a[1]/f*100)/100,W=Math.round(a[2]/f*100)/100;return`${S}|${E}|${W}`}function k(){C=null}let z=a=>Es(x,a),I=a=>Ts(x,a);function Z(a,f){let S=t.perspectiveStyle;if(S==="none")a.style.perspective="1000000px";else{let E=parseFloat(S);Number.isFinite(E)&&(a.style.perspective=`${E}px`)}}function Q(a,f){as(a,i),a.style.transform=vo(t,c,i),hs(a,f)}function O(a){a.style.transform=vo(t,c,i)}function H(a){a.voxelRenderer?.dispose(),a.voxelRenderer=void 0,y(a.rendered,a.disposeAtlas),a.disposeAtlas=void 0,a.rendered.length=0,a.renderedByPolygonIndex=[],a.cameraCullGroups=[],a.cameraCullSignature="",a.solidLightingPreviewPrepared=!1,a.solidLightingPreviewActive=!1,A(a);for(let f of Array.from(a.wrapper.children))f instanceof HTMLElement&&f.classList.contains("polycss-bucket")&&f.remove();a.hasBuckets=!1}function V(a){for(let f of Array.from(a.wrapper.childNodes)){if(!(f instanceof HTMLElement))return f;if(f.classList.contains("polycss-bucket")||f.classList.contains("polycss-shadow"))continue;let S=f.tagName.toLowerCase();if(!(S==="b"||S==="i"||S==="s"||S==="u"||S==="q"))return f}return null}function $(a,f,S){S?.parentNode===a.wrapper?a.wrapper.insertBefore(f,S):a.wrapper.appendChild(f)}function A(a){for(let f of a.shadowRendered)f.parentNode&&f.parentNode.removeChild(f);a.shadowRendered.length=0,g()}function y(a,f){f?.();for(let S of a){try{S.dispose()}catch{}S.element.parentNode&&S.element.parentNode.removeChild(S.element)}}function m(a,f,S){a.rendered=f,a.renderedByPolygonIndex=[];for(let E of f)a.renderedByPolygonIndex[E.polygonIndex]=E;a.disposeAtlas=S,a.solidLightingPreviewPrepared=!1}function p(a,f){let S=a.renderedByPolygonIndex[f];return S?.polygonIndex===f?S:void 0}function T(a){for(let f of Array.from(a.wrapper.children))f instanceof HTMLElement&&f.classList.contains("polycss-bucket")&&f.remove();a.hasBuckets=!1;for(let f of a.rendered)f.element.parentNode&&f.element.parentNode.removeChild(f.element)}function M(a,f){let S=a.polygons[f.polygonIndex];return a.stableDom&&S?Fs(S):f.plan?.normal??(S?Fs(S):null)}function R(a){if(!q(a))return a.rendered;let f=L(a);return a.rendered.filter(S=>te(a,S,Eo,f))}function L(a){return{rotX:t.state.rotX,rotY:t.state.rotY,meshRotation:a.handle.transform.rotation}}function te(a,f,S=Eo,E=L(a)){let W=M(a,f);return W===null||Dl(W,E,S)}function _(a){if(a.excludeFromAutoCenter){a.cameraCullGroups=[];return}let f=new Map;for(let S of a.rendered){let E=M(a,S);if(!E)continue;if(!kl(E)){a.cameraCullGroups=Bs();return}let W=Ml(E);if(!f.has(W)&&(f.set(W,E),f.size>wl)){a.cameraCullGroups=Bs();return}}a.cameraCullGroups=Array.from(f,([S,E])=>({key:S,normal:E}))}function j(a){return q(a)?Ll(a.cameraCullGroups,L(a)):"all"}function q(a){return!a.excludeFromAutoCenter&&Ol(a.cameraCullGroups)}function re(a){a.cameraCullSignature=q(a)?j(a):"all"}function fe(a,f){let S=new Array(a.rendered.length),E=!1,W=L(a);for(let K=0;K<a.rendered.length;K+=1){let oe=a.rendered[K],J=te(a,oe,f,W);S[K]=J}let B=null,F=null,G=()=>{if(!(!B||!F)){if(B===F)B.remove();else{let K=l.createRange();K.setStartBefore(B),K.setEndAfter(F),K.deleteContents(),K.detach()}B=null,F=null,E=!0}};for(let K=0;K<a.rendered.length;K+=1){let oe=a.rendered[K];!S[K]&&oe.element.parentNode===a.wrapper?(F&&F.nextSibling===oe.element||(G(),B=oe.element),F=oe.element):G()}G();let Y=K=>{for(let oe=K;oe<a.rendered.length;oe+=1){let J=a.rendered[oe].element;if(J.parentNode===a.wrapper)return J}return V(a)},ae=-1,ne=K=>{if(ae<0)return;let oe=l.createDocumentFragment();for(let J=ae;J<K;J+=1){let Ie=a.rendered[J];be(a,Ie),oe.appendChild(Ie.element)}$(a,oe,Y(K)),ae=-1,E=!0};for(let K=0;K<a.rendered.length;K+=1){let oe=a.rendered[K];S[K]&&oe.element.parentNode!==a.wrapper?ae<0&&(ae=K):ne(K)}return ne(a.rendered.length),E}function de(a,f=!1){if(a.voxelRenderer){f?a.voxelRenderer.render(L(a)):a.voxelRenderer.syncCamera(L(a)),a.cameraCullSignature="voxel-direct";return}if(!q(a)){let W=a.cameraCullSignature!=="all";a.cameraCullSignature="all",W&&ve(a);return}if(a.hasBuckets){pe(a,f);return}let S=j(a);if(!f&&S===a.cameraCullSignature)return;let E=fe(a,Eo);a.cameraCullSignature=S,E&&Ge(a)}function pe(a,f=!1){let S=q(a)?j(a):"all";!f&&S===a.cameraCullSignature||ve(a)}function Ce(a,f){return M(a,f)}function be(a,f){if(s.textureLighting!=="dynamic")return;let S=Ce(a,f);S&&(f.element.style.setProperty("--pnx",S[0].toFixed(4)),f.element.style.setProperty("--pny",S[1].toFixed(4)),f.element.style.setProperty("--pnz",S[2].toFixed(4)))}function Ae(a){T(a),a.hasBuckets=!1;let f=a.skipBucketNormalCleanupOnce;a.skipBucketNormalCleanupOnce=!1;let S=l.createDocumentFragment(),E=s.textureLighting==="dynamic"&&!a.stableDom,W=new Map,B=[];for(let F of R(a)){let G=a.polygons[F.polygonIndex],Y=E&&G?ls(G):null;if(!Y){B.push(F);continue}let ae=Y.key+"|"+(G.color??""),ne=W.get(ae);ne||(ne={vec:Y.vec,items:[]},W.set(ae,ne)),ne.items.push(F)}for(let F of B)be(a,F),S.appendChild(F.element);for(let F of W.values()){if(F.items.length<2){for(let Y of F.items)be(a,Y),S.appendChild(Y.element);continue}let G=l.createElement("div");G.className="polycss-bucket",a.hasBuckets=!0,G.style.setProperty("--pnx",String(F.vec[0])),G.style.setProperty("--pny",String(F.vec[1])),G.style.setProperty("--pnz",String(F.vec[2]));for(let Y of F.items)G.appendChild(Y.element),(!f||Y.kind==="triangle")&&(Y.element.style.removeProperty("--pnx"),Y.element.style.removeProperty("--pny"),Y.element.style.removeProperty("--pnz"));S.appendChild(G)}$(a,S,V(a)),re(a)}function Ue(){return new Promise(a=>setTimeout(a,0))}async function Qe(a,f){if(s.textureLighting==="dynamic"&&!a.stableDom)return Ae(a),!f();T(a);let E=l.createDocumentFragment(),W=V(a),B=0;for(let F of R(a)){if(f())return!1;be(a,F),E.appendChild(F.element),B++,B%Fl===0&&($(a,E,W),E=l.createDocumentFragment(),await Ue())}return E.childNodes.length>0&&$(a,E,W),re(a),!f()}function lt(a,f){let S=s.textureLighting==="dynamic",E=s.directionalLight?.direction,W=f&&(f[0]!==0||f[1]!==0||f[2]!==0);if(!S||!W||!E){if(a.lightOverrideSignature==="clear")return;a.wrapper.style.removeProperty("--plx"),a.wrapper.style.removeProperty("--ply"),a.wrapper.style.removeProperty("--plz"),a.lightOverrideSignature="clear";return}let B=To(E,f),F=Rt(B),G=Math.hypot(F[0],F[1],F[2])||1,Y=(F[0]/G).toFixed(2),ae=(F[1]/G).toFixed(2),ne=(F[2]/G).toFixed(2),K=`${Y}|${ae}|${ne}`;a.lightOverrideSignature!==K&&(a.wrapper.style.setProperty("--plx",Y),a.wrapper.style.setProperty("--ply",ae),a.wrapper.style.setProperty("--plz",ne),a.lightOverrideSignature=K)}function bt(a){let f=!1;for(let S of a.rendered){if(!S.plan||S.kind==="atlas"||S.plan.texture)continue;let E=a.polygons[S.polygonIndex];E&&(f=Po(S,E,s)||f)}return a.solidLightingPreviewPrepared=!1,a.solidLightingPreviewActive=!1,f}function ct(a){if((s.textureLighting??"baked")!=="baked")return!1;let f=!1;for(let S of a.rendered){if(!S.plan||S.kind==="atlas"||S.plan.texture)continue;let E=a.polygons[S.polygonIndex];E&&(ys(S,E,S.plan.shadedColor),f=!0)}return a.solidLightingPreviewPrepared=f,f}function On(a){return(s.textureLighting??"baked")!=="baked"||!a.solidLightingPreviewPrepared&&!ct(a)?!1:(a.solidLightingPreviewActive=!0,!0)}function Dn(a){return a.kind==="atlas"||!!a.plan?.texture}function In(){if((s.textureLighting??"baked")!=="baked")return!1;let a=!1;for(let f of h)a=bt(f)||a,f.rendered.some(Dn)&&(Nt(f),a=!0);d.style.removeProperty(kt);for(let f of h)mt(f.wrapper),f.solidLightingPreviewActive=!1;return mt(d),a}function Hn(){d.style.removeProperty(kt);for(let a of h)a.solidLightingPreviewActive&&(bt(a),mt(a.wrapper));(s.textureLighting??"baked")!=="dynamic"&&(mt(d),k(),Ee())}function U(a,f){let S=a.handle.transform.rotation,E=f.directionalLight?.direction??s.directionalLight?.direction;if(!(S&&(S[0]!==0||S[1]!==0||S[2]!==0))||!E){mt(a.wrapper);return}let B=To(E,S);xn(a.wrapper,{...s,...f,directionalLight:{...s.directionalLight,...f.directionalLight,direction:B}})}function se(a){if((s.textureLighting??"baked")!=="baked")return!1;xn(d,{...s,...a}),!a.skipShadows&&a.directionalLight?.direction&&Ee(a.directionalLight.direction);let f=!1;for(let S of h)U(S,a),f=On(S)||f;return f?ue(d,kt,"1"):d.style.removeProperty(kt),f}function ie(a,f,S){let E=a.polygons[f];if(!E)return!1;let W=p(a,f);if(!W)return!1;let B=s.textureLighting??"baked";return B==="dynamic"?(gs(W.element,S),!0):B==="baked"?Po(W,E,s):!1}function we(a,f){let S=a.polygons[f];if(!S)return!1;let E=p(a,f);return E?(ye(E.element,S,f),!0):!1}function zt(a,f,S){return!(S.length===0||!S.every(E=>E==="color"||E==="data")||S.includes("color")&&!ie(a,f,a.polygons[f]?.color)||S.includes("data")&&!we(a,f))}function Ge(a){k(),Ee()}function Ee(a){let f=[];for(let J of h)!J.disposed&&J.castShadow&&f.push(J);if(f.length===0){g(),C=null;return}let S=s.shadow?.color??"#000000",E=s.shadow?.opacity??.25,W=Hl(S)?.rgb??[0,0,0],B=W[0],F=W[1],G=W[2],Y=a??s.directionalLight?.direction??[.4,-.7,.59],ae=Rt(Y),ne=D(ae);if(ne!==null&&ne===C)return;let K=new Map;for(let J of f)K.set(J,Hs(J.polygons,{normalTolerance:.1,distanceTolerance:.5,overlapFraction:.95,preserveDoubleSidedBackfaces:!1}));let oe=new Map;for(let J of h)J.disposed||!J.receiveShadow||oe.set(J,new Set);P();for(let J of h)J.disposed||!J.receiveShadow||Ds(x,f,K,J,oe.get(J)??new Set,ae,B,F,G,E);C=ne}function ve(a){if(a.voxelRenderer){a.voxelRenderer.render(L(a)),a.cameraCullSignature="voxel-direct";return}A(a),Ae(a),Ge(a)}function Oe(a,f){if(!f||!a.polygons||a.polygons.length<2)return;let S=Math.hypot(f[0],f[1],f[2]);if(!Number.isFinite(S)||S<=0)return;let E=f[0]/S,W=f[1]/S,B=f[2]/S,F=K=>Math.round(K*1e3)/1e3,G=`${F(E)},${F(W)},${F(B)}`,Y=a.lightOcclusionCache;if(Y&&Y.polygons===a.polygons&&Y.lightDirKey===G)return Y.occluded;let ae=Y&&Y.polygons===a.polygons?Y.dedupDropped:Hs(a.polygons,{normalTolerance:.1,distanceTolerance:.12,overlapFraction:.98,preserveDoubleSidedBackfaces:!1}),ne=Rl(a.polygons,[E,W,B],ae);return a.lightOcclusionCache={polygons:a.polygons,lightDirKey:G,occluded:ne,dedupDropped:ae},ne}function De(a){return!!a.voxelSource&&s.textureLighting!=="dynamic"&&!a.stableDom&&!a.castShadow}function Se(a,f){H(a);let S=s.directionalLight,E=f?{...S,direction:f}:S,W=at(E),B=void 0;if(De(a)){let Y=rs({doc:l,wrapper:a.wrapper,polygons:a.parseResult.polygons,directionalLight:W,ambientLight:s.ambientLight});if(Y){a.voxelRenderer=Y,Y.render(L(a)),a.cameraCullSignature="voxel-direct";return}}let F={doc:l,directionalLight:W,ambientLight:s.ambientLight,textureLighting:s.textureLighting,textureQuality:s.textureQuality,seamBleed:s.seamBleed,strategies:s.strategies,lightOccludedPolyIndices:B},G=a.stableDom?(()=>{let Y=dt(a.polygons,F);return ft(a.wrapper,Y),_t(a.polygons,{...F,solidPaintDefaults:Y})??pt(a.polygons,{...F,solidPaintDefaults:Y})})():pt(a.polygons,{...F,computeSolidPaintDefaults:!0,skipDynamicNormalVars:s.textureLighting==="dynamic"});a.stableDom||ft(a.wrapper,G.solidPaintDefaults??{}),m(a,G.rendered,G.dispose),a.skipBucketNormalCleanupOnce=s.textureLighting==="dynamic"&&!a.stableDom,_(a),Ae(a),Ge(a)}function Nt(a,f){if(a.rendered.length===0||a.voxelRenderer||a.stableDom||De(a)){Se(a,f);return}if(a.rendered[0]?.element.parentNode===null){Se(a,f);return}let S=s.directionalLight,E=f?{...S,direction:f}:S,W=at(E),B={doc:l,directionalLight:W,ambientLight:s.ambientLight,textureLighting:s.textureLighting,textureQuality:s.textureQuality,seamBleed:s.seamBleed,strategies:s.strategies,computeSolidPaintDefaults:!0,skipDynamicNormalVars:s.textureLighting==="dynamic"},F=pt(a.polygons,B),G=()=>{a.rebakeInFlight=!1;let ne=a.rebakeQueuedLightDir;ne!==null&&(a.rebakeQueuedLightDir=null,Nt(a,ne))},Y=()=>{if(a.disposed){F.dispose(),G();return}if(F.rendered.length!==a.rendered.length){F.dispose(),Se(a,f),G();return}for(let oe of F.rendered){let J=a.renderedByPolygonIndex[oe.polygonIndex];if(!J)continue;let Ie=oe.element.getAttribute("style");Ie!==null&&J.element.setAttribute("style",Ie)}let ne=F.solidPaintDefaults;ne&&ft(a.wrapper,ne);let K=a.disposeAtlas;a.disposeAtlas=F.dispose,K&&(typeof requestAnimationFrame=="function"?J=>{requestAnimationFrame(J)}:J=>{setTimeout(J,0)})(K),Ge(a),G()},ae=F.pagesReady;ae&&typeof ae.then=="function"?ae.then(()=>Vn(F.rendered)).then(Bn).then(Y,()=>{F.dispose(),a.disposed||Se(a,f),G()}):Y()}function Fn(a,f){if(a.rebakeInFlight){a.rebakeQueuedLightDir=f;return}a.rebakeInFlight=!0,Nt(a,f)}function Vn(a){let f=new Set;for(let S of a){let E=S.element.getAttribute("style")??"",W=/url\((blob:[^)]+)\)/g,B;for(;(B=W.exec(E))!==null;)f.add(B[1])}return Array.from(f)}function Bn(a){return a.length===0||typeof Image>"u"?Promise.resolve():Promise.all(a.map(f=>{let S=new Image;S.src=f;let E=S.decode?.();return E?E.catch(()=>{}):Promise.resolve()})).then(()=>{})}function Ke(){let a=1/0,f=!1;for(let B of h)if(!B.disposed&&B.receiveShadow){f=!0;break}for(let B of h){if(B.disposed||!(f?B.receiveShadow:B.castShadow))continue;let G=B.handle.transform.position?.[2]??0;for(let Y of B.polygons)for(let ae of Y.vertices){let ne=ae[2]+G;ne<a&&(a=ne)}}if(!Number.isFinite(a)){let B=v.currentGroundCssZ!==null;v.currentGroundCssZ=null,B&&(g(),k());return}let S=s.shadow?.lift??.05,E=(a+S)*Ne,W=v.currentGroundCssZ;v.currentGroundCssZ=E,W!==E&&(k(),Ee())}async function cn(a,f){H(a);let S=at(s.directionalLight),E={doc:l,directionalLight:S,ambientLight:s.ambientLight,textureLighting:s.textureLighting,textureQuality:s.textureQuality,seamBleed:s.seamBleed,strategies:s.strategies,lightOccludedPolyIndices:void 0},W=a.stableDom?_t(a.polygons,E):null;if(W){let G=dt(a.polygons,E);return ft(a.wrapper,G),m(a,W.rendered,W.dispose),_(a),Ae(a),Ge(a),!f()}let B=await Kt(a.polygons,{...E,skipDynamicNormalVars:s.textureLighting==="dynamic"},f);if(f())return B.dispose(),!1;ft(a.wrapper,B.solidPaintDefaults),m(a,B.rendered,B.dispose),a.skipBucketNormalCleanupOnce=s.textureLighting==="dynamic"&&!a.stableDom,_(a);let F=await Qe(a,f);return F&&Ge(a),F}function ut(){let a=c,f=[0,0,0];if(s.autoCenter){let S=[];for(let E of h)!E.disposed&&!E.excludeFromAutoCenter&&S.push(...E.polygons);if(S.length>0){let E=_l(S);f=[(E.min[0]+E.max[0])/2,(E.min[1]+E.max[1])/2,(E.min[2]+E.max[2])/2]}}a[0]===f[0]&&a[1]===f[1]&&a[2]===f[2]||(c=f,x.autoCenter.offset=f,Q(d,s))}function di(a,f={}){let E=(d.ownerDocument??document).createElement("div");E.className="polycss-mesh",f.id&&E.setAttribute("data-poly-mesh-id",f.id);let W=`polycss-mesh-${x.meshAutoCounter.next++}`;E.setAttribute("data-poly-mesh-index",W);let B={...f},F=f.merge!==!1,G=!!f.stableDom,Y=0,ae=vn(B);ae&&(E.style.transform=ae);let ne=(N,X)=>a.voxelSource?N:X?Il(N,{meshResolution:f.meshResolution}):(G||f.excludeFromAutoCenter,N),K=ne(a.polygons,F),oe=null;function J(){let N=vn(B);E.style.transform=N??""}function Ie(N){if(N.length===0){oe=null,je&&(je.bboxCenterCss=null),J();return}let X=1/0,le=1/0,me=1/0,Me=-1/0,ce=-1/0,ge=-1/0;for(let Xe of N)for(let Fe of Xe.vertices)Fe[0]<X&&(X=Fe[0]),Fe[0]>Me&&(Me=Fe[0]),Fe[1]<le&&(le=Fe[1]),Fe[1]>ce&&(ce=Fe[1]),Fe[2]<me&&(me=Fe[2]),Fe[2]>ge&&(ge=Fe[2]);if(!Number.isFinite(X)){oe=null,je&&(je.bboxCenterCss=null),J();return}let He=(le+ce)/2*Ne,Ye=(X+Me)/2*Ne,Le=(me+ge)/2*Ne;oe=[He,Ye,Le],je&&(je.bboxCenterCss=oe),J()}let je=null;Ie(K),d.appendChild(E);let w={handle:void 0,wrapper:E,parseResult:a,rendered:[],renderedByPolygonIndex:[],shadowRendered:[],polygons:K,voxelSource:a.voxelSource,disposed:!1,stableDom:G,hasBuckets:!1,skipBucketNormalCleanupOnce:!1,excludeFromAutoCenter:!!f.excludeFromAutoCenter,castShadow:!!f.castShadow,bboxCenterCss:oe,receiveShadow:!!f.receiveShadow,cameraCullGroups:[],cameraCullSignature:"",lightOverrideSignature:"clear",stableTriangleColorFrame:0,solidLightingPreviewPrepared:!1,solidLightingPreviewActive:!1,bakedRotation:f.rotation?[...f.rotation]:[0,0,0],autoMeshId:W,rebakeInFlight:!1,rebakeQueuedLightDir:null},We=null,zn=0,un=-1,$t=null;function Ut(){We=null,$t=null,un=-1}function dr(){let N=We;if(!N||N.polygonCount!==w.polygons.length)return w.polygons;if($t&&un===zn)return $t;let X=N.vertices,le=new Array(N.polygonCount);for(let me=0;me<N.polygonCount;me++){let Me=w.polygons[me],ce=me*9;le[me]={...Me,color:N.colors?.[me]??Me.color,vertices:[[X[ce],X[ce+1],X[ce+2]],[X[ce+3],X[ce+4],X[ce+5]],[X[ce+6],X[ce+7],X[ce+8]]]}}return $t=le,un=zn,le}function pr(N,X){let le=N?.stableTriangleUpdateMode==="color-only";w.stableTriangleColorFrame++;let me=w.stableDom&&!X;if(me||Ie(w.polygons),w.stableDom&&!w.hasBuckets){let Me={doc:l,directionalLight:at(s.directionalLight),ambientLight:s.ambientLight,textureLighting:s.textureLighting,textureQuality:s.textureQuality,seamBleed:s.seamBleed},ce=w.rendered.length===w.polygons.length&&w.rendered.every(Le=>Le.kind==="triangle"),ge=w.stableDom&&!X,He=ce||ge?{}:dt(w.polygons,Me);ce||ft(w.wrapper,He);let Ye={...Me,solidPaintDefaults:He,optimizeStableTriangleStyle:!0,stableTriangleDebug:N?.stableTriangleDebug,stableTriangleUpdateMode:N?.stableTriangleUpdateMode,stableTriangleColorPolicy:N?.stableTriangleColorPolicy,stableTriangleColorSteps:N?.stableTriangleColorSteps,stableTriangleColorFreezeFrames:N?.stableTriangleColorFreezeFrames,stableTriangleColorBudget:N?.stableTriangleColorBudget,stableTriangleColorMaxAge:N?.stableTriangleColorMaxAge,stableTriangleColorMaxStep:N?.stableTriangleColorMaxStep,stableTriangleMatrixDecimals:N?.stableTriangleMatrixDecimals,stableTriangleColorFrame:w.stableTriangleColorFrame};if(en(w.rendered,w.polygons,Ye))return le||(_(w),de(w,!0),X&&ut()),!0}return me&&Ie(w.polygons),!1}let vt={get polygons(){return dr()},set polygons(N){Ut(),w.polygons=N},element:E,id:f.id,get transform(){return B},remove(){Y++,E.parentNode&&E.parentNode.removeChild(E),H(w),h.delete(w),b.delete(E),z(w),I(w),ut(),Ke()},setPolygons(N,X){Y++,F=X?.merge??F,G=X?.stableDom??G,w.stableDom=G,w.voxelSource=void 0,w.polygons=ne(N,F),I(w),z(w),Ut(),vt.polygons=w.polygons;let le=X?.recomputeAutoCenter??!0;pr(X,le)||(Se(w),le&&ut())},[Is](N,X){let le=X?.merge??F,me=X?.stableDom??G;if(!N.solidTriangles||!me||le||f.meshResolution!==void 0||w.hasBuckets||N.polygonCount!==w.polygons.length||N.vertices.length<N.polygonCount*9||w.rendered.length!==N.polygonCount)return!1;for(let ge=0;ge<w.rendered.length;ge++){let He=w.rendered[ge],Ye=w.polygons[ge];if(He?.kind!=="triangle"||He.polygonIndex!==ge||!Ye||Ye.vertices.length!==3||Ye.texture||Ye.material?.texture)return!1}let Me=X?.recomputeAutoCenter??!0;if(!Me){let ge=w.stableTriangleColorFrame+1,He={doc:l,directionalLight:at(s.directionalLight),ambientLight:s.ambientLight,textureLighting:s.textureLighting,textureQuality:s.textureQuality,seamBleed:s.seamBleed,solidPaintDefaults:{},optimizeStableTriangleStyle:!0,stableTriangleDebug:X?.stableTriangleDebug,stableTriangleUpdateMode:X?.stableTriangleUpdateMode,stableTriangleColorPolicy:X?.stableTriangleColorPolicy,stableTriangleColorSteps:X?.stableTriangleColorSteps,stableTriangleColorFreezeFrames:X?.stableTriangleColorFreezeFrames??0,stableTriangleColorBudget:X?.stableTriangleColorBudget,stableTriangleColorMaxAge:X?.stableTriangleColorMaxAge,stableTriangleColorMaxStep:X?.stableTriangleColorMaxStep,stableTriangleMatrixDecimals:X?.stableTriangleMatrixDecimals,stableTriangleColorFrame:ge};if(Jt(w.rendered,w.polygons,N,He))return Y++,F=le,G=me,w.stableDom=G,w.voxelSource=void 0,w.stableTriangleColorFrame=ge,We=N,zn++,$t=null,un=-1,q(w)?(_(w),de(w,!0)):re(w),!0}Y++,F=le,G=me,w.stableDom=G,w.voxelSource=void 0;let ce=N.vertices;for(let ge=0;ge<N.polygonCount;ge++){let He=w.polygons[ge],Ye=N.colors?.[ge];Ye&&(He.color=Ye);let Le=He.vertices,Xe=ge*9;Le[0][0]=ce[Xe],Le[0][1]=ce[Xe+1],Le[0][2]=ce[Xe+2],Le[1][0]=ce[Xe+3],Le[1][1]=ce[Xe+4],Le[1][2]=ce[Xe+5],Le[2][0]=ce[Xe+6],Le[2][1]=ce[Xe+7],Le[2][2]=ce[Xe+8]}return Ut(),vt.polygons=w.polygons,pr(X,Me)},updatePolygon(N,X){let le=typeof N=="number"?N:w.polygons.indexOf(N);if(le<0&&typeof N!="number"&&We&&(le=dr().indexOf(N)),le<0||le>=w.polygons.length)return;Ut(),w.voxelSource=void 0,Object.assign(w.polygons[le],X);let me=Object.keys(X);zt(w,le,me)||Se(w)},async setPolygonsChunked(N,X){let le=++Y;F=X?.merge??F,G=X?.stableDom??G,w.stableDom=G,w.voxelSource=void 0,w.polygons=ne(N,F),Ut(),vt.polygons=w.polygons,Ie(w.polygons);let me=X?.recomputeAutoCenter??!0;if(!await cn(w,()=>w.disposed||le!==Y)){H(w);return}me&&ut()},setTransform(N){let X=w.castShadow,le=w.receiveShadow;N.castShadow!==void 0&&(w.castShadow=!!N.castShadow),N.receiveShadow!==void 0&&(w.receiveShadow=!!N.receiveShadow),B={...B,...N};let me=vn(B);E.style.transform=me??"",lt(w,B.rotation),N.rotation!==void 0&&de(w,!0),w.castShadow!==X&&(w.voxelSource&&Se(w),Ge(w),Ke()),w.receiveShadow!==le&&(w.receiveShadow||Co(w),k(),Ee()),(N.position!==void 0||N.scale!==void 0)&&(w.castShadow||w.receiveShadow)&&(Ke(),k(),Ee())},dispose(){if(!w.disposed){w.disposed=!0,Y++,E.parentNode&&E.parentNode.removeChild(E),H(w);try{a.dispose()}catch{}h.delete(w),b.delete(E),ut(),Ke()}},rebakeAtlas(){w.bakedRotation=B.rotation?[...B.rotation]:[0,0,0];let N=s.directionalLight?.direction??[.4,-.7,.59],X=To(N,w.bakedRotation);Fn(w,X)},getPosition(){return B.position},getRotation(){return B.rotation},getScale(){return B.scale},getPolygons(){return vt.polygons}};return w.handle=vt,je=w,b.set(E,w),h.add(w),Se(w),lt(w,B.rotation),ut(),Ke(),w.receiveShadow&&(k(),Ee()),vt}function pi(a){let f=!!s.autoCenter,S=s.strategies,E=s.seamBleed,W=s.textureLighting,B=s.directionalLight?.direction,F=s.shadow,G=Vs(a);s={...s,...G},x.options.current=s,Q(d,s);let Y=!!s.autoCenter;for(let We of h)lt(We,We.handle.transform.rotation);let ae=a.strategies!==void 0&&!cs(a.strategies,S),ne=Object.prototype.hasOwnProperty.call(a,"seamBleed")&&G.seamBleed!==E;if(ae||ne)for(let We of h)Se(We);f!==Y&&ut();let K=a.textureLighting!==void 0&&W!==s.textureLighting,oe=s.directionalLight?.direction,J=a.directionalLight!==void 0&&!us(B,oe),Ie=s.shadow,je=a.shadow!==void 0&&!ds(F,Ie),w=J||je;if(K){if(!ae&&!ne)for(let We of h)Se(We);Ke(),k(),Ee()}else w&&(je&&k(),Ee());je&&a.shadow?.lift!==F?.lift&&Ke()}function mi(){return s}function fi(){O(d);for(let a of h)de(a)}function hi(){let a=[];for(let f of h)a.push(f.handle);return a}function gi(a){let f=a;for(;f;){if(f instanceof HTMLElement){let S=b.get(f);if(S&&!S.disposed)return S.handle;if(f.classList.contains("polycss-mesh"))return null}f=f.parentElement}return null}function yi(){let a=Array.from(h);for(let f of a)try{f.handle.dispose()}catch{}u.parentNode&&u.parentNode.removeChild(u)}return{add:di,setOptions:pi,destroy:yi,host:e,camera:t,cameraEl:u,applyCamera:fi,getOptions:mi,meshes:hi,findMeshByElement:gi,previewBakedSolidLighting:se,commitBakedSolidLighting:In,clearBakedSolidLightingPreview:Hn}}import{createIsometricCamera as Ns}from"@layoutit/polycss-core";var Bl=32e3;function Ot(e={}){let n={};e.zoom!==void 0&&(n.zoom=e.zoom),e.target!==void 0&&(n.target=e.target),e.rotX!==void 0&&(n.rotX=e.rotX),e.rotY!==void 0&&(n.rotY=e.rotY),e.distance!==void 0&&(n.distance=e.distance);let t=Ns(n),o=`${e.perspective??Bl}px`;return{get state(){return t.state},update(r){t.update(r)},getStyle(r){return t.getStyle(r)},type:"perspective",perspectiveStyle:o}}function ht(e={}){let n={};e.zoom!==void 0&&(n.zoom=e.zoom),e.target!==void 0&&(n.target=e.target),e.rotX!==void 0&&(n.rotX=e.rotX),e.rotY!==void 0&&(n.rotY=e.rotY),e.distance!==void 0&&(n.distance=e.distance);let t=Ns(n);return{get state(){return t.state},update(o){t.update(o)},getStyle(o){return t.getStyle(o)},type:"orthographic",perspectiveStyle:"none"}}var zl=ht;import{BASE_TILE as Nl}from"@layoutit/polycss-core";var Cn={drag:!0,wheel:!0,dolly:!1,invert:!1,minZoom:.1,maxZoom:10,minDistance:0,maxDistance:1/0,animate:!1};function Dt(e,n){let t;return n.animate===!1?t=!1:n.animate?t={speed:n.animate.speed??.3,axis:n.animate.axis??"y",pauseOnInteraction:n.animate.pauseOnInteraction??!0}:t=e.animate,{drag:n.drag??e.drag,wheel:n.wheel??e.wheel,dolly:n.dolly??e.dolly,invert:n.invert??e.invert,minZoom:n.minZoom??e.minZoom,maxZoom:n.maxZoom??e.maxZoom,minDistance:n.minDistance??e.minDistance,maxDistance:n.maxDistance??e.maxDistance,animate:t}}function tn(e){return e===!0?-1:e===!1?1:e}function It(){let e=[],n=[],t=[];function o(i){return i==="change"?e:i==="start"?n:t}function r(i){if(e.length===0)return;let c={type:"change",camera:i()},l=e.slice();for(let u of l)try{u(c)}catch(d){console.error("[polycss] controls 'change' listener threw:",d)}}function s(i,c){let l=i==="start"?n:t;if(l.length===0)return;let u={type:i,camera:c()},d=l.slice();for(let x of d)try{x(u)}catch(h){console.error(`[polycss] controls '${i}' listener threw:`,h)}}return{changeListeners:e,startListeners:n,endListeners:t,listenerArray:o,emitChange:r,emitInteraction:s}}function Ht(e){return()=>{let n=e.camera.state,t=n.target??[0,0,0];return{rotX:n.rotX??0,rotY:n.rotY??0,zoom:n.zoom??1,target:[t[0],t[1],t[2]],distance:n.distance??0}}}function En(e,n,t,o,r,s){let i=!1,c=null;return{onWheel:d=>{let x=n();if(!x.wheel||t())return;d.preventDefault();let h=d.deltaMode===1?16:d.deltaMode===2?100:1,b=d.deltaY*h;d.ctrlKey?b*=10:b*=3;let v=e.camera.state;if(x.dolly){let P=v.distance??0,g=Math.max(x.minDistance,Math.min(x.maxDistance,P+b*.05));e.camera.update({distance:g})}else{let P=Math.exp(-b*513e-6),g=v.zoom??1,C=Math.max(x.minZoom,Math.min(x.maxZoom,g*P));e.camera.update({zoom:C})}e.applyCamera(),i||(i=!0,s("start",o)),r(o),c!==null&&clearTimeout(c),c=setTimeout(()=>{c=null,i=!1,s("end",o)},150)},teardown:()=>{c!==null&&(clearTimeout(c),c=null),i=!1}}}function Tn(e,n,t,o,r,s,i){let c=null,l=0,u=b=>{if(c===null||o())return;let v=t();if(!v.animate){c=null;return}if(r())l=b;else{let P=Math.min(50,l?b-l:16.67);l=b;let g=v.animate.speed*(P/16.67),C=n.camera.state;if(v.animate.axis==="x"){let D=(((C.rotX??65)+g)%360+360)%360;n.camera.update({rotX:D})}else{let D=(((C.rotY??45)+g)%360+360)%360;n.camera.update({rotY:D})}n.applyCamera(),i(s)}c=e.requestAnimationFrame(u)};return{start:()=>{c!==null||!t().animate||o()||(l=0,c=e.requestAnimationFrame(u))},stop:()=>{c!==null&&(e.cancelAnimationFrame(c),c=null)},isRunning:()=>c!==null}}function wo(e,n={}){let t=Dt(Cn,n),o=e.host,r=o.ownerDocument?.defaultView??globalThis,s=null,i={x:0,y:0},c=!1,l=!1,u=It(),d=Ht(e),{changeListeners:x,startListeners:h,endListeners:b,listenerArray:v,emitChange:P,emitInteraction:g}=u,C=Tn(r,e,()=>t,()=>l,()=>c,d,P),D=p=>{if(!(!t.drag||l)&&s===null&&p.isPrimary!==!1){p.preventDefault(),s=p.pointerId,i={x:p.clientX,y:p.clientY},o.style.cursor="grabbing";try{p.target.setPointerCapture(p.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(c=!0),g("start",d)}},k=p=>{if(s===null||p.pointerId!==s||!t.drag||l)return;p.preventDefault();let T=p.clientX-i.x,M=p.clientY-i.y;i={x:p.clientX,y:p.clientY};let R=tn(t.invert),L=T/4*R,te=M/4*R,_=e.camera.state;if(p.shiftKey){let j=_.rotX??65,q=_.rotY??45,re=Math.max(.01,_.zoom??1),fe=Math.cos(j*Math.PI/180),de=fe>=0?Math.max(.1,fe):Math.min(-.1,fe),pe=Math.cos(q*Math.PI/180),Ce=Math.sin(q*Math.PI/180),be=re*Nl,Ae=(T*Ce-M*pe/de)/be,Ue=-(T*pe+M*Ce/de)/be,Qe=_.target??[0,0,0];e.camera.update({target:[Qe[0]+Ae,Qe[1]+Ue,Qe[2]]})}else{let j=Math.max(0,Math.min(89,(_.rotX??65)-te)),q=(((_.rotY??45)-L)%360+360)%360;e.camera.update({rotX:j,rotY:q})}e.applyCamera(),P(d)},z=p=>{if(s===p.pointerId){s=null,o.style.cursor=t.drag&&!l?"grab":"";try{p.target.releasePointerCapture(p.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(c=!1),g("end",d)}},I=En(e,()=>t,()=>l,d,P,g);function Z(){o.addEventListener("pointerdown",D),o.addEventListener("pointermove",k),o.addEventListener("pointerup",z),o.addEventListener("pointercancel",z),o.addEventListener("wheel",I.onWheel,{passive:!1}),o.style.cursor=t.drag?"grab":"",o.style.touchAction="none",o.style.userSelect="none"}function Q(){o.removeEventListener("pointerdown",D),o.removeEventListener("pointermove",k),o.removeEventListener("pointerup",z),o.removeEventListener("pointercancel",z),o.removeEventListener("wheel",I.onWheel),o.style.cursor="",o.style.touchAction="",o.style.userSelect="",I.teardown()}Z(),C.start();function O(p){let T=!!t.animate;t=Dt(t,p),!l&&s===null&&(o.style.cursor=t.drag?"grab":"");let M=!!t.animate;T&&!M?C.stop():!T&&M&&C.start()}function H(){l&&(l=!1,Z(),C.start())}function V(){l||(l=!0,Q(),C.stop(),s=null,c=!1,I.teardown())}function $(){V(),x.length=0,h.length=0,b.length=0}function A(p,T){let M=v(p);M.includes(T)||M.push(T)}function y(p,T){let M=v(p),R=M.indexOf(T);R>=0&&M.splice(R,1)}function m(p,T){return v(p).includes(T)}return{update:O,resume:H,pause:V,destroy:$,addEventListener:A,removeEventListener:y,hasEventListener:m}}import{BASE_TILE as $l}from"@layoutit/polycss-core";function Mo(e,n={}){let t=Dt(Cn,n),o=e.host,r=o.ownerDocument?.defaultView??globalThis,s=null,i={x:0,y:0},c=!1,l=!1,u=!1,d={x:0,y:0},x=It(),h=Ht(e),{changeListeners:b,startListeners:v,endListeners:P,listenerArray:g,emitChange:C,emitInteraction:D}=x,k=Tn(r,e,()=>t,()=>l,()=>c,h,C),z=_=>{if(!(!t.drag||l)&&s===null&&_.isPrimary!==!1){_.preventDefault(),s=_.pointerId,i={x:_.clientX,y:_.clientY},o.style.cursor="grabbing";try{_.target.setPointerCapture(_.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(c=!0),D("start",h)}},I=_=>{if(s===null||_.pointerId!==s||!t.drag||l)return;_.preventDefault();let j=_.clientX-i.x,q=_.clientY-i.y;i={x:_.clientX,y:_.clientY};let re=e.camera.state;if(_.shiftKey){let fe=tn(t.invert),de=j/4*fe,pe=q/4*fe,Ce=(re.rotX??65)-pe,be=(((re.rotY??45)-de)%360+360)%360;e.camera.update({rotX:Ce,rotY:be})}else{let fe=re.rotX??65,de=re.rotY??45,pe=Math.max(.01,re.zoom??1),Ce=Math.cos(fe*Math.PI/180),be=Ce>=0?Math.max(.1,Ce):Math.min(-.1,Ce),Ae=Math.cos(de*Math.PI/180),Ue=Math.sin(de*Math.PI/180),Qe=pe*$l,lt=(j*Ue-q*Ae/be)/Qe,bt=-(j*Ae+q*Ue/be)/Qe,ct=re.target??[0,0,0];e.camera.update({target:[ct[0]+lt,ct[1]+bt,ct[2]]})}e.applyCamera(),C(h)},Z=_=>{if(s===_.pointerId){s=null,o.style.cursor=t.drag&&!l?"grab":"";try{_.target.releasePointerCapture(_.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(c=!1),D("end",h)}},Q=_=>{_.preventDefault()},O=_=>{_.button===2&&(u=!0,d={x:_.clientX,y:_.clientY},t.animate&&t.animate.pauseOnInteraction&&(c=!0),D("start",h))},H=_=>{if(!u||!t.drag)return;let j=_.clientX-d.x,q=_.clientY-d.y;d={x:_.clientX,y:_.clientY};let re=tn(t.invert),fe=j/4*re,de=q/4*re,pe=e.camera.state,Ce=(pe.rotX??65)-de,be=(((pe.rotY??45)-fe)%360+360)%360;e.camera.update({rotX:Ce,rotY:be}),e.applyCamera(),C(h)},V=_=>{_.button===2&&u&&(u=!1,D("end",h))},$=En(e,()=>t,()=>l,h,C,D);function A(){o.addEventListener("pointerdown",z),o.addEventListener("pointermove",I),o.addEventListener("pointerup",Z),o.addEventListener("pointercancel",Z),o.addEventListener("wheel",$.onWheel,{passive:!1}),o.addEventListener("contextmenu",Q),o.addEventListener("mousedown",O),o.addEventListener("mousemove",H),o.addEventListener("mouseup",V),o.style.cursor=t.drag?"grab":"",o.style.touchAction="none",o.style.userSelect="none"}function y(){o.removeEventListener("pointerdown",z),o.removeEventListener("pointermove",I),o.removeEventListener("pointerup",Z),o.removeEventListener("pointercancel",Z),o.removeEventListener("wheel",$.onWheel),o.removeEventListener("contextmenu",Q),o.removeEventListener("mousedown",O),o.removeEventListener("mousemove",H),o.removeEventListener("mouseup",V),o.style.cursor="",o.style.touchAction="",o.style.userSelect="",$.teardown()}A(),k.start();function m(_){let j=!!t.animate;t=Dt(t,_),!l&&s===null&&(o.style.cursor=t.drag?"grab":"");let q=!!t.animate;j&&!q?k.stop():!j&&q&&k.start()}function p(){l&&(l=!1,A(),k.start())}function T(){l||(l=!0,y(),k.stop(),s=null,c=!1,u=!1,$.teardown())}function M(){T(),b.length=0,v.length=0,P.length=0}function R(_,j){let q=g(_);q.includes(j)||q.push(j)}function L(_,j){let q=g(_),re=q.indexOf(j);re>=0&&q.splice(re,1)}function te(_,j){return g(_).includes(j)}return{update:m,resume:p,pause:T,destroy:M,addEventListener:R,removeEventListener:L,hasEventListener:te}}import{BASE_TILE as Ul}from"@layoutit/polycss-core";var Gl={enabled:!0,lookEnabled:!0,moveEnabled:!0,jumpEnabled:!0,crouchEnabled:!0,lookSensitivity:.15,invertY:!1,moveSpeed:5,jumpVelocity:7,gravity:18,eyeHeight:1.7,crouchHeight:1,groundZ:0,minPitch:5,maxPitch:175};function $s(e,n){return{enabled:n.enabled??e.enabled,lookEnabled:n.lookEnabled??e.lookEnabled,moveEnabled:n.moveEnabled??e.moveEnabled,jumpEnabled:n.jumpEnabled??e.jumpEnabled,crouchEnabled:n.crouchEnabled??e.crouchEnabled,lookSensitivity:n.lookSensitivity??e.lookSensitivity,invertY:n.invertY??e.invertY,moveSpeed:n.moveSpeed??e.moveSpeed,jumpVelocity:n.jumpVelocity??e.jumpVelocity,gravity:n.gravity??e.gravity,eyeHeight:n.eyeHeight??e.eyeHeight,crouchHeight:n.crouchHeight??e.crouchHeight,groundZ:n.groundZ??e.groundZ,minPitch:n.minPitch??e.minPitch,maxPitch:n.maxPitch??e.maxPitch}}var Us=new Set(["KeyW","ArrowUp"]),Gs=new Set(["KeyS","ArrowDown"]),js=new Set(["KeyA","ArrowLeft"]),Ws=new Set(["KeyD","ArrowRight"]),Ys=new Set(["Space"]),Lo=new Set(["ControlLeft","ControlRight"]);function _o(e,n={}){let t=$s(Gl,n),o=e.host,r=e.cameraEl,s=o.ownerDocument??document,i=s.defaultView??globalThis,c=It(),l=Ht(e),{changeListeners:u,startListeners:d,endListeners:x,listenerArray:h,emitChange:b,emitInteraction:v}=c,P=new Set,g=!1,C=!1,D=0,k=0,z=!1,I=[0,0,t.groundZ+t.eyeHeight];function Z(U,se){let ie=U*Math.PI/180,we=se*Math.PI/180;return[-Math.sin(ie)*Math.cos(we),-Math.sin(ie)*Math.sin(we),-Math.cos(ie)]}function Q(){let U=e.camera.perspectiveStyle,se=U==="none"?0:parseFloat(U);return(Number.isFinite(se)&&se>0?se:2e3)/Ul}function O(){let U=e.camera.state,se=Z(U.rotX??90,U.rotY??0),ie=Q();return[I[0]+se[0]*ie,I[1]+se[1]*ie,I[2]+se[2]*ie]}function H(){let U=O();e.camera.update({target:U}),e.applyCamera()}function V(){let U=e.camera.state.target??[0,0,0];I=[U[0],U[1],t.groundZ+t.eyeHeight],H()}let $=()=>{if(!(!t.enabled||!t.lookEnabled||C||g))try{o.requestPointerLock()}catch{}},A=()=>{let U=s.pointerLockElement===o;U!==g&&(g=U,g?(z=!0,v("start",l)):z&&(z=!1,v("end",l)))},y=U=>{if(!g||!t.enabled||!t.lookEnabled||C)return;let se=U.movementX??0,ie=U.movementY??0;if(se===0&&ie===0)return;let we=e.camera.state,zt=t.lookSensitivity,Ge=t.invertY?-1:1,Ee=(((we.rotY??0)-se*zt)%360+360)%360,ve=(we.rotX??90)-ie*zt*Ge;ve<t.minPitch?ve=t.minPitch:ve>t.maxPitch&&(ve=t.maxPitch);let Oe=Z(ve,Ee),De=Q(),Se=[I[0]+Oe[0]*De,I[1]+Oe[1]*De,I[2]+Oe[2]*De];e.camera.update({rotX:ve,rotY:Ee,target:Se}),e.applyCamera(),b(l)},m=U=>Us.has(U)||Gs.has(U)||js.has(U)||Ws.has(U)||Ys.has(U)||Lo.has(U),p=U=>{if(!(!t.enabled||C)&&m(U.code)&&!(!g&&!t.moveEnabled)){if(Ys.has(U.code)){if(!t.jumpEnabled)return;U.preventDefault(),!P.has(U.code)&&D===0&&k===0&&(D=t.jumpVelocity),P.add(U.code);return}Lo.has(U.code)&&!t.crouchEnabled||!t.moveEnabled&&!Lo.has(U.code)||(U.preventDefault(),P.add(U.code))}},T=U=>{m(U.code)&&P.delete(U.code)},M=()=>{P.clear()},R=null,L=0,te=.05,_=U=>{if(R===null||C)return;let se=Math.min(te,L?(U-L)/1e3:.0167);if(L=U,t.enabled){let ie=!1,we=e.camera.state;if(t.moveEnabled){let ve=0,Oe=0;for(let De of P)Us.has(De)?ve+=1:Gs.has(De)?ve-=1:Ws.has(De)?Oe+=1:js.has(De)&&(Oe-=1);if(ve!==0||Oe!==0){let Se=(we.rotY??0)*Math.PI/180,Nt=-Math.cos(Se),Fn=-Math.sin(Se),Vn=-Math.sin(Se),Bn=Math.cos(Se),Ke=Math.hypot(ve,Oe)||1,cn=t.moveSpeed*se;I[0]+=(Nt*ve+Vn*Oe)/Ke*cn,I[1]+=(Fn*ve+Bn*Oe)/Ke*cn,ie=!0}}let Ge=t.crouchEnabled&&(P.has("ControlLeft")||P.has("ControlRight"))?t.crouchHeight:t.eyeHeight;t.jumpEnabled&&(D!==0||k>0)?(D-=t.gravity*se,k+=D*se,k<=0&&(k=0,D=0)):t.jumpEnabled||(k=0,D=0);let Ee=t.groundZ+Ge+k;if(Math.abs(I[2]-Ee)>1e-4&&(I[2]=Ee,ie=!0),ie){let ve=O();e.camera.update({target:ve}),e.applyCamera(),b(l)}}R=i.requestAnimationFrame(_)};function j(){R!==null||C||(L=0,R=i.requestAnimationFrame(_))}function q(){R!==null&&(i.cancelAnimationFrame(R),R=null)}function re(){let se=r.ownerDocument?.defaultView?.getComputedStyle(r).perspective??"",ie=parseFloat(se),we=Number.isFinite(ie)&&ie>0?ie:2e3;r.style.setProperty("--polycss-fpv-perspective",`${we}px`),r.classList.add("polycss-fpv-host")}function fe(){r.classList.remove("polycss-fpv-host"),r.style.removeProperty("--polycss-fpv-perspective")}function de(){o.addEventListener("click",$),s.addEventListener("pointerlockchange",A),s.addEventListener("mousemove",y),i.addEventListener("keydown",p),i.addEventListener("keyup",T),i.addEventListener("blur",M),o.style.cursor=t.lookEnabled?"crosshair":"",re()}function pe(){if(o.removeEventListener("click",$),s.removeEventListener("pointerlockchange",A),s.removeEventListener("mousemove",y),i.removeEventListener("keydown",p),i.removeEventListener("keyup",T),i.removeEventListener("blur",M),o.style.cursor="",P.clear(),g)try{s.exitPointerLock()}catch{}fe()}V(),de(),j();function Ce(U){let se=t.eyeHeight,ie=t.groundZ;t=$s(t,U),C||(o.style.cursor=t.lookEnabled?"crosshair":""),(t.eyeHeight!==se||t.groundZ!==ie)&&(I[2]=t.groundZ+t.eyeHeight,H(),b(l))}function be(){C&&(C=!1,de(),j())}function Ae(){C||(C=!0,pe(),q(),z&&(z=!1,v("end",l)))}function Ue(){Ae(),u.length=0,d.length=0,x.length=0}function Qe(){if(!(!t.enabled||!t.lookEnabled||C))try{o.requestPointerLock()}catch{}}function lt(){if(g)try{s.exitPointerLock()}catch{}}function bt(){return g}function ct(U,se){let ie=h(U);ie.includes(se)||ie.push(se)}function On(U,se){let ie=h(U),we=ie.indexOf(se);we>=0&&ie.splice(we,1)}function Dn(U,se){return h(U).includes(se)}function In(){return[I[0],I[1],I[2]]}function Hn(U){I[0]=U[0],I[1]=U[1],I[2]=U[2],H(),b(l)}return{update:Ce,resume:be,pause:Ae,destroy:Ue,lock:Qe,unlock:lt,isLocked:bt,getOrigin:In,setOrigin:Hn,addEventListener:ct,removeEventListener:On,hasEventListener:Dn}}function Ft(e,n,t){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let r of o){let s=r.getBoundingClientRect();if(!(s.width<=0||s.height<=0)&&n>=s.left&&n<=s.right&&t>=s.top&&t<=s.bottom)return!0}return!1}function Xs(e,n,t,o){for(let r of e)if(!(o&&!o(r))&&Ft(r.element,n,t))return r;return null}function Ro(e,n={}){let t=[],o=new Set;n.onChange&&o.add(n.onChange);function r(){t=n.filter?n.filter(t):t;for(let P of o)try{P(t)}catch(g){console.error("[polycss/createSelect] onChange threw:",g)}}function s(v){t=v,r()}function i(v){n.multiple?t.includes(v)||(t=[...t,v]):t=[v],r()}function c(v){t.includes(v)&&(t=t.filter(P=>P!==v),r())}function l(v){t.includes(v)?t=t.filter(P=>P!==v):n.multiple?t=[...t,v]:t=[v],r()}function u(){t.length!==0&&(t=[],r())}function d(v){return t.includes(v)}function x(v,P){return Xs(e.meshes(),v,P,g=>!g.element.classList.contains("polycss-transform-gizmo"))}let h=v=>{let P=v.target;if(P?.closest(".polycss-transform-gizmo"))return;let g=e.findMeshByElement(P)??x(v.clientX,v.clientY);if(!g){n.onPointerMissed&&n.onPointerMissed(v),n.clearOnMiss!==!1&&u();return}n.multiple&&(v.shiftKey||v.metaKey||v.ctrlKey)?l(g):t.length===1&&t[0]===g?u():s([g])};e.host.addEventListener("click",h);function b(){e.host.removeEventListener("click",h),o.clear()}return{get selected(){return t},set:s,add:i,remove:c,toggle:l,clear:u,has:d,destroy:b}}import{arrowPolygons as jl,eulerXYZFromQuat as Wl,planePolygons as Yl,quatFromAxisAngle as Xl,quatFromEulerXYZ as Zl,quatMultiply as ql,ringQuadPolygons as Ql,rotateVec3 as ko}from"@layoutit/polycss-core";var An="#ff3653",wn="#8adb00",Mn="#2c8fff",Vt=50,Zs=60,Kl=.6,Jl=.0125,ec=.15,tc=.04,nc=1,qs=.02,Oo=1.04,oc=.1,rc=.25,ei=1e-4,sc=.6,ic=.8,ac=1,tt={0:1,1:0,2:2},Qs=[{cssAxis:0,sign:1,key:"x",color:An},{cssAxis:0,sign:-1,key:"-x",color:An},{cssAxis:1,sign:1,key:"y",color:wn},{cssAxis:1,sign:-1,key:"-y",color:wn},{cssAxis:2,sign:1,key:"z",color:Mn},{cssAxis:2,sign:-1,key:"-z",color:Mn}],Ks=[{cssAxis:0,key:"x",color:An},{cssAxis:1,key:"y",color:wn},{cssAxis:2,key:"z",color:Mn}],Js=[{perpAxis:2,axisA:0,axisB:1,key:"xy",color:Mn},{perpAxis:1,axisA:0,axisB:2,key:"xz",color:wn},{perpAxis:0,axisA:1,axisB:2,key:"yz",color:An}];function Do(e,n,t,o){let r=t*Math.PI/180,s=o*Math.PI/180,i=[0,0,0];i[e]=n;let c=i[0]*Math.cos(s)-i[1]*Math.sin(s),l=i[0]*Math.sin(s)+i[1]*Math.cos(s),u=i[2];return l*Math.sin(r)+u*Math.cos(r)<0}function lc(e,n){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);if(!t)return e;let o=parseInt(t[1],16),r=parseInt(t[2],16),s=parseInt(t[3],16);return`rgba(${o}, ${r}, ${s}, ${n})`}function Ln(e,n){return!n||n<=0?e:Math.round(e/n)*n}function cc(e){if(e.length===0)return[0,0,0];let n=1/0,t=1/0,o=1/0,r=-1/0,s=-1/0,i=-1/0;for(let c of e)for(let l of c.vertices)l[0]<n&&(n=l[0]),l[0]>r&&(r=l[0]),l[1]<t&&(t=l[1]),l[1]>s&&(s=l[1]),l[2]<o&&(o=l[2]),l[2]>i&&(i=l[2]);return Number.isFinite(n)?[(n+r)/2,(t+s)/2,(o+i)/2]:[0,0,0]}function Io(e){if(e.length===0)return Zs;let n=1/0,t=1/0,o=1/0,r=-1/0,s=-1/0,i=-1/0;for(let l of e)for(let u of l.vertices)u[0]<n&&(n=u[0]),u[0]>r&&(r=u[0]),u[1]<t&&(t=u[1]),u[1]>s&&(s=u[1]),u[2]<o&&(o=u[2]),u[2]>i&&(i=u[2]);return Number.isFinite(n)?Math.max(r-n,s-t,i-o)*Vt*Kl:Zs}function uc(e){let{cssAxis:n,sign:t,shaftLengthCss:o,wrapper:r,target:s,startClientX:i,startClientY:c,translationSnap:l,onAxisDelta:u,onMouseDown:d,onMouseUp:x,onDraggingChanged:h}=e,b=o,v=[0,0,0];v[n]=t;let P=r.ownerDocument.createElement("div");P.style.position="absolute",P.style.left="0",P.style.top="0",P.style.width="0",P.style.height="0",P.style.transform=`translate3d(${v[0]*b}px, ${v[1]*b}px, ${v[2]*b}px)`,r.appendChild(P);let g=r.getBoundingClientRect(),C=P.getBoundingClientRect();r.removeChild(P);let D=(C.left-g.left)/b,k=(C.top-g.top)/b,z=D*D+k*k;if(z<ei)return;d?.(),h?.(!0);let I=Q=>{let O=Q.clientX-i,H=Q.clientY-c,V=(O*D+H*k)/z;V=Ln(V,l),u(V,v)},Z=()=>{window.removeEventListener("pointermove",I),window.removeEventListener("pointerup",Z),window.removeEventListener("pointercancel",Z);let Q=O=>{O.stopPropagation(),O.stopImmediatePropagation()};window.addEventListener("click",Q,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",Q,!0),0),x?.(),h?.(!1)};window.addEventListener("pointermove",I),window.addEventListener("pointerup",Z),window.addEventListener("pointercancel",Z)}function dc(e){let{axisA:n,axisB:t,probeDistanceCss:o,wrapper:r,startClientX:s,startClientY:i,translationSnap:c,onPlaneDelta:l,onMouseDown:u,onMouseUp:d,onDraggingChanged:x}=e,h=[0,0,0];h[n]=1;let b=[0,0,0];b[t]=1;function v(z){let I=r.ownerDocument.createElement("div");I.style.position="absolute",I.style.left="0",I.style.top="0",I.style.width="0",I.style.height="0",I.style.transform=`translate3d(${z[0]*o}px, ${z[1]*o}px, ${z[2]*o}px)`,r.appendChild(I);let Z=r.getBoundingClientRect(),Q=I.getBoundingClientRect();return r.removeChild(I),{x:(Q.left-Z.left)/o,y:(Q.top-Z.top)/o}}let P=v(h),g=v(b),C=P.x*g.y-g.x*P.y;if(Math.abs(C)<ei)return;u?.(),x?.(!0);let D=z=>{let I=z.clientX-s,Z=z.clientY-i,Q=(g.y*I-g.x*Z)/C,O=(-P.y*I+P.x*Z)/C;Q=Ln(Q,c),O=Ln(O,c),l(Q,O,h,b)},k=()=>{window.removeEventListener("pointermove",D),window.removeEventListener("pointerup",k),window.removeEventListener("pointercancel",k);let z=I=>{I.stopPropagation(),I.stopImmediatePropagation()};window.addEventListener("click",z,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",z,!0),0),d?.(),x?.(!1)};window.addEventListener("pointermove",D),window.addEventListener("pointerup",k),window.addEventListener("pointercancel",k)}function pc(e){let{cssAxis:n,wrapper:t,target:o,startClientX:r,startClientY:s,rotationSnap:i,onAngleDelta:c,onMouseDown:l,onMouseUp:u,onDraggingChanged:d}=e,x=t.getBoundingClientRect(),h=x.left,b=x.top,v=Math.atan2(s-b,r-h),P=0;l?.(),d?.(!0);let g=D=>{let k=Math.atan2(D.clientY-b,D.clientX-h),z=k-v;z>Math.PI?z-=2*Math.PI:z<-Math.PI&&(z+=2*Math.PI),P+=z,v=k;let I=P*180/Math.PI;I=Ln(I,i),c(I)},C=()=>{window.removeEventListener("pointermove",g),window.removeEventListener("pointerup",C),window.removeEventListener("pointercancel",C);let D=k=>{k.stopPropagation(),k.stopImmediatePropagation()};window.addEventListener("click",D,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",D,!0),0),u?.(),d?.(!1)};window.addEventListener("pointermove",g),window.addEventListener("pointerup",C),window.addEventListener("pointercancel",C)}function Ho(e,n={}){let t=null,o=n.mode??"translate",r=n.size??1,s={...n},i=new Map,c=null,l=null,u=[0,0,0];function d(){if(!t)return[0,0,0];let y=t.transform.position??[0,0,0],m=t.transform.rotation??[0,0,0],p=typeof t.transform.scale=="number"?t.transform.scale:t.transform.scale?.[0]??1,T=ko(u,m[0],m[1],m[2]);return[y[0]+p*T[0],y[1]+p*T[1],y[2]+p*T[2]]}function x(y){return l===y?ac:c===y?ic:sc}function h(){for(let[y,m]of i){let p=b(m.spec,x(y));m.handle.setPolygons(p,{recomputeAutoCenter:!1})}}function b(y,m){let T=Io(t?.polygons??[])*r,M=T/Vt,R=lc(y.color,m);if(y.kind==="arrow"){let _=e.camera.state,j=Do(y.cssAxis,y.sign,_.rotX??65,_.rotY??45);return jl({axis:tt[y.cssAxis],sign:y.sign,shaftLength:M,shaftHalfThickness:M*Jl,headLength:M*ec,headHalfThickness:M*tc,color:R,shaft:!j})}if(y.kind==="plane"){let _=e.camera.state,j=_.rotX??65,q=_.rotY??45,re=tt[y.perpAxis],fe=(re+1)%3,de=(re+2)%3,pe=tt[fe],Ce=tt[de],be=Do(pe,1,j,q)?-1:1,Ae=Do(Ce,1,j,q)?-1:1,Ue=M*rc;return Yl({axis:re,size:M*oc,offset:[be*Ue,Ae*Ue],color:R})}let te=T*nc/Vt*Oo;return Ql({axis:tt[y.cssAxis],outerRadius:te,color:R})}function v(y){return y.kind==="arrow"?"polycss-transform-arrow":y.kind==="plane"?"polycss-transform-plane":"polycss-transform-ring"}function P(){if(o==="translate"){let y=Qs.map(p=>({kind:"arrow",key:p.key,cssAxis:p.cssAxis,sign:p.sign,color:p.color})),m=Js.map(p=>({kind:"plane",key:p.key,perpAxis:p.perpAxis,axisA:p.axisA,axisB:p.axisB,color:p.color}));return[...y,...m]}return o==="rotate"?Ks.map(y=>({kind:"ring",key:y.key,cssAxis:y.cssAxis,color:y.color})):[]}function g(){if(C(),!t)return;let y={x:s.showX!==!1,y:s.showY!==!1,z:s.showZ!==!1};function m(T){if(T.kind==="arrow"){let L=T.key.replace("-","")[0];return y[L]}if(T.kind==="ring")return y[T.key];let M=["x","y","z"][T.axisA],R=["x","y","z"][T.axisB];return y[M]&&y[R]}let p=d();for(let T of P()){if(!m(T))continue;let M=b(T,x(T.key)),R=e.add({polygons:M,objectUrls:[],warnings:[],dispose:()=>{}},{excludeFromAutoCenter:!0,id:`__poly-gizmo-${T.key}`,position:p}),L=v(T);if(R.element.classList.add("polycss-transform-gizmo",L,`${L}--${T.key}`),T.kind==="ring"){let te=(1-qs)/Oo,_=(1+qs)/Oo;R.element.style.setProperty("--ring-inner-ratio",`${te}`),R.element.style.setProperty("--ring-outer-ratio",`${_}`)}i.set(T.key,{handle:R,spec:T})}}function C(){for(let{handle:y}of i.values())y.remove();i.clear(),c=null,l=null}function D(){if(!t)return;let y=d();for(let{handle:m}of i.values())m.setTransform({position:y})}function k(){t&&(i.size===0?g():D())}function z(y){if(t=y,!y){u=[0,0,0],C();return}u=cc(y.polygons),C(),g()}function I(){z(null)}function Z(y){y!==o&&(o=y,t&&(C(),g()))}function Q(y,m,p){if(!t||!O)return;let T=p[y.cssAxis],M=tt[y.cssAxis],R=m*T/Vt,L=O.slice();L[M]=O[M]+R,t.setTransform({position:L}),D(),s.onObjectChange?.({object:t,position:L}),s.onChange?.()}let O=null,H=null,V=y=>{if(!t||s.enabled===!1)return;let m={x:s.showX!==!1,y:s.showY!==!1,z:s.showZ!==!1};if(o==="translate"){for(let p of Js){let T=["x","y","z"][p.axisA],M=["x","y","z"][p.axisB];if(!m[T]||!m[M])continue;let R=i.get(p.key);if(R&&Ft(R.handle.element,y.clientX,y.clientY)){y.preventDefault(),y.stopPropagation(),l=p.key,h(),O=(t.transform.position??[0,0,0]).slice(),dc({axisA:p.axisA,axisB:p.axisB,probeDistanceCss:Io(t.polygons)*r,wrapper:R.handle.element,target:t,startClientX:y.clientX,startClientY:y.clientY,translationSnap:s.translationSnap??null,onPlaneDelta:(L,te,_,j)=>{if(!t||!O)return;let q=_[p.axisA],re=j[p.axisB],fe=tt[p.axisA],de=tt[p.axisB],pe=O.slice();pe[fe]+=L*q/Vt,pe[de]+=te*re/Vt,t.setTransform({position:pe}),D(),s.onObjectChange?.({object:t,position:pe}),s.onChange?.()},onMouseDown:s.onMouseDown,onMouseUp:s.onMouseUp,onDraggingChanged:L=>{L||(l=null,O=null,h()),s.onDraggingChanged?.(L)}});return}}for(let p of Qs){let T=p.key.replace("-","")[0];if(!m[T])continue;let M=i.get(p.key);if(M&&Ft(M.handle.element,y.clientX,y.clientY)){y.preventDefault(),y.stopPropagation(),l=p.key,h(),O=(t.transform.position??[0,0,0]).slice(),uc({cssAxis:p.cssAxis,sign:p.sign,shaftLengthCss:Io(t.polygons)*r,wrapper:M.handle.element,target:t,startClientX:y.clientX,startClientY:y.clientY,translationSnap:s.translationSnap??null,onAxisDelta:(R,L)=>Q(p,R,L),onMouseDown:s.onMouseDown,onMouseUp:s.onMouseUp,onDraggingChanged:R=>{R||(l=null,O=null,h()),s.onDraggingChanged?.(R)}});return}}}else if(o==="rotate")for(let p of Ks){if(!m[p.key])continue;let T=i.get(p.key);if(T&&Ft(T.handle.element,y.clientX,y.clientY)){y.preventDefault(),y.stopPropagation(),l=p.key,h(),H=(t.transform.rotation??[0,0,0]).slice(),O=(t.transform.position??[0,0,0]).slice(),pc({cssAxis:p.cssAxis,wrapper:T.handle.element,target:t,startClientX:y.clientX,startClientY:y.clientY,rotationSnap:s.rotationSnap??null,onAngleDelta:M=>{if(!t||!H||!O)return;let R=tt[p.cssAxis],L=[0,0,0];L[R]=1;let te=-M*Math.PI/180,_=Zl(H),j=Xl(L,te),q=Wl(ql(j,_)),re=typeof t.transform.scale=="number"?t.transform.scale:t.transform.scale?.[0]??1,fe=ko(u,H[0],H[1],H[2]),de=ko(u,q[0],q[1],q[2]),pe=[O[0]+re*(fe[0]-de[0]),O[1]+re*(fe[1]-de[1]),O[2]+re*(fe[2]-de[2])];t.setTransform({rotation:q,position:pe}),D(),s.onObjectChange?.({object:t,rotation:q,position:pe}),s.onChange?.()},onMouseDown:s.onMouseDown,onMouseUp:s.onMouseUp,onDraggingChanged:M=>{M||(l=null,H=null,O=null,h(),t?.rebakeAtlas()),s.onDraggingChanged?.(M)}});return}}};e.host.addEventListener("pointerdown",V,{capture:!0});let $=y=>{if(!t||l||s.enabled===!1)return;let m=null;for(let[p,T]of i)if(Ft(T.handle.element,y.clientX,y.clientY)){m=p;break}m!==c&&(c=m,h())};e.host.addEventListener("pointermove",$);function A(){e.host.removeEventListener("pointerdown",V,{capture:!0}),e.host.removeEventListener("pointermove",$),C()}return{attach:z,detach:I,setMode:Z,update:k,destroy:A}}var mc=typeof HTMLElement<"u"?HTMLElement:class{},fc=["perspective","rot-x","rot-y","zoom","directional-direction","directional-color","directional-intensity","ambient-color","ambient-intensity","texture-lighting","texture-quality","auto-center"];function $e(e){if(e==null)return;let n=parseFloat(e);return Number.isFinite(n)?n:void 0}function hc(e){return e==="false"?!1:$e(e)}function Fo(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function gc(e){if(e==="baked"||e==="dynamic")return e}function yc(e){return e==="auto"?"auto":$e(e)}function bc(e){return typeof e.getCamera=="function"}var Re=class extends mc{constructor(){super(...arguments);this._scene=null;this._implicitCamera=null}static get observedAttributes(){return[...fc]}getScene(){return this._scene}_findAncestorCamera(){let t=this.parentElement;for(;t;){if(bc(t)){let o=t.getCamera();if(o)return o}t=t.parentElement}return null}_buildImplicitCamera(){let t=hc(this.getAttribute("perspective")),o=$e(this.getAttribute("rot-x")),r=$e(this.getAttribute("rot-y")),s=$e(this.getAttribute("zoom")),i=$e(this.getAttribute("distance")),c=Fo(this.getAttribute("target")),l={...o!==void 0?{rotX:o}:{},...r!==void 0?{rotY:r}:{},...s!==void 0?{zoom:s}:{},...i!==void 0?{distance:i}:{},...c!==void 0?{target:c}:{}};return t===!1?ht(l):t!==void 0?Ot({...l,perspective:t}):ht(l)}_readNonCameraOptions(){let t=this._readDirectionalLight(),o=this._readAmbientLight(),r={};r.textureLighting=gc(this.getAttribute("texture-lighting"))??"baked";let s=yc(this.getAttribute("texture-quality"));return s!==void 0&&(r.textureQuality=s),r.autoCenter=this.hasAttribute("auto-center"),t&&(r.directionalLight=t),o&&(r.ambientLight=o),r}_readDirectionalLight(){let t=Fo(this.getAttribute("directional-direction")),o=this.getAttribute("directional-color")||void 0,r=$e(this.getAttribute("directional-intensity"));if(!t&&!o&&r===void 0)return;let s={direction:t??[.4,-.7,.59]};return o&&(s.color=o),r!==void 0&&(s.intensity=r),s}_readAmbientLight(){let t=this.getAttribute("ambient-color")||void 0,o=$e(this.getAttribute("ambient-intensity"));if(!t&&o===void 0)return;let r={};return t&&(r.color=t),o!==void 0&&(r.intensity=o),r}connectedCallback(){if(this._scene)return;let t=this._findAncestorCamera(),o;t?(o=t,this._implicitCamera=null):(this._implicitCamera=this._buildImplicitCamera(),o=this._implicitCamera),this._scene=Ao(this,{camera:o,...this._readNonCameraOptions()}),this.dispatchEvent(new CustomEvent("polycss:scene-ready",{bubbles:!1}))}disconnectedCallback(){this._scene&&(this._scene.destroy(),this._scene=null),this._implicitCamera=null}attributeChangedCallback(t,o,r){if(o!==r&&this._scene){if(this._implicitCamera&&["rot-x","rot-y","zoom","distance","target"].includes(t)){let i=$e(this.getAttribute("rot-x")),c=$e(this.getAttribute("rot-y")),l=$e(this.getAttribute("zoom")),u=$e(this.getAttribute("distance")),d=Fo(this.getAttribute("target"));i!==void 0&&this._implicitCamera.update({rotX:i}),c!==void 0&&this._implicitCamera.update({rotY:c}),l!==void 0&&this._implicitCamera.update({zoom:l}),u!==void 0&&this._implicitCamera.update({distance:u}),d!==void 0&&this._implicitCamera.update({target:d}),this._scene.applyCamera();return}this._scene.setOptions(this._readNonCameraOptions())}}};import{computeSceneBbox as vc,loadMesh as xc}from"@layoutit/polycss-core";var Pc=typeof HTMLElement<"u"?HTMLElement:class{},Sc=["src","mtl","mesh-resolution","position","scale","rotation","auto-center","cast-shadow","receive-shadow","target-size","default-color","palette","include-objects","exclude-objects"];function nn(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function ti(e){if(e){if(!e.includes(",")){let n=parseFloat(e);return Number.isFinite(n)?n:void 0}return nn(e)}}function Vo(e){if(!e)return;let n=e.split(",").map(t=>t.trim()).filter(t=>t.length>0);return n.length>0?n:void 0}function Cc(e){let n=e.getAttribute("target-size"),t=e.getAttribute("default-color"),o=Vo(e.getAttribute("palette")),r=Vo(e.getAttribute("include-objects")),s=Vo(e.getAttribute("exclude-objects")),i=n!==null?parseFloat(n):NaN,c={};return Number.isFinite(i)&&(c.targetSize=i),t&&(c.defaultColor=t),o&&(c.palette=o),r&&(c.includeObjects=r),s&&(c.excludeObjects=s),Object.keys(c).length>0?c:void 0}function Ec(e){return e.closest("poly-scene")??null}function Tc(e){if(e.length===0)return e;let n=vc(e),t=(n.min[0]+n.max[0])/2,o=(n.min[1]+n.max[1])/2,r=(n.min[2]+n.max[2])/2;if(t===0&&o===0&&r===0)return e;let s=i=>[i[0]-t,i[1]-o,i[2]-r];return e.map(i=>({...i,vertices:i.vertices.map(s),...i.textureTriangles?.length?{textureTriangles:i.textureTriangles.map(c=>({...c,vertices:c.vertices.map(s)}))}:null}))}var on=class extends Pc{constructor(){super(...arguments);this._handle=null;this._parseResult=null;this._loadToken=0}static get observedAttributes(){return[...Sc]}getMeshHandle(){return this._handle}connectedCallback(){this._maybeLoad()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(t,o,r){if(o!==r){if(t==="src"||t==="mtl"||t==="mesh-resolution"||t==="target-size"||t==="default-color"||t==="palette"||t==="include-objects"||t==="exclude-objects"){this._tearDown(),this._maybeLoad();return}this._handle&&this._handle.setTransform({position:nn(this.getAttribute("position")),scale:ti(this.getAttribute("scale")),rotation:nn(this.getAttribute("rotation")),castShadow:this.hasAttribute("cast-shadow"),receiveShadow:this.hasAttribute("receive-shadow")})}}_tearDown(){if(this._loadToken+=1,this._handle){try{this._handle.dispose()}catch{}this._handle=null}this._parseResult=null}async _maybeLoad(){let t=this.getAttribute("src");if(!t)return;let o=Ec(this);if(!o)return;let r=++this._loadToken,s=this.getAttribute("mtl")||void 0,c=this.getAttribute("mesh-resolution")==="lossless"?"lossless":void 0,l=Cc(this),u;try{let h=s||c!==void 0||l?{...s?{mtlUrl:s}:{},...c!==void 0?{meshResolution:c}:{},...l?{objOptions:l}:{}}:void 0;u=await xc(t,h)}catch(h){this.dispatchEvent(new CustomEvent("polycss:error",{detail:h,bubbles:!0}));return}if(r!==this._loadToken){try{u.dispose()}catch{}return}let d=o.getScene();if(!d){try{u.dispose()}catch{}return}this.hasAttribute("auto-center")&&(u={...u,polygons:Tc(u.polygons)}),this._parseResult=u,this._handle=d.add(u,{position:nn(this.getAttribute("position")),scale:ti(this.getAttribute("scale")),rotation:nn(this.getAttribute("rotation")),castShadow:this.hasAttribute("cast-shadow"),receiveShadow:this.hasAttribute("receive-shadow")}),this.dispatchEvent(new CustomEvent("polycss:loaded",{detail:{polygons:this._handle.polygons},bubbles:!0}))}};import{BASE_TILE as rn}from"@layoutit/polycss-core";var Ac=typeof HTMLElement<"u"?HTMLElement:class{},wc=["src","width","height","position","rotation","scale","allow","loading","referrerpolicy","sandbox","title"];function Bo(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function Mc(e){if(e){if(!e.includes(",")){let n=parseFloat(e);return Number.isFinite(n)?n:void 0}return Bo(e)}}function ni(e,n){if(e===null)return n;let t=parseFloat(e);return Number.isFinite(t)?t:n}function Lc(e){let n=e.closest("poly-scene");return n?n.querySelector(".polycss-scene"):null}function _c(e,n,t,o,r){let s=typeof t=="number"?t:t?.[0]??1,i=typeof t=="number"?t:t?.[1]??1,c=typeof t=="number"?t:t?.[2]??1,l=s!==1||i!==1||c!==1,u=!!n&&(!!n[0]||!!n[1]||!!n[2]),d=(e?.[1]??0)*rn,x=(e?.[0]??0)*rn,h=(e?.[2]??0)*rn,b=[];return b.push(`translate3d(${d}px, ${x}px, ${h}px)`),u&&(n[0]&&b.push(`rotateY(${-n[0]}deg)`),n[1]&&b.push(`rotateX(${-n[1]}deg)`),n[2]&&b.push(`rotateZ(${-n[2]}deg)`)),l&&b.push(`scale3d(${s}, ${i}, ${c})`),b.push(`translate(${-o/2}px, ${-r/2}px)`),b.join(" ")}var zo=class extends Ac{constructor(){super(...arguments);this._wrapper=null;this._iframe=null}static get observedAttributes(){return[...wc]}getIframeElement(){return this._iframe}connectedCallback(){this._mount()}disconnectedCallback(){this._teardown()}attributeChangedCallback(t,o,r){if(o!==r&&!(!this._wrapper||!this._iframe)){if(t==="src"){this._iframe.src=this.getAttribute("src")??"";return}if(t==="allow"||t==="loading"||t==="referrerpolicy"||t==="sandbox"||t==="title"){let s=this.getAttribute(t);s===null?this._iframe.removeAttribute(t):this._iframe.setAttribute(t,s);return}this._applyGeometry()}}_mount(){let t=Lc(this);if(!t)return;let o=this.ownerDocument;if(!o)return;let r=o.createElement("div");r.className="polycss-iframe",r.style.position="absolute",r.style.left="0",r.style.top="0",r.style.transformOrigin="0 0",r.style.transformStyle="preserve-3d";let s=o.createElement("iframe");s.style.display="block",s.style.border="0",s.style.background="#000";let i=this.getAttribute("src");i&&(s.src=i);let c=this.getAttribute("allow");c&&s.setAttribute("allow",c);for(let l of["loading","referrerpolicy","sandbox","title"]){let u=this.getAttribute(l);u!==null&&s.setAttribute(l,u)}r.appendChild(s),t.appendChild(r),this._wrapper=r,this._iframe=s,this._applyGeometry()}_applyGeometry(){if(!this._wrapper||!this._iframe)return;let t=ni(this.getAttribute("width"),16),o=ni(this.getAttribute("height"),9),r=t*rn,s=o*rn;this._iframe.style.width=`${r}px`,this._iframe.style.height=`${s}px`;let i=Bo(this.getAttribute("position")),c=Bo(this.getAttribute("rotation")),l=Mc(this.getAttribute("scale"));this._wrapper.style.transform=_c(i,c,l,r,s)}_teardown(){this._wrapper?.parentNode&&this._wrapper.parentNode.removeChild(this._wrapper),this._wrapper=null,this._iframe=null}};var Rc=typeof HTMLElement<"u"?HTMLElement:class{},kc=["vertices","color","texture","uvs","position","scale","rotation"];function oi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function No(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function Oc(e){if(e){if(!e.includes(",")){let n=parseFloat(e);return Number.isFinite(n)?n:void 0}return No(e)}}function Dc(e){return e.closest("poly-scene")??null}var $o=class extends Rc{constructor(){super(...arguments);this._handle=null}static get observedAttributes(){return[...kc]}connectedCallback(){this._mount()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(t,o,r){o!==r&&(this._tearDown(),this.isConnected&&this._mount())}_tearDown(){if(this._handle){try{this._handle.dispose()}catch{}this._handle=null}}_mount(){let t=Dc(this);if(!t)return;let o=t.getScene();if(!o)return;let r=oi(this.getAttribute("vertices"));if(!r||!Array.isArray(r)||r.length<3)return;let s=this.getAttribute("color")||void 0,i=this.getAttribute("texture")||void 0,c=oi(this.getAttribute("uvs"))??void 0,l={};for(let x of Array.from(this.attributes))x.name.startsWith("data-")&&(l[x.name.slice(5)]=x.value);let d={polygons:[{vertices:r,...s!==void 0?{color:s}:{},...i!==void 0?{texture:i}:{},...c!==void 0?{uvs:c}:{},...Object.keys(l).length>0?{data:l}:{}}],objectUrls:[],warnings:[],dispose:()=>{}};this._handle=o.add(d,{position:No(this.getAttribute("position")),scale:Oc(this.getAttribute("scale")),rotation:No(this.getAttribute("rotation"))})}};function ee(e){if(e==null)return;let n=parseFloat(e);return Number.isFinite(n)?n:void 0}function _n(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function Te(e){if(e!==null)return!(e==="false"||e==="0")}function Rn(e){if(e===null)return;if(e==="true")return!0;if(e==="false")return!1;let n=parseFloat(e);return Number.isFinite(n)?n:!0}function kn(e){if(e==="x"||e==="y")return e}var Ic=typeof HTMLElement<"u"?HTMLElement:class{},Hc=["drag","wheel","dolly","min-distance","max-distance","invert","zoom-min","zoom-max","animate-speed","animate-axis","animate-pause-on-interaction"],Uo=class extends Ic{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return[...Hc]}getControls(){return this._controls}_readAnimate(){let t=ee(this.getAttribute("animate-speed")),o=kn(this.getAttribute("animate-axis")),r=this.getAttribute("animate-pause-on-interaction");if(this.hasAttribute("animate-speed")||this.hasAttribute("animate-axis")||this.hasAttribute("animate-pause-on-interaction"))return{...t!==void 0?{speed:t}:{},...o!==void 0?{axis:o}:{},...r!==null?{pauseOnInteraction:Te(r)}:{}}}_readOptions(){let t={},o=Te(this.getAttribute("drag"));o!==void 0&&(t.drag=o);let r=Te(this.getAttribute("wheel"));r!==void 0&&(t.wheel=r),this.hasAttribute("dolly")&&(t.dolly=!0);let s=ee(this.getAttribute("min-distance"));s!==void 0&&(t.minDistance=s);let i=ee(this.getAttribute("max-distance"));i!==void 0&&(t.maxDistance=i);let c=Rn(this.getAttribute("invert"));c!==void 0&&(t.invert=c);let l=ee(this.getAttribute("zoom-min")),u=ee(this.getAttribute("zoom-max"));return l!==void 0&&(t.minZoom=l),u!==void 0&&(t.maxZoom=u),t.animate=this._readAnimate()??!1,t}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof Re)return t;t=t.parentNode}return null}_attach(){if(this._controls)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._controls=wo(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls&&this._controls.update(this._readOptions())}};var Fc=typeof HTMLElement<"u"?HTMLElement:class{},Vc=["drag","wheel","dolly","min-distance","max-distance","invert","zoom-min","zoom-max","animate-speed","animate-axis","animate-pause-on-interaction"],Go=class extends Fc{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return[...Vc]}_readAnimate(){let t=ee(this.getAttribute("animate-speed")),o=kn(this.getAttribute("animate-axis")),r=this.getAttribute("animate-pause-on-interaction");if(this.hasAttribute("animate-speed")||this.hasAttribute("animate-axis")||this.hasAttribute("animate-pause-on-interaction"))return{...t!==void 0?{speed:t}:{},...o!==void 0?{axis:o}:{},...r!==null?{pauseOnInteraction:Te(r)}:{}}}_readOptions(){let t={},o=Te(this.getAttribute("drag"));o!==void 0&&(t.drag=o);let r=Te(this.getAttribute("wheel"));r!==void 0&&(t.wheel=r),this.hasAttribute("dolly")&&(t.dolly=!0);let s=ee(this.getAttribute("min-distance"));s!==void 0&&(t.minDistance=s);let i=ee(this.getAttribute("max-distance"));i!==void 0&&(t.maxDistance=i);let c=Rn(this.getAttribute("invert"));c!==void 0&&(t.invert=c);let l=ee(this.getAttribute("zoom-min")),u=ee(this.getAttribute("zoom-max"));return l!==void 0&&(t.minZoom=l),u!==void 0&&(t.maxZoom=u),t.animate=this._readAnimate()??!1,t}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof Re)return t;t=t.parentNode}return null}_attach(){if(this._controls)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._controls=Mo(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls&&this._controls.update(this._readOptions())}};var Bc=typeof HTMLElement<"u"?HTMLElement:class{},zc=["enabled","look-enabled","move-enabled","jump-enabled","crouch-enabled","look-sensitivity","invert-y","move-speed","jump-velocity","gravity","eye-height","crouch-height","ground-z","min-pitch","max-pitch"],jo=class extends Bc{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return[...zc]}_readOptions(){let t={},o=Te(this.getAttribute("enabled"));o!==void 0&&(t.enabled=o);let r=Te(this.getAttribute("look-enabled"));r!==void 0&&(t.lookEnabled=r);let s=Te(this.getAttribute("move-enabled"));s!==void 0&&(t.moveEnabled=s);let i=Te(this.getAttribute("jump-enabled"));i!==void 0&&(t.jumpEnabled=i);let c=Te(this.getAttribute("crouch-enabled"));c!==void 0&&(t.crouchEnabled=c);let l=ee(this.getAttribute("look-sensitivity"));if(l!==void 0&&(t.lookSensitivity=l),this.hasAttribute("invert-y")){let C=Te(this.getAttribute("invert-y"));C!==void 0&&(t.invertY=C)}let u=ee(this.getAttribute("move-speed"));u!==void 0&&(t.moveSpeed=u);let d=ee(this.getAttribute("jump-velocity"));d!==void 0&&(t.jumpVelocity=d);let x=ee(this.getAttribute("gravity"));x!==void 0&&(t.gravity=x);let h=ee(this.getAttribute("eye-height"));h!==void 0&&(t.eyeHeight=h);let b=ee(this.getAttribute("crouch-height"));b!==void 0&&(t.crouchHeight=b);let v=ee(this.getAttribute("ground-z"));v!==void 0&&(t.groundZ=v);let P=ee(this.getAttribute("min-pitch"));P!==void 0&&(t.minPitch=P);let g=ee(this.getAttribute("max-pitch"));return g!==void 0&&(t.maxPitch=g),t}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof Re)return t;t=t.parentNode}return null}_attach(){if(this._controls)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._controls=_o(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls&&this._controls.update(this._readOptions())}};var Nc=typeof HTMLElement<"u"?HTMLElement:class{},$c=["perspective","zoom","rot-x","rot-y","target","distance"],Wo=class extends Nc{constructor(){super(...arguments);this._camera=null;this._wrapper=null}static get observedAttributes(){return[...$c]}getCamera(){return this._camera}_readOptions(){return{perspective:ee(this.getAttribute("perspective")),zoom:ee(this.getAttribute("zoom")),rotX:ee(this.getAttribute("rot-x")),rotY:ee(this.getAttribute("rot-y")),target:_n(this.getAttribute("target")),distance:ee(this.getAttribute("distance"))}}_mount(){if(this._camera)return;let t=this._readOptions();for(this._camera=Ot(t),this._wrapper=this.ownerDocument.createElement("div"),this._wrapper.className="polycss-camera",this._wrapper.style.perspective=this._camera.perspectiveStyle;this.firstChild;)this._wrapper.appendChild(this.firstChild);this.appendChild(this._wrapper),this.dispatchEvent(new CustomEvent("polycss:camera-ready",{bubbles:!1}))}_teardown(){if(this._wrapper){for(;this._wrapper.firstChild;)this.insertBefore(this._wrapper.firstChild,this._wrapper);this._wrapper.parentNode&&this._wrapper.parentNode.removeChild(this._wrapper),this._wrapper=null}this._camera=null}connectedCallback(){this._mount()}disconnectedCallback(){this._teardown()}attributeChangedCallback(t,o,r){if(o===r||!this._camera||!this._wrapper)return;let s=this._readOptions();if(t==="perspective"){this._camera=Ot(s),this._wrapper.style.perspective=this._camera.perspectiveStyle;return}this._camera.update({rotX:s.rotX,rotY:s.rotY,zoom:s.zoom,target:s.target,distance:s.distance}),this.querySelector("poly-scene")?.getScene?.()?.applyCamera()}};var Uc=typeof HTMLElement<"u"?HTMLElement:class{},Gc=["zoom","rot-x","rot-y","target","distance"],sn=class extends Uc{constructor(){super(...arguments);this._camera=null;this._wrapper=null}static get observedAttributes(){return[...Gc]}getCamera(){return this._camera}_readOptions(){return{zoom:ee(this.getAttribute("zoom")),rotX:ee(this.getAttribute("rot-x")),rotY:ee(this.getAttribute("rot-y")),target:_n(this.getAttribute("target")),distance:ee(this.getAttribute("distance"))}}_mount(){if(this._camera)return;let t=this._readOptions();for(this._camera=ht(t),this._wrapper=this.ownerDocument.createElement("div"),this._wrapper.className="polycss-camera",this._wrapper.style.perspective=this._camera.perspectiveStyle;this.firstChild;)this._wrapper.appendChild(this.firstChild);this.appendChild(this._wrapper),this.dispatchEvent(new CustomEvent("polycss:camera-ready",{bubbles:!1}))}_teardown(){if(this._wrapper){for(;this._wrapper.firstChild;)this.insertBefore(this._wrapper.firstChild,this._wrapper);this._wrapper.parentNode&&this._wrapper.parentNode.removeChild(this._wrapper),this._wrapper=null}this._camera=null}connectedCallback(){this._mount()}disconnectedCallback(){this._teardown()}attributeChangedCallback(t,o,r){if(o===r||!this._camera)return;let s=this._readOptions();s.zoom!==void 0&&this._camera.update({zoom:s.zoom}),s.rotX!==void 0&&this._camera.update({rotX:s.rotX}),s.rotY!==void 0&&this._camera.update({rotY:s.rotY}),s.target!==void 0&&this._camera.update({target:s.target}),s.distance!==void 0&&this._camera.update({distance:s.distance}),this.querySelector("poly-scene")?.getScene?.()?.applyCamera()}};var Yo=class extends sn{};var jc=typeof HTMLElement<"u"?HTMLElement:class{},Wc=["mode","target","size","enabled"];function ri(e){if(e==="translate"||e==="rotate")return e}var Xo=class extends jc{constructor(){super(...arguments);this._tc=null}static get observedAttributes(){return[...Wc]}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof Re)return t;t=t.parentNode}return null}_findTargetMesh(){let t=this.getAttribute("target");if(!t)return null;let o=this._findScene();if(!o)return null;let r=null;try{r=o.querySelector(`#${t}`)??o.querySelector(t)}catch{r=o.querySelector(`[id="${t}"]`)}return r instanceof on?r:null}_readOptions(){let t={},o=ri(this.getAttribute("mode"));o!==void 0&&(t.mode=o);let r=ee(this.getAttribute("size"));r!==void 0&&(t.size=r);let s=this.getAttribute("enabled");return s!==null&&(t.enabled=s!=="false"&&s!=="0"),t.onObjectChange=i=>{this.dispatchEvent(new CustomEvent("polycss:object-change",{bubbles:!0,detail:{position:i.position,rotation:i.rotation}}))},t}_attach(){if(this._tc)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let s=()=>{t.removeEventListener("polycss:scene-ready",s),this._attach()};t.addEventListener("polycss:scene-ready",s)}return}this._tc=Ho(o,this._readOptions());let r=this._findTargetMesh();if(r){let s=r.getMeshHandle();s&&this._tc.attach(s)}}connectedCallback(){this._attach()}disconnectedCallback(){this._tc&&(this._tc.destroy(),this._tc=null)}attributeChangedCallback(t,o,r){if(o!==r&&this._tc){if(t==="mode"){let s=ri(r);s&&this._tc.setMode(s)}else if(t==="target"){let s=this._findTargetMesh();this._tc.attach(s?s.getMeshHandle()??null:null)}}}};var Yc=typeof HTMLElement<"u"?HTMLElement:class{},Xc=["multiple","clear-on-miss"],Zo=class extends Yc{constructor(){super(...arguments);this._selection=null}static get observedAttributes(){return[...Xc]}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof Re)return t;t=t.parentNode}return null}_readOptions(){return{multiple:this.hasAttribute("multiple"),clearOnMiss:!this.hasAttribute("clear-on-miss")||this.getAttribute("clear-on-miss")!=="false",onChange:t=>{this.dispatchEvent(new CustomEvent("polycss:select",{bubbles:!0,detail:{selected:t}}))}}}_attach(){if(this._selection)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._selection=Ro(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._selection&&(this._selection.destroy(),this._selection=null)}attributeChangedCallback(t,o,r){o!==r&&(this._selection&&(this._selection.destroy(),this._selection=null),this._attach())}};var qo={quad:0,clippedSolid:0,atlas:0,stableTriangle:0},Zc={polygonCount:0,mountedPolygonLeafCount:0,shadowLeafCount:0,surfaceLeafCounts:qo,bucketCount:0};function qc(e){return typeof e=="number"?{polygonCount:e}:e??{}}function Bt(e,n){return e.querySelectorAll(n).length}function Qc(e,n){let t=e;return typeof t.matches=="function"&&t.matches(n)}function Kc(e,n){if(!n)return[e];let t=[];return Qc(e,n)&&t.push(e),t.push(...Array.from(e.querySelectorAll(n))),t}function Jc(e,n){let t=qc(n);if(!e)return{...Zc,surfaceLeafCounts:{...qo},polygonCount:t.polygonCount??0};let o=Kc(e,t.scopeSelector),r={...qo},s=0,i=0;for(let l of o)r.quad+=Bt(l,"b"),r.clippedSolid+=Bt(l,"i"),r.atlas+=Bt(l,"s"),r.stableTriangle+=Bt(l,"u"),s+=Bt(l,"q, .polycss-shadow-svg"),i+=Bt(l,".polycss-bucket");let c=r.quad+r.clippedSolid+r.atlas+r.stableTriangle;return{polygonCount:t.polygonCount??c,mountedPolygonLeafCount:c,shadowLeafCount:s,surfaceLeafCounts:r,bucketCount:i}}var gt=class extends Error{constructor(n,t,o){super(t),this.name="PolySceneSnapshotError",this.code=n,this.url=o,Object.setPrototypeOf(this,new.target.prototype)}},eu=`
520
+ html,
521
+ body {
522
+ width: 100%;
523
+ height: 100%;
524
+ margin: 0;
525
+ }
380
526
 
381
- The base layout / positioning / pseudo-element-strip rules for <q>
382
- live in the polygon-leaf section above. This rule only adds the
383
- dynamic-light Lambert gating, separated so it's easy to disable the
384
- gate for debugging by commenting out a single block. */
385
- .polycss-scene q {
527
+ body {
528
+ position: relative;
529
+ overflow: hidden;
530
+ }
531
+ `,Qo=["b","i","s","u"],tu=["b","i","u"],nu=["--plx","--ply","--plz","--plr","--plg","--plb","--pli","--par","--pag","--pab","--pai","--pnx","--pny","--pnz","--psr","--psg","--psb","--plam","--polycss-light-preview-active","--polycss-preview-r","--polycss-preview-g","--polycss-preview-b"],ou=["--clx","--cly","--clz","--shadow-ground-cssz"],ru=["--polycss-atlas-size","--polycss-atlas-url","--polycss-atlas-position","--polycss-atlas-image-size"];function su(e){return!!e&&typeof e.querySelector=="function"&&typeof e.cloneNode=="function"}function iu(e){let n=e.closest(".polycss-camera");if(n)return n;let t=e.closest(".polycss-scene");return t?t.closest(".polycss-camera")??t:e.querySelector(".polycss-camera")??e.querySelector(".polycss-scene")}function ln(e){return[e,...Array.from(e.querySelectorAll("*"))]}function nt(e,n){return e.matches(n)||!!e.querySelector(n)}function si(e,n){return e.tagName.toLowerCase()===n||!!e.querySelector(n)}function au(e){let n=Qo.filter(o=>si(e,o)),t=tu.filter(o=>n.includes(o));return{hasCamera:nt(e,".polycss-camera"),hasScene:nt(e,".polycss-scene"),hasMesh:nt(e,".polycss-mesh"),hasFpvHost:nt(e,".polycss-fpv-host"),hasBucket:nt(e,".polycss-bucket"),hasVoxelMesh:nt(e,".polycss-voxel-mesh"),hasTransformGizmo:nt(e,".polycss-transform-gizmo"),hasTransformRing:nt(e,".polycss-transform-ring"),hasDynamicLighting:nt(e,'.polycss-scene[data-polycss-lighting="dynamic"]'),hasQ:si(e,"q"),leafTags:n,solidLeafTags:t}}function an(e,n=".polycss-scene "){return e.map(t=>`${n}${t}`).join(`,
532
+ `)}function lu(e){return e.map(n=>`.polycss-scene[data-polycss-lighting="dynamic"] :not(.polycss-bucket) > ${n}`).join(`,
533
+ `)}function cu(e){let n=['@property --plx { syntax: "<number>"; inherits: true; initial-value: 0; }','@property --ply { syntax: "<number>"; inherits: true; initial-value: 0; }','@property --plz { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --plr { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --plg { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --plb { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --pli { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --par { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --pag { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --pab { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --pai { syntax: "<number>"; inherits: true; initial-value: 0.4; }','@property --pnx { syntax: "<number>"; inherits: true; initial-value: 0; }','@property --pny { syntax: "<number>"; inherits: true; initial-value: 0; }','@property --pnz { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --psr { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --psg { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --psb { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --plam { syntax: "<number>"; inherits: true; initial-value: 0; }'];return e&&n.push('@property --clx { syntax: "<number>"; inherits: true; initial-value: 0.01; }','@property --cly { syntax: "<number>"; inherits: true; initial-value: 0; }','@property --clz { syntax: "<number>"; inherits: true; initial-value: 1; }','@property --shadow-ground-cssz { syntax: "<number>"; inherits: true; initial-value: 0; }'),n.join(`
534
+ `)}function uu(e){let n=[cu(e.hasQ)];return e.hasBucket&&n.push(`
535
+ .polycss-scene[data-polycss-lighting="dynamic"] .polycss-bucket {
536
+ --plam: max(0, calc(
537
+ var(--pnx) * var(--plx) +
538
+ var(--pny) * var(--ply) +
539
+ var(--pnz) * var(--plz)
540
+ ));
541
+ }
542
+ `),e.leafTags.length>0&&n.push(`
543
+ ${lu(e.leafTags)} {
544
+ --plam: max(0, calc(
545
+ var(--pnx) * var(--plx) +
546
+ var(--pny) * var(--ply) +
547
+ var(--pnz) * var(--plz)
548
+ ));
549
+ }
550
+ `),e.leafTags.includes("s")&&n.push(`
551
+ .polycss-scene[data-polycss-lighting="dynamic"] s {
552
+ contain: strict;
553
+ background-color: rgb(
554
+ calc(255 * (var(--par) * var(--pai)
555
+ + var(--plr) * var(--pli) * var(--plam)))
556
+ calc(255 * (var(--pag) * var(--pai)
557
+ + var(--plg) * var(--pli) * var(--plam)))
558
+ calc(255 * (var(--pab) * var(--pai)
559
+ + var(--plb) * var(--pli) * var(--plam)))
560
+ );
561
+ background-blend-mode: multiply;
562
+ background-image: var(--polycss-atlas-url);
563
+ background-position: var(--polycss-atlas-position);
564
+ background-repeat: no-repeat;
565
+ background-size: var(--polycss-atlas-image-size);
566
+ mask-image: var(--polycss-atlas-url);
567
+ mask-mode: alpha;
568
+ mask-position: var(--polycss-atlas-position);
569
+ mask-repeat: no-repeat;
570
+ mask-size: var(--polycss-atlas-image-size);
571
+ -webkit-mask-image: var(--polycss-atlas-url);
572
+ -webkit-mask-position: var(--polycss-atlas-position);
573
+ -webkit-mask-repeat: no-repeat;
574
+ -webkit-mask-size: var(--polycss-atlas-image-size);
575
+ }
576
+ `),e.solidLeafTags.length>0&&n.push(`
577
+ ${an(e.solidLeafTags)} {
578
+ color: rgb(
579
+ calc(255 * var(--psr) * (var(--par) * var(--pai)
580
+ + var(--plr) * var(--pli) * var(--plam)))
581
+ calc(255 * var(--psg) * (var(--pag) * var(--pai)
582
+ + var(--plg) * var(--pli) * var(--plam)))
583
+ calc(255 * var(--psb) * (var(--pab) * var(--pai)
584
+ + var(--plb) * var(--pli) * var(--plam)))
585
+ );
586
+ }
587
+ `),e.hasQ&&n.push(`
588
+ .polycss-scene[data-polycss-lighting="dynamic"] {
589
+ --shadow-proj: matrix3d(
590
+ 1, 0, 0, 0,
591
+ 0, 1, 0, 0,
592
+ calc(-1 * var(--clx) / var(--clz)),
593
+ calc(-1 * var(--cly) / var(--clz)),
594
+ 0.01,
595
+ 0,
596
+ calc(var(--shadow-ground-cssz) * var(--clx) / var(--clz)),
597
+ calc(var(--shadow-ground-cssz) * var(--cly) / var(--clz)),
598
+ calc(var(--shadow-ground-cssz) * 0.99),
599
+ 1
600
+ );
601
+ }
602
+
603
+ .polycss-scene[data-polycss-lighting="dynamic"] q {
386
604
  opacity: clamp(0, calc((var(--pnx) * var(--clx) + var(--pny) * var(--cly) + var(--pnz) * var(--clz)) * 10), 1);
387
605
  }
388
- `;var Cs=750,As=8e3;var lt=65,ct=45,Ms=1,_e=hs;function Ss(e,n){let t=e?.disable??[],o=n?.disable??[];if(t.length!==o.length)return!1;for(let r of t)if(!o.includes(r))return!1;return!0}function po(e){let n=[];return e.position&&n.push(`translate3d(${e.position[0]}px, ${e.position[1]}px, ${e.position[2]}px)`),e.scale!==void 0&&(typeof e.scale=="number"?e.scale!==1&&n.push(`scale3d(${e.scale}, ${e.scale}, ${e.scale})`):n.push(`scale3d(${e.scale[0]}, ${e.scale[1]}, ${e.scale[2]})`)),e.rotation&&(e.rotation[0]&&n.push(`rotateX(${e.rotation[0]}deg)`),e.rotation[1]&&n.push(`rotateY(${e.rotation[1]}deg)`),e.rotation[2]&&n.push(`rotateZ(${e.rotation[2]}deg)`)),n.length>0?n.join(" "):void 0}function Ls(e,n=[0,0,0],t=1){let o=e.rotX??lt,r=e.rotY??ct,s=(e.zoom??Ms)*t,i=(e.distance??0)*t,a=e.target??[0,0,0],l=a[0]+n[0],u=a[1]+n[1],p=a[2]+n[2],d=u*_e,f=l*_e,g=p*_e;return`${i!==0?`translateZ(${-i}px) `:""}scale(${s}) rotateX(${o}deg) rotate(${r}deg) translate3d(${-d}px, ${-f}px, ${-g}px)`}function ws(e){let n=e.trim();if(!n||n==="normal")return 1;let t=n.endsWith("%")?Number(n.slice(0,-1))/100:Number(n);return Number.isFinite(t)&&t>0?t:1}function Ts(e){let n=e.ownerDocument?.defaultView;if(!n)return 1;let t=1;for(let o=e;o;o=o.parentElement)t*=ws(n.getComputedStyle(o).getPropertyValue("zoom"));return Number.isFinite(t)&&t>0?t:1}function qt(e,n){return n===1?e:e*n}function _s(e,n){Math.abs(n-1)<1e-6?e.style.removeProperty("zoom"):e.style.setProperty("zoom",String(1/n))}var ks=.1;function Rs(e){if(e.vertices.length<3)return null;let n=e.vertices[0],t=0,o=0,r=0;for(let d=1;d+1<e.vertices.length;d++){let f=e.vertices[d],g=e.vertices[d+1],m=f[1]-n[1],h=f[0]-n[0],y=f[2]-n[2],v=g[1]-n[1],E=g[0]-n[0],A=g[2]-n[2];t-=h*A-y*E,o-=y*v-m*A,r-=m*E-h*v}let s=Math.hypot(t,o,r);if(s<1e-9)return null;t/=s,o/=s,r/=s;let i=1/ks,a=Math.round(t*i)/i,l=Math.round(o*i)/i,u=Math.round(r*i)/i,p=Math.hypot(a,l,u);return p<1e-9?null:{key:a+","+l+","+u,vec:[a/p,l/p,u/p]}}function Qt(e,n={}){if(!e||typeof e.appendChild!="function")throw new Error("createPolyScene: host must be an HTMLElement");e.ownerDocument&&jt(e.ownerDocument),e.ownerDocument?.defaultView&&e.ownerDocument.defaultView.getComputedStyle(e).position==="static"&&(e.style.position="relative");let t={...n},o=Ts(e),r=[0,0,0],s=e.ownerDocument??document,i=s.createElement("div");i.className="polycss-scene",i.setAttribute("aria-hidden","true"),l(i,t),e.appendChild(i);let a=new Set;function l(c,b){_s(c,o),c.style.transform=Ls(b,r,o),typeof b.perspective=="number"?c.style.perspective=`${qt(b.perspective,o)}px`:b.perspective===!1?c.style.perspective=`${qt(1e6,o)}px`:Math.abs(o-1)<1e-6?c.style.removeProperty("perspective"):c.style.perspective=`${qt(As,o)}px`,u(c,b)}function u(c,b){let R=b.textureLighting==="dynamic";c.dataset.polycssLighting=b.textureLighting??"baked";let _=["--plx","--ply","--plz","--plr","--plg","--plb","--pli","--par","--pag","--pab","--pai","--clx","--cly","--clz"];if(!R){for(let oe of _)c.style.removeProperty(oe);return}let V=b.directionalLight?.direction??[.4,-.7,.59],D=Math.hypot(V[0],V[1],V[2])||1,Y=V[0]/D,L=V[1]/D,N=V[2]/D,z=Zt(b.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],G=Zt(b.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],K=b.directionalLight?.intensity??1,T=b.ambientLight?.intensity??.4,Q=oe=>(oe/255).toFixed(4);c.style.setProperty("--plx",Y.toFixed(4)),c.style.setProperty("--ply",L.toFixed(4)),c.style.setProperty("--plz",N.toFixed(4)),c.style.setProperty("--plr",Q(z[0])),c.style.setProperty("--plg",Q(z[1])),c.style.setProperty("--plb",Q(z[2])),c.style.setProperty("--pli",K.toFixed(4)),c.style.setProperty("--par",Q(G[0])),c.style.setProperty("--pag",Q(G[1])),c.style.setProperty("--pab",Q(G[2])),c.style.setProperty("--pai",T.toFixed(4));let H=N,q=Math.sign(H||1)*Math.max(Math.abs(H),.01);c.style.setProperty("--clx",Y.toFixed(4)),c.style.setProperty("--cly",L.toFixed(4)),c.style.setProperty("--clz",q.toFixed(4))}function p(c){c.voxelRenderer?.dispose(),c.voxelRenderer=void 0,h(c.rendered,c.disposeAtlas),c.disposeAtlas=void 0,c.rendered.length=0,c.cameraCullGroups.length=0,c.cameraCullSignature="",m(c);for(let b of Array.from(c.wrapper.children))b instanceof HTMLElement&&b.classList.contains("polycss-bucket")&&b.remove()}function d(c){for(let b of Array.from(c.wrapper.childNodes)){if(!(b instanceof HTMLElement))return b;if(b.classList.contains("polycss-bucket")||b.classList.contains("polycss-shadow"))continue;let R=b.tagName.toLowerCase();if(!(R==="b"||R==="i"||R==="s"||R==="u"||R==="q"))return b}return null}function f(c,b,R){R?.parentNode===c.wrapper?c.wrapper.insertBefore(b,R):c.wrapper.appendChild(b)}function g(c){return Array.from(c.children).some(b=>b instanceof HTMLElement&&b.classList.contains("polycss-bucket"))}function m(c){for(let b of c.shadowRendered)b.parentNode&&b.parentNode.removeChild(b);c.shadowRendered.length=0}function h(c,b){b?.();for(let R of c){try{R.dispose()}catch{}R.element.parentNode&&R.element.parentNode.removeChild(R.element)}}function y(c){for(let b of Array.from(c.wrapper.children))b instanceof HTMLElement&&b.classList.contains("polycss-bucket")&&b.remove();for(let b of c.rendered)b.element.parentNode&&b.element.parentNode.removeChild(b.element)}function v(c,b){let R=c.polygons[b.polygonIndex];return c.stableDom&&R?mo(R):b.plan?.normal??(R?mo(R):null)}function E(c){if(!M(c))return c.rendered;let b=A(c);return c.rendered.filter(R=>x(c,R,Wt,b))}function A(c){return{rotX:t.rotX??lt,rotY:t.rotY??ct,meshRotation:c.handle.transform.rotation}}function x(c,b,R=Wt,_=A(c)){let V=v(c,b);return V===null||Es(V,_,R)}function C(c){c.cameraCullGroups=gs(c.rendered.map(b=>v(c,b)))}function O(c){return M(c)?ys(c.cameraCullGroups,A(c)):"all"}function M(c){return!c.excludeFromAutoCenter&&vs(c.cameraCullGroups)}function P(c){c.cameraCullSignature=M(c)?O(c):"all"}function X(c,b){let R=new Array(c.rendered.length),_=!1,V=A(c);for(let K=0;K<c.rendered.length;K+=1){let T=c.rendered[K],Q=x(c,T,b,V);R[K]=Q}let D=null,Y=null,L=()=>{if(!(!D||!Y)){if(D===Y)D.remove();else{let K=s.createRange();K.setStartBefore(D),K.setEndAfter(Y),K.deleteContents(),K.detach()}D=null,Y=null,_=!0}};for(let K=0;K<c.rendered.length;K+=1){let T=c.rendered[K];!R[K]&&T.element.parentNode===c.wrapper?(Y&&Y.nextSibling===T.element||(L(),D=T.element),Y=T.element):L()}L();let N=K=>{for(let T=K;T<c.rendered.length;T+=1){let Q=c.rendered[T].element;if(Q.parentNode===c.wrapper)return Q}return d(c)},z=-1,G=K=>{if(z<0)return;let T=s.createDocumentFragment();for(let Q=z;Q<K;Q+=1){let H=c.rendered[Q];S(c,H),T.appendChild(H.element)}f(c,T,N(K)),z=-1,_=!0};for(let K=0;K<c.rendered.length;K+=1){let T=c.rendered[K];R[K]&&T.element.parentNode!==c.wrapper?z<0&&(z=K):G(K)}return G(c.rendered.length),_}function $(c,b=!1){if(c.voxelRenderer){c.voxelRenderer.syncCamera(A(c)),c.cameraCullSignature="voxel-direct";return}if(!M(c)){let V=c.cameraCullSignature!=="all";c.cameraCullSignature="all",V&&ae(c);return}if(g(c.wrapper)){W(c,b);return}let R=O(c);if(!b&&R===c.cameraCullSignature)return;let _=X(c,Wt);c.cameraCullSignature=R,_&&J(c)}function W(c,b=!1){let R=M(c)?O(c):"all";!b&&R===c.cameraCullSignature||ae(c)}function te(c,b){return v(c,b)}function S(c,b){if(t.textureLighting!=="dynamic")return;let R=te(c,b);R&&(b.element.style.setProperty("--pnx",R[0].toFixed(4)),b.element.style.setProperty("--pny",R[1].toFixed(4)),b.element.style.setProperty("--pnz",R[2].toFixed(4)))}function U(c){y(c);let b=s.createDocumentFragment(),R=t.textureLighting==="dynamic"&&!c.stableDom,_=new Map,V=[];for(let D of E(c)){let Y=c.polygons[D.polygonIndex],L=R&&Y?Rs(Y):null;if(!L){V.push(D);continue}let N=L.key+"|"+(Y.color??""),z=_.get(N);z||(z={vec:L.vec,items:[]},_.set(N,z)),z.items.push(D)}for(let D of V)S(c,D),b.appendChild(D.element);for(let D of _.values()){if(D.items.length<2){for(let L of D.items)S(c,L),b.appendChild(L.element);continue}let Y=s.createElement("div");Y.className="polycss-bucket",Y.style.setProperty("--pnx",String(D.vec[0])),Y.style.setProperty("--pny",String(D.vec[1])),Y.style.setProperty("--pnz",String(D.vec[2]));for(let L of D.items)Y.appendChild(L.element),L.element.style.removeProperty("--pnx"),L.element.style.removeProperty("--pny"),L.element.style.removeProperty("--pnz");b.appendChild(Y)}f(c,b,d(c)),P(c)}function w(){return new Promise(c=>setTimeout(c,0))}async function I(c,b){if(t.textureLighting==="dynamic"&&!c.stableDom)return U(c),!b();y(c);let _=s.createDocumentFragment(),V=d(c),D=0;for(let Y of E(c)){if(b())return!1;S(c,Y),_.appendChild(Y.element),D++,D%Cs===0&&(f(c,_,V),_=s.createDocumentFragment(),await w())}return _.childNodes.length>0&&f(c,_,V),P(c),!b()}function F(c,b){let R=t.textureLighting==="dynamic",_=t.directionalLight?.direction,V=b&&(b[0]!==0||b[1]!==0||b[2]!==0);if(!R||!V||!_){if(c.lightOverrideSignature==="clear")return;c.wrapper.style.removeProperty("--plx"),c.wrapper.style.removeProperty("--ply"),c.wrapper.style.removeProperty("--plz"),c.lightOverrideSignature="clear";return}let D=uo(_,b),Y=Math.hypot(D[0],D[1],D[2])||1,L=(D[0]/Y).toFixed(4),N=(D[1]/Y).toFixed(4),z=(D[2]/Y).toFixed(4),G=`${L}|${N}|${z}`;c.lightOverrideSignature!==G&&(c.wrapper.style.setProperty("--plx",L),c.wrapper.style.setProperty("--ply",N),c.wrapper.style.setProperty("--plz",z),c.lightOverrideSignature=G)}function B(c,b){b.paintColor?c.style.setProperty("--polycss-paint",b.paintColor):c.style.removeProperty("--polycss-paint"),b.dynamicColor?(c.style.setProperty("--psr",(b.dynamicColor.r/255).toFixed(4)),c.style.setProperty("--psg",(b.dynamicColor.g/255).toFixed(4)),c.style.setProperty("--psb",(b.dynamicColor.b/255).toFixed(4))):(c.style.removeProperty("--psr"),c.style.removeProperty("--psg"),c.style.removeProperty("--psb"))}function J(c){if(m(c),!c.castShadow||t.textureLighting!=="dynamic")return;let b=t.shadow?.color??"#000000",R=t.shadow?.opacity??.25,_=Zt(b)?.rgb??[0,0,0],V=_[0],D=_[1],Y=_[2],L=`rgba(${V},${D},${Y},${R})`,N=xs(c.polygons,{normalTolerance:.1,distanceTolerance:.5,overlapFraction:.4}),z=s.createDocumentFragment();for(let K of E(c)){if(N.has(K.polygonIndex))continue;let T=K.plan;if(!T)continue;let Q=`matrix3d(${T.matrix})`,H=s.createElement("q");H.className="polycss-shadow",H.style.transform=`var(--shadow-proj) ${Q}`,H.style.color=L,H.style.width=`${T.canvasW}px`,H.style.height=`${T.canvasH}px`,H.style.setProperty("border-shape",qn(T)),H.style.setProperty("--pnx",T.normal[0].toFixed(4)),H.style.setProperty("--pny",T.normal[1].toFixed(4)),H.style.setProperty("--pnz",T.normal[2].toFixed(4)),z.appendChild(H),c.shadowRendered.push(H)}let G=c.wrapper.firstChild;G?c.wrapper.insertBefore(z,G):c.wrapper.appendChild(z)}function ae(c){if(c.voxelRenderer){c.voxelRenderer.render(A(c)),c.cameraCullSignature="voxel-direct";return}m(c),U(c),J(c)}function k(c){return!!c.voxelSource&&t.textureLighting!=="dynamic"&&!c.stableDom&&!c.castShadow}function j(c,b){p(c);let R=t.directionalLight,_=b?{...R,direction:b}:R;if(k(c)){let N=lo({doc:s,wrapper:c.wrapper,polygons:c.parseResult.polygons,directionalLight:_,ambientLight:t.ambientLight});if(N){c.voxelRenderer=N,N.render(A(c)),c.cameraCullSignature="voxel-direct";return}}let V={doc:s,directionalLight:_,ambientLight:t.ambientLight,textureLighting:t.textureLighting,textureQuality:t.textureQuality,strategies:t.strategies},D=at(c.polygons,V);B(c.wrapper,D);let Y={...V,solidPaintDefaults:D},L=(c.stableDom?$t(c.polygons,Y):null)??to(c.polygons,Y);c.rendered=L.rendered,c.disposeAtlas=L.dispose,C(c),U(c),J(c)}function Z(){if(t.textureLighting!=="dynamic"){i.style.removeProperty("--shadow-ground-cssz");return}let c=1/0;for(let _ of a)if(!_.disposed&&_.castShadow)for(let V of _.polygons)for(let D of V.vertices)D[2]<c&&(c=D[2]);if(!Number.isFinite(c)){i.style.removeProperty("--shadow-ground-cssz");return}let b=t.shadow?.lift??.05,R=(c+b)*_e;i.style.setProperty("--shadow-ground-cssz",R.toFixed(3))}async function re(c,b){p(c);let R={doc:s,directionalLight:t.directionalLight,ambientLight:t.ambientLight,textureLighting:t.textureLighting,textureQuality:t.textureQuality,strategies:t.strategies},_=c.stableDom?$t(c.polygons,R):null;if(_){let Y=at(c.polygons,R);return B(c.wrapper,Y),c.rendered=_.rendered,c.disposeAtlas=_.dispose,C(c),U(c),J(c),!b()}let V=await no(c.polygons,R,b);if(b())return V.dispose(),!1;B(c.wrapper,V.solidPaintDefaults),c.rendered=V.rendered,c.disposeAtlas=V.dispose,C(c);let D=await I(c,b);return D&&J(c),D}function ne(){let c=r,b=[0,0,0];if(t.autoCenter){let R=[];for(let _ of a)!_.disposed&&!_.excludeFromAutoCenter&&R.push(..._.polygons);if(R.length>0){let _=bs(R);b=[(_.min[0]+_.max[0])/2,(_.min[1]+_.max[1])/2,(_.min[2]+_.max[2])/2]}}c[0]===b[0]&&c[1]===b[1]&&c[2]===b[2]||(r=b,l(i,t))}function ce(c,b={}){let _=(i.ownerDocument??document).createElement("div");_.className="polycss-mesh",b.id&&_.setAttribute("data-poly-mesh-id",b.id);let V={...b},D=b.merge!==!1,Y=!!b.stableDom,L=0,N=po(V);N&&(_.style.transform=N);let z=(H,q)=>q?Ps(H):H,G=z(c.polygons,D);function K(H){if(H.length===0){_.style.removeProperty("--origin");return}let q=1/0,oe=1/0,ge=1/0,Pe=-1/0,Re=-1/0,Xe=-1/0;for(let _o of H)for(let be of _o.vertices)be[0]<q&&(q=be[0]),be[0]>Pe&&(Pe=be[0]),be[1]<oe&&(oe=be[1]),be[1]>Re&&(Re=be[1]),be[2]<ge&&(ge=be[2]),be[2]>Xe&&(Xe=be[2]);if(!Number.isFinite(q)){_.style.removeProperty("--origin");return}let Et=(oe+Re)/2*_e,Qe=(q+Pe)/2*_e,Ke=(ge+Xe)/2*_e;_.style.setProperty("--origin",`${Et}px ${Qe}px ${Ke}px`)}K(G),i.appendChild(_);let T={handle:void 0,wrapper:_,parseResult:c,rendered:[],shadowRendered:[],polygons:G,voxelSource:c.voxelSource,disposed:!1,stableDom:Y,excludeFromAutoCenter:!!b.excludeFromAutoCenter,castShadow:!!b.castShadow,cameraCullGroups:[],cameraCullSignature:"",lightOverrideSignature:"clear",bakedRotation:b.rotation?[...b.rotation]:[0,0,0]},Q={polygons:G,element:_,id:b.id,get transform(){return V},remove(){L++,_.parentNode&&_.parentNode.removeChild(_),p(T),a.delete(T),ne(),Z()},setPolygons(H,q){L++,D=q?.merge??D,Y=q?.stableDom??Y,T.stableDom=Y,T.voxelSource=void 0,T.polygons=z(H,D),Q.polygons=T.polygons,K(T.polygons);let oe=q?.recomputeAutoCenter??!0;if(T.stableDom&&!g(T.wrapper)){let ge={doc:s,directionalLight:t.directionalLight,ambientLight:t.ambientLight,textureLighting:t.textureLighting,textureQuality:t.textureQuality},Pe=at(T.polygons,ge);if(B(T.wrapper,Pe),ro(T.rendered,T.polygons,{...ge,solidPaintDefaults:Pe})){C(T),$(T,!0),oe&&ne();return}}j(T),oe&&ne()},updatePolygon(H,q){let oe=typeof H=="number"?H:T.polygons.indexOf(H);oe<0||oe>=T.polygons.length||(T.voxelSource=void 0,Object.assign(T.polygons[oe],q),j(T))},async setPolygonsChunked(H,q){let oe=++L;D=q?.merge??D,Y=q?.stableDom??Y,T.stableDom=Y,T.voxelSource=void 0,T.polygons=z(H,D),Q.polygons=T.polygons,K(T.polygons);let ge=q?.recomputeAutoCenter??!0;if(!await re(T,()=>T.disposed||oe!==L)){p(T);return}ge&&ne()},setTransform(H){let q=T.castShadow;H.castShadow!==void 0&&(T.castShadow=!!H.castShadow),V={...V,...H};let oe=po(V);_.style.transform=oe??"",F(T,V.rotation),H.rotation!==void 0&&$(T),T.castShadow!==q&&(J(T),Z())},dispose(){if(!T.disposed){T.disposed=!0,L++,_.parentNode&&_.parentNode.removeChild(_),p(T);try{c.dispose()}catch{}a.delete(T),ne(),Z()}},rebakeAtlas(){T.bakedRotation=V.rotation?[...V.rotation]:[0,0,0];let H=t.directionalLight?.direction??[.4,-.7,.59],q=uo(H,T.bakedRotation);j(T,q)},getPosition(){return V.position},getRotation(){return V.rotation},getScale(){return V.scale},getPolygons(){return Q.polygons}};return T.handle=Q,a.add(T),j(T),F(T,V.rotation),ne(),Z(),Q}function me(c){let b=!!t.autoCenter,R=t.strategies,_=t.textureLighting,V=t.rotX??lt,D=t.rotY??ct;t={...t,...c},l(i,t);let Y=!!t.autoCenter;for(let G of a)F(G,G.handle.transform.rotation);let L=c.strategies!==void 0&&!Ss(c.strategies,R);if(L)for(let G of a)j(G);let N=c.rotX!==void 0&&(t.rotX??lt)!==V||c.rotY!==void 0&&(t.rotY??ct)!==D;if(!L&&N)for(let G of a)$(G);if(b!==Y&&ne(),c.textureLighting!==void 0&&_!==t.textureLighting){for(let G of a)!L&&(G.voxelSource||G.voxelRenderer)?j(G):J(G);Z()}}function ue(){return t}function le(){let c=[];for(let b of a)c.push(b.handle);return c}function fe(c){let b=c;for(;b;){if(b instanceof HTMLElement&&b.classList.contains("polycss-mesh")){for(let R of a)if(R.wrapper===b)return R.handle;return null}b=b.parentElement}return null}function he(){let c=Array.from(a);for(let b of c)try{b.handle.dispose()}catch{}i.parentNode&&i.parentNode.removeChild(i)}return{add:ce,setOptions:me,destroy:he,host:e,getOptions:ue,meshes:le,findMeshByElement:fe}}import{createIsometricCamera as fo}from"@layoutit/polycss-core";var Os=8e3;function ut(e={}){let n={};e.zoom!==void 0&&(n.zoom=e.zoom),e.target!==void 0&&(n.target=e.target),e.rotX!==void 0&&(n.rotX=e.rotX),e.rotY!==void 0&&(n.rotY=e.rotY),e.distance!==void 0&&(n.distance=e.distance);let t=fo(n),o=`${e.perspective??Os}px`;return{get state(){return t.state},update(r){t.update(r)},getStyle(r){return t.getStyle(r)},type:"perspective",perspectiveStyle:o}}function Kt(e={}){let n={};e.zoom!==void 0&&(n.zoom=e.zoom),e.target!==void 0&&(n.target=e.target),e.rotX!==void 0&&(n.rotX=e.rotX),e.rotY!==void 0&&(n.rotY=e.rotY),e.distance!==void 0&&(n.distance=e.distance);let t=fo(n);return{get state(){return t.state},update(o){t.update(o)},getStyle(o){return t.getStyle(o)},type:"orthographic",perspectiveStyle:"none"}}import{BASE_TILE as Ds}from"@layoutit/polycss-core";var dt={drag:!0,wheel:!0,dolly:!1,invert:!1,minZoom:.1,maxZoom:10,minDistance:0,maxDistance:1/0,animate:!1};function ze(e,n){let t;return n.animate===!1?t=!1:n.animate?t={speed:n.animate.speed??.3,axis:n.animate.axis??"y",pauseOnInteraction:n.animate.pauseOnInteraction??!0}:t=e.animate,{drag:n.drag??e.drag,wheel:n.wheel??e.wheel,dolly:n.dolly??e.dolly,invert:n.invert??e.invert,minZoom:n.minZoom??e.minZoom,maxZoom:n.maxZoom??e.maxZoom,minDistance:n.minDistance??e.minDistance,maxDistance:n.maxDistance??e.maxDistance,animate:t}}function je(e){return e===!0?-1:e===!1?1:e}function Be(){let e=[],n=[],t=[];function o(i){return i==="change"?e:i==="start"?n:t}function r(i){if(e.length===0)return;let a={type:"change",camera:i()},l=e.slice();for(let u of l)try{u(a)}catch(p){console.error("[polycss] controls 'change' listener threw:",p)}}function s(i,a){let l=i==="start"?n:t;if(l.length===0)return;let u={type:i,camera:a()},p=l.slice();for(let d of p)try{d(u)}catch(f){console.error(`[polycss] controls '${i}' listener threw:`,f)}}return{changeListeners:e,startListeners:n,endListeners:t,listenerArray:o,emitChange:r,emitInteraction:s}}function Ne(e){return()=>{let n=e.getOptions(),t=n.target??[0,0,0];return{rotX:n.rotX??0,rotY:n.rotY??0,zoom:n.zoom??1,target:[t[0],t[1],t[2]],distance:n.distance??0}}}function mt(e,n,t,o,r,s){let i=!1,a=null;return{onWheel:p=>{let d=n();if(!d.wheel||t())return;p.preventDefault();let f=p.deltaMode===1?16:p.deltaMode===2?100:1,g=p.deltaY*f;p.ctrlKey?g*=10:g*=3;let m=e.getOptions();if(d.dolly){let h=m.distance??0,y=Math.max(d.minDistance,Math.min(d.maxDistance,h+g*.05));e.setOptions({distance:y})}else{let h=Math.exp(-g*513e-6),y=m.zoom??1,v=Math.max(d.minZoom,Math.min(d.maxZoom,y*h));e.setOptions({zoom:v})}i||(i=!0,s("start",o)),r(o),a!==null&&clearTimeout(a),a=setTimeout(()=>{a=null,i=!1,s("end",o)},150)},teardown:()=>{a!==null&&(clearTimeout(a),a=null),i=!1}}}function pt(e,n,t,o,r,s,i){let a=null,l=0,u=g=>{if(a===null||o())return;let m=t();if(!m.animate){a=null;return}if(r())l=g;else{let h=Math.min(50,l?g-l:16.67);l=g;let y=m.animate.speed*(h/16.67),v=n.getOptions();if(m.animate.axis==="x"){let E=(((v.rotX??65)+y)%360+360)%360;n.setOptions({rotX:E})}else{let E=(((v.rotY??45)+y)%360+360)%360;n.setOptions({rotY:E})}i(s)}a=e.requestAnimationFrame(u)};return{start:()=>{a!==null||!t().animate||o()||(l=0,a=e.requestAnimationFrame(u))},stop:()=>{a!==null&&(e.cancelAnimationFrame(a),a=null)},isRunning:()=>a!==null}}function Jt(e,n={}){let t=ze(dt,n),o=e.host,r=o.ownerDocument?.defaultView??globalThis,s=null,i={x:0,y:0},a=!1,l=!1,u=Be(),p=Ne(e),{changeListeners:d,startListeners:f,endListeners:g,listenerArray:m,emitChange:h,emitInteraction:y}=u,v=pt(r,e,()=>t,()=>l,()=>a,p,h),E=w=>{if(!(!t.drag||l)&&s===null&&w.isPrimary!==!1){w.preventDefault(),s=w.pointerId,i={x:w.clientX,y:w.clientY},o.style.cursor="grabbing";try{w.target.setPointerCapture(w.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(a=!0),y("start",p)}},A=w=>{if(s===null||w.pointerId!==s||!t.drag||l)return;w.preventDefault();let I=w.clientX-i.x,F=w.clientY-i.y;i={x:w.clientX,y:w.clientY};let B=je(t.invert),J=I/4*B,ae=F/4*B,k=e.getOptions();if(w.shiftKey){let j=k.rotX??65,Z=k.rotY??45,re=Math.max(.01,k.zoom??1),ne=Math.cos(j*Math.PI/180),ce=ne>=0?Math.max(.1,ne):Math.min(-.1,ne),me=Math.cos(Z*Math.PI/180),ue=Math.sin(Z*Math.PI/180),le=re*Ds,fe=(I*ue-F*me/ce)/le,he=-(I*me+F*ue/ce)/le,c=k.target??[0,0,0];e.setOptions({target:[c[0]+fe,c[1]+he,c[2]]})}else{let j=Math.max(0,Math.min(100,(k.rotX??65)-ae)),Z=(((k.rotY??45)-J)%360+360)%360;e.setOptions({rotX:j,rotY:Z})}h(p)},x=w=>{if(s===w.pointerId){s=null,o.style.cursor=t.drag&&!l?"grab":"";try{w.target.releasePointerCapture(w.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(a=!1),y("end",p)}},C=mt(e,()=>t,()=>l,p,h,y);function O(){o.addEventListener("pointerdown",E),o.addEventListener("pointermove",A),o.addEventListener("pointerup",x),o.addEventListener("pointercancel",x),o.addEventListener("wheel",C.onWheel,{passive:!1}),o.style.cursor=t.drag?"grab":"",o.style.touchAction="none",o.style.userSelect="none"}function M(){o.removeEventListener("pointerdown",E),o.removeEventListener("pointermove",A),o.removeEventListener("pointerup",x),o.removeEventListener("pointercancel",x),o.removeEventListener("wheel",C.onWheel),o.style.cursor="",o.style.touchAction="",o.style.userSelect="",C.teardown()}O(),v.start();function P(w){let I=!!t.animate;t=ze(t,w),!l&&s===null&&(o.style.cursor=t.drag?"grab":"");let F=!!t.animate;I&&!F?v.stop():!I&&F&&v.start()}function X(){l&&(l=!1,O(),v.start())}function $(){l||(l=!0,M(),v.stop(),s=null,a=!1,C.teardown())}function W(){$(),d.length=0,f.length=0,g.length=0}function te(w,I){let F=m(w);F.includes(I)||F.push(I)}function S(w,I){let F=m(w),B=F.indexOf(I);B>=0&&F.splice(B,1)}function U(w,I){return m(w).includes(I)}return{update:P,resume:X,pause:$,destroy:W,addEventListener:te,removeEventListener:S,hasEventListener:U}}import{BASE_TILE as Hs}from"@layoutit/polycss-core";function en(e,n={}){let t=ze(dt,n),o=e.host,r=o.ownerDocument?.defaultView??globalThis,s=null,i={x:0,y:0},a=!1,l=!1,u=!1,p={x:0,y:0},d=Be(),f=Ne(e),{changeListeners:g,startListeners:m,endListeners:h,listenerArray:y,emitChange:v,emitInteraction:E}=d,A=pt(r,e,()=>t,()=>l,()=>a,f,v),x=k=>{if(!(!t.drag||l)&&s===null&&k.isPrimary!==!1){k.preventDefault(),s=k.pointerId,i={x:k.clientX,y:k.clientY},o.style.cursor="grabbing";try{k.target.setPointerCapture(k.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(a=!0),E("start",f)}},C=k=>{if(s===null||k.pointerId!==s||!t.drag||l)return;k.preventDefault();let j=k.clientX-i.x,Z=k.clientY-i.y;i={x:k.clientX,y:k.clientY};let re=e.getOptions();if(k.shiftKey){let ne=je(t.invert),ce=j/4*ne,me=Z/4*ne,ue=Math.max(0,Math.min(100,(re.rotX??65)-me)),le=(((re.rotY??45)-ce)%360+360)%360;e.setOptions({rotX:ue,rotY:le})}else{let ne=re.rotX??65,ce=re.rotY??45,me=Math.max(.01,re.zoom??1),ue=Math.cos(ne*Math.PI/180),le=ue>=0?Math.max(.1,ue):Math.min(-.1,ue),fe=Math.cos(ce*Math.PI/180),he=Math.sin(ce*Math.PI/180),c=me*Hs,b=(j*he-Z*fe/le)/c,R=-(j*fe+Z*he/le)/c,_=re.target??[0,0,0];e.setOptions({target:[_[0]+b,_[1]+R,_[2]]})}v(f)},O=k=>{if(s===k.pointerId){s=null,o.style.cursor=t.drag&&!l?"grab":"";try{k.target.releasePointerCapture(k.pointerId)}catch{}t.animate&&t.animate.pauseOnInteraction&&(a=!1),E("end",f)}},M=k=>{k.preventDefault()},P=k=>{k.button===2&&(u=!0,p={x:k.clientX,y:k.clientY},t.animate&&t.animate.pauseOnInteraction&&(a=!0),E("start",f))},X=k=>{if(!u||!t.drag)return;let j=k.clientX-p.x,Z=k.clientY-p.y;p={x:k.clientX,y:k.clientY};let re=je(t.invert),ne=j/4*re,ce=Z/4*re,me=e.getOptions(),ue=Math.max(0,Math.min(100,(me.rotX??65)-ce)),le=(((me.rotY??45)-ne)%360+360)%360;e.setOptions({rotX:ue,rotY:le}),v(f)},$=k=>{k.button===2&&u&&(u=!1,E("end",f))},W=mt(e,()=>t,()=>l,f,v,E);function te(){o.addEventListener("pointerdown",x),o.addEventListener("pointermove",C),o.addEventListener("pointerup",O),o.addEventListener("pointercancel",O),o.addEventListener("wheel",W.onWheel,{passive:!1}),o.addEventListener("contextmenu",M),o.addEventListener("mousedown",P),o.addEventListener("mousemove",X),o.addEventListener("mouseup",$),o.style.cursor=t.drag?"grab":"",o.style.touchAction="none",o.style.userSelect="none"}function S(){o.removeEventListener("pointerdown",x),o.removeEventListener("pointermove",C),o.removeEventListener("pointerup",O),o.removeEventListener("pointercancel",O),o.removeEventListener("wheel",W.onWheel),o.removeEventListener("contextmenu",M),o.removeEventListener("mousedown",P),o.removeEventListener("mousemove",X),o.removeEventListener("mouseup",$),o.style.cursor="",o.style.touchAction="",o.style.userSelect="",W.teardown()}te(),A.start();function U(k){let j=!!t.animate;t=ze(t,k),!l&&s===null&&(o.style.cursor=t.drag?"grab":"");let Z=!!t.animate;j&&!Z?A.stop():!j&&Z&&A.start()}function w(){l&&(l=!1,te(),A.start())}function I(){l||(l=!0,S(),A.stop(),s=null,a=!1,u=!1,W.teardown())}function F(){I(),g.length=0,m.length=0,h.length=0}function B(k,j){let Z=y(k);Z.includes(j)||Z.push(j)}function J(k,j){let Z=y(k),re=Z.indexOf(j);re>=0&&Z.splice(re,1)}function ae(k,j){return y(k).includes(j)}return{update:U,resume:w,pause:I,destroy:F,addEventListener:B,removeEventListener:J,hasEventListener:ae}}import{BASE_TILE as Is}from"@layoutit/polycss-core";var Vs={enabled:!0,lookEnabled:!0,moveEnabled:!0,jumpEnabled:!0,crouchEnabled:!0,lookSensitivity:.15,invertY:!1,moveSpeed:5,jumpVelocity:7,gravity:18,eyeHeight:1.7,crouchHeight:1,groundZ:0,minPitch:5,maxPitch:175};function ho(e,n){return{enabled:n.enabled??e.enabled,lookEnabled:n.lookEnabled??e.lookEnabled,moveEnabled:n.moveEnabled??e.moveEnabled,jumpEnabled:n.jumpEnabled??e.jumpEnabled,crouchEnabled:n.crouchEnabled??e.crouchEnabled,lookSensitivity:n.lookSensitivity??e.lookSensitivity,invertY:n.invertY??e.invertY,moveSpeed:n.moveSpeed??e.moveSpeed,jumpVelocity:n.jumpVelocity??e.jumpVelocity,gravity:n.gravity??e.gravity,eyeHeight:n.eyeHeight??e.eyeHeight,crouchHeight:n.crouchHeight??e.crouchHeight,groundZ:n.groundZ??e.groundZ,minPitch:n.minPitch??e.minPitch,maxPitch:n.maxPitch??e.maxPitch}}var go=new Set(["KeyW","ArrowUp"]),yo=new Set(["KeyS","ArrowDown"]),bo=new Set(["KeyA","ArrowLeft"]),xo=new Set(["KeyD","ArrowRight"]),vo=new Set(["Space"]),tn=new Set(["ControlLeft","ControlRight"]);function Fs(e,n={}){let t=ho(Vs,n),o=e.host,r=o.ownerDocument??document,s=r.defaultView??globalThis,i=Be(),a=Ne(e),{changeListeners:l,startListeners:u,endListeners:p,listenerArray:d,emitChange:f,emitInteraction:g}=i,m=new Set,h=!1,y=!1,v=0,E=0,A=!1,x=[0,0,t.groundZ+t.eyeHeight];function C(L,N){let z=L*Math.PI/180,G=N*Math.PI/180;return[-Math.sin(z)*Math.cos(G),-Math.sin(z)*Math.sin(G),-Math.cos(z)]}function O(){let L=e.getOptions().perspective;return(typeof L=="number"&&L>0?L:2e3)/Is}function M(){let L=e.getOptions(),N=C(L.rotX??90,L.rotY??0),z=O();return[x[0]+N[0]*z,x[1]+N[1]*z,x[2]+N[2]*z]}function P(){let L=M();e.setOptions({target:L})}function X(){let N=e.getOptions().target??[0,0,0];x=[N[0],N[1],t.groundZ+t.eyeHeight],P()}let $=()=>{if(!(!t.enabled||!t.lookEnabled||y||h))try{o.requestPointerLock()}catch{}},W=()=>{let L=r.pointerLockElement===o;L!==h&&(h=L,h?(A=!0,g("start",a)):A&&(A=!1,g("end",a)))},te=L=>{if(!h||!t.enabled||!t.lookEnabled||y)return;let N=L.movementX??0,z=L.movementY??0;if(N===0&&z===0)return;let G=e.getOptions(),K=t.lookSensitivity,T=t.invertY?-1:1,Q=(((G.rotY??0)-N*K)%360+360)%360,H=(G.rotX??90)-z*K*T;H<t.minPitch?H=t.minPitch:H>t.maxPitch&&(H=t.maxPitch);let q=C(H,Q),oe=O(),ge=[x[0]+q[0]*oe,x[1]+q[1]*oe,x[2]+q[2]*oe];e.setOptions({rotX:H,rotY:Q,target:ge}),f(a)},S=L=>go.has(L)||yo.has(L)||bo.has(L)||xo.has(L)||vo.has(L)||tn.has(L),U=L=>{if(!(!t.enabled||y)&&S(L.code)&&!(!h&&!t.moveEnabled)){if(vo.has(L.code)){if(!t.jumpEnabled)return;L.preventDefault(),!m.has(L.code)&&v===0&&E===0&&(v=t.jumpVelocity),m.add(L.code);return}tn.has(L.code)&&!t.crouchEnabled||!t.moveEnabled&&!tn.has(L.code)||(L.preventDefault(),m.add(L.code))}},w=L=>{S(L.code)&&m.delete(L.code)},I=()=>{m.clear()},F=null,B=0,J=.05,ae=L=>{if(F===null||y)return;let N=Math.min(J,B?(L-B)/1e3:.0167);if(B=L,t.enabled){let z=!1,G=e.getOptions();if(t.moveEnabled){let H=0,q=0;for(let oe of m)go.has(oe)?H+=1:yo.has(oe)?H-=1:xo.has(oe)?q+=1:bo.has(oe)&&(q-=1);if(H!==0||q!==0){let ge=(G.rotY??0)*Math.PI/180,Pe=-Math.cos(ge),Re=-Math.sin(ge),Xe=-Math.sin(ge),Et=Math.cos(ge),Qe=Math.hypot(H,q)||1,Ke=t.moveSpeed*N;x[0]+=(Pe*H+Xe*q)/Qe*Ke,x[1]+=(Re*H+Et*q)/Qe*Ke,z=!0}}let T=t.crouchEnabled&&(m.has("ControlLeft")||m.has("ControlRight"))?t.crouchHeight:t.eyeHeight;t.jumpEnabled&&(v!==0||E>0)?(v-=t.gravity*N,E+=v*N,E<=0&&(E=0,v=0)):t.jumpEnabled||(E=0,v=0);let Q=t.groundZ+T+E;if(Math.abs(x[2]-Q)>1e-4&&(x[2]=Q,z=!0),z){let H=M();e.setOptions({target:H}),f(a)}}F=s.requestAnimationFrame(ae)};function k(){F!==null||y||(B=0,F=s.requestAnimationFrame(ae))}function j(){F!==null&&(s.cancelAnimationFrame(F),F=null)}function Z(){let N=o.ownerDocument?.defaultView?.getComputedStyle(o).perspective??"",z=parseFloat(N),G=Number.isFinite(z)&&z>0?z:2e3;o.style.setProperty("--polycss-fpv-perspective",`${G}px`),o.classList.add("polycss-fpv-host")}function re(){o.classList.remove("polycss-fpv-host"),o.style.removeProperty("--polycss-fpv-perspective")}function ne(){o.addEventListener("click",$),r.addEventListener("pointerlockchange",W),r.addEventListener("mousemove",te),s.addEventListener("keydown",U),s.addEventListener("keyup",w),s.addEventListener("blur",I),o.style.cursor=t.lookEnabled?"crosshair":"",Z()}function ce(){if(o.removeEventListener("click",$),r.removeEventListener("pointerlockchange",W),r.removeEventListener("mousemove",te),s.removeEventListener("keydown",U),s.removeEventListener("keyup",w),s.removeEventListener("blur",I),o.style.cursor="",m.clear(),h)try{r.exitPointerLock()}catch{}re()}X(),ne(),k();function me(L){let N=t.eyeHeight,z=t.groundZ;t=ho(t,L),y||(o.style.cursor=t.lookEnabled?"crosshair":""),(t.eyeHeight!==N||t.groundZ!==z)&&(x[2]=t.groundZ+t.eyeHeight,P(),f(a))}function ue(){y&&(y=!1,ne(),k())}function le(){y||(y=!0,ce(),j(),A&&(A=!1,g("end",a)))}function fe(){le(),l.length=0,u.length=0,p.length=0}function he(){if(!(!t.enabled||!t.lookEnabled||y))try{o.requestPointerLock()}catch{}}function c(){if(h)try{r.exitPointerLock()}catch{}}function b(){return h}function R(L,N){let z=d(L);z.includes(N)||z.push(N)}function _(L,N){let z=d(L),G=z.indexOf(N);G>=0&&z.splice(G,1)}function V(L,N){return d(L).includes(N)}function D(){return[x[0],x[1],x[2]]}function Y(L){x[0]=L[0],x[1]=L[1],x[2]=L[2],P(),f(a)}return{update:me,resume:ue,pause:le,destroy:fe,lock:he,unlock:c,isLocked:b,getOrigin:D,setOrigin:Y,addEventListener:R,removeEventListener:_,hasEventListener:V}}function zs(e,n,t){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let r of o){let s=r.getBoundingClientRect();if(!(s.width<=0||s.height<=0)&&n>=s.left&&n<=s.right&&t>=s.top&&t<=s.bottom)return!0}return!1}function nn(e,n={}){let t=[],o=new Set;n.onChange&&o.add(n.onChange);function r(){t=n.filter?n.filter(t):t;for(let h of o)try{h(t)}catch(y){console.error("[polycss/createSelect] onChange threw:",y)}}function s(m){t=m,r()}function i(m){n.multiple?t.includes(m)||(t=[...t,m]):t=[m],r()}function a(m){t.includes(m)&&(t=t.filter(h=>h!==m),r())}function l(m){t.includes(m)?t=t.filter(h=>h!==m):n.multiple?t=[...t,m]:t=[m],r()}function u(){t.length!==0&&(t=[],r())}function p(m){return t.includes(m)}function d(m,h){for(let y of e.meshes())if(!y.element.classList.contains("polycss-transform-gizmo")&&zs(y.element,m,h))return y;return null}let f=m=>{let h=m.target;if(h?.closest(".polycss-transform-gizmo"))return;let y=e.findMeshByElement(h)??d(m.clientX,m.clientY);if(!y){n.onPointerMissed&&n.onPointerMissed(m),n.clearOnMiss!==!1&&u();return}n.multiple&&(m.shiftKey||m.metaKey||m.ctrlKey)?l(y):t.length===1&&t[0]===y?u():s([y])};e.host.addEventListener("click",f);function g(){e.host.removeEventListener("click",f),o.clear()}return{get selected(){return t},set:s,add:i,remove:a,toggle:l,clear:u,has:p,destroy:g}}import{arrowPolygons as Bs,eulerXYZFromQuat as Ns,planePolygons as Ys,quatFromAxisAngle as Xs,quatFromEulerXYZ as $s,quatMultiply as Us,ringQuadPolygons as Gs}from"@layoutit/polycss-core";var ht="#ff3653",gt="#8adb00",yt="#2c8fff",Ye=50,Po=60,js=.6,Ws=.0125,Zs=.15,qs=.04,Qs=1,Eo=.02,on=1.04,Ks=.1,Js=.25,So=1e-4,ei=.6,ti=.8,ni=1,We={0:1,1:0,2:2},Co=[{cssAxis:0,sign:1,key:"x",color:ht},{cssAxis:0,sign:-1,key:"-x",color:ht},{cssAxis:1,sign:1,key:"y",color:gt},{cssAxis:1,sign:-1,key:"-y",color:gt},{cssAxis:2,sign:1,key:"z",color:yt},{cssAxis:2,sign:-1,key:"-z",color:yt}],Ao=[{cssAxis:0,key:"x",color:ht},{cssAxis:1,key:"y",color:gt},{cssAxis:2,key:"z",color:yt}],Mo=[{perpAxis:2,axisA:0,axisB:1,key:"xy",color:yt},{perpAxis:1,axisA:0,axisB:2,key:"xz",color:gt},{perpAxis:0,axisA:1,axisB:2,key:"yz",color:ht}];function rn(e,n,t,o){let r=t*Math.PI/180,s=o*Math.PI/180,i=[0,0,0];i[e]=n;let a=i[0]*Math.cos(s)-i[1]*Math.sin(s),l=i[0]*Math.sin(s)+i[1]*Math.cos(s),u=i[2];return l*Math.sin(r)+u*Math.cos(r)<0}function oi(e,n){let t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);if(!t)return e;let o=parseInt(t[1],16),r=parseInt(t[2],16),s=parseInt(t[3],16);return`rgba(${o}, ${r}, ${s}, ${n})`}function bt(e,n){return!n||n<=0?e:Math.round(e/n)*n}function ri(e){if(e.length===0)return[0,0,0];let n=1/0,t=1/0,o=1/0,r=-1/0,s=-1/0,i=-1/0;for(let a of e)for(let l of a.vertices)l[0]<n&&(n=l[0]),l[0]>r&&(r=l[0]),l[1]<t&&(t=l[1]),l[1]>s&&(s=l[1]),l[2]<o&&(o=l[2]),l[2]>i&&(i=l[2]);return Number.isFinite(n)?[(t+s)/2*Ye,(n+r)/2*Ye,(o+i)/2*Ye]:[0,0,0]}function sn(e){if(e.length===0)return Po;let n=1/0,t=1/0,o=1/0,r=-1/0,s=-1/0,i=-1/0;for(let l of e)for(let u of l.vertices)u[0]<n&&(n=u[0]),u[0]>r&&(r=u[0]),u[1]<t&&(t=u[1]),u[1]>s&&(s=u[1]),u[2]<o&&(o=u[2]),u[2]>i&&(i=u[2]);return Number.isFinite(n)?Math.max(r-n,s-t,i-o)*Ye*js:Po}function ft(e,n,t){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let r of o){let s=r.getBoundingClientRect();if(!(s.width<=0||s.height<=0)&&n>=s.left&&n<=s.right&&t>=s.top&&t<=s.bottom)return!0}return!1}function si(e){let{cssAxis:n,sign:t,shaftLengthCss:o,wrapper:r,target:s,startClientX:i,startClientY:a,translationSnap:l,onAxisDelta:u,onMouseDown:p,onMouseUp:d,onDraggingChanged:f}=e,g=o,m=[0,0,0];m[n]=t;let h=r.ownerDocument.createElement("div");h.style.position="absolute",h.style.left="0",h.style.top="0",h.style.width="0",h.style.height="0",h.style.transform=`translate3d(${m[0]*g}px, ${m[1]*g}px, ${m[2]*g}px)`,r.appendChild(h);let y=r.getBoundingClientRect(),v=h.getBoundingClientRect();r.removeChild(h);let E=(v.left-y.left)/g,A=(v.top-y.top)/g,x=E*E+A*A;if(x<So)return;p?.(),f?.(!0);let C=M=>{let P=M.clientX-i,X=M.clientY-a,$=(P*E+X*A)/x;$=bt($,l),u($,m)},O=()=>{window.removeEventListener("pointermove",C),window.removeEventListener("pointerup",O),window.removeEventListener("pointercancel",O);let M=P=>{P.stopPropagation(),P.stopImmediatePropagation()};window.addEventListener("click",M,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",M,!0),0),d?.(),f?.(!1)};window.addEventListener("pointermove",C),window.addEventListener("pointerup",O),window.addEventListener("pointercancel",O)}function ii(e){let{axisA:n,axisB:t,probeDistanceCss:o,wrapper:r,startClientX:s,startClientY:i,translationSnap:a,onPlaneDelta:l,onMouseDown:u,onMouseUp:p,onDraggingChanged:d}=e,f=[0,0,0];f[n]=1;let g=[0,0,0];g[t]=1;function m(x){let C=r.ownerDocument.createElement("div");C.style.position="absolute",C.style.left="0",C.style.top="0",C.style.width="0",C.style.height="0",C.style.transform=`translate3d(${x[0]*o}px, ${x[1]*o}px, ${x[2]*o}px)`,r.appendChild(C);let O=r.getBoundingClientRect(),M=C.getBoundingClientRect();return r.removeChild(C),{x:(M.left-O.left)/o,y:(M.top-O.top)/o}}let h=m(f),y=m(g),v=h.x*y.y-y.x*h.y;if(Math.abs(v)<So)return;u?.(),d?.(!0);let E=x=>{let C=x.clientX-s,O=x.clientY-i,M=(y.y*C-y.x*O)/v,P=(-h.y*C+h.x*O)/v;M=bt(M,a),P=bt(P,a),l(M,P,f,g)},A=()=>{window.removeEventListener("pointermove",E),window.removeEventListener("pointerup",A),window.removeEventListener("pointercancel",A);let x=C=>{C.stopPropagation(),C.stopImmediatePropagation()};window.addEventListener("click",x,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",x,!0),0),p?.(),d?.(!1)};window.addEventListener("pointermove",E),window.addEventListener("pointerup",A),window.addEventListener("pointercancel",A)}function ai(e){let{cssAxis:n,wrapper:t,target:o,startClientX:r,startClientY:s,rotationSnap:i,onAngleDelta:a,onMouseDown:l,onMouseUp:u,onDraggingChanged:p}=e,d=t.getBoundingClientRect(),f=d.left,g=d.top,m=Math.atan2(s-g,r-f),h=0;l?.(),p?.(!0);let y=E=>{let A=Math.atan2(E.clientY-g,E.clientX-f),x=A-m;x>Math.PI?x-=2*Math.PI:x<-Math.PI&&(x+=2*Math.PI),h+=x,m=A;let C=h*180/Math.PI;C=bt(C,i),a(C)},v=()=>{window.removeEventListener("pointermove",y),window.removeEventListener("pointerup",v),window.removeEventListener("pointercancel",v);let E=A=>{A.stopPropagation(),A.stopImmediatePropagation()};window.addEventListener("click",E,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",E,!0),0),u?.(),p?.(!1)};window.addEventListener("pointermove",y),window.addEventListener("pointerup",v),window.addEventListener("pointercancel",v)}function an(e,n={}){let t=null,o=n.mode??"translate",r=n.size??1,s={...n},i=new Map,a=null,l=null,u=[0,0,0];function p(){if(!t)return[0,0,0];let S=t.transform.position??[0,0,0];return[S[0]+u[0],S[1]+u[1],S[2]+u[2]]}function d(S){return l===S?ni:a===S?ti:ei}function f(){for(let[S,U]of i){let w=g(U.spec,d(S));U.handle.setPolygons(w,{recomputeAutoCenter:!1})}}function g(S,U){let I=sn(t?.polygons??[])*r,F=I/Ye,B=oi(S.color,U);if(S.kind==="arrow"){let k=e.getOptions(),j=rn(S.cssAxis,S.sign,k.rotX??65,k.rotY??45);return Bs({axis:We[S.cssAxis],sign:S.sign,shaftLength:F,shaftHalfThickness:F*Ws,headLength:F*Zs,headHalfThickness:F*qs,color:B,shaft:!j})}if(S.kind==="plane"){let k=e.getOptions(),j=k.rotX??65,Z=k.rotY??45,re=We[S.perpAxis],ne=(re+1)%3,ce=(re+2)%3,me=We[ne],ue=We[ce],le=rn(me,1,j,Z)?-1:1,fe=rn(ue,1,j,Z)?-1:1,he=F*Js;return Ys({axis:re,size:F*Ks,offset:[le*he,fe*he],color:B})}let ae=I*Qs/Ye*on;return Gs({axis:We[S.cssAxis],outerRadius:ae,color:B})}function m(S){return S.kind==="arrow"?"polycss-transform-arrow":S.kind==="plane"?"polycss-transform-plane":"polycss-transform-ring"}function h(){if(o==="translate"){let S=Co.map(w=>({kind:"arrow",key:w.key,cssAxis:w.cssAxis,sign:w.sign,color:w.color})),U=Mo.map(w=>({kind:"plane",key:w.key,perpAxis:w.perpAxis,axisA:w.axisA,axisB:w.axisB,color:w.color}));return[...S,...U]}return o==="rotate"?Ao.map(S=>({kind:"ring",key:S.key,cssAxis:S.cssAxis,color:S.color})):[]}function y(){if(v(),!t)return;let S={x:s.showX!==!1,y:s.showY!==!1,z:s.showZ!==!1};function U(I){if(I.kind==="arrow"){let J=I.key.replace("-","")[0];return S[J]}if(I.kind==="ring")return S[I.key];let F=["x","y","z"][I.axisA],B=["x","y","z"][I.axisB];return S[F]&&S[B]}let w=p();for(let I of h()){if(!U(I))continue;let F=g(I,d(I.key)),B=e.add({polygons:F,objectUrls:[],warnings:[],dispose:()=>{}},{excludeFromAutoCenter:!0,id:`__poly-gizmo-${I.key}`,position:w}),J=m(I);if(B.element.classList.add("polycss-transform-gizmo",J,`${J}--${I.key}`),I.kind==="ring"){let ae=(1-Eo)/on,k=(1+Eo)/on;B.element.style.setProperty("--ring-inner-ratio",`${ae}`),B.element.style.setProperty("--ring-outer-ratio",`${k}`)}i.set(I.key,{handle:B,spec:I})}}function v(){for(let{handle:S}of i.values())S.remove();i.clear(),a=null,l=null}function E(){if(!t)return;let S=p();for(let{handle:U}of i.values())U.setTransform({position:S})}function A(){t&&(i.size===0?y():E())}function x(S){if(t=S,!S){u=[0,0,0],v();return}u=ri(S.polygons),v(),y()}function C(){x(null)}function O(S){S!==o&&(o=S,t&&(v(),y()))}function M(S,U,w){if(!t||!P)return;let I=[P[0]+U*w[0],P[1]+U*w[1],P[2]+U*w[2]];t.setTransform({position:I}),E(),s.onObjectChange?.({object:t,position:I}),s.onChange?.()}let P=null,X=null,$=S=>{if(!t||s.enabled===!1)return;let U={x:s.showX!==!1,y:s.showY!==!1,z:s.showZ!==!1};if(o==="translate"){for(let w of Mo){let I=["x","y","z"][w.axisA],F=["x","y","z"][w.axisB];if(!U[I]||!U[F])continue;let B=i.get(w.key);if(B&&ft(B.handle.element,S.clientX,S.clientY)){S.preventDefault(),S.stopPropagation(),l=w.key,f(),P=(t.transform.position??[0,0,0]).slice(),ii({axisA:w.axisA,axisB:w.axisB,probeDistanceCss:sn(t.polygons)*r,wrapper:B.handle.element,target:t,startClientX:S.clientX,startClientY:S.clientY,translationSnap:s.translationSnap??null,onPlaneDelta:(J,ae,k,j)=>{if(!t||!P)return;let Z=[P[0]+J*k[0]+ae*j[0],P[1]+J*k[1]+ae*j[1],P[2]+J*k[2]+ae*j[2]];t.setTransform({position:Z}),E(),s.onObjectChange?.({object:t,position:Z}),s.onChange?.()},onMouseDown:s.onMouseDown,onMouseUp:s.onMouseUp,onDraggingChanged:J=>{J||(l=null,P=null,f()),s.onDraggingChanged?.(J)}});return}}for(let w of Co){let I=w.key.replace("-","")[0];if(!U[I])continue;let F=i.get(w.key);if(F&&ft(F.handle.element,S.clientX,S.clientY)){S.preventDefault(),S.stopPropagation(),l=w.key,f(),P=(t.transform.position??[0,0,0]).slice(),si({cssAxis:w.cssAxis,sign:w.sign,shaftLengthCss:sn(t.polygons)*r,wrapper:F.handle.element,target:t,startClientX:S.clientX,startClientY:S.clientY,translationSnap:s.translationSnap??null,onAxisDelta:(B,J)=>M(w,B,J),onMouseDown:s.onMouseDown,onMouseUp:s.onMouseUp,onDraggingChanged:B=>{B||(l=null,P=null,f()),s.onDraggingChanged?.(B)}});return}}}else if(o==="rotate")for(let w of Ao){if(!U[w.key])continue;let I=i.get(w.key);if(I&&ft(I.handle.element,S.clientX,S.clientY)){S.preventDefault(),S.stopPropagation(),l=w.key,f(),X=(t.transform.rotation??[0,0,0]).slice(),ai({cssAxis:w.cssAxis,wrapper:I.handle.element,target:t,startClientX:S.clientX,startClientY:S.clientY,rotationSnap:s.rotationSnap??null,onAngleDelta:F=>{if(!t||!X)return;let B=w.cssAxis===0?-1:1,J=[0,0,0];J[w.cssAxis]=1;let ae=F*B*Math.PI/180,k=$s(X),j=Xs(J,ae),Z=Ns(Us(j,k));t.setTransform({rotation:Z}),s.onObjectChange?.({object:t,rotation:Z}),s.onChange?.()},onMouseDown:s.onMouseDown,onMouseUp:s.onMouseUp,onDraggingChanged:F=>{F||(l=null,X=null,f(),t?.rebakeAtlas()),s.onDraggingChanged?.(F)}});return}}};e.host.addEventListener("pointerdown",$,{capture:!0});let W=S=>{if(!t||l||s.enabled===!1)return;let U=null;for(let[w,I]of i)if(ft(I.handle.element,S.clientX,S.clientY)){U=w;break}U!==a&&(a=U,f())};e.host.addEventListener("pointermove",W);function te(){e.host.removeEventListener("pointerdown",$,{capture:!0}),e.host.removeEventListener("pointermove",W),v()}return{attach:x,detach:C,setMode:O,update:A,destroy:te}}var li=typeof HTMLElement<"u"?HTMLElement:class{},ci=["perspective","rot-x","rot-y","zoom","directional-direction","directional-color","directional-intensity","ambient-color","ambient-intensity","texture-lighting","texture-quality","auto-center"];function ke(e){if(e==null)return;let n=parseFloat(e);return Number.isFinite(n)?n:void 0}function ui(e){return e==="false"?!1:ke(e)}function di(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function mi(e){if(e==="baked"||e==="dynamic")return e}function pi(e){return e==="auto"?"auto":ke(e)}var xe=class extends li{constructor(){super(...arguments);this._scene=null}static get observedAttributes(){return[...ci]}getScene(){return this._scene}_readOptions(){let t=this._readDirectionalLight(),o=this._readAmbientLight(),r={},s=ui(this.getAttribute("perspective"));s!==void 0&&(r.perspective=s);let i=ke(this.getAttribute("rot-x"));i!==void 0&&(r.rotX=i);let a=ke(this.getAttribute("rot-y"));a!==void 0&&(r.rotY=a);let l=ke(this.getAttribute("zoom"));l!==void 0&&(r.zoom=l),r.textureLighting=mi(this.getAttribute("texture-lighting"))??"baked";let u=pi(this.getAttribute("texture-quality"));return u!==void 0&&(r.textureQuality=u),r.autoCenter=this.hasAttribute("auto-center"),t&&(r.directionalLight=t),o&&(r.ambientLight=o),r}_readDirectionalLight(){let t=di(this.getAttribute("directional-direction")),o=this.getAttribute("directional-color")||void 0,r=ke(this.getAttribute("directional-intensity"));if(!t&&!o&&r===void 0)return;let s={direction:t??[.4,-.7,.59]};return o&&(s.color=o),r!==void 0&&(s.intensity=r),s}_readAmbientLight(){let t=this.getAttribute("ambient-color")||void 0,o=ke(this.getAttribute("ambient-intensity"));if(!t&&o===void 0)return;let r={};return t&&(r.color=t),o!==void 0&&(r.intensity=o),r}connectedCallback(){this._scene||(this._scene=Qt(this,this._readOptions()),this.dispatchEvent(new CustomEvent("polycss:scene-ready",{bubbles:!1})))}disconnectedCallback(){this._scene&&(this._scene.destroy(),this._scene=null)}attributeChangedCallback(t,o,r){o!==r&&this._scene&&this._scene.setOptions(this._readOptions())}};import{computeSceneBbox as fi,loadMesh as hi}from"@layoutit/polycss-core";var gi=typeof HTMLElement<"u"?HTMLElement:class{},yi=["src","mtl","position","scale","rotation","auto-center"];function Ze(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function Lo(e){if(e){if(!e.includes(",")){let n=parseFloat(e);return Number.isFinite(n)?n:void 0}return Ze(e)}}function bi(e){return e.closest("poly-scene")??null}function xi(e){if(e.length===0)return e;let n=fi(e),t=(n.min[0]+n.max[0])/2,o=(n.min[1]+n.max[1])/2,r=(n.min[2]+n.max[2])/2;if(t===0&&o===0&&r===0)return e;let s=i=>[i[0]-t,i[1]-o,i[2]-r];return e.map(i=>({...i,vertices:i.vertices.map(s),...i.textureTriangles?.length?{textureTriangles:i.textureTriangles.map(a=>({...a,vertices:a.vertices.map(s)}))}:null}))}var qe=class extends gi{constructor(){super(...arguments);this._handle=null;this._parseResult=null;this._loadToken=0}static get observedAttributes(){return[...yi]}getMeshHandle(){return this._handle}connectedCallback(){this._maybeLoad()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(t,o,r){if(o!==r){if(t==="src"||t==="mtl"){this._tearDown(),this._maybeLoad();return}this._handle&&this._handle.setTransform({position:Ze(this.getAttribute("position")),scale:Lo(this.getAttribute("scale")),rotation:Ze(this.getAttribute("rotation"))})}}_tearDown(){if(this._loadToken+=1,this._handle){try{this._handle.dispose()}catch{}this._handle=null}this._parseResult=null}async _maybeLoad(){let t=this.getAttribute("src");if(!t)return;let o=bi(this);if(!o)return;let r=++this._loadToken,s=this.getAttribute("mtl")||void 0,i;try{i=await hi(t,s?{mtlUrl:s}:void 0)}catch(u){this.dispatchEvent(new CustomEvent("polycss:error",{detail:u,bubbles:!0}));return}if(r!==this._loadToken){try{i.dispose()}catch{}return}let a=o.getScene();if(!a){try{i.dispose()}catch{}return}this.hasAttribute("auto-center")&&(i={...i,polygons:xi(i.polygons)}),this._parseResult=i,this._handle=a.add(i,{position:Ze(this.getAttribute("position")),scale:Lo(this.getAttribute("scale")),rotation:Ze(this.getAttribute("rotation"))}),this.dispatchEvent(new CustomEvent("polycss:loaded",{detail:{polygons:this._handle.polygons},bubbles:!0}))}};var vi=typeof HTMLElement<"u"?HTMLElement:class{},Pi=["vertices","color","texture","uvs","position","scale","rotation"];function wo(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}function ln(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function Ei(e){if(e){if(!e.includes(",")){let n=parseFloat(e);return Number.isFinite(n)?n:void 0}return ln(e)}}function Ci(e){return e.closest("poly-scene")??null}var cn=class extends vi{constructor(){super(...arguments);this._handle=null}static get observedAttributes(){return[...Pi]}connectedCallback(){this._mount()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(t,o,r){o!==r&&(this._tearDown(),this.isConnected&&this._mount())}_tearDown(){if(this._handle){try{this._handle.dispose()}catch{}this._handle=null}}_mount(){let t=Ci(this);if(!t)return;let o=t.getScene();if(!o)return;let r=wo(this.getAttribute("vertices"));if(!r||!Array.isArray(r)||r.length<3)return;let s=this.getAttribute("color")||void 0,i=this.getAttribute("texture")||void 0,a=wo(this.getAttribute("uvs"))??void 0,l={};for(let d of Array.from(this.attributes))d.name.startsWith("data-")&&(l[d.name.slice(5)]=d.value);let p={polygons:[{vertices:r,...s!==void 0?{color:s}:{},...i!==void 0?{texture:i}:{},...a!==void 0?{uvs:a}:{},...Object.keys(l).length>0?{data:l}:{}}],objectUrls:[],warnings:[],dispose:()=>{}};this._handle=o.add(p,{position:ln(this.getAttribute("position")),scale:Ei(this.getAttribute("scale")),rotation:ln(this.getAttribute("rotation"))})}};function ie(e){if(e==null)return;let n=parseFloat(e);return Number.isFinite(n)?n:void 0}function xt(e){if(!e)return;let n=e.split(",").map(t=>parseFloat(t.trim()));if(!(n.length!==3||n.some(t=>!Number.isFinite(t))))return[n[0],n[1],n[2]]}function Se(e){if(e!==null)return!(e==="false"||e==="0")}function vt(e){if(e===null)return;if(e==="true")return!0;if(e==="false")return!1;let n=parseFloat(e);return Number.isFinite(n)?n:!0}function Pt(e){if(e==="x"||e==="y")return e}var Ai=typeof HTMLElement<"u"?HTMLElement:class{},Mi=["drag","wheel","dolly","min-distance","max-distance","invert","zoom-min","zoom-max","animate-speed","animate-axis","animate-pause-on-interaction"],un=class extends Ai{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return[...Mi]}_readAnimate(){let t=ie(this.getAttribute("animate-speed")),o=Pt(this.getAttribute("animate-axis")),r=this.getAttribute("animate-pause-on-interaction");if(this.hasAttribute("animate-speed")||this.hasAttribute("animate-axis")||this.hasAttribute("animate-pause-on-interaction"))return{...t!==void 0?{speed:t}:{},...o!==void 0?{axis:o}:{},...r!==null?{pauseOnInteraction:Se(r)}:{}}}_readOptions(){let t={},o=Se(this.getAttribute("drag"));o!==void 0&&(t.drag=o);let r=Se(this.getAttribute("wheel"));r!==void 0&&(t.wheel=r),this.hasAttribute("dolly")&&(t.dolly=!0);let s=ie(this.getAttribute("min-distance"));s!==void 0&&(t.minDistance=s);let i=ie(this.getAttribute("max-distance"));i!==void 0&&(t.maxDistance=i);let a=vt(this.getAttribute("invert"));a!==void 0&&(t.invert=a);let l=ie(this.getAttribute("zoom-min")),u=ie(this.getAttribute("zoom-max"));return l!==void 0&&(t.minZoom=l),u!==void 0&&(t.maxZoom=u),t.animate=this._readAnimate()??!1,t}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof xe)return t;t=t.parentNode}return null}_attach(){if(this._controls)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._controls=Jt(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls&&this._controls.update(this._readOptions())}};var Si=typeof HTMLElement<"u"?HTMLElement:class{},Li=["drag","wheel","dolly","min-distance","max-distance","invert","zoom-min","zoom-max","animate-speed","animate-axis","animate-pause-on-interaction"],dn=class extends Si{constructor(){super(...arguments);this._controls=null}static get observedAttributes(){return[...Li]}_readAnimate(){let t=ie(this.getAttribute("animate-speed")),o=Pt(this.getAttribute("animate-axis")),r=this.getAttribute("animate-pause-on-interaction");if(this.hasAttribute("animate-speed")||this.hasAttribute("animate-axis")||this.hasAttribute("animate-pause-on-interaction"))return{...t!==void 0?{speed:t}:{},...o!==void 0?{axis:o}:{},...r!==null?{pauseOnInteraction:Se(r)}:{}}}_readOptions(){let t={},o=Se(this.getAttribute("drag"));o!==void 0&&(t.drag=o);let r=Se(this.getAttribute("wheel"));r!==void 0&&(t.wheel=r),this.hasAttribute("dolly")&&(t.dolly=!0);let s=ie(this.getAttribute("min-distance"));s!==void 0&&(t.minDistance=s);let i=ie(this.getAttribute("max-distance"));i!==void 0&&(t.maxDistance=i);let a=vt(this.getAttribute("invert"));a!==void 0&&(t.invert=a);let l=ie(this.getAttribute("zoom-min")),u=ie(this.getAttribute("zoom-max"));return l!==void 0&&(t.minZoom=l),u!==void 0&&(t.maxZoom=u),t.animate=this._readAnimate()??!1,t}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof xe)return t;t=t.parentNode}return null}_attach(){if(this._controls)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._controls=en(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._controls&&(this._controls.destroy(),this._controls=null)}attributeChangedCallback(t,o,r){o!==r&&this._controls&&this._controls.update(this._readOptions())}};var wi=typeof HTMLElement<"u"?HTMLElement:class{},Ti=["perspective","zoom","rot-x","rot-y","target","distance"],mn=class extends wi{constructor(){super(...arguments);this._camera=null;this._wrapper=null}static get observedAttributes(){return[...Ti]}getCamera(){return this._camera}_readOptions(){return{perspective:ie(this.getAttribute("perspective")),zoom:ie(this.getAttribute("zoom")),rotX:ie(this.getAttribute("rot-x")),rotY:ie(this.getAttribute("rot-y")),target:xt(this.getAttribute("target")),distance:ie(this.getAttribute("distance"))}}_mount(){if(this._camera)return;let t=this._readOptions();for(this._camera=ut(t),this._wrapper=this.ownerDocument.createElement("div"),this._wrapper.className="polycss-camera",this._wrapper.style.perspective=this._camera.perspectiveStyle;this.firstChild;)this._wrapper.appendChild(this.firstChild);this.appendChild(this._wrapper),this.dispatchEvent(new CustomEvent("polycss:camera-ready",{bubbles:!1}))}_teardown(){if(this._wrapper){for(;this._wrapper.firstChild;)this.insertBefore(this._wrapper.firstChild,this._wrapper);this._wrapper.parentNode&&this._wrapper.parentNode.removeChild(this._wrapper),this._wrapper=null}this._camera=null}connectedCallback(){this._mount()}disconnectedCallback(){this._teardown()}attributeChangedCallback(t,o,r){if(o===r||!this._camera||!this._wrapper)return;let s=this._readOptions();this._camera=ut(s),this._wrapper.style.perspective=this._camera.perspectiveStyle}};var _i=typeof HTMLElement<"u"?HTMLElement:class{},ki=["zoom","rot-x","rot-y","target","distance"],pn=class extends _i{constructor(){super(...arguments);this._camera=null;this._wrapper=null}static get observedAttributes(){return[...ki]}getCamera(){return this._camera}_readOptions(){return{zoom:ie(this.getAttribute("zoom")),rotX:ie(this.getAttribute("rot-x")),rotY:ie(this.getAttribute("rot-y")),target:xt(this.getAttribute("target")),distance:ie(this.getAttribute("distance"))}}_mount(){if(this._camera)return;let t=this._readOptions();for(this._camera=Kt(t),this._wrapper=this.ownerDocument.createElement("div"),this._wrapper.className="polycss-camera",this._wrapper.style.perspective=this._camera.perspectiveStyle;this.firstChild;)this._wrapper.appendChild(this.firstChild);this.appendChild(this._wrapper),this.dispatchEvent(new CustomEvent("polycss:camera-ready",{bubbles:!1}))}_teardown(){if(this._wrapper){for(;this._wrapper.firstChild;)this.insertBefore(this._wrapper.firstChild,this._wrapper);this._wrapper.parentNode&&this._wrapper.parentNode.removeChild(this._wrapper),this._wrapper=null}this._camera=null}connectedCallback(){this._mount()}disconnectedCallback(){this._teardown()}attributeChangedCallback(t,o,r){if(o===r||!this._camera)return;let s=this._readOptions();s.zoom!==void 0&&this._camera.update({zoom:s.zoom}),s.rotX!==void 0&&this._camera.update({rotX:s.rotX}),s.rotY!==void 0&&this._camera.update({rotY:s.rotY}),s.target!==void 0&&this._camera.update({target:s.target}),s.distance!==void 0&&this._camera.update({distance:s.distance})}};var Ri=typeof HTMLElement<"u"?HTMLElement:class{},Oi=["mode","target","size","enabled"];function To(e){if(e==="translate"||e==="rotate")return e}var fn=class extends Ri{constructor(){super(...arguments);this._tc=null}static get observedAttributes(){return[...Oi]}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof xe)return t;t=t.parentNode}return null}_findTargetMesh(){let t=this.getAttribute("target");if(!t)return null;let o=this._findScene();if(!o)return null;let r=null;try{r=o.querySelector(`#${t}`)??o.querySelector(t)}catch{r=o.querySelector(`[id="${t}"]`)}return r instanceof qe?r:null}_readOptions(){let t={},o=To(this.getAttribute("mode"));o!==void 0&&(t.mode=o);let r=ie(this.getAttribute("size"));r!==void 0&&(t.size=r);let s=this.getAttribute("enabled");return s!==null&&(t.enabled=s!=="false"&&s!=="0"),t.onObjectChange=i=>{this.dispatchEvent(new CustomEvent("polycss:object-change",{bubbles:!0,detail:{position:i.position,rotation:i.rotation}}))},t}_attach(){if(this._tc)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let s=()=>{t.removeEventListener("polycss:scene-ready",s),this._attach()};t.addEventListener("polycss:scene-ready",s)}return}this._tc=an(o,this._readOptions());let r=this._findTargetMesh();if(r){let s=r.getMeshHandle();s&&this._tc.attach(s)}}connectedCallback(){this._attach()}disconnectedCallback(){this._tc&&(this._tc.destroy(),this._tc=null)}attributeChangedCallback(t,o,r){if(o!==r&&this._tc){if(t==="mode"){let s=To(r);s&&this._tc.setMode(s)}else if(t==="target"){let s=this._findTargetMesh();this._tc.attach(s?s.getMeshHandle()??null:null)}}}};var Di=typeof HTMLElement<"u"?HTMLElement:class{},Hi=["multiple","clear-on-miss"],hn=class extends Di{constructor(){super(...arguments);this._selection=null}static get observedAttributes(){return[...Hi]}_findScene(){let t=this.parentNode;for(;t;){if(t instanceof xe)return t;t=t.parentNode}return null}_readOptions(){return{multiple:this.hasAttribute("multiple"),clearOnMiss:!this.hasAttribute("clear-on-miss")||this.getAttribute("clear-on-miss")!=="false",onChange:t=>{this.dispatchEvent(new CustomEvent("polycss:select",{bubbles:!0,detail:{selected:t}}))}}}_attach(){if(this._selection)return;let t=this._findScene(),o=t?.getScene();if(!o){if(t){let r=()=>{t.removeEventListener("polycss:scene-ready",r),this._attach()};t.addEventListener("polycss:scene-ready",r)}return}this._selection=nn(o,this._readOptions())}connectedCallback(){this._attach()}disconnectedCallback(){this._selection&&(this._selection.destroy(),this._selection=null)}attributeChangedCallback(t,o,r){o!==r&&(this._selection&&(this._selection.destroy(),this._selection=null),this._attach())}};export*from"@layoutit/polycss-core";export{dn as PolyMapControlsElement,qe as PolyMeshElement,un as PolyOrbitControlsElement,pn as PolyOrthographicCameraElement,mn as PolyPerspectiveCameraElement,cn as PolyPolygonElement,xe as PolySceneElement,hn as PolySelectElement,fn as PolyTransformControlsElement,Fs as createPolyFirstPersonControls,en as createPolyMapControls,Jt as createPolyOrbitControls,Kt as createPolyOrthographicCamera,ut as createPolyPerspectiveCamera,Qt as createPolyScene,nn as createSelect,an as createTransformControls,jt as injectPolyBaseStyles};
606
+ `),n.join(`
607
+ `)}function du(e){let n=[eu];if(e.hasScene&&n.push(`
608
+ .polycss-scene,
609
+ .polycss-scene *,
610
+ .polycss-scene *::before,
611
+ .polycss-scene *::after {
612
+ box-sizing: border-box;
613
+ }
614
+
615
+ .polycss-scene {
616
+ position: absolute;
617
+ top: 50%;
618
+ left: 50%;
619
+ width: 0;
620
+ height: 0;
621
+ transform-style: preserve-3d;
622
+ }
623
+ `),e.hasCamera&&n.push(`
624
+ .polycss-camera {
625
+ position: relative;
626
+ display: block;
627
+ width: 100%;
628
+ height: 100%;
629
+ }
630
+ `),e.hasFpvHost&&n.push(`
631
+ .polycss-fpv-host {
632
+ perspective: var(--polycss-fpv-perspective, 2000px) !important;
633
+ transform-style: preserve-3d !important;
634
+ }
635
+ `),e.hasMesh&&n.push(`
636
+ .polycss-mesh {
637
+ position: absolute;
638
+ transform-style: preserve-3d;
639
+ }
640
+ `),e.hasBucket&&n.push(`
641
+ .polycss-bucket {
642
+ position: absolute;
643
+ transform-style: preserve-3d;
644
+ }
645
+ `),e.leafTags.length>0&&n.push(`
646
+ ${an(e.leafTags)} {
647
+ position: absolute;
648
+ display: block;
649
+ transform-origin: 0 0;
650
+ transform-style: preserve-3d;
651
+ margin: 0;
652
+ padding: 0;
653
+ font: inherit;
654
+ font-weight: normal;
655
+ font-style: normal;
656
+ line-height: 0;
657
+ text-decoration: none;
658
+ backface-visibility: hidden;
659
+ background-repeat: no-repeat;
660
+ }
661
+ `),e.solidLeafTags.length>0&&!e.hasDynamicLighting&&n.push(`
662
+ ${an(e.solidLeafTags)} {
663
+ color: currentColor;
664
+ }
665
+ `),e.leafTags.includes("b")&&n.push(`
666
+ .polycss-scene b {
667
+ background: currentColor;
668
+ width: 64px;
669
+ height: 64px;
670
+ }
671
+ `),e.hasVoxelMesh&&n.push(`
672
+ .polycss-mesh.polycss-voxel-mesh > .polycss-voxel-face {
673
+ position: absolute;
674
+ display: block;
675
+ top: 0;
676
+ left: 0;
677
+ width: 0;
678
+ height: 0;
679
+ transform-style: preserve-3d;
680
+ transform-origin: 0 0;
681
+ margin: 0;
682
+ padding: 0;
683
+ font: inherit;
684
+ line-height: 0;
685
+ pointer-events: none;
686
+ }
687
+
688
+ .polycss-mesh.polycss-voxel-mesh > .polycss-voxel-face > b {
689
+ top: 0;
690
+ left: 0;
691
+ width: var(--polycss-voxel-primitive, 1px);
692
+ height: var(--polycss-voxel-primitive, 1px);
693
+ backface-visibility: visible;
694
+ pointer-events: none;
695
+ }
696
+ `),e.leafTags.includes("i")&&n.push(`
697
+ .polycss-scene i {
698
+ width: 16px;
699
+ height: 16px;
700
+ border-color: currentColor;
701
+ }
702
+ `),e.leafTags.includes("s")&&n.push(`
703
+ .polycss-scene s {
704
+ width: 64px;
705
+ height: 64px;
706
+ }
707
+ `),e.leafTags.includes("u")&&n.push(`
708
+ .polycss-scene u {
709
+ width: 0;
710
+ height: 0;
711
+ background: transparent;
712
+ box-sizing: content-box;
713
+ border: 0 solid transparent;
714
+ border-color: transparent transparent currentColor transparent;
715
+ border-width: 0 16px 32px 16px;
716
+ }
717
+
718
+ @supports (corner-top-left-shape: bevel) and (corner-top-right-shape: bevel) {
719
+ .polycss-scene > u,
720
+ .polycss-mesh > u,
721
+ .polycss-bucket > u {
722
+ border-width: 0;
723
+ width: 32px;
724
+ height: 32px;
725
+ background-color: currentColor;
726
+ border-top-left-radius: 50% 100%;
727
+ border-top-right-radius: 50% 100%;
728
+ corner-top-left-shape: bevel;
729
+ corner-top-right-shape: bevel;
730
+ }
731
+
732
+ .polycss-scene > u.polycss-corner-shape-solid,
733
+ .polycss-mesh > u.polycss-corner-shape-solid,
734
+ .polycss-bucket > u.polycss-corner-shape-solid {
735
+ width: 16px;
736
+ height: 16px;
737
+ box-sizing: border-box;
738
+ border: 0;
739
+ background: currentColor;
740
+ border-radius: 0;
741
+ corner-top-left-shape: initial;
742
+ corner-top-right-shape: initial;
743
+ corner-bottom-right-shape: initial;
744
+ corner-bottom-left-shape: initial;
745
+ }
746
+ }
747
+ `),e.hasQ&&n.push(`
748
+ .polycss-scene q {
749
+ position: absolute;
750
+ display: block;
751
+ transform-origin: 0 0;
752
+ transform-style: preserve-3d;
753
+ margin: 0;
754
+ padding: 0;
755
+ font: inherit;
756
+ font-weight: normal;
757
+ font-style: normal;
758
+ line-height: 0;
759
+ text-decoration: none;
760
+ backface-visibility: visible;
761
+ border-color: currentColor;
762
+ pointer-events: none;
763
+ }
764
+
765
+ .polycss-scene q::before,
766
+ .polycss-scene q::after {
767
+ content: none;
768
+ }
769
+ `),e.hasTransformGizmo){let t=e.leafTags.length>0?e.leafTags:Qo;n.push(`
770
+ ${an(t,".polycss-mesh.polycss-transform-gizmo ")} {
771
+ backface-visibility: visible;
772
+ transition: color 150ms ease-out, border-color 150ms ease-out, background-color 150ms ease-out;
773
+ }
774
+ `)}if(e.hasTransformRing){let t=e.leafTags.length>0?e.leafTags:Qo;n.push(`
775
+ ${an(t,".polycss-mesh.polycss-transform-ring ")} {
776
+ --ring-inner-r: calc(var(--ring-inner-ratio, 0.92) * 50%);
777
+ --ring-outer-r: calc(var(--ring-outer-ratio, 1) * 50%);
778
+ -webkit-mask: radial-gradient(circle at 50% 50%,
779
+ transparent 0%,
780
+ transparent var(--ring-inner-r),
781
+ black var(--ring-inner-r),
782
+ black var(--ring-outer-r),
783
+ transparent var(--ring-outer-r));
784
+ mask: radial-gradient(circle at 50% 50%,
785
+ transparent 0%,
786
+ transparent var(--ring-inner-r),
787
+ black var(--ring-inner-r),
788
+ black var(--ring-outer-r),
789
+ transparent var(--ring-outer-r));
790
+ }
791
+ `)}return e.hasDynamicLighting&&n.push(uu(e)),n.map(t=>t.trim()).filter(Boolean).join(`
792
+
793
+ `)}function Jo(e){let n=e.style;return n&&typeof n.getPropertyValue=="function"?n:null}function ai(e){let n=e.getAttribute("style");n!==null&&n.trim()===""&&e.removeAttribute("style")}function pu(e,n){let t=e;for(;t;){let o=Jo(t)?.getPropertyValue(n).trim();if(o)return o;t=t.parentElement}return""}function mu(e,n,t){let o=ln(e),r=ln(n);for(let s=0;s<r.length;s++){let i=o[s],c=r[s];if(!i||!c)continue;let l=Jo(c);if(!l)continue;if(c.classList.contains("polycss-mesh")){let d=l.getPropertyValue("--origin").trim();d&&(l.setProperty("transform-origin",d),l.removeProperty("--origin"))}let u=c.tagName.toLowerCase();if(u==="s"){let d=l.getPropertyValue("--polycss-atlas-size").trim();if(d&&(l.setProperty("width",d),l.setProperty("height",d)),t.hasDynamicLighting)l.removeProperty("--polycss-atlas-size");else for(let x of ru)l.removeProperty(x)}else if(u==="b"||u==="i"||u==="u"){let d=pu(i,"--polycss-paint"),x=t.hasDynamicLighting?"":i.ownerDocument.defaultView?.getComputedStyle(i).color;x?l.setProperty("color",x):d&&!l.getPropertyValue("color")&&l.setProperty("color",d)}if(!t.hasDynamicLighting)for(let d of nu)l.removeProperty(d);if(!t.hasQ)for(let d of ou)l.removeProperty(d);l.removeProperty("will-change"),l.removeProperty("--polycss-paint"),ai(c)}}function fu(e){for(let n of Array.from(e.querySelectorAll("script")))n.remove();for(let n of ln(e))for(let t of Array.from(n.attributes))t.name.toLowerCase().startsWith("on")&&n.removeAttribute(t.name)}function li(e){let n=e.trim();return n===""||n.startsWith("#")||/^data:/i.test(n)}function hu(e,n){return/^data:/i.test(e.trim())?e.trim():ci(e,n.baseUrl)}function ii(e){let n=/url\(\s*(?:(["'])(.*?)\1|([^)]*?))\s*\)/i.exec(e);return(n?.[2]??n?.[3]??"").trim()||null}function gu(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\a ")}function ci(e,n){try{return new URL(e,n).href}catch{throw new gt("ASSET_INLINE_FAILED",`exportPolySceneSnapshot: could not resolve asset URL "${e}".`,e)}}function yu(e){let n=(()=>{try{return new URL(e).pathname.toLowerCase()}catch{return e.toLowerCase()}})();return n.endsWith(".jpg")||n.endsWith(".jpeg")?"image/jpeg":n.endsWith(".png")?"image/png":n.endsWith(".webp")?"image/webp":n.endsWith(".gif")?"image/gif":n.endsWith(".svg")?"image/svg+xml":n.endsWith(".avif")?"image/avif":"application/octet-stream"}function bu(e){let n=new Uint8Array(e),t=32768,o="";for(let r=0;r<n.length;r+=t){let s=n.subarray(r,r+t);o+=String.fromCharCode(...s)}return btoa(o)}function vu(e){return/^(blob|filesystem):/i.test(e.trim())}function xu(e){return new Promise((n,t)=>{let o=new XMLHttpRequest;o.open("GET",e,!0),o.responseType="blob",o.onload=()=>{o.status===0||o.status>=200&&o.status<300?n(o.response):t(new Error(`XHR ${o.status}`))},o.onerror=()=>t(new Error("XHR request failed")),o.send()})}async function Pu(e){let n=vu(e);try{if(typeof fetch!="function")throw new Error("fetch is not available");let t=await fetch(e,n?void 0:{credentials:"same-origin"});if(!t.ok)throw new Error(`HTTP ${t.status}`);return await t.blob()}catch(t){if(n&&typeof XMLHttpRequest=="function")return xu(e);throw t}}async function ui(e,n){if(li(e))return e;let t=ci(e,n.baseUrl),o=n.cache.get(t);if(o)return o;let r=(async()=>{try{let s=await Pu(t),i=s.type||yu(t),c=bu(await s.arrayBuffer());return`data:${i};base64,${c}`}catch{throw new gt("ASSET_INLINE_FAILED",`exportPolySceneSnapshot: could not inline asset "${t}".`,t)}})();return n.cache.set(t,r),r}async function Ko(e,n){let t=/url\(\s*(?:(["'])(.*?)\1|([^)]*?))\s*\)/gi,o="",r=0,s;for(;(s=t.exec(e))!==null;){o+=e.slice(r,s.index);let i=(s[2]??s[3]??"").trim(),c=await ui(i,n);o+=li(i)?s[0]:`url("${c}")`,r=t.lastIndex}return o+e.slice(r)}async function Su(e,n){for(let t of ln(e)){let o=t.getAttribute("style");o&&t.setAttribute("style",await Ko(o,n))}for(let t of Array.from(e.querySelectorAll("style")))t.textContent=await Ko(t.textContent??"",n)}function Cu(e){return{position:e.getPropertyValue("background-position").trim(),size:e.getPropertyValue("background-size").trim(),repeat:e.getPropertyValue("background-repeat").trim()}}function Eu(e,n){n.position&&e.setProperty("background-position",n.position),n.size&&e.setProperty("background-size",n.size),n.repeat&&e.setProperty("background-repeat",n.repeat)}async function Tu(e,n){let t=[],o=new Map,r=new Map,s=async l=>{let u=hu(l,n),d=o.get(u);if(d)return d;let x=`a${o.size}`;return o.set(u,x),r.set(u,await ui(l,n)),x},i=l=>{for(let[u,d]of o)if(d===l)return r.get(u)??"";return""};for(let l of ln(e)){let u=Jo(l);if(!u||l.tagName.toLowerCase()!=="s")continue;let d=ii(u.getPropertyValue("--polycss-atlas-url"));if(d&&!d.startsWith("#")){let P=await s(d),g="data-polycss-snapshot-atlas";l.setAttribute(g,P),u.removeProperty("--polycss-atlas-url"),t.push({attr:g,value:P,property:"--polycss-atlas-url",dataUrl:i(P)})}let x=ii(u.getPropertyValue("background-image"));if(!x||x.startsWith("#"))continue;let h=await s(x),b="data-polycss-snapshot-bg",v=Cu(u);l.setAttribute(b,h),u.removeProperty("background"),u.removeProperty("background-image"),Eu(u,v),t.push({attr:b,value:h,property:"background-image",dataUrl:i(h)}),ai(l)}let c=new Set;return t.filter(l=>{let u=`${l.attr}|${l.value}|${l.property}`;return c.has(u)?!1:(c.add(u),!0)}).map(l=>`.polycss-scene [${l.attr}="${l.value}"] {
794
+ ${l.property}: url("${gu(l.dataUrl)}");
795
+ }`).join(`
796
+
797
+ `)}function Au(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function wu(e){return e.replace(/<\/style/gi,"<\\/style")}function Mu(e){return e.baseURI||e.URL||e.defaultView?.location.href||"http://localhost/"}async function Lu(e){if(!su(e))throw new gt("INVALID_TARGET","exportPolySceneSnapshot: target must be an Element.");let n=iu(e);if(!n)throw new gt("SCENE_NOT_FOUND","exportPolySceneSnapshot: target is not inside and does not contain a rendered PolyCSS scene.");let t=e.ownerDocument,o={baseUrl:Mu(t),cache:new Map},r=n.cloneNode(!0),s=au(r);mu(n,r,s),fu(r);let i=await Tu(r,o);await Su(r,o);let c=await Ko([du(s),i].filter(Boolean).join(`
798
+
799
+ `),o);return["<!doctype html>","<html>","<head>",'<meta charset="utf-8">',t.title?`<title>${Au(t.title)}</title>`:"",`<style>${wu(c)}</style>`,"</head>","<body>",r.outerHTML,"</body>","</html>"].filter(Boolean).join("")}import{boxPolygons as _u,planePolygons as Ru,ringPolygons as ku,octahedronPolygons as Ou,spherePolygons as Du,tetrahedronPolygons as Iu,icosahedronPolygons as Hu,dodecahedronPolygons as Fu,cylinderPolygons as Vu,conePolygons as Bu,torusPolygons as zu}from"@layoutit/polycss-core";function Ze(e){return{polygons:e,objectUrls:[],warnings:[],dispose:()=>{}}}function Nu(e={}){return Ze(_u(e))}function $u(e){return Ze(Ru(e))}function Uu(e){return Ze(ku(e))}function Gu(e){return Ze(Ou(e))}function ju(e={}){return Ze(Du(e))}function Wu(e={}){return Ze(Iu(e))}function Yu(e={}){return Ze(Hu(e))}function Xu(e={}){return Ze(Fu(e))}function Zu(e={}){return Ze(Vu(e))}function qu(e={}){return Ze(Bu(e))}function Qu(e={}){return Ze(zu(e))}import{boxPolygons as Ku,planePolygons as Ju,ringPolygons as ed,octahedronPolygons as td,spherePolygons as nd,tetrahedronPolygons as od,icosahedronPolygons as rd,dodecahedronPolygons as sd,cylinderPolygons as id,conePolygons as ad,torusPolygons as ld,computeSceneBbox as cd}from"@layoutit/polycss-core";var ud=typeof HTMLElement<"u"?HTMLElement:class{};function dd(e){return e.closest("poly-scene")??null}function he(e,n,t){let o=e.getAttribute(n);if(!o)return t;let r=parseFloat(o);return Number.isFinite(r)?r:t}function qe(e,n,t){return e.getAttribute(n)??t}function yt(e,n){let t=e.getAttribute(n);if(!t)return;let o=t.split(",").map(r=>parseFloat(r.trim()));if(!(o.length!==3||o.some(r=>!Number.isFinite(r))))return[o[0],o[1],o[2]]}function pd(e){if(e.length===0)return e;let n=cd(e),t=(n.min[0]+n.max[0])/2,o=(n.min[1]+n.max[1])/2,r=(n.min[2]+n.max[2])/2;if(t===0&&o===0&&r===0)return e;let s=i=>[i[0]-t,i[1]-o,i[2]-r];return e.map(i=>({...i,vertices:i.vertices.map(s)}))}var ke=class extends ud{constructor(){super(...arguments);this._handle=null}connectedCallback(){this._mount()}disconnectedCallback(){this._tearDown()}attributeChangedCallback(t,o,r){if(o!==r&&this._handle){if(t==="position"||t==="scale"||t==="rotation"||t==="cast-shadow"||t==="receive-shadow"){this._handle.setTransform({position:yt(this,"position"),scale:(()=>{let s=this.getAttribute("scale");if(!s)return;if(s.includes(","))return yt(this,"scale");let i=parseFloat(s);return Number.isFinite(i)?i:void 0})(),rotation:yt(this,"rotation"),castShadow:this.hasAttribute("cast-shadow"),receiveShadow:this.hasAttribute("receive-shadow")});return}this._tearDown(),this._mount()}}_tearDown(){if(this._handle){try{this._handle.dispose()}catch{}this._handle=null}}_mount(){let t=dd(this);if(!t)return;let o=t.getScene?.();if(!o)return;let r=this.buildPolygons();this.hasAttribute("auto-center")&&(r=pd(r));let s={polygons:r,objectUrls:[],warnings:[],dispose:()=>{}};this._handle=o.add(s,{position:yt(this,"position"),scale:(()=>{let i=this.getAttribute("scale");if(!i)return;if(i.includes(","))return yt(this,"scale");let c=parseFloat(i);return Number.isFinite(c)?c:void 0})(),rotation:yt(this,"rotation"),castShadow:this.hasAttribute("cast-shadow"),receiveShadow:this.hasAttribute("receive-shadow"),excludeFromAutoCenter:this.hasAttribute("exclude-from-auto-center"),merge:!1})}},er=class extends ke{static get observedAttributes(){return["size","color","auto-center","position","scale","rotation"]}buildPolygons(){let n=this.getAttribute("size"),t=n?parseFloat(n):void 0;return Ku({size:t!==void 0&&Number.isFinite(t)?t:void 0,color:qe(this,"color")})}},tr=class extends ke{static get observedAttributes(){return["axis","size","offset","color","auto-center","position","scale","rotation","cast-shadow","receive-shadow"]}buildPolygons(){let n=he(this,"axis",2),t=n===0||n===1||n===2?n:2,o=this.getAttribute("offset"),r=o===null?0:parseFloat(o);return Ju({axis:t,size:he(this,"size",.4),offset:Number.isFinite(r)?r:0,color:qe(this,"color")})}},nr=class extends ke{static get observedAttributes(){return["axis","radius","segments","half-thickness","color","auto-center","position","scale","rotation"]}buildPolygons(){let n=he(this,"axis",2),t=n===0||n===1||n===2?n:2,o=this.getAttribute("half-thickness");return ed({axis:t,radius:he(this,"radius",50),segments:he(this,"segments",32),halfThickness:o?parseFloat(o):void 0,color:qe(this,"color")})}},or=class extends ke{static get observedAttributes(){return["size","color","center","auto-center","position","scale","rotation"]}buildPolygons(){return td({center:yt(this,"center")??[0,0,0],size:he(this,"size",50),color:qe(this,"color")})}},rr=class extends ke{static get observedAttributes(){return["size","color","auto-center","position","scale","rotation"]}buildPolygons(){return od({size:he(this,"size",100),color:qe(this,"color")})}},sr=class extends ke{static get observedAttributes(){return["size","color","auto-center","position","scale","rotation"]}buildPolygons(){return rd({size:he(this,"size",100),color:qe(this,"color")})}},ir=class extends ke{static get observedAttributes(){return["size","color","auto-center","position","scale","rotation"]}buildPolygons(){return sd({size:he(this,"size",100),color:qe(this,"color")})}},ar=class extends ke{static get observedAttributes(){return["radius","subdivisions","color","auto-center","position","scale","rotation"]}buildPolygons(){return nd({radius:he(this,"radius",50),subdivisions:he(this,"subdivisions",1),color:qe(this,"color")})}},lr=class extends ke{static get observedAttributes(){return["radius","radius-top","height","radial-segments","color","auto-center","position","scale","rotation"]}buildPolygons(){let n=this.getAttribute("radius-top");return id({radius:he(this,"radius",50),radiusTop:n?parseFloat(n):void 0,height:he(this,"height",100),radialSegments:he(this,"radial-segments",12),color:qe(this,"color")})}},cr=class extends ke{static get observedAttributes(){return["radius","height","radial-segments","color","auto-center","position","scale","rotation"]}buildPolygons(){return ad({radius:he(this,"radius",50),height:he(this,"height",100),radialSegments:he(this,"radial-segments",12),color:qe(this,"color")})}},ur=class extends ke{static get observedAttributes(){return["radius","tube","radial-segments","tubular-segments","color","auto-center","position","scale","rotation"]}buildPolygons(){return ld({radius:he(this,"radius",50),tube:he(this,"tube",15),radialSegments:he(this,"radial-segments",12),tubularSegments:he(this,"tubular-segments",16),color:qe(this,"color")})}};export*from"@layoutit/polycss-core";export{er as PolyBoxElement,Yo as PolyCameraElement,cr as PolyConeElement,lr as PolyCylinderElement,ir as PolyDodecahedronElement,jo as PolyFirstPersonControlsElement,sr as PolyIcosahedronElement,zo as PolyIframeElement,Go as PolyMapControlsElement,on as PolyMeshElement,or as PolyOctahedronElement,Uo as PolyOrbitControlsElement,sn as PolyOrthographicCameraElement,Wo as PolyPerspectiveCameraElement,tr as PolyPlaneElement,$o as PolyPolygonElement,nr as PolyRingElement,Re as PolySceneElement,gt as PolySceneSnapshotError,Zo as PolySelectElement,ar as PolySphereElement,rr as PolyTetrahedronElement,ur as PolyTorusElement,Xo as PolyTransformControlsElement,Ct as buildAtlasPages,Ur as buildTextureEdgeRepairSets,Jc as collectPolyRenderStats,Gr as computeTextureAtlasPlanPublic,Nu as createPolyBox,zl as createPolyCamera,qu as createPolyCone,Zu as createPolyCylinder,Xu as createPolyDodecahedron,_o as createPolyFirstPersonControls,Yu as createPolyIcosahedron,Mo as createPolyMapControls,Gu as createPolyOctahedron,wo as createPolyOrbitControls,ht as createPolyOrthographicCamera,Ot as createPolyPerspectiveCamera,$u as createPolyPlane,Uu as createPolyRing,Ao as createPolyScene,ju as createPolySphere,Wu as createPolyTetrahedron,Qu as createPolyTorus,Ro as createSelect,Ho as createTransformControls,Zr as cssBorderShapeForPlan,Lu as exportPolySceneSnapshot,Wn as filterAtlasPlans,Xr as formatBorderShapeEntryMatrix,Wr as formatCssLengthPx,jr as formatMatrix3d,Yr as formatSolidQuadEntryMatrix,dt as getSolidPaintDefaults,jn as getSolidPaintDefaultsFromPlans,bo as injectPolyBaseStyles,mn as isBorderShapeSupported,Ve as isFullRectSolid,Be as isProjectiveQuadPlan,Je as isSolidTrianglePlan,fn as isSolidTriangleSupported,xt as packTextureAtlasPlansWithScale,_t as renderPolygonsWithStableTriangles,pt as renderPolygonsWithTextureAtlas,Kt as renderPolygonsWithTextureAtlasAsync,en as updatePolygonsWithStableTopology,uo as updatePolygonsWithStableTriangles,Jt as updateStableTriangleFrame};