@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/README.md +151 -149
- package/dist/PolyShapeElements-BNHvErQF.d.cts +654 -0
- package/dist/PolyShapeElements-BNHvErQF.d.ts +654 -0
- package/dist/elements.cjs +180 -49
- package/dist/elements.d.cts +1 -1
- package/dist/elements.d.ts +1 -1
- package/dist/elements.js +180 -49
- package/dist/index.cjs +461 -50
- package/dist/index.d.cts +144 -83
- package/dist/index.d.ts +144 -83
- package/dist/index.js +461 -50
- package/package.json +3 -3
- package/dist/PolySelectElement-Tvsmhx2m.d.cts +0 -419
- package/dist/PolySelectElement-Tvsmhx2m.d.ts +0 -419
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
|
|
30
|
-
scene.
|
|
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
|
-
|
|
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 >
|
|
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:
|
|
88
|
-
height:
|
|
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
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
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 * (
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
calc(255 * (
|
|
311
|
-
|
|
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 *
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
|
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
|
-
*
|
|
333
|
-
* ground plane (cssZ \u2248 G) along the CSS-space
|
|
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
|
|
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
|
|
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>
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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,"&").replace(/</g,"<").replace(/>/g,">")}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};
|