@layoutit/polycss-vue 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";import{ref as et,shallowRef as fn,watch as yn}from"vue";import{createIsometricCamera as pn,BASE_TILE as gn}from"@layoutit/polycss-core";function Se(e){let t={cameraState:{...e}},r=new Set;function o(){for(let n of r)n()}return{getState(){return t},setState(n){t={...t,...n},o()},subscribe(n){return r.add(n),()=>r.delete(n)},updateCameraFromRef(n){return t={cameraState:{...n.state}},o(),!0},notifyAll(){o()}}}function Z(e){let t=pn({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),r=fn(t),o=et(null),n=et(null),a=Se(t.state);yn(()=>({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),(m,s)=>{let l={};m.zoom!==void 0&&m.zoom!==s?.zoom&&(l.zoom=m.zoom),m.target!==void 0&&m.target!==s?.target&&(l.target=m.target),m.rotX!==void 0&&m.rotX!==s?.rotX&&(l.rotX=m.rotX),m.rotY!==void 0&&m.rotY!==s?.rotY&&(l.rotY=m.rotY),m.distance!==void 0&&m.distance!==s?.distance&&(l.distance=m.distance),Object.keys(l).length>0&&(t.update(l),i(),a.updateCameraFromRef(t),a.notifyAll())});function i(){let m=o.value;if(!m)return;let s=t.state,l=gn,[c,u,y]=s.target,f=u*l,g=c*l,v=y*l,b=s.distance!==0?`translateZ(${-s.distance}px) `:"";m.style.transform=`${b}scale(${s.zoom}) rotateX(${s.rotX}deg) rotate(${s.rotY}deg) translate3d(${-f}px, ${-g}px, ${-v}px)`}return{store:a,cameraRef:r,sceneElRef:o,cameraElRef:n,applyTransformDirect:i}}var $=Symbol("polycss-camera");var bn=8e3,le=hn({name:"PolyPerspectiveCamera",props:{zoom:{type:Number},target:{type:Array},rotX:{type:Number},rotY:{type:Number},distance:{type:Number},perspective:{type:Number,default:void 0},class:{type:String}},setup(e,{slots:t}){let r=xn(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:n,sceneElRef:a,cameraElRef:i,applyTransformDirect:m}=Z(r);return vn($,{store:o,cameraRef:n,sceneElRef:a,cameraElRef:i,applyTransformDirect:m}),()=>{let s=`${typeof e.perspective=="number"?e.perspective:bn}px`;return Pn("div",{ref:i,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:s}},t.default?.())}}});import{defineComponent as Cn,h as Mn,provide as An,computed as En}from"vue";var tt=Cn({name:"PolyOrthographicCamera",props:{zoom:{type:Number},target:{type:Array},rotX:{type:Number},rotY:{type:Number},distance:{type:Number},class:{type:String}},setup(e,{slots:t}){let r=En(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:n,sceneElRef:a,cameraElRef:i,applyTransformDirect:m}=Z(r);return An($,{store:o,cameraRef:n,sceneElRef:a,cameraElRef:i,applyTransformDirect:m}),()=>Mn("div",{ref:i,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:"none"}},t.default?.())}});import{defineComponent as Mo,h as dt,inject as Ao,provide as Eo,computed as Y,ref as So,watch as ft,onMounted as To,onBeforeUnmount as Lo}from"vue";import{createIsometricCamera as wo,parseHexColor as yt}from"@layoutit/polycss-core";import{computed as Sn}from"vue";import{buildSceneContext as Tn,mergePolygons as Ln}from"@layoutit/polycss-core";function fe(e,t){return Sn(()=>{let{directionalLight:r}=t.value,o=Tn({polygons:e.value});return{polygons:Ln(o.context.polygons),sceneBbox:o.context.sceneBbox}})}var nt="polycss-styles";function ye(e=typeof document<"u"?document:null){if(!e||e.getElementById(nt))return;let t=e.createElement("style");t.id=nt,t.textContent=wn,e.head.appendChild(t)}var wn=`
1
+ import{defineComponent as Co,h as Eo,provide as Mo,computed as Ao}from"vue";import{ref as it,shallowRef as vo,watch as Po}from"vue";import{createIsometricCamera as bo,BASE_TILE as xo}from"@layoutit/polycss-core";function at(e){let t={cameraState:{...e}},n=new Set;function o(){for(let r of n)r()}return{getState(){return t},setState(r){t={...t,...r},o()},subscribe(r){return n.add(r),()=>n.delete(r)},updateCameraFromRef(r){return t={cameraState:{...r.state}},o(),!0},notifyAll(){o()}}}function ye(e){let t=bo({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),n=vo(t),o=it(null),r=it(null),i=it([0,0,0]),s=at(t.state);Po(()=>({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),(a,c)=>{let l={};a.zoom!==void 0&&a.zoom!==c?.zoom&&(l.zoom=a.zoom),a.target!==void 0&&a.target!==c?.target&&(l.target=a.target),a.rotX!==void 0&&a.rotX!==c?.rotX&&(l.rotX=a.rotX),a.rotY!==void 0&&a.rotY!==c?.rotY&&(l.rotY=a.rotY),a.distance!==void 0&&a.distance!==c?.distance&&(l.distance=a.distance),Object.keys(l).length>0&&(t.update(l),d(),s.updateCameraFromRef(t),s.notifyAll())});function d(){let a=o.value;if(!a)return;let c=t.state,l=xo,m=i.value,f=c.target[0]+m[0],y=c.target[1]+m[1],p=c.target[2]+m[2],b=y*l,P=f*l,E=p*l,C=c.distance!==0?`translateZ(${-c.distance}px) `:"";a.style.transform=`${C}scale(${c.zoom}) rotateX(${c.rotX}deg) rotate(${c.rotY}deg) translate3d(${-b}px, ${-P}px, ${-E}px)`}return{store:s,cameraRef:n,sceneElRef:o,cameraElRef:r,autoCenterOffset:i,applyTransformDirect:d}}var K=Symbol("polycss-camera");var So=8e3,Le=Co({name:"PolyPerspectiveCamera",props:{zoom:{type:Number},target:{type:Array},rotX:{type:Number},rotY:{type:Number},distance:{type:Number},perspective:{type:Number,default:void 0},class:{type:String}},setup(e,{slots:t}){let n=Ao(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}=ye(n);return Mo(K,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}),()=>{let c=`${typeof e.perspective=="number"?e.perspective:So}px`;return Eo("div",{ref:s,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:c}},t.default?.())}}});import{defineComponent as To,h as wo,provide as Lo,computed as Ro}from"vue";var Ht=To({name:"PolyOrthographicCamera",props:{zoom:{type:Number},target:{type:Array},rotX:{type:Number},rotY:{type:Number},distance:{type:Number},class:{type:String}},setup(e,{slots:t}){let n=Ro(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}=ye(n);return Lo(K,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:s,autoCenterOffset:d,applyTransformDirect:a}),()=>wo("div",{ref:s,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:"none"}},t.default?.())}});import{defineComponent as ea,h as ta,inject as na,provide as oa,computed as ee,ref as cn,watch as un,watchEffect as dn,onMounted as ra,onBeforeUnmount as aa}from"vue";import{parseHexColor as mn,BASE_TILE as ia}from"@layoutit/polycss-core";import{computed as Oo}from"vue";import{buildSceneContext as Do,mergePolygons as ko}from"@layoutit/polycss-core";function Fe(e,t){return Oo(()=>{let{directionalLight:n}=t.value,o=Do({polygons:e.value});return{polygons:ko(o.context.polygons),sceneBbox:o.context.sceneBbox}})}var It="polycss-styles";function ze(e=typeof document<"u"?document:null){if(!e||e.getElementById(It))return;let t=e.createElement("style");t.id=It,t.textContent=_o,e.head.appendChild(t)}var _o=`
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,
@@ -16,12 +16,6 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
16
16
  height: 0;
17
17
  transform-style: preserve-3d;
18
18
  perspective: none;
19
- transform: var(--scene-transform);
20
- }
21
-
22
- .polycss-offset {
23
- transform-style: preserve-3d;
24
- transform: var(--offset-transform);
25
19
  }
26
20
 
27
21
  /* \u2500\u2500 Camera wrapper (perspective + interactive drag) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -44,6 +38,22 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
44
38
  position: absolute;
45
39
  }
46
40
 
41
+ /* \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 */
42
+
43
+ /* PolyFirstPersonControls toggles this class on its host element (the camera
44
+ wrapper). FPV needs a real perspective context so scene Z translation
45
+ produces visible depth motion - without it, walking forward looks like a
46
+ planar pan. The class wins over inline perspective styles (e.g.
47
+ PolyOrthographicCamera's perspective: none) via !important. The actual
48
+ perspective value is set inline by the controls as the
49
+ --polycss-fpv-perspective custom property; the default of 2000px matches
50
+ the controls' lookOffset fallback so the FPV math and visual perspective
51
+ stay in sync. */
52
+ .polycss-fpv-host {
53
+ perspective: var(--polycss-fpv-perspective, 2000px) !important;
54
+ transform-style: preserve-3d !important;
55
+ }
56
+
47
57
  /* \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 */
48
58
 
49
59
  /*
@@ -71,24 +81,37 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
71
81
  background-repeat: no-repeat;
72
82
  }
73
83
 
84
+ .polycss-scene b,
85
+ .polycss-scene i,
86
+ .polycss-scene u {
87
+ color: var(--polycss-paint, currentColor);
88
+ }
89
+
74
90
  .polycss-scene b {
91
+ background: currentColor;
92
+ width: 64px;
93
+ height: 64px;
75
94
  }
76
95
 
77
96
  .polycss-scene i {
78
- border-style: solid;
79
- border-width: 1px;
97
+ width: 16px;
98
+ height: 16px;
80
99
  border-color: currentColor;
81
100
  }
82
101
 
83
102
  .polycss-scene s {
103
+ width: var(--polycss-atlas-size, 64px);
104
+ height: var(--polycss-atlas-size, 64px);
84
105
  }
85
106
 
86
107
  .polycss-scene u {
87
- width: 0px;
88
- height: 0px;
108
+ width: 0;
109
+ height: 0;
89
110
  background: transparent;
90
111
  box-sizing: content-box;
91
112
  border: 0 solid transparent;
113
+ border-color: transparent transparent currentColor transparent;
114
+ border-width: 0 32px 64px 32px;
92
115
  }
93
116
 
94
117
  /* \u2500\u2500 Dynamic lighting cascade vars (scene root \u2192 polygons) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -108,6 +131,21 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
108
131
  @property --plx { syntax: "<number>"; inherits: true; initial-value: 0; }
109
132
  @property --ply { syntax: "<number>"; inherits: true; initial-value: 0; }
110
133
  @property --plz { syntax: "<number>"; inherits: true; initial-value: 1; }
134
+
135
+ /* CSS-space light components (world-Y\u2192cssX, world-X\u2192cssY, world-Z\u2192cssZ).
136
+ Used by the shadow projection matrix. --clz is clamped away from 0 in JS
137
+ to avoid divide-by-zero when the light is near-horizontal. */
138
+ @property --clx { syntax: "<number>"; inherits: true; initial-value: 0.01; }
139
+ @property --cly { syntax: "<number>"; inherits: true; initial-value: 0; }
140
+ @property --clz { syntax: "<number>"; inherits: true; initial-value: 1; }
141
+
142
+ /* Ground-plane position in CSS pixels along the CSS-Z axis (= world-Z, the
143
+ up axis in polycss's world convention). Stored as a <number> so it can be
144
+ used directly inside matrix3d() calc() expressions (matrix3d requires
145
+ dimensionless entries \u2014 no px units).
146
+ Set from the min world-Z of casting meshes. */
147
+ @property --shadow-ground-cssz { syntax: "<number>"; inherits: true; initial-value: 0; }
148
+
111
149
  @property --plr { syntax: "<number>"; inherits: true; initial-value: 1; }
112
150
  @property --plg { syntax: "<number>"; inherits: true; initial-value: 1; }
113
151
  @property --plb { syntax: "<number>"; inherits: true; initial-value: 1; }
@@ -117,14 +155,14 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
117
155
  @property --pab { syntax: "<number>"; inherits: true; initial-value: 1; }
118
156
  @property --pai { syntax: "<number>"; inherits: true; initial-value: 0.4; }
119
157
 
120
- /* Per-polygon surface normal \u2014 set inline by the renderer. inherits:false
121
- because each leaf has its own normal (no cascade). */
158
+ /* Per-polygon surface normal \u2014 set inline by the renderer. Base RGB channels
159
+ may be hoisted to a mesh wrapper, so they inherit unless overridden inline. */
122
160
  @property --pnx { syntax: "<number>"; inherits: false; initial-value: 0; }
123
161
  @property --pny { syntax: "<number>"; inherits: false; initial-value: 0; }
124
162
  @property --pnz { syntax: "<number>"; inherits: false; initial-value: 1; }
125
- @property --psr { syntax: "<number>"; inherits: false; initial-value: 1; }
126
- @property --psg { syntax: "<number>"; inherits: false; initial-value: 1; }
127
- @property --psb { syntax: "<number>"; inherits: false; initial-value: 1; }
163
+ @property --psr { syntax: "<number>"; inherits: true; initial-value: 1; }
164
+ @property --psg { syntax: "<number>"; inherits: true; initial-value: 1; }
165
+ @property --psb { syntax: "<number>"; inherits: true; initial-value: 1; }
128
166
 
129
167
  /* Calc-driven Lambert + tint, scoped to dynamic-lighting scenes. Lives
130
168
  here (not inline per polygon) so each leaf only carries its tiny normal
@@ -150,8 +188,9 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
150
188
  background-blend-mode: multiply;
151
189
  }
152
190
 
191
+ .polycss-scene[data-polycss-lighting="dynamic"] b,
153
192
  .polycss-scene[data-polycss-lighting="dynamic"] u {
154
- border-bottom-color: rgb(
193
+ color: rgb(
155
194
  calc(255 * var(--psr) * (var(--par) * var(--pai)
156
195
  + var(--plr) * var(--pli) * max(0,
157
196
  var(--pnx) * var(--plx) +
@@ -169,4 +208,93 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
169
208
  var(--pnz) * var(--plz))))
170
209
  );
171
210
  }
172
- `;import{parsePureColor as Ha}from"@layoutit/polycss-core";import{inject as Rn}from"vue";var Te=Symbol("polycss/scene-context");function ot(){return Rn(Te,null)}import{computed as ie,h as He,onBeforeUnmount as On,ref as Hn,watch as Dn}from"vue";var kn=50,In=[.4,-.7,.59],_n="#ffffff",Vn=1,$n="#ffffff",Un=.4,q=4096,rt=1,Xn=.1,Yn=1,lt=q*q,zn=lt*3,we=2048,Re=16*1024*1024,Nn=.995,X=.001,Fn=.75,it=3,jn=2,se=1e-9,Bn=.45,G=new Map;function Wn(e){let t=G.get(e);return t||(t=new Promise((r,o)=>{let n=new Image;n.decoding="async",n.onload=()=>r(n),n.onerror=()=>o(new Error(`texture load failed: ${e}`)),n.src=e}),G.set(e,t),t.then(()=>{G.get(e)===t&&G.delete(e)},()=>{G.get(e)===t&&G.delete(e)})),t}function Pe(e){let t=typeof e=="string"?Number(e):e;return t===void 0||!Number.isFinite(t)?1:Math.min(Yn,Math.max(Xn,t))}function De(e,t){let r=e.toFixed(t).replace(/\.?0+$/,"");return Object.is(Number(r),-0)?"0":r}function Oe(e,t=it){return`matrix3d(${e.split(",").map(r=>{let o=Number(r.trim());return Number.isFinite(o)?De(o,t):r.trim()}).join(",")})`}function ge(e,t=jn){return`${De(e,t)}%`}function st(e){return e.reduce((t,r)=>t+r.width*r.height,0)}function Zn(e){let t=st(e);if(t<=0)return 1;let r=Math.max(1,...e.map(a=>Math.max(a.width,a.height))),o=we/r,n=Math.sqrt(Re/(t*4));return Pe(Math.min(o,n))}function Gn(e){let t=st(e),r=.5;return t<=lt?r=1:t<=zn&&(r=.75),Pe(Math.min(r,Zn(e)))}function Kn(e,t){return e.reduce((r,o)=>Math.max(r,Math.ceil(o.width*t),Math.ceil(o.height*t)),0)}function qn(e,t){return e.reduce((r,o)=>r+Math.ceil(o.width*t)*Math.ceil(o.height*t)*4,0)}function Jn(e,t){let r=Kn(e,t),o=qn(e,t),n=r>we?we/r:1,a=o>Re?Math.sqrt(Re/o):1;return Math.min(n,a)}function Qn(e,t){let r=Gn(t.pages),o=r===1?t:he(e,r);for(let n=0;n<4;n++){let a=Jn(o.pages,r);if(a>=1)break;let i=Pe(r*a*Nn);if(i>=r)break;r=i,o=he(e,r)}return{packed:o,atlasScale:r}}function eo(e,t){if(t!==void 0&&t!=="auto"){let o=Pe(t);return{packed:he(e,o),atlasScale:o}}let r=he(e,1);return Qn(e,r)}function to(e){return Math.max(rt,Math.ceil(rt/e))}function F(e,t,r=1,o=0,n=0,a=1,i=0,m=0){e.setTransform(r*t,o*t,n*t,a*t,i*t,m*t)}function J(e){let t=e.startsWith("#")?e.slice(1):e;return t.length!==6?{r:255,g:255,b:255}:{r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16)}}function ct(e){if(e.screenPts.length!==8)return!1;let t=[],r=[],o=(n,a)=>{for(let i of n)if(Math.abs(i-a)<=X)return;n.push(a)};for(let n=0;n<e.screenPts.length;n+=2)o(t,e.screenPts[n]),o(r,e.screenPts[n+1]);if(t.length!==2||r.length!==2||(t.sort((n,a)=>n-a),r.sort((n,a)=>n-a),Math.abs(t[0])>X||Math.abs(r[0])>X||t[1]-t[0]<=X||r[1]-r[0]<=X))return!1;for(let n=0;n<e.screenPts.length;n+=2){let a=e.screenPts[n],i=e.screenPts[n+1],m=Math.abs(a-t[0])<=X||Math.abs(a-t[1])<=X,s=Math.abs(i-r[0])<=X||Math.abs(i-r[1])<=X;if(!m||!s)return!1}return!0}function j(e){return!e.texture&&e.polygon.vertices.length===3}function no(){if(!!!globalThis.CSS?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) polygon(50% 50%, 50% 50%, 50% 50%)"))return!1;let t=globalThis.matchMedia;return typeof t!="function"?!0:t("(pointer: fine)").matches&&t("(hover: hover)").matches}function oo(e){let t=[],r=e.canvasW||1,o=e.canvasH||1;for(let n=0;n<e.screenPts.length;n+=2){let a=Math.max(0,Math.min(100,e.screenPts[n]/r*100)),i=Math.max(0,Math.min(100,e.screenPts[n+1]/o*100));t.push(`${ge(a)} ${ge(i)}`)}return`polygon(${t.join(", ")})`}function ro(e){let t=0,r=0,o=Math.max(1,e.screenPts.length/2);for(let s=0;s<e.screenPts.length;s+=2)t+=e.screenPts[s],r+=e.screenPts[s+1];let n=e.canvasW||1,a=e.canvasH||1,i=ge(Math.max(0,Math.min(100,t/o/n*100))),m=ge(Math.max(0,Math.min(100,r/o/a*100)));return`polygon(${Array.from({length:o},()=>`${i} ${m}`).join(", ")})`}function ao(e){return`${oo(e)} ${ro(e)}`}function lo(e,t=it){return e.map(r=>De(r,t)).join(",")}function io(e,t,r){return e.map(o=>[o[1]*t,o[0]*t,o[2]*r])}function so(e){if(e.length<3)return null;let t=e[0],r=e[1],o=e[2],n=[r[0]-t[0],r[1]-t[1],r[2]-t[2]],a=[o[0]-t[0],o[1]-t[1],o[2]-t[2]],i=[-(n[1]*a[2]-n[2]*a[1]),-(n[2]*a[0]-n[0]*a[2]),-(n[0]*a[1]-n[1]*a[0])],m=Math.hypot(i[0],i[1],i[2]);return m<=se?null:[i[0]/m,i[1]/m,i[2]/m]}function Le(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function co(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function uo(e,t,r){if(!j(e))return null;let o=io(e.polygon.vertices,e.tileSize,e.layerElevation),n=so(o);if(!n)return null;let a=[{a:0,b:1,c:2},{a:1,b:2,c:0},{a:2,b:0,c:1}].map(I=>{let D=o[I.a],x=o[I.b];return{...I,length:Math.hypot(x[0]-D[0],x[1]-D[1],x[2]-D[2])}}).sort((I,D)=>D.length-I.length),i=a[0].a,m=a[0].b,s=a[0].c,l=o[i],c=o[m],u=o[s],y=a[0].length;if(y<=se)return null;let f=[(c[0]-l[0])/y,(c[1]-l[1])/y,(c[2]-l[2])/y],g=[u[0]-l[0],u[1]-l[1],u[2]-l[2]],v=Le(g,f),b=[l[0]+f[0]*v,l[1]+f[1]*v,l[2]+f[2]*v],R=[b[0]-u[0],b[1]-u[1],b[2]-u[2]],H=Math.hypot(R[0],R[1],R[2]);if(H<=se)return null;let O=[R[0]/H,R[1]/H,R[2]/H];if(Le(co(f,O),n)<0){let I=m;if(m=i,i=I,l=o[i],c=o[m],y=Math.hypot(c[0]-l[0],c[1]-l[1],c[2]-l[2]),y<=se)return null;f=[(c[0]-l[0])/y,(c[1]-l[1])/y,(c[2]-l[2])/y];let D=[u[0]-l[0],u[1]-l[1],u[2]-l[2]];v=Le(D,f),b=[l[0]+f[0]*v,l[1]+f[1]*v,l[2]+f[2]*v],R=[b[0]-u[0],b[1]-u[1],b[2]-u[2]];let x=Math.hypot(R[0],R[1],R[2]);if(x<=se)return null;O=[R[0]/x,R[1]/x,R[2]/x]}let d=Math.max(0,Math.min(y,v)),C=Math.max(0,y-d),p=Bn,A=d+p,P=C+p,E=H+p*2,M=u[0]-A*f[0]-p*O[0],S=u[1]-A*f[1]-p*O[1],w=u[2]-A*f[2]-p*O[2],L=lo([f[0],f[1],f[2],0,O[0],O[1],O[2],0,n[0],n[1],n[2],0,M,S,w,1]),h=t==="dynamic",k=J(e.polygon.color??"#cccccc");return{transform:`matrix3d(${L})`,borderWidth:`0 ${P}px ${E}px ${A}px`,borderBottomColor:h?void 0:e.shadedColor,pointerEvents:r==="none"?"none":void 0,...h?{"--pnx":n[0].toFixed(4),"--pny":n[1].toFixed(4),"--pnz":n[2].toFixed(4),"--psr":(k.r/255).toFixed(4),"--psg":(k.g/255).toFixed(4),"--psb":(k.b/255).toFixed(4)}:null}}function mo({r:e,g:t,b:r}){let o=n=>Math.round(Math.max(0,Math.min(255,n))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(r)}`}function fo(e,t,r,o,n){let a=J(e),i=J(r),m=J(o),s=m.r/255*n+i.r/255*t,l=m.g/255*n+i.g/255*t,c=m.b/255*n+i.b/255*t;return mo({r:a.r*s,g:a.g*l,b:a.b*c})}function yo(e,t,r,o){let n=J(t),a=J(r);return{r:a.r/255*o+n.r/255*e,g:a.g/255*o+n.g/255*e,b:a.b/255*o+n.b/255*e}}function po({r:e,g:t,b:r}){let o=n=>Math.round(Math.max(0,Math.min(1,n))*255);return`rgb(${o(e)} ${o(t)} ${o(r)})`}function go(e,t,r,o,n,a,i){Math.abs(a.r-1)<.001&&Math.abs(a.g-1)<.001&&Math.abs(a.b-1)<.001||(e.save(),F(e,i),e.globalCompositeOperation="multiply",e.fillStyle=po(a),e.fillRect(t,r,o,n),e.restore())}function ho(e,t,r,o,n,a,i){let m=t.naturalWidth||t.width||1,s=t.naturalHeight||t.height||1,l=Math.max(n/m,a/s),c=m*l,u=s*l;F(e,i),e.drawImage(t,r+(n-c)/2,o+(a-u)/2,c,u)}function ut(e,t){if(e.length<3||t.length<3)return null;let[r,o,n]=e,[a,i,m]=t,s=r[0],l=r[1],c=o[0],u=o[1],y=n[0],f=n[1],g=a[0],v=1-a[1],b=i[0],R=1-i[1],H=m[0],O=1-m[1],d=b-g,C=R-v,p=H-g,A=O-v,P=d*A-p*C;if(Math.abs(P)<=1e-9)return null;let E=c-s,M=y-s,S=u-l,w=f-l,L={a:(E*A-M*C)/P,b:(d*M-p*E)/P,c:(S*A-w*C)/P,d:(d*w-p*S)/P,e:0,f:0};return L.e=s-L.a*g-L.b*v,L.f=l-L.c*g-L.d*v,L}function mt(e){if(e.length===0)return null;let t=1/0,r=1/0,o=-1/0,n=-1/0;for(let a of e){let i=a[0],m=1-a[1];if(!Number.isFinite(i)||!Number.isFinite(m))return null;t=Math.min(t,i),o=Math.max(o,i),r=Math.min(r,m),n=Math.max(n,m)}return{minU:t,minV:r,maxU:o,maxV:n}}function Po(e,t,r,o,n,a,i,m){let s=e.vertices.map(u=>{let y=[u[1]*t,u[0]*t,u[2]*r],f=y[0]-o[0],g=y[1]-o[1],v=y[2]-o[2];return[f*n[0]+g*n[1]+v*n[2]+i,f*a[0]+g*a[1]+v*a[2]+m]}),l=ut(s,e.uvs),c=mt(e.uvs);return!l&&!c?null:{screenPts:s.flatMap(([u,y])=>[u,y]),uvAffine:l,uvSampleRect:c}}function vo(e,t){if(e.length<6||t<=0)return e;let r=0,o=0,n=e.length/2;for(let i=0;i<e.length;i+=2)r+=e[i],o+=e[i+1];r/=n,o/=n;let a=e.slice();for(let i=0;i<a.length;i+=2){let m=a[i]-r,s=a[i+1]-o,l=Math.hypot(m,s);l<=X||(a[i]+=m/l*t,a[i+1]+=s/l*t)}return a}function K(e,t){return Math.max(0,Math.min(t,e))}function at(e,t,r,o,n,a,i,m){let s=t.naturalWidth||t.width||1,l=t.naturalHeight||t.height||1,c=K(Math.min(r.minU,r.maxU)*s,s),u=K(Math.max(r.minU,r.maxU)*s,s),y=K(Math.min(r.minV,r.maxV)*l,l),f=K(Math.max(r.minV,r.maxV)*l,l),g=Math.floor(c),v=Math.floor(y),b=Math.ceil(u)-g,R=Math.ceil(f)-v;b<1&&(g=Math.floor(K((r.minU+r.maxU)/2*s,s-1)),b=1),R<1&&(v=Math.floor(K((r.minV+r.maxV)/2*l,l-1)),R=1),g=Math.max(0,Math.min(s-1,g)),v=Math.max(0,Math.min(l-1,v)),b=Math.max(1,Math.min(s-g,b)),R=Math.max(1,Math.min(l-v,R)),F(e,m),e.drawImage(t,g,v,b,R,o,n,a,i)}function xo(e){if(typeof e.toBlob=="function")return new Promise(t=>{e.toBlob(r=>{t(r?URL.createObjectURL(r):null)},"image/png")});try{return Promise.resolve(e.toDataURL("image/png"))}catch{return Promise.resolve(null)}}function Q(e,t,r={}){let{vertices:o,texture:n,uvs:a}=e;if(!o||o.length<3)return null;let i=r.tileSize??kn,m=r.layerElevation??i,s=V=>[V[1]*i,V[0]*i,V[2]*m],l=o.map(s),c=l[0],u=l[1],y=l[2],f=[u[0]-c[0],u[1]-c[1],u[2]-c[2]],g=[y[0]-c[0],y[1]-c[1],y[2]-c[2]],v=Math.hypot(f[0],f[1],f[2]);if(v===0)return null;let b=[f[0]/v,f[1]/v,f[2]/v],R=-(f[1]*g[2]-f[2]*g[1]),H=-(f[2]*g[0]-f[0]*g[2]),O=-(f[0]*g[1]-f[1]*g[0]),d=Math.hypot(R,H,O);if(d===0)return null;R/=d,H/=d,O/=d;let C=[H*b[2]-O*b[1],O*b[0]-R*b[2],R*b[1]-H*b[0]],p=l.map(V=>{let U=V[0]-c[0],me=V[1]-c[1],de=V[2]-c[2];return[U*b[0]+me*b[1]+de*b[2],U*C[0]+me*C[1]+de*C[2]]}),A=1/0,P=1/0,E=-1/0,M=-1/0;for(let[V,U]of p)V<A&&(A=V),V>E&&(E=V),U<P&&(P=U),U>M&&(M=U);let S=-A,w=-P,L=E-A,h=M-P;if(!Number.isFinite(L)||!Number.isFinite(h))return null;let k=[];for(let V=0;V<p.length;V++){let[U,me]=p[V],de=U+S,dn=me+w;k.push(de,dn)}let I=c[0]-S*b[0]-w*C[0],D=c[1]-S*b[1]-w*C[1],x=c[2]-S*b[2]-w*C[2],T=[b[0],b[1],b[2],0,C[0],C[1],C[2],0,R,H,O,0,I,D,x,1].join(","),_=r.directionalLight,We=r.ambientLight,W=_?.direction??In,Ze=_?.color??_n,rn=Math.max(0,_?.intensity??Vn),Ge=We?.color??$n,Ke=Math.max(0,We?.intensity??Un),Ee=Math.hypot(W[0],W[1],W[2])||1,an=W[0]/Ee,ln=W[1]/Ee,sn=W[2]/Ee,qe=rn*Math.max(0,R*an+H*ln+O*sn),cn=yo(qe,Ze,Ge,Ke),un=fo(e.color??"#cccccc",qe,Ze,Ge,Ke),Je=null,Qe=null;n&&a&&a.length>=3&&a.length===o.length&&(Qe=mt(a),Je=ut(p.map(([V,U])=>[V+S,U+w]),a));let mn=n&&e.textureTriangles?.length?e.textureTriangles.map(V=>Po(V,i,m,c,b,C,S,w)).filter(V=>!!V):null;return{index:t,polygon:e,texture:n,tileSize:i,layerElevation:m,matrix:T,canvasW:Math.max(1,Math.ceil(L)),canvasH:Math.max(1,Math.ceil(h)),screenPts:k,uvAffine:Je,uvSampleRect:Qe,textureTriangles:mn,normal:[R,H,O],textureTint:cn,shadedColor:un}}function he(e,t=1){let r=Array(e.length).fill(null),o=[],n=to(t),a=e.filter(s=>!!s).sort((s,l)=>l.canvasH-s.canvasH||l.canvasW-s.canvasW||s.index-l.index),i=()=>({width:n,height:n,entries:[],shelves:[]}),m=(s,l,c)=>{if(s.sealed)return null;for(let f of s.shelves)if(l.canvasH<=f.height&&f.x+l.canvasW+n<=q){let g={...l,pageIndex:c,x:f.x,y:f.y};return f.x+=l.canvasW+n,s.entries.push(g),s.width=Math.max(s.width,g.x+l.canvasW+n),g}let u=s.shelves.length===0?n:s.height;if(u+l.canvasH+n>q)return null;let y={...l,pageIndex:c,x:n,y:u};return s.shelves.push({x:n+l.canvasW+n,y:u,height:l.canvasH}),s.entries.push(y),s.width=Math.max(s.width,y.x+l.canvasW+n),s.height=Math.max(s.height,u+l.canvasH+n),y};for(let s of a){if(s.canvasW+n*2>q||s.canvasH+n*2>q){let u=o.length,y={...s,pageIndex:u,x:n,y:n};r[s.index]=y,o.push({width:s.canvasW+n*2,height:s.canvasH+n*2,entries:[y],shelves:[],sealed:!0});continue}let c=null;for(let u=0;u<o.length&&(c=m(o[u],s,u),!c);u++);if(!c){let u=i(),y=o.length;o.push(u),c=m(u,s,y)}c&&(r[s.index]=c)}return{entries:r,pages:o.map(({width:s,height:l,entries:c})=>({width:s,height:l,entries:c}))}}async function bo(e,t,r,o){let n=r.createElement("canvas");n.width=Math.max(1,Math.ceil(e.width*o)),n.height=Math.max(1,Math.ceil(e.height*o));let a=n.getContext("2d");if(!a)return{width:e.width,height:e.height,url:null};let i=Array.from(new Set(e.entries.flatMap(l=>l.texture?[l.texture]:[]))),m=new Map;await Promise.all(i.map(async l=>{m.set(l,await Wn(l))}));for(let l of e.entries){let c=l.texture?m.get(l.texture):null;a.save(),F(a,o),a.beginPath();for(let u=0;u<l.screenPts.length;u+=2){let y=l.x+l.screenPts[u],f=l.y+l.screenPts[u+1];u===0?a.moveTo(y,f):a.lineTo(y,f)}if(a.closePath(),a.clip(),!l.texture)F(a,o),a.fillStyle=t==="dynamic"?l.polygon.color??"#cccccc":l.shadedColor,a.fillRect(l.x,l.y,l.canvasW,l.canvasH);else if(c&&l.textureTriangles?.length){let u=c.naturalWidth||c.width||1,y=c.naturalHeight||c.height||1;for(let f of l.textureTriangles){let g=vo(f.screenPts,Fn);a.save(),F(a,o),a.beginPath();for(let v=0;v<g.length;v+=2){let b=l.x+g[v],R=l.y+g[v+1];v===0?a.moveTo(b,R):a.lineTo(b,R)}a.closePath(),a.clip(),f.uvAffine?(F(a,o,f.uvAffine.a/u,f.uvAffine.c/u,f.uvAffine.b/y,f.uvAffine.d/y,l.x+f.uvAffine.e,l.y+f.uvAffine.f),a.drawImage(c,0,0)):f.uvSampleRect&&at(a,c,f.uvSampleRect,l.x,l.y,l.canvasW,l.canvasH,o),a.restore()}}else if(c&&l.uvAffine){let u=c.naturalWidth||c.width||1,y=c.naturalHeight||c.height||1;F(a,o,l.uvAffine.a/u,l.uvAffine.c/u,l.uvAffine.b/y,l.uvAffine.d/y,l.x+l.uvAffine.e,l.y+l.uvAffine.f),a.drawImage(c,0,0)}else c&&l.uvSampleRect?at(a,c,l.uvSampleRect,l.x,l.y,l.canvasW,l.canvasH,o):c&&ho(a,c,l.x,l.y,l.canvasW,l.canvasH,o);l.texture&&t==="baked"&&go(a,l.x,l.y,l.canvasW,l.canvasH,l.textureTint,o),a.restore()}let s=await xo(n);return n.width=1,n.height=1,{width:e.width,height:e.height,url:s}}async function Co(e,t,r,o,n){let a=[];for(let i of e){if(n())break;a.push(await bo(i,t,r,o))}return a}function pe(e){for(let t of e)URL.revokeObjectURL(t)}function ee(e,t,r=ie(()=>{})){let o=ie(()=>t.value!=="dynamic"&&no()),n=ie(()=>{let m=e.value.map(s=>!s||s.texture?s:j(s)||t.value!=="dynamic"&&(o.value||ct(s))?null:s);return eo(m,r.value)}),a=Hn(n.value.packed.pages.map(m=>({width:m.width,height:m.height,url:null}))),i=[];return Dn(()=>[n.value,t.value],([m,s],l,c)=>{let{packed:u,atlasScale:y}=m,f=!1;pe(i),i=[],a.value=u.pages.map(g=>({width:g.width,height:g.height,url:null})),c(()=>{f=!0,pe(i),i=[]}),!(u.pages.length===0||typeof document>"u")&&Co(u.pages,s,document,y,()=>f).then(g=>{if(f){pe(g.flatMap(v=>v.url?.startsWith("blob:")?[v.url]:[]));return}i=g.flatMap(v=>v.url?.startsWith("blob:")?[v.url]:[]),a.value=g}).catch(()=>{f||(a.value=u.pages.map(g=>({width:g.width,height:g.height,url:null})))})},{immediate:!0}),On(()=>{pe(i),i=[]}),{entries:ie(()=>n.value.packed.entries),pages:a,ready:ie(()=>a.value.length===0||a.value.every(m=>!!m.url))}}function te({entry:e,page:t,textureLighting:r,className:o,style:n,domAttrs:a,pointerEvents:i="auto"}){let m=r==="dynamic",s=m&&t?.url?`url(${t.url})`:void 0,l=!m&&t?.url?`url(${t.url}) -${e.x}px -${e.y}px / ${t.width}px ${t.height}px no-repeat`:void 0,c={width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Oe(e.matrix),background:l,backgroundImage:m&&t?.url?`url(${t.url})`:void 0,backgroundPosition:m?`-${e.x}px -${e.y}px`:void 0,backgroundSize:m&&t?`${t.width}px ${t.height}px`:void 0,...m?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...m&&s?{maskImage:s,maskMode:"alpha",maskPosition:`-${e.x}px -${e.y}px`,maskSize:t?`${t.width}px ${t.height}px`:void 0,maskRepeat:"no-repeat",WebkitMaskImage:s,WebkitMaskPosition:`-${e.x}px -${e.y}px`,WebkitMaskSize:t?`${t.width}px ${t.height}px`:void 0,WebkitMaskRepeat:"no-repeat"}:null,opacity:t?.url?void 0:0,pointerEvents:i==="none"?"none":void 0,...n},u=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([f,g])=>[`data-${f}`,String(g)])):{},y=o?.trim()||void 0;return He("s",{class:y,style:c,...u,...a})}function ne({entry:e,className:t,style:r,domAttrs:o,pointerEvents:n="auto"}){let a=ct(e),i=a?null:ao(e),m=a?{width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Oe(e.matrix),background:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...r}:{width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:Oe(e.matrix),color:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...r},s=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([u,y])=>[`data-${u}`,String(y)])):{},l=t?.trim()||void 0,c=u=>{let y=u.el;y&&(i?y.style.setProperty("border-shape",i):y.style.removeProperty("border-shape"))};return He(a?"b":"i",{class:l,style:m,...s,...o,onVnodeMounted:c,onVnodeUpdated:c})}function oe({entry:e,textureLighting:t,className:r,style:o,domAttrs:n,pointerEvents:a="auto"}){let i=uo(e,t,a);if(!i)return null;let m=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([l,c])=>[`data-${l}`,String(c)])):{},s=r?.trim()||void 0;return He("u",{class:s,style:{...i,...o},...m,...n})}var pt=Mo({name:"PolyScene",inheritAttrs:!1,props:{polygons:{type:Array,default:void 0},perspective:{type:Number},rotX:{type:Number},rotY:{type:Number},zoom:{type:Number},directionalLight:{type:Object,default:void 0},ambientLight:{type:Object,default:void 0},textureLighting:{type:String,default:"baked"},atlasScale:{type:[Number,String],default:void 0},autoCenter:{type:Boolean,default:!1},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},debugShowLabels:{type:Boolean},debugShowBackfaces:{type:Boolean}},setup(e,{slots:t,attrs:r}){let o=Ao($);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{store:n,sceneElRef:a}=o,i=Y(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight}));Eo(Te,i);let m=n.getState().cameraState,s=So(null);ft(s,C=>{a.value=C});let l=!1;To(()=>{l||typeof document<"u"&&(ye(document),l=!0)}),ft(()=>e.debugShowBackfaces,C=>{let p=s.value;p&&p.classList.toggle("polycss-debug-show-backfaces",!!C)});let c=Y(()=>e.polygons??[]),u=Y(()=>({directionalLight:e.directionalLight})),y=fe(c,u),f=Y(()=>({"--scene-transform":wo(m).getStyle().transform})),g=Y(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,atlasScale:e.atlasScale})),v=Y(()=>{let C=e.textureLighting==="dynamic",p=C?void 0:e.directionalLight,A=C?void 0:e.ambientLight;return y.value.polygons.map((P,E)=>Q(P,E,{tileSize:g.value.tileSize,layerElevation:g.value.layerElevation,directionalLight:p,ambientLight:A}))}),b=Y(()=>e.textureLighting??"baked"),R=Y(()=>e.atlasScale),H=ee(v,b,R),O=Y(()=>{if(e.textureLighting!=="dynamic")return null;let C=e.directionalLight?.direction??[.4,-.7,.59],p=Math.hypot(C[0],C[1],C[2])||1,A=C[0]/p,P=C[1]/p,E=C[2]/p,M=yt(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],S=yt(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],w=e.directionalLight?.intensity??1,L=e.ambientLight?.intensity??.4,h=k=>(k/255).toFixed(4);return{"--plx":A.toFixed(4),"--ply":P.toFixed(4),"--plz":E.toFixed(4),"--plr":h(M[0]),"--plg":h(M[1]),"--plb":h(M[2]),"--pli":w.toFixed(4),"--par":h(S[0]),"--pag":h(S[1]),"--pab":h(S[2]),"--pai":L.toFixed(4)}}),d=Y(()=>{if(!e.autoCenter)return;let C=y.value.sceneBbox,p=g.value,A=(C.min[1]+C.max[1])/2*p.tileSize,P=(C.min[0]+C.max[0])/2*p.tileSize,E=(C.min[2]+C.max[2])/2*p.layerElevation;return`translate3d(${-A}px, ${-P}px, ${-E}px)`});return Lo(()=>{}),()=>{let C=`polycss-scene${e.class?` ${e.class}`:""}`,p=g.value,A=H.entries.value.map((M,S)=>{if(M)return te({entry:M,page:H.pages.value[M.pageIndex],textureLighting:p.textureLighting??"baked"});let w=v.value[S];return!w||w.texture?null:j(w)?oe({entry:w,textureLighting:p.textureLighting??"baked"}):ne({entry:w})}),P=t.default?.()??[],E=d.value?[dt("div",{class:"polycss-offset",style:{"--offset-transform":d.value}},[...A,...P])]:[...A,...P];return dt("div",{ref:s,class:C,"data-polycss-lighting":p.textureLighting??"baked","aria-hidden":"true",style:{...f.value,...O.value??null,...r.style},...Object.fromEntries(Object.entries(r).filter(([M])=>M!=="style"&&M!=="class"))},E)}}});import{defineComponent as Do,h as Ce,computed as z,inject as ko,onMounted as Io,onBeforeUnmount as _o,ref as vt}from"vue";import{computeSceneBbox as Vo,inverseRotateVec3 as xt}from"@layoutit/polycss-core";import{ref as ve,watch as Ro,onUnmounted as Oo}from"vue";import{loadMesh as Ho}from"@layoutit/polycss-core";var gt=[],ke=[];function xe(e,t){let r=ve(gt),o=ve(!!e.value),n=ve(null),a=ve(ke),i=null;function m(){if(i){try{i.dispose()}catch{}i=null}}return Ro(e,(s,l,c)=>{if(!s){m(),r.value=gt,o.value=!1,n.value=null,a.value=ke;return}let u=!1;o.value=!0,n.value=null;let y=i;Ho(s,t).then(f=>{if(u){try{f.dispose()}catch{}return}if(y)try{y.dispose()}catch{}i=f,r.value=f.polygons,o.value=!1,n.value=null,a.value=f.warnings??ke}).catch(f=>{if(u)return;let g=f instanceof Error?f:new Error(String(f));o.value=!1,n.value=g}),c(()=>{u=!0})},{immediate:!0}),Oo(()=>{m()}),{polygons:r,loading:o,error:n,warnings:a,dispose:m}}var Ie=new WeakMap;function ht(e,t){Ie.set(e,t)}function Pt(e){Ie.delete(e)}function re(e){let t=e;for(;t;){if(t instanceof HTMLElement){let r=Ie.get(t);if(r)return r}t=t.parentElement}return null}function be(e,t,r){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let n of o){let a=n.getBoundingClientRect();if(!(a.width<=0||a.height<=0)&&t>=a.left&&t<=a.right&&r>=a.top&&r<=a.bottom)return!0}return!1}function _e(e,t,r){if(typeof document>"u")return null;let o=Array.from(document.querySelectorAll(".polycss-mesh"));for(let n of o){if(r&&!r(n))continue;let a=re(n);if(a&&be(n,e,t))return a}return null}function $o(e,t,r){let o=[];return e&&o.push(`translate3d(${e[0]}px, ${e[1]}px, ${e[2]}px)`),t!==void 0&&(typeof t=="number"?t!==1&&o.push(`scale3d(${t}, ${t}, ${t})`):o.push(`scale3d(${t[0]}, ${t[1]}, ${t[2]})`)),r&&(r[0]&&o.push(`rotateX(${r[0]}deg)`),r[1]&&o.push(`rotateY(${r[1]}deg)`),r[2]&&o.push(`rotateZ(${r[2]}deg)`)),o.length>0?o.join(" "):void 0}function Uo(e){if(e.length===0)return e;let t=Vo(e),r=(t.min[0]+t.max[0])/2,o=(t.min[1]+t.max[1])/2,n=(t.min[2]+t.max[2])/2;if(r===0&&o===0&&n===0)return e;let a=i=>[i[0]-r,i[1]-o,i[2]-n];return e.map(i=>({...i,vertices:i.vertices.map(a),...i.textureTriangles?.length?{textureTriangles:i.textureTriangles.map(m=>({...m,vertices:m.vertices.map(a)}))}:null}))}var N=Do({name:"PolyMesh",inheritAttrs:!1,props:{id:{type:String,default:void 0},src:{type:String,default:void 0},mtl:{type:String,default:void 0},polygons:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},textureLighting:{type:String,default:void 0},atlasScale:{type:[Number,String],default:void 0},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},onClick:{type:Function,default:void 0},onContextMenu:{type:Function,default:void 0},onDoubleClick:{type:Function,default:void 0},onWheel:{type:Function,default:void 0},onPointerDown:{type:Function,default:void 0},onPointerUp:{type:Function,default:void 0},onPointerMove:{type:Function,default:void 0},onPointerOver:{type:Function,default:void 0},onPointerOut:{type:Function,default:void 0},onPointerEnter:{type:Function,default:void 0},onPointerLeave:{type:Function,default:void 0},onPointerCancel:{type:Function,default:void 0}},setup(e,{slots:t,attrs:r,expose:o}){let n=z(()=>e.src??""),a=z(()=>e.mtl?{mtlUrl:e.mtl}:void 0),i=xe(n,a.value),m=z(()=>e.src?i.polygons.value:e.polygons??[]),s=z(()=>e.autoCenter?Uo(m.value):m.value),l=!t.polygon,c=ot(),u=z(()=>e.textureLighting??c?.value.textureLighting??"baked"),y=z(()=>u.value==="dynamic"?void 0:c?.value.directionalLight),f=z(()=>u.value==="dynamic"?void 0:c?.value.ambientLight),g=z(()=>{if(u.value!=="dynamic")return null;let E=e.rotation;if(!E||E[0]===0&&E[1]===0&&E[2]===0)return null;let M=c?.value.directionalLight?.direction;if(!M)return null;let S=xt(M,E),w=Math.hypot(S[0],S[1],S[2])||1;return{"--plx":(S[0]/w).toFixed(4),"--ply":(S[1]/w).toFixed(4),"--plz":(S[2]/w).toFixed(4)}}),v=vt(e.rotation),b=z(()=>{if(!l)return[];let E=y.value,M=E&&v.value?{...E,direction:xt(E.direction,v.value)}:E;return s.value.map((S,w)=>Q(S,w,{directionalLight:M,ambientLight:f.value}))}),R=z(()=>e.atlasScale),H=ee(b,u,R),O=vt(null),d={get element(){return O.value},get id(){return e.id},getPosition:()=>e.position,getRotation:()=>e.rotation,getScale:()=>e.scale,getPolygons:()=>s.value,rebakeAtlas:()=>{v.value=e.rotation}};o(d),Io(()=>{O.value&&ht(O.value,d)}),_o(()=>{O.value&&Pt(O.value)});let C=ko($,null),p=null;function A(E,M,S){let w=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let D=document.elementsFromPoint(M,S),x=new Set;for(let T of D){let _=re(T);_&&!x.has(_)&&(x.add(_),w.push({object:_}))}}let L=0,h=0,k=C?.cameraElRef.value;if(k){let D=k.getBoundingClientRect();D.width>0&&D.height>0&&(L=(M-D.left)/D.width*2-1,h=-((S-D.top)/D.height*2-1))}let I=0;return p&&(I=Math.hypot(M-p.x,S-p.y)),{object:w[0]?.object??d,eventObject:d,intersections:w,pointer:{x:L,y:h},delta:I,nativeEvent:E,stopPropagation:()=>E.stopPropagation()}}function P(E,M,S,w){E&&E(A(M,S,w))}return()=>{let M={transform:$o(e.position,e.scale,e.rotation),...g.value??void 0,...r.style},S=Object.fromEntries(Object.entries(r).filter(([x])=>x!=="style"&&x!=="class")),w=`polycss-mesh${e.class?` ${e.class}`:""}`,L={};e.onClick&&(L.onClick=x=>{let T=x;P(e.onClick,T,T.clientX,T.clientY)}),e.onContextMenu&&(L.onContextmenu=x=>{let T=x;P(e.onContextMenu,T,T.clientX,T.clientY)}),e.onDoubleClick&&(L.onDblclick=x=>{let T=x;P(e.onDoubleClick,T,T.clientX,T.clientY)}),e.onWheel&&(L.onWheel=x=>{let T=x;P(e.onWheel,T,T.clientX,T.clientY)}),L.onPointerdown=x=>{let T=x;p={x:T.clientX,y:T.clientY},P(e.onPointerDown,T,T.clientX,T.clientY)},L.onPointerup=x=>{let T=x;P(e.onPointerUp,T,T.clientX,T.clientY),p=null},e.onPointerMove&&(L.onPointermove=x=>{let T=x;P(e.onPointerMove,T,T.clientX,T.clientY)}),(e.onPointerOver||e.onPointerEnter)&&(L.onPointerenter=x=>{let T=x;P(e.onPointerOver,T,T.clientX,T.clientY),P(e.onPointerEnter,T,T.clientX,T.clientY)}),(e.onPointerOut||e.onPointerLeave)&&(L.onPointerleave=x=>{let T=x;P(e.onPointerOut,T,T.clientX,T.clientY),P(e.onPointerLeave,T,T.clientX,T.clientY)}),e.onPointerCancel&&(L.onPointercancel=x=>{let T=x;P(e.onPointerCancel,T,T.clientX,T.clientY),p=null});let h=e.id?{"data-poly-mesh-id":e.id}:{};if(e.src&&i.loading.value&&i.polygons.value.length===0)return Ce("div",{ref:O,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:M,...h,...L,...S},t.fallback?.()??[]);if(e.src&&i.error.value&&i.polygons.value.length===0)return Ce("div",{ref:O,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:M,...h,...L,...S},t.error?.({error:i.error.value})??[]);let k=s.value,I=t.polygon?k.map((x,T)=>Ce("template",{key:T},t.polygon?.({polygon:x,index:T}))):H.entries.value.map((x,T)=>{if(x)return te({entry:x,page:H.pages.value[x.pageIndex],textureLighting:u.value});let _=b.value[T];return!_||_.texture?null:j(_)?oe({entry:_,textureLighting:u.value}):ne({entry:_})}),D=t.default?.()??[];return Ce("div",{ref:O,class:w,style:M,...h,...L,...S},[...I,...D])}}});import{computed as bt}from"vue";function Xo(e){return typeof e=="function"?bt(()=>{let{texture:t,key:r}=e();return{texture:t,key:r}}):bt(()=>({texture:e.texture,key:e.key}))}import{computed as ae,defineComponent as Yo,h as Ct}from"vue";function zo(e){if(e.length!==4)return null;let t=[...new Set(e.map(n=>n[0]))].sort((n,a)=>n-a),r=[...new Set(e.map(n=>n[1]))].sort((n,a)=>n-a);if(t.length!==2||r.length!==2)return null;let o=new Set([`${t[0]},${r[0]}`,`${t[0]},${r[1]}`,`${t[1]},${r[0]}`,`${t[1]},${r[1]}`]);for(let n of e)if(!o.has(`${n[0]},${n[1]}`))return null;return{u0:t[0],u1:t[1],v0:r[0],v1:r[1]}}function No({plan:e,material:t,uvRect:r,className:o,style:n,domAttrs:a,pointerEvents:i="auto"}){let{u0:m,u1:s,v0:l,v1:c}=r,u=s-m,y=c-l,f=e.canvasW/u,g=e.canvasH/y,v=Math.max(l,c),b=m*f,R=(1-v)*g,H={width:`${e.canvasW}px`,height:`${e.canvasH}px`,transform:`matrix3d(${e.matrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${f}px ${g}px`,backgroundPosition:`-${b}px -${R}px`,pointerEvents:i==="none"?"none":void 0,...n},O=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([C,p])=>[`data-${C}`,String(p)])):{},d=o?.trim()||void 0;return Ct("i",{class:d,style:H,...O,...a})}var Mt=Yo({name:"Poly",inheritAttrs:!1,props:{vertices:{type:Array,required:!0},color:{type:String},texture:{type:String},uvs:{type:Array,default:void 0},data:{type:Object,default:void 0},material:{type:Object,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},textureLighting:{type:String,default:void 0},atlasScale:{type:[Number,String],default:void 0},context:{type:Object,default:void 0},baseColor:{type:String},pointerEvents:{type:String,default:"auto"}},setup(e,{attrs:t}){let r=ae(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=ae(()=>e.atlasScale??e.context?.atlasScale),n=ae(()=>e.material?.texture??e.texture),a=ae(()=>e.material&&e.uvs?zo(e.uvs):null),i=ae(()=>{let l=e.context?.tileSize??50;return Q({vertices:e.vertices,color:e.baseColor??e.color,texture:n.value,uvs:e.uvs,data:e.data},0,{tileSize:l,layerElevation:e.context?.layerElevation??l,directionalLight:e.context?.directionalLight})}),m=ae(()=>a.value?[]:[i.value]),s=ee(m,r,o);return()=>{let l=i.value,c=s.entries.value[0],u=[];e.position&&u.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&&u.push(`scale3d(${e.scale}, ${e.scale}, ${e.scale})`):u.push(`scale3d(${e.scale[0]}, ${e.scale[1]}, ${e.scale[2]})`)),e.rotation&&(e.rotation[0]&&u.push(`rotateX(${e.rotation[0]}deg)`),e.rotation[1]&&u.push(`rotateY(${e.rotation[1]}deg)`),e.rotation[2]&&u.push(`rotateZ(${e.rotation[2]}deg)`));let y=u.length>0?u.join(" "):void 0,f={};if(e.data)for(let[R,H]of Object.entries(e.data))f[`data-${R}`]=String(H);let g={...t,...f},v=Object.fromEntries(Object.entries(g).filter(([R])=>R!=="class"&&R!=="style")),b;return a.value&&e.material&&l?b=No({plan:l,material:e.material,uvRect:a.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):c?b=te({entry:c,page:s.pages.value[c.pageIndex],textureLighting:r.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):l&&!l.texture&&(b=j(l)?oe({entry:l,textureLighting:r.value,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"}):ne({entry:l,className:g.class??void 0,style:g.style,domAttrs:v,pointerEvents:e.pointerEvents??"auto"})),b?y?Ct("div",{class:"polycss-poly-wrapper",style:{position:"absolute",transformStyle:"preserve-3d",transform:y}},[b]):b:null}}});import{defineComponent as Fo,inject as jo,onMounted as Bo,onBeforeUnmount as Wo,watch as Ve,ref as Zo}from"vue";import{BASE_TILE as At}from"@layoutit/polycss-core";var Go=150,Et=4,Ko=513e-6,qo=10,Jo=3,St=16.67,Qo=50,Tt=.1,Lt=10,wt=0,Rt=5e3,er=.3,tr=.05;function nr(e){return e===!0?-1:e===void 0||e===!1?1:e}function or(e,t,r,o,n){let a=nr(n),i=e/Et*a,m=t/Et*a;return{rotX:Math.max(0,Math.min(100,r-m)),rotY:((o-i)%360+360)%360}}function Ot(e,t,r,o,n){let a=Math.max(.01,r),i=Math.max(.1,Math.cos(o*Math.PI/180)),m=-e/(a*At),s=-t/(a*At*i),l=-n*Math.PI/180,c=Math.cos(l),u=Math.sin(l);return{dWorldX:s*c-m*u,dWorldY:s*u+m*c}}var Ht=Fo({name:"PolyOrbitControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:Tt},maxZoom:{type:Number,default:Lt},minDistance:{type:Number,default:wt},maxDistance:{type:Number,default:Rt},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let r=jo($,null);if(!r)return typeof console<"u"&&console.warn("[polycss] <PolyOrbitControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:n,cameraElRef:a,applyTransformDirect:i}=r,m=()=>({rotX:n.value.state.rotX,rotY:n.value.state.rotY,zoom:n.value.state.zoom,target:n.value.state.target,distance:n.value.state.distance}),s=()=>{t("change",m())},l=()=>{t("interaction-start",m())},c=()=>{t("interaction-end",m())},u=null,y={x:0,y:0},f=Zo(!1),g=null,v=null,b=null;function R(){let d=a.value;if(!d)return;let C=!1,p={x:0,y:0},A=h=>{if(e.drag&&u===null&&h.isPrimary!==!1){h.preventDefault(),u=h.pointerId,y={x:h.clientX,y:h.clientY},d.style.cursor="grabbing";try{h.target.setPointerCapture(h.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(f.value=!0),l()}},P=h=>{if(u===null||h.pointerId!==u||!e.drag)return;h.preventDefault();let k=h.clientX-y.x,I=h.clientY-y.y;y={x:h.clientX,y:h.clientY};let D=n.value,x=D.state;if(h.shiftKey){let{dWorldX:T,dWorldY:_}=Ot(k,I,x.zoom,x.rotX,x.rotY);D.update({target:[x.target[0]+T,x.target[1]+_,x.target[2]]})}else{let{rotX:T,rotY:_}=or(k,I,x.rotX,x.rotY,e.invert);D.update({rotX:T,rotY:_})}i(),o.updateCameraFromRef(D),s()},E=h=>{if(u===h.pointerId){u=null,d.style.cursor=e.drag?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}f.value=!1,c()}},M=h=>{h.preventDefault()},S=h=>{h.button===2&&(C=!0,p={x:h.clientX,y:h.clientY})},w=h=>{if(!C||!e.drag)return;let k=h.clientX-p.x,I=h.clientY-p.y;p={x:h.clientX,y:h.clientY};let D=n.value,x=D.state,{dWorldX:T,dWorldY:_}=Ot(k,I,x.zoom,x.rotX,x.rotY);D.update({target:[x.target[0]+T,x.target[1]+_,x.target[2]]}),i(),o.updateCameraFromRef(D),s()},L=h=>{h.button===2&&C&&(C=!1,c())};d.style.cursor="grab",d.style.touchAction="none",d.style.userSelect="none",d.addEventListener("pointerdown",A),d.addEventListener("pointermove",P),d.addEventListener("pointerup",E),d.addEventListener("pointercancel",E),d.addEventListener("contextmenu",M),d.addEventListener("mousedown",S),d.addEventListener("mousemove",w),d.addEventListener("mouseup",L),g=()=>{d.removeEventListener("pointerdown",A),d.removeEventListener("pointermove",P),d.removeEventListener("pointerup",E),d.removeEventListener("pointercancel",E),d.removeEventListener("contextmenu",M),d.removeEventListener("mousedown",S),d.removeEventListener("mousemove",w),d.removeEventListener("mouseup",L),d.style.cursor="",d.style.touchAction="",d.style.userSelect=""}}function H(){let d=a.value;if(!d)return;let C=!1,p=null,A=P=>{if(!e.wheel)return;P.preventDefault();let E=P.deltaMode===1?16:P.deltaMode===2?100:1,M=P.deltaY*E;P.ctrlKey?M*=qo:M*=Jo;let S=n.value;if(e.dolly){let w=e.minDistance??wt,L=e.maxDistance??Rt,h=Math.max(w,Math.min(L,S.state.distance+M*tr));S.update({distance:h})}else{let w=Math.exp(-M*Ko),L=e.minZoom??Tt,h=e.maxZoom??Lt,k=Math.max(L,Math.min(h,S.state.zoom*w));S.update({zoom:k})}i(),o.updateCameraFromRef(S),C||(C=!0,l()),s(),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,C=!1,c()},Go)};d.addEventListener("wheel",A,{passive:!1}),v=()=>{d.removeEventListener("wheel",A),p!==null&&clearTimeout(p)}}function O(){let d=null,C=!1,p=0,A=P=>{if(C)return;let E=e.animate;if(!E){d=requestAnimationFrame(A);return}if(f.value)p=P;else{let M=Math.min(Qo,p?P-p:St);p=P;let w=(E.speed??er)*(M/St),L=n.value,h=L.state;if(E.axis==="x"){let k=((h.rotX+w)%360+360)%360;L.update({rotX:k})}else{let k=((h.rotY+w)%360+360)%360;L.update({rotY:k})}i(),o.updateCameraFromRef(L),s()}d=requestAnimationFrame(A)};d=requestAnimationFrame(A),b=()=>{C=!0,d!==null&&cancelAnimationFrame(d),b=null}}return Bo(()=>{e.drag&&R(),e.wheel&&H(),e.animate&&O()}),Wo(()=>{g?.(),v?.(),b?.(),g=null,v=null}),Ve(()=>e.drag,d=>{d&&!g&&R(),!d&&g&&(g(),g=null)}),Ve(()=>e.wheel,d=>{d&&!v&&H(),!d&&v&&(v(),v=null)}),Ve(()=>!!e.animate,d=>{d&&!b&&O(),!d&&b&&b()}),()=>null}});import{defineComponent as rr,inject as ar,onMounted as lr,onBeforeUnmount as ir,watch as $e,ref as sr}from"vue";import{BASE_TILE as Dt}from"@layoutit/polycss-core";var cr=150,kt=4,ur=513e-6,mr=10,dr=3,It=16.67,fr=50,_t=.1,Vt=10,$t=0,Ut=5e3,yr=.3,pr=.05;function gr(e){return e===!0?-1:e===void 0||e===!1?1:e}function Xt(e,t,r,o,n){let a=gr(n),i=e/kt*a,m=t/kt*a;return{rotX:Math.max(0,Math.min(100,r-m)),rotY:((o-i)%360+360)%360}}function hr(e,t,r,o,n){let a=Math.max(.01,r),i=Math.max(.1,Math.cos(o*Math.PI/180)),m=-e/(a*Dt),s=-t/(a*Dt*i),l=-n*Math.PI/180,c=Math.cos(l),u=Math.sin(l);return{dWorldX:s*c-m*u,dWorldY:s*u+m*c}}var Yt=rr({name:"PolyMapControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:_t},maxZoom:{type:Number,default:Vt},minDistance:{type:Number,default:$t},maxDistance:{type:Number,default:Ut},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let r=ar($,null);if(!r)return typeof console<"u"&&console.warn("[polycss] <PolyMapControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:n,cameraElRef:a,applyTransformDirect:i}=r,m=()=>({rotX:n.value.state.rotX,rotY:n.value.state.rotY,zoom:n.value.state.zoom,target:n.value.state.target,distance:n.value.state.distance}),s=()=>{t("change",m())},l=()=>{t("interaction-start",m())},c=()=>{t("interaction-end",m())},u=null,y={x:0,y:0},f=sr(!1),g=null,v=null,b=null;function R(){let d=a.value;if(!d)return;let C=!1,p={x:0,y:0},A=h=>{if(e.drag&&u===null&&h.isPrimary!==!1){h.preventDefault(),u=h.pointerId,y={x:h.clientX,y:h.clientY},d.style.cursor="grabbing";try{h.target.setPointerCapture(h.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(f.value=!0),l()}},P=h=>{if(u===null||h.pointerId!==u||!e.drag)return;h.preventDefault();let k=h.clientX-y.x,I=h.clientY-y.y;y={x:h.clientX,y:h.clientY};let D=n.value,x=D.state;if(h.shiftKey){let{rotX:T,rotY:_}=Xt(k,I,x.rotX,x.rotY,e.invert);D.update({rotX:T,rotY:_})}else{let{dWorldX:T,dWorldY:_}=hr(k,I,x.zoom,x.rotX,x.rotY);D.update({target:[x.target[0]+T,x.target[1]+_,x.target[2]]})}i(),o.updateCameraFromRef(D),s()},E=h=>{if(u===h.pointerId){u=null,d.style.cursor=e.drag?"grab":"";try{h.target.releasePointerCapture(h.pointerId)}catch{}f.value=!1,c()}},M=h=>{h.preventDefault()},S=h=>{h.button===2&&(C=!0,p={x:h.clientX,y:h.clientY})},w=h=>{if(!C||!e.drag)return;let k=h.clientX-p.x,I=h.clientY-p.y;p={x:h.clientX,y:h.clientY};let D=n.value,x=D.state,{rotX:T,rotY:_}=Xt(k,I,x.rotX,x.rotY,e.invert);D.update({rotX:T,rotY:_}),i(),o.updateCameraFromRef(D),s()},L=h=>{h.button===2&&C&&(C=!1,c())};d.style.cursor="grab",d.style.touchAction="none",d.style.userSelect="none",d.addEventListener("pointerdown",A),d.addEventListener("pointermove",P),d.addEventListener("pointerup",E),d.addEventListener("pointercancel",E),d.addEventListener("contextmenu",M),d.addEventListener("mousedown",S),d.addEventListener("mousemove",w),d.addEventListener("mouseup",L),g=()=>{d.removeEventListener("pointerdown",A),d.removeEventListener("pointermove",P),d.removeEventListener("pointerup",E),d.removeEventListener("pointercancel",E),d.removeEventListener("contextmenu",M),d.removeEventListener("mousedown",S),d.removeEventListener("mousemove",w),d.removeEventListener("mouseup",L),d.style.cursor="",d.style.touchAction="",d.style.userSelect=""}}function H(){let d=a.value;if(!d)return;let C=!1,p=null,A=P=>{if(!e.wheel)return;P.preventDefault();let E=P.deltaMode===1?16:P.deltaMode===2?100:1,M=P.deltaY*E;P.ctrlKey?M*=mr:M*=dr;let S=n.value;if(e.dolly){let w=e.minDistance??$t,L=e.maxDistance??Ut,h=Math.max(w,Math.min(L,S.state.distance+M*pr));S.update({distance:h})}else{let w=Math.exp(-M*ur),L=e.minZoom??_t,h=e.maxZoom??Vt,k=Math.max(L,Math.min(h,S.state.zoom*w));S.update({zoom:k})}i(),o.updateCameraFromRef(S),C||(C=!0,l()),s(),p!==null&&clearTimeout(p),p=setTimeout(()=>{p=null,C=!1,c()},cr)};d.addEventListener("wheel",A,{passive:!1}),v=()=>{d.removeEventListener("wheel",A),p!==null&&clearTimeout(p)}}function O(){let d=null,C=!1,p=0,A=P=>{if(C)return;let E=e.animate;if(!E){d=requestAnimationFrame(A);return}if(f.value)p=P;else{let M=Math.min(fr,p?P-p:It);p=P;let w=(E.speed??yr)*(M/It),L=n.value,h=L.state;if(E.axis==="x"){let k=((h.rotX+w)%360+360)%360;L.update({rotX:k})}else{let k=((h.rotY+w)%360+360)%360;L.update({rotY:k})}i(),o.updateCameraFromRef(L),s()}d=requestAnimationFrame(A)};d=requestAnimationFrame(A),b=()=>{C=!0,d!==null&&cancelAnimationFrame(d),b=null}}return lr(()=>{e.drag&&R(),e.wheel&&H(),e.animate&&O()}),ir(()=>{g?.(),v?.(),b?.(),g=null,v=null}),$e(()=>e.drag,d=>{d&&!g&&R(),!d&&g&&(g(),g=null)}),$e(()=>e.wheel,d=>{d&&!v&&H(),!d&&v&&(v(),v=null)}),$e(()=>!!e.animate,d=>{d&&!b&&O(),!d&&b&&b()}),()=>null}});import{defineComponent as Pr,h as Ue,inject as vr,onBeforeUnmount as xr,onMounted as zt,ref as Me,computed as ce}from"vue";import{arrowPolygons as br,ringPolygons as Cr}from"@layoutit/polycss-core";var Xe="#ff3653",Ye="#8adb00",ze="#2c8fff",Mr=.6,Ar=.8,Er=1,Ne=50,Nt=60,Sr=.6,Tr=.0125,Lr=.15,wr=.04,Rr=1,Or=.012,Hr=64,Dr=1e-4,Ft={0:1,1:0,2:2},jt=[{cssAxis:0,sign:1,key:"x",color:Xe},{cssAxis:0,sign:-1,key:"-x",color:Xe},{cssAxis:1,sign:1,key:"y",color:Ye},{cssAxis:1,sign:-1,key:"-y",color:Ye},{cssAxis:2,sign:1,key:"z",color:ze},{cssAxis:2,sign:-1,key:"-z",color:ze}],Bt=[{cssAxis:0,key:"x",color:Xe},{cssAxis:1,key:"y",color:Ye},{cssAxis:2,key:"z",color:ze}];function Wt(e,t){let r=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);if(!r)return e;let o=parseInt(r[1],16),n=parseInt(r[2],16),a=parseInt(r[3],16);return`rgba(${o}, ${n}, ${a}, ${t})`}function Kt(e,t){return!t||t<=0?e:Math.round(e/t)*t}function kr(e){return e.replace("-","")[0]}function Ir(e){if(e.length===0)return Nt;let t=1/0,r=1/0,o=1/0,n=-1/0,a=-1/0,i=-1/0;for(let m of e)for(let s of m.vertices)s[0]<t&&(t=s[0]),s[0]>n&&(n=s[0]),s[1]<r&&(r=s[1]),s[1]>a&&(a=s[1]),s[2]<o&&(o=s[2]),s[2]>i&&(i=s[2]);return Number.isFinite(t)?Math.max(n-t,a-r,i-o)*Ne*Sr:Nt}function Zt(e){let t=e.shaftLengthCss,r=[0,0,0];r[e.cssAxis]=e.sign;let o=e.wrapper.ownerDocument.createElement("div");o.style.position="absolute",o.style.left="0",o.style.top="0",o.style.width="0",o.style.height="0",o.style.transform=`translate3d(${r[0]*t}px, ${r[1]*t}px, ${r[2]*t}px)`,e.wrapper.appendChild(o);let n=e.wrapper.getBoundingClientRect(),a=o.getBoundingClientRect();e.wrapper.removeChild(o);let i=(a.left-n.left)/t,m=(a.top-n.top)/t,s=i*i+m*m;if(s<Dr)return;let l=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let c=y=>{let f=y.clientX-e.startClientX,g=y.clientY-e.startClientY,v=(f*i+g*m)/s;v=Kt(v,e.translationSnap);let b=[l[0]+v*r[0],l[1]+v*r[1],l[2]+v*r[2]];e.onObjectChange?.({object:e.target,position:b}),e.onChange?.()},u=()=>{window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",u),window.removeEventListener("pointercancel",u);let y=f=>{f.stopPropagation(),f.stopImmediatePropagation()};window.addEventListener("click",y,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",y,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",c),window.addEventListener("pointerup",u),window.addEventListener("pointercancel",u)}function Gt(e){let t=e.wrapper.getBoundingClientRect(),r=t.left,o=t.top,n=Math.atan2(e.startClientY-o,e.startClientX-r),a=0,i=e.target.getRotation()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let m=l=>{let c=Math.atan2(l.clientY-o,l.clientX-r),u=c-n;u>Math.PI?u-=2*Math.PI:u<-Math.PI&&(u+=2*Math.PI),a+=u,n=c;let y=a*180/Math.PI;y=Kt(y,e.rotationSnap);let f=[i[0],i[1],i[2]];f[e.cssAxis]=i[e.cssAxis]+y,e.onObjectChange?.({object:e.target,rotation:f}),e.onChange?.()},s=()=>{window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",s),window.removeEventListener("pointercancel",s);let l=c=>{c.stopPropagation(),c.stopImmediatePropagation()};window.addEventListener("click",l,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",l,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1),e.target.rebakeAtlas()};window.addEventListener("pointermove",m),window.addEventListener("pointerup",s),window.addEventListener("pointercancel",s)}function _r(e){return!!e&&typeof e=="object"&&"value"in e}function Vr(e){return e?_r(e)?e.value??null:e:null}var qt=Pr({name:"PolyTransformControls",props:{object:{type:null,default:null},mode:{type:String,default:"translate"},space:{type:String,default:"world"},size:{type:Number,default:1},showX:{type:Boolean,default:!0},showY:{type:Boolean,default:!0},showZ:{type:Boolean,default:!0},translationSnap:{type:Number,default:null},rotationSnap:{type:Number,default:null},enabled:{type:Boolean,default:!0}},emits:{change:()=>!0,objectChange:e=>!0,mouseDown:()=>!0,mouseUp:()=>!0,draggingChanged:e=>!0},setup(e,{emit:t}){let r=Me(null),o=Me(null),n=Me(new Map),a=ce(()=>Vr(e.object)),i=Me(0);zt(()=>{i.value++});let m=ce(()=>(i.value,Ir(a.value?.getPolygons()??[]))),s=ce(()=>m.value*e.size);function l(p){return o.value===p?Er:r.value===p?Ar:Mr}function c(){t("change")}function u(p){t("objectChange",p)}function y(p){t("draggingChanged",p)}function f(){t("mouseDown")}function g(){t("mouseUp")}let v=vr($,void 0),b=null;zt(()=>{let p=v?.cameraElRef.value;if(!p)return;let A=P=>{let E=a.value;if(!E||!e.enabled||P.target?.closest(".polycss-transform-gizmo"))return;let S={x:e.showX,y:e.showY,z:e.showZ},w=e.mode==="translate"?jt:Bt;for(let L of w){let h=L.key.replace("-","")[0];if(!S[h])continue;let k=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${L.key}`);if(!k||!be(k,P.clientX,P.clientY))continue;P.preventDefault(),P.stopPropagation();let I=k.closest("[data-poly-transform-controls]");if(!I)return;if(o.value=L.key,e.mode==="translate"){let D=L;Zt({cssAxis:D.cssAxis,sign:D.sign,shaftLengthCss:s.value,wrapper:I,target:E,startClientX:P.clientX,startClientY:P.clientY,translationSnap:e.translationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:x=>{x||(o.value=null),y(x)}})}else Gt({cssAxis:L.cssAxis,wrapper:I,target:E,startClientX:P.clientX,startClientY:P.clientY,rotationSnap:e.rotationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:D=>{D||(o.value=null),y(D)}});return}};p.addEventListener("pointerdown",A),b=()=>p.removeEventListener("pointerdown",A)}),xr(()=>{b?.()});let R=ce(()=>{if(e.mode!=="translate")return[];i.value;let A=s.value/Ne;return jt.filter(P=>({x:e.showX,y:e.showY,z:e.showZ})[kr(P.key)]).map(P=>{let E=l(P.key);return{spec:P,polygons:br({axis:Ft[P.cssAxis],sign:P.sign,shaftLength:A,shaftHalfThickness:A*Tr,headLength:A*Lr,headHalfThickness:A*wr,color:Wt(P.color,E)})}})}),H=ce(()=>{if(e.mode!=="rotate")return[];i.value;let A=s.value*Rr/Ne;return Bt.filter(P=>({x:e.showX,y:e.showY,z:e.showZ})[P.key]).map(P=>{let E=l(P.key);return{spec:P,polygons:Cr({axis:Ft[P.cssAxis],radius:A,halfThickness:A*Or,segments:Hr,color:Wt(P.color,E)})}})});function O(p){return A=>{if(!e.enabled)return;let P=a.value;if(!P)return;A.stopPropagation();let M=A.eventObject.element?.closest("[data-poly-transform-controls]");M&&(o.value=p.key,Zt({cssAxis:p.cssAxis,sign:p.sign,shaftLengthCss:s.value,wrapper:M,target:P,startClientX:A.nativeEvent.clientX,startClientY:A.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:S=>{S||(o.value=null),y(S)}}))}}function d(p){return A=>{if(!e.enabled)return;let P=a.value;if(!P)return;A.stopPropagation();let M=A.eventObject.element?.closest("[data-poly-transform-controls]");M&&(o.value=p.key,Gt({cssAxis:p.cssAxis,wrapper:M,target:P,startClientX:A.nativeEvent.clientX,startClientY:A.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:c,onObjectChange:u,onMouseDown:f,onMouseUp:g,onDraggingChanged:S=>{S||(o.value=null),y(S)}}))}}function C(p){return{onPointerOver:()=>{r.value=p},onPointerOut:()=>{r.value===p&&(r.value=null)}}}return()=>{let p=a.value;if(!p)return null;let A=p.getPosition()??[0,0,0],P={position:"absolute",transformStyle:"preserve-3d",transform:`translate3d(${A[0]}px, ${A[1]}px, ${A[2]}px)`,zIndex:1e3},E=e.mode==="translate"?R.value.map(({spec:M,polygons:S})=>Ue(N,{key:M.key,polygons:S,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${M.key}`,textureLighting:"baked",onPointerDown:O(M),...C(M.key)})):H.value.map(({spec:M,polygons:S})=>Ue(N,{key:M.key,polygons:S,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${M.key}`,textureLighting:"baked",onPointerDown:d(M),...C(M.key)}));return Ue("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:P},E)}}});import{defineComponent as $r,h as Ur,inject as Fe,onBeforeUnmount as Xr,onMounted as Yr,provide as zr,reactive as Nr,ref as Fr,computed as jr}from"vue";var ue=Symbol("polycss.selection"),Jt=$r({name:"PolySelect",props:{multiple:{type:Boolean,default:!1},clearOnMiss:{type:Boolean,default:!0},filter:{type:Function,default:void 0}},emits:{change:e=>!0,pointerMissed:e=>!0},setup(e,{emit:t,slots:r}){let o=Nr({selected:[]}),n=jr(()=>o.selected);function a(c){let u=e.filter?e.filter(c):c;o.selected=u,t("change",u)}let i={get selected(){return o.selected},set:c=>a(c),add:c=>{e.multiple?o.selected.includes(c)||a([...o.selected,c]):a([c])},remove:c=>{o.selected.includes(c)&&a(o.selected.filter(u=>u!==c))},toggle:c=>{o.selected.includes(c)?a(o.selected.filter(u=>u!==c)):e.multiple?a([...o.selected,c]):a([c])},clear:()=>a([]),has:c=>o.selected.includes(c)};zr(ue,{selected:n,api:i});let m=Fe($,void 0),s=(c,u)=>_e(c,u,y=>!y.closest("[data-poly-transform-controls]")),l=null;return Yr(()=>{let c=m?.cameraElRef.value;if(!c)return;let u=y=>{if(y.target?.closest("[data-poly-transform-controls]"))return;let g=re(y.target)??s(y.clientX,y.clientY);if(!g){t("pointerMissed",y),e.clearOnMiss&&a([]);return}e.multiple&&(y.shiftKey||y.metaKey||y.ctrlKey)?i.toggle(g):o.selected.length===1&&o.selected[0]===g?a([]):a([g])};c.addEventListener("click",u),l=()=>c.removeEventListener("click",u)}),Xr(()=>{l?.()}),()=>Ur("div",{style:{display:"contents"},"data-poly-select":""},r.default?.())}});function Qt(){let e=Fe(ue,void 0);return e?e.selected:Fr([])}function en(){let e=Fe(ue,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}import{defineComponent as Br,h as Wr,computed as Zr}from"vue";import{axesHelperPolygons as Gr}from"@layoutit/polycss-core";var tn=Br({name:"PolyAxesHelper",props:{size:{type:Number,default:void 0},thickness:{type:Number,default:void 0},negative:{type:Boolean,default:void 0},xColor:{type:String,default:void 0},yColor:{type:String,default:void 0},zColor:{type:String,default:void 0}},setup(e){let t=Zr(()=>Gr({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>Wr(N,{polygons:t.value})}});import{defineComponent as Kr,h as qr,computed as je}from"vue";import{octahedronPolygons as Jr}from"@layoutit/polycss-core";var Be=50,nn=Kr({name:"PolyDirectionalLightHelper",props:{light:{type:Object,required:!0},target:{type:Array,default:void 0},distance:{type:Number,default:5},size:{type:Number,default:.35},color:{type:String,default:void 0}},setup(e){let t=je(()=>e.color??e.light.color??"#ffd54a"),r=je(()=>Jr({center:[0,0,0],size:e.size,color:t.value})),o=je(()=>{let n=e.light.direction,a=n[0],i=n[1],m=n[2],s=Math.hypot(a,i,m)||1,l=e.target?.[0]??0,c=e.target?.[1]??0,u=e.target?.[2]??0,y=l+i/s*e.distance,f=c+a/s*e.distance,g=u+m/s*e.distance;return[f*Be,y*Be,g*Be]});return()=>qr(N,{polygons:r.value,position:o.value})}});import{ref as on,watch as Qr,onUnmounted as ea,computed as Ae}from"vue";import{createPolyAnimationMixer as ta}from"@layoutit/polycss-core";function B(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function na(e,t,r){let o=on(null),n=null,a=null,i=null,m=on(0);function s(){return r==null?o.value:B(r)??o.value}function l(){a!==null&&(cancelAnimationFrame(a),a=null),i=null}function c(){l(),n&&(n.stopAllAction(),n.uncacheRoot(),n=null,m.value++)}function u(){if(a!==null)return;function H(O){if(i===null){i=O,a=requestAnimationFrame(H);return}let d=(O-i)/1e3;i=O,n?.update(d),a=requestAnimationFrame(H)}a=requestAnimationFrame(H)}function y(){c();let H=B(e),O=B(t);if(!H||H.length===0||!O)return;let d=s();d&&(n=ta(d,O),m.value++,u())}let f=Qr(()=>{let H=B(e),O=B(t),d=r!=null?B(r):o.value;return{c:H,ctrl:O,r:d}},()=>y(),{immediate:!0,deep:!1});ea(()=>{f(),c()});let g=Ae(()=>B(e)??[]),v=Ae(()=>g.value.map(H=>H.name)),b=Ae(()=>(m.value,n)),R=Ae(()=>{m.value;let H=g.value,O={};for(let d of H)Object.defineProperty(O,d.name,{enumerable:!0,get(){if(!n)return null;try{return n.clipAction(d.name)}catch{return null}}});return O});return{ref:o,mixer:b,clips:g,names:v,actions:R}}import{normalizePolygons as Ai,mergePolygons as Ei,coverPlanarPolygons as Si,cullInteriorPolygons as Ti,parseObj as Li,parseMtl as wi,parseGltf as Ri,bakeSolidTextureSamples as Oi,bakeSolidTextureSampledPolygons as Hi,loadMesh as Di,createIsometricCamera as ki,parseVox as Ii,polygonFaces as _i,computeTexturePaintMetrics as Vi,computeShapeLighting as $i,parseColor as Ui,parsePureColor as Xi,parseHexColor as Yi,parseRgbColor as zi,formatColor as Ni,clampChannel as Fi,shadeColor as ji,rotateVec3 as Bi,inverseRotateVec3 as Wi,axesHelperPolygons as Zi,arrowPolygons as Gi,ringPolygons as Ki,octahedronPolygons as qi,buildSceneContext as Ji,computeSceneBbox as Qi,BASE_TILE as es,DEFAULT_CAMERA_STATE as ts,DEFAULT_PROJECTION as ns,normalizeInvertMultiplier as os,createPolyAnimationMixer as rs,LoopOnce as as,LoopRepeat as ls,LoopPingPong as is}from"@layoutit/polycss-core";export{es as BASE_TILE,ts as DEFAULT_CAMERA_STATE,ns as DEFAULT_PROJECTION,as as LoopOnce,is as LoopPingPong,ls as LoopRepeat,Mt as Poly,tn as PolyAxesHelper,le as PolyCamera,$ as PolyCameraContextKey,nn as PolyDirectionalLightHelper,Yt as PolyMapControls,N as PolyMesh,Ht as PolyOrbitControls,tt as PolyOrthographicCamera,le as PolyPerspectiveCamera,pt as PolyScene,Jt as PolySelect,ue as PolySelectionContextKey,qt as PolyTransformControls,Gi as arrowPolygons,Zi as axesHelperPolygons,Hi as bakeSolidTextureSampledPolygons,Oi as bakeSolidTextureSamples,Ji as buildSceneContext,Fi as clampChannel,Qi as computeSceneBbox,$i as computeShapeLighting,Vi as computeTexturePaintMetrics,Si as coverPlanarPolygons,ki as createIsometricCamera,rs as createPolyAnimationMixer,Ti as cullInteriorPolygons,_e as findMeshUnderPoint,re as findPolyMeshHandle,Ni as formatColor,ye as injectPolyBaseStyles,Wi as inverseRotateVec3,Di as loadMesh,Ei as mergePolygons,os as normalizeInvertMultiplier,Ai as normalizePolygons,qi as octahedronPolygons,Ui as parseColor,Ri as parseGltf,Yi as parseHexColor,wi as parseMtl,Li as parseObj,Xi as parsePureColor,zi as parseRgbColor,Ii as parseVox,be as pointInMeshElement,_i as polygonFaces,Ki as ringPolygons,Bi as rotateVec3,ji as shadeColor,na as usePolyAnimation,Z as usePolyCamera,Xo as usePolyMaterial,xe as usePolyMesh,fe as usePolySceneContext,Qt as usePolySelect,en as usePolySelectionApi};
211
+
212
+ /* \u2500\u2500 Cast shadows (dynamic mode only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
213
+
214
+ /* <q> \u2014 dedicated shadow leaf. Same border-shape rendering trick as <i>
215
+ (border-color: currentColor fills the polygon outline) but with its
216
+ own tag so we don't have to thread :not(.polycss-shadow) exclusions
217
+ through every dynamic-mode color rule. backface-visibility must be
218
+ visible because the projection matrix is near-rank-deficient and the
219
+ resulting plane's normal can read as back-facing under some camera
220
+ angles; the leaf is intentionally always painted. Strip the UA's
221
+ default ::before/::after open-/close-quote so the element is just a
222
+ styled box. */
223
+ .polycss-scene q {
224
+ position: absolute;
225
+ display: block;
226
+ transform-origin: 0 0;
227
+ transform-style: preserve-3d;
228
+ margin: 0;
229
+ padding: 0;
230
+ font: inherit;
231
+ font-weight: normal;
232
+ font-style: normal;
233
+ line-height: 0;
234
+ quotes: none;
235
+ text-decoration: none;
236
+ backface-visibility: visible;
237
+ border-color: currentColor;
238
+ pointer-events: none;
239
+ }
240
+ .polycss-scene q::before,
241
+ .polycss-scene q::after {
242
+ content: none;
243
+ }
244
+
245
+ /*
246
+ * Rotate rings: one square quad per ring, masked to a donut. The mask uses
247
+ * --ring-inner-ratio (set inline by PolyTransformControls); hit-testing
248
+ * matches the donut shape so the inner hole isn't clickable.
249
+ */
250
+ .polycss-transform-ring i,
251
+ .polycss-transform-ring b,
252
+ .polycss-transform-ring s,
253
+ .polycss-transform-ring u {
254
+ --ring-inner-r: calc(var(--ring-inner-ratio, 0.92) * 50%);
255
+ --ring-outer-r: calc(var(--ring-outer-ratio, 1) * 50%);
256
+ -webkit-mask: radial-gradient(circle at 50% 50%,
257
+ transparent 0%,
258
+ transparent var(--ring-inner-r),
259
+ black var(--ring-inner-r),
260
+ black var(--ring-outer-r),
261
+ transparent var(--ring-outer-r));
262
+ mask: radial-gradient(circle at 50% 50%,
263
+ transparent 0%,
264
+ transparent var(--ring-inner-r),
265
+ black var(--ring-inner-r),
266
+ black var(--ring-outer-r),
267
+ transparent var(--ring-outer-r));
268
+ }
269
+
270
+ /* Shadow projection matrix. Projects any 3D point P onto the horizontal
271
+ ground plane (cssZ \u2248 G) along the CSS-space light direction (--clx/y/z).
272
+
273
+ The strict projection would set m22=0 (output.z is a constant G, flat).
274
+ Chromium SKIPS rendering elements whose composed transform is singular.
275
+ m22=0 makes it singular, so the shadow paints nothing. Fix: collapse along
276
+ z by a near-zero scale (Z_SQUASH = 0.01) \u2014 output.z \u2248 G with ~1% drift,
277
+ full-rank and renderable. Sub-pixel drift for any realistic scene size. */
278
+ .polycss-scene[data-polycss-lighting="dynamic"] {
279
+ --shadow-proj: matrix3d(
280
+ 1, 0, 0, 0,
281
+ 0, 1, 0, 0,
282
+ calc(-1 * var(--clx) / var(--clz)),
283
+ calc(-1 * var(--cly) / var(--clz)),
284
+ 0.01,
285
+ 0,
286
+ calc(var(--shadow-ground-cssz) * var(--clx) / var(--clz)),
287
+ calc(var(--shadow-ground-cssz) * var(--cly) / var(--clz)),
288
+ calc(var(--shadow-ground-cssz) * 0.99),
289
+ 1
290
+ );
291
+ }
292
+
293
+ /* <q> shadow leaf \u2014 Lambert-gated opacity. Polygons facing the light cast
294
+ full shadow; polygons facing away cast zero shadow. The * 10 multiplier
295
+ sharpens the cutoff so small positive Lambert values jump quickly to 1,
296
+ giving a near-binary visibility decision with a smooth edge transition. */
297
+ .polycss-scene q {
298
+ opacity: clamp(0, calc((var(--pnx) * var(--clx) + var(--pny) * var(--cly) + var(--pnz) * var(--clz)) * 10), 1);
299
+ }
300
+ `;import{parsePureColor as Ss}from"@layoutit/polycss-core";import{inject as Ho}from"vue";var st=Symbol("polycss/scene-context");function Vt(){return Ho(st,null)}import{computed as te,h as Xe,onBeforeUnmount as Io,ref as Vo,watch as Fo}from"vue";import{parsePureColor as Kt}from"@layoutit/polycss-core";var zo=50,No=[.4,-.7,.59],jo="#ffffff",Yo=1,Uo="#ffffff",Xo=.4,he=4096,Ft=1,$o=.1,Bo=1,Gt=he*he,Wo=Gt*3,ut=2048,Zo=4*1024*1024,Ko=16*1024*1024,Go=.995,ne=.001,qo=.75,Qo=1,Jo=250,zt=1.5,qt=3,er=2,tr=4,dt=64,de=64,ae=64,nr=128,Nt=50,jt=1e-7,Yt=16,or=.05,rr=4,ar=.6,G=1e-9,ir=.6,pe=new Map;function sr(e){let t=pe.get(e);return t||(t=new Promise((n,o)=>{let r=new Image;r.decoding="async",r.onload=()=>n(r),r.onerror=()=>o(new Error(`texture load failed: ${e}`)),r.src=e}),pe.set(e,t),t.then(()=>{pe.get(e)===t&&pe.delete(e)},()=>{pe.get(e)===t&&pe.delete(e)})),t}function $e(e){let t=typeof e=="string"?Number(e):e;return t===void 0||!Number.isFinite(t)?1:Math.min(Bo,Math.max($o,t))}function Be(e,t){let n=e.toFixed(t).replace(/\.?0+$/,"");return Object.is(Number(n),-0)?"0":n}function Ne(e,t=tr){let n=Be(e,t);return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function mt(e,t=qt){return`matrix3d(${e.split(",").map(n=>{let o=Number(n.trim());return Number.isFinite(o)?Be(o,t):n.trim()}).join(",")})`}function Ye(e,t=er){let n=Be(e,t);return Number(n)===0?"0":`${n}%`}function lr(e,t,n,o,r,i){let s=(e-n)*(i-o)-(t-o)*(r-n);return Math.abs(s)>jt?!1:(e-n)*(e-r)+(t-o)*(t-i)<=jt}function cr(e,t=Nt,n=Nt){let o=!1;for(let r=0,i=e.length-1;r<e.length;i=r++){let[s,d]=e[r],[a,c]=e[i];if(lr(t,n,s,d,a,c))return!0;d>n!=c>n&&t<(a-s)*(n-d)/(c-d)+s&&(o=!o)}return o}function Qt(e){return e.reduce((t,n)=>t+n.width*n.height,0)}function ur(e,t){let n=Qt(e);if(n<=0)return 1;let o=Math.max(1,...e.map(s=>Math.max(s.width,s.height))),r=ut/o,i=Math.sqrt(t/(n*4));return $e(Math.min(r,i))}function Jt(e){if(!e)return!1;let n=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return n?n("(pointer: coarse)").matches||n("(hover: none)").matches:!1}function dr(e){return Jt(e)?Zo:Ko}function mr(e,t){return e!==void 0&&e!=="auto"||Jt(t)?ae:nr}function fr(e,t){let n=e.matrix.split(",").map(o=>Number(o));return n.length!==16||n.some(o=>!Number.isFinite(o))?e.canonicalMatrix:(n[0]*=e.canvasW/t,n[1]*=e.canvasW/t,n[2]*=e.canvasW/t,n[4]*=e.canvasH/t,n[5]*=e.canvasH/t,n[6]*=e.canvasH/t,n.join(","))}function Ut(e,t){for(let n of e.entries)n&&(n.atlasCanonicalSize=t,n.atlasMatrix=fr(n,t));return e}function yr(e,t){let n=Qt(e),o=.5;return n<=Gt?o=1:n<=Wo&&(o=.75),$e(Math.min(o,ur(e,t)))}function pr(e,t){return e.reduce((n,o)=>Math.max(n,Math.ceil(o.width*t),Math.ceil(o.height*t)),0)}function gr(e,t){return e.reduce((n,o)=>n+Math.ceil(o.width*t)*Math.ceil(o.height*t)*4,0)}function hr(e,t,n){let o=pr(e,t),r=gr(e,t),i=o>ut?ut/o:1,s=r>n?Math.sqrt(n/r):1;return Math.min(i,s)}function vr(e,t,n){let o=yr(t.pages,n),r=o===1?t:Ue(e,o);for(let i=0;i<4;i++){let s=hr(r.pages,o,n);if(s>=1)break;let d=$e(o*s*Go);if(d>=o)break;o=d,r=Ue(e,o)}return{packed:r,atlasScale:o}}function Pr(e,t,n){let o=mr(t,n);if(t!==void 0&&t!=="auto"){let s=$e(t);return{packed:Ut(Ue(e,s),o),atlasScale:s,atlasCanonicalSize:o}}let r=Ue(e,1),i=vr(e,r,dr(n));return{packed:Ut(i.packed,o),atlasScale:i.atlasScale,atlasCanonicalSize:o}}function br(e){return Math.max(Ft,Math.ceil(Ft/e))}function ie(e,t,n=1,o=0,r=0,i=1,s=0,d=0){e.setTransform(n*t,o*t,r*t,i*t,s*t,d*t)}function le(e){let t=Kt(e);return t?{r:t.rgb[0],g:t.rgb[1],b:t.rgb[2]}:{r:255,g:255,b:255}}function ft({r:e,g:t,b:n}){return`${e},${t},${n}`}function xr(e){return Kt(e)?.alpha??1}function Oe(e){if(e.screenPts.length!==8)return!1;let t=[],n=[],o=(r,i)=>{for(let s of r)if(Math.abs(s-i)<=ne)return;r.push(i)};for(let r=0;r<e.screenPts.length;r+=2)o(t,e.screenPts[r]),o(n,e.screenPts[r+1]);if(t.length!==2||n.length!==2||(t.sort((r,i)=>r-i),n.sort((r,i)=>r-i),Math.abs(t[0])>ne||Math.abs(n[0])>ne||t[1]-t[0]<=ne||n[1]-n[0]<=ne))return!1;for(let r=0;r<e.screenPts.length;r+=2){let i=e.screenPts[r],s=e.screenPts[r+1],d=Math.abs(i-t[0])<=ne||Math.abs(i-t[1])<=ne,a=Math.abs(s-n[0])<=ne||Math.abs(s-n[1])<=ne;if(!d||!a)return!1}return!0}function oe(e){return!e.texture&&e.polygon.vertices.length===3}function De(e){return!e.texture&&!!e.projectiveMatrix&&!Oe(e)}function yt(){if(!!!globalThis.CSS?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let t=globalThis.matchMedia;return typeof t!="function"?!0:t("(pointer: fine)").matches&&t("(hover: hover)").matches}function en(){let e=(typeof window<"u"?window.navigator:globalThis.navigator)?.userAgent??"";if(!e)return!0;let t=/\b(?:Chrome|HeadlessChrome|Chromium|Edg|OPR)\//.test(e);return!/\bVersion\/[\d.]+.*\bSafari\//.test(e)||t}function Xt(e,t){e.set(t,(e.get(t)??0)+1)}function $t(e){let t,n=1;for(let[o,r]of e)r>n&&(t=o,n=r);return t}var Cr=new Map([["transform",0],["border-shape",1],["border-width",2],["width",3],["height",4],["color",5]]);function Er(e){let t=e.getAttribute("style");if(!t)return;let o=t.split(";").map(r=>r.trim()).filter(Boolean).map((r,i)=>{let s=r.slice(0,r.indexOf(":")).trim().toLowerCase();return{declaration:r,index:i,order:Cr.get(s)??Number.POSITIVE_INFINITY}}).sort((r,i)=>r.order-i.order||r.index-i.index).map(({declaration:r})=>r).join(";");o!==t&&e.setAttribute("style",o)}function tn(e,t){let n=new Map,o=new Map,r=new Map,i=en(),s=t!=="dynamic"&&yt();for(let c of e)if(!(!c||c.texture)){if(t==="dynamic"){if(!(i&&oe(c))&&!Oe(c))continue;let l=le(c.polygon.color??"#cccccc"),m=ft(l);Xt(o,m),r.has(m)||r.set(m,l);continue}!(i&&oe(c))&&!Oe(c)&&!s||Xt(n,c.shadedColor)}let d=$t(n),a=$t(o);return{paintColor:d,dynamicColorKey:a,dynamicColor:a?r.get(a):void 0}}function Mr(e){let t=[],n=e.canvasW||1,o=e.canvasH||1;for(let r=0;r<e.screenPts.length;r+=2){let i=Math.max(0,Math.min(100,e.screenPts[r]/n*100)),s=Math.max(0,Math.min(100,e.screenPts[r+1]/o*100));t.push([i,s])}return t}function Ar([e,t]){return`${Ye(e)} ${Ye(t)}`}function Sr(e){return`polygon(${e.map(Ar).join(",")})`}function Tr(e){if(cr(e))return"circle(0)";let t=0,n=0,o=Math.max(1,e.length);for(let[s,d]of e)t+=s,n+=d;let r=Ye(Math.max(0,Math.min(100,t/o))),i=Ye(Math.max(0,Math.min(100,n/o)));return`circle(0 at ${r} ${i})`}function pt(e){let t=Mr(e);return`${Sr(t)} ${Tr(t)}`}function nn(e,t=qt){return e.map(n=>Be(n,t)).join(",")}function on(e,t,n){let o=e.matrix.split(",").map(r=>Number(r));return o.length!==16||o.some(r=>!Number.isFinite(r))?e.matrix:(o[0]*=t,o[1]*=t,o[2]*=t,o[4]*=n,o[5]*=n,o[6]*=n,nn(o))}function wr(e){return on(e,(e.canvasW||1)/Yt,(e.canvasH||1)/Yt)}function Lr(e){return on(e,(e.canvasW||1)/dt,(e.canvasH||1)/dt)}function rn(e){if(e.length<3)return!1;let t=0;for(let n=0;n<e.length;n++){let o=e[n],r=e[(n+1)%e.length],i=e[(n+2)%e.length],s=(r[0]-o[0])*(i[1]-r[1])-(r[1]-o[1])*(i[0]-r[0]);if(Math.abs(s)<=G)return!1;let d=Math.sign(s);if(t===0)t=d;else if(d!==t)return!1}return!0}function Rr(e){let t=0;for(let n=0;n<e.length;n++){let o=e[n],r=e[(n+1)%e.length];t+=o[0]*r[1]-o[1]*r[0]}return t/2}function Or(e,t,n,o){let r=t[0]-e[0],i=t[1]-e[1],s=o[0]-n[0],d=o[1]-n[1],a=r*d-i*s;if(Math.abs(a)<=G)return null;let c=n[0]-e[0],l=n[1]-e[1],m=(c*d-l*s)/a;return[e[0]+m*r,e[1]+m*i]}function an(e,t){if(e.length<6||e.length%2!==0||t<=0)return e;let n=[];for(let a=0;a<e.length;a+=2)n.push([e[a],e[a+1]]);if(!rn(n))return Re(e,t);let o=Rr(n);if(Math.abs(o)<=G)return Re(e,t);let r=o>0?1:-1,i=[];for(let a=0;a<n.length;a++){let c=n[a],l=n[(a+1)%n.length],m=l[0]-c[0],f=l[1]-c[1],y=Math.hypot(m,f);if(y<=G)return Re(e,t);let p=r*(f/y)*t,b=r*(-m/y)*t;i.push({a:[c[0]+p,c[1]+b],b:[l[0]+p,l[1]+b]})}let s=[],d=Math.max(2,t*4);for(let a=0;a<n.length;a++){let c=i[(a+n.length-1)%n.length],l=i[a],m=Or(c.a,c.b,l.a,l.b);if(!m)return Re(e,t);let f=n[a],y=m[0]-f[0],p=m[1]-f[1],b=Math.hypot(y,p);b>d?s.push(f[0]+y/b*d,f[1]+p/b*d):s.push(m[0],m[1])}return s}function Bt(e){if(e.length!==4||!rn(e))return null;let[t,n,o,r]=e,i=t[0]-n[0]+o[0]-r[0],s=t[1]-n[1]+o[1]-r[1],d=n[0]-o[0],a=r[0]-o[0],c=n[1]-o[1],l=r[1]-o[1],m=d*l-c*a;if(Math.abs(m)<=G)return null;let f=(i*l-s*a)/m,y=(d*s-c*i)/m,p=[1,1+f,1+f+y,1+y];if(p.some(E=>!Number.isFinite(E)||E<=or))return null;let b=Math.min(...p);return Math.max(...p)/b>rr?null:{g:f,h:y,w1:1+f,w3:1+y}}function Dr(e,t,n,o,r,i,s){if(e.length!==8)return null;let d=[[e[0],e[1]],[e[2],e[3]],[e[4],e[5]],[e[6],e[7]]];if(!Bt(d))return null;let a=an(e,ar),c=[[a[0],a[1]],[a[2],a[3]],[a[4],a[5]],[a[6],a[7]]],l=Bt(c);if(!l)return null;let{g:m,h:f,w1:y,w3:p}=l,[b,P,,E]=c,C=([H,M])=>[r+H*t[0]+M*n[0],i+H*t[1]+M*n[1],s+H*t[2]+M*n[2]],w=C(b),g=C(P),L=C(E),O=[g[0]*y-w[0],g[1]*y-w[1],g[2]*y-w[2]],N=[L[0]*p-w[0],L[1]*p-w[1],L[2]*p-w[2]],_=[O[0],O[1],O[2],m,N[0],N[1],N[2],f,o[0],o[1],o[2],0,w[0],w[1],w[2],1];for(let H=0;H<8;H+=1)_[H]/=dt;return _.join(",")}function kr(e,t,n){return e.map(o=>[o[1]*t,o[0]*t,o[2]*n])}function Wt(e){return`${e[0]},${e[1]},${e[2]}`}function _r(e,t){let n=Wt(e),o=Wt(t);return n<o?`${n}|${o}`:`${o}|${n}`}function We(e){let t=new Map;for(let o=0;o<e.length;o++){let r=e[o].vertices;if(!(!r||r.length<3||!e[o].texture))for(let i=0;i<r.length;i++){let s=_r(r[i],r[(i+1)%r.length]),d={polygon:o,edge:i},a=t.get(s);a?a.push(d):t.set(s,[d])}}let n=e.map(()=>new Set);for(let o of t.values())if(!(o.length<2))for(let r=0;r<o.length;r++)for(let i=r+1;i<o.length;i++)n[o[r].polygon].add(o[r].edge),n[o[i].polygon].add(o[i].edge);return n.map(o=>o.size>0?o:void 0)}function Hr(e){if(e.length<3)return null;let t=e[0],n=[0,0,0];for(let r=1;r+1<e.length;r++){let i=e[r],s=e[r+1],d=[i[0]-t[0],i[1]-t[1],i[2]-t[2]],a=[s[0]-t[0],s[1]-t[1],s[2]-t[2]];n[0]-=d[1]*a[2]-d[2]*a[1],n[1]-=d[2]*a[0]-d[0]*a[2],n[2]-=d[0]*a[1]-d[1]*a[0]}let o=Math.hypot(n[0],n[1],n[2]);return o<=G?null:[n[0]/o,n[1]/o,n[2]/o]}function lt(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function Ir(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function Vr(e,t,n,o){if(!oe(e))return null;let r=kr(e.polygon.vertices,e.tileSize,e.layerElevation),i=Hr(r);if(!i)return null;let s=[{a:0,b:1,c:2},{a:1,b:2,c:0},{a:2,b:0,c:1}].map(S=>{let U=r[S.a],B=r[S.b];return{...S,length:Math.hypot(B[0]-U[0],B[1]-U[1],B[2]-U[2])}}).sort((S,U)=>U.length-S.length),d=s[0].a,a=s[0].b,c=s[0].c,l=r[d],m=r[a],f=r[c],y=s[0].length;if(y<=G)return null;let p=[(m[0]-l[0])/y,(m[1]-l[1])/y,(m[2]-l[2])/y],b=[f[0]-l[0],f[1]-l[1],f[2]-l[2]],P=lt(b,p),E=[l[0]+p[0]*P,l[1]+p[1]*P,l[2]+p[2]*P],C=[E[0]-f[0],E[1]-f[1],E[2]-f[2]],w=Math.hypot(C[0],C[1],C[2]);if(w<=G)return null;let g=[C[0]/w,C[1]/w,C[2]/w];if(lt(Ir(p,g),i)<0){let S=a;if(a=d,d=S,l=r[d],m=r[a],y=Math.hypot(m[0]-l[0],m[1]-l[1],m[2]-l[2]),y<=G)return null;p=[(m[0]-l[0])/y,(m[1]-l[1])/y,(m[2]-l[2])/y];let U=[f[0]-l[0],f[1]-l[1],f[2]-l[2]];P=lt(U,p),E=[l[0]+p[0]*P,l[1]+p[1]*P,l[2]+p[2]*P],C=[E[0]-f[0],E[1]-f[1],E[2]-f[2]];let B=Math.hypot(C[0],C[1],C[2]);if(B<=G)return null;g=[C[0]/B,C[1]/B,C[2]/B]}let L=Math.max(0,Math.min(y,P)),O=Math.max(0,y-L),N=an([L,0,0,w,L+O,w],ir),_=[N[0],N[1]],H=[N[2],N[3]],M=[N[4],N[5]],D=(H[1]+M[1])/2,V=_[0]-H[0],I=M[0]-_[0],u=D-_[1];if(V<=G||I<=G||u<=G||!Number.isFinite(V+I+u))return null;let h=t==="dynamic",v=le(e.polygon.color??"#cccccc"),A=h&&ft(v)===o?.dynamicColorKey,x={color:h||e.shadedColor===o?.paintColor?void 0:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...h&&!A?{"--pnx":i[0].toFixed(4),"--pny":i[1].toFixed(4),"--pnz":i[2].toFixed(4),"--psr":(v.r/255).toFixed(4),"--psg":(v.g/255).toFixed(4),"--psb":(v.b/255).toFixed(4)}:h?{"--pnx":i[0].toFixed(4),"--pny":i[1].toFixed(4),"--pnz":i[2].toFixed(4)}:null},T=([S,U])=>[f[0]+(S-L)*p[0]+U*g[0],f[1]+(S-L)*p[1]+U*g[1],f[2]+(S-L)*p[2]+U*g[2]],j=T(_),R=T([H[0],D]),k=T([M[0],D]),Y=de/2,X=[(k[0]-R[0])/de,(k[1]-R[1])/de,(k[2]-R[2])/de],$=[j[0]-X[0]*Y,j[1]-X[1]*Y,j[2]-X[2]*Y],z=[(R[0]-$[0])/de,(R[1]-$[1])/de,(R[2]-$[2])/de];return{transform:`matrix3d(${nn([X[0],X[1],X[2],0,z[0],z[1],z[2],0,i[0],i[1],i[2],0,$[0],$[1],$[2],1])})`,...x}}function Fr({r:e,g:t,b:n}){let o=r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0");return`#${o(e)}${o(t)}${o(n)}`}function zr(e,t,n,o,r){let i=le(e),s=le(n),d=le(o),a=d.r/255*r+s.r/255*t,c=d.g/255*r+s.g/255*t,l=d.b/255*r+s.b/255*t,m=Math.max(0,Math.min(255,Math.round(i.r*a))),f=Math.max(0,Math.min(255,Math.round(i.g*c))),y=Math.max(0,Math.min(255,Math.round(i.b*l))),p=xr(e);return p<1?`rgba(${m}, ${f}, ${y}, ${p})`:Fr({r:m,g:f,b:y})}function Nr(e,t,n,o){let r=le(t),i=le(n);return{r:i.r/255*o+r.r/255*e,g:i.g/255*o+r.g/255*e,b:i.b/255*o+r.b/255*e}}function jr({r:e,g:t,b:n}){let o=r=>Math.round(Math.max(0,Math.min(1,r))*255);return`rgb(${o(e)} ${o(t)} ${o(n)})`}function Yr(e,t,n,o,r,i,s){Math.abs(i.r-1)<.001&&Math.abs(i.g-1)<.001&&Math.abs(i.b-1)<.001||(e.save(),ie(e,s),e.globalCompositeOperation="multiply",e.fillStyle=jr(i),e.fillRect(t,n,o,r),e.restore())}function Ur(e,t,n,o,r,i,s){let d=t.naturalWidth||t.width||1,a=t.naturalHeight||t.height||1,c=Math.max(r/d,i/a),l=d*c,m=a*c;ie(e,s),e.drawImage(t,n+(r-l)/2,o+(i-m)/2,l,m)}function sn(e,t){if(e.length<3||t.length<3)return null;let[n,o,r]=e,[i,s,d]=t,a=n[0],c=n[1],l=o[0],m=o[1],f=r[0],y=r[1],p=i[0],b=1-i[1],P=s[0],E=1-s[1],C=d[0],w=1-d[1],g=P-p,L=E-b,O=C-p,N=w-b,_=g*N-O*L;if(Math.abs(_)<=1e-9)return null;let H=l-a,M=f-a,D=m-c,V=y-c,I={a:(H*N-M*L)/_,b:(g*M-O*H)/_,c:(D*N-V*L)/_,d:(g*V-O*D)/_,e:0,f:0};return I.e=a-I.a*p-I.b*b,I.f=c-I.c*p-I.d*b,I}function ln(e){if(e.length===0)return null;let t=1/0,n=1/0,o=-1/0,r=-1/0;for(let i of e){let s=i[0],d=1-i[1];if(!Number.isFinite(s)||!Number.isFinite(d))return null;t=Math.min(t,s),o=Math.max(o,s),n=Math.min(n,d),r=Math.max(r,d)}return{minU:t,minV:n,maxU:o,maxV:r}}function Xr(e,t,n,o,r,i,s,d){let a=e.vertices.map(m=>{let f=[m[1]*t,m[0]*t,m[2]*n],y=f[0]-o[0],p=f[1]-o[1],b=f[2]-o[2];return[y*r[0]+p*r[1]+b*r[2]+s,y*i[0]+p*i[1]+b*i[2]+d]}),c=sn(a,e.uvs),l=ln(e.uvs);return!c&&!l?null:{screenPts:a.flatMap(([m,f])=>[m,f]),uvAffine:c,uvSampleRect:l}}function Re(e,t){if(e.length<6||t<=0)return e;let n=0,o=0,r=e.length/2;for(let s=0;s<e.length;s+=2)n+=e[s],o+=e[s+1];n/=r,o/=r;let i=e.slice();for(let s=0;s<i.length;s+=2){let d=i[s]-n,a=i[s+1]-o,c=Math.hypot(d,a);c<=ne||(i[s]+=d/c*t,i[s+1]+=a/c*t)}return i}function ct(e,t,n,o){for(let r=0;r<o.length;r+=2){let i=t+o[r],s=n+o[r+1];r===0?e.moveTo(i,s):e.lineTo(i,s)}e.closePath()}function ge(e,t){return Math.max(0,Math.min(t,e))}function Zt(e,t,n,o,r,i,s,d){let a=t.naturalWidth||t.width||1,c=t.naturalHeight||t.height||1,l=ge(Math.min(n.minU,n.maxU)*a,a),m=ge(Math.max(n.minU,n.maxU)*a,a),f=ge(Math.min(n.minV,n.maxV)*c,c),y=ge(Math.max(n.minV,n.maxV)*c,c),p=Math.floor(l),b=Math.floor(f),P=Math.ceil(m)-p,E=Math.ceil(y)-b;P<1&&(p=Math.floor(ge((n.minU+n.maxU)/2*a,a-1)),P=1),E<1&&(b=Math.floor(ge((n.minV+n.maxV)/2*c,c-1)),E=1),p=Math.max(0,Math.min(a-1,p)),b=Math.max(0,Math.min(c-1,b)),P=Math.max(1,Math.min(a-p,P)),E=Math.max(1,Math.min(c-b,E)),ie(e,d),e.drawImage(t,p,b,P,E,o,r,i,s)}function $r(e,t,n,o,r,i){for(let s=0;s<o.length;s+=2){let d=t+o[s]+r,a=n+o[s+1]+i;s===0?e.moveTo(d,a):e.lineTo(d,a)}e.closePath()}function Br(e,t,n,o,r=0,i=0){if(t.textureTriangles?.length){let s=n.naturalWidth||n.width||1,d=n.naturalHeight||n.height||1;for(let a of t.textureTriangles){let c=Re(a.screenPts,qo);e.save(),ie(e,o),e.beginPath(),$r(e,t.x,t.y,c,r,i),e.clip(),a.uvAffine?(ie(e,o,a.uvAffine.a/s,a.uvAffine.c/s,a.uvAffine.b/d,a.uvAffine.d/d,t.x+a.uvAffine.e+r,t.y+a.uvAffine.f+i),e.drawImage(n,0,0)):a.uvSampleRect&&Zt(e,n,a.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o),e.restore()}}else if(t.uvAffine){let s=n.naturalWidth||n.width||1,d=n.naturalHeight||n.height||1;ie(e,o,t.uvAffine.a/s,t.uvAffine.c/s,t.uvAffine.b/d,t.uvAffine.d/d,t.x+t.uvAffine.e+r,t.y+t.uvAffine.f+i),e.drawImage(n,0,0)}else t.uvSampleRect?Zt(e,n,t.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o):Ur(e,n,t.x+r,t.y+i,t.canvasW,t.canvasH,o)}function Wr(e,t,n,o,r,i){let s=r-n,d=i-o,a=s*s+d*d;if(a<=G)return Math.hypot(e-n,t-o);let c=Math.max(0,Math.min(1,((e-n)*s+(t-o)*d)/a));return Math.hypot(e-(n+s*c),t-(o+d*c))}function Zr(e,t,n,o){let r=1/0,i=n.length/2;for(let s of o){if(s<0||s>=i)continue;let d=s*2,a=(s+1)%i*2;r=Math.min(r,Wr(e,t,n[d],n[d+1],n[a],n[a+1]))}return r}function Kr(e,t,n,o,r,i){let s=Math.max(0,o-i),d=Math.min(t-1,o+i),a=Math.max(0,r-i),c=Math.min(n-1,r+i),l=null,m=1/0;for(let f=a;f<=c;f++)for(let y=s;y<=d;y++){if(y===o&&f===r)continue;let p=y-o,b=f-r,P=p*p+b*b;if(P>i*i||P>=m)continue;let E=(f*t+y)*4;e[E+3]<Jo||(l=E,m=P)}return l}function Gr(e,t,n){if(!t.textureEdgeRepair||!t.texture||!t.textureEdgeRepairEdges||t.textureEdgeRepairEdges.size===0)return;let o=e.canvas;if(!o)return;let r=Math.max(0,Math.floor(t.x*n)),i=Math.max(0,Math.floor(t.y*n)),s=Math.max(1,Math.min(o.width-r,Math.ceil(t.canvasW*n))),d=Math.max(1,Math.min(o.height-i,Math.ceil(t.canvasH*n)));if(s<=0||d<=0)return;let a;try{a=e.getImageData(r,i,s,d)}catch{return}let c=a.data,l=new Uint8ClampedArray(c),m=Math.max(zt,zt/n),f=Math.max(2,Math.ceil(m*n)+1),y=!1;for(let p=0;p<d;p++)for(let b=0;b<s;b++){let P=(p*s+b)*4,E=c[P+3];if(E<Qo||E===255)continue;let C=(r+b+.5)/n-t.x,w=(i+p+.5)/n-t.y;if(Zr(C,w,t.screenPts,t.textureEdgeRepairEdges)>m)continue;let g=Kr(l,s,d,b,p,f);g!==null&&(c[P]=l[g],c[P+1]=l[g+1],c[P+2]=l[g+2],c[P+3]=255,y=!0)}y&&e.putImageData(a,r,i)}function qr(e){if(typeof e.toBlob=="function")return new Promise(t=>{e.toBlob(n=>{t(n?URL.createObjectURL(n):null)},"image/png")});try{return Promise.resolve(e.toDataURL("image/png"))}catch{return Promise.resolve(null)}}function ve(e,t,n={}){let{vertices:o,texture:r,uvs:i}=e;if(!o||o.length<3)return null;let s=n.tileSize??zo,d=n.layerElevation??s,a=Z=>[Z[1]*s,Z[0]*s,Z[2]*d],c=o.map(a),l=c[0],m=c[1],f=c[2],y=[m[0]-l[0],m[1]-l[1],m[2]-l[2]],p=[f[0]-l[0],f[1]-l[1],f[2]-l[2]],b=Math.hypot(y[0],y[1],y[2]);if(b===0)return null;let P=[y[0]/b,y[1]/b,y[2]/b],E=-(y[1]*p[2]-y[2]*p[1]),C=-(y[2]*p[0]-y[0]*p[2]),w=-(y[0]*p[1]-y[1]*p[0]),g=Math.hypot(E,C,w);if(g===0)return null;E/=g,C/=g,w/=g;let L=[C*P[2]-w*P[1],w*P[0]-E*P[2],E*P[1]-C*P[0]],O=c.map(Z=>{let J=Z[0]-l[0],Ve=Z[1]-l[1],_t=Z[2]-l[2];return[J*P[0]+Ve*P[1]+_t*P[2],J*L[0]+Ve*L[1]+_t*L[2]]}),N=1/0,_=1/0,H=-1/0,M=-1/0;for(let[Z,J]of O)Z<N&&(N=Z),Z>H&&(H=Z),J<_&&(_=J),J>M&&(M=J);let D=H-N,V=M-_;if(!Number.isFinite(D)||!Number.isFinite(V))return null;let I=r&&n.textureEdgeRepairEdges?.size?n.textureEdgeRepairEdges:null,u=!!(r&&I),h=-N,v=-_,A=[];for(let Z=0;Z<O.length;Z++){let[J,Ve]=O[Z];A.push(J+h,Ve+v)}let x=Math.max(1,Math.ceil(D)),T=Math.max(1,Math.ceil(V)),j=l[0]-h*P[0]-v*L[0],R=l[1]-h*P[1]-v*L[1],k=l[2]-h*P[2]-v*L[2],Y=[P[0],P[1],P[2],0,L[0],L[1],L[2],0,E,C,w,0,j,R,k,1].join(","),X=[P[0]*x,P[1]*x,P[2]*x,0,L[0]*T,L[1]*T,L[2]*T,0,E,C,w,0,j,R,k,1].join(","),$=[P[0]*x/ae,P[1]*x/ae,P[2]*x/ae,0,L[0]*T/ae,L[1]*T/ae,L[2]*T/ae,0,E,C,w,0,j,R,k,1].join(","),z=[E,C,w],F=!r&&o.length===4?Dr(A,P,L,z,j,R,k):null,S=n.directionalLight,U=n.ambientLight,B=S?.direction??No,re=S?.color??jo,ce=Math.max(0,S?.intensity??Yo),se=U?.color??Uo,W=Math.max(0,U?.intensity??Xo),ue=Math.hypot(B[0],B[1],B[2])||1,we=B[0]/ue,rt=B[1]/ue,yo=B[2]/ue,Ot=ce*Math.max(0,E*we+C*rt+w*yo),po=Nr(Ot,re,se,W),go=zr(e.color??"#cccccc",Ot,re,se,W),Dt=null,kt=null;r&&i&&i.length>=3&&i.length===o.length&&(kt=ln(i),Dt=sn(O.map(([Z,J])=>[Z+h,J+v]),i));let ho=r&&e.textureTriangles?.length?e.textureTriangles.map(Z=>Xr(Z,s,d,l,P,L,h,v)).filter(Z=>!!Z):null;return{index:t,polygon:e,texture:r,tileSize:s,layerElevation:d,matrix:Y,canonicalMatrix:X,atlasMatrix:$,projectiveMatrix:F,canvasW:x,canvasH:T,screenPts:A,uvAffine:Dt,uvSampleRect:kt,textureTriangles:ho,textureEdgeRepairEdges:I,textureEdgeRepair:u,normal:z,textureTint:po,shadedColor:go}}function Ue(e,t=1){let n=Array(e.length).fill(null),o=[],r=br(t),i=e.filter(a=>!!a).sort((a,c)=>c.canvasH-a.canvasH||c.canvasW-a.canvasW||a.index-c.index),s=()=>({width:r,height:r,entries:[],shelves:[]}),d=(a,c,l)=>{if(a.sealed)return null;for(let y of a.shelves)if(c.canvasH<=y.height&&y.x+c.canvasW+r<=he){let p={...c,pageIndex:l,x:y.x,y:y.y};return y.x+=c.canvasW+r,a.entries.push(p),a.width=Math.max(a.width,p.x+c.canvasW+r),p}let m=a.shelves.length===0?r:a.height;if(m+c.canvasH+r>he)return null;let f={...c,pageIndex:l,x:r,y:m};return a.shelves.push({x:r+c.canvasW+r,y:m,height:c.canvasH}),a.entries.push(f),a.width=Math.max(a.width,f.x+c.canvasW+r),a.height=Math.max(a.height,m+c.canvasH+r),f};for(let a of i){if(a.canvasW+r*2>he||a.canvasH+r*2>he){let m=o.length,f={...a,pageIndex:m,x:r,y:r};n[a.index]=f,o.push({width:a.canvasW+r*2,height:a.canvasH+r*2,entries:[f],shelves:[],sealed:!0});continue}let l=null;for(let m=0;m<o.length&&(l=d(o[m],a,m),!l);m++);if(!l){let m=s(),f=o.length;o.push(m),l=d(m,a,f)}l&&(n[a.index]=l)}return{entries:n,pages:o.map(({width:a,height:c,entries:l})=>({width:a,height:c,entries:l}))}}async function Qr(e,t,n,o){let r=n.createElement("canvas");r.width=Math.max(1,Math.ceil(e.width*o)),r.height=Math.max(1,Math.ceil(e.height*o));let i=e.entries.some(l=>l.textureEdgeRepair&&l.texture&&l.textureEdgeRepairEdges&&l.textureEdgeRepairEdges.size>0),s=r.getContext("2d",i?{willReadFrequently:!0}:void 0);if(!s)return{width:e.width,height:e.height,url:null};let d=Array.from(new Set(e.entries.flatMap(l=>l.texture?[l.texture]:[]))),a=new Map;await Promise.all(d.map(async l=>{a.set(l,await sr(l))}));for(let l of e.entries){let m=l.texture?a.get(l.texture):null;if(!l.texture){s.save(),ie(s,o),s.beginPath(),ct(s,l.x,l.y,l.screenPts),s.clip(),s.fillStyle=t==="dynamic"?l.polygon.color??"#cccccc":l.shadedColor,s.fillRect(l.x,l.y,l.canvasW,l.canvasH),s.restore();continue}m&&(s.save(),ie(s,o),s.beginPath(),ct(s,l.x,l.y,l.screenPts),s.clip(),Br(s,l,m,o),s.restore()),l.texture&&t==="baked"&&(s.save(),ie(s,o),s.beginPath(),ct(s,l.x,l.y,l.screenPts),s.clip(),Yr(s,l.x,l.y,l.canvasW,l.canvasH,l.textureTint,o),s.restore()),Gr(s,l,o)}let c=await qr(r);return r.width=1,r.height=1,{width:e.width,height:e.height,url:c}}async function Jr(e,t,n,o,r){let i=[];for(let s of e){if(r())break;i.push(await Qr(s,t,n,o))}return i}function je(e){for(let t of e)URL.revokeObjectURL(t)}function Pe(e,t,n=te(()=>{}),o=te(()=>{})){let r=te(()=>new Set(o.value?.disable??[])),i=te(()=>!r.value.has("b")),s=te(()=>i.value),d=te(()=>!r.value.has("u")&&en()),a=te(()=>!r.value.has("i")&&t.value!=="dynamic"&&yt()),c=te(()=>{let f=e.value.map(y=>!y||y.texture?y:d.value&&oe(y)||i.value&&Oe(y)||s.value&&De(y)||t.value!=="dynamic"&&a.value?null:y);return Pr(f,n.value,typeof document<"u"?document:null)}),l=Vo(c.value.packed.pages.map(f=>({width:f.width,height:f.height,url:null}))),m=[];return Fo(()=>[c.value,t.value],([f,y],p,b)=>{let{packed:P,atlasScale:E}=f,C=!1;je(m),m=[],l.value=P.pages.map(w=>({width:w.width,height:w.height,url:null})),b(()=>{C=!0,je(m),m=[]}),!(P.pages.length===0||typeof document>"u")&&Jr(P.pages,y,document,E,()=>C).then(w=>{if(C){je(w.flatMap(g=>g.url?.startsWith("blob:")?[g.url]:[]));return}m=w.flatMap(g=>g.url?.startsWith("blob:")?[g.url]:[]),l.value=w}).catch(()=>{C||(l.value=P.pages.map(w=>({width:w.width,height:w.height,url:null})))})},{immediate:!0}),Io(()=>{je(m),m=[]}),{entries:te(()=>c.value.packed.entries),pages:l,ready:te(()=>l.value.length===0||l.value.every(f=>!!f.url)),useFullRectSolid:i,useProjectiveQuad:s,useStableTriangle:d,useBorderShape:a}}function be({entry:e,page:t,textureLighting:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=n==="dynamic",a=e.atlasCanonicalSize??ae,c=e.canvasW||1,l=e.canvasH||1,m=t?`${Ne(-e.x/c*a)} ${Ne(-e.y/l*a)}`:void 0,f=t?`${Ne(t.width/c*a)} ${Ne(t.height/l*a)}`:void 0,y=d&&t?.url?`url(${t.url})`:void 0,p=!d&&t?.url?`url(${t.url}) ${m} / ${f} no-repeat`:void 0,b={transform:mt(e.atlasMatrix),"--polycss-atlas-size":`${a}px`,background:p,backgroundImage:d&&t?.url?`url(${t.url})`:void 0,backgroundPosition:d?m:void 0,backgroundSize:d?f:void 0,...d?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...d&&y?{maskImage:y,maskMode:"alpha",maskPosition:m,maskSize:f,maskRepeat:"no-repeat",WebkitMaskImage:y,WebkitMaskPosition:m,WebkitMaskSize:f,WebkitMaskRepeat:"no-repeat"}:null,opacity:t?.url?void 0:0,pointerEvents:s==="none"?"none":void 0,...r},P=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([C,w])=>[`data-${C}`,String(w)])):{},E=o?.trim()||void 0;return Xe("s",{class:E,style:b,...P,...i})}function xe({entry:e,solidPaintDefaults:t,className:n,style:o,domAttrs:r,pointerEvents:i="auto",forceBorderShape:s=!1}){let d=Oe(e),a=d&&s&&yt(),c=!d||a?pt(e):null,l=e.shadedColor===t?.paintColor,m=mt(c?wr(e):Lr(e)),f=d?{transform:m,color:l?void 0:e.shadedColor,pointerEvents:i==="none"?"none":void 0,...o}:{transform:m,color:l?void 0:e.shadedColor,pointerEvents:i==="none"?"none":void 0,...o},y=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([P,E])=>[`data-${P}`,String(E)])):{},p=n?.trim()||void 0,b=P=>{let E=P.el;E&&(c?E.style.setProperty("border-shape",c):E.style.removeProperty("border-shape"),Er(E))};return Xe(d&&!a?"b":"i",{class:p,style:f,...y,...r,onVnodeMounted:b,onVnodeUpdated:b})}function Ze({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=t==="dynamic",a=le(e.polygon.color??"#cccccc"),c=d&&ft(a)===n?.dynamicColorKey,l={transform:mt(e.projectiveMatrix),color:d||e.shadedColor===n?.paintColor?void 0:e.shadedColor,pointerEvents:s==="none"?"none":void 0,...d&&!c?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4),"--psr":(a.r/255).toFixed(4),"--psg":(a.g/255).toFixed(4),"--psb":(a.b/255).toFixed(4)}:d?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...r},m=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([y,p])=>[`data-${y}`,String(p)])):{},f=o?.trim()||void 0;return Xe("b",{class:f,style:l,...m,...i})}function Ce({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let d=Vr(e,t,s,n);if(!d)return null;let a=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([l,m])=>[`data-${l}`,String(m)])):{},c=o?.trim()||void 0;return Xe("u",{class:c,style:{...d,...r},...a,...i})}var fn=ea({name:"PolyScene",inheritAttrs:!1,props:{polygons:{type:Array,default:void 0},perspective:{type:Number},rotX:{type:Number},rotY:{type:Number},zoom:{type:Number},directionalLight:{type:Object,default:void 0},ambientLight:{type:Object,default:void 0},textureLighting:{type:String,default:"baked"},textureQuality:{type:[Number,String],default:void 0},strategies:{type:Object,default:void 0},autoCenter:{type:Boolean,default:!1},shadow:{type:Object,default:void 0},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},debugShowLabels:{type:Boolean},debugShowBackfaces:{type:Boolean}},setup(e,{slots:t,attrs:n}){let o=na(K);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{store:r,sceneElRef:i}=o,s=cn(0),d=new Map,a={register(M,D){d.set(M,D),s.value++},unregister(M){d.delete(M),s.value++},version:s,getEntries(){return Array.from(d.values())}},c=ee(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight,shadow:e.shadow,shadowRegistry:a}));oa(st,c);let l=r.getState().cameraState,m=cn(null);un(m,M=>{i.value=M});let f=!1;ra(()=>{f||typeof document<"u"&&(ze(document),f=!0)}),un(()=>e.debugShowBackfaces,M=>{let D=m.value;D&&D.classList.toggle("polycss-debug-show-backfaces",!!M)});let y=ee(()=>e.polygons??[]),p=ee(()=>({directionalLight:e.directionalLight})),b=Fe(y,p),P=ee(()=>{let M=l,D=o.autoCenterOffset.value,V=ia,I=M.target[0]+D[0],u=M.target[1]+D[1],h=M.target[2]+D[2],v=u*V,A=I*V,x=h*V;return{transform:`${M.distance!==0?`translateZ(${-M.distance}px) `:""}scale(${M.zoom}) rotateX(${M.rotX}deg) rotate(${M.rotY}deg) translate3d(${-v}px, ${-A}px, ${-x}px)`}}),E=ee(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,textureQuality:e.textureQuality})),C=ee(()=>{let M=e.textureLighting==="dynamic",D=M?void 0:e.directionalLight,V=M?void 0:e.ambientLight,I=We(b.value.polygons);return b.value.polygons.map((u,h)=>ve(u,h,{tileSize:E.value.tileSize,layerElevation:E.value.layerElevation,directionalLight:D,ambientLight:V,textureEdgeRepairEdges:I[h]}))}),w=ee(()=>e.textureLighting??"baked"),g=ee(()=>e.textureQuality),L=ee(()=>e.strategies),O=Pe(C,w,g,L),N=ee(()=>{if(e.textureLighting!=="dynamic")return null;let M=e.directionalLight?.direction??[.4,-.7,.59],D=Math.hypot(M[0],M[1],M[2])||1,V=M[0]/D,I=M[1]/D,u=M[2]/D,h=mn(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],v=mn(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],A=e.directionalLight?.intensity??1,x=e.ambientLight?.intensity??.4,T=k=>(k/255).toFixed(4),j=u,R=Math.sign(j||1)*Math.max(Math.abs(j),.01);return{"--plx":V.toFixed(4),"--ply":I.toFixed(4),"--plz":u.toFixed(4),"--clx":V.toFixed(4),"--cly":I.toFixed(4),"--clz":R.toFixed(4),"--plr":T(h[0]),"--plg":T(h[1]),"--plb":T(h[2]),"--pli":A.toFixed(4),"--par":T(v[0]),"--pag":T(v[1]),"--pab":T(v[2]),"--pai":x.toFixed(4)}}),_=50;dn(()=>{let M=m.value;if(!M)return;if(e.textureLighting!=="dynamic"){M.style.removeProperty("--shadow-ground-cssz");return}s.value;let D=a.getEntries();if(D.length===0){M.style.removeProperty("--shadow-ground-cssz");return}let V=1/0;for(let u of D)for(let h of u())for(let v of h.vertices)v[2]<V&&(V=v[2]);if(!Number.isFinite(V)){M.style.removeProperty("--shadow-ground-cssz");return}let I=e.shadow?.lift??.05;M.style.setProperty("--shadow-ground-cssz",((V+I)*_).toFixed(3))});let H=ee(()=>{if(!e.autoCenter)return[0,0,0];let M=b.value.sceneBbox;return[(M.min[0]+M.max[0])/2,(M.min[1]+M.max[1])/2,(M.min[2]+M.max[2])/2]});return dn(()=>{o.autoCenterOffset.value=H.value}),aa(()=>{}),()=>{let M=`polycss-scene${e.class?` ${e.class}`:""}`,D=E.value,V=O.entries.value.map((u,h)=>{if(u)return be({entry:u,page:O.pages.value[u.pageIndex],textureLighting:D.textureLighting??"baked"});let v=C.value[h];return!v||v.texture?null:O.useStableTriangle.value&&oe(v)?Ce({entry:v,textureLighting:D.textureLighting??"baked"}):O.useProjectiveQuad.value&&De(v)?Ze({entry:v,textureLighting:D.textureLighting??"baked"}):O.useBorderShape.value||O.useFullRectSolid.value?xe({entry:v,forceBorderShape:!O.useFullRectSolid.value}):null}),I=t.default?.()??[];return ta("div",{ref:m,class:M,"data-polycss-lighting":D.textureLighting??"baked","aria-hidden":"true",style:{...P.value,...N.value??null,...n.style},...Object.fromEntries(Object.entries(n).filter(([u])=>u!=="style"&&u!=="class"))},[...V,...I])}}});import{defineComponent as ua,h as ke,computed as q,inject as da,onMounted as ma,onBeforeUnmount as hn,ref as Pt,watch as vn}from"vue";import{computeSceneBbox as fa,inverseRotateVec3 as Pn,findOverlappingPolygonDuplicates as ya,parseHexColor as pa}from"@layoutit/polycss-core";import{ref as Ke,watch as sa,onUnmounted as la}from"vue";import{loadMesh as ca}from"@layoutit/polycss-core";var yn=[],gt=[];function Ge(e,t){let n=Ke(yn),o=Ke(!!e.value),r=Ke(null),i=Ke(gt),s=null;function d(){if(s){try{s.dispose()}catch{}s=null}}return sa(e,(a,c,l)=>{if(!a){d(),n.value=yn,o.value=!1,r.value=null,i.value=gt;return}let m=!1;o.value=!0,r.value=null;let f=s;ca(a,t).then(y=>{if(m){try{y.dispose()}catch{}return}if(f)try{f.dispose()}catch{}s=y,n.value=y.polygons,o.value=!1,r.value=null,i.value=y.warnings??gt}).catch(y=>{if(m)return;let p=y instanceof Error?y:new Error(String(y));o.value=!1,r.value=p}),l(()=>{m=!0})},{immediate:!0}),la(()=>{d()}),{polygons:n,loading:o,error:r,warnings:i,dispose:d}}var ht=new WeakMap;function pn(e,t){ht.set(e,t)}function gn(e){ht.delete(e)}function Ee(e){let t=e;for(;t;){if(t instanceof HTMLElement){let n=ht.get(t);if(n)return n}t=t.parentElement}return null}function Me(e,t,n){let o=Array.from(e.querySelectorAll("i,b,s,u"));for(let r of o){let i=r.getBoundingClientRect();if(!(i.width<=0||i.height<=0)&&t>=i.left&&t<=i.right&&n>=i.top&&n<=i.bottom)return!0}return!1}function vt(e,t,n){if(typeof document>"u")return null;let o=Array.from(document.querySelectorAll(".polycss-mesh"));for(let r of o){if(n&&!n(r))continue;let i=Ee(r);if(i&&Me(r,e,t))return i}return null}function ga(e){let t={};return e.paintColor&&(t["--polycss-paint"]=e.paintColor),e.dynamicColor&&(t["--psr"]=(e.dynamicColor.r/255).toFixed(4),t["--psg"]=(e.dynamicColor.g/255).toFixed(4),t["--psb"]=(e.dynamicColor.b/255).toFixed(4)),Object.keys(t).length>0?t:null}function ha(e,t,n){let o=[];return e&&o.push(`translate3d(${e[0]}px, ${e[1]}px, ${e[2]}px)`),t!==void 0&&(typeof t=="number"?t!==1&&o.push(`scale3d(${t}, ${t}, ${t})`):o.push(`scale3d(${t[0]}, ${t[1]}, ${t[2]})`)),n&&(n[0]&&o.push(`rotateX(${n[0]}deg)`),n[1]&&o.push(`rotateY(${n[1]}deg)`),n[2]&&o.push(`rotateZ(${n[2]}deg)`)),o.length>0?o.join(" "):void 0}function va(e){if(e.length===0)return e;let t=fa(e),n=(t.min[0]+t.max[0])/2,o=(t.min[1]+t.max[1])/2,r=(t.min[2]+t.max[2])/2;if(n===0&&o===0&&r===0)return e;let i=s=>[s[0]-n,s[1]-o,s[2]-r];return e.map(s=>({...s,vertices:s.vertices.map(i),...s.textureTriangles?.length?{textureTriangles:s.textureTriangles.map(d=>({...d,vertices:d.vertices.map(i)}))}:null}))}var Q=ua({name:"PolyMesh",inheritAttrs:!1,props:{id:{type:String,default:void 0},src:{type:String,default:void 0},mtl:{type:String,default:void 0},polygons:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},textureLighting:{type:String,default:void 0},textureQuality:{type:[Number,String],default:void 0},castShadow:{type:Boolean,default:!1},class:{type:String},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},onClick:{type:Function,default:void 0},onContextMenu:{type:Function,default:void 0},onDoubleClick:{type:Function,default:void 0},onWheel:{type:Function,default:void 0},onPointerDown:{type:Function,default:void 0},onPointerUp:{type:Function,default:void 0},onPointerMove:{type:Function,default:void 0},onPointerOver:{type:Function,default:void 0},onPointerOut:{type:Function,default:void 0},onPointerEnter:{type:Function,default:void 0},onPointerLeave:{type:Function,default:void 0},onPointerCancel:{type:Function,default:void 0}},setup(e,{slots:t,attrs:n,expose:o}){let r=q(()=>e.src??""),i=q(()=>e.mtl?{mtlUrl:e.mtl}:void 0),s=Ge(r,i.value),d=q(()=>e.src?s.polygons.value:e.polygons??[]),a=Pt(null);vn(d,()=>{a.value=null});let c=q(()=>a.value??d.value),l=q(()=>e.autoCenter?va(c.value):c.value),m=!t.polygon,f=Vt(),y=q(()=>e.textureLighting??f?.value.textureLighting??"baked"),p=q(()=>y.value==="dynamic"?void 0:f?.value.directionalLight),b=q(()=>y.value==="dynamic"?void 0:f?.value.ambientLight),P=q(()=>{if(y.value!=="dynamic")return null;let h=e.rotation;if(!h||h[0]===0&&h[1]===0&&h[2]===0)return null;let v=f?.value.directionalLight?.direction;if(!v)return null;let A=Pn(v,h),x=Math.hypot(A[0],A[1],A[2])||1;return{"--plx":(A[0]/x).toFixed(4),"--ply":(A[1]/x).toFixed(4),"--plz":(A[2]/x).toFixed(4)}}),E=Pt(e.rotation),C=q(()=>{if(!m)return[];let h=p.value,v=h&&E.value?{...h,direction:Pn(h.direction,E.value)}:h,A=We(l.value);return l.value.map((x,T)=>ve(x,T,{directionalLight:v,ambientLight:b.value,textureEdgeRepairEdges:A[T]}))}),w=q(()=>e.textureQuality),g=Pe(C,y,w),L=q(()=>m?tn(C.value,y.value):{}),O=q(()=>ga(L.value)),N=q(()=>{if(!e.castShadow||y.value!=="dynamic")return[];let h=f?.value.shadow,v=h?.color??"#000000",A=h?.opacity??.25,x=pa(v)?.rgb??[0,0,0],T=`rgba(${x[0]},${x[1]},${x[2]},${A})`,j=C.value;if(j.length===0)return[];let R=ya(l.value,{normalTolerance:.1,distanceTolerance:.5,overlapFraction:.4});return j.map((k,Y)=>{if(!k||R.has(Y))return null;let X=`matrix3d(${k.matrix})`,$=pt(k),z={transform:`var(--shadow-proj) ${X}`,color:T,width:`${k.canvasW}px`,height:`${k.canvasH}px`,"--pnx":k.normal[0].toFixed(4),"--pny":k.normal[1].toFixed(4),"--pnz":k.normal[2].toFixed(4)},F=S=>{let U=S.el;U&&U.style.setProperty("border-shape",$)};return ke("q",{class:"polycss-shadow",style:z,onVnodeMounted:F,onVnodeUpdated:F})})}),_=Symbol();vn(()=>[e.castShadow,y.value],([h,v],A,x)=>{let T=f?.value.shadowRegistry;T&&(h&&v==="dynamic"?T.register(_,()=>l.value):T.unregister(_),x(()=>T.unregister(_)))},{immediate:!0}),hn(()=>{f?.value.shadowRegistry?.unregister(_)});let H=Pt(null),M={get element(){return H.value},get id(){return e.id},getPosition:()=>e.position,getRotation:()=>e.rotation,getScale:()=>e.scale,getPolygons:()=>l.value,updatePolygon(h,v){let A=l.value,x=typeof h=="number"?h:A.indexOf(h);x<0||x>=A.length||(Object.assign(A[x],v),a.value=A.slice())},rebakeAtlas:()=>{E.value=e.rotation}};o(M),ma(()=>{H.value&&pn(H.value,M)}),hn(()=>{H.value&&gn(H.value)});let D=da(K,null),V=null;function I(h,v,A){let x=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let Y=document.elementsFromPoint(v,A),X=new Set;for(let $ of Y){let z=Ee($);z&&!X.has(z)&&(X.add(z),x.push({object:z}))}}let T=0,j=0,R=D?.cameraElRef.value;if(R){let Y=R.getBoundingClientRect();Y.width>0&&Y.height>0&&(T=(v-Y.left)/Y.width*2-1,j=-((A-Y.top)/Y.height*2-1))}let k=0;return V&&(k=Math.hypot(v-V.x,A-V.y)),{object:x[0]?.object??M,eventObject:M,intersections:x,pointer:{x:T,y:j},delta:k,nativeEvent:h,stopPropagation:()=>h.stopPropagation()}}function u(h,v,A,x){h&&h(I(v,A,x))}return()=>{let h=ha(e.position,e.scale,e.rotation),v=l.value,A;if(v.length>0){let F=1/0,S=1/0,U=1/0,B=-1/0,re=-1/0,ce=-1/0;for(let se of v)for(let W of se.vertices)W[0]<F&&(F=W[0]),W[0]>B&&(B=W[0]),W[1]<S&&(S=W[1]),W[1]>re&&(re=W[1]),W[2]<U&&(U=W[2]),W[2]>ce&&(ce=W[2]);Number.isFinite(F)&&(A=`${(S+re)/2*50}px ${(F+B)/2*50}px ${(U+ce)/2*50}px`)}let x={transform:h,...A?{transformOrigin:A}:null,...P.value??void 0,...n.style,...O.value??void 0},T=Object.fromEntries(Object.entries(n).filter(([F])=>F!=="style"&&F!=="class")),j=`polycss-mesh${e.class?` ${e.class}`:""}`,R={};e.onClick&&(R.onClick=F=>{let S=F;u(e.onClick,S,S.clientX,S.clientY)}),e.onContextMenu&&(R.onContextmenu=F=>{let S=F;u(e.onContextMenu,S,S.clientX,S.clientY)}),e.onDoubleClick&&(R.onDblclick=F=>{let S=F;u(e.onDoubleClick,S,S.clientX,S.clientY)}),e.onWheel&&(R.onWheel=F=>{let S=F;u(e.onWheel,S,S.clientX,S.clientY)}),R.onPointerdown=F=>{let S=F;V={x:S.clientX,y:S.clientY},u(e.onPointerDown,S,S.clientX,S.clientY)},R.onPointerup=F=>{let S=F;u(e.onPointerUp,S,S.clientX,S.clientY),V=null},e.onPointerMove&&(R.onPointermove=F=>{let S=F;u(e.onPointerMove,S,S.clientX,S.clientY)}),(e.onPointerOver||e.onPointerEnter)&&(R.onPointerenter=F=>{let S=F;u(e.onPointerOver,S,S.clientX,S.clientY),u(e.onPointerEnter,S,S.clientX,S.clientY)}),(e.onPointerOut||e.onPointerLeave)&&(R.onPointerleave=F=>{let S=F;u(e.onPointerOut,S,S.clientX,S.clientY),u(e.onPointerLeave,S,S.clientX,S.clientY)}),e.onPointerCancel&&(R.onPointercancel=F=>{let S=F;u(e.onPointerCancel,S,S.clientX,S.clientY),V=null});let k=e.id?{"data-poly-mesh-id":e.id}:{};if(e.src&&s.loading.value&&s.polygons.value.length===0)return ke("div",{ref:H,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:x,...k,...R,...T},t.fallback?.()??[]);if(e.src&&s.error.value&&s.polygons.value.length===0)return ke("div",{ref:H,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:x,...k,...R,...T},t.error?.({error:s.error.value})??[]);let Y=l.value,X=t.polygon?Y.map((F,S)=>ke("template",{key:S},t.polygon?.({polygon:F,index:S}))):g.entries.value.map((F,S)=>{if(F)return be({entry:F,page:g.pages.value[F.pageIndex],textureLighting:y.value});let U=C.value[S];return!U||U.texture?null:oe(U)?Ce({entry:U,textureLighting:y.value,solidPaintDefaults:L.value}):xe({entry:U,solidPaintDefaults:L.value})}),$=t.default?.()??[],z=N.value;return ke("div",{ref:H,class:j,style:x,...k,...R,...T},[...z,...X,...$])}}});import{defineComponent as Pa,h as ba,computed as xa}from"vue";var bn=Pa({name:"PolyGround",props:{size:{type:Number,default:6},z:{type:Number,default:0},center:{type:Array,default:()=>[0,0]},color:{type:String,default:"#7d848e"},class:{type:String,default:void 0}},setup(e){let t=xa(()=>{let n=e.size/2,[o,r]=e.center;return[{vertices:[[o-n,r-n,e.z],[o+n,r-n,e.z],[o+n,r+n,e.z],[o-n,r+n,e.z]],color:e.color}]});return()=>ba(Q,{polygons:t.value,castShadow:!1,class:e.class?`polycss-ground ${e.class}`:"polycss-ground"})}});import{computed as xn}from"vue";function Ca(e){return typeof e=="function"?xn(()=>{let{texture:t,key:n}=e();return{texture:t,key:n}}):xn(()=>({texture:e.texture,key:e.key}))}import{computed as Ae,defineComponent as Ea,h as Cn}from"vue";var Ma=4;function qe(e,t=Ma){let n=e.toFixed(t).replace(/\.?0+$/,"");return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function Aa(e){if(e.length!==4)return null;let t=[...new Set(e.map(r=>r[0]))].sort((r,i)=>r-i),n=[...new Set(e.map(r=>r[1]))].sort((r,i)=>r-i);if(t.length!==2||n.length!==2)return null;let o=new Set([`${t[0]},${n[0]}`,`${t[0]},${n[1]}`,`${t[1]},${n[0]}`,`${t[1]},${n[1]}`]);for(let r of e)if(!o.has(`${r[0]},${r[1]}`))return null;return{u0:t[0],u1:t[1],v0:n[0],v1:n[1]}}function Sa({plan:e,material:t,uvRect:n,className:o,style:r,domAttrs:i,pointerEvents:s="auto"}){let{u0:d,u1:a,v0:c,v1:l}=n,m=a-d,f=l-c,y=1/m,p=1/f,b=Math.max(c,l),P=d/m,E=(1-b)/f,C={transform:`matrix3d(${e.canonicalMatrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${qe(y)} ${qe(p)}`,backgroundPosition:`${qe(-P)} ${qe(-E)}`,pointerEvents:s==="none"?"none":void 0,...r},w=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([L,O])=>[`data-${L}`,String(O)])):{},g=o?.trim()||void 0;return Cn("i",{class:g,style:C,...w,...i})}var En=Ea({name:"Poly",inheritAttrs:!1,props:{vertices:{type:Array,required:!0},color:{type:String},texture:{type:String},uvs:{type:Array,default:void 0},data:{type:Object,default:void 0},material:{type:Object,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},textureLighting:{type:String,default:void 0},textureQuality:{type:[Number,String],default:void 0},context:{type:Object,default:void 0},baseColor:{type:String},pointerEvents:{type:String,default:"auto"}},setup(e,{attrs:t}){let n=Ae(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=Ae(()=>e.textureQuality??e.context?.textureQuality),r=Ae(()=>e.material?.texture??e.texture),i=Ae(()=>e.material&&e.uvs?Aa(e.uvs):null),s=Ae(()=>{let c=e.context?.tileSize??50;return ve({vertices:e.vertices,color:e.baseColor??e.color,texture:r.value,uvs:e.uvs,data:e.data},0,{tileSize:c,layerElevation:e.context?.layerElevation??c,directionalLight:e.context?.directionalLight})}),d=Ae(()=>i.value?[]:[s.value]),a=Pe(d,n,o);return()=>{let c=s.value,l=a.entries.value[0],m=[];e.position&&m.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&&m.push(`scale3d(${e.scale}, ${e.scale}, ${e.scale})`):m.push(`scale3d(${e.scale[0]}, ${e.scale[1]}, ${e.scale[2]})`)),e.rotation&&(e.rotation[0]&&m.push(`rotateX(${e.rotation[0]}deg)`),e.rotation[1]&&m.push(`rotateY(${e.rotation[1]}deg)`),e.rotation[2]&&m.push(`rotateZ(${e.rotation[2]}deg)`));let f=m.length>0?m.join(" "):void 0,y={};if(e.data)for(let[E,C]of Object.entries(e.data))y[`data-${E}`]=String(C);let p={...t,...y},b=Object.fromEntries(Object.entries(p).filter(([E])=>E!=="class"&&E!=="style")),P;return i.value&&e.material&&c?P=Sa({plan:c,material:e.material,uvRect:i.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):l?P=be({entry:l,page:a.pages.value[l.pageIndex],textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):c&&!c.texture&&(P=oe(c)?Ce({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):De(c)?Ze({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"}):xe({entry:c,className:p.class??void 0,style:p.style,domAttrs:b,pointerEvents:e.pointerEvents??"auto"})),P?f?Cn("div",{class:"polycss-poly-wrapper",style:{transform:f,position:"absolute",transformStyle:"preserve-3d"}},[P]):P:null}}});import{defineComponent as Ta,inject as wa,onMounted as La,onBeforeUnmount as Ra,watch as bt,ref as Oa}from"vue";import{BASE_TILE as Mn}from"@layoutit/polycss-core";var Da=150,An=4,ka=513e-6,_a=10,Ha=3,Sn=16.67,Ia=50,Tn=.1,wn=10,Ln=0,Rn=5e3,Va=.3,Fa=.05;function za(e){return e===!0?-1:e===void 0||e===!1?1:e}function Na(e,t,n,o,r){let i=za(r),s=e/An*i,d=t/An*i;return{rotX:Math.max(0,Math.min(100,n-d)),rotY:((o-s)%360+360)%360}}function On(e,t,n,o,r){let i=Math.max(.01,n),s=Math.max(.1,Math.cos(o*Math.PI/180)),d=-e/(i*Mn),a=-t/(i*Mn*s),c=-r*Math.PI/180,l=Math.cos(c),m=Math.sin(c);return{dWorldX:a*l-d*m,dWorldY:a*m+d*l}}var Dn=Ta({name:"PolyOrbitControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:Tn},maxZoom:{type:Number,default:wn},minDistance:{type:Number,default:Ln},maxDistance:{type:Number,default:Rn},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=wa(K,null);if(!n)return typeof console<"u"&&console.warn("[polycss] <PolyOrbitControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:r,cameraElRef:i,applyTransformDirect:s}=n,d=()=>({rotX:r.value.state.rotX,rotY:r.value.state.rotY,zoom:r.value.state.zoom,target:r.value.state.target,distance:r.value.state.distance}),a=()=>{t("change",d())},c=()=>{t("interaction-start",d())},l=()=>{t("interaction-end",d())},m=null,f={x:0,y:0},y=Oa(!1),p=null,b=null,P=null;function E(){let g=i.value;if(!g)return;let L=!1,O={x:0,y:0},N=u=>{if(e.drag&&m===null&&u.isPrimary!==!1){u.preventDefault(),m=u.pointerId,f={x:u.clientX,y:u.clientY},g.style.cursor="grabbing";try{u.target.setPointerCapture(u.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(y.value=!0),c()}},_=u=>{if(m===null||u.pointerId!==m||!e.drag)return;u.preventDefault();let h=u.clientX-f.x,v=u.clientY-f.y;f={x:u.clientX,y:u.clientY};let A=r.value,x=A.state;if(u.shiftKey){let{dWorldX:T,dWorldY:j}=On(h,v,x.zoom,x.rotX,x.rotY);A.update({target:[x.target[0]+T,x.target[1]+j,x.target[2]]})}else{let{rotX:T,rotY:j}=Na(h,v,x.rotX,x.rotY,e.invert);A.update({rotX:T,rotY:j})}s(),o.updateCameraFromRef(A),a()},H=u=>{if(m===u.pointerId){m=null,g.style.cursor=e.drag?"grab":"";try{u.target.releasePointerCapture(u.pointerId)}catch{}y.value=!1,l()}},M=u=>{u.preventDefault()},D=u=>{u.button===2&&(L=!0,O={x:u.clientX,y:u.clientY})},V=u=>{if(!L||!e.drag)return;let h=u.clientX-O.x,v=u.clientY-O.y;O={x:u.clientX,y:u.clientY};let A=r.value,x=A.state,{dWorldX:T,dWorldY:j}=On(h,v,x.zoom,x.rotX,x.rotY);A.update({target:[x.target[0]+T,x.target[1]+j,x.target[2]]}),s(),o.updateCameraFromRef(A),a()},I=u=>{u.button===2&&L&&(L=!1,l())};g.style.cursor="grab",g.style.touchAction="none",g.style.userSelect="none",g.addEventListener("pointerdown",N),g.addEventListener("pointermove",_),g.addEventListener("pointerup",H),g.addEventListener("pointercancel",H),g.addEventListener("contextmenu",M),g.addEventListener("mousedown",D),g.addEventListener("mousemove",V),g.addEventListener("mouseup",I),p=()=>{g.removeEventListener("pointerdown",N),g.removeEventListener("pointermove",_),g.removeEventListener("pointerup",H),g.removeEventListener("pointercancel",H),g.removeEventListener("contextmenu",M),g.removeEventListener("mousedown",D),g.removeEventListener("mousemove",V),g.removeEventListener("mouseup",I),g.style.cursor="",g.style.touchAction="",g.style.userSelect=""}}function C(){let g=i.value;if(!g)return;let L=!1,O=null,N=_=>{if(!e.wheel)return;_.preventDefault();let H=_.deltaMode===1?16:_.deltaMode===2?100:1,M=_.deltaY*H;_.ctrlKey?M*=_a:M*=Ha;let D=r.value;if(e.dolly){let V=e.minDistance??Ln,I=e.maxDistance??Rn,u=Math.max(V,Math.min(I,D.state.distance+M*Fa));D.update({distance:u})}else{let V=Math.exp(-M*ka),I=e.minZoom??Tn,u=e.maxZoom??wn,h=Math.max(I,Math.min(u,D.state.zoom*V));D.update({zoom:h})}s(),o.updateCameraFromRef(D),L||(L=!0,c()),a(),O!==null&&clearTimeout(O),O=setTimeout(()=>{O=null,L=!1,l()},Da)};g.addEventListener("wheel",N,{passive:!1}),b=()=>{g.removeEventListener("wheel",N),O!==null&&clearTimeout(O)}}function w(){let g=null,L=!1,O=0,N=_=>{if(L)return;let H=e.animate;if(!H){g=requestAnimationFrame(N);return}if(y.value)O=_;else{let M=Math.min(Ia,O?_-O:Sn);O=_;let V=(H.speed??Va)*(M/Sn),I=r.value,u=I.state;if(H.axis==="x"){let h=((u.rotX+V)%360+360)%360;I.update({rotX:h})}else{let h=((u.rotY+V)%360+360)%360;I.update({rotY:h})}s(),o.updateCameraFromRef(I),a()}g=requestAnimationFrame(N)};g=requestAnimationFrame(N),P=()=>{L=!0,g!==null&&cancelAnimationFrame(g),P=null}}return La(()=>{e.drag&&E(),e.wheel&&C(),e.animate&&w()}),Ra(()=>{p?.(),b?.(),P?.(),p=null,b=null}),bt(()=>e.drag,g=>{g&&!p&&E(),!g&&p&&(p(),p=null)}),bt(()=>e.wheel,g=>{g&&!b&&C(),!g&&b&&(b(),b=null)}),bt(()=>!!e.animate,g=>{g&&!P&&w(),!g&&P&&P()}),()=>null}});import{defineComponent as ja,inject as Ya,onMounted as Ua,onBeforeUnmount as Xa,watch as xt,ref as $a}from"vue";import{BASE_TILE as kn}from"@layoutit/polycss-core";var Ba=150,_n=4,Wa=513e-6,Za=10,Ka=3,Hn=16.67,Ga=50,In=.1,Vn=10,Fn=0,zn=5e3,qa=.3,Qa=.05;function Ja(e){return e===!0?-1:e===void 0||e===!1?1:e}function Nn(e,t,n,o,r){let i=Ja(r),s=e/_n*i,d=t/_n*i;return{rotX:Math.max(0,Math.min(100,n-d)),rotY:((o-s)%360+360)%360}}function ei(e,t,n,o,r){let i=Math.max(.01,n),s=Math.max(.1,Math.cos(o*Math.PI/180)),d=-e/(i*kn),a=-t/(i*kn*s),c=-r*Math.PI/180,l=Math.cos(c),m=Math.sin(c);return{dWorldX:a*l-d*m,dWorldY:a*m+d*l}}var jn=ja({name:"PolyMapControls",props:{drag:{type:Boolean,default:!0},wheel:{type:Boolean,default:!0},dolly:{type:Boolean,default:!1},invert:{type:[Boolean,Number],default:!1},minZoom:{type:Number,default:In},maxZoom:{type:Number,default:Vn},minDistance:{type:Number,default:Fn},maxDistance:{type:Number,default:zn},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=Ya(K,null);if(!n)return typeof console<"u"&&console.warn("[polycss] <PolyMapControls> must be used inside <PolyCamera>."),()=>null;let{store:o,cameraRef:r,cameraElRef:i,applyTransformDirect:s}=n,d=()=>({rotX:r.value.state.rotX,rotY:r.value.state.rotY,zoom:r.value.state.zoom,target:r.value.state.target,distance:r.value.state.distance}),a=()=>{t("change",d())},c=()=>{t("interaction-start",d())},l=()=>{t("interaction-end",d())},m=null,f={x:0,y:0},y=$a(!1),p=null,b=null,P=null;function E(){let g=i.value;if(!g)return;let L=!1,O={x:0,y:0},N=u=>{if(e.drag&&m===null&&u.isPrimary!==!1){u.preventDefault(),m=u.pointerId,f={x:u.clientX,y:u.clientY},g.style.cursor="grabbing";try{u.target.setPointerCapture(u.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(y.value=!0),c()}},_=u=>{if(m===null||u.pointerId!==m||!e.drag)return;u.preventDefault();let h=u.clientX-f.x,v=u.clientY-f.y;f={x:u.clientX,y:u.clientY};let A=r.value,x=A.state;if(u.shiftKey){let{rotX:T,rotY:j}=Nn(h,v,x.rotX,x.rotY,e.invert);A.update({rotX:T,rotY:j})}else{let{dWorldX:T,dWorldY:j}=ei(h,v,x.zoom,x.rotX,x.rotY);A.update({target:[x.target[0]+T,x.target[1]+j,x.target[2]]})}s(),o.updateCameraFromRef(A),a()},H=u=>{if(m===u.pointerId){m=null,g.style.cursor=e.drag?"grab":"";try{u.target.releasePointerCapture(u.pointerId)}catch{}y.value=!1,l()}},M=u=>{u.preventDefault()},D=u=>{u.button===2&&(L=!0,O={x:u.clientX,y:u.clientY})},V=u=>{if(!L||!e.drag)return;let h=u.clientX-O.x,v=u.clientY-O.y;O={x:u.clientX,y:u.clientY};let A=r.value,x=A.state,{rotX:T,rotY:j}=Nn(h,v,x.rotX,x.rotY,e.invert);A.update({rotX:T,rotY:j}),s(),o.updateCameraFromRef(A),a()},I=u=>{u.button===2&&L&&(L=!1,l())};g.style.cursor="grab",g.style.touchAction="none",g.style.userSelect="none",g.addEventListener("pointerdown",N),g.addEventListener("pointermove",_),g.addEventListener("pointerup",H),g.addEventListener("pointercancel",H),g.addEventListener("contextmenu",M),g.addEventListener("mousedown",D),g.addEventListener("mousemove",V),g.addEventListener("mouseup",I),p=()=>{g.removeEventListener("pointerdown",N),g.removeEventListener("pointermove",_),g.removeEventListener("pointerup",H),g.removeEventListener("pointercancel",H),g.removeEventListener("contextmenu",M),g.removeEventListener("mousedown",D),g.removeEventListener("mousemove",V),g.removeEventListener("mouseup",I),g.style.cursor="",g.style.touchAction="",g.style.userSelect=""}}function C(){let g=i.value;if(!g)return;let L=!1,O=null,N=_=>{if(!e.wheel)return;_.preventDefault();let H=_.deltaMode===1?16:_.deltaMode===2?100:1,M=_.deltaY*H;_.ctrlKey?M*=Za:M*=Ka;let D=r.value;if(e.dolly){let V=e.minDistance??Fn,I=e.maxDistance??zn,u=Math.max(V,Math.min(I,D.state.distance+M*Qa));D.update({distance:u})}else{let V=Math.exp(-M*Wa),I=e.minZoom??In,u=e.maxZoom??Vn,h=Math.max(I,Math.min(u,D.state.zoom*V));D.update({zoom:h})}s(),o.updateCameraFromRef(D),L||(L=!0,c()),a(),O!==null&&clearTimeout(O),O=setTimeout(()=>{O=null,L=!1,l()},Ba)};g.addEventListener("wheel",N,{passive:!1}),b=()=>{g.removeEventListener("wheel",N),O!==null&&clearTimeout(O)}}function w(){let g=null,L=!1,O=0,N=_=>{if(L)return;let H=e.animate;if(!H){g=requestAnimationFrame(N);return}if(y.value)O=_;else{let M=Math.min(Ga,O?_-O:Hn);O=_;let V=(H.speed??qa)*(M/Hn),I=r.value,u=I.state;if(H.axis==="x"){let h=((u.rotX+V)%360+360)%360;I.update({rotX:h})}else{let h=((u.rotY+V)%360+360)%360;I.update({rotY:h})}s(),o.updateCameraFromRef(I),a()}g=requestAnimationFrame(N)};g=requestAnimationFrame(N),P=()=>{L=!0,g!==null&&cancelAnimationFrame(g),P=null}}return Ua(()=>{e.drag&&E(),e.wheel&&C(),e.animate&&w()}),Xa(()=>{p?.(),b?.(),P?.(),p=null,b=null}),xt(()=>e.drag,g=>{g&&!p&&E(),!g&&p&&(p(),p=null)}),xt(()=>e.wheel,g=>{g&&!b&&C(),!g&&b&&(b(),b=null)}),xt(()=>!!e.animate,g=>{g&&!P&&w(),!g&&P&&P()}),()=>null}});import{defineComponent as ti,h as Qe,inject as Yn,onBeforeUnmount as Un,onMounted as Ct,ref as _e,computed as Se}from"vue";import{arrowPolygons as ni,eulerXYZFromQuat as oi,planePolygons as ri,quatFromAxisAngle as ai,quatFromEulerXYZ as ii,quatMultiply as si,ringQuadPolygons as li}from"@layoutit/polycss-core";var Je="#ff3653",et="#8adb00",tt="#2c8fff",ci=.6,ui=.8,di=1,me=50,Xn=60,mi=.6,fi=.0125,yi=.15,pi=.04,gi=1,$n=.02,Et=1.04,hi=.1,vi=.25,Qn=1e-4,He={0:1,1:0,2:2},Bn=[{cssAxis:0,sign:1,key:"x",color:Je},{cssAxis:0,sign:-1,key:"-x",color:Je},{cssAxis:1,sign:1,key:"y",color:et},{cssAxis:1,sign:-1,key:"-y",color:et},{cssAxis:2,sign:1,key:"z",color:tt},{cssAxis:2,sign:-1,key:"-z",color:tt}],Wn=[{cssAxis:0,key:"x",color:Je},{cssAxis:1,key:"y",color:et},{cssAxis:2,key:"z",color:tt}],Zn=[{perpAxis:2,axisA:0,axisB:1,key:"xy",color:tt},{perpAxis:1,axisA:0,axisB:2,key:"xz",color:et},{perpAxis:0,axisA:1,axisB:2,key:"yz",color:Je}];function Mt(e,t){let n=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);if(!n)return e;let o=parseInt(n[1],16),r=parseInt(n[2],16),i=parseInt(n[3],16);return`rgba(${o}, ${r}, ${i}, ${t})`}function nt(e,t){return!t||t<=0?e:Math.round(e/t)*t}function Pi(e){return e.replace("-","")[0]}function At(e,t,n,o){let r=n*Math.PI/180,i=o*Math.PI/180,s=[0,0,0];s[e]=t;let d=s[0]*Math.sin(i)+s[1]*Math.cos(i),a=s[2];return d*Math.sin(r)+a*Math.cos(r)<0}function bi(e){if(e.length===0)return Xn;let t=1/0,n=1/0,o=1/0,r=-1/0,i=-1/0,s=-1/0;for(let d of e)for(let a of d.vertices)a[0]<t&&(t=a[0]),a[0]>r&&(r=a[0]),a[1]<n&&(n=a[1]),a[1]>i&&(i=a[1]),a[2]<o&&(o=a[2]),a[2]>s&&(s=a[2]);return Number.isFinite(t)?Math.max(r-t,i-n,s-o)*me*mi:Xn}function xi(e){if(e.length===0)return[0,0,0];let t=1/0,n=1/0,o=1/0,r=-1/0,i=-1/0,s=-1/0;for(let d of e)for(let a of d.vertices)a[0]<t&&(t=a[0]),a[0]>r&&(r=a[0]),a[1]<n&&(n=a[1]),a[1]>i&&(i=a[1]),a[2]<o&&(o=a[2]),a[2]>s&&(s=a[2]);return Number.isFinite(t)?[(n+i)/2*me,(t+r)/2*me,(o+s)/2*me]:[0,0,0]}function Kn(e){let t=e.shaftLengthCss,n=[0,0,0];n[e.cssAxis]=e.sign;let o=e.wrapper.ownerDocument.createElement("div");o.style.position="absolute",o.style.left="0",o.style.top="0",o.style.width="0",o.style.height="0",o.style.transform=`translate3d(${n[0]*t}px, ${n[1]*t}px, ${n[2]*t}px)`,e.wrapper.appendChild(o);let r=e.wrapper.getBoundingClientRect(),i=o.getBoundingClientRect();e.wrapper.removeChild(o);let s=(i.left-r.left)/t,d=(i.top-r.top)/t,a=s*s+d*d;if(a<Qn)return;let c=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let l=f=>{let y=f.clientX-e.startClientX,p=f.clientY-e.startClientY,b=(y*s+p*d)/a;b=nt(b,e.translationSnap);let P=[c[0]+b*n[0],c[1]+b*n[1],c[2]+b*n[2]];e.onObjectChange?.({object:e.target,position:P}),e.onChange?.()},m=()=>{window.removeEventListener("pointermove",l),window.removeEventListener("pointerup",m),window.removeEventListener("pointercancel",m);let f=y=>{y.stopPropagation(),y.stopImmediatePropagation()};window.addEventListener("click",f,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",f,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",l),window.addEventListener("pointerup",m),window.addEventListener("pointercancel",m)}function Gn(e){let t=[0,0,0];t[e.axisA]=1;let n=[0,0,0];n[e.axisB]=1;let o=e.probeDistanceCss;function r(m){let f=e.wrapper.ownerDocument.createElement("div");f.style.position="absolute",f.style.left="0",f.style.top="0",f.style.width="0",f.style.height="0",f.style.transform=`translate3d(${m[0]*o}px, ${m[1]*o}px, ${m[2]*o}px)`,e.wrapper.appendChild(f);let y=e.wrapper.getBoundingClientRect(),p=f.getBoundingClientRect();return e.wrapper.removeChild(f),{x:(p.left-y.left)/o,y:(p.top-y.top)/o}}let i=r(t),s=r(n),d=i.x*s.y-s.x*i.y;if(Math.abs(d)<Qn)return;let a=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let c=m=>{let f=m.clientX-e.startClientX,y=m.clientY-e.startClientY,p=(s.y*f-s.x*y)/d,b=(-i.y*f+i.x*y)/d;p=nt(p,e.translationSnap),b=nt(b,e.translationSnap);let P=[a[0]+p*t[0]+b*n[0],a[1]+p*t[1]+b*n[1],a[2]+p*t[2]+b*n[2]];e.onObjectChange?.({object:e.target,position:P}),e.onChange?.()},l=()=>{window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",l),window.removeEventListener("pointercancel",l),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",c),window.addEventListener("pointerup",l),window.addEventListener("pointercancel",l)}function qn(e){let t=e.wrapper.getBoundingClientRect(),n=t.left,o=t.top,r=Math.atan2(e.startClientY-o,e.startClientX-n),i=0,s=e.target.getRotation()??[0,0,0],d=ii(s);e.onMouseDown?.(),e.onDraggingChanged?.(!0);let a=l=>{let m=Math.atan2(l.clientY-o,l.clientX-n),f=m-r;f>Math.PI?f-=2*Math.PI:f<-Math.PI&&(f+=2*Math.PI),i+=f,r=m;let y=i*180/Math.PI;y=nt(y,e.rotationSnap);let p=[0,0,0];p[e.cssAxis]=1;let b=ai(p,y*Math.PI/180),P=oi(si(b,d));e.onObjectChange?.({object:e.target,rotation:P}),e.onChange?.()},c=()=>{window.removeEventListener("pointermove",a),window.removeEventListener("pointerup",c),window.removeEventListener("pointercancel",c);let l=m=>{m.stopPropagation(),m.stopImmediatePropagation()};window.addEventListener("click",l,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",l,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1),e.target.rebakeAtlas()};window.addEventListener("pointermove",a),window.addEventListener("pointerup",c),window.addEventListener("pointercancel",c)}function Ci(e){return!!e&&typeof e=="object"&&"value"in e}function Ei(e){return e?Ci(e)?e.value??null:e:null}var Jn=ti({name:"PolyTransformControls",props:{object:{type:null,default:null},mode:{type:String,default:"translate"},space:{type:String,default:"world"},size:{type:Number,default:1},showX:{type:Boolean,default:!0},showY:{type:Boolean,default:!0},showZ:{type:Boolean,default:!0},translationSnap:{type:Number,default:null},rotationSnap:{type:Number,default:null},enabled:{type:Boolean,default:!0}},emits:{change:()=>!0,objectChange:e=>!0,mouseDown:()=>!0,mouseUp:()=>!0,draggingChanged:e=>!0},setup(e,{emit:t}){let n=_e(null),o=_e(null),r=_e(new Map),i=Se(()=>Ei(e.object)),s=_e(0);Ct(()=>{s.value++});let d=_e(0),a=Yn(K,void 0),c=null;Ct(()=>{let u=a?.store;u&&(c=u.subscribe(()=>{d.value++}))}),Un(()=>{c?.()});function l(){d.value;let u=a?.store.getState().cameraState;return{rotX:u?.rotX??65,rotY:u?.rotY??45}}let m=Se(()=>(s.value,bi(i.value?.getPolygons()??[]))),f=Se(()=>m.value*e.size);function y(u){return o.value===u?di:n.value===u?ui:ci}function p(){t("change")}function b(u){t("objectChange",u)}function P(u){t("draggingChanged",u)}function E(){t("mouseDown")}function C(){t("mouseUp")}let w=Yn(K,void 0),g=null;Ct(()=>{let u=w?.cameraElRef.value;if(!u)return;let h=v=>{let A=i.value;if(!A||!e.enabled||v.target?.closest(".polycss-transform-gizmo"))return;let T={x:e.showX,y:e.showY,z:e.showZ};if(e.mode==="translate")for(let R of Zn){let k=["x","y","z"][R.axisA],Y=["x","y","z"][R.axisB];if(!T[k]||!T[Y])continue;let X=document.querySelector(`.polycss-transform-plane--${R.key}`);if(!X||!Me(X,v.clientX,v.clientY))continue;v.preventDefault(),v.stopPropagation();let $=X.closest("[data-poly-transform-controls]");if(!$)return;o.value=R.key,Gn({axisA:R.axisA,axisB:R.axisB,probeDistanceCss:f.value,wrapper:$,target:A,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:z=>{z||(o.value=null),P(z)}});return}let j=e.mode==="translate"?Bn:Wn;for(let R of j){let k=R.key.replace("-","")[0];if(!T[k])continue;let Y=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${R.key}`);if(!Y||!(e.mode==="rotate"?Me(Y,v.clientX,v.clientY):Me(Y,v.clientX,v.clientY)))continue;v.preventDefault(),v.stopPropagation();let $=Y.closest("[data-poly-transform-controls]");if(!$)return;if(o.value=R.key,e.mode==="translate"){let z=R;Kn({cssAxis:z.cssAxis,sign:z.sign,shaftLengthCss:f.value,wrapper:$,target:A,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:F=>{F||(o.value=null),P(F)}})}else qn({cssAxis:R.cssAxis,wrapper:$,target:A,startClientX:v.clientX,startClientY:v.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:z=>{z||(o.value=null),P(z)}});return}};u.addEventListener("pointerdown",h),g=()=>u.removeEventListener("pointerdown",h)}),Un(()=>{g?.()});let L=Se(()=>{if(e.mode!=="translate")return[];s.value;let h=f.value/me,{rotX:v,rotY:A}=l();return Bn.filter(x=>({x:e.showX,y:e.showY,z:e.showZ})[Pi(x.key)]).map(x=>{let T=y(x.key),j=At(x.cssAxis,x.sign,v,A);return{spec:x,polygons:ni({axis:He[x.cssAxis],sign:x.sign,shaftLength:h,shaftHalfThickness:h*fi,headLength:h*yi,headHalfThickness:h*pi,color:Mt(x.color,T),shaft:!j})}})}),O=Se(()=>{if(e.mode!=="translate")return[];s.value;let h=f.value/me,v={x:e.showX,y:e.showY,z:e.showZ},A=["x","y","z"],{rotX:x,rotY:T}=l(),j=h*vi;return Zn.filter(R=>v[A[R.axisA]]&&v[A[R.axisB]]).map(R=>{let k=y(R.key),Y=He[R.perpAxis],X=(Y+1)%3,$=(Y+2)%3,z=He[X],F=He[$],S=At(z,1,x,T)?-1:1,U=At(F,1,x,T)?-1:1;return{spec:R,polygons:ri({axis:Y,size:h*hi,offset:[S*j,U*j],color:Mt(R.color,k)})}})}),N=Se(()=>{if(e.mode!=="rotate")return[];s.value;let v=f.value*gi/me*Et;return Wn.filter(A=>({x:e.showX,y:e.showY,z:e.showZ})[A.key]).map(A=>{let x=y(A.key);return{spec:A,polygons:li({axis:He[A.cssAxis],outerRadius:v,color:Mt(A.color,x)})}})}),_=(1-$n)/Et,H=(1+$n)/Et;function M(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;h.stopPropagation();let x=h.eventObject.element?.closest("[data-poly-transform-controls]");x&&(o.value=u.key,Kn({cssAxis:u.cssAxis,sign:u.sign,shaftLengthCss:f.value,wrapper:x,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:T=>{T||(o.value=null),P(T)}}))}}function D(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;h.stopPropagation();let x=h.eventObject.element?.closest("[data-poly-transform-controls]");x&&(o.value=u.key,Gn({axisA:u.axisA,axisB:u.axisB,probeDistanceCss:f.value,wrapper:x,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:T=>{T||(o.value=null),P(T)}}))}}function V(u){return h=>{if(!e.enabled)return;let v=i.value;if(!v)return;let A=h.eventObject.element;h.stopPropagation();let x=A?.closest("[data-poly-transform-controls]");x&&(o.value=u.key,qn({cssAxis:u.cssAxis,wrapper:x,target:v,startClientX:h.nativeEvent.clientX,startClientY:h.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:b,onMouseDown:E,onMouseUp:C,onDraggingChanged:T=>{T||(o.value=null),P(T)}}))}}function I(u){return{onPointerOver:()=>{n.value=u},onPointerOut:()=>{n.value===u&&(n.value=null)}}}return()=>{let u=i.value;if(!u)return null;let h=u.getPosition()??[0,0,0],v=xi(u.getPolygons()),A=h[0]+v[0],x=h[1]+v[1],T=h[2]+v[2],j={transform:`translate3d(${A}px, ${x}px, ${T}px)`,position:"absolute",transformStyle:"preserve-3d",zIndex:1e3},R=e.mode==="translate"?[...L.value.map(({spec:k,polygons:Y})=>Qe(Q,{key:`arrow-${k.key}`,polygons:Y,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${k.key}`,textureLighting:"baked",onPointerDown:M(k),...I(k.key)})),...O.value.map(({spec:k,polygons:Y})=>Qe(Q,{key:`plane-${k.key}`,polygons:Y,class:`polycss-transform-gizmo polycss-transform-plane polycss-transform-plane--${k.key}`,textureLighting:"baked",onPointerDown:D(k),...I(k.key)}))]:N.value.map(({spec:k,polygons:Y})=>Qe(Q,{key:k.key,polygons:Y,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${k.key}`,style:{"--ring-inner-ratio":_,"--ring-outer-ratio":H},textureLighting:"baked",onPointerDown:V(k),...I(k.key)}));return Qe("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:j},R)}}});import{defineComponent as Mi,inject as Ai,onMounted as Si,onBeforeUnmount as Ti,watch as wi}from"vue";import{BASE_TILE as Li}from"@layoutit/polycss-core";var Ri={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 St(e,t){return{enabled:t.enabled??e.enabled,lookEnabled:t.lookEnabled??e.lookEnabled,moveEnabled:t.moveEnabled??e.moveEnabled,jumpEnabled:t.jumpEnabled??e.jumpEnabled,crouchEnabled:t.crouchEnabled??e.crouchEnabled,lookSensitivity:t.lookSensitivity??e.lookSensitivity,invertY:t.invertY??e.invertY,moveSpeed:t.moveSpeed??e.moveSpeed,jumpVelocity:t.jumpVelocity??e.jumpVelocity,gravity:t.gravity??e.gravity,eyeHeight:t.eyeHeight??e.eyeHeight,crouchHeight:t.crouchHeight??e.crouchHeight,groundZ:t.groundZ??e.groundZ,minPitch:t.minPitch??e.minPitch,maxPitch:t.maxPitch??e.maxPitch}}var to=new Set(["KeyW","ArrowUp"]),no=new Set(["KeyS","ArrowDown"]),oo=new Set(["KeyA","ArrowLeft"]),ro=new Set(["KeyD","ArrowRight"]),ao=new Set(["Space"]),Tt=new Set(["ControlLeft","ControlRight"]);function eo(e){return to.has(e)||no.has(e)||oo.has(e)||ro.has(e)||ao.has(e)||Tt.has(e)}function Oi(){return{change:[],start:[],end:[]}}function Te(e,t){let n=[...e[t]];for(let o of n)try{o()}catch{}}var io=Mi({name:"PolyFirstPersonControls",props:{enabled:{type:Boolean,default:!0},lookEnabled:{type:Boolean,default:!0},moveEnabled:{type:Boolean,default:!0},jumpEnabled:{type:Boolean,default:!0},crouchEnabled:{type:Boolean,default:!0},lookSensitivity:{type:Number,default:.15},invertY:{type:Boolean,default:!1},moveSpeed:{type:Number,default:5},jumpVelocity:{type:Number,default:7},gravity:{type:Number,default:18},eyeHeight:{type:Number,default:1.7},crouchHeight:{type:Number,default:1},groundZ:{type:Number,default:0},minPitch:{type:Number,default:5},maxPitch:{type:Number,default:175}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t,expose:n}){let o=Ai(K,null);if(!o)return typeof console<"u"&&console.warn("[polycss] <PolyFirstPersonControls> must be used inside <PolyCamera>."),n({}),()=>null;let{store:r,cameraRef:i,cameraElRef:s,applyTransformDirect:d}=o,a=St(Ri,e),c=[0,0,0],l=null,m=0,f=!1,y=!1,p=!1,b=new Set,P=0,E=0,C=Oi();function w(u,h){let v=u*Math.PI/180,A=h*Math.PI/180;return[-Math.sin(v)*Math.cos(A),-Math.sin(v)*Math.sin(A),-Math.cos(v)]}function g(){let u=s.value,h=u?getComputedStyle(u).perspective:"",v=parseFloat(h);return(Number.isFinite(v)&&v>0?v:8e3)/Li}function L(){let u=i.value.state,h=w(u.rotX??90,u.rotY??0),v=g();return[c[0]+h[0]*v,c[1]+h[1]*v,c[2]+h[2]*v]}function O(){let u=L(),h=i.value;h.update({target:u}),d(),r.updateCameraFromRef(h)}let N=.05;function _(u){if(l===null||f)return;let h=Math.min(N,m?(u-m)/1e3:.0167);if(m=u,a.enabled){let v=!1,A=i.value.state;if(a.moveEnabled){let R=0,k=0;for(let Y of b)to.has(Y)?R+=1:no.has(Y)?R-=1:ro.has(Y)?k+=1:oo.has(Y)&&(k-=1);if(R!==0||k!==0){let X=(A.rotY??0)*Math.PI/180,$=-Math.cos(X),z=-Math.sin(X),F=-Math.sin(X),S=Math.cos(X),U=Math.hypot(R,k)||1,B=a.moveSpeed*h;c[0]+=($*R+F*k)/U*B,c[1]+=(z*R+S*k)/U*B,v=!0}}let T=a.crouchEnabled&&(b.has("ControlLeft")||b.has("ControlRight"))?a.crouchHeight:a.eyeHeight;a.jumpEnabled&&(P!==0||E>0)?(P-=a.gravity*h,E+=P*h,E<=0&&(E=0,P=0)):a.jumpEnabled||(E=0,P=0);let j=a.groundZ+T+E;if(Math.abs(c[2]-j)>1e-4&&(c[2]=j,v=!0),v){let R=L(),k=i.value;k.update({target:R}),d(),r.updateCameraFromRef(k),Te(C,"change");try{t("change",[c[0],c[1],c[2]])}catch{}}}l=requestAnimationFrame(_)}function H(){l!==null||f||(m=0,l=requestAnimationFrame(_))}function M(){l!==null&&(cancelAnimationFrame(l),l=null)}let D=null;function V(){let u=s.value;if(!u)return;let h=u.ownerDocument??document,v=h.defaultView??globalThis,A=()=>{if(!(!a.enabled||!a.lookEnabled||f||y))try{u.requestPointerLock()}catch{}},x=()=>{let z=h.pointerLockElement===u;if(z!==y){if(y=z,z){p=!0,Te(C,"start");try{t("interaction-start",[c[0],c[1],c[2]])}catch{}}else if(p){p=!1,Te(C,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}}},T=z=>{if(!y||f||!a.enabled||!a.lookEnabled)return;let F=z.movementX??0,S=z.movementY??0;if(F===0&&S===0)return;let U=i.value,B=U.state,re=a.lookSensitivity,ce=a.invertY?-1:1,se=(((B.rotY??0)-F*re)%360+360)%360,W=(B.rotX??90)-S*re*ce;W<a.minPitch?W=a.minPitch:W>a.maxPitch&&(W=a.maxPitch);let ue=w(W,se),we=g(),rt=[c[0]+ue[0]*we,c[1]+ue[1]*we,c[2]+ue[2]*we];U.update({rotX:W,rotY:se,target:rt}),d(),r.updateCameraFromRef(U),Te(C,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},j=z=>{if(!(!a.enabled||f)&&eo(z.code)&&!(!y&&!a.moveEnabled)){if(ao.has(z.code)){if(!a.jumpEnabled)return;z.preventDefault(),!b.has(z.code)&&P===0&&E===0&&(P=a.jumpVelocity),b.add(z.code);return}Tt.has(z.code)&&!a.crouchEnabled||!a.moveEnabled&&!Tt.has(z.code)||(z.preventDefault(),b.add(z.code))}},R=z=>{eo(z.code)&&b.delete(z.code)},k=()=>{b.clear()};u.addEventListener("click",A),h.addEventListener("pointerlockchange",x),h.addEventListener("mousemove",T),v.addEventListener("keydown",j),v.addEventListener("keyup",R),v.addEventListener("blur",k);let Y=v.getComputedStyle(u).perspective,X=parseFloat(Y),$=Number.isFinite(X)&&X>0?X:2e3;u.style.setProperty("--polycss-fpv-perspective",`${$}px`),u.classList.add("polycss-fpv-host"),D=()=>{if(u.removeEventListener("click",A),h.removeEventListener("pointerlockchange",x),h.removeEventListener("mousemove",T),v.removeEventListener("keydown",j),v.removeEventListener("keyup",R),v.removeEventListener("blur",k),u.style.cursor="",u.classList.remove("polycss-fpv-host"),u.style.removeProperty("--polycss-fpv-perspective"),b.clear(),y)try{h.exitPointerLock()}catch{}}}n({update(u){a=St(a,u);let h=s.value;h&&!f&&(h.style.cursor=a.lookEnabled?"crosshair":"")},resume(){if(!f)return;f=!1;let u=s.value;u&&(u.style.cursor=a.lookEnabled?"crosshair":""),H()},pause(){if(f)return;f=!0,M();let u=s.value;if(u&&(u.style.cursor=""),p){p=!1,Te(C,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}},destroy(){f=!0,M()},lock(){if(!a.enabled||!a.lookEnabled||f)return;let u=s.value;try{u?.requestPointerLock()}catch{}},unlock(){if(y){let u=s.value;try{u?.ownerDocument?.exitPointerLock()}catch{}}},isLocked(){return y},getOrigin(){return[c[0],c[1],c[2]]},setOrigin(u){c[0]=u[0],c[1]=u[1],c[2]=u[2],O(),Te(C,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},addEventListener(u,h){let v=C[u];v.includes(h)||v.push(h)},removeEventListener(u,h){let v=C[u],A=v.indexOf(h);A>=0&&v.splice(A,1)},hasEventListener(u,h){return C[u].includes(h)}}),Si(()=>{let u=s.value;if(!u)return;f=!1,y=!1,p=!1,b.clear(),P=0,E=0;let v=i.value.state.target??[0,0,0];c[0]=v[0],c[1]=v[1],c[2]=a.groundZ+a.eyeHeight,O(),u.style.cursor=a.lookEnabled?"crosshair":"",V(),H()}),Ti(()=>{f=!0,M(),D?.(),D=null});let I=["enabled","lookEnabled","moveEnabled","jumpEnabled","crouchEnabled","lookSensitivity","invertY","moveSpeed","jumpVelocity","gravity","eyeHeight","crouchHeight","groundZ","minPitch","maxPitch"];for(let u of I)wi(()=>e[u],()=>{a=St(a,e);let h=s.value;h&&!f&&(h.style.cursor=a.lookEnabled?"crosshair":"")});return()=>null}});import{defineComponent as Di,h as ki,inject as wt,onBeforeUnmount as _i,onMounted as Hi,provide as Ii,reactive as Vi,ref as Fi,computed as zi}from"vue";var Ie=Symbol("polycss.selection"),so=Di({name:"PolySelect",props:{multiple:{type:Boolean,default:!1},clearOnMiss:{type:Boolean,default:!0},filter:{type:Function,default:void 0}},emits:{change:e=>!0,pointerMissed:e=>!0},setup(e,{emit:t,slots:n}){let o=Vi({selected:[]}),r=zi(()=>o.selected);function i(l){let m=e.filter?e.filter(l):l;o.selected=m,t("change",m)}let s={get selected(){return o.selected},set:l=>i(l),add:l=>{e.multiple?o.selected.includes(l)||i([...o.selected,l]):i([l])},remove:l=>{o.selected.includes(l)&&i(o.selected.filter(m=>m!==l))},toggle:l=>{o.selected.includes(l)?i(o.selected.filter(m=>m!==l)):e.multiple?i([...o.selected,l]):i([l])},clear:()=>i([]),has:l=>o.selected.includes(l)};Ii(Ie,{selected:r,api:s});let d=wt(K,void 0),a=(l,m)=>vt(l,m,f=>!f.closest("[data-poly-transform-controls]")),c=null;return Hi(()=>{let l=d?.cameraElRef.value;if(!l)return;let m=f=>{if(f.target?.closest("[data-poly-transform-controls]"))return;let p=Ee(f.target)??a(f.clientX,f.clientY);if(!p){t("pointerMissed",f),e.clearOnMiss&&i([]);return}e.multiple&&(f.shiftKey||f.metaKey||f.ctrlKey)?s.toggle(p):o.selected.length===1&&o.selected[0]===p?i([]):i([p])};l.addEventListener("click",m),c=()=>l.removeEventListener("click",m)}),_i(()=>{c?.()}),()=>ki("div",{style:{display:"contents"},"data-poly-select":""},n.default?.())}});function lo(){let e=wt(Ie,void 0);return e?e.selected:Fi([])}function co(){let e=wt(Ie,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}import{defineComponent as Ni,h as ji,computed as Yi}from"vue";import{axesHelperPolygons as Ui}from"@layoutit/polycss-core";var uo=Ni({name:"PolyAxesHelper",props:{size:{type:Number,default:void 0},thickness:{type:Number,default:void 0},negative:{type:Boolean,default:void 0},xColor:{type:String,default:void 0},yColor:{type:String,default:void 0},zColor:{type:String,default:void 0}},setup(e){let t=Yi(()=>Ui({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>ji(Q,{polygons:t.value})}});import{defineComponent as Xi,h as $i,computed as Lt}from"vue";import{octahedronPolygons as Bi}from"@layoutit/polycss-core";var Rt=50,mo=Xi({name:"PolyDirectionalLightHelper",props:{light:{type:Object,required:!0},target:{type:Array,default:void 0},distance:{type:Number,default:5},size:{type:Number,default:.35},color:{type:String,default:void 0}},setup(e){let t=Lt(()=>e.color??e.light.color??"#ffd54a"),n=Lt(()=>Bi({center:[0,0,0],size:e.size,color:t.value})),o=Lt(()=>{let r=e.light.direction,i=r[0],s=r[1],d=r[2],a=Math.hypot(i,s,d)||1,c=e.target?.[0]??0,l=e.target?.[1]??0,m=e.target?.[2]??0,f=c+s/a*e.distance,y=l+i/a*e.distance,p=m+d/a*e.distance;return[y*Rt,f*Rt,p*Rt]});return()=>$i(Q,{polygons:n.value,position:o.value})}});import{ref as fo,watch as Wi,onUnmounted as Zi,computed as ot}from"vue";import{createPolyAnimationMixer as Ki}from"@layoutit/polycss-core";function fe(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function Gi(e,t,n){let o=fo(null),r=null,i=null,s=null,d=fo(0);function a(){return n==null?o.value:fe(n)??o.value}function c(){i!==null&&(cancelAnimationFrame(i),i=null),s=null}function l(){c(),r&&(r.stopAllAction(),r.uncacheRoot(),r=null,d.value++)}function m(){if(i!==null)return;function C(w){if(s===null){s=w,i=requestAnimationFrame(C);return}let g=(w-s)/1e3;s=w,r?.update(g),i=requestAnimationFrame(C)}i=requestAnimationFrame(C)}function f(){l();let C=fe(e),w=fe(t);if(!C||C.length===0||!w)return;let g=a();g&&(r=Ki(g,w),d.value++,m())}let y=Wi(()=>{let C=fe(e),w=fe(t),g=n!=null?fe(n):o.value;return{c:C,ctrl:w,r:g}},()=>f(),{immediate:!0,deep:!1});Zi(()=>{y(),l()});let p=ot(()=>fe(e)??[]),b=ot(()=>p.value.map(C=>C.name)),P=ot(()=>(d.value,r)),E=ot(()=>{d.value;let C=p.value,w={};for(let g of C)Object.defineProperty(w,g.name,{enumerable:!0,get(){if(!r)return null;try{return r.clipAction(g.name)}catch{return null}}});return w});return{ref:o,mixer:P,clips:p,names:b,actions:E}}import{CAMERA_BACKFACE_CULL_EPS as Rc,VOXEL_CAMERA_CULL_AXIS_EPS as Oc,VOXEL_CAMERA_CULL_NORMAL_LIMIT as Dc,normalizePolygons as kc,mergePolygons as _c,coverPlanarPolygons as Hc,optimizeMeshPolygons as Ic,cullInteriorPolygons as Vc,cameraCullNormalGroups as Fc,cameraCullNormalGroupsFromPolygons as zc,cameraCullNormalKey as Nc,cameraCullVisibleSignature as jc,cameraFacingDepth as Yc,isAxisAlignedSurfaceNormal as Uc,isVoxelCameraCullableNormalGroups as Xc,normalFacesCamera as $c,polygonCssSurfaceNormal as Bc,polygonFacesCamera as Wc,parseObj as Zc,parseMtl as Kc,parseGltf as Gc,bakeSolidTextureSamples as qc,bakeSolidTextureSampledPolygons as Qc,loadMesh as Jc,createIsometricCamera as eu,parseVox as tu,polygonFaces as nu,computeTexturePaintMetrics as ou,computeShapeLighting as ru,parseColor as au,parsePureColor as iu,parseHexColor as su,parseRgbColor as lu,formatColor as cu,clampChannel as uu,shadeColor as du,rotateVec3 as mu,inverseRotateVec3 as fu,axesHelperPolygons as yu,boxPolygons as pu,arrowPolygons as gu,ringPolygons as hu,octahedronPolygons as vu,buildSceneContext as Pu,computeSceneBbox as bu,BASE_TILE as xu,DEFAULT_CAMERA_STATE as Cu,DEFAULT_PROJECTION as Eu,normalizeInvertMultiplier as Mu,createPolyAnimationMixer as Au,LoopOnce as Su,LoopRepeat as Tu,LoopPingPong as wu}from"@layoutit/polycss-core";export{xu as BASE_TILE,Rc as CAMERA_BACKFACE_CULL_EPS,Cu as DEFAULT_CAMERA_STATE,Eu as DEFAULT_PROJECTION,Su as LoopOnce,wu as LoopPingPong,Tu as LoopRepeat,En as Poly,uo as PolyAxesHelper,Le as PolyCamera,K as PolyCameraContextKey,mo as PolyDirectionalLightHelper,io as PolyFirstPersonControls,bn as PolyGround,jn as PolyMapControls,Q as PolyMesh,Dn as PolyOrbitControls,Ht as PolyOrthographicCamera,Le as PolyPerspectiveCamera,fn as PolyScene,so as PolySelect,Ie as PolySelectionContextKey,Jn as PolyTransformControls,Oc as VOXEL_CAMERA_CULL_AXIS_EPS,Dc as VOXEL_CAMERA_CULL_NORMAL_LIMIT,gu as arrowPolygons,yu as axesHelperPolygons,Qc as bakeSolidTextureSampledPolygons,qc as bakeSolidTextureSamples,pu as boxPolygons,Pu as buildSceneContext,Fc as cameraCullNormalGroups,zc as cameraCullNormalGroupsFromPolygons,Nc as cameraCullNormalKey,jc as cameraCullVisibleSignature,Yc as cameraFacingDepth,uu as clampChannel,bu as computeSceneBbox,ru as computeShapeLighting,ou as computeTexturePaintMetrics,Hc as coverPlanarPolygons,eu as createIsometricCamera,Au as createPolyAnimationMixer,Vc as cullInteriorPolygons,vt as findMeshUnderPoint,Ee as findPolyMeshHandle,cu as formatColor,ze as injectPolyBaseStyles,fu as inverseRotateVec3,Uc as isAxisAlignedSurfaceNormal,Xc as isVoxelCameraCullableNormalGroups,Jc as loadMesh,_c as mergePolygons,$c as normalFacesCamera,Mu as normalizeInvertMultiplier,kc as normalizePolygons,vu as octahedronPolygons,Ic as optimizeMeshPolygons,au as parseColor,Gc as parseGltf,su as parseHexColor,Kc as parseMtl,Zc as parseObj,iu as parsePureColor,lu as parseRgbColor,tu as parseVox,Me as pointInMeshElement,Bc as polygonCssSurfaceNormal,nu as polygonFaces,Wc as polygonFacesCamera,hu as ringPolygons,mu as rotateVec3,du as shadeColor,Gi as usePolyAnimation,ye as usePolyCamera,Ca as usePolyMaterial,Ge as usePolyMesh,Fe as usePolySceneContext,lo as usePolySelect,co as usePolySelectionApi};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layoutit/polycss-vue",
3
- "version": "0.0.1",
3
+ "version": "0.2.0",
4
4
  "description": "Native Vue 3 components for CSS polygon mesh rendering with 60fps imperative updates.",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -42,7 +42,7 @@
42
42
  "access": "public"
43
43
  },
44
44
  "dependencies": {
45
- "@layoutit/polycss-core": "^0.0.1"
45
+ "@layoutit/polycss-core": "^0.2.0"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "vue": "^3.0.0"