@layoutit/polycss-vue 0.0.1 → 0.2.1

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 Qr,h as Jr,provide as ea,computed as ta}from"vue";import{ref as Nt,shallowRef as qr,watch as Gr}from"vue";import{createIsometricCamera as Zr,BASE_TILE as Kr}from"@layoutit/polycss-core";function Ht(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 Ne(e){let t=Zr({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),n=qr(t),o=Nt(null),r=Nt(null),i=Nt([0,0,0]),a=Ht(t.state);Gr(()=>({zoom:e.value.zoom,target:e.value.target,rotX:e.value.rotX,rotY:e.value.rotY,distance:e.value.distance}),(l,c)=>{let m={};l.zoom!==void 0&&l.zoom!==c?.zoom&&(m.zoom=l.zoom),l.target!==void 0&&l.target!==c?.target&&(m.target=l.target),l.rotX!==void 0&&l.rotX!==c?.rotX&&(m.rotX=l.rotX),l.rotY!==void 0&&l.rotY!==c?.rotY&&(m.rotY=l.rotY),l.distance!==void 0&&l.distance!==c?.distance&&(m.distance=l.distance),Object.keys(m).length>0&&(t.update(m),u(),a.updateCameraFromRef(t),a.notifyAll())});function u(){let l=o.value;if(!l)return;let c=t.state,m=Kr,f=i.value,d=c.target[0]+f[0],h=c.target[1]+f[1],p=c.target[2]+f[2],P=h*m,x=d*m,T=p*m,A=c.distance!==0?`translateZ(${-c.distance}px) `:"";l.style.transform=`${A}scale(${c.zoom}) rotateX(${c.rotX}deg) rotate(${c.rotY}deg) translate3d(${-P}px, ${-x}px, ${-T}px)`}return{store:a,cameraRef:n,sceneElRef:o,cameraElRef:r,autoCenterOffset:i,applyTransformDirect:u}}var ee=Symbol("polycss-camera");var tt=Qr({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=ta(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:r,sceneElRef:i,cameraElRef:a,autoCenterOffset:u,applyTransformDirect:l}=Ne(n);return ea(ee,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:a,autoCenterOffset:u,applyTransformDirect:l}),()=>Jr("div",{ref:a,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:"none"}},t.default?.())}});import{defineComponent as na,h as oa,provide as ra,computed as aa}from"vue";var ia=8e3,Ln=na({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=aa(()=>({zoom:e.zoom,target:e.target,rotX:e.rotX,rotY:e.rotY,distance:e.distance})),{store:o,cameraRef:r,sceneElRef:i,cameraElRef:a,autoCenterOffset:u,applyTransformDirect:l}=Ne(n);return ra(ee,{store:o,cameraRef:r,sceneElRef:i,cameraElRef:a,autoCenterOffset:u,applyTransformDirect:l}),()=>{let c=`${typeof e.perspective=="number"?e.perspective:ia}px`;return oa("div",{ref:a,class:`polycss-camera${e.class?` ${e.class}`:""}`,style:{perspective:c}},t.default?.())}}});import{defineComponent as li,h as si,inject as ui,provide as ci,computed as xe,ref as on,watch as co,watchEffect as mo,onMounted as fo,onUpdated as di,onBeforeUnmount as mi}from"vue";import{DEFAULT_SEAM_BLEED as po,parseHexColor as yo}from"@layoutit/polycss-core";import{computed as la}from"vue";import{buildSceneContext as sa,mergePolygons as ua}from"@layoutit/polycss-core";function dt(e,t){return la(()=>{let{directionalLight:n}=t.value,o=sa({polygons:e.value});return{polygons:ua(o.context.polygons),sceneBbox:o.context.sceneBbox}})}var wn="polycss-styles";function mt(e=typeof document<"u"?document:null){if(!e||e.getElementById(wn))return;let t=e.createElement("style");t.id=wn,t.textContent=ca,e.head.appendChild(t)}var ca=`
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,13 @@ 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);
19
+ /* Promote the scene to its own GPU compositing layer. Without this the
20
+ browser re-rasterizes every descendant leaf when the scene transform
21
+ updates each animation frame, causing visible flicker on solid-shape
22
+ meshes (triangles, quads) that have no opacity:0 loading phase to
23
+ hide the re-paint. Matches the same declaration in the vanilla
24
+ polycss stylesheet. */
25
+ will-change: transform;
25
26
  }
26
27
 
27
28
  /* \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 +45,22 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
44
45
  position: absolute;
45
46
  }
46
47
 
48
+ /* \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 */
49
+
50
+ /* PolyFirstPersonControls toggles this class on its host element (the camera
51
+ wrapper). FPV needs a real perspective context so scene Z translation
52
+ produces visible depth motion - without it, walking forward looks like a
53
+ planar pan. The class wins over inline perspective styles (e.g.
54
+ PolyOrthographicCamera's perspective: none) via !important. The actual
55
+ perspective value is set inline by the controls as the
56
+ --polycss-fpv-perspective custom property; the default of 2000px matches
57
+ the controls' lookOffset fallback so the FPV math and visual perspective
58
+ stay in sync. */
59
+ .polycss-fpv-host {
60
+ perspective: var(--polycss-fpv-perspective, 2000px) !important;
61
+ transform-style: preserve-3d !important;
62
+ }
63
+
47
64
  /* \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
65
 
49
66
  /*
@@ -71,24 +88,77 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
71
88
  background-repeat: no-repeat;
72
89
  }
73
90
 
91
+ .polycss-scene b,
92
+ .polycss-scene i,
93
+ .polycss-scene u {
94
+ color: var(--polycss-paint, currentColor);
95
+ }
96
+
74
97
  .polycss-scene b {
98
+ background: currentColor;
99
+ width: 64px;
100
+ height: 64px;
101
+ }
102
+
103
+ .polycss-mesh.polycss-voxel-mesh > .polycss-voxel-face {
104
+ position: absolute;
105
+ display: block;
106
+ top: 0;
107
+ left: 0;
108
+ width: 0;
109
+ height: 0;
110
+ transform-style: preserve-3d;
111
+ transform-origin: 0 0;
112
+ margin: 0;
113
+ padding: 0;
114
+ font: inherit;
115
+ line-height: 0;
116
+ pointer-events: none;
117
+ }
118
+
119
+ .polycss-mesh.polycss-voxel-mesh > .polycss-voxel-face > b {
120
+ top: 0;
121
+ left: 0;
122
+ width: var(--polycss-voxel-primitive, 1px);
123
+ height: var(--polycss-voxel-primitive, 1px);
124
+ backface-visibility: visible;
125
+ pointer-events: none;
75
126
  }
76
127
 
77
128
  .polycss-scene i {
78
- border-style: solid;
79
- border-width: 1px;
129
+ width: 16px;
130
+ height: 16px;
80
131
  border-color: currentColor;
81
132
  }
82
133
 
83
134
  .polycss-scene s {
135
+ width: var(--polycss-atlas-size, 64px);
136
+ height: var(--polycss-atlas-size, 64px);
84
137
  }
85
138
 
86
139
  .polycss-scene u {
87
- width: 0px;
88
- height: 0px;
140
+ width: 0;
141
+ height: 0;
89
142
  background: transparent;
90
143
  box-sizing: content-box;
91
144
  border: 0 solid transparent;
145
+ border-color: transparent transparent currentColor transparent;
146
+ border-width: 0 16px 32px 16px;
147
+ }
148
+
149
+ .polycss-scene u.polycss-large-border-triangle {
150
+ border-width: 0 48px 96px 48px;
151
+ }
152
+
153
+ .polycss-scene u.polycss-corner-triangle {
154
+ width: 32px;
155
+ height: 32px;
156
+ background: currentColor;
157
+ border: 0;
158
+ border-top-left-radius: 50% 100%;
159
+ border-top-right-radius: 50% 100%;
160
+ corner-top-left-shape: bevel;
161
+ corner-top-right-shape: bevel;
92
162
  }
93
163
 
94
164
  /* \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 +178,21 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
108
178
  @property --plx { syntax: "<number>"; inherits: true; initial-value: 0; }
109
179
  @property --ply { syntax: "<number>"; inherits: true; initial-value: 0; }
110
180
  @property --plz { syntax: "<number>"; inherits: true; initial-value: 1; }
181
+
182
+ /* CSS-space light components (world-Y\u2192cssX, world-X\u2192cssY, world-Z\u2192cssZ).
183
+ Used by the shadow projection matrix. --clz is clamped away from 0 in JS
184
+ to avoid divide-by-zero when the light is near-horizontal. */
185
+ @property --clx { syntax: "<number>"; inherits: true; initial-value: 0.01; }
186
+ @property --cly { syntax: "<number>"; inherits: true; initial-value: 0; }
187
+ @property --clz { syntax: "<number>"; inherits: true; initial-value: 1; }
188
+
189
+ /* Ground-plane position in CSS pixels along the CSS-Z axis (= world-Z, the
190
+ up axis in PolyCSS's world convention). Stored as a <number> so it can be
191
+ used directly inside matrix3d() calc() expressions (matrix3d requires
192
+ dimensionless entries \u2014 no px units).
193
+ Set from the min world-Z of casting meshes. */
194
+ @property --shadow-ground-cssz { syntax: "<number>"; inherits: true; initial-value: 0; }
195
+
111
196
  @property --plr { syntax: "<number>"; inherits: true; initial-value: 1; }
112
197
  @property --plg { syntax: "<number>"; inherits: true; initial-value: 1; }
113
198
  @property --plb { syntax: "<number>"; inherits: true; initial-value: 1; }
@@ -117,14 +202,14 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
117
202
  @property --pab { syntax: "<number>"; inherits: true; initial-value: 1; }
118
203
  @property --pai { syntax: "<number>"; inherits: true; initial-value: 0.4; }
119
204
 
120
- /* Per-polygon surface normal \u2014 set inline by the renderer. inherits:false
121
- because each leaf has its own normal (no cascade). */
205
+ /* Per-polygon surface normal \u2014 set inline by the renderer. Base RGB channels
206
+ may be hoisted to a mesh wrapper, so they inherit unless overridden inline. */
122
207
  @property --pnx { syntax: "<number>"; inherits: false; initial-value: 0; }
123
208
  @property --pny { syntax: "<number>"; inherits: false; initial-value: 0; }
124
209
  @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; }
210
+ @property --psr { syntax: "<number>"; inherits: true; initial-value: 1; }
211
+ @property --psg { syntax: "<number>"; inherits: true; initial-value: 1; }
212
+ @property --psb { syntax: "<number>"; inherits: true; initial-value: 1; }
128
213
 
129
214
  /* Calc-driven Lambert + tint, scoped to dynamic-lighting scenes. Lives
130
215
  here (not inline per polygon) so each leaf only carries its tiny normal
@@ -148,10 +233,24 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
148
233
  var(--pnz) * var(--plz))))
149
234
  );
150
235
  background-blend-mode: multiply;
236
+ background-image: var(--polycss-atlas-url);
237
+ background-position: var(--polycss-atlas-position);
238
+ background-repeat: no-repeat;
239
+ background-size: var(--polycss-atlas-image-size);
240
+ mask-image: var(--polycss-atlas-url);
241
+ mask-mode: alpha;
242
+ mask-position: var(--polycss-atlas-position);
243
+ mask-repeat: no-repeat;
244
+ mask-size: var(--polycss-atlas-image-size);
245
+ -webkit-mask-image: var(--polycss-atlas-url);
246
+ -webkit-mask-position: var(--polycss-atlas-position);
247
+ -webkit-mask-repeat: no-repeat;
248
+ -webkit-mask-size: var(--polycss-atlas-image-size);
151
249
  }
152
250
 
251
+ .polycss-scene[data-polycss-lighting="dynamic"] b,
153
252
  .polycss-scene[data-polycss-lighting="dynamic"] u {
154
- border-bottom-color: rgb(
253
+ color: rgb(
155
254
  calc(255 * var(--psr) * (var(--par) * var(--pai)
156
255
  + var(--plr) * var(--pli) * max(0,
157
256
  var(--pnx) * var(--plx) +
@@ -169,4 +268,95 @@ import{defineComponent as hn,h as Pn,provide as vn,computed as xn}from"vue";impo
169
268
  var(--pnz) * var(--plz))))
170
269
  );
171
270
  }
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};
271
+
272
+ /* \u2500\u2500 Cast shadow projection (dynamic-mode CSS path) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
273
+
274
+ /* <q> \u2014 dedicated shadow leaf. Same border-shape rendering trick as <i>
275
+ (border-color: currentColor fills the polygon outline) but with its
276
+ own tag so we don't have to thread :not(.polycss-shadow) exclusions
277
+ through every dynamic-mode color rule. backface-visibility must be
278
+ visible because the projection matrix is near-rank-deficient and the
279
+ resulting plane's normal can read as back-facing under some camera
280
+ angles; the leaf is intentionally always painted. Strip the UA's
281
+ default ::before/::after open-/close-quote so the element is just a
282
+ styled box. */
283
+ .polycss-scene q {
284
+ position: absolute;
285
+ display: block;
286
+ transform-origin: 0 0;
287
+ transform-style: preserve-3d;
288
+ margin: 0;
289
+ padding: 0;
290
+ font: inherit;
291
+ font-weight: normal;
292
+ font-style: normal;
293
+ line-height: 0;
294
+ quotes: none;
295
+ text-decoration: none;
296
+ backface-visibility: visible;
297
+ border-color: currentColor;
298
+ pointer-events: none;
299
+ }
300
+ .polycss-scene q::before,
301
+ .polycss-scene q::after {
302
+ content: none;
303
+ }
304
+
305
+ /*
306
+ * Rotate rings: one square quad per ring, masked to a donut. The mask uses
307
+ * --ring-inner-ratio (set inline by PolyTransformControls); hit-testing
308
+ * matches the donut shape so the inner hole isn't clickable.
309
+ */
310
+ .polycss-transform-ring i,
311
+ .polycss-transform-ring b,
312
+ .polycss-transform-ring s,
313
+ .polycss-transform-ring u {
314
+ --ring-inner-r: calc(var(--ring-inner-ratio, 0.92) * 50%);
315
+ --ring-outer-r: calc(var(--ring-outer-ratio, 1) * 50%);
316
+ -webkit-mask: radial-gradient(circle at 50% 50%,
317
+ transparent 0%,
318
+ transparent var(--ring-inner-r),
319
+ black var(--ring-inner-r),
320
+ black var(--ring-outer-r),
321
+ transparent var(--ring-outer-r));
322
+ mask: radial-gradient(circle at 50% 50%,
323
+ transparent 0%,
324
+ transparent var(--ring-inner-r),
325
+ black var(--ring-inner-r),
326
+ black var(--ring-outer-r),
327
+ transparent var(--ring-outer-r));
328
+ }
329
+
330
+ /* Shadow projection matrix. Projects any 3D point P onto the horizontal
331
+ ground plane (cssZ \u2248 G) along the CSS-space light direction (--clx/y/z).
332
+
333
+ The strict projection would set m22=0 (output.z is a constant G, flat).
334
+ Chromium SKIPS rendering elements whose composed transform is singular.
335
+ m22=0 makes it singular, so the shadow paints nothing. Fix: collapse along
336
+ z by a near-zero scale (Z_SQUASH = 0.01) \u2014 output.z \u2248 G with ~1% drift,
337
+ full-rank and renderable. Sub-pixel drift for any realistic scene size. */
338
+ .polycss-scene[data-polycss-lighting="dynamic"] {
339
+ --shadow-proj: matrix3d(
340
+ 1, 0, 0, 0,
341
+ 0, 1, 0, 0,
342
+ calc(-1 * var(--clx) / var(--clz)),
343
+ calc(-1 * var(--cly) / var(--clz)),
344
+ 0.01,
345
+ 0,
346
+ calc(var(--shadow-ground-cssz) * var(--clx) / var(--clz)),
347
+ calc(var(--shadow-ground-cssz) * var(--cly) / var(--clz)),
348
+ calc(var(--shadow-ground-cssz) * 0.99),
349
+ 1
350
+ );
351
+ }
352
+
353
+ /* <q> shadow leaf \u2014 Lambert-gated opacity. Polygons facing the light cast
354
+ full shadow; polygons facing away cast zero shadow. The * 10 multiplier
355
+ sharpens the cutoff so small positive Lambert values jump quickly to 1,
356
+ giving a near-binary visibility decision with a smooth edge transition.
357
+ Scoped to dynamic mode: baked-mode shadow leaves are dropped up-front
358
+ by isBakedShadowCaster() and don't carry --pnx/--pny/--pnz. */
359
+ .polycss-scene[data-polycss-lighting="dynamic"] q {
360
+ opacity: clamp(0, calc((var(--pnx) * var(--clx) + var(--pny) * var(--cly) + var(--pnz) * var(--clz)) * 10), 1);
361
+ }
362
+ `;import{parsePureColor as ku}from"@layoutit/polycss-core";import{inject as da}from"vue";var Yt=Symbol("polycss/scene-context");function Rn(){return da(Yt,null)}import{isSolidTrianglePlan as Xe,isProjectiveQuadPlan as je,buildTextureEdgeRepairSets as vt,buildSeamBleedPolygonEdges as St,buildSeamBleedPolygonSet as Ac,cssBorderShapeForPlan as Lc}from"@layoutit/polycss-core";import{getSolidPaintDefaultsForPlansCore as ma,safariCssProjectiveUnsupported as Dn,parseHex as fa,rgbKey as pa}from"@layoutit/polycss-core";function Xt(e){if(!!!(e.defaultView?.CSS??(typeof CSS<"u"?CSS:void 0))?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let r=(e.defaultView??(typeof window<"u"?window:void 0))?.matchMedia;return r?r("(pointer: fine)").matches&&r("(hover: hover)").matches:!0}function jt(e){let n=(e.defaultView??(typeof window<"u"?window:void 0))?.navigator?.userAgent??"";return n?!Dn(n):!0}function On(e){let t=e.defaultView?.CSS??(typeof CSS<"u"?CSS:void 0);return!!t?.supports?.("corner-top-left-shape","bevel")&&!!t.supports("corner-top-right-shape","bevel")&&!!t.supports("corner-bottom-right-shape","bevel")&&!!t.supports("corner-bottom-left-shape","bevel")}function kn(e){let n=(e.defaultView??(typeof window<"u"?window:void 0))?.navigator?.userAgent??"";return n?!Dn(n):!0}function In(e,t,n,o,r){let i=new Set(o?.disable??[]);return ma(e,t,i,{solidTriangleSupported:jt(n),projectiveQuadSupported:kn(n),cornerShapeSupported:On(n),borderShapeSupported:Xt(n)},fa,pa,r)}function $t(e,t,n=new Set,o){let r=o??(typeof document<"u"?document:null);if(!r)return{};let i=n.size>0?{disable:Array.from(n)}:void 0;return In(e,t,r,i)}function we(e){let t=e??(typeof document<"u"?document:null);if(!t){if(!!!(typeof CSS<"u"?CSS:void 0)?.supports?.("border-shape","polygon(0 0, 100% 0, 0 100%) circle(0)"))return!1;let r=typeof matchMedia<"u"?matchMedia:void 0;return r?r("(pointer: fine)").matches&&r("(hover: hover)").matches:!0}return Xt(t)}function Re(e){let t=e??(typeof document<"u"?document:null);if(!t){let n=(typeof navigator<"u"?navigator:globalThis.navigator)?.userAgent??"";if(!n)return!0;let o=/\b(?:Chrome|HeadlessChrome|Chromium|Edg|OPR)\//.test(n);return!/\bVersion\/[\d.]+.*\bSafari\//.test(n)||o}return jt(t)}import{filterAtlasPlans as ya}from"@layoutit/polycss-core";function Ut(e,t,n,o){return ya(e,t,n,{solidTriangleSupported:Re(o),borderShapeSupported:we(o)})}import{packTextureAtlasPlansWithScaleCore as ga}from"@layoutit/polycss-core";function Fn(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 Wt(e,t,n){return ga(e,t,Fn(n))}import{expandClipPoints as ha,tintToCss as Pa,TEXTURE_TRIANGLE_BLEED as xa,TEXTURE_EDGE_REPAIR_ALPHA_MIN as ba,TEXTURE_EDGE_REPAIR_SOURCE_ALPHA_MIN as va,TEXTURE_EDGE_REPAIR_RADIUS as Vn}from"@layoutit/polycss-core";var De=new Map;function Nn(e){let t=De.get(e);return t||(t=new Promise((n,o)=>{let r=new Image;r.decoding="async",r.crossOrigin="anonymous",r.onload=()=>n(r),r.onerror=()=>o(new Error(`texture load failed: ${e}`)),r.src=e}),De.set(e,t),t.then(()=>{De.get(e)===t&&De.delete(e)},()=>{De.get(e)===t&&De.delete(e)})),t}function ae(e,t,n=1,o=0,r=0,i=1,a=0,u=0){e.setTransform(n*t,o*t,r*t,i*t,a*t,u*t)}function Yn(e,t,n,o,r,i,a){Math.abs(i.r-1)<.001&&Math.abs(i.g-1)<.001&&Math.abs(i.b-1)<.001||(e.save(),ae(e,a),e.globalCompositeOperation="multiply",e.fillStyle=Pa(i),e.fillRect(t,n,o,r),e.restore())}function Xn(e,t,n,o,r,i,a){let u=t.naturalWidth||t.width||1,l=t.naturalHeight||t.height||1,c=Math.max(r/u,i/l),m=u*c,f=l*c;ae(e,a),e.drawImage(t,n+(r-m)/2,o+(i-f)/2,m,f)}function Ye(e,t){return Math.max(0,Math.min(t,e))}function qt(e,t,n,o,r,i,a,u){let l=t.naturalWidth||t.width||1,c=t.naturalHeight||t.height||1,m=Ye(Math.min(n.minU,n.maxU)*l,l),f=Ye(Math.max(n.minU,n.maxU)*l,l),d=Ye(Math.min(n.minV,n.maxV)*c,c),h=Ye(Math.max(n.minV,n.maxV)*c,c),p=Math.floor(m),P=Math.floor(d),x=Math.ceil(f)-p,T=Math.ceil(h)-P;x<1&&(p=Math.floor(Ye((n.minU+n.maxU)/2*l,l-1)),x=1),T<1&&(P=Math.floor(Ye((n.minV+n.maxV)/2*c,c-1)),T=1),p=Math.max(0,Math.min(l-1,p)),P=Math.max(0,Math.min(c-1,P)),x=Math.max(1,Math.min(l-p,x)),T=Math.max(1,Math.min(c-P,T)),ae(e,u),e.drawImage(t,p,P,x,T,o,r,i,a)}function jn(e){return e==="repeat"||e==="mirrored-repeat"}function _n(e,t){return jn(e)?Math.floor(t):0}function Bn(e,t){return jn(e)?Math.ceil(t)-1:0}function zn(e,t){return e==="mirrored-repeat"&&Math.abs(t%2)===1}function Hn(e,t,n,o,r,i,a){let u=r?_n(i,r.minU):0,l=r?Bn(i,r.maxU):0,c=r?_n(a,r.minV):0,m=r?Bn(a,r.maxV):0;for(let f=u;f<=l;f++)for(let d=c;d<=m;d++){let h=zn(i,f),p=zn(a,d);if(!h&&!p){e.drawImage(t,f*n,d*o);continue}e.save(),e.translate((h?f+1:f)*n,(p?d+1:d)*o),e.scale(h?-1:1,p?-1:1),e.drawImage(t,0,0),e.restore()}}function pt(e,t,n,o){for(let r=0;r<o.length;r+=2){let i=t+o[r],a=n+o[r+1];r===0?e.moveTo(i,a):e.lineTo(i,a)}e.closePath()}function nt(e,t,n,o,r,i){for(let a=0;a<o.length;a+=2){let u=t+o[a]+r,l=n+o[a+1]+i;a===0?e.moveTo(u,l):e.lineTo(u,l)}e.closePath()}function $n(e,t,n,o){ae(e,o),e.beginPath(),pt(e,t.x,t.y,t.screenPts),e.clip(),ae(e,o),e.fillStyle=n==="dynamic"?t.polygon.color??"#cccccc":t.shadedColor,e.fillRect(t.x,t.y,t.canvasW,t.canvasH)}function ft(e,t,n,o,r){t.polygon.textureAlphaMode==="opaque"&&(ae(e,n),e.fillStyle=t.polygon.color??"#cccccc",e.fillRect(t.x+o,t.y+r,t.canvasW,t.canvasH))}function Un(e,t,n,o,r=0,i=0){if(t.textureTriangles?.length){let a=n.naturalWidth||n.width||1,u=n.naturalHeight||n.height||1;for(let l of t.textureTriangles){let c=ha(l.screenPts,xa);e.save(),ae(e,o),e.beginPath(),nt(e,t.x,t.y,c,r,i),e.clip(),ft(e,t,o,r,i),l.uvAffine?(ae(e,o,l.uvAffine.a/a,l.uvAffine.c/a,l.uvAffine.b/u,l.uvAffine.d/u,t.x+l.uvAffine.e+r,t.y+l.uvAffine.f+i),Hn(e,n,a,u,l.uvSampleRect,t.polygon.textureWrap?.s,t.polygon.textureWrap?.t)):l.uvSampleRect&&qt(e,n,l.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o),e.restore()}}else if(t.uvAffine){let a=n.naturalWidth||n.width||1,u=n.naturalHeight||n.height||1,l=t.polygon.textureAlphaMode==="opaque";l&&(e.save(),ae(e,o),e.beginPath(),nt(e,t.x,t.y,t.screenPts,r,i),e.clip(),ft(e,t,o,r,i)),ae(e,o,t.uvAffine.a/a,t.uvAffine.c/a,t.uvAffine.b/u,t.uvAffine.d/u,t.x+t.uvAffine.e+r,t.y+t.uvAffine.f+i),Hn(e,n,a,u,t.uvSampleRect,t.polygon.textureWrap?.s,t.polygon.textureWrap?.t),l&&e.restore()}else if(t.uvSampleRect){let a=t.polygon.textureAlphaMode==="opaque";a&&(e.save(),ae(e,o),e.beginPath(),nt(e,t.x,t.y,t.screenPts,r,i),e.clip(),ft(e,t,o,r,i)),qt(e,n,t.uvSampleRect,t.x+r,t.y+i,t.canvasW,t.canvasH,o),a&&e.restore()}else{let a=t.polygon.textureAlphaMode==="opaque";a&&(e.save(),ae(e,o),e.beginPath(),nt(e,t.x,t.y,t.screenPts,r,i),e.clip(),ft(e,t,o,r,i)),Xn(e,n,t.x+r,t.y+i,t.canvasW,t.canvasH,o),a&&e.restore()}}function Sa(e,t,n,o,r,i){let a=r-n,u=i-o,l=a*a+u*u;if(l<=1e-9)return Math.hypot(e-n,t-o);let c=Math.max(0,Math.min(1,((e-n)*a+(t-o)*u)/l));return Math.hypot(e-(n+a*c),t-(o+u*c))}function Ca(e,t,n,o){let r=1/0,i=n.length/2;for(let a of o){if(a<0||a>=i)continue;let u=a*2,l=(a+1)%i*2;r=Math.min(r,Sa(e,t,n[u],n[u+1],n[l],n[l+1]))}return r}function Ea(e,t,n,o,r,i){let a=Math.max(0,o-i),u=Math.min(t-1,o+i),l=Math.max(0,r-i),c=Math.min(n-1,r+i),m=null,f=1/0;for(let d=l;d<=c;d++)for(let h=a;h<=u;h++){if(h===o&&d===r)continue;let p=h-o,P=d-r,x=p*p+P*P;if(x>i*i||x>=f)continue;let T=(d*t+h)*4;e[T+3]<va||(m=T,f=x)}return m}function Wn(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)),a=Math.max(1,Math.min(o.width-r,Math.ceil(t.canvasW*n))),u=Math.max(1,Math.min(o.height-i,Math.ceil(t.canvasH*n)));if(a<=0||u<=0)return;let l;try{l=e.getImageData(r,i,a,u)}catch{return}let c=l.data,m=new Uint8ClampedArray(c),f=Math.max(Vn,Vn/n),d=Math.max(2,Math.ceil(f*n)+1),h=!1;for(let p=0;p<u;p++)for(let P=0;P<a;P++){let x=(p*a+P)*4,T=c[x+3];if(T<ba||T===255)continue;let A=(r+P+.5)/n-t.x,L=(i+p+.5)/n-t.y;if(Ca(A,L,t.screenPts,t.textureEdgeRepairEdges)>f)continue;let y=Ea(m,a,u,P,p,d);y!==null&&(c[x]=m[y],c[x+1]=m[y+1],c[x+2]=m[y+2],c[x+3]=255,h=!0)}h&&e.putImageData(l,r,i)}function qn(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)}}async function Ma(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(m=>m.textureEdgeRepair&&m.texture&&m.textureEdgeRepairEdges&&m.textureEdgeRepairEdges.size>0),a=r.getContext("2d",i?{willReadFrequently:!0}:void 0);if(!a)return{width:e.width,height:e.height,url:null};let u=Array.from(new Set(e.entries.flatMap(m=>m.texture?[m.texture]:[]))),l=new Map;await Promise.all(u.map(async m=>{l.set(m,await Nn(m))}));for(let m of e.entries){let f=m.texture?l.get(m.texture):null;if(!m.texture){a.save(),$n(a,m,t,o),a.restore();continue}f&&(a.save(),ae(a,o),a.beginPath(),pt(a,m.x,m.y,m.screenPts),a.clip(),Un(a,m,f,o),a.restore()),m.texture&&t==="baked"&&(a.save(),ae(a,o),a.beginPath(),pt(a,m.x,m.y,m.screenPts),a.clip(),Yn(a,m.x,m.y,m.canvasW,m.canvasH,m.textureTint,o),a.restore()),Wn(a,m,o)}let c=await qn(r);return r.width=1,r.height=1,{width:e.width,height:e.height,url:c}}async function Gt(e,t,n,o,r){let i=[];for(let a of e){if(r())break;i.push(await Ma(a,t,n,o))}return i}import{isSolidTrianglePlan as Ta,offsetConvexPolygonPointsByEdgeAmounts as Aa,parsePureColor as Kt,resolveSeamBleed as Kn,safePlanSeamBleedAmount as La}from"@layoutit/polycss-core";var Qn=50,Jn=[.4,-.7,.59],eo="#ffffff",to=1,no="#ffffff",oo=.4,q=1e-9;var ot=.75,ro=32,ao=96,wa="0 48px 96px 48px",Gn,Zn=ro;function gt(){let e=typeof navigator<"u"?navigator.userAgent:"";return e!==Gn&&(Gn=e,Zn=/\bFirefox\//.test(e)?ao:ro),Zn}function Qt(){return gt()===ao?wa:void 0}function Ae(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 Jt({r:e,g:t,b:n}){return`${e},${t},${n}`}function Ra(e){return Kt(e)?.alpha??1}function ht({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 io(e,t,n,o,r){let i=Ae(e),a=Ae(n),u=Ae(o),l=u.r/255*r+a.r/255*t,c=u.g/255*r+a.g/255*t,m=u.b/255*r+a.b/255*t,f=Math.max(0,Math.min(255,Math.round(i.r*l))),d=Math.max(0,Math.min(255,Math.round(i.g*c))),h=Math.max(0,Math.min(255,Math.round(i.b*m))),p=Ra(e);return p<1?`rgba(${f}, ${d}, ${h}, ${p})`:ht({r:f,g:d,b:h})}function lo(e,t){if(!Number.isFinite(t)||t<=1)return e;let n=Kt(e);if(!n)return e;let o=255/Math.max(1,Math.round(t)-1),r=a=>Math.max(0,Math.min(255,Math.round(Math.round(a/o)*o))),i={r:r(n.rgb[0]),g:r(n.rgb[1]),b:r(n.rgb[2])};return n.alpha<1?`rgba(${i.r}, ${i.g}, ${i.b}, ${n.alpha})`:ht(i)}function so(e,t,n){let o=(r,i)=>{if(r===i)return r;let a=i-r;return r+Math.sign(a)*Math.min(Math.abs(a),n)};return{r:o(e.r,t.r),g:o(e.g,t.g),b:o(e.b,t.b)}}function Zt(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function Da(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 Oa(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],a=e[r+1],u=[i[0]-t[0],i[1]-t[1],i[2]-t[2]],l=[a[0]-t[0],a[1]-t[1],a[2]-t[2]];n[0]-=u[1]*l[2]-u[2]*l[1],n[1]-=u[2]*l[0]-u[0]*l[2],n[2]-=u[0]*l[1]-u[1]*l[0]}let o=Math.hypot(n[0],n[1],n[2]);return o<=q?null:[n[0]/o,n[1]/o,n[2]/o]}function ka(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],a=(r[0]-o[0])*(i[1]-r[1])-(r[1]-o[1])*(i[0]-r[0]);if(Math.abs(a)<=q)return!1;let u=Math.sign(a);if(t===0)t=u;else if(u!==t)return!1}return!0}function Ia(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 Fa(e,t,n,o){let r=t[0]-e[0],i=t[1]-e[1],a=o[0]-n[0],u=o[1]-n[1],l=r*u-i*a;if(Math.abs(l)<=q)return null;let c=n[0]-e[0],m=n[1]-e[1],f=(c*u-m*a)/l;return[e[0]+f*r,e[1]+f*i]}function yt(e,t){if(e.length<6||t<=0)return e;let n=0,o=0,r=e.length/2;for(let a=0;a<e.length;a+=2)n+=e[a],o+=e[a+1];n/=r,o/=r;let i=e.slice();for(let a=0;a<i.length;a+=2){let u=i[a]-n,l=i[a+1]-o,c=Math.hypot(u,l);c<=q||(i[a]+=u/c*t,i[a+1]+=l/c*t)}return i}function Oe(e,t){if(e.length<6||e.length%2!==0||t<=0)return e;let n=[];for(let l=0;l<e.length;l+=2)n.push([e[l],e[l+1]]);if(!ka(n))return yt(e,t);let o=Ia(n);if(Math.abs(o)<=q)return yt(e,t);let r=o>0?1:-1,i=[];for(let l=0;l<n.length;l++){let c=n[l],m=n[(l+1)%n.length],f=m[0]-c[0],d=m[1]-c[1],h=Math.hypot(f,d);if(h<=q)return yt(e,t);let p=r*(d/h)*t,P=r*(-f/h)*t;i.push({a:[c[0]+p,c[1]+P],b:[m[0]+p,m[1]+P]})}let a=[],u=Math.max(2,t*4);for(let l=0;l<n.length;l++){let c=i[(l+n.length-1)%n.length],m=i[l],f=Fa(c.a,c.b,m.a,m.b);if(!f)return yt(e,t);let d=n[l],h=f[0]-d[0],p=f[1]-d[1],P=Math.hypot(h,p);P>u?a.push(d[0]+h/P*u,d[1]+p/P*u):a.push(f[0],f[1])}return a}function Va(e,t,n,o){let r=e+t;if(o<=0||n<=q||r<=q||!Number.isFinite(e+t+n+o))return Oe([e,0,0,n,r,n],o);let i=Math.sqrt(e*e+n*n),a=Math.sqrt(t*t+n*n);if(i<=q||a<=q)return Oe([e,0,0,n,r,n],o);let u=-o*n/i,l=-o*e/i,c=o*n/a,m=-o*t/a,f=e+u,d=l,h=r+c,p=n+m,P=-n*r;if(Math.abs(P)<=q)return Oe([e,0,0,n,r,n],o);let x=f-h,T=d-p,A=(x*n+T*e)/P,L=h-A*t,y=p-A*n,w=-o*(e+i)/n,k=n+o,B=r+o*(t+a)/n,V=k,S=Math.max(2,o*4),O=L-e,F=y,H=Math.sqrt(O*O+F*F);H>S&&(L=e+O/H*S,y=F/H*S);let b=Math.sqrt(w*w+o*o);b>S&&(w=w/b*S,k=n+o/b*S);let s=B-r,g=Math.sqrt(s*s+o*o);return g>S&&(B=r+s/g*S,V=n+o/g*S),[L,y,w,k,B,V]}function _a(e,t){if((e+1)%3===t)return e;if((t+1)%3===e)return t}function Ba(e,t,n,o,r){let i=e.seamBleedEdges;if(!i?.size)return null;let a=e.seamBleed===void 0?ot:e.seamBleed;return[[o,t],[t,n],[n,o]].map(([l,c],m)=>{let f=_a(l,c),d=f!==void 0&&i.has(f)?e.seamBleedEdgeAmounts?.get(f)??Kn(a,ot):0;return La(r,m,d)})}function za(e,t,n){return e.map(o=>[o[1]*t,o[0]*t,o[2]*n])}function en(e,t,n,o){if(!Ta(e))return null;let r=e.tileSize,i=e.layerElevation,a=za(e.polygon.vertices,r,i),u=Oa(a);if(!u)return null;let l=[{a:0,b:1,c:2},{a:1,b:2,c:0},{a:2,b:0,c:1}].map(U=>{let K=a[U.a],X=a[U.b];return{...U,length:Math.hypot(X[0]-K[0],X[1]-K[1],X[2]-K[2])}}).sort((U,K)=>K.length-U.length),c=l[0].a,m=l[0].b,f=l[0].c,d=a[c],h=a[m],p=a[f],P=l[0].length;if(P<=q)return null;let x=[(h[0]-d[0])/P,(h[1]-d[1])/P,(h[2]-d[2])/P],T=[p[0]-d[0],p[1]-d[1],p[2]-d[2]],A=Zt(T,x),L=[d[0]+x[0]*A,d[1]+x[1]*A,d[2]+x[2]*A],y=[L[0]-p[0],L[1]-p[1],L[2]-p[2]],w=Math.hypot(y[0],y[1],y[2]);if(w<=q)return null;let k=[y[0]/w,y[1]/w,y[2]/w];if(Zt(Da(x,k),u)<0){let U=m;if(m=c,c=U,d=a[c],h=a[m],P=Math.hypot(h[0]-d[0],h[1]-d[1],h[2]-d[2]),P<=q)return null;x=[(h[0]-d[0])/P,(h[1]-d[1])/P,(h[2]-d[2])/P];let K=[p[0]-d[0],p[1]-d[1],p[2]-d[2]];A=Zt(K,x),L=[d[0]+x[0]*A,d[1]+x[1]*A,d[2]+x[2]*A],y=[L[0]-p[0],L[1]-p[1],L[2]-p[2]];let X=Math.hypot(y[0],y[1],y[2]);if(X<=q)return null;k=[y[0]/X,y[1]/X,y[2]/X]}let B=gt(),V=Math.max(0,Math.min(P,A)),S=Math.max(0,P-V),O=[V,0,0,w,V+S,w],F=Ba(e,c,m,f,O),H=F?Aa(O,F):Va(V,S,w,Kn(e.seamBleed,ot)),b=[H[0],H[1]],s=[H[2],H[3]],g=[H[4],H[5]],v=(s[1]+g[1])/2,M=b[0]-s[0],C=g[0]-b[0],z=v-b[1];if(M<=q||C<=q||z<=q||!Number.isFinite(M+C+z))return null;let N=t==="dynamic",D=Ae(e.polygon.color??"#cccccc"),E=N&&Jt(D)===o?.dynamicColorKey,_={color:N||e.shadedColor===o?.paintColor?void 0:e.shadedColor,pointerEvents:n==="none"?"none":void 0,...N&&!E?{"--pnx":u[0].toFixed(4),"--pny":u[1].toFixed(4),"--pnz":u[2].toFixed(4),"--psr":(D.r/255).toFixed(4),"--psg":(D.g/255).toFixed(4),"--psb":(D.b/255).toFixed(4)}:N?{"--pnx":u[0].toFixed(4),"--pny":u[1].toFixed(4),"--pnz":u[2].toFixed(4)}:null},I=([U,K])=>[p[0]+(U-V)*x[0]+K*k[0],p[1]+(U-V)*x[1]+K*k[1],p[2]+(U-V)*x[2]+K*k[2]],j=I(b),Y=I([s[0],v]),G=I([g[0],v]),$=B/2,W=[(G[0]-Y[0])/B,(G[1]-Y[1])/B,(G[2]-Y[2])/B],Z=[j[0]-W[0]*$,j[1]-W[1]*$,j[2]-W[2]*$],re=[(Y[0]-Z[0])/B,(Y[1]-Z[1])/B,(Y[2]-Z[2])/B];return{transform:`matrix3d(${[W[0],W[1],W[2],0,re[0],re[1],re[2],0,u[0],u[1],u[2],0,Z[0],Z[1],Z[2],1].map(U=>(Math.round(U*1e3)/1e3||0).toString()).join(",")})`,borderWidth:Qt(),..._}}function Pt(e){if(!e)return!1;let{a:t,b:n,c:o}=e;return t===0&&n===1&&o===2||t===1&&n===2&&o===0||t===2&&n===0&&o===1}function Ha(e,t,n,o){let r=e+t;if(o<=0||n<=q||r<=q||!Number.isFinite(e+t+n+o))return Oe([e,0,0,n,r,n],o);let i=Math.sqrt(e*e+n*n),a=Math.sqrt(t*t+n*n);if(i<=q||a<=q)return Oe([e,0,0,n,r,n],o);let u=-o*n/i,l=-o*e/i,c=o*n/a,m=-o*t/a,f=e+u,d=l,h=r+c,p=n+m,P=-n*r;if(Math.abs(P)<=q)return Oe([e,0,0,n,r,n],o);let x=f-h,T=d-p,A=(x*n+T*e)/P,L=h-A*t,y=p-A*n,w=-o*(e+i)/n,k=n+o,B=r+o*(t+a)/n,V=k,S=Math.max(2,o*4),O=L-e,F=y,H=Math.sqrt(O*O+F*F);H>S&&(L=e+O/H*S,y=F/H*S);let b=Math.sqrt(w*w+o*o);b>S&&(w=w/b*S,k=n+o/b*S);let s=B-r,g=Math.sqrt(s*s+o*o);return g>S&&(B=r+s/g*S,V=n+o/g*S),[L,y,w,k,B,V]}function Na(e,t,n,o,r,i,a,u,l,c,m,f){let d=Math.round(e*1e3)/1e3||0,h=Math.round(t*1e3)/1e3||0,p=Math.round(n*1e3)/1e3||0,P=Math.round(o*1e3)/1e3||0,x=Math.round(r*1e3)/1e3||0,T=Math.round(i*1e3)/1e3||0,A=Math.round(a*1e3)/1e3||0,L=Math.round(u*1e3)/1e3||0,y=Math.round(l*1e3)/1e3||0,w=Math.round(c*1e3)/1e3||0,k=Math.round(m*1e3)/1e3||0,B=Math.round(f*1e3)/1e3||0;return`matrix3d(${d},${h},${p},0,${P},${x},${T},0,${A},${L},${y},0,${w},${k},${B},1)`}function uo(e,t,n){if(e.texture||e.vertices.length!==3)return null;let o=Qn,r=o,i=e.vertices[0],a=e.vertices[1],u=e.vertices[2],l=i[1]*o,c=i[0]*o,m=i[2]*r,f=a[1]*o,d=a[0]*o,h=a[2]*r,p=u[1]*o,P=u[0]*o,x=u[2]*r,T=f-l,A=d-c,L=h-m,y=p-l,w=P-c,k=x-m,B=-(A*k-L*w),V=-(L*y-T*k),S=-(T*w-A*y),O=Math.sqrt(B*B+V*V+S*S);if(O<=q)return null;B/=O,V/=O,S/=O;let F=T*T+A*A+L*L,H=p-f,b=P-d,s=x-h,g=l-p,v=c-P,M=m-x,C=H*H+b*b+s*s,z=g*g+v*v+M*M,N=Pt(n)?n.a:0,D=Pt(n)?n.b:1,E=Pt(n)?n.c:2,_=()=>n?uo(e,t):null;if(!Pt(n)){let Le=F;C>Le&&(N=1,D=2,E=0,Le=C),z>Le&&(N=2,D=0,E=1)}let I=E===0?l:E===1?f:p,j=E===0?c:E===1?d:P,Y=E===0?m:E===1?h:x,G=N===0?l:N===1?f:p,$=N===0?c:N===1?d:P,W=N===0?m:N===1?h:x,Z=D===0?l:D===1?f:p,re=D===0?c:D===1?d:P,de=D===0?m:D===1?h:x,U=Z-G,K=re-$,X=de-W,R=Math.sqrt(U*U+K*K+X*X);if(R<=q)return _();let J=U/R,ie=K/R,le=X/R,ue=(I-G)*J+(j-$)*ie+(Y-W)*le,ge=G+J*ue-I,te=$+ie*ue-j,be=W+le*ue-Y,ve=Math.sqrt(ge*ge+te*te+be*be);if(ve<=q)return _();ge/=ve,te/=ve,be/=ve;let Je=Math.max(0,Math.min(R,ue)),Dt=Math.max(0,R-Je),ce=Ha(Je,Dt,ve,ot),Ee=ce[0],he=ce[1],Me=ce[2],Te=ce[3],ut=ce[4],et=ce[5],me=(Te+et)/2,se=Ee-Me,ct=ut-Ee,Ot=me-he;if(se<=q||ct<=q||Ot<=q||!Number.isFinite(se+ct+Ot))return _();let kt=1/gt(),En=se+ct,It=En*kt,Ft=(ct-se)*.5*kt,Vt=Ot*kt,_t=Ee-Je-En*.5,Bt=he,zr=Na(J*It,ie*It,le*It,J*Ft+ge*Vt,ie*Ft+te*Vt,le*Ft+be*Vt,B,V,S,I+J*_t+ge*Bt,j+ie*_t+te*Bt,Y+le*_t+be*Bt),Mn;if(Math.floor(t.colorFreezeFrames??1)!==0){let Le=t.directionalLight,Tn=t.ambientLight,Se=Le?.direction??Jn,Hr=Le?.color??eo,Nr=Math.max(0,Le?.intensity??to),Yr=Tn?.color??no,Xr=Math.max(0,Tn?.intensity??oo),zt=Math.sqrt(Se[0]*Se[0]+Se[1]*Se[1]+Se[2]*Se[2])||1,jr=Se[0]/zt,$r=Se[1]/zt,Ur=Se[2]/zt,Wr=Nr*Math.max(0,B*jr+V*$r+S*Ur),An=io(e.color??"#cccccc",Wr,Hr,Yr,Xr);Mn=t.colorSteps?lo(An,t.colorSteps):An}return{transform:zr,borderWidth:Qt(),color:Mn,basis:{a:N,b:D,c:E}}}function Ya(e,t,n){return n>0&&(n<=1||(t+e)%n===0)}function Xa(e,t,n,o){let r=Math.floor(o.colorFreezeFrames??1);if(r===0)return;let i=e.__polycssStableTriangleColor;if(!(i===void 0||Ya(t,Math.max(0,Math.floor(o.colorFrame??0)),Math.max(1,r)))||i===n)return;let u=n,l=n?Ae(n):void 0,c=e.__polycssStableTriangleColorRgb,m=Math.max(0,Math.floor(o.colorMaxStep??0));m>0&&c&&l&&n&&(l=so(c,l,m),u=ht(l)),e.style.color=u,e.__polycssStableTriangleColor=u,e.__polycssStableTriangleColorRgb=l}function tn(e,t,n={}){if((n.textureLighting??"baked")!=="baked"||!Re())return!1;let o=Array.from(e.children).filter(i=>i instanceof HTMLElement&&i.localName==="u");if(o.length!==t.length)return!1;let r=t.map((i,a)=>uo(i,n,o[a].__polycssStableTriangleBasis));if(r.some(i=>!i))return!1;for(let i=0;i<o.length;i+=1){let a=r[i],u=o[i];u.style.visibility&&(u.style.visibility=""),u.__polycssStableTriangleBasis=a.basis,u.style.transform=a.transform,a.borderWidth!==void 0&&(u.style.borderWidth=a.borderWidth),a.color!==void 0&&Xa(u,i,a.color,n)}return!0}import{computeTextureAtlasPlanPublic as ja}from"@layoutit/polycss-core";function ke(e,t,n={}){return ja(e,t,n)}function nn(e,t,n){let o=new Set(n?.disable??[]);return $t(e,t,o)}import{computed as Pe,getCurrentScope as $a,onScopeDispose as Ua,ref as Wa,watch as qa}from"vue";function xt(e){for(let t of e)t.startsWith("blob:")&&URL.revokeObjectURL(t)}function Ie(e,t,n=Pe(()=>{}),o=Pe(()=>{})){let r=Pe(()=>new Set(o.value?.disable??[])),i=Pe(()=>!r.value.has("b")),a=Pe(()=>i.value),u=Pe(()=>!r.value.has("u")&&Re()),l=Pe(()=>!r.value.has("i")&&t.value!=="dynamic"&&we()),c=Pe(()=>{let d=Ut(e.value,t.value,r.value,typeof document<"u"?document:null);return Wt(d,n.value,typeof document<"u"?document:null)}),m=Wa(c.value.packed.pages.map(d=>({width:d.width,height:d.height,url:null}))),f=[];return qa(()=>[c.value,t.value],([d,h],p,P)=>{let{packed:x,atlasScale:T}=d,A=!1;xt(f),f=[],m.value=x.pages.map(L=>({width:L.width,height:L.height,url:null})),P(()=>{A=!0,xt(f),f=[]}),!(x.pages.length===0||typeof document>"u")&&Gt(x.pages,h,document,T,()=>A).then(L=>{if(A){xt(L.flatMap(y=>y.url?.startsWith("blob:")?[y.url]:[]));return}f=L.flatMap(y=>y.url?.startsWith("blob:")?[y.url]:[]),m.value=L}).catch(()=>{A||(m.value=x.pages.map(L=>({width:L.width,height:L.height,url:null})))})},{immediate:!0}),$a()&&Ua(()=>{xt(f),f=[]}),{entries:Pe(()=>c.value.packed.entries),pages:m,ready:Pe(()=>m.value.length===0||m.value.every(d=>!!d.url)),useFullRectSolid:i,useProjectiveQuad:a,useStableTriangle:u,useBorderShape:l}}import{h as Ga}from"vue";function Fe({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:a="auto"}){let u=en(e,t,a,n);if(!u)return null;let l=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([m,f])=>[`data-${m}`,String(f)])):{},c=o?.trim()||void 0;return Ga("u",{class:c,style:{...u,...r},...l,...i})}import{h as Za}from"vue";import{isFullRectSolid as Ka,cssBorderShapeForPlan as Qa,formatSolidQuadEntryMatrix as Ja,formatBorderShapeEntryMatrix as ei}from"@layoutit/polycss-core";var ti=new Map([["transform",0],["border-shape",1],["border-width",2],["width",3],["height",4],["color",5]]);function ni(e){let t=e.getAttribute("style");if(!t)return;let o=t.split(";").map(r=>r.trim()).filter(Boolean).map((r,i)=>{let a=r.slice(0,r.indexOf(":")).trim().toLowerCase();return{declaration:r,index:i,order:ti.get(a)??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 Ve({entry:e,solidPaintDefaults:t,className:n,style:o,domAttrs:r,pointerEvents:i="auto",forceBorderShape:a=!1}){let u=!e.texture&&Ka(e),l=u&&a&&we(),c=!u||l?Qa(e):null,m=e.shadedColor===t?.paintColor,d={transform:c?ei(e):Ja(e),color:m?void 0:e.shadedColor,pointerEvents:i==="none"?"none":void 0,...o},h=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([x,T])=>[`data-${x}`,String(T)])):{},p=n?.trim()||void 0,P=x=>{let T=x.el;T&&(c?T.style.setProperty("border-shape",c):T.style.removeProperty("border-shape"),ni(T))};return Za(u&&!l?"b":"i",{class:p,style:d,...h,...r,onVnodeMounted:P,onVnodeUpdated:P})}import{h as oi}from"vue";function _e({entry:e,textureLighting:t,solidPaintDefaults:n,className:o,style:r,domAttrs:i,pointerEvents:a="auto"}){let u=t==="dynamic",l=Ae(e.polygon.color??"#cccccc"),c=u&&Jt(l)===n?.dynamicColorKey,m={transform:`matrix3d(${e.projectiveMatrix})`,color:u||e.shadedColor===n?.paintColor?void 0:e.shadedColor,pointerEvents:a==="none"?"none":void 0,...u&&!c?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4),"--psr":(l.r/255).toFixed(4),"--psg":(l.g/255).toFixed(4),"--psb":(l.b/255).toFixed(4)}:u?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...r},f=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([h,p])=>[`data-${h}`,String(p)])):{},d=o?.trim()||void 0;return oi("b",{class:d,style:m,...f,...i})}import{h as ri}from"vue";import{formatMatrix3d as ai,formatCssLengthPx as bt}from"@layoutit/polycss-core";var ii=64;function Be({entry:e,page:t,textureLighting:n,solidPaintDefaults:o,className:r,style:i,domAttrs:a,pointerEvents:u="auto"}){let l=n==="dynamic",c=e.atlasCanonicalSize??ii,m=e.canvasW||1,f=e.canvasH||1,d=t?`${bt(-e.x/m*c)} ${bt(-e.y/f*c)}`:void 0,h=t?`${bt(t.width/m*c)} ${bt(t.height/f*c)}`:void 0,p=l&&t?.url?`url(${t.url})`:void 0,P=!l&&t?.url?`url(${t.url}) ${d} / ${h} no-repeat`:void 0,x={transform:ai(e.atlasMatrix),"--polycss-atlas-size":`${c}px`,...l?{backgroundImage:t?.url?`url(${t.url})`:void 0,backgroundPosition:d,backgroundSize:h}:{background:P},...l?{"--pnx":e.normal[0].toFixed(4),"--pny":e.normal[1].toFixed(4),"--pnz":e.normal[2].toFixed(4)}:null,...l&&p?{maskImage:p,maskMode:"alpha",maskPosition:d,maskSize:h,maskRepeat:"no-repeat",WebkitMaskImage:p,WebkitMaskPosition:d,WebkitMaskSize:h,WebkitMaskRepeat:"no-repeat"}:null,opacity:t?.url?void 0:0,pointerEvents:u==="none"?"none":void 0,...i},T=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([L,y])=>[`data-${L}`,String(y)])):{},A=r?.trim()||void 0;return ri("s",{class:A,style:x,...T,...a})}var go=li({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},seamBleed:{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=ui(ee);if(!o)throw new Error("polycss: PolyScene must be used inside a PolyCamera.");let{sceneElRef:r,applyTransformDirect:i}=o,a=on(0),u=new Map,l={register(S,O){u.set(S,O),a.value++},unregister(S){u.delete(S),a.value++},version:a,getEntries(){return Array.from(u.values())}},c=on(null),m=xe(()=>({textureLighting:e.textureLighting??"baked",directionalLight:e.directionalLight,ambientLight:e.ambientLight,strategies:e.strategies,seamBleed:e.seamBleed??po,shadow:e.shadow,shadowRegistry:l,groundCssZ:c.value}));ci(Yt,m);let f=on(null);co(f,S=>{r.value=S});let d=!1;fo(()=>{d||typeof document<"u"&&(mt(document),d=!0)}),co(()=>e.debugShowBackfaces,S=>{let O=f.value;O&&O.classList.toggle("polycss-debug-show-backfaces",!!S)});let h=xe(()=>e.polygons??[]),p=xe(()=>({directionalLight:e.directionalLight})),P=dt(h,p);fo(()=>{r.value=f.value,i()}),di(i);let x=xe(()=>({tileSize:50,layerElevation:50,directionalLight:e.directionalLight,textureLighting:e.textureLighting,textureQuality:e.textureQuality})),T=xe(()=>{let S=e.textureLighting==="dynamic",O=S?void 0:e.directionalLight,F=S?void 0:e.ambientLight,H=vt(P.value.polygons),b=e.seamBleed??po,s=b==="auto"||typeof b=="number"&&Number.isFinite(b)&&b>0?St(P.value.polygons,{tileSize:x.value.tileSize,layerElevation:x.value.layerElevation,directionalLight:O,ambientLight:F}):null;return P.value.polygons.map((g,v)=>ke(g,v,{tileSize:x.value.tileSize,layerElevation:x.value.layerElevation,directionalLight:O,ambientLight:F,seamBleed:s?.has(v)?b:void 0,seamEdges:s?.get(v),textureEdgeRepairEdges:H[v]}))}),A=xe(()=>e.textureLighting??"baked"),L=xe(()=>e.textureQuality),y=xe(()=>e.strategies),w=Ie(T,A,L,y),k=xe(()=>{if(e.textureLighting!=="dynamic")return null;let S=e.directionalLight?.direction??[.4,-.7,.59],O=Math.hypot(S[0],S[1],S[2])||1,F=S[0]/O,H=S[1]/O,b=S[2]/O,s=yo(e.directionalLight?.color??"#ffffff")?.rgb??[255,255,255],g=yo(e.ambientLight?.color??"#ffffff")?.rgb??[255,255,255],v=e.directionalLight?.intensity??1,M=e.ambientLight?.intensity??.4,C=D=>(D/255).toFixed(4),z=b,N=Math.sign(z||1)*Math.max(Math.abs(z),.01);return{"--plx":F.toFixed(4),"--ply":H.toFixed(4),"--plz":b.toFixed(4),"--clx":F.toFixed(4),"--cly":H.toFixed(4),"--clz":N.toFixed(4),"--plr":C(s[0]),"--plg":C(s[1]),"--plb":C(s[2]),"--pli":v.toFixed(4),"--par":C(g[0]),"--pag":C(g[1]),"--pab":C(g[2]),"--pai":M.toFixed(4)}}),B=50;mo(()=>{let S=f.value;a.value;let O=l.getEntries();if(O.length===0){S&&S.style.removeProperty("--shadow-ground-cssz"),c.value!==null&&(c.value=null);return}let F=1/0;for(let s of O)for(let g of s())for(let v of g.vertices)v[2]<F&&(F=v[2]);if(!Number.isFinite(F)){S&&S.style.removeProperty("--shadow-ground-cssz"),c.value!==null&&(c.value=null);return}let H=e.shadow?.lift??.05,b=(F+H)*B;c.value!==b&&(c.value=b),S&&(e.textureLighting==="dynamic"?S.style.setProperty("--shadow-ground-cssz",b.toFixed(3)):S.style.removeProperty("--shadow-ground-cssz"))});let V=xe(()=>{if(!e.autoCenter)return[0,0,0];let S=P.value.sceneBbox;return[(S.min[0]+S.max[0])/2,(S.min[1]+S.max[1])/2,(S.min[2]+S.max[2])/2]});return mo(()=>{o.autoCenterOffset.value=V.value}),mi(()=>{}),()=>{let S=`polycss-scene${e.class?` ${e.class}`:""}`,O=x.value,F=w.entries.value.map((b,s)=>{if(b)return Be({entry:b,page:w.pages.value[b.pageIndex],textureLighting:O.textureLighting??"baked"});let g=T.value[s];return!g||g.texture?null:w.useStableTriangle.value&&Xe(g)?Fe({entry:g,textureLighting:O.textureLighting??"baked"}):w.useProjectiveQuad.value&&je(g)?_e({entry:g,textureLighting:O.textureLighting??"baked"}):w.useBorderShape.value||w.useFullRectSolid.value?Ve({entry:g,forceBorderShape:!w.useFullRectSolid.value}):null}),H=t.default?.()??[];return si("div",{ref:f,class:S,"data-polycss-lighting":O.textureLighting??"baked","aria-hidden":"true",style:{...k.value??null,...n.style},...Object.fromEntries(Object.entries(n).filter(([b])=>b!=="style"&&b!=="class"))},[...F,...H])}}});import{defineComponent as Ki,h as qe,computed as oe,inject as Qi,onMounted as Ji,onBeforeUnmount as Do,ref as at,watch as Oo,watchEffect as el}from"vue";import{BASE_TILE as dn,computeSceneBbox as tl,DEFAULT_SEAM_BLEED as nl,ensureCcw2D as ol,inverseRotateVec3 as ko,findOverlappingPolygonDuplicates as rl,parseHexColor as al,projectCssVertexToGround as il}from"@layoutit/polycss-core";import{ref as rt,watch as fi,onUnmounted as pi}from"vue";import{loadMesh as yi}from"@layoutit/polycss-core";var ho=[],rn=[];function Ct(e,t){let n=rt(ho),o=rt(void 0),r=rt(!!e.value),i=rt(null),a=rt(rn),u=null;function l(){if(u){try{u.dispose()}catch{}u=null}}return fi(e,(c,m,f)=>{if(!c){l(),n.value=ho,o.value=void 0,r.value=!1,i.value=null,a.value=rn;return}let d=!1;r.value=!0,i.value=null;let h=u;yi(c,t).then(p=>{if(d){try{p.dispose()}catch{}return}if(h)try{h.dispose()}catch{}u=p,n.value=p.polygons,o.value=p.voxelSource,r.value=!1,i.value=null,a.value=p.warnings??rn}).catch(p=>{if(d)return;let P=p instanceof Error?p:new Error(String(p));r.value=!1,i.value=P}),f(()=>{d=!0})},{immediate:!0}),pi(()=>{l()}),{polygons:n,voxelSource:o,loading:r,error:i,warnings:a,dispose:l}}import{BASE_TILE as ne,computeProjectiveQuadMatrix as gi,normalFacesCamera as hi,parsePureColor as Eo,PROJECTIVE_QUAD_BLEED as Pi,resolveProjectiveQuadGuards as xi,rotateVec3 as Po,SOLID_QUAD_CANONICAL_SIZE as bi}from"@layoutit/polycss-core";var vi=[.4,-.7,.59],Si="#ffffff",Ci=1,Ei="#ffffff",Mi=.4,Mo=1,Ti=8,Ai=Pi,Ce=1e-6,Li=xi({bleed:0}),To={t:[0,0,1],b:[0,0,-1],fl:[0,1,0],br:[0,-1,0],fr:[1,0,0],bl:[-1,0,0]},sn=["t","b","bl","br","fr","fl"],wi=new Map([["0,0,1","t"],["0,0,-1","b"],["0,1,0","fl"],["0,-1,0","br"],["1,0,0","fr"],["-1,0,0","bl"]]);function xo(e){let t=[];for(let n of sn)hi(To[n],e)&&t.push(n);return t.join("|")}function Ri(e,t,n){let o=e.__polycssVoxelBrushState??(e.__polycssVoxelBrushState={});o.color!==t&&(e.style.color=t,o.color=t),o.transform!==n&&(e.style.transform=n,o.transform=n)}function Di(e){let t=e.vertices;if(t.length<3)return null;let n=t[0],o=0,r=0,i=0;for(let u=1;u+1<t.length;u+=1){let l=t[u],c=t[u+1],m=l[1]-n[1],f=l[0]-n[0],d=l[2]-n[2],h=c[1]-n[1],p=c[0]-n[0],P=c[2]-n[2];o-=f*P-d*p,r-=d*h-m*P,i-=m*p-f*h}let a=Math.hypot(o,r,i);return a<=1e-9?null:[Math.round(o/a),Math.round(r/a),Math.round(i/a)]}function Oi(e){if(e.texture||e.material||e.uvs||e.textureTriangles||e.vertices.length!==4)return null;let t=Di(e),n=t?wi.get(t.join(",")):void 0;if(!n)return null;let o=1/0,r=1/0,i=1/0,a=-1/0,u=-1/0,l=-1/0;for(let f of e.vertices)o=Math.min(o,f[0]),r=Math.min(r,f[1]),i=Math.min(i,f[2]),a=Math.max(a,f[0]),u=Math.max(u,f[1]),l=Math.max(l,f[2]);let c=1e-6,m=Bi(e.color);return Math.abs(l-i)<=c?{axis:"z",face:n,left:r*ne,top:o*ne,width:Math.max(0,(u-r)*ne),height:Math.max(0,(a-o)*ne),z:i*ne,baseColor:m,bleed:an()}:Math.abs(a-o)<=c?{axis:"x",face:n,left:r*ne,top:i*ne,width:Math.max(0,(u-r)*ne),height:Math.max(0,(l-i)*ne),z:-o*ne,baseColor:m,bleed:an()}:Math.abs(u-r)<=c?{axis:"y",face:n,left:i*ne,top:o*ne,width:Math.max(0,(l-i)*ne),height:Math.max(0,(a-o)*ne),z:-r*ne,baseColor:m,bleed:an()}:null}function an(){return{left:0,right:0,top:0,bottom:0}}function ki(e){let t=o=>String(Number(o.toFixed(6))),n=`${e.item.baseColor}|${e.variableAxis}`;for(let o=0;o<3;o+=1)o!==e.variableAxis&&(n+=`|${o}:${t(e.fixed[o])}`);return n}function bo(e){return[e[1]*ne,e[0]*ne,e[2]*ne]}function vo(e,t){return e.axis==="x"?[t[0],t[2]]:e.axis==="y"?[t[2],t[1]]:[t[0],t[1]]}function Ii(e,t,n){let o=e.left,r=e.left+e.width,i=e.top,a=e.top+e.height;if(Math.abs(t[0]-n[0])<=Ce){if(Math.abs(t[0]-o)<=Ce)return"left";if(Math.abs(t[0]-r)<=Ce)return"right"}if(Math.abs(t[1]-n[1])<=Ce){if(Math.abs(t[1]-i)<=Ce)return"top";if(Math.abs(t[1]-a)<=Ce)return"bottom"}return null}function Fi(e,t){let n=null;for(let o=0;o<3;o+=1)if(!(Math.abs(e[o]-t[o])<=Ce)){if(n!==null)return null;n=o}return n}function Vi(e,t,n){let o=t.vertices,r=bo(o[n]),i=bo(o[(n+1)%o.length]),a=Ii(e,vo(e,r),vo(e,i));if(!a)return null;let u=Fi(r,i);if(u===null)return null;let l=Math.min(r[u],i[u]),c=Math.max(r[u],i[u]);return c-l>Ce?{item:e,side:a,variableAxis:u,fixed:r,start:l,end:c}:null}function So(e){e.item.bleed[e.side]=Math.max(e.item.bleed[e.side],Ai)}function _i(e,t){let n=new Map;for(let o of t){let r=e[o.sourceIndex];if(r)for(let i=0;i<r.vertices.length;i+=1){let a=Vi(o,r,i);if(!a)continue;let u=ki(a),l=n.get(u);l?l.push(a):n.set(u,[a])}}for(let o of n.values()){if(o.length<2)continue;o.sort((i,a)=>i.start-a.start||i.end-a.end);let r=[];for(let i of o){r=r.filter(a=>a.end>i.start+Ce);for(let a of r)a.item.sourceIndex!==i.item.sourceIndex&&(So(a),So(i));r.push(i)}}}function ln(e){let t=Eo(e);return t?{r:t.rgb[0],g:t.rgb[1],b:t.rgb[2],alpha:t.alpha}:{r:255,g:255,b:255,alpha:1}}function Bi(e){if(!e)return"#cccccc";let t=Eo(e);if(!t)return e;let n={r:t.rgb[0],g:t.rgb[1],b:t.rgb[2],alpha:t.alpha};if(n.alpha<1){let o=Math.round(Math.max(0,n.alpha)*1e3)/1e3;return`rgba(${$e(n.r)}, ${$e(n.g)}, ${$e(n.b)}, ${o})`}return Ao(n)}function Ao({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 $e(e){return Math.round(Math.max(0,Math.min(255,e)))}function zi(e,t,n,o){let r=ln(t),i=ln(n?.color??Si),a=ln(o?.color??Ei),u=n?.direction??vi,l=Math.hypot(u[0],u[1],u[2])||1,c=u[0]/l,m=u[1]/l,f=u[2]/l,d=Math.max(0,n?.intensity??Ci)*Math.max(0,e[0]*c+e[1]*m+e[2]*f),h=Math.max(0,o?.intensity??Mi),p=a.r/255*h+i.r/255*d,P=a.g/255*h+i.g/255*d,x=a.b/255*h+i.b/255*d,T={r:r.r*p,g:r.g*P,b:r.b*x,alpha:r.alpha};return T.alpha<1?`rgba(${$e(T.r)}, ${$e(T.g)}, ${$e(T.b)}, ${T.alpha})`:Ao(T)}function Hi(e){if(!e?.length)return[];let t=[];for(let n=0;n<e.length;n+=1){let o=e[n],r=Oi(o);if(!r||r.width<=0||r.height<=0)return[];t.push({...r,sourceIndex:n})}return _i(e,t),t}function Ni(e){return e.axis==="x"?{xAxis:[1,0,0],yAxis:[0,0,1],normal:[0,-1,0],tx:0,ty:-e.z,tz:0}:e.axis==="y"?{xAxis:[0,0,1],yAxis:[0,1,0],normal:[-1,0,0],tx:-e.z,ty:0,tz:0}:{xAxis:[1,0,0],yAxis:[0,1,0],normal:[0,0,1],tx:0,ty:0,tz:e.z}}function Yi(e){let t=e.left,n=e.top,o=e.left+e.width,r=e.top+e.height;return[t,n,o,n,o,r,t,r]}function Xi(e){return new Map([[0,e.bleed.top],[1,e.bleed.right],[2,e.bleed.bottom],[3,e.bleed.left]])}function ji(e,t){let n=e.split(",").map(Number);if(n.length!==16||n.some(r=>!Number.isFinite(r)))return null;let o=bi/t;for(let r=0;r<8;r+=1)n[r]*=o;return`matrix3d(${n.map(r=>Number(r.toFixed(6))).join(",")})`}function Co(e,t){let n=e.left-e.bleed.left,o=e.top-e.bleed.top,r=e.width+e.bleed.left+e.bleed.right,i=e.height+e.bleed.top+e.bleed.bottom,a=e.z,u=r/t,l=i/t;return`matrix3d(${(e.axis==="x"?[u,0,0,0,0,0,l,0,0,-1,0,0,n,-a,o,1]:e.axis==="y"?[0,0,u,0,0,l,0,0,-1,0,0,0,-a,o,n,1]:[u,0,0,0,0,l,0,0,0,0,1,0,n,o,a,1]).map(m=>Number(m.toFixed(6))).join(",")})`}function $i(e,t){let{xAxis:n,yAxis:o,normal:r,tx:i,ty:a,tz:u}=Ni(e),l=gi(Yi(e),n,o,r,i,a,u,Li,Xi(e));return l?ji(l,t)??Co(e,t):Co(e,t)}function Ui(e){let t=e.defaultView?.matchMedia;return t?t("(pointer: coarse)").matches||t("(hover: none)").matches:!1}function Wi(e){return Ui(e)?Ti:Mo}function qi(e){return e.axis==="x"?[e.left+e.width/2,-e.z,e.top+e.height/2]:e.axis==="y"?[-e.z,e.top+e.height/2,e.left+e.width/2]:[e.left+e.width/2,e.top+e.height/2,e.z]}function Gi(e,t){let n=qi(e),o=t.meshRotation;o&&(n=Po(n,o[0]??0,o[1]??0,o[2]??0));let[r,i]=Po(n,t.rotX,0,t.rotY);return{x:r,y:i}}function Zi(e,t,n){let o=e.filter(d=>t.has(d.face)).map(d=>({item:d,...Gi(d,n)}));if(o.length===0)return[];let r=1/0,i=-1/0,a=1/0,u=-1/0;for(let d of o)r=Math.min(r,d.x),i=Math.max(i,d.x),a=Math.min(a,d.y),u=Math.max(u,d.y);let l=4,c=Math.max(1e-6,i-r),m=Math.max(1e-6,u-a),f=new Map;for(let d of o){let h=Math.min(l-1,Math.max(0,Math.floor((d.x-r)/c*l))),p=Math.min(l-1,Math.max(0,Math.floor((d.y-a)/m*l))),P=`${h}:${p}`,x=f.get(P);x||(x={tx:h,ty:p,sourceIndex:d.item.sourceIndex,items:[]},f.set(P,x)),x.items.push(d.item),x.sourceIndex=Math.min(x.sourceIndex,d.item.sourceIndex)}return Array.from(f.values()).sort((d,h)=>d.ty-h.ty||d.tx-h.tx||d.sourceIndex-h.sourceIndex).flatMap(d=>d.items)}function Lo(e){let{doc:t,wrapper:n,polygons:o,directionalLight:r,ambientLight:i}=e,a=Hi(o);if(a.length===0)return null;let u=new Set(a.map(b=>b.face));n.classList.add("polycss-voxel-mesh");let l=Wi(t);l!==Mo&&n.style.setProperty("--polycss-voxel-primitive",`${l}px`);let c=new Map,m=(b,s)=>{let g=`${b}|${s}`,v=c.get(g);if(v)return v;let M=zi(To[b],s,r,i);return c.set(g,M),M},f=new Map,d=new Map,h=new Map,p=new Map;for(let b of a){let s=p.get(b.face);s||(s=[],p.set(b.face,s)),s.push(b)}let P="",x=0,T=new Set,A=b=>{let s=f.get(b.sourceIndex);return s||(s=t.createElement("b"),f.set(b.sourceIndex,s),Ri(s,m(b.face,b.baseColor),$i(b,l))),s},L=b=>{let s=d.get(b);return s||(s=t.createElement("span"),s.className=`polycss-voxel-face polycss-voxel-face-${b}`,s.dataset.polycssVoxelFace=b,s.__polycssVoxelFaceHost=!0,d.set(b,s)),s},y=()=>{for(let b of Array.from(n.childNodes))if(!b.__polycssVoxelFaceHost)return b;return null},w=(b,s)=>{let g=s.map(C=>C.sourceIndex).join(",");if(h.get(b)===g)return;let v=L(b),M=t.createDocumentFragment();for(let C of s)M.appendChild(A(C));v.replaceChildren(M),h.set(b,g)},k=()=>{for(let b of sn)u.has(b)&&w(b,p.get(b)??[])},B=b=>new Set(b.split("|").filter(Boolean)),V=b=>{let s=B(b);return sn.filter(g=>s.has(g)&&u.has(g))},S=b=>{let s=0;for(let g of b)s+=p.get(g)?.length??0;return s},O=b=>{let s=new Set,g=[],v=new Map;for(let M of b){s.has(M.face)||(s.add(M.face),g.push(M.face));let C=v.get(M.face);C||(C=[],v.set(M.face,C)),C.push(M)}return{orderedFaces:g,itemsByFace:v}},F=(b,s)=>{let g=new Set(b);for(let v of T){if(g.has(v))continue;let M=d.get(v);M?.parentNode===n&&n.removeChild(M)}if(s){let v=t.createDocumentFragment();for(let M of b)v.appendChild(L(M));n.insertBefore(v,y()),T=g;return}for(let v=0;v<b.length;v+=1){let M=b[v],C=L(M);if(C.parentNode===n)continue;let z=null;for(let N=v+1;N<b.length;N+=1){let D=d.get(b[N]);if(D?.parentNode===n){z=D;break}}n.insertBefore(C,z??y())}T=g},H=(b,s,g)=>{if(!g){let N=V(b);F(N,!1),x=S(N);return}let v=new Set(b.split("|").filter(Boolean)),M=Zi(a,v,s),{orderedFaces:C,itemsByFace:z}=O(M);for(let N of C)w(N,z.get(N)??[]);F(C,!0),x=M.length};return k(),{get brushCount(){return x},render(b){P=xo(b),H(P,b,!0)},syncCamera(b){let s=xo(b);s!==P&&(P=s,H(s,b,!1))},dispose(){for(let b of d.values())b.remove();n.classList.remove("polycss-voxel-mesh"),n.style.removeProperty("--polycss-voxel-primitive"),f.clear(),d.clear(),h.clear(),x=0,T=new Set,P=""}}}var un=new WeakMap;function wo(e,t){un.set(e,t)}function Ro(e){un.delete(e)}function Ue(e){let t=e;for(;t;){if(t instanceof HTMLElement){let n=un.get(t);if(n)return n}t=t.parentElement}return null}function We(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 cn(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=Ue(r);if(i&&We(r,e,t))return i}return null}function ll(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 sl(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 Io(e){if(e.length===0)return e;let t=tl(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=a=>[a[0]-n,a[1]-o,a[2]-r];return e.map(a=>({...a,vertices:a.vertices.map(i),...a.textureTriangles?.length?{textureTriangles:a.textureTriangles.map(u=>({...u,vertices:u.vertices.map(i)}))}:null}))}var Q=Ki({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},seamBleed:{type:[Number,String],default:void 0},castShadow:{type:Boolean,default:!1},meshResolution:{type: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:n,expose:o}){let r=oe(()=>e.src??""),i=oe(()=>{let E={};return e.mtl&&(E.mtlUrl=e.mtl),e.meshResolution!==void 0&&(E.meshResolution=e.meshResolution),Object.keys(E).length>0?E:void 0}),a=Ct(r,i.value),u=oe(()=>e.src?a.polygons.value:e.polygons??[]),l=at(null),c=null;Oo(u,()=>{l.value=null,c=null});let m=oe(()=>l.value??u.value),f=oe(()=>e.autoCenter?Io(m.value):m.value),d=!t.polygon,h=Rn(),p=oe(()=>e.textureLighting??h?.value.textureLighting??"baked"),P=oe(()=>h?.value.strategies),x=oe(()=>e.seamBleed??h?.value.seamBleed??nl),T=oe(()=>p.value==="dynamic"?void 0:h?.value.directionalLight),A=oe(()=>p.value==="dynamic"?void 0:h?.value.ambientLight),L=oe(()=>!!(e.src&&a.voxelSource.value&&l.value===null&&!t.polygon&&!t.default&&p.value==="baked"&&!e.castShadow)),y=oe(()=>{if(p.value!=="dynamic")return null;let E=e.rotation;if(!E||E[0]===0&&E[1]===0&&E[2]===0)return null;let _=h?.value.directionalLight?.direction;if(!_)return null;let I=ko(_,E),j=Math.hypot(I[0],I[1],I[2])||1;return{"--plx":(I[0]/j).toFixed(4),"--ply":(I[1]/j).toFixed(4),"--plz":(I[2]/j).toFixed(4)}}),w=at(e.rotation),k=at(0),B=oe(()=>{let E=T.value;return!E||!w.value?E:{...E,direction:ko(E.direction,w.value)}}),V=oe(()=>{if(!d||L.value)return[];let E=vt(f.value),_=x.value==="auto"||typeof x.value=="number"&&Number.isFinite(x.value)&&x.value>0?St(f.value,{directionalLight:B.value,ambientLight:A.value}):null;return f.value.map((I,j)=>ke(I,j,{directionalLight:B.value,ambientLight:A.value,seamBleed:_?.has(j)?x.value:void 0,seamEdges:_?.get(j),textureEdgeRepairEdges:E[j]}))}),S=oe(()=>e.textureQuality),O=Ie(V,p,S,P),F=oe(()=>d?nn(V.value,p.value,P.value):{}),H=oe(()=>ll(F.value)),b=oe(()=>{if(!e.castShadow)return null;let E=h?.value,_=E?.groundCssZ??null;if(_===null)return null;let I=E?.shadow,j=E?.directionalLight?.direction??[.4,-.7,.59],Y=rl(f.value,{normalTolerance:.1,distanceTolerance:.5,overlapFraction:.4,preserveDoubleSidedBackfaces:!1}),G=[],$=1/0,W=1/0,Z=-1/0,re=-1/0,de=1/0,U=1/0,K=-1/0,X=-1/0,R=f.value,J=V.value;for(let he=0;he<R.length;he++){if(Y.has(he)||!J[he])continue;let Te=R[he],ut=[];for(let et of Te.vertices){let me=[et[1]*dn,et[0]*dn,et[2]*dn];me[0]<de&&(de=me[0]),me[1]<U&&(U=me[1]),me[0]>K&&(K=me[0]),me[1]>X&&(X=me[1]);let se=il(me,j,_);ut.push(se),se[0]<$&&($=se[0]),se[1]<W&&(W=se[1]),se[0]>Z&&(Z=se[0]),se[1]>re&&(re=se[1])}G.push(ut)}if(G.length===0)return null;let ie=I?.maxExtend??2e3,le=Math.max($,de-ie),ue=Math.max(W,U-ie),ge=Math.min(Z,K+ie),te=Math.min(re,X+ie),be=ge-le,ve=te-ue;if(!(be>0)||!(ve>0))return null;let Je=I?.color??"#000000",Dt=I?.opacity??.25,ce=al(Je)?.rgb??[0,0,0],Ee="";for(let he of G){let Me=ol(he);Ee+=`M${(Me[0][0]-le).toFixed(3)},${(Me[0][1]-ue).toFixed(3)}`;for(let Te=1;Te<Me.length;Te++)Ee+=`L${(Me[Te][0]-le).toFixed(3)},${(Me[Te][1]-ue).toFixed(3)}`;Ee+="Z"}return qe("svg",{class:"polycss-shadow polycss-shadow-svg",width:String(be),height:String(ve),viewBox:`0 0 ${be} ${ve}`,style:{position:"absolute",top:"0",left:"0",display:"block",overflow:"hidden",transformOrigin:"0 0",pointerEvents:"none",willChange:"transform",transform:`translate3d(${le.toFixed(3)}px,${ue.toFixed(3)}px,${_.toFixed(3)}px)`}},[qe("path",{d:Ee,fill:`rgb(${ce[0]},${ce[1]},${ce[2]})`,"fill-rule":"nonzero",stroke:`rgb(${ce[0]},${ce[1]},${ce[2]})`,"stroke-width":"2","stroke-linejoin":"round",opacity:Dt.toFixed(4)})])}),s=Symbol();Oo(()=>e.castShadow,(E,_,I)=>{let j=h?.value.shadowRegistry;j&&(E?j.register(s,()=>f.value):j.unregister(s),I(()=>j.unregister(s)))},{immediate:!0}),Do(()=>{h?.value.shadowRegistry?.unregister(s)});let g=at(null),v={get element(){return g.value},get id(){return e.id},getPosition:()=>e.position,getRotation:()=>e.rotation,getScale:()=>e.scale,getPolygons:()=>c??f.value,setPolygons(E){let _=e.autoCenter?Io(E):E;c=_;let I=g.value;I&&d&&tn(I,_,{directionalLight:B.value,ambientLight:A.value,textureLighting:p.value,strategies:P.value,seamBleed:x.value,colorFrame:++k.value,colorFreezeFrames:0})||(l.value=E.slice())},updatePolygon(E,_){let I=c??f.value,j=typeof E=="number"?E:I.indexOf(E);j<0||j>=I.length||(Object.assign(I[j],_),l.value=I.slice(),c=null)},rebakeAtlas:()=>{w.value=e.rotation}};o(v),Ji(()=>{g.value&&wo(g.value,v)}),Do(()=>{g.value&&Ro(g.value)});let M=Qi(ee,null),C=at(null);el(E=>{let _=g.value;if(C.value?.dispose(),C.value=null,!L.value||!_)return;let I=Lo({doc:_.ownerDocument,wrapper:_,polygons:f.value,directionalLight:B.value,ambientLight:A.value});if(!I)return;let j=()=>{let G=M?.store.getState().cameraState;return{rotX:G?.rotX??65,rotY:G?.rotY??45,meshRotation:e.rotation}};C.value=I,I.render(j());let Y=M?.store.subscribe(()=>{I.syncCamera(j())});E(()=>{Y?.(),I.dispose(),C.value===I&&(C.value=null)})});let z=null;function N(E,_,I){let j=[];if(typeof document<"u"&&typeof document.elementsFromPoint=="function"){let Z=document.elementsFromPoint(_,I),re=new Set;for(let de of Z){let U=Ue(de);U&&!re.has(U)&&(re.add(U),j.push({object:U}))}}let Y=0,G=0,$=M?.cameraElRef.value;if($){let Z=$.getBoundingClientRect();Z.width>0&&Z.height>0&&(Y=(_-Z.left)/Z.width*2-1,G=-((I-Z.top)/Z.height*2-1))}let W=0;return z&&(W=Math.hypot(_-z.x,I-z.y)),{object:j[0]?.object??v,eventObject:v,intersections:j,pointer:{x:Y,y:G},delta:W,nativeEvent:E,stopPropagation:()=>E.stopPropagation()}}function D(E,_,I,j){E&&E(N(_,I,j))}return()=>{let E=sl(e.position,e.scale,e.rotation),_=f.value,I;if(_.length>0){let X=1/0,R=1/0,J=1/0,ie=-1/0,le=-1/0,ue=-1/0;for(let ge of _)for(let te of ge.vertices)te[0]<X&&(X=te[0]),te[0]>ie&&(ie=te[0]),te[1]<R&&(R=te[1]),te[1]>le&&(le=te[1]),te[2]<J&&(J=te[2]),te[2]>ue&&(ue=te[2]);Number.isFinite(X)&&(I=`${(R+le)/2*50}px ${(X+ie)/2*50}px ${(J+ue)/2*50}px`)}let j={transform:E,...I?{transformOrigin:I}:null,...y.value??void 0,...n.style,...H.value??void 0},Y=Object.fromEntries(Object.entries(n).filter(([X])=>X!=="style"&&X!=="class")),G=`polycss-mesh${L.value?" polycss-voxel-mesh":""}${e.class?` ${e.class}`:""}`,$={};e.onClick&&($.onClick=X=>{let R=X;D(e.onClick,R,R.clientX,R.clientY)}),e.onContextMenu&&($.onContextmenu=X=>{let R=X;D(e.onContextMenu,R,R.clientX,R.clientY)}),e.onDoubleClick&&($.onDblclick=X=>{let R=X;D(e.onDoubleClick,R,R.clientX,R.clientY)}),e.onWheel&&($.onWheel=X=>{let R=X;D(e.onWheel,R,R.clientX,R.clientY)}),$.onPointerdown=X=>{let R=X;z={x:R.clientX,y:R.clientY},D(e.onPointerDown,R,R.clientX,R.clientY)},$.onPointerup=X=>{let R=X;D(e.onPointerUp,R,R.clientX,R.clientY),z=null},e.onPointerMove&&($.onPointermove=X=>{let R=X;D(e.onPointerMove,R,R.clientX,R.clientY)}),(e.onPointerOver||e.onPointerEnter)&&($.onPointerenter=X=>{let R=X;D(e.onPointerOver,R,R.clientX,R.clientY),D(e.onPointerEnter,R,R.clientX,R.clientY)}),(e.onPointerOut||e.onPointerLeave)&&($.onPointerleave=X=>{let R=X;D(e.onPointerOut,R,R.clientX,R.clientY),D(e.onPointerLeave,R,R.clientX,R.clientY)}),e.onPointerCancel&&($.onPointercancel=X=>{let R=X;D(e.onPointerCancel,R,R.clientX,R.clientY),z=null});let W=e.id?{"data-poly-mesh-id":e.id}:{};if(e.src&&a.loading.value&&a.polygons.value.length===0)return qe("div",{ref:g,class:`polycss-mesh polycss-mesh-loading${e.class?` ${e.class}`:""}`,style:j,...W,...$,...Y},t.fallback?.()??[]);if(e.src&&a.error.value&&a.polygons.value.length===0)return qe("div",{ref:g,class:`polycss-mesh polycss-mesh-error${e.class?` ${e.class}`:""}`,style:j,...W,...$,...Y},t.error?.({error:a.error.value})??[]);let Z=f.value,re=t.polygon?Z.map((X,R)=>qe("template",{key:R},t.polygon?.({polygon:X,index:R}))):L.value?[]:O.entries.value.map((X,R)=>{if(X)return Be({entry:X,page:O.pages.value[X.pageIndex],textureLighting:p.value,solidPaintDefaults:F.value});let J=V.value[R];return!J||J.texture?null:je(J)?_e({entry:J,textureLighting:p.value,solidPaintDefaults:F.value}):Xe(J)?Fe({entry:J,textureLighting:p.value,solidPaintDefaults:F.value}):Ve({entry:J,solidPaintDefaults:F.value})}),de=t.default?.()??[],U=b.value,K=U?[U]:[];return qe("div",{ref:g,class:G,style:j,...W,...$,...Y},[...K,...re,...de])}}});import{defineComponent as ul,h as cl,computed as dl}from"vue";var Fo=ul({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=dl(()=>{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()=>cl(Q,{polygons:t.value,castShadow:!1,class:e.class?`polycss-ground ${e.class}`:"polycss-ground"})}});import{computed as Vo}from"vue";function ml(e){return typeof e=="function"?Vo(()=>{let{texture:t,key:n}=e();return{texture:t,key:n}}):Vo(()=>({texture:e.texture,key:e.key}))}import{computed as Ge,defineComponent as fl,h as _o}from"vue";var pl=4;function Et(e,t=pl){let n=e.toFixed(t).replace(/\.?0+$/,"");return Number(n)===0||Object.is(Number(n),-0)?"0":`${n}px`}function yl(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 gl({plan:e,material:t,uvRect:n,className:o,style:r,domAttrs:i,pointerEvents:a="auto"}){let{u0:u,u1:l,v0:c,v1:m}=n,f=l-u,d=m-c,h=1/f,p=1/d,P=Math.max(c,m),x=u/f,T=(1-P)/d,A={transform:`matrix3d(${e.canonicalMatrix})`,backgroundImage:`url(${t.texture})`,backgroundSize:`${Et(h)} ${Et(p)}`,backgroundPosition:`${Et(-x)} ${Et(-T)}`,pointerEvents:a==="none"?"none":void 0,...r},L=e.polygon.data?Object.fromEntries(Object.entries(e.polygon.data).map(([w,k])=>[`data-${w}`,String(k)])):{},y=o?.trim()||void 0;return _o("i",{class:y,style:A,...L,...i})}var Bo=fl({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=Ge(()=>e.textureLighting??e.context?.textureLighting??"baked"),o=Ge(()=>e.textureQuality??e.context?.textureQuality),r=Ge(()=>e.material?.texture??e.texture),i=Ge(()=>e.material&&e.uvs?yl(e.uvs):null),a=Ge(()=>{let c=e.context?.tileSize??50;return ke({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})}),u=Ge(()=>i.value?[]:[a.value]),l=Ie(u,n,o);return()=>{let c=a.value,m=l.entries.value[0],f=[];e.position&&f.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&&f.push(`scale3d(${e.scale}, ${e.scale}, ${e.scale})`):f.push(`scale3d(${e.scale[0]}, ${e.scale[1]}, ${e.scale[2]})`)),e.rotation&&(e.rotation[0]&&f.push(`rotateX(${e.rotation[0]}deg)`),e.rotation[1]&&f.push(`rotateY(${e.rotation[1]}deg)`),e.rotation[2]&&f.push(`rotateZ(${e.rotation[2]}deg)`));let d=f.length>0?f.join(" "):void 0,h={};if(e.data)for(let[T,A]of Object.entries(e.data))h[`data-${T}`]=String(A);let p={...t,...h},P=Object.fromEntries(Object.entries(p).filter(([T])=>T!=="class"&&T!=="style")),x;return i.value&&e.material&&c?x=gl({plan:c,material:e.material,uvRect:i.value,className:p.class??void 0,style:p.style,domAttrs:P,pointerEvents:e.pointerEvents??"auto"}):m?x=Be({entry:m,page:l.pages.value[m.pageIndex],textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:P,pointerEvents:e.pointerEvents??"auto"}):c&&!c.texture&&(x=Xe(c)?Fe({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:P,pointerEvents:e.pointerEvents??"auto"}):je(c)?_e({entry:c,textureLighting:n.value,className:p.class??void 0,style:p.style,domAttrs:P,pointerEvents:e.pointerEvents??"auto"}):Ve({entry:c,className:p.class??void 0,style:p.style,domAttrs:P,pointerEvents:e.pointerEvents??"auto"})),x?d?_o("div",{class:"polycss-poly-wrapper",style:{transform:d,position:"absolute",transformStyle:"preserve-3d"}},[x]):x:null}}});import{computed as fe,defineComponent as pe,h as ye}from"vue";import{boxPolygons as hl,planePolygons as Pl,ringPolygons as xl,octahedronPolygons as bl,spherePolygons as vl,tetrahedronPolygons as Sl,icosahedronPolygons as Cl,dodecahedronPolygons as El,cylinderPolygons as Ml,conePolygons as Tl,torusPolygons as Al}from"@layoutit/polycss-core";var zo=pe({name:"PolyBox",props:{size:{type:[Number,Array],default:void 0},center:{type:Array,default:void 0},min:{type:Array,default:void 0},max:{type:Array,default:void 0},color:{type:String,default:void 0},texture:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>hl({size:e.size,center:e.center,min:e.min,max:e.max,color:e.color,texture:e.texture}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),Ho=pe({name:"PolyPlane",props:{axis:{type:Number,required:!0},size:{type:Number,default:void 0},along:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>Pl({axis:e.axis,size:e.size,along:e.along,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),No=pe({name:"PolyRing",props:{axis:{type:Number,required:!0},radius:{type:Number,required:!0},halfThickness:{type:Number,default:void 0},segments:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>xl({axis:e.axis,radius:e.radius,halfThickness:e.halfThickness,segments:e.segments,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),Yo=pe({name:"PolyOctahedron",props:{center:{type:Array,required:!0},size:{type:Number,required:!0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>bl({center:e.center,size:e.size,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),Xo=pe({name:"PolyTetrahedron",props:{size:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>Sl({size:e.size,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),jo=pe({name:"PolyIcosahedron",props:{size:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>Cl({size:e.size,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),$o=pe({name:"PolyDodecahedron",props:{size:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>El({size:e.size,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),Uo=pe({name:"PolySphere",props:{radius:{type:Number,default:void 0},subdivisions:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>vl({radius:e.radius,subdivisions:e.subdivisions,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),Wo=pe({name:"PolyCylinder",props:{radius:{type:Number,default:void 0},radiusTop:{type:Number,default:void 0},height:{type:Number,default:void 0},radialSegments:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>Ml({radius:e.radius,radiusTop:e.radiusTop,height:e.height,radialSegments:e.radialSegments,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),qo=pe({name:"PolyCone",props:{radius:{type:Number,default:void 0},height:{type:Number,default:void 0},radialSegments:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>Tl({radius:e.radius,height:e.height,radialSegments:e.radialSegments,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}}),Go=pe({name:"PolyTorus",props:{radius:{type:Number,default:void 0},tube:{type:Number,default:void 0},radialSegments:{type:Number,default:void 0},tubularSegments:{type:Number,default:void 0},color:{type:String,default:void 0},position:{type:Array,default:void 0},scale:{type:[Number,Array],default:void 0},rotation:{type:Array,default:void 0},autoCenter:{type:Boolean,default:!1},id:{type:String,default:void 0}},setup(e){let t=fe(()=>Al({radius:e.radius,tube:e.tube,radialSegments:e.radialSegments,tubularSegments:e.tubularSegments,color:e.color}));return()=>ye(Q,{polygons:t.value,position:e.position,scale:e.scale,rotation:e.rotation,autoCenter:e.autoCenter,id:e.id})}});import{defineComponent as Ll,inject as wl,onMounted as Rl,onBeforeUnmount as Dl,watch as mn,ref as Ol}from"vue";import{BASE_TILE as Zo}from"@layoutit/polycss-core";var kl=150,Ko=4,Il=513e-6,Fl=10,Vl=3,Qo=16.67,_l=50,Jo=.1,er=10,tr=0,nr=5e3,Bl=.3,zl=.05;function Hl(e){return e===!0?-1:e===void 0||e===!1?1:e}function Nl(e,t,n,o,r){let i=Hl(r),a=e/Ko*i,u=t/Ko*i;return{rotX:Math.max(0,Math.min(100,n-u)),rotY:((o-a)%360+360)%360}}function or(e,t,n,o,r){let i=Math.max(.01,n),a=Math.max(.1,Math.cos(o*Math.PI/180)),u=-e/(i*Zo),l=-t/(i*Zo*a),c=-r*Math.PI/180,m=Math.cos(c),f=Math.sin(c);return{dWorldX:l*m-u*f,dWorldY:l*f+u*m}}var rr=Ll({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:Jo},maxZoom:{type:Number,default:er},minDistance:{type:Number,default:tr},maxDistance:{type:Number,default:nr},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=wl(ee,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:a}=n,u=()=>({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}),l=()=>{t("change",u())},c=()=>{t("interaction-start",u())},m=()=>{t("interaction-end",u())},f=null,d={x:0,y:0},h=Ol(!1),p=null,P=null,x=null;function T(){let y=i.value;if(!y)return;let w=!1,k={x:0,y:0},B=s=>{if(e.drag&&f===null&&s.isPrimary!==!1){s.preventDefault(),f=s.pointerId,d={x:s.clientX,y:s.clientY},y.style.cursor="grabbing";try{s.target.setPointerCapture(s.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(h.value=!0),c()}},V=s=>{if(f===null||s.pointerId!==f||!e.drag)return;s.preventDefault();let g=s.clientX-d.x,v=s.clientY-d.y;d={x:s.clientX,y:s.clientY};let M=r.value,C=M.state;if(s.shiftKey){let{dWorldX:z,dWorldY:N}=or(g,v,C.zoom,C.rotX,C.rotY);M.update({target:[C.target[0]+z,C.target[1]+N,C.target[2]]})}else{let{rotX:z,rotY:N}=Nl(g,v,C.rotX,C.rotY,e.invert);M.update({rotX:z,rotY:N})}a(),o.updateCameraFromRef(M),l()},S=s=>{if(f===s.pointerId){f=null,y.style.cursor=e.drag?"grab":"";try{s.target.releasePointerCapture(s.pointerId)}catch{}h.value=!1,m()}},O=s=>{s.preventDefault()},F=s=>{s.button===2&&(w=!0,k={x:s.clientX,y:s.clientY})},H=s=>{if(!w||!e.drag)return;let g=s.clientX-k.x,v=s.clientY-k.y;k={x:s.clientX,y:s.clientY};let M=r.value,C=M.state,{dWorldX:z,dWorldY:N}=or(g,v,C.zoom,C.rotX,C.rotY);M.update({target:[C.target[0]+z,C.target[1]+N,C.target[2]]}),a(),o.updateCameraFromRef(M),l()},b=s=>{s.button===2&&w&&(w=!1,m())};y.style.cursor="grab",y.style.touchAction="none",y.style.userSelect="none",y.addEventListener("pointerdown",B),y.addEventListener("pointermove",V),y.addEventListener("pointerup",S),y.addEventListener("pointercancel",S),y.addEventListener("contextmenu",O),y.addEventListener("mousedown",F),y.addEventListener("mousemove",H),y.addEventListener("mouseup",b),p=()=>{y.removeEventListener("pointerdown",B),y.removeEventListener("pointermove",V),y.removeEventListener("pointerup",S),y.removeEventListener("pointercancel",S),y.removeEventListener("contextmenu",O),y.removeEventListener("mousedown",F),y.removeEventListener("mousemove",H),y.removeEventListener("mouseup",b),y.style.cursor="",y.style.touchAction="",y.style.userSelect=""}}function A(){let y=i.value;if(!y)return;let w=!1,k=null,B=V=>{if(!e.wheel)return;V.preventDefault();let S=V.deltaMode===1?16:V.deltaMode===2?100:1,O=V.deltaY*S;V.ctrlKey?O*=Fl:O*=Vl;let F=r.value;if(e.dolly){let H=e.minDistance??tr,b=e.maxDistance??nr,s=Math.max(H,Math.min(b,F.state.distance+O*zl));F.update({distance:s})}else{let H=Math.exp(-O*Il),b=e.minZoom??Jo,s=e.maxZoom??er,g=Math.max(b,Math.min(s,F.state.zoom*H));F.update({zoom:g})}a(),o.updateCameraFromRef(F),w||(w=!0,c()),l(),k!==null&&clearTimeout(k),k=setTimeout(()=>{k=null,w=!1,m()},kl)};y.addEventListener("wheel",B,{passive:!1}),P=()=>{y.removeEventListener("wheel",B),k!==null&&clearTimeout(k)}}function L(){let y=null,w=!1,k=0,B=V=>{if(w)return;let S=e.animate;if(!S){y=requestAnimationFrame(B);return}if(h.value)k=V;else{let O=Math.min(_l,k?V-k:Qo);k=V;let H=(S.speed??Bl)*(O/Qo),b=r.value,s=b.state;if(S.axis==="x"){let g=((s.rotX+H)%360+360)%360;b.update({rotX:g})}else{let g=((s.rotY+H)%360+360)%360;b.update({rotY:g})}a(),o.updateCameraFromRef(b),l()}y=requestAnimationFrame(B)};y=requestAnimationFrame(B),x=()=>{w=!0,y!==null&&cancelAnimationFrame(y),x=null}}return Rl(()=>{e.drag&&T(),e.wheel&&A(),e.animate&&L()}),Dl(()=>{p?.(),P?.(),x?.(),p=null,P=null}),mn(()=>e.drag,y=>{y&&!p&&T(),!y&&p&&(p(),p=null)}),mn(()=>e.wheel,y=>{y&&!P&&A(),!y&&P&&(P(),P=null)}),mn(()=>!!e.animate,y=>{y&&!x&&L(),!y&&x&&x()}),()=>null}});import{defineComponent as Yl,inject as Xl,onMounted as jl,onBeforeUnmount as $l,watch as fn,ref as Ul}from"vue";import{BASE_TILE as ar}from"@layoutit/polycss-core";var Wl=150,ir=4,ql=513e-6,Gl=10,Zl=3,lr=16.67,Kl=50,sr=.1,ur=10,cr=0,dr=5e3,Ql=.3,Jl=.05;function es(e){return e===!0?-1:e===void 0||e===!1?1:e}function mr(e,t,n,o,r){let i=es(r),a=e/ir*i,u=t/ir*i;return{rotX:Math.max(0,Math.min(100,n-u)),rotY:((o-a)%360+360)%360}}function ts(e,t,n,o,r){let i=Math.max(.01,n),a=Math.max(.1,Math.cos(o*Math.PI/180)),u=-e/(i*ar),l=-t/(i*ar*a),c=-r*Math.PI/180,m=Math.cos(c),f=Math.sin(c);return{dWorldX:l*m-u*f,dWorldY:l*f+u*m}}var fr=Yl({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:sr},maxZoom:{type:Number,default:ur},minDistance:{type:Number,default:cr},maxDistance:{type:Number,default:dr},animate:{type:[Boolean,Object],default:!1}},emits:{change:e=>!0,"interaction-start":e=>!0,"interaction-end":e=>!0},setup(e,{emit:t}){let n=Xl(ee,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:a}=n,u=()=>({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}),l=()=>{t("change",u())},c=()=>{t("interaction-start",u())},m=()=>{t("interaction-end",u())},f=null,d={x:0,y:0},h=Ul(!1),p=null,P=null,x=null;function T(){let y=i.value;if(!y)return;let w=!1,k={x:0,y:0},B=s=>{if(e.drag&&f===null&&s.isPrimary!==!1){s.preventDefault(),f=s.pointerId,d={x:s.clientX,y:s.clientY},y.style.cursor="grabbing";try{s.target.setPointerCapture(s.pointerId)}catch{}e.animate&&e.animate.pauseOnInteraction!==!1&&(h.value=!0),c()}},V=s=>{if(f===null||s.pointerId!==f||!e.drag)return;s.preventDefault();let g=s.clientX-d.x,v=s.clientY-d.y;d={x:s.clientX,y:s.clientY};let M=r.value,C=M.state;if(s.shiftKey){let{rotX:z,rotY:N}=mr(g,v,C.rotX,C.rotY,e.invert);M.update({rotX:z,rotY:N})}else{let{dWorldX:z,dWorldY:N}=ts(g,v,C.zoom,C.rotX,C.rotY);M.update({target:[C.target[0]+z,C.target[1]+N,C.target[2]]})}a(),o.updateCameraFromRef(M),l()},S=s=>{if(f===s.pointerId){f=null,y.style.cursor=e.drag?"grab":"";try{s.target.releasePointerCapture(s.pointerId)}catch{}h.value=!1,m()}},O=s=>{s.preventDefault()},F=s=>{s.button===2&&(w=!0,k={x:s.clientX,y:s.clientY})},H=s=>{if(!w||!e.drag)return;let g=s.clientX-k.x,v=s.clientY-k.y;k={x:s.clientX,y:s.clientY};let M=r.value,C=M.state,{rotX:z,rotY:N}=mr(g,v,C.rotX,C.rotY,e.invert);M.update({rotX:z,rotY:N}),a(),o.updateCameraFromRef(M),l()},b=s=>{s.button===2&&w&&(w=!1,m())};y.style.cursor="grab",y.style.touchAction="none",y.style.userSelect="none",y.addEventListener("pointerdown",B),y.addEventListener("pointermove",V),y.addEventListener("pointerup",S),y.addEventListener("pointercancel",S),y.addEventListener("contextmenu",O),y.addEventListener("mousedown",F),y.addEventListener("mousemove",H),y.addEventListener("mouseup",b),p=()=>{y.removeEventListener("pointerdown",B),y.removeEventListener("pointermove",V),y.removeEventListener("pointerup",S),y.removeEventListener("pointercancel",S),y.removeEventListener("contextmenu",O),y.removeEventListener("mousedown",F),y.removeEventListener("mousemove",H),y.removeEventListener("mouseup",b),y.style.cursor="",y.style.touchAction="",y.style.userSelect=""}}function A(){let y=i.value;if(!y)return;let w=!1,k=null,B=V=>{if(!e.wheel)return;V.preventDefault();let S=V.deltaMode===1?16:V.deltaMode===2?100:1,O=V.deltaY*S;V.ctrlKey?O*=Gl:O*=Zl;let F=r.value;if(e.dolly){let H=e.minDistance??cr,b=e.maxDistance??dr,s=Math.max(H,Math.min(b,F.state.distance+O*Jl));F.update({distance:s})}else{let H=Math.exp(-O*ql),b=e.minZoom??sr,s=e.maxZoom??ur,g=Math.max(b,Math.min(s,F.state.zoom*H));F.update({zoom:g})}a(),o.updateCameraFromRef(F),w||(w=!0,c()),l(),k!==null&&clearTimeout(k),k=setTimeout(()=>{k=null,w=!1,m()},Wl)};y.addEventListener("wheel",B,{passive:!1}),P=()=>{y.removeEventListener("wheel",B),k!==null&&clearTimeout(k)}}function L(){let y=null,w=!1,k=0,B=V=>{if(w)return;let S=e.animate;if(!S){y=requestAnimationFrame(B);return}if(h.value)k=V;else{let O=Math.min(Kl,k?V-k:lr);k=V;let H=(S.speed??Ql)*(O/lr),b=r.value,s=b.state;if(S.axis==="x"){let g=((s.rotX+H)%360+360)%360;b.update({rotX:g})}else{let g=((s.rotY+H)%360+360)%360;b.update({rotY:g})}a(),o.updateCameraFromRef(b),l()}y=requestAnimationFrame(B)};y=requestAnimationFrame(B),x=()=>{w=!0,y!==null&&cancelAnimationFrame(y),x=null}}return jl(()=>{e.drag&&T(),e.wheel&&A(),e.animate&&L()}),$l(()=>{p?.(),P?.(),x?.(),p=null,P=null}),fn(()=>e.drag,y=>{y&&!p&&T(),!y&&p&&(p(),p=null)}),fn(()=>e.wheel,y=>{y&&!P&&A(),!y&&P&&(P(),P=null)}),fn(()=>!!e.animate,y=>{y&&!x&&L(),!y&&x&&x()}),()=>null}});import{defineComponent as ns,h as Mt,inject as pr,onBeforeUnmount as yr,onMounted as pn,ref as it,computed as Ze}from"vue";import{arrowPolygons as os,eulerXYZFromQuat as rs,planePolygons as as,quatFromAxisAngle as is,quatFromEulerXYZ as ls,quatMultiply as ss,ringQuadPolygons as us}from"@layoutit/polycss-core";var Tt="#ff3653",At="#8adb00",Lt="#2c8fff",cs=.6,ds=.8,ms=1,ze=50,gr=60,fs=.6,ps=.0125,ys=.15,gs=.04,hs=1,hr=.02,yn=1.04,Ps=.1,xs=.25,Er=1e-4,lt={0:1,1:0,2:2},Pr=[{cssAxis:0,sign:1,key:"x",color:Tt},{cssAxis:0,sign:-1,key:"-x",color:Tt},{cssAxis:1,sign:1,key:"y",color:At},{cssAxis:1,sign:-1,key:"-y",color:At},{cssAxis:2,sign:1,key:"z",color:Lt},{cssAxis:2,sign:-1,key:"-z",color:Lt}],xr=[{cssAxis:0,key:"x",color:Tt},{cssAxis:1,key:"y",color:At},{cssAxis:2,key:"z",color:Lt}],br=[{perpAxis:2,axisA:0,axisB:1,key:"xy",color:Lt},{perpAxis:1,axisA:0,axisB:2,key:"xz",color:At},{perpAxis:0,axisA:1,axisB:2,key:"yz",color:Tt}];function gn(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 wt(e,t){return!t||t<=0?e:Math.round(e/t)*t}function bs(e){return e.replace("-","")[0]}function hn(e,t,n,o){let r=n*Math.PI/180,i=o*Math.PI/180,a=[0,0,0];a[e]=t;let u=a[0]*Math.sin(i)+a[1]*Math.cos(i),l=a[2];return u*Math.sin(r)+l*Math.cos(r)<0}function vs(e){if(e.length===0)return gr;let t=1/0,n=1/0,o=1/0,r=-1/0,i=-1/0,a=-1/0;for(let u of e)for(let l of u.vertices)l[0]<t&&(t=l[0]),l[0]>r&&(r=l[0]),l[1]<n&&(n=l[1]),l[1]>i&&(i=l[1]),l[2]<o&&(o=l[2]),l[2]>a&&(a=l[2]);return Number.isFinite(t)?Math.max(r-t,i-n,a-o)*ze*fs:gr}function Ss(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,a=-1/0;for(let u of e)for(let l of u.vertices)l[0]<t&&(t=l[0]),l[0]>r&&(r=l[0]),l[1]<n&&(n=l[1]),l[1]>i&&(i=l[1]),l[2]<o&&(o=l[2]),l[2]>a&&(a=l[2]);return Number.isFinite(t)?[(n+i)/2*ze,(t+r)/2*ze,(o+a)/2*ze]:[0,0,0]}function vr(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 a=(i.left-r.left)/t,u=(i.top-r.top)/t,l=a*a+u*u;if(l<Er)return;let c=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let m=d=>{let h=d.clientX-e.startClientX,p=d.clientY-e.startClientY,P=(h*a+p*u)/l;P=wt(P,e.translationSnap);let x=[c[0]+P*n[0],c[1]+P*n[1],c[2]+P*n[2]];e.onObjectChange?.({object:e.target,position:x}),e.onChange?.()},f=()=>{window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",f),window.removeEventListener("pointercancel",f);let d=h=>{h.stopPropagation(),h.stopImmediatePropagation()};window.addEventListener("click",d,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",d,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",m),window.addEventListener("pointerup",f),window.addEventListener("pointercancel",f)}function Sr(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(f){let d=e.wrapper.ownerDocument.createElement("div");d.style.position="absolute",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0",d.style.transform=`translate3d(${f[0]*o}px, ${f[1]*o}px, ${f[2]*o}px)`,e.wrapper.appendChild(d);let h=e.wrapper.getBoundingClientRect(),p=d.getBoundingClientRect();return e.wrapper.removeChild(d),{x:(p.left-h.left)/o,y:(p.top-h.top)/o}}let i=r(t),a=r(n),u=i.x*a.y-a.x*i.y;if(Math.abs(u)<Er)return;let l=e.target.getPosition()??[0,0,0];e.onMouseDown?.(),e.onDraggingChanged?.(!0);let c=f=>{let d=f.clientX-e.startClientX,h=f.clientY-e.startClientY,p=(a.y*d-a.x*h)/u,P=(-i.y*d+i.x*h)/u;p=wt(p,e.translationSnap),P=wt(P,e.translationSnap);let x=[l[0]+p*t[0]+P*n[0],l[1]+p*t[1]+P*n[1],l[2]+p*t[2]+P*n[2]];e.onObjectChange?.({object:e.target,position:x}),e.onChange?.()},m=()=>{window.removeEventListener("pointermove",c),window.removeEventListener("pointerup",m),window.removeEventListener("pointercancel",m),e.onMouseUp?.(),e.onDraggingChanged?.(!1)};window.addEventListener("pointermove",c),window.addEventListener("pointerup",m),window.addEventListener("pointercancel",m)}function Cr(e){let t=e.wrapper.getBoundingClientRect(),n=t.left,o=t.top,r=Math.atan2(e.startClientY-o,e.startClientX-n),i=0,a=e.target.getRotation()??[0,0,0],u=ls(a);e.onMouseDown?.(),e.onDraggingChanged?.(!0);let l=m=>{let f=Math.atan2(m.clientY-o,m.clientX-n),d=f-r;d>Math.PI?d-=2*Math.PI:d<-Math.PI&&(d+=2*Math.PI),i+=d,r=f;let h=i*180/Math.PI;h=wt(h,e.rotationSnap);let p=[0,0,0];p[e.cssAxis]=1;let P=is(p,h*Math.PI/180),x=rs(ss(P,u));e.onObjectChange?.({object:e.target,rotation:x}),e.onChange?.()},c=()=>{window.removeEventListener("pointermove",l),window.removeEventListener("pointerup",c),window.removeEventListener("pointercancel",c);let m=f=>{f.stopPropagation(),f.stopImmediatePropagation()};window.addEventListener("click",m,{capture:!0,once:!0}),setTimeout(()=>window.removeEventListener("click",m,!0),0),e.onMouseUp?.(),e.onDraggingChanged?.(!1),e.target.rebakeAtlas()};window.addEventListener("pointermove",l),window.addEventListener("pointerup",c),window.addEventListener("pointercancel",c)}function Cs(e){return!!e&&typeof e=="object"&&"value"in e}function Es(e){return e?Cs(e)?e.value??null:e:null}var Mr=ns({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=it(null),o=it(null),r=it(new Map),i=Ze(()=>Es(e.object)),a=it(0);pn(()=>{a.value++});let u=it(0),l=pr(ee,void 0),c=null;pn(()=>{let s=l?.store;s&&(c=s.subscribe(()=>{u.value++}))}),yr(()=>{c?.()});function m(){u.value;let s=l?.store.getState().cameraState;return{rotX:s?.rotX??65,rotY:s?.rotY??45}}let f=Ze(()=>(a.value,vs(i.value?.getPolygons()??[]))),d=Ze(()=>f.value*e.size);function h(s){return o.value===s?ms:n.value===s?ds:cs}function p(){t("change")}function P(s){t("objectChange",s)}function x(s){t("draggingChanged",s)}function T(){t("mouseDown")}function A(){t("mouseUp")}let L=pr(ee,void 0),y=null;pn(()=>{let s=L?.cameraElRef.value;if(!s)return;let g=v=>{let M=i.value;if(!M||!e.enabled||v.target?.closest(".polycss-transform-gizmo"))return;let z={x:e.showX,y:e.showY,z:e.showZ};if(e.mode==="translate")for(let D of br){let E=["x","y","z"][D.axisA],_=["x","y","z"][D.axisB];if(!z[E]||!z[_])continue;let I=document.querySelector(`.polycss-transform-plane--${D.key}`);if(!I||!We(I,v.clientX,v.clientY))continue;v.preventDefault(),v.stopPropagation();let j=I.closest("[data-poly-transform-controls]");if(!j)return;o.value=D.key,Sr({axisA:D.axisA,axisB:D.axisB,probeDistanceCss:d.value,wrapper:j,target:M,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:P,onMouseDown:T,onMouseUp:A,onDraggingChanged:Y=>{Y||(o.value=null),x(Y)}});return}let N=e.mode==="translate"?Pr:xr;for(let D of N){let E=D.key.replace("-","")[0];if(!z[E])continue;let _=document.querySelector(`.polycss-transform-${e.mode==="translate"?"arrow":"ring"}--${D.key}`);if(!_||!(e.mode==="rotate"?We(_,v.clientX,v.clientY):We(_,v.clientX,v.clientY)))continue;v.preventDefault(),v.stopPropagation();let j=_.closest("[data-poly-transform-controls]");if(!j)return;if(o.value=D.key,e.mode==="translate"){let Y=D;vr({cssAxis:Y.cssAxis,sign:Y.sign,shaftLengthCss:d.value,wrapper:j,target:M,startClientX:v.clientX,startClientY:v.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:P,onMouseDown:T,onMouseUp:A,onDraggingChanged:G=>{G||(o.value=null),x(G)}})}else Cr({cssAxis:D.cssAxis,wrapper:j,target:M,startClientX:v.clientX,startClientY:v.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:P,onMouseDown:T,onMouseUp:A,onDraggingChanged:Y=>{Y||(o.value=null),x(Y)}});return}};s.addEventListener("pointerdown",g),y=()=>s.removeEventListener("pointerdown",g)}),yr(()=>{y?.()});let w=Ze(()=>{if(e.mode!=="translate")return[];a.value;let g=d.value/ze,{rotX:v,rotY:M}=m();return Pr.filter(C=>({x:e.showX,y:e.showY,z:e.showZ})[bs(C.key)]).map(C=>{let z=h(C.key),N=hn(C.cssAxis,C.sign,v,M);return{spec:C,polygons:os({axis:lt[C.cssAxis],sign:C.sign,shaftLength:g,shaftHalfThickness:g*ps,headLength:g*ys,headHalfThickness:g*gs,color:gn(C.color,z),shaft:!N})}})}),k=Ze(()=>{if(e.mode!=="translate")return[];a.value;let g=d.value/ze,v={x:e.showX,y:e.showY,z:e.showZ},M=["x","y","z"],{rotX:C,rotY:z}=m(),N=g*xs;return br.filter(D=>v[M[D.axisA]]&&v[M[D.axisB]]).map(D=>{let E=h(D.key),_=lt[D.perpAxis],I=(_+1)%3,j=(_+2)%3,Y=lt[I],G=lt[j],$=hn(Y,1,C,z)?-1:1,W=hn(G,1,C,z)?-1:1;return{spec:D,polygons:as({axis:_,size:g*Ps,offset:[$*N,W*N],color:gn(D.color,E)})}})}),B=Ze(()=>{if(e.mode!=="rotate")return[];a.value;let v=d.value*hs/ze*yn;return xr.filter(M=>({x:e.showX,y:e.showY,z:e.showZ})[M.key]).map(M=>{let C=h(M.key);return{spec:M,polygons:us({axis:lt[M.cssAxis],outerRadius:v,color:gn(M.color,C)})}})}),V=(1-hr)/yn,S=(1+hr)/yn;function O(s){return g=>{if(!e.enabled)return;let v=i.value;if(!v)return;g.stopPropagation();let C=g.eventObject.element?.closest("[data-poly-transform-controls]");C&&(o.value=s.key,vr({cssAxis:s.cssAxis,sign:s.sign,shaftLengthCss:d.value,wrapper:C,target:v,startClientX:g.nativeEvent.clientX,startClientY:g.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:P,onMouseDown:T,onMouseUp:A,onDraggingChanged:z=>{z||(o.value=null),x(z)}}))}}function F(s){return g=>{if(!e.enabled)return;let v=i.value;if(!v)return;g.stopPropagation();let C=g.eventObject.element?.closest("[data-poly-transform-controls]");C&&(o.value=s.key,Sr({axisA:s.axisA,axisB:s.axisB,probeDistanceCss:d.value,wrapper:C,target:v,startClientX:g.nativeEvent.clientX,startClientY:g.nativeEvent.clientY,translationSnap:e.translationSnap,onChange:p,onObjectChange:P,onMouseDown:T,onMouseUp:A,onDraggingChanged:z=>{z||(o.value=null),x(z)}}))}}function H(s){return g=>{if(!e.enabled)return;let v=i.value;if(!v)return;let M=g.eventObject.element;g.stopPropagation();let C=M?.closest("[data-poly-transform-controls]");C&&(o.value=s.key,Cr({cssAxis:s.cssAxis,wrapper:C,target:v,startClientX:g.nativeEvent.clientX,startClientY:g.nativeEvent.clientY,rotationSnap:e.rotationSnap,onChange:p,onObjectChange:P,onMouseDown:T,onMouseUp:A,onDraggingChanged:z=>{z||(o.value=null),x(z)}}))}}function b(s){return{onPointerOver:()=>{n.value=s},onPointerOut:()=>{n.value===s&&(n.value=null)}}}return()=>{let s=i.value;if(!s)return null;let g=s.getPosition()??[0,0,0],v=Ss(s.getPolygons()),M=g[0]+v[0],C=g[1]+v[1],z=g[2]+v[2],N={transform:`translate3d(${M}px, ${C}px, ${z}px)`,position:"absolute",transformStyle:"preserve-3d",zIndex:1e3},D=e.mode==="translate"?[...w.value.map(({spec:E,polygons:_})=>Mt(Q,{key:`arrow-${E.key}`,polygons:_,class:`polycss-transform-gizmo polycss-transform-arrow polycss-transform-arrow--${E.key}`,textureLighting:"baked",onPointerDown:O(E),...b(E.key)})),...k.value.map(({spec:E,polygons:_})=>Mt(Q,{key:`plane-${E.key}`,polygons:_,class:`polycss-transform-gizmo polycss-transform-plane polycss-transform-plane--${E.key}`,textureLighting:"baked",onPointerDown:F(E),...b(E.key)}))]:B.value.map(({spec:E,polygons:_})=>Mt(Q,{key:E.key,polygons:_,class:`polycss-transform-gizmo polycss-transform-ring polycss-transform-ring--${E.key}`,style:{"--ring-inner-ratio":V,"--ring-outer-ratio":S},textureLighting:"baked",onPointerDown:H(E),...b(E.key)}));return Mt("div",{class:"polycss-transform-controls","data-poly-transform-controls":"","data-poly-mode":e.mode,"data-poly-space":e.space,style:N},D)}}});import{defineComponent as Ms,inject as Ts,onMounted as As,onBeforeUnmount as Ls,watch as ws}from"vue";import{BASE_TILE as Rs}from"@layoutit/polycss-core";var Ds={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 Pn(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 Ar=new Set(["KeyW","ArrowUp"]),Lr=new Set(["KeyS","ArrowDown"]),wr=new Set(["KeyA","ArrowLeft"]),Rr=new Set(["KeyD","ArrowRight"]),Dr=new Set(["Space"]),xn=new Set(["ControlLeft","ControlRight"]);function Tr(e){return Ar.has(e)||Lr.has(e)||wr.has(e)||Rr.has(e)||Dr.has(e)||xn.has(e)}function Os(){return{change:[],start:[],end:[]}}function Ke(e,t){let n=[...e[t]];for(let o of n)try{o()}catch{}}var Or=Ms({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=Ts(ee,null);if(!o)return typeof console<"u"&&console.warn("[polycss] <PolyFirstPersonControls> must be used inside <PolyCamera>."),n({}),()=>null;let{store:r,cameraRef:i,cameraElRef:a,applyTransformDirect:u}=o,l=Pn(Ds,e),c=[0,0,0],m=null,f=0,d=!1,h=!1,p=!1,P=new Set,x=0,T=0,A=Os();function L(s,g){let v=s*Math.PI/180,M=g*Math.PI/180;return[-Math.sin(v)*Math.cos(M),-Math.sin(v)*Math.sin(M),-Math.cos(v)]}function y(){let s=a.value,g=s?getComputedStyle(s).perspective:"",v=parseFloat(g);return(Number.isFinite(v)&&v>0?v:8e3)/Rs}function w(){let s=i.value.state,g=L(s.rotX??90,s.rotY??0),v=y();return[c[0]+g[0]*v,c[1]+g[1]*v,c[2]+g[2]*v]}function k(){let s=w(),g=i.value;g.update({target:s}),u(),r.updateCameraFromRef(g)}let B=.05;function V(s){if(m===null||d)return;let g=Math.min(B,f?(s-f)/1e3:.0167);if(f=s,l.enabled){let v=!1,M=i.value.state;if(l.moveEnabled){let D=0,E=0;for(let _ of P)Ar.has(_)?D+=1:Lr.has(_)?D-=1:Rr.has(_)?E+=1:wr.has(_)&&(E-=1);if(D!==0||E!==0){let I=(M.rotY??0)*Math.PI/180,j=-Math.cos(I),Y=-Math.sin(I),G=-Math.sin(I),$=Math.cos(I),W=Math.hypot(D,E)||1,Z=l.moveSpeed*g;c[0]+=(j*D+G*E)/W*Z,c[1]+=(Y*D+$*E)/W*Z,v=!0}}let z=l.crouchEnabled&&(P.has("ControlLeft")||P.has("ControlRight"))?l.crouchHeight:l.eyeHeight;l.jumpEnabled&&(x!==0||T>0)?(x-=l.gravity*g,T+=x*g,T<=0&&(T=0,x=0)):l.jumpEnabled||(T=0,x=0);let N=l.groundZ+z+T;if(Math.abs(c[2]-N)>1e-4&&(c[2]=N,v=!0),v){let D=w(),E=i.value;E.update({target:D}),u(),r.updateCameraFromRef(E),Ke(A,"change");try{t("change",[c[0],c[1],c[2]])}catch{}}}m=requestAnimationFrame(V)}function S(){m!==null||d||(f=0,m=requestAnimationFrame(V))}function O(){m!==null&&(cancelAnimationFrame(m),m=null)}let F=null;function H(){let s=a.value;if(!s)return;let g=s.ownerDocument??document,v=g.defaultView??globalThis,M=()=>{if(!(!l.enabled||!l.lookEnabled||d||h))try{s.requestPointerLock()}catch{}},C=()=>{let Y=g.pointerLockElement===s;if(Y!==h){if(h=Y,Y){p=!0,Ke(A,"start");try{t("interaction-start",[c[0],c[1],c[2]])}catch{}}else if(p){p=!1,Ke(A,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}}},z=Y=>{if(!h||d||!l.enabled||!l.lookEnabled)return;let G=Y.movementX??0,$=Y.movementY??0;if(G===0&&$===0)return;let W=i.value,Z=W.state,re=l.lookSensitivity,de=l.invertY?-1:1,U=(((Z.rotY??0)-G*re)%360+360)%360,K=(Z.rotX??90)-$*re*de;K<l.minPitch?K=l.minPitch:K>l.maxPitch&&(K=l.maxPitch);let X=L(K,U),R=y(),J=[c[0]+X[0]*R,c[1]+X[1]*R,c[2]+X[2]*R];W.update({rotX:K,rotY:U,target:J}),u(),r.updateCameraFromRef(W),Ke(A,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},N=Y=>{if(!(!l.enabled||d)&&Tr(Y.code)&&!(!h&&!l.moveEnabled)){if(Dr.has(Y.code)){if(!l.jumpEnabled)return;Y.preventDefault(),!P.has(Y.code)&&x===0&&T===0&&(x=l.jumpVelocity),P.add(Y.code);return}xn.has(Y.code)&&!l.crouchEnabled||!l.moveEnabled&&!xn.has(Y.code)||(Y.preventDefault(),P.add(Y.code))}},D=Y=>{Tr(Y.code)&&P.delete(Y.code)},E=()=>{P.clear()};s.addEventListener("click",M),g.addEventListener("pointerlockchange",C),g.addEventListener("mousemove",z),v.addEventListener("keydown",N),v.addEventListener("keyup",D),v.addEventListener("blur",E);let _=v.getComputedStyle(s).perspective,I=parseFloat(_),j=Number.isFinite(I)&&I>0?I:2e3;s.style.setProperty("--polycss-fpv-perspective",`${j}px`),s.classList.add("polycss-fpv-host"),F=()=>{if(s.removeEventListener("click",M),g.removeEventListener("pointerlockchange",C),g.removeEventListener("mousemove",z),v.removeEventListener("keydown",N),v.removeEventListener("keyup",D),v.removeEventListener("blur",E),s.style.cursor="",s.classList.remove("polycss-fpv-host"),s.style.removeProperty("--polycss-fpv-perspective"),P.clear(),h)try{g.exitPointerLock()}catch{}}}n({update(s){l=Pn(l,s);let g=a.value;g&&!d&&(g.style.cursor=l.lookEnabled?"crosshair":"")},resume(){if(!d)return;d=!1;let s=a.value;s&&(s.style.cursor=l.lookEnabled?"crosshair":""),S()},pause(){if(d)return;d=!0,O();let s=a.value;if(s&&(s.style.cursor=""),p){p=!1,Ke(A,"end");try{t("interaction-end",[c[0],c[1],c[2]])}catch{}}},destroy(){d=!0,O()},lock(){if(!l.enabled||!l.lookEnabled||d)return;let s=a.value;try{s?.requestPointerLock()}catch{}},unlock(){if(h){let s=a.value;try{s?.ownerDocument?.exitPointerLock()}catch{}}},isLocked(){return h},getOrigin(){return[c[0],c[1],c[2]]},setOrigin(s){c[0]=s[0],c[1]=s[1],c[2]=s[2],k(),Ke(A,"change");try{t("change",[c[0],c[1],c[2]])}catch{}},addEventListener(s,g){let v=A[s];v.includes(g)||v.push(g)},removeEventListener(s,g){let v=A[s],M=v.indexOf(g);M>=0&&v.splice(M,1)},hasEventListener(s,g){return A[s].includes(g)}}),As(()=>{let s=a.value;if(!s)return;d=!1,h=!1,p=!1,P.clear(),x=0,T=0;let v=i.value.state.target??[0,0,0];c[0]=v[0],c[1]=v[1],c[2]=l.groundZ+l.eyeHeight,k(),s.style.cursor=l.lookEnabled?"crosshair":"",H(),S()}),Ls(()=>{d=!0,O(),F?.(),F=null});let b=["enabled","lookEnabled","moveEnabled","jumpEnabled","crouchEnabled","lookSensitivity","invertY","moveSpeed","jumpVelocity","gravity","eyeHeight","crouchHeight","groundZ","minPitch","maxPitch"];for(let s of b)ws(()=>e[s],()=>{l=Pn(l,e);let g=a.value;g&&!d&&(g.style.cursor=l.lookEnabled?"crosshair":"")});return()=>null}});import{defineComponent as ks,h as Is,inject as bn,onBeforeUnmount as Fs,onMounted as Vs,provide as _s,reactive as Bs,ref as zs,computed as Hs}from"vue";var st=Symbol("polycss.selection"),kr=ks({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=Bs({selected:[]}),r=Hs(()=>o.selected);function i(m){let f=e.filter?e.filter(m):m;o.selected=f,t("change",f)}let a={get selected(){return o.selected},set:m=>i(m),add:m=>{e.multiple?o.selected.includes(m)||i([...o.selected,m]):i([m])},remove:m=>{o.selected.includes(m)&&i(o.selected.filter(f=>f!==m))},toggle:m=>{o.selected.includes(m)?i(o.selected.filter(f=>f!==m)):e.multiple?i([...o.selected,m]):i([m])},clear:()=>i([]),has:m=>o.selected.includes(m)};_s(st,{selected:r,api:a});let u=bn(ee,void 0),l=(m,f)=>cn(m,f,d=>!d.closest("[data-poly-transform-controls]")),c=null;return Vs(()=>{let m=u?.cameraElRef.value;if(!m)return;let f=d=>{if(d.target?.closest("[data-poly-transform-controls]"))return;let p=Ue(d.target)??l(d.clientX,d.clientY);if(!p){t("pointerMissed",d),e.clearOnMiss&&i([]);return}e.multiple&&(d.shiftKey||d.metaKey||d.ctrlKey)?a.toggle(p):o.selected.length===1&&o.selected[0]===p?i([]):i([p])};m.addEventListener("click",f),c=()=>m.removeEventListener("click",f)}),Fs(()=>{c?.()}),()=>Is("div",{style:{display:"contents"},"data-poly-select":""},n.default?.())}});function Ir(){let e=bn(st,void 0);return e?e.selected:zs([])}function Fr(){let e=bn(st,void 0);if(!e)throw new Error("polycss: usePolySelectionApi must be used inside <PolySelect>.");return e.api}import{defineComponent as Ns,h as Ys,computed as Xs}from"vue";import{axesHelperPolygons as js}from"@layoutit/polycss-core";var Vr=Ns({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=Xs(()=>js({size:e.size,thickness:e.thickness,negative:e.negative,xColor:e.xColor,yColor:e.yColor,zColor:e.zColor}));return()=>Ys(Q,{polygons:t.value})}});import{defineComponent as $s,h as Us,computed as vn}from"vue";import{octahedronPolygons as Ws}from"@layoutit/polycss-core";var Sn=50,_r=$s({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=vn(()=>e.color??e.light.color??"#ffd54a"),n=vn(()=>Ws({center:[0,0,0],size:e.size,color:t.value})),o=vn(()=>{let r=e.light.direction,i=r[0],a=r[1],u=r[2],l=Math.hypot(i,a,u)||1,c=e.target?.[0]??0,m=e.target?.[1]??0,f=e.target?.[2]??0,d=c+a/l*e.distance,h=m+i/l*e.distance,p=f+u/l*e.distance;return[h*Sn,d*Sn,p*Sn]});return()=>Us(Q,{polygons:n.value,position:o.value})}});var Cn={quad:0,clippedSolid:0,atlas:0,stableTriangle:0},qs={polygonCount:0,mountedPolygonLeafCount:0,shadowLeafCount:0,surfaceLeafCounts:Cn,bucketCount:0};function Gs(e){return typeof e=="number"?{polygonCount:e}:e??{}}function Qe(e,t){return e.querySelectorAll(t).length}function Zs(e,t){let n=e;return typeof n.matches=="function"&&n.matches(t)}function Ks(e,t){if(!t)return[e];let n=[];return Zs(e,t)&&n.push(e),n.push(...Array.from(e.querySelectorAll(t))),n}function Qs(e,t){let n=Gs(t);if(!e)return{...qs,surfaceLeafCounts:{...Cn},polygonCount:n.polygonCount??0};let o=Ks(e,n.scopeSelector),r={...Cn},i=0,a=0;for(let l of o)r.quad+=Qe(l,"b"),r.clippedSolid+=Qe(l,"i"),r.atlas+=Qe(l,"s"),r.stableTriangle+=Qe(l,"u"),i+=Qe(l,"q"),a+=Qe(l,".polycss-bucket");let u=r.quad+r.clippedSolid+r.atlas+r.stableTriangle;return{polygonCount:n.polygonCount??u,mountedPolygonLeafCount:u,shadowLeafCount:i,surfaceLeafCounts:r,bucketCount:a}}import{ref as Br,watch as Js,onUnmounted as eu,computed as Rt}from"vue";import{createPolyAnimationMixer as tu}from"@layoutit/polycss-core";function He(e){return e&&typeof e=="object"&&"value"in e?e.value:e}function nu(e,t,n){let o=Br(null),r=null,i=null,a=null,u=Br(0);function l(){return n==null?o.value:He(n)??o.value}function c(){i!==null&&(cancelAnimationFrame(i),i=null),a=null}function m(){c(),r&&(r.stopAllAction(),r.uncacheRoot(),r=null,u.value++)}function f(){if(i!==null)return;function A(L){if(a===null){a=L,i=requestAnimationFrame(A);return}let y=(L-a)/1e3;a=L,r?.update(y),i=requestAnimationFrame(A)}i=requestAnimationFrame(A)}function d(){m();let A=He(e),L=He(t);if(!A||A.length===0||!L)return;let y=l();y&&(r=tu(y,L),u.value++,f())}let h=Js(()=>{let A=He(e),L=He(t),y=n!=null?He(n):o.value;return{c:A,ctrl:L,r:y}},()=>d(),{immediate:!0,deep:!1});eu(()=>{h(),m()});let p=Rt(()=>He(e)??[]),P=Rt(()=>p.value.map(A=>A.name)),x=Rt(()=>(u.value,r)),T=Rt(()=>{u.value;let A=p.value,L={};for(let y of A)Object.defineProperty(L,y.name,{enumerable:!0,get(){if(!r)return null;try{return r.clipAction(y.name)}catch{return null}}});return L});return{ref:o,mixer:x,clips:p,names:P,actions:T}}import{CAMERA_BACKFACE_CULL_EPS as $m,VOXEL_CAMERA_CULL_AXIS_EPS as Um,VOXEL_CAMERA_CULL_NORMAL_LIMIT as Wm,normalizePolygons as qm,mergePolygons as Gm,coverPlanarPolygons as Zm,optimizeMeshPolygons as Km,repairMeshSeams as Qm,seamFacetSplitPolygons as Jm,seamFacetSplitReport as ef,seamOverlapDiagnostics as tf,seamOverlapPolygons as nf,seamOverlapReport as of,cullInteriorPolygons as rf,cameraCullNormalGroups as af,cameraCullNormalGroupsFromPolygons as lf,cameraCullNormalKey as sf,cameraCullVisibleSignature as uf,cameraFacingDepth as cf,isAxisAlignedSurfaceNormal as df,isVoxelCameraCullableNormalGroups as mf,normalFacesCamera as ff,polygonCssSurfaceNormal as pf,polygonFacesCamera as yf,parseObj as gf,parseMtl as hf,parseGltf as Pf,bakeSolidTextureSamples as xf,bakeSolidTextureSampledPolygons as bf,loadMesh as vf,createIsometricCamera as Sf,parseVox as Cf,polygonFaces as Ef,computeTexturePaintMetrics as Mf,computeShapeLighting as Tf,parseColor as Af,parsePureColor as Lf,parseHexColor as wf,parseRgbColor as Rf,formatColor as Df,clampChannel as Of,shadeColor as kf,rotateVec3 as If,inverseRotateVec3 as Ff,axesHelperPolygons as Vf,boxPolygons as _f,arrowPolygons as Bf,ringPolygons as zf,octahedronPolygons as Hf,tetrahedronPolygons as Nf,icosahedronPolygons as Yf,dodecahedronPolygons as Xf,cylinderPolygons as jf,conePolygons as $f,torusPolygons as Uf,planePolygons as Wf,buildSceneContext as qf,computeSceneBbox as Gf,BASE_TILE as Zf,DEFAULT_CAMERA_STATE as Kf,DEFAULT_PROJECTION as Qf,normalizeInvertMultiplier as Jf,createPolyAnimationMixer as ep,optimizeAnimatedMeshPolygons as tp,DEFAULT_SEAM_FACET_SPLIT_OPTIONS as np,DEFAULT_SEAM_OVERLAP_OPTIONS as op,LoopOnce as rp,LoopRepeat as ap,LoopPingPong as ip}from"@layoutit/polycss-core";export{Zf as BASE_TILE,$m as CAMERA_BACKFACE_CULL_EPS,Kf as DEFAULT_CAMERA_STATE,Qf as DEFAULT_PROJECTION,np as DEFAULT_SEAM_FACET_SPLIT_OPTIONS,op as DEFAULT_SEAM_OVERLAP_OPTIONS,rp as LoopOnce,ip as LoopPingPong,ap as LoopRepeat,Bo as Poly,Vr as PolyAxesHelper,zo as PolyBox,tt as PolyCamera,ee as PolyCameraContextKey,qo as PolyCone,Wo as PolyCylinder,_r as PolyDirectionalLightHelper,$o as PolyDodecahedron,Or as PolyFirstPersonControls,Fo as PolyGround,jo as PolyIcosahedron,fr as PolyMapControls,Q as PolyMesh,Yo as PolyOctahedron,rr as PolyOrbitControls,tt as PolyOrthographicCamera,Ln as PolyPerspectiveCamera,Ho as PolyPlane,No as PolyRing,go as PolyScene,kr as PolySelect,st as PolySelectionContextKey,Uo as PolySphere,Xo as PolyTetrahedron,Go as PolyTorus,Mr as PolyTransformControls,Um as VOXEL_CAMERA_CULL_AXIS_EPS,Wm as VOXEL_CAMERA_CULL_NORMAL_LIMIT,Bf as arrowPolygons,Vf as axesHelperPolygons,bf as bakeSolidTextureSampledPolygons,xf as bakeSolidTextureSamples,_f as boxPolygons,qf as buildSceneContext,af as cameraCullNormalGroups,lf as cameraCullNormalGroupsFromPolygons,sf as cameraCullNormalKey,uf as cameraCullVisibleSignature,cf as cameraFacingDepth,Of as clampChannel,Qs as collectPolyRenderStats,Gf as computeSceneBbox,Tf as computeShapeLighting,Mf as computeTexturePaintMetrics,$f as conePolygons,Zm as coverPlanarPolygons,Sf as createIsometricCamera,ep as createPolyAnimationMixer,rf as cullInteriorPolygons,jf as cylinderPolygons,Xf as dodecahedronPolygons,cn as findMeshUnderPoint,Ue as findPolyMeshHandle,Df as formatColor,Yf as icosahedronPolygons,mt as injectPolyBaseStyles,Ff as inverseRotateVec3,df as isAxisAlignedSurfaceNormal,mf as isVoxelCameraCullableNormalGroups,vf as loadMesh,Gm as mergePolygons,ff as normalFacesCamera,Jf as normalizeInvertMultiplier,qm as normalizePolygons,Hf as octahedronPolygons,tp as optimizeAnimatedMeshPolygons,Km as optimizeMeshPolygons,Af as parseColor,Pf as parseGltf,wf as parseHexColor,hf as parseMtl,gf as parseObj,Lf as parsePureColor,Rf as parseRgbColor,Cf as parseVox,Wf as planePolygons,We as pointInMeshElement,pf as polygonCssSurfaceNormal,Ef as polygonFaces,yf as polygonFacesCamera,Qm as repairMeshSeams,zf as ringPolygons,If as rotateVec3,Jm as seamFacetSplitPolygons,ef as seamFacetSplitReport,tf as seamOverlapDiagnostics,nf as seamOverlapPolygons,of as seamOverlapReport,kf as shadeColor,Nf as tetrahedronPolygons,Uf as torusPolygons,nu as usePolyAnimation,Ne as usePolyCamera,ml as usePolyMaterial,Ct as usePolyMesh,dt as usePolySceneContext,Ir as usePolySelect,Fr as usePolySelectionApi};